diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 76229eb4..fb530c82 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -73,8 +73,10 @@ The frontend lives under `frontend/` and is a Vite Vue SPA. The shell owns navigation, route handling, auth/session exchange, GraphQL transport, extension UI loading, core widgets, and shared layout. Extension UI -bundles are browser ESM assets served from `/_extensions//assets/...` and -loaded through the SDK registry. +bundles are browser ESM assets served from +`/forge-ui//files/...` and loaded through the SDK registry. +The module token is the hex-encoded extension ID used only for public asset +URLs. Route ownership: diff --git a/GOAL.md b/GOAL.md index 522fc7d2..5d5bec36 100644 --- a/GOAL.md +++ b/GOAL.md @@ -25,7 +25,7 @@ Status: v3 cutover complete; read/write transport split is the north star graph after SP6 lands. - The Vue/Vite shell is the only frontend. - Extension UI bundles are generated from the `ui/` sources and served from - `/_extensions/...`. + `/forge-ui/...`. - `start.sh --reset --oneshot` is the end-to-end acceptance path. Do not restore removed transition routes, old GraphQL aliases, resolver stubs, diff --git a/PRODUCTION_TESTBED.md b/PRODUCTION_TESTBED.md index 6796e4ad..2fe01227 100644 --- a/PRODUCTION_TESTBED.md +++ b/PRODUCTION_TESTBED.md @@ -84,9 +84,9 @@ storage paths are absolute. - `POST /events/session` - `GET /events` - `GET /graphql/stream` -- `POST /_extensions/session` -- `GET /_extensions//manifest.json` -- `GET /_extensions//assets/` +- `POST /forge-ui/session` +- `GET /forge-ui//meta.json` +- `GET /forge-ui//files/` - `/git/...` authentication and scope checks ## Current production-testbed boundary diff --git a/README.md b/README.md index c0836865..d3e9569b 100644 --- a/README.md +++ b/README.md @@ -56,7 +56,9 @@ Rust `cargo-component` crates and ship real artifacts at The Vue shell owns navigation, auth/session exchange, GraphQL transport, and UI extension loading. Browser extension bundles are served from -`/_extensions//assets/...` and registered through the Comtrya SDK. +`/forge-ui//files/...` and registered through the Comtrya SDK. +The module token is the hex-encoded extension ID used only for public asset +URLs. Git clone/fetch uses the pure-Rust Smart HTTP path. Git receive-pack/push and full OIDC browser callback validation are intentionally unsupported in the diff --git a/SPEC.md b/SPEC.md index 4a0b5ef9..47fa7d85 100644 --- a/SPEC.md +++ b/SPEC.md @@ -23,7 +23,7 @@ feature behavior delivered by WASM extensions. SP6 lands. The `/api/ops` surface is interim; do not extend it beyond what current extensions need. - The frontend is a Vite/Vue shell that loads extension UI bundles from - `/_extensions/...`. The shell uses GraphQL for reads and RPC for writes; + `/forge-ui/...`. The shell uses GraphQL for reads and RPC for writes; extension UI bundles follow the same contract via the generated SDK. - The implementation favors deletion and current contracts over transition layers. diff --git a/TODO.md b/TODO.md index fcb9c494..0c36f0cf 100644 --- a/TODO.md +++ b/TODO.md @@ -16,7 +16,7 @@ Comtrya product. previews, and diffs derived from Git. - Real: Git clone/fetch works through the Vue origin using a scoped Comtrya credential. -- Real: extension UI manifests and assets are served from `/_extensions/...`. +- Real: extension UI manifests and assets are served from `/forge-ui/...`. - Real: the Vue shell discovers installed extensions, validates UI manifests, imports versioned entry assets, and mounts slot/route contributions. - Real: first-party backend extensions are Rust `cargo-component` crates that diff --git a/comtrya.cue b/comtrya.cue index 4ab1d4f4..2517a772 100644 --- a/comtrya.cue +++ b/comtrya.cue @@ -22,8 +22,11 @@ repository: schema.#Repository & { // inherit this enablement; per-project `issues` / `epics` blocks // are policy defaults, not feature toggles. ext_epics is listed so // project epics and issue-to-epic relationships are available to - // every project in this repo. - extensions: ["ext_issues", "ext_pull_requests", "ext_checks", "ext_epics"] + // every project in this repo. ext_docs is listed so project-owned + // ADRs, specs, PRDs, and BDD scenarios render through the repository + // docs surface instead of living as untyped files. ext_sprints turns + // sprint planning into a first-class repo workbench surface. + extensions: ["ext_issues", "ext_pull_requests", "ext_checks", "ext_epics", "ext_docs", "ext_sprints"] bookmarks: [ { @@ -93,6 +96,29 @@ projects: backend: { status: "string" } } + prd: { + slug: "server/docs/prds" + label: "Backend PRDs" + description: "Product requirements for backend-owned forge capabilities." + properties: { + title: "string" + owner: "principal-ref" + status: "string" + audience: "string" + } + } + scenario: { + slug: "server/docs/scenarios" + label: "BDD Scenarios" + description: "Behavior scenarios that describe user-visible forge workflows." + properties: { + title: "string" + feature: "string" + owner: "principal-ref" + status: "string" + tags: "[...string]" + } + } } pulls: { @@ -111,6 +137,11 @@ projects: backend: { requiredFields: ["title"] } + sprints: { + cadence: "weekly" + defaultCapacity: 8 + } + checks: { catalog: { "cargo test": { diff --git a/crates/core/src/extensions.rs b/crates/core/src/extensions.rs index abd4eee7..2bdfd516 100644 --- a/crates/core/src/extensions.rs +++ b/crates/core/src/extensions.rs @@ -50,7 +50,7 @@ pub struct ExtensionInstallConfig { /// already rejects any prefix starting with `_` — the entry was permanently /// unreachable and only existed as defensive documentation (#122 P3). pub const RESERVED_ROUTE_PREFIXES: &[&str] = &[ - "r", "x", "api", "auth", "git", "graphql", "events", "readyz", "healthz", "instance", + "r", "x", "api", "auth", "git", "graphql", "events", "readyz", "healthz", "instance", "ui-ext", ]; fn validate_route_prefix(prefix: &str) -> CoreResult<()> { diff --git a/crates/core/src/http.rs b/crates/core/src/http.rs index 618d566c..aae8533e 100644 --- a/crates/core/src/http.rs +++ b/crates/core/src/http.rs @@ -36,11 +36,11 @@ pub fn allowed_methods_for_route(route: &str) -> Vec<&'static str> { match route { "/graphql" => vec!["GET", "POST", "OPTIONS"], "/graphql/stream" | "/events" => vec!["GET", "OPTIONS"], - "/events/session" | "/auth/token-exchange" | "/_extensions/session" => { + "/events/session" | "/auth/token-exchange" | "/ui-ext/session" => { vec!["POST", "OPTIONS"] } route if route.starts_with("/auth/") => vec!["GET", "POST", "OPTIONS"], - route if route.starts_with("/_extensions/") => vec!["GET", "OPTIONS"], + route if route.starts_with("/ui-ext/") => vec!["GET", "OPTIONS"], route if route.starts_with("/api/ops/") => vec!["POST", "OPTIONS"], // `/r/` multiplexes browse (GET) and git smart-HTTP // (GET info/refs, POST upload-pack/receive-pack) under one prefix, diff --git a/crates/server/docs/prds/repository-docs-surface.mdx b/crates/server/docs/prds/repository-docs-surface.mdx new file mode 100644 index 00000000..8c561c31 --- /dev/null +++ b/crates/server/docs/prds/repository-docs-surface.mdx @@ -0,0 +1,36 @@ +--- +title: Repository Docs Surface +owner: platform-maintainers +status: active +audience: maintainers +--- + +## Problem + +Developers expect a forge to keep product intent beside the implementation. Comtrya +already stores ADRs and specs in the repository, but product requirements and +scenario-style acceptance criteria need the same first-class surface so a +single-tenant forge can connect planning, implementation, and review without +sending users to a separate product tool. + +## Requirements + +- A repository can opt into `ext_docs` once and expose project-owned document + types from `comtrya.cue`. +- Backend-owned PRDs live under `crates/server/docs/prds/` and render in the + Docs extension with their declared front matter. +- Scenario documents live beside backend docs and describe user-visible + workflows in a format that can later drive tests or issue templates. +- The kernel stays generic: it evaluates doc type shape from CUE, while + `ext_docs` owns the reading and rendering experience. + +## Non-Goals + +- Do not hardcode PRD or BDD semantics into the kernel. +- Do not add a separate requirements service before repo-resident docs have + been proven in the main forge workflow. + +## Success + +Opening the backend project docs shows ADRs, specs, PRDs, and BDD scenarios as +declared document types, each backed by real repository files. diff --git a/crates/server/docs/scenarios/repository-docs-surface.mdx b/crates/server/docs/scenarios/repository-docs-surface.mdx new file mode 100644 index 00000000..152efdaa --- /dev/null +++ b/crates/server/docs/scenarios/repository-docs-surface.mdx @@ -0,0 +1,22 @@ +--- +title: Repository docs are discoverable from project context +feature: repository-docs +owner: platform-maintainers +status: active +tags: [docs, projects, bdd] +--- + +## Scenario + +Given the Comtrya repository has opted into `ext_docs` +And the backend project declares ADR, spec, PRD, and scenario document types +When a developer opens the repository docs surface +Then the docs panel groups documents by backend project and declared type +And each file shows its front matter, path, and rendered MDX body +And the developer can expand a document without leaving the forge shell. + +## Notes + +This scenario is intentionally stored as MDX today. The shape is simple enough +for humans to review, and it gives the extension a concrete BDD-style artifact +to render before we invest in a stricter Gherkin parser or test generator. diff --git a/crates/server/src/main.rs b/crates/server/src/main.rs index b718a97a..127d687d 100644 --- a/crates/server/src/main.rs +++ b/crates/server/src/main.rs @@ -54,6 +54,8 @@ mod generated_dispatch { include!(concat!(env!("OUT_DIR"), "/dispatch_table.rs")); } +const UI_EXTENSION_BASE_PATH: &str = "/ui-ext"; + #[derive(Clone)] struct PureRustGitState { project_root: PathBuf, @@ -500,14 +502,11 @@ fn router(state: AppState) -> Router { // is `not_found_or_unsupported`. Discovered while smoke- // testing the new Dockerfile (#12). .route( - "/_extensions/session", + "/ui-ext/session", post(extension_session).layer(RequestBodyLimitLayer::new(SESSION_BODY_LIMIT)), ) - .route( - "/_extensions/:extension/manifest.json", - get(extension_manifest), - ) - .route("/_extensions/:extension/assets/*path", get(extension_asset)) + .route("/ui-ext/:module/meta.json", get(extension_manifest)) + .route("/ui-ext/:module/files/*path", get(extension_asset)) // `/r/` is the single forge URL: the SPA browses it and git // clients clone/push it. The handler branches on git smart-HTTP // markers; non-git browse traffic is owned by the SPA edge and falls @@ -535,7 +534,7 @@ fn router(state: AppState) -> Router { // `if_not_present` so the per-asset CSP installed by // `apply_extension_asset_headers` (which uses // `frame-ancestors 'self'` so extension UIs can frame their own -// assets) wins on the `/_extensions/.../assets/*` route. Every +// assets) wins on the `/ui-ext/.../files/*` route. Every // other route inherits the strict default. // * `Strict-Transport-Security` is only applied when TLS terminates // at the server (`tls_terminated == true`). Plain-HTTP development @@ -4305,6 +4304,7 @@ fn graphql_response(state: AppState, headers: HeaderMap, payload: Value) -> Resp }) .unwrap_or_default(); let query_str = payload.get("query").and_then(Value::as_str).unwrap_or(""); + let include_comtrya_config = query_requests_field(query_str, "comtryaConfig"); let mut repository_by_path = resolve_repository_by_path(&repositories_value, &path_segments).unwrap_or(json!(null)); // Enrich repositoryByPath with derived fields (groups, on-disk git data) @@ -4342,7 +4342,7 @@ fn graphql_response(state: AppState, headers: HeaderMap, payload: Value) -> Resp if query_requests_field(query_str, "bookmarks") { annotate_bookmarks_with_resolution(repo_obj, &git_dir); } - if query_requests_field(query_str, "comtryaConfig") { + if include_comtrya_config { repo_obj.insert("comtryaConfig".to_string(), (*comtrya_config).clone()); } @@ -4400,6 +4400,9 @@ fn graphql_response(state: AppState, headers: HeaderMap, payload: Value) -> Resp &schemas_for_overlay, ); apply_repository_cue_overrides(obj, &comtrya_config); + if include_comtrya_config { + obj.insert("comtryaConfig".to_string(), (*comtrya_config).clone()); + } annotate_bookmarks_with_resolution(obj, &git_dir); } } @@ -4744,7 +4747,7 @@ async fn events_session(State(state): State, headers: HeaderMap) -> Re } async fn extension_session(State(state): State, headers: HeaderMap) -> Response { - issue_session_response(state, headers, "/_extensions/session") + issue_session_response(state, headers, "/ui-ext/session") } fn issue_session_response(state: AppState, headers: HeaderMap, route: &str) -> Response { @@ -6884,14 +6887,22 @@ async fn device_revoke_endpoint( async fn extension_manifest( State(state): State, - AxumPath(extension): AxumPath, + AxumPath(module): AxumPath, headers: HeaderMap, ) -> Response { - let cors_route = format!("/_extensions/{extension}/manifest.json"); + let cors_route = format!("{UI_EXTENSION_BASE_PATH}/{module}/meta.json"); let cors = match state.runtime.check_boundary(&headers, &cors_route) { Ok(cors) => cors, Err(response) => return *response, }; + let Some(extension) = extension_id_from_ui_module_token(&module) else { + return error_response( + StatusCode::NOT_FOUND, + ErrorCode::NotFound.as_str(), + "extension manifest was not found", + cors, + ); + }; match state.runtime.extension_manifest_body(&extension) { Ok(Some(body)) => text_response(StatusCode::OK, "application/json", body, cors), Ok(None) => error_response( @@ -6911,14 +6922,22 @@ async fn extension_manifest( async fn extension_asset( State(state): State, - AxumPath((extension, asset_path)): AxumPath<(String, String)>, + AxumPath((module, asset_path)): AxumPath<(String, String)>, headers: HeaderMap, ) -> Response { - let cors_route = format!("/_extensions/{extension}/assets/{asset_path}"); + let cors_route = format!("{UI_EXTENSION_BASE_PATH}/{module}/files/{asset_path}"); let cors = match state.runtime.check_boundary(&headers, &cors_route) { Ok(cors) => cors, Err(response) => return *response, }; + let Some(extension) = extension_id_from_ui_module_token(&module) else { + return error_response( + StatusCode::NOT_FOUND, + ErrorCode::NotFound.as_str(), + "extension asset was not found", + cors, + ); + }; let asset = match state.runtime.extension_asset_body(&extension, &asset_path) { Ok(Some(asset)) => asset, Ok(None) => { @@ -7947,6 +7966,43 @@ fn git_branches(git_dir: &Path) -> Result, String> { .collect()) } +fn git_tags(git_dir: &Path) -> Result, String> { + let output = git_text( + git_dir, + &[ + "for-each-ref", + "--sort=-creatordate", + "--format=%(refname:short)%00%(objecttype)%00%(objectname)%00%(*objectname)%00%(creatordate:relative)%00%(subject)", + "refs/tags", + ], + )?; + Ok(output + .lines() + .filter_map(|line| { + let mut parts = line.split('\0'); + let name = parts.next()?; + let kind = parts.next().unwrap_or("commit"); + let oid = parts.next().unwrap_or(""); + if name.is_empty() || oid.is_empty() { + return None; + } + let peeled = parts.next().unwrap_or(""); + let target = if peeled.is_empty() { oid } else { peeled }; + let time = parts.next().unwrap_or(""); + let subject = parts.next().unwrap_or(""); + Some(json!({ + "name": name, + "kind": kind, + "oid": oid, + "target": target, + "targetShort": target.chars().take(12).collect::(), + "time": time, + "subject": subject, + })) + }) + .collect()) +} + fn branch_distance(git_dir: &Path, branch: &str) -> Result<(u32, u32), String> { if branch == "main" { return Ok((0, 0)); @@ -8103,6 +8159,7 @@ fn repo_git_data_for_query(git_dir: &Path, query: &str) -> Value { let wants_head_oid = query_requests_field(query, "headOid"); let wants_refs = query_requests_field(query, "refs"); let wants_branches = query_requests_field(query, "branches"); + let wants_tags = query_requests_field(query, "tags"); let wants_commits = query_requests_field(query, "commits"); let wants_tree_entries = query_requests_field(query, "treeEntries"); let wants_files = query_requests_field(query, "files"); @@ -8135,6 +8192,12 @@ fn repo_git_data_for_query(git_dir: &Path, query: &str) -> Value { json!(git_branches(git_dir).unwrap_or_default()), ); } + if wants_tags { + object.insert( + "tags".to_string(), + json!(git_tags(git_dir).unwrap_or_default()), + ); + } if wants_commits { object.insert( "commits".to_string(), @@ -8895,7 +8958,10 @@ impl ExtensionRuntimeStore { "status": record.status.clone(), "component": record.component.clone(), "outputType": record.output_type.clone(), - "manifest": format!("/_extensions/{}/manifest.json", record.id), + "manifest": format!( + "{UI_EXTENSION_BASE_PATH}/{}/meta.json", + ui_module_token(&record.id) + ), }), &now, )) @@ -9478,7 +9544,7 @@ fn validate_extension_manifest_pair( "{id} UI manifest extension name does not match backend manifest" )); } - let expected_prefix = format!("/_extensions/{id}/assets/"); + let expected_prefix = format!("{UI_EXTENSION_BASE_PATH}/{}/files/", ui_module_token(id)); let entry_rel = ui_manifest .assets .entry @@ -9642,6 +9708,38 @@ fn asset_integrity(body: &[u8]) -> String { out } +fn ui_module_token(id: &str) -> String { + use std::fmt::Write as _; + + let mut out = String::with_capacity(id.len() * 2); + for byte in id.as_bytes() { + write!(&mut out, "{byte:02x}").expect("write hex token"); + } + out +} + +fn extension_id_from_ui_module_token(token: &str) -> Option { + if token.is_empty() || token.len() & 1 == 1 { + return None; + } + let mut bytes = Vec::with_capacity(token.len() / 2); + for pair in token.as_bytes().chunks_exact(2) { + let high = hex_value(pair[0])?; + let low = hex_value(pair[1])?; + bytes.push((high << 4) | low); + } + String::from_utf8(bytes).ok() +} + +fn hex_value(byte: u8) -> Option { + match byte { + b'0'..=b'9' => Some(byte - b'0'), + b'a'..=b'f' => Some(byte - b'a' + 10), + b'A'..=b'F' => Some(byte - b'A' + 10), + _ => None, + } +} + fn asset_etag(body: &[u8]) -> String { format!("\"{}\"", asset_integrity(body)) } @@ -9693,8 +9791,12 @@ pub fn validate_ui_manifest_from_value(value: &serde_json::Value) -> Result String { + format!("epics.{op}") + } + + fn docs_route(op: &str) -> String { + format!("docs.{op}") + } + + fn sprints_route(op: &str) -> String { + format!("sprints.{op}") + } + + fn checks_route(op: &str) -> String { + format!("checks.{op}") + } + #[test] fn repository_browser_previews_wit_files() { assert!(is_text_preview_path( @@ -10213,6 +10331,271 @@ mod tests { assert_eq!(info.extension_id, "ext_issues"); assert_eq!(info.interface_name, "issues"); assert_eq!(info.op_name, "close-issue"); + + let info = crate::generated_dispatch::dispatch_wit_route( + "ext_issues", + &issue_route("triage-board"), + ) + .expect("triage board route should resolve to DispatchInfo"); + assert_eq!(info.extension_id, "ext_issues"); + assert_eq!(info.interface_name, "issues"); + assert_eq!(info.op_name, "triage-board"); + + let info = crate::generated_dispatch::dispatch_wit_route( + "ext_issues", + &issue_route("label-board"), + ) + .expect("label board route should resolve to DispatchInfo"); + assert_eq!(info.extension_id, "ext_issues"); + assert_eq!(info.interface_name, "issues"); + assert_eq!(info.op_name, "label-board"); + + let info = crate::generated_dispatch::dispatch_wit_route( + "ext_issues", + &issue_route("assignee-board"), + ) + .expect("assignee board route should resolve to DispatchInfo"); + assert_eq!(info.extension_id, "ext_issues"); + assert_eq!(info.interface_name, "issues"); + assert_eq!(info.op_name, "assignee-board"); + + let info = crate::generated_dispatch::dispatch_wit_route( + "ext_issues", + &issue_route("author-board"), + ) + .expect("author board route should resolve to DispatchInfo"); + assert_eq!(info.extension_id, "ext_issues"); + assert_eq!(info.interface_name, "issues"); + assert_eq!(info.op_name, "author-board"); + + let info = crate::generated_dispatch::dispatch_wit_route( + "ext_issues", + &issue_route("project-board"), + ) + .expect("project board route should resolve to DispatchInfo"); + assert_eq!(info.extension_id, "ext_issues"); + assert_eq!(info.interface_name, "issues"); + assert_eq!(info.op_name, "project-board"); + + let info = crate::generated_dispatch::dispatch_wit_route( + "ext_issues", + &issue_route("priority-board"), + ) + .expect("priority board route should resolve to DispatchInfo"); + assert_eq!(info.extension_id, "ext_issues"); + assert_eq!(info.interface_name, "issues"); + assert_eq!(info.op_name, "priority-board"); + + let info = crate::generated_dispatch::dispatch_wit_route( + "ext_issues", + &issue_route("milestone-board"), + ) + .expect("milestone board route should resolve to DispatchInfo"); + assert_eq!(info.extension_id, "ext_issues"); + assert_eq!(info.interface_name, "issues"); + assert_eq!(info.op_name, "milestone-board"); + + let info = crate::generated_dispatch::dispatch_wit_route( + "ext_issues", + &issue_route("workflow-board"), + ) + .expect("workflow board route should resolve to DispatchInfo"); + assert_eq!(info.extension_id, "ext_issues"); + assert_eq!(info.interface_name, "issues"); + assert_eq!(info.op_name, "workflow-board"); + + let info = crate::generated_dispatch::dispatch_wit_route( + "ext_epics", + &epic_route("roadmap-board"), + ) + .expect("epic roadmap board route should resolve to DispatchInfo"); + assert_eq!(info.extension_id, "ext_epics"); + assert_eq!(info.interface_name, "epics"); + assert_eq!(info.op_name, "roadmap-board"); + + let info = + crate::generated_dispatch::dispatch_wit_route("ext_epics", &epic_route("owner-board")) + .expect("epic owner board route should resolve to DispatchInfo"); + assert_eq!(info.extension_id, "ext_epics"); + assert_eq!(info.interface_name, "epics"); + assert_eq!(info.op_name, "owner-board"); + + let info = crate::generated_dispatch::dispatch_wit_route( + "ext_epics", + &epic_route("project-board"), + ) + .expect("epic project board route should resolve to DispatchInfo"); + assert_eq!(info.extension_id, "ext_epics"); + assert_eq!(info.interface_name, "epics"); + assert_eq!(info.op_name, "project-board"); + + let info = + crate::generated_dispatch::dispatch_wit_route("ext_epics", &epic_route("label-board")) + .expect("epic label board route should resolve to DispatchInfo"); + assert_eq!(info.extension_id, "ext_epics"); + assert_eq!(info.interface_name, "epics"); + assert_eq!(info.op_name, "label-board"); + + let info = crate::generated_dispatch::dispatch_wit_route( + "ext_epics", + &epic_route("priority-board"), + ) + .expect("epic priority board route should resolve to DispatchInfo"); + assert_eq!(info.extension_id, "ext_epics"); + assert_eq!(info.interface_name, "epics"); + assert_eq!(info.op_name, "priority-board"); + + let info = crate::generated_dispatch::dispatch_wit_route( + "ext_epics", + &epic_route("milestone-board"), + ) + .expect("epic milestone board route should resolve to DispatchInfo"); + assert_eq!(info.extension_id, "ext_epics"); + assert_eq!(info.interface_name, "epics"); + assert_eq!(info.op_name, "milestone-board"); + + let info = + crate::generated_dispatch::dispatch_wit_route("ext_epics", &epic_route("target-board")) + .expect("epic target board route should resolve to DispatchInfo"); + assert_eq!(info.extension_id, "ext_epics"); + assert_eq!(info.interface_name, "epics"); + assert_eq!(info.op_name, "target-board"); + + let info = + crate::generated_dispatch::dispatch_wit_route("ext_docs", &docs_route("tag-board")) + .expect("docs tag board route should resolve to DispatchInfo"); + assert_eq!(info.extension_id, "ext_docs"); + assert_eq!(info.interface_name, "docs"); + assert_eq!(info.op_name, "tag-board"); + + let info = + crate::generated_dispatch::dispatch_wit_route("ext_docs", &docs_route("type-board")) + .expect("docs type board route should resolve to DispatchInfo"); + assert_eq!(info.extension_id, "ext_docs"); + assert_eq!(info.interface_name, "docs"); + assert_eq!(info.op_name, "type-board"); + + let info = + crate::generated_dispatch::dispatch_wit_route("ext_docs", &docs_route("project-board")) + .expect("docs project board route should resolve to DispatchInfo"); + assert_eq!(info.extension_id, "ext_docs"); + assert_eq!(info.interface_name, "docs"); + assert_eq!(info.op_name, "project-board"); + + let info = + crate::generated_dispatch::dispatch_wit_route("ext_docs", &docs_route("handoff-board")) + .expect("docs handoff board route should resolve to DispatchInfo"); + assert_eq!(info.extension_id, "ext_docs"); + assert_eq!(info.interface_name, "docs"); + assert_eq!(info.op_name, "handoff-board"); + + let info = crate::generated_dispatch::dispatch_wit_route( + "ext_docs", + &docs_route("implementation-board"), + ) + .expect("docs implementation board route should resolve to DispatchInfo"); + assert_eq!(info.extension_id, "ext_docs"); + assert_eq!(info.interface_name, "docs"); + assert_eq!(info.op_name, "implementation-board"); + + let info = crate::generated_dispatch::dispatch_wit_route( + "ext_sprints", + &sprints_route("kanban-project-board"), + ) + .expect("sprint kanban project board route should resolve to DispatchInfo"); + assert_eq!(info.extension_id, "ext_sprints"); + assert_eq!(info.interface_name, "sprints"); + assert_eq!(info.op_name, "kanban-project-board"); + + let info = crate::generated_dispatch::dispatch_wit_route( + "ext_sprints", + &sprints_route("planning-board"), + ) + .expect("sprint planning board route should resolve to DispatchInfo"); + assert_eq!(info.extension_id, "ext_sprints"); + assert_eq!(info.interface_name, "sprints"); + assert_eq!(info.op_name, "planning-board"); + + let info = crate::generated_dispatch::dispatch_wit_route( + "ext_checks", + &checks_route("readiness-board"), + ) + .expect("checks readiness board route should resolve to DispatchInfo"); + assert_eq!(info.extension_id, "ext_checks"); + assert_eq!(info.interface_name, "checks"); + assert_eq!(info.op_name, "readiness-board"); + + let info = crate::generated_dispatch::dispatch_wit_route( + "ext_checks", + &checks_route("expected-readiness-board"), + ) + .expect("expected checks readiness board route should resolve to DispatchInfo"); + assert_eq!(info.extension_id, "ext_checks"); + assert_eq!(info.interface_name, "checks"); + assert_eq!(info.op_name, "expected-readiness-board"); + + let info = crate::generated_dispatch::dispatch_wit_route( + "ext_pull_requests", + "pulls.merge-readiness-board", + ) + .expect("pull merge readiness board route should resolve to DispatchInfo"); + assert_eq!(info.extension_id, "ext_pull_requests"); + assert_eq!(info.interface_name, "pulls"); + assert_eq!(info.op_name, "merge-readiness-board"); + + let info = crate::generated_dispatch::dispatch_wit_route( + "ext_pull_requests", + "pulls.author-board", + ) + .expect("pull author board route should resolve to DispatchInfo"); + assert_eq!(info.extension_id, "ext_pull_requests"); + assert_eq!(info.interface_name, "pulls"); + assert_eq!(info.op_name, "author-board"); + + let info = crate::generated_dispatch::dispatch_wit_route( + "ext_pull_requests", + "pulls.base-branch-board", + ) + .expect("pull base branch board route should resolve to DispatchInfo"); + assert_eq!(info.extension_id, "ext_pull_requests"); + assert_eq!(info.interface_name, "pulls"); + assert_eq!(info.op_name, "base-branch-board"); + + let info = crate::generated_dispatch::dispatch_wit_route( + "ext_pull_requests", + "pulls.head-branch-board", + ) + .expect("pull head branch board route should resolve to DispatchInfo"); + assert_eq!(info.extension_id, "ext_pull_requests"); + assert_eq!(info.interface_name, "pulls"); + assert_eq!(info.op_name, "head-branch-board"); + + let info = crate::generated_dispatch::dispatch_wit_route( + "ext_pull_requests", + "pulls.review-decision-board", + ) + .expect("pull review decision board route should resolve to DispatchInfo"); + assert_eq!(info.extension_id, "ext_pull_requests"); + assert_eq!(info.interface_name, "pulls"); + assert_eq!(info.op_name, "review-decision-board"); + + let info = crate::generated_dispatch::dispatch_wit_route( + "ext_pull_requests", + "pulls.review-request-board", + ) + .expect("pull review request board route should resolve to DispatchInfo"); + assert_eq!(info.extension_id, "ext_pull_requests"); + assert_eq!(info.interface_name, "pulls"); + assert_eq!(info.op_name, "review-request-board"); + + let info = crate::generated_dispatch::dispatch_wit_route( + "ext_pull_requests", + "pulls.reviewer-queue", + ) + .expect("pull reviewer queue route should resolve to DispatchInfo"); + assert_eq!(info.extension_id, "ext_pull_requests"); + assert_eq!(info.interface_name, "pulls"); + assert_eq!(info.op_name, "reviewer-queue"); } #[test] @@ -10320,6 +10703,18 @@ mod tests { "git commit", ) .unwrap(); + run_command( + Command::new("git").arg("-C").arg(&repo).args([ + "-c", + "tag.gpgSign=false", + "-c", + "tag.forceSignAnnotated=false", + "tag", + "v0.1.0", + ]), + "git tag", + ) + .unwrap(); run_command( Command::new("git").arg("-C").arg(&repo).args([ @@ -10715,7 +11110,7 @@ mod tests { let data = repo_git_data_for_query( &git_dir, - "query($segments:[String!]!){ workspace { repositoryByPath(segments:$segments) { defaultBranch headOid refs { name target } branches { name } commits { oid } treeEntries { path } files { path } blobs { path } } } }", + "query($segments:[String!]!){ workspace { repositoryByPath(segments:$segments) { defaultBranch headOid refs { name target } branches { name } tags { name target targetShort kind } commits { oid } treeEntries { path } files { path } blobs { path } } } }", ); assert_eq!(repository["path"], "comtrya/comtrya"); @@ -10731,6 +11126,12 @@ mod tests { .iter() .any(|branch| branch["name"] == "main") ); + assert!(data["tags"].as_array().unwrap().iter().any(|tag| { + tag["name"] == "v0.1.0" + && tag["target"] == data["headOid"] + && tag["targetShort"] == &data["headOid"].as_str().unwrap()[..12] + && tag["kind"] == "commit" + })); assert!(!data["commits"].as_array().unwrap().is_empty()); assert!( data["treeEntries"] @@ -10773,6 +11174,7 @@ mod tests { .any(|file| file["path"] == "README.md") ); assert!(files.get("commits").is_none()); + assert!(files.get("tags").is_none()); assert!(files.get("blobs").is_none()); } @@ -11252,7 +11654,7 @@ mod tests { runtime, git_state: PureRustGitState::test_default(), }), - AxumPath("ext_does_not_exist".to_string()), + AxumPath(ui_module_token("ext_does_not_exist")), origin_headers(), ) .await; @@ -11274,7 +11676,7 @@ mod tests { runtime, git_state: PureRustGitState::test_default(), }), - AxumPath(("ext_issues".to_string(), "index.js".to_string())), + AxumPath((ui_module_token("ext_issues"), "index.js".to_string())), HeaderMap::new(), ) .await; @@ -12605,7 +13007,10 @@ mod tests { serde_json::from_str::(&fs::read_to_string(&ui_manifest_path).unwrap()).unwrap(); ui["id"] = json!("ext_local_wit"); ui["extension"] = json!("local-wit"); - ui["assets"]["entry"] = json!("/_extensions/ext_local_wit/assets/index.js"); + ui["assets"]["entry"] = json!(format!( + "/ui-ext/{}/files/index.js", + ui_module_token("ext_local_wit") + )); fs::write(&ui_manifest_path, serde_json::to_vec_pretty(&ui).unwrap()).unwrap(); let configs = vec![ExtensionInstallConfig { @@ -13375,7 +13780,7 @@ mod tests { "version": "0.1.0", "publisher": "comtrya-dev", "assets": { - "entry": "/_extensions/ext_test/assets/index.js", + "entry": format!("/ui-ext/{}/files/index.js", ui_module_token("ext_test")), "entryIntegrity": "sha256-abc", "styles": [] }, @@ -13394,7 +13799,7 @@ mod tests { "schemaVersion": "comtrya.ui-extension/v1", "id": "ext_sample", "extension": "sample", - "assets": { "entry": "/_extensions/ext_sample/assets/index.js", "entryIntegrity": "sha256-xyz", "styles": [] }, + "assets": { "entry": format!("/ui-ext/{}/files/index.js", ui_module_token("ext_sample")), "entryIntegrity": "sha256-xyz", "styles": [] }, "routes": [], "slots": [{ "slot": "repository.code", "element": "x-el", "requiredPermission": "code.read" }] }); @@ -13413,7 +13818,7 @@ mod tests { let v2 = serde_json::json!({ "schemaVersion": "comtrya.ui-extension/v2", "id": "ext_test", "extension": "test", "version": "0.1.0", "publisher": "comtrya-dev", - "assets": { "entry": "/_extensions/ext_test/assets/index.js", "entryIntegrity": "sha256-abc", "styles": [] }, + "assets": { "entry": format!("/ui-ext/{}/files/index.js", ui_module_token("ext_test")), "entryIntegrity": "sha256-abc", "styles": [] }, "permissions": [], "contributes": { "slots": ["bogus"], "routes": false } }); @@ -14799,7 +15204,7 @@ mod tests { git_state: PureRustGitState::test_default(), }), headers, - json!({"query": "{ workspace { repositories { id name groups openPullRequests checkSummary { passed total } lastCommitAt } } }"}).to_string(), + json!({"query": "{ workspace { repositories { id name groups openPullRequests checkSummary { passed total } lastCommitAt comtryaConfig } } }"}).to_string(), ) .await; @@ -14841,6 +15246,17 @@ mod tests { repo.get("lastCommitAt").is_some(), "lastCommitAt must be present" ); + let projects = repo + .get("comtryaConfig") + .and_then(|config| config.get("projects")) + .and_then(Value::as_array) + .expect("comtryaConfig.projects must be an array"); + assert!( + projects + .iter() + .any(|project| project.get("name") == Some(&json!("kernel"))), + "repository summary must include evaluated CUE projects" + ); } } @@ -15527,7 +15943,7 @@ mod tests { let addr = spawn_test_server(dev_runtime_no_extensions()).await; let oversized = "a".repeat(SESSION_BODY_LIMIT + 1); let response = reqwest::Client::new() - .post(format!("http://{addr}/_extensions/session")) + .post(format!("http://{addr}/ui-ext/session")) .header("content-type", "application/json") .body(oversized) .send() @@ -15701,7 +16117,7 @@ mod tests { #[tokio::test] async fn extension_asset_csp_not_overridden_by_global_layer() { - // /_extensions/.../assets/* installs its own per-route CSP + // /ui-ext/.../files/* installs its own per-route CSP // (`frame-ancestors 'self'`) via `apply_extension_asset_headers`. // The global layer uses `if_not_present` so the asset CSP must // survive. Hitting a missing asset still goes through the @@ -15709,7 +16125,8 @@ mod tests { let addr = spawn_security_test_server(dev_runtime_no_extensions()).await; let response = reqwest::Client::new() .get(format!( - "http://{addr}/_extensions/ext_issues/assets/index.js" + "http://{addr}/ui-ext/{}/files/index.js", + ui_module_token("ext_issues") )) .send() .await diff --git a/crates/server/src/wasm_invokers.rs b/crates/server/src/wasm_invokers.rs index c503d51b..9c94f83c 100644 --- a/crates/server/src/wasm_invokers.rs +++ b/crates/server/src/wasm_invokers.rs @@ -66,8 +66,16 @@ mod ext_issues_bindings { use ext_issues_bindings::ExtIssues; use ext_issues_bindings::exports::comtrya::ext_issues::issues::{ - AssignProjectInput as IssuesAssignProjectInput, CloseIssueInput, Issue, IssueState, - IssueStateCounts, OpenIssueInput, UpdateIssueInput, + AssignProjectInput as IssuesAssignProjectInput, CloseIssueInput, Issue, IssueAssigneeBoard, + IssueAssigneeBoardInput, IssueAssigneeCard, IssueAssigneeColumn, IssueAuthorBoard, + IssueAuthorBoardInput, IssueAuthorCard, IssueAuthorColumn, IssueLabelBoard, + IssueLabelBoardInput, IssueLabelCard, IssueLabelColumn, IssueMilestoneBoard, + IssueMilestoneBoardInput, IssueMilestoneCard, IssueMilestoneColumn, IssuePriorityBoard, + IssuePriorityBoardInput, IssuePriorityCard, IssuePriorityColumn, IssueProjectBoard, + IssueProjectBoardInput, IssueProjectCard, IssueProjectColumn, IssueState, IssueStateCounts, + IssueTriageBoard, IssueTriageBoardInput, IssueTriageCard, IssueTriageColumn, + IssueWorkflowBoard, IssueWorkflowBoardInput, IssueWorkflowCard, IssueWorkflowColumn, + OpenIssueInput, UpdateIssueInput, }; mod ext_epics_bindings { @@ -80,7 +88,14 @@ mod ext_epics_bindings { use ext_epics_bindings::ExtEpics; use ext_epics_bindings::exports::comtrya::ext_epics::epics::{ AssignProjectInput as EpicsAssignProjectInput, ChangeStateEpicInput, CreateEpicInput, Epic, - EpicProgress, EpicState, UpdateEpicInput, + EpicLabelBoard, EpicLabelCard, EpicLabelColumn, EpicMilestoneBoard, EpicMilestoneCard, + EpicMilestoneColumn, EpicOwnerBoard, EpicOwnerCard, EpicOwnerColumn, EpicPriorityBoard, + EpicPriorityCard, EpicPriorityColumn, EpicProgress, EpicProjectBoard, EpicProjectCard, + EpicProjectColumn, EpicRoadmapBoard, EpicRoadmapCard, EpicRoadmapColumn, EpicState, + EpicTargetBoard, EpicTargetCard, EpicTargetColumn, LabelBoardInput as EpicsLabelBoardInput, + MilestoneBoardInput as EpicsMilestoneBoardInput, OwnerBoardInput, + PriorityBoardInput as EpicsPriorityBoardInput, ProjectBoardInput as EpicsProjectBoardInput, + RoadmapBoardInput, TargetBoardInput, UpdateEpicInput, }; mod ext_pull_requests_bindings { @@ -92,7 +107,18 @@ mod ext_pull_requests_bindings { use ext_pull_requests_bindings::ExtPullRequests; use ext_pull_requests_bindings::exports::comtrya::ext_pull_requests::pulls::{ - ClosePullInput, CreatePullInput, MergePullInput, PrState, PullRequest, + ChangeStatePullInput, ClosePullInput, CreatePullInput, ListPullReviewsInput, + ListReviewRequestsInput, MergePullInput, PrState, PullAuthorBoard, PullAuthorBoardInput, + PullAuthorCard, PullAuthorColumn, PullBaseBranchBoard, PullBaseBranchBoardInput, + PullBaseBranchCard, PullBaseBranchColumn, PullHeadBranchBoard, PullHeadBranchBoardInput, + PullHeadBranchCard, PullHeadBranchColumn, PullMergeCheckSummary, PullMergeReadinessBoard, + PullMergeReadinessBoardInput, PullMergeReadinessCard, PullMergeReadinessColumn, + PullMergeReviewSummary, PullRequest, PullReview, PullReviewBoard, PullReviewBoardInput, + PullReviewCard, PullReviewColumn, PullReviewDecision, PullReviewDecisionBoard, + PullReviewDecisionBoardInput, PullReviewDecisionCard, PullReviewDecisionColumn, + PullReviewRequest, PullReviewRequestBoard, PullReviewRequestBoardInput, PullReviewRequestCard, + PullReviewRequestColumn, PullReviewerQueue, PullReviewerQueueCard, PullReviewerQueueColumn, + PullReviewerQueueInput, RequestReviewInput, SubmitReviewInput, }; mod ext_checks_bindings { @@ -104,7 +130,10 @@ mod ext_checks_bindings { use ext_checks_bindings::ExtChecks; use ext_checks_bindings::exports::comtrya::ext_checks::checks::{ - CheckRun, CheckState, RecordCheckInput, + CheckReadinessBoard, CheckReadinessBoardInput, CheckReadinessCard, CheckReadinessColumn, + CheckRun, CheckState, ExpectedCheck, ExpectedCheckReadinessBoard, + ExpectedCheckReadinessBoardInput, ExpectedCheckReadinessCard, ExpectedCheckReadinessColumn, + RecordCheckInput, }; mod ext_workspace_home_bindings { @@ -124,6 +153,19 @@ mod ext_docs_bindings { } use ext_docs_bindings::ExtDocs; +use ext_docs_bindings::exports::comtrya::ext_docs::docs::{ + BddScenario, BddStep, BddSummary, DocCatalog, DocCatalogInput as DocsDocCatalogInput, + DocChecklistItem, DocChecklistSection, DocChecklistSummary, DocDecisionBoard, DocDecisionCard, + DocDecisionColumn, DocDecisionItem, DocDecisionSummary, DocHandoffBoard, DocHandoffCard, + DocHandoffColumn, DocImplementationBoard, DocImplementationCard, DocImplementationColumn, + DocOutlineHeading, DocOutlineSummary, DocOwnerBoard, DocOwnerCard, DocOwnerColumn, + DocProjectBoard, DocProjectCard, DocProjectColumn, DocProperty, DocReadinessBoard, + DocReadinessCard, DocReadinessColumn, DocReference, DocReferenceSummary, DocScenarioBoard, + DocScenarioCard, DocScenarioColumn, DocStatusBoard, DocStatusCard, DocStatusColumn, DocSummary, + DocTagBoard, DocTagCard, DocTagColumn, DocTraceabilityBoard, DocTraceabilityCard, + DocTraceabilityColumn, DocTypeBoard, DocTypeCard, DocTypeColumn, + DocTypeInput as DocsDocTypeInput, DocTypeSummary, SummarizeDocInput as DocsSummarizeDocInput, +}; mod ext_sprints_bindings { wasmtime::component::bindgen!({ @@ -135,7 +177,10 @@ mod ext_sprints_bindings { use ext_sprints_bindings::ExtSprints; use ext_sprints_bindings::exports::comtrya::ext_sprints::sprints::{ AssignIssueInput as SprintsAssignIssueInput, ChangeStateInput as SprintsChangeStateInput, - CreateSprintInput, ListSprintsInput, MembersInput, Sprint, SprintState, + CreateSprintInput, KanbanBoard, KanbanCard, KanbanCardState, KanbanColumn, KanbanInput, + KanbanSwimlane, ListSprintsInput, MembersInput, ProjectKanbanBoard, Sprint, SprintBoard, + SprintBoardColumn, SprintBoardIssue, SprintBoardIssueState, SprintPlanningBoard, + SprintPlanningCard, SprintPlanningColumn, SprintState, }; #[derive(serde::Deserialize)] @@ -192,6 +237,62 @@ struct UpdateIssueInputJson { labels: Option>, } +#[derive(serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct IssueTriageBoardInputJson { + repository: String, + limit: u32, +} + +#[derive(serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct IssueLabelBoardInputJson { + repository: String, + limit: u32, +} + +#[derive(serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct IssueAssigneeBoardInputJson { + repository: String, + limit: u32, +} + +#[derive(serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct IssueAuthorBoardInputJson { + repository: String, + limit: u32, +} + +#[derive(serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct IssueProjectBoardInputJson { + repository: String, + limit: u32, +} + +#[derive(serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct IssuePriorityBoardInputJson { + repository: String, + limit: u32, +} + +#[derive(serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct IssueMilestoneBoardInputJson { + repository: String, + limit: u32, +} + +#[derive(serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct IssueWorkflowBoardInputJson { + repository: String, + limit: u32, +} + /// Input for `update-epic`. Same optional-field semantics as `UpdateIssueInputJson`. #[derive(serde::Deserialize)] #[serde(rename_all = "camelCase")] @@ -210,6 +311,55 @@ struct UpdateEpicInputJson { labels: Option>, } +#[derive(serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct RoadmapBoardInputJson { + workspace: String, + limit: u32, +} + +#[derive(serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct OwnerBoardInputJson { + workspace: String, + limit: u32, +} + +#[derive(serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct EpicProjectBoardInputJson { + workspace: String, + limit: u32, +} + +#[derive(serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct EpicLabelBoardInputJson { + workspace: String, + limit: u32, +} + +#[derive(serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct EpicPriorityBoardInputJson { + workspace: String, + limit: u32, +} + +#[derive(serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct EpicMilestoneBoardInputJson { + workspace: String, + limit: u32, +} + +#[derive(serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct TargetBoardInputJson { + workspace: String, + limit: u32, +} + #[derive(serde::Deserialize)] #[serde(rename_all = "camelCase")] struct ByNumberIssueInputJson { @@ -263,6 +413,116 @@ struct ClosePullInputJson { closed_by_ref: Option, } +#[derive(serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct ChangeStatePullInputJson { + id: String, + state: String, +} + +#[derive(serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct SubmitReviewInputJson { + pull_id: String, + decision: String, + body_markdown: String, + reviewer_ref: Option, +} + +#[derive(serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct ListPullReviewsInputJson { + pull_id: String, + limit: u32, +} + +#[derive(serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct RequestReviewInputJson { + pull_id: String, + reviewer_ref: String, + requested_by_ref: Option, +} + +#[derive(serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct ListReviewRequestsInputJson { + pull_id: String, + limit: u32, +} + +#[derive(serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct PullReviewBoardInputJson { + repository: String, + limit: u32, +} + +#[derive(serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct PullAuthorBoardInputJson { + repository: String, + limit: u32, +} + +#[derive(serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct PullBaseBranchBoardInputJson { + repository: String, + limit: u32, +} + +#[derive(serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct PullHeadBranchBoardInputJson { + repository: String, + limit: u32, +} + +#[derive(serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct PullMergeCheckSummaryJson { + pull_id: String, + required_missing: u32, + required_failing: u32, + pending: u32, + optional_failing: u32, + passing: u32, + total: u32, +} + +#[derive(serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct PullMergeReadinessBoardInputJson { + repository: String, + #[serde(default)] + check_summaries: Vec, + required_approvals: u32, + limit: u32, +} + +#[derive(serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct PullReviewDecisionBoardInputJson { + repository: String, + limit: u32, +} + +#[derive(serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct PullReviewRequestBoardInputJson { + repository: String, + limit: u32, +} + +#[derive(serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct PullReviewerQueueInputJson { + repository: String, + reviewer_ref: Option, + limit: u32, +} + #[derive(serde::Deserialize)] #[serde(rename_all = "camelCase")] struct RecordCheckInputJson { @@ -275,6 +535,33 @@ struct RecordCheckInputJson { required: bool, } +#[derive(serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct CheckReadinessBoardInputJson { + repository: String, + #[serde(default, rename = "commitOID")] + commit_oid: Option, + limit: u32, +} + +#[derive(serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct ExpectedCheckJson { + name: String, + required: bool, +} + +#[derive(serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct ExpectedCheckReadinessBoardInputJson { + repository: String, + #[serde(rename = "commitOID")] + commit_oid: String, + #[serde(default)] + expected: Vec, + limit: u32, +} + #[derive(serde::Deserialize)] #[serde(rename_all = "camelCase")] struct CreateSprintInputJson { @@ -317,6 +604,42 @@ struct MembersInputJson { limit: u32, } +#[derive(serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct KanbanInputJson { + workspace: String, + #[serde(default)] + issue_refs: Vec, + limit: u32, +} + +#[derive(serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct SummarizeDocInputJson { + path: String, + preview: String, +} + +#[derive(serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct DocTypeInputJson { + project_name: String, + type_name: String, + label: String, + #[serde(default)] + description: Option, + slug: String, + #[serde(default)] + files: Vec, +} + +#[derive(serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct DocCatalogInputJson { + #[serde(default)] + types: Vec, +} + pub fn reactor_subscriptions_for_extension( registry: &WasmRegistry, store: Arc, @@ -668,50 +991,223 @@ pub fn dispatch_ext_issues( .collect(), ) } - "by-ref-issue" => { - let ref_uri = string_payload(&input, "by-ref-issue")?; + "triage-board" => { + let parsed: IssueTriageBoardInputJson = serde_json::from_value(input).map_err(|e| { + wit_error( + wit_types::ErrorCode::BadInput, + format!("parse triage-board input: {e}"), + ) + })?; + let wit_input = IssueTriageBoardInput { + repository: parsed.repository, + limit: parsed.limit, + }; let result = issues - .call_by_ref_issue(&mut wasm_store, &ref_uri) + .call_triage_board(&mut wasm_store, &wit_input) .map_err(|e| { wit_error( wit_types::ErrorCode::Internal, - format!("by-ref-issue call: {e}"), + format!("triage-board call: {e}"), ) })?; - match result.map_err(local_error_to_canonical)? { - Some(issue) => { - ensure_repo_enabled(registry, &gate_store, &issue.repository, "ext_issues")?; - issue_to_json(&issue) - } - None => Value::Null, - } + issue_triage_board_to_json(&result.map_err(local_error_to_canonical)?) } - "by-refs-issue" => { - // Intentionally NOT per-repo gated. A batch of issue refs can - // span multiple repositories, so there is no single repo to - // gate against. Per the Phase-2 opt-in decision, cross-repo - // batch reads are exempt from the gate; opt-in governs - // mutations and single-repo reads only. - let refs = string_vec_payload(&input, "by-refs-issue")?; + "label-board" => { + let parsed: IssueLabelBoardInputJson = serde_json::from_value(input).map_err(|e| { + wit_error( + wit_types::ErrorCode::BadInput, + format!("parse label-board input: {e}"), + ) + })?; + let wit_input = IssueLabelBoardInput { + repository: parsed.repository, + limit: parsed.limit, + }; let result = issues - .call_by_refs_issue(&mut wasm_store, &refs) + .call_label_board(&mut wasm_store, &wit_input) .map_err(|e| { wit_error( wit_types::ErrorCode::Internal, - format!("by-refs-issue call: {e}"), + format!("label-board call: {e}"), ) })?; - Value::Array( - result - .map_err(local_error_to_canonical)? - .iter() - .map(|issue| issue.as_ref().map(issue_to_json).unwrap_or(Value::Null)) - .collect(), - ) + issue_label_board_to_json(&result.map_err(local_error_to_canonical)?) } - "by-number-issue" => { - let parsed: ByNumberIssueInputJson = serde_json::from_value(input).map_err(|e| { - wit_error( + "assignee-board" => { + let parsed: IssueAssigneeBoardInputJson = + serde_json::from_value(input).map_err(|e| { + wit_error( + wit_types::ErrorCode::BadInput, + format!("parse assignee-board input: {e}"), + ) + })?; + let wit_input = IssueAssigneeBoardInput { + repository: parsed.repository, + limit: parsed.limit, + }; + let result = issues + .call_assignee_board(&mut wasm_store, &wit_input) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("assignee-board call: {e}"), + ) + })?; + issue_assignee_board_to_json(&result.map_err(local_error_to_canonical)?) + } + "author-board" => { + let parsed: IssueAuthorBoardInputJson = serde_json::from_value(input).map_err(|e| { + wit_error( + wit_types::ErrorCode::BadInput, + format!("parse author-board input: {e}"), + ) + })?; + let wit_input = IssueAuthorBoardInput { + repository: parsed.repository, + limit: parsed.limit, + }; + let result = issues + .call_author_board(&mut wasm_store, &wit_input) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("author-board call: {e}"), + ) + })?; + issue_author_board_to_json(&result.map_err(local_error_to_canonical)?) + } + "project-board" => { + let parsed: IssueProjectBoardInputJson = + serde_json::from_value(input).map_err(|e| { + wit_error( + wit_types::ErrorCode::BadInput, + format!("parse project-board input: {e}"), + ) + })?; + let wit_input = IssueProjectBoardInput { + repository: parsed.repository, + limit: parsed.limit, + }; + let result = issues + .call_project_board(&mut wasm_store, &wit_input) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("project-board call: {e}"), + ) + })?; + issue_project_board_to_json(&result.map_err(local_error_to_canonical)?) + } + "priority-board" => { + let parsed: IssuePriorityBoardInputJson = + serde_json::from_value(input).map_err(|e| { + wit_error( + wit_types::ErrorCode::BadInput, + format!("parse priority-board input: {e}"), + ) + })?; + let wit_input = IssuePriorityBoardInput { + repository: parsed.repository, + limit: parsed.limit, + }; + let result = issues + .call_priority_board(&mut wasm_store, &wit_input) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("priority-board call: {e}"), + ) + })?; + issue_priority_board_to_json(&result.map_err(local_error_to_canonical)?) + } + "milestone-board" => { + let parsed: IssueMilestoneBoardInputJson = + serde_json::from_value(input).map_err(|e| { + wit_error( + wit_types::ErrorCode::BadInput, + format!("parse milestone-board input: {e}"), + ) + })?; + let wit_input = IssueMilestoneBoardInput { + repository: parsed.repository, + limit: parsed.limit, + }; + let result = issues + .call_milestone_board(&mut wasm_store, &wit_input) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("milestone-board call: {e}"), + ) + })?; + issue_milestone_board_to_json(&result.map_err(local_error_to_canonical)?) + } + "workflow-board" => { + let parsed: IssueWorkflowBoardInputJson = + serde_json::from_value(input).map_err(|e| { + wit_error( + wit_types::ErrorCode::BadInput, + format!("parse workflow-board input: {e}"), + ) + })?; + let wit_input = IssueWorkflowBoardInput { + repository: parsed.repository, + limit: parsed.limit, + }; + let result = issues + .call_workflow_board(&mut wasm_store, &wit_input) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("workflow-board call: {e}"), + ) + })?; + issue_workflow_board_to_json(&result.map_err(local_error_to_canonical)?) + } + "by-ref-issue" => { + let ref_uri = string_payload(&input, "by-ref-issue")?; + let result = issues + .call_by_ref_issue(&mut wasm_store, &ref_uri) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("by-ref-issue call: {e}"), + ) + })?; + match result.map_err(local_error_to_canonical)? { + Some(issue) => { + ensure_repo_enabled(registry, &gate_store, &issue.repository, "ext_issues")?; + issue_to_json(&issue) + } + None => Value::Null, + } + } + "by-refs-issue" => { + // Intentionally NOT per-repo gated. A batch of issue refs can + // span multiple repositories, so there is no single repo to + // gate against. Per the Phase-2 opt-in decision, cross-repo + // batch reads are exempt from the gate; opt-in governs + // mutations and single-repo reads only. + let refs = string_vec_payload(&input, "by-refs-issue")?; + let result = issues + .call_by_refs_issue(&mut wasm_store, &refs) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("by-refs-issue call: {e}"), + ) + })?; + Value::Array( + result + .map_err(local_error_to_canonical)? + .iter() + .map(|issue| issue.as_ref().map(issue_to_json).unwrap_or(Value::Null)) + .collect(), + ) + } + "by-number-issue" => { + let parsed: ByNumberIssueInputJson = serde_json::from_value(input).map_err(|e| { + wit_error( wit_types::ErrorCode::BadInput, format!("parse by-number-issue input: {e}"), ) @@ -1024,6 +1520,155 @@ pub fn dispatch_ext_epics( })?; epic_progress_to_json(&result.map_err(epic_error_to_canonical)?) } + "roadmap-board" => { + let parsed: RoadmapBoardInputJson = serde_json::from_value(input).map_err(|e| { + wit_error( + wit_types::ErrorCode::BadInput, + format!("parse roadmap-board input: {e}"), + ) + })?; + let wit_input = RoadmapBoardInput { + workspace: parsed.workspace, + limit: parsed.limit, + }; + let result = epics + .call_roadmap_board(&mut wasm_store, &wit_input) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("roadmap-board call: {e}"), + ) + })?; + epic_roadmap_board_to_json(&result.map_err(epic_error_to_canonical)?) + } + "owner-board" => { + let parsed: OwnerBoardInputJson = serde_json::from_value(input).map_err(|e| { + wit_error( + wit_types::ErrorCode::BadInput, + format!("parse owner-board input: {e}"), + ) + })?; + let wit_input = OwnerBoardInput { + workspace: parsed.workspace, + limit: parsed.limit, + }; + let result = epics + .call_owner_board(&mut wasm_store, &wit_input) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("owner-board call: {e}"), + ) + })?; + epic_owner_board_to_json(&result.map_err(epic_error_to_canonical)?) + } + "project-board" => { + let parsed: EpicProjectBoardInputJson = serde_json::from_value(input).map_err(|e| { + wit_error( + wit_types::ErrorCode::BadInput, + format!("parse project-board input: {e}"), + ) + })?; + let wit_input = EpicsProjectBoardInput { + workspace: parsed.workspace, + limit: parsed.limit, + }; + let result = epics + .call_project_board(&mut wasm_store, &wit_input) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("project-board call: {e}"), + ) + })?; + epic_project_board_to_json(&result.map_err(epic_error_to_canonical)?) + } + "label-board" => { + let parsed: EpicLabelBoardInputJson = serde_json::from_value(input).map_err(|e| { + wit_error( + wit_types::ErrorCode::BadInput, + format!("parse label-board input: {e}"), + ) + })?; + let wit_input = EpicsLabelBoardInput { + workspace: parsed.workspace, + limit: parsed.limit, + }; + let result = epics + .call_label_board(&mut wasm_store, &wit_input) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("label-board call: {e}"), + ) + })?; + epic_label_board_to_json(&result.map_err(epic_error_to_canonical)?) + } + "priority-board" => { + let parsed: EpicPriorityBoardInputJson = + serde_json::from_value(input).map_err(|e| { + wit_error( + wit_types::ErrorCode::BadInput, + format!("parse priority-board input: {e}"), + ) + })?; + let wit_input = EpicsPriorityBoardInput { + workspace: parsed.workspace, + limit: parsed.limit, + }; + let result = epics + .call_priority_board(&mut wasm_store, &wit_input) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("priority-board call: {e}"), + ) + })?; + epic_priority_board_to_json(&result.map_err(epic_error_to_canonical)?) + } + "milestone-board" => { + let parsed: EpicMilestoneBoardInputJson = + serde_json::from_value(input).map_err(|e| { + wit_error( + wit_types::ErrorCode::BadInput, + format!("parse milestone-board input: {e}"), + ) + })?; + let wit_input = EpicsMilestoneBoardInput { + workspace: parsed.workspace, + limit: parsed.limit, + }; + let result = epics + .call_milestone_board(&mut wasm_store, &wit_input) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("milestone-board call: {e}"), + ) + })?; + epic_milestone_board_to_json(&result.map_err(epic_error_to_canonical)?) + } + "target-board" => { + let parsed: TargetBoardInputJson = serde_json::from_value(input).map_err(|e| { + wit_error( + wit_types::ErrorCode::BadInput, + format!("parse target-board input: {e}"), + ) + })?; + let wit_input = TargetBoardInput { + workspace: parsed.workspace, + limit: parsed.limit, + }; + let result = epics + .call_target_board(&mut wasm_store, &wit_input) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("target-board call: {e}"), + ) + })?; + epic_target_board_to_json(&result.map_err(epic_error_to_canonical)?) + } "issues-in-epic" => { let ref_uri = string_field(&input, "ref", "issues-in-epic")?; let limit = u32_field(&input, "limit", "issues-in-epic")?; @@ -1309,15 +1954,101 @@ pub fn dispatch_ext_sprints( .collect(), ) } - other => { - return Err(wit_error( - wit_types::ErrorCode::NotFound, - format!("ext_sprints has no op named '{other}'"), - )); + "board-for-sprint" => { + let parsed: MembersInputJson = serde_json::from_value(input).map_err(|e| { + wit_error( + wit_types::ErrorCode::BadInput, + format!("parse board-for-sprint input: {e}"), + ) + })?; + let wit_input = MembersInput { + ref_: parsed.ref_, + limit: parsed.limit, + }; + let result = sprints + .call_board_for_sprint(&mut wasm_store, &wit_input) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("board-for-sprint call: {e}"), + ) + })?; + sprint_board_to_json(&result.map_err(sprints_error_to_canonical)?) } - }; - serde_json::to_vec(&value).map_err(|e| { - wit_error( + "planning-board" => { + let parsed: ListSprintsInputJson = serde_json::from_value(input).map_err(|e| { + wit_error( + wit_types::ErrorCode::BadInput, + format!("parse planning-board input: {e}"), + ) + })?; + let wit_input = ListSprintsInput { + workspace: parsed.workspace, + limit: parsed.limit, + }; + let result = sprints + .call_planning_board(&mut wasm_store, &wit_input) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("planning-board call: {e}"), + ) + })?; + sprint_planning_board_to_json(&result.map_err(sprints_error_to_canonical)?) + } + "kanban-for-issues" => { + let parsed: KanbanInputJson = serde_json::from_value(input).map_err(|e| { + wit_error( + wit_types::ErrorCode::BadInput, + format!("parse kanban-for-issues input: {e}"), + ) + })?; + let wit_input = KanbanInput { + workspace: parsed.workspace, + issue_refs: parsed.issue_refs, + limit: parsed.limit, + }; + let result = sprints + .call_kanban_for_issues(&mut wasm_store, &wit_input) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("kanban-for-issues call: {e}"), + ) + })?; + kanban_board_to_json(&result.map_err(sprints_error_to_canonical)?) + } + "kanban-project-board" => { + let parsed: KanbanInputJson = serde_json::from_value(input).map_err(|e| { + wit_error( + wit_types::ErrorCode::BadInput, + format!("parse kanban-project-board input: {e}"), + ) + })?; + let wit_input = KanbanInput { + workspace: parsed.workspace, + issue_refs: parsed.issue_refs, + limit: parsed.limit, + }; + let result = sprints + .call_kanban_project_board(&mut wasm_store, &wit_input) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("kanban-project-board call: {e}"), + ) + })?; + kanban_project_board_to_json(&result.map_err(sprints_error_to_canonical)?) + } + other => { + return Err(wit_error( + wit_types::ErrorCode::NotFound, + format!("ext_sprints has no op named '{other}'"), + )); + } + }; + serde_json::to_vec(&value).map_err(|e| { + wit_error( wit_types::ErrorCode::Internal, format!("encode result: {e}"), ) @@ -1493,6 +2224,220 @@ pub fn dispatch_ext_pull_requests( })?; pull_request_to_json(&result.map_err(pulls_error_to_canonical)?) } + "change-state-pull" => { + let parsed: ChangeStatePullInputJson = serde_json::from_value(input).map_err(|e| { + wit_error( + wit_types::ErrorCode::BadInput, + format!("parse change-state-pull input: {e}"), + ) + })?; + // Mutation keyed by pull id: load to learn the repository, + // then gate before mutating. + let existing = pulls + .call_get_pull(&mut wasm_store, &parsed.id) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("change-state-pull repo lookup: {e}"), + ) + })? + .map_err(pulls_error_to_canonical)?; + if let Some(existing) = existing.as_ref() { + ensure_repo_enabled( + registry, + &gate_store, + &existing.repository, + "ext_pull_requests", + )?; + } + let wit_input = ChangeStatePullInput { + id: parsed.id, + state: pull_state_from_json(&parsed.state)?, + }; + let result = pulls + .call_change_state_pull(&mut wasm_store, &wit_input) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("change-state-pull call: {e}"), + ) + })?; + pull_request_to_json(&result.map_err(pulls_error_to_canonical)?) + } + "submit-review" => { + let parsed: SubmitReviewInputJson = serde_json::from_value(input).map_err(|e| { + wit_error( + wit_types::ErrorCode::BadInput, + format!("parse submit-review input: {e}"), + ) + })?; + // Mutation keyed by pull id: load to learn the repository, + // then gate before writing a review. + let existing = pulls + .call_get_pull(&mut wasm_store, &parsed.pull_id) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("submit-review repo lookup: {e}"), + ) + })? + .map_err(pulls_error_to_canonical)?; + if let Some(existing) = existing.as_ref() { + ensure_repo_enabled( + registry, + &gate_store, + &existing.repository, + "ext_pull_requests", + )?; + } + let wit_input = SubmitReviewInput { + pull_id: parsed.pull_id, + decision: pull_review_decision_from_json(&parsed.decision)?, + body_markdown: parsed.body_markdown, + reviewer_ref: parsed.reviewer_ref, + }; + let result = pulls + .call_submit_review(&mut wasm_store, &wit_input) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("submit-review call: {e}"), + ) + })?; + pull_review_to_json(&result.map_err(pulls_error_to_canonical)?) + } + "list-pull-reviews" => { + let parsed: ListPullReviewsInputJson = serde_json::from_value(input).map_err(|e| { + wit_error( + wit_types::ErrorCode::BadInput, + format!("parse list-pull-reviews input: {e}"), + ) + })?; + // Read keyed by pull id: load to learn the repository, then gate. + let existing = pulls + .call_get_pull(&mut wasm_store, &parsed.pull_id) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("list-pull-reviews repo lookup: {e}"), + ) + })? + .map_err(pulls_error_to_canonical)?; + if let Some(existing) = existing.as_ref() { + ensure_repo_enabled( + registry, + &gate_store, + &existing.repository, + "ext_pull_requests", + )?; + } + let wit_input = ListPullReviewsInput { + pull_id: parsed.pull_id, + limit: parsed.limit, + }; + let result = pulls + .call_list_pull_reviews(&mut wasm_store, &wit_input) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("list-pull-reviews call: {e}"), + ) + })?; + Value::Array( + result + .map_err(pulls_error_to_canonical)? + .iter() + .map(pull_review_to_json) + .collect(), + ) + } + "request-review" => { + let parsed: RequestReviewInputJson = serde_json::from_value(input).map_err(|e| { + wit_error( + wit_types::ErrorCode::BadInput, + format!("parse request-review input: {e}"), + ) + })?; + // Mutation keyed by pull id: load to learn the repository, + // then gate before writing a review request. + let existing = pulls + .call_get_pull(&mut wasm_store, &parsed.pull_id) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("request-review repo lookup: {e}"), + ) + })? + .map_err(pulls_error_to_canonical)?; + if let Some(existing) = existing.as_ref() { + ensure_repo_enabled( + registry, + &gate_store, + &existing.repository, + "ext_pull_requests", + )?; + } + let wit_input = RequestReviewInput { + pull_id: parsed.pull_id, + reviewer_ref: parsed.reviewer_ref, + requested_by_ref: parsed.requested_by_ref, + }; + let result = pulls + .call_request_review(&mut wasm_store, &wit_input) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("request-review call: {e}"), + ) + })?; + pull_review_request_to_json(&result.map_err(pulls_error_to_canonical)?) + } + "list-review-requests" => { + let parsed: ListReviewRequestsInputJson = + serde_json::from_value(input).map_err(|e| { + wit_error( + wit_types::ErrorCode::BadInput, + format!("parse list-review-requests input: {e}"), + ) + })?; + // Read keyed by pull id: load to learn the repository, then gate. + let existing = pulls + .call_get_pull(&mut wasm_store, &parsed.pull_id) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("list-review-requests repo lookup: {e}"), + ) + })? + .map_err(pulls_error_to_canonical)?; + if let Some(existing) = existing.as_ref() { + ensure_repo_enabled( + registry, + &gate_store, + &existing.repository, + "ext_pull_requests", + )?; + } + let wit_input = ListReviewRequestsInput { + pull_id: parsed.pull_id, + limit: parsed.limit, + }; + let result = pulls + .call_list_review_requests(&mut wasm_store, &wit_input) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("list-review-requests call: {e}"), + ) + })?; + Value::Array( + result + .map_err(pulls_error_to_canonical)? + .iter() + .map(pull_review_request_to_json) + .collect(), + ) + } "get-pull" => { let id = string_payload(&input, "get-pull")?; let result = pulls.call_get_pull(&mut wasm_store, &id).map_err(|e| { @@ -1542,43 +2487,231 @@ pub fn dispatch_ext_pull_requests( .collect(), ) } - other => { - return Err(wit_error( - wit_types::ErrorCode::NotFound, - format!("ext_pull_requests has no op named '{other}'"), - )); + "review-board" => { + let parsed: PullReviewBoardInputJson = serde_json::from_value(input).map_err(|e| { + wit_error( + wit_types::ErrorCode::BadInput, + format!("parse review-board input: {e}"), + ) + })?; + let wit_input = PullReviewBoardInput { + repository: parsed.repository, + limit: parsed.limit, + }; + let result = pulls + .call_review_board(&mut wasm_store, &wit_input) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("review-board call: {e}"), + ) + })?; + pull_review_board_to_json(&result.map_err(pulls_error_to_canonical)?) } - }; - serde_json::to_vec(&value).map_err(|e| { - wit_error( - wit_types::ErrorCode::Internal, - format!("encode result: {e}"), - ) - }) -} - -pub fn dispatch_ext_checks( - registry: &WasmRegistry, - store: Arc, - current_principal: &str, - info: &crate::generated_dispatch::DispatchInfo, - payload: &[u8], - depth: u32, - reactor_depth: u32, -) -> Result, wit_types::Error> { - if info.extension_id != "ext_checks" || info.interface_name != "checks" { - return Err(wit_error( - wit_types::ErrorCode::Internal, - format!( - "ext_checks invoker received wrong route: {}.{}.{}", - info.extension_id, info.interface_name, info.op_name - ), - )); - } + "author-board" => { + let parsed: PullAuthorBoardInputJson = serde_json::from_value(input).map_err(|e| { + wit_error( + wit_types::ErrorCode::BadInput, + format!("parse author-board input: {e}"), + ) + })?; + let wit_input = PullAuthorBoardInput { + repository: parsed.repository, + limit: parsed.limit, + }; + let result = pulls + .call_author_board(&mut wasm_store, &wit_input) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("author-board call: {e}"), + ) + })?; + pull_author_board_to_json(&result.map_err(pulls_error_to_canonical)?) + } + "base-branch-board" => { + let parsed: PullBaseBranchBoardInputJson = + serde_json::from_value(input).map_err(|e| { + wit_error( + wit_types::ErrorCode::BadInput, + format!("parse base-branch-board input: {e}"), + ) + })?; + let wit_input = PullBaseBranchBoardInput { + repository: parsed.repository, + limit: parsed.limit, + }; + let result = pulls + .call_base_branch_board(&mut wasm_store, &wit_input) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("base-branch-board call: {e}"), + ) + })?; + pull_base_branch_board_to_json(&result.map_err(pulls_error_to_canonical)?) + } + "head-branch-board" => { + let parsed: PullHeadBranchBoardInputJson = + serde_json::from_value(input).map_err(|e| { + wit_error( + wit_types::ErrorCode::BadInput, + format!("parse head-branch-board input: {e}"), + ) + })?; + let wit_input = PullHeadBranchBoardInput { + repository: parsed.repository, + limit: parsed.limit, + }; + let result = pulls + .call_head_branch_board(&mut wasm_store, &wit_input) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("head-branch-board call: {e}"), + ) + })?; + pull_head_branch_board_to_json(&result.map_err(pulls_error_to_canonical)?) + } + "merge-readiness-board" => { + let parsed: PullMergeReadinessBoardInputJson = + serde_json::from_value(input).map_err(|e| { + wit_error( + wit_types::ErrorCode::BadInput, + format!("parse merge-readiness-board input: {e}"), + ) + })?; + let wit_input = PullMergeReadinessBoardInput { + repository: parsed.repository, + check_summaries: parsed + .check_summaries + .into_iter() + .map(|summary| PullMergeCheckSummary { + pull_id: summary.pull_id, + required_missing: summary.required_missing, + required_failing: summary.required_failing, + pending: summary.pending, + optional_failing: summary.optional_failing, + passing: summary.passing, + total: summary.total, + }) + .collect(), + required_approvals: parsed.required_approvals, + limit: parsed.limit, + }; + let result = pulls + .call_merge_readiness_board(&mut wasm_store, &wit_input) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("merge-readiness-board call: {e}"), + ) + })?; + pull_merge_readiness_board_to_json(&result.map_err(pulls_error_to_canonical)?) + } + "review-decision-board" => { + let parsed: PullReviewDecisionBoardInputJson = + serde_json::from_value(input).map_err(|e| { + wit_error( + wit_types::ErrorCode::BadInput, + format!("parse review-decision-board input: {e}"), + ) + })?; + let wit_input = PullReviewDecisionBoardInput { + repository: parsed.repository, + limit: parsed.limit, + }; + let result = pulls + .call_review_decision_board(&mut wasm_store, &wit_input) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("review-decision-board call: {e}"), + ) + })?; + pull_review_decision_board_to_json(&result.map_err(pulls_error_to_canonical)?) + } + "review-request-board" => { + let parsed: PullReviewRequestBoardInputJson = + serde_json::from_value(input).map_err(|e| { + wit_error( + wit_types::ErrorCode::BadInput, + format!("parse review-request-board input: {e}"), + ) + })?; + let wit_input = PullReviewRequestBoardInput { + repository: parsed.repository, + limit: parsed.limit, + }; + let result = pulls + .call_review_request_board(&mut wasm_store, &wit_input) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("review-request-board call: {e}"), + ) + })?; + pull_review_request_board_to_json(&result.map_err(pulls_error_to_canonical)?) + } + "reviewer-queue" => { + let parsed: PullReviewerQueueInputJson = + serde_json::from_value(input).map_err(|e| { + wit_error( + wit_types::ErrorCode::BadInput, + format!("parse reviewer-queue input: {e}"), + ) + })?; + let wit_input = PullReviewerQueueInput { + repository: parsed.repository, + reviewer_ref: parsed.reviewer_ref, + limit: parsed.limit, + }; + let result = pulls + .call_reviewer_queue(&mut wasm_store, &wit_input) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("reviewer-queue call: {e}"), + ) + })?; + pull_reviewer_queue_to_json(&result.map_err(pulls_error_to_canonical)?) + } + other => { + return Err(wit_error( + wit_types::ErrorCode::NotFound, + format!("ext_pull_requests has no op named '{other}'"), + )); + } + }; + serde_json::to_vec(&value).map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("encode result: {e}"), + ) + }) +} + +pub fn dispatch_ext_checks( + registry: &WasmRegistry, + store: Arc, + current_principal: &str, + info: &crate::generated_dispatch::DispatchInfo, + payload: &[u8], + depth: u32, + reactor_depth: u32, +) -> Result, wit_types::Error> { + if info.extension_id != "ext_checks" || info.interface_name != "checks" { + return Err(wit_error( + wit_types::ErrorCode::Internal, + format!( + "ext_checks invoker received wrong route: {}.{}.{}", + info.extension_id, info.interface_name, info.op_name + ), + )); + } let input = parse_payload(payload)?; - // Repository-scoped opt-in gate. Both ext_checks ops carry the target - // repo inline (record-check, list-checks); the typed route table gates - // them here before the component runs. + // Repository-scoped opt-in gate. ext_checks ops carry the target repo + // inline; the typed route table gates them here before the component runs. let gate_store = store.clone(); gate_route_pre_invoke( registry, @@ -1673,6 +2806,60 @@ pub fn dispatch_ext_checks( .collect(), ) } + "readiness-board" => { + let parsed: CheckReadinessBoardInputJson = + serde_json::from_value(input).map_err(|e| { + wit_error( + wit_types::ErrorCode::BadInput, + format!("parse readiness-board input: {e}"), + ) + })?; + let wit_input = CheckReadinessBoardInput { + repository: parsed.repository, + commit_oid: parsed.commit_oid, + limit: parsed.limit, + }; + let result = checks + .call_readiness_board(&mut wasm_store, &wit_input) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("readiness-board call: {e}"), + ) + })?; + check_readiness_board_to_json(&result.map_err(checks_error_to_canonical)?) + } + "expected-readiness-board" => { + let parsed: ExpectedCheckReadinessBoardInputJson = serde_json::from_value(input) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::BadInput, + format!("parse expected-readiness-board input: {e}"), + ) + })?; + let wit_input = ExpectedCheckReadinessBoardInput { + repository: parsed.repository, + commit_oid: parsed.commit_oid, + expected: parsed + .expected + .into_iter() + .map(|expected| ExpectedCheck { + name: expected.name, + required: expected.required, + }) + .collect(), + limit: parsed.limit, + }; + let result = checks + .call_expected_readiness_board(&mut wasm_store, &wit_input) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("expected-readiness-board call: {e}"), + ) + })?; + expected_check_readiness_board_to_json(&result.map_err(checks_error_to_canonical)?) + } other => { return Err(wit_error( wit_types::ErrorCode::NotFound, @@ -1951,101 +3138,750 @@ fn issue_to_json(issue: &Issue) -> Value { }) } -fn issue_state_to_str(state: IssueState) -> &'static str { - match state { - IssueState::Open => "open", - IssueState::Closed => "closed", - IssueState::Reopened => "reopened", - } +fn issue_triage_board_to_json(board: &IssueTriageBoard) -> Value { + serde_json::json!({ + "repository": board.repository, + "total": board.total, + "columns": board + .columns + .iter() + .map(issue_triage_column_to_json) + .collect::>(), + }) } -fn epic_to_json(epic: &Epic) -> Value { +fn issue_triage_column_to_json(column: &IssueTriageColumn) -> Value { serde_json::json!({ - "id": epic.id, - "workspace": epic.workspace, - "workspaceId": workspace_id_from_uri(&epic.workspace), - "title": epic.title, - "bodyMarkdown": epic.body_markdown, - "state": epic_state_to_graphql(epic.state), - "number": epic.number, - "targetDate": epic.target_date, - "ownerRef": epic.owner_ref, - "labels": epic.labels, - "createdAt": epic.created_at, - "updatedAt": epic.updated_at, - "closedAt": epic.closed_at, - "projectName": epic.project_name, + "key": column.key, + "label": column.label, + "count": column.count, + "cards": column + .cards + .iter() + .map(issue_triage_card_to_json) + .collect::>(), }) } -fn epic_progress_to_json(progress: &EpicProgress) -> Value { +fn issue_triage_card_to_json(card: &IssueTriageCard) -> Value { serde_json::json!({ - "issuesOpen": progress.issues_open, - "issuesClosed": progress.issues_closed, - "childEpicsOpen": progress.child_epics_open, - "childEpicsClosed": progress.child_epics_closed, - "percentComplete": progress.percent_complete, + "issue": issue_to_json(&card.issue), }) } -fn epic_state_to_graphql(state: EpicState) -> &'static str { - match state { - EpicState::Planned => "PLANNED", - EpicState::InProgress => "IN_PROGRESS", - EpicState::AtRisk => "AT_RISK", - EpicState::Done => "DONE", - EpicState::Canceled => "CANCELED", - } +fn issue_label_board_to_json(board: &IssueLabelBoard) -> Value { + serde_json::json!({ + "repository": board.repository, + "total": board.total, + "columns": board + .columns + .iter() + .map(issue_label_column_to_json) + .collect::>(), + }) } -fn epic_state_from_json(state: &str) -> Result { - match state { - "PLANNED" => Ok(EpicState::Planned), - "IN_PROGRESS" => Ok(EpicState::InProgress), - "AT_RISK" => Ok(EpicState::AtRisk), - "DONE" => Ok(EpicState::Done), - "CANCELED" => Ok(EpicState::Canceled), - other => Err(wit_error( - wit_types::ErrorCode::BadInput, - format!("unknown epic state '{other}'"), - )), - } +fn issue_label_column_to_json(column: &IssueLabelColumn) -> Value { + serde_json::json!({ + "key": column.key, + "label": column.label, + "count": column.count, + "cards": column + .cards + .iter() + .map(issue_label_card_to_json) + .collect::>(), + }) } -fn sprint_to_json(sprint: &Sprint) -> Value { +fn issue_label_card_to_json(card: &IssueLabelCard) -> Value { serde_json::json!({ - "id": sprint.id, - "workspace": sprint.workspace, - "workspaceId": workspace_id_from_uri(&sprint.workspace), - "title": sprint.title, - "state": sprint_state_to_graphql(sprint.state), - "number": sprint.number, - "goal": sprint.goal, - "startDate": sprint.start_date, - "endDate": sprint.end_date, - "createdAt": sprint.created_at, - "updatedAt": sprint.updated_at, + "issue": issue_to_json(&card.issue), }) } -fn sprint_state_to_graphql(state: SprintState) -> &'static str { - match state { - SprintState::Planned => "PLANNED", - SprintState::Active => "ACTIVE", - SprintState::Completed => "COMPLETED", - SprintState::Canceled => "CANCELED", - } +fn issue_assignee_board_to_json(board: &IssueAssigneeBoard) -> Value { + serde_json::json!({ + "repository": board.repository, + "total": board.total, + "columns": board + .columns + .iter() + .map(issue_assignee_column_to_json) + .collect::>(), + }) } -fn sprint_state_from_json(state: &str) -> Result { - match state { - "PLANNED" => Ok(SprintState::Planned), - "ACTIVE" => Ok(SprintState::Active), - "COMPLETED" => Ok(SprintState::Completed), - "CANCELED" => Ok(SprintState::Canceled), - other => Err(wit_error( - wit_types::ErrorCode::BadInput, - format!("unknown sprint state '{other}'"), +fn issue_assignee_column_to_json(column: &IssueAssigneeColumn) -> Value { + serde_json::json!({ + "key": column.key, + "label": column.label, + "assignee": column.assignee, + "count": column.count, + "cards": column + .cards + .iter() + .map(issue_assignee_card_to_json) + .collect::>(), + }) +} + +fn issue_assignee_card_to_json(card: &IssueAssigneeCard) -> Value { + serde_json::json!({ + "issue": issue_to_json(&card.issue), + }) +} + +fn issue_author_board_to_json(board: &IssueAuthorBoard) -> Value { + serde_json::json!({ + "repository": board.repository, + "total": board.total, + "columns": board + .columns + .iter() + .map(issue_author_column_to_json) + .collect::>(), + }) +} + +fn issue_author_column_to_json(column: &IssueAuthorColumn) -> Value { + serde_json::json!({ + "key": column.key, + "label": column.label, + "authorRef": column.author_ref, + "count": column.count, + "cards": column + .cards + .iter() + .map(issue_author_card_to_json) + .collect::>(), + }) +} + +fn issue_author_card_to_json(card: &IssueAuthorCard) -> Value { + serde_json::json!({ + "issue": issue_to_json(&card.issue), + }) +} + +fn issue_project_board_to_json(board: &IssueProjectBoard) -> Value { + serde_json::json!({ + "repository": board.repository, + "total": board.total, + "columns": board + .columns + .iter() + .map(issue_project_column_to_json) + .collect::>(), + }) +} + +fn issue_project_column_to_json(column: &IssueProjectColumn) -> Value { + serde_json::json!({ + "key": column.key, + "label": column.label, + "projectName": column.project_name, + "count": column.count, + "cards": column + .cards + .iter() + .map(issue_project_card_to_json) + .collect::>(), + }) +} + +fn issue_project_card_to_json(card: &IssueProjectCard) -> Value { + serde_json::json!({ + "issue": issue_to_json(&card.issue), + }) +} + +fn issue_priority_board_to_json(board: &IssuePriorityBoard) -> Value { + serde_json::json!({ + "repository": board.repository, + "total": board.total, + "columns": board + .columns + .iter() + .map(issue_priority_column_to_json) + .collect::>(), + }) +} + +fn issue_priority_column_to_json(column: &IssuePriorityColumn) -> Value { + serde_json::json!({ + "key": column.key, + "label": column.label, + "priority": column.priority, + "count": column.count, + "cards": column + .cards + .iter() + .map(issue_priority_card_to_json) + .collect::>(), + }) +} + +fn issue_priority_card_to_json(card: &IssuePriorityCard) -> Value { + serde_json::json!({ + "issue": issue_to_json(&card.issue), + "priority": card.priority, + "priorityLabel": card.priority_label, + }) +} + +fn issue_milestone_board_to_json(board: &IssueMilestoneBoard) -> Value { + serde_json::json!({ + "repository": board.repository, + "total": board.total, + "columns": board + .columns + .iter() + .map(issue_milestone_column_to_json) + .collect::>(), + }) +} + +fn issue_milestone_column_to_json(column: &IssueMilestoneColumn) -> Value { + serde_json::json!({ + "key": column.key, + "label": column.label, + "milestone": column.milestone, + "count": column.count, + "cards": column + .cards + .iter() + .map(issue_milestone_card_to_json) + .collect::>(), + }) +} + +fn issue_milestone_card_to_json(card: &IssueMilestoneCard) -> Value { + serde_json::json!({ + "issue": issue_to_json(&card.issue), + "milestone": card.milestone, + "milestoneLabel": card.milestone_label, + }) +} + +fn issue_workflow_board_to_json(board: &IssueWorkflowBoard) -> Value { + serde_json::json!({ + "repository": board.repository, + "total": board.total, + "columns": board + .columns + .iter() + .map(issue_workflow_column_to_json) + .collect::>(), + }) +} + +fn issue_workflow_column_to_json(column: &IssueWorkflowColumn) -> Value { + serde_json::json!({ + "key": column.key, + "label": column.label, + "workflow": column.workflow, + "count": column.count, + "cards": column + .cards + .iter() + .map(issue_workflow_card_to_json) + .collect::>(), + }) +} + +fn issue_workflow_card_to_json(card: &IssueWorkflowCard) -> Value { + serde_json::json!({ + "issue": issue_to_json(&card.issue), + "workflow": card.workflow, + "workflowLabel": card.workflow_label, + }) +} + +fn issue_state_to_str(state: IssueState) -> &'static str { + match state { + IssueState::Open => "open", + IssueState::Closed => "closed", + IssueState::Reopened => "reopened", + } +} + +fn epic_to_json(epic: &Epic) -> Value { + serde_json::json!({ + "id": epic.id, + "workspace": epic.workspace, + "workspaceId": workspace_id_from_uri(&epic.workspace), + "title": epic.title, + "bodyMarkdown": epic.body_markdown, + "state": epic_state_to_graphql(epic.state), + "number": epic.number, + "targetDate": epic.target_date, + "ownerRef": epic.owner_ref, + "labels": epic.labels, + "createdAt": epic.created_at, + "updatedAt": epic.updated_at, + "closedAt": epic.closed_at, + "projectName": epic.project_name, + }) +} + +fn epic_progress_to_json(progress: &EpicProgress) -> Value { + serde_json::json!({ + "issuesOpen": progress.issues_open, + "issuesClosed": progress.issues_closed, + "childEpicsOpen": progress.child_epics_open, + "childEpicsClosed": progress.child_epics_closed, + "percentComplete": progress.percent_complete, + }) +} + +fn epic_roadmap_board_to_json(board: &EpicRoadmapBoard) -> Value { + serde_json::json!({ + "workspace": board.workspace, + "workspaceId": workspace_id_from_uri(&board.workspace), + "total": board.total, + "columns": board + .columns + .iter() + .map(epic_roadmap_column_to_json) + .collect::>(), + }) +} + +fn epic_roadmap_column_to_json(column: &EpicRoadmapColumn) -> Value { + serde_json::json!({ + "key": column.key, + "label": column.label, + "count": column.count, + "cards": column + .cards + .iter() + .map(epic_roadmap_card_to_json) + .collect::>(), + }) +} + +fn epic_roadmap_card_to_json(card: &EpicRoadmapCard) -> Value { + serde_json::json!({ + "epic": epic_to_json(&card.epic), + "progress": epic_progress_to_json(&card.progress), + }) +} + +fn epic_owner_board_to_json(board: &EpicOwnerBoard) -> Value { + serde_json::json!({ + "workspace": board.workspace, + "workspaceId": workspace_id_from_uri(&board.workspace), + "total": board.total, + "columns": board + .columns + .iter() + .map(epic_owner_column_to_json) + .collect::>(), + }) +} + +fn epic_owner_column_to_json(column: &EpicOwnerColumn) -> Value { + serde_json::json!({ + "key": column.key, + "label": column.label, + "ownerRef": column.owner_ref, + "count": column.count, + "cards": column + .cards + .iter() + .map(epic_owner_card_to_json) + .collect::>(), + }) +} + +fn epic_owner_card_to_json(card: &EpicOwnerCard) -> Value { + serde_json::json!({ + "epic": epic_to_json(&card.epic), + "progress": epic_progress_to_json(&card.progress), + }) +} + +fn epic_project_board_to_json(board: &EpicProjectBoard) -> Value { + serde_json::json!({ + "workspace": board.workspace, + "workspaceId": workspace_id_from_uri(&board.workspace), + "total": board.total, + "columns": board + .columns + .iter() + .map(epic_project_column_to_json) + .collect::>(), + }) +} + +fn epic_project_column_to_json(column: &EpicProjectColumn) -> Value { + serde_json::json!({ + "key": column.key, + "label": column.label, + "projectName": column.project_name, + "count": column.count, + "cards": column + .cards + .iter() + .map(epic_project_card_to_json) + .collect::>(), + }) +} + +fn epic_project_card_to_json(card: &EpicProjectCard) -> Value { + serde_json::json!({ + "epic": epic_to_json(&card.epic), + "progress": epic_progress_to_json(&card.progress), + }) +} + +fn epic_label_board_to_json(board: &EpicLabelBoard) -> Value { + serde_json::json!({ + "workspace": board.workspace, + "workspaceId": workspace_id_from_uri(&board.workspace), + "total": board.total, + "columns": board + .columns + .iter() + .map(epic_label_column_to_json) + .collect::>(), + }) +} + +fn epic_label_column_to_json(column: &EpicLabelColumn) -> Value { + serde_json::json!({ + "key": column.key, + "label": column.label, + "count": column.count, + "cards": column + .cards + .iter() + .map(epic_label_card_to_json) + .collect::>(), + }) +} + +fn epic_label_card_to_json(card: &EpicLabelCard) -> Value { + serde_json::json!({ + "epic": epic_to_json(&card.epic), + "progress": epic_progress_to_json(&card.progress), + }) +} + +fn epic_priority_board_to_json(board: &EpicPriorityBoard) -> Value { + serde_json::json!({ + "workspace": board.workspace, + "workspaceId": workspace_id_from_uri(&board.workspace), + "total": board.total, + "columns": board + .columns + .iter() + .map(epic_priority_column_to_json) + .collect::>(), + }) +} + +fn epic_priority_column_to_json(column: &EpicPriorityColumn) -> Value { + serde_json::json!({ + "key": column.key, + "label": column.label, + "priority": column.priority, + "count": column.count, + "cards": column + .cards + .iter() + .map(epic_priority_card_to_json) + .collect::>(), + }) +} + +fn epic_priority_card_to_json(card: &EpicPriorityCard) -> Value { + serde_json::json!({ + "epic": epic_to_json(&card.epic), + "progress": epic_progress_to_json(&card.progress), + "priority": card.priority, + "priorityLabel": card.priority_label, + }) +} + +fn epic_milestone_board_to_json(board: &EpicMilestoneBoard) -> Value { + serde_json::json!({ + "workspace": board.workspace, + "workspaceId": workspace_id_from_uri(&board.workspace), + "total": board.total, + "columns": board + .columns + .iter() + .map(epic_milestone_column_to_json) + .collect::>(), + }) +} + +fn epic_milestone_column_to_json(column: &EpicMilestoneColumn) -> Value { + serde_json::json!({ + "key": column.key, + "label": column.label, + "milestone": column.milestone, + "count": column.count, + "cards": column + .cards + .iter() + .map(epic_milestone_card_to_json) + .collect::>(), + }) +} + +fn epic_milestone_card_to_json(card: &EpicMilestoneCard) -> Value { + serde_json::json!({ + "epic": epic_to_json(&card.epic), + "progress": epic_progress_to_json(&card.progress), + "milestone": card.milestone, + "milestoneLabel": card.milestone_label, + }) +} + +fn epic_target_board_to_json(board: &EpicTargetBoard) -> Value { + serde_json::json!({ + "workspace": board.workspace, + "workspaceId": workspace_id_from_uri(&board.workspace), + "today": board.today, + "total": board.total, + "columns": board + .columns + .iter() + .map(epic_target_column_to_json) + .collect::>(), + }) +} + +fn epic_target_column_to_json(column: &EpicTargetColumn) -> Value { + serde_json::json!({ + "key": column.key, + "label": column.label, + "count": column.count, + "cards": column + .cards + .iter() + .map(epic_target_card_to_json) + .collect::>(), + }) +} + +fn epic_target_card_to_json(card: &EpicTargetCard) -> Value { + serde_json::json!({ + "epic": epic_to_json(&card.epic), + "progress": epic_progress_to_json(&card.progress), + }) +} + +fn epic_state_to_graphql(state: EpicState) -> &'static str { + match state { + EpicState::Planned => "PLANNED", + EpicState::InProgress => "IN_PROGRESS", + EpicState::AtRisk => "AT_RISK", + EpicState::Done => "DONE", + EpicState::Canceled => "CANCELED", + } +} + +fn epic_state_from_json(state: &str) -> Result { + match state { + "PLANNED" => Ok(EpicState::Planned), + "IN_PROGRESS" => Ok(EpicState::InProgress), + "AT_RISK" => Ok(EpicState::AtRisk), + "DONE" => Ok(EpicState::Done), + "CANCELED" => Ok(EpicState::Canceled), + other => Err(wit_error( + wit_types::ErrorCode::BadInput, + format!("unknown epic state '{other}'"), + )), + } +} + +fn sprint_to_json(sprint: &Sprint) -> Value { + serde_json::json!({ + "id": sprint.id, + "workspace": sprint.workspace, + "workspaceId": workspace_id_from_uri(&sprint.workspace), + "title": sprint.title, + "state": sprint_state_to_graphql(sprint.state), + "number": sprint.number, + "goal": sprint.goal, + "startDate": sprint.start_date, + "endDate": sprint.end_date, + "createdAt": sprint.created_at, + "updatedAt": sprint.updated_at, + }) +} + +fn sprint_board_to_json(board: &SprintBoard) -> Value { + serde_json::json!({ + "sprintRef": board.sprint_ref, + "total": board.total, + "columns": board + .columns + .iter() + .map(sprint_board_column_to_json) + .collect::>(), + }) +} + +fn sprint_board_column_to_json(column: &SprintBoardColumn) -> Value { + serde_json::json!({ + "key": column.key, + "label": column.label, + "count": column.count, + "issues": column + .issues + .iter() + .map(sprint_board_issue_to_json) + .collect::>(), + }) +} + +fn sprint_board_issue_to_json(issue: &SprintBoardIssue) -> Value { + serde_json::json!({ + "issueRef": issue.issue_ref, + "id": issue.id, + "number": issue.number, + "title": issue.title, + "state": sprint_board_issue_state_to_json(issue.state), + }) +} + +fn sprint_board_issue_state_to_json(state: SprintBoardIssueState) -> &'static str { + match state { + SprintBoardIssueState::Open => "open", + SprintBoardIssueState::Reopened => "reopened", + SprintBoardIssueState::Closed => "closed", + SprintBoardIssueState::Missing => "missing", + } +} + +fn sprint_planning_board_to_json(board: &SprintPlanningBoard) -> Value { + serde_json::json!({ + "workspace": board.workspace, + "workspaceId": workspace_id_from_uri(&board.workspace), + "total": board.total, + "columns": board + .columns + .iter() + .map(sprint_planning_column_to_json) + .collect::>(), + }) +} + +fn sprint_planning_column_to_json(column: &SprintPlanningColumn) -> Value { + serde_json::json!({ + "key": column.key, + "label": column.label, + "count": column.count, + "cards": column + .cards + .iter() + .map(sprint_planning_card_to_json) + .collect::>(), + }) +} + +fn sprint_planning_card_to_json(card: &SprintPlanningCard) -> Value { + serde_json::json!({ + "sprint": sprint_to_json(&card.sprint), + }) +} + +fn kanban_board_to_json(board: &KanbanBoard) -> Value { + serde_json::json!({ + "workspace": board.workspace, + "workspaceId": workspace_id_from_uri(&board.workspace), + "total": board.total, + "columns": board + .columns + .iter() + .map(kanban_column_to_json) + .collect::>(), + }) +} + +fn kanban_project_board_to_json(board: &ProjectKanbanBoard) -> Value { + serde_json::json!({ + "workspace": board.workspace, + "workspaceId": workspace_id_from_uri(&board.workspace), + "total": board.total, + "swimlanes": board + .swimlanes + .iter() + .map(kanban_swimlane_to_json) + .collect::>(), + }) +} + +fn kanban_swimlane_to_json(swimlane: &KanbanSwimlane) -> Value { + serde_json::json!({ + "key": swimlane.key, + "label": swimlane.label, + "projectName": swimlane.project_name, + "total": swimlane.total, + "columns": swimlane + .columns + .iter() + .map(kanban_column_to_json) + .collect::>(), + }) +} + +fn kanban_column_to_json(column: &KanbanColumn) -> Value { + serde_json::json!({ + "key": column.key, + "label": column.label, + "count": column.count, + "cards": column + .cards + .iter() + .map(kanban_card_to_json) + .collect::>(), + }) +} + +fn kanban_card_to_json(card: &KanbanCard) -> Value { + serde_json::json!({ + "issueRef": card.issue_ref, + "id": card.id, + "number": card.number, + "title": card.title, + "state": kanban_card_state_to_json(card.state), + "projectName": card.project_name, + }) +} + +fn kanban_card_state_to_json(state: KanbanCardState) -> &'static str { + match state { + KanbanCardState::Open => "open", + KanbanCardState::Reopened => "reopened", + KanbanCardState::Closed => "closed", + KanbanCardState::Missing => "missing", + } +} + +fn sprint_state_to_graphql(state: SprintState) -> &'static str { + match state { + SprintState::Planned => "PLANNED", + SprintState::Active => "ACTIVE", + SprintState::Completed => "COMPLETED", + SprintState::Canceled => "CANCELED", + } +} + +fn sprint_state_from_json(state: &str) -> Result { + match state { + "PLANNED" => Ok(SprintState::Planned), + "ACTIVE" => Ok(SprintState::Active), + "COMPLETED" => Ok(SprintState::Completed), + "CANCELED" => Ok(SprintState::Canceled), + other => Err(wit_error( + wit_types::ErrorCode::BadInput, + format!("unknown sprint state '{other}'"), )), } } @@ -2085,6 +3921,338 @@ fn pull_request_to_json(pull: &PullRequest) -> Value { }) } +fn pull_review_board_to_json(board: &PullReviewBoard) -> Value { + serde_json::json!({ + "repository": board.repository, + "total": board.total, + "columns": board + .columns + .iter() + .map(pull_review_column_to_json) + .collect::>(), + }) +} + +fn pull_review_column_to_json(column: &PullReviewColumn) -> Value { + serde_json::json!({ + "key": column.key, + "label": column.label, + "count": column.count, + "cards": column + .cards + .iter() + .map(pull_review_card_to_json) + .collect::>(), + }) +} + +fn pull_review_card_to_json(card: &PullReviewCard) -> Value { + serde_json::json!({ + "pullRequest": pull_request_to_json(&card.pull_request), + "terminal": card.terminal, + }) +} + +fn pull_author_board_to_json(board: &PullAuthorBoard) -> Value { + serde_json::json!({ + "repository": board.repository, + "total": board.total, + "columns": board + .columns + .iter() + .map(pull_author_column_to_json) + .collect::>(), + }) +} + +fn pull_author_column_to_json(column: &PullAuthorColumn) -> Value { + serde_json::json!({ + "key": column.key, + "label": column.label, + "authorRef": column.author_ref, + "count": column.count, + "cards": column + .cards + .iter() + .map(pull_author_card_to_json) + .collect::>(), + }) +} + +fn pull_author_card_to_json(card: &PullAuthorCard) -> Value { + serde_json::json!({ + "pullRequest": pull_request_to_json(&card.pull_request), + "terminal": card.terminal, + }) +} + +fn pull_base_branch_board_to_json(board: &PullBaseBranchBoard) -> Value { + serde_json::json!({ + "repository": board.repository, + "total": board.total, + "columns": board + .columns + .iter() + .map(pull_base_branch_column_to_json) + .collect::>(), + }) +} + +fn pull_base_branch_column_to_json(column: &PullBaseBranchColumn) -> Value { + serde_json::json!({ + "key": column.key, + "label": column.label, + "baseRef": column.base_ref, + "count": column.count, + "cards": column + .cards + .iter() + .map(pull_base_branch_card_to_json) + .collect::>(), + }) +} + +fn pull_base_branch_card_to_json(card: &PullBaseBranchCard) -> Value { + serde_json::json!({ + "pullRequest": pull_request_to_json(&card.pull_request), + "terminal": card.terminal, + }) +} + +fn pull_head_branch_board_to_json(board: &PullHeadBranchBoard) -> Value { + serde_json::json!({ + "repository": board.repository, + "total": board.total, + "columns": board + .columns + .iter() + .map(pull_head_branch_column_to_json) + .collect::>(), + }) +} + +fn pull_head_branch_column_to_json(column: &PullHeadBranchColumn) -> Value { + serde_json::json!({ + "key": column.key, + "label": column.label, + "headRef": column.head_ref, + "count": column.count, + "cards": column + .cards + .iter() + .map(pull_head_branch_card_to_json) + .collect::>(), + }) +} + +fn pull_head_branch_card_to_json(card: &PullHeadBranchCard) -> Value { + serde_json::json!({ + "pullRequest": pull_request_to_json(&card.pull_request), + "terminal": card.terminal, + }) +} + +fn pull_review_to_json(review: &PullReview) -> Value { + serde_json::json!({ + "id": review.id, + "pullId": review.pull_id, + "pullRequestRef": review.pull_request_ref, + "repository": review.repository, + "reviewerRef": review.reviewer_ref, + "decision": pull_review_decision_to_graphql(review.decision), + "bodyMarkdown": review.body_markdown, + "createdAt": review.created_at, + }) +} + +fn pull_review_request_to_json(request: &PullReviewRequest) -> Value { + serde_json::json!({ + "id": request.id, + "pullId": request.pull_id, + "pullRequestRef": request.pull_request_ref, + "repository": request.repository, + "reviewerRef": request.reviewer_ref, + "requestedByRef": request.requested_by_ref, + "requestedAt": request.requested_at, + "completedReview": request.completed_review.as_ref().map(pull_review_to_json), + }) +} + +fn pull_merge_readiness_board_to_json(board: &PullMergeReadinessBoard) -> Value { + serde_json::json!({ + "repository": board.repository, + "total": board.total, + "columns": board + .columns + .iter() + .map(pull_merge_readiness_column_to_json) + .collect::>(), + }) +} + +fn pull_merge_readiness_column_to_json(column: &PullMergeReadinessColumn) -> Value { + serde_json::json!({ + "key": column.key, + "label": column.label, + "count": column.count, + "cards": column + .cards + .iter() + .map(pull_merge_readiness_card_to_json) + .collect::>(), + }) +} + +fn pull_merge_readiness_card_to_json(card: &PullMergeReadinessCard) -> Value { + serde_json::json!({ + "pullRequest": pull_request_to_json(&card.pull_request), + "terminal": card.terminal, + "blocked": card.blocked, + "waiting": card.waiting, + "checkBlocked": card.check_blocked, + "checkWaiting": card.check_waiting, + "reviewBlocked": card.review_blocked, + "reviewWaiting": card.review_waiting, + "checkSummary": card + .check_summary + .as_ref() + .map(pull_merge_check_summary_to_json), + "reviewSummary": pull_merge_review_summary_to_json(&card.review_summary), + }) +} + +fn pull_merge_review_summary_to_json(summary: &PullMergeReviewSummary) -> Value { + serde_json::json!({ + "requiredApprovals": summary.required_approvals, + "approvalCount": summary.approval_count, + "changeRequestCount": summary.change_request_count, + "commentCount": summary.comment_count, + "latestReview": summary + .latest_review + .as_ref() + .map(pull_review_to_json), + }) +} + +fn pull_merge_check_summary_to_json(summary: &PullMergeCheckSummary) -> Value { + serde_json::json!({ + "pullId": summary.pull_id, + "requiredMissing": summary.required_missing, + "requiredFailing": summary.required_failing, + "pending": summary.pending, + "optionalFailing": summary.optional_failing, + "passing": summary.passing, + "total": summary.total, + }) +} + +fn pull_review_decision_board_to_json(board: &PullReviewDecisionBoard) -> Value { + serde_json::json!({ + "repository": board.repository, + "total": board.total, + "columns": board + .columns + .iter() + .map(pull_review_decision_column_to_json) + .collect::>(), + }) +} + +fn pull_review_decision_column_to_json(column: &PullReviewDecisionColumn) -> Value { + serde_json::json!({ + "key": column.key, + "label": column.label, + "count": column.count, + "cards": column + .cards + .iter() + .map(pull_review_decision_card_to_json) + .collect::>(), + }) +} + +fn pull_review_decision_card_to_json(card: &PullReviewDecisionCard) -> Value { + serde_json::json!({ + "pullRequest": pull_request_to_json(&card.pull_request), + "latestReview": card.latest_review.as_ref().map(pull_review_to_json), + "approvalCount": card.approval_count, + "changeRequestCount": card.change_request_count, + "commentCount": card.comment_count, + "terminal": card.terminal, + }) +} + +fn pull_review_request_board_to_json(board: &PullReviewRequestBoard) -> Value { + serde_json::json!({ + "repository": board.repository, + "total": board.total, + "columns": board + .columns + .iter() + .map(pull_review_request_column_to_json) + .collect::>(), + }) +} + +fn pull_review_request_column_to_json(column: &PullReviewRequestColumn) -> Value { + serde_json::json!({ + "key": column.key, + "label": column.label, + "count": column.count, + "cards": column + .cards + .iter() + .map(pull_review_request_card_to_json) + .collect::>(), + }) +} + +fn pull_review_request_card_to_json(card: &PullReviewRequestCard) -> Value { + serde_json::json!({ + "pullRequest": pull_request_to_json(&card.pull_request), + "requestedReviewerRefs": card.requested_reviewer_refs, + "completedReviewerRefs": card.completed_reviewer_refs, + "missingReviewerRefs": card.missing_reviewer_refs, + "latestReview": card.latest_review.as_ref().map(pull_review_to_json), + "terminal": card.terminal, + }) +} + +fn pull_reviewer_queue_to_json(queue: &PullReviewerQueue) -> Value { + serde_json::json!({ + "repository": queue.repository, + "reviewerRef": queue.reviewer_ref, + "total": queue.total, + "columns": queue + .columns + .iter() + .map(pull_reviewer_queue_column_to_json) + .collect::>(), + }) +} + +fn pull_reviewer_queue_column_to_json(column: &PullReviewerQueueColumn) -> Value { + serde_json::json!({ + "key": column.key, + "label": column.label, + "count": column.count, + "cards": column + .cards + .iter() + .map(pull_reviewer_queue_card_to_json) + .collect::>(), + }) +} + +fn pull_reviewer_queue_card_to_json(card: &PullReviewerQueueCard) -> Value { + serde_json::json!({ + "pullRequest": pull_request_to_json(&card.pull_request), + "reviewRequest": pull_review_request_to_json(&card.review_request), + "latestReview": card.latest_review.as_ref().map(pull_review_to_json), + "terminal": card.terminal, + }) +} + fn pull_state_to_graphql(state: PrState) -> &'static str { match state { PrState::Draft => "DRAFT", @@ -2095,6 +4263,40 @@ fn pull_state_to_graphql(state: PrState) -> &'static str { } } +fn pull_review_decision_to_graphql(decision: PullReviewDecision) -> &'static str { + match decision { + PullReviewDecision::Comment => "COMMENT", + PullReviewDecision::Approve => "APPROVE", + PullReviewDecision::RequestChanges => "REQUEST_CHANGES", + } +} + +fn pull_review_decision_from_json(decision: &str) -> Result { + match decision { + "COMMENT" => Ok(PullReviewDecision::Comment), + "APPROVE" => Ok(PullReviewDecision::Approve), + "REQUEST_CHANGES" => Ok(PullReviewDecision::RequestChanges), + other => Err(wit_error( + wit_types::ErrorCode::BadInput, + format!("unknown pull review decision '{other}'"), + )), + } +} + +fn pull_state_from_json(state: &str) -> Result { + match state { + "DRAFT" => Ok(PrState::Draft), + "READY" => Ok(PrState::Ready), + "REVIEW" => Ok(PrState::Review), + "MERGED" => Ok(PrState::Merged), + "CLOSED" => Ok(PrState::Closed), + other => Err(wit_error( + wit_types::ErrorCode::BadInput, + format!("unknown pull request state '{other}'"), + )), + } +} + fn pull_repository_scope(repository: &str) -> (Option, Option) { let Some(rest) = repository.strip_prefix("comtrya://") else { return (None, None); @@ -2128,6 +4330,75 @@ fn check_run_to_json(check: &CheckRun) -> Value { }) } +fn check_readiness_board_to_json(board: &CheckReadinessBoard) -> Value { + serde_json::json!({ + "repository": board.repository, + "commitOID": board.commit_oid, + "total": board.total, + "columns": board + .columns + .iter() + .map(check_readiness_column_to_json) + .collect::>(), + }) +} + +fn check_readiness_column_to_json(column: &CheckReadinessColumn) -> Value { + serde_json::json!({ + "key": column.key, + "label": column.label, + "count": column.count, + "cards": column + .cards + .iter() + .map(check_readiness_card_to_json) + .collect::>(), + }) +} + +fn check_readiness_card_to_json(card: &CheckReadinessCard) -> Value { + serde_json::json!({ + "check": check_run_to_json(&card.check), + "blocking": card.blocking, + }) +} + +fn expected_check_readiness_board_to_json(board: &ExpectedCheckReadinessBoard) -> Value { + serde_json::json!({ + "repository": board.repository, + "commitOID": board.commit_oid, + "total": board.total, + "columns": board + .columns + .iter() + .map(expected_check_readiness_column_to_json) + .collect::>(), + }) +} + +fn expected_check_readiness_column_to_json(column: &ExpectedCheckReadinessColumn) -> Value { + serde_json::json!({ + "key": column.key, + "label": column.label, + "count": column.count, + "cards": column + .cards + .iter() + .map(expected_check_readiness_card_to_json) + .collect::>(), + }) +} + +fn expected_check_readiness_card_to_json(card: &ExpectedCheckReadinessCard) -> Value { + serde_json::json!({ + "name": card.name, + "required": card.required, + "check": card.check.as_ref().map(check_run_to_json), + "blocking": card.blocking, + "missing": card.missing, + }) +} + fn check_state_to_graphql(state: CheckState) -> &'static str { match state { CheckState::Pending => "PENDING", @@ -2244,64 +4515,704 @@ fn sprints_error_to_canonical( } } -fn pulls_error_to_canonical( - e: ext_pull_requests_bindings::comtrya::platform::types::Error, -) -> wit_types::Error { - use ext_pull_requests_bindings::comtrya::platform::types as local; - let code = match e.code { - local::ErrorCode::NotFound => wit_types::ErrorCode::NotFound, - local::ErrorCode::Conflict => wit_types::ErrorCode::Conflict, - local::ErrorCode::Forbidden => wit_types::ErrorCode::Forbidden, - local::ErrorCode::Unauthenticated => wit_types::ErrorCode::Unauthenticated, - local::ErrorCode::BadInput => wit_types::ErrorCode::BadInput, - local::ErrorCode::Internal => wit_types::ErrorCode::Internal, - local::ErrorCode::Unavailable => wit_types::ErrorCode::Unavailable, - }; - wit_types::Error { - code, - message: e.message, - path: e.path, - } +fn pulls_error_to_canonical( + e: ext_pull_requests_bindings::comtrya::platform::types::Error, +) -> wit_types::Error { + use ext_pull_requests_bindings::comtrya::platform::types as local; + let code = match e.code { + local::ErrorCode::NotFound => wit_types::ErrorCode::NotFound, + local::ErrorCode::Conflict => wit_types::ErrorCode::Conflict, + local::ErrorCode::Forbidden => wit_types::ErrorCode::Forbidden, + local::ErrorCode::Unauthenticated => wit_types::ErrorCode::Unauthenticated, + local::ErrorCode::BadInput => wit_types::ErrorCode::BadInput, + local::ErrorCode::Internal => wit_types::ErrorCode::Internal, + local::ErrorCode::Unavailable => wit_types::ErrorCode::Unavailable, + }; + wit_types::Error { + code, + message: e.message, + path: e.path, + } +} + +fn checks_error_to_canonical( + e: ext_checks_bindings::comtrya::platform::types::Error, +) -> wit_types::Error { + use ext_checks_bindings::comtrya::platform::types as local; + let code = match e.code { + local::ErrorCode::NotFound => wit_types::ErrorCode::NotFound, + local::ErrorCode::Conflict => wit_types::ErrorCode::Conflict, + local::ErrorCode::Forbidden => wit_types::ErrorCode::Forbidden, + local::ErrorCode::Unauthenticated => wit_types::ErrorCode::Unauthenticated, + local::ErrorCode::BadInput => wit_types::ErrorCode::BadInput, + local::ErrorCode::Internal => wit_types::ErrorCode::Internal, + local::ErrorCode::Unavailable => wit_types::ErrorCode::Unavailable, + }; + wit_types::Error { + code, + message: e.message, + path: e.path, + } +} + +fn workspace_home_error_to_canonical( + e: ext_workspace_home_bindings::comtrya::platform::types::Error, +) -> wit_types::Error { + use ext_workspace_home_bindings::comtrya::platform::types as local; + let code = match e.code { + local::ErrorCode::NotFound => wit_types::ErrorCode::NotFound, + local::ErrorCode::Conflict => wit_types::ErrorCode::Conflict, + local::ErrorCode::Forbidden => wit_types::ErrorCode::Forbidden, + local::ErrorCode::Unauthenticated => wit_types::ErrorCode::Unauthenticated, + local::ErrorCode::BadInput => wit_types::ErrorCode::BadInput, + local::ErrorCode::Internal => wit_types::ErrorCode::Internal, + local::ErrorCode::Unavailable => wit_types::ErrorCode::Unavailable, + }; + wit_types::Error { + code, + message: e.message, + path: e.path, + } +} + +fn doc_summary_to_json(summary: &DocSummary) -> Value { + serde_json::json!({ + "path": summary.path, + "title": summary.title, + "propertyCount": summary.property_count, + "properties": summary + .properties + .iter() + .map(doc_property_to_json) + .collect::>(), + "bodyExcerpt": summary.body_excerpt, + "hasFrontMatter": summary.has_front_matter, + }) +} + +fn doc_catalog_input_to_wit(input: DocCatalogInputJson) -> DocsDocCatalogInput { + DocsDocCatalogInput { + types: input + .types + .into_iter() + .map(|doc_type| DocsDocTypeInput { + project_name: doc_type.project_name, + type_name: doc_type.type_name, + label: doc_type.label, + description: doc_type.description, + slug: doc_type.slug, + files: doc_type + .files + .into_iter() + .map(|file| DocsSummarizeDocInput { + path: file.path, + preview: file.preview, + }) + .collect(), + }) + .collect(), + } +} + +fn doc_catalog_to_json(catalog: &DocCatalog) -> Value { + serde_json::json!({ + "totalDocs": catalog.total_docs, + "types": catalog + .types + .iter() + .map(doc_type_summary_to_json) + .collect::>(), + }) +} + +fn doc_type_summary_to_json(summary: &DocTypeSummary) -> Value { + serde_json::json!({ + "projectName": summary.project_name, + "typeName": summary.type_name, + "label": summary.label, + "description": summary.description, + "slug": summary.slug, + "docCount": summary.doc_count, + "docs": summary + .docs + .iter() + .map(doc_summary_to_json) + .collect::>(), + }) +} + +fn doc_type_board_to_json(board: &DocTypeBoard) -> Value { + serde_json::json!({ + "totalDocs": board.total_docs, + "columns": board + .columns + .iter() + .map(doc_type_column_to_json) + .collect::>(), + }) +} + +fn doc_type_column_to_json(column: &DocTypeColumn) -> Value { + serde_json::json!({ + "key": column.key, + "label": column.label, + "typeName": column.type_name, + "count": column.count, + "docs": column + .docs + .iter() + .map(doc_type_card_to_json) + .collect::>(), + }) +} + +fn doc_type_card_to_json(card: &DocTypeCard) -> Value { + serde_json::json!({ + "projectName": card.project_name, + "typeName": card.type_name, + "typeLabel": card.type_label, + "slug": card.slug, + "path": card.path, + "title": card.title, + "status": card.status, + "owner": card.owner, + "tags": card.tags, + }) +} + +fn doc_status_board_to_json(board: &DocStatusBoard) -> Value { + serde_json::json!({ + "totalDocs": board.total_docs, + "columns": board + .columns + .iter() + .map(doc_status_column_to_json) + .collect::>(), + }) +} + +fn doc_status_column_to_json(column: &DocStatusColumn) -> Value { + serde_json::json!({ + "key": column.key, + "label": column.label, + "count": column.count, + "docs": column + .docs + .iter() + .map(doc_status_card_to_json) + .collect::>(), + }) +} + +fn doc_status_card_to_json(card: &DocStatusCard) -> Value { + serde_json::json!({ + "projectName": card.project_name, + "typeName": card.type_name, + "typeLabel": card.type_label, + "path": card.path, + "title": card.title, + "status": card.status, + "owner": card.owner, + }) +} + +fn doc_owner_board_to_json(board: &DocOwnerBoard) -> Value { + serde_json::json!({ + "totalDocs": board.total_docs, + "columns": board + .columns + .iter() + .map(doc_owner_column_to_json) + .collect::>(), + }) +} + +fn doc_owner_column_to_json(column: &DocOwnerColumn) -> Value { + serde_json::json!({ + "key": column.key, + "label": column.label, + "owner": column.owner, + "count": column.count, + "docs": column + .docs + .iter() + .map(doc_owner_card_to_json) + .collect::>(), + }) +} + +fn doc_owner_card_to_json(card: &DocOwnerCard) -> Value { + serde_json::json!({ + "projectName": card.project_name, + "typeName": card.type_name, + "typeLabel": card.type_label, + "path": card.path, + "title": card.title, + "status": card.status, + "owner": card.owner, + }) +} + +fn doc_tag_board_to_json(board: &DocTagBoard) -> Value { + serde_json::json!({ + "totalDocs": board.total_docs, + "columns": board + .columns + .iter() + .map(doc_tag_column_to_json) + .collect::>(), + }) +} + +fn doc_tag_column_to_json(column: &DocTagColumn) -> Value { + serde_json::json!({ + "key": column.key, + "label": column.label, + "tag": column.tag, + "count": column.count, + "docs": column + .docs + .iter() + .map(doc_tag_card_to_json) + .collect::>(), + }) +} + +fn doc_tag_card_to_json(card: &DocTagCard) -> Value { + serde_json::json!({ + "projectName": card.project_name, + "typeName": card.type_name, + "typeLabel": card.type_label, + "path": card.path, + "title": card.title, + "status": card.status, + "tags": card.tags, + }) +} + +fn doc_project_board_to_json(board: &DocProjectBoard) -> Value { + serde_json::json!({ + "totalDocs": board.total_docs, + "columns": board + .columns + .iter() + .map(doc_project_column_to_json) + .collect::>(), + }) +} + +fn doc_project_column_to_json(column: &DocProjectColumn) -> Value { + serde_json::json!({ + "key": column.key, + "label": column.label, + "projectName": column.project_name, + "count": column.count, + "docs": column + .docs + .iter() + .map(doc_project_card_to_json) + .collect::>(), + }) +} + +fn doc_project_card_to_json(card: &DocProjectCard) -> Value { + serde_json::json!({ + "projectName": card.project_name, + "typeName": card.type_name, + "typeLabel": card.type_label, + "path": card.path, + "title": card.title, + "status": card.status, + "owner": card.owner, + "tags": card.tags, + }) +} + +fn bdd_summary_to_json(summary: &BddSummary) -> Value { + serde_json::json!({ + "path": summary.path, + "title": summary.title, + "feature": summary.feature, + "scenarioCount": summary.scenario_count, + "stepCount": summary.step_count, + "scenarios": summary + .scenarios + .iter() + .map(bdd_scenario_to_json) + .collect::>(), + }) +} + +fn bdd_scenario_to_json(scenario: &BddScenario) -> Value { + serde_json::json!({ + "kind": scenario.kind, + "title": scenario.title, + "stepCount": scenario.step_count, + "steps": scenario + .steps + .iter() + .map(bdd_step_to_json) + .collect::>(), + }) +} + +fn bdd_step_to_json(step: &BddStep) -> Value { + serde_json::json!({ + "keyword": step.keyword, + "text": step.text, + }) +} + +fn doc_scenario_board_to_json(board: &DocScenarioBoard) -> Value { + serde_json::json!({ + "totalDocs": board.total_docs, + "columns": board + .columns + .iter() + .map(doc_scenario_column_to_json) + .collect::>(), + }) +} + +fn doc_scenario_column_to_json(column: &DocScenarioColumn) -> Value { + serde_json::json!({ + "key": column.key, + "label": column.label, + "count": column.count, + "docs": column + .docs + .iter() + .map(doc_scenario_card_to_json) + .collect::>(), + }) +} + +fn doc_scenario_card_to_json(card: &DocScenarioCard) -> Value { + serde_json::json!({ + "projectName": card.project_name, + "typeName": card.type_name, + "typeLabel": card.type_label, + "path": card.path, + "title": card.title, + "status": card.status, + "feature": card.feature, + "scenarioCount": card.scenario_count, + "stepCount": card.step_count, + "scenariosWithoutSteps": card.scenarios_without_steps, + }) +} + +fn doc_checklist_summary_to_json(summary: &DocChecklistSummary) -> Value { + serde_json::json!({ + "path": summary.path, + "title": summary.title, + "totalItems": summary.total_items, + "checkedItems": summary.checked_items, + "sections": summary + .sections + .iter() + .map(doc_checklist_section_to_json) + .collect::>(), + }) +} + +fn doc_checklist_section_to_json(section: &DocChecklistSection) -> Value { + serde_json::json!({ + "heading": section.heading, + "itemCount": section.item_count, + "checkedCount": section.checked_count, + "items": section + .items + .iter() + .map(doc_checklist_item_to_json) + .collect::>(), + }) +} + +fn doc_checklist_item_to_json(item: &DocChecklistItem) -> Value { + serde_json::json!({ + "text": item.text, + "checked": item.checked, + }) +} + +fn doc_reference_summary_to_json(summary: &DocReferenceSummary) -> Value { + serde_json::json!({ + "path": summary.path, + "title": summary.title, + "referenceCount": summary.reference_count, + "references": summary + .references + .iter() + .map(doc_reference_to_json) + .collect::>(), + }) +} + +fn doc_reference_to_json(reference: &DocReference) -> Value { + serde_json::json!({ + "kind": reference.kind, + "target": reference.target, + "label": reference.label, + "line": reference.line, + }) +} + +fn doc_traceability_board_to_json(board: &DocTraceabilityBoard) -> Value { + serde_json::json!({ + "totalDocs": board.total_docs, + "columns": board + .columns + .iter() + .map(doc_traceability_column_to_json) + .collect::>(), + }) +} + +fn doc_traceability_column_to_json(column: &DocTraceabilityColumn) -> Value { + serde_json::json!({ + "key": column.key, + "label": column.label, + "count": column.count, + "docs": column + .docs + .iter() + .map(doc_traceability_card_to_json) + .collect::>(), + }) +} + +fn doc_traceability_card_to_json(card: &DocTraceabilityCard) -> Value { + serde_json::json!({ + "projectName": card.project_name, + "typeName": card.type_name, + "typeLabel": card.type_label, + "path": card.path, + "title": card.title, + "status": card.status, + "referenceCount": card.reference_count, + "implementationReferenceCount": card.implementation_reference_count, + "docReferenceCount": card.doc_reference_count, + "otherReferenceCount": card.other_reference_count, + "references": card + .references + .iter() + .map(doc_reference_to_json) + .collect::>(), + }) +} + +fn doc_outline_summary_to_json(summary: &DocOutlineSummary) -> Value { + serde_json::json!({ + "path": summary.path, + "title": summary.title, + "headingCount": summary.heading_count, + "headings": summary + .headings + .iter() + .map(doc_outline_heading_to_json) + .collect::>(), + }) +} + +fn doc_outline_heading_to_json(heading: &DocOutlineHeading) -> Value { + serde_json::json!({ + "level": heading.level, + "title": heading.title, + "slug": heading.slug, + "line": heading.line, + }) +} + +fn doc_decision_summary_to_json(summary: &DocDecisionSummary) -> Value { + serde_json::json!({ + "path": summary.path, + "title": summary.title, + "decisionCount": summary.decision_count, + "openQuestionCount": summary.open_question_count, + "riskCount": summary.risk_count, + "items": summary + .items + .iter() + .map(doc_decision_item_to_json) + .collect::>(), + }) +} + +fn doc_decision_item_to_json(item: &DocDecisionItem) -> Value { + serde_json::json!({ + "kind": item.kind, + "text": item.text, + "line": item.line, + }) +} + +fn doc_decision_board_to_json(board: &DocDecisionBoard) -> Value { + serde_json::json!({ + "totalDocs": board.total_docs, + "columns": board + .columns + .iter() + .map(doc_decision_column_to_json) + .collect::>(), + }) +} + +fn doc_decision_column_to_json(column: &DocDecisionColumn) -> Value { + serde_json::json!({ + "key": column.key, + "label": column.label, + "count": column.count, + "docs": column + .docs + .iter() + .map(doc_decision_card_to_json) + .collect::>(), + }) +} + +fn doc_decision_card_to_json(card: &DocDecisionCard) -> Value { + serde_json::json!({ + "projectName": card.project_name, + "typeName": card.type_name, + "typeLabel": card.type_label, + "path": card.path, + "title": card.title, + "status": card.status, + "decisionCount": card.decision_count, + "openQuestionCount": card.open_question_count, + "riskCount": card.risk_count, + }) +} + +fn doc_readiness_board_to_json(board: &DocReadinessBoard) -> Value { + serde_json::json!({ + "totalDocs": board.total_docs, + "columns": board + .columns + .iter() + .map(doc_readiness_column_to_json) + .collect::>(), + }) +} + +fn doc_readiness_column_to_json(column: &DocReadinessColumn) -> Value { + serde_json::json!({ + "key": column.key, + "label": column.label, + "count": column.count, + "docs": column + .docs + .iter() + .map(doc_readiness_card_to_json) + .collect::>(), + }) +} + +fn doc_readiness_card_to_json(card: &DocReadinessCard) -> Value { + serde_json::json!({ + "projectName": card.project_name, + "typeName": card.type_name, + "typeLabel": card.type_label, + "path": card.path, + "title": card.title, + "status": card.status, + "checklistTotal": card.checklist_total, + "checklistChecked": card.checklist_checked, + "scenarioCount": card.scenario_count, + "referenceCount": card.reference_count, + }) +} + +fn doc_handoff_board_to_json(board: &DocHandoffBoard) -> Value { + serde_json::json!({ + "totalDocs": board.total_docs, + "columns": board + .columns + .iter() + .map(doc_handoff_column_to_json) + .collect::>(), + }) +} + +fn doc_handoff_column_to_json(column: &DocHandoffColumn) -> Value { + serde_json::json!({ + "key": column.key, + "label": column.label, + "count": column.count, + "docs": column + .docs + .iter() + .map(doc_handoff_card_to_json) + .collect::>(), + }) +} + +fn doc_handoff_card_to_json(card: &DocHandoffCard) -> Value { + serde_json::json!({ + "projectName": card.project_name, + "typeName": card.type_name, + "typeLabel": card.type_label, + "path": card.path, + "title": card.title, + "status": card.status, + "checklistTotal": card.checklist_total, + "checklistChecked": card.checklist_checked, + "scenarioCount": card.scenario_count, + "implementationReferenceCount": card.implementation_reference_count, + "openQuestionCount": card.open_question_count, + "riskCount": card.risk_count, + }) +} + +fn doc_implementation_board_to_json(board: &DocImplementationBoard) -> Value { + serde_json::json!({ + "totalDocs": board.total_docs, + "columns": board + .columns + .iter() + .map(doc_implementation_column_to_json) + .collect::>(), + }) +} + +fn doc_implementation_column_to_json(column: &DocImplementationColumn) -> Value { + serde_json::json!({ + "key": column.key, + "label": column.label, + "count": column.count, + "docs": column + .docs + .iter() + .map(doc_implementation_card_to_json) + .collect::>(), + }) } -fn checks_error_to_canonical( - e: ext_checks_bindings::comtrya::platform::types::Error, -) -> wit_types::Error { - use ext_checks_bindings::comtrya::platform::types as local; - let code = match e.code { - local::ErrorCode::NotFound => wit_types::ErrorCode::NotFound, - local::ErrorCode::Conflict => wit_types::ErrorCode::Conflict, - local::ErrorCode::Forbidden => wit_types::ErrorCode::Forbidden, - local::ErrorCode::Unauthenticated => wit_types::ErrorCode::Unauthenticated, - local::ErrorCode::BadInput => wit_types::ErrorCode::BadInput, - local::ErrorCode::Internal => wit_types::ErrorCode::Internal, - local::ErrorCode::Unavailable => wit_types::ErrorCode::Unavailable, - }; - wit_types::Error { - code, - message: e.message, - path: e.path, - } +fn doc_implementation_card_to_json(card: &DocImplementationCard) -> Value { + serde_json::json!({ + "projectName": card.project_name, + "typeName": card.type_name, + "typeLabel": card.type_label, + "path": card.path, + "title": card.title, + "status": card.status, + "checklistTotal": card.checklist_total, + "checklistChecked": card.checklist_checked, + "scenarioCount": card.scenario_count, + "referenceCount": card.reference_count, + "implementationReferenceCount": card.implementation_reference_count, + "docReferenceCount": card.doc_reference_count, + "openQuestionCount": card.open_question_count, + "riskCount": card.risk_count, + }) } -fn workspace_home_error_to_canonical( - e: ext_workspace_home_bindings::comtrya::platform::types::Error, -) -> wit_types::Error { - use ext_workspace_home_bindings::comtrya::platform::types as local; - let code = match e.code { - local::ErrorCode::NotFound => wit_types::ErrorCode::NotFound, - local::ErrorCode::Conflict => wit_types::ErrorCode::Conflict, - local::ErrorCode::Forbidden => wit_types::ErrorCode::Forbidden, - local::ErrorCode::Unauthenticated => wit_types::ErrorCode::Unauthenticated, - local::ErrorCode::BadInput => wit_types::ErrorCode::BadInput, - local::ErrorCode::Internal => wit_types::ErrorCode::Internal, - local::ErrorCode::Unavailable => wit_types::ErrorCode::Unavailable, - }; - wit_types::Error { - code, - message: e.message, - path: e.path, - } +fn doc_property_to_json(property: &DocProperty) -> Value { + serde_json::json!({ + "key": property.key, + "value": property.value, + }) } fn docs_error_to_canonical( @@ -2329,7 +5240,7 @@ pub fn dispatch_ext_docs( store: Arc, current_principal: &str, info: &crate::generated_dispatch::DispatchInfo, - _payload: &[u8], + payload: &[u8], depth: u32, reactor_depth: u32, ) -> Result, wit_types::Error> { @@ -2381,6 +5292,348 @@ pub fn dispatch_ext_docs( })?; Value::String(result.map_err(docs_error_to_canonical)?) } + "summarize-doc" => { + let parsed: SummarizeDocInputJson = serde_json::from_slice(payload).map_err(|e| { + wit_error( + wit_types::ErrorCode::BadInput, + format!("parse summarize-doc input: {e}"), + ) + })?; + let wit_input = DocsSummarizeDocInput { + path: parsed.path, + preview: parsed.preview, + }; + let result = docs + .call_summarize_doc(&mut wasm_store, &wit_input) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("summarize-doc call: {e}"), + ) + })?; + doc_summary_to_json(&result.map_err(docs_error_to_canonical)?) + } + "summarize-catalog" => { + let parsed: DocCatalogInputJson = serde_json::from_slice(payload).map_err(|e| { + wit_error( + wit_types::ErrorCode::BadInput, + format!("parse summarize-catalog input: {e}"), + ) + })?; + let wit_input = doc_catalog_input_to_wit(parsed); + let result = docs + .call_summarize_catalog(&mut wasm_store, &wit_input) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("summarize-catalog call: {e}"), + ) + })?; + doc_catalog_to_json(&result.map_err(docs_error_to_canonical)?) + } + "type-board" => { + let parsed: DocCatalogInputJson = serde_json::from_slice(payload).map_err(|e| { + wit_error( + wit_types::ErrorCode::BadInput, + format!("parse type-board input: {e}"), + ) + })?; + let wit_input = doc_catalog_input_to_wit(parsed); + let result = docs + .call_type_board(&mut wasm_store, &wit_input) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("type-board call: {e}"), + ) + })?; + doc_type_board_to_json(&result.map_err(docs_error_to_canonical)?) + } + "status-board" => { + let parsed: DocCatalogInputJson = serde_json::from_slice(payload).map_err(|e| { + wit_error( + wit_types::ErrorCode::BadInput, + format!("parse status-board input: {e}"), + ) + })?; + let wit_input = doc_catalog_input_to_wit(parsed); + let result = docs + .call_status_board(&mut wasm_store, &wit_input) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("status-board call: {e}"), + ) + })?; + doc_status_board_to_json(&result.map_err(docs_error_to_canonical)?) + } + "owner-board" => { + let parsed: DocCatalogInputJson = serde_json::from_slice(payload).map_err(|e| { + wit_error( + wit_types::ErrorCode::BadInput, + format!("parse owner-board input: {e}"), + ) + })?; + let wit_input = doc_catalog_input_to_wit(parsed); + let result = docs + .call_owner_board(&mut wasm_store, &wit_input) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("owner-board call: {e}"), + ) + })?; + doc_owner_board_to_json(&result.map_err(docs_error_to_canonical)?) + } + "tag-board" => { + let parsed: DocCatalogInputJson = serde_json::from_slice(payload).map_err(|e| { + wit_error( + wit_types::ErrorCode::BadInput, + format!("parse tag-board input: {e}"), + ) + })?; + let wit_input = doc_catalog_input_to_wit(parsed); + let result = docs + .call_tag_board(&mut wasm_store, &wit_input) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("tag-board call: {e}"), + ) + })?; + doc_tag_board_to_json(&result.map_err(docs_error_to_canonical)?) + } + "project-board" => { + let parsed: DocCatalogInputJson = serde_json::from_slice(payload).map_err(|e| { + wit_error( + wit_types::ErrorCode::BadInput, + format!("parse project-board input: {e}"), + ) + })?; + let wit_input = doc_catalog_input_to_wit(parsed); + let result = docs + .call_project_board(&mut wasm_store, &wit_input) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("project-board call: {e}"), + ) + })?; + doc_project_board_to_json(&result.map_err(docs_error_to_canonical)?) + } + "summarize-scenarios" => { + let parsed: SummarizeDocInputJson = serde_json::from_slice(payload).map_err(|e| { + wit_error( + wit_types::ErrorCode::BadInput, + format!("parse summarize-scenarios input: {e}"), + ) + })?; + let wit_input = DocsSummarizeDocInput { + path: parsed.path, + preview: parsed.preview, + }; + let result = docs + .call_summarize_scenarios(&mut wasm_store, &wit_input) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("summarize-scenarios call: {e}"), + ) + })?; + bdd_summary_to_json(&result.map_err(docs_error_to_canonical)?) + } + "scenario-board" => { + let parsed: DocCatalogInputJson = serde_json::from_slice(payload).map_err(|e| { + wit_error( + wit_types::ErrorCode::BadInput, + format!("parse scenario-board input: {e}"), + ) + })?; + let wit_input = doc_catalog_input_to_wit(parsed); + let result = docs + .call_scenario_board(&mut wasm_store, &wit_input) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("scenario-board call: {e}"), + ) + })?; + doc_scenario_board_to_json(&result.map_err(docs_error_to_canonical)?) + } + "summarize-checklists" => { + let parsed: SummarizeDocInputJson = serde_json::from_slice(payload).map_err(|e| { + wit_error( + wit_types::ErrorCode::BadInput, + format!("parse summarize-checklists input: {e}"), + ) + })?; + let wit_input = DocsSummarizeDocInput { + path: parsed.path, + preview: parsed.preview, + }; + let result = docs + .call_summarize_checklists(&mut wasm_store, &wit_input) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("summarize-checklists call: {e}"), + ) + })?; + doc_checklist_summary_to_json(&result.map_err(docs_error_to_canonical)?) + } + "summarize-references" => { + let parsed: SummarizeDocInputJson = serde_json::from_slice(payload).map_err(|e| { + wit_error( + wit_types::ErrorCode::BadInput, + format!("parse summarize-references input: {e}"), + ) + })?; + let wit_input = DocsSummarizeDocInput { + path: parsed.path, + preview: parsed.preview, + }; + let result = docs + .call_summarize_references(&mut wasm_store, &wit_input) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("summarize-references call: {e}"), + ) + })?; + doc_reference_summary_to_json(&result.map_err(docs_error_to_canonical)?) + } + "traceability-board" => { + let parsed: DocCatalogInputJson = serde_json::from_slice(payload).map_err(|e| { + wit_error( + wit_types::ErrorCode::BadInput, + format!("parse traceability-board input: {e}"), + ) + })?; + let wit_input = doc_catalog_input_to_wit(parsed); + let result = docs + .call_traceability_board(&mut wasm_store, &wit_input) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("traceability-board call: {e}"), + ) + })?; + doc_traceability_board_to_json(&result.map_err(docs_error_to_canonical)?) + } + "summarize-outline" => { + let parsed: SummarizeDocInputJson = serde_json::from_slice(payload).map_err(|e| { + wit_error( + wit_types::ErrorCode::BadInput, + format!("parse summarize-outline input: {e}"), + ) + })?; + let wit_input = DocsSummarizeDocInput { + path: parsed.path, + preview: parsed.preview, + }; + let result = docs + .call_summarize_outline(&mut wasm_store, &wit_input) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("summarize-outline call: {e}"), + ) + })?; + doc_outline_summary_to_json(&result.map_err(docs_error_to_canonical)?) + } + "summarize-decisions" => { + let parsed: SummarizeDocInputJson = serde_json::from_slice(payload).map_err(|e| { + wit_error( + wit_types::ErrorCode::BadInput, + format!("parse summarize-decisions input: {e}"), + ) + })?; + let wit_input = DocsSummarizeDocInput { + path: parsed.path, + preview: parsed.preview, + }; + let result = docs + .call_summarize_decisions(&mut wasm_store, &wit_input) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("summarize-decisions call: {e}"), + ) + })?; + doc_decision_summary_to_json(&result.map_err(docs_error_to_canonical)?) + } + "decision-board" => { + let parsed: DocCatalogInputJson = serde_json::from_slice(payload).map_err(|e| { + wit_error( + wit_types::ErrorCode::BadInput, + format!("parse decision-board input: {e}"), + ) + })?; + let wit_input = doc_catalog_input_to_wit(parsed); + let result = docs + .call_decision_board(&mut wasm_store, &wit_input) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("decision-board call: {e}"), + ) + })?; + doc_decision_board_to_json(&result.map_err(docs_error_to_canonical)?) + } + "readiness-board" => { + let parsed: DocCatalogInputJson = serde_json::from_slice(payload).map_err(|e| { + wit_error( + wit_types::ErrorCode::BadInput, + format!("parse readiness-board input: {e}"), + ) + })?; + let wit_input = doc_catalog_input_to_wit(parsed); + let result = docs + .call_readiness_board(&mut wasm_store, &wit_input) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("readiness-board call: {e}"), + ) + })?; + doc_readiness_board_to_json(&result.map_err(docs_error_to_canonical)?) + } + "handoff-board" => { + let parsed: DocCatalogInputJson = serde_json::from_slice(payload).map_err(|e| { + wit_error( + wit_types::ErrorCode::BadInput, + format!("parse handoff-board input: {e}"), + ) + })?; + let wit_input = doc_catalog_input_to_wit(parsed); + let result = docs + .call_handoff_board(&mut wasm_store, &wit_input) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("handoff-board call: {e}"), + ) + })?; + doc_handoff_board_to_json(&result.map_err(docs_error_to_canonical)?) + } + "implementation-board" => { + let parsed: DocCatalogInputJson = serde_json::from_slice(payload).map_err(|e| { + wit_error( + wit_types::ErrorCode::BadInput, + format!("parse implementation-board input: {e}"), + ) + })?; + let wit_input = doc_catalog_input_to_wit(parsed); + let result = docs + .call_implementation_board(&mut wasm_store, &wit_input) + .map_err(|e| { + wit_error( + wit_types::ErrorCode::Internal, + format!("implementation-board call: {e}"), + ) + })?; + doc_implementation_board_to_json(&result.map_err(docs_error_to_canonical)?) + } other => { return Err(wit_error( wit_types::ErrorCode::NotFound, @@ -2425,4 +5678,18 @@ mod tests { assert_eq!(pull_state_to_graphql(PrState::Merged), "MERGED"); assert_eq!(pull_state_to_graphql(PrState::Closed), "CLOSED"); } + + #[test] + fn pr_state_from_json_accepts_review_wire_case() { + assert!(matches!( + pull_state_from_json("REVIEW").expect("review state"), + PrState::Review + )); + } + + #[test] + fn pr_state_from_json_rejects_unknown_wire_case() { + let error = pull_state_from_json("CHANGES_REQUESTED").expect_err("unknown state"); + assert!(matches!(error.code, wit_types::ErrorCode::BadInput)); + } } diff --git a/docs/CONTAINER.md b/docs/CONTAINER.md index a7d3b98b..f2fa8a01 100644 --- a/docs/CONTAINER.md +++ b/docs/CONTAINER.md @@ -58,7 +58,7 @@ recurring probe. The frontend image exposes port `8080` and serves `/healthz` as a light static readiness endpoint. The Kubernetes base deploys it as `comtrya-frontend`. Route API paths (`/graphql`, `/api`, `/auth`, -`/_extensions`, `/git`, `/events`, `/healthz`, `/readyz`) to +`/ui-ext`, `/git`, `/events`, `/healthz`, `/readyz`) to `comtrya-server`, and route SPA paths to `comtrya-frontend`. ## Environment diff --git a/docs/architecture.d2 b/docs/architecture.d2 index 187f4a24..5137a256 100644 --- a/docs/architecture.d2 +++ b/docs/architecture.d2 @@ -62,7 +62,7 @@ server: "Server / Host — crates/server (Rust)" { health: "/healthz · /readyz" auth: "Auth / session\n(OIDC, operator code)" graphql: "GraphQL\n/graphql" - assets: "Asset server\n/_extensions//assets/..." + assets: "Asset server\n/ui-ext//files/..." git_http: "Git Smart HTTP v2\n(comtrya-git-http)\nupload-pack only" } @@ -168,7 +168,7 @@ server.edge.git_http -> web.shell.git_client: "pkt-line" { style.stroke-dash: 4 } -web.shell.sdk -> server.edge.assets: "GET /_extensions//assets/index.js" { +web.shell.sdk -> server.edge.assets: "GET /ui-ext//files/index.js" { style.stroke: "#1E6FBA" style.stroke-width: 2 } diff --git a/docs/extensions.md b/docs/extensions.md index 71e84190..ff156f6a 100644 --- a/docs/extensions.md +++ b/docs/extensions.md @@ -148,8 +148,10 @@ The UI surface is a browser ESM bundle built from `ui/` into Vue for first-party UI. The shell loads installed extension UI manifests through -`/_extensions//manifest.json`, verifies asset integrity, imports +`/ui-ext//meta.json`, verifies asset integrity, imports `assets/index.js`, and calls the bundle's default `setup(host)` function. +The module token is the hex-encoded extension ID used only for public asset +URLs. The backend component and browser bundle are intentionally separate. Backend behavior runs in Wasmtime on the server; DOM rendering runs in the browser. diff --git a/extensions/bundler/build-extension.sh b/extensions/bundler/build-extension.sh index 52527ddd..b9b1e26d 100755 --- a/extensions/bundler/build-extension.sh +++ b/extensions/bundler/build-extension.sh @@ -103,7 +103,8 @@ if [[ -f "$root/ui/package.json" ]]; then ui_manifest="$root/ui/manifest.json" if [[ -f "$ui_manifest" ]]; then entry="$(jq -r '.assets.entry' "$ui_manifest")" - expected_prefix="/_extensions/$ext_id/assets/" + module_token="$(printf '%s' "$ext_id" | od -An -tx1 | tr -d ' \n')" + expected_prefix="/ui-ext/$module_token/files/" if [[ "$entry" == "$expected_prefix"* ]]; then entry_rel="${entry#"$expected_prefix"}" entry_path="$root/assets/$entry_rel" diff --git a/extensions/comtrya.cue b/extensions/comtrya.cue index 3b2ae4ca..9d0fb200 100644 --- a/extensions/comtrya.cue +++ b/extensions/comtrya.cue @@ -31,4 +31,9 @@ projects: extensions: { defaultLabels: ["extensions"] defaultStatus: "planned" } + + sprints: { + cadence: "weekly" + defaultCapacity: 6 + } } diff --git a/extensions/first-party/ext_checks/assets/index.js b/extensions/first-party/ext_checks/assets/index.js index ffc1434a..2e43e76b 100644 --- a/extensions/first-party/ext_checks/assets/index.js +++ b/extensions/first-party/ext_checks/assets/index.js @@ -31,14 +31,14 @@ function de(e) { if (d(e)) { let t = {}; for (let n = 0; n < e.length; n++) { - let r = e[n], i = g(r) ? k(r) : de(r); + let r = e[n], i = g(r) ? he(r) : de(r); if (i) for (let e in i) t[e] = i[e]; } return t; } else if (g(e) || v(e)) return e; } var fe = /;(?![^(]*\))/g, pe = /:([^]+)/, me = /\/\*[^]*?\*\//g; -function k(e) { +function he(e) { let t = {}; return e.replace(me, "").split(fe).forEach((e) => { if (e) { @@ -47,45 +47,43 @@ function k(e) { } }), t; } -function he(e) { +function ge(e) { let t = ""; if (g(e)) t = e; else if (d(e)) for (let n = 0; n < e.length; n++) { - let r = he(e[n]); + let r = ge(e[n]); r && (t += r + " "); } else if (v(e)) for (let n in e) e[n] && (t += n + " "); return t.trim(); } -var ge = "itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly", _e = /* @__PURE__ */ e(ge); -ge + ""; -function ve(e) { +var _e = "itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly", ve = /* @__PURE__ */ e(_e); +_e + ""; +function ye(e) { return !!e || e === ""; } -function ye(e, t) { +function be(e, t) { if (e.length !== t.length) return !1; let n = !0; - for (let r = 0; n && r < e.length; r++) n = be(e[r], t[r]); + for (let r = 0; n && r < e.length; r++) n = xe(e[r], t[r]); return n; } -function be(e, t) { +function xe(e, t) { if (e === t) return !0; let n = m(e), r = m(t); if (n || r) return n && r ? e.getTime() === t.getTime() : !1; if (n = _(e), r = _(t), n || r) return e === t; - if (n = d(e), r = d(t), n || r) return n && r ? ye(e, t) : !1; + if (n = d(e), r = d(t), n || r) return n && r ? be(e, t) : !1; if (n = v(e), r = v(t), n || r) { if (!n || !r || Object.keys(e).length !== Object.keys(t).length) return !1; for (let n in e) { let r = e.hasOwnProperty(n), i = t.hasOwnProperty(n); - if (r && !i || !r && i || !be(e[n], t[n])) return !1; + if (r && !i || !r && i || !xe(e[n], t[n])) return !1; } } return String(e) === String(t); } -//#endregion -//#region node_modules/.bun/@vue+reactivity@3.5.34/node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js -var A, xe = class { +var Se = (e) => !!(e && e.__v_isRef === !0), k = (e) => g(e) ? e : e == null ? "" : d(e) || v(e) && (e.toString === b || !h(e.toString)) ? Se(e) ? k(e.value) : JSON.stringify(e, Ce, 2) : String(e), Ce = (e, t) => Se(t) ? Ce(e, t.value) : f(t) ? { [`Map(${t.size})`]: [...t.entries()].reduce((e, [t, n], r) => (e[we(t, r) + " =>"] = n, e), {}) } : p(t) ? { [`Set(${t.size})`]: [...t.values()].map((e) => we(e)) } : _(t) ? we(t) : v(t) && !d(t) && !C(t) ? String(t) : t, we = (e, t = "") => _(e) ? `Symbol(${e.description ?? t})` : e, A, Te = class { constructor(e = !1) { this.detached = e, this._active = !0, this._on = 0, this.effects = [], this.cleanups = [], this._isPaused = !1, this._warnOnRun = !0, this.__v_skip = !0, !e && A && (A.active ? (this.parent = A, this.index = (A.scopes ||= []).push(this) - 1) : (this._active = !1, this._warnOnRun = !1)); } @@ -155,10 +153,10 @@ var A, xe = class { } } }; -function Se() { +function Ee() { return A; } -var j, Ce = /* @__PURE__ */ new WeakSet(), we = class { +var j, De = /* @__PURE__ */ new WeakSet(), Oe = class { constructor(e) { this.fn = e, this.deps = void 0, this.depsTail = void 0, this.flags = 5, this.next = void 0, this.cleanup = void 0, this.scheduler = void 0, A && (A.active ? A.effects.push(this) : this.flags &= -2); } @@ -166,61 +164,61 @@ var j, Ce = /* @__PURE__ */ new WeakSet(), we = class { this.flags |= 64; } resume() { - this.flags & 64 && (this.flags &= -65, Ce.has(this) && (Ce.delete(this), this.trigger())); + this.flags & 64 && (this.flags &= -65, De.has(this) && (De.delete(this), this.trigger())); } notify() { - this.flags & 2 && !(this.flags & 32) || this.flags & 8 || Oe(this); + this.flags & 2 && !(this.flags & 32) || this.flags & 8 || Me(this); } run() { if (!(this.flags & 1)) return this.fn(); - this.flags |= 2, Re(this), je(this); + this.flags |= 2, We(this), Fe(this); let e = j, t = M; j = this, M = !0; try { return this.fn(); } finally { - Me(this), j = e, M = t, this.flags &= -3; + Ie(this), j = e, M = t, this.flags &= -3; } } stop() { if (this.flags & 1) { - for (let e = this.deps; e; e = e.nextDep) Fe(e); - this.deps = this.depsTail = void 0, Re(this), this.onStop && this.onStop(), this.flags &= -2; + for (let e = this.deps; e; e = e.nextDep) ze(e); + this.deps = this.depsTail = void 0, We(this), this.onStop && this.onStop(), this.flags &= -2; } } trigger() { - this.flags & 64 ? Ce.add(this) : this.scheduler ? this.scheduler() : this.runIfDirty(); + this.flags & 64 ? De.add(this) : this.scheduler ? this.scheduler() : this.runIfDirty(); } runIfDirty() { - Ne(this) && this.run(); + Le(this) && this.run(); } get dirty() { - return Ne(this); + return Le(this); } -}, Te = 0, Ee, De; -function Oe(e, t = !1) { +}, ke = 0, Ae, je; +function Me(e, t = !1) { if (e.flags |= 8, t) { - e.next = De, De = e; + e.next = je, je = e; return; } - e.next = Ee, Ee = e; + e.next = Ae, Ae = e; } -function ke() { - Te++; +function Ne() { + ke++; } -function Ae() { - if (--Te > 0) return; - if (De) { - let e = De; - for (De = void 0; e;) { +function Pe() { + if (--ke > 0) return; + if (je) { + let e = je; + for (je = void 0; e;) { let t = e.next; e.next = void 0, e.flags &= -9, e = t; } } let e; - for (; Ee;) { - let t = Ee; - for (Ee = void 0; t;) { + for (; Ae;) { + let t = Ae; + for (Ae = void 0; t;) { let n = t.next; if (t.next = void 0, t.flags &= -9, t.flags & 1) try { t.trigger(); @@ -232,57 +230,57 @@ function Ae() { } if (e) throw e; } -function je(e) { +function Fe(e) { for (let t = e.deps; t; t = t.nextDep) t.version = -1, t.prevActiveLink = t.dep.activeLink, t.dep.activeLink = t; } -function Me(e) { +function Ie(e) { let t, n = e.depsTail, r = n; for (; r;) { let e = r.prevDep; - r.version === -1 ? (r === n && (n = e), Fe(r), Ie(r)) : t = r, r.dep.activeLink = r.prevActiveLink, r.prevActiveLink = void 0, r = e; + r.version === -1 ? (r === n && (n = e), ze(r), Be(r)) : t = r, r.dep.activeLink = r.prevActiveLink, r.prevActiveLink = void 0, r = e; } e.deps = t, e.depsTail = n; } -function Ne(e) { - for (let t = e.deps; t; t = t.nextDep) if (t.dep.version !== t.version || t.dep.computed && (Pe(t.dep.computed) || t.dep.version !== t.version)) return !0; +function Le(e) { + for (let t = e.deps; t; t = t.nextDep) if (t.dep.version !== t.version || t.dep.computed && (Re(t.dep.computed) || t.dep.version !== t.version)) return !0; return !!e._dirty; } -function Pe(e) { - if (e.flags & 4 && !(e.flags & 16) || (e.flags &= -17, e.globalVersion === ze) || (e.globalVersion = ze, !e.isSSR && e.flags & 128 && (!e.deps && !e._dirty || !Ne(e)))) return; +function Re(e) { + if (e.flags & 4 && !(e.flags & 16) || (e.flags &= -17, e.globalVersion === Ge) || (e.globalVersion = Ge, !e.isSSR && e.flags & 128 && (!e.deps && !e._dirty || !Le(e)))) return; e.flags |= 2; let t = e.dep, n = j, r = M; j = e, M = !0; try { - je(e); + Fe(e); let n = e.fn(e._value); (t.version === 0 || D(n, e._value)) && (e.flags |= 128, e._value = n, t.version++); } catch (e) { throw t.version++, e; } finally { - j = n, M = r, Me(e), e.flags &= -3; + j = n, M = r, Ie(e), e.flags &= -3; } } -function Fe(e, t = !1) { +function ze(e, t = !1) { let { dep: n, prevSub: r, nextSub: i } = e; if (r && (r.nextSub = i, e.prevSub = void 0), i && (i.prevSub = r, e.nextSub = void 0), n.subs === e && (n.subs = r, !r && n.computed)) { n.computed.flags &= -5; - for (let e = n.computed.deps; e; e = e.nextDep) Fe(e, !0); + for (let e = n.computed.deps; e; e = e.nextDep) ze(e, !0); } !t && !--n.sc && n.map && n.map.delete(n.key); } -function Ie(e) { +function Be(e) { let { prevDep: t, nextDep: n } = e; t && (t.nextDep = n, e.prevDep = void 0), n && (n.prevDep = t, e.nextDep = void 0); } -var M = !0, Le = []; -function N() { - Le.push(M), M = !1; +var M = !0, Ve = []; +function He() { + Ve.push(M), M = !1; } -function P() { - let e = Le.pop(); +function Ue() { + let e = Ve.pop(); M = e === void 0 ? !0 : e; } -function Re(e) { +function We(e) { let { cleanup: t } = e; if (e.cleanup = void 0, t) { let e = j; @@ -294,18 +292,18 @@ function Re(e) { } } } -var ze = 0, Be = class { +var Ge = 0, Ke = class { constructor(e, t) { this.sub = e, this.dep = t, this.version = t.version, this.nextDep = this.prevDep = this.nextSub = this.prevSub = this.prevActiveLink = void 0; } -}, Ve = class { +}, qe = class { constructor(e) { this.computed = e, this.version = 0, this.activeLink = void 0, this.subs = void 0, this.map = void 0, this.key = void 0, this.sc = 0, this.__v_skip = !0; } track(e) { if (!j || !M || j === this.computed) return; let t = this.activeLink; - if (t === void 0 || t.sub !== j) t = this.activeLink = new Be(j, this), j.deps ? (t.prevDep = j.depsTail, j.depsTail.nextDep = t, j.depsTail = t) : j.deps = j.depsTail = t, He(t); + if (t === void 0 || t.sub !== j) t = this.activeLink = new Ke(j, this), j.deps ? (t.prevDep = j.depsTail, j.depsTail.nextDep = t, j.depsTail = t) : j.deps = j.depsTail = t, Je(t); else if (t.version === -1 && (t.version = this.version, t.nextDep)) { let e = t.nextDep; e.prevDep = t.prevDep, t.prevDep && (t.prevDep.nextDep = e), t.prevDep = j.depsTail, t.nextDep = void 0, j.depsTail.nextDep = t, j.depsTail = t, j.deps === t && (j.deps = e); @@ -313,213 +311,213 @@ var ze = 0, Be = class { return t; } trigger(e) { - this.version++, ze++, this.notify(e); + this.version++, Ge++, this.notify(e); } notify(e) { - ke(); + Ne(); try { for (let e = this.subs; e; e = e.prevSub) e.sub.notify() && e.sub.dep.notify(); } finally { - Ae(); + Pe(); } } }; -function He(e) { +function Je(e) { if (e.dep.sc++, e.sub.flags & 4) { let t = e.dep.computed; if (t && !e.dep.subs) { t.flags |= 20; - for (let e = t.deps; e; e = e.nextDep) He(e); + for (let e = t.deps; e; e = e.nextDep) Je(e); } let n = e.dep.subs; n !== e && (e.prevSub = n, n && (n.nextSub = e)), e.dep.subs = e; } } -var Ue = /* @__PURE__ */ new WeakMap(), We = /* @__PURE__ */ Symbol(""), Ge = /* @__PURE__ */ Symbol(""), Ke = /* @__PURE__ */ Symbol(""); -function F(e, t, n) { +var Ye = /* @__PURE__ */ new WeakMap(), Xe = /* @__PURE__ */ Symbol(""), Ze = /* @__PURE__ */ Symbol(""), Qe = /* @__PURE__ */ Symbol(""); +function N(e, t, n) { if (M && j) { - let t = Ue.get(e); - t || Ue.set(e, t = /* @__PURE__ */ new Map()); + let t = Ye.get(e); + t || Ye.set(e, t = /* @__PURE__ */ new Map()); let r = t.get(n); - r || (t.set(n, r = new Ve()), r.map = t, r.key = n), r.track(); + r || (t.set(n, r = new qe()), r.map = t, r.key = n), r.track(); } } -function I(e, t, n, r, i, a) { - let o = Ue.get(e); +function $e(e, t, n, r, i, a) { + let o = Ye.get(e); if (!o) { - ze++; + Ge++; return; } let s = (e) => { e && e.trigger(); }; - if (ke(), t === "clear") o.forEach(s); + if (Ne(), t === "clear") o.forEach(s); else { let i = d(e), a = i && w(n); if (i && n === "length") { let e = Number(r); o.forEach((t, n) => { - (n === "length" || n === Ke || !_(n) && n >= e) && s(t); + (n === "length" || n === Qe || !_(n) && n >= e) && s(t); }); - } else switch ((n !== void 0 || o.has(void 0)) && s(o.get(n)), a && s(o.get(Ke)), t) { + } else switch ((n !== void 0 || o.has(void 0)) && s(o.get(n)), a && s(o.get(Qe)), t) { case "add": - i ? a && s(o.get("length")) : (s(o.get(We)), f(e) && s(o.get(Ge))); + i ? a && s(o.get("length")) : (s(o.get(Xe)), f(e) && s(o.get(Ze))); break; case "delete": - i || (s(o.get(We)), f(e) && s(o.get(Ge))); + i || (s(o.get(Xe)), f(e) && s(o.get(Ze))); break; case "set": - f(e) && s(o.get(We)); + f(e) && s(o.get(Xe)); break; } } - Ae(); + Pe(); } -function qe(e) { - let t = /* @__PURE__ */ B(e); - return t === e ? t : (F(t, "iterate", Ke), /* @__PURE__ */ z(e) ? t : t.map(Nt)); +function et(e) { + let t = /* @__PURE__ */ F(e); + return t === e ? t : (N(t, "iterate", Qe), /* @__PURE__ */ P(e) ? t : t.map(I)); } -function Je(e) { - return F(e = /* @__PURE__ */ B(e), "iterate", Ke), e; +function tt(e) { + return N(e = /* @__PURE__ */ F(e), "iterate", Qe), e; } -function L(e, t) { - return /* @__PURE__ */ At(e) ? Pt(/* @__PURE__ */ kt(e) ? Nt(t) : t) : Nt(t); +function nt(e, t) { + return /* @__PURE__ */ zt(e) ? Ht(/* @__PURE__ */ Rt(e) ? I(t) : t) : I(t); } -var Ye = { +var rt = { __proto__: null, [Symbol.iterator]() { - return Xe(this, Symbol.iterator, (e) => L(this, e)); + return it(this, Symbol.iterator, (e) => nt(this, e)); }, concat(...e) { - return qe(this).concat(...e.map((e) => d(e) ? qe(e) : e)); + return et(this).concat(...e.map((e) => d(e) ? et(e) : e)); }, entries() { - return Xe(this, "entries", (e) => (e[1] = L(this, e[1]), e)); + return it(this, "entries", (e) => (e[1] = nt(this, e[1]), e)); }, every(e, t) { - return R(this, "every", e, t, void 0, arguments); + return ot(this, "every", e, t, void 0, arguments); }, filter(e, t) { - return R(this, "filter", e, t, (e) => e.map((e) => L(this, e)), arguments); + return ot(this, "filter", e, t, (e) => e.map((e) => nt(this, e)), arguments); }, find(e, t) { - return R(this, "find", e, t, (e) => L(this, e), arguments); + return ot(this, "find", e, t, (e) => nt(this, e), arguments); }, findIndex(e, t) { - return R(this, "findIndex", e, t, void 0, arguments); + return ot(this, "findIndex", e, t, void 0, arguments); }, findLast(e, t) { - return R(this, "findLast", e, t, (e) => L(this, e), arguments); + return ot(this, "findLast", e, t, (e) => nt(this, e), arguments); }, findLastIndex(e, t) { - return R(this, "findLastIndex", e, t, void 0, arguments); + return ot(this, "findLastIndex", e, t, void 0, arguments); }, forEach(e, t) { - return R(this, "forEach", e, t, void 0, arguments); + return ot(this, "forEach", e, t, void 0, arguments); }, includes(...e) { - return $e(this, "includes", e); + return ct(this, "includes", e); }, indexOf(...e) { - return $e(this, "indexOf", e); + return ct(this, "indexOf", e); }, join(e) { - return qe(this).join(e); + return et(this).join(e); }, lastIndexOf(...e) { - return $e(this, "lastIndexOf", e); + return ct(this, "lastIndexOf", e); }, map(e, t) { - return R(this, "map", e, t, void 0, arguments); + return ot(this, "map", e, t, void 0, arguments); }, pop() { - return et(this, "pop"); + return lt(this, "pop"); }, push(...e) { - return et(this, "push", e); + return lt(this, "push", e); }, reduce(e, ...t) { - return Qe(this, "reduce", e, t); + return st(this, "reduce", e, t); }, reduceRight(e, ...t) { - return Qe(this, "reduceRight", e, t); + return st(this, "reduceRight", e, t); }, shift() { - return et(this, "shift"); + return lt(this, "shift"); }, some(e, t) { - return R(this, "some", e, t, void 0, arguments); + return ot(this, "some", e, t, void 0, arguments); }, splice(...e) { - return et(this, "splice", e); + return lt(this, "splice", e); }, toReversed() { - return qe(this).toReversed(); + return et(this).toReversed(); }, toSorted(e) { - return qe(this).toSorted(e); + return et(this).toSorted(e); }, toSpliced(...e) { - return qe(this).toSpliced(...e); + return et(this).toSpliced(...e); }, unshift(...e) { - return et(this, "unshift", e); + return lt(this, "unshift", e); }, values() { - return Xe(this, "values", (e) => L(this, e)); + return it(this, "values", (e) => nt(this, e)); } }; -function Xe(e, t, n) { - let r = Je(e), i = r[t](); - return r !== e && !/* @__PURE__ */ z(e) && (i._next = i.next, i.next = () => { +function it(e, t, n) { + let r = tt(e), i = r[t](); + return r !== e && !/* @__PURE__ */ P(e) && (i._next = i.next, i.next = () => { let e = i._next(); return e.done || (e.value = n(e.value)), e; }), i; } -var Ze = Array.prototype; -function R(e, t, n, r, i, a) { - let o = Je(e), s = o !== e && !/* @__PURE__ */ z(e), c = o[t]; - if (c !== Ze[t]) { +var at = Array.prototype; +function ot(e, t, n, r, i, a) { + let o = tt(e), s = o !== e && !/* @__PURE__ */ P(e), c = o[t]; + if (c !== at[t]) { let t = c.apply(e, a); - return s ? Nt(t) : t; + return s ? I(t) : t; } let l = n; o !== e && (s ? l = function(t, r) { - return n.call(this, L(e, t), r, e); + return n.call(this, nt(e, t), r, e); } : n.length > 2 && (l = function(t, r) { return n.call(this, t, r, e); })); let u = c.call(o, l, r); return s && i ? i(u) : u; } -function Qe(e, t, n, r) { - let i = Je(e), a = i !== e && !/* @__PURE__ */ z(e), o = n, s = !1; +function st(e, t, n, r) { + let i = tt(e), a = i !== e && !/* @__PURE__ */ P(e), o = n, s = !1; i !== e && (a ? (s = r.length === 0, o = function(t, r, i) { - return s && (s = !1, t = L(e, t)), n.call(this, t, L(e, r), i, e); + return s && (s = !1, t = nt(e, t)), n.call(this, t, nt(e, r), i, e); }) : n.length > 3 && (o = function(t, r, i) { return n.call(this, t, r, i, e); })); let c = i[t](o, ...r); - return s ? L(e, c) : c; + return s ? nt(e, c) : c; } -function $e(e, t, n) { - let r = /* @__PURE__ */ B(e); - F(r, "iterate", Ke); +function ct(e, t, n) { + let r = /* @__PURE__ */ F(e); + N(r, "iterate", Qe); let i = r[t](...n); - return (i === -1 || i === !1) && /* @__PURE__ */ jt(n[0]) ? (n[0] = /* @__PURE__ */ B(n[0]), r[t](...n)) : i; + return (i === -1 || i === !1) && /* @__PURE__ */ Bt(n[0]) ? (n[0] = /* @__PURE__ */ F(n[0]), r[t](...n)) : i; } -function et(e, t, n = []) { - N(), ke(); - let r = (/* @__PURE__ */ B(e))[t].apply(e, n); - return Ae(), P(), r; +function lt(e, t, n = []) { + He(), Ne(); + let r = (/* @__PURE__ */ F(e))[t].apply(e, n); + return Pe(), Ue(), r; } -var tt = /* @__PURE__ */ e("__proto__,__v_isRef,__isVue"), nt = new Set(/* @__PURE__ */ Object.getOwnPropertyNames(Symbol).filter((e) => e !== "arguments" && e !== "caller").map((e) => Symbol[e]).filter(_)); -function rt(e) { +var ut = /* @__PURE__ */ e("__proto__,__v_isRef,__isVue"), dt = new Set(/* @__PURE__ */ Object.getOwnPropertyNames(Symbol).filter((e) => e !== "arguments" && e !== "caller").map((e) => Symbol[e]).filter(_)); +function ft(e) { _(e) || (e = String(e)); - let t = /* @__PURE__ */ B(this); - return F(t, "has", e), t.hasOwnProperty(e); + let t = /* @__PURE__ */ F(this); + return N(t, "has", e), t.hasOwnProperty(e); } -var it = class { +var pt = class { constructor(e = !1, t = !1) { this._isReadonly = e, this._isShallow = t; } @@ -529,46 +527,46 @@ var it = class { if (t === "__v_isReactive") return !r; if (t === "__v_isReadonly") return r; if (t === "__v_isShallow") return i; - if (t === "__v_raw") return n === (r ? i ? St : xt : i ? bt : yt).get(e) || Object.getPrototypeOf(e) === Object.getPrototypeOf(n) ? e : void 0; + if (t === "__v_raw") return n === (r ? i ? jt : At : i ? kt : Ot).get(e) || Object.getPrototypeOf(e) === Object.getPrototypeOf(n) ? e : void 0; let a = d(e); if (!r) { let e; - if (a && (e = Ye[t])) return e; - if (t === "hasOwnProperty") return rt; + if (a && (e = rt[t])) return e; + if (t === "hasOwnProperty") return ft; } - let o = Reflect.get(e, t, /* @__PURE__ */ V(e) ? e : n); - if ((_(t) ? nt.has(t) : tt(t)) || (r || F(e, "get", t), i)) return o; - if (/* @__PURE__ */ V(o)) { + let o = Reflect.get(e, t, /* @__PURE__ */ L(e) ? e : n); + if ((_(t) ? dt.has(t) : ut(t)) || (r || N(e, "get", t), i)) return o; + if (/* @__PURE__ */ L(o)) { let e = a && w(t) ? o : o.value; - return r && v(e) ? /* @__PURE__ */ Dt(e) : e; + return r && v(e) ? /* @__PURE__ */ It(e) : e; } - return v(o) ? r ? /* @__PURE__ */ Dt(o) : /* @__PURE__ */ Tt(o) : o; + return v(o) ? r ? /* @__PURE__ */ It(o) : /* @__PURE__ */ Pt(o) : o; } -}, at = class extends it { +}, mt = class extends pt { constructor(e = !1) { super(!1, e); } set(e, t, n, r) { let i = e[t], a = d(e) && w(t); if (!this._isShallow) { - let e = /* @__PURE__ */ At(i); - if (!/* @__PURE__ */ z(n) && !/* @__PURE__ */ At(n) && (i = /* @__PURE__ */ B(i), n = /* @__PURE__ */ B(n)), !a && /* @__PURE__ */ V(i) && !/* @__PURE__ */ V(n)) return e || (i.value = n), !0; + let e = /* @__PURE__ */ zt(i); + if (!/* @__PURE__ */ P(n) && !/* @__PURE__ */ zt(n) && (i = /* @__PURE__ */ F(i), n = /* @__PURE__ */ F(n)), !a && /* @__PURE__ */ L(i) && !/* @__PURE__ */ L(n)) return e || (i.value = n), !0; } - let o = a ? Number(t) < e.length : u(e, t), s = Reflect.set(e, t, n, /* @__PURE__ */ V(e) ? e : r); - return e === /* @__PURE__ */ B(r) && (o ? D(n, i) && I(e, "set", t, n, i) : I(e, "add", t, n)), s; + let o = a ? Number(t) < e.length : u(e, t), s = Reflect.set(e, t, n, /* @__PURE__ */ L(e) ? e : r); + return e === /* @__PURE__ */ F(r) && (o ? D(n, i) && $e(e, "set", t, n, i) : $e(e, "add", t, n)), s; } deleteProperty(e, t) { let n = u(e, t), r = e[t], i = Reflect.deleteProperty(e, t); - return i && n && I(e, "delete", t, void 0, r), i; + return i && n && $e(e, "delete", t, void 0, r), i; } has(e, t) { let n = Reflect.has(e, t); - return (!_(t) || !nt.has(t)) && F(e, "has", t), n; + return (!_(t) || !dt.has(t)) && N(e, "has", t), n; } ownKeys(e) { - return F(e, "iterate", d(e) ? "length" : We), Reflect.ownKeys(e); + return N(e, "iterate", d(e) ? "length" : Xe), Reflect.ownKeys(e); } -}, ot = class extends it { +}, ht = class extends pt { constructor(e = !1) { super(!0, e); } @@ -578,11 +576,11 @@ var it = class { deleteProperty(e, t) { return !0; } -}, st = /* @__PURE__ */ new at(), ct = /* @__PURE__ */ new ot(), lt = /* @__PURE__ */ new at(!0), ut = (e) => e, dt = (e) => Reflect.getPrototypeOf(e); -function ft(e, t, n) { +}, gt = /* @__PURE__ */ new mt(), _t = /* @__PURE__ */ new ht(), vt = /* @__PURE__ */ new mt(!0), yt = (e) => e, bt = (e) => Reflect.getPrototypeOf(e); +function xt(e, t, n) { return function(...r) { - let i = this.__v_raw, a = /* @__PURE__ */ B(i), o = f(a), c = e === "entries" || e === Symbol.iterator && o, l = e === "keys" && o, u = i[e](...r), d = n ? ut : t ? Pt : Nt; - return !t && F(a, "iterate", l ? Ge : We), s(Object.create(u), { next() { + let i = this.__v_raw, a = /* @__PURE__ */ F(i), o = f(a), c = e === "entries" || e === Symbol.iterator && o, l = e === "keys" && o, u = i[e](...r), d = n ? yt : t ? Ht : I; + return !t && N(a, "iterate", l ? Ze : Xe), s(Object.create(u), { next() { let { value: e, done: t } = u.next(); return t ? { value: e, @@ -594,60 +592,60 @@ function ft(e, t, n) { } }); }; } -function pt(e) { +function St(e) { return function(...t) { return e === "delete" ? !1 : e === "clear" ? void 0 : this; }; } -function mt(e, t) { +function Ct(e, t) { let n = { get(n) { - let r = this.__v_raw, i = /* @__PURE__ */ B(r), a = /* @__PURE__ */ B(n); - e || (D(n, a) && F(i, "get", n), F(i, "get", a)); - let { has: o } = dt(i), s = t ? ut : e ? Pt : Nt; + let r = this.__v_raw, i = /* @__PURE__ */ F(r), a = /* @__PURE__ */ F(n); + e || (D(n, a) && N(i, "get", n), N(i, "get", a)); + let { has: o } = bt(i), s = t ? yt : e ? Ht : I; if (o.call(i, n)) return s(r.get(n)); if (o.call(i, a)) return s(r.get(a)); r !== i && r.get(n); }, get size() { let t = this.__v_raw; - return !e && F(/* @__PURE__ */ B(t), "iterate", We), t.size; + return !e && N(/* @__PURE__ */ F(t), "iterate", Xe), t.size; }, has(t) { - let n = this.__v_raw, r = /* @__PURE__ */ B(n), i = /* @__PURE__ */ B(t); - return e || (D(t, i) && F(r, "has", t), F(r, "has", i)), t === i ? n.has(t) : n.has(t) || n.has(i); + let n = this.__v_raw, r = /* @__PURE__ */ F(n), i = /* @__PURE__ */ F(t); + return e || (D(t, i) && N(r, "has", t), N(r, "has", i)), t === i ? n.has(t) : n.has(t) || n.has(i); }, forEach(n, r) { - let i = this, a = i.__v_raw, o = /* @__PURE__ */ B(a), s = t ? ut : e ? Pt : Nt; - return !e && F(o, "iterate", We), a.forEach((e, t) => n.call(r, s(e), s(t), i)); + let i = this, a = i.__v_raw, o = /* @__PURE__ */ F(a), s = t ? yt : e ? Ht : I; + return !e && N(o, "iterate", Xe), a.forEach((e, t) => n.call(r, s(e), s(t), i)); } }; return s(n, e ? { - add: pt("add"), - set: pt("set"), - delete: pt("delete"), - clear: pt("clear") + add: St("add"), + set: St("set"), + delete: St("delete"), + clear: St("clear") } : { add(e) { - let n = /* @__PURE__ */ B(this), r = dt(n), i = /* @__PURE__ */ B(e), a = !t && !/* @__PURE__ */ z(e) && !/* @__PURE__ */ At(e) ? i : e; - return r.has.call(n, a) || D(e, a) && r.has.call(n, e) || D(i, a) && r.has.call(n, i) || (n.add(a), I(n, "add", a, a)), this; + let n = /* @__PURE__ */ F(this), r = bt(n), i = /* @__PURE__ */ F(e), a = !t && !/* @__PURE__ */ P(e) && !/* @__PURE__ */ zt(e) ? i : e; + return r.has.call(n, a) || D(e, a) && r.has.call(n, e) || D(i, a) && r.has.call(n, i) || (n.add(a), $e(n, "add", a, a)), this; }, set(e, n) { - !t && !/* @__PURE__ */ z(n) && !/* @__PURE__ */ At(n) && (n = /* @__PURE__ */ B(n)); - let r = /* @__PURE__ */ B(this), { has: i, get: a } = dt(r), o = i.call(r, e); - o ||= (e = /* @__PURE__ */ B(e), i.call(r, e)); + !t && !/* @__PURE__ */ P(n) && !/* @__PURE__ */ zt(n) && (n = /* @__PURE__ */ F(n)); + let r = /* @__PURE__ */ F(this), { has: i, get: a } = bt(r), o = i.call(r, e); + o ||= (e = /* @__PURE__ */ F(e), i.call(r, e)); let s = a.call(r, e); - return r.set(e, n), o ? D(n, s) && I(r, "set", e, n, s) : I(r, "add", e, n), this; + return r.set(e, n), o ? D(n, s) && $e(r, "set", e, n, s) : $e(r, "add", e, n), this; }, delete(e) { - let t = /* @__PURE__ */ B(this), { has: n, get: r } = dt(t), i = n.call(t, e); - i ||= (e = /* @__PURE__ */ B(e), n.call(t, e)); + let t = /* @__PURE__ */ F(this), { has: n, get: r } = bt(t), i = n.call(t, e); + i ||= (e = /* @__PURE__ */ F(e), n.call(t, e)); let a = r ? r.call(t, e) : void 0, o = t.delete(e); - return i && I(t, "delete", e, void 0, a), o; + return i && $e(t, "delete", e, void 0, a), o; }, clear() { - let e = /* @__PURE__ */ B(this), t = e.size !== 0, n = e.clear(); - return t && I(e, "clear", void 0, void 0, void 0), n; + let e = /* @__PURE__ */ F(this), t = e.size !== 0, n = e.clear(); + return t && $e(e, "clear", void 0, void 0, void 0), n; } }), [ "keys", @@ -655,15 +653,15 @@ function mt(e, t) { "entries", Symbol.iterator ].forEach((r) => { - n[r] = ft(r, e, t); + n[r] = xt(r, e, t); }), n; } -function ht(e, t) { - let n = mt(e, t); +function wt(e, t) { + let n = Ct(e, t); return (t, r, i) => r === "__v_isReactive" ? !e : r === "__v_isReadonly" ? e : r === "__v_raw" ? t : Reflect.get(u(n, r) && r in t ? n : t, r, i); } -var gt = { get: /* @__PURE__ */ ht(!1, !1) }, _t = { get: /* @__PURE__ */ ht(!1, !0) }, vt = { get: /* @__PURE__ */ ht(!0, !1) }, yt = /* @__PURE__ */ new WeakMap(), bt = /* @__PURE__ */ new WeakMap(), xt = /* @__PURE__ */ new WeakMap(), St = /* @__PURE__ */ new WeakMap(); -function Ct(e) { +var Tt = { get: /* @__PURE__ */ wt(!1, !1) }, Et = { get: /* @__PURE__ */ wt(!1, !0) }, Dt = { get: /* @__PURE__ */ wt(!0, !1) }, Ot = /* @__PURE__ */ new WeakMap(), kt = /* @__PURE__ */ new WeakMap(), At = /* @__PURE__ */ new WeakMap(), jt = /* @__PURE__ */ new WeakMap(); +function Mt(e) { switch (e) { case "Object": case "Array": return 1; @@ -674,24 +672,24 @@ function Ct(e) { default: return 0; } } -function wt(e) { - return e.__v_skip || !Object.isExtensible(e) ? 0 : Ct(S(e)); +function Nt(e) { + return e.__v_skip || !Object.isExtensible(e) ? 0 : Mt(S(e)); } /* @__NO_SIDE_EFFECTS__ */ -function Tt(e) { - return /* @__PURE__ */ At(e) ? e : Ot(e, !1, st, gt, yt); +function Pt(e) { + return /* @__PURE__ */ zt(e) ? e : Lt(e, !1, gt, Tt, Ot); } /* @__NO_SIDE_EFFECTS__ */ -function Et(e) { - return Ot(e, !1, lt, _t, bt); +function Ft(e) { + return Lt(e, !1, vt, Et, kt); } /* @__NO_SIDE_EFFECTS__ */ -function Dt(e) { - return Ot(e, !0, ct, vt, xt); +function It(e) { + return Lt(e, !0, _t, Dt, At); } -function Ot(e, t, n, r, i) { +function Lt(e, t, n, r, i) { if (!v(e) || e.__v_raw && !(t && e.__v_isReactive)) return e; - let a = wt(e); + let a = Nt(e); if (a === 0) return e; let o = i.get(e); if (o) return o; @@ -699,101 +697,120 @@ function Ot(e, t, n, r, i) { return i.set(e, s), s; } /* @__NO_SIDE_EFFECTS__ */ -function kt(e) { - return /* @__PURE__ */ At(e) ? /* @__PURE__ */ kt(e.__v_raw) : !!(e && e.__v_isReactive); +function Rt(e) { + return /* @__PURE__ */ zt(e) ? /* @__PURE__ */ Rt(e.__v_raw) : !!(e && e.__v_isReactive); } /* @__NO_SIDE_EFFECTS__ */ -function At(e) { +function zt(e) { return !!(e && e.__v_isReadonly); } /* @__NO_SIDE_EFFECTS__ */ -function z(e) { +function P(e) { return !!(e && e.__v_isShallow); } /* @__NO_SIDE_EFFECTS__ */ -function jt(e) { +function Bt(e) { return e ? !!e.__v_raw : !1; } /* @__NO_SIDE_EFFECTS__ */ -function B(e) { +function F(e) { let t = e && e.__v_raw; - return t ? /* @__PURE__ */ B(t) : e; + return t ? /* @__PURE__ */ F(t) : e; } -function Mt(e) { +function Vt(e) { return !u(e, "__v_skip") && Object.isExtensible(e) && O(e, "__v_skip", !0), e; } -var Nt = (e) => v(e) ? /* @__PURE__ */ Tt(e) : e, Pt = (e) => v(e) ? /* @__PURE__ */ Dt(e) : e; +var I = (e) => v(e) ? /* @__PURE__ */ Pt(e) : e, Ht = (e) => v(e) ? /* @__PURE__ */ It(e) : e; /* @__NO_SIDE_EFFECTS__ */ -function V(e) { +function L(e) { return e ? e.__v_isRef === !0 : !1; } -function Ft(e) { - return /* @__PURE__ */ V(e) ? e.value : e; +/* @__NO_SIDE_EFFECTS__ */ +function Ut(e) { + return Wt(e, !1); } -var It = { - get: (e, t, n) => t === "__v_raw" ? e : Ft(Reflect.get(e, t, n)), +function Wt(e, t) { + return /* @__PURE__ */ L(e) ? e : new Gt(e, t); +} +var Gt = class { + constructor(e, t) { + this.dep = new qe(), this.__v_isRef = !0, this.__v_isShallow = !1, this._rawValue = t ? e : /* @__PURE__ */ F(e), this._value = t ? e : I(e), this.__v_isShallow = t; + } + get value() { + return this.dep.track(), this._value; + } + set value(e) { + let t = this._rawValue, n = this.__v_isShallow || /* @__PURE__ */ P(e) || /* @__PURE__ */ zt(e); + e = n ? e : /* @__PURE__ */ F(e), D(e, t) && (this._rawValue = e, this._value = n ? e : I(e), this.dep.trigger()); + } +}; +function Kt(e) { + return /* @__PURE__ */ L(e) ? e.value : e; +} +var qt = { + get: (e, t, n) => t === "__v_raw" ? e : Kt(Reflect.get(e, t, n)), set: (e, t, n, r) => { let i = e[t]; - return /* @__PURE__ */ V(i) && !/* @__PURE__ */ V(n) ? (i.value = n, !0) : Reflect.set(e, t, n, r); + return /* @__PURE__ */ L(i) && !/* @__PURE__ */ L(n) ? (i.value = n, !0) : Reflect.set(e, t, n, r); } }; -function Lt(e) { - return /* @__PURE__ */ kt(e) ? e : new Proxy(e, It); +function Jt(e) { + return /* @__PURE__ */ Rt(e) ? e : new Proxy(e, qt); } -var Rt = class { +var Yt = class { constructor(e, t, n) { - this.fn = e, this.setter = t, this._value = void 0, this.dep = new Ve(this), this.__v_isRef = !0, this.deps = void 0, this.depsTail = void 0, this.flags = 16, this.globalVersion = ze - 1, this.next = void 0, this.effect = this, this.__v_isReadonly = !t, this.isSSR = n; + this.fn = e, this.setter = t, this._value = void 0, this.dep = new qe(this), this.__v_isRef = !0, this.deps = void 0, this.depsTail = void 0, this.flags = 16, this.globalVersion = Ge - 1, this.next = void 0, this.effect = this, this.__v_isReadonly = !t, this.isSSR = n; } notify() { - if (this.flags |= 16, !(this.flags & 8) && j !== this) return Oe(this, !0), !0; + if (this.flags |= 16, !(this.flags & 8) && j !== this) return Me(this, !0), !0; } get value() { let e = this.dep.track(); - return Pe(this), e && (e.version = this.dep.version), this._value; + return Re(this), e && (e.version = this.dep.version), this._value; } set value(e) { this.setter && this.setter(e); } }; /* @__NO_SIDE_EFFECTS__ */ -function zt(e, t, n = !1) { +function Xt(e, t, n = !1) { let r, i; - return h(e) ? r = e : (r = e.get, i = e.set), new Rt(r, i, n); + return h(e) ? r = e : (r = e.get, i = e.set), new Yt(r, i, n); } -var Bt = {}, Vt = /* @__PURE__ */ new WeakMap(), Ht = void 0; -function Ut(e, t = !1, n = Ht) { +var Zt = {}, Qt = /* @__PURE__ */ new WeakMap(), $t = void 0; +function en(e, t = !1, n = $t) { if (n) { - let t = Vt.get(n); - t || Vt.set(n, t = []), t.push(e); + let t = Qt.get(n); + t || Qt.set(n, t = []), t.push(e); } } -function Wt(e, n, i = t) { - let { immediate: a, deep: o, once: s, scheduler: l, augmentJob: u, call: f } = i, p = (e) => o ? e : /* @__PURE__ */ z(e) || o === !1 || o === 0 ? Gt(e, 1) : Gt(e), m, g, _, v, y = !1, b = !1; - if (/* @__PURE__ */ V(e) ? (g = () => e.value, y = /* @__PURE__ */ z(e)) : /* @__PURE__ */ kt(e) ? (g = () => p(e), y = !0) : d(e) ? (b = !0, y = e.some((e) => /* @__PURE__ */ kt(e) || /* @__PURE__ */ z(e)), g = () => e.map((e) => { - if (/* @__PURE__ */ V(e)) return e.value; - if (/* @__PURE__ */ kt(e)) return p(e); +function tn(e, n, i = t) { + let { immediate: a, deep: o, once: s, scheduler: l, augmentJob: u, call: f } = i, p = (e) => o ? e : /* @__PURE__ */ P(e) || o === !1 || o === 0 ? nn(e, 1) : nn(e), m, g, _, v, y = !1, b = !1; + if (/* @__PURE__ */ L(e) ? (g = () => e.value, y = /* @__PURE__ */ P(e)) : /* @__PURE__ */ Rt(e) ? (g = () => p(e), y = !0) : d(e) ? (b = !0, y = e.some((e) => /* @__PURE__ */ Rt(e) || /* @__PURE__ */ P(e)), g = () => e.map((e) => { + if (/* @__PURE__ */ L(e)) return e.value; + if (/* @__PURE__ */ Rt(e)) return p(e); if (h(e)) return f ? f(e, 2) : e(); })) : g = h(e) ? n ? f ? () => f(e, 2) : e : () => { if (_) { - N(); + He(); try { _(); } finally { - P(); + Ue(); } } - let t = Ht; - Ht = m; + let t = $t; + $t = m; try { return f ? f(e, 3, [v]) : e(v); } finally { - Ht = t; + $t = t; } } : r, n && o) { let e = g, t = o === !0 ? Infinity : o; - g = () => Gt(e(), t); + g = () => nn(e(), t); } - let x = Se(), S = () => { + let x = Ee(), S = () => { m.stop(), x && x.active && c(x.effects, m); }; if (s && n) { @@ -802,71 +819,71 @@ function Wt(e, n, i = t) { e(...t), S(); }; } - let C = b ? Array(e.length).fill(Bt) : Bt, w = (e) => { + let C = b ? Array(e.length).fill(Zt) : Zt, w = (e) => { if (!(!(m.flags & 1) || !m.dirty && !e)) if (n) { let e = m.run(); if (o || y || (b ? e.some((e, t) => D(e, C[t])) : D(e, C))) { _ && _(); - let t = Ht; - Ht = m; + let t = $t; + $t = m; try { let t = [ e, - C === Bt ? void 0 : b && C[0] === Bt ? [] : C, + C === Zt ? void 0 : b && C[0] === Zt ? [] : C, v ]; C = e, f ? f(n, 3, t) : n(...t); } finally { - Ht = t; + $t = t; } } } else m.run(); }; - return u && u(w), m = new we(g), m.scheduler = l ? () => l(w, !1) : w, v = (e) => Ut(e, !1, m), _ = m.onStop = () => { - let e = Vt.get(m); + return u && u(w), m = new Oe(g), m.scheduler = l ? () => l(w, !1) : w, v = (e) => en(e, !1, m), _ = m.onStop = () => { + let e = Qt.get(m); if (e) { if (f) f(e, 4); else for (let t of e) t(); - Vt.delete(m); + Qt.delete(m); } }, n ? a ? w(!0) : C = m.run() : l ? l(w.bind(null, !0), !0) : m.run(), S.pause = m.pause.bind(m), S.resume = m.resume.bind(m), S.stop = S, S; } -function Gt(e, t = Infinity, n) { +function nn(e, t = Infinity, n) { if (t <= 0 || !v(e) || e.__v_skip || (n ||= /* @__PURE__ */ new Map(), (n.get(e) || 0) >= t)) return e; - if (n.set(e, t), t--, /* @__PURE__ */ V(e)) Gt(e.value, t, n); - else if (d(e)) for (let r = 0; r < e.length; r++) Gt(e[r], t, n); + if (n.set(e, t), t--, /* @__PURE__ */ L(e)) nn(e.value, t, n); + else if (d(e)) for (let r = 0; r < e.length; r++) nn(e[r], t, n); else if (p(e) || f(e)) e.forEach((e) => { - Gt(e, t, n); + nn(e, t, n); }); else if (C(e)) { - for (let r in e) Gt(e[r], t, n); - for (let r of Object.getOwnPropertySymbols(e)) Object.prototype.propertyIsEnumerable.call(e, r) && Gt(e[r], t, n); + for (let r in e) nn(e[r], t, n); + for (let r of Object.getOwnPropertySymbols(e)) Object.prototype.propertyIsEnumerable.call(e, r) && nn(e[r], t, n); } return e; } //#endregion //#region node_modules/.bun/@vue+runtime-core@3.5.34/node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js -function Kt(e, t, n, r) { +function rn(e, t, n, r) { try { return r ? e(...r) : e(); } catch (e) { - qt(e, t, n); + on(e, t, n); } } -function H(e, t, n, r) { +function an(e, t, n, r) { if (h(e)) { - let i = Kt(e, t, n, r); + let i = rn(e, t, n, r); return i && y(i) && i.catch((e) => { - qt(e, t, n); + on(e, t, n); }), i; } if (d(e)) { let i = []; - for (let a = 0; a < e.length; a++) i.push(H(e[a], t, n, r)); + for (let a = 0; a < e.length; a++) i.push(an(e[a], t, n, r)); return i; } } -function qt(e, n, r, i = !0) { +function on(e, n, r, i = !0) { let a = n ? n.vnode : null, { errorHandler: o, throwUnhandledErrorInProduction: s } = n && n.appContext.config || t; if (n) { let t = n.parent, i = n.proxy, a = `https://vuejs.org/error-reference/#runtime-${r}`; @@ -878,165 +895,165 @@ function qt(e, n, r, i = !0) { t = t.parent; } if (o) { - N(), Kt(o, null, 10, [ + He(), rn(o, null, 10, [ e, i, a - ]), P(); + ]), Ue(); return; } } - Jt(e, r, a, i, s); + sn(e, r, a, i, s); } -function Jt(e, t, n, r = !0, i = !1) { +function sn(e, t, n, r = !0, i = !1) { if (i) throw e; console.error(e); } -var U = [], W = -1, Yt = [], Xt = null, Zt = 0, Qt = /* @__PURE__ */ Promise.resolve(), $t = null; -function en(e) { - let t = $t || Qt; +var R = [], cn = -1, ln = [], un = null, dn = 0, fn = /* @__PURE__ */ Promise.resolve(), pn = null; +function mn(e) { + let t = pn || fn; return e ? t.then(this ? e.bind(this) : e) : t; } -function tn(e) { - let t = W + 1, n = U.length; +function hn(e) { + let t = cn + 1, n = R.length; for (; t < n;) { - let r = t + n >>> 1, i = U[r], a = cn(i); + let r = t + n >>> 1, i = R[r], a = xn(i); a < e || a === e && i.flags & 2 ? t = r + 1 : n = r; } return t; } -function nn(e) { +function gn(e) { if (!(e.flags & 1)) { - let t = cn(e), n = U[U.length - 1]; - !n || !(e.flags & 2) && t >= cn(n) ? U.push(e) : U.splice(tn(t), 0, e), e.flags |= 1, rn(); + let t = xn(e), n = R[R.length - 1]; + !n || !(e.flags & 2) && t >= xn(n) ? R.push(e) : R.splice(hn(t), 0, e), e.flags |= 1, _n(); } } -function rn() { - $t ||= Qt.then(ln); +function _n() { + pn ||= fn.then(Sn); } -function an(e) { - d(e) ? Yt.push(...e) : Xt && e.id === -1 ? Xt.splice(Zt + 1, 0, e) : e.flags & 1 || (Yt.push(e), e.flags |= 1), rn(); +function vn(e) { + d(e) ? ln.push(...e) : un && e.id === -1 ? un.splice(dn + 1, 0, e) : e.flags & 1 || (ln.push(e), e.flags |= 1), _n(); } -function on(e, t, n = W + 1) { - for (; n < U.length; n++) { - let t = U[n]; +function yn(e, t, n = cn + 1) { + for (; n < R.length; n++) { + let t = R[n]; if (t && t.flags & 2) { if (e && t.id !== e.uid) continue; - U.splice(n, 1), n--, t.flags & 4 && (t.flags &= -2), t(), t.flags & 4 || (t.flags &= -2); + R.splice(n, 1), n--, t.flags & 4 && (t.flags &= -2), t(), t.flags & 4 || (t.flags &= -2); } } } -function sn(e) { - if (Yt.length) { - let e = [...new Set(Yt)].sort((e, t) => cn(e) - cn(t)); - if (Yt.length = 0, Xt) { - Xt.push(...e); +function bn(e) { + if (ln.length) { + let e = [...new Set(ln)].sort((e, t) => xn(e) - xn(t)); + if (ln.length = 0, un) { + un.push(...e); return; } - for (Xt = e, Zt = 0; Zt < Xt.length; Zt++) { - let e = Xt[Zt]; + for (un = e, dn = 0; dn < un.length; dn++) { + let e = un[dn]; e.flags & 4 && (e.flags &= -2), e.flags & 8 || e(), e.flags &= -2; } - Xt = null, Zt = 0; + un = null, dn = 0; } } -var cn = (e) => e.id == null ? e.flags & 2 ? -1 : Infinity : e.id; -function ln(e) { +var xn = (e) => e.id == null ? e.flags & 2 ? -1 : Infinity : e.id; +function Sn(e) { try { - for (W = 0; W < U.length; W++) { - let e = U[W]; - e && !(e.flags & 8) && (e.flags & 4 && (e.flags &= -2), Kt(e, e.i, e.i ? 15 : 14), e.flags & 4 || (e.flags &= -2)); + for (cn = 0; cn < R.length; cn++) { + let e = R[cn]; + e && !(e.flags & 8) && (e.flags & 4 && (e.flags &= -2), rn(e, e.i, e.i ? 15 : 14), e.flags & 4 || (e.flags &= -2)); } } finally { - for (; W < U.length; W++) { - let e = U[W]; + for (; cn < R.length; cn++) { + let e = R[cn]; e && (e.flags &= -2); } - W = -1, U.length = 0, sn(e), $t = null, (U.length || Yt.length) && ln(e); + cn = -1, R.length = 0, bn(e), pn = null, (R.length || ln.length) && Sn(e); } } -var G = null, un = null; -function dn(e) { - let t = G; - return G = e, un = e && e.type.__scopeId || null, t; +var z = null, Cn = null; +function wn(e) { + let t = z; + return z = e, Cn = e && e.type.__scopeId || null, t; } -function fn(e, t = G, n) { +function Tn(e, t = z, n) { if (!t || e._n) return e; let r = (...n) => { - r._d && mi(-1); - let i = dn(t), a; + r._d && Oi(-1); + let i = wn(t), a; try { a = e(...n); } finally { - dn(i), r._d && mi(1); + wn(i), r._d && Oi(1); } return a; }; return r._n = !0, r._c = !0, r._d = !0, r; } -function pn(e, t, n, r) { +function En(e, t, n, r) { let i = e.dirs, a = t && t.dirs; for (let o = 0; o < i.length; o++) { let s = i[o]; a && (s.oldValue = a[o].value); let c = s.dir[r]; - c && (N(), H(c, n, 8, [ + c && (He(), an(c, n, 8, [ e.el, s, e, t - ]), P()); + ]), Ue()); } } -function mn(e, t) { - if ($) { - let n = $.provides, r = $.parent && $.parent.provides; - r === n && (n = $.provides = Object.create(r)), n[e] = t; +function Dn(e, t) { + if (q) { + let n = q.provides, r = q.parent && q.parent.provides; + r === n && (n = q.provides = Object.create(r)), n[e] = t; } } -function hn(e, t, n = !1) { - let r = Ni(); - if (r || vr) { - let i = vr ? vr._context.provides : r ? r.parent == null || r.ce ? r.vnode.appContext && r.vnode.appContext.provides : r.parent.provides : void 0; +function On(e, t, n = !1) { + let r = Yi(); + if (r || Nr) { + let i = Nr ? Nr._context.provides : r ? r.parent == null || r.ce ? r.vnode.appContext && r.vnode.appContext.provides : r.parent.provides : void 0; if (i && e in i) return i[e]; if (arguments.length > 1) return n && h(t) ? t.call(r && r.proxy) : t; } } -var gn = /* @__PURE__ */ Symbol.for("v-scx"), _n = () => hn(gn); -function vn(e, t, n) { - return yn(e, t, n); +var kn = /* @__PURE__ */ Symbol.for("v-scx"), An = () => On(kn); +function jn(e, t, n) { + return Mn(e, t, n); } -function yn(e, n, i = t) { +function Mn(e, n, i = t) { let { immediate: a, deep: o, flush: c, once: l } = i, u = s({}, i), d = n && a || !n && c !== "post", f; - if (zi) { + if (ta) { if (c === "sync") { - let e = _n(); + let e = An(); f = e.__watcherHandles ||= []; } else if (!d) { let e = () => {}; return e.stop = r, e.resume = r, e.pause = r, e; } } - let p = $; - u.call = (e, t, n) => H(e, p, t, n); + let p = q; + u.call = (e, t, n) => an(e, p, t, n); let m = !1; c === "post" ? u.scheduler = (e) => { - J(e, p && p.suspense); + V(e, p && p.suspense); } : c !== "sync" && (m = !0, u.scheduler = (e, t) => { - t ? e() : nn(e); + t ? e() : gn(e); }), u.augmentJob = (e) => { n && (e.flags |= 4), m && (e.flags |= 2, p && (e.id = p.uid, e.i = p)); }; - let h = Wt(e, n, u); - return zi && (f ? f.push(h) : d && h()), h; + let h = tn(e, n, u); + return ta && (f ? f.push(h) : d && h()), h; } -function bn(e, t, n) { - let r = this.proxy, i = g(e) ? e.includes(".") ? xn(r, e) : () => r[e] : e.bind(r, r), a; +function Nn(e, t, n) { + let r = this.proxy, i = g(e) ? e.includes(".") ? Pn(r, e) : () => r[e] : e.bind(r, r), a; h(t) ? a = t : (a = t.handler, n = t); - let o = Ii(this), s = yn(i, a.bind(r), n); + let o = Qi(this), s = Mn(i, a.bind(r), n); return o(), s; } -function xn(e, t) { +function Pn(e, t) { let n = t.split("."); return () => { let t = e; @@ -1044,46 +1061,46 @@ function xn(e, t) { return t; }; } -var Sn = /* @__PURE__ */ Symbol("_vte"), Cn = (e) => e.__isTeleport, wn = /* @__PURE__ */ Symbol("_leaveCb"); -function Tn(e, t) { - e.shapeFlag & 6 && e.component ? (e.transition = t, Tn(e.component.subTree, t)) : e.shapeFlag & 128 ? (e.ssContent.transition = t.clone(e.ssContent), e.ssFallback.transition = t.clone(e.ssFallback)) : e.transition = t; +var Fn = /* @__PURE__ */ Symbol("_vte"), In = (e) => e.__isTeleport, Ln = /* @__PURE__ */ Symbol("_leaveCb"); +function Rn(e, t) { + e.shapeFlag & 6 && e.component ? (e.transition = t, Rn(e.component.subTree, t)) : e.shapeFlag & 128 ? (e.ssContent.transition = t.clone(e.ssContent), e.ssFallback.transition = t.clone(e.ssFallback)) : e.transition = t; } /* @__NO_SIDE_EFFECTS__ */ -function En(e, t) { +function zn(e, t) { return h(e) ? s({ name: e.name }, t, { setup: e }) : e; } -function Dn(e) { +function Bn(e) { e.ids = [ e.ids[0] + e.ids[2]++ + "-", 0, 0 ]; } -function On(e, t) { +function Vn(e, t) { let n; return !!((n = Object.getOwnPropertyDescriptor(e, t)) && !n.configurable); } -var kn = /* @__PURE__ */ new WeakMap(); -function An(e, n, r, a, o = !1) { +var Hn = /* @__PURE__ */ new WeakMap(); +function Un(e, n, r, a, o = !1) { if (d(e)) { - e.forEach((e, t) => An(e, n && (d(n) ? n[t] : n), r, a, o)); + e.forEach((e, t) => Un(e, n && (d(n) ? n[t] : n), r, a, o)); return; } - if (Mn(a) && !o) { - a.shapeFlag & 512 && a.type.__asyncResolved && a.component.subTree.component && An(e, n, r, a.component.subTree); + if (Gn(a) && !o) { + a.shapeFlag & 512 && a.type.__asyncResolved && a.component.subTree.component && Un(e, n, r, a.component.subTree); return; } - let s = a.shapeFlag & 4 ? Ji(a.component) : a.el, l = o ? null : s, { i: f, r: p } = e, m = n && n.r, _ = f.refs === t ? f.refs = {} : f.refs, v = f.setupState, y = /* @__PURE__ */ B(v), b = v === t ? i : (e) => On(_, e) ? !1 : u(y, e), x = (e, t) => !(t && On(_, t)); + let s = a.shapeFlag & 4 ? ua(a.component) : a.el, l = o ? null : s, { i: f, r: p } = e, m = n && n.r, _ = f.refs === t ? f.refs = {} : f.refs, v = f.setupState, y = /* @__PURE__ */ F(v), b = v === t ? i : (e) => Vn(_, e) ? !1 : u(y, e), x = (e, t) => !(t && Vn(_, t)); if (m != null && m !== p) { - if (jn(n), g(m)) _[m] = null, b(m) && (v[m] = null); - else if (/* @__PURE__ */ V(m)) { + if (Wn(n), g(m)) _[m] = null, b(m) && (v[m] = null); + else if (/* @__PURE__ */ L(m)) { let e = n; x(m, e.k) && (m.value = null), e.k && (_[e.k] = null); } } - if (h(p)) Kt(p, f, 12, [l, _]); + if (h(p)) rn(p, f, 12, [l, _]); else { - let t = g(p), n = /* @__PURE__ */ V(p); + let t = g(p), n = /* @__PURE__ */ L(p); if (t || n) { let i = () => { if (e.f) { @@ -1099,26 +1116,26 @@ function An(e, n, r, a, o = !1) { }; if (l) { let t = () => { - i(), kn.delete(e); + i(), Hn.delete(e); }; - t.id = -1, kn.set(e, t), J(t, r); - } else jn(e), i(); + t.id = -1, Hn.set(e, t), V(t, r); + } else Wn(e), i(); } } } -function jn(e) { - let t = kn.get(e); - t && (t.flags |= 8, kn.delete(e)); +function Wn(e) { + let t = Hn.get(e); + t && (t.flags |= 8, Hn.delete(e)); } ue().requestIdleCallback, ue().cancelIdleCallback; -var Mn = (e) => !!e.type.__asyncLoader, Nn = (e) => e.type.__isKeepAlive; -function Pn(e, t) { - In(e, "a", t); +var Gn = (e) => !!e.type.__asyncLoader, Kn = (e) => e.type.__isKeepAlive; +function qn(e, t) { + Yn(e, "a", t); } -function Fn(e, t) { - In(e, "da", t); +function Jn(e, t) { + Yn(e, "da", t); } -function In(e, t, n = $) { +function Yn(e, t, n = q) { let r = e.__wdc ||= () => { let t = n; for (; t;) { @@ -1127,34 +1144,56 @@ function In(e, t, n = $) { } return e(); }; - if (Rn(t, r, n), n) { + if (Zn(t, r, n), n) { let e = n.parent; - for (; e && e.parent;) Nn(e.parent.vnode) && Ln(r, t, n, e), e = e.parent; + for (; e && e.parent;) Kn(e.parent.vnode) && Xn(r, t, n, e), e = e.parent; } } -function Ln(e, t, n, r) { - let i = Rn(t, e, r, !0); - Wn(() => { +function Xn(e, t, n, r) { + let i = Zn(t, e, r, !0); + ir(() => { c(r[t], i); }, n); } -function Rn(e, t, n = $, r = !1) { +function Zn(e, t, n = q, r = !1) { if (n) { let i = n[e] || (n[e] = []), a = t.__weh ||= (...r) => { - N(); - let i = Ii(n), a = H(t, n, e, r); - return i(), P(), a; + He(); + let i = Qi(n), a = an(t, n, e, r); + return i(), Ue(), a; }; return r ? i.unshift(a) : i.push(a), a; } } -var K = (e) => (t, n = $) => { - (!zi || e === "sp") && Rn(e, (...e) => t(...e), n); -}, zn = K("bm"), Bn = K("m"), Vn = K("bu"), Hn = K("u"), Un = K("bum"), Wn = K("um"), Gn = K("sp"), Kn = K("rtg"), qn = K("rtc"); -function Jn(e, t = $) { - Rn("ec", e, t); +var Qn = (e) => (t, n = q) => { + (!ta || e === "sp") && Zn(e, (...e) => t(...e), n); +}, $n = Qn("bm"), er = Qn("m"), tr = Qn("bu"), nr = Qn("u"), rr = Qn("bum"), ir = Qn("um"), ar = Qn("sp"), or = Qn("rtg"), sr = Qn("rtc"); +function cr(e, t = q) { + Zn("ec", e, t); +} +var lr = /* @__PURE__ */ Symbol.for("v-ndc"); +function ur(e, t, n, r) { + let i, a = n && n[r], o = d(e); + if (o || g(e)) { + let n = o && /* @__PURE__ */ Rt(e), r = !1, s = !1; + n && (r = !/* @__PURE__ */ P(e), s = /* @__PURE__ */ zt(e), e = tt(e)), i = Array(e.length); + for (let n = 0, o = e.length; n < o; n++) i[n] = t(r ? s ? Ht(I(e[n])) : I(e[n]) : e[n], n, void 0, a && a[n]); + } else if (typeof e == "number") { + i = Array(e); + for (let n = 0; n < e; n++) i[n] = t(n + 1, n, void 0, a && a[n]); + } else if (v(e)) if (e[Symbol.iterator]) i = Array.from(e, (e, n) => t(e, n, void 0, a && a[n])); + else { + let n = Object.keys(e); + i = Array(n.length); + for (let r = 0, o = n.length; r < o; r++) { + let o = n[r]; + i[r] = t(e[o], o, r, a && a[r]); + } + } + else i = []; + return n && (n[r] = i), i; } -var Yn = /* @__PURE__ */ Symbol.for("v-ndc"), Xn = (e) => e ? Ri(e) ? Ji(e) : Xn(e.parent) : null, Zn = /* @__PURE__ */ s(/* @__PURE__ */ Object.create(null), { +var dr = (e) => e ? ea(e) ? ua(e) : dr(e.parent) : null, fr = /* @__PURE__ */ s(/* @__PURE__ */ Object.create(null), { $: (e) => e, $el: (e) => e.vnode.el, $data: (e) => e.data, @@ -1162,17 +1201,17 @@ var Yn = /* @__PURE__ */ Symbol.for("v-ndc"), Xn = (e) => e ? Ri(e) ? Ji(e) : Xn $attrs: (e) => e.attrs, $slots: (e) => e.slots, $refs: (e) => e.refs, - $parent: (e) => Xn(e.parent), - $root: (e) => Xn(e.root), + $parent: (e) => dr(e.parent), + $root: (e) => dr(e.root), $host: (e) => e.ce, $emit: (e) => e.emit, - $options: (e) => or(e), + $options: (e) => xr(e), $forceUpdate: (e) => e.f ||= () => { - nn(e.update); + gn(e.update); }, - $nextTick: (e) => e.n ||= en.bind(e.proxy), - $watch: (e) => bn.bind(e) -}), Qn = (e, n) => e !== t && !e.__isScriptSetup && u(e, n), $n = { + $nextTick: (e) => e.n ||= mn.bind(e.proxy), + $watch: (e) => Nn.bind(e) +}), pr = (e, n) => e !== t && !e.__isScriptSetup && u(e, n), mr = { get({ _: e }, n) { if (n === "__v_skip") return !0; let { ctx: r, setupState: i, data: a, props: o, accessCache: s, type: c, appContext: l } = e; @@ -1184,48 +1223,48 @@ var Yn = /* @__PURE__ */ Symbol.for("v-ndc"), Xn = (e) => e ? Ri(e) ? Ji(e) : Xn case 4: return r[n]; case 3: return o[n]; } - else if (Qn(i, n)) return s[n] = 1, i[n]; + else if (pr(i, n)) return s[n] = 1, i[n]; else if (a !== t && u(a, n)) return s[n] = 2, a[n]; else if (u(o, n)) return s[n] = 3, o[n]; else if (r !== t && u(r, n)) return s[n] = 4, r[n]; - else tr && (s[n] = 0); + else gr && (s[n] = 0); } - let d = Zn[n], f, p; - if (d) return n === "$attrs" && F(e.attrs, "get", ""), d(e); + let d = fr[n], f, p; + if (d) return n === "$attrs" && N(e.attrs, "get", ""), d(e); if ((f = c.__cssModules) && (f = f[n])) return f; if (r !== t && u(r, n)) return s[n] = 4, r[n]; if (p = l.config.globalProperties, u(p, n)) return p[n]; }, set({ _: e }, n, r) { let { data: i, setupState: a, ctx: o } = e; - return Qn(a, n) ? (a[n] = r, !0) : i !== t && u(i, n) ? (i[n] = r, !0) : u(e.props, n) || n[0] === "$" && n.slice(1) in e ? !1 : (o[n] = r, !0); + return pr(a, n) ? (a[n] = r, !0) : i !== t && u(i, n) ? (i[n] = r, !0) : u(e.props, n) || n[0] === "$" && n.slice(1) in e ? !1 : (o[n] = r, !0); }, has({ _: { data: e, setupState: n, accessCache: r, ctx: i, appContext: a, props: o, type: s } }, c) { let l; - return !!(r[c] || e !== t && c[0] !== "$" && u(e, c) || Qn(n, c) || u(o, c) || u(i, c) || u(Zn, c) || u(a.config.globalProperties, c) || (l = s.__cssModules) && l[c]); + return !!(r[c] || e !== t && c[0] !== "$" && u(e, c) || pr(n, c) || u(o, c) || u(i, c) || u(fr, c) || u(a.config.globalProperties, c) || (l = s.__cssModules) && l[c]); }, defineProperty(e, t, n) { return n.get == null ? u(n, "value") && this.set(e, t, n.value, null) : e._.accessCache[t] = 0, Reflect.defineProperty(e, t, n); } }; -function er(e) { +function hr(e) { return d(e) ? e.reduce((e, t) => (e[t] = null, e), {}) : e; } -var tr = !0; -function nr(e) { - let t = or(e), n = e.proxy, i = e.ctx; - tr = !1, t.beforeCreate && ir(t.beforeCreate, e, "bc"); +var gr = !0; +function _r(e) { + let t = xr(e), n = e.proxy, i = e.ctx; + gr = !1, t.beforeCreate && yr(t.beforeCreate, e, "bc"); let { data: a, computed: o, methods: s, watch: c, provide: l, inject: u, created: f, beforeMount: p, mounted: m, beforeUpdate: g, updated: _, activated: y, deactivated: b, beforeDestroy: x, beforeUnmount: S, destroyed: C, unmounted: w, render: ee, renderTracked: te, renderTriggered: ne, errorCaptured: T, serverPrefetch: re, expose: E, inheritAttrs: ie, components: ae, directives: D, filters: oe } = t; - if (u && rr(u, i, null), s) for (let e in s) { + if (u && vr(u, i, null), s) for (let e in s) { let t = s[e]; h(t) && (i[e] = t.bind(n)); } if (a) { let t = a.call(n, n); - v(t) && (e.data = /* @__PURE__ */ Tt(t)); + v(t) && (e.data = /* @__PURE__ */ Pt(t)); } - if (tr = !0, o) for (let e in o) { - let t = o[e], a = Xi({ + if (gr = !0, o) for (let e in o) { + let t = o[e], a = J({ get: h(t) ? t.bind(n, n) : h(t.get) ? t.get.bind(n, n) : r, set: !h(t) && h(t.set) ? t.set.bind(n) : r }); @@ -1236,18 +1275,18 @@ function nr(e) { set: (e) => a.value = e }); } - if (c) for (let e in c) ar(c[e], i, n, e); + if (c) for (let e in c) br(c[e], i, n, e); if (l) { let e = h(l) ? l.call(n) : l; Reflect.ownKeys(e).forEach((t) => { - mn(t, e[t]); + Dn(t, e[t]); }); } - f && ir(f, e, "c"); + f && yr(f, e, "c"); function O(e, t) { d(t) ? t.forEach((t) => e(t.bind(n))) : t && e(t.bind(n)); } - if (O(zn, p), O(Bn, m), O(Vn, g), O(Hn, _), O(Pn, y), O(Fn, b), O(Jn, T), O(qn, te), O(Kn, ne), O(Un, S), O(Wn, w), O(Gn, re), d(E)) if (E.length) { + if (O($n, p), O(er, m), O(tr, g), O(nr, _), O(qn, y), O(Jn, b), O(cr, T), O(sr, te), O(or, ne), O(rr, S), O(ir, w), O(ar, re), d(E)) if (E.length) { let t = e.exposed ||= {}; E.forEach((e) => { Object.defineProperty(t, e, { @@ -1257,13 +1296,13 @@ function nr(e) { }); }); } else e.exposed ||= {}; - ee && e.render === r && (e.render = ee), ie != null && (e.inheritAttrs = ie), ae && (e.components = ae), D && (e.directives = D), re && Dn(e); + ee && e.render === r && (e.render = ee), ie != null && (e.inheritAttrs = ie), ae && (e.components = ae), D && (e.directives = D), re && Bn(e); } -function rr(e, t, n = r) { - d(e) && (e = dr(e)); +function vr(e, t, n = r) { + d(e) && (e = Er(e)); for (let n in e) { let r = e[n], i; - i = v(r) ? "default" in r ? hn(r.from || n, r.default, !0) : hn(r.from || n) : hn(r), /* @__PURE__ */ V(i) ? Object.defineProperty(t, n, { + i = v(r) ? "default" in r ? On(r.from || n, r.default, !0) : On(r.from || n) : On(r), /* @__PURE__ */ L(i) ? Object.defineProperty(t, n, { enumerable: !0, configurable: !0, get: () => i.value, @@ -1271,69 +1310,69 @@ function rr(e, t, n = r) { }) : t[n] = i; } } -function ir(e, t, n) { - H(d(e) ? e.map((e) => e.bind(t.proxy)) : e.bind(t.proxy), t, n); +function yr(e, t, n) { + an(d(e) ? e.map((e) => e.bind(t.proxy)) : e.bind(t.proxy), t, n); } -function ar(e, t, n, r) { - let i = r.includes(".") ? xn(n, r) : () => n[r]; +function br(e, t, n, r) { + let i = r.includes(".") ? Pn(n, r) : () => n[r]; if (g(e)) { let n = t[e]; - h(n) && vn(i, n); - } else if (h(e)) vn(i, e.bind(n)); - else if (v(e)) if (d(e)) e.forEach((e) => ar(e, t, n, r)); + h(n) && jn(i, n); + } else if (h(e)) jn(i, e.bind(n)); + else if (v(e)) if (d(e)) e.forEach((e) => br(e, t, n, r)); else { let r = h(e.handler) ? e.handler.bind(n) : t[e.handler]; - h(r) && vn(i, r, e); + h(r) && jn(i, r, e); } } -function or(e) { +function xr(e) { let t = e.type, { mixins: n, extends: r } = t, { mixins: i, optionsCache: a, config: { optionMergeStrategies: o } } = e.appContext, s = a.get(t), c; - return s ? c = s : !i.length && !n && !r ? c = t : (c = {}, i.length && i.forEach((e) => sr(c, e, o, !0)), sr(c, t, o)), v(t) && a.set(t, c), c; + return s ? c = s : !i.length && !n && !r ? c = t : (c = {}, i.length && i.forEach((e) => Sr(c, e, o, !0)), Sr(c, t, o)), v(t) && a.set(t, c), c; } -function sr(e, t, n, r = !1) { +function Sr(e, t, n, r = !1) { let { mixins: i, extends: a } = t; - a && sr(e, a, n, !0), i && i.forEach((t) => sr(e, t, n, !0)); + a && Sr(e, a, n, !0), i && i.forEach((t) => Sr(e, t, n, !0)); for (let i in t) if (!(r && i === "expose")) { - let r = cr[i] || n && n[i]; + let r = Cr[i] || n && n[i]; e[i] = r ? r(e[i], t[i]) : t[i]; } return e; } -var cr = { - data: lr, - props: pr, - emits: pr, - methods: fr, - computed: fr, - beforeCreate: q, - created: q, - beforeMount: q, - mounted: q, - beforeUpdate: q, - updated: q, - beforeDestroy: q, - beforeUnmount: q, - destroyed: q, - unmounted: q, - activated: q, - deactivated: q, - errorCaptured: q, - serverPrefetch: q, - components: fr, - directives: fr, - watch: mr, - provide: lr, - inject: ur +var Cr = { + data: wr, + props: Or, + emits: Or, + methods: Dr, + computed: Dr, + beforeCreate: B, + created: B, + beforeMount: B, + mounted: B, + beforeUpdate: B, + updated: B, + beforeDestroy: B, + beforeUnmount: B, + destroyed: B, + unmounted: B, + activated: B, + deactivated: B, + errorCaptured: B, + serverPrefetch: B, + components: Dr, + directives: Dr, + watch: kr, + provide: wr, + inject: Tr }; -function lr(e, t) { +function wr(e, t) { return t ? e ? function() { return s(h(e) ? e.call(this, this) : e, h(t) ? t.call(this, this) : t); } : t : e; } -function ur(e, t) { - return fr(dr(e), dr(t)); +function Tr(e, t) { + return Dr(Er(e), Er(t)); } -function dr(e) { +function Er(e) { if (d(e)) { let t = {}; for (let n = 0; n < e.length; n++) t[e[n]] = e[n]; @@ -1341,23 +1380,23 @@ function dr(e) { } return e; } -function q(e, t) { +function B(e, t) { return e ? [...new Set([].concat(e, t))] : t; } -function fr(e, t) { +function Dr(e, t) { return e ? s(/* @__PURE__ */ Object.create(null), e, t) : t; } -function pr(e, t) { - return e ? d(e) && d(t) ? [.../* @__PURE__ */ new Set([...e, ...t])] : s(/* @__PURE__ */ Object.create(null), er(e), er(t ?? {})) : t; +function Or(e, t) { + return e ? d(e) && d(t) ? [.../* @__PURE__ */ new Set([...e, ...t])] : s(/* @__PURE__ */ Object.create(null), hr(e), hr(t ?? {})) : t; } -function mr(e, t) { +function kr(e, t) { if (!e) return t; if (!t) return e; let n = s(/* @__PURE__ */ Object.create(null), e); - for (let r in t) n[r] = q(e[r], t[r]); + for (let r in t) n[r] = B(e[r], t[r]); return n; } -function hr() { +function Ar() { return { app: null, config: { @@ -1378,18 +1417,18 @@ function hr() { emitsCache: /* @__PURE__ */ new WeakMap() }; } -var gr = 0; -function _r(e, t) { +var jr = 0; +function Mr(e, t) { return function(n, r = null) { h(n) || (n = s({}, n)), r != null && !v(r) && (r = null); - let i = hr(), a = /* @__PURE__ */ new WeakSet(), o = [], c = !1, l = i.app = { - _uid: gr++, + let i = Ar(), a = /* @__PURE__ */ new WeakSet(), o = [], c = !1, l = i.app = { + _uid: jr++, _component: n, _props: r, _container: null, _context: i, _instance: null, - version: Zi, + version: fa, get config() { return i.config; }, @@ -1408,126 +1447,126 @@ function _r(e, t) { }, mount(a, o, s) { if (!c) { - let u = l._ceVNode || Si(n, r); - return u.appContext = i, s === !0 ? s = "svg" : s === !1 && (s = void 0), o && t ? t(u, a) : e(u, a, s), c = !0, l._container = a, a.__vue_app__ = l, Ji(u.component); + let u = l._ceVNode || Fi(n, r); + return u.appContext = i, s === !0 ? s = "svg" : s === !1 && (s = void 0), o && t ? t(u, a) : e(u, a, s), c = !0, l._container = a, a.__vue_app__ = l, ua(u.component); } }, onUnmount(e) { o.push(e); }, unmount() { - c && (H(o, l._instance, 16), e(null, l._container), delete l._container.__vue_app__); + c && (an(o, l._instance, 16), e(null, l._container), delete l._container.__vue_app__); }, provide(e, t) { return i.provides[e] = t, l; }, runWithContext(e) { - let t = vr; - vr = l; + let t = Nr; + Nr = l; try { return e(); } finally { - vr = t; + Nr = t; } } }; return l; }; } -var vr = null, yr = (e, t) => t === "modelValue" || t === "model-value" ? e.modelModifiers : e[`${t}Modifiers`] || e[`${T(t)}Modifiers`] || e[`${E(t)}Modifiers`]; -function br(e, n, ...r) { +var Nr = null, Pr = (e, t) => t === "modelValue" || t === "model-value" ? e.modelModifiers : e[`${t}Modifiers`] || e[`${T(t)}Modifiers`] || e[`${E(t)}Modifiers`]; +function Fr(e, n, ...r) { if (e.isUnmounted) return; - let i = e.vnode.props || t, a = r, o = n.startsWith("update:"), s = o && yr(i, n.slice(7)); + let i = e.vnode.props || t, a = r, o = n.startsWith("update:"), s = o && Pr(i, n.slice(7)); s && (s.trim && (a = r.map((e) => g(e) ? e.trim() : e)), s.number && (a = r.map(se))); let c, l = i[c = ae(n)] || i[c = ae(T(n))]; - !l && o && (l = i[c = ae(E(n))]), l && H(l, e, 6, a); + !l && o && (l = i[c = ae(E(n))]), l && an(l, e, 6, a); let u = i[c + "Once"]; if (u) { if (!e.emitted) e.emitted = {}; else if (e.emitted[c]) return; - e.emitted[c] = !0, H(u, e, 6, a); + e.emitted[c] = !0, an(u, e, 6, a); } } -var xr = /* @__PURE__ */ new WeakMap(); -function Sr(e, t, n = !1) { - let r = n ? xr : t.emitsCache, i = r.get(e); +var Ir = /* @__PURE__ */ new WeakMap(); +function Lr(e, t, n = !1) { + let r = n ? Ir : t.emitsCache, i = r.get(e); if (i !== void 0) return i; let a = e.emits, o = {}, c = !1; if (!h(e)) { let r = (e) => { - let n = Sr(e, t, !0); + let n = Lr(e, t, !0); n && (c = !0, s(o, n)); }; !n && t.mixins.length && t.mixins.forEach(r), e.extends && r(e.extends), e.mixins && e.mixins.forEach(r); } return !a && !c ? (v(e) && r.set(e, null), null) : (d(a) ? a.forEach((e) => o[e] = null) : s(o, a), v(e) && r.set(e, o), o); } -function Cr(e, t) { +function Rr(e, t) { return !e || !a(t) ? !1 : (t = t.slice(2).replace(/Once$/, ""), u(e, t[0].toLowerCase() + t.slice(1)) || u(e, E(t)) || u(e, t)); } -function wr(e) { - let { type: t, vnode: n, proxy: r, withProxy: i, propsOptions: [a], slots: s, attrs: c, emit: l, render: u, renderCache: d, props: f, data: p, setupState: m, ctx: h, inheritAttrs: g } = e, _ = dn(e), v, y; +function zr(e) { + let { type: t, vnode: n, proxy: r, withProxy: i, propsOptions: [a], slots: s, attrs: c, emit: l, render: u, renderCache: d, props: f, data: p, setupState: m, ctx: h, inheritAttrs: g } = e, _ = wn(e), v, y; try { if (n.shapeFlag & 4) { let e = i || r, t = e; - v = Z(u.call(t, e, d, f, m, p, h)), y = c; + v = Vi(u.call(t, e, d, f, m, p, h)), y = c; } else { let e = t; - v = Z(e.length > 1 ? e(f, { + v = Vi(e.length > 1 ? e(f, { attrs: c, slots: s, emit: l - }) : e(f, null)), y = t.props ? c : Tr(c); + }) : e(f, null)), y = t.props ? c : Br(c); } } catch (t) { - ui.length = 0, qt(t, e, 1), v = Si(ci); + Ti.length = 0, on(t, e, 1), v = Fi(Ci); } let b = v; if (y && g !== !1) { let e = Object.keys(y), { shapeFlag: t } = b; - e.length && t & 7 && (a && e.some(o) && (y = Er(y, a)), b = Ti(b, y, !1, !0)); + e.length && t & 7 && (a && e.some(o) && (y = Vr(y, a)), b = Ri(b, y, !1, !0)); } - return n.dirs && (b = Ti(b, null, !1, !0), b.dirs = b.dirs ? b.dirs.concat(n.dirs) : n.dirs), n.transition && Tn(b, n.transition), v = b, dn(_), v; + return n.dirs && (b = Ri(b, null, !1, !0), b.dirs = b.dirs ? b.dirs.concat(n.dirs) : n.dirs), n.transition && Rn(b, n.transition), v = b, wn(_), v; } -var Tr = (e) => { +var Br = (e) => { let t; for (let n in e) (n === "class" || n === "style" || a(n)) && ((t ||= {})[n] = e[n]); return t; -}, Er = (e, t) => { +}, Vr = (e, t) => { let n = {}; for (let r in e) (!o(r) || !(r.slice(9) in t)) && (n[r] = e[r]); return n; }; -function Dr(e, t, n) { +function Hr(e, t, n) { let { props: r, children: i, component: a } = e, { props: o, children: s, patchFlag: c } = t, l = a.emitsOptions; if (t.dirs || t.transition) return !0; if (n && c >= 0) { if (c & 1024) return !0; - if (c & 16) return r ? Or(r, o, l) : !!o; + if (c & 16) return r ? Ur(r, o, l) : !!o; if (c & 8) { let e = t.dynamicProps; for (let t = 0; t < e.length; t++) { let n = e[t]; - if (kr(o, r, n) && !Cr(l, n)) return !0; + if (Wr(o, r, n) && !Rr(l, n)) return !0; } } - } else return (i || s) && (!s || !s.$stable) ? !0 : r === o ? !1 : r ? o ? Or(r, o, l) : !0 : !!o; + } else return (i || s) && (!s || !s.$stable) ? !0 : r === o ? !1 : r ? o ? Ur(r, o, l) : !0 : !!o; return !1; } -function Or(e, t, n) { +function Ur(e, t, n) { let r = Object.keys(t); if (r.length !== Object.keys(e).length) return !0; for (let i = 0; i < r.length; i++) { let a = r[i]; - if (kr(t, e, a) && !Cr(n, a)) return !0; + if (Wr(t, e, a) && !Rr(n, a)) return !0; } return !1; } -function kr(e, t, n) { +function Wr(e, t, n) { let r = e[n], i = t[n]; - return n === "style" && v(r) && v(i) ? !be(r, i) : r !== i; + return n === "style" && v(r) && v(i) ? !xe(r, i) : r !== i; } -function Ar({ vnode: e, parent: t, suspense: n }, r) { +function Gr({ vnode: e, parent: t, suspense: n }, r) { for (; t;) { let n = t.subTree; if (n.suspense && n.suspense.activeBranch === e && (n.suspense.vnode.el = n.el = r, e = n), n === e) (e = t.vnode).el = r, t = t.parent; @@ -1535,55 +1574,55 @@ function Ar({ vnode: e, parent: t, suspense: n }, r) { } n && n.activeBranch === e && (n.vnode.el = r); } -var jr = {}, Mr = () => Object.create(jr), Nr = (e) => Object.getPrototypeOf(e) === jr; -function Pr(e, t, n, r = !1) { - let i = {}, a = Mr(); - e.propsDefaults = /* @__PURE__ */ Object.create(null), Ir(e, t, i, a); +var Kr = {}, qr = () => Object.create(Kr), Jr = (e) => Object.getPrototypeOf(e) === Kr; +function Yr(e, t, n, r = !1) { + let i = {}, a = qr(); + e.propsDefaults = /* @__PURE__ */ Object.create(null), Zr(e, t, i, a); for (let t in e.propsOptions[0]) t in i || (i[t] = void 0); - n ? e.props = r ? i : /* @__PURE__ */ Et(i) : e.type.props ? e.props = i : e.props = a, e.attrs = a; + n ? e.props = r ? i : /* @__PURE__ */ Ft(i) : e.type.props ? e.props = i : e.props = a, e.attrs = a; } -function Fr(e, t, n, r) { - let { props: i, attrs: a, vnode: { patchFlag: o } } = e, s = /* @__PURE__ */ B(i), [c] = e.propsOptions, l = !1; +function Xr(e, t, n, r) { + let { props: i, attrs: a, vnode: { patchFlag: o } } = e, s = /* @__PURE__ */ F(i), [c] = e.propsOptions, l = !1; if ((r || o > 0) && !(o & 16)) { if (o & 8) { let n = e.vnode.dynamicProps; for (let r = 0; r < n.length; r++) { let o = n[r]; - if (Cr(e.emitsOptions, o)) continue; + if (Rr(e.emitsOptions, o)) continue; let d = t[o]; if (c) if (u(a, o)) d !== a[o] && (a[o] = d, l = !0); else { let t = T(o); - i[t] = Lr(c, s, t, d, e, !1); + i[t] = Qr(c, s, t, d, e, !1); } else d !== a[o] && (a[o] = d, l = !0); } } } else { - Ir(e, t, i, a) && (l = !0); + Zr(e, t, i, a) && (l = !0); let r; - for (let a in s) (!t || !u(t, a) && ((r = E(a)) === a || !u(t, r))) && (c ? n && (n[a] !== void 0 || n[r] !== void 0) && (i[a] = Lr(c, s, a, void 0, e, !0)) : delete i[a]); + for (let a in s) (!t || !u(t, a) && ((r = E(a)) === a || !u(t, r))) && (c ? n && (n[a] !== void 0 || n[r] !== void 0) && (i[a] = Qr(c, s, a, void 0, e, !0)) : delete i[a]); if (a !== s) for (let e in a) (!t || !u(t, e)) && (delete a[e], l = !0); } - l && I(e.attrs, "set", ""); + l && $e(e.attrs, "set", ""); } -function Ir(e, n, r, i) { +function Zr(e, n, r, i) { let [a, o] = e.propsOptions, s = !1, c; if (n) for (let t in n) { if (ee(t)) continue; let l = n[t], d; - a && u(a, d = T(t)) ? !o || !o.includes(d) ? r[d] = l : (c ||= {})[d] = l : Cr(e.emitsOptions, t) || (!(t in i) || l !== i[t]) && (i[t] = l, s = !0); + a && u(a, d = T(t)) ? !o || !o.includes(d) ? r[d] = l : (c ||= {})[d] = l : Rr(e.emitsOptions, t) || (!(t in i) || l !== i[t]) && (i[t] = l, s = !0); } if (o) { - let n = /* @__PURE__ */ B(r), i = c || t; + let n = /* @__PURE__ */ F(r), i = c || t; for (let t = 0; t < o.length; t++) { let s = o[t]; - r[s] = Lr(a, n, s, i[s], e, !u(i, s)); + r[s] = Qr(a, n, s, i[s], e, !u(i, s)); } } return s; } -function Lr(e, t, n, r, i, a) { +function Qr(e, t, n, r, i, a) { let o = e[n]; if (o != null) { let e = u(o, "default"); @@ -1593,7 +1632,7 @@ function Lr(e, t, n, r, i, a) { let { propsDefaults: a } = i; if (n in a) r = a[n]; else { - let o = Ii(i); + let o = Qi(i); r = a[n] = e.call(null, t), o(); } } else r = e; @@ -1603,15 +1642,15 @@ function Lr(e, t, n, r, i, a) { } return r; } -var Rr = /* @__PURE__ */ new WeakMap(); -function zr(e, r, i = !1) { - let a = i ? Rr : r.propsCache, o = a.get(e); +var $r = /* @__PURE__ */ new WeakMap(); +function ei(e, r, i = !1) { + let a = i ? $r : r.propsCache, o = a.get(e); if (o) return o; let c = e.props, l = {}, f = [], p = !1; if (!h(e)) { let t = (e) => { p = !0; - let [t, n] = zr(e, r, !0); + let [t, n] = ei(e, r, !0); s(l, t), n && f.push(...n); }; !i && r.mixins.length && r.mixins.forEach(t), e.extends && t(e.extends), e.mixins && e.mixins.forEach(t); @@ -1619,11 +1658,11 @@ function zr(e, r, i = !1) { if (!c && !p) return v(e) && a.set(e, n), n; if (d(c)) for (let e = 0; e < c.length; e++) { let n = T(c[e]); - Br(n) && (l[n] = t); + ti(n) && (l[n] = t); } else if (c) for (let e in c) { let t = T(e); - if (Br(t)) { + if (ti(t)) { let n = c[e], r = l[t] = d(n) || h(n) ? { type: n } : s({}, n), i = r.type, a = !1, o = !0; if (d(i)) for (let e = 0; e < i.length; ++e) { let t = i[e], n = h(t) && t.name; @@ -1639,69 +1678,69 @@ function zr(e, r, i = !1) { let m = [l, f]; return v(e) && a.set(e, m), m; } -function Br(e) { +function ti(e) { return e[0] !== "$" && !ee(e); } -var Vr = (e) => e === "_" || e === "_ctx" || e === "$stable", Hr = (e) => d(e) ? e.map(Z) : [Z(e)], Ur = (e, t, n) => { +var ni = (e) => e === "_" || e === "_ctx" || e === "$stable", ri = (e) => d(e) ? e.map(Vi) : [Vi(e)], ii = (e, t, n) => { if (t._n) return t; - let r = fn((...e) => Hr(t(...e)), n); + let r = Tn((...e) => ri(t(...e)), n); return r._c = !1, r; -}, Wr = (e, t, n) => { +}, ai = (e, t, n) => { let r = e._ctx; for (let n in e) { - if (Vr(n)) continue; + if (ni(n)) continue; let i = e[n]; - if (h(i)) t[n] = Ur(n, i, r); + if (h(i)) t[n] = ii(n, i, r); else if (i != null) { - let e = Hr(i); + let e = ri(i); t[n] = () => e; } } -}, Gr = (e, t) => { - let n = Hr(t); +}, oi = (e, t) => { + let n = ri(t); e.slots.default = () => n; -}, Kr = (e, t, n) => { - for (let r in t) (n || !Vr(r)) && (e[r] = t[r]); -}, qr = (e, t, n) => { - let r = e.slots = Mr(); +}, si = (e, t, n) => { + for (let r in t) (n || !ni(r)) && (e[r] = t[r]); +}, ci = (e, t, n) => { + let r = e.slots = qr(); if (e.vnode.shapeFlag & 32) { let e = t._; - e ? (Kr(r, t, n), n && O(r, "_", e, !0)) : Wr(t, r); - } else t && Gr(e, t); -}, Jr = (e, n, r) => { + e ? (si(r, t, n), n && O(r, "_", e, !0)) : ai(t, r); + } else t && oi(e, t); +}, li = (e, n, r) => { let { vnode: i, slots: a } = e, o = !0, s = t; if (i.shapeFlag & 32) { let e = n._; - e ? r && e === 1 ? o = !1 : Kr(a, n, r) : (o = !n.$stable, Wr(n, a)), s = n; - } else n && (Gr(e, n), s = { default: 1 }); - if (o) for (let e in a) !Vr(e) && s[e] == null && delete a[e]; -}, J = oi; -function Yr(e) { - return Xr(e); -} -function Xr(e, i) { + e ? r && e === 1 ? o = !1 : si(a, n, r) : (o = !n.$stable, ai(n, a)), s = n; + } else n && (oi(e, n), s = { default: 1 }); + if (o) for (let e in a) !ni(e) && s[e] == null && delete a[e]; +}, V = xi; +function ui(e) { + return di(e); +} +function di(e, i) { let a = ue(); a.__VUE__ = !0; let { insert: o, remove: s, patchProp: c, createElement: l, createText: u, createComment: d, setText: f, setElementText: p, parentNode: m, nextSibling: h, setScopeId: g = r, insertStaticContent: _ } = e, v = (e, t, n, r = null, i = null, a = null, o = void 0, s = null, c = !!t.dynamicChildren) => { if (e === t) return; - e && !vi(e, t) && (r = ye(e), k(e, i, a, !0), e = null), t.patchFlag === -2 && (c = !1, t.dynamicChildren = null); + e && !Mi(e, t) && (r = be(e), he(e, i, a, !0), e = null), t.patchFlag === -2 && (c = !1, t.dynamicChildren = null); let { type: l, ref: u, shapeFlag: d } = t; switch (l) { - case si: + case Si: y(e, t, n, r); break; - case ci: + case Ci: b(e, t, n, r); break; - case li: + case wi: e ?? x(t, n, r, o); break; - case Y: + case H: ae(e, t, n, r, i, a, o, s, c); break; - default: d & 1 ? w(e, t, n, r, i, a, o, s, c) : d & 6 ? D(e, t, n, r, i, a, o, s, c) : (d & 64 || d & 128) && l.process(e, t, n, r, i, a, o, s, c, xe); + default: d & 1 ? w(e, t, n, r, i, a, o, s, c) : d & 6 ? D(e, t, n, r, i, a, o, s, c) : (d & 64 || d & 128) && l.process(e, t, n, r, i, a, o, s, c, k); } - u != null && i ? An(u, e && e.ref, a, t || e, !t) : u == null && e && e.ref != null && An(e.ref, null, a, e, !0); + u != null && i ? Un(u, e && e.ref, a, t || e, !t) : u == null && e && e.ref != null && Un(e.ref, null, a, e, !0); }, y = (e, t, n, r) => { if (e == null) o(t.el = u(t.children), n, r); else { @@ -1732,33 +1771,33 @@ function Xr(e, i) { } }, te = (e, t, n, r, i, a, s, u) => { let d, f, { props: m, shapeFlag: h, transition: g, dirs: _ } = e; - if (d = e.el = l(e.type, a, m && m.is, m), h & 8 ? p(d, e.children) : h & 16 && T(e.children, d, null, r, i, Zr(e, a), s, u), _ && pn(e, null, r, "created"), ne(d, e, e.scopeId, s, r), m) { + if (d = e.el = l(e.type, a, m && m.is, m), h & 8 ? p(d, e.children) : h & 16 && T(e.children, d, null, r, i, fi(e, a), s, u), _ && En(e, null, r, "created"), ne(d, e, e.scopeId, s, r), m) { for (let e in m) e !== "value" && !ee(e) && c(d, e, null, m[e], a, r); - "value" in m && c(d, "value", null, m.value, a), (f = m.onVnodeBeforeMount) && Q(f, r, e); + "value" in m && c(d, "value", null, m.value, a), (f = m.onVnodeBeforeMount) && Gi(f, r, e); } - _ && pn(e, null, r, "beforeMount"); - let v = $r(i, g); - v && g.beforeEnter(d), o(d, t, n), ((f = m && m.onVnodeMounted) || v || _) && J(() => { + _ && En(e, null, r, "beforeMount"); + let v = mi(i, g); + v && g.beforeEnter(d), o(d, t, n), ((f = m && m.onVnodeMounted) || v || _) && V(() => { try { - f && Q(f, r, e), v && g.enter(d), _ && pn(e, null, r, "mounted"); + f && Gi(f, r, e), v && g.enter(d), _ && En(e, null, r, "mounted"); } finally {} }, i); }, ne = (e, t, n, r, i) => { if (n && g(e, n), r) for (let t = 0; t < r.length; t++) g(e, r[t]); if (i) { let n = i.subTree; - if (t === n || ai(n.type) && (n.ssContent === t || n.ssFallback === t)) { + if (t === n || bi(n.type) && (n.ssContent === t || n.ssFallback === t)) { let t = i.vnode; ne(e, t, t.scopeId, t.slotScopeIds, i.parent); } } }, T = (e, t, n, r, i, a, o, s, c = 0) => { - for (let l = c; l < e.length; l++) v(null, e[l] = s ? Di(e[l]) : Z(e[l]), t, n, r, i, a, o, s); + for (let l = c; l < e.length; l++) v(null, e[l] = s ? Hi(e[l]) : Vi(e[l]), t, n, r, i, a, o, s); }, re = (e, n, r, i, a, o, s) => { let l = n.el = e.el, { patchFlag: u, dynamicChildren: d, dirs: f } = n; u |= e.patchFlag & 16; let m = e.props || t, h = n.props || t, g; - if (r && Qr(r, !1), (g = h.onVnodeBeforeUpdate) && Q(g, r, n, e), f && pn(n, e, r, "beforeUpdate"), r && Qr(r, !0), (m.innerHTML && h.innerHTML == null || m.textContent && h.textContent == null) && p(l, ""), d ? E(e.dynamicChildren, d, l, r, i, Zr(n, a), o) : s || de(e, n, l, null, r, i, Zr(n, a), o, !1), u > 0) { + if (r && pi(r, !1), (g = h.onVnodeBeforeUpdate) && Gi(g, r, n, e), f && En(n, e, r, "beforeUpdate"), r && pi(r, !0), (m.innerHTML && h.innerHTML == null || m.textContent && h.textContent == null) && p(l, ""), d ? E(e.dynamicChildren, d, l, r, i, fi(n, a), o) : s || de(e, n, l, null, r, i, fi(n, a), o, !1), u > 0) { if (u & 16) ie(l, m, h, r, a); else if (u & 2 && m.class !== h.class && c(l, "class", null, h.class, a), u & 4 && c(l, "style", m.style, h.style, a), u & 8) { let e = n.dynamicProps; @@ -1769,13 +1808,13 @@ function Xr(e, i) { } u & 1 && e.children !== n.children && p(l, n.children); } else !s && d == null && ie(l, m, h, r, a); - ((g = h.onVnodeUpdated) || f) && J(() => { - g && Q(g, r, n, e), f && pn(n, e, r, "updated"); + ((g = h.onVnodeUpdated) || f) && V(() => { + g && Gi(g, r, n, e), f && En(n, e, r, "updated"); }, i); }, E = (e, t, n, r, i, a, o) => { for (let s = 0; s < t.length; s++) { let c = e[s], l = t[s]; - v(c, l, c.el && (c.type === Y || !vi(c, l) || c.shapeFlag & 198) ? m(c.el) : n, null, r, i, a, o, !0); + v(c, l, c.el && (c.type === H || !Mi(c, l) || c.shapeFlag & 198) ? m(c.el) : n, null, r, i, a, o, !0); } }, ie = (e, n, r, i, a) => { if (n !== r) { @@ -1789,20 +1828,20 @@ function Xr(e, i) { } }, ae = (e, t, n, r, i, a, s, c, l) => { let d = t.el = e ? e.el : u(""), f = t.anchor = e ? e.anchor : u(""), { patchFlag: p, dynamicChildren: m, slotScopeIds: h } = t; - h && (c = c ? c.concat(h) : h), e == null ? (o(d, n, r), o(f, n, r), T(t.children || [], n, f, i, a, s, c, l)) : p > 0 && p & 64 && m && e.dynamicChildren && e.dynamicChildren.length === m.length ? (E(e.dynamicChildren, m, n, i, a, s, c), (t.key != null || i && t === i.subTree) && ei(e, t, !0)) : de(e, t, n, f, i, a, s, c, l); + h && (c = c ? c.concat(h) : h), e == null ? (o(d, n, r), o(f, n, r), T(t.children || [], n, f, i, a, s, c, l)) : p > 0 && p & 64 && m && e.dynamicChildren && e.dynamicChildren.length === m.length ? (E(e.dynamicChildren, m, n, i, a, s, c), (t.key != null || i && t === i.subTree) && hi(e, t, !0)) : de(e, t, n, f, i, a, s, c, l); }, D = (e, t, n, r, i, a, o, s, c) => { t.slotScopeIds = s, e == null ? t.shapeFlag & 512 ? i.ctx.activate(t, n, r, o, c) : O(t, n, r, i, a, o, c) : se(e, t, c); }, O = (e, t, n, r, i, a, o) => { - let s = e.component = Mi(e, r, i); - if (Nn(e) && (s.ctx.renderer = xe), Bi(s, !1, o), s.asyncDep) { + let s = e.component = Ji(e, r, i); + if (Kn(e) && (s.ctx.renderer = k), na(s, !1, o), s.asyncDep) { if (i && i.registerDep(s, ce, o), !e.el) { - let r = s.subTree = Si(ci); + let r = s.subTree = Fi(Ci); b(null, r, t, n), e.placeholder = r.el; } } else ce(s, e, t, n, i, a, o); }, se = (e, t, n) => { let r = t.component = e.component; - if (Dr(e, t, n)) if (r.asyncDep && !r.asyncResolved) { + if (Hr(e, t, n)) if (r.asyncDep && !r.asyncResolved) { le(r, t, n); return; } else r.next = t, r.update(); @@ -1812,10 +1851,10 @@ function Xr(e, i) { if (e.isMounted) { let { next: t, bu: n, u: r, parent: s, vnode: c } = e; { - let n = ni(e); + let n = _i(e); if (n) { t && (t.el = c.el, le(e, t, o)), n.asyncDep.then(() => { - J(() => { + V(() => { e.isUnmounted || l(); }, i); }); @@ -1823,37 +1862,37 @@ function Xr(e, i) { } } let u = t, d; - Qr(e, !1), t ? (t.el = c.el, le(e, t, o)) : t = c, n && oe(n), (d = t.props && t.props.onVnodeBeforeUpdate) && Q(d, s, t, c), Qr(e, !0); - let f = wr(e), p = e.subTree; - e.subTree = f, v(p, f, m(p.el), ye(p), e, i, a), t.el = f.el, u === null && Ar(e, f.el), r && J(r, i), (d = t.props && t.props.onVnodeUpdated) && J(() => Q(d, s, t, c), i); + pi(e, !1), t ? (t.el = c.el, le(e, t, o)) : t = c, n && oe(n), (d = t.props && t.props.onVnodeBeforeUpdate) && Gi(d, s, t, c), pi(e, !0); + let f = zr(e), p = e.subTree; + e.subTree = f, v(p, f, m(p.el), be(p), e, i, a), t.el = f.el, u === null && Gr(e, f.el), r && V(r, i), (d = t.props && t.props.onVnodeUpdated) && V(() => Gi(d, s, t, c), i); } else { - let o, { el: s, props: c } = t, { bm: l, m: u, parent: d, root: f, type: p } = e, m = Mn(t); - if (Qr(e, !1), l && oe(l), !m && (o = c && c.onVnodeBeforeMount) && Q(o, d, t), Qr(e, !0), s && j) { + let o, { el: s, props: c } = t, { bm: l, m: u, parent: d, root: f, type: p } = e, m = Gn(t); + if (pi(e, !1), l && oe(l), !m && (o = c && c.onVnodeBeforeMount) && Gi(o, d, t), pi(e, !0), s && we) { let t = () => { - e.subTree = wr(e), j(s, e.subTree, e, i, null); + e.subTree = zr(e), we(s, e.subTree, e, i, null); }; m && p.__asyncHydrate ? p.__asyncHydrate(s, e, t) : t(); } else { f.ce && f.ce._hasShadowRoot() && f.ce._injectChildStyle(p, e.parent ? e.parent.type : void 0); - let o = e.subTree = wr(e); + let o = e.subTree = zr(e); v(null, o, n, r, e, i, a), t.el = o.el; } - if (u && J(u, i), !m && (o = c && c.onVnodeMounted)) { + if (u && V(u, i), !m && (o = c && c.onVnodeMounted)) { let e = t; - J(() => Q(o, d, e), i); + V(() => Gi(o, d, e), i); } - (t.shapeFlag & 256 || d && Mn(d.vnode) && d.vnode.shapeFlag & 256) && e.a && J(e.a, i), e.isMounted = !0, t = n = r = null; + (t.shapeFlag & 256 || d && Gn(d.vnode) && d.vnode.shapeFlag & 256) && e.a && V(e.a, i), e.isMounted = !0, t = n = r = null; } }; e.scope.on(); - let c = e.effect = new we(s); + let c = e.effect = new Oe(s); e.scope.off(); let l = e.update = c.run.bind(c), u = e.job = c.runIfDirty.bind(c); - u.i = e, u.id = e.uid, c.scheduler = () => nn(u), Qr(e, !0), l(); + u.i = e, u.id = e.uid, c.scheduler = () => gn(u), pi(e, !0), l(); }, le = (e, t, n) => { t.component = e; let r = e.vnode.props; - e.vnode = t, e.next = null, Fr(e, t.props, r, n), Jr(e, t.children, n), N(), on(e), P(); + e.vnode = t, e.next = null, Xr(e, t.props, r, n), li(e, t.children, n), He(), yn(e), Ue(); }, de = (e, t, n, r, i, a, o, s, c = !1) => { let l = e && e.children, u = e ? e.shapeFlag : 0, d = t.children, { patchFlag: f, shapeFlag: m } = t; if (f > 0) { @@ -1865,39 +1904,39 @@ function Xr(e, i) { return; } } - m & 8 ? (u & 16 && ve(l, i, a), d !== l && p(n, d)) : u & 16 ? m & 16 ? pe(l, d, n, r, i, a, o, s, c) : ve(l, i, a, !0) : (u & 8 && p(n, ""), m & 16 && T(d, n, r, i, a, o, s, c)); + m & 8 ? (u & 16 && ye(l, i, a), d !== l && p(n, d)) : u & 16 ? m & 16 ? pe(l, d, n, r, i, a, o, s, c) : ye(l, i, a, !0) : (u & 8 && p(n, ""), m & 16 && T(d, n, r, i, a, o, s, c)); }, fe = (e, t, r, i, a, o, s, c, l) => { e ||= n, t ||= n; let u = e.length, d = t.length, f = Math.min(u, d), p; for (p = 0; p < f; p++) { - let n = t[p] = l ? Di(t[p]) : Z(t[p]); + let n = t[p] = l ? Hi(t[p]) : Vi(t[p]); v(e[p], n, r, null, a, o, s, c, l); } - u > d ? ve(e, a, o, !0, !1, f) : T(t, r, i, a, o, s, c, l, f); + u > d ? ye(e, a, o, !0, !1, f) : T(t, r, i, a, o, s, c, l, f); }, pe = (e, t, r, i, a, o, s, c, l) => { let u = 0, d = t.length, f = e.length - 1, p = d - 1; for (; u <= f && u <= p;) { - let n = e[u], i = t[u] = l ? Di(t[u]) : Z(t[u]); - if (vi(n, i)) v(n, i, r, null, a, o, s, c, l); + let n = e[u], i = t[u] = l ? Hi(t[u]) : Vi(t[u]); + if (Mi(n, i)) v(n, i, r, null, a, o, s, c, l); else break; u++; } for (; u <= f && u <= p;) { - let n = e[f], i = t[p] = l ? Di(t[p]) : Z(t[p]); - if (vi(n, i)) v(n, i, r, null, a, o, s, c, l); + let n = e[f], i = t[p] = l ? Hi(t[p]) : Vi(t[p]); + if (Mi(n, i)) v(n, i, r, null, a, o, s, c, l); else break; f--, p--; } if (u > f) { if (u <= p) { let e = p + 1, n = e < d ? t[e].el : i; - for (; u <= p;) v(null, t[u] = l ? Di(t[u]) : Z(t[u]), r, n, a, o, s, c, l), u++; + for (; u <= p;) v(null, t[u] = l ? Hi(t[u]) : Vi(t[u]), r, n, a, o, s, c, l), u++; } - } else if (u > p) for (; u <= f;) k(e[u], a, o, !0), u++; + } else if (u > p) for (; u <= f;) he(e[u], a, o, !0), u++; else { let m = u, h = u, g = /* @__PURE__ */ new Map(); for (u = h; u <= p; u++) { - let e = t[u] = l ? Di(t[u]) : Z(t[u]); + let e = t[u] = l ? Hi(t[u]) : Vi(t[u]); e.key != null && g.set(e.key, u); } let _, y = 0, b = p - h + 1, x = !1, S = 0, C = Array(b); @@ -1905,20 +1944,20 @@ function Xr(e, i) { for (u = m; u <= f; u++) { let n = e[u]; if (y >= b) { - k(n, a, o, !0); + he(n, a, o, !0); continue; } let i; if (n.key != null) i = g.get(n.key); - else for (_ = h; _ <= p; _++) if (C[_ - h] === 0 && vi(n, t[_])) { + else for (_ = h; _ <= p; _++) if (C[_ - h] === 0 && Mi(n, t[_])) { i = _; break; } - i === void 0 ? k(n, a, o, !0) : (C[i - h] = u + 1, i >= S ? S = i : x = !0, v(n, t[i], r, null, a, o, s, c, l), y++); + i === void 0 ? he(n, a, o, !0) : (C[i - h] = u + 1, i >= S ? S = i : x = !0, v(n, t[i], r, null, a, o, s, c, l), y++); } - let w = x ? ti(C) : n; + let w = x ? gi(C) : n; for (_ = w.length - 1, u = b - 1; u >= 0; u--) { - let e = h + u, n = t[e], f = t[e + 1], p = e + 1 < d ? f.el || ii(f) : i; + let e = h + u, n = t[e], f = t[e + 1], p = e + 1 < d ? f.el || yi(f) : i; C[u] === 0 ? v(null, n, r, p, a, o, s, c, l) : x && (_ < 0 || u !== w[_] ? me(n, r, p, 2) : _--); } } @@ -1933,57 +1972,57 @@ function Xr(e, i) { return; } if (d & 64) { - c.move(e, t, n, xe); + c.move(e, t, n, k); return; } - if (c === Y) { + if (c === H) { o(a, t, n); for (let e = 0; e < u.length; e++) me(u[e], t, n, r); o(e.anchor, t, n); return; } - if (c === li) { + if (c === wi) { S(e, t, n); return; } - if (r !== 2 && d & 1 && l) if (r === 0) l.beforeEnter(a), o(a, t, n), J(() => l.enter(a), i); + if (r !== 2 && d & 1 && l) if (r === 0) l.beforeEnter(a), o(a, t, n), V(() => l.enter(a), i); else { let { leave: r, delayLeave: i, afterLeave: c } = l, u = () => { e.ctx.isUnmounted ? s(a) : o(a, t, n); }, d = () => { - a._isLeaving && a[wn](!0), r(a, () => { + a._isLeaving && a[Ln](!0), r(a, () => { u(), c && c(); }); }; i ? i(a, u, d) : d(); } else o(a, t, n); - }, k = (e, t, n, r = !1, i = !1) => { + }, he = (e, t, n, r = !1, i = !1) => { let { type: a, props: o, ref: s, children: c, dynamicChildren: l, shapeFlag: u, patchFlag: d, dirs: f, cacheIndex: p, memo: m } = e; - if (d === -2 && (i = !1), s != null && (N(), An(s, null, n, e, !0), P()), p != null && (t.renderCache[p] = void 0), u & 256) { + if (d === -2 && (i = !1), s != null && (He(), Un(s, null, n, e, !0), Ue()), p != null && (t.renderCache[p] = void 0), u & 256) { t.ctx.deactivate(e); return; } - let h = u & 1 && f, g = !Mn(e), _; - if (g && (_ = o && o.onVnodeBeforeUnmount) && Q(_, t, e), u & 6) _e(e.component, n, r); + let h = u & 1 && f, g = !Gn(e), _; + if (g && (_ = o && o.onVnodeBeforeUnmount) && Gi(_, t, e), u & 6) ve(e.component, n, r); else { if (u & 128) { e.suspense.unmount(n, r); return; } - h && pn(e, null, t, "beforeUnmount"), u & 64 ? e.type.remove(e, t, n, xe, r) : l && !l.hasOnce && (a !== Y || d > 0 && d & 64) ? ve(l, t, n, !1, !0) : (a === Y && d & 384 || !i && u & 16) && ve(c, t, n), r && he(e); + h && En(e, null, t, "beforeUnmount"), u & 64 ? e.type.remove(e, t, n, k, r) : l && !l.hasOnce && (a !== H || d > 0 && d & 64) ? ye(l, t, n, !1, !0) : (a === H && d & 384 || !i && u & 16) && ye(c, t, n), r && ge(e); } let v = m != null && p == null; - (g && (_ = o && o.onVnodeUnmounted) || h || v) && J(() => { - _ && Q(_, t, e), h && pn(e, null, t, "unmounted"), v && (e.el = null); + (g && (_ = o && o.onVnodeUnmounted) || h || v) && V(() => { + _ && Gi(_, t, e), h && En(e, null, t, "unmounted"), v && (e.el = null); }, n); - }, he = (e) => { + }, ge = (e) => { let { type: t, el: n, anchor: r, transition: i } = e; - if (t === Y) { - ge(n, r); + if (t === H) { + _e(n, r); return; } - if (t === li) { + if (t === wi) { C(e); return; } @@ -1994,60 +2033,60 @@ function Xr(e, i) { let { leave: t, delayLeave: r } = i, o = () => t(n, a); r ? r(e.el, a, o) : o(); } else a(); - }, ge = (e, t) => { + }, _e = (e, t) => { let n; for (; e !== t;) n = h(e), s(e), e = n; s(t); - }, _e = (e, t, n) => { + }, ve = (e, t, n) => { let { bum: r, scope: i, job: a, subTree: o, um: s, m: c, a: l } = e; - ri(c), ri(l), r && oe(r), i.stop(), a && (a.flags |= 8, k(o, e, t, n)), s && J(s, t), J(() => { + vi(c), vi(l), r && oe(r), i.stop(), a && (a.flags |= 8, he(o, e, t, n)), s && V(s, t), V(() => { e.isUnmounted = !0; }, t); - }, ve = (e, t, n, r = !1, i = !1, a = 0) => { - for (let o = a; o < e.length; o++) k(e[o], t, n, r, i); - }, ye = (e) => { - if (e.shapeFlag & 6) return ye(e.component.subTree); + }, ye = (e, t, n, r = !1, i = !1, a = 0) => { + for (let o = a; o < e.length; o++) he(e[o], t, n, r, i); + }, be = (e) => { + if (e.shapeFlag & 6) return be(e.component.subTree); if (e.shapeFlag & 128) return e.suspense.next(); - let t = h(e.anchor || e.el), n = t && t[Sn]; + let t = h(e.anchor || e.el), n = t && t[Fn]; return n ? h(n) : t; - }, be = !1, A = (e, t, n) => { + }, xe = !1, Se = (e, t, n) => { let r; - e == null ? t._vnode && (k(t._vnode, null, null, !0), r = t._vnode.component) : v(t._vnode || null, e, t, null, null, null, n), t._vnode = e, be ||= (be = !0, on(r), sn(), !1); - }, xe = { + e == null ? t._vnode && (he(t._vnode, null, null, !0), r = t._vnode.component) : v(t._vnode || null, e, t, null, null, null, n), t._vnode = e, xe ||= (xe = !0, yn(r), bn(), !1); + }, k = { p: v, - um: k, + um: he, m: me, - r: he, + r: ge, mt: O, mc: T, pc: de, pbc: E, - n: ye, + n: be, o: e - }, Se, j; - return i && ([Se, j] = i(xe)), { - render: A, - hydrate: Se, - createApp: _r(A, Se) + }, Ce, we; + return i && ([Ce, we] = i(k)), { + render: Se, + hydrate: Ce, + createApp: Mr(Se, Ce) }; } -function Zr({ type: e, props: t }, n) { +function fi({ type: e, props: t }, n) { return n === "svg" && e === "foreignObject" || n === "mathml" && e === "annotation-xml" && t && t.encoding && t.encoding.includes("html") ? void 0 : n; } -function Qr({ effect: e, job: t }, n) { +function pi({ effect: e, job: t }, n) { n ? (e.flags |= 32, t.flags |= 4) : (e.flags &= -33, t.flags &= -5); } -function $r(e, t) { +function mi(e, t) { return (!e || e && !e.pendingBranch) && t && !t.persisted; } -function ei(e, t, n = !1) { +function hi(e, t, n = !1) { let r = e.children, i = t.children; if (d(r) && d(i)) for (let e = 0; e < r.length; e++) { let t = r[e], a = i[e]; - a.shapeFlag & 1 && !a.dynamicChildren && ((a.patchFlag <= 0 || a.patchFlag === 32) && (a = i[e] = Di(i[e]), a.el = t.el), !n && a.patchFlag !== -2 && ei(t, a)), a.type === si && (a.patchFlag === -1 && (a = i[e] = Di(a)), a.el = t.el), a.type === ci && !a.el && (a.el = t.el); + a.shapeFlag & 1 && !a.dynamicChildren && ((a.patchFlag <= 0 || a.patchFlag === 32) && (a = i[e] = Hi(i[e]), a.el = t.el), !n && a.patchFlag !== -2 && hi(t, a)), a.type === Si && (a.patchFlag === -1 && (a = i[e] = Hi(a)), a.el = t.el), a.type === Ci && !a.el && (a.el = t.el); } } -function ti(e) { +function gi(e) { let t = e.slice(), n = [0], r, i, a, o, s, c = e.length; for (r = 0; r < c; r++) { let c = e[r]; @@ -2063,60 +2102,63 @@ function ti(e) { for (a = n.length, o = n[a - 1]; a-- > 0;) n[a] = o, o = t[o]; return n; } -function ni(e) { +function _i(e) { let t = e.subTree.component; - if (t) return t.asyncDep && !t.asyncResolved ? t : ni(t); + if (t) return t.asyncDep && !t.asyncResolved ? t : _i(t); } -function ri(e) { +function vi(e) { if (e) for (let t = 0; t < e.length; t++) e[t].flags |= 8; } -function ii(e) { +function yi(e) { if (e.placeholder) return e.placeholder; let t = e.component; - return t ? ii(t.subTree) : null; + return t ? yi(t.subTree) : null; } -var ai = (e) => e.__isSuspense; -function oi(e, t) { - t && t.pendingBranch ? d(e) ? t.effects.push(...e) : t.effects.push(e) : an(e); +var bi = (e) => e.__isSuspense; +function xi(e, t) { + t && t.pendingBranch ? d(e) ? t.effects.push(...e) : t.effects.push(e) : vn(e); } -var Y = /* @__PURE__ */ Symbol.for("v-fgt"), si = /* @__PURE__ */ Symbol.for("v-txt"), ci = /* @__PURE__ */ Symbol.for("v-cmt"), li = /* @__PURE__ */ Symbol.for("v-stc"), ui = [], X = null; -function di(e = !1) { - ui.push(X = e ? null : []); +var H = /* @__PURE__ */ Symbol.for("v-fgt"), Si = /* @__PURE__ */ Symbol.for("v-txt"), Ci = /* @__PURE__ */ Symbol.for("v-cmt"), wi = /* @__PURE__ */ Symbol.for("v-stc"), Ti = [], U = null; +function W(e = !1) { + Ti.push(U = e ? null : []); } -function fi() { - ui.pop(), X = ui[ui.length - 1] || null; +function Ei() { + Ti.pop(), U = Ti[Ti.length - 1] || null; } -var pi = 1; -function mi(e, t = !1) { - pi += e, e < 0 && X && t && (X.hasOnce = !0); +var Di = 1; +function Oi(e, t = !1) { + Di += e, e < 0 && U && t && (U.hasOnce = !0); } -function hi(e) { - return e.dynamicChildren = pi > 0 ? X || n : null, fi(), pi > 0 && X && X.push(e), e; +function ki(e) { + return e.dynamicChildren = Di > 0 ? U || n : null, Ei(), Di > 0 && U && U.push(e), e; } -function gi(e, t, n, r, i, a) { - return hi(xi(e, t, n, r, i, a, !0)); +function G(e, t, n, r, i, a) { + return ki(K(e, t, n, r, i, a, !0)); } -function _i(e) { +function Ai(e, t, n, r, i) { + return ki(Fi(e, t, n, r, i, !0)); +} +function ji(e) { return e ? e.__v_isVNode === !0 : !1; } -function vi(e, t) { +function Mi(e, t) { return e.type === t.type && e.key === t.key; } -var yi = ({ key: e }) => e ?? null, bi = ({ ref: e, ref_key: t, ref_for: n }) => (typeof e == "number" && (e = "" + e), e == null ? null : g(e) || /* @__PURE__ */ V(e) || h(e) ? { - i: G, +var Ni = ({ key: e }) => e ?? null, Pi = ({ ref: e, ref_key: t, ref_for: n }) => (typeof e == "number" && (e = "" + e), e == null ? null : g(e) || /* @__PURE__ */ L(e) || h(e) ? { + i: z, r: e, k: t, f: !!n } : e); -function xi(e, t = null, n = null, r = 0, i = null, a = e === Y ? 0 : 1, o = !1, s = !1) { +function K(e, t = null, n = null, r = 0, i = null, a = e === H ? 0 : 1, o = !1, s = !1) { let c = { __v_isVNode: !0, __v_skip: !0, type: e, props: t, - key: t && yi(t), - ref: t && bi(t), - scopeId: un, + key: t && Ni(t), + ref: t && Pi(t), + scopeId: Cn, slotScopeIds: null, children: n, component: null, @@ -2136,35 +2178,35 @@ function xi(e, t = null, n = null, r = 0, i = null, a = e === Y ? 0 : 1, o = !1, dynamicProps: i, dynamicChildren: null, appContext: null, - ctx: G + ctx: z }; - return s ? (Oi(c, n), a & 128 && e.normalize(c)) : n && (c.shapeFlag |= g(n) ? 8 : 16), pi > 0 && !o && X && (c.patchFlag > 0 || a & 6) && c.patchFlag !== 32 && X.push(c), c; + return s ? (Ui(c, n), a & 128 && e.normalize(c)) : n && (c.shapeFlag |= g(n) ? 8 : 16), Di > 0 && !o && U && (c.patchFlag > 0 || a & 6) && c.patchFlag !== 32 && U.push(c), c; } -var Si = Ci; -function Ci(e, t = null, n = null, r = 0, i = null, a = !1) { - if ((!e || e === Yn) && (e = ci), _i(e)) { - let r = Ti(e, t, !0); - return n && Oi(r, n), pi > 0 && !a && X && (r.shapeFlag & 6 ? X[X.indexOf(e)] = r : X.push(r)), r.patchFlag = -2, r; +var Fi = Ii; +function Ii(e, t = null, n = null, r = 0, i = null, a = !1) { + if ((!e || e === lr) && (e = Ci), ji(e)) { + let r = Ri(e, t, !0); + return n && Ui(r, n), Di > 0 && !a && U && (r.shapeFlag & 6 ? U[U.indexOf(e)] = r : U.push(r)), r.patchFlag = -2, r; } - if (Yi(e) && (e = e.__vccOpts), t) { - t = wi(t); + if (da(e) && (e = e.__vccOpts), t) { + t = Li(t); let { class: e, style: n } = t; - e && !g(e) && (t.class = he(e)), v(n) && (/* @__PURE__ */ jt(n) && !d(n) && (n = s({}, n)), t.style = de(n)); + e && !g(e) && (t.class = ge(e)), v(n) && (/* @__PURE__ */ Bt(n) && !d(n) && (n = s({}, n)), t.style = de(n)); } - let o = g(e) ? 1 : ai(e) ? 128 : Cn(e) ? 64 : v(e) ? 4 : h(e) ? 2 : 0; - return xi(e, t, n, r, i, o, a, !0); + let o = g(e) ? 1 : bi(e) ? 128 : In(e) ? 64 : v(e) ? 4 : h(e) ? 2 : 0; + return K(e, t, n, r, i, o, a, !0); } -function wi(e) { - return e ? /* @__PURE__ */ jt(e) || Nr(e) ? s({}, e) : e : null; +function Li(e) { + return e ? /* @__PURE__ */ Bt(e) || Jr(e) ? s({}, e) : e : null; } -function Ti(e, t, n = !1, r = !1) { - let { props: i, ref: a, patchFlag: o, children: s, transition: c } = e, l = t ? ki(i || {}, t) : i, u = { +function Ri(e, t, n = !1, r = !1) { + let { props: i, ref: a, patchFlag: o, children: s, transition: c } = e, l = t ? Wi(i || {}, t) : i, u = { __v_isVNode: !0, __v_skip: !0, type: e.type, props: l, - key: l && yi(l), - ref: t && t.ref ? n && a ? d(a) ? a.concat(bi(t)) : [a, bi(t)] : bi(t) : a, + key: l && Ni(l), + ref: t && t.ref ? n && a ? d(a) ? a.concat(Pi(t)) : [a, Pi(t)] : Pi(t) : a, scopeId: e.scopeId, slotScopeIds: e.slotScopeIds, children: s, @@ -2173,7 +2215,7 @@ function Ti(e, t, n = !1, r = !1) { targetAnchor: e.targetAnchor, staticCount: e.staticCount, shapeFlag: e.shapeFlag, - patchFlag: t && e.type !== Y ? o === -1 ? 16 : o | 16 : o, + patchFlag: t && e.type !== H ? o === -1 ? 16 : o | 16 : o, dynamicProps: e.dynamicProps, dynamicChildren: e.dynamicChildren, appContext: e.appContext, @@ -2181,49 +2223,52 @@ function Ti(e, t, n = !1, r = !1) { transition: c, component: e.component, suspense: e.suspense, - ssContent: e.ssContent && Ti(e.ssContent), - ssFallback: e.ssFallback && Ti(e.ssFallback), + ssContent: e.ssContent && Ri(e.ssContent), + ssFallback: e.ssFallback && Ri(e.ssFallback), placeholder: e.placeholder, el: e.el, anchor: e.anchor, ctx: e.ctx, ce: e.ce }; - return c && r && Tn(u, c.clone(u)), u; + return c && r && Rn(u, c.clone(u)), u; +} +function zi(e = " ", t = 0) { + return Fi(Si, null, e, t); } -function Ei(e = " ", t = 0) { - return Si(si, null, e, t); +function Bi(e = "", t = !1) { + return t ? (W(), Ai(Ci, null, e)) : Fi(Ci, null, e); } -function Z(e) { - return e == null || typeof e == "boolean" ? Si(ci) : d(e) ? Si(Y, null, e.slice()) : _i(e) ? Di(e) : Si(si, null, String(e)); +function Vi(e) { + return e == null || typeof e == "boolean" ? Fi(Ci) : d(e) ? Fi(H, null, e.slice()) : ji(e) ? Hi(e) : Fi(Si, null, String(e)); } -function Di(e) { - return e.el === null && e.patchFlag !== -1 || e.memo ? e : Ti(e); +function Hi(e) { + return e.el === null && e.patchFlag !== -1 || e.memo ? e : Ri(e); } -function Oi(e, t) { +function Ui(e, t) { let n = 0, { shapeFlag: r } = e; if (t == null) t = null; else if (d(t)) n = 16; else if (typeof t == "object") if (r & 65) { let n = t.default; - n && (n._c && (n._d = !1), Oi(e, n()), n._c && (n._d = !0)); + n && (n._c && (n._d = !1), Ui(e, n()), n._c && (n._d = !0)); return; } else { n = 32; let r = t._; - !r && !Nr(t) ? t._ctx = G : r === 3 && G && (G.slots._ === 1 ? t._ = 1 : (t._ = 2, e.patchFlag |= 1024)); + !r && !Jr(t) ? t._ctx = z : r === 3 && z && (z.slots._ === 1 ? t._ = 1 : (t._ = 2, e.patchFlag |= 1024)); } else h(t) ? (t = { default: t, - _ctx: G - }, n = 32) : (t = String(t), r & 64 ? (n = 16, t = [Ei(t)]) : n = 8); + _ctx: z + }, n = 32) : (t = String(t), r & 64 ? (n = 16, t = [zi(t)]) : n = 8); e.children = t, e.shapeFlag |= n; } -function ki(...e) { +function Wi(...e) { let t = {}; for (let n = 0; n < e.length; n++) { let r = e[n]; - for (let e in r) if (e === "class") t.class !== r.class && (t.class = he([t.class, r.class])); + for (let e in r) if (e === "class") t.class !== r.class && (t.class = ge([t.class, r.class])); else if (e === "style") t.style = de([t.style, r.style]); else if (a(e)) { let n = t[e], i = r[e]; @@ -2232,13 +2277,13 @@ function ki(...e) { } return t; } -function Q(e, t, n, r = null) { - H(e, t, 7, [n, r]); +function Gi(e, t, n, r = null) { + an(e, t, 7, [n, r]); } -var Ai = hr(), ji = 0; -function Mi(e, n, r) { - let i = e.type, a = (n ? n.appContext : e.appContext) || Ai, o = { - uid: ji++, +var Ki = Ar(), qi = 0; +function Ji(e, n, r) { + let i = e.type, a = (n ? n.appContext : e.appContext) || Ki, o = { + uid: qi++, vnode: e, type: i, parent: n, @@ -2249,7 +2294,7 @@ function Mi(e, n, r) { effect: null, update: null, job: null, - scope: new xe(!0), + scope: new Te(!0), render: null, proxy: null, exposed: null, @@ -2265,8 +2310,8 @@ function Mi(e, n, r) { renderCache: [], components: null, directives: null, - propsOptions: zr(i, a), - emitsOptions: Sr(i, a), + propsOptions: ei(i, a), + emitsOptions: Lr(i, a), emit: null, emitted: null, propsDefaults: t, @@ -2301,9 +2346,9 @@ function Mi(e, n, r) { ec: null, sp: null }; - return o.ctx = { _: o }, o.root = n ? n.root : o, o.emit = br.bind(null, o), e.ce && e.ce(o), o; + return o.ctx = { _: o }, o.root = n ? n.root : o, o.emit = Fr.bind(null, o), e.ce && e.ce(o), o; } -var $ = null, Ni = () => $ || G, Pi, Fi; +var q = null, Yi = () => q || z, Xi, Zi; { let e = ue(), t = (t, n) => { let r; @@ -2311,79 +2356,79 @@ var $ = null, Ni = () => $ || G, Pi, Fi; r.length > 1 ? r.forEach((t) => t(e)) : r[0](e); }; }; - Pi = t("__VUE_INSTANCE_SETTERS__", (e) => $ = e), Fi = t("__VUE_SSR_SETTERS__", (e) => zi = e); + Xi = t("__VUE_INSTANCE_SETTERS__", (e) => q = e), Zi = t("__VUE_SSR_SETTERS__", (e) => ta = e); } -var Ii = (e) => { - let t = $; - return Pi(e), e.scope.on(), () => { - e.scope.off(), Pi(t); +var Qi = (e) => { + let t = q; + return Xi(e), e.scope.on(), () => { + e.scope.off(), Xi(t); }; -}, Li = () => { - $ && $.scope.off(), Pi(null); +}, $i = () => { + q && q.scope.off(), Xi(null); }; -function Ri(e) { +function ea(e) { return e.vnode.shapeFlag & 4; } -var zi = !1; -function Bi(e, t = !1, n = !1) { - t && Fi(t); - let { props: r, children: i } = e.vnode, a = Ri(e); - Pr(e, r, a, t), qr(e, i, n || t); - let o = a ? Vi(e, t) : void 0; - return t && Fi(!1), o; +var ta = !1; +function na(e, t = !1, n = !1) { + t && Zi(t); + let { props: r, children: i } = e.vnode, a = ea(e); + Yr(e, r, a, t), ci(e, i, n || t); + let o = a ? ra(e, t) : void 0; + return t && Zi(!1), o; } -function Vi(e, t) { +function ra(e, t) { let n = e.type; - e.accessCache = /* @__PURE__ */ Object.create(null), e.proxy = new Proxy(e.ctx, $n); + e.accessCache = /* @__PURE__ */ Object.create(null), e.proxy = new Proxy(e.ctx, mr); let { setup: r } = n; if (r) { - N(); - let n = e.setupContext = r.length > 1 ? qi(e) : null, i = Ii(e), a = Kt(r, e, 0, [e.props, n]), o = y(a); - if (P(), i(), (o || e.sp) && !Mn(e) && Dn(e), o) { - if (a.then(Li, Li), t) return a.then((n) => { - Hi(e, n, t); + He(); + let n = e.setupContext = r.length > 1 ? la(e) : null, i = Qi(e), a = rn(r, e, 0, [e.props, n]), o = y(a); + if (Ue(), i(), (o || e.sp) && !Gn(e) && Bn(e), o) { + if (a.then($i, $i), t) return a.then((n) => { + ia(e, n, t); }).catch((t) => { - qt(t, e, 0); + on(t, e, 0); }); e.asyncDep = a; - } else Hi(e, a, t); - } else Gi(e, t); + } else ia(e, a, t); + } else sa(e, t); } -function Hi(e, t, n) { - h(t) ? e.type.__ssrInlineRender ? e.ssrRender = t : e.render = t : v(t) && (e.setupState = Lt(t)), Gi(e, n); +function ia(e, t, n) { + h(t) ? e.type.__ssrInlineRender ? e.ssrRender = t : e.render = t : v(t) && (e.setupState = Jt(t)), sa(e, n); } -var Ui, Wi; -function Gi(e, t, n) { +var aa, oa; +function sa(e, t, n) { let i = e.type; if (!e.render) { - if (!t && Ui && !i.render) { - let t = i.template || or(e).template; + if (!t && aa && !i.render) { + let t = i.template || xr(e).template; if (t) { let { isCustomElement: n, compilerOptions: r } = e.appContext.config, { delimiters: a, compilerOptions: o } = i; - i.render = Ui(t, s(s({ + i.render = aa(t, s(s({ isCustomElement: n, delimiters: a }, r), o)); } } - e.render = i.render || r, Wi && Wi(e); + e.render = i.render || r, oa && oa(e); } { - let t = Ii(e); - N(); + let t = Qi(e); + He(); try { - nr(e); + _r(e); } finally { - P(), t(); + Ue(), t(); } } } -var Ki = { get(e, t) { - return F(e, "get", ""), e[t]; +var ca = { get(e, t) { + return N(e, "get", ""), e[t]; } }; -function qi(e) { +function la(e) { return { - attrs: new Proxy(e.attrs, Ki), + attrs: new Proxy(e.attrs, ca), slots: e.slots, emit: e.emit, expose: (t) => { @@ -2391,25 +2436,25 @@ function qi(e) { } }; } -function Ji(e) { - return e.exposed ? e.exposeProxy ||= new Proxy(Lt(Mt(e.exposed)), { +function ua(e) { + return e.exposed ? e.exposeProxy ||= new Proxy(Jt(Vt(e.exposed)), { get(t, n) { if (n in t) return t[n]; - if (n in Zn) return Zn[n](e); + if (n in fr) return fr[n](e); }, has(e, t) { - return t in e || t in Zn; + return t in e || t in fr; } }) : e.proxy; } -function Yi(e) { +function da(e) { return h(e) && "__vccOpts" in e; } -var Xi = (e, t) => /* @__PURE__ */ zt(e, t, zi), Zi = "3.5.34", Qi = void 0, $i = typeof window < "u" && window.trustedTypes; -if ($i) try { - Qi = /* @__PURE__ */ $i.createPolicy("vue", { createHTML: (e) => e }); +var J = (e, t) => /* @__PURE__ */ Xt(e, t, ta), fa = "3.5.34", pa = void 0, ma = typeof window < "u" && window.trustedTypes; +if (ma) try { + pa = /* @__PURE__ */ ma.createPolicy("vue", { createHTML: (e) => e }); } catch {} -var ea = Qi ? (e) => Qi.createHTML(e) : (e) => e, ta = "http://www.w3.org/2000/svg", na = "http://www.w3.org/1998/Math/MathML", ra = typeof document < "u" ? document : null, ia = ra && /* @__PURE__ */ ra.createElement("template"), aa = { +var ha = pa ? (e) => pa.createHTML(e) : (e) => e, ga = "http://www.w3.org/2000/svg", _a = "http://www.w3.org/1998/Math/MathML", va = typeof document < "u" ? document : null, ya = va && /* @__PURE__ */ va.createElement("template"), ba = { insert: (e, t, n) => { t.insertBefore(e, n || null); }, @@ -2418,11 +2463,11 @@ var ea = Qi ? (e) => Qi.createHTML(e) : (e) => e, ta = "http://www.w3.org/2000/s t && t.removeChild(e); }, createElement: (e, t, n, r) => { - let i = t === "svg" ? ra.createElementNS(ta, e) : t === "mathml" ? ra.createElementNS(na, e) : n ? ra.createElement(e, { is: n }) : ra.createElement(e); + let i = t === "svg" ? va.createElementNS(ga, e) : t === "mathml" ? va.createElementNS(_a, e) : n ? va.createElement(e, { is: n }) : va.createElement(e); return e === "select" && r && r.multiple != null && i.setAttribute("multiple", r.multiple), i; }, - createText: (e) => ra.createTextNode(e), - createComment: (e) => ra.createComment(e), + createText: (e) => va.createTextNode(e), + createComment: (e) => va.createComment(e), setText: (e, t) => { e.nodeValue = t; }, @@ -2431,7 +2476,7 @@ var ea = Qi ? (e) => Qi.createHTML(e) : (e) => e, ta = "http://www.w3.org/2000/s }, parentNode: (e) => e.parentNode, nextSibling: (e) => e.nextSibling, - querySelector: (e) => ra.querySelector(e), + querySelector: (e) => va.querySelector(e), setScopeId(e, t) { e.setAttribute(t, ""); }, @@ -2439,8 +2484,8 @@ var ea = Qi ? (e) => Qi.createHTML(e) : (e) => e, ta = "http://www.w3.org/2000/s let o = n ? n.previousSibling : t.lastChild; if (i && (i === a || i.nextSibling)) for (; t.insertBefore(i.cloneNode(!0), n), !(i === a || !(i = i.nextSibling));); else { - ia.innerHTML = ea(r === "svg" ? `${e}` : r === "mathml" ? `${e}` : e); - let i = ia.content; + ya.innerHTML = ha(r === "svg" ? `${e}` : r === "mathml" ? `${e}` : e); + let i = ya.content; if (r === "svg" || r === "mathml") { let e = i.firstChild; for (; e.firstChild;) i.appendChild(e.firstChild); @@ -2450,69 +2495,69 @@ var ea = Qi ? (e) => Qi.createHTML(e) : (e) => e, ta = "http://www.w3.org/2000/s } return [o ? o.nextSibling : t.firstChild, n ? n.previousSibling : t.lastChild]; } -}, oa = /* @__PURE__ */ Symbol("_vtc"); -function sa(e, t, n) { - let r = e[oa]; +}, xa = /* @__PURE__ */ Symbol("_vtc"); +function Sa(e, t, n) { + let r = e[xa]; r && (t = (t ? [t, ...r] : [...r]).join(" ")), t == null ? e.removeAttribute("class") : n ? e.setAttribute("class", t) : e.className = t; } -var ca = /* @__PURE__ */ Symbol("_vod"), la = /* @__PURE__ */ Symbol("_vsh"), ua = /* @__PURE__ */ Symbol(""), da = /(?:^|;)\s*display\s*:/; -function fa(e, t, n) { +var Ca = /* @__PURE__ */ Symbol("_vod"), wa = /* @__PURE__ */ Symbol("_vsh"), Ta = /* @__PURE__ */ Symbol(""), Ea = /(?:^|;)\s*display\s*:/; +function Da(e, t, n) { let r = e.style, i = g(n), a = !1; if (n && !i) { if (t) if (g(t)) for (let e of t.split(";")) { let t = e.slice(0, e.indexOf(":")).trim(); - n[t] ?? ma(r, t, ""); + n[t] ?? ka(r, t, ""); } - else for (let e in t) n[e] ?? ma(r, e, ""); + else for (let e in t) n[e] ?? ka(r, e, ""); for (let i in n) { i === "display" && (a = !0); let o = n[i]; - o == null ? ma(r, i, "") : va(e, i, !g(t) && t ? t[i] : void 0, o) || ma(r, i, o); + o == null ? ka(r, i, "") : Na(e, i, !g(t) && t ? t[i] : void 0, o) || ka(r, i, o); } } else if (i) { if (t !== n) { - let e = r[ua]; - e && (n += ";" + e), r.cssText = n, a = da.test(n); + let e = r[Ta]; + e && (n += ";" + e), r.cssText = n, a = Ea.test(n); } } else t && e.removeAttribute("style"); - ca in e && (e[ca] = a ? r.display : "", e[la] && (r.display = "none")); + Ca in e && (e[Ca] = a ? r.display : "", e[wa] && (r.display = "none")); } -var pa = /\s*!important$/; -function ma(e, t, n) { - if (d(n)) n.forEach((n) => ma(e, t, n)); +var Oa = /\s*!important$/; +function ka(e, t, n) { + if (d(n)) n.forEach((n) => ka(e, t, n)); else if (n ??= "", t.startsWith("--")) e.setProperty(t, n); else { - let r = _a(e, t); - pa.test(n) ? e.setProperty(E(r), n.replace(pa, ""), "important") : e[r] = n; + let r = Ma(e, t); + Oa.test(n) ? e.setProperty(E(r), n.replace(Oa, ""), "important") : e[r] = n; } } -var ha = [ +var Aa = [ "Webkit", "Moz", "ms" -], ga = {}; -function _a(e, t) { - let n = ga[t]; +], ja = {}; +function Ma(e, t) { + let n = ja[t]; if (n) return n; let r = T(t); - if (r !== "filter" && r in e) return ga[t] = r; + if (r !== "filter" && r in e) return ja[t] = r; r = ie(r); - for (let n = 0; n < ha.length; n++) { - let i = ha[n] + r; - if (i in e) return ga[t] = i; + for (let n = 0; n < Aa.length; n++) { + let i = Aa[n] + r; + if (i in e) return ja[t] = i; } return t; } -function va(e, t, n, r) { +function Na(e, t, n, r) { return e.tagName === "TEXTAREA" && (t === "width" || t === "height") && g(r) && n === r; } -var ya = "http://www.w3.org/1999/xlink"; -function ba(e, t, n, r, i, a = _e(t)) { - r && t.startsWith("xlink:") ? n == null ? e.removeAttributeNS(ya, t.slice(6, t.length)) : e.setAttributeNS(ya, t, n) : n == null || a && !ve(n) ? e.removeAttribute(t) : e.setAttribute(t, a ? "" : _(n) ? String(n) : n); +var Pa = "http://www.w3.org/1999/xlink"; +function Fa(e, t, n, r, i, a = ve(t)) { + r && t.startsWith("xlink:") ? n == null ? e.removeAttributeNS(Pa, t.slice(6, t.length)) : e.setAttributeNS(Pa, t, n) : n == null || a && !ye(n) ? e.removeAttribute(t) : e.setAttribute(t, a ? "" : _(n) ? String(n) : n); } -function xa(e, t, n, r, i) { +function Ia(e, t, n, r, i) { if (t === "innerHTML" || t === "textContent") { - n != null && (e[t] = t === "innerHTML" ? ea(n) : n); + n != null && (e[t] = t === "innerHTML" ? ha(n) : n); return; } let a = e.tagName; @@ -2524,48 +2569,48 @@ function xa(e, t, n, r, i) { let o = !1; if (n === "" || n == null) { let r = typeof e[t]; - r === "boolean" ? n = ve(n) : n == null && r === "string" ? (n = "", o = !0) : r === "number" && (n = 0, o = !0); + r === "boolean" ? n = ye(n) : n == null && r === "string" ? (n = "", o = !0) : r === "number" && (n = 0, o = !0); } try { e[t] = n; } catch {} o && e.removeAttribute(i || t); } -function Sa(e, t, n, r) { +function La(e, t, n, r) { e.addEventListener(t, n, r); } -function Ca(e, t, n, r) { +function Ra(e, t, n, r) { e.removeEventListener(t, n, r); } -var wa = /* @__PURE__ */ Symbol("_vei"); -function Ta(e, t, n, r, i = null) { - let a = e[wa] || (e[wa] = {}), o = a[t]; +var za = /* @__PURE__ */ Symbol("_vei"); +function Ba(e, t, n, r, i = null) { + let a = e[za] || (e[za] = {}), o = a[t]; if (r && o) o.value = r; else { - let [n, s] = Da(t); - r ? Sa(e, n, a[t] = ja(r, i), s) : o && (Ca(e, n, o, s), a[t] = void 0); + let [n, s] = Ha(t); + r ? La(e, n, a[t] = Ka(r, i), s) : o && (Ra(e, n, o, s), a[t] = void 0); } } -var Ea = /(?:Once|Passive|Capture)$/; -function Da(e) { +var Va = /(?:Once|Passive|Capture)$/; +function Ha(e) { let t; - if (Ea.test(e)) { + if (Va.test(e)) { t = {}; let n; - for (; n = e.match(Ea);) e = e.slice(0, e.length - n[0].length), t[n[0].toLowerCase()] = !0; + for (; n = e.match(Va);) e = e.slice(0, e.length - n[0].length), t[n[0].toLowerCase()] = !0; } return [e[2] === ":" ? e.slice(3) : E(e.slice(2)), t]; } -var Oa = 0, ka = /* @__PURE__ */ Promise.resolve(), Aa = () => Oa ||= (ka.then(() => Oa = 0), Date.now()); -function ja(e, t) { +var Ua = 0, Wa = /* @__PURE__ */ Promise.resolve(), Ga = () => Ua ||= (Wa.then(() => Ua = 0), Date.now()); +function Ka(e, t) { let n = (e) => { if (!e._vts) e._vts = Date.now(); else if (e._vts <= n.attached) return; - H(Ma(e, n.value), t, 5, [e]); + an(qa(e, n.value), t, 5, [e]); }; - return n.value = e, n.attached = Aa(), n; + return n.value = e, n.attached = Ga(), n; } -function Ma(e, t) { +function qa(e, t) { if (d(t)) { let n = e.stopImmediatePropagation; return e.stopImmediatePropagation = () => { @@ -2573,40 +2618,40 @@ function Ma(e, t) { }, t.map((e) => (t) => !t._stopped && e && e(t)); } else return t; } -var Na = (e) => e.charCodeAt(0) === 111 && e.charCodeAt(1) === 110 && e.charCodeAt(2) > 96 && e.charCodeAt(2) < 123, Pa = (e, t, n, r, i, s) => { +var Ja = (e) => e.charCodeAt(0) === 111 && e.charCodeAt(1) === 110 && e.charCodeAt(2) > 96 && e.charCodeAt(2) < 123, Ya = (e, t, n, r, i, s) => { let c = i === "svg"; - t === "class" ? sa(e, r, c) : t === "style" ? fa(e, n, r) : a(t) ? o(t) || Ta(e, t, n, r, s) : (t[0] === "." ? (t = t.slice(1), !0) : t[0] === "^" ? (t = t.slice(1), !1) : Fa(e, t, r, c)) ? (xa(e, t, r), !e.tagName.includes("-") && (t === "value" || t === "checked" || t === "selected") && ba(e, t, r, c, s, t !== "value")) : e._isVueCE && (Ia(e, t) || e._def.__asyncLoader && (/[A-Z]/.test(t) || !g(r))) ? xa(e, T(t), r, s, t) : (t === "true-value" ? e._trueValue = r : t === "false-value" && (e._falseValue = r), ba(e, t, r, c)); + t === "class" ? Sa(e, r, c) : t === "style" ? Da(e, n, r) : a(t) ? o(t) || Ba(e, t, n, r, s) : (t[0] === "." ? (t = t.slice(1), !0) : t[0] === "^" ? (t = t.slice(1), !1) : Xa(e, t, r, c)) ? (Ia(e, t, r), !e.tagName.includes("-") && (t === "value" || t === "checked" || t === "selected") && Fa(e, t, r, c, s, t !== "value")) : e._isVueCE && (Za(e, t) || e._def.__asyncLoader && (/[A-Z]/.test(t) || !g(r))) ? Ia(e, T(t), r, s, t) : (t === "true-value" ? e._trueValue = r : t === "false-value" && (e._falseValue = r), Fa(e, t, r, c)); }; -function Fa(e, t, n, r) { - if (r) return !!(t === "innerHTML" || t === "textContent" || t in e && Na(t) && h(n)); +function Xa(e, t, n, r) { + if (r) return !!(t === "innerHTML" || t === "textContent" || t in e && Ja(t) && h(n)); if (t === "spellcheck" || t === "draggable" || t === "translate" || t === "autocorrect" || t === "sandbox" && e.tagName === "IFRAME" || t === "form" || t === "list" && e.tagName === "INPUT" || t === "type" && e.tagName === "TEXTAREA") return !1; if (t === "width" || t === "height") { let t = e.tagName; if (t === "IMG" || t === "VIDEO" || t === "CANVAS" || t === "SOURCE") return !1; } - return Na(t) && g(n) ? !1 : t in e; + return Ja(t) && g(n) ? !1 : t in e; } -function Ia(e, t) { +function Za(e, t) { let n = e._def.props; if (!n) return !1; let r = T(t); return Array.isArray(n) ? n.some((e) => T(e) === r) : Object.keys(n).some((e) => T(e) === r); } -var La = {}; +var Qa = {}; /* @__NO_SIDE_EFFECTS__ */ -function Ra(e, t, n) { - let r = /* @__PURE__ */ En(e, t); +function $a(e, t, n) { + let r = /* @__PURE__ */ zn(e, t); C(r) && (r = s({}, r, t)); - class i extends Ba { + class i extends to { constructor(e) { super(r, e, n); } } return i.def = r, i; } -var za = typeof HTMLElement < "u" ? HTMLElement : class {}, Ba = class e extends za { - constructor(e, t = {}, n = Ga) { - super(), this._def = e, this._props = t, this._createApp = n, this._isVueCE = !0, this._instance = null, this._app = null, this._nonce = this._def.nonce, this._connected = !1, this._resolved = !1, this._patching = !1, this._dirty = !1, this._numberProps = null, this._styleChildren = /* @__PURE__ */ new WeakSet(), this._styleAnchors = /* @__PURE__ */ new WeakMap(), this._ob = null, this.shadowRoot && n !== Ga ? this._root = this.shadowRoot : e.shadowRoot === !1 ? this._root = this : (this.attachShadow(s({}, e.shadowRootOptions, { mode: "open" })), this._root = this.shadowRoot); +var eo = typeof HTMLElement < "u" ? HTMLElement : class {}, to = class e extends eo { + constructor(e, t = {}, n = oo) { + super(), this._def = e, this._props = t, this._createApp = n, this._isVueCE = !0, this._instance = null, this._app = null, this._nonce = this._def.nonce, this._connected = !1, this._resolved = !1, this._patching = !1, this._dirty = !1, this._numberProps = null, this._styleChildren = /* @__PURE__ */ new WeakSet(), this._styleAnchors = /* @__PURE__ */ new WeakMap(), this._ob = null, this.shadowRoot && n !== oo ? this._root = this.shadowRoot : e.shadowRoot === !1 ? this._root = this : (this.attachShadow(s({}, e.shadowRootOptions, { mode: "open" })), this._root = this.shadowRoot); } connectedCallback() { if (!this.isConnected) return; @@ -2627,7 +2672,7 @@ var za = typeof HTMLElement < "u" ? HTMLElement : class {}, Ba = class e extends e && this._app && Object.setPrototypeOf(this._app._context.provides, e._instance.provides); } disconnectedCallback() { - this._connected = !1, en(() => { + this._connected = !1, mn(() => { this._connected || (this._ob &&= (this._ob.disconnect(), null), this._app && this._app.unmount(), this._instance && (this._instance.ce = void 0), this._app = this._instance = null, this._teleportTargets &&= (this._teleportTargets.clear(), void 0)); }); } @@ -2654,7 +2699,7 @@ var za = typeof HTMLElement < "u" ? HTMLElement : class {}, Ba = class e extends _mount(e) { this._app = this._createApp(e), this._inheritParentContext(), e.configureApp && e.configureApp(this._app), this._app._ceVNode = this._createVNode(), this._app.mount(this._root); let t = this._instance && this._instance.exposed; - if (t) for (let e in t) u(this, e) || Object.defineProperty(this, e, { get: () => Ft(t[e]) }); + if (t) for (let e in t) u(this, e) || Object.defineProperty(this, e, { get: () => Kt(t[e]) }); } _resolveProps(e) { let { props: t } = e, n = d(t) ? t : Object.keys(t || {}); @@ -2670,26 +2715,26 @@ var za = typeof HTMLElement < "u" ? HTMLElement : class {}, Ba = class e extends } _setAttr(e) { if (e.startsWith("data-v-")) return; - let t = this.hasAttribute(e), n = t ? this.getAttribute(e) : La, r = T(e); + let t = this.hasAttribute(e), n = t ? this.getAttribute(e) : Qa, r = T(e); t && this._numberProps && this._numberProps[r] && (n = ce(n)), this._setProp(r, n, !1, !0); } _getProp(e) { return this._props[e]; } _setProp(e, t, n = !0, r = !1) { - if (t !== this._props[e] && (this._dirty = !0, t === La ? delete this._props[e] : (this._props[e] = t, e === "key" && this._app && (this._app._ceVNode.key = t)), r && this._instance && this._update(), n)) { + if (t !== this._props[e] && (this._dirty = !0, t === Qa ? delete this._props[e] : (this._props[e] = t, e === "key" && this._app && (this._app._ceVNode.key = t)), r && this._instance && this._update(), n)) { let n = this._ob; n && (this._processMutations(n.takeRecords()), n.disconnect()), t === !0 ? this.setAttribute(E(e), "") : typeof t == "string" || typeof t == "number" ? this.setAttribute(E(e), t + "") : t || this.removeAttribute(E(e)), n && n.observe(this, { attributes: !0 }); } } _update() { let e = this._createVNode(); - this._app && (e.appContext = this._app._context), Wa(e, this._root); + this._app && (e.appContext = this._app._context), ao(e, this._root); } _createVNode() { let e = {}; this.shadowRoot || (e.onVnodeMounted = e.onVnodeUpdated = this._renderSlots.bind(this)); - let t = Si(this._def, s(e, this._props)); + let t = Fi(this._def, s(e, this._props)); return this._instance || (t.ce = (e) => { this._instance = e, e.ce = this, e.isCE = !0; let t = (e, t) => { @@ -2771,116 +2816,1902 @@ var za = typeof HTMLElement < "u" ? HTMLElement : class {}, Ba = class e extends return this._def.shadowRoot !== !1; } _removeChildStyle(e) {} -}, Va = /* @__PURE__ */ s({ patchProp: Pa }, aa), Ha; -function Ua() { - return Ha ||= Yr(Va); -} -var Wa = ((...e) => { - Ua().render(...e); -}), Ga = ((...e) => { - let t = Ua().createApp(...e), { mount: n } = t; +}, no = /* @__PURE__ */ s({ patchProp: Ya }, ba), ro; +function io() { + return ro ||= ui(no); +} +var ao = ((...e) => { + io().render(...e); +}), oo = ((...e) => { + let t = io().createApp(...e), { mount: n } = t; return t.mount = (e) => { - let r = qa(e); + let r = co(e); if (!r) return; let i = t._component; !h(i) && !i.render && !i.template && (i.template = r.innerHTML), r.nodeType === 1 && (r.textContent = ""); - let a = n(r, !1, Ka(r)); + let a = n(r, !1, so(r)); return r instanceof Element && (r.removeAttribute("v-cloak"), r.setAttribute("data-v-app", "")), a; }, t; }); -function Ka(e) { +function so(e) { if (e instanceof SVGElement) return "svg"; if (typeof MathMLElement == "function" && e instanceof MathMLElement) return "mathml"; } -function qa(e) { +function co(e) { return g(e) ? document.querySelector(e) : e; } -typeof fetch < "u" && fetch.bind(globalThis); //#endregion -//#region packages/sdk-core/src/relationship-registry.ts -var Ja = Symbol.for("comtrya.relationship-registry"); -Ya(); -function Ya() { - let e = globalThis; - return e[Ja] ??= { - types: /* @__PURE__ */ new Map(), - providers: /* @__PURE__ */ new Map(), - subscribers: /* @__PURE__ */ new Set() - }, e[Ja]; +//#region packages/sdk-core/src/session.ts +var lo = "__comtryaSessionState", uo = "__comtryaOperatorCode"; +async function fo(e = {}) { + let t = ho(); + if (t.current && t.current.expiresAtMs > Date.now() + 5e3) return t.current.token; + if (!t.inflight) { + let n = mo(e).finally(() => { + ho().inflight === n && (ho().inflight = void 0); + }); + t.inflight = n; + } + return t.inflight; +} +function po() { + ho().current = void 0; +} +async function mo(e) { + let t = e.operatorCode ?? go(), n = e.fetchImpl ?? fetch, r = e.baseUrl ?? ""; + if (!t) return; + let i = await n(`${r}/auth/token-exchange`, { + method: "POST", + headers: { "content-type": "application/json" }, + body: JSON.stringify({ + grantType: "urn:comtrya:grant:operator-code", + subjectToken: t, + subjectTokenType: "urn:comtrya:token-type:operator-code", + requestedResource: "comtrya://workspace", + requestedActions: [ + "graphql:read", + "graphql:write", + "events:read", + "git:read", + "checks:read" + ] + }) + }); + if (!i.ok) throw Error(`token-exchange failed (${i.status}): ${await i.text()}`); + let a = await i.json(); + if (!a.accessToken) throw Error("token-exchange response missing accessToken"); + let o = (a.expiresIn ?? 1800) * 1e3, s = { + token: a.accessToken, + expiresAtMs: Date.now() + o + }; + return ho().current = s, s.token; +} +function ho() { + let e = _o(); + return e[lo] ??= {}, e[lo]; +} +function go() { + let e = _o()[uo]; + if (e) return e; + try { + let e = { + BASE_URL: "/", + DEV: !1, + MODE: "production", + PROD: !0, + SSR: !1 + }?.PUBLIC_COMTRYA_OPERATOR_CODE; + return e && (_o()[uo] = e), e; + } catch { + return; + } +} +function _o() { + return globalThis; +} +//#endregion +//#region packages/sdk-core/src/runtime.ts +async function vo(e, t, n, r, i = {}) { + let a = `${i.baseUrl ?? ""}/api/ops/${encodeURIComponent(e)}/${encodeURIComponent(t)}/${encodeURIComponent(n)}`, o = { "content-type": "application/json" }, s = i.token ?? await fo(); + s && (o.authorization = `Bearer ${s}`); + try { + let e = await fetch(a, { + method: "POST", + headers: o, + body: JSON.stringify(r ?? null), + signal: i.signal, + credentials: "include" + }); + e.status === 401 && po(); + let t = await e.text(); + if (!e.ok) { + let n; + try { + n = t ? JSON.parse(t) : void 0; + } catch { + n = void 0; + } + let r = bo(e.status), i = typeof n?.message == "string" ? n.message : void 0; + return { + ok: !1, + error: { + code: yo(n?.code) ?? r, + message: i ?? (t || e.statusText), + path: n?.path + } + }; + } + return { + ok: !0, + value: t ? JSON.parse(t) : null + }; + } catch (e) { + return { + ok: !1, + error: { + code: "unavailable", + message: e instanceof Error ? e.message : String(e) + } + }; + } } +function yo(e) { + switch (e) { + case "not-found": + case "conflict": + case "forbidden": + case "unauthenticated": + case "bad-input": + case "internal": + case "unavailable": return e; + default: return; + } +} +function bo(e) { + switch (e) { + case 400: return "bad-input"; + case 401: return "unauthenticated"; + case 403: return "forbidden"; + case 404: return "not-found"; + case 409: return "conflict"; + case 503: return "unavailable"; + default: return "internal"; + } +} +typeof fetch < "u" && fetch.bind(globalThis); //#endregion //#region node_modules/.bun/tinykeys@3.0.0/node_modules/tinykeys/dist/tinykeys.module.js -var Xa = typeof navigator == "object" ? navigator.platform : ""; -/Mac|iPod|iPhone|iPad/.test(Xa); +var xo = typeof navigator == "object" ? navigator.platform : ""; +/Mac|iPod|iPhone|iPad/.test(xo); +//#endregion +//#region node_modules/.bun/marked@18.0.4/node_modules/marked/lib/marked.esm.js +function So() { + return { + async: !1, + breaks: !1, + extensions: null, + gfm: !0, + hooks: null, + pedantic: !1, + renderer: null, + silent: !1, + tokenizer: null, + walkTokens: null + }; +} +var Co = So(); +function wo(e) { + Co = e; +} +var To = { exec: () => null }; +function Eo(e) { + let t = []; + return (n) => { + let r = Math.max(0, Math.min(3, n - 1)), i = t[r]; + return i || (i = e(r), t[r] = i), i; + }; +} +function Y(e, t = "") { + let n = typeof e == "string" ? e : e.source, r = { + replace: (e, t) => { + let i = typeof t == "string" ? t : t.source; + return i = i.replace(X.caret, "$1"), n = n.replace(e, i), r; + }, + getRegex: () => new RegExp(n, t) + }; + return r; +} +var Do = ((e = "") => { + try { + return !!RegExp("(?<=1)(?/, + blockquoteSetextReplace: /\n {0,3}((?:=+|-+) *)(?=\n|$)/g, + blockquoteSetextReplace2: /^ {0,3}>[ \t]?/gm, + listReplaceNesting: /^ {1,4}(?=( {4})*[^ ])/g, + listIsTask: /^\[[ xX]\] +\S/, + listReplaceTask: /^\[[ xX]\] +/, + listTaskCheckbox: /\[[ xX]\]/, + anyLine: /\n.*\n/, + hrefBrackets: /^<(.*)>$/, + tableDelimiter: /[:|]/, + tableAlignChars: /^\||\| *$/g, + tableRowBlankLine: /\n[ \t]*$/, + tableAlignRight: /^ *-+: *$/, + tableAlignCenter: /^ *:-+: *$/, + tableAlignLeft: /^ *:-+ *$/, + startATag: /^/i, + startPreScriptTag: /^<(pre|code|kbd|script)(\s|>)/i, + endPreScriptTag: /^<\/(pre|code|kbd|script)(\s|>)/i, + startAngleBracket: /^$/, + pedanticHrefTitle: /^([^'"]*[^\s])\s+(['"])(.*)\2/, + unicodeAlphaNumeric: /[\p{L}\p{N}]/u, + escapeTest: /[&<>"']/, + escapeReplace: /[&<>"']/g, + escapeTestNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/, + escapeReplaceNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g, + caret: /(^|[^\[])\^/g, + percentDecode: /%25/g, + findPipe: /\|/g, + splitPipe: / \|/, + slashPipe: /\\\|/g, + carriageReturn: /\r\n|\r/g, + spaceLine: /^ +$/gm, + notSpaceStart: /^\S*/, + endingNewline: /\n$/, + listItemRegex: (e) => RegExp(`^( {0,3}${e})((?:[ ][^\\n]*)?(?:\\n|$))`), + nextBulletRegex: Eo((e) => RegExp(`^ {0,${e}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`)), + hrRegex: Eo((e) => RegExp(`^ {0,${e}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`)), + fencesBeginRegex: Eo((e) => RegExp(`^ {0,${e}}(?:\`\`\`|~~~)`)), + headingBeginRegex: Eo((e) => RegExp(`^ {0,${e}}#`)), + htmlBeginRegex: Eo((e) => RegExp(`^ {0,${e}}<(?:[a-z].*>|!--)`, "i")), + blockquoteBeginRegex: Eo((e) => RegExp(`^ {0,${e}}>`)) +}, Oo = /^(?:[ \t]*(?:\n|$))+/, ko = /^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/, Ao = /^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/, jo = /^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/, Mo = /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/, No = / {0,3}(?:[*+-]|\d{1,9}[.)])/, Po = /^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/, Fo = Y(Po).replace(/bull/g, No).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/\|table/g, "").getRegex(), Io = Y(Po).replace(/bull/g, No).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/table/g, / {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(), Lo = /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/, Ro = /^[^\n]+/, zo = /(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/, Bo = Y(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label", zo).replace("title", /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(), Vo = Y(/^(bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g, No).getRegex(), Ho = "address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul", Uo = /|$))/, Wo = Y("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))", "i").replace("comment", Uo).replace("tag", Ho).replace("attribute", / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(), Go = Y(Lo).replace("hr", jo).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("|table", "").replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", Ho).getRegex(), Ko = { + blockquote: Y(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph", Go).getRegex(), + code: ko, + def: Bo, + fences: Ao, + heading: Mo, + hr: jo, + html: Wo, + lheading: Fo, + list: Vo, + newline: Oo, + paragraph: Go, + table: To, + text: Ro +}, qo = Y("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr", jo).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("blockquote", " {0,3}>").replace("code", "(?: {4}| {0,3} )[^\\n]").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", Ho).getRegex(), Jo = { + ...Ko, + lheading: Io, + table: qo, + paragraph: Y(Lo).replace("hr", jo).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("table", qo).replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", Ho).getRegex() +}, Yo = { + ...Ko, + html: Y("^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))").replace("comment", Uo).replace(/tag/g, "(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(), + def: /^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/, + heading: /^(#{1,6})(.*)(?:\n+|$)/, + fences: To, + lheading: /^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/, + paragraph: Y(Lo).replace("hr", jo).replace("heading", " *#{1,6} *[^\n]").replace("lheading", Fo).replace("|table", "").replace("blockquote", " {0,3}>").replace("|fences", "").replace("|list", "").replace("|html", "").replace("|tag", "").getRegex() +}, Xo = /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/, Zo = /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/, Qo = /^( {2,}|\\)\n(?!\s*$)/, $o = /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\`+)[^`]+\k(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace("precode-", Do ? "(?`+)[^`]+\k(?!`)/).replace("html", /<(?! )[^<>]*?>/).getRegex(), cs = /^(?:\*+(?:((?!\*)punct)|([^\s*]))?)|^_+(?:((?!_)punct)|([^\s_]))?/, ls = Y(cs, "u").replace(/punct/g, es).getRegex(), us = Y(cs, "u").replace(/punct/g, is).getRegex(), ds = "^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)", fs = Y(ds, "gu").replace(/notPunctSpace/g, ns).replace(/punctSpace/g, ts).replace(/punct/g, es).getRegex(), ps = Y(ds, "gu").replace(/notPunctSpace/g, os).replace(/punctSpace/g, as).replace(/punct/g, is).getRegex(), ms = Y("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)", "gu").replace(/notPunctSpace/g, ns).replace(/punctSpace/g, ts).replace(/punct/g, es).getRegex(), hs = Y(/^~~?(?:((?!~)punct)|[^\s~])/, "u").replace(/punct/g, es).getRegex(), gs = Y("^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)", "gu").replace(/notPunctSpace/g, ns).replace(/punctSpace/g, ts).replace(/punct/g, es).getRegex(), _s = Y(/\\(punct)/, "gu").replace(/punct/g, es).getRegex(), vs = Y(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme", /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email", /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(), ys = Y(Uo).replace("(?:-->|$)", "-->").getRegex(), bs = Y("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment", ys).replace("attribute", /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(), xs = /(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\])|[^\[\]\\`])*?/, Ss = Y(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]+(?:\n[ \t]*)?|\n[ \t]*)(title))?\s*\)/).replace("label", xs).replace("href", /<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title", /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(), Cs = Y(/^!?\[(label)\]\[(ref)\]/).replace("label", xs).replace("ref", zo).getRegex(), ws = Y(/^!?\[(ref)\](?:\[\])?/).replace("ref", zo).getRegex(), Ts = Y("reflink|nolink(?!\\()", "g").replace("reflink", Cs).replace("nolink", ws).getRegex(), Es = /[hH][tT][tT][pP][sS]?|[fF][tT][pP]/, Ds = { + _backpedal: To, + anyPunctuation: _s, + autolink: vs, + blockSkip: ss, + br: Qo, + code: Zo, + del: To, + delLDelim: To, + delRDelim: To, + emStrongLDelim: ls, + emStrongRDelimAst: fs, + emStrongRDelimUnd: ms, + escape: Xo, + link: Ss, + nolink: ws, + punctuation: rs, + reflink: Cs, + reflinkSearch: Ts, + tag: bs, + text: $o, + url: To +}, Os = { + ...Ds, + link: Y(/^!?\[(label)\]\((.*?)\)/).replace("label", xs).getRegex(), + reflink: Y(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label", xs).getRegex() +}, ks = { + ...Ds, + emStrongRDelimAst: ps, + emStrongLDelim: us, + delLDelim: hs, + delRDelim: gs, + url: Y(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol", Es).replace("email", /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(), + _backpedal: /(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/, + del: /^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/, + text: Y(/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\": ">", + "\"": """, + "'": "'" +}, Ps = (e) => Ns[e]; +function Fs(e, t) { + if (t) { + if (X.escapeTest.test(e)) return e.replace(X.escapeReplace, Ps); + } else if (X.escapeTestNoEncode.test(e)) return e.replace(X.escapeReplaceNoEncode, Ps); + return e; +} +function Is(e) { + try { + e = encodeURI(e).replace(X.percentDecode, "%"); + } catch { + return null; + } + return e; +} +function Ls(e, t) { + let n = e.replace(X.findPipe, (e, t, n) => { + let r = !1, i = t; + for (; --i >= 0 && n[i] === "\\";) r = !r; + return r ? "|" : " |"; + }).split(X.splitPipe), r = 0; + if (n[0].trim() || n.shift(), n.length > 0 && !n.at(-1)?.trim() && n.pop(), t) if (n.length > t) n.splice(t); + else for (; n.length < t;) n.push(""); + for (; r < n.length; r++) n[r] = n[r].trim().replace(X.slashPipe, "|"); + return n; +} +function Rs(e, t, n) { + let r = e.length; + if (r === 0) return ""; + let i = 0; + for (; i < r;) { + let a = e.charAt(r - i - 1); + if (a === t && !n) i++; + else if (a !== t && n) i++; + else break; + } + return e.slice(0, r - i); +} +function zs(e) { + let t = e.split("\n"), n = t.length - 1; + for (; n >= 0 && X.blankLine.test(t[n]);) n--; + return t.length - n <= 2 ? e : t.slice(0, n + 1).join("\n"); +} +function Bs(e, t) { + if (e.indexOf(t[1]) === -1) return -1; + let n = 0; + for (let r = 0; r < e.length; r++) if (e[r] === "\\") r++; + else if (e[r] === t[0]) n++; + else if (e[r] === t[1] && (n--, n < 0)) return r; + return n > 0 ? -2 : -1; +} +function Vs(e, t = 0) { + let n = t, r = ""; + for (let t of e) if (t === " ") { + let e = 4 - n % 4; + r += " ".repeat(e), n += e; + } else r += t, n++; + return r; +} +function Hs(e, t, n, r, i) { + let a = t.href, o = t.title || null, s = e[1].replace(i.other.outputLinkReplace, "$1"); + r.state.inLink = !0; + let c = { + type: e[0].charAt(0) === "!" ? "image" : "link", + raw: n, + href: a, + title: o, + text: s, + tokens: r.inlineTokens(s) + }; + return r.state.inLink = !1, c; +} +function Us(e, t, n) { + let r = e.match(n.other.indentCodeCompensation); + if (r === null) return t; + let i = r[1]; + return t.split("\n").map((e) => { + let t = e.match(n.other.beginningSpace); + if (t === null) return e; + let [r] = t; + return r.length >= i.length ? e.slice(i.length) : e; + }).join("\n"); +} +var Ws = class { + options; + rules; + lexer; + constructor(e) { + this.options = e || Co; + } + space(e) { + let t = this.rules.block.newline.exec(e); + if (t && t[0].length > 0) return { + type: "space", + raw: t[0] + }; + } + code(e) { + let t = this.rules.block.code.exec(e); + if (t) { + let e = this.options.pedantic ? t[0] : zs(t[0]); + return { + type: "code", + raw: e, + codeBlockStyle: "indented", + text: e.replace(this.rules.other.codeRemoveIndent, "") + }; + } + } + fences(e) { + let t = this.rules.block.fences.exec(e); + if (t) { + let e = t[0], n = Us(e, t[3] || "", this.rules); + return { + type: "code", + raw: e, + lang: t[2] ? t[2].trim().replace(this.rules.inline.anyPunctuation, "$1") : t[2], + text: n + }; + } + } + heading(e) { + let t = this.rules.block.heading.exec(e); + if (t) { + let e = t[2].trim(); + if (this.rules.other.endingHash.test(e)) { + let t = Rs(e, "#"); + (this.options.pedantic || !t || this.rules.other.endingSpaceChar.test(t)) && (e = t.trim()); + } + return { + type: "heading", + raw: Rs(t[0], "\n"), + depth: t[1].length, + text: e, + tokens: this.lexer.inline(e) + }; + } + } + hr(e) { + let t = this.rules.block.hr.exec(e); + if (t) return { + type: "hr", + raw: Rs(t[0], "\n") + }; + } + blockquote(e) { + let t = this.rules.block.blockquote.exec(e); + if (t) { + let e = Rs(t[0], "\n").split("\n"), n = "", r = "", i = []; + for (; e.length > 0;) { + let t = !1, a = [], o; + for (o = 0; o < e.length; o++) if (this.rules.other.blockquoteStart.test(e[o])) a.push(e[o]), t = !0; + else if (!t) a.push(e[o]); + else break; + e = e.slice(o); + let s = a.join("\n"), c = s.replace(this.rules.other.blockquoteSetextReplace, "\n $1").replace(this.rules.other.blockquoteSetextReplace2, ""); + n = n ? `${n} +${s}` : s, r = r ? `${r} +${c}` : c; + let l = this.lexer.state.top; + if (this.lexer.state.top = !0, this.lexer.blockTokens(c, i, !0), this.lexer.state.top = l, e.length === 0) break; + let u = i.at(-1); + if (u?.type === "code") break; + if (u?.type === "blockquote") { + let t = u, a = t.raw + "\n" + e.join("\n"), o = this.blockquote(a); + i[i.length - 1] = o, n = n.substring(0, n.length - t.raw.length) + o.raw, r = r.substring(0, r.length - t.text.length) + o.text; + break; + } else if (u?.type === "list") { + let t = u, a = t.raw + "\n" + e.join("\n"), o = this.list(a); + i[i.length - 1] = o, n = n.substring(0, n.length - u.raw.length) + o.raw, r = r.substring(0, r.length - t.raw.length) + o.raw, e = a.substring(i.at(-1).raw.length).split("\n"); + continue; + } + } + return { + type: "blockquote", + raw: n, + tokens: i, + text: r + }; + } + } + list(e) { + let t = this.rules.block.list.exec(e); + if (t) { + let n = t[1].trim(), r = n.length > 1, i = { + type: "list", + raw: "", + ordered: r, + start: r ? +n.slice(0, -1) : "", + loose: !1, + items: [] + }; + n = r ? `\\d{1,9}\\${n.slice(-1)}` : `\\${n}`, this.options.pedantic && (n = r ? n : "[*+-]"); + let a = this.rules.other.listItemRegex(n), o = !1; + for (; e;) { + let n = !1, r = "", s = ""; + if (!(t = a.exec(e)) || this.rules.block.hr.test(e)) break; + r = t[0], e = e.substring(r.length); + let c = Vs(t[2].split("\n", 1)[0], t[1].length), l = e.split("\n", 1)[0], u = !c.trim(), d = 0; + if (this.options.pedantic ? (d = 2, s = c.trimStart()) : u ? d = t[1].length + 1 : (d = c.search(this.rules.other.nonSpaceChar), d = d > 4 ? 1 : d, s = c.slice(d), d += t[1].length), u && this.rules.other.blankLine.test(l) && (r += l + "\n", e = e.substring(l.length + 1), n = !0), !n) { + let t = this.rules.other.nextBulletRegex(d), n = this.rules.other.hrRegex(d), i = this.rules.other.fencesBeginRegex(d), a = this.rules.other.headingBeginRegex(d), o = this.rules.other.htmlBeginRegex(d), f = this.rules.other.blockquoteBeginRegex(d); + for (; e;) { + let p = e.split("\n", 1)[0], m; + if (l = p, this.options.pedantic ? (l = l.replace(this.rules.other.listReplaceNesting, " "), m = l) : m = l.replace(this.rules.other.tabCharGlobal, " "), i.test(l) || a.test(l) || o.test(l) || f.test(l) || t.test(l) || n.test(l)) break; + if (m.search(this.rules.other.nonSpaceChar) >= d || !l.trim()) s += "\n" + m.slice(d); + else { + if (u || c.replace(this.rules.other.tabCharGlobal, " ").search(this.rules.other.nonSpaceChar) >= 4 || i.test(c) || a.test(c) || n.test(c)) break; + s += "\n" + l; + } + u = !l.trim(), r += p + "\n", e = e.substring(p.length + 1), c = m.slice(d); + } + } + i.loose || (o ? i.loose = !0 : this.rules.other.doubleBlankLine.test(r) && (o = !0)), i.items.push({ + type: "list_item", + raw: r, + task: !!this.options.gfm && this.rules.other.listIsTask.test(s), + loose: !1, + text: s, + tokens: [] + }), i.raw += r; + } + let s = i.items.at(-1); + if (s) s.raw = s.raw.trimEnd(), s.text = s.text.trimEnd(); + else return; + i.raw = i.raw.trimEnd(); + for (let e of i.items) { + this.lexer.state.top = !1, e.tokens = this.lexer.blockTokens(e.text, []); + let t = e.tokens[0]; + if (e.task && (t?.type === "text" || t?.type === "paragraph")) { + e.text = e.text.replace(this.rules.other.listReplaceTask, ""), t.raw = t.raw.replace(this.rules.other.listReplaceTask, ""), t.text = t.text.replace(this.rules.other.listReplaceTask, ""); + for (let e = this.lexer.inlineQueue.length - 1; e >= 0; e--) if (this.rules.other.listIsTask.test(this.lexer.inlineQueue[e].src)) { + this.lexer.inlineQueue[e].src = this.lexer.inlineQueue[e].src.replace(this.rules.other.listReplaceTask, ""); + break; + } + let n = this.rules.other.listTaskCheckbox.exec(e.raw); + if (n) { + let t = { + type: "checkbox", + raw: n[0] + " ", + checked: n[0] !== "[ ]" + }; + e.checked = t.checked, i.loose ? e.tokens[0] && ["paragraph", "text"].includes(e.tokens[0].type) && "tokens" in e.tokens[0] && e.tokens[0].tokens ? (e.tokens[0].raw = t.raw + e.tokens[0].raw, e.tokens[0].text = t.raw + e.tokens[0].text, e.tokens[0].tokens.unshift(t)) : e.tokens.unshift({ + type: "paragraph", + raw: t.raw, + text: t.raw, + tokens: [t] + }) : e.tokens.unshift(t); + } + } else e.task &&= !1; + if (!i.loose) { + let t = e.tokens.filter((e) => e.type === "space"); + i.loose = t.length > 0 && t.some((e) => this.rules.other.anyLine.test(e.raw)); + } + } + if (i.loose) for (let e of i.items) { + e.loose = !0; + for (let t of e.tokens) t.type === "text" && (t.type = "paragraph"); + } + return i; + } + } + html(e) { + let t = this.rules.block.html.exec(e); + if (t) { + let e = zs(t[0]); + return { + type: "html", + block: !0, + raw: e, + pre: t[1] === "pre" || t[1] === "script" || t[1] === "style", + text: e + }; + } + } + def(e) { + let t = this.rules.block.def.exec(e); + if (t) { + let e = t[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal, " "), n = t[2] ? t[2].replace(this.rules.other.hrefBrackets, "$1").replace(this.rules.inline.anyPunctuation, "$1") : "", r = t[3] ? t[3].substring(1, t[3].length - 1).replace(this.rules.inline.anyPunctuation, "$1") : t[3]; + return { + type: "def", + tag: e, + raw: Rs(t[0], "\n"), + href: n, + title: r + }; + } + } + table(e) { + let t = this.rules.block.table.exec(e); + if (!t || !this.rules.other.tableDelimiter.test(t[2])) return; + let n = Ls(t[1]), r = t[2].replace(this.rules.other.tableAlignChars, "").split("|"), i = t[3]?.trim() ? t[3].replace(this.rules.other.tableRowBlankLine, "").split("\n") : [], a = { + type: "table", + raw: Rs(t[0], "\n"), + header: [], + align: [], + rows: [] + }; + if (n.length === r.length) { + for (let e of r) this.rules.other.tableAlignRight.test(e) ? a.align.push("right") : this.rules.other.tableAlignCenter.test(e) ? a.align.push("center") : this.rules.other.tableAlignLeft.test(e) ? a.align.push("left") : a.align.push(null); + for (let e = 0; e < n.length; e++) a.header.push({ + text: n[e], + tokens: this.lexer.inline(n[e]), + header: !0, + align: a.align[e] + }); + for (let e of i) a.rows.push(Ls(e, a.header.length).map((e, t) => ({ + text: e, + tokens: this.lexer.inline(e), + header: !1, + align: a.align[t] + }))); + return a; + } + } + lheading(e) { + let t = this.rules.block.lheading.exec(e); + if (t) { + let e = t[1].trim(); + return { + type: "heading", + raw: Rs(t[0], "\n"), + depth: t[2].charAt(0) === "=" ? 1 : 2, + text: e, + tokens: this.lexer.inline(e) + }; + } + } + paragraph(e) { + let t = this.rules.block.paragraph.exec(e); + if (t) { + let e = t[1].charAt(t[1].length - 1) === "\n" ? t[1].slice(0, -1) : t[1]; + return { + type: "paragraph", + raw: t[0], + text: e, + tokens: this.lexer.inline(e) + }; + } + } + text(e) { + let t = this.rules.block.text.exec(e); + if (t) return { + type: "text", + raw: t[0], + text: t[0], + tokens: this.lexer.inline(t[0]) + }; + } + escape(e) { + let t = this.rules.inline.escape.exec(e); + if (t) return { + type: "escape", + raw: t[0], + text: t[1] + }; + } + tag(e) { + let t = this.rules.inline.tag.exec(e); + if (t) return !this.lexer.state.inLink && this.rules.other.startATag.test(t[0]) ? this.lexer.state.inLink = !0 : this.lexer.state.inLink && this.rules.other.endATag.test(t[0]) && (this.lexer.state.inLink = !1), !this.lexer.state.inRawBlock && this.rules.other.startPreScriptTag.test(t[0]) ? this.lexer.state.inRawBlock = !0 : this.lexer.state.inRawBlock && this.rules.other.endPreScriptTag.test(t[0]) && (this.lexer.state.inRawBlock = !1), { + type: "html", + raw: t[0], + inLink: this.lexer.state.inLink, + inRawBlock: this.lexer.state.inRawBlock, + block: !1, + text: t[0] + }; + } + link(e) { + let t = this.rules.inline.link.exec(e); + if (t) { + let e = t[2].trim(); + if (!this.options.pedantic && this.rules.other.startAngleBracket.test(e)) { + if (!this.rules.other.endAngleBracket.test(e)) return; + let t = Rs(e.slice(0, -1), "\\"); + if ((e.length - t.length) % 2 == 0) return; + } else { + let e = Bs(t[2], "()"); + if (e === -2) return; + if (e > -1) { + let n = (t[0].indexOf("!") === 0 ? 5 : 4) + t[1].length + e; + t[2] = t[2].substring(0, e), t[0] = t[0].substring(0, n).trim(), t[3] = ""; + } + } + let n = t[2], r = ""; + if (this.options.pedantic) { + let e = this.rules.other.pedanticHrefTitle.exec(n); + e && (n = e[1], r = e[3]); + } else r = t[3] ? t[3].slice(1, -1) : ""; + return n = n.trim(), this.rules.other.startAngleBracket.test(n) && (n = this.options.pedantic && !this.rules.other.endAngleBracket.test(e) ? n.slice(1) : n.slice(1, -1)), Hs(t, { + href: n && n.replace(this.rules.inline.anyPunctuation, "$1"), + title: r && r.replace(this.rules.inline.anyPunctuation, "$1") + }, t[0], this.lexer, this.rules); + } + } + reflink(e, t) { + let n; + if ((n = this.rules.inline.reflink.exec(e)) || (n = this.rules.inline.nolink.exec(e))) { + let e = t[(n[2] || n[1]).replace(this.rules.other.multipleSpaceGlobal, " ").toLowerCase()]; + if (!e) { + let e = n[0].charAt(0); + return { + type: "text", + raw: e, + text: e + }; + } + return Hs(n, e, n[0], this.lexer, this.rules); + } + } + emStrong(e, t, n = "") { + let r = this.rules.inline.emStrongLDelim.exec(e); + if (!(!r || !r[1] && !r[2] && !r[3] && !r[4] || r[4] && n.match(this.rules.other.unicodeAlphaNumeric)) && (!(r[1] || r[3]) || !n || this.rules.inline.punctuation.exec(n))) { + let n = [...r[0]].length - 1, i, a, o = n, s = 0, c = r[0][0] === "*" ? this.rules.inline.emStrongRDelimAst : this.rules.inline.emStrongRDelimUnd; + for (c.lastIndex = 0, t = t.slice(-1 * e.length + n); (r = c.exec(t)) !== null;) { + if (i = r[1] || r[2] || r[3] || r[4] || r[5] || r[6], !i) continue; + if (a = [...i].length, r[3] || r[4]) { + o += a; + continue; + } else if ((r[5] || r[6]) && n % 3 && !((n + a) % 3)) { + s += a; + continue; + } + if (o -= a, o > 0) continue; + a = Math.min(a, a + o + s); + let t = [...r[0]][0].length, c = e.slice(0, n + r.index + t + a); + if (Math.min(n, a) % 2) { + let e = c.slice(1, -1); + return { + type: "em", + raw: c, + text: e, + tokens: this.lexer.inlineTokens(e) + }; + } + let l = c.slice(2, -2); + return { + type: "strong", + raw: c, + text: l, + tokens: this.lexer.inlineTokens(l) + }; + } + } + } + codespan(e) { + let t = this.rules.inline.code.exec(e); + if (t) { + let e = t[2].replace(this.rules.other.newLineCharGlobal, " "), n = this.rules.other.nonSpaceChar.test(e), r = this.rules.other.startingSpaceChar.test(e) && this.rules.other.endingSpaceChar.test(e); + return n && r && (e = e.substring(1, e.length - 1)), { + type: "codespan", + raw: t[0], + text: e + }; + } + } + br(e) { + let t = this.rules.inline.br.exec(e); + if (t) return { + type: "br", + raw: t[0] + }; + } + del(e, t, n = "") { + let r = this.rules.inline.delLDelim.exec(e); + if (r && (!r[1] || !n || this.rules.inline.punctuation.exec(n))) { + let n = [...r[0]].length - 1, i, a, o = n, s = this.rules.inline.delRDelim; + for (s.lastIndex = 0, t = t.slice(-1 * e.length + n); (r = s.exec(t)) !== null;) { + if (i = r[1] || r[2] || r[3] || r[4] || r[5] || r[6], !i || (a = [...i].length, a !== n)) continue; + if (r[3] || r[4]) { + o += a; + continue; + } + if (o -= a, o > 0) continue; + a = Math.min(a, a + o); + let t = [...r[0]][0].length, s = e.slice(0, n + r.index + t + a), c = s.slice(n, -n); + return { + type: "del", + raw: s, + text: c, + tokens: this.lexer.inlineTokens(c) + }; + } + } + } + autolink(e) { + let t = this.rules.inline.autolink.exec(e); + if (t) { + let e, n; + return t[2] === "@" ? (e = t[1], n = "mailto:" + e) : (e = t[1], n = e), { + type: "link", + raw: t[0], + text: e, + href: n, + tokens: [{ + type: "text", + raw: e, + text: e + }] + }; + } + } + url(e) { + let t; + if (t = this.rules.inline.url.exec(e)) { + let e, n; + if (t[2] === "@") e = t[0], n = "mailto:" + e; + else { + let r; + do + r = t[0], t[0] = this.rules.inline._backpedal.exec(t[0])?.[0] ?? ""; + while (r !== t[0]); + e = t[0], n = t[1] === "www." ? "http://" + t[0] : t[0]; + } + return { + type: "link", + raw: t[0], + text: e, + href: n, + tokens: [{ + type: "text", + raw: e, + text: e + }] + }; + } + } + inlineText(e) { + let t = this.rules.inline.text.exec(e); + if (t) { + let e = this.lexer.state.inRawBlock; + return { + type: "text", + raw: t[0], + text: t[0], + escaped: e + }; + } + } +}, Z = class e { + tokens; + options; + state; + inlineQueue; + tokenizer; + constructor(e) { + this.tokens = [], this.tokens.links = Object.create(null), this.options = e || Co, this.options.tokenizer = this.options.tokenizer || new Ws(), this.tokenizer = this.options.tokenizer, this.tokenizer.options = this.options, this.tokenizer.lexer = this, this.inlineQueue = [], this.state = { + inLink: !1, + inRawBlock: !1, + top: !0 + }; + let t = { + other: X, + block: js.normal, + inline: Ms.normal + }; + this.options.pedantic ? (t.block = js.pedantic, t.inline = Ms.pedantic) : this.options.gfm && (t.block = js.gfm, this.options.breaks ? t.inline = Ms.breaks : t.inline = Ms.gfm), this.tokenizer.rules = t; + } + static get rules() { + return { + block: js, + inline: Ms + }; + } + static lex(t, n) { + return new e(n).lex(t); + } + static lexInline(t, n) { + return new e(n).inlineTokens(t); + } + lex(e) { + e = e.replace(X.carriageReturn, "\n"), this.blockTokens(e, this.tokens); + for (let e = 0; e < this.inlineQueue.length; e++) { + let t = this.inlineQueue[e]; + this.inlineTokens(t.src, t.tokens); + } + return this.inlineQueue = [], this.tokens; + } + blockTokens(e, t = [], n = !1) { + this.tokenizer.lexer = this, this.options.pedantic && (e = e.replace(X.tabCharGlobal, " ").replace(X.spaceLine, "")); + let r = Infinity; + for (; e;) { + if (e.length < r) r = e.length; + else { + this.infiniteLoopError(e.charCodeAt(0)); + break; + } + let i; + if (this.options.extensions?.block?.some((n) => (i = n.call({ lexer: this }, e, t)) ? (e = e.substring(i.raw.length), t.push(i), !0) : !1)) continue; + if (i = this.tokenizer.space(e)) { + e = e.substring(i.raw.length); + let n = t.at(-1); + i.raw.length === 1 && n !== void 0 ? n.raw += "\n" : t.push(i); + continue; + } + if (i = this.tokenizer.code(e)) { + e = e.substring(i.raw.length); + let n = t.at(-1); + n?.type === "paragraph" || n?.type === "text" ? (n.raw += (n.raw.endsWith("\n") ? "" : "\n") + i.raw, n.text += "\n" + i.text, this.inlineQueue.at(-1).src = n.text) : t.push(i); + continue; + } + if (i = this.tokenizer.fences(e)) { + e = e.substring(i.raw.length), t.push(i); + continue; + } + if (i = this.tokenizer.heading(e)) { + e = e.substring(i.raw.length), t.push(i); + continue; + } + if (i = this.tokenizer.hr(e)) { + e = e.substring(i.raw.length), t.push(i); + continue; + } + if (i = this.tokenizer.blockquote(e)) { + e = e.substring(i.raw.length), t.push(i); + continue; + } + if (i = this.tokenizer.list(e)) { + e = e.substring(i.raw.length), t.push(i); + continue; + } + if (i = this.tokenizer.html(e)) { + e = e.substring(i.raw.length), t.push(i); + continue; + } + if (i = this.tokenizer.def(e)) { + e = e.substring(i.raw.length); + let n = t.at(-1); + n?.type === "paragraph" || n?.type === "text" ? (n.raw += (n.raw.endsWith("\n") ? "" : "\n") + i.raw, n.text += "\n" + i.raw, this.inlineQueue.at(-1).src = n.text) : this.tokens.links[i.tag] || (this.tokens.links[i.tag] = { + href: i.href, + title: i.title + }, t.push(i)); + continue; + } + if (i = this.tokenizer.table(e)) { + e = e.substring(i.raw.length), t.push(i); + continue; + } + if (i = this.tokenizer.lheading(e)) { + e = e.substring(i.raw.length), t.push(i); + continue; + } + let a = e; + if (this.options.extensions?.startBlock) { + let t = Infinity, n = e.slice(1), r; + this.options.extensions.startBlock.forEach((e) => { + r = e.call({ lexer: this }, n), typeof r == "number" && r >= 0 && (t = Math.min(t, r)); + }), t < Infinity && t >= 0 && (a = e.substring(0, t + 1)); + } + if (this.state.top && (i = this.tokenizer.paragraph(a))) { + let r = t.at(-1); + n && r?.type === "paragraph" ? (r.raw += (r.raw.endsWith("\n") ? "" : "\n") + i.raw, r.text += "\n" + i.text, this.inlineQueue.pop(), this.inlineQueue.at(-1).src = r.text) : t.push(i), n = a.length !== e.length, e = e.substring(i.raw.length); + continue; + } + if (i = this.tokenizer.text(e)) { + e = e.substring(i.raw.length); + let n = t.at(-1); + n?.type === "text" ? (n.raw += (n.raw.endsWith("\n") ? "" : "\n") + i.raw, n.text += "\n" + i.text, this.inlineQueue.pop(), this.inlineQueue.at(-1).src = n.text) : t.push(i); + continue; + } + if (e) { + this.infiniteLoopError(e.charCodeAt(0)); + break; + } + } + return this.state.top = !0, t; + } + inline(e, t = []) { + return this.inlineQueue.push({ + src: e, + tokens: t + }), t; + } + inlineTokens(e, t = []) { + this.tokenizer.lexer = this; + let n = e, r = null; + if (this.tokens.links) { + let e = Object.keys(this.tokens.links); + if (e.length > 0) for (; (r = this.tokenizer.rules.inline.reflinkSearch.exec(n)) !== null;) e.includes(r[0].slice(r[0].lastIndexOf("[") + 1, -1)) && (n = n.slice(0, r.index) + "[" + "a".repeat(r[0].length - 2) + "]" + n.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex)); + } + for (; (r = this.tokenizer.rules.inline.anyPunctuation.exec(n)) !== null;) n = n.slice(0, r.index) + "++" + n.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex); + let i; + for (; (r = this.tokenizer.rules.inline.blockSkip.exec(n)) !== null;) i = r[2] ? r[2].length : 0, n = n.slice(0, r.index + i) + "[" + "a".repeat(r[0].length - i - 2) + "]" + n.slice(this.tokenizer.rules.inline.blockSkip.lastIndex); + n = this.options.hooks?.emStrongMask?.call({ lexer: this }, n) ?? n; + let a = !1, o = "", s = Infinity; + for (; e;) { + if (e.length < s) s = e.length; + else { + this.infiniteLoopError(e.charCodeAt(0)); + break; + } + a || (o = ""), a = !1; + let r; + if (this.options.extensions?.inline?.some((n) => (r = n.call({ lexer: this }, e, t)) ? (e = e.substring(r.raw.length), t.push(r), !0) : !1)) continue; + if (r = this.tokenizer.escape(e)) { + e = e.substring(r.raw.length), t.push(r); + continue; + } + if (r = this.tokenizer.tag(e)) { + e = e.substring(r.raw.length), t.push(r); + continue; + } + if (r = this.tokenizer.link(e)) { + e = e.substring(r.raw.length), t.push(r); + continue; + } + if (r = this.tokenizer.reflink(e, this.tokens.links)) { + e = e.substring(r.raw.length); + let n = t.at(-1); + r.type === "text" && n?.type === "text" ? (n.raw += r.raw, n.text += r.text) : t.push(r); + continue; + } + if (r = this.tokenizer.emStrong(e, n, o)) { + e = e.substring(r.raw.length), t.push(r); + continue; + } + if (r = this.tokenizer.codespan(e)) { + e = e.substring(r.raw.length), t.push(r); + continue; + } + if (r = this.tokenizer.br(e)) { + e = e.substring(r.raw.length), t.push(r); + continue; + } + if (r = this.tokenizer.del(e, n, o)) { + e = e.substring(r.raw.length), t.push(r); + continue; + } + if (r = this.tokenizer.autolink(e)) { + e = e.substring(r.raw.length), t.push(r); + continue; + } + if (!this.state.inLink && (r = this.tokenizer.url(e))) { + e = e.substring(r.raw.length), t.push(r); + continue; + } + let i = e; + if (this.options.extensions?.startInline) { + let t = Infinity, n = e.slice(1), r; + this.options.extensions.startInline.forEach((e) => { + r = e.call({ lexer: this }, n), typeof r == "number" && r >= 0 && (t = Math.min(t, r)); + }), t < Infinity && t >= 0 && (i = e.substring(0, t + 1)); + } + if (r = this.tokenizer.inlineText(i)) { + e = e.substring(r.raw.length), r.raw.slice(-1) !== "_" && (o = r.raw.slice(-1)), a = !0; + let n = t.at(-1); + n?.type === "text" ? (n.raw += r.raw, n.text += r.text) : t.push(r); + continue; + } + if (e) { + this.infiniteLoopError(e.charCodeAt(0)); + break; + } + } + return t; + } + infiniteLoopError(e) { + let t = "Infinite loop on byte: " + e; + if (this.options.silent) console.error(t); + else throw Error(t); + } +}, Gs = class { + options; + parser; + constructor(e) { + this.options = e || Co; + } + space(e) { + return ""; + } + code({ text: e, lang: t, escaped: n }) { + let r = (t || "").match(X.notSpaceStart)?.[0], i = e.replace(X.endingNewline, "") + "\n"; + return r ? "
" + (n ? i : Fs(i, !0)) + "
\n" : "
" + (n ? i : Fs(i, !0)) + "
\n"; + } + blockquote({ tokens: e }) { + return `
+${this.parser.parse(e)}
+`; + } + html({ text: e }) { + return e; + } + def(e) { + return ""; + } + heading({ tokens: e, depth: t }) { + return `${this.parser.parseInline(e)} +`; + } + hr(e) { + return "
\n"; + } + list(e) { + let t = e.ordered, n = e.start, r = ""; + for (let t = 0; t < e.items.length; t++) { + let n = e.items[t]; + r += this.listitem(n); + } + let i = t ? "ol" : "ul", a = t && n !== 1 ? " start=\"" + n + "\"" : ""; + return "<" + i + a + ">\n" + r + "\n"; + } + listitem(e) { + return `
  • ${this.parser.parse(e.tokens)}
  • +`; + } + checkbox({ checked: e }) { + return " "; + } + paragraph({ tokens: e }) { + return `

    ${this.parser.parseInline(e)}

    +`; + } + table(e) { + let t = "", n = ""; + for (let t = 0; t < e.header.length; t++) n += this.tablecell(e.header[t]); + t += this.tablerow({ text: n }); + let r = ""; + for (let t = 0; t < e.rows.length; t++) { + let i = e.rows[t]; + n = ""; + for (let e = 0; e < i.length; e++) n += this.tablecell(i[e]); + r += this.tablerow({ text: n }); + } + return r &&= `${r}`, "\n\n" + t + "\n" + r + "
    \n"; + } + tablerow({ text: e }) { + return ` +${e} +`; + } + tablecell(e) { + let t = this.parser.parseInline(e.tokens), n = e.header ? "th" : "td"; + return (e.align ? `<${n} align="${e.align}">` : `<${n}>`) + t + ` +`; + } + strong({ tokens: e }) { + return `${this.parser.parseInline(e)}`; + } + em({ tokens: e }) { + return `${this.parser.parseInline(e)}`; + } + codespan({ text: e }) { + return `${Fs(e, !0)}`; + } + br(e) { + return "
    "; + } + del({ tokens: e }) { + return `${this.parser.parseInline(e)}`; + } + link({ href: e, title: t, tokens: n }) { + let r = this.parser.parseInline(n), i = Is(e); + if (i === null) return r; + e = i; + let a = "
    ", a; + } + image({ href: e, title: t, text: n, tokens: r }) { + r && (n = this.parser.parseInline(r, this.parser.textRenderer)); + let i = Is(e); + if (i === null) return Fs(n); + e = i; + let a = `${Fs(n)} { + let i = e[r].flat(Infinity); + n = n.concat(this.walkTokens(i, t)); + }) : e.tokens && (n = n.concat(this.walkTokens(e.tokens, t))); + } + } + return n; + } + use(...e) { + let t = this.defaults.extensions || { + renderers: {}, + childTokens: {} + }; + return e.forEach((e) => { + let n = { ...e }; + if (n.async = this.defaults.async || n.async || !1, e.extensions && (e.extensions.forEach((e) => { + if (!e.name) throw Error("extension name required"); + if ("renderer" in e) { + let n = t.renderers[e.name]; + n ? t.renderers[e.name] = function(...t) { + let r = e.renderer.apply(this, t); + return r === !1 && (r = n.apply(this, t)), r; + } : t.renderers[e.name] = e.renderer; + } + if ("tokenizer" in e) { + if (!e.level || e.level !== "block" && e.level !== "inline") throw Error("extension level must be 'block' or 'inline'"); + let n = t[e.level]; + n ? n.unshift(e.tokenizer) : t[e.level] = [e.tokenizer], e.start && (e.level === "block" ? t.startBlock ? t.startBlock.push(e.start) : t.startBlock = [e.start] : e.level === "inline" && (t.startInline ? t.startInline.push(e.start) : t.startInline = [e.start])); + } + "childTokens" in e && e.childTokens && (t.childTokens[e.name] = e.childTokens); + }), n.extensions = t), e.renderer) { + let t = this.defaults.renderer || new Gs(this.defaults); + for (let n in e.renderer) { + if (!(n in t)) throw Error(`renderer '${n}' does not exist`); + if (["options", "parser"].includes(n)) continue; + let r = n, i = e.renderer[r], a = t[r]; + t[r] = (...e) => { + let n = i.apply(t, e); + return n === !1 && (n = a.apply(t, e)), n || ""; + }; + } + n.renderer = t; + } + if (e.tokenizer) { + let t = this.defaults.tokenizer || new Ws(this.defaults); + for (let n in e.tokenizer) { + if (!(n in t)) throw Error(`tokenizer '${n}' does not exist`); + if ([ + "options", + "rules", + "lexer" + ].includes(n)) continue; + let r = n, i = e.tokenizer[r], a = t[r]; + t[r] = (...e) => { + let n = i.apply(t, e); + return n === !1 && (n = a.apply(t, e)), n; + }; + } + n.tokenizer = t; + } + if (e.hooks) { + let t = this.defaults.hooks || new qs(); + for (let n in e.hooks) { + if (!(n in t)) throw Error(`hook '${n}' does not exist`); + if (["options", "block"].includes(n)) continue; + let r = n, i = e.hooks[r], a = t[r]; + qs.passThroughHooks.has(n) ? t[r] = (e) => { + if (this.defaults.async && qs.passThroughHooksRespectAsync.has(n)) return (async () => { + let n = await i.call(t, e); + return a.call(t, n); + })(); + let r = i.call(t, e); + return a.call(t, r); + } : t[r] = (...e) => { + if (this.defaults.async) return (async () => { + let n = await i.apply(t, e); + return n === !1 && (n = await a.apply(t, e)), n; + })(); + let n = i.apply(t, e); + return n === !1 && (n = a.apply(t, e)), n; + }; + } + n.hooks = t; + } + if (e.walkTokens) { + let t = this.defaults.walkTokens, r = e.walkTokens; + n.walkTokens = function(e) { + let n = []; + return n.push(r.call(this, e)), t && (n = n.concat(t.call(this, e))), n; + }; + } + this.defaults = { + ...this.defaults, + ...n + }; + }), this; + } + setOptions(e) { + return this.defaults = { + ...this.defaults, + ...e + }, this; + } + lexer(e, t) { + return Z.lex(e, t ?? this.defaults); + } + parser(e, t) { + return Q.parse(e, t ?? this.defaults); + } + parseMarkdown(e) { + return (t, n) => { + let r = { ...n }, i = { + ...this.defaults, + ...r + }, a = this.onError(!!i.silent, !!i.async); + if (this.defaults.async === !0 && r.async === !1) return a(/* @__PURE__ */ Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.")); + if (typeof t > "u" || t === null) return a(/* @__PURE__ */ Error("marked(): input parameter is undefined or null")); + if (typeof t != "string") return a(/* @__PURE__ */ Error("marked(): input parameter is of type " + Object.prototype.toString.call(t) + ", string expected")); + if (i.hooks && (i.hooks.options = i, i.hooks.block = e), i.async) return (async () => { + let n = i.hooks ? await i.hooks.preprocess(t) : t, r = await (i.hooks ? await i.hooks.provideLexer(e) : e ? Z.lex : Z.lexInline)(n, i), a = i.hooks ? await i.hooks.processAllTokens(r) : r; + i.walkTokens && await Promise.all(this.walkTokens(a, i.walkTokens)); + let o = await (i.hooks ? await i.hooks.provideParser(e) : e ? Q.parse : Q.parseInline)(a, i); + return i.hooks ? await i.hooks.postprocess(o) : o; + })().catch(a); + try { + i.hooks && (t = i.hooks.preprocess(t)); + let n = (i.hooks ? i.hooks.provideLexer(e) : e ? Z.lex : Z.lexInline)(t, i); + i.hooks && (n = i.hooks.processAllTokens(n)), i.walkTokens && this.walkTokens(n, i.walkTokens); + let r = (i.hooks ? i.hooks.provideParser(e) : e ? Q.parse : Q.parseInline)(n, i); + return i.hooks && (r = i.hooks.postprocess(r)), r; + } catch (e) { + return a(e); + } + }; + } + onError(e, t) { + return (n) => { + if (n.message += "\nPlease report this to https://github.com/markedjs/marked.", e) { + let e = "

    An error occurred:

    " + Fs(n.message + "", !0) + "
    "; + return t ? Promise.resolve(e) : e; + } + if (t) return Promise.reject(n); + throw n; + }; + } +}(); +function $(e, t) { + return Js.parse(e, t); +} +$.options = $.setOptions = function(e) { + return Js.setOptions(e), $.defaults = Js.defaults, wo($.defaults), $; +}, $.getDefaults = So, $.defaults = Co, $.use = function(...e) { + return Js.use(...e), $.defaults = Js.defaults, wo($.defaults), $; +}, $.walkTokens = function(e, t) { + return Js.walkTokens(e, t); +}, $.parseInline = Js.parseInline, $.Parser = Q, $.parser = Q.parse, $.Renderer = Gs, $.TextRenderer = Ks, $.Lexer = Z, $.lexer = Z.lex, $.Tokenizer = Ws, $.Hooks = qs, $.parse = $, $.options, $.setOptions, $.use, $.walkTokens, $.parseInline, Q.parse, Z.lex; //#endregion //#region packages/sdk-vue/src/index.ts -function Za(e) { - Qa(e.tagName, e.component); - let t = /* @__PURE__ */ Ra(e.component, { shadowRoot: e.shadowRoot ?? !1 }); +function Ys(e) { + Xs(e.tagName, e.component); + let t = /* @__PURE__ */ $a(e.component, { shadowRoot: e.shadowRoot ?? !1 }); for (let [n, r] of Object.entries(e.propertyAliases ?? {})) Object.defineProperty(t.prototype, n, { configurable: !0, get() { return this[r]; }, set(e) { - this[r] = e, typeof e == "string" && this.setAttribute(eo(r), e); + this[r] = e, typeof e == "string" && this.setAttribute(Qs(r), e); } }); return typeof customElements < "u" && !customElements.get(e.tagName) && customElements.define(e.tagName, t), t; } -function Qa(e, t) { +function Xs(e, t) { if (typeof document > "u") return; - let n = $a(t); + let n = Zs(t); if (n.length === 0) return; let r = `comtrya-widget-styles:${e}`; if (document.head.querySelector(`style[data-comtrya-widget-styles="${r}"]`)) return; let i = document.createElement("style"); i.dataset.comtryaWidgetStyles = r, i.textContent = n.join("\n"), document.head.append(i); } -function $a(e) { +function Zs(e) { if (!e || typeof e != "object") return []; let t = e.styles; return Array.isArray(t) ? t.filter((e) => typeof e == "string") : []; } -function eo(e) { +function Qs(e) { return e.replace(/[A-Z]/g, (e) => `-${e.toLowerCase()}`); } //#endregion -//#region ../extensions/first-party/ext_checks/ui/src/ChecksBoard.vue?vue&type=style&index=0&inline&scoped=e2bcc403&lang.css -var to = ".extension-payload[data-v-e2bcc403]{gap:4px;display:grid}", no = (e, t) => { +//#region ../extensions/first-party/ext_checks/ui/src/ChecksBoard.vue?vue&type=script&setup=true&lang.ts +var $s = { + class: "checks-board extension-payload", + "data-smoke": "checks-board" +}, ec = { class: "checks-header" }, tc = { class: "eyebrow" }, nc = { + key: 0, + class: "checks-message tone-err", + role: "alert" +}, rc = { + key: 1, + class: "checks-sidebar-summary" +}, ic = ["href"], ac = { + key: 2, + class: "checks-message" +}, oc = { + key: 3, + class: "checks-message" +}, sc = { + key: 4, + class: "checks-message" +}, cc = { + class: "summary-grid", + "aria-label": "Check summary", + "data-smoke": "checks-summary" +}, lc = { + class: "readiness-board", + "aria-label": "Check readiness lanes" +}, uc = ["data-smoke"], dc = { + key: 0, + class: "column-empty" +}, fc = { key: 1 }, pc = { class: "check-main" }, mc = { + key: 0, + class: "oid" +}, hc = { + class: "recent-runs", + "data-smoke": "checks-recent-runs" +}, gc = { + key: 0, + class: "commit-label" +}, _c = { class: "check-main" }, vc = { key: 0 }, yc = { class: "check-required" }, bc = 6e3, xc = /* @__PURE__ */ ((e, t) => { let n = e.__vccOpts || e; for (let [e, r] of t) n[e] = r; return n; -}, ro = {}, io = { - class: "extension-payload", - "data-smoke": "checks-board" -}; -function ao(e, t) { - return di(), gi("div", io, [...t[0] ||= [xi("strong", null, "Checks board", -1)]]); -} -var oo = /* @__PURE__ */ no(ro, [ - ["render", ao], - ["styles", [to]], - ["__scopeId", "data-v-e2bcc403"] -]), so = "ext_checks", co = "comtrya-checks-board"; -Za({ - tagName: co, - component: oo +})(/* @__PURE__ */ zn({ + __name: "ChecksBoard", + props: { + host: { type: Object }, + workspaceId: { type: String }, + repositoryId: { type: [String, null] }, + repositoryPath: { type: [String, null] }, + extensionSlot: { type: [String, null] } + }, + setup(e) { + let t = e, n = /* @__PURE__ */ Ut("idle"), r = /* @__PURE__ */ Ut(null), i = /* @__PURE__ */ Ut([]), a = /* @__PURE__ */ Ut(null), o = J(() => t.workspaceId ?? t.host?.workspaceId ?? ""), s = J(() => t.repositoryId ?? t.host?.repositoryId ?? ""), c = J(() => t.repositoryPath ?? t.host?.repositoryPath ?? ""), l = J(() => t.extensionSlot === "repository.sidebar"), u = J(() => !o.value || !s.value ? "" : `comtrya://workspace/${o.value}/repository/${s.value}`), d = J(() => { + let e = c.value.split("/").filter((e) => e.length > 0).map(encodeURIComponent).join("/"), t = new URLSearchParams(); + o.value && t.set("workspaceId", o.value), s.value && t.set("repositoryId", s.value); + let n = t.toString(); + return `/r/${e || "repository"}/checks${n ? `?${n}` : ""}`; + }), f = J(() => O(i.value)), p = J(() => f.value.slice(0, 8)), m = J(() => a.value?.columns ?? []), h = J(() => m.value.flatMap((e) => e.cards.map((e) => e.check))), g = J(() => h.value), _ = J(() => a.value?.total ?? g.value.length), v = J(() => g.value.filter((e) => D(e) === "blocking").length), y = J(() => g.value.filter((e) => D(e) === "running").length), b = J(() => g.value.filter((e) => D(e) === "queued").length), x = J(() => l.value ? "Board" : n.value === "loading" ? "Loading" : v.value > 0 ? `${v.value} blocking` : y.value > 0 ? `${y.value} running` : b.value > 0 ? `${b.value} queued` : _.value > 0 ? "Passing" : "No runs"), S = J(() => l.value || n.value === "loading" ? "info" : v.value > 0 ? "err" : y.value > 0 || b.value > 0 ? "warn" : _.value > 0 ? "ok" : "info"), C = J(() => a.value?.commitOID || (f.value[0]?.commitOID ?? "")), w = 0; + class ee extends Error { + opError; + constructor(e, t) { + super(`${e}: ${t.message}`), this.opError = t; + } + } + function te(e, t) { + if (e.ok) return e.value; + throw new ee(t, e.error); + } + async function ne(e, t, n) { + return te(await vo("ext_checks", "checks", e, t, { signal: n }), e); + } + async function T(e = 0) { + let t = ++w; + if (i.value = [], a.value = null, r.value = null, l.value) { + n.value = "idle"; + return; + } + if (!u.value) { + n.value = "empty"; + return; + } + n.value = "loading"; + let o = new AbortController(), s = window.setTimeout(() => o.abort(), bc); + try { + let e = await ne("list-checks", { + repository: u.value, + limit: 256 + }, o.signal), r = se(e), s = await ne("readiness-board", r ? { + repository: u.value, + commitOID: r, + limit: 256 + } : { + repository: u.value, + limit: 256 + }, o.signal); + if (t !== w) return; + i.value = Array.isArray(e) ? e : [], a.value = ie(s), n.value = i.value.length > 0 ? "ready" : "empty"; + } catch (i) { + if (t !== w) return; + if (e === 0 && re(i)) { + T(1); + return; + } + n.value = "error", r.value = i instanceof Error ? i.message : String(i); + } finally { + window.clearTimeout(s); + } + } + function re(e) { + return e instanceof ee && e.opError.code === "unavailable"; + } + function E(e) { + e.preventDefault(), window.location.assign(d.value); + } + function ie(e) { + return { + repository: e?.repository ?? u.value, + commitOID: e?.commitOID ?? null, + total: Number(e?.total ?? 0), + columns: Array.isArray(e?.columns) ? e.columns.map((e) => ({ + key: e.key, + label: e.label, + count: Number(e.count ?? 0), + cards: Array.isArray(e.cards) ? e.cards : [] + })) : [] + }; + } + function ae(e) { + return (e ?? "").trim().toUpperCase(); + } + function D(e) { + let t = ae(e.state); + return e.required === !0 && (t === "FAILURE" || t === "FAILED") ? "blocking" : t === "FAILURE" || t === "FAILED" ? "failed" : t === "RUNNING" ? "running" : t === "PENDING" ? "queued" : t === "SUCCESS" || t === "SUCCEEDED" ? "passing" : t === "SKIPPED" ? "skipped" : "queued"; + } + function oe(e) { + return e.updatedAt ?? e.createdAt ?? ""; + } + function O(e) { + return [...e].sort((e, t) => oe(t).localeCompare(oe(e))); + } + function se(e) { + let t = /* @__PURE__ */ new Map(); + for (let n of e) { + let e = n.commitOID?.trim(); + if (!e) continue; + let r = t.get(e); + if (!r) { + t.set(e, { + count: 1, + latest: oe(n) + }); + continue; + } + r.count += 1, oe(n) > r.latest && (r.latest = oe(n)); + } + return [...t.entries()].sort(([, e], [, t]) => { + let n = t.count - e.count; + return n === 0 ? t.latest.localeCompare(e.latest) : n; + })[0]?.[0]; + } + function ce(e) { + let t = ae(e.state); + if (e.required === !0 && (t === "FAILURE" || t === "FAILED")) return "Required failure"; + switch (t) { + case "FAILURE": + case "FAILED": return "Failed"; + case "RUNNING": return "Running"; + case "PENDING": return "Queued"; + case "SUCCESS": + case "SUCCEEDED": return "Passed"; + case "SKIPPED": return "Skipped"; + default: return "Queued"; + } + } + function le(e) { + return e === "blocking" ? "err" : e === "failed" || e === "running" || e === "queued" ? "warn" : e === "empty" ? "info" : "ok"; + } + function ue(e) { + return (e.commitOID ?? "").slice(0, 7); + } + function de(e, t = Date.now()) { + if (!e) return ""; + let n = Date.parse(e); + if (Number.isNaN(n)) return ""; + let r = Math.max(0, t - n), i = 6e4, a = 60 * i, o = 24 * a, s = 7 * o; + return r < i ? "just now" : r < a ? `${Math.floor(r / i)}m ago` : r < o ? `${Math.floor(r / a)}h ago` : r < s ? `${Math.floor(r / o)}d ago` : `${Math.floor(r / s)}w ago`; + } + function fe(e) { + let t = e.check; + return t.id ?? `${t.name ?? "check"}-${t.commitOID ?? "commit"}`; + } + return jn(() => [ + o.value, + s.value, + l.value + ], () => void T()), er(() => void T()), (e, t) => (W(), G("section", $s, [K("header", ec, [K("div", null, [K("p", tc, k(c.value || "Repository"), 1), t[0] ||= K("h2", null, "Checks", -1)]), K("span", { class: ge(["state-pill", `tone-${S.value}`]) }, [t[1] ||= K("span", null, null, -1), zi(" " + k(x.value), 1)], 2)]), n.value === "error" ? (W(), G("p", nc, k(r.value), 1)) : l.value ? (W(), G("div", rc, [t[2] ||= K("p", null, "Open the board for required runs, merge blockers, and latest workflow state.", -1), K("a", { + class: "checks-link", + href: d.value, + onClick: E + }, " Open checks board ", 8, ic)])) : n.value === "loading" ? (W(), G("p", ac, " Loading workflow runs... ")) : u.value ? n.value === "empty" ? (W(), G("p", sc, " No workflow runs recorded. ")) : (W(), G(H, { key: 5 }, [ + K("section", cc, [ + K("div", null, [t[3] ||= K("span", null, "Required failures", -1), K("strong", null, k(v.value), 1)]), + K("div", null, [t[4] ||= K("span", null, "Running", -1), K("strong", null, k(y.value), 1)]), + K("div", null, [t[5] ||= K("span", null, "Queued", -1), K("strong", null, k(b.value), 1)]), + K("div", null, [t[6] ||= K("span", null, "Total runs", -1), K("strong", null, k(_.value), 1)]) + ]), + K("section", lc, [(W(!0), G(H, null, ur(m.value, (e) => (W(), G("article", { + key: e.key, + class: "readiness-column", + "data-smoke": `checks-column-${e.key}` + }, [K("header", null, [K("h3", null, k(e.label), 1), K("span", null, k(e.count), 1)]), e.cards.length === 0 ? (W(), G("p", dc, "No runs")) : (W(), G("ul", fc, [(W(!0), G(H, null, ur(e.cards, (e) => (W(), G("li", { key: fe(e) }, [ + K("span", { class: ge(["status-light", `tone-${D(e.check)}`]) }, null, 2), + K("span", pc, [K("strong", null, k(e.check.name ?? "check"), 1), K("em", null, [zi(k(e.check.required ? "required" : "optional") + " ", 1), ue(e.check) ? (W(), G("span", mc, k(ue(e.check)), 1)) : Bi("", !0)])]), + K("span", { class: ge(["check-state", `tone-${le(D(e.check))}`]) }, k(ce(e.check)), 3) + ]))), 128))]))], 8, uc))), 128))]), + K("section", hc, [K("header", null, [t[7] ||= K("div", null, [K("p", { class: "eyebrow" }, "Latest"), K("h3", null, "Workflow runs")], -1), C.value ? (W(), G("span", gc, k(C.value.slice(0, 7)), 1)) : Bi("", !0)]), K("ul", null, [(W(!0), G(H, null, ur(p.value, (e) => (W(), G("li", { key: e.id ?? `${e.name}-${e.commitOID}` }, [ + K("span", { class: ge(["status-light", `tone-${D(e)}`]) }, null, 2), + K("span", _c, [K("strong", null, k(e.name ?? "check"), 1), K("em", null, [zi(k(ce(e)) + " ", 1), de(oe(e)) ? (W(), G("span", vc, k(de(oe(e))), 1)) : Bi("", !0)])]), + K("span", yc, k(e.required ? "required" : "optional"), 1) + ]))), 128))])]) + ], 64)) : (W(), G("p", oc, " Repository scope unavailable. "))])); + } +}), [["styles", [".extension-payload[data-v-4ab08922]{gap:14px;display:grid}.checks-board[data-v-4ab08922]{min-width:0;color:var(--fg);padding:14px}.checks-header[data-v-4ab08922],.recent-runs>header[data-v-4ab08922]{justify-content:space-between;align-items:center;gap:12px;min-width:0;display:flex}.checks-header h2[data-v-4ab08922],.recent-runs h3[data-v-4ab08922],.readiness-column h3[data-v-4ab08922]{color:var(--fg);font-family:var(--font-sans);letter-spacing:0;margin:0;font-size:16px;font-weight:600;line-height:1.2}.recent-runs h3[data-v-4ab08922],.readiness-column h3[data-v-4ab08922]{font-size:13px}.eyebrow[data-v-4ab08922]{color:var(--fg-3);text-overflow:ellipsis;white-space:nowrap;margin:0 0 4px;font-size:12px;line-height:1.2;overflow:hidden}.state-pill[data-v-4ab08922],.check-state[data-v-4ab08922],.check-required[data-v-4ab08922],.commit-label[data-v-4ab08922]{border:.5px solid var(--line-2);border-radius:var(--r-sm);min-height:24px;color:var(--fg-2);background:var(--surface);white-space:nowrap;flex:none;align-items:center;gap:6px;padding:0 8px;font-size:12px;line-height:1;display:inline-flex}.state-pill>span[data-v-4ab08922],.status-light[data-v-4ab08922]{background:currentColor;border-radius:999px;width:8px;height:8px}.tone-ok[data-v-4ab08922]{color:var(--ok);border-color:var(--ok-soft);background:var(--ok-soft)}.tone-warn[data-v-4ab08922]{color:var(--warn);border-color:var(--warn-soft);background:var(--warn-soft)}.tone-err[data-v-4ab08922]{color:var(--err);border-color:var(--err-soft);background:var(--err-soft)}.tone-info[data-v-4ab08922]{color:var(--accent);border-color:var(--accent-soft);background:var(--accent-soft)}.checks-message[data-v-4ab08922]{border:.5px solid var(--line-2);border-radius:var(--r-sm);color:var(--fg-2);background:var(--surface);margin:0;padding:10px 12px;font-size:13px}.checks-sidebar-summary[data-v-4ab08922]{gap:10px;min-width:0;display:grid}.checks-sidebar-summary p[data-v-4ab08922]{color:var(--fg-2);margin:0;font-size:13px;line-height:1.45}.checks-link[data-v-4ab08922]{border:.5px solid var(--line-2);border-radius:var(--r-sm);min-height:32px;color:var(--fg);background:var(--surface);justify-content:center;align-items:center;padding:0 10px;font-size:13px;font-weight:600;text-decoration:none;display:inline-flex}.checks-link[data-v-4ab08922]:hover{border-color:var(--accent);color:var(--accent)}.summary-grid[data-v-4ab08922]{grid-template-columns:repeat(4,minmax(0,1fr));gap:8px;display:grid}.summary-grid>div[data-v-4ab08922],.readiness-column[data-v-4ab08922],.recent-runs[data-v-4ab08922]{border:.5px solid var(--line-2);border-radius:var(--r-sm);background:var(--surface);min-width:0}.summary-grid>div[data-v-4ab08922]{padding:10px}.summary-grid span[data-v-4ab08922]{overflow-wrap:anywhere;color:var(--fg-3);font-size:11px;line-height:1.25;display:block}.summary-grid strong[data-v-4ab08922]{color:var(--fg);font-family:var(--font-mono);margin-top:6px;font-size:20px;font-weight:600;line-height:1;display:block}.readiness-board[data-v-4ab08922]{grid-template-columns:repeat(auto-fit,minmax(190px,1fr));align-items:start;gap:10px;min-width:0;display:grid}.readiness-column[data-v-4ab08922]{overflow:hidden}.readiness-column>header[data-v-4ab08922],.recent-runs>header[data-v-4ab08922]{border-bottom:.5px solid var(--line);justify-content:space-between;align-items:center;gap:10px;min-height:42px;padding:10px;display:flex}.readiness-column>header>span[data-v-4ab08922]{border-radius:var(--r-sm);background:var(--bg);min-width:22px;height:22px;color:var(--fg-2);font-family:var(--font-mono);justify-content:center;align-items:center;font-size:12px;display:inline-flex}.readiness-column ul[data-v-4ab08922],.recent-runs ul[data-v-4ab08922]{gap:0;margin:0;padding:0;list-style:none;display:grid}.readiness-column li[data-v-4ab08922],.recent-runs li[data-v-4ab08922]{border-top:.5px solid var(--line);grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:9px;min-width:0;padding:10px;display:grid}.readiness-column li[data-v-4ab08922]:first-child,.recent-runs li[data-v-4ab08922]:first-child{border-top:0}.check-main[data-v-4ab08922]{gap:3px;min-width:0;display:grid}.check-main strong[data-v-4ab08922],.check-main em[data-v-4ab08922]{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.check-main strong[data-v-4ab08922]{color:var(--fg);font-size:13px;font-weight:600}.check-main em[data-v-4ab08922]{color:var(--fg-3);font-size:12px;font-style:normal}.oid[data-v-4ab08922],.commit-label[data-v-4ab08922]{font-family:var(--font-mono)}.column-empty[data-v-4ab08922]{color:var(--fg-3);margin:0;padding:10px;font-size:12px}.recent-runs[data-v-4ab08922]{overflow:hidden}.recent-runs>header[data-v-4ab08922]{padding:10px 12px}.check-required[data-v-4ab08922]{min-height:22px;color:var(--fg-3);background:var(--bg)}@media (max-width:720px){.summary-grid[data-v-4ab08922]{grid-template-columns:repeat(2,minmax(0,1fr))}.readiness-board[data-v-4ab08922]{grid-template-columns:minmax(0,1fr)}.checks-header[data-v-4ab08922],.recent-runs>header[data-v-4ab08922]{flex-direction:column;align-items:flex-start}}"]], ["__scopeId", "data-v-4ab08922"]]), Sc = "ext_checks", Cc = "comtrya-checks-board"; +Ys({ + tagName: Cc, + component: xc }); -var lo = { - id: so, +var wc = { + id: Sc, setup(e) { e.registerWidget({ id: "checks-board", - element: co, + element: Cc, defaultSlot: "repository.sidebar", defaultPriority: 200, requiredPermission: "checks.read" }), e.registerRoute("/", { - element: co, + element: Cc, requiredPermission: "checks.read" }); } }; //#endregion -export { lo as default }; +export { wc as default }; diff --git a/extensions/first-party/ext_checks/component/src/lib.rs b/extensions/first-party/ext_checks/component/src/lib.rs index 3052392a..9d3bed25 100644 --- a/extensions/first-party/ext_checks/component/src/lib.rs +++ b/extensions/first-party/ext_checks/component/src/lib.rs @@ -7,7 +7,10 @@ use bindings::comtrya::platform::storage; use bindings::comtrya::platform::time; use bindings::comtrya::platform::types::{Error, ErrorCode, Event}; use bindings::exports::comtrya::ext_checks::checks::{ - CheckRun, CheckState, Guest as ChecksGuest, RecordCheckInput, + CheckReadinessBoard, CheckReadinessBoardInput, CheckReadinessCard, CheckReadinessColumn, + CheckRun, CheckState, ExpectedCheck, ExpectedCheckReadinessBoard, + ExpectedCheckReadinessBoardInput, ExpectedCheckReadinessCard, ExpectedCheckReadinessColumn, + Guest as ChecksGuest, RecordCheckInput, }; use bindings::exports::comtrya::platform::reactor::{Guest as ReactorGuest, Reaction}; @@ -85,6 +88,161 @@ struct RepositoryScope { repository_id: Option, } +enum ReadinessLane { + RequiredAction, + Missing, + OptionalFailures, + InProgress, + Passing, +} + +fn readiness_lane(check: &CheckRun) -> ReadinessLane { + match check.state { + CheckState::Pending | CheckState::Running => ReadinessLane::InProgress, + CheckState::Failed if check.required => ReadinessLane::RequiredAction, + CheckState::Failed => ReadinessLane::OptionalFailures, + CheckState::Succeeded | CheckState::Skipped => ReadinessLane::Passing, + } +} + +fn readiness_column( + key: &str, + label: &str, + cards: Vec, +) -> CheckReadinessColumn { + CheckReadinessColumn { + key: key.to_string(), + label: label.to_string(), + count: cards.len() as u32, + cards, + } +} + +fn expected_readiness_column( + key: &str, + label: &str, + cards: Vec, +) -> ExpectedCheckReadinessColumn { + ExpectedCheckReadinessColumn { + key: key.to_string(), + label: label.to_string(), + count: cards.len() as u32, + cards, + } +} + +fn readiness_columns(checks: Vec) -> Vec { + let mut required_action = Vec::new(); + let mut optional_failures = Vec::new(); + let mut in_progress = Vec::new(); + let mut passing = Vec::new(); + + for check in checks { + let lane = readiness_lane(&check); + let card = CheckReadinessCard { + blocking: matches!(lane, ReadinessLane::RequiredAction), + check, + }; + match lane { + ReadinessLane::RequiredAction => required_action.push(card), + ReadinessLane::Missing => unreachable!("recorded check cards are never missing"), + ReadinessLane::OptionalFailures => optional_failures.push(card), + ReadinessLane::InProgress => in_progress.push(card), + ReadinessLane::Passing => passing.push(card), + } + } + + vec![ + readiness_column("required-action", "Required action", required_action), + readiness_column("optional-failures", "Optional failures", optional_failures), + readiness_column("in-progress", "In progress", in_progress), + readiness_column("passing", "Passing", passing), + ] +} + +fn expected_lane(check: Option<&CheckRun>, required: bool) -> ReadinessLane { + match check.map(|check| check.state) { + None => ReadinessLane::Missing, + Some(CheckState::Pending | CheckState::Running) => ReadinessLane::InProgress, + Some(CheckState::Failed) if required => ReadinessLane::RequiredAction, + Some(CheckState::Failed) => ReadinessLane::OptionalFailures, + Some(CheckState::Succeeded | CheckState::Skipped) => ReadinessLane::Passing, + } +} + +fn expected_card( + name: String, + required: bool, + check: Option, +) -> ExpectedCheckReadinessCard { + let lane = expected_lane(check.as_ref(), required); + ExpectedCheckReadinessCard { + name, + required, + check, + blocking: required + && matches!( + lane, + ReadinessLane::RequiredAction | ReadinessLane::Missing | ReadinessLane::InProgress + ), + missing: matches!(lane, ReadinessLane::Missing), + } +} + +fn expected_readiness_columns( + expected: Vec, + observed: Vec, +) -> Vec { + let mut required_action = Vec::new(); + let mut missing = Vec::new(); + let mut in_progress = Vec::new(); + let mut optional_failures = Vec::new(); + let mut passing = Vec::new(); + let mut expected_names = Vec::new(); + + for expected in expected { + let name = expected.name.trim(); + if name.is_empty() || expected_names.iter().any(|existing| existing == name) { + continue; + } + expected_names.push(name.to_string()); + let check = observed.iter().find(|check| check.name == name).cloned(); + let card = expected_card(name.to_string(), expected.required, check); + match expected_lane(card.check.as_ref(), card.required) { + ReadinessLane::RequiredAction => required_action.push(card), + ReadinessLane::Missing => missing.push(card), + ReadinessLane::InProgress => in_progress.push(card), + ReadinessLane::OptionalFailures => optional_failures.push(card), + ReadinessLane::Passing => passing.push(card), + } + } + + for check in observed { + if expected_names + .iter() + .any(|expected_name| expected_name == &check.name) + { + continue; + } + let card = expected_card(check.name.clone(), check.required, Some(check)); + match expected_lane(card.check.as_ref(), card.required) { + ReadinessLane::RequiredAction => required_action.push(card), + ReadinessLane::Missing => missing.push(card), + ReadinessLane::InProgress => in_progress.push(card), + ReadinessLane::OptionalFailures => optional_failures.push(card), + ReadinessLane::Passing => passing.push(card), + } + } + + vec![ + expected_readiness_column("required-action", "Required action", required_action), + expected_readiness_column("missing", "Missing", missing), + expected_readiness_column("in-progress", "In progress", in_progress), + expected_readiness_column("optional-failures", "Optional failures", optional_failures), + expected_readiness_column("passing", "Passing", passing), + ] +} + fn repository_scope(repository: &str) -> RepositoryScope { let Some(rest) = repository.strip_prefix("comtrya://") else { return RepositoryScope { @@ -180,6 +338,34 @@ fn scan_checks(mut visit: impl FnMut(StoredCheck) -> Result) -> Res } } +fn collect_checks( + repository: &str, + limit: u32, + commit_oid: Option<&str>, +) -> Result, Error> { + let limit = limit.min(1024) as usize; + if limit == 0 { + return Ok(Vec::new()); + } + let commit_oid = commit_oid + .map(str::trim) + .filter(|commit_oid| !commit_oid.is_empty()); + let mut out = Vec::new(); + scan_checks(|stored| { + if !repository_matches(&stored, repository) { + return Ok(false); + } + if let Some(commit_oid) = commit_oid { + if stored.commit_oid != commit_oid { + return Ok(false); + } + } + out.push(stored.to_wit()); + Ok(out.len() >= limit) + })?; + Ok(out) +} + fn persist_new(stored: &StoredCheck) -> Result<(), Error> { let bytes = serde_json::to_vec(stored) .map_err(|error| err(ErrorCode::Internal, format!("serialise check: {error}")))?; @@ -244,18 +430,39 @@ impl ChecksGuest for Component { } fn list_checks(repository: String, limit: u32) -> Result, Error> { - let limit = limit.min(1024) as usize; - let mut out = Vec::new(); - scan_checks(|stored| { - if repository_matches(&stored, &repository) { - out.push(stored.to_wit()); - if out.len() >= limit { - return Ok(true); - } - } - Ok(false) - })?; - Ok(out) + collect_checks(&repository, limit, None) + } + + fn readiness_board(input: CheckReadinessBoardInput) -> Result { + let checks = collect_checks(&input.repository, input.limit, input.commit_oid.as_deref())?; + let total = checks.len() as u32; + Ok(CheckReadinessBoard { + repository: input.repository, + commit_oid: input.commit_oid, + total, + columns: readiness_columns(checks), + }) + } + + fn expected_readiness_board( + input: ExpectedCheckReadinessBoardInput, + ) -> Result { + let commit_oid = input.commit_oid.trim(); + if commit_oid.is_empty() { + return Err(err( + ErrorCode::BadInput, + "expected-readiness-board requires a commit OID", + )); + } + let checks = collect_checks(&input.repository, input.limit, Some(commit_oid))?; + let columns = expected_readiness_columns(input.expected, checks); + let total = columns.iter().map(|column| column.count).sum(); + Ok(ExpectedCheckReadinessBoard { + repository: input.repository, + commit_oid: commit_oid.to_string(), + total, + columns, + }) } } @@ -270,3 +477,136 @@ impl ReactorGuest for Component { } bindings::export!(Component with_types_in bindings); + +#[cfg(test)] +mod tests { + use super::{ + expected_readiness_columns, readiness_columns, CheckRun, CheckState, ExpectedCheck, + }; + + fn check(id: &str, state: CheckState, required: bool) -> CheckRun { + CheckRun { + id: id.to_string(), + repository: "comtrya://workspace/ws/repository/repo".to_string(), + commit_oid: "abc123".to_string(), + name: id.to_string(), + state, + conclusion: String::new(), + required, + created_at: "2026-06-20T00:00:00Z".to_string(), + updated_at: "2026-06-20T00:00:00Z".to_string(), + } + } + + #[test] + fn readiness_columns_group_checks_by_merge_relevance() { + let columns = readiness_columns(vec![ + check("required failure", CheckState::Failed, true), + check("optional failure", CheckState::Failed, false), + check("running", CheckState::Running, true), + check("pending", CheckState::Pending, false), + check("success", CheckState::Succeeded, true), + check("skipped", CheckState::Skipped, true), + ]); + + let required = columns + .iter() + .find(|column| column.key == "required-action") + .expect("required action column"); + assert_eq!(required.count, 1); + assert!(required.cards[0].blocking); + assert_eq!(required.cards[0].check.name, "required failure"); + + let optional = columns + .iter() + .find(|column| column.key == "optional-failures") + .expect("optional failures column"); + assert_eq!(optional.count, 1); + assert!(!optional.cards[0].blocking); + + let progress = columns + .iter() + .find(|column| column.key == "in-progress") + .expect("in progress column"); + assert_eq!(progress.count, 2); + + let passing = columns + .iter() + .find(|column| column.key == "passing") + .expect("passing column"); + assert_eq!(passing.count, 2); + } + + #[test] + fn expected_readiness_columns_surface_missing_required_checks() { + let columns = expected_readiness_columns( + vec![ + ExpectedCheck { + name: "cargo test".to_string(), + required: true, + }, + ExpectedCheck { + name: "security audit".to_string(), + required: true, + }, + ExpectedCheck { + name: "docs link check".to_string(), + required: false, + }, + ExpectedCheck { + name: "deploy preview".to_string(), + required: false, + }, + ExpectedCheck { + name: "cargo fmt".to_string(), + required: true, + }, + ], + vec![ + check("cargo test", CheckState::Failed, true), + check("docs link check", CheckState::Failed, false), + check("deploy preview", CheckState::Running, false), + check("cargo fmt", CheckState::Succeeded, true), + ], + ); + + let required = columns + .iter() + .find(|column| column.key == "required-action") + .expect("required action column"); + assert_eq!(required.count, 1); + assert_eq!(required.cards[0].name, "cargo test"); + assert!(required.cards[0].blocking); + assert!(!required.cards[0].missing); + + let missing = columns + .iter() + .find(|column| column.key == "missing") + .expect("missing column"); + assert_eq!(missing.count, 1); + assert_eq!(missing.cards[0].name, "security audit"); + assert!(missing.cards[0].blocking); + assert!(missing.cards[0].missing); + assert!(missing.cards[0].check.is_none()); + + let progress = columns + .iter() + .find(|column| column.key == "in-progress") + .expect("in progress column"); + assert_eq!(progress.count, 1); + assert!(!progress.cards[0].blocking); + + let optional = columns + .iter() + .find(|column| column.key == "optional-failures") + .expect("optional failures column"); + assert_eq!(optional.count, 1); + assert!(!optional.cards[0].blocking); + + let passing = columns + .iter() + .find(|column| column.key == "passing") + .expect("passing column"); + assert_eq!(passing.count, 1); + } +} diff --git a/extensions/first-party/ext_checks/dist/ext_checks.wasm b/extensions/first-party/ext_checks/dist/ext_checks.wasm index fd4b0c95..3d85861e 100644 Binary files a/extensions/first-party/ext_checks/dist/ext_checks.wasm and b/extensions/first-party/ext_checks/dist/ext_checks.wasm differ diff --git a/extensions/first-party/ext_checks/manifest.json b/extensions/first-party/ext_checks/manifest.json index b680d8fb..a3331cee 100644 --- a/extensions/first-party/ext_checks/manifest.json +++ b/extensions/first-party/ext_checks/manifest.json @@ -44,7 +44,9 @@ "allowedEventReads": [], "dispatchRoutes": [ { "op": "checks.record-check", "scope": "repository", "derive": { "strategy": "payloadField", "field": "repository" } }, - { "op": "checks.list-checks", "scope": "repository", "derive": { "strategy": "payloadField", "field": "repository" } } + { "op": "checks.list-checks", "scope": "repository", "derive": { "strategy": "payloadField", "field": "repository" } }, + { "op": "checks.readiness-board", "scope": "repository", "derive": { "strategy": "payloadField", "field": "repository" } }, + { "op": "checks.expected-readiness-board", "scope": "repository", "derive": { "strategy": "payloadField", "field": "repository" } } ], "reactor": { "allowedMutations": [], diff --git a/extensions/first-party/ext_checks/ui/manifest.json b/extensions/first-party/ext_checks/ui/manifest.json index c12c890d..e2e59bee 100644 --- a/extensions/first-party/ext_checks/ui/manifest.json +++ b/extensions/first-party/ext_checks/ui/manifest.json @@ -5,8 +5,8 @@ "version": "0.1.0", "publisher": "comtrya-dev", "assets": { - "entry": "/_extensions/ext_checks/assets/index.js", - "entryIntegrity": "sha256-fd6efc257ea752a98b4d34db470d7007260270066136cc163aedb45a692a9da9", + "entry": "/ui-ext/6578745f636865636b73/files/index.js", + "entryIntegrity": "sha256-04f491a911c2e8d2af3c2236a13023530347b09c3ab4ccd62cefccdcfbe0c9dc", "styles": [] }, "permissions": [ diff --git a/extensions/first-party/ext_checks/ui/src/ChecksBoard.vue b/extensions/first-party/ext_checks/ui/src/ChecksBoard.vue index b3e1d764..c6837dad 100644 --- a/extensions/first-party/ext_checks/ui/src/ChecksBoard.vue +++ b/extensions/first-party/ext_checks/ui/src/ChecksBoard.vue @@ -1,12 +1,770 @@ + + diff --git a/extensions/first-party/ext_checks/ui/vite.config.ts b/extensions/first-party/ext_checks/ui/vite.config.ts index 86a293e4..560aa258 100644 --- a/extensions/first-party/ext_checks/ui/vite.config.ts +++ b/extensions/first-party/ext_checks/ui/vite.config.ts @@ -6,6 +6,7 @@ const fromHere = (path: string): string => fileURLToPath(new URL(path, import.me export default defineConfig({ root: fromHere("."), + envPrefix: ["VITE_", "PUBLIC_"], define: { "process.env.NODE_ENV": JSON.stringify("production"), }, diff --git a/extensions/first-party/ext_checks/wit/checks.wit b/extensions/first-party/ext_checks/wit/checks.wit index 0a40c531..eec7face 100644 --- a/extensions/first-party/ext_checks/wit/checks.wit +++ b/extensions/first-party/ext_checks/wit/checks.wit @@ -34,8 +34,69 @@ interface checks { required: bool, } + record check-readiness-board-input { + repository: uri, + commit-oid: option, + %limit: u32, + } + + record check-readiness-card { + check: check-run, + blocking: bool, + } + + record check-readiness-column { + key: string, + label: string, + count: u32, + cards: list, + } + + record check-readiness-board { + repository: uri, + commit-oid: option, + total: u32, + columns: list, + } + + record expected-check { + name: string, + required: bool, + } + + record expected-check-readiness-card { + name: string, + required: bool, + check: option, + blocking: bool, + missing: bool, + } + + record expected-check-readiness-column { + key: string, + label: string, + count: u32, + cards: list, + } + + record expected-check-readiness-board-input { + repository: uri, + commit-oid: string, + expected: list, + %limit: u32, + } + + record expected-check-readiness-board { + repository: uri, + commit-oid: string, + total: u32, + columns: list, + } + record-check: func(input: record-check-input) -> result; list-checks: func(repository: uri, %limit: u32) -> result, error>; + readiness-board: func(input: check-readiness-board-input) -> result; + expected-readiness-board: func(input: expected-check-readiness-board-input) -> result; } world ext-checks { diff --git a/extensions/first-party/ext_docs/assets/index.js b/extensions/first-party/ext_docs/assets/index.js index 2f255340..1fdcaedb 100644 --- a/extensions/first-party/ext_docs/assets/index.js +++ b/extensions/first-party/ext_docs/assets/index.js @@ -8,84 +8,84 @@ function e(e) { var t = {}, n = [], r = () => {}, i = () => !1, a = (e) => e.charCodeAt(0) === 111 && e.charCodeAt(1) === 110 && (e.charCodeAt(2) > 122 || e.charCodeAt(2) < 97), o = (e) => e.startsWith("onUpdate:"), s = Object.assign, c = (e, t) => { let n = e.indexOf(t); n > -1 && e.splice(n, 1); -}, l = Object.prototype.hasOwnProperty, u = (e, t) => l.call(e, t), d = Array.isArray, f = (e) => x(e) === "[object Map]", p = (e) => x(e) === "[object Set]", m = (e) => x(e) === "[object Date]", h = (e) => typeof e == "function", g = (e) => typeof e == "string", _ = (e) => typeof e == "symbol", v = (e) => typeof e == "object" && !!e, y = (e) => (v(e) || h(e)) && h(e.then) && h(e.catch), b = Object.prototype.toString, x = (e) => b.call(e), S = (e) => x(e).slice(8, -1), C = (e) => x(e) === "[object Object]", w = (e) => g(e) && e !== "NaN" && e[0] !== "-" && "" + parseInt(e, 10) === e, T = /* @__PURE__ */ e(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"), ee = (e) => { +}, l = Object.prototype.hasOwnProperty, u = (e, t) => l.call(e, t), d = Array.isArray, f = (e) => x(e) === "[object Map]", p = (e) => x(e) === "[object Set]", m = (e) => x(e) === "[object Date]", h = (e) => typeof e == "function", g = (e) => typeof e == "string", _ = (e) => typeof e == "symbol", v = (e) => typeof e == "object" && !!e, y = (e) => (v(e) || h(e)) && h(e.then) && h(e.catch), b = Object.prototype.toString, x = (e) => b.call(e), S = (e) => x(e).slice(8, -1), C = (e) => x(e) === "[object Object]", w = (e) => g(e) && e !== "NaN" && e[0] !== "-" && "" + parseInt(e, 10) === e, ee = /* @__PURE__ */ e(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"), te = (e) => { let t = /* @__PURE__ */ Object.create(null); return ((n) => t[n] || (t[n] = e(n))); -}, te = /-\w/g, E = ee((e) => e.replace(te, (e) => e.slice(1).toUpperCase())), ne = /\B([A-Z])/g, D = ee((e) => e.replace(ne, "-$1").toLowerCase()), re = ee((e) => e.charAt(0).toUpperCase() + e.slice(1)), ie = ee((e) => e ? `on${re(e)}` : ""), O = (e, t) => !Object.is(e, t), ae = (e, ...t) => { +}, ne = /-\w/g, T = te((e) => e.replace(ne, (e) => e.slice(1).toUpperCase())), re = /\B([A-Z])/g, E = te((e) => e.replace(re, "-$1").toLowerCase()), ie = te((e) => e.charAt(0).toUpperCase() + e.slice(1)), ae = te((e) => e ? `on${ie(e)}` : ""), D = (e, t) => !Object.is(e, t), oe = (e, ...t) => { for (let n = 0; n < e.length; n++) e[n](...t); -}, k = (e, t, n, r = !1) => { +}, O = (e, t, n, r = !1) => { Object.defineProperty(e, t, { configurable: !0, enumerable: !1, writable: r, value: n }); -}, oe = (e) => { +}, se = (e) => { let t = parseFloat(e); return isNaN(t) ? e : t; -}, se = (e) => { +}, ce = (e) => { let t = g(e) ? Number(e) : NaN; return isNaN(t) ? e : t; -}, ce, le = () => ce ||= typeof globalThis < "u" ? globalThis : typeof self < "u" ? self : typeof window < "u" ? window : typeof global < "u" ? global : {}; -function ue(e) { +}, le, ue = () => le ||= typeof globalThis < "u" ? globalThis : typeof self < "u" ? self : typeof window < "u" ? window : typeof global < "u" ? global : {}; +function de(e) { if (d(e)) { let t = {}; for (let n = 0; n < e.length; n++) { - let r = e[n], i = g(r) ? me(r) : ue(r); + let r = e[n], i = g(r) ? he(r) : de(r); if (i) for (let e in i) t[e] = i[e]; } return t; } else if (g(e) || v(e)) return e; } -var de = /;(?![^(]*\))/g, fe = /:([^]+)/, pe = /\/\*[^]*?\*\//g; -function me(e) { +var fe = /;(?![^(]*\))/g, pe = /:([^]+)/, me = /\/\*[^]*?\*\//g; +function he(e) { let t = {}; - return e.replace(pe, "").split(de).forEach((e) => { + return e.replace(me, "").split(fe).forEach((e) => { if (e) { - let n = e.split(fe); + let n = e.split(pe); n.length > 1 && (t[n[0].trim()] = n[1].trim()); } }), t; } -function he(e) { +function ge(e) { let t = ""; if (g(e)) t = e; else if (d(e)) for (let n = 0; n < e.length; n++) { - let r = he(e[n]); + let r = ge(e[n]); r && (t += r + " "); } else if (v(e)) for (let n in e) e[n] && (t += n + " "); return t.trim(); } -var ge = "itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly", _e = /* @__PURE__ */ e(ge); -ge + ""; -function ve(e) { +var _e = "itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly", ve = /* @__PURE__ */ e(_e); +_e + ""; +function ye(e) { return !!e || e === ""; } -function ye(e, t) { +function be(e, t) { if (e.length !== t.length) return !1; let n = !0; - for (let r = 0; n && r < e.length; r++) n = be(e[r], t[r]); + for (let r = 0; n && r < e.length; r++) n = xe(e[r], t[r]); return n; } -function be(e, t) { +function xe(e, t) { if (e === t) return !0; let n = m(e), r = m(t); if (n || r) return n && r ? e.getTime() === t.getTime() : !1; if (n = _(e), r = _(t), n || r) return e === t; - if (n = d(e), r = d(t), n || r) return n && r ? ye(e, t) : !1; + if (n = d(e), r = d(t), n || r) return n && r ? be(e, t) : !1; if (n = v(e), r = v(t), n || r) { if (!n || !r || Object.keys(e).length !== Object.keys(t).length) return !1; for (let n in e) { let r = e.hasOwnProperty(n), i = t.hasOwnProperty(n); - if (r && !i || !r && i || !be(e[n], t[n])) return !1; + if (r && !i || !r && i || !xe(e[n], t[n])) return !1; } } return String(e) === String(t); } -var xe = (e) => !!(e && e.__v_isRef === !0), A = (e) => g(e) ? e : e == null ? "" : d(e) || v(e) && (e.toString === b || !h(e.toString)) ? xe(e) ? A(e.value) : JSON.stringify(e, Se, 2) : String(e), Se = (e, t) => xe(t) ? Se(e, t.value) : f(t) ? { [`Map(${t.size})`]: [...t.entries()].reduce((e, [t, n], r) => (e[Ce(t, r) + " =>"] = n, e), {}) } : p(t) ? { [`Set(${t.size})`]: [...t.values()].map((e) => Ce(e)) } : _(t) ? Ce(t) : v(t) && !d(t) && !C(t) ? String(t) : t, Ce = (e, t = "") => _(e) ? `Symbol(${e.description ?? t})` : e, j, we = class { +var Se = (e) => !!(e && e.__v_isRef === !0), k = (e) => g(e) ? e : e == null ? "" : d(e) || v(e) && (e.toString === b || !h(e.toString)) ? Se(e) ? k(e.value) : JSON.stringify(e, Ce, 2) : String(e), Ce = (e, t) => Se(t) ? Ce(e, t.value) : f(t) ? { [`Map(${t.size})`]: [...t.entries()].reduce((e, [t, n], r) => (e[we(t, r) + " =>"] = n, e), {}) } : p(t) ? { [`Set(${t.size})`]: [...t.values()].map((e) => we(e)) } : _(t) ? we(t) : v(t) && !d(t) && !C(t) ? String(t) : t, we = (e, t = "") => _(e) ? `Symbol(${e.description ?? t})` : e, A, Te = class { constructor(e = !1) { - this.detached = e, this._active = !0, this._on = 0, this.effects = [], this.cleanups = [], this._isPaused = !1, this._warnOnRun = !0, this.__v_skip = !0, !e && j && (j.active ? (this.parent = j, this.index = (j.scopes ||= []).push(this) - 1) : (this._active = !1, this._warnOnRun = !1)); + this.detached = e, this._active = !0, this._on = 0, this.effects = [], this.cleanups = [], this._isPaused = !1, this._warnOnRun = !0, this.__v_skip = !0, !e && A && (A.active ? (this.parent = A, this.index = (A.scopes ||= []).push(this) - 1) : (this._active = !1, this._warnOnRun = !1)); } get active() { return this._active; @@ -108,22 +108,22 @@ var xe = (e) => !!(e && e.__v_isRef === !0), A = (e) => g(e) ? e : e == null ? " } run(e) { if (this._active) { - let t = j; + let t = A; try { - return j = this, e(); + return A = this, e(); } finally { - j = t; + A = t; } } } on() { - ++this._on === 1 && (this.prevScope = j, j = this); + ++this._on === 1 && (this.prevScope = A, A = this); } off() { if (this._on > 0 && --this._on === 0) { - if (j === this) j = this.prevScope; + if (A === this) A = this.prevScope; else { - let e = j; + let e = A; for (; e;) { if (e.prevScope === this) { e.prevScope = this.prevScope; @@ -153,41 +153,41 @@ var xe = (e) => !!(e && e.__v_isRef === !0), A = (e) => g(e) ? e : e == null ? " } } }; -function Te() { - return j; +function Ee() { + return A; } -var M, Ee = /* @__PURE__ */ new WeakSet(), De = class { +var j, De = /* @__PURE__ */ new WeakSet(), Oe = class { constructor(e) { - this.fn = e, this.deps = void 0, this.depsTail = void 0, this.flags = 5, this.next = void 0, this.cleanup = void 0, this.scheduler = void 0, j && (j.active ? j.effects.push(this) : this.flags &= -2); + this.fn = e, this.deps = void 0, this.depsTail = void 0, this.flags = 5, this.next = void 0, this.cleanup = void 0, this.scheduler = void 0, A && (A.active ? A.effects.push(this) : this.flags &= -2); } pause() { this.flags |= 64; } resume() { - this.flags & 64 && (this.flags &= -65, Ee.has(this) && (Ee.delete(this), this.trigger())); + this.flags & 64 && (this.flags &= -65, De.has(this) && (De.delete(this), this.trigger())); } notify() { - this.flags & 2 && !(this.flags & 32) || this.flags & 8 || je(this); + this.flags & 2 && !(this.flags & 32) || this.flags & 8 || Me(this); } run() { if (!(this.flags & 1)) return this.fn(); - this.flags |= 2, Ue(this), Pe(this); - let e = M, t = N; - M = this, N = !0; + this.flags |= 2, We(this), M(this); + let e = j, t = Be; + j = this, Be = !0; try { return this.fn(); } finally { - Fe(this), M = e, N = t, this.flags &= -3; + Fe(this), j = e, Be = t, this.flags &= -3; } } stop() { if (this.flags & 1) { for (let e = this.deps; e; e = e.nextDep) Re(e); - this.deps = this.depsTail = void 0, Ue(this), this.onStop && this.onStop(), this.flags &= -2; + this.deps = this.depsTail = void 0, We(this), this.onStop && this.onStop(), this.flags &= -2; } } trigger() { - this.flags & 64 ? Ee.add(this) : this.scheduler ? this.scheduler() : this.runIfDirty(); + this.flags & 64 ? De.add(this) : this.scheduler ? this.scheduler() : this.runIfDirty(); } runIfDirty() { Ie(this) && this.run(); @@ -195,30 +195,30 @@ var M, Ee = /* @__PURE__ */ new WeakSet(), De = class { get dirty() { return Ie(this); } -}, Oe = 0, ke, Ae; -function je(e, t = !1) { +}, ke = 0, Ae, je; +function Me(e, t = !1) { if (e.flags |= 8, t) { - e.next = Ae, Ae = e; + e.next = je, je = e; return; } - e.next = ke, ke = e; -} -function Me() { - Oe++; + e.next = Ae, Ae = e; } function Ne() { - if (--Oe > 0) return; - if (Ae) { - let e = Ae; - for (Ae = void 0; e;) { + ke++; +} +function Pe() { + if (--ke > 0) return; + if (je) { + let e = je; + for (je = void 0; e;) { let t = e.next; e.next = void 0, e.flags &= -9, e = t; } } let e; - for (; ke;) { - let t = ke; - for (ke = void 0; t;) { + for (; Ae;) { + let t = Ae; + for (Ae = void 0; t;) { let n = t.next; if (t.next = void 0, t.flags &= -9, t.flags & 1) try { t.trigger(); @@ -230,7 +230,7 @@ function Ne() { } if (e) throw e; } -function Pe(e) { +function M(e) { for (let t = e.deps; t; t = t.nextDep) t.version = -1, t.prevActiveLink = t.dep.activeLink, t.dep.activeLink = t; } function Fe(e) { @@ -246,18 +246,18 @@ function Ie(e) { return !!e._dirty; } function Le(e) { - if (e.flags & 4 && !(e.flags & 16) || (e.flags &= -17, e.globalVersion === We) || (e.globalVersion = We, !e.isSSR && e.flags & 128 && (!e.deps && !e._dirty || !Ie(e)))) return; + if (e.flags & 4 && !(e.flags & 16) || (e.flags &= -17, e.globalVersion === Ge) || (e.globalVersion = Ge, !e.isSSR && e.flags & 128 && (!e.deps && !e._dirty || !Ie(e)))) return; e.flags |= 2; - let t = e.dep, n = M, r = N; - M = e, N = !0; + let t = e.dep, n = j, r = Be; + j = e, Be = !0; try { - Pe(e); + M(e); let n = e.fn(e._value); - (t.version === 0 || O(n, e._value)) && (e.flags |= 128, e._value = n, t.version++); + (t.version === 0 || D(n, e._value)) && (e.flags |= 128, e._value = n, t.version++); } catch (e) { throw t.version++, e; } finally { - M = n, N = r, Fe(e), e.flags &= -3; + j = n, Be = r, Fe(e), e.flags &= -3; } } function Re(e, t = !1) { @@ -272,252 +272,252 @@ function ze(e) { let { prevDep: t, nextDep: n } = e; t && (t.nextDep = n, e.prevDep = void 0), n && (n.prevDep = t, e.nextDep = void 0); } -var N = !0, Be = []; -function Ve() { - Be.push(N), N = !1; -} +var Be = !0, Ve = []; function He() { - let e = Be.pop(); - N = e === void 0 ? !0 : e; + Ve.push(Be), Be = !1; +} +function Ue() { + let e = Ve.pop(); + Be = e === void 0 ? !0 : e; } -function Ue(e) { +function We(e) { let { cleanup: t } = e; if (e.cleanup = void 0, t) { - let e = M; - M = void 0; + let e = j; + j = void 0; try { t(); } finally { - M = e; + j = e; } } } -var We = 0, Ge = class { +var Ge = 0, Ke = class { constructor(e, t) { this.sub = e, this.dep = t, this.version = t.version, this.nextDep = this.prevDep = this.nextSub = this.prevSub = this.prevActiveLink = void 0; } -}, Ke = class { +}, qe = class { constructor(e) { this.computed = e, this.version = 0, this.activeLink = void 0, this.subs = void 0, this.map = void 0, this.key = void 0, this.sc = 0, this.__v_skip = !0; } track(e) { - if (!M || !N || M === this.computed) return; + if (!j || !Be || j === this.computed) return; let t = this.activeLink; - if (t === void 0 || t.sub !== M) t = this.activeLink = new Ge(M, this), M.deps ? (t.prevDep = M.depsTail, M.depsTail.nextDep = t, M.depsTail = t) : M.deps = M.depsTail = t, qe(t); + if (t === void 0 || t.sub !== j) t = this.activeLink = new Ke(j, this), j.deps ? (t.prevDep = j.depsTail, j.depsTail.nextDep = t, j.depsTail = t) : j.deps = j.depsTail = t, Je(t); else if (t.version === -1 && (t.version = this.version, t.nextDep)) { let e = t.nextDep; - e.prevDep = t.prevDep, t.prevDep && (t.prevDep.nextDep = e), t.prevDep = M.depsTail, t.nextDep = void 0, M.depsTail.nextDep = t, M.depsTail = t, M.deps === t && (M.deps = e); + e.prevDep = t.prevDep, t.prevDep && (t.prevDep.nextDep = e), t.prevDep = j.depsTail, t.nextDep = void 0, j.depsTail.nextDep = t, j.depsTail = t, j.deps === t && (j.deps = e); } return t; } trigger(e) { - this.version++, We++, this.notify(e); + this.version++, Ge++, this.notify(e); } notify(e) { - Me(); + Ne(); try { for (let e = this.subs; e; e = e.prevSub) e.sub.notify() && e.sub.dep.notify(); } finally { - Ne(); + Pe(); } } }; -function qe(e) { +function Je(e) { if (e.dep.sc++, e.sub.flags & 4) { let t = e.dep.computed; if (t && !e.dep.subs) { t.flags |= 20; - for (let e = t.deps; e; e = e.nextDep) qe(e); + for (let e = t.deps; e; e = e.nextDep) Je(e); } let n = e.dep.subs; n !== e && (e.prevSub = n, n && (n.nextSub = e)), e.dep.subs = e; } } -var Je = /* @__PURE__ */ new WeakMap(), Ye = /* @__PURE__ */ Symbol(""), Xe = /* @__PURE__ */ Symbol(""), Ze = /* @__PURE__ */ Symbol(""); -function P(e, t, n) { - if (N && M) { - let t = Je.get(e); - t || Je.set(e, t = /* @__PURE__ */ new Map()); +var Ye = /* @__PURE__ */ new WeakMap(), Xe = /* @__PURE__ */ Symbol(""), Ze = /* @__PURE__ */ Symbol(""), Qe = /* @__PURE__ */ Symbol(""); +function N(e, t, n) { + if (Be && j) { + let t = Ye.get(e); + t || Ye.set(e, t = /* @__PURE__ */ new Map()); let r = t.get(n); - r || (t.set(n, r = new Ke()), r.map = t, r.key = n), r.track(); + r || (t.set(n, r = new qe()), r.map = t, r.key = n), r.track(); } } -function Qe(e, t, n, r, i, a) { - let o = Je.get(e); +function $e(e, t, n, r, i, a) { + let o = Ye.get(e); if (!o) { - We++; + Ge++; return; } let s = (e) => { e && e.trigger(); }; - if (Me(), t === "clear") o.forEach(s); + if (Ne(), t === "clear") o.forEach(s); else { let i = d(e), a = i && w(n); if (i && n === "length") { let e = Number(r); o.forEach((t, n) => { - (n === "length" || n === Ze || !_(n) && n >= e) && s(t); + (n === "length" || n === Qe || !_(n) && n >= e) && s(t); }); - } else switch ((n !== void 0 || o.has(void 0)) && s(o.get(n)), a && s(o.get(Ze)), t) { + } else switch ((n !== void 0 || o.has(void 0)) && s(o.get(n)), a && s(o.get(Qe)), t) { case "add": - i ? a && s(o.get("length")) : (s(o.get(Ye)), f(e) && s(o.get(Xe))); + i ? a && s(o.get("length")) : (s(o.get(Xe)), f(e) && s(o.get(Ze))); break; case "delete": - i || (s(o.get(Ye)), f(e) && s(o.get(Xe))); + i || (s(o.get(Xe)), f(e) && s(o.get(Ze))); break; case "set": - f(e) && s(o.get(Ye)); + f(e) && s(o.get(Xe)); break; } } - Ne(); -} -function $e(e) { - let t = /* @__PURE__ */ L(e); - return t === e ? t : (P(t, "iterate", Ze), /* @__PURE__ */ I(e) ? t : t.map(R)); + Pe(); } function et(e) { - return P(e = /* @__PURE__ */ L(e), "iterate", Ze), e; + let t = /* @__PURE__ */ F(e); + return t === e ? t : (N(t, "iterate", Qe), /* @__PURE__ */ P(e) ? t : t.map(Ht)); +} +function tt(e) { + return N(e = /* @__PURE__ */ F(e), "iterate", Qe), e; } -function F(e, t) { - return /* @__PURE__ */ Lt(e) ? Bt(/* @__PURE__ */ It(e) ? R(t) : t) : R(t); +function nt(e, t) { + return /* @__PURE__ */ zt(e) ? Ut(/* @__PURE__ */ Rt(e) ? Ht(t) : t) : Ht(t); } -var tt = { +var rt = { __proto__: null, [Symbol.iterator]() { - return nt(this, Symbol.iterator, (e) => F(this, e)); + return it(this, Symbol.iterator, (e) => nt(this, e)); }, concat(...e) { - return $e(this).concat(...e.map((e) => d(e) ? $e(e) : e)); + return et(this).concat(...e.map((e) => d(e) ? et(e) : e)); }, entries() { - return nt(this, "entries", (e) => (e[1] = F(this, e[1]), e)); + return it(this, "entries", (e) => (e[1] = nt(this, e[1]), e)); }, every(e, t) { - return it(this, "every", e, t, void 0, arguments); + return ot(this, "every", e, t, void 0, arguments); }, filter(e, t) { - return it(this, "filter", e, t, (e) => e.map((e) => F(this, e)), arguments); + return ot(this, "filter", e, t, (e) => e.map((e) => nt(this, e)), arguments); }, find(e, t) { - return it(this, "find", e, t, (e) => F(this, e), arguments); + return ot(this, "find", e, t, (e) => nt(this, e), arguments); }, findIndex(e, t) { - return it(this, "findIndex", e, t, void 0, arguments); + return ot(this, "findIndex", e, t, void 0, arguments); }, findLast(e, t) { - return it(this, "findLast", e, t, (e) => F(this, e), arguments); + return ot(this, "findLast", e, t, (e) => nt(this, e), arguments); }, findLastIndex(e, t) { - return it(this, "findLastIndex", e, t, void 0, arguments); + return ot(this, "findLastIndex", e, t, void 0, arguments); }, forEach(e, t) { - return it(this, "forEach", e, t, void 0, arguments); + return ot(this, "forEach", e, t, void 0, arguments); }, includes(...e) { - return ot(this, "includes", e); + return ct(this, "includes", e); }, indexOf(...e) { - return ot(this, "indexOf", e); + return ct(this, "indexOf", e); }, join(e) { - return $e(this).join(e); + return et(this).join(e); }, lastIndexOf(...e) { - return ot(this, "lastIndexOf", e); + return ct(this, "lastIndexOf", e); }, map(e, t) { - return it(this, "map", e, t, void 0, arguments); + return ot(this, "map", e, t, void 0, arguments); }, pop() { - return st(this, "pop"); + return lt(this, "pop"); }, push(...e) { - return st(this, "push", e); + return lt(this, "push", e); }, reduce(e, ...t) { - return at(this, "reduce", e, t); + return st(this, "reduce", e, t); }, reduceRight(e, ...t) { - return at(this, "reduceRight", e, t); + return st(this, "reduceRight", e, t); }, shift() { - return st(this, "shift"); + return lt(this, "shift"); }, some(e, t) { - return it(this, "some", e, t, void 0, arguments); + return ot(this, "some", e, t, void 0, arguments); }, splice(...e) { - return st(this, "splice", e); + return lt(this, "splice", e); }, toReversed() { - return $e(this).toReversed(); + return et(this).toReversed(); }, toSorted(e) { - return $e(this).toSorted(e); + return et(this).toSorted(e); }, toSpliced(...e) { - return $e(this).toSpliced(...e); + return et(this).toSpliced(...e); }, unshift(...e) { - return st(this, "unshift", e); + return lt(this, "unshift", e); }, values() { - return nt(this, "values", (e) => F(this, e)); + return it(this, "values", (e) => nt(this, e)); } }; -function nt(e, t, n) { - let r = et(e), i = r[t](); - return r !== e && !/* @__PURE__ */ I(e) && (i._next = i.next, i.next = () => { +function it(e, t, n) { + let r = tt(e), i = r[t](); + return r !== e && !/* @__PURE__ */ P(e) && (i._next = i.next, i.next = () => { let e = i._next(); return e.done || (e.value = n(e.value)), e; }), i; } -var rt = Array.prototype; -function it(e, t, n, r, i, a) { - let o = et(e), s = o !== e && !/* @__PURE__ */ I(e), c = o[t]; - if (c !== rt[t]) { +var at = Array.prototype; +function ot(e, t, n, r, i, a) { + let o = tt(e), s = o !== e && !/* @__PURE__ */ P(e), c = o[t]; + if (c !== at[t]) { let t = c.apply(e, a); - return s ? R(t) : t; + return s ? Ht(t) : t; } let l = n; o !== e && (s ? l = function(t, r) { - return n.call(this, F(e, t), r, e); + return n.call(this, nt(e, t), r, e); } : n.length > 2 && (l = function(t, r) { return n.call(this, t, r, e); })); let u = c.call(o, l, r); return s && i ? i(u) : u; } -function at(e, t, n, r) { - let i = et(e), a = i !== e && !/* @__PURE__ */ I(e), o = n, s = !1; +function st(e, t, n, r) { + let i = tt(e), a = i !== e && !/* @__PURE__ */ P(e), o = n, s = !1; i !== e && (a ? (s = r.length === 0, o = function(t, r, i) { - return s && (s = !1, t = F(e, t)), n.call(this, t, F(e, r), i, e); + return s && (s = !1, t = nt(e, t)), n.call(this, t, nt(e, r), i, e); }) : n.length > 3 && (o = function(t, r, i) { return n.call(this, t, r, i, e); })); let c = i[t](o, ...r); - return s ? F(e, c) : c; + return s ? nt(e, c) : c; } -function ot(e, t, n) { - let r = /* @__PURE__ */ L(e); - P(r, "iterate", Ze); +function ct(e, t, n) { + let r = /* @__PURE__ */ F(e); + N(r, "iterate", Qe); let i = r[t](...n); - return (i === -1 || i === !1) && /* @__PURE__ */ Rt(n[0]) ? (n[0] = /* @__PURE__ */ L(n[0]), r[t](...n)) : i; + return (i === -1 || i === !1) && /* @__PURE__ */ Bt(n[0]) ? (n[0] = /* @__PURE__ */ F(n[0]), r[t](...n)) : i; } -function st(e, t, n = []) { - Ve(), Me(); - let r = (/* @__PURE__ */ L(e))[t].apply(e, n); - return Ne(), He(), r; +function lt(e, t, n = []) { + He(), Ne(); + let r = (/* @__PURE__ */ F(e))[t].apply(e, n); + return Pe(), Ue(), r; } -var ct = /* @__PURE__ */ e("__proto__,__v_isRef,__isVue"), lt = new Set(/* @__PURE__ */ Object.getOwnPropertyNames(Symbol).filter((e) => e !== "arguments" && e !== "caller").map((e) => Symbol[e]).filter(_)); -function ut(e) { +var ut = /* @__PURE__ */ e("__proto__,__v_isRef,__isVue"), dt = new Set(/* @__PURE__ */ Object.getOwnPropertyNames(Symbol).filter((e) => e !== "arguments" && e !== "caller").map((e) => Symbol[e]).filter(_)); +function ft(e) { _(e) || (e = String(e)); - let t = /* @__PURE__ */ L(this); - return P(t, "has", e), t.hasOwnProperty(e); + let t = /* @__PURE__ */ F(this); + return N(t, "has", e), t.hasOwnProperty(e); } -var dt = class { +var pt = class { constructor(e = !1, t = !1) { this._isReadonly = e, this._isShallow = t; } @@ -527,46 +527,46 @@ var dt = class { if (t === "__v_isReactive") return !r; if (t === "__v_isReadonly") return r; if (t === "__v_isShallow") return i; - if (t === "__v_raw") return n === (r ? i ? kt : Ot : i ? Dt : Et).get(e) || Object.getPrototypeOf(e) === Object.getPrototypeOf(n) ? e : void 0; + if (t === "__v_raw") return n === (r ? i ? jt : At : i ? kt : Ot).get(e) || Object.getPrototypeOf(e) === Object.getPrototypeOf(n) ? e : void 0; let a = d(e); if (!r) { let e; - if (a && (e = tt[t])) return e; - if (t === "hasOwnProperty") return ut; + if (a && (e = rt[t])) return e; + if (t === "hasOwnProperty") return ft; } - let o = Reflect.get(e, t, /* @__PURE__ */ z(e) ? e : n); - if ((_(t) ? lt.has(t) : ct(t)) || (r || P(e, "get", t), i)) return o; - if (/* @__PURE__ */ z(o)) { + let o = Reflect.get(e, t, /* @__PURE__ */ I(e) ? e : n); + if ((_(t) ? dt.has(t) : ut(t)) || (r || N(e, "get", t), i)) return o; + if (/* @__PURE__ */ I(o)) { let e = a && w(t) ? o : o.value; - return r && v(e) ? /* @__PURE__ */ Pt(e) : e; + return r && v(e) ? /* @__PURE__ */ It(e) : e; } - return v(o) ? r ? /* @__PURE__ */ Pt(o) : /* @__PURE__ */ Mt(o) : o; + return v(o) ? r ? /* @__PURE__ */ It(o) : /* @__PURE__ */ Pt(o) : o; } -}, ft = class extends dt { +}, mt = class extends pt { constructor(e = !1) { super(!1, e); } set(e, t, n, r) { let i = e[t], a = d(e) && w(t); if (!this._isShallow) { - let e = /* @__PURE__ */ Lt(i); - if (!/* @__PURE__ */ I(n) && !/* @__PURE__ */ Lt(n) && (i = /* @__PURE__ */ L(i), n = /* @__PURE__ */ L(n)), !a && /* @__PURE__ */ z(i) && !/* @__PURE__ */ z(n)) return e || (i.value = n), !0; + let e = /* @__PURE__ */ zt(i); + if (!/* @__PURE__ */ P(n) && !/* @__PURE__ */ zt(n) && (i = /* @__PURE__ */ F(i), n = /* @__PURE__ */ F(n)), !a && /* @__PURE__ */ I(i) && !/* @__PURE__ */ I(n)) return e || (i.value = n), !0; } - let o = a ? Number(t) < e.length : u(e, t), s = Reflect.set(e, t, n, /* @__PURE__ */ z(e) ? e : r); - return e === /* @__PURE__ */ L(r) && (o ? O(n, i) && Qe(e, "set", t, n, i) : Qe(e, "add", t, n)), s; + let o = a ? Number(t) < e.length : u(e, t), s = Reflect.set(e, t, n, /* @__PURE__ */ I(e) ? e : r); + return e === /* @__PURE__ */ F(r) && (o ? D(n, i) && $e(e, "set", t, n, i) : $e(e, "add", t, n)), s; } deleteProperty(e, t) { let n = u(e, t), r = e[t], i = Reflect.deleteProperty(e, t); - return i && n && Qe(e, "delete", t, void 0, r), i; + return i && n && $e(e, "delete", t, void 0, r), i; } has(e, t) { let n = Reflect.has(e, t); - return (!_(t) || !lt.has(t)) && P(e, "has", t), n; + return (!_(t) || !dt.has(t)) && N(e, "has", t), n; } ownKeys(e) { - return P(e, "iterate", d(e) ? "length" : Ye), Reflect.ownKeys(e); + return N(e, "iterate", d(e) ? "length" : Xe), Reflect.ownKeys(e); } -}, pt = class extends dt { +}, ht = class extends pt { constructor(e = !1) { super(!0, e); } @@ -576,11 +576,11 @@ var dt = class { deleteProperty(e, t) { return !0; } -}, mt = /* @__PURE__ */ new ft(), ht = /* @__PURE__ */ new pt(), gt = /* @__PURE__ */ new ft(!0), _t = (e) => e, vt = (e) => Reflect.getPrototypeOf(e); -function yt(e, t, n) { +}, gt = /* @__PURE__ */ new mt(), _t = /* @__PURE__ */ new ht(), vt = /* @__PURE__ */ new mt(!0), yt = (e) => e, bt = (e) => Reflect.getPrototypeOf(e); +function xt(e, t, n) { return function(...r) { - let i = this.__v_raw, a = /* @__PURE__ */ L(i), o = f(a), c = e === "entries" || e === Symbol.iterator && o, l = e === "keys" && o, u = i[e](...r), d = n ? _t : t ? Bt : R; - return !t && P(a, "iterate", l ? Xe : Ye), s(Object.create(u), { next() { + let i = this.__v_raw, a = /* @__PURE__ */ F(i), o = f(a), c = e === "entries" || e === Symbol.iterator && o, l = e === "keys" && o, u = i[e](...r), d = n ? yt : t ? Ut : Ht; + return !t && N(a, "iterate", l ? Ze : Xe), s(Object.create(u), { next() { let { value: e, done: t } = u.next(); return t ? { value: e, @@ -592,60 +592,60 @@ function yt(e, t, n) { } }); }; } -function bt(e) { +function St(e) { return function(...t) { return e === "delete" ? !1 : e === "clear" ? void 0 : this; }; } -function xt(e, t) { +function Ct(e, t) { let n = { get(n) { - let r = this.__v_raw, i = /* @__PURE__ */ L(r), a = /* @__PURE__ */ L(n); - e || (O(n, a) && P(i, "get", n), P(i, "get", a)); - let { has: o } = vt(i), s = t ? _t : e ? Bt : R; + let r = this.__v_raw, i = /* @__PURE__ */ F(r), a = /* @__PURE__ */ F(n); + e || (D(n, a) && N(i, "get", n), N(i, "get", a)); + let { has: o } = bt(i), s = t ? yt : e ? Ut : Ht; if (o.call(i, n)) return s(r.get(n)); if (o.call(i, a)) return s(r.get(a)); r !== i && r.get(n); }, get size() { let t = this.__v_raw; - return !e && P(/* @__PURE__ */ L(t), "iterate", Ye), t.size; + return !e && N(/* @__PURE__ */ F(t), "iterate", Xe), t.size; }, has(t) { - let n = this.__v_raw, r = /* @__PURE__ */ L(n), i = /* @__PURE__ */ L(t); - return e || (O(t, i) && P(r, "has", t), P(r, "has", i)), t === i ? n.has(t) : n.has(t) || n.has(i); + let n = this.__v_raw, r = /* @__PURE__ */ F(n), i = /* @__PURE__ */ F(t); + return e || (D(t, i) && N(r, "has", t), N(r, "has", i)), t === i ? n.has(t) : n.has(t) || n.has(i); }, forEach(n, r) { - let i = this, a = i.__v_raw, o = /* @__PURE__ */ L(a), s = t ? _t : e ? Bt : R; - return !e && P(o, "iterate", Ye), a.forEach((e, t) => n.call(r, s(e), s(t), i)); + let i = this, a = i.__v_raw, o = /* @__PURE__ */ F(a), s = t ? yt : e ? Ut : Ht; + return !e && N(o, "iterate", Xe), a.forEach((e, t) => n.call(r, s(e), s(t), i)); } }; return s(n, e ? { - add: bt("add"), - set: bt("set"), - delete: bt("delete"), - clear: bt("clear") + add: St("add"), + set: St("set"), + delete: St("delete"), + clear: St("clear") } : { add(e) { - let n = /* @__PURE__ */ L(this), r = vt(n), i = /* @__PURE__ */ L(e), a = !t && !/* @__PURE__ */ I(e) && !/* @__PURE__ */ Lt(e) ? i : e; - return r.has.call(n, a) || O(e, a) && r.has.call(n, e) || O(i, a) && r.has.call(n, i) || (n.add(a), Qe(n, "add", a, a)), this; + let n = /* @__PURE__ */ F(this), r = bt(n), i = /* @__PURE__ */ F(e), a = !t && !/* @__PURE__ */ P(e) && !/* @__PURE__ */ zt(e) ? i : e; + return r.has.call(n, a) || D(e, a) && r.has.call(n, e) || D(i, a) && r.has.call(n, i) || (n.add(a), $e(n, "add", a, a)), this; }, set(e, n) { - !t && !/* @__PURE__ */ I(n) && !/* @__PURE__ */ Lt(n) && (n = /* @__PURE__ */ L(n)); - let r = /* @__PURE__ */ L(this), { has: i, get: a } = vt(r), o = i.call(r, e); - o ||= (e = /* @__PURE__ */ L(e), i.call(r, e)); + !t && !/* @__PURE__ */ P(n) && !/* @__PURE__ */ zt(n) && (n = /* @__PURE__ */ F(n)); + let r = /* @__PURE__ */ F(this), { has: i, get: a } = bt(r), o = i.call(r, e); + o ||= (e = /* @__PURE__ */ F(e), i.call(r, e)); let s = a.call(r, e); - return r.set(e, n), o ? O(n, s) && Qe(r, "set", e, n, s) : Qe(r, "add", e, n), this; + return r.set(e, n), o ? D(n, s) && $e(r, "set", e, n, s) : $e(r, "add", e, n), this; }, delete(e) { - let t = /* @__PURE__ */ L(this), { has: n, get: r } = vt(t), i = n.call(t, e); - i ||= (e = /* @__PURE__ */ L(e), n.call(t, e)); + let t = /* @__PURE__ */ F(this), { has: n, get: r } = bt(t), i = n.call(t, e); + i ||= (e = /* @__PURE__ */ F(e), n.call(t, e)); let a = r ? r.call(t, e) : void 0, o = t.delete(e); - return i && Qe(t, "delete", e, void 0, a), o; + return i && $e(t, "delete", e, void 0, a), o; }, clear() { - let e = /* @__PURE__ */ L(this), t = e.size !== 0, n = e.clear(); - return t && Qe(e, "clear", void 0, void 0, void 0), n; + let e = /* @__PURE__ */ F(this), t = e.size !== 0, n = e.clear(); + return t && $e(e, "clear", void 0, void 0, void 0), n; } }), [ "keys", @@ -653,15 +653,15 @@ function xt(e, t) { "entries", Symbol.iterator ].forEach((r) => { - n[r] = yt(r, e, t); + n[r] = xt(r, e, t); }), n; } -function St(e, t) { - let n = xt(e, t); +function wt(e, t) { + let n = Ct(e, t); return (t, r, i) => r === "__v_isReactive" ? !e : r === "__v_isReadonly" ? e : r === "__v_raw" ? t : Reflect.get(u(n, r) && r in t ? n : t, r, i); } -var Ct = { get: /* @__PURE__ */ St(!1, !1) }, wt = { get: /* @__PURE__ */ St(!1, !0) }, Tt = { get: /* @__PURE__ */ St(!0, !1) }, Et = /* @__PURE__ */ new WeakMap(), Dt = /* @__PURE__ */ new WeakMap(), Ot = /* @__PURE__ */ new WeakMap(), kt = /* @__PURE__ */ new WeakMap(); -function At(e) { +var Tt = { get: /* @__PURE__ */ wt(!1, !1) }, Et = { get: /* @__PURE__ */ wt(!1, !0) }, Dt = { get: /* @__PURE__ */ wt(!0, !1) }, Ot = /* @__PURE__ */ new WeakMap(), kt = /* @__PURE__ */ new WeakMap(), At = /* @__PURE__ */ new WeakMap(), jt = /* @__PURE__ */ new WeakMap(); +function Mt(e) { switch (e) { case "Object": case "Array": return 1; @@ -672,24 +672,24 @@ function At(e) { default: return 0; } } -function jt(e) { - return e.__v_skip || !Object.isExtensible(e) ? 0 : At(S(e)); +function Nt(e) { + return e.__v_skip || !Object.isExtensible(e) ? 0 : Mt(S(e)); } /* @__NO_SIDE_EFFECTS__ */ -function Mt(e) { - return /* @__PURE__ */ Lt(e) ? e : Ft(e, !1, mt, Ct, Et); +function Pt(e) { + return /* @__PURE__ */ zt(e) ? e : Lt(e, !1, gt, Tt, Ot); } /* @__NO_SIDE_EFFECTS__ */ -function Nt(e) { - return Ft(e, !1, gt, wt, Dt); +function Ft(e) { + return Lt(e, !1, vt, Et, kt); } /* @__NO_SIDE_EFFECTS__ */ -function Pt(e) { - return Ft(e, !0, ht, Tt, Ot); +function It(e) { + return Lt(e, !0, _t, Dt, At); } -function Ft(e, t, n, r, i) { +function Lt(e, t, n, r, i) { if (!v(e) || e.__v_raw && !(t && e.__v_isReactive)) return e; - let a = jt(e); + let a = Nt(e); if (a === 0) return e; let o = i.get(e); if (o) return o; @@ -697,72 +697,72 @@ function Ft(e, t, n, r, i) { return i.set(e, s), s; } /* @__NO_SIDE_EFFECTS__ */ -function It(e) { - return /* @__PURE__ */ Lt(e) ? /* @__PURE__ */ It(e.__v_raw) : !!(e && e.__v_isReactive); +function Rt(e) { + return /* @__PURE__ */ zt(e) ? /* @__PURE__ */ Rt(e.__v_raw) : !!(e && e.__v_isReactive); } /* @__NO_SIDE_EFFECTS__ */ -function Lt(e) { +function zt(e) { return !!(e && e.__v_isReadonly); } /* @__NO_SIDE_EFFECTS__ */ -function I(e) { +function P(e) { return !!(e && e.__v_isShallow); } /* @__NO_SIDE_EFFECTS__ */ -function Rt(e) { +function Bt(e) { return e ? !!e.__v_raw : !1; } /* @__NO_SIDE_EFFECTS__ */ -function L(e) { +function F(e) { let t = e && e.__v_raw; - return t ? /* @__PURE__ */ L(t) : e; + return t ? /* @__PURE__ */ F(t) : e; } -function zt(e) { - return !u(e, "__v_skip") && Object.isExtensible(e) && k(e, "__v_skip", !0), e; +function Vt(e) { + return !u(e, "__v_skip") && Object.isExtensible(e) && O(e, "__v_skip", !0), e; } -var R = (e) => v(e) ? /* @__PURE__ */ Mt(e) : e, Bt = (e) => v(e) ? /* @__PURE__ */ Pt(e) : e; +var Ht = (e) => v(e) ? /* @__PURE__ */ Pt(e) : e, Ut = (e) => v(e) ? /* @__PURE__ */ It(e) : e; /* @__NO_SIDE_EFFECTS__ */ -function z(e) { +function I(e) { return e ? e.__v_isRef === !0 : !1; } /* @__NO_SIDE_EFFECTS__ */ -function Vt(e) { - return Ht(e, !1); +function Wt(e) { + return Gt(e, !1); } -function Ht(e, t) { - return /* @__PURE__ */ z(e) ? e : new Ut(e, t); +function Gt(e, t) { + return /* @__PURE__ */ I(e) ? e : new Kt(e, t); } -var Ut = class { +var Kt = class { constructor(e, t) { - this.dep = new Ke(), this.__v_isRef = !0, this.__v_isShallow = !1, this._rawValue = t ? e : /* @__PURE__ */ L(e), this._value = t ? e : R(e), this.__v_isShallow = t; + this.dep = new qe(), this.__v_isRef = !0, this.__v_isShallow = !1, this._rawValue = t ? e : /* @__PURE__ */ F(e), this._value = t ? e : Ht(e), this.__v_isShallow = t; } get value() { return this.dep.track(), this._value; } set value(e) { - let t = this._rawValue, n = this.__v_isShallow || /* @__PURE__ */ I(e) || /* @__PURE__ */ Lt(e); - e = n ? e : /* @__PURE__ */ L(e), O(e, t) && (this._rawValue = e, this._value = n ? e : R(e), this.dep.trigger()); + let t = this._rawValue, n = this.__v_isShallow || /* @__PURE__ */ P(e) || /* @__PURE__ */ zt(e); + e = n ? e : /* @__PURE__ */ F(e), D(e, t) && (this._rawValue = e, this._value = n ? e : Ht(e), this.dep.trigger()); } }; -function Wt(e) { - return /* @__PURE__ */ z(e) ? e.value : e; +function qt(e) { + return /* @__PURE__ */ I(e) ? e.value : e; } -var Gt = { - get: (e, t, n) => t === "__v_raw" ? e : Wt(Reflect.get(e, t, n)), +var Jt = { + get: (e, t, n) => t === "__v_raw" ? e : qt(Reflect.get(e, t, n)), set: (e, t, n, r) => { let i = e[t]; - return /* @__PURE__ */ z(i) && !/* @__PURE__ */ z(n) ? (i.value = n, !0) : Reflect.set(e, t, n, r); + return /* @__PURE__ */ I(i) && !/* @__PURE__ */ I(n) ? (i.value = n, !0) : Reflect.set(e, t, n, r); } }; -function Kt(e) { - return /* @__PURE__ */ It(e) ? e : new Proxy(e, Gt); +function Yt(e) { + return /* @__PURE__ */ Rt(e) ? e : new Proxy(e, Jt); } -var qt = class { +var Xt = class { constructor(e, t, n) { - this.fn = e, this.setter = t, this._value = void 0, this.dep = new Ke(this), this.__v_isRef = !0, this.deps = void 0, this.depsTail = void 0, this.flags = 16, this.globalVersion = We - 1, this.next = void 0, this.effect = this, this.__v_isReadonly = !t, this.isSSR = n; + this.fn = e, this.setter = t, this._value = void 0, this.dep = new qe(this), this.__v_isRef = !0, this.deps = void 0, this.depsTail = void 0, this.flags = 16, this.globalVersion = Ge - 1, this.next = void 0, this.effect = this, this.__v_isReadonly = !t, this.isSSR = n; } notify() { - if (this.flags |= 16, !(this.flags & 8) && M !== this) return je(this, !0), !0; + if (this.flags |= 16, !(this.flags & 8) && j !== this) return Me(this, !0), !0; } get value() { let e = this.dep.track(); @@ -773,44 +773,44 @@ var qt = class { } }; /* @__NO_SIDE_EFFECTS__ */ -function Jt(e, t, n = !1) { +function Zt(e, t, n = !1) { let r, i; - return h(e) ? r = e : (r = e.get, i = e.set), new qt(r, i, n); + return h(e) ? r = e : (r = e.get, i = e.set), new Xt(r, i, n); } -var Yt = {}, Xt = /* @__PURE__ */ new WeakMap(), Zt = void 0; -function Qt(e, t = !1, n = Zt) { +var Qt = {}, $t = /* @__PURE__ */ new WeakMap(), en = void 0; +function tn(e, t = !1, n = en) { if (n) { - let t = Xt.get(n); - t || Xt.set(n, t = []), t.push(e); + let t = $t.get(n); + t || $t.set(n, t = []), t.push(e); } } -function $t(e, n, i = t) { - let { immediate: a, deep: o, once: s, scheduler: l, augmentJob: u, call: f } = i, p = (e) => o ? e : /* @__PURE__ */ I(e) || o === !1 || o === 0 ? en(e, 1) : en(e), m, g, _, v, y = !1, b = !1; - if (/* @__PURE__ */ z(e) ? (g = () => e.value, y = /* @__PURE__ */ I(e)) : /* @__PURE__ */ It(e) ? (g = () => p(e), y = !0) : d(e) ? (b = !0, y = e.some((e) => /* @__PURE__ */ It(e) || /* @__PURE__ */ I(e)), g = () => e.map((e) => { - if (/* @__PURE__ */ z(e)) return e.value; - if (/* @__PURE__ */ It(e)) return p(e); +function nn(e, n, i = t) { + let { immediate: a, deep: o, once: s, scheduler: l, augmentJob: u, call: f } = i, p = (e) => o ? e : /* @__PURE__ */ P(e) || o === !1 || o === 0 ? rn(e, 1) : rn(e), m, g, _, v, y = !1, b = !1; + if (/* @__PURE__ */ I(e) ? (g = () => e.value, y = /* @__PURE__ */ P(e)) : /* @__PURE__ */ Rt(e) ? (g = () => p(e), y = !0) : d(e) ? (b = !0, y = e.some((e) => /* @__PURE__ */ Rt(e) || /* @__PURE__ */ P(e)), g = () => e.map((e) => { + if (/* @__PURE__ */ I(e)) return e.value; + if (/* @__PURE__ */ Rt(e)) return p(e); if (h(e)) return f ? f(e, 2) : e(); })) : g = h(e) ? n ? f ? () => f(e, 2) : e : () => { if (_) { - Ve(); + He(); try { _(); } finally { - He(); + Ue(); } } - let t = Zt; - Zt = m; + let t = en; + en = m; try { return f ? f(e, 3, [v]) : e(v); } finally { - Zt = t; + en = t; } } : r, n && o) { let e = g, t = o === !0 ? Infinity : o; - g = () => en(e(), t); + g = () => rn(e(), t); } - let x = Te(), S = () => { + let x = Ee(), S = () => { m.stop(), x && x.active && c(x.effects, m); }; if (s && n) { @@ -819,71 +819,71 @@ function $t(e, n, i = t) { e(...t), S(); }; } - let C = b ? Array(e.length).fill(Yt) : Yt, w = (e) => { + let C = b ? Array(e.length).fill(Qt) : Qt, w = (e) => { if (!(!(m.flags & 1) || !m.dirty && !e)) if (n) { let e = m.run(); - if (o || y || (b ? e.some((e, t) => O(e, C[t])) : O(e, C))) { + if (o || y || (b ? e.some((e, t) => D(e, C[t])) : D(e, C))) { _ && _(); - let t = Zt; - Zt = m; + let t = en; + en = m; try { let t = [ e, - C === Yt ? void 0 : b && C[0] === Yt ? [] : C, + C === Qt ? void 0 : b && C[0] === Qt ? [] : C, v ]; C = e, f ? f(n, 3, t) : n(...t); } finally { - Zt = t; + en = t; } } } else m.run(); }; - return u && u(w), m = new De(g), m.scheduler = l ? () => l(w, !1) : w, v = (e) => Qt(e, !1, m), _ = m.onStop = () => { - let e = Xt.get(m); + return u && u(w), m = new Oe(g), m.scheduler = l ? () => l(w, !1) : w, v = (e) => tn(e, !1, m), _ = m.onStop = () => { + let e = $t.get(m); if (e) { if (f) f(e, 4); else for (let t of e) t(); - Xt.delete(m); + $t.delete(m); } }, n ? a ? w(!0) : C = m.run() : l ? l(w.bind(null, !0), !0) : m.run(), S.pause = m.pause.bind(m), S.resume = m.resume.bind(m), S.stop = S, S; } -function en(e, t = Infinity, n) { +function rn(e, t = Infinity, n) { if (t <= 0 || !v(e) || e.__v_skip || (n ||= /* @__PURE__ */ new Map(), (n.get(e) || 0) >= t)) return e; - if (n.set(e, t), t--, /* @__PURE__ */ z(e)) en(e.value, t, n); - else if (d(e)) for (let r = 0; r < e.length; r++) en(e[r], t, n); + if (n.set(e, t), t--, /* @__PURE__ */ I(e)) rn(e.value, t, n); + else if (d(e)) for (let r = 0; r < e.length; r++) rn(e[r], t, n); else if (p(e) || f(e)) e.forEach((e) => { - en(e, t, n); + rn(e, t, n); }); else if (C(e)) { - for (let r in e) en(e[r], t, n); - for (let r of Object.getOwnPropertySymbols(e)) Object.prototype.propertyIsEnumerable.call(e, r) && en(e[r], t, n); + for (let r in e) rn(e[r], t, n); + for (let r of Object.getOwnPropertySymbols(e)) Object.prototype.propertyIsEnumerable.call(e, r) && rn(e[r], t, n); } return e; } //#endregion //#region node_modules/.bun/@vue+runtime-core@3.5.34/node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js -function tn(e, t, n, r) { +function an(e, t, n, r) { try { return r ? e(...r) : e(); } catch (e) { - nn(e, t, n); + sn(e, t, n); } } -function B(e, t, n, r) { +function on(e, t, n, r) { if (h(e)) { - let i = tn(e, t, n, r); + let i = an(e, t, n, r); return i && y(i) && i.catch((e) => { - nn(e, t, n); + sn(e, t, n); }), i; } if (d(e)) { let i = []; - for (let a = 0; a < e.length; a++) i.push(B(e[a], t, n, r)); + for (let a = 0; a < e.length; a++) i.push(on(e[a], t, n, r)); return i; } } -function nn(e, n, r, i = !0) { +function sn(e, n, r, i = !0) { let a = n ? n.vnode : null, { errorHandler: o, throwUnhandledErrorInProduction: s } = n && n.appContext.config || t; if (n) { let t = n.parent, i = n.proxy, a = `https://vuejs.org/error-reference/#runtime-${r}`; @@ -895,111 +895,111 @@ function nn(e, n, r, i = !0) { t = t.parent; } if (o) { - Ve(), tn(o, null, 10, [ + He(), an(o, null, 10, [ e, i, a - ]), He(); + ]), Ue(); return; } } - rn(e, r, a, i, s); + cn(e, r, a, i, s); } -function rn(e, t, n, r = !0, i = !1) { +function cn(e, t, n, r = !0, i = !1) { if (i) throw e; console.error(e); } -var V = [], H = -1, an = [], on = null, sn = 0, cn = /* @__PURE__ */ Promise.resolve(), ln = null; -function un(e) { - let t = ln || cn; +var L = [], ln = -1, un = [], dn = null, fn = 0, pn = /* @__PURE__ */ Promise.resolve(), mn = null; +function hn(e) { + let t = mn || pn; return e ? t.then(this ? e.bind(this) : e) : t; } -function dn(e) { - let t = H + 1, n = V.length; +function gn(e) { + let t = ln + 1, n = L.length; for (; t < n;) { - let r = t + n >>> 1, i = V[r], a = _n(i); + let r = t + n >>> 1, i = L[r], a = Sn(i); a < e || a === e && i.flags & 2 ? t = r + 1 : n = r; } return t; } -function fn(e) { +function _n(e) { if (!(e.flags & 1)) { - let t = _n(e), n = V[V.length - 1]; - !n || !(e.flags & 2) && t >= _n(n) ? V.push(e) : V.splice(dn(t), 0, e), e.flags |= 1, pn(); + let t = Sn(e), n = L[L.length - 1]; + !n || !(e.flags & 2) && t >= Sn(n) ? L.push(e) : L.splice(gn(t), 0, e), e.flags |= 1, vn(); } } -function pn() { - ln ||= cn.then(vn); +function vn() { + mn ||= pn.then(Cn); } -function mn(e) { - d(e) ? an.push(...e) : on && e.id === -1 ? on.splice(sn + 1, 0, e) : e.flags & 1 || (an.push(e), e.flags |= 1), pn(); +function yn(e) { + d(e) ? un.push(...e) : dn && e.id === -1 ? dn.splice(fn + 1, 0, e) : e.flags & 1 || (un.push(e), e.flags |= 1), vn(); } -function hn(e, t, n = H + 1) { - for (; n < V.length; n++) { - let t = V[n]; +function bn(e, t, n = ln + 1) { + for (; n < L.length; n++) { + let t = L[n]; if (t && t.flags & 2) { if (e && t.id !== e.uid) continue; - V.splice(n, 1), n--, t.flags & 4 && (t.flags &= -2), t(), t.flags & 4 || (t.flags &= -2); + L.splice(n, 1), n--, t.flags & 4 && (t.flags &= -2), t(), t.flags & 4 || (t.flags &= -2); } } } -function gn(e) { - if (an.length) { - let e = [...new Set(an)].sort((e, t) => _n(e) - _n(t)); - if (an.length = 0, on) { - on.push(...e); +function xn(e) { + if (un.length) { + let e = [...new Set(un)].sort((e, t) => Sn(e) - Sn(t)); + if (un.length = 0, dn) { + dn.push(...e); return; } - for (on = e, sn = 0; sn < on.length; sn++) { - let e = on[sn]; + for (dn = e, fn = 0; fn < dn.length; fn++) { + let e = dn[fn]; e.flags & 4 && (e.flags &= -2), e.flags & 8 || e(), e.flags &= -2; } - on = null, sn = 0; + dn = null, fn = 0; } } -var _n = (e) => e.id == null ? e.flags & 2 ? -1 : Infinity : e.id; -function vn(e) { +var Sn = (e) => e.id == null ? e.flags & 2 ? -1 : Infinity : e.id; +function Cn(e) { try { - for (H = 0; H < V.length; H++) { - let e = V[H]; - e && !(e.flags & 8) && (e.flags & 4 && (e.flags &= -2), tn(e, e.i, e.i ? 15 : 14), e.flags & 4 || (e.flags &= -2)); + for (ln = 0; ln < L.length; ln++) { + let e = L[ln]; + e && !(e.flags & 8) && (e.flags & 4 && (e.flags &= -2), an(e, e.i, e.i ? 15 : 14), e.flags & 4 || (e.flags &= -2)); } } finally { - for (; H < V.length; H++) { - let e = V[H]; + for (; ln < L.length; ln++) { + let e = L[ln]; e && (e.flags &= -2); } - H = -1, V.length = 0, gn(e), ln = null, (V.length || an.length) && vn(e); + ln = -1, L.length = 0, xn(e), mn = null, (L.length || un.length) && Cn(e); } } -var U = null, yn = null; -function bn(e) { - let t = U; - return U = e, yn = e && e.type.__scopeId || null, t; +var R = null, wn = null; +function Tn(e) { + let t = R; + return R = e, wn = e && e.type.__scopeId || null, t; } -function xn(e, t = U, n) { +function En(e, t = R, n) { if (!t || e._n) return e; let r = (...n) => { - r._d && Ti(-1); - let i = bn(t), a; + r._d && Ai(-1); + let i = Tn(t), a; try { a = e(...n); } finally { - bn(i), r._d && Ti(1); + Tn(i), r._d && Ai(1); } return a; }; return r._n = !0, r._c = !0, r._d = !0, r; } -function Sn(e, n) { - if (U === null) return e; - let r = aa(U), i = e.dirs ||= []; +function Dn(e, n) { + if (R === null) return e; + let r = ua(R), i = e.dirs ||= []; for (let e = 0; e < n.length; e++) { let [a, o, s, c = t] = n[e]; a && (h(a) && (a = { mounted: a, updated: a - }), a.deep && en(o), i.push({ + }), a.deep && rn(o), i.push({ dir: a, instance: r, value: o, @@ -1010,69 +1010,69 @@ function Sn(e, n) { } return e; } -function Cn(e, t, n, r) { +function On(e, t, n, r) { let i = e.dirs, a = t && t.dirs; for (let o = 0; o < i.length; o++) { let s = i[o]; a && (s.oldValue = a[o].value); let c = s.dir[r]; - c && (Ve(), B(c, n, 8, [ + c && (He(), on(c, n, 8, [ e.el, s, e, t - ]), He()); + ]), Ue()); } } -function wn(e, t) { - if ($) { - let n = $.provides, r = $.parent && $.parent.provides; - r === n && (n = $.provides = Object.create(r)), n[e] = t; +function kn(e, t) { + if (J) { + let n = J.provides, r = J.parent && J.parent.provides; + r === n && (n = J.provides = Object.create(r)), n[e] = t; } } -function Tn(e, t, n = !1) { - let r = Wi(); - if (r || Ar) { - let i = Ar ? Ar._context.provides : r ? r.parent == null || r.ce ? r.vnode.appContext && r.vnode.appContext.provides : r.parent.provides : void 0; +function An(e, t, n = !1) { + let r = Yi(); + if (r || Fr) { + let i = Fr ? Fr._context.provides : r ? r.parent == null || r.ce ? r.vnode.appContext && r.vnode.appContext.provides : r.parent.provides : void 0; if (i && e in i) return i[e]; if (arguments.length > 1) return n && h(t) ? t.call(r && r.proxy) : t; } } -var En = /* @__PURE__ */ Symbol.for("v-scx"), Dn = () => Tn(En); -function On(e, t, n) { - return kn(e, t, n); +var jn = /* @__PURE__ */ Symbol.for("v-scx"), Mn = () => An(jn); +function Nn(e, t, n) { + return Pn(e, t, n); } -function kn(e, n, i = t) { +function Pn(e, n, i = t) { let { immediate: a, deep: o, flush: c, once: l } = i, u = s({}, i), d = n && a || !n && c !== "post", f; - if (Xi) { + if (ta) { if (c === "sync") { - let e = Dn(); + let e = Mn(); f = e.__watcherHandles ||= []; } else if (!d) { let e = () => {}; return e.stop = r, e.resume = r, e.pause = r, e; } } - let p = $; - u.call = (e, t, n) => B(e, p, t, n); + let p = J; + u.call = (e, t, n) => on(e, p, t, n); let m = !1; c === "post" ? u.scheduler = (e) => { - G(e, p && p.suspense); + B(e, p && p.suspense); } : c !== "sync" && (m = !0, u.scheduler = (e, t) => { - t ? e() : fn(e); + t ? e() : _n(e); }), u.augmentJob = (e) => { n && (e.flags |= 4), m && (e.flags |= 2, p && (e.id = p.uid, e.i = p)); }; - let h = $t(e, n, u); - return Xi && (f ? f.push(h) : d && h()), h; + let h = nn(e, n, u); + return ta && (f ? f.push(h) : d && h()), h; } -function An(e, t, n) { - let r = this.proxy, i = g(e) ? e.includes(".") ? jn(r, e) : () => r[e] : e.bind(r, r), a; +function Fn(e, t, n) { + let r = this.proxy, i = g(e) ? e.includes(".") ? In(r, e) : () => r[e] : e.bind(r, r), a; h(t) ? a = t : (a = t.handler, n = t); - let o = qi(this), s = kn(i, a.bind(r), n); + let o = Qi(this), s = Pn(i, a.bind(r), n); return o(), s; } -function jn(e, t) { +function In(e, t) { let n = t.split("."); return () => { let t = e; @@ -1080,46 +1080,46 @@ function jn(e, t) { return t; }; } -var Mn = /* @__PURE__ */ Symbol("_vte"), Nn = (e) => e.__isTeleport, Pn = /* @__PURE__ */ Symbol("_leaveCb"); -function Fn(e, t) { - e.shapeFlag & 6 && e.component ? (e.transition = t, Fn(e.component.subTree, t)) : e.shapeFlag & 128 ? (e.ssContent.transition = t.clone(e.ssContent), e.ssFallback.transition = t.clone(e.ssFallback)) : e.transition = t; +var Ln = /* @__PURE__ */ Symbol("_vte"), Rn = (e) => e.__isTeleport, zn = /* @__PURE__ */ Symbol("_leaveCb"); +function Bn(e, t) { + e.shapeFlag & 6 && e.component ? (e.transition = t, Bn(e.component.subTree, t)) : e.shapeFlag & 128 ? (e.ssContent.transition = t.clone(e.ssContent), e.ssFallback.transition = t.clone(e.ssFallback)) : e.transition = t; } /* @__NO_SIDE_EFFECTS__ */ -function In(e, t) { +function Vn(e, t) { return h(e) ? s({ name: e.name }, t, { setup: e }) : e; } -function Ln(e) { +function Hn(e) { e.ids = [ e.ids[0] + e.ids[2]++ + "-", 0, 0 ]; } -function Rn(e, t) { +function Un(e, t) { let n; return !!((n = Object.getOwnPropertyDescriptor(e, t)) && !n.configurable); } -var zn = /* @__PURE__ */ new WeakMap(); -function Bn(e, n, r, a, o = !1) { +var Wn = /* @__PURE__ */ new WeakMap(); +function Gn(e, n, r, a, o = !1) { if (d(e)) { - e.forEach((e, t) => Bn(e, n && (d(n) ? n[t] : n), r, a, o)); + e.forEach((e, t) => Gn(e, n && (d(n) ? n[t] : n), r, a, o)); return; } - if (Hn(a) && !o) { - a.shapeFlag & 512 && a.type.__asyncResolved && a.component.subTree.component && Bn(e, n, r, a.component.subTree); + if (qn(a) && !o) { + a.shapeFlag & 512 && a.type.__asyncResolved && a.component.subTree.component && Gn(e, n, r, a.component.subTree); return; } - let s = a.shapeFlag & 4 ? aa(a.component) : a.el, l = o ? null : s, { i: f, r: p } = e, m = n && n.r, _ = f.refs === t ? f.refs = {} : f.refs, v = f.setupState, y = /* @__PURE__ */ L(v), b = v === t ? i : (e) => Rn(_, e) ? !1 : u(y, e), x = (e, t) => !(t && Rn(_, t)); + let s = a.shapeFlag & 4 ? ua(a.component) : a.el, l = o ? null : s, { i: f, r: p } = e, m = n && n.r, _ = f.refs === t ? f.refs = {} : f.refs, v = f.setupState, y = /* @__PURE__ */ F(v), b = v === t ? i : (e) => Un(_, e) ? !1 : u(y, e), x = (e, t) => !(t && Un(_, t)); if (m != null && m !== p) { - if (Vn(n), g(m)) _[m] = null, b(m) && (v[m] = null); - else if (/* @__PURE__ */ z(m)) { + if (Kn(n), g(m)) _[m] = null, b(m) && (v[m] = null); + else if (/* @__PURE__ */ I(m)) { let e = n; x(m, e.k) && (m.value = null), e.k && (_[e.k] = null); } } - if (h(p)) tn(p, f, 12, [l, _]); + if (h(p)) an(p, f, 12, [l, _]); else { - let t = g(p), n = /* @__PURE__ */ z(p); + let t = g(p), n = /* @__PURE__ */ I(p); if (t || n) { let i = () => { if (e.f) { @@ -1135,26 +1135,26 @@ function Bn(e, n, r, a, o = !1) { }; if (l) { let t = () => { - i(), zn.delete(e); + i(), Wn.delete(e); }; - t.id = -1, zn.set(e, t), G(t, r); - } else Vn(e), i(); + t.id = -1, Wn.set(e, t), B(t, r); + } else Kn(e), i(); } } } -function Vn(e) { - let t = zn.get(e); - t && (t.flags |= 8, zn.delete(e)); +function Kn(e) { + let t = Wn.get(e); + t && (t.flags |= 8, Wn.delete(e)); } -le().requestIdleCallback, le().cancelIdleCallback; -var Hn = (e) => !!e.type.__asyncLoader, Un = (e) => e.type.__isKeepAlive; -function Wn(e, t) { - Kn(e, "a", t); +ue().requestIdleCallback, ue().cancelIdleCallback; +var qn = (e) => !!e.type.__asyncLoader, Jn = (e) => e.type.__isKeepAlive; +function Yn(e, t) { + Zn(e, "a", t); } -function Gn(e, t) { - Kn(e, "da", t); +function Xn(e, t) { + Zn(e, "da", t); } -function Kn(e, t, n = $) { +function Zn(e, t, n = J) { let r = e.__wdc ||= () => { let t = n; for (; t;) { @@ -1163,40 +1163,40 @@ function Kn(e, t, n = $) { } return e(); }; - if (Jn(t, r, n), n) { + if ($n(t, r, n), n) { let e = n.parent; - for (; e && e.parent;) Un(e.parent.vnode) && qn(r, t, n, e), e = e.parent; + for (; e && e.parent;) Jn(e.parent.vnode) && Qn(r, t, n, e), e = e.parent; } } -function qn(e, t, n, r) { - let i = Jn(t, e, r, !0); - tr(() => { +function Qn(e, t, n, r) { + let i = $n(t, e, r, !0); + or(() => { c(r[t], i); }, n); } -function Jn(e, t, n = $, r = !1) { +function $n(e, t, n = J, r = !1) { if (n) { let i = n[e] || (n[e] = []), a = t.__weh ||= (...r) => { - Ve(); - let i = qi(n), a = B(t, n, e, r); - return i(), He(), a; + He(); + let i = Qi(n), a = on(t, n, e, r); + return i(), Ue(), a; }; return r ? i.unshift(a) : i.push(a), a; } } -var Yn = (e) => (t, n = $) => { - (!Xi || e === "sp") && Jn(e, (...e) => t(...e), n); -}, Xn = Yn("bm"), Zn = Yn("m"), Qn = Yn("bu"), $n = Yn("u"), er = Yn("bum"), tr = Yn("um"), nr = Yn("sp"), rr = Yn("rtg"), ir = Yn("rtc"); -function ar(e, t = $) { - Jn("ec", e, t); +var er = (e) => (t, n = J) => { + (!ta || e === "sp") && $n(e, (...e) => t(...e), n); +}, tr = er("bm"), nr = er("m"), rr = er("bu"), ir = er("u"), ar = er("bum"), or = er("um"), sr = er("sp"), cr = er("rtg"), lr = er("rtc"); +function ur(e, t = J) { + $n("ec", e, t); } -var or = /* @__PURE__ */ Symbol.for("v-ndc"); -function sr(e, t, n, r) { +var dr = /* @__PURE__ */ Symbol.for("v-ndc"); +function fr(e, t, n, r) { let i, a = n && n[r], o = d(e); if (o || g(e)) { - let n = o && /* @__PURE__ */ It(e), r = !1, s = !1; - n && (r = !/* @__PURE__ */ I(e), s = /* @__PURE__ */ Lt(e), e = et(e)), i = Array(e.length); - for (let n = 0, o = e.length; n < o; n++) i[n] = t(r ? s ? Bt(R(e[n])) : R(e[n]) : e[n], n, void 0, a && a[n]); + let n = o && /* @__PURE__ */ Rt(e), r = !1, s = !1; + n && (r = !/* @__PURE__ */ P(e), s = /* @__PURE__ */ zt(e), e = tt(e)), i = Array(e.length); + for (let n = 0, o = e.length; n < o; n++) i[n] = t(r ? s ? Ut(Ht(e[n])) : Ht(e[n]) : e[n], n, void 0, a && a[n]); } else if (typeof e == "number") { i = Array(e); for (let n = 0; n < e; n++) i[n] = t(n + 1, n, void 0, a && a[n]); @@ -1212,7 +1212,7 @@ function sr(e, t, n, r) { else i = []; return n && (n[r] = i), i; } -var cr = (e) => e ? Yi(e) ? aa(e) : cr(e.parent) : null, lr = /* @__PURE__ */ s(/* @__PURE__ */ Object.create(null), { +var pr = (e) => e ? ea(e) ? ua(e) : pr(e.parent) : null, mr = /* @__PURE__ */ s(/* @__PURE__ */ Object.create(null), { $: (e) => e, $el: (e) => e.vnode.el, $data: (e) => e.data, @@ -1220,17 +1220,17 @@ var cr = (e) => e ? Yi(e) ? aa(e) : cr(e.parent) : null, lr = /* @__PURE__ */ s( $attrs: (e) => e.attrs, $slots: (e) => e.slots, $refs: (e) => e.refs, - $parent: (e) => cr(e.parent), - $root: (e) => cr(e.root), + $parent: (e) => pr(e.parent), + $root: (e) => pr(e.root), $host: (e) => e.ce, $emit: (e) => e.emit, - $options: (e) => vr(e), + $options: (e) => Cr(e), $forceUpdate: (e) => e.f ||= () => { - fn(e.update); + _n(e.update); }, - $nextTick: (e) => e.n ||= un.bind(e.proxy), - $watch: (e) => An.bind(e) -}), ur = (e, n) => e !== t && !e.__isScriptSetup && u(e, n), dr = { + $nextTick: (e) => e.n ||= hn.bind(e.proxy), + $watch: (e) => Fn.bind(e) +}), hr = (e, n) => e !== t && !e.__isScriptSetup && u(e, n), gr = { get({ _: e }, n) { if (n === "__v_skip") return !0; let { ctx: r, setupState: i, data: a, props: o, accessCache: s, type: c, appContext: l } = e; @@ -1242,48 +1242,48 @@ var cr = (e) => e ? Yi(e) ? aa(e) : cr(e.parent) : null, lr = /* @__PURE__ */ s( case 4: return r[n]; case 3: return o[n]; } - else if (ur(i, n)) return s[n] = 1, i[n]; + else if (hr(i, n)) return s[n] = 1, i[n]; else if (a !== t && u(a, n)) return s[n] = 2, a[n]; else if (u(o, n)) return s[n] = 3, o[n]; else if (r !== t && u(r, n)) return s[n] = 4, r[n]; - else pr && (s[n] = 0); + else vr && (s[n] = 0); } - let d = lr[n], f, p; - if (d) return n === "$attrs" && P(e.attrs, "get", ""), d(e); + let d = mr[n], f, p; + if (d) return n === "$attrs" && N(e.attrs, "get", ""), d(e); if ((f = c.__cssModules) && (f = f[n])) return f; if (r !== t && u(r, n)) return s[n] = 4, r[n]; if (p = l.config.globalProperties, u(p, n)) return p[n]; }, set({ _: e }, n, r) { let { data: i, setupState: a, ctx: o } = e; - return ur(a, n) ? (a[n] = r, !0) : i !== t && u(i, n) ? (i[n] = r, !0) : u(e.props, n) || n[0] === "$" && n.slice(1) in e ? !1 : (o[n] = r, !0); + return hr(a, n) ? (a[n] = r, !0) : i !== t && u(i, n) ? (i[n] = r, !0) : u(e.props, n) || n[0] === "$" && n.slice(1) in e ? !1 : (o[n] = r, !0); }, has({ _: { data: e, setupState: n, accessCache: r, ctx: i, appContext: a, props: o, type: s } }, c) { let l; - return !!(r[c] || e !== t && c[0] !== "$" && u(e, c) || ur(n, c) || u(o, c) || u(i, c) || u(lr, c) || u(a.config.globalProperties, c) || (l = s.__cssModules) && l[c]); + return !!(r[c] || e !== t && c[0] !== "$" && u(e, c) || hr(n, c) || u(o, c) || u(i, c) || u(mr, c) || u(a.config.globalProperties, c) || (l = s.__cssModules) && l[c]); }, defineProperty(e, t, n) { return n.get == null ? u(n, "value") && this.set(e, t, n.value, null) : e._.accessCache[t] = 0, Reflect.defineProperty(e, t, n); } }; -function fr(e) { +function _r(e) { return d(e) ? e.reduce((e, t) => (e[t] = null, e), {}) : e; } -var pr = !0; -function mr(e) { - let t = vr(e), n = e.proxy, i = e.ctx; - pr = !1, t.beforeCreate && gr(t.beforeCreate, e, "bc"); - let { data: a, computed: o, methods: s, watch: c, provide: l, inject: u, created: f, beforeMount: p, mounted: m, beforeUpdate: g, updated: _, activated: y, deactivated: b, beforeDestroy: x, beforeUnmount: S, destroyed: C, unmounted: w, render: T, renderTracked: ee, renderTriggered: te, errorCaptured: E, serverPrefetch: ne, expose: D, inheritAttrs: re, components: ie, directives: O, filters: ae } = t; - if (u && hr(u, i, null), s) for (let e in s) { +var vr = !0; +function yr(e) { + let t = Cr(e), n = e.proxy, i = e.ctx; + vr = !1, t.beforeCreate && xr(t.beforeCreate, e, "bc"); + let { data: a, computed: o, methods: s, watch: c, provide: l, inject: u, created: f, beforeMount: p, mounted: m, beforeUpdate: g, updated: _, activated: y, deactivated: b, beforeDestroy: x, beforeUnmount: S, destroyed: C, unmounted: w, render: ee, renderTracked: te, renderTriggered: ne, errorCaptured: T, serverPrefetch: re, expose: E, inheritAttrs: ie, components: ae, directives: D, filters: oe } = t; + if (u && br(u, i, null), s) for (let e in s) { let t = s[e]; h(t) && (i[e] = t.bind(n)); } if (a) { let t = a.call(n, n); - v(t) && (e.data = /* @__PURE__ */ Mt(t)); + v(t) && (e.data = /* @__PURE__ */ Pt(t)); } - if (pr = !0, o) for (let e in o) { - let t = o[e], a = sa({ + if (vr = !0, o) for (let e in o) { + let t = o[e], a = Y({ get: h(t) ? t.bind(n, n) : h(t.get) ? t.get.bind(n, n) : r, set: !h(t) && h(t.set) ? t.set.bind(n) : r }); @@ -1294,20 +1294,20 @@ function mr(e) { set: (e) => a.value = e }); } - if (c) for (let e in c) _r(c[e], i, n, e); + if (c) for (let e in c) Sr(c[e], i, n, e); if (l) { let e = h(l) ? l.call(n) : l; Reflect.ownKeys(e).forEach((t) => { - wn(t, e[t]); + kn(t, e[t]); }); } - f && gr(f, e, "c"); - function k(e, t) { + f && xr(f, e, "c"); + function O(e, t) { d(t) ? t.forEach((t) => e(t.bind(n))) : t && e(t.bind(n)); } - if (k(Xn, p), k(Zn, m), k(Qn, g), k($n, _), k(Wn, y), k(Gn, b), k(ar, E), k(ir, ee), k(rr, te), k(er, S), k(tr, w), k(nr, ne), d(D)) if (D.length) { + if (O(tr, p), O(nr, m), O(rr, g), O(ir, _), O(Yn, y), O(Xn, b), O(ur, T), O(lr, te), O(cr, ne), O(ar, S), O(or, w), O(sr, re), d(E)) if (E.length) { let t = e.exposed ||= {}; - D.forEach((e) => { + E.forEach((e) => { Object.defineProperty(t, e, { get: () => n[e], set: (t) => n[e] = t, @@ -1315,13 +1315,13 @@ function mr(e) { }); }); } else e.exposed ||= {}; - T && e.render === r && (e.render = T), re != null && (e.inheritAttrs = re), ie && (e.components = ie), O && (e.directives = O), ne && Ln(e); + ee && e.render === r && (e.render = ee), ie != null && (e.inheritAttrs = ie), ae && (e.components = ae), D && (e.directives = D), re && Hn(e); } -function hr(e, t, n = r) { - d(e) && (e = Cr(e)); +function br(e, t, n = r) { + d(e) && (e = Or(e)); for (let n in e) { let r = e[n], i; - i = v(r) ? "default" in r ? Tn(r.from || n, r.default, !0) : Tn(r.from || n) : Tn(r), /* @__PURE__ */ z(i) ? Object.defineProperty(t, n, { + i = v(r) ? "default" in r ? An(r.from || n, r.default, !0) : An(r.from || n) : An(r), /* @__PURE__ */ I(i) ? Object.defineProperty(t, n, { enumerable: !0, configurable: !0, get: () => i.value, @@ -1329,69 +1329,69 @@ function hr(e, t, n = r) { }) : t[n] = i; } } -function gr(e, t, n) { - B(d(e) ? e.map((e) => e.bind(t.proxy)) : e.bind(t.proxy), t, n); +function xr(e, t, n) { + on(d(e) ? e.map((e) => e.bind(t.proxy)) : e.bind(t.proxy), t, n); } -function _r(e, t, n, r) { - let i = r.includes(".") ? jn(n, r) : () => n[r]; +function Sr(e, t, n, r) { + let i = r.includes(".") ? In(n, r) : () => n[r]; if (g(e)) { let n = t[e]; - h(n) && On(i, n); - } else if (h(e)) On(i, e.bind(n)); - else if (v(e)) if (d(e)) e.forEach((e) => _r(e, t, n, r)); + h(n) && Nn(i, n); + } else if (h(e)) Nn(i, e.bind(n)); + else if (v(e)) if (d(e)) e.forEach((e) => Sr(e, t, n, r)); else { let r = h(e.handler) ? e.handler.bind(n) : t[e.handler]; - h(r) && On(i, r, e); + h(r) && Nn(i, r, e); } } -function vr(e) { +function Cr(e) { let t = e.type, { mixins: n, extends: r } = t, { mixins: i, optionsCache: a, config: { optionMergeStrategies: o } } = e.appContext, s = a.get(t), c; - return s ? c = s : !i.length && !n && !r ? c = t : (c = {}, i.length && i.forEach((e) => yr(c, e, o, !0)), yr(c, t, o)), v(t) && a.set(t, c), c; + return s ? c = s : !i.length && !n && !r ? c = t : (c = {}, i.length && i.forEach((e) => wr(c, e, o, !0)), wr(c, t, o)), v(t) && a.set(t, c), c; } -function yr(e, t, n, r = !1) { +function wr(e, t, n, r = !1) { let { mixins: i, extends: a } = t; - a && yr(e, a, n, !0), i && i.forEach((t) => yr(e, t, n, !0)); + a && wr(e, a, n, !0), i && i.forEach((t) => wr(e, t, n, !0)); for (let i in t) if (!(r && i === "expose")) { - let r = br[i] || n && n[i]; + let r = Tr[i] || n && n[i]; e[i] = r ? r(e[i], t[i]) : t[i]; } return e; } -var br = { - data: xr, - props: Tr, - emits: Tr, - methods: wr, - computed: wr, - beforeCreate: W, - created: W, - beforeMount: W, - mounted: W, - beforeUpdate: W, - updated: W, - beforeDestroy: W, - beforeUnmount: W, - destroyed: W, - unmounted: W, - activated: W, - deactivated: W, - errorCaptured: W, - serverPrefetch: W, - components: wr, - directives: wr, - watch: Er, - provide: xr, - inject: Sr +var Tr = { + data: Er, + props: Ar, + emits: Ar, + methods: kr, + computed: kr, + beforeCreate: z, + created: z, + beforeMount: z, + mounted: z, + beforeUpdate: z, + updated: z, + beforeDestroy: z, + beforeUnmount: z, + destroyed: z, + unmounted: z, + activated: z, + deactivated: z, + errorCaptured: z, + serverPrefetch: z, + components: kr, + directives: kr, + watch: jr, + provide: Er, + inject: Dr }; -function xr(e, t) { +function Er(e, t) { return t ? e ? function() { return s(h(e) ? e.call(this, this) : e, h(t) ? t.call(this, this) : t); } : t : e; } -function Sr(e, t) { - return wr(Cr(e), Cr(t)); +function Dr(e, t) { + return kr(Or(e), Or(t)); } -function Cr(e) { +function Or(e) { if (d(e)) { let t = {}; for (let n = 0; n < e.length; n++) t[e[n]] = e[n]; @@ -1399,23 +1399,23 @@ function Cr(e) { } return e; } -function W(e, t) { +function z(e, t) { return e ? [...new Set([].concat(e, t))] : t; } -function wr(e, t) { +function kr(e, t) { return e ? s(/* @__PURE__ */ Object.create(null), e, t) : t; } -function Tr(e, t) { - return e ? d(e) && d(t) ? [.../* @__PURE__ */ new Set([...e, ...t])] : s(/* @__PURE__ */ Object.create(null), fr(e), fr(t ?? {})) : t; +function Ar(e, t) { + return e ? d(e) && d(t) ? [.../* @__PURE__ */ new Set([...e, ...t])] : s(/* @__PURE__ */ Object.create(null), _r(e), _r(t ?? {})) : t; } -function Er(e, t) { +function jr(e, t) { if (!e) return t; if (!t) return e; let n = s(/* @__PURE__ */ Object.create(null), e); - for (let r in t) n[r] = W(e[r], t[r]); + for (let r in t) n[r] = z(e[r], t[r]); return n; } -function Dr() { +function Mr() { return { app: null, config: { @@ -1436,18 +1436,18 @@ function Dr() { emitsCache: /* @__PURE__ */ new WeakMap() }; } -var Or = 0; -function kr(e, t) { +var Nr = 0; +function Pr(e, t) { return function(n, r = null) { h(n) || (n = s({}, n)), r != null && !v(r) && (r = null); - let i = Dr(), a = /* @__PURE__ */ new WeakSet(), o = [], c = !1, l = i.app = { - _uid: Or++, + let i = Mr(), a = /* @__PURE__ */ new WeakSet(), o = [], c = !1, l = i.app = { + _uid: Nr++, _component: n, _props: r, _container: null, _context: i, _instance: null, - version: ca, + version: fa, get config() { return i.config; }, @@ -1466,126 +1466,126 @@ function kr(e, t) { }, mount(a, o, s) { if (!c) { - let u = l._ceVNode || Z(n, r); - return u.appContext = i, s === !0 ? s = "svg" : s === !1 && (s = void 0), o && t ? t(u, a) : e(u, a, s), c = !0, l._container = a, a.__vue_app__ = l, aa(u.component); + let u = l._ceVNode || Li(n, r); + return u.appContext = i, s === !0 ? s = "svg" : s === !1 && (s = void 0), o && t ? t(u, a) : e(u, a, s), c = !0, l._container = a, a.__vue_app__ = l, ua(u.component); } }, onUnmount(e) { o.push(e); }, unmount() { - c && (B(o, l._instance, 16), e(null, l._container), delete l._container.__vue_app__); + c && (on(o, l._instance, 16), e(null, l._container), delete l._container.__vue_app__); }, provide(e, t) { return i.provides[e] = t, l; }, runWithContext(e) { - let t = Ar; - Ar = l; + let t = Fr; + Fr = l; try { return e(); } finally { - Ar = t; + Fr = t; } } }; return l; }; } -var Ar = null, jr = (e, t) => t === "modelValue" || t === "model-value" ? e.modelModifiers : e[`${t}Modifiers`] || e[`${E(t)}Modifiers`] || e[`${D(t)}Modifiers`]; -function Mr(e, n, ...r) { +var Fr = null, Ir = (e, t) => t === "modelValue" || t === "model-value" ? e.modelModifiers : e[`${t}Modifiers`] || e[`${T(t)}Modifiers`] || e[`${E(t)}Modifiers`]; +function Lr(e, n, ...r) { if (e.isUnmounted) return; - let i = e.vnode.props || t, a = r, o = n.startsWith("update:"), s = o && jr(i, n.slice(7)); - s && (s.trim && (a = r.map((e) => g(e) ? e.trim() : e)), s.number && (a = r.map(oe))); - let c, l = i[c = ie(n)] || i[c = ie(E(n))]; - !l && o && (l = i[c = ie(D(n))]), l && B(l, e, 6, a); + let i = e.vnode.props || t, a = r, o = n.startsWith("update:"), s = o && Ir(i, n.slice(7)); + s && (s.trim && (a = r.map((e) => g(e) ? e.trim() : e)), s.number && (a = r.map(se))); + let c, l = i[c = ae(n)] || i[c = ae(T(n))]; + !l && o && (l = i[c = ae(E(n))]), l && on(l, e, 6, a); let u = i[c + "Once"]; if (u) { if (!e.emitted) e.emitted = {}; else if (e.emitted[c]) return; - e.emitted[c] = !0, B(u, e, 6, a); + e.emitted[c] = !0, on(u, e, 6, a); } } -var Nr = /* @__PURE__ */ new WeakMap(); -function Pr(e, t, n = !1) { - let r = n ? Nr : t.emitsCache, i = r.get(e); +var Rr = /* @__PURE__ */ new WeakMap(); +function zr(e, t, n = !1) { + let r = n ? Rr : t.emitsCache, i = r.get(e); if (i !== void 0) return i; let a = e.emits, o = {}, c = !1; if (!h(e)) { let r = (e) => { - let n = Pr(e, t, !0); + let n = zr(e, t, !0); n && (c = !0, s(o, n)); }; !n && t.mixins.length && t.mixins.forEach(r), e.extends && r(e.extends), e.mixins && e.mixins.forEach(r); } return !a && !c ? (v(e) && r.set(e, null), null) : (d(a) ? a.forEach((e) => o[e] = null) : s(o, a), v(e) && r.set(e, o), o); } -function Fr(e, t) { - return !e || !a(t) ? !1 : (t = t.slice(2).replace(/Once$/, ""), u(e, t[0].toLowerCase() + t.slice(1)) || u(e, D(t)) || u(e, t)); +function Br(e, t) { + return !e || !a(t) ? !1 : (t = t.slice(2).replace(/Once$/, ""), u(e, t[0].toLowerCase() + t.slice(1)) || u(e, E(t)) || u(e, t)); } -function Ir(e) { - let { type: t, vnode: n, proxy: r, withProxy: i, propsOptions: [a], slots: s, attrs: c, emit: l, render: u, renderCache: d, props: f, data: p, setupState: m, ctx: h, inheritAttrs: g } = e, _ = bn(e), v, y; +function Vr(e) { + let { type: t, vnode: n, proxy: r, withProxy: i, propsOptions: [a], slots: s, attrs: c, emit: l, render: u, renderCache: d, props: f, data: p, setupState: m, ctx: h, inheritAttrs: g } = e, _ = Tn(e), v, y; try { if (n.shapeFlag & 4) { let e = i || r, t = e; - v = Ii(u.call(t, e, d, f, m, p, h)), y = c; + v = Vi(u.call(t, e, d, f, m, p, h)), y = c; } else { let e = t; - v = Ii(e.length > 1 ? e(f, { + v = Vi(e.length > 1 ? e(f, { attrs: c, slots: s, emit: l - }) : e(f, null)), y = t.props ? c : Lr(c); + }) : e(f, null)), y = t.props ? c : Hr(c); } } catch (t) { - Si.length = 0, nn(t, e, 1), v = Z(bi); + Di.length = 0, sn(t, e, 1), v = Li(Ti); } let b = v; if (y && g !== !1) { let e = Object.keys(y), { shapeFlag: t } = b; - e.length && t & 7 && (a && e.some(o) && (y = Rr(y, a)), b = Pi(b, y, !1, !0)); + e.length && t & 7 && (a && e.some(o) && (y = Ur(y, a)), b = Bi(b, y, !1, !0)); } - return n.dirs && (b = Pi(b, null, !1, !0), b.dirs = b.dirs ? b.dirs.concat(n.dirs) : n.dirs), n.transition && Fn(b, n.transition), v = b, bn(_), v; + return n.dirs && (b = Bi(b, null, !1, !0), b.dirs = b.dirs ? b.dirs.concat(n.dirs) : n.dirs), n.transition && Bn(b, n.transition), v = b, Tn(_), v; } -var Lr = (e) => { +var Hr = (e) => { let t; for (let n in e) (n === "class" || n === "style" || a(n)) && ((t ||= {})[n] = e[n]); return t; -}, Rr = (e, t) => { +}, Ur = (e, t) => { let n = {}; for (let r in e) (!o(r) || !(r.slice(9) in t)) && (n[r] = e[r]); return n; }; -function zr(e, t, n) { +function Wr(e, t, n) { let { props: r, children: i, component: a } = e, { props: o, children: s, patchFlag: c } = t, l = a.emitsOptions; if (t.dirs || t.transition) return !0; if (n && c >= 0) { if (c & 1024) return !0; - if (c & 16) return r ? Br(r, o, l) : !!o; + if (c & 16) return r ? Gr(r, o, l) : !!o; if (c & 8) { let e = t.dynamicProps; for (let t = 0; t < e.length; t++) { let n = e[t]; - if (Vr(o, r, n) && !Fr(l, n)) return !0; + if (Kr(o, r, n) && !Br(l, n)) return !0; } } - } else return (i || s) && (!s || !s.$stable) ? !0 : r === o ? !1 : r ? o ? Br(r, o, l) : !0 : !!o; + } else return (i || s) && (!s || !s.$stable) ? !0 : r === o ? !1 : r ? o ? Gr(r, o, l) : !0 : !!o; return !1; } -function Br(e, t, n) { +function Gr(e, t, n) { let r = Object.keys(t); if (r.length !== Object.keys(e).length) return !0; for (let i = 0; i < r.length; i++) { let a = r[i]; - if (Vr(t, e, a) && !Fr(n, a)) return !0; + if (Kr(t, e, a) && !Br(n, a)) return !0; } return !1; } -function Vr(e, t, n) { +function Kr(e, t, n) { let r = e[n], i = t[n]; - return n === "style" && v(r) && v(i) ? !be(r, i) : r !== i; + return n === "style" && v(r) && v(i) ? !xe(r, i) : r !== i; } -function Hr({ vnode: e, parent: t, suspense: n }, r) { +function qr({ vnode: e, parent: t, suspense: n }, r) { for (; t;) { let n = t.subTree; if (n.suspense && n.suspense.activeBranch === e && (n.suspense.vnode.el = n.el = r, e = n), n === e) (e = t.vnode).el = r, t = t.parent; @@ -1593,55 +1593,55 @@ function Hr({ vnode: e, parent: t, suspense: n }, r) { } n && n.activeBranch === e && (n.vnode.el = r); } -var Ur = {}, Wr = () => Object.create(Ur), Gr = (e) => Object.getPrototypeOf(e) === Ur; -function Kr(e, t, n, r = !1) { - let i = {}, a = Wr(); - e.propsDefaults = /* @__PURE__ */ Object.create(null), Jr(e, t, i, a); +var Jr = {}, Yr = () => Object.create(Jr), Xr = (e) => Object.getPrototypeOf(e) === Jr; +function Zr(e, t, n, r = !1) { + let i = {}, a = Yr(); + e.propsDefaults = /* @__PURE__ */ Object.create(null), $r(e, t, i, a); for (let t in e.propsOptions[0]) t in i || (i[t] = void 0); - n ? e.props = r ? i : /* @__PURE__ */ Nt(i) : e.type.props ? e.props = i : e.props = a, e.attrs = a; + n ? e.props = r ? i : /* @__PURE__ */ Ft(i) : e.type.props ? e.props = i : e.props = a, e.attrs = a; } -function qr(e, t, n, r) { - let { props: i, attrs: a, vnode: { patchFlag: o } } = e, s = /* @__PURE__ */ L(i), [c] = e.propsOptions, l = !1; +function Qr(e, t, n, r) { + let { props: i, attrs: a, vnode: { patchFlag: o } } = e, s = /* @__PURE__ */ F(i), [c] = e.propsOptions, l = !1; if ((r || o > 0) && !(o & 16)) { if (o & 8) { let n = e.vnode.dynamicProps; for (let r = 0; r < n.length; r++) { let o = n[r]; - if (Fr(e.emitsOptions, o)) continue; + if (Br(e.emitsOptions, o)) continue; let d = t[o]; if (c) if (u(a, o)) d !== a[o] && (a[o] = d, l = !0); else { - let t = E(o); - i[t] = Yr(c, s, t, d, e, !1); + let t = T(o); + i[t] = ei(c, s, t, d, e, !1); } else d !== a[o] && (a[o] = d, l = !0); } } } else { - Jr(e, t, i, a) && (l = !0); + $r(e, t, i, a) && (l = !0); let r; - for (let a in s) (!t || !u(t, a) && ((r = D(a)) === a || !u(t, r))) && (c ? n && (n[a] !== void 0 || n[r] !== void 0) && (i[a] = Yr(c, s, a, void 0, e, !0)) : delete i[a]); + for (let a in s) (!t || !u(t, a) && ((r = E(a)) === a || !u(t, r))) && (c ? n && (n[a] !== void 0 || n[r] !== void 0) && (i[a] = ei(c, s, a, void 0, e, !0)) : delete i[a]); if (a !== s) for (let e in a) (!t || !u(t, e)) && (delete a[e], l = !0); } - l && Qe(e.attrs, "set", ""); + l && $e(e.attrs, "set", ""); } -function Jr(e, n, r, i) { +function $r(e, n, r, i) { let [a, o] = e.propsOptions, s = !1, c; if (n) for (let t in n) { - if (T(t)) continue; + if (ee(t)) continue; let l = n[t], d; - a && u(a, d = E(t)) ? !o || !o.includes(d) ? r[d] = l : (c ||= {})[d] = l : Fr(e.emitsOptions, t) || (!(t in i) || l !== i[t]) && (i[t] = l, s = !0); + a && u(a, d = T(t)) ? !o || !o.includes(d) ? r[d] = l : (c ||= {})[d] = l : Br(e.emitsOptions, t) || (!(t in i) || l !== i[t]) && (i[t] = l, s = !0); } if (o) { - let n = /* @__PURE__ */ L(r), i = c || t; + let n = /* @__PURE__ */ F(r), i = c || t; for (let t = 0; t < o.length; t++) { let s = o[t]; - r[s] = Yr(a, n, s, i[s], e, !u(i, s)); + r[s] = ei(a, n, s, i[s], e, !u(i, s)); } } return s; } -function Yr(e, t, n, r, i, a) { +function ei(e, t, n, r, i, a) { let o = e[n]; if (o != null) { let e = u(o, "default"); @@ -1651,37 +1651,37 @@ function Yr(e, t, n, r, i, a) { let { propsDefaults: a } = i; if (n in a) r = a[n]; else { - let o = qi(i); + let o = Qi(i); r = a[n] = e.call(null, t), o(); } } else r = e; i.ce && i.ce._setProp(n, r); } - o[0] && (a && !e ? r = !1 : o[1] && (r === "" || r === D(n)) && (r = !0)); + o[0] && (a && !e ? r = !1 : o[1] && (r === "" || r === E(n)) && (r = !0)); } return r; } -var Xr = /* @__PURE__ */ new WeakMap(); -function Zr(e, r, i = !1) { - let a = i ? Xr : r.propsCache, o = a.get(e); +var ti = /* @__PURE__ */ new WeakMap(); +function ni(e, r, i = !1) { + let a = i ? ti : r.propsCache, o = a.get(e); if (o) return o; let c = e.props, l = {}, f = [], p = !1; if (!h(e)) { let t = (e) => { p = !0; - let [t, n] = Zr(e, r, !0); + let [t, n] = ni(e, r, !0); s(l, t), n && f.push(...n); }; !i && r.mixins.length && r.mixins.forEach(t), e.extends && t(e.extends), e.mixins && e.mixins.forEach(t); } if (!c && !p) return v(e) && a.set(e, n), n; if (d(c)) for (let e = 0; e < c.length; e++) { - let n = E(c[e]); - Qr(n) && (l[n] = t); + let n = T(c[e]); + ri(n) && (l[n] = t); } else if (c) for (let e in c) { - let t = E(e); - if (Qr(t)) { + let t = T(e); + if (ri(t)) { let n = c[e], r = l[t] = d(n) || h(n) ? { type: n } : s({}, n), i = r.type, a = !1, o = !0; if (d(i)) for (let e = 0; e < i.length; ++e) { let t = i[e], n = h(t) && t.name; @@ -1697,69 +1697,69 @@ function Zr(e, r, i = !1) { let m = [l, f]; return v(e) && a.set(e, m), m; } -function Qr(e) { - return e[0] !== "$" && !T(e); +function ri(e) { + return e[0] !== "$" && !ee(e); } -var $r = (e) => e === "_" || e === "_ctx" || e === "$stable", ei = (e) => d(e) ? e.map(Ii) : [Ii(e)], ti = (e, t, n) => { +var ii = (e) => e === "_" || e === "_ctx" || e === "$stable", ai = (e) => d(e) ? e.map(Vi) : [Vi(e)], oi = (e, t, n) => { if (t._n) return t; - let r = xn((...e) => ei(t(...e)), n); + let r = En((...e) => ai(t(...e)), n); return r._c = !1, r; -}, ni = (e, t, n) => { +}, si = (e, t, n) => { let r = e._ctx; for (let n in e) { - if ($r(n)) continue; + if (ii(n)) continue; let i = e[n]; - if (h(i)) t[n] = ti(n, i, r); + if (h(i)) t[n] = oi(n, i, r); else if (i != null) { - let e = ei(i); + let e = ai(i); t[n] = () => e; } } -}, ri = (e, t) => { - let n = ei(t); +}, ci = (e, t) => { + let n = ai(t); e.slots.default = () => n; -}, ii = (e, t, n) => { - for (let r in t) (n || !$r(r)) && (e[r] = t[r]); -}, ai = (e, t, n) => { - let r = e.slots = Wr(); +}, li = (e, t, n) => { + for (let r in t) (n || !ii(r)) && (e[r] = t[r]); +}, ui = (e, t, n) => { + let r = e.slots = Yr(); if (e.vnode.shapeFlag & 32) { let e = t._; - e ? (ii(r, t, n), n && k(r, "_", e, !0)) : ni(t, r); - } else t && ri(e, t); -}, oi = (e, n, r) => { + e ? (li(r, t, n), n && O(r, "_", e, !0)) : si(t, r); + } else t && ci(e, t); +}, di = (e, n, r) => { let { vnode: i, slots: a } = e, o = !0, s = t; if (i.shapeFlag & 32) { let e = n._; - e ? r && e === 1 ? o = !1 : ii(a, n, r) : (o = !n.$stable, ni(n, a)), s = n; - } else n && (ri(e, n), s = { default: 1 }); - if (o) for (let e in a) !$r(e) && s[e] == null && delete a[e]; -}, G = vi; -function si(e) { - return ci(e); -} -function ci(e, i) { - let a = le(); + e ? r && e === 1 ? o = !1 : li(a, n, r) : (o = !n.$stable, si(n, a)), s = n; + } else n && (ci(e, n), s = { default: 1 }); + if (o) for (let e in a) !ii(e) && s[e] == null && delete a[e]; +}, B = Ci; +function fi(e) { + return pi(e); +} +function pi(e, i) { + let a = ue(); a.__VUE__ = !0; let { insert: o, remove: s, patchProp: c, createElement: l, createText: u, createComment: d, setText: f, setElementText: p, parentNode: m, nextSibling: h, setScopeId: g = r, insertStaticContent: _ } = e, v = (e, t, n, r = null, i = null, a = null, o = void 0, s = null, c = !!t.dynamicChildren) => { if (e === t) return; - e && !ki(e, t) && (r = ye(e), me(e, i, a, !0), e = null), t.patchFlag === -2 && (c = !1, t.dynamicChildren = null); + e && !Pi(e, t) && (r = be(e), he(e, i, a, !0), e = null), t.patchFlag === -2 && (c = !1, t.dynamicChildren = null); let { type: l, ref: u, shapeFlag: d } = t; switch (l) { - case yi: + case wi: y(e, t, n, r); break; - case bi: + case Ti: b(e, t, n, r); break; - case xi: + case Ei: e ?? x(t, n, r, o); break; - case K: - ie(e, t, n, r, i, a, o, s, c); + case V: + ae(e, t, n, r, i, a, o, s, c); break; - default: d & 1 ? w(e, t, n, r, i, a, o, s, c) : d & 6 ? O(e, t, n, r, i, a, o, s, c) : (d & 64 || d & 128) && l.process(e, t, n, r, i, a, o, s, c, A); + default: d & 1 ? w(e, t, n, r, i, a, o, s, c) : d & 6 ? D(e, t, n, r, i, a, o, s, c) : (d & 64 || d & 128) && l.process(e, t, n, r, i, a, o, s, c, k); } - u != null && i ? Bn(u, e && e.ref, a, t || e, !t) : u == null && e && e.ref != null && Bn(e.ref, null, a, e, !0); + u != null && i ? Gn(u, e && e.ref, a, t || e, !t) : u == null && e && e.ref != null && Gn(e.ref, null, a, e, !0); }, y = (e, t, n, r) => { if (e == null) o(t.el = u(t.children), n, r); else { @@ -1779,45 +1779,45 @@ function ci(e, i) { for (; e && e !== t;) n = h(e), s(e), e = n; s(t); }, w = (e, t, n, r, i, a, o, s, c) => { - if (t.type === "svg" ? o = "svg" : t.type === "math" && (o = "mathml"), e == null) ee(t, n, r, i, a, o, s, c); + if (t.type === "svg" ? o = "svg" : t.type === "math" && (o = "mathml"), e == null) te(t, n, r, i, a, o, s, c); else { let n = e.el && e.el._isVueCE ? e.el : null; try { - n && n._beginPatch(), ne(e, t, i, a, o, s, c); + n && n._beginPatch(), re(e, t, i, a, o, s, c); } finally { n && n._endPatch(); } } - }, ee = (e, t, n, r, i, a, s, u) => { + }, te = (e, t, n, r, i, a, s, u) => { let d, f, { props: m, shapeFlag: h, transition: g, dirs: _ } = e; - if (d = e.el = l(e.type, a, m && m.is, m), h & 8 ? p(d, e.children) : h & 16 && E(e.children, d, null, r, i, li(e, a), s, u), _ && Cn(e, null, r, "created"), te(d, e, e.scopeId, s, r), m) { - for (let e in m) e !== "value" && !T(e) && c(d, e, null, m[e], a, r); - "value" in m && c(d, "value", null, m.value, a), (f = m.onVnodeBeforeMount) && Bi(f, r, e); + if (d = e.el = l(e.type, a, m && m.is, m), h & 8 ? p(d, e.children) : h & 16 && T(e.children, d, null, r, i, mi(e, a), s, u), _ && On(e, null, r, "created"), ne(d, e, e.scopeId, s, r), m) { + for (let e in m) e !== "value" && !ee(e) && c(d, e, null, m[e], a, r); + "value" in m && c(d, "value", null, m.value, a), (f = m.onVnodeBeforeMount) && Gi(f, r, e); } - _ && Cn(e, null, r, "beforeMount"); - let v = di(i, g); - v && g.beforeEnter(d), o(d, t, n), ((f = m && m.onVnodeMounted) || v || _) && G(() => { + _ && On(e, null, r, "beforeMount"); + let v = gi(i, g); + v && g.beforeEnter(d), o(d, t, n), ((f = m && m.onVnodeMounted) || v || _) && B(() => { try { - f && Bi(f, r, e), v && g.enter(d), _ && Cn(e, null, r, "mounted"); + f && Gi(f, r, e), v && g.enter(d), _ && On(e, null, r, "mounted"); } finally {} }, i); - }, te = (e, t, n, r, i) => { + }, ne = (e, t, n, r, i) => { if (n && g(e, n), r) for (let t = 0; t < r.length; t++) g(e, r[t]); if (i) { let n = i.subTree; - if (t === n || _i(n.type) && (n.ssContent === t || n.ssFallback === t)) { + if (t === n || Si(n.type) && (n.ssContent === t || n.ssFallback === t)) { let t = i.vnode; - te(e, t, t.scopeId, t.slotScopeIds, i.parent); + ne(e, t, t.scopeId, t.slotScopeIds, i.parent); } } - }, E = (e, t, n, r, i, a, o, s, c = 0) => { - for (let l = c; l < e.length; l++) v(null, e[l] = s ? Li(e[l]) : Ii(e[l]), t, n, r, i, a, o, s); - }, ne = (e, n, r, i, a, o, s) => { + }, T = (e, t, n, r, i, a, o, s, c = 0) => { + for (let l = c; l < e.length; l++) v(null, e[l] = s ? Hi(e[l]) : Vi(e[l]), t, n, r, i, a, o, s); + }, re = (e, n, r, i, a, o, s) => { let l = n.el = e.el, { patchFlag: u, dynamicChildren: d, dirs: f } = n; u |= e.patchFlag & 16; let m = e.props || t, h = n.props || t, g; - if (r && ui(r, !1), (g = h.onVnodeBeforeUpdate) && Bi(g, r, n, e), f && Cn(n, e, r, "beforeUpdate"), r && ui(r, !0), (m.innerHTML && h.innerHTML == null || m.textContent && h.textContent == null) && p(l, ""), d ? D(e.dynamicChildren, d, l, r, i, li(n, a), o) : s || ue(e, n, l, null, r, i, li(n, a), o, !1), u > 0) { - if (u & 16) re(l, m, h, r, a); + if (r && hi(r, !1), (g = h.onVnodeBeforeUpdate) && Gi(g, r, n, e), f && On(n, e, r, "beforeUpdate"), r && hi(r, !0), (m.innerHTML && h.innerHTML == null || m.textContent && h.textContent == null) && p(l, ""), d ? E(e.dynamicChildren, d, l, r, i, mi(n, a), o) : s || de(e, n, l, null, r, i, mi(n, a), o, !1), u > 0) { + if (u & 16) ie(l, m, h, r, a); else if (u & 2 && m.class !== h.class && c(l, "class", null, h.class, a), u & 4 && c(l, "style", m.style, h.style, a), u & 8) { let e = n.dynamicProps; for (let t = 0; t < e.length; t++) { @@ -1826,54 +1826,54 @@ function ci(e, i) { } } u & 1 && e.children !== n.children && p(l, n.children); - } else !s && d == null && re(l, m, h, r, a); - ((g = h.onVnodeUpdated) || f) && G(() => { - g && Bi(g, r, n, e), f && Cn(n, e, r, "updated"); + } else !s && d == null && ie(l, m, h, r, a); + ((g = h.onVnodeUpdated) || f) && B(() => { + g && Gi(g, r, n, e), f && On(n, e, r, "updated"); }, i); - }, D = (e, t, n, r, i, a, o) => { + }, E = (e, t, n, r, i, a, o) => { for (let s = 0; s < t.length; s++) { let c = e[s], l = t[s]; - v(c, l, c.el && (c.type === K || !ki(c, l) || c.shapeFlag & 198) ? m(c.el) : n, null, r, i, a, o, !0); + v(c, l, c.el && (c.type === V || !Pi(c, l) || c.shapeFlag & 198) ? m(c.el) : n, null, r, i, a, o, !0); } - }, re = (e, n, r, i, a) => { + }, ie = (e, n, r, i, a) => { if (n !== r) { - if (n !== t) for (let t in n) !T(t) && !(t in r) && c(e, t, n[t], null, a, i); + if (n !== t) for (let t in n) !ee(t) && !(t in r) && c(e, t, n[t], null, a, i); for (let t in r) { - if (T(t)) continue; + if (ee(t)) continue; let o = r[t], s = n[t]; o !== s && t !== "value" && c(e, t, s, o, a, i); } "value" in r && c(e, "value", n.value, r.value, a); } - }, ie = (e, t, n, r, i, a, s, c, l) => { + }, ae = (e, t, n, r, i, a, s, c, l) => { let d = t.el = e ? e.el : u(""), f = t.anchor = e ? e.anchor : u(""), { patchFlag: p, dynamicChildren: m, slotScopeIds: h } = t; - h && (c = c ? c.concat(h) : h), e == null ? (o(d, n, r), o(f, n, r), E(t.children || [], n, f, i, a, s, c, l)) : p > 0 && p & 64 && m && e.dynamicChildren && e.dynamicChildren.length === m.length ? (D(e.dynamicChildren, m, n, i, a, s, c), (t.key != null || i && t === i.subTree) && fi(e, t, !0)) : ue(e, t, n, f, i, a, s, c, l); - }, O = (e, t, n, r, i, a, o, s, c) => { - t.slotScopeIds = s, e == null ? t.shapeFlag & 512 ? i.ctx.activate(t, n, r, o, c) : k(t, n, r, i, a, o, c) : oe(e, t, c); - }, k = (e, t, n, r, i, a, o) => { - let s = e.component = Ui(e, r, i); - if (Un(e) && (s.ctx.renderer = A), Zi(s, !1, o), s.asyncDep) { - if (i && i.registerDep(s, se, o), !e.el) { - let r = s.subTree = Z(bi); + h && (c = c ? c.concat(h) : h), e == null ? (o(d, n, r), o(f, n, r), T(t.children || [], n, f, i, a, s, c, l)) : p > 0 && p & 64 && m && e.dynamicChildren && e.dynamicChildren.length === m.length ? (E(e.dynamicChildren, m, n, i, a, s, c), (t.key != null || i && t === i.subTree) && _i(e, t, !0)) : de(e, t, n, f, i, a, s, c, l); + }, D = (e, t, n, r, i, a, o, s, c) => { + t.slotScopeIds = s, e == null ? t.shapeFlag & 512 ? i.ctx.activate(t, n, r, o, c) : O(t, n, r, i, a, o, c) : se(e, t, c); + }, O = (e, t, n, r, i, a, o) => { + let s = e.component = Ji(e, r, i); + if (Jn(e) && (s.ctx.renderer = k), na(s, !1, o), s.asyncDep) { + if (i && i.registerDep(s, ce, o), !e.el) { + let r = s.subTree = Li(Ti); b(null, r, t, n), e.placeholder = r.el; } - } else se(s, e, t, n, i, a, o); - }, oe = (e, t, n) => { + } else ce(s, e, t, n, i, a, o); + }, se = (e, t, n) => { let r = t.component = e.component; - if (zr(e, t, n)) if (r.asyncDep && !r.asyncResolved) { - ce(r, t, n); + if (Wr(e, t, n)) if (r.asyncDep && !r.asyncResolved) { + le(r, t, n); return; } else r.next = t, r.update(); else t.el = e.el, r.vnode = t; - }, se = (e, t, n, r, i, a, o) => { + }, ce = (e, t, n, r, i, a, o) => { let s = () => { if (e.isMounted) { let { next: t, bu: n, u: r, parent: s, vnode: c } = e; { - let n = mi(e); + let n = yi(e); if (n) { - t && (t.el = c.el, ce(e, t, o)), n.asyncDep.then(() => { - G(() => { + t && (t.el = c.el, le(e, t, o)), n.asyncDep.then(() => { + B(() => { e.isUnmounted || l(); }, i); }); @@ -1881,81 +1881,81 @@ function ci(e, i) { } } let u = t, d; - ui(e, !1), t ? (t.el = c.el, ce(e, t, o)) : t = c, n && ae(n), (d = t.props && t.props.onVnodeBeforeUpdate) && Bi(d, s, t, c), ui(e, !0); - let f = Ir(e), p = e.subTree; - e.subTree = f, v(p, f, m(p.el), ye(p), e, i, a), t.el = f.el, u === null && Hr(e, f.el), r && G(r, i), (d = t.props && t.props.onVnodeUpdated) && G(() => Bi(d, s, t, c), i); + hi(e, !1), t ? (t.el = c.el, le(e, t, o)) : t = c, n && oe(n), (d = t.props && t.props.onVnodeBeforeUpdate) && Gi(d, s, t, c), hi(e, !0); + let f = Vr(e), p = e.subTree; + e.subTree = f, v(p, f, m(p.el), be(p), e, i, a), t.el = f.el, u === null && qr(e, f.el), r && B(r, i), (d = t.props && t.props.onVnodeUpdated) && B(() => Gi(d, s, t, c), i); } else { - let o, { el: s, props: c } = t, { bm: l, m: u, parent: d, root: f, type: p } = e, m = Hn(t); - if (ui(e, !1), l && ae(l), !m && (o = c && c.onVnodeBeforeMount) && Bi(o, d, t), ui(e, !0), s && Ce) { + let o, { el: s, props: c } = t, { bm: l, m: u, parent: d, root: f, type: p } = e, m = qn(t); + if (hi(e, !1), l && oe(l), !m && (o = c && c.onVnodeBeforeMount) && Gi(o, d, t), hi(e, !0), s && we) { let t = () => { - e.subTree = Ir(e), Ce(s, e.subTree, e, i, null); + e.subTree = Vr(e), we(s, e.subTree, e, i, null); }; m && p.__asyncHydrate ? p.__asyncHydrate(s, e, t) : t(); } else { f.ce && f.ce._hasShadowRoot() && f.ce._injectChildStyle(p, e.parent ? e.parent.type : void 0); - let o = e.subTree = Ir(e); + let o = e.subTree = Vr(e); v(null, o, n, r, e, i, a), t.el = o.el; } - if (u && G(u, i), !m && (o = c && c.onVnodeMounted)) { + if (u && B(u, i), !m && (o = c && c.onVnodeMounted)) { let e = t; - G(() => Bi(o, d, e), i); + B(() => Gi(o, d, e), i); } - (t.shapeFlag & 256 || d && Hn(d.vnode) && d.vnode.shapeFlag & 256) && e.a && G(e.a, i), e.isMounted = !0, t = n = r = null; + (t.shapeFlag & 256 || d && qn(d.vnode) && d.vnode.shapeFlag & 256) && e.a && B(e.a, i), e.isMounted = !0, t = n = r = null; } }; e.scope.on(); - let c = e.effect = new De(s); + let c = e.effect = new Oe(s); e.scope.off(); let l = e.update = c.run.bind(c), u = e.job = c.runIfDirty.bind(c); - u.i = e, u.id = e.uid, c.scheduler = () => fn(u), ui(e, !0), l(); - }, ce = (e, t, n) => { + u.i = e, u.id = e.uid, c.scheduler = () => _n(u), hi(e, !0), l(); + }, le = (e, t, n) => { t.component = e; let r = e.vnode.props; - e.vnode = t, e.next = null, qr(e, t.props, r, n), oi(e, t.children, n), Ve(), hn(e), He(); - }, ue = (e, t, n, r, i, a, o, s, c = !1) => { + e.vnode = t, e.next = null, Qr(e, t.props, r, n), di(e, t.children, n), He(), bn(e), Ue(); + }, de = (e, t, n, r, i, a, o, s, c = !1) => { let l = e && e.children, u = e ? e.shapeFlag : 0, d = t.children, { patchFlag: f, shapeFlag: m } = t; if (f > 0) { if (f & 128) { - fe(l, d, n, r, i, a, o, s, c); + pe(l, d, n, r, i, a, o, s, c); return; } else if (f & 256) { - de(l, d, n, r, i, a, o, s, c); + fe(l, d, n, r, i, a, o, s, c); return; } } - m & 8 ? (u & 16 && ve(l, i, a), d !== l && p(n, d)) : u & 16 ? m & 16 ? fe(l, d, n, r, i, a, o, s, c) : ve(l, i, a, !0) : (u & 8 && p(n, ""), m & 16 && E(d, n, r, i, a, o, s, c)); - }, de = (e, t, r, i, a, o, s, c, l) => { + m & 8 ? (u & 16 && ye(l, i, a), d !== l && p(n, d)) : u & 16 ? m & 16 ? pe(l, d, n, r, i, a, o, s, c) : ye(l, i, a, !0) : (u & 8 && p(n, ""), m & 16 && T(d, n, r, i, a, o, s, c)); + }, fe = (e, t, r, i, a, o, s, c, l) => { e ||= n, t ||= n; let u = e.length, d = t.length, f = Math.min(u, d), p; for (p = 0; p < f; p++) { - let n = t[p] = l ? Li(t[p]) : Ii(t[p]); + let n = t[p] = l ? Hi(t[p]) : Vi(t[p]); v(e[p], n, r, null, a, o, s, c, l); } - u > d ? ve(e, a, o, !0, !1, f) : E(t, r, i, a, o, s, c, l, f); - }, fe = (e, t, r, i, a, o, s, c, l) => { + u > d ? ye(e, a, o, !0, !1, f) : T(t, r, i, a, o, s, c, l, f); + }, pe = (e, t, r, i, a, o, s, c, l) => { let u = 0, d = t.length, f = e.length - 1, p = d - 1; for (; u <= f && u <= p;) { - let n = e[u], i = t[u] = l ? Li(t[u]) : Ii(t[u]); - if (ki(n, i)) v(n, i, r, null, a, o, s, c, l); + let n = e[u], i = t[u] = l ? Hi(t[u]) : Vi(t[u]); + if (Pi(n, i)) v(n, i, r, null, a, o, s, c, l); else break; u++; } for (; u <= f && u <= p;) { - let n = e[f], i = t[p] = l ? Li(t[p]) : Ii(t[p]); - if (ki(n, i)) v(n, i, r, null, a, o, s, c, l); + let n = e[f], i = t[p] = l ? Hi(t[p]) : Vi(t[p]); + if (Pi(n, i)) v(n, i, r, null, a, o, s, c, l); else break; f--, p--; } if (u > f) { if (u <= p) { let e = p + 1, n = e < d ? t[e].el : i; - for (; u <= p;) v(null, t[u] = l ? Li(t[u]) : Ii(t[u]), r, n, a, o, s, c, l), u++; + for (; u <= p;) v(null, t[u] = l ? Hi(t[u]) : Vi(t[u]), r, n, a, o, s, c, l), u++; } - } else if (u > p) for (; u <= f;) me(e[u], a, o, !0), u++; + } else if (u > p) for (; u <= f;) he(e[u], a, o, !0), u++; else { let m = u, h = u, g = /* @__PURE__ */ new Map(); for (u = h; u <= p; u++) { - let e = t[u] = l ? Li(t[u]) : Ii(t[u]); + let e = t[u] = l ? Hi(t[u]) : Vi(t[u]); e.key != null && g.set(e.key, u); } let _, y = 0, b = p - h + 1, x = !1, S = 0, C = Array(b); @@ -1963,27 +1963,27 @@ function ci(e, i) { for (u = m; u <= f; u++) { let n = e[u]; if (y >= b) { - me(n, a, o, !0); + he(n, a, o, !0); continue; } let i; if (n.key != null) i = g.get(n.key); - else for (_ = h; _ <= p; _++) if (C[_ - h] === 0 && ki(n, t[_])) { + else for (_ = h; _ <= p; _++) if (C[_ - h] === 0 && Pi(n, t[_])) { i = _; break; } - i === void 0 ? me(n, a, o, !0) : (C[i - h] = u + 1, i >= S ? S = i : x = !0, v(n, t[i], r, null, a, o, s, c, l), y++); + i === void 0 ? he(n, a, o, !0) : (C[i - h] = u + 1, i >= S ? S = i : x = !0, v(n, t[i], r, null, a, o, s, c, l), y++); } - let w = x ? pi(C) : n; + let w = x ? vi(C) : n; for (_ = w.length - 1, u = b - 1; u >= 0; u--) { - let e = h + u, n = t[e], f = t[e + 1], p = e + 1 < d ? f.el || gi(f) : i; - C[u] === 0 ? v(null, n, r, p, a, o, s, c, l) : x && (_ < 0 || u !== w[_] ? pe(n, r, p, 2) : _--); + let e = h + u, n = t[e], f = t[e + 1], p = e + 1 < d ? f.el || xi(f) : i; + C[u] === 0 ? v(null, n, r, p, a, o, s, c, l) : x && (_ < 0 || u !== w[_] ? me(n, r, p, 2) : _--); } } - }, pe = (e, t, n, r, i = null) => { + }, me = (e, t, n, r, i = null) => { let { el: a, type: c, transition: l, children: u, shapeFlag: d } = e; if (d & 6) { - pe(e.component.subTree, t, n, r); + me(e.component.subTree, t, n, r); return; } if (d & 128) { @@ -1991,57 +1991,57 @@ function ci(e, i) { return; } if (d & 64) { - c.move(e, t, n, A); + c.move(e, t, n, k); return; } - if (c === K) { + if (c === V) { o(a, t, n); - for (let e = 0; e < u.length; e++) pe(u[e], t, n, r); + for (let e = 0; e < u.length; e++) me(u[e], t, n, r); o(e.anchor, t, n); return; } - if (c === xi) { + if (c === Ei) { S(e, t, n); return; } - if (r !== 2 && d & 1 && l) if (r === 0) l.beforeEnter(a), o(a, t, n), G(() => l.enter(a), i); + if (r !== 2 && d & 1 && l) if (r === 0) l.beforeEnter(a), o(a, t, n), B(() => l.enter(a), i); else { let { leave: r, delayLeave: i, afterLeave: c } = l, u = () => { e.ctx.isUnmounted ? s(a) : o(a, t, n); }, d = () => { - a._isLeaving && a[Pn](!0), r(a, () => { + a._isLeaving && a[zn](!0), r(a, () => { u(), c && c(); }); }; i ? i(a, u, d) : d(); } else o(a, t, n); - }, me = (e, t, n, r = !1, i = !1) => { + }, he = (e, t, n, r = !1, i = !1) => { let { type: a, props: o, ref: s, children: c, dynamicChildren: l, shapeFlag: u, patchFlag: d, dirs: f, cacheIndex: p, memo: m } = e; - if (d === -2 && (i = !1), s != null && (Ve(), Bn(s, null, n, e, !0), He()), p != null && (t.renderCache[p] = void 0), u & 256) { + if (d === -2 && (i = !1), s != null && (He(), Gn(s, null, n, e, !0), Ue()), p != null && (t.renderCache[p] = void 0), u & 256) { t.ctx.deactivate(e); return; } - let h = u & 1 && f, g = !Hn(e), _; - if (g && (_ = o && o.onVnodeBeforeUnmount) && Bi(_, t, e), u & 6) _e(e.component, n, r); + let h = u & 1 && f, g = !qn(e), _; + if (g && (_ = o && o.onVnodeBeforeUnmount) && Gi(_, t, e), u & 6) ve(e.component, n, r); else { if (u & 128) { e.suspense.unmount(n, r); return; } - h && Cn(e, null, t, "beforeUnmount"), u & 64 ? e.type.remove(e, t, n, A, r) : l && !l.hasOnce && (a !== K || d > 0 && d & 64) ? ve(l, t, n, !1, !0) : (a === K && d & 384 || !i && u & 16) && ve(c, t, n), r && he(e); + h && On(e, null, t, "beforeUnmount"), u & 64 ? e.type.remove(e, t, n, k, r) : l && !l.hasOnce && (a !== V || d > 0 && d & 64) ? ye(l, t, n, !1, !0) : (a === V && d & 384 || !i && u & 16) && ye(c, t, n), r && ge(e); } let v = m != null && p == null; - (g && (_ = o && o.onVnodeUnmounted) || h || v) && G(() => { - _ && Bi(_, t, e), h && Cn(e, null, t, "unmounted"), v && (e.el = null); + (g && (_ = o && o.onVnodeUnmounted) || h || v) && B(() => { + _ && Gi(_, t, e), h && On(e, null, t, "unmounted"), v && (e.el = null); }, n); - }, he = (e) => { + }, ge = (e) => { let { type: t, el: n, anchor: r, transition: i } = e; - if (t === K) { - ge(n, r); + if (t === V) { + _e(n, r); return; } - if (t === xi) { + if (t === Ei) { C(e); return; } @@ -2052,60 +2052,60 @@ function ci(e, i) { let { leave: t, delayLeave: r } = i, o = () => t(n, a); r ? r(e.el, a, o) : o(); } else a(); - }, ge = (e, t) => { + }, _e = (e, t) => { let n; for (; e !== t;) n = h(e), s(e), e = n; s(t); - }, _e = (e, t, n) => { + }, ve = (e, t, n) => { let { bum: r, scope: i, job: a, subTree: o, um: s, m: c, a: l } = e; - hi(c), hi(l), r && ae(r), i.stop(), a && (a.flags |= 8, me(o, e, t, n)), s && G(s, t), G(() => { + bi(c), bi(l), r && oe(r), i.stop(), a && (a.flags |= 8, he(o, e, t, n)), s && B(s, t), B(() => { e.isUnmounted = !0; }, t); - }, ve = (e, t, n, r = !1, i = !1, a = 0) => { - for (let o = a; o < e.length; o++) me(e[o], t, n, r, i); - }, ye = (e) => { - if (e.shapeFlag & 6) return ye(e.component.subTree); + }, ye = (e, t, n, r = !1, i = !1, a = 0) => { + for (let o = a; o < e.length; o++) he(e[o], t, n, r, i); + }, be = (e) => { + if (e.shapeFlag & 6) return be(e.component.subTree); if (e.shapeFlag & 128) return e.suspense.next(); - let t = h(e.anchor || e.el), n = t && t[Mn]; + let t = h(e.anchor || e.el), n = t && t[Ln]; return n ? h(n) : t; - }, be = !1, xe = (e, t, n) => { + }, xe = !1, Se = (e, t, n) => { let r; - e == null ? t._vnode && (me(t._vnode, null, null, !0), r = t._vnode.component) : v(t._vnode || null, e, t, null, null, null, n), t._vnode = e, be ||= (be = !0, hn(r), gn(), !1); - }, A = { + e == null ? t._vnode && (he(t._vnode, null, null, !0), r = t._vnode.component) : v(t._vnode || null, e, t, null, null, null, n), t._vnode = e, xe ||= (xe = !0, bn(r), xn(), !1); + }, k = { p: v, - um: me, - m: pe, - r: he, - mt: k, - mc: E, - pc: ue, - pbc: D, - n: ye, + um: he, + m: me, + r: ge, + mt: O, + mc: T, + pc: de, + pbc: E, + n: be, o: e - }, Se, Ce; - return i && ([Se, Ce] = i(A)), { - render: xe, - hydrate: Se, - createApp: kr(xe, Se) + }, Ce, we; + return i && ([Ce, we] = i(k)), { + render: Se, + hydrate: Ce, + createApp: Pr(Se, Ce) }; } -function li({ type: e, props: t }, n) { +function mi({ type: e, props: t }, n) { return n === "svg" && e === "foreignObject" || n === "mathml" && e === "annotation-xml" && t && t.encoding && t.encoding.includes("html") ? void 0 : n; } -function ui({ effect: e, job: t }, n) { +function hi({ effect: e, job: t }, n) { n ? (e.flags |= 32, t.flags |= 4) : (e.flags &= -33, t.flags &= -5); } -function di(e, t) { +function gi(e, t) { return (!e || e && !e.pendingBranch) && t && !t.persisted; } -function fi(e, t, n = !1) { +function _i(e, t, n = !1) { let r = e.children, i = t.children; if (d(r) && d(i)) for (let e = 0; e < r.length; e++) { let t = r[e], a = i[e]; - a.shapeFlag & 1 && !a.dynamicChildren && ((a.patchFlag <= 0 || a.patchFlag === 32) && (a = i[e] = Li(i[e]), a.el = t.el), !n && a.patchFlag !== -2 && fi(t, a)), a.type === yi && (a.patchFlag === -1 && (a = i[e] = Li(a)), a.el = t.el), a.type === bi && !a.el && (a.el = t.el); + a.shapeFlag & 1 && !a.dynamicChildren && ((a.patchFlag <= 0 || a.patchFlag === 32) && (a = i[e] = Hi(i[e]), a.el = t.el), !n && a.patchFlag !== -2 && _i(t, a)), a.type === wi && (a.patchFlag === -1 && (a = i[e] = Hi(a)), a.el = t.el), a.type === Ti && !a.el && (a.el = t.el); } } -function pi(e) { +function vi(e) { let t = e.slice(), n = [0], r, i, a, o, s, c = e.length; for (r = 0; r < c; r++) { let c = e[r]; @@ -2121,63 +2121,63 @@ function pi(e) { for (a = n.length, o = n[a - 1]; a-- > 0;) n[a] = o, o = t[o]; return n; } -function mi(e) { +function yi(e) { let t = e.subTree.component; - if (t) return t.asyncDep && !t.asyncResolved ? t : mi(t); + if (t) return t.asyncDep && !t.asyncResolved ? t : yi(t); } -function hi(e) { +function bi(e) { if (e) for (let t = 0; t < e.length; t++) e[t].flags |= 8; } -function gi(e) { +function xi(e) { if (e.placeholder) return e.placeholder; let t = e.component; - return t ? gi(t.subTree) : null; + return t ? xi(t.subTree) : null; } -var _i = (e) => e.__isSuspense; -function vi(e, t) { - t && t.pendingBranch ? d(e) ? t.effects.push(...e) : t.effects.push(e) : mn(e); +var Si = (e) => e.__isSuspense; +function Ci(e, t) { + t && t.pendingBranch ? d(e) ? t.effects.push(...e) : t.effects.push(e) : yn(e); } -var K = /* @__PURE__ */ Symbol.for("v-fgt"), yi = /* @__PURE__ */ Symbol.for("v-txt"), bi = /* @__PURE__ */ Symbol.for("v-cmt"), xi = /* @__PURE__ */ Symbol.for("v-stc"), Si = [], q = null; -function J(e = !1) { - Si.push(q = e ? null : []); +var V = /* @__PURE__ */ Symbol.for("v-fgt"), wi = /* @__PURE__ */ Symbol.for("v-txt"), Ti = /* @__PURE__ */ Symbol.for("v-cmt"), Ei = /* @__PURE__ */ Symbol.for("v-stc"), Di = [], H = null; +function U(e = !1) { + Di.push(H = e ? null : []); } -function Ci() { - Si.pop(), q = Si[Si.length - 1] || null; +function Oi() { + Di.pop(), H = Di[Di.length - 1] || null; } -var wi = 1; -function Ti(e, t = !1) { - wi += e, e < 0 && q && t && (q.hasOnce = !0); +var ki = 1; +function Ai(e, t = !1) { + ki += e, e < 0 && H && t && (H.hasOnce = !0); } -function Ei(e) { - return e.dynamicChildren = wi > 0 ? q || n : null, Ci(), wi > 0 && q && q.push(e), e; +function ji(e) { + return e.dynamicChildren = ki > 0 ? H || n : null, Oi(), ki > 0 && H && H.push(e), e; } -function Y(e, t, n, r, i, a) { - return Ei(X(e, t, n, r, i, a, !0)); +function W(e, t, n, r, i, a) { + return ji(G(e, t, n, r, i, a, !0)); } -function Di(e, t, n, r, i) { - return Ei(Z(e, t, n, r, i, !0)); +function Mi(e, t, n, r, i) { + return ji(Li(e, t, n, r, i, !0)); } -function Oi(e) { +function Ni(e) { return e ? e.__v_isVNode === !0 : !1; } -function ki(e, t) { +function Pi(e, t) { return e.type === t.type && e.key === t.key; } -var Ai = ({ key: e }) => e ?? null, ji = ({ ref: e, ref_key: t, ref_for: n }) => (typeof e == "number" && (e = "" + e), e == null ? null : g(e) || /* @__PURE__ */ z(e) || h(e) ? { - i: U, +var Fi = ({ key: e }) => e ?? null, Ii = ({ ref: e, ref_key: t, ref_for: n }) => (typeof e == "number" && (e = "" + e), e == null ? null : g(e) || /* @__PURE__ */ I(e) || h(e) ? { + i: R, r: e, k: t, f: !!n } : e); -function X(e, t = null, n = null, r = 0, i = null, a = e === K ? 0 : 1, o = !1, s = !1) { +function G(e, t = null, n = null, r = 0, i = null, a = e === V ? 0 : 1, o = !1, s = !1) { let c = { __v_isVNode: !0, __v_skip: !0, type: e, props: t, - key: t && Ai(t), - ref: t && ji(t), - scopeId: yn, + key: t && Fi(t), + ref: t && Ii(t), + scopeId: wn, slotScopeIds: null, children: n, component: null, @@ -2197,35 +2197,35 @@ function X(e, t = null, n = null, r = 0, i = null, a = e === K ? 0 : 1, o = !1, dynamicProps: i, dynamicChildren: null, appContext: null, - ctx: U + ctx: R }; - return s ? (Ri(c, n), a & 128 && e.normalize(c)) : n && (c.shapeFlag |= g(n) ? 8 : 16), wi > 0 && !o && q && (c.patchFlag > 0 || a & 6) && c.patchFlag !== 32 && q.push(c), c; + return s ? (Ui(c, n), a & 128 && e.normalize(c)) : n && (c.shapeFlag |= g(n) ? 8 : 16), ki > 0 && !o && H && (c.patchFlag > 0 || a & 6) && c.patchFlag !== 32 && H.push(c), c; } -var Z = Mi; -function Mi(e, t = null, n = null, r = 0, i = null, a = !1) { - if ((!e || e === or) && (e = bi), Oi(e)) { - let r = Pi(e, t, !0); - return n && Ri(r, n), wi > 0 && !a && q && (r.shapeFlag & 6 ? q[q.indexOf(e)] = r : q.push(r)), r.patchFlag = -2, r; +var Li = Ri; +function Ri(e, t = null, n = null, r = 0, i = null, a = !1) { + if ((!e || e === dr) && (e = Ti), Ni(e)) { + let r = Bi(e, t, !0); + return n && Ui(r, n), ki > 0 && !a && H && (r.shapeFlag & 6 ? H[H.indexOf(e)] = r : H.push(r)), r.patchFlag = -2, r; } - if (oa(e) && (e = e.__vccOpts), t) { - t = Ni(t); + if (da(e) && (e = e.__vccOpts), t) { + t = zi(t); let { class: e, style: n } = t; - e && !g(e) && (t.class = he(e)), v(n) && (/* @__PURE__ */ Rt(n) && !d(n) && (n = s({}, n)), t.style = ue(n)); + e && !g(e) && (t.class = ge(e)), v(n) && (/* @__PURE__ */ Bt(n) && !d(n) && (n = s({}, n)), t.style = de(n)); } - let o = g(e) ? 1 : _i(e) ? 128 : Nn(e) ? 64 : v(e) ? 4 : h(e) ? 2 : 0; - return X(e, t, n, r, i, o, a, !0); + let o = g(e) ? 1 : Si(e) ? 128 : Rn(e) ? 64 : v(e) ? 4 : h(e) ? 2 : 0; + return G(e, t, n, r, i, o, a, !0); } -function Ni(e) { - return e ? /* @__PURE__ */ Rt(e) || Gr(e) ? s({}, e) : e : null; +function zi(e) { + return e ? /* @__PURE__ */ Bt(e) || Xr(e) ? s({}, e) : e : null; } -function Pi(e, t, n = !1, r = !1) { - let { props: i, ref: a, patchFlag: o, children: s, transition: c } = e, l = t ? zi(i || {}, t) : i, u = { +function Bi(e, t, n = !1, r = !1) { + let { props: i, ref: a, patchFlag: o, children: s, transition: c } = e, l = t ? Wi(i || {}, t) : i, u = { __v_isVNode: !0, __v_skip: !0, type: e.type, props: l, - key: l && Ai(l), - ref: t && t.ref ? n && a ? d(a) ? a.concat(ji(t)) : [a, ji(t)] : ji(t) : a, + key: l && Fi(l), + ref: t && t.ref ? n && a ? d(a) ? a.concat(Ii(t)) : [a, Ii(t)] : Ii(t) : a, scopeId: e.scopeId, slotScopeIds: e.slotScopeIds, children: s, @@ -2234,7 +2234,7 @@ function Pi(e, t, n = !1, r = !1) { targetAnchor: e.targetAnchor, staticCount: e.staticCount, shapeFlag: e.shapeFlag, - patchFlag: t && e.type !== K ? o === -1 ? 16 : o | 16 : o, + patchFlag: t && e.type !== V ? o === -1 ? 16 : o | 16 : o, dynamicProps: e.dynamicProps, dynamicChildren: e.dynamicChildren, appContext: e.appContext, @@ -2242,53 +2242,53 @@ function Pi(e, t, n = !1, r = !1) { transition: c, component: e.component, suspense: e.suspense, - ssContent: e.ssContent && Pi(e.ssContent), - ssFallback: e.ssFallback && Pi(e.ssFallback), + ssContent: e.ssContent && Bi(e.ssContent), + ssFallback: e.ssFallback && Bi(e.ssFallback), placeholder: e.placeholder, el: e.el, anchor: e.anchor, ctx: e.ctx, ce: e.ce }; - return c && r && Fn(u, c.clone(u)), u; + return c && r && Bn(u, c.clone(u)), u; } -function Q(e = " ", t = 0) { - return Z(yi, null, e, t); +function K(e = " ", t = 0) { + return Li(wi, null, e, t); } -function Fi(e = "", t = !1) { - return t ? (J(), Di(bi, null, e)) : Z(bi, null, e); +function q(e = "", t = !1) { + return t ? (U(), Mi(Ti, null, e)) : Li(Ti, null, e); } -function Ii(e) { - return e == null || typeof e == "boolean" ? Z(bi) : d(e) ? Z(K, null, e.slice()) : Oi(e) ? Li(e) : Z(yi, null, String(e)); +function Vi(e) { + return e == null || typeof e == "boolean" ? Li(Ti) : d(e) ? Li(V, null, e.slice()) : Ni(e) ? Hi(e) : Li(wi, null, String(e)); } -function Li(e) { - return e.el === null && e.patchFlag !== -1 || e.memo ? e : Pi(e); +function Hi(e) { + return e.el === null && e.patchFlag !== -1 || e.memo ? e : Bi(e); } -function Ri(e, t) { +function Ui(e, t) { let n = 0, { shapeFlag: r } = e; if (t == null) t = null; else if (d(t)) n = 16; else if (typeof t == "object") if (r & 65) { let n = t.default; - n && (n._c && (n._d = !1), Ri(e, n()), n._c && (n._d = !0)); + n && (n._c && (n._d = !1), Ui(e, n()), n._c && (n._d = !0)); return; } else { n = 32; let r = t._; - !r && !Gr(t) ? t._ctx = U : r === 3 && U && (U.slots._ === 1 ? t._ = 1 : (t._ = 2, e.patchFlag |= 1024)); + !r && !Xr(t) ? t._ctx = R : r === 3 && R && (R.slots._ === 1 ? t._ = 1 : (t._ = 2, e.patchFlag |= 1024)); } else h(t) ? (t = { default: t, - _ctx: U - }, n = 32) : (t = String(t), r & 64 ? (n = 16, t = [Q(t)]) : n = 8); + _ctx: R + }, n = 32) : (t = String(t), r & 64 ? (n = 16, t = [K(t)]) : n = 8); e.children = t, e.shapeFlag |= n; } -function zi(...e) { +function Wi(...e) { let t = {}; for (let n = 0; n < e.length; n++) { let r = e[n]; - for (let e in r) if (e === "class") t.class !== r.class && (t.class = he([t.class, r.class])); - else if (e === "style") t.style = ue([t.style, r.style]); + for (let e in r) if (e === "class") t.class !== r.class && (t.class = ge([t.class, r.class])); + else if (e === "style") t.style = de([t.style, r.style]); else if (a(e)) { let n = t[e], i = r[e]; i && n !== i && !(d(n) && n.includes(i)) ? t[e] = n ? [].concat(n, i) : i : i == null && n == null && !o(e) && (t[e] = i); @@ -2296,13 +2296,13 @@ function zi(...e) { } return t; } -function Bi(e, t, n, r = null) { - B(e, t, 7, [n, r]); +function Gi(e, t, n, r = null) { + on(e, t, 7, [n, r]); } -var Vi = Dr(), Hi = 0; -function Ui(e, n, r) { - let i = e.type, a = (n ? n.appContext : e.appContext) || Vi, o = { - uid: Hi++, +var Ki = Mr(), qi = 0; +function Ji(e, n, r) { + let i = e.type, a = (n ? n.appContext : e.appContext) || Ki, o = { + uid: qi++, vnode: e, type: i, parent: n, @@ -2313,7 +2313,7 @@ function Ui(e, n, r) { effect: null, update: null, job: null, - scope: new we(!0), + scope: new Te(!0), render: null, proxy: null, exposed: null, @@ -2329,8 +2329,8 @@ function Ui(e, n, r) { renderCache: [], components: null, directives: null, - propsOptions: Zr(i, a), - emitsOptions: Pr(i, a), + propsOptions: ni(i, a), + emitsOptions: zr(i, a), emit: null, emitted: null, propsDefaults: t, @@ -2365,89 +2365,89 @@ function Ui(e, n, r) { ec: null, sp: null }; - return o.ctx = { _: o }, o.root = n ? n.root : o, o.emit = Mr.bind(null, o), e.ce && e.ce(o), o; + return o.ctx = { _: o }, o.root = n ? n.root : o, o.emit = Lr.bind(null, o), e.ce && e.ce(o), o; } -var $ = null, Wi = () => $ || U, Gi, Ki; +var J = null, Yi = () => J || R, Xi, Zi; { - let e = le(), t = (t, n) => { + let e = ue(), t = (t, n) => { let r; return (r = e[t]) || (r = e[t] = []), r.push(n), (e) => { r.length > 1 ? r.forEach((t) => t(e)) : r[0](e); }; }; - Gi = t("__VUE_INSTANCE_SETTERS__", (e) => $ = e), Ki = t("__VUE_SSR_SETTERS__", (e) => Xi = e); + Xi = t("__VUE_INSTANCE_SETTERS__", (e) => J = e), Zi = t("__VUE_SSR_SETTERS__", (e) => ta = e); } -var qi = (e) => { - let t = $; - return Gi(e), e.scope.on(), () => { - e.scope.off(), Gi(t); +var Qi = (e) => { + let t = J; + return Xi(e), e.scope.on(), () => { + e.scope.off(), Xi(t); }; -}, Ji = () => { - $ && $.scope.off(), Gi(null); +}, $i = () => { + J && J.scope.off(), Xi(null); }; -function Yi(e) { +function ea(e) { return e.vnode.shapeFlag & 4; } -var Xi = !1; -function Zi(e, t = !1, n = !1) { - t && Ki(t); - let { props: r, children: i } = e.vnode, a = Yi(e); - Kr(e, r, a, t), ai(e, i, n || t); - let o = a ? Qi(e, t) : void 0; - return t && Ki(!1), o; +var ta = !1; +function na(e, t = !1, n = !1) { + t && Zi(t); + let { props: r, children: i } = e.vnode, a = ea(e); + Zr(e, r, a, t), ui(e, i, n || t); + let o = a ? ra(e, t) : void 0; + return t && Zi(!1), o; } -function Qi(e, t) { +function ra(e, t) { let n = e.type; - e.accessCache = /* @__PURE__ */ Object.create(null), e.proxy = new Proxy(e.ctx, dr); + e.accessCache = /* @__PURE__ */ Object.create(null), e.proxy = new Proxy(e.ctx, gr); let { setup: r } = n; if (r) { - Ve(); - let n = e.setupContext = r.length > 1 ? ia(e) : null, i = qi(e), a = tn(r, e, 0, [e.props, n]), o = y(a); - if (He(), i(), (o || e.sp) && !Hn(e) && Ln(e), o) { - if (a.then(Ji, Ji), t) return a.then((n) => { - $i(e, n, t); + He(); + let n = e.setupContext = r.length > 1 ? la(e) : null, i = Qi(e), a = an(r, e, 0, [e.props, n]), o = y(a); + if (Ue(), i(), (o || e.sp) && !qn(e) && Hn(e), o) { + if (a.then($i, $i), t) return a.then((n) => { + ia(e, n, t); }).catch((t) => { - nn(t, e, 0); + sn(t, e, 0); }); e.asyncDep = a; - } else $i(e, a, t); - } else na(e, t); + } else ia(e, a, t); + } else sa(e, t); } -function $i(e, t, n) { - h(t) ? e.type.__ssrInlineRender ? e.ssrRender = t : e.render = t : v(t) && (e.setupState = Kt(t)), na(e, n); +function ia(e, t, n) { + h(t) ? e.type.__ssrInlineRender ? e.ssrRender = t : e.render = t : v(t) && (e.setupState = Yt(t)), sa(e, n); } -var ea, ta; -function na(e, t, n) { +var aa, oa; +function sa(e, t, n) { let i = e.type; if (!e.render) { - if (!t && ea && !i.render) { - let t = i.template || vr(e).template; + if (!t && aa && !i.render) { + let t = i.template || Cr(e).template; if (t) { let { isCustomElement: n, compilerOptions: r } = e.appContext.config, { delimiters: a, compilerOptions: o } = i; - i.render = ea(t, s(s({ + i.render = aa(t, s(s({ isCustomElement: n, delimiters: a }, r), o)); } } - e.render = i.render || r, ta && ta(e); + e.render = i.render || r, oa && oa(e); } { - let t = qi(e); - Ve(); + let t = Qi(e); + He(); try { - mr(e); + yr(e); } finally { - He(), t(); + Ue(), t(); } } } -var ra = { get(e, t) { - return P(e, "get", ""), e[t]; +var ca = { get(e, t) { + return N(e, "get", ""), e[t]; } }; -function ia(e) { +function la(e) { return { - attrs: new Proxy(e.attrs, ra), + attrs: new Proxy(e.attrs, ca), slots: e.slots, emit: e.emit, expose: (t) => { @@ -2455,25 +2455,25 @@ function ia(e) { } }; } -function aa(e) { - return e.exposed ? e.exposeProxy ||= new Proxy(Kt(zt(e.exposed)), { +function ua(e) { + return e.exposed ? e.exposeProxy ||= new Proxy(Yt(Vt(e.exposed)), { get(t, n) { if (n in t) return t[n]; - if (n in lr) return lr[n](e); + if (n in mr) return mr[n](e); }, has(e, t) { - return t in e || t in lr; + return t in e || t in mr; } }) : e.proxy; } -function oa(e) { +function da(e) { return h(e) && "__vccOpts" in e; } -var sa = (e, t) => /* @__PURE__ */ Jt(e, t, Xi), ca = "3.5.34", la = void 0, ua = typeof window < "u" && window.trustedTypes; -if (ua) try { - la = /* @__PURE__ */ ua.createPolicy("vue", { createHTML: (e) => e }); +var Y = (e, t) => /* @__PURE__ */ Zt(e, t, ta), fa = "3.5.34", pa = void 0, ma = typeof window < "u" && window.trustedTypes; +if (ma) try { + pa = /* @__PURE__ */ ma.createPolicy("vue", { createHTML: (e) => e }); } catch {} -var da = la ? (e) => la.createHTML(e) : (e) => e, fa = "http://www.w3.org/2000/svg", pa = "http://www.w3.org/1998/Math/MathML", ma = typeof document < "u" ? document : null, ha = ma && /* @__PURE__ */ ma.createElement("template"), ga = { +var ha = pa ? (e) => pa.createHTML(e) : (e) => e, ga = "http://www.w3.org/2000/svg", _a = "http://www.w3.org/1998/Math/MathML", va = typeof document < "u" ? document : null, ya = va && /* @__PURE__ */ va.createElement("template"), ba = { insert: (e, t, n) => { t.insertBefore(e, n || null); }, @@ -2482,11 +2482,11 @@ var da = la ? (e) => la.createHTML(e) : (e) => e, fa = "http://www.w3.org/2000/s t && t.removeChild(e); }, createElement: (e, t, n, r) => { - let i = t === "svg" ? ma.createElementNS(fa, e) : t === "mathml" ? ma.createElementNS(pa, e) : n ? ma.createElement(e, { is: n }) : ma.createElement(e); + let i = t === "svg" ? va.createElementNS(ga, e) : t === "mathml" ? va.createElementNS(_a, e) : n ? va.createElement(e, { is: n }) : va.createElement(e); return e === "select" && r && r.multiple != null && i.setAttribute("multiple", r.multiple), i; }, - createText: (e) => ma.createTextNode(e), - createComment: (e) => ma.createComment(e), + createText: (e) => va.createTextNode(e), + createComment: (e) => va.createComment(e), setText: (e, t) => { e.nodeValue = t; }, @@ -2495,7 +2495,7 @@ var da = la ? (e) => la.createHTML(e) : (e) => e, fa = "http://www.w3.org/2000/s }, parentNode: (e) => e.parentNode, nextSibling: (e) => e.nextSibling, - querySelector: (e) => ma.querySelector(e), + querySelector: (e) => va.querySelector(e), setScopeId(e, t) { e.setAttribute(t, ""); }, @@ -2503,8 +2503,8 @@ var da = la ? (e) => la.createHTML(e) : (e) => e, fa = "http://www.w3.org/2000/s let o = n ? n.previousSibling : t.lastChild; if (i && (i === a || i.nextSibling)) for (; t.insertBefore(i.cloneNode(!0), n), !(i === a || !(i = i.nextSibling));); else { - ha.innerHTML = da(r === "svg" ? `${e}` : r === "mathml" ? `${e}` : e); - let i = ha.content; + ya.innerHTML = ha(r === "svg" ? `${e}` : r === "mathml" ? `${e}` : e); + let i = ya.content; if (r === "svg" || r === "mathml") { let e = i.firstChild; for (; e.firstChild;) i.appendChild(e.firstChild); @@ -2514,89 +2514,69 @@ var da = la ? (e) => la.createHTML(e) : (e) => e, fa = "http://www.w3.org/2000/s } return [o ? o.nextSibling : t.firstChild, n ? n.previousSibling : t.lastChild]; } -}, _a = /* @__PURE__ */ Symbol("_vtc"); -function va(e, t, n) { - let r = e[_a]; +}, xa = /* @__PURE__ */ Symbol("_vtc"); +function Sa(e, t, n) { + let r = e[xa]; r && (t = (t ? [t, ...r] : [...r]).join(" ")), t == null ? e.removeAttribute("class") : n ? e.setAttribute("class", t) : e.className = t; } -var ya = /* @__PURE__ */ Symbol("_vod"), ba = /* @__PURE__ */ Symbol("_vsh"), xa = { - name: "show", - beforeMount(e, { value: t }, { transition: n }) { - e[ya] = e.style.display === "none" ? "" : e.style.display, n && t ? n.beforeEnter(e) : Sa(e, t); - }, - mounted(e, { value: t }, { transition: n }) { - n && t && n.enter(e); - }, - updated(e, { value: t, oldValue: n }, { transition: r }) { - !t != !n && (r ? t ? (r.beforeEnter(e), Sa(e, !0), r.enter(e)) : r.leave(e, () => { - Sa(e, !1); - }) : Sa(e, t)); - }, - beforeUnmount(e, { value: t }) { - Sa(e, t); - } -}; -function Sa(e, t) { - e.style.display = t ? e[ya] : "none", e[ba] = !t; -} -var Ca = /* @__PURE__ */ Symbol(""), wa = /(?:^|;)\s*display\s*:/; -function Ta(e, t, n) { +var Ca = /* @__PURE__ */ Symbol("_vod"), wa = /* @__PURE__ */ Symbol("_vsh"), Ta = /* @__PURE__ */ Symbol(""), Ea = /(?:^|;)\s*display\s*:/; +function Da(e, t, n) { let r = e.style, i = g(n), a = !1; if (n && !i) { if (t) if (g(t)) for (let e of t.split(";")) { let t = e.slice(0, e.indexOf(":")).trim(); - n[t] ?? Da(r, t, ""); + n[t] ?? ka(r, t, ""); } - else for (let e in t) n[e] ?? Da(r, e, ""); + else for (let e in t) n[e] ?? ka(r, e, ""); for (let i in n) { i === "display" && (a = !0); let o = n[i]; - o == null ? Da(r, i, "") : ja(e, i, !g(t) && t ? t[i] : void 0, o) || Da(r, i, o); + o == null ? ka(r, i, "") : Na(e, i, !g(t) && t ? t[i] : void 0, o) || ka(r, i, o); } } else if (i) { if (t !== n) { - let e = r[Ca]; - e && (n += ";" + e), r.cssText = n, a = wa.test(n); + let e = r[Ta]; + e && (n += ";" + e), r.cssText = n, a = Ea.test(n); } } else t && e.removeAttribute("style"); - ya in e && (e[ya] = a ? r.display : "", e[ba] && (r.display = "none")); + Ca in e && (e[Ca] = a ? r.display : "", e[wa] && (r.display = "none")); } -var Ea = /\s*!important$/; -function Da(e, t, n) { - if (d(n)) n.forEach((n) => Da(e, t, n)); +var Oa = /\s*!important$/; +function ka(e, t, n) { + if (d(n)) n.forEach((n) => ka(e, t, n)); else if (n ??= "", t.startsWith("--")) e.setProperty(t, n); else { - let r = Aa(e, t); - Ea.test(n) ? e.setProperty(D(r), n.replace(Ea, ""), "important") : e[r] = n; + let r = Ma(e, t); + Oa.test(n) ? e.setProperty(E(r), n.replace(Oa, ""), "important") : e[r] = n; } } -var Oa = [ +var Aa = [ "Webkit", "Moz", "ms" -], ka = {}; -function Aa(e, t) { - let n = ka[t]; +], ja = {}; +function Ma(e, t) { + let n = ja[t]; if (n) return n; - let r = E(t); - if (r !== "filter" && r in e) return ka[t] = r; - r = re(r); - for (let n = 0; n < Oa.length; n++) { - let i = Oa[n] + r; - if (i in e) return ka[t] = i; + let r = T(t); + if (r !== "filter" && r in e) return ja[t] = r; + r = ie(r); + for (let n = 0; n < Aa.length; n++) { + let i = Aa[n] + r; + if (i in e) return ja[t] = i; } return t; } -function ja(e, t, n, r) { +function Na(e, t, n, r) { return e.tagName === "TEXTAREA" && (t === "width" || t === "height") && g(r) && n === r; } -var Ma = "http://www.w3.org/1999/xlink"; -function Na(e, t, n, r, i, a = _e(t)) { - r && t.startsWith("xlink:") ? n == null ? e.removeAttributeNS(Ma, t.slice(6, t.length)) : e.setAttributeNS(Ma, t, n) : n == null || a && !ve(n) ? e.removeAttribute(t) : e.setAttribute(t, a ? "" : _(n) ? String(n) : n); +var Pa = "http://www.w3.org/1999/xlink"; +function Fa(e, t, n, r, i, a = ve(t)) { + r && t.startsWith("xlink:") ? n == null ? e.removeAttributeNS(Pa, t.slice(6, t.length)) : e.setAttributeNS(Pa, t, n) : n == null || a && !ye(n) ? e.removeAttribute(t) : e.setAttribute(t, a ? "" : _(n) ? String(n) : n); } -function Pa(e, t, n, r, i) { +function Ia(e, t, n, r, i) { if (t === "innerHTML" || t === "textContent") { - n != null && (e[t] = t === "innerHTML" ? da(n) : n); + n != null && (e[t] = t === "innerHTML" ? ha(n) : n); return; } let a = e.tagName; @@ -2608,48 +2588,48 @@ function Pa(e, t, n, r, i) { let o = !1; if (n === "" || n == null) { let r = typeof e[t]; - r === "boolean" ? n = ve(n) : n == null && r === "string" ? (n = "", o = !0) : r === "number" && (n = 0, o = !0); + r === "boolean" ? n = ye(n) : n == null && r === "string" ? (n = "", o = !0) : r === "number" && (n = 0, o = !0); } try { e[t] = n; } catch {} o && e.removeAttribute(i || t); } -function Fa(e, t, n, r) { +function La(e, t, n, r) { e.addEventListener(t, n, r); } -function Ia(e, t, n, r) { +function Ra(e, t, n, r) { e.removeEventListener(t, n, r); } -var La = /* @__PURE__ */ Symbol("_vei"); -function Ra(e, t, n, r, i = null) { - let a = e[La] || (e[La] = {}), o = a[t]; +var za = /* @__PURE__ */ Symbol("_vei"); +function Ba(e, t, n, r, i = null) { + let a = e[za] || (e[za] = {}), o = a[t]; if (r && o) o.value = r; else { - let [n, s] = Ba(t); - r ? Fa(e, n, a[t] = Wa(r, i), s) : o && (Ia(e, n, o, s), a[t] = void 0); + let [n, s] = Ha(t); + r ? La(e, n, a[t] = Ka(r, i), s) : o && (Ra(e, n, o, s), a[t] = void 0); } } -var za = /(?:Once|Passive|Capture)$/; -function Ba(e) { +var Va = /(?:Once|Passive|Capture)$/; +function Ha(e) { let t; - if (za.test(e)) { + if (Va.test(e)) { t = {}; let n; - for (; n = e.match(za);) e = e.slice(0, e.length - n[0].length), t[n[0].toLowerCase()] = !0; + for (; n = e.match(Va);) e = e.slice(0, e.length - n[0].length), t[n[0].toLowerCase()] = !0; } - return [e[2] === ":" ? e.slice(3) : D(e.slice(2)), t]; + return [e[2] === ":" ? e.slice(3) : E(e.slice(2)), t]; } -var Va = 0, Ha = /* @__PURE__ */ Promise.resolve(), Ua = () => Va ||= (Ha.then(() => Va = 0), Date.now()); -function Wa(e, t) { +var Ua = 0, Wa = /* @__PURE__ */ Promise.resolve(), Ga = () => Ua ||= (Wa.then(() => Ua = 0), Date.now()); +function Ka(e, t) { let n = (e) => { if (!e._vts) e._vts = Date.now(); else if (e._vts <= n.attached) return; - B(Ga(e, n.value), t, 5, [e]); + on(qa(e, n.value), t, 5, [e]); }; - return n.value = e, n.attached = Ua(), n; + return n.value = e, n.attached = Ga(), n; } -function Ga(e, t) { +function qa(e, t) { if (d(t)) { let n = e.stopImmediatePropagation; return e.stopImmediatePropagation = () => { @@ -2657,40 +2637,40 @@ function Ga(e, t) { }, t.map((e) => (t) => !t._stopped && e && e(t)); } else return t; } -var Ka = (e) => e.charCodeAt(0) === 111 && e.charCodeAt(1) === 110 && e.charCodeAt(2) > 96 && e.charCodeAt(2) < 123, qa = (e, t, n, r, i, s) => { +var Ja = (e) => e.charCodeAt(0) === 111 && e.charCodeAt(1) === 110 && e.charCodeAt(2) > 96 && e.charCodeAt(2) < 123, Ya = (e, t, n, r, i, s) => { let c = i === "svg"; - t === "class" ? va(e, r, c) : t === "style" ? Ta(e, n, r) : a(t) ? o(t) || Ra(e, t, n, r, s) : (t[0] === "." ? (t = t.slice(1), !0) : t[0] === "^" ? (t = t.slice(1), !1) : Ja(e, t, r, c)) ? (Pa(e, t, r), !e.tagName.includes("-") && (t === "value" || t === "checked" || t === "selected") && Na(e, t, r, c, s, t !== "value")) : e._isVueCE && (Ya(e, t) || e._def.__asyncLoader && (/[A-Z]/.test(t) || !g(r))) ? Pa(e, E(t), r, s, t) : (t === "true-value" ? e._trueValue = r : t === "false-value" && (e._falseValue = r), Na(e, t, r, c)); + t === "class" ? Sa(e, r, c) : t === "style" ? Da(e, n, r) : a(t) ? o(t) || Ba(e, t, n, r, s) : (t[0] === "." ? (t = t.slice(1), !0) : t[0] === "^" ? (t = t.slice(1), !1) : Xa(e, t, r, c)) ? (Ia(e, t, r), !e.tagName.includes("-") && (t === "value" || t === "checked" || t === "selected") && Fa(e, t, r, c, s, t !== "value")) : e._isVueCE && (Za(e, t) || e._def.__asyncLoader && (/[A-Z]/.test(t) || !g(r))) ? Ia(e, T(t), r, s, t) : (t === "true-value" ? e._trueValue = r : t === "false-value" && (e._falseValue = r), Fa(e, t, r, c)); }; -function Ja(e, t, n, r) { - if (r) return !!(t === "innerHTML" || t === "textContent" || t in e && Ka(t) && h(n)); +function Xa(e, t, n, r) { + if (r) return !!(t === "innerHTML" || t === "textContent" || t in e && Ja(t) && h(n)); if (t === "spellcheck" || t === "draggable" || t === "translate" || t === "autocorrect" || t === "sandbox" && e.tagName === "IFRAME" || t === "form" || t === "list" && e.tagName === "INPUT" || t === "type" && e.tagName === "TEXTAREA") return !1; if (t === "width" || t === "height") { let t = e.tagName; if (t === "IMG" || t === "VIDEO" || t === "CANVAS" || t === "SOURCE") return !1; } - return Ka(t) && g(n) ? !1 : t in e; + return Ja(t) && g(n) ? !1 : t in e; } -function Ya(e, t) { +function Za(e, t) { let n = e._def.props; if (!n) return !1; - let r = E(t); - return Array.isArray(n) ? n.some((e) => E(e) === r) : Object.keys(n).some((e) => E(e) === r); + let r = T(t); + return Array.isArray(n) ? n.some((e) => T(e) === r) : Object.keys(n).some((e) => T(e) === r); } -var Xa = {}; +var Qa = {}; /* @__NO_SIDE_EFFECTS__ */ -function Za(e, t, n) { - let r = /* @__PURE__ */ In(e, t); +function $a(e, t, n) { + let r = /* @__PURE__ */ Vn(e, t); C(r) && (r = s({}, r, t)); - class i extends $a { + class i extends to { constructor(e) { super(r, e, n); } } return i.def = r, i; } -var Qa = typeof HTMLElement < "u" ? HTMLElement : class {}, $a = class e extends Qa { - constructor(e, t = {}, n = lo) { - super(), this._def = e, this._props = t, this._createApp = n, this._isVueCE = !0, this._instance = null, this._app = null, this._nonce = this._def.nonce, this._connected = !1, this._resolved = !1, this._patching = !1, this._dirty = !1, this._numberProps = null, this._styleChildren = /* @__PURE__ */ new WeakSet(), this._styleAnchors = /* @__PURE__ */ new WeakMap(), this._ob = null, this.shadowRoot && n !== lo ? this._root = this.shadowRoot : e.shadowRoot === !1 ? this._root = this : (this.attachShadow(s({}, e.shadowRootOptions, { mode: "open" })), this._root = this.shadowRoot); +var eo = typeof HTMLElement < "u" ? HTMLElement : class {}, to = class e extends eo { + constructor(e, t = {}, n = vo) { + super(), this._def = e, this._props = t, this._createApp = n, this._isVueCE = !0, this._instance = null, this._app = null, this._nonce = this._def.nonce, this._connected = !1, this._resolved = !1, this._patching = !1, this._dirty = !1, this._numberProps = null, this._styleChildren = /* @__PURE__ */ new WeakSet(), this._styleAnchors = /* @__PURE__ */ new WeakMap(), this._ob = null, this.shadowRoot && n !== vo ? this._root = this.shadowRoot : e.shadowRoot === !1 ? this._root = this : (this.attachShadow(s({}, e.shadowRootOptions, { mode: "open" })), this._root = this.shadowRoot); } connectedCallback() { if (!this.isConnected) return; @@ -2711,7 +2691,7 @@ var Qa = typeof HTMLElement < "u" ? HTMLElement : class {}, $a = class e extends e && this._app && Object.setPrototypeOf(this._app._context.provides, e._instance.provides); } disconnectedCallback() { - this._connected = !1, un(() => { + this._connected = !1, hn(() => { this._connected || (this._ob &&= (this._ob.disconnect(), null), this._app && this._app.unmount(), this._instance && (this._instance.ce = void 0), this._app = this._instance = null, this._teleportTargets &&= (this._teleportTargets.clear(), void 0)); }); } @@ -2727,7 +2707,7 @@ var Qa = typeof HTMLElement < "u" ? HTMLElement : class {}, $a = class e extends let { props: n, styles: r } = e, i; if (n && !d(n)) for (let e in n) { let t = n[e]; - (t === Number || t && t.type === Number) && (e in this._props && (this._props[e] = se(this._props[e])), (i ||= /* @__PURE__ */ Object.create(null))[E(e)] = !0); + (t === Number || t && t.type === Number) && (e in this._props && (this._props[e] = ce(this._props[e])), (i ||= /* @__PURE__ */ Object.create(null))[T(e)] = !0); } this._numberProps = i, this._resolveProps(e), this.shadowRoot && this._applyStyles(r), this._mount(e); }, t = this._def.__asyncLoader; @@ -2738,12 +2718,12 @@ var Qa = typeof HTMLElement < "u" ? HTMLElement : class {}, $a = class e extends _mount(e) { this._app = this._createApp(e), this._inheritParentContext(), e.configureApp && e.configureApp(this._app), this._app._ceVNode = this._createVNode(), this._app.mount(this._root); let t = this._instance && this._instance.exposed; - if (t) for (let e in t) u(this, e) || Object.defineProperty(this, e, { get: () => Wt(t[e]) }); + if (t) for (let e in t) u(this, e) || Object.defineProperty(this, e, { get: () => qt(t[e]) }); } _resolveProps(e) { let { props: t } = e, n = d(t) ? t : Object.keys(t || {}); for (let e of Object.keys(this)) e[0] !== "_" && n.includes(e) && this._setProp(e, this[e]); - for (let e of n.map(E)) Object.defineProperty(this, e, { + for (let e of n.map(T)) Object.defineProperty(this, e, { get() { return this._getProp(e); }, @@ -2754,33 +2734,33 @@ var Qa = typeof HTMLElement < "u" ? HTMLElement : class {}, $a = class e extends } _setAttr(e) { if (e.startsWith("data-v-")) return; - let t = this.hasAttribute(e), n = t ? this.getAttribute(e) : Xa, r = E(e); - t && this._numberProps && this._numberProps[r] && (n = se(n)), this._setProp(r, n, !1, !0); + let t = this.hasAttribute(e), n = t ? this.getAttribute(e) : Qa, r = T(e); + t && this._numberProps && this._numberProps[r] && (n = ce(n)), this._setProp(r, n, !1, !0); } _getProp(e) { return this._props[e]; } _setProp(e, t, n = !0, r = !1) { - if (t !== this._props[e] && (this._dirty = !0, t === Xa ? delete this._props[e] : (this._props[e] = t, e === "key" && this._app && (this._app._ceVNode.key = t)), r && this._instance && this._update(), n)) { + if (t !== this._props[e] && (this._dirty = !0, t === Qa ? delete this._props[e] : (this._props[e] = t, e === "key" && this._app && (this._app._ceVNode.key = t)), r && this._instance && this._update(), n)) { let n = this._ob; - n && (this._processMutations(n.takeRecords()), n.disconnect()), t === !0 ? this.setAttribute(D(e), "") : typeof t == "string" || typeof t == "number" ? this.setAttribute(D(e), t + "") : t || this.removeAttribute(D(e)), n && n.observe(this, { attributes: !0 }); + n && (this._processMutations(n.takeRecords()), n.disconnect()), t === !0 ? this.setAttribute(E(e), "") : typeof t == "string" || typeof t == "number" ? this.setAttribute(E(e), t + "") : t || this.removeAttribute(E(e)), n && n.observe(this, { attributes: !0 }); } } _update() { let e = this._createVNode(); - this._app && (e.appContext = this._app._context), co(e, this._root); + this._app && (e.appContext = this._app._context), _o(e, this._root); } _createVNode() { let e = {}; this.shadowRoot || (e.onVnodeMounted = e.onVnodeUpdated = this._renderSlots.bind(this)); - let t = Z(this._def, s(e, this._props)); + let t = Li(this._def, s(e, this._props)); return this._instance || (t.ce = (e) => { this._instance = e, e.ce = this, e.isCE = !0; let t = (e, t) => { this.dispatchEvent(new CustomEvent(e, C(t[0]) ? s({ detail: t }, t[0]) : { detail: t })); }; e.emit = (e, ...n) => { - t(e, n), D(e) !== e && t(D(e), n); + t(e, n), E(e) !== e && t(E(e), n); }, this._setParent(); }), t; } @@ -2855,12 +2835,47 @@ var Qa = typeof HTMLElement < "u" ? HTMLElement : class {}, $a = class e extends return this._def.shadowRoot !== !1; } _removeChildStyle(e) {} -}, eo = [ +}, no = (e) => { + let t = e.props["onUpdate:modelValue"] || !1; + return d(t) ? (e) => oe(t, e) : t; +}; +function ro(e) { + e.target.composing = !0; +} +function io(e) { + let t = e.target; + t.composing && (t.composing = !1, t.dispatchEvent(new Event("input"))); +} +var ao = /* @__PURE__ */ Symbol("_assign"); +function oo(e, t, n) { + return t && (e = e.trim()), n && (e = se(e)), e; +} +var so = { + created(e, { modifiers: { lazy: t, trim: n, number: r } }, i) { + e[ao] = no(i); + let a = r || i.props && i.props.type === "number"; + La(e, t ? "change" : "input", (t) => { + t.target.composing || e[ao](oo(e.value, n, a)); + }), (n || a) && La(e, "change", () => { + e.value = oo(e.value, n, a); + }), t || (La(e, "compositionstart", ro), La(e, "compositionend", io), La(e, "change", io)); + }, + mounted(e, { value: t }) { + e.value = t ?? ""; + }, + beforeUpdate(e, { value: t, oldValue: n, modifiers: { lazy: r, trim: i, number: a } }, o) { + if (e[ao] = no(o), e.composing) return; + let s = (a || e.type === "number") && !/^0\d/.test(e.value) ? se(e.value) : e.value, c = t ?? ""; + if (s === c) return; + let l = e.getRootNode(); + (l instanceof Document || l instanceof ShadowRoot) && l.activeElement === e && e.type !== "range" && (r && t === n || i && e.value.trim() === c) || (e.value = c); + } +}, co = [ "ctrl", "shift", "alt", "meta" -], to = { +], lo = { stop: (e) => e.stopPropagation(), prevent: (e) => e.preventDefault(), self: (e) => e.target !== e.currentTarget, @@ -2871,18 +2886,18 @@ var Qa = typeof HTMLElement < "u" ? HTMLElement : class {}, $a = class e extends left: (e) => "button" in e && e.button !== 0, middle: (e) => "button" in e && e.button !== 1, right: (e) => "button" in e && e.button !== 2, - exact: (e, t) => eo.some((n) => e[`${n}Key`] && !t.includes(n)) -}, no = (e, t) => { + exact: (e, t) => co.some((n) => e[`${n}Key`] && !t.includes(n)) +}, uo = (e, t) => { if (!e) return e; let n = e._withMods ||= {}, r = t.join("."); return n[r] || (n[r] = ((n, ...r) => { for (let e = 0; e < t.length; e++) { - let r = to[t[e]]; + let r = lo[t[e]]; if (r && r(n, t)) return; } return e(n, ...r); })); -}, ro = { +}, fo = { esc: "escape", space: " ", up: "arrow-up", @@ -2890,50 +2905,56 @@ var Qa = typeof HTMLElement < "u" ? HTMLElement : class {}, $a = class e extends right: "arrow-right", down: "arrow-down", delete: "backspace" -}, io = (e, t) => { +}, po = (e, t) => { let n = e._withKeys ||= {}, r = t.join("."); return n[r] || (n[r] = ((n) => { if (!("key" in n)) return; - let r = D(n.key); - if (t.some((e) => e === r || ro[e] === r)) return e(n); + let r = E(n.key); + if (t.some((e) => e === r || fo[e] === r)) return e(n); })); -}, ao = /* @__PURE__ */ s({ patchProp: qa }, ga), oo; -function so() { - return oo ||= si(ao); -} -var co = ((...e) => { - so().render(...e); -}), lo = ((...e) => { - let t = so().createApp(...e), { mount: n } = t; +}, mo = /* @__PURE__ */ s({ patchProp: Ya }, ba), ho; +function go() { + return ho ||= fi(mo); +} +var _o = ((...e) => { + go().render(...e); +}), vo = ((...e) => { + let t = go().createApp(...e), { mount: n } = t; return t.mount = (e) => { - let r = fo(e); + let r = bo(e); if (!r) return; let i = t._component; !h(i) && !i.render && !i.template && (i.template = r.innerHTML), r.nodeType === 1 && (r.textContent = ""); - let a = n(r, !1, uo(r)); + let a = n(r, !1, yo(r)); return r instanceof Element && (r.removeAttribute("v-cloak"), r.setAttribute("data-v-app", "")), a; }, t; }); -function uo(e) { +function yo(e) { if (e instanceof SVGElement) return "svg"; if (typeof MathMLElement == "function" && e instanceof MathMLElement) return "mathml"; } -function fo(e) { +function bo(e) { return g(e) ? document.querySelector(e) : e; } //#endregion //#region packages/sdk-core/src/session.ts -var po, mo; -async function ho(e = {}) { - return po && po.expiresAtMs > Date.now() + 5e3 ? po.token : (mo ||= _o(e).finally(() => { - mo = void 0; - }), mo); +var xo = "__comtryaSessionState", So = "__comtryaOperatorCode"; +async function Co(e = {}) { + let t = Eo(); + if (t.current && t.current.expiresAtMs > Date.now() + 5e3) return t.current.token; + if (!t.inflight) { + let n = To(e).finally(() => { + Eo().inflight === n && (Eo().inflight = void 0); + }); + t.inflight = n; + } + return t.inflight; } -function go() { - po = void 0; +function wo() { + Eo().current = void 0; } -async function _o(e) { - let t = e.operatorCode ?? vo(), n = e.fetchImpl ?? fetch, r = e.baseUrl ?? ""; +async function To(e) { + let t = e.operatorCode ?? Do(), n = e.fetchImpl ?? fetch, r = e.baseUrl ?? ""; if (!t) return; let i = await n(`${r}/auth/token-exchange`, { method: "POST", @@ -2955,40 +2976,119 @@ async function _o(e) { if (!i.ok) throw Error(`token-exchange failed (${i.status}): ${await i.text()}`); let a = await i.json(); if (!a.accessToken) throw Error("token-exchange response missing accessToken"); - let o = (a.expiresIn ?? 1800) * 1e3; - return po = { + let o = (a.expiresIn ?? 1800) * 1e3, s = { token: a.accessToken, expiresAtMs: Date.now() + o - }, po.token; + }; + return Eo().current = s, s.token; +} +function Eo() { + let e = Oo(); + return e[xo] ??= {}, e[xo]; } -function vo() { +function Do() { + let e = Oo()[So]; + if (e) return e; try { - return { + let e = { BASE_URL: "/", DEV: !1, MODE: "production", PROD: !0, SSR: !1 }?.PUBLIC_COMTRYA_OPERATOR_CODE; + return e && (Oo()[So] = e), e; } catch { return; } } +function Oo() { + return globalThis; +} +//#endregion +//#region packages/sdk-core/src/runtime.ts +async function X(e, t, n, r, i = {}) { + let a = `${i.baseUrl ?? ""}/api/ops/${encodeURIComponent(e)}/${encodeURIComponent(t)}/${encodeURIComponent(n)}`, o = { "content-type": "application/json" }, s = i.token ?? await Co(); + s && (o.authorization = `Bearer ${s}`); + try { + let e = await fetch(a, { + method: "POST", + headers: o, + body: JSON.stringify(r ?? null), + signal: i.signal, + credentials: "include" + }); + e.status === 401 && wo(); + let t = await e.text(); + if (!e.ok) { + let n; + try { + n = t ? JSON.parse(t) : void 0; + } catch { + n = void 0; + } + let r = Ao(e.status), i = typeof n?.message == "string" ? n.message : void 0; + return { + ok: !1, + error: { + code: ko(n?.code) ?? r, + message: i ?? (t || e.statusText), + path: n?.path + } + }; + } + return { + ok: !0, + value: t ? JSON.parse(t) : null + }; + } catch (e) { + return { + ok: !1, + error: { + code: "unavailable", + message: e instanceof Error ? e.message : String(e) + } + }; + } +} +function ko(e) { + switch (e) { + case "not-found": + case "conflict": + case "forbidden": + case "unauthenticated": + case "bad-input": + case "internal": + case "unavailable": return e; + default: return; + } +} +function Ao(e) { + switch (e) { + case 400: return "bad-input"; + case 401: return "unauthenticated"; + case 403: return "forbidden"; + case 404: return "not-found"; + case 409: return "conflict"; + case 503: return "unavailable"; + default: return "internal"; + } +} //#endregion //#region packages/sdk-core/src/graphql-client.ts -var yo = { +var jo = { endpoint: "/graphql", credentials: "include", fetchImpl: typeof fetch < "u" ? fetch.bind(globalThis) : (() => { throw Error("no fetch implementation available"); }) -}, bo; -function xo() { - return bo ||= So(yo), bo; +}, Mo; +function No() { + return Mo ||= Po(jo), Mo; } -function So(e) { +function Po(e) { let t = async (t, n) => { - let r = await ho(), i = { "Content-Type": "application/json" }; + let r = await Co(), i = { "Content-Type": "application/json" }; r && (i.Authorization = `Bearer ${r}`); let a = await e.fetchImpl(e.endpoint, { method: "POST", @@ -2999,7 +3099,7 @@ function So(e) { variables: n }) }); - a.status === 401 && go(); + a.status === 401 && wo(); let o; try { o = await a.json(); @@ -3017,52 +3117,52 @@ function So(e) { } //#endregion //#region node_modules/.bun/tinykeys@3.0.0/node_modules/tinykeys/dist/tinykeys.module.js -var Co = [ +var Fo = [ "Shift", "Meta", "Alt", "Control" -], wo = typeof navigator == "object" ? navigator.platform : "", To = /Mac|iPod|iPhone|iPad/.test(wo), Eo = To ? "Meta" : "Control", Do = wo === "Win32" ? ["Control", "Alt"] : To ? ["Alt"] : []; -function Oo(e, t) { - return typeof e.getModifierState == "function" && (e.getModifierState(t) || Do.includes(t) && e.getModifierState("AltGraph")); +], Io = typeof navigator == "object" ? navigator.platform : "", Lo = /Mac|iPod|iPhone|iPad/.test(Io), Ro = Lo ? "Meta" : "Control", zo = Io === "Win32" ? ["Control", "Alt"] : Lo ? ["Alt"] : []; +function Bo(e, t) { + return typeof e.getModifierState == "function" && (e.getModifierState(t) || zo.includes(t) && e.getModifierState("AltGraph")); } -function ko(e) { +function Vo(e) { return e.trim().split(" ").map(function(e) { var t = e.split(/\b\+/), n = t.pop(), r = n.match(/^\((.+)\)$/); return r && (n = RegExp("^" + r[1] + "$")), [t = t.map(function(e) { - return e === "$mod" ? Eo : e; + return e === "$mod" ? Ro : e; }), n]; }); } -function Ao(e, t) { +function Ho(e, t) { var n = t[0], r = t[1]; return !((r instanceof RegExp ? !r.test(e.key) && !r.test(e.code) : r.toUpperCase() !== e.key.toUpperCase() && r !== e.code) || n.find(function(t) { - return !Oo(e, t); - }) || Co.find(function(t) { - return !n.includes(t) && r !== t && Oo(e, t); + return !Bo(e, t); + }) || Fo.find(function(t) { + return !n.includes(t) && r !== t && Bo(e, t); })); } -function jo(e, t) { +function Uo(e, t) { t === void 0 && (t = {}); var n = t.timeout ?? 1e3, r = Object.keys(e).map(function(t) { - return [ko(t), e[t]]; + return [Vo(t), e[t]]; }), i = /* @__PURE__ */ new Map(), a = null; return function(e) { e instanceof KeyboardEvent && (r.forEach(function(t) { var n = t[0], r = t[1], a = i.get(n) || n; - Ao(e, a[0]) ? a.length > 1 ? i.set(n, a.slice(1)) : (i.delete(n), r(e)) : Oo(e, e.key) || i.delete(n); + Ho(e, a[0]) ? a.length > 1 ? i.set(n, a.slice(1)) : (i.delete(n), r(e)) : Bo(e, e.key) || i.delete(n); }), a && clearTimeout(a), a = setTimeout(i.clear.bind(i), n)); }; } -function Mo(e, t, n) { - var r = n === void 0 ? {} : n, i = r.event, a = i === void 0 ? "keydown" : i, o = r.capture, s = jo(t, { timeout: r.timeout }); +function Wo(e, t, n) { + var r = n === void 0 ? {} : n, i = r.event, a = i === void 0 ? "keydown" : i, o = r.capture, s = Uo(t, { timeout: r.timeout }); return e.addEventListener(a, s, o), function() { e.removeEventListener(a, s, o); }; } //#endregion //#region packages/sdk-vue/src/use-shortcuts.ts -function No(e) { +function Go(e) { if (!(e instanceof HTMLElement)) return !1; if (e instanceof HTMLInputElement) { let t = e.type; @@ -3070,303 +3170,2245 @@ function No(e) { } return !!(e instanceof HTMLTextAreaElement || e.isContentEditable); } -function Po(e) { +function Ko(e) { return /Escape/i.test(e) ? !0 : /\$mod|Cmd|Ctrl|Alt|Shift|Meta|Control/i.test(e); } -function Fo(e) { +function qo(e) { let t = {}; for (let [n, r] of Object.entries(e)) { - if (Po(n)) { + if (Ko(n)) { t[n] = r; continue; } t[n] = (e) => { - No(e.target) || r(e); + Go(e.target) || r(e); }; } return t; } -function Io(e, t = {}) { +function Jo(e, t = {}) { if (typeof window > "u") return; - let n = null, r = Fo(e), i = () => { - n ||= Mo(t.target ?? window, r); + let n = null, r = qo(e), i = () => { + n ||= Wo(t.target ?? window, r); }, a = () => { n?.(), n = null; }; - t.enabled ? On(t.enabled, (e) => { + t.enabled ? Nn(t.enabled, (e) => { e ? i() : a(); - }, { immediate: !0 }) : i(), tr(a); + }, { immediate: !0 }) : i(), or(a); } //#endregion -//#region packages/sdk-vue/src/markdown.ts -var Lo = { +//#region node_modules/.bun/marked@18.0.4/node_modules/marked/lib/marked.esm.js +function Yo() { + return { + async: !1, + breaks: !1, + extensions: null, + gfm: !0, + hooks: null, + pedantic: !1, + renderer: null, + silent: !1, + tokenizer: null, + walkTokens: null + }; +} +var Xo = Yo(); +function Zo(e) { + Xo = e; +} +var Qo = { exec: () => null }; +function $o(e) { + let t = []; + return (n) => { + let r = Math.max(0, Math.min(3, n - 1)), i = t[r]; + return i || (i = e(r), t[r] = i), i; + }; +} +function Z(e, t = "") { + let n = typeof e == "string" ? e : e.source, r = { + replace: (e, t) => { + let i = typeof t == "string" ? t : t.source; + return i = i.replace(Q.caret, "$1"), n = n.replace(e, i), r; + }, + getRegex: () => new RegExp(n, t) + }; + return r; +} +var es = ((e = "") => { + try { + return !!RegExp("(?<=1)(?/, + blockquoteSetextReplace: /\n {0,3}((?:=+|-+) *)(?=\n|$)/g, + blockquoteSetextReplace2: /^ {0,3}>[ \t]?/gm, + listReplaceNesting: /^ {1,4}(?=( {4})*[^ ])/g, + listIsTask: /^\[[ xX]\] +\S/, + listReplaceTask: /^\[[ xX]\] +/, + listTaskCheckbox: /\[[ xX]\]/, + anyLine: /\n.*\n/, + hrefBrackets: /^<(.*)>$/, + tableDelimiter: /[:|]/, + tableAlignChars: /^\||\| *$/g, + tableRowBlankLine: /\n[ \t]*$/, + tableAlignRight: /^ *-+: *$/, + tableAlignCenter: /^ *:-+: *$/, + tableAlignLeft: /^ *:-+ *$/, + startATag: /^
    /i, + startPreScriptTag: /^<(pre|code|kbd|script)(\s|>)/i, + endPreScriptTag: /^<\/(pre|code|kbd|script)(\s|>)/i, + startAngleBracket: /^$/, + pedanticHrefTitle: /^([^'"]*[^\s])\s+(['"])(.*)\2/, + unicodeAlphaNumeric: /[\p{L}\p{N}]/u, + escapeTest: /[&<>"']/, + escapeReplace: /[&<>"']/g, + escapeTestNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/, + escapeReplaceNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g, + caret: /(^|[^\[])\^/g, + percentDecode: /%25/g, + findPipe: /\|/g, + splitPipe: / \|/, + slashPipe: /\\\|/g, + carriageReturn: /\r\n|\r/g, + spaceLine: /^ +$/gm, + notSpaceStart: /^\S*/, + endingNewline: /\n$/, + listItemRegex: (e) => RegExp(`^( {0,3}${e})((?:[ ][^\\n]*)?(?:\\n|$))`), + nextBulletRegex: $o((e) => RegExp(`^ {0,${e}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`)), + hrRegex: $o((e) => RegExp(`^ {0,${e}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`)), + fencesBeginRegex: $o((e) => RegExp(`^ {0,${e}}(?:\`\`\`|~~~)`)), + headingBeginRegex: $o((e) => RegExp(`^ {0,${e}}#`)), + htmlBeginRegex: $o((e) => RegExp(`^ {0,${e}}<(?:[a-z].*>|!--)`, "i")), + blockquoteBeginRegex: $o((e) => RegExp(`^ {0,${e}}>`)) +}, ts = /^(?:[ \t]*(?:\n|$))+/, ns = /^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/, rs = /^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/, is = /^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/, as = /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/, os = / {0,3}(?:[*+-]|\d{1,9}[.)])/, ss = /^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/, cs = Z(ss).replace(/bull/g, os).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/\|table/g, "").getRegex(), ls = Z(ss).replace(/bull/g, os).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/table/g, / {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(), us = /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/, ds = /^[^\n]+/, fs = /(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/, ps = Z(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label", fs).replace("title", /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(), ms = Z(/^(bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g, os).getRegex(), hs = "address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul", gs = /|$))/, _s = Z("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))", "i").replace("comment", gs).replace("tag", hs).replace("attribute", / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(), vs = Z(us).replace("hr", is).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("|table", "").replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", hs).getRegex(), ys = { + blockquote: Z(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph", vs).getRegex(), + code: ns, + def: ps, + fences: rs, + heading: as, + hr: is, + html: _s, + lheading: cs, + list: ms, + newline: ts, + paragraph: vs, + table: Qo, + text: ds +}, bs = Z("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr", is).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("blockquote", " {0,3}>").replace("code", "(?: {4}| {0,3} )[^\\n]").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", hs).getRegex(), xs = { + ...ys, + lheading: ls, + table: bs, + paragraph: Z(us).replace("hr", is).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("table", bs).replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", hs).getRegex() +}, Ss = { + ...ys, + html: Z("^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))").replace("comment", gs).replace(/tag/g, "(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(), + def: /^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/, + heading: /^(#{1,6})(.*)(?:\n+|$)/, + fences: Qo, + lheading: /^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/, + paragraph: Z(us).replace("hr", is).replace("heading", " *#{1,6} *[^\n]").replace("lheading", cs).replace("|table", "").replace("blockquote", " {0,3}>").replace("|fences", "").replace("|list", "").replace("|html", "").replace("|tag", "").getRegex() +}, Cs = /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/, ws = /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/, Ts = /^( {2,}|\\)\n(?!\s*$)/, Es = /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\`+)[^`]+\k(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace("precode-", es ? "(?`+)[^`]+\k(?!`)/).replace("html", /<(?! )[^<>]*?>/).getRegex(), Fs = /^(?:\*+(?:((?!\*)punct)|([^\s*]))?)|^_+(?:((?!_)punct)|([^\s_]))?/, Is = Z(Fs, "u").replace(/punct/g, Ds).getRegex(), Ls = Z(Fs, "u").replace(/punct/g, js).getRegex(), Rs = "^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)", zs = Z(Rs, "gu").replace(/notPunctSpace/g, ks).replace(/punctSpace/g, Os).replace(/punct/g, Ds).getRegex(), Bs = Z(Rs, "gu").replace(/notPunctSpace/g, Ns).replace(/punctSpace/g, Ms).replace(/punct/g, js).getRegex(), Vs = Z("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)", "gu").replace(/notPunctSpace/g, ks).replace(/punctSpace/g, Os).replace(/punct/g, Ds).getRegex(), Hs = Z(/^~~?(?:((?!~)punct)|[^\s~])/, "u").replace(/punct/g, Ds).getRegex(), Us = Z("^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)", "gu").replace(/notPunctSpace/g, ks).replace(/punctSpace/g, Os).replace(/punct/g, Ds).getRegex(), Ws = Z(/\\(punct)/, "gu").replace(/punct/g, Ds).getRegex(), Gs = Z(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme", /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email", /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(), Ks = Z(gs).replace("(?:-->|$)", "-->").getRegex(), qs = Z("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment", Ks).replace("attribute", /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(), Js = /(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\])|[^\[\]\\`])*?/, Ys = Z(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]+(?:\n[ \t]*)?|\n[ \t]*)(title))?\s*\)/).replace("label", Js).replace("href", /<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title", /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(), Xs = Z(/^!?\[(label)\]\[(ref)\]/).replace("label", Js).replace("ref", fs).getRegex(), Zs = Z(/^!?\[(ref)\](?:\[\])?/).replace("ref", fs).getRegex(), Qs = Z("reflink|nolink(?!\\()", "g").replace("reflink", Xs).replace("nolink", Zs).getRegex(), $s = /[hH][tT][tT][pP][sS]?|[fF][tT][pP]/, ec = { + _backpedal: Qo, + anyPunctuation: Ws, + autolink: Gs, + blockSkip: Ps, + br: Ts, + code: ws, + del: Qo, + delLDelim: Qo, + delRDelim: Qo, + emStrongLDelim: Is, + emStrongRDelimAst: zs, + emStrongRDelimUnd: Vs, + escape: Cs, + link: Ys, + nolink: Zs, + punctuation: As, + reflink: Xs, + reflinkSearch: Qs, + tag: qs, + text: Es, + url: Qo +}, tc = { + ...ec, + link: Z(/^!?\[(label)\]\((.*?)\)/).replace("label", Js).getRegex(), + reflink: Z(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label", Js).getRegex() +}, nc = { + ...ec, + emStrongRDelimAst: Bs, + emStrongLDelim: Ls, + delLDelim: Hs, + delRDelim: Us, + url: Z(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol", $s).replace("email", /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(), + _backpedal: /(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/, + del: /^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/, + text: Z(/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\": ">", "\"": """, "'": "'" -}; -function Ro(e) { - return e.replace(/[&<>"']/g, (e) => Lo[e] ?? e); +}, sc = (e) => oc[e]; +function cc(e, t) { + if (t) { + if (Q.escapeTest.test(e)) return e.replace(Q.escapeReplace, sc); + } else if (Q.escapeTestNoEncode.test(e)) return e.replace(Q.escapeReplaceNoEncode, sc); + return e; } -var zo = /\bhttps?:\/\/[^\s<]+[^\s<.,;:!?)]/g, Bo = "CODE", Vo = "END"; -function Ho(e, t) { - let n = [], r = e.replace(/`([^`]+)`/g, (e, t) => (n.push("" + t + ""), Bo + (n.length - 1) + Vo)); - if (r = r.replace(zo, (e) => "" + e + ""), t.workspaceId) { - let e = encodeURIComponent(t.workspaceId); - r = r.replace(/(^|[^\w&])#(\d+)\b/g, (t, n, r) => n + "#" + r + ""); - } - r = r.replace(/\*\*([^*]+)\*\*/g, (e, t) => "" + t + ""), r = r.replace(/(^|[^*])\*([^*\s][^*]*?[^*\s]|[^*\s])\*(?!\*)/g, (e, t, n) => t + "" + n + ""); - let i = /* @__PURE__ */ RegExp("CODE(\\d+)END", "g"); - return r.replace(i, (e, t) => n[Number(t)] ?? ""); -} -function Uo(e) { - let t = e.replace(/\r\n?/g, "\n").split("\n"), n = [], r = 0; - for (; r < t.length;) { - let e = t[r] ?? ""; - if (e.trim() === "") { - r += 1; - continue; +function lc(e) { + try { + e = encodeURI(e).replace(Q.percentDecode, "%"); + } catch { + return null; + } + return e; +} +function uc(e, t) { + let n = e.replace(Q.findPipe, (e, t, n) => { + let r = !1, i = t; + for (; --i >= 0 && n[i] === "\\";) r = !r; + return r ? "|" : " |"; + }).split(Q.splitPipe), r = 0; + if (n[0].trim() || n.shift(), n.length > 0 && !n.at(-1)?.trim() && n.pop(), t) if (n.length > t) n.splice(t); + else for (; n.length < t;) n.push(""); + for (; r < n.length; r++) n[r] = n[r].trim().replace(Q.slashPipe, "|"); + return n; +} +function dc(e, t, n) { + let r = e.length; + if (r === 0) return ""; + let i = 0; + for (; i < r;) { + let a = e.charAt(r - i - 1); + if (a === t && !n) i++; + else if (a !== t && n) i++; + else break; + } + return e.slice(0, r - i); +} +function fc(e) { + let t = e.split("\n"), n = t.length - 1; + for (; n >= 0 && Q.blankLine.test(t[n]);) n--; + return t.length - n <= 2 ? e : t.slice(0, n + 1).join("\n"); +} +function pc(e, t) { + if (e.indexOf(t[1]) === -1) return -1; + let n = 0; + for (let r = 0; r < e.length; r++) if (e[r] === "\\") r++; + else if (e[r] === t[0]) n++; + else if (e[r] === t[1] && (n--, n < 0)) return r; + return n > 0 ? -2 : -1; +} +function mc(e, t = 0) { + let n = t, r = ""; + for (let t of e) if (t === " ") { + let e = 4 - n % 4; + r += " ".repeat(e), n += e; + } else r += t, n++; + return r; +} +function hc(e, t, n, r, i) { + let a = t.href, o = t.title || null, s = e[1].replace(i.other.outputLinkReplace, "$1"); + r.state.inLink = !0; + let c = { + type: e[0].charAt(0) === "!" ? "image" : "link", + raw: n, + href: a, + title: o, + text: s, + tokens: r.inlineTokens(s) + }; + return r.state.inLink = !1, c; +} +function gc(e, t, n) { + let r = e.match(n.other.indentCodeCompensation); + if (r === null) return t; + let i = r[1]; + return t.split("\n").map((e) => { + let t = e.match(n.other.beginningSpace); + if (t === null) return e; + let [r] = t; + return r.length >= i.length ? e.slice(i.length) : e; + }).join("\n"); +} +var _c = class { + options; + rules; + lexer; + constructor(e) { + this.options = e || Xo; + } + space(e) { + let t = this.rules.block.newline.exec(e); + if (t && t[0].length > 0) return { + type: "space", + raw: t[0] + }; + } + code(e) { + let t = this.rules.block.code.exec(e); + if (t) { + let e = this.options.pedantic ? t[0] : fc(t[0]); + return { + type: "code", + raw: e, + codeBlockStyle: "indented", + text: e.replace(this.rules.other.codeRemoveIndent, "") + }; } - let i = e.match(/^```(\w*)\s*$/); - if (i) { - let e = (i[1] ?? "").trim(); - r += 1; - let a = []; - for (; r < t.length && !(t[r] ?? "").startsWith("```");) a.push(t[r] ?? ""), r += 1; - r += 1, n.push({ - kind: "code", - lang: e, - text: a.join("\n") - }); - continue; + } + fences(e) { + let t = this.rules.block.fences.exec(e); + if (t) { + let e = t[0], n = gc(e, t[3] || "", this.rules); + return { + type: "code", + raw: e, + lang: t[2] ? t[2].trim().replace(this.rules.inline.anyPunctuation, "$1") : t[2], + text: n + }; } - let a = e.match(/^(#{1,6})\s+(.+?)\s*$/); - if (a) { - n.push({ - kind: "heading", - level: Math.min(6, (a[1] ?? "").length), - text: a[2] ?? "" - }), r += 1; - continue; + } + heading(e) { + let t = this.rules.block.heading.exec(e); + if (t) { + let e = t[2].trim(); + if (this.rules.other.endingHash.test(e)) { + let t = dc(e, "#"); + (this.options.pedantic || !t || this.rules.other.endingSpaceChar.test(t)) && (e = t.trim()); + } + return { + type: "heading", + raw: dc(t[0], "\n"), + depth: t[1].length, + text: e, + tokens: this.lexer.inline(e) + }; } - if (/^\s*[-*]\s+/.test(e)) { - let e = []; - for (; r < t.length && /^\s*[-*]\s+/.test(t[r] ?? "");) e.push((t[r] ?? "").replace(/^\s*[-*]\s+/, "")), r += 1; - n.push({ - kind: "list", - ordered: !1, - text: "", - items: e - }); - continue; + } + hr(e) { + let t = this.rules.block.hr.exec(e); + if (t) return { + type: "hr", + raw: dc(t[0], "\n") + }; + } + blockquote(e) { + let t = this.rules.block.blockquote.exec(e); + if (t) { + let e = dc(t[0], "\n").split("\n"), n = "", r = "", i = []; + for (; e.length > 0;) { + let t = !1, a = [], o; + for (o = 0; o < e.length; o++) if (this.rules.other.blockquoteStart.test(e[o])) a.push(e[o]), t = !0; + else if (!t) a.push(e[o]); + else break; + e = e.slice(o); + let s = a.join("\n"), c = s.replace(this.rules.other.blockquoteSetextReplace, "\n $1").replace(this.rules.other.blockquoteSetextReplace2, ""); + n = n ? `${n} +${s}` : s, r = r ? `${r} +${c}` : c; + let l = this.lexer.state.top; + if (this.lexer.state.top = !0, this.lexer.blockTokens(c, i, !0), this.lexer.state.top = l, e.length === 0) break; + let u = i.at(-1); + if (u?.type === "code") break; + if (u?.type === "blockquote") { + let t = u, a = t.raw + "\n" + e.join("\n"), o = this.blockquote(a); + i[i.length - 1] = o, n = n.substring(0, n.length - t.raw.length) + o.raw, r = r.substring(0, r.length - t.text.length) + o.text; + break; + } else if (u?.type === "list") { + let t = u, a = t.raw + "\n" + e.join("\n"), o = this.list(a); + i[i.length - 1] = o, n = n.substring(0, n.length - u.raw.length) + o.raw, r = r.substring(0, r.length - t.raw.length) + o.raw, e = a.substring(i.at(-1).raw.length).split("\n"); + continue; + } + } + return { + type: "blockquote", + raw: n, + tokens: i, + text: r + }; } - if (/^\s*\d+\.\s+/.test(e)) { - let e = []; - for (; r < t.length && /^\s*\d+\.\s+/.test(t[r] ?? "");) e.push((t[r] ?? "").replace(/^\s*\d+\.\s+/, "")), r += 1; - n.push({ - kind: "list", - ordered: !0, - text: "", - items: e + } + list(e) { + let t = this.rules.block.list.exec(e); + if (t) { + let n = t[1].trim(), r = n.length > 1, i = { + type: "list", + raw: "", + ordered: r, + start: r ? +n.slice(0, -1) : "", + loose: !1, + items: [] + }; + n = r ? `\\d{1,9}\\${n.slice(-1)}` : `\\${n}`, this.options.pedantic && (n = r ? n : "[*+-]"); + let a = this.rules.other.listItemRegex(n), o = !1; + for (; e;) { + let n = !1, r = "", s = ""; + if (!(t = a.exec(e)) || this.rules.block.hr.test(e)) break; + r = t[0], e = e.substring(r.length); + let c = mc(t[2].split("\n", 1)[0], t[1].length), l = e.split("\n", 1)[0], u = !c.trim(), d = 0; + if (this.options.pedantic ? (d = 2, s = c.trimStart()) : u ? d = t[1].length + 1 : (d = c.search(this.rules.other.nonSpaceChar), d = d > 4 ? 1 : d, s = c.slice(d), d += t[1].length), u && this.rules.other.blankLine.test(l) && (r += l + "\n", e = e.substring(l.length + 1), n = !0), !n) { + let t = this.rules.other.nextBulletRegex(d), n = this.rules.other.hrRegex(d), i = this.rules.other.fencesBeginRegex(d), a = this.rules.other.headingBeginRegex(d), o = this.rules.other.htmlBeginRegex(d), f = this.rules.other.blockquoteBeginRegex(d); + for (; e;) { + let p = e.split("\n", 1)[0], m; + if (l = p, this.options.pedantic ? (l = l.replace(this.rules.other.listReplaceNesting, " "), m = l) : m = l.replace(this.rules.other.tabCharGlobal, " "), i.test(l) || a.test(l) || o.test(l) || f.test(l) || t.test(l) || n.test(l)) break; + if (m.search(this.rules.other.nonSpaceChar) >= d || !l.trim()) s += "\n" + m.slice(d); + else { + if (u || c.replace(this.rules.other.tabCharGlobal, " ").search(this.rules.other.nonSpaceChar) >= 4 || i.test(c) || a.test(c) || n.test(c)) break; + s += "\n" + l; + } + u = !l.trim(), r += p + "\n", e = e.substring(p.length + 1), c = m.slice(d); + } + } + i.loose || (o ? i.loose = !0 : this.rules.other.doubleBlankLine.test(r) && (o = !0)), i.items.push({ + type: "list_item", + raw: r, + task: !!this.options.gfm && this.rules.other.listIsTask.test(s), + loose: !1, + text: s, + tokens: [] + }), i.raw += r; + } + let s = i.items.at(-1); + if (s) s.raw = s.raw.trimEnd(), s.text = s.text.trimEnd(); + else return; + i.raw = i.raw.trimEnd(); + for (let e of i.items) { + this.lexer.state.top = !1, e.tokens = this.lexer.blockTokens(e.text, []); + let t = e.tokens[0]; + if (e.task && (t?.type === "text" || t?.type === "paragraph")) { + e.text = e.text.replace(this.rules.other.listReplaceTask, ""), t.raw = t.raw.replace(this.rules.other.listReplaceTask, ""), t.text = t.text.replace(this.rules.other.listReplaceTask, ""); + for (let e = this.lexer.inlineQueue.length - 1; e >= 0; e--) if (this.rules.other.listIsTask.test(this.lexer.inlineQueue[e].src)) { + this.lexer.inlineQueue[e].src = this.lexer.inlineQueue[e].src.replace(this.rules.other.listReplaceTask, ""); + break; + } + let n = this.rules.other.listTaskCheckbox.exec(e.raw); + if (n) { + let t = { + type: "checkbox", + raw: n[0] + " ", + checked: n[0] !== "[ ]" + }; + e.checked = t.checked, i.loose ? e.tokens[0] && ["paragraph", "text"].includes(e.tokens[0].type) && "tokens" in e.tokens[0] && e.tokens[0].tokens ? (e.tokens[0].raw = t.raw + e.tokens[0].raw, e.tokens[0].text = t.raw + e.tokens[0].text, e.tokens[0].tokens.unshift(t)) : e.tokens.unshift({ + type: "paragraph", + raw: t.raw, + text: t.raw, + tokens: [t] + }) : e.tokens.unshift(t); + } + } else e.task &&= !1; + if (!i.loose) { + let t = e.tokens.filter((e) => e.type === "space"); + i.loose = t.length > 0 && t.some((e) => this.rules.other.anyLine.test(e.raw)); + } + } + if (i.loose) for (let e of i.items) { + e.loose = !0; + for (let t of e.tokens) t.type === "text" && (t.type = "paragraph"); + } + return i; + } + } + html(e) { + let t = this.rules.block.html.exec(e); + if (t) { + let e = fc(t[0]); + return { + type: "html", + block: !0, + raw: e, + pre: t[1] === "pre" || t[1] === "script" || t[1] === "style", + text: e + }; + } + } + def(e) { + let t = this.rules.block.def.exec(e); + if (t) { + let e = t[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal, " "), n = t[2] ? t[2].replace(this.rules.other.hrefBrackets, "$1").replace(this.rules.inline.anyPunctuation, "$1") : "", r = t[3] ? t[3].substring(1, t[3].length - 1).replace(this.rules.inline.anyPunctuation, "$1") : t[3]; + return { + type: "def", + tag: e, + raw: dc(t[0], "\n"), + href: n, + title: r + }; + } + } + table(e) { + let t = this.rules.block.table.exec(e); + if (!t || !this.rules.other.tableDelimiter.test(t[2])) return; + let n = uc(t[1]), r = t[2].replace(this.rules.other.tableAlignChars, "").split("|"), i = t[3]?.trim() ? t[3].replace(this.rules.other.tableRowBlankLine, "").split("\n") : [], a = { + type: "table", + raw: dc(t[0], "\n"), + header: [], + align: [], + rows: [] + }; + if (n.length === r.length) { + for (let e of r) this.rules.other.tableAlignRight.test(e) ? a.align.push("right") : this.rules.other.tableAlignCenter.test(e) ? a.align.push("center") : this.rules.other.tableAlignLeft.test(e) ? a.align.push("left") : a.align.push(null); + for (let e = 0; e < n.length; e++) a.header.push({ + text: n[e], + tokens: this.lexer.inline(n[e]), + header: !0, + align: a.align[e] }); - continue; + for (let e of i) a.rows.push(uc(e, a.header.length).map((e, t) => ({ + text: e, + tokens: this.lexer.inline(e), + header: !1, + align: a.align[t] + }))); + return a; } - let o = [e]; - for (r += 1; r < t.length && (t[r] ?? "").trim() !== "" && !/^```/.test(t[r] ?? "") && !/^#{1,6}\s+/.test(t[r] ?? "") && !/^\s*[-*]\s+/.test(t[r] ?? "") && !/^\s*\d+\.\s+/.test(t[r] ?? "");) o.push(t[r] ?? ""), r += 1; - n.push({ - kind: "paragraph", - text: o.join("\n") - }); } - return n; -} -function Wo(e, t = {}) { - if (!e) return ""; - let n = Uo(e), r = []; - for (let e of n) switch (e.kind) { - case "heading": { - let n = e.level ?? 1, i = Ho(Ro(e.text), t); - r.push("" + i + ""); - break; + lheading(e) { + let t = this.rules.block.lheading.exec(e); + if (t) { + let e = t[1].trim(); + return { + type: "heading", + raw: dc(t[0], "\n"), + depth: t[2].charAt(0) === "=" ? 1 : 2, + text: e, + tokens: this.lexer.inline(e) + }; } - case "paragraph": { - let n = Ho(Ro(e.text), t); - r.push("

    " + n.replace(/\n/g, "
    ") + "

    "); - break; + } + paragraph(e) { + let t = this.rules.block.paragraph.exec(e); + if (t) { + let e = t[1].charAt(t[1].length - 1) === "\n" ? t[1].slice(0, -1) : t[1]; + return { + type: "paragraph", + raw: t[0], + text: e, + tokens: this.lexer.inline(e) + }; } - case "code": { - let t = e.lang ? " data-lang=\"" + Ro(e.lang) + "\"" : ""; - r.push("" + Ro(e.text) + ""); - break; + } + text(e) { + let t = this.rules.block.text.exec(e); + if (t) return { + type: "text", + raw: t[0], + text: t[0], + tokens: this.lexer.inline(t[0]) + }; + } + escape(e) { + let t = this.rules.inline.escape.exec(e); + if (t) return { + type: "escape", + raw: t[0], + text: t[1] + }; + } + tag(e) { + let t = this.rules.inline.tag.exec(e); + if (t) return !this.lexer.state.inLink && this.rules.other.startATag.test(t[0]) ? this.lexer.state.inLink = !0 : this.lexer.state.inLink && this.rules.other.endATag.test(t[0]) && (this.lexer.state.inLink = !1), !this.lexer.state.inRawBlock && this.rules.other.startPreScriptTag.test(t[0]) ? this.lexer.state.inRawBlock = !0 : this.lexer.state.inRawBlock && this.rules.other.endPreScriptTag.test(t[0]) && (this.lexer.state.inRawBlock = !1), { + type: "html", + raw: t[0], + inLink: this.lexer.state.inLink, + inRawBlock: this.lexer.state.inRawBlock, + block: !1, + text: t[0] + }; + } + link(e) { + let t = this.rules.inline.link.exec(e); + if (t) { + let e = t[2].trim(); + if (!this.options.pedantic && this.rules.other.startAngleBracket.test(e)) { + if (!this.rules.other.endAngleBracket.test(e)) return; + let t = dc(e.slice(0, -1), "\\"); + if ((e.length - t.length) % 2 == 0) return; + } else { + let e = pc(t[2], "()"); + if (e === -2) return; + if (e > -1) { + let n = (t[0].indexOf("!") === 0 ? 5 : 4) + t[1].length + e; + t[2] = t[2].substring(0, e), t[0] = t[0].substring(0, n).trim(), t[3] = ""; + } + } + let n = t[2], r = ""; + if (this.options.pedantic) { + let e = this.rules.other.pedanticHrefTitle.exec(n); + e && (n = e[1], r = e[3]); + } else r = t[3] ? t[3].slice(1, -1) : ""; + return n = n.trim(), this.rules.other.startAngleBracket.test(n) && (n = this.options.pedantic && !this.rules.other.endAngleBracket.test(e) ? n.slice(1) : n.slice(1, -1)), hc(t, { + href: n && n.replace(this.rules.inline.anyPunctuation, "$1"), + title: r && r.replace(this.rules.inline.anyPunctuation, "$1") + }, t[0], this.lexer, this.rules); } - case "list": { - let n = e.ordered ? "ol" : "ul", i = (e.items ?? []).map((e) => "
  • " + Ho(Ro(e), t) + "
  • ").join("\n"); - r.push("<" + n + ">\n" + i + "\n"); - break; + } + reflink(e, t) { + let n; + if ((n = this.rules.inline.reflink.exec(e)) || (n = this.rules.inline.nolink.exec(e))) { + let e = t[(n[2] || n[1]).replace(this.rules.other.multipleSpaceGlobal, " ").toLowerCase()]; + if (!e) { + let e = n[0].charAt(0); + return { + type: "text", + raw: e, + text: e + }; + } + return hc(n, e, n[0], this.lexer, this.rules); } } - return r.join("\n"); -} -function Go(e, t = 280) { - let n = e.replace(/\s+/g, " ").trim(); - return n.length <= t ? n : n.slice(0, t) + "…"; -} -//#endregion -//#region packages/sdk-vue/src/index.ts -function Ko(e) { - qo(e.tagName, e.component); - let t = /* @__PURE__ */ Za(e.component, { shadowRoot: e.shadowRoot ?? !1 }); - for (let [n, r] of Object.entries(e.propertyAliases ?? {})) Object.defineProperty(t.prototype, n, { - configurable: !0, - get() { - return this[r]; - }, - set(e) { - this[r] = e, typeof e == "string" && this.setAttribute(Yo(r), e); + emStrong(e, t, n = "") { + let r = this.rules.inline.emStrongLDelim.exec(e); + if (!(!r || !r[1] && !r[2] && !r[3] && !r[4] || r[4] && n.match(this.rules.other.unicodeAlphaNumeric)) && (!(r[1] || r[3]) || !n || this.rules.inline.punctuation.exec(n))) { + let n = [...r[0]].length - 1, i, a, o = n, s = 0, c = r[0][0] === "*" ? this.rules.inline.emStrongRDelimAst : this.rules.inline.emStrongRDelimUnd; + for (c.lastIndex = 0, t = t.slice(-1 * e.length + n); (r = c.exec(t)) !== null;) { + if (i = r[1] || r[2] || r[3] || r[4] || r[5] || r[6], !i) continue; + if (a = [...i].length, r[3] || r[4]) { + o += a; + continue; + } else if ((r[5] || r[6]) && n % 3 && !((n + a) % 3)) { + s += a; + continue; + } + if (o -= a, o > 0) continue; + a = Math.min(a, a + o + s); + let t = [...r[0]][0].length, c = e.slice(0, n + r.index + t + a); + if (Math.min(n, a) % 2) { + let e = c.slice(1, -1); + return { + type: "em", + raw: c, + text: e, + tokens: this.lexer.inlineTokens(e) + }; + } + let l = c.slice(2, -2); + return { + type: "strong", + raw: c, + text: l, + tokens: this.lexer.inlineTokens(l) + }; + } } - }); - return typeof customElements < "u" && !customElements.get(e.tagName) && customElements.define(e.tagName, t), t; -} -function qo(e, t) { - if (typeof document > "u") return; - let n = Jo(t); - if (n.length === 0) return; - let r = `comtrya-widget-styles:${e}`; - if (document.head.querySelector(`style[data-comtrya-widget-styles="${r}"]`)) return; - let i = document.createElement("style"); - i.dataset.comtryaWidgetStyles = r, i.textContent = n.join("\n"), document.head.append(i); -} -function Jo(e) { - if (!e || typeof e != "object") return []; - let t = e.styles; - return Array.isArray(t) ? t.filter((e) => typeof e == "string") : []; -} -function Yo(e) { + } + codespan(e) { + let t = this.rules.inline.code.exec(e); + if (t) { + let e = t[2].replace(this.rules.other.newLineCharGlobal, " "), n = this.rules.other.nonSpaceChar.test(e), r = this.rules.other.startingSpaceChar.test(e) && this.rules.other.endingSpaceChar.test(e); + return n && r && (e = e.substring(1, e.length - 1)), { + type: "codespan", + raw: t[0], + text: e + }; + } + } + br(e) { + let t = this.rules.inline.br.exec(e); + if (t) return { + type: "br", + raw: t[0] + }; + } + del(e, t, n = "") { + let r = this.rules.inline.delLDelim.exec(e); + if (r && (!r[1] || !n || this.rules.inline.punctuation.exec(n))) { + let n = [...r[0]].length - 1, i, a, o = n, s = this.rules.inline.delRDelim; + for (s.lastIndex = 0, t = t.slice(-1 * e.length + n); (r = s.exec(t)) !== null;) { + if (i = r[1] || r[2] || r[3] || r[4] || r[5] || r[6], !i || (a = [...i].length, a !== n)) continue; + if (r[3] || r[4]) { + o += a; + continue; + } + if (o -= a, o > 0) continue; + a = Math.min(a, a + o); + let t = [...r[0]][0].length, s = e.slice(0, n + r.index + t + a), c = s.slice(n, -n); + return { + type: "del", + raw: s, + text: c, + tokens: this.lexer.inlineTokens(c) + }; + } + } + } + autolink(e) { + let t = this.rules.inline.autolink.exec(e); + if (t) { + let e, n; + return t[2] === "@" ? (e = t[1], n = "mailto:" + e) : (e = t[1], n = e), { + type: "link", + raw: t[0], + text: e, + href: n, + tokens: [{ + type: "text", + raw: e, + text: e + }] + }; + } + } + url(e) { + let t; + if (t = this.rules.inline.url.exec(e)) { + let e, n; + if (t[2] === "@") e = t[0], n = "mailto:" + e; + else { + let r; + do + r = t[0], t[0] = this.rules.inline._backpedal.exec(t[0])?.[0] ?? ""; + while (r !== t[0]); + e = t[0], n = t[1] === "www." ? "http://" + t[0] : t[0]; + } + return { + type: "link", + raw: t[0], + text: e, + href: n, + tokens: [{ + type: "text", + raw: e, + text: e + }] + }; + } + } + inlineText(e) { + let t = this.rules.inline.text.exec(e); + if (t) { + let e = this.lexer.state.inRawBlock; + return { + type: "text", + raw: t[0], + text: t[0], + escaped: e + }; + } + } +}, vc = class e { + tokens; + options; + state; + inlineQueue; + tokenizer; + constructor(e) { + this.tokens = [], this.tokens.links = Object.create(null), this.options = e || Xo, this.options.tokenizer = this.options.tokenizer || new _c(), this.tokenizer = this.options.tokenizer, this.tokenizer.options = this.options, this.tokenizer.lexer = this, this.inlineQueue = [], this.state = { + inLink: !1, + inRawBlock: !1, + top: !0 + }; + let t = { + other: Q, + block: ic.normal, + inline: ac.normal + }; + this.options.pedantic ? (t.block = ic.pedantic, t.inline = ac.pedantic) : this.options.gfm && (t.block = ic.gfm, this.options.breaks ? t.inline = ac.breaks : t.inline = ac.gfm), this.tokenizer.rules = t; + } + static get rules() { + return { + block: ic, + inline: ac + }; + } + static lex(t, n) { + return new e(n).lex(t); + } + static lexInline(t, n) { + return new e(n).inlineTokens(t); + } + lex(e) { + e = e.replace(Q.carriageReturn, "\n"), this.blockTokens(e, this.tokens); + for (let e = 0; e < this.inlineQueue.length; e++) { + let t = this.inlineQueue[e]; + this.inlineTokens(t.src, t.tokens); + } + return this.inlineQueue = [], this.tokens; + } + blockTokens(e, t = [], n = !1) { + this.tokenizer.lexer = this, this.options.pedantic && (e = e.replace(Q.tabCharGlobal, " ").replace(Q.spaceLine, "")); + let r = Infinity; + for (; e;) { + if (e.length < r) r = e.length; + else { + this.infiniteLoopError(e.charCodeAt(0)); + break; + } + let i; + if (this.options.extensions?.block?.some((n) => (i = n.call({ lexer: this }, e, t)) ? (e = e.substring(i.raw.length), t.push(i), !0) : !1)) continue; + if (i = this.tokenizer.space(e)) { + e = e.substring(i.raw.length); + let n = t.at(-1); + i.raw.length === 1 && n !== void 0 ? n.raw += "\n" : t.push(i); + continue; + } + if (i = this.tokenizer.code(e)) { + e = e.substring(i.raw.length); + let n = t.at(-1); + n?.type === "paragraph" || n?.type === "text" ? (n.raw += (n.raw.endsWith("\n") ? "" : "\n") + i.raw, n.text += "\n" + i.text, this.inlineQueue.at(-1).src = n.text) : t.push(i); + continue; + } + if (i = this.tokenizer.fences(e)) { + e = e.substring(i.raw.length), t.push(i); + continue; + } + if (i = this.tokenizer.heading(e)) { + e = e.substring(i.raw.length), t.push(i); + continue; + } + if (i = this.tokenizer.hr(e)) { + e = e.substring(i.raw.length), t.push(i); + continue; + } + if (i = this.tokenizer.blockquote(e)) { + e = e.substring(i.raw.length), t.push(i); + continue; + } + if (i = this.tokenizer.list(e)) { + e = e.substring(i.raw.length), t.push(i); + continue; + } + if (i = this.tokenizer.html(e)) { + e = e.substring(i.raw.length), t.push(i); + continue; + } + if (i = this.tokenizer.def(e)) { + e = e.substring(i.raw.length); + let n = t.at(-1); + n?.type === "paragraph" || n?.type === "text" ? (n.raw += (n.raw.endsWith("\n") ? "" : "\n") + i.raw, n.text += "\n" + i.raw, this.inlineQueue.at(-1).src = n.text) : this.tokens.links[i.tag] || (this.tokens.links[i.tag] = { + href: i.href, + title: i.title + }, t.push(i)); + continue; + } + if (i = this.tokenizer.table(e)) { + e = e.substring(i.raw.length), t.push(i); + continue; + } + if (i = this.tokenizer.lheading(e)) { + e = e.substring(i.raw.length), t.push(i); + continue; + } + let a = e; + if (this.options.extensions?.startBlock) { + let t = Infinity, n = e.slice(1), r; + this.options.extensions.startBlock.forEach((e) => { + r = e.call({ lexer: this }, n), typeof r == "number" && r >= 0 && (t = Math.min(t, r)); + }), t < Infinity && t >= 0 && (a = e.substring(0, t + 1)); + } + if (this.state.top && (i = this.tokenizer.paragraph(a))) { + let r = t.at(-1); + n && r?.type === "paragraph" ? (r.raw += (r.raw.endsWith("\n") ? "" : "\n") + i.raw, r.text += "\n" + i.text, this.inlineQueue.pop(), this.inlineQueue.at(-1).src = r.text) : t.push(i), n = a.length !== e.length, e = e.substring(i.raw.length); + continue; + } + if (i = this.tokenizer.text(e)) { + e = e.substring(i.raw.length); + let n = t.at(-1); + n?.type === "text" ? (n.raw += (n.raw.endsWith("\n") ? "" : "\n") + i.raw, n.text += "\n" + i.text, this.inlineQueue.pop(), this.inlineQueue.at(-1).src = n.text) : t.push(i); + continue; + } + if (e) { + this.infiniteLoopError(e.charCodeAt(0)); + break; + } + } + return this.state.top = !0, t; + } + inline(e, t = []) { + return this.inlineQueue.push({ + src: e, + tokens: t + }), t; + } + inlineTokens(e, t = []) { + this.tokenizer.lexer = this; + let n = e, r = null; + if (this.tokens.links) { + let e = Object.keys(this.tokens.links); + if (e.length > 0) for (; (r = this.tokenizer.rules.inline.reflinkSearch.exec(n)) !== null;) e.includes(r[0].slice(r[0].lastIndexOf("[") + 1, -1)) && (n = n.slice(0, r.index) + "[" + "a".repeat(r[0].length - 2) + "]" + n.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex)); + } + for (; (r = this.tokenizer.rules.inline.anyPunctuation.exec(n)) !== null;) n = n.slice(0, r.index) + "++" + n.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex); + let i; + for (; (r = this.tokenizer.rules.inline.blockSkip.exec(n)) !== null;) i = r[2] ? r[2].length : 0, n = n.slice(0, r.index + i) + "[" + "a".repeat(r[0].length - i - 2) + "]" + n.slice(this.tokenizer.rules.inline.blockSkip.lastIndex); + n = this.options.hooks?.emStrongMask?.call({ lexer: this }, n) ?? n; + let a = !1, o = "", s = Infinity; + for (; e;) { + if (e.length < s) s = e.length; + else { + this.infiniteLoopError(e.charCodeAt(0)); + break; + } + a || (o = ""), a = !1; + let r; + if (this.options.extensions?.inline?.some((n) => (r = n.call({ lexer: this }, e, t)) ? (e = e.substring(r.raw.length), t.push(r), !0) : !1)) continue; + if (r = this.tokenizer.escape(e)) { + e = e.substring(r.raw.length), t.push(r); + continue; + } + if (r = this.tokenizer.tag(e)) { + e = e.substring(r.raw.length), t.push(r); + continue; + } + if (r = this.tokenizer.link(e)) { + e = e.substring(r.raw.length), t.push(r); + continue; + } + if (r = this.tokenizer.reflink(e, this.tokens.links)) { + e = e.substring(r.raw.length); + let n = t.at(-1); + r.type === "text" && n?.type === "text" ? (n.raw += r.raw, n.text += r.text) : t.push(r); + continue; + } + if (r = this.tokenizer.emStrong(e, n, o)) { + e = e.substring(r.raw.length), t.push(r); + continue; + } + if (r = this.tokenizer.codespan(e)) { + e = e.substring(r.raw.length), t.push(r); + continue; + } + if (r = this.tokenizer.br(e)) { + e = e.substring(r.raw.length), t.push(r); + continue; + } + if (r = this.tokenizer.del(e, n, o)) { + e = e.substring(r.raw.length), t.push(r); + continue; + } + if (r = this.tokenizer.autolink(e)) { + e = e.substring(r.raw.length), t.push(r); + continue; + } + if (!this.state.inLink && (r = this.tokenizer.url(e))) { + e = e.substring(r.raw.length), t.push(r); + continue; + } + let i = e; + if (this.options.extensions?.startInline) { + let t = Infinity, n = e.slice(1), r; + this.options.extensions.startInline.forEach((e) => { + r = e.call({ lexer: this }, n), typeof r == "number" && r >= 0 && (t = Math.min(t, r)); + }), t < Infinity && t >= 0 && (i = e.substring(0, t + 1)); + } + if (r = this.tokenizer.inlineText(i)) { + e = e.substring(r.raw.length), r.raw.slice(-1) !== "_" && (o = r.raw.slice(-1)), a = !0; + let n = t.at(-1); + n?.type === "text" ? (n.raw += r.raw, n.text += r.text) : t.push(r); + continue; + } + if (e) { + this.infiniteLoopError(e.charCodeAt(0)); + break; + } + } + return t; + } + infiniteLoopError(e) { + let t = "Infinite loop on byte: " + e; + if (this.options.silent) console.error(t); + else throw Error(t); + } +}, yc = class { + options; + parser; + constructor(e) { + this.options = e || Xo; + } + space(e) { + return ""; + } + code({ text: e, lang: t, escaped: n }) { + let r = (t || "").match(Q.notSpaceStart)?.[0], i = e.replace(Q.endingNewline, "") + "\n"; + return r ? "
    " + (n ? i : cc(i, !0)) + "
    \n" : "
    " + (n ? i : cc(i, !0)) + "
    \n"; + } + blockquote({ tokens: e }) { + return `
    +${this.parser.parse(e)}
    +`; + } + html({ text: e }) { + return e; + } + def(e) { + return ""; + } + heading({ tokens: e, depth: t }) { + return `${this.parser.parseInline(e)} +`; + } + hr(e) { + return "
    \n"; + } + list(e) { + let t = e.ordered, n = e.start, r = ""; + for (let t = 0; t < e.items.length; t++) { + let n = e.items[t]; + r += this.listitem(n); + } + let i = t ? "ol" : "ul", a = t && n !== 1 ? " start=\"" + n + "\"" : ""; + return "<" + i + a + ">\n" + r + "\n"; + } + listitem(e) { + return `
  • ${this.parser.parse(e.tokens)}
  • +`; + } + checkbox({ checked: e }) { + return " "; + } + paragraph({ tokens: e }) { + return `

    ${this.parser.parseInline(e)}

    +`; + } + table(e) { + let t = "", n = ""; + for (let t = 0; t < e.header.length; t++) n += this.tablecell(e.header[t]); + t += this.tablerow({ text: n }); + let r = ""; + for (let t = 0; t < e.rows.length; t++) { + let i = e.rows[t]; + n = ""; + for (let e = 0; e < i.length; e++) n += this.tablecell(i[e]); + r += this.tablerow({ text: n }); + } + return r &&= `${r}`, "\n\n" + t + "\n" + r + "
    \n"; + } + tablerow({ text: e }) { + return ` +${e} +`; + } + tablecell(e) { + let t = this.parser.parseInline(e.tokens), n = e.header ? "th" : "td"; + return (e.align ? `<${n} align="${e.align}">` : `<${n}>`) + t + ` +`; + } + strong({ tokens: e }) { + return `${this.parser.parseInline(e)}`; + } + em({ tokens: e }) { + return `${this.parser.parseInline(e)}`; + } + codespan({ text: e }) { + return `${cc(e, !0)}`; + } + br(e) { + return "
    "; + } + del({ tokens: e }) { + return `${this.parser.parseInline(e)}`; + } + link({ href: e, title: t, tokens: n }) { + let r = this.parser.parseInline(n), i = lc(e); + if (i === null) return r; + e = i; + let a = "", a; + } + image({ href: e, title: t, text: n, tokens: r }) { + r && (n = this.parser.parseInline(r, this.parser.textRenderer)); + let i = lc(e); + if (i === null) return cc(n); + e = i; + let a = `${cc(n)} { + let i = e[r].flat(Infinity); + n = n.concat(this.walkTokens(i, t)); + }) : e.tokens && (n = n.concat(this.walkTokens(e.tokens, t))); + } + } + return n; + } + use(...e) { + let t = this.defaults.extensions || { + renderers: {}, + childTokens: {} + }; + return e.forEach((e) => { + let n = { ...e }; + if (n.async = this.defaults.async || n.async || !1, e.extensions && (e.extensions.forEach((e) => { + if (!e.name) throw Error("extension name required"); + if ("renderer" in e) { + let n = t.renderers[e.name]; + n ? t.renderers[e.name] = function(...t) { + let r = e.renderer.apply(this, t); + return r === !1 && (r = n.apply(this, t)), r; + } : t.renderers[e.name] = e.renderer; + } + if ("tokenizer" in e) { + if (!e.level || e.level !== "block" && e.level !== "inline") throw Error("extension level must be 'block' or 'inline'"); + let n = t[e.level]; + n ? n.unshift(e.tokenizer) : t[e.level] = [e.tokenizer], e.start && (e.level === "block" ? t.startBlock ? t.startBlock.push(e.start) : t.startBlock = [e.start] : e.level === "inline" && (t.startInline ? t.startInline.push(e.start) : t.startInline = [e.start])); + } + "childTokens" in e && e.childTokens && (t.childTokens[e.name] = e.childTokens); + }), n.extensions = t), e.renderer) { + let t = this.defaults.renderer || new yc(this.defaults); + for (let n in e.renderer) { + if (!(n in t)) throw Error(`renderer '${n}' does not exist`); + if (["options", "parser"].includes(n)) continue; + let r = n, i = e.renderer[r], a = t[r]; + t[r] = (...e) => { + let n = i.apply(t, e); + return n === !1 && (n = a.apply(t, e)), n || ""; + }; + } + n.renderer = t; + } + if (e.tokenizer) { + let t = this.defaults.tokenizer || new _c(this.defaults); + for (let n in e.tokenizer) { + if (!(n in t)) throw Error(`tokenizer '${n}' does not exist`); + if ([ + "options", + "rules", + "lexer" + ].includes(n)) continue; + let r = n, i = e.tokenizer[r], a = t[r]; + t[r] = (...e) => { + let n = i.apply(t, e); + return n === !1 && (n = a.apply(t, e)), n; + }; + } + n.tokenizer = t; + } + if (e.hooks) { + let t = this.defaults.hooks || new Sc(); + for (let n in e.hooks) { + if (!(n in t)) throw Error(`hook '${n}' does not exist`); + if (["options", "block"].includes(n)) continue; + let r = n, i = e.hooks[r], a = t[r]; + Sc.passThroughHooks.has(n) ? t[r] = (e) => { + if (this.defaults.async && Sc.passThroughHooksRespectAsync.has(n)) return (async () => { + let n = await i.call(t, e); + return a.call(t, n); + })(); + let r = i.call(t, e); + return a.call(t, r); + } : t[r] = (...e) => { + if (this.defaults.async) return (async () => { + let n = await i.apply(t, e); + return n === !1 && (n = await a.apply(t, e)), n; + })(); + let n = i.apply(t, e); + return n === !1 && (n = a.apply(t, e)), n; + }; + } + n.hooks = t; + } + if (e.walkTokens) { + let t = this.defaults.walkTokens, r = e.walkTokens; + n.walkTokens = function(e) { + let n = []; + return n.push(r.call(this, e)), t && (n = n.concat(t.call(this, e))), n; + }; + } + this.defaults = { + ...this.defaults, + ...n + }; + }), this; + } + setOptions(e) { + return this.defaults = { + ...this.defaults, + ...e + }, this; + } + lexer(e, t) { + return vc.lex(e, t ?? this.defaults); + } + parser(e, t) { + return xc.parse(e, t ?? this.defaults); + } + parseMarkdown(e) { + return (t, n) => { + let r = { ...n }, i = { + ...this.defaults, + ...r + }, a = this.onError(!!i.silent, !!i.async); + if (this.defaults.async === !0 && r.async === !1) return a(/* @__PURE__ */ Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.")); + if (typeof t > "u" || t === null) return a(/* @__PURE__ */ Error("marked(): input parameter is undefined or null")); + if (typeof t != "string") return a(/* @__PURE__ */ Error("marked(): input parameter is of type " + Object.prototype.toString.call(t) + ", string expected")); + if (i.hooks && (i.hooks.options = i, i.hooks.block = e), i.async) return (async () => { + let n = i.hooks ? await i.hooks.preprocess(t) : t, r = await (i.hooks ? await i.hooks.provideLexer(e) : e ? vc.lex : vc.lexInline)(n, i), a = i.hooks ? await i.hooks.processAllTokens(r) : r; + i.walkTokens && await Promise.all(this.walkTokens(a, i.walkTokens)); + let o = await (i.hooks ? await i.hooks.provideParser(e) : e ? xc.parse : xc.parseInline)(a, i); + return i.hooks ? await i.hooks.postprocess(o) : o; + })().catch(a); + try { + i.hooks && (t = i.hooks.preprocess(t)); + let n = (i.hooks ? i.hooks.provideLexer(e) : e ? vc.lex : vc.lexInline)(t, i); + i.hooks && (n = i.hooks.processAllTokens(n)), i.walkTokens && this.walkTokens(n, i.walkTokens); + let r = (i.hooks ? i.hooks.provideParser(e) : e ? xc.parse : xc.parseInline)(n, i); + return i.hooks && (r = i.hooks.postprocess(r)), r; + } catch (e) { + return a(e); + } + }; + } + onError(e, t) { + return (n) => { + if (n.message += "\nPlease report this to https://github.com/markedjs/marked.", e) { + let e = "

    An error occurred:

    " + cc(n.message + "", !0) + "
    "; + return t ? Promise.resolve(e) : e; + } + if (t) return Promise.reject(n); + throw n; + }; + } +}, wc = new Cc(); +function $(e, t) { + return wc.parse(e, t); +} +$.options = $.setOptions = function(e) { + return wc.setOptions(e), $.defaults = wc.defaults, Zo($.defaults), $; +}, $.getDefaults = Yo, $.defaults = Xo, $.use = function(...e) { + return wc.use(...e), $.defaults = wc.defaults, Zo($.defaults), $; +}, $.walkTokens = function(e, t) { + return wc.walkTokens(e, t); +}, $.parseInline = wc.parseInline, $.Parser = xc, $.parser = xc.parse, $.Renderer = yc, $.TextRenderer = bc, $.Lexer = vc, $.lexer = vc.lex, $.Tokenizer = _c, $.Hooks = Sc, $.parse = $, $.options, $.setOptions, $.use, $.walkTokens, $.parseInline, xc.parse, vc.lex; +//#endregion +//#region packages/sdk-vue/src/markdown.ts +var Tc = new Set(/* @__PURE__ */ "h1.h2.h3.h4.h5.h6.p.ul.ol.li.strong.em.b.i.code.pre.a.img.br.hr.blockquote.table.thead.tbody.tfoot.tr.th.td.dl.dt.dd.details.summary.sup.sub.del.ins.s.mark.abbr.cite.q.figure.figcaption.caption.span.div.section.article.aside.header.footer.nav.main".split(".")), Ec = new Set([ + "class", + "id", + "title", + "lang", + "dir", + "tabindex", + "aria-label", + "aria-hidden", + "aria-expanded", + "aria-controls", + "role", + "data-lang" +]), Dc = { + a: new Set([ + "href", + "rel", + "target" + ]), + img: new Set([ + "src", + "alt", + "width", + "height", + "loading" + ]), + th: new Set([ + "colspan", + "rowspan", + "scope" + ]), + td: new Set(["colspan", "rowspan"]) +}, Oc = /^\s*(?:javascript|vbscript|data)\s*:/i; +function kc(e) { + return !Oc.test(e); +} +function Ac(e) { + return e.replace(/&/g, "&").replace(/"/g, """).replace(//g, ">"); +} +function jc(e, t) { + if (!t.trim()) return ""; + let n = [], r = /\s+([a-zA-Z][a-zA-Z0-9_:-]*)(?:\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s"'`=>]+)))?/g, i, a = !1, o = []; + for (; (i = r.exec(t)) !== null;) { + let t = (i[1] ?? "").toLowerCase(), n = i[2] ?? i[3] ?? i[4] ?? ""; + if (t.startsWith("on")) continue; + let r = Dc[e]; + (Ec.has(t) || r && r.has(t)) && ((t === "href" || t === "src") && !kc(n) || (t === "rel" && (a = !0), o.push({ + name: t, + value: n + }))); + } + for (let { name: e, value: t } of o) n.push(" " + e + "=\"" + Ac(t) + "\""); + return e === "a" && !a && n.push(" rel=\"noopener noreferrer\""), n.join(""); +} +var Mc = [ + "script", + "style", + "iframe", + "frame", + "frameset", + "object", + "embed", + "form", + "select", + "textarea", + "svg", + "math" +], Nc = new Set([ + "input", + "button", + "meta", + "link", + "base", + "applet" +]); +function Pc(e) { + let t = e; + for (let e of Mc) { + let n = RegExp("<" + e + "(\\s[^>]*)?>([\\s\\S]*?)<\\/" + e + ">", "gi"); + t = t.replace(n, ""); + let r = RegExp("<" + e + "(\\s[^>]*)?>", "gi"); + t = t.replace(r, ""); + let i = RegExp("<\\/" + e + ">", "gi"); + t = t.replace(i, ""); + } + return t = t.replace(/<(\/?)([a-zA-Z][a-zA-Z0-9-]*)(\s[^>]*)?(\/?)>/g, (e, t, n, r, i) => { + let a = n.toLowerCase(); + if (Nc.has(a) || !Tc.has(a)) return ""; + let o = jc(a, r ?? ""), s = i ? " /" : ""; + return "<" + t + a + o + s + ">"; + }), t; +} +function Fc(e, t) { + let n = encodeURIComponent(t); + return e.split(/(]*>[\s\S]*?<\/code>)/).map((e, t) => t % 2 == 1 ? e : e.replace(/(^|[^\w&])#(\d+)\b/g, (e, t, r) => t + "
    #" + r + "")).join(""); +} +function Ic(e, t = {}) { + if (!e) return ""; + let n = Pc(new Cc().parse(e, { async: !1 })); + return t.workspaceId && (n = Fc(n, t.workspaceId)), n; +} +function Lc(e, t = 280) { + let n = e.replace(/\s+/g, " ").trim(); + return n.length <= t ? n : n.slice(0, t) + "…"; +} +//#endregion +//#region packages/sdk-vue/src/parse-query.ts +function Rc(e, t) { + let n = {}, r = /* @__PURE__ */ new Set(), i = [], a = new Set(t); + if (!e || !e.trim()) return { + text: "", + filters: n, + unknown: [] + }; + let o = zc(e); + for (let e of o) { + if (e.kind === "plain") { + i.push(e.text); + continue; + } + e.value && (a.has(e.key) ? (n[e.key] ?? (n[e.key] = [])).push(e.value) : r.add(e.key)); + } + return { + text: i.join(" "), + filters: n, + unknown: Array.from(r) + }; +} +function zc(e) { + let t = [], n = e.length, r = 0; + for (; r < n;) { + for (; r < n && Bc(e.charCodeAt(r));) r += 1; + if (r >= n) break; + let i = r, a = -1; + for (; r < n && !Bc(e.charCodeAt(r));) { + if (e.charCodeAt(r) === 58 && a === -1 && (a = r, r + 1 < n && e.charCodeAt(r + 1) === 34)) { + for (r += 2; r < n && e.charCodeAt(r) !== 34;) r += 1; + r < n && (r += 1); + break; + } + r += 1; + } + let o = e.slice(i, r); + if (a > i) { + let n = e.slice(i, a); + if (Vc(n)) { + let i = n.toLowerCase(), o = a + 1, s = e.slice(o, r); + s.startsWith("\"") && s.endsWith("\"") && s.length >= 2 && (s = s.slice(1, -1)), t.push({ + kind: "kv", + key: i, + value: s + }); + continue; + } + } + t.push({ + kind: "plain", + text: o + }); + } + return t; +} +function Bc(e) { + return e === 32 || e === 9 || e === 10 || e === 13; +} +function Vc(e) { + if (e.length === 0 || !Hc(e.charCodeAt(0))) return !1; + for (let t = 1; t < e.length; t += 1) { + let n = e.charCodeAt(t); + if (!Hc(n) && !Uc(n) && n !== 95 && n !== 45) return !1; + } + return !0; +} +function Hc(e) { + return e >= 65 && e <= 90 || e >= 97 && e <= 122; +} +function Uc(e) { + return e >= 48 && e <= 57; +} +//#endregion +//#region packages/sdk-vue/src/index.ts +function Wc(e) { + Gc(e.tagName, e.component); + let t = /* @__PURE__ */ $a(e.component, { shadowRoot: e.shadowRoot ?? !1 }); + for (let [n, r] of Object.entries(e.propertyAliases ?? {})) Object.defineProperty(t.prototype, n, { + configurable: !0, + get() { + return this[r]; + }, + set(e) { + this[r] = e, typeof e == "string" && this.setAttribute(qc(r), e); + } + }); + return typeof customElements < "u" && !customElements.get(e.tagName) && customElements.define(e.tagName, t), t; +} +function Gc(e, t) { + if (typeof document > "u") return; + let n = Kc(t); + if (n.length === 0) return; + let r = `comtrya-widget-styles:${e}`; + if (document.head.querySelector(`style[data-comtrya-widget-styles="${r}"]`)) return; + let i = document.createElement("style"); + i.dataset.comtryaWidgetStyles = r, i.textContent = n.join("\n"), document.head.append(i); +} +function Kc(e) { + if (!e || typeof e != "object") return []; + let t = e.styles; + return Array.isArray(t) ? t.filter((e) => typeof e == "string") : []; +} +function qc(e) { return e.replace(/[A-Z]/g, (e) => `-${e.toLowerCase()}`); } //#endregion +//#region ../extensions/first-party/ext_docs/dist/ext_docs.client.ts +var Jc = { + ping: async (e) => X("ext_docs", "docs", "ping", e), + summarizeDoc: async (e) => X("ext_docs", "docs", "summarize-doc", e), + summarizeCatalog: async (e) => X("ext_docs", "docs", "summarize-catalog", e), + typeBoard: async (e) => X("ext_docs", "docs", "type-board", e), + statusBoard: async (e) => X("ext_docs", "docs", "status-board", e), + ownerBoard: async (e) => X("ext_docs", "docs", "owner-board", e), + tagBoard: async (e) => X("ext_docs", "docs", "tag-board", e), + projectBoard: async (e) => X("ext_docs", "docs", "project-board", e), + summarizeScenarios: async (e) => X("ext_docs", "docs", "summarize-scenarios", e), + scenarioBoard: async (e) => X("ext_docs", "docs", "scenario-board", e), + summarizeChecklists: async (e) => X("ext_docs", "docs", "summarize-checklists", e), + summarizeReferences: async (e) => X("ext_docs", "docs", "summarize-references", e), + traceabilityBoard: async (e) => X("ext_docs", "docs", "traceability-board", e), + summarizeOutline: async (e) => X("ext_docs", "docs", "summarize-outline", e), + summarizeDecisions: async (e) => X("ext_docs", "docs", "summarize-decisions", e), + decisionBoard: async (e) => X("ext_docs", "docs", "decision-board", e), + readinessBoard: async (e) => X("ext_docs", "docs", "readiness-board", e), + handoffBoard: async (e) => X("ext_docs", "docs", "handoff-board", e), + implementationBoard: async (e) => X("ext_docs", "docs", "implementation-board", e) +}; +//#endregion +//#region ../extensions/first-party/ext_docs/ui/src/docs-board-filter.ts +function Yc(e, t) { + if (!Zc(t)) return e; + let n = e.columns.map((e) => { + let n = e.docs.filter((e) => Qc(e, t)); + return { + ...e, + count: n.length, + docs: n + }; + }); + return { + ...e, + totalDocs: n.reduce((e, t) => e + t.docs.length, 0), + columns: n + }; +} +function Xc(e, t, n, r, i) { + return Zc(i) ? !tl([t, n.label], i.filters.type ?? []) || !tl([e.name], i.filters.project ?? []) || !tl([r.frontMatter.owner], i.filters.owner ?? []) || !el(r.frontMatter.status, $c(i)) || !nl(ol(r.frontMatter.tags), i.filters.tag ?? []) || !tl([r.path, r.fileName], i.filters.path ?? []) || !tl([r.frontMatter.feature], i.filters.feature ?? []) ? !1 : rl(al(e, t, n, r), i.text) : !0; +} +function Zc(e) { + return e.text.trim().length > 0 || Object.values(e.filters).some((e) => e.length > 0); +} +function Qc(e, t) { + return !tl([e.typeName, e.typeLabel], t.filters.type ?? []) || !tl([e.projectName], t.filters.project ?? []) || !tl([e.owner], t.filters.owner ?? []) || !el(e.status, $c(t)) || !nl(e.tags ?? [], t.filters.tag ?? []) || !tl([e.path], t.filters.path ?? []) || !tl([e.feature], t.filters.feature ?? []) ? !1 : rl(il(e), t.text); +} +function $c(e) { + return [...e.filters.status ?? [], ...e.filters.is ?? []]; +} +function el(e, t) { + if (t.length === 0) return !0; + let n = cl(e); + return t.some((e) => { + let t = cl(e); + return (ll[t] ?? [t]).includes(n) || n.includes(t); + }); +} +function tl(e, t) { + if (t.length === 0) return !0; + let n = e.flatMap(sl).map(cl).filter(Boolean); + return t.some((e) => n.some((t) => t.includes(cl(e)))); +} +function nl(e, t) { + if (t.length === 0) return !0; + let n = e.flatMap(sl).map(cl).filter(Boolean); + return t.every((e) => n.some((t) => t.includes(cl(e)))); +} +function rl(e, t) { + let n = cl(t); + return n ? e.flatMap(sl).map(cl).join(" ").includes(n) : !0; +} +function il(e) { + return [ + e.projectName, + e.typeName, + e.typeLabel, + e.path, + e.title, + e.status, + e.owner, + e.tags, + e.feature, + e.scenarioCount, + e.stepCount, + e.scenariosWithoutSteps, + e.checklistTotal, + e.checklistChecked, + e.referenceCount, + e.implementationReferenceCount, + e.docReferenceCount, + e.otherReferenceCount, + e.decisionCount, + e.openQuestionCount, + e.riskCount + ]; +} +function al(e, t, n, r) { + return [ + e.name, + e.root, + e.labels, + t, + n.label, + n.slug, + n.description, + r.path, + r.fileName, + r.title, + r.frontMatter, + r.body, + r.preview + ]; +} +function ol(e) { + return Array.isArray(e) ? e : [e]; +} +function sl(e) { + return e == null ? [] : Array.isArray(e) ? e.flatMap(sl) : typeof e == "object" ? Object.entries(e).flatMap(([e, t]) => [e, ...sl(t)]) : [String(e)]; +} +function cl(e) { + return String(e ?? "").trim().toLowerCase(); +} +var ll = { + active: ["active"], + accepted: ["accepted"], + done: [ + "accepted", + "shipping", + "shipped" + ], + draft: ["draft", "proposed"], + implemented: [ + "implemented", + "shipping", + "shipped" + ], + open: [ + "active", + "draft", + "proposed" + ], + planned: ["planned", "proposed"], + proposed: ["proposed", "draft"], + review: ["review", "in-review"], + shipping: ["shipping", "shipped"], + shipped: ["shipping", "shipped"] +}, ul = [ + { + id: "type", + label: "Specs", + pathSegment: "" + }, + { + id: "project", + label: "Projects", + pathSegment: "projects" + }, + { + id: "owner", + label: "Owners", + pathSegment: "owners" + }, + { + id: "tag", + label: "Tags", + pathSegment: "tags" + }, + { + id: "status", + label: "Status", + pathSegment: "status" + }, + { + id: "scenario", + label: "Scenarios", + pathSegment: "scenarios" + }, + { + id: "readiness", + label: "Readiness", + pathSegment: "readiness" + }, + { + id: "decision", + label: "Review", + pathSegment: "review" + }, + { + id: "handoff", + label: "Handoff", + pathSegment: "handoff" + }, + { + id: "traceability", + label: "Traceability", + pathSegment: "traceability" + }, + { + id: "implementation", + label: "Implementation", + pathSegment: "implementation" + } +], dl = { + "": "type", + bdd: "scenario", + "bdd-scenarios": "scenario", + decision: "decision", + decisions: "decision", + handoff: "handoff", + implementation: "implementation", + owner: "owner", + owners: "owner", + prd: "type", + prds: "type", + project: "project", + projects: "project", + readiness: "readiness", + review: "decision", + scenario: "scenario", + scenarios: "scenario", + spec: "type", + specs: "type", + status: "status", + tag: "tag", + tags: "tag", + traceability: "traceability", + type: "type", + types: "type" +}; +function fl(e) { + return dl[gl(e)] ?? "type"; +} +function pl(e) { + let t = hl(e.pathname, e.routeSubPath), n = ml(e.boardId); + return `${n ? `${t}/${n}` : t}${e.search && e.search !== "?" ? e.search : ""}`; +} +function ml(e) { + return ul.find((t) => t.id === e)?.pathSegment ?? ""; +} +function hl(e, t) { + let n = _l(e || "/"), r = _l(t || "/"); + return r !== "/" && n.endsWith(r) ? _l(n.slice(0, -r.length) || "/") : n; +} +function gl(e) { + return (e ?? "").split("/").filter(Boolean)[0]?.toLowerCase() ?? ""; +} +function _l(e) { + let t = e.length; + for (; t > 1 && e.charCodeAt(t - 1) === 47;) --t; + return e.slice(0, t); +} +//#endregion //#region ../extensions/first-party/ext_docs/ui/src/DocsPanel.vue?vue&type=script&setup=true&lang.ts -var Xo = { - class: "docs-panel", - "data-smoke": "docs-panel" -}, Zo = { class: "docs-head" }, Qo = { class: "title-block" }, $o = { class: "muted" }, es = { +var vl = { + key: 0, + class: "docs-overview-card", + "data-smoke": "docs-overview-card" +}, yl = { class: "docs-overview-head" }, bl = { class: "docs-overview-eyebrow" }, xl = { class: "docs-overview-pill" }, Sl = { + key: 0, + class: "docs-overview-message error", + role: "alert" +}, Cl = { + key: 1, + class: "docs-overview-message error", + role: "alert" +}, wl = { + key: 2, + class: "docs-overview-message" +}, Tl = { + class: "docs-overview-stats", + "aria-label": "Specs summary" +}, El = { + class: "docs-overview-types", + "aria-label": "Doc types" +}, Dl = ["href"], Ol = ["href"], kl = { class: "docs-head" }, Al = { class: "title-block" }, jl = { class: "muted" }, Ml = { key: 0, class: "muted error", role: "alert" -}, ts = { +}, Nl = { key: 1, class: "muted error", role: "alert" -}, ns = { class: "docs-project-head" }, rs = { class: "docs-project-root" }, is = { class: "docs-type-head" }, as = { class: "docs-type-key" }, os = { class: "docs-type-label" }, ss = { class: "docs-type-scope" }, cs = { class: "muted docs-type-count" }, ls = { +}, Pl = { + key: 2, + class: "docs-workbench", + "data-smoke": "docs-workbench" +}, Fl = { class: "docs-workbench-head" }, Il = { class: "docs-workbench-title" }, Ll = { class: "muted" }, Rl = { + class: "docs-board-tabs", + "aria-label": "Specs workbench views" +}, zl = [ + "href", + "aria-current", + "onClick" +], Bl = { class: "docs-workbench-toolbar" }, Vl = { class: "docs-search" }, Hl = { + key: 1, + class: "docs-filter-summary", + "data-smoke": "docs-filter-summary" +}, Ul = { + key: 0, + class: "muted docs-board-status" +}, Wl = { + key: 1, + class: "muted error docs-board-status", + role: "alert" +}, Gl = { + key: 2, + class: "muted docs-board-status" +}, Kl = ["data-board"], ql = { class: "docs-board-column-head" }, Jl = { + key: 0, + class: "docs-board-cards" +}, Yl = ["aria-label"], Xl = { class: "docs-board-card-head" }, Zl = { class: "docs-board-type" }, Ql = { + key: 0, + class: "docs-board-path" +}, $l = { + key: 1, + class: "docs-board-metrics" +}, eu = { + key: 1, + class: "muted docs-board-empty" +}, tu = { + key: 3, + class: "muted docs-board-status" +}, nu = { class: "docs-project-head" }, ru = { class: "docs-project-root" }, iu = { class: "docs-type-head" }, au = { class: "docs-type-key" }, ou = { class: "docs-type-label" }, su = { class: "docs-type-scope" }, cu = { class: "muted docs-type-count" }, lu = { key: 0, class: "docs-type-desc" -}, us = { +}, uu = { key: 1, class: "docs-type-props" -}, ds = { +}, du = { key: 2, class: "docs-files" -}, fs = [ +}, fu = [ + "aria-label", "onClick", "onFocus", "onMouseenter", "onKeydown" -], ps = { class: "docs-file-head" }, ms = { class: "docs-file-caret" }, hs = { class: "docs-file-title" }, gs = { class: "docs-file-path" }, _s = { +], pu = { class: "docs-file-head" }, mu = { class: "docs-file-caret" }, hu = { class: "docs-file-title" }, gu = { class: "docs-file-path" }, _u = { key: 0, class: "docs-file-front" -}, vs = { +}, vu = { key: 1, class: "docs-file-body" -}, ys = ["innerHTML"], bs = { +}, yu = ["innerHTML"], bu = { key: 3, class: "muted no-files" -}, xs = /* @__PURE__ */ ((e, t) => { +}, xu = /* @__PURE__ */ ((e, t) => { let n = e.__vccOpts || e; for (let [e, r] of t) n[e] = r; return n; -})(/* @__PURE__ */ In({ +})(/* @__PURE__ */ Vn({ __name: "DocsPanel", props: { workspaceId: { type: String }, repositoryId: { type: [String, null] }, repositoryPath: { type: [String, null] }, repositorySegments: { type: Array }, - projectName: { type: String } + extensionSlot: { type: [String, null] }, + projectName: { type: String }, + routeParams: { type: Object } }, setup(e) { - let t = e, n = /* @__PURE__ */ Vt("loading"), r = /* @__PURE__ */ Vt(null), i = /* @__PURE__ */ Vt(null), a = /* @__PURE__ */ Vt([]), o = sa(() => i.value?.projects ?? []), s = sa(() => t.projectName ? o.value.filter((e) => e.name === t.projectName) : o.value), c = sa(() => { + let t = e, n = [ + "feature", + "is", + "owner", + "path", + "project", + "status", + "tag", + "type" + ], r = /* @__PURE__ */ Wt("loading"), i = /* @__PURE__ */ Wt(null), a = /* @__PURE__ */ Wt(null), o = /* @__PURE__ */ Wt([]), s = Y(() => a.value?.projects ?? []), c = Y(() => t.extensionSlot === "repository.main"), l = Y(() => t.projectName ? s.value.filter((e) => e.name === t.projectName) : s.value), u = Y(() => { let e = 0; - for (let t of s.value) for (let n of Object.values(t.docs ?? {})) e += x(t, n).length; + for (let t of l.value) for (let n of Object.values(t.docs ?? {})) e += De(t, n).length; return e; - }), l = /* @__PURE__ */ Vt(null), u = /* @__PURE__ */ Vt(null); - function d(e) { - return l.value === e; + }), d = /* @__PURE__ */ Wt(null), f = /* @__PURE__ */ Wt(null), p = /* @__PURE__ */ Wt("idle"), m = /* @__PURE__ */ Wt(null), h = /* @__PURE__ */ Wt("type"), g = /* @__PURE__ */ Wt(""), _ = /* @__PURE__ */ Wt(oe()), v = ul, y = Y(() => _.value[h.value]), b = Y(() => Rc(g.value, n)), x = Y(() => Zc(b.value)), S = Y(() => { + let e = y.value; + return e ? x.value ? Yc(e, b.value) : e : null; + }), C = Y(() => S.value?.totalDocs ?? 0), w = Y(() => y.value?.totalDocs ?? u.value), ee = Y(() => { + let e = /* @__PURE__ */ new Map(); + for (let t of l.value) for (let n of Oe(t)) { + let r = n.key, i = e.get(r) ?? { + key: r, + label: n.type.label || r, + count: 0 + }; + i.count += De(t, n.type).length, e.set(r, i); + } + return [...e.values()].sort((e, t) => { + let n = t.count - e.count; + return n === 0 ? e.label.localeCompare(t.label) : n; + }); + }), te = Y(() => ee.value.filter((e) => e.count > 0).slice(0, 4)), ne = Y(() => { + let e = (t.repositoryPath ?? "").split("/").filter((e) => e.length > 0).map(encodeURIComponent).join("/"), n = new URLSearchParams(); + t.workspaceId && n.set("workspaceId", t.workspaceId), t.repositoryId && n.set("repositoryId", t.repositoryId); + let r = n.toString(); + return `/r/${e || "repository"}/docs${r ? `?${r}` : ""}`; + }), T = Y(() => r.value === "loading" ? "Loading" : r.value === "error" || a.value?.error ? "Unavailable" : u.value === 0 ? "No specs" : `${u.value} specs`), re = Y(() => l.value.filter((e) => ke(e).length > 0)), E = Y(() => { + let e = 0; + for (let t of l.value) for (let n of Oe(t)) e += Ae(t, n.key, n.type).length; + return e; + }), ie = Y(() => x.value ? `${C.value} of ${w.value}` : String(w.value)), ae = Y(() => (x.value ? C.value : w.value) !== 1), D = Y(() => x.value ? `${E.value}/${u.value} specs | ${re.value.length}/${l.value.length} projects` : ""); + function oe() { + return { + type: null, + project: null, + owner: null, + tag: null, + status: null, + scenario: null, + readiness: null, + decision: null, + handoff: null, + traceability: null, + implementation: null + }; + } + function O() { + _.value = oe(), p.value = "idle", m.value = null; + } + function se(e) { + return d.value === e; } - function f(e) { - l.value = d(e) ? null : e, u.value = e; + function ce(e) { + d.value = se(e) ? null : e, f.value = e; } - function p(e) { - u.value = e; + function le(e) { + f.value = e; } - let m = sa(() => { + function ue(e) { + e.preventDefault(), window.location.assign(ne.value); + } + let de = Y(() => { let e = []; - for (let t of s.value) for (let n of S(t)) for (let r of x(t, n.type)) e.push(r.path); + for (let t of re.value) for (let n of ke(t)) for (let r of Ae(t, n.key, n.type)) e.push(r.path); return e; }); - function h(e) { - let t = m.value; + function fe(e) { + let t = de.value; if (t.length === 0) return; - let n = u.value, r = n ? t.indexOf(n) : -1; - u.value = t[Math.max(0, Math.min(t.length - 1, r + e))] ?? null; + let n = f.value, r = n ? t.indexOf(n) : -1; + f.value = t[Math.max(0, Math.min(t.length - 1, r + e))] ?? null; } - Io({ + Jo({ Escape: (e) => { - l.value &&= (e.preventDefault(), null); + d.value &&= (e.preventDefault(), null); }, j: (e) => { - u.value && (e.preventDefault(), h(1)); + f.value && (e.preventDefault(), fe(1)); }, ArrowDown: (e) => { - u.value && (e.preventDefault(), h(1)); + f.value && (e.preventDefault(), fe(1)); }, k: (e) => { - u.value && (e.preventDefault(), h(-1)); + f.value && (e.preventDefault(), fe(-1)); }, ArrowUp: (e) => { - u.value && (e.preventDefault(), h(-1)); + f.value && (e.preventDefault(), fe(-1)); }, Enter: (e) => { - u.value && (e.preventDefault(), f(u.value)); + f.value && (e.preventDefault(), ce(f.value)); }, " ": (e) => { - u.value && (e.preventDefault(), f(u.value)); + f.value && (e.preventDefault(), ce(f.value)); } - }), Zn(() => { - g(); - }), On(() => t.repositoryPath, () => void g()); - async function g() { - n.value = "loading", r.value = null; + }), nr(() => { + me(), window.addEventListener("popstate", me), we(); + }), or(() => { + window.removeEventListener("popstate", me); + }), Nn([ + () => t.repositoryPath, + () => t.projectName, + () => t.extensionSlot + ], () => void we()), Nn(() => t.routeParams?.subPath, () => pe()), Nn(g, () => Se()); + function pe() { + h.value = fl(t.routeParams?.subPath); + } + function me() { + h.value = fl(he()), xe(); + } + function he() { + if (typeof window > "u") return t.routeParams?.subPath ?? "/"; + let e = window.location.pathname.split("/").filter(Boolean); + if (e[0] === "x" && e[1] === "docs") return Ce(e.slice(2)); + let n = e.lastIndexOf("docs"); + return n >= 0 ? Ce(e.slice(n + 1)) : t.routeParams?.subPath ?? "/"; + } + function _e(e) { + return typeof window > "u" ? "#" : pl({ + boardId: e, + pathname: window.location.pathname, + routeSubPath: he(), + search: window.location.search + }); + } + function ve(e, t) { + if (t.preventDefault(), h.value = e, typeof window > "u") return; + let n = _e(e); + n !== `${window.location.pathname}${window.location.search}` && window.history.pushState({}, "", n); + } + function ye() { + g.value = ""; + } + function be() { + g.value && ye(); + } + function xe() { + typeof window > "u" || (g.value = new URLSearchParams(window.location.search).get("q") ?? ""); + } + function Se() { + if (typeof window > "u") return; + let e = new URLSearchParams(window.location.search), t = g.value.trim(); + t ? e.set("q", t) : e.delete("q"); + let n = e.toString(), r = `${window.location.pathname}${n ? `?${n}` : ""}`; + r !== `${window.location.pathname}${window.location.search}` && window.history.replaceState(window.history.state, "", r); + } + function Ce(e) { + return e.length > 0 ? `/${e.join("/")}` : "/"; + } + async function we() { + r.value = "loading", i.value = null, O(); try { let e = t.repositorySegments ?? []; if (e.length === 0) { - i.value = null, a.value = [], n.value = "ready"; + a.value = null, o.value = [], r.value = "ready"; return; } - let r = (await xo().query("query Q($segments: [String!]!) {\n workspace { repositoryByPath(segments: $segments) { comtryaConfig blobs { path preview size } } }\n }", { segments: e })).workspace?.repositoryByPath ?? null; - i.value = r?.comtryaConfig ?? null, a.value = r?.blobs ?? [], n.value = "ready"; + let n = (await No().query("query Q($segments: [String!]!) {\n workspace { repositoryByPath(segments: $segments) { comtryaConfig blobs { path preview size } } }\n }", { segments: e })).workspace?.repositoryByPath ?? null; + a.value = n?.comtryaConfig ?? null, o.value = n?.blobs ?? [], r.value = "ready", c.value ? (_.value = oe(), p.value = "ready", m.value = null) : Fe(); } catch (e) { - n.value = "error", r.value = e instanceof Error ? e.message : String(e); + r.value = "error", i.value = e instanceof Error ? e.message : String(e), O(); } } - function _(e, t) { + function A(e, t) { let n = (e ?? "").replace(/\/+$/g, "").replace(/^\.\/?/, ""), r = (t ?? "").replace(/^\/+/g, "").replace(/^\.\//, ""); return n ? !r || r === "." ? n : `${n}/${r}` : r; } - function v(e, t) { - return _((e.root ?? "").replace(/\/+$/g, ""), t.slug ?? ""); + function Te(e, t) { + return A((e.root ?? "").replace(/\/+$/g, ""), t.slug ?? ""); } - function y(e) { + function Ee(e) { let t = e ?? ""; if (!t.startsWith("---")) return { props: {}, @@ -3382,132 +5424,327 @@ var Xo = { let t = e.match(/^([A-Za-z_][A-Za-z0-9_-]*)\s*:\s*(.*)$/); if (!t) continue; let n = t[1]; - a[n] = b(t[2].trim()); + a[n] = j(t[2].trim()); } return { props: a, body: i }; } - function b(e) { + function j(e) { let t = e.trim(); return t ? t === "true" || t === "false" ? t === "true" : /^-?\d+$/.test(t) ? Number(t) : t.startsWith("[") && t.endsWith("]") ? t.slice(1, -1).split(",").map((e) => e.trim().replace(/^"(.*)"$/, "$1")).filter((e) => e.length > 0) : t.replace(/^"(.*)"$/, "$1") : ""; } - function x(e, t) { - let n = v(e, t), r = n ? `${n}/` : ""; - return a.value.filter((e) => !e.path || !e.path.endsWith(".mdx") && !e.path.endsWith(".md") ? !1 : r ? e.path.startsWith(r) : !0).map((e) => { - let { props: t, body: n } = y(e.preview), r = typeof t.title == "string" && t.title.length > 0 ? t.title : (e.path ?? "").split("/").pop() ?? e.path ?? "(untitled)", i = (e.path ?? "").split("/").pop() ?? e.path ?? ""; + function De(e, t) { + let n = Te(e, t), r = n ? `${n}/` : ""; + return o.value.filter((e) => !e.path || !e.path.endsWith(".mdx") && !e.path.endsWith(".md") ? !1 : r ? e.path.startsWith(r) : !0).map((e) => { + let { props: t, body: n } = Ee(e.preview), r = typeof t.title == "string" && t.title.length > 0 ? t.title : (e.path ?? "").split("/").pop() ?? e.path ?? "(untitled)", i = (e.path ?? "").split("/").pop() ?? e.path ?? ""; return { path: e.path ?? "", fileName: i, title: r, frontMatter: t, - body: n + body: n, + preview: e.preview ?? "" }; }).sort((e, t) => e.fileName.localeCompare(t.fileName)); } - function S(e) { + function Oe(e) { return e.docs ? Object.entries(e.docs).map(([e, t]) => ({ key: e, type: t })).sort((e, t) => e.key.localeCompare(t.key)) : []; } - function C(e) { + function ke(e) { + return Oe(e).filter((t) => Ae(e, t.key, t.type).length > 0); + } + function Ae(e, t, n) { + let r = De(e, n); + return x.value ? r.filter((r) => Xc(e, t, n, r, b.value)) : r; + } + function je(e) { return e.properties ? Object.entries(e.properties).map(([e, t]) => ({ name: e, spec: t })) : []; } - function w(e) { + function Me(e) { return typeof e == "string" ? e : e == null ? "any" : typeof e == "object" ? Object.keys(e).join(" | ") || "object" : String(e); } - function T(e) { - return e == null ? "·" : Array.isArray(e) ? e.map(T).join(" · ") : typeof e == "object" ? Object.entries(e).map(([e, t]) => `${e}=${T(t)}`).join(" · ") : String(e); - } - return (t, a) => (J(), Y("section", Xo, [ - X("header", Zo, [X("div", Qo, [a[8] ||= X("h2", null, "Docs", -1), X("span", $o, [n.value === "loading" ? (J(), Y(K, { key: 0 }, [Q("reading repo CUE config…")], 64)) : n.value === "error" ? (J(), Y(K, { key: 1 }, [Q("unavailable")], 64)) : c.value === 0 ? (J(), Y(K, { key: 2 }, [ - a[0] ||= Q(" No MDX docs declared. Add a ", -1), - a[1] ||= X("code", null, "docs", -1), - a[2] ||= Q(" block to a Project in ", -1), - a[3] ||= X("code", null, "package comtrya", -1), - a[4] ||= Q(" to surface them here. ", -1) - ], 64)) : (J(), Y(K, { key: 3 }, [ - Q(A(c.value) + " doc", 1), - c.value === 1 ? Fi("", !0) : (J(), Y(K, { key: 0 }, [Q("s")], 64)), - Q(" across " + A(s.value.length) + " project", 1), - s.value.length === 1 ? Fi("", !0) : (J(), Y(K, { key: 1 }, [Q("s")], 64)), - a[5] ||= Q(" · shape from ", -1), - a[6] ||= X("code", null, "ext_docs", -1), - a[7] ||= Q("'s registered CUE schema ", -1) + function Ne(e) { + return e == null ? "·" : Array.isArray(e) ? e.map(Ne).join(" · ") : typeof e == "object" ? Object.entries(e).map(([e, t]) => `${e}=${Ne(t)}`).join(" · ") : String(e); + } + function Pe() { + let e = []; + for (let t of l.value) for (let n of Oe(t)) e.push({ + projectName: t.name ?? "(unnamed project)", + typeName: n.key, + label: n.type.label || n.key, + description: n.type.description ?? null, + slug: n.type.slug ?? "", + files: De(t, n.type).map((e) => ({ + path: e.path, + preview: e.preview + })) + }); + return { types: e }; + } + function M(e, t) { + if (e.ok) return e.value; + throw Error(`${t}: ${e.error.message}`); + } + async function Fe() { + let e = Pe(); + if (!e.types.some((e) => e.files.length > 0)) { + _.value = oe(), p.value = "ready", m.value = null; + return; + } + p.value = "loading", m.value = null; + try { + let [t, n, r, i, a, o, s, c, l, u, d] = await Promise.all([ + Jc.typeBoard(e), + Jc.projectBoard(e), + Jc.ownerBoard(e), + Jc.tagBoard(e), + Jc.statusBoard(e), + Jc.scenarioBoard(e), + Jc.readinessBoard(e), + Jc.decisionBoard(e), + Jc.handoffBoard(e), + Jc.traceabilityBoard(e), + Jc.implementationBoard(e) + ]); + _.value = { + type: M(t, "type board"), + project: M(n, "project board"), + owner: M(r, "owner board"), + tag: M(i, "tag board"), + status: M(a, "status board"), + scenario: M(o, "scenario board"), + readiness: M(s, "readiness board"), + decision: M(c, "review board"), + handoff: M(l, "handoff board"), + traceability: M(u, "traceability board"), + implementation: M(d, "implementation board") + }, p.value = "ready"; + } catch (e) { + _.value = oe(), p.value = "error", m.value = e instanceof Error ? e.message : String(e); + } + } + function Ie(e) { + return _.value[e]?.totalDocs ?? 0; + } + function Le(e) { + return e.typeLabel || e.typeName || "doc"; + } + function Re(e) { + let t = []; + return e.status && t.push({ + label: "status", + value: e.status + }), e.projectName && t.push({ + label: "project", + value: e.projectName + }), e.owner && t.push({ + label: "owner", + value: e.owner + }), e.feature && t.push({ + label: "feature", + value: e.feature + }), Array.isArray(e.tags) && e.tags.length > 0 && t.push({ + label: "tags", + value: e.tags.join(", ") + }), typeof e.scenarioCount == "number" && t.push({ + label: "scenarios", + value: String(e.scenarioCount) + }), typeof e.stepCount == "number" && t.push({ + label: "steps", + value: String(e.stepCount) + }), typeof e.scenariosWithoutSteps == "number" && e.scenariosWithoutSteps > 0 && t.push({ + label: "empty", + value: String(e.scenariosWithoutSteps) + }), typeof e.checklistTotal == "number" && t.push({ + label: "checklist", + value: `${e.checklistChecked ?? 0}/${e.checklistTotal}` + }), typeof e.referenceCount == "number" && t.push({ + label: "refs", + value: String(e.referenceCount) + }), typeof e.implementationReferenceCount == "number" && t.push({ + label: "impl refs", + value: String(e.implementationReferenceCount) + }), typeof e.docReferenceCount == "number" && t.push({ + label: "doc refs", + value: String(e.docReferenceCount) + }), typeof e.otherReferenceCount == "number" && e.otherReferenceCount > 0 && t.push({ + label: "other refs", + value: String(e.otherReferenceCount) + }), typeof e.decisionCount == "number" && t.push({ + label: "decisions", + value: String(e.decisionCount) + }), typeof e.openQuestionCount == "number" && t.push({ + label: "questions", + value: String(e.openQuestionCount) + }), typeof e.riskCount == "number" && t.push({ + label: "risks", + value: String(e.riskCount) + }), t; + } + return (t, n) => (U(), W("section", { + class: ge(["docs-panel", { "docs-panel--summary": c.value }]), + "data-smoke": "docs-panel" + }, [c.value ? (U(), W("article", vl, [G("header", yl, [G("div", null, [G("p", bl, k(e.repositoryPath || "Repository"), 1), n[1] ||= G("h2", null, "Specs & PRDs", -1)]), G("span", xl, k(T.value), 1)]), r.value === "error" ? (U(), W("p", Sl, k(i.value), 1)) : a.value?.error ? (U(), W("p", Cl, k(a.value.error), 1)) : r.value === "loading" ? (U(), W("p", wl, " Reading the repo docs catalog... ")) : u.value > 0 ? (U(), W(V, { key: 3 }, [ + n[5] ||= G("p", { class: "docs-overview-copy" }, " Product intent, PRDs, and BDD scenarios live with the repository. ", -1), + G("dl", Tl, [ + G("div", null, [n[2] ||= G("dt", null, "Specs", -1), G("dd", null, k(u.value), 1)]), + G("div", null, [n[3] ||= G("dt", null, "Types", -1), G("dd", null, k(ee.value.length), 1)]), + G("div", null, [n[4] ||= G("dt", null, "Projects", -1), G("dd", null, k(l.value.length), 1)]) + ]), + G("ul", El, [(U(!0), W(V, null, fr(te.value, (e) => (U(), W("li", { key: e.key }, [G("span", null, k(e.label), 1), G("strong", null, k(e.count), 1)]))), 128))]), + G("a", { + class: "docs-overview-link", + href: ne.value, + onClick: ue + }, " Open specs workbench ", 8, Dl) + ], 64)) : (U(), W(V, { key: 4 }, [n[6] ||= G("p", { class: "docs-overview-message" }, " No specs, PRDs, or BDD scenarios declared for this repository. ", -1), G("a", { + class: "docs-overview-link", + href: ne.value, + onClick: ue + }, " Open specs workbench ", 8, Ol)], 64))])) : (U(), W(V, { key: 1 }, [ + G("header", kl, [G("div", Al, [n[15] ||= G("h2", null, "Specs", -1), G("span", jl, [r.value === "loading" ? (U(), W(V, { key: 0 }, [K("reading repo specs catalog…")], 64)) : r.value === "error" ? (U(), W(V, { key: 1 }, [K("unavailable")], 64)) : u.value === 0 ? (U(), W(V, { key: 2 }, [ + n[7] ||= K(" No specs, PRDs, or BDD scenarios declared. Add a ", -1), + n[8] ||= G("code", null, "docs", -1), + n[9] ||= K(" block to a Project in ", -1), + n[10] ||= G("code", null, "package comtrya", -1), + n[11] ||= K(" to surface them here. ", -1) + ], 64)) : (U(), W(V, { key: 3 }, [ + K(k(u.value) + " spec", 1), + u.value === 1 ? q("", !0) : (U(), W(V, { key: 0 }, [K("s")], 64)), + K(" across " + k(l.value.length) + " project", 1), + l.value.length === 1 ? q("", !0) : (U(), W(V, { key: 1 }, [K("s")], 64)), + n[12] ||= K(" · typed by ", -1), + n[13] ||= G("code", null, "ext_docs", -1), + n[14] ||= K("'s registered CUE schema ", -1) ], 64))])])]), - n.value === "error" ? (J(), Y("p", es, A(r.value), 1)) : i.value?.error ? (J(), Y("p", ts, A(i.value.error), 1)) : Fi("", !0), - (J(!0), Y(K, null, sr(s.value, (t) => Sn((J(), Y("article", { + r.value === "error" ? (U(), W("p", Ml, k(i.value), 1)) : a.value?.error ? (U(), W("p", Nl, k(a.value.error), 1)) : q("", !0), + r.value === "ready" && u.value > 0 ? (U(), W("section", Pl, [ + G("header", Fl, [G("div", Il, [n[16] ||= G("h3", null, "Specs workbench", -1), G("span", Ll, [K(k(ie.value) + " spec", 1), ae.value ? (U(), W(V, { key: 0 }, [K("s")], 64)) : q("", !0)])]), G("nav", Rl, [(U(!0), W(V, null, fr(qt(v), (e) => (U(), W("a", { + key: e.id, + href: _e(e.id), + class: ge(["docs-board-tab", { active: h.value === e.id }]), + "aria-current": h.value === e.id ? "page" : void 0, + onClick: (t) => ve(e.id, t) + }, [G("span", null, k(e.label), 1), G("strong", null, k(Ie(e.id)), 1)], 10, zl))), 128))])]), + G("div", Bl, [ + G("label", Vl, [Dn(G("input", { + "data-docs-workbench-search": "", + "onUpdate:modelValue": n[0] ||= (e) => g.value = e, + type: "search", + placeholder: "Filter specs: type:prd owner:platform bdd", + autocomplete: "off", + "aria-label": "Filter specs workbench", + onKeydown: po(be, ["esc"]) + }, null, 544), [[so, g.value]])]), + g.value ? (U(), W("button", { + key: 0, + type: "button", + class: "docs-clear", + "aria-label": "Clear specs filter", + onClick: ye + }, " Clear ")) : q("", !0), + x.value ? (U(), W("span", Hl, k(D.value), 1)) : q("", !0) + ]), + p.value === "loading" ? (U(), W("p", Ul, " Loading specs board… ")) : p.value === "error" ? (U(), W("p", Wl, k(m.value), 1)) : x.value && S.value && S.value.totalDocs === 0 ? (U(), W("p", Gl, " No specs match the current filter. ")) : S.value ? (U(), W("div", { + key: 3, + class: "docs-board", + "data-board": h.value + }, [(U(!0), W(V, null, fr(S.value.columns, (e) => (U(), W("section", { + key: e.key, + class: "docs-board-column" + }, [G("header", ql, [G("h4", null, k(e.label), 1), G("span", null, k(e.count), 1)]), e.docs.length > 0 ? (U(), W("ol", Jl, [(U(!0), W(V, null, fr(e.docs, (e) => (U(), W("li", { + key: e.path, + class: "docs-board-card", + "aria-label": `${Le(e)}: ${e.title || e.path}` + }, [ + G("header", Xl, [G("span", Zl, k(Le(e)), 1), G("strong", null, k(e.title || e.path), 1)]), + e.path ? (U(), W("code", Ql, k(e.path), 1)) : q("", !0), + Re(e).length > 0 ? (U(), W("dl", $l, [(U(!0), W(V, null, fr(Re(e), (t) => (U(), W(V, { key: `${e.path}-${t.label}` }, [G("dt", null, k(t.label), 1), G("dd", null, k(t.value), 1)], 64))), 128))])) : q("", !0) + ], 8, Yl))), 128))])) : (U(), W("p", eu, "No specs"))]))), 128))], 8, Kl)) : q("", !0) + ])) : q("", !0), + r.value === "ready" && u.value > 0 && x.value && E.value === 0 ? (U(), W("p", tu, " No repo specs, PRDs, or BDD scenarios match the current filter. ")) : q("", !0), + (U(!0), W(V, null, fr(re.value, (t) => (U(), W("article", { key: t.name, class: "docs-project" - }, [X("header", ns, [X("h3", null, A(t.name), 1), X("code", rs, A(t.root || "") + "/", 1)]), (J(!0), Y(K, null, sr(S(t), (n) => (J(), Y("section", { - key: n.key, + }, [G("header", nu, [G("h3", null, k(t.name), 1), G("code", ru, k(t.root || "") + "/", 1)]), (U(!0), W(V, null, fr(ke(t), (r) => (U(), W("section", { + key: r.key, class: "docs-type" }, [ - X("header", is, [ - X("code", as, A(n.key), 1), - X("span", os, A(n.type.label || n.key), 1), - X("code", ss, A(v(t, n.type) || "") + "/", 1), - X("span", cs, [Q(A(x(t, n.type).length) + " file", 1), x(t, n.type).length === 1 ? Fi("", !0) : (J(), Y(K, { key: 0 }, [Q("s")], 64))]) + G("header", iu, [ + G("code", au, k(r.key), 1), + G("span", ou, k(r.type.label || r.key), 1), + G("code", su, k(Te(t, r.type) || "") + "/", 1), + G("span", cu, [K(k(Ae(t, r.key, r.type).length) + " file", 1), Ae(t, r.key, r.type).length === 1 ? q("", !0) : (U(), W(V, { key: 0 }, [K("s")], 64))]) ]), - n.type.description ? (J(), Y("p", ls, A(n.type.description), 1)) : Fi("", !0), - C(n.type).length > 0 ? (J(), Y("dl", us, [ - (J(!0), Y(K, null, sr(C(n.type), (e) => (J(), Y(K, { key: e.name }, [X("dt", null, [X("code", null, A(e.name), 1)]), X("dd", null, A(w(e.spec)), 1)], 64))), 128)), - a[9] ||= X("dt", { class: "implicit" }, [X("code", null, "body")], -1), - a[10] ||= X("dd", { class: "implicit" }, "MDX body (implicit)", -1) - ])) : Fi("", !0), - x(t, n.type).length > 0 ? (J(), Y("ol", ds, [(J(!0), Y(K, null, sr(x(t, n.type), (t) => (J(), Y("li", { + r.type.description ? (U(), W("p", lu, k(r.type.description), 1)) : q("", !0), + je(r.type).length > 0 ? (U(), W("dl", uu, [ + (U(!0), W(V, null, fr(je(r.type), (e) => (U(), W(V, { key: e.name }, [G("dt", null, [G("code", null, k(e.name), 1)]), G("dd", null, k(Me(e.spec)), 1)], 64))), 128)), + n[17] ||= G("dt", { class: "implicit" }, [G("code", null, "body")], -1), + n[18] ||= G("dd", { class: "implicit" }, "MDX body (implicit)", -1) + ])) : q("", !0), + Ae(t, r.key, r.type).length > 0 ? (U(), W("ol", du, [(U(!0), W(V, null, fr(Ae(t, r.key, r.type), (t) => (U(), W("li", { key: t.path, - class: he(["docs-file", { - focused: u.value === t.path, - expanded: d(t.path) + class: ge(["docs-file", { + focused: f.value === t.path, + expanded: se(t.path) }]), + "aria-label": `${r.type.label || r.key}: ${t.title}`, tabindex: "0", - onClick: (e) => f(t.path), - onFocus: (e) => p(t.path), - onMouseenter: (e) => p(t.path), - onKeydown: io(no((e) => f(t.path), ["prevent"]), ["enter"]) + onClick: (e) => ce(t.path), + onFocus: (e) => le(t.path), + onMouseenter: (e) => le(t.path), + onKeydown: po(uo((e) => ce(t.path), ["prevent"]), ["enter"]) }, [ - X("header", ps, [ - X("span", ms, A(d(t.path) ? "▾" : "▸"), 1), - X("strong", hs, A(t.title), 1), - X("code", gs, A(t.path), 1) + G("header", pu, [ + G("span", mu, k(se(t.path) ? "▾" : "▸"), 1), + G("strong", hu, k(t.title), 1), + G("code", gu, k(t.path), 1) ]), - Object.keys(t.frontMatter).length > 0 ? (J(), Y("dl", _s, [(J(!0), Y(K, null, sr(t.frontMatter, (e, t) => (J(), Y(K, { key: t }, [X("dt", null, [X("code", null, A(t), 1)]), X("dd", null, A(T(e)), 1)], 64))), 128))])) : Fi("", !0), - t.body && !d(t.path) ? (J(), Y("p", vs, A(Wt(Go)(t.body)), 1)) : Fi("", !0), - t.body && d(t.path) ? (J(), Y("article", { + Object.keys(t.frontMatter).length > 0 ? (U(), W("dl", _u, [(U(!0), W(V, null, fr(t.frontMatter, (e, t) => (U(), W(V, { key: t }, [G("dt", null, [G("code", null, k(t), 1)]), G("dd", null, k(Ne(e)), 1)], 64))), 128))])) : q("", !0), + t.body && !se(t.path) ? (U(), W("p", vu, k(qt(Lc)(t.body)), 1)) : q("", !0), + t.body && se(t.path) ? (U(), W("article", { key: 2, class: "docs-file-rendered", - innerHTML: Wt(Wo)(t.body, { workspaceId: e.workspaceId ?? "" }) - }, null, 8, ys)) : Fi("", !0) - ], 42, fs))), 128))])) : (J(), Y("p", bs, [ - a[11] ||= Q(" No MDX files in ", -1), - X("code", null, A(v(t, n.type)) + "/", 1), - a[12] ||= Q(" yet. ", -1) + innerHTML: qt(Ic)(t.body, { workspaceId: e.workspaceId ?? "" }) + }, null, 8, yu)) : q("", !0) + ], 42, fu))), 128))])) : (U(), W("p", bu, [ + n[19] ||= K(" No MDX files in ", -1), + G("code", null, k(Te(t, r.type)) + "/", 1), + n[20] ||= K(" yet. ", -1) ])) - ]))), 128))])), [[xa, S(t).length > 0]])), 128)) - ])); + ]))), 128))]))), 128)) + ], 64))], 2)); } -}), [["styles", [".docs-panel{font-family:var(--font-sans,system-ui);gap:14px;display:grid}.docs-panel .docs-head{border-bottom:.5px solid var(--fg,#fffffff0);justify-content:space-between;align-items:baseline;padding-bottom:6px;display:flex}.docs-panel h2{font-family:var(--font-serif,system-ui);margin:0;font-size:22px;line-height:1}.docs-panel .title-block{flex-wrap:wrap;align-items:baseline;gap:14px;display:inline-flex}.docs-panel .muted{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);font-size:12px}.docs-panel .muted code{font-family:var(--font-mono,monospace);color:var(--fg-2,#ffffffbd);background:var(--bg-2,#0e1014);padding:0 4px;font-size:11px}.docs-panel .muted.error{color:var(--accent-err,#c9341c)}.docs-panel .docs-project{border:.5px solid var(--fg,#fffffff0);background:var(--bg,#0a0b0e)}.docs-panel .docs-project-head{background:var(--bg-2,#0e1014);border-bottom:.5px solid var(--line,#ffffff12);flex-wrap:wrap;align-items:baseline;gap:12px;padding:10px 14px;display:flex}.docs-panel .docs-project-head h3{font-family:var(--font-serif,system-ui);margin:0;font-size:16px;line-height:1}.docs-panel .docs-project-root{font-family:var(--font-mono,monospace);color:var(--fg-2,#ffffffbd);font-size:12px}.docs-panel .docs-type{border-bottom:.5px solid var(--line,#ffffff12);padding:12px 14px}.docs-panel .docs-type:last-child{border-bottom:0}.docs-panel .docs-type-head{flex-wrap:wrap;align-items:baseline;gap:8px 12px;margin-bottom:6px;display:flex}.docs-panel .docs-type-key{font-family:var(--font-mono,monospace);letter-spacing:.04em;text-transform:uppercase;color:var(--accent-blue,#1d55a6);font-size:12px;font-weight:700}.docs-panel .docs-type-label{font-family:var(--font-serif,system-ui);font-size:14px;font-weight:600}.docs-panel .docs-type-scope{font-family:var(--font-mono,monospace);color:var(--fg-2,#ffffffbd);background:var(--bg-2,#0e1014);padding:0 5px;font-size:11px}.docs-panel .docs-type-count{margin-left:auto}.docs-panel .docs-type-desc{font-family:var(--font-sans,system-ui);color:var(--fg-2,#ffffffbd);margin:0 0 8px;font-size:13px}.docs-panel .docs-type-props{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);grid-template-columns:auto 1fr;gap:2px 14px;margin:0 0 10px;font-size:11px;display:grid}.docs-panel .docs-type-props dt{font-weight:600}.docs-panel .docs-type-props dt code{color:var(--fg,#fffffff0)}.docs-panel .docs-type-props .implicit code,.docs-panel .docs-type-props .implicit{color:var(--fg-4,#ffffff57);font-style:italic}.docs-panel .docs-files{gap:8px;margin:0;padding:0;list-style:none;display:grid}.docs-panel .docs-file{border-left:2px solid var(--line,#ffffff12);cursor:pointer;padding:6px 0 6px 12px;transition:border-color .12s}.docs-panel .docs-file:hover,.docs-panel .docs-file.focused{border-left-color:var(--fg-3,#ffffff85);background:var(--surface)}.docs-panel .docs-file.expanded{border-left-color:var(--accent-blue,#1d55a6);cursor:default}.docs-panel .docs-file:focus{outline:none}.docs-panel .docs-file-caret{width:12px;color:var(--fg-3,#ffffff85);font-family:var(--font-mono,monospace);display:inline-block}.docs-panel .docs-file-head{flex-wrap:wrap;align-items:baseline;gap:10px;margin-bottom:2px;display:flex}.docs-panel .docs-file-title{font-family:var(--font-serif,system-ui);font-size:13px}.docs-panel .docs-file-path{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);font-size:11px}.docs-panel .docs-file-front{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);grid-template-columns:auto 1fr;gap:1px 12px;margin:0 0 4px;font-size:11px;display:grid}.docs-panel .docs-file-front dt code{color:var(--fg-2,#ffffffbd)}.docs-panel .docs-file-body{font-family:var(--font-sans,system-ui);color:var(--fg-2,#ffffffbd);white-space:pre-wrap;word-break:break-word;margin:0;font-size:12px}.docs-panel .docs-file-rendered{border-top:.5px solid var(--line,#ffffff12);font-family:var(--font-sans,system-ui);color:var(--fg,#fffffff0);margin-top:8px;padding:12px 0 4px;font-size:13px;line-height:1.55}.docs-panel .docs-file-rendered h1,.docs-panel .docs-file-rendered h2,.docs-panel .docs-file-rendered h3,.docs-panel .docs-file-rendered h4{font-family:var(--font-serif,system-ui);margin:12px 0 6px;line-height:1.2}.docs-panel .docs-file-rendered h1{font-size:20px}.docs-panel .docs-file-rendered h2{font-size:16px}.docs-panel .docs-file-rendered h3{text-transform:uppercase;letter-spacing:.06em;color:var(--fg-3,#ffffff85);font-size:14px}.docs-panel .docs-file-rendered p{margin:0 0 8px}.docs-panel .docs-file-rendered ul{margin:0 0 8px 18px;padding:0;list-style:outside}.docs-panel .docs-file-rendered ul li{margin:2px 0}.docs-panel .docs-file-rendered code{font-family:var(--font-mono,monospace);background:var(--bg-2,#0e1014);border-radius:2px;padding:0 4px;font-size:12px}.docs-panel .docs-file-rendered pre{background:var(--bg-2,#0e1014);font-family:var(--font-mono,monospace);white-space:pre-wrap;word-break:break-word;border-left:2px solid var(--line,#ffffff12);margin:8px 0;padding:10px 12px;font-size:12px;line-height:1.45}.docs-panel .docs-file-rendered pre code{background:0 0;padding:0}.docs-panel .docs-file-rendered strong{font-weight:700}.docs-panel .docs-file-rendered em{font-style:italic}.docs-panel .no-files{margin:0}"]]]), Ss = "ext_docs", Cs = "comtrya-docs-panel"; -Ko({ - tagName: Cs, - component: xs +}), [["styles", [".docs-panel{font-family:var(--font-sans,system-ui);gap:14px;min-width:0;display:grid}.docs-panel--summary{gap:0}.docs-overview-card{min-width:0;color:var(--fg,#fffffff0);gap:12px;padding:14px;display:grid}.docs-overview-head{justify-content:space-between;align-items:flex-start;gap:12px;min-width:0;display:flex}.docs-overview-head h2{font-family:var(--font-sans,system-ui);letter-spacing:0;margin:0;font-size:16px;font-weight:600;line-height:1.2}.docs-overview-eyebrow{color:var(--fg-3,#ffffff85);font-family:var(--font-sans,system-ui);text-overflow:ellipsis;white-space:nowrap;margin:0 0 4px;font-size:12px;line-height:1.2;overflow:hidden}.docs-overview-pill{border:.5px solid var(--line-2,#ffffff1f);border-radius:var(--r-sm,6px);min-height:24px;color:var(--accent,#3b82f6);background:var(--accent-soft,#3b82f624);white-space:nowrap;flex:none;align-items:center;padding:0 8px;font-size:12px;line-height:1;display:inline-flex}.docs-overview-copy,.docs-overview-message{color:var(--fg-2,#ffffffbd);margin:0;font-size:13px;line-height:1.45}.docs-overview-message{border:.5px solid var(--line-2,#ffffff1f);border-radius:var(--r-sm,6px);background:var(--surface,#ffffff08);padding:10px 12px}.docs-overview-message.error{color:var(--err,#f87171);border-color:var(--err-soft,#f8717133);background:var(--err-soft,#f871711f)}.docs-overview-stats{grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin:0;display:grid}.docs-overview-stats>div{border:.5px solid var(--line-2,#ffffff1f);border-radius:var(--r-sm,6px);background:var(--surface,#ffffff08);min-width:0;padding:9px}.docs-overview-stats dt{overflow-wrap:anywhere;color:var(--fg-3,#ffffff85);font-size:11px;line-height:1.25}.docs-overview-stats dd{color:var(--fg,#fffffff0);font-family:var(--font-mono,monospace);margin:6px 0 0;font-size:18px;font-weight:600;line-height:1}.docs-overview-types{gap:6px;margin:0;padding:0;list-style:none;display:grid}.docs-overview-types li{border:.5px solid var(--line,#ffffff12);border-radius:var(--r-sm,6px);background:var(--surface,#ffffff08);grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:10px;min-width:0;padding:8px 9px;display:grid}.docs-overview-types span{min-width:0;color:var(--fg-2,#ffffffbd);text-overflow:ellipsis;white-space:nowrap;font-size:13px;line-height:1.2;overflow:hidden}.docs-overview-types strong{color:var(--fg,#fffffff0);font-family:var(--font-mono,monospace);font-size:12px;line-height:1}.docs-overview-link{border:.5px solid var(--line-2,#ffffff1f);border-radius:var(--r-sm,6px);min-height:32px;color:var(--fg,#fffffff0);background:var(--surface,#ffffff08);justify-content:center;align-items:center;padding:0 10px;font-size:13px;font-weight:600;text-decoration:none;display:inline-flex}.docs-overview-link:hover{border-color:var(--accent,#3b82f6);color:var(--accent,#3b82f6)}.docs-panel .docs-head{border-bottom:.5px solid var(--fg,#fffffff0);justify-content:space-between;align-items:baseline;padding-bottom:6px;display:flex}.docs-panel h2{font-family:var(--font-serif,system-ui);margin:0;font-size:22px;line-height:1}.docs-panel .title-block{flex-wrap:wrap;align-items:baseline;gap:14px;display:inline-flex}.docs-panel .muted{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);font-size:12px}.docs-panel .muted code{font-family:var(--font-mono,monospace);color:var(--fg-2,#ffffffbd);background:var(--bg-2,#0e1014);padding:0 4px;font-size:11px}.docs-panel .muted.error{color:var(--accent-err,#c9341c)}.docs-panel .docs-workbench{border:.5px solid var(--line,#ffffff12);background:var(--surface,#ffffff08)}.docs-panel .docs-workbench-head{border-bottom:.5px solid var(--line,#ffffff12);grid-template-columns:minmax(160px,1fr) auto;align-items:start;gap:12px;padding:10px 12px;display:grid}.docs-panel .docs-workbench-title{align-items:baseline;gap:10px;min-width:0;display:flex}.docs-panel .docs-workbench-title h3{font-family:var(--font-serif,system-ui);margin:0;font-size:16px;line-height:1}.docs-panel .docs-board-tabs{flex-wrap:wrap;justify-content:flex-end;gap:4px;display:flex}.docs-panel .docs-board-tab{border:.5px solid var(--line,#ffffff12);background:var(--bg,#0a0b0e);max-width:100%;min-height:30px;color:var(--fg-2,#ffffffbd);font-family:var(--font-mono,monospace);white-space:nowrap;cursor:pointer;border-radius:6px;align-items:center;gap:7px;font-size:11px;line-height:1;display:inline-flex}.docs-panel .docs-board-tab:hover,.docs-panel .docs-board-tab.active{border-color:var(--fg-3,#ffffff85);color:var(--fg,#fffffff0)}.docs-panel .docs-board-tab.active{background:var(--bg-2,#0e1014)}.docs-panel .docs-board-tab strong{background:var(--surface-2,#ffffff0f);min-width:16px;color:var(--fg,#fffffff0);text-align:center;border-radius:6px;padding:3px 5px;font-weight:700}.docs-panel .docs-workbench-toolbar{border-bottom:.5px solid var(--line,#ffffff12);background:var(--surface,#ffffff08);flex-wrap:wrap;align-items:center;gap:8px;padding:10px 12px;display:flex}.docs-panel .docs-search{flex:280px;min-width:0}.docs-panel .docs-search input{border:.5px solid var(--line,#ffffff12);border-radius:var(--r-sm,6px);background:var(--bg,#0a0b0e);width:100%;color:var(--fg,#fffffff0);font:inherit;padding:8px 10px}.docs-panel .docs-search input:focus{border-color:var(--accent-blue,#1d55a6);outline:2px solid color-mix(in srgb, var(--accent-blue,#1d55a6) 32%, transparent);outline-offset:1px}.docs-panel .docs-clear{border:.5px solid var(--line,#ffffff12);border-radius:var(--r-sm,6px);background:var(--bg-2,#0e1014);color:var(--fg,#fffffff0);cursor:pointer;font:inherit;padding:8px 10px}.docs-panel .docs-clear:hover{border-color:var(--fg-3,#ffffff85)}.docs-panel .docs-filter-summary{min-width:0;color:var(--fg-3,#ffffff85);font-family:var(--font-mono,monospace);overflow-wrap:anywhere;font-size:11px;line-height:1.3}.docs-panel .docs-board-status{margin:0;padding:12px}.docs-panel .docs-board{grid-template-columns:repeat(auto-fit,minmax(220px,1fr));align-items:start;gap:10px;padding:10px;display:grid}.docs-panel .docs-board-column{border:.5px solid var(--line,#ffffff12);background:var(--bg,#0a0b0e);min-width:0}.docs-panel .docs-board-column-head{border-bottom:.5px solid var(--line,#ffffff12);background:var(--bg-2,#0e1014);justify-content:space-between;align-items:center;gap:8px;padding:8px 10px;display:flex}.docs-panel .docs-board-column-head h4{overflow-wrap:anywhere;min-width:0;font-family:var(--font-mono,monospace);color:var(--fg,#fffffff0);margin:0;font-size:12px;line-height:1.2}.docs-panel .docs-board-column-head span{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);flex:none;font-size:11px}.docs-panel .docs-board-cards{gap:8px;margin:0;padding:8px;list-style:none;display:grid}.docs-panel .docs-board-card{border:.5px solid var(--line,#ffffff12);background:var(--surface,#ffffff08);border-radius:6px;min-width:0;padding:8px}.docs-panel .docs-board-card-head{gap:3px;min-width:0;display:grid}.docs-panel .docs-board-card-head strong{overflow-wrap:anywhere;min-width:0;font-family:var(--font-serif,system-ui);font-size:13px;line-height:1.2}.docs-panel .docs-board-type{font-family:var(--font-mono,monospace);color:var(--accent-blue,#1d55a6);font-size:10px;line-height:1}.docs-panel .docs-board-path{overflow-wrap:anywhere;font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);margin-top:6px;font-size:10px;line-height:1.3;display:block}.docs-panel .docs-board-metrics{font-family:var(--font-mono,monospace);grid-template-columns:minmax(64px,max-content) 1fr;gap:2px 8px;margin:8px 0 0;font-size:10px;line-height:1.35;display:grid}.docs-panel .docs-board-metrics dt{color:var(--fg-4,#ffffff57)}.docs-panel .docs-board-metrics dd{overflow-wrap:anywhere;min-width:0;color:var(--fg-2,#ffffffbd);margin:0}.docs-panel .docs-board-empty{margin:0;padding:8px 10px 10px}.docs-panel .docs-project{border:.5px solid var(--fg,#fffffff0);background:var(--bg,#0a0b0e)}.docs-panel .docs-project-head{background:var(--bg-2,#0e1014);border-bottom:.5px solid var(--line,#ffffff12);flex-wrap:wrap;align-items:baseline;gap:12px;padding:10px 14px;display:flex}.docs-panel .docs-project-head h3{font-family:var(--font-serif,system-ui);margin:0;font-size:16px;line-height:1}.docs-panel .docs-project-root{font-family:var(--font-mono,monospace);color:var(--fg-2,#ffffffbd);font-size:12px}.docs-panel .docs-type{border-bottom:.5px solid var(--line,#ffffff12);padding:12px 14px}.docs-panel .docs-type:last-child{border-bottom:0}.docs-panel .docs-type-head{flex-wrap:wrap;align-items:baseline;gap:8px 12px;margin-bottom:6px;display:flex}.docs-panel .docs-type-key{font-family:var(--font-mono,monospace);letter-spacing:.04em;text-transform:uppercase;color:var(--accent-blue,#1d55a6);font-size:12px;font-weight:700}.docs-panel .docs-type-label{font-family:var(--font-serif,system-ui);font-size:14px;font-weight:600}.docs-panel .docs-type-scope{font-family:var(--font-mono,monospace);color:var(--fg-2,#ffffffbd);background:var(--bg-2,#0e1014);padding:0 5px;font-size:11px}.docs-panel .docs-type-count{margin-left:auto}.docs-panel .docs-type-desc{font-family:var(--font-sans,system-ui);color:var(--fg-2,#ffffffbd);margin:0 0 8px;font-size:13px}.docs-panel .docs-type-props{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);grid-template-columns:auto 1fr;gap:2px 14px;margin:0 0 10px;font-size:11px;display:grid}.docs-panel .docs-type-props dt{font-weight:600}.docs-panel .docs-type-props dt code{color:var(--fg,#fffffff0)}.docs-panel .docs-type-props .implicit code,.docs-panel .docs-type-props .implicit{color:var(--fg-4,#ffffff57);font-style:italic}.docs-panel .docs-files{gap:8px;margin:0;padding:0;list-style:none;display:grid}.docs-panel .docs-file{border-left:2px solid var(--line,#ffffff12);cursor:pointer;padding:6px 0 6px 12px;transition:border-color .12s}.docs-panel .docs-file:hover,.docs-panel .docs-file.focused{border-left-color:var(--fg-3,#ffffff85);background:var(--surface)}.docs-panel .docs-file.expanded{border-left-color:var(--accent-blue,#1d55a6);cursor:default}.docs-panel .docs-file:focus{outline:none}.docs-panel .docs-file-caret{width:12px;color:var(--fg-3,#ffffff85);font-family:var(--font-mono,monospace);display:inline-block}.docs-panel .docs-file-head{flex-wrap:wrap;align-items:baseline;gap:10px;margin-bottom:2px;display:flex}.docs-panel .docs-file-title{font-family:var(--font-serif,system-ui);font-size:13px}.docs-panel .docs-file-path{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);font-size:11px}.docs-panel .docs-file-front{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);grid-template-columns:auto 1fr;gap:1px 12px;margin:0 0 4px;font-size:11px;display:grid}.docs-panel .docs-file-front dt code{color:var(--fg-2,#ffffffbd)}.docs-panel .docs-file-body{font-family:var(--font-sans,system-ui);color:var(--fg-2,#ffffffbd);white-space:pre-wrap;word-break:break-word;margin:0;font-size:12px}.docs-panel .docs-file-rendered{border-top:.5px solid var(--line,#ffffff12);font-family:var(--font-sans,system-ui);color:var(--fg,#fffffff0);margin-top:8px;padding:12px 0 4px;font-size:13px;line-height:1.55}.docs-panel .docs-file-rendered h1,.docs-panel .docs-file-rendered h2,.docs-panel .docs-file-rendered h3,.docs-panel .docs-file-rendered h4{font-family:var(--font-serif,system-ui);margin:12px 0 6px;line-height:1.2}.docs-panel .docs-file-rendered h1{font-size:20px}.docs-panel .docs-file-rendered h2{font-size:16px}.docs-panel .docs-file-rendered h3{text-transform:uppercase;letter-spacing:.06em;color:var(--fg-3,#ffffff85);font-size:14px}.docs-panel .docs-file-rendered p{margin:0 0 8px}.docs-panel .docs-file-rendered ul{margin:0 0 8px 18px;padding:0;list-style:outside}.docs-panel .docs-file-rendered ul li{margin:2px 0}.docs-panel .docs-file-rendered code{font-family:var(--font-mono,monospace);background:var(--bg-2,#0e1014);border-radius:2px;padding:0 4px;font-size:12px}.docs-panel .docs-file-rendered pre{background:var(--bg-2,#0e1014);font-family:var(--font-mono,monospace);white-space:pre-wrap;word-break:break-word;border-left:2px solid var(--line,#ffffff12);margin:8px 0;padding:10px 12px;font-size:12px;line-height:1.45}.docs-panel .docs-file-rendered pre code{background:0 0;padding:0}.docs-panel .docs-file-rendered strong{font-weight:700}.docs-panel .docs-file-rendered em{font-style:italic}.docs-panel .no-files{margin:0}@media (max-width:760px){.docs-panel .docs-workbench-head{grid-template-columns:1fr}.docs-panel .docs-board-tabs{justify-content:flex-start}.docs-panel .docs-workbench-toolbar{flex-direction:column;align-items:stretch}.docs-panel .docs-search,.docs-panel .docs-clear{flex:0 auto;width:100%}}"]]]), Su = "ext_docs", Cu = "comtrya-docs-panel"; +Wc({ + tagName: Cu, + component: xu }); -var ws = { - id: Ss, +var wu = { + id: Su, setup(e) { e.registerWidget({ id: "docs-panel", - element: Cs, + element: Cu, defaultSlot: "repository.main", defaultPriority: 80, requiredPermission: "workspace.read" + }), e.registerRoute("/", { + element: Cu, + requiredPermission: "workspace.read" + }), e.registerRoute("/:board", { + element: Cu, + requiredPermission: "workspace.read" }); } }; //#endregion -export { ws as default }; +export { wu as default }; diff --git a/extensions/first-party/ext_docs/component/src/lib.rs b/extensions/first-party/ext_docs/component/src/lib.rs index 96495429..b0fa9bdb 100644 --- a/extensions/first-party/ext_docs/component/src/lib.rs +++ b/extensions/first-party/ext_docs/component/src/lib.rs @@ -1,25 +1,2077 @@ // ext_docs — repo-resident docs WASM extension. // -// Backend is intentionally minimal in 0.1.0: the data path is kernel-owned -// (CUE evaluation + repo file tree exposed on `repository.comtryaConfig` -// and `repository.files`), and the UI bundle owns rendering. We export -// a `ping` op only because every first-party extension must ship a real -// component with at least one interface op. 0.2.0 moves MDX front-matter -// extraction here once we want server-side validation against the -// `properties` declared in each Project's doc-type CUE. +// The kernel owns CUE evaluation and repo file enumeration. This component +// owns document semantics, starting with the shared MDX front-matter summary +// used by ADR, spec, PRD, scenario, and user-defined doc surfaces. mod bindings; -use bindings::comtrya::platform::types::{Error, Event}; -use bindings::exports::comtrya::ext_docs::docs::Guest as DocsGuest; +use std::collections::{BTreeMap, HashMap}; + +use bindings::comtrya::platform::types::{Error, ErrorCode, Event}; +use bindings::exports::comtrya::ext_docs::docs::{ + BddScenario, BddStep, BddSummary, DocCatalog, DocCatalogInput, DocChecklistItem, + DocChecklistSection, DocChecklistSummary, DocDecisionBoard, DocDecisionCard, DocDecisionColumn, + DocDecisionItem, DocDecisionSummary, DocHandoffBoard, DocHandoffCard, DocHandoffColumn, + DocImplementationBoard, DocImplementationCard, DocImplementationColumn, DocOutlineHeading, + DocOutlineSummary, DocOwnerBoard, DocOwnerCard, DocOwnerColumn, DocProjectBoard, + DocProjectCard, DocProjectColumn, DocProperty, DocReadinessBoard, DocReadinessCard, + DocReadinessColumn, DocReference, DocReferenceSummary, DocScenarioBoard, DocScenarioCard, + DocScenarioColumn, DocStatusBoard, DocStatusCard, DocStatusColumn, DocSummary, DocTagBoard, + DocTagCard, DocTagColumn, DocTraceabilityBoard, DocTraceabilityCard, DocTraceabilityColumn, + DocTypeBoard, DocTypeCard, DocTypeColumn, DocTypeInput, DocTypeSummary, Guest as DocsGuest, + SummarizeDocInput, +}; use bindings::exports::comtrya::platform::reactor::{Guest as ReactorGuest, Reaction}; -struct Component; +const MAX_PREVIEW_LEN: usize = 1_048_576; +const MAX_CATALOG_TYPES: usize = 256; +const MAX_CATALOG_DOCS: usize = 4_096; +const EXCERPT_CHARS: usize = 180; + +struct Component; + +fn err(code: ErrorCode, message: impl Into) -> Error { + Error { + code, + message: message.into(), + path: None, + } +} + +fn summarize_preview(path: &str, preview: &str) -> DocSummary { + let (has_front_matter, properties, body) = parse_front_matter(preview); + let title = properties + .iter() + .find_map(|(key, value)| (key == "title" && !value.is_empty()).then(|| value.clone())) + .unwrap_or_else(|| fallback_title(path)); + + DocSummary { + path: path.to_string(), + title, + property_count: properties.len() as u32, + properties: properties + .into_iter() + .map(|(key, value)| DocProperty { key, value }) + .collect(), + body_excerpt: body_excerpt(body), + has_front_matter, + } +} + +fn summarize_catalog(input: DocCatalogInput) -> Result { + validate_catalog_size(&input)?; + + let mut total_docs = 0_u32; + let mut types = Vec::with_capacity(input.types.len()); + for doc_type in input.types { + let summary = summarize_doc_type(doc_type)?; + total_docs += summary.doc_count; + types.push(summary); + } + + Ok(DocCatalog { total_docs, types }) +} + +fn type_board(input: DocCatalogInput) -> Result { + let catalog = summarize_catalog(input)?; + let mut by_type = BTreeMap::)>::new(); + + for doc_type in &catalog.types { + let key = doc_type_key(&doc_type.type_name); + let entry = by_type.entry(key).or_insert_with(|| { + ( + doc_type.label.clone(), + doc_type.type_name.clone(), + Vec::new(), + ) + }); + if entry.0 != doc_type.label { + entry.0 = entry.1.clone(); + } + + for doc in &doc_type.docs { + entry.2.push(type_card(doc_type, doc)); + } + } + + let columns = by_type + .into_iter() + .map(|(key, (label, type_name, docs))| { + type_column(format!("type-{key}"), label, type_name, docs) + }) + .collect(); + + Ok(DocTypeBoard { + total_docs: catalog.total_docs, + columns, + }) +} + +fn validate_catalog_size(input: &DocCatalogInput) -> Result<(), Error> { + if input.types.len() > MAX_CATALOG_TYPES { + return Err(err( + ErrorCode::BadInput, + format!("doc catalog must contain at most {MAX_CATALOG_TYPES} types"), + )); + } + + let total_files = input + .types + .iter() + .map(|doc_type| doc_type.files.len()) + .sum::(); + if total_files > MAX_CATALOG_DOCS { + return Err(err( + ErrorCode::BadInput, + format!("doc catalog must contain at most {MAX_CATALOG_DOCS} docs"), + )); + } + + Ok(()) +} + +fn status_board(input: DocCatalogInput) -> Result { + let catalog = summarize_catalog(input)?; + let mut draft = Vec::new(); + let mut active = Vec::new(); + let mut done = Vec::new(); + let mut other = Vec::new(); + let mut missing = Vec::new(); + + for doc_type in &catalog.types { + for doc in &doc_type.docs { + let card = status_card(doc_type, doc); + match status_lane(&card.status) { + StatusLane::Draft => draft.push(card), + StatusLane::Active => active.push(card), + StatusLane::Done => done.push(card), + StatusLane::Other => other.push(card), + StatusLane::Missing => missing.push(card), + } + } + } + + let mut columns = vec![ + status_column("draft", "Draft", draft), + status_column("active", "Active", active), + status_column("done", "Done", done), + ]; + if !other.is_empty() { + columns.push(status_column("other", "Other", other)); + } + if !missing.is_empty() { + columns.push(status_column("missing", "Missing status", missing)); + } + + Ok(DocStatusBoard { + total_docs: catalog.total_docs, + columns, + }) +} + +fn owner_board(input: DocCatalogInput) -> Result { + let catalog = summarize_catalog(input)?; + let mut owned = BTreeMap::)>::new(); + let mut unowned = Vec::new(); + + for doc_type in &catalog.types { + for doc in &doc_type.docs { + let card = owner_card(doc_type, doc); + if let Some(owner) = card.owner.as_ref() { + let key = owner_key(owner); + let entry = owned + .entry(key) + .or_insert_with(|| (owner.to_string(), Vec::new())); + entry.1.push(card); + } else { + unowned.push(card); + } + } + } + + let mut columns = vec![owner_column("unowned", "Unowned", None, unowned)]; + columns.extend(owned.into_iter().map(|(key, (owner, docs))| { + owner_column(format!("owner-{key}"), owner.clone(), Some(owner), docs) + })); + + Ok(DocOwnerBoard { + total_docs: catalog.total_docs, + columns, + }) +} + +fn tag_board(input: DocCatalogInput) -> Result { + let catalog = summarize_catalog(input)?; + let mut tagged = BTreeMap::)>::new(); + let mut untagged = Vec::new(); + + for doc_type in &catalog.types { + for doc in &doc_type.docs { + let card = tag_card(doc_type, doc); + if card.tags.is_empty() { + untagged.push(card); + continue; + } + + for tag in &card.tags { + let key = tag_key(tag); + let entry = tagged + .entry(key) + .or_insert_with(|| (tag.to_string(), Vec::new())); + entry.1.push(card.clone()); + } + } + } + + let mut columns = vec![tag_column("untagged", "Untagged", None, untagged)]; + columns.extend( + tagged.into_iter().map(|(key, (tag, docs))| { + tag_column(format!("tag-{key}"), tag.clone(), Some(tag), docs) + }), + ); + + Ok(DocTagBoard { + total_docs: catalog.total_docs, + columns, + }) +} + +fn project_board(input: DocCatalogInput) -> Result { + validate_catalog_size(&input)?; + + let mut scoped = BTreeMap::)>::new(); + let mut unscoped = Vec::new(); + let mut total_docs = 0_u32; + + for doc_type in input.types { + let project_name = clean_optional_label(doc_type.project_name); + let type_name = required_field("doc type name", doc_type.type_name)?; + let label = clean_optional_label(doc_type.label).unwrap_or_else(|| type_name.clone()); + required_field("doc type slug", doc_type.slug)?; + + for file in doc_type.files { + let path = validate_doc_path(file.path)?; + validate_preview_len(&file.preview)?; + + let summary = summarize_preview(&path, &file.preview); + let status = property_value(&summary, "status").unwrap_or_default(); + let owner = property_value(&summary, "owner"); + let tags = property_value(&summary, "tags") + .map(|value| parse_tag_list(&value)) + .unwrap_or_default(); + let card = DocProjectCard { + project_name: project_name.clone().unwrap_or_default(), + type_name: type_name.clone(), + type_label: label.clone(), + path: summary.path, + title: summary.title, + status, + owner, + tags, + }; + + if let Some(project) = project_name.as_ref() { + let key = project_key(project); + let entry = scoped + .entry(key) + .or_insert_with(|| (project.to_string(), Vec::new())); + entry.1.push(card); + } else { + unscoped.push(card); + } + + total_docs += 1; + } + } + + let mut columns = vec![project_column("unscoped", "Unscoped", None, unscoped)]; + columns.extend(scoped.into_iter().map(|(key, (project, docs))| { + project_column( + format!("project-{key}"), + project.clone(), + Some(project), + docs, + ) + })); + + Ok(DocProjectBoard { + total_docs, + columns, + }) +} + +fn readiness_board(input: DocCatalogInput) -> Result { + validate_catalog_size(&input)?; + + let mut needs_criteria = Vec::new(); + let mut in_progress = Vec::new(); + let mut ready = Vec::new(); + let mut total_docs = 0_u32; + + for doc_type in input.types { + let project_name = required_field("project name", doc_type.project_name)?; + let type_name = required_field("doc type name", doc_type.type_name)?; + let label = clean_optional_label(doc_type.label).unwrap_or_else(|| type_name.clone()); + required_field("doc type slug", doc_type.slug)?; + + for file in doc_type.files { + let path = validate_doc_path(file.path)?; + validate_preview_len(&file.preview)?; + + let summary = summarize_preview(&path, &file.preview); + let checklists = summarize_checklists(SummarizeDocInput { + path: path.clone(), + preview: file.preview.clone(), + })?; + let scenarios = summarize_scenarios(SummarizeDocInput { + path: path.clone(), + preview: file.preview.clone(), + })?; + let references = summarize_references(SummarizeDocInput { + path, + preview: file.preview, + })?; + + let status = property_value(&summary, "status").unwrap_or_default(); + let card = DocReadinessCard { + project_name: project_name.clone(), + type_name: type_name.clone(), + type_label: label.clone(), + path: summary.path, + title: summary.title, + status, + checklist_total: checklists.total_items, + checklist_checked: checklists.checked_items, + scenario_count: scenarios.scenario_count, + reference_count: references.reference_count, + }; + + match readiness_lane(&card) { + ReadinessLane::NeedsCriteria => needs_criteria.push(card), + ReadinessLane::InProgress => in_progress.push(card), + ReadinessLane::Ready => ready.push(card), + } + total_docs += 1; + } + } + + Ok(DocReadinessBoard { + total_docs, + columns: vec![ + readiness_column("needs-criteria", "Needs criteria", needs_criteria), + readiness_column("in-progress", "In progress", in_progress), + readiness_column("ready", "Ready", ready), + ], + }) +} + +fn handoff_board(input: DocCatalogInput) -> Result { + validate_catalog_size(&input)?; + + let mut needs_criteria = Vec::new(); + let mut needs_scenarios = Vec::new(); + let mut needs_product_review = Vec::new(); + let mut ready_for_implementation = Vec::new(); + let mut in_implementation = Vec::new(); + let mut total_docs = 0_u32; + + for doc_type in input.types { + let project_name = required_field("project name", doc_type.project_name)?; + let type_name = required_field("doc type name", doc_type.type_name)?; + let label = clean_optional_label(doc_type.label).unwrap_or_else(|| type_name.clone()); + required_field("doc type slug", doc_type.slug)?; + + for file in doc_type.files { + let path = validate_doc_path(file.path)?; + validate_preview_len(&file.preview)?; + + let summary = summarize_preview(&path, &file.preview); + let checklists = summarize_checklists(SummarizeDocInput { + path: path.clone(), + preview: file.preview.clone(), + })?; + let scenarios = summarize_scenarios(SummarizeDocInput { + path: path.clone(), + preview: file.preview.clone(), + })?; + let references = summarize_references(SummarizeDocInput { + path: path.clone(), + preview: file.preview.clone(), + })?; + let decisions = summarize_decisions(SummarizeDocInput { + path, + preview: file.preview, + })?; + let implementation_reference_count = references + .references + .iter() + .filter(|reference| is_implementation_reference(&reference.kind)) + .count() as u32; + let status = property_value(&summary, "status").unwrap_or_default(); + let card = DocHandoffCard { + project_name: project_name.clone(), + type_name: type_name.clone(), + type_label: label.clone(), + path: summary.path, + title: summary.title, + status, + checklist_total: checklists.total_items, + checklist_checked: checklists.checked_items, + scenario_count: scenarios.scenario_count, + implementation_reference_count, + open_question_count: decisions.open_question_count, + risk_count: decisions.risk_count, + }; + + match handoff_lane(&card) { + HandoffLane::NeedsCriteria => needs_criteria.push(card), + HandoffLane::NeedsScenarios => needs_scenarios.push(card), + HandoffLane::NeedsProductReview => needs_product_review.push(card), + HandoffLane::ReadyForImplementation => ready_for_implementation.push(card), + HandoffLane::InImplementation => in_implementation.push(card), + } + total_docs += 1; + } + } + + Ok(DocHandoffBoard { + total_docs, + columns: vec![ + handoff_column("needs-criteria", "Needs criteria", needs_criteria), + handoff_column("needs-scenarios", "Needs scenarios", needs_scenarios), + handoff_column( + "needs-product-review", + "Needs product review", + needs_product_review, + ), + handoff_column( + "ready-for-implementation", + "Ready for implementation", + ready_for_implementation, + ), + handoff_column("in-implementation", "In implementation", in_implementation), + ], + }) +} + +fn implementation_board(input: DocCatalogInput) -> Result { + validate_catalog_size(&input)?; + + let mut needs_acceptance = Vec::new(); + let mut needs_product_review = Vec::new(); + let mut needs_implementation_link = Vec::new(); + let mut ready_to_build = Vec::new(); + let mut in_implementation = Vec::new(); + let mut implemented = Vec::new(); + let mut total_docs = 0_u32; + + for doc_type in input.types { + let project_name = required_field("project name", doc_type.project_name)?; + let type_name = required_field("doc type name", doc_type.type_name)?; + let label = clean_optional_label(doc_type.label).unwrap_or_else(|| type_name.clone()); + required_field("doc type slug", doc_type.slug)?; + + for file in doc_type.files { + let path = validate_doc_path(file.path)?; + validate_preview_len(&file.preview)?; + + let summary = summarize_preview(&path, &file.preview); + let checklists = summarize_checklists(SummarizeDocInput { + path: path.clone(), + preview: file.preview.clone(), + })?; + let scenarios = summarize_scenarios(SummarizeDocInput { + path: path.clone(), + preview: file.preview.clone(), + })?; + let references = summarize_references(SummarizeDocInput { + path: path.clone(), + preview: file.preview.clone(), + })?; + let decisions = summarize_decisions(SummarizeDocInput { + path, + preview: file.preview, + })?; + let implementation_reference_count = references + .references + .iter() + .filter(|reference| is_implementation_reference(&reference.kind)) + .count() as u32; + let doc_reference_count = references + .references + .iter() + .filter(|reference| reference.kind == "doc") + .count() as u32; + let status = property_value(&summary, "status").unwrap_or_default(); + let card = DocImplementationCard { + project_name: project_name.clone(), + type_name: type_name.clone(), + type_label: label.clone(), + path: summary.path, + title: summary.title, + status, + checklist_total: checklists.total_items, + checklist_checked: checklists.checked_items, + scenario_count: scenarios.scenario_count, + reference_count: references.reference_count, + implementation_reference_count, + doc_reference_count, + open_question_count: decisions.open_question_count, + risk_count: decisions.risk_count, + }; + + match implementation_lane(&card) { + ImplementationLane::NeedsAcceptance => needs_acceptance.push(card), + ImplementationLane::NeedsProductReview => needs_product_review.push(card), + ImplementationLane::NeedsImplementationLink => { + needs_implementation_link.push(card); + } + ImplementationLane::ReadyToBuild => ready_to_build.push(card), + ImplementationLane::InImplementation => in_implementation.push(card), + ImplementationLane::Implemented => implemented.push(card), + } + total_docs += 1; + } + } + + Ok(DocImplementationBoard { + total_docs, + columns: vec![ + implementation_column("needs-acceptance", "Needs acceptance", needs_acceptance), + implementation_column( + "needs-product-review", + "Needs product review", + needs_product_review, + ), + implementation_column( + "needs-implementation-link", + "Needs implementation link", + needs_implementation_link, + ), + implementation_column("ready-to-build", "Ready to build", ready_to_build), + implementation_column("in-implementation", "In implementation", in_implementation), + implementation_column("implemented", "Implemented", implemented), + ], + }) +} + +fn decision_board(input: DocCatalogInput) -> Result { + validate_catalog_size(&input)?; + + let mut open_questions = Vec::new(); + let mut risks = Vec::new(); + let mut decided = Vec::new(); + let mut missing_review_state = Vec::new(); + let mut total_docs = 0_u32; + + for doc_type in input.types { + let project_name = required_field("project name", doc_type.project_name)?; + let type_name = required_field("doc type name", doc_type.type_name)?; + let label = clean_optional_label(doc_type.label).unwrap_or_else(|| type_name.clone()); + required_field("doc type slug", doc_type.slug)?; + + for file in doc_type.files { + let path = validate_doc_path(file.path)?; + validate_preview_len(&file.preview)?; + + let summary = summarize_preview(&path, &file.preview); + let decisions = summarize_decisions(SummarizeDocInput { + path, + preview: file.preview, + })?; + let status = property_value(&summary, "status").unwrap_or_default(); + let card = DocDecisionCard { + project_name: project_name.clone(), + type_name: type_name.clone(), + type_label: label.clone(), + path: summary.path, + title: summary.title, + status, + decision_count: decisions.decision_count, + open_question_count: decisions.open_question_count, + risk_count: decisions.risk_count, + }; + + match decision_lane(&card) { + DecisionLane::OpenQuestions => open_questions.push(card), + DecisionLane::Risks => risks.push(card), + DecisionLane::Decided => decided.push(card), + DecisionLane::MissingReviewState => missing_review_state.push(card), + } + total_docs += 1; + } + } + + Ok(DocDecisionBoard { + total_docs, + columns: vec![ + decision_column("open-questions", "Open questions", open_questions), + decision_column("risks", "Risks", risks), + decision_column("decided", "Decided", decided), + decision_column( + "missing-review-state", + "Missing review state", + missing_review_state, + ), + ], + }) +} + +fn traceability_board(input: DocCatalogInput) -> Result { + validate_catalog_size(&input)?; + + let mut unlinked = Vec::new(); + let mut implementation_linked = Vec::new(); + let mut doc_linked = Vec::new(); + let mut other_linked = Vec::new(); + let mut total_docs = 0_u32; + + for doc_type in input.types { + let project_name = required_field("project name", doc_type.project_name)?; + let type_name = required_field("doc type name", doc_type.type_name)?; + let label = clean_optional_label(doc_type.label).unwrap_or_else(|| type_name.clone()); + required_field("doc type slug", doc_type.slug)?; + + for file in doc_type.files { + let path = validate_doc_path(file.path)?; + validate_preview_len(&file.preview)?; + + let summary = summarize_preview(&path, &file.preview); + let references = summarize_references(SummarizeDocInput { + path, + preview: file.preview, + })?; + let implementation_reference_count = references + .references + .iter() + .filter(|reference| is_implementation_reference(&reference.kind)) + .count() as u32; + let doc_reference_count = references + .references + .iter() + .filter(|reference| reference.kind == "doc") + .count() as u32; + let other_reference_count = references + .reference_count + .saturating_sub(implementation_reference_count + doc_reference_count); + let status = property_value(&summary, "status").unwrap_or_default(); + let card = DocTraceabilityCard { + project_name: project_name.clone(), + type_name: type_name.clone(), + type_label: label.clone(), + path: summary.path, + title: summary.title, + status, + reference_count: references.reference_count, + implementation_reference_count, + doc_reference_count, + other_reference_count, + references: references.references, + }; + + match traceability_lane(&card) { + TraceabilityLane::Unlinked => unlinked.push(card), + TraceabilityLane::ImplementationLinked => implementation_linked.push(card), + TraceabilityLane::DocLinked => doc_linked.push(card), + TraceabilityLane::OtherLinked => other_linked.push(card), + } + total_docs += 1; + } + } + + Ok(DocTraceabilityBoard { + total_docs, + columns: vec![ + traceability_column("unlinked", "Unlinked", unlinked), + traceability_column( + "implementation-linked", + "Implementation linked", + implementation_linked, + ), + traceability_column("doc-linked", "Doc linked", doc_linked), + traceability_column("other-linked", "Other links", other_linked), + ], + }) +} + +fn scenario_board(input: DocCatalogInput) -> Result { + validate_catalog_size(&input)?; + + let mut missing_feature = Vec::new(); + let mut missing_scenarios = Vec::new(); + let mut needs_steps = Vec::new(); + let mut ready = Vec::new(); + let mut total_docs = 0_u32; + + for doc_type in input.types { + let project_name = required_field("project name", doc_type.project_name)?; + let type_name = required_field("doc type name", doc_type.type_name)?; + let label = clean_optional_label(doc_type.label).unwrap_or_else(|| type_name.clone()); + required_field("doc type slug", doc_type.slug)?; + + for file in doc_type.files { + let path = validate_doc_path(file.path)?; + validate_preview_len(&file.preview)?; + + let summary = summarize_preview(&path, &file.preview); + let scenarios = summarize_scenarios(SummarizeDocInput { + path, + preview: file.preview, + })?; + let scenarios_without_steps = scenarios + .scenarios + .iter() + .filter(|scenario| scenario.step_count == 0) + .count() as u32; + let status = property_value(&summary, "status").unwrap_or_default(); + let card = DocScenarioCard { + project_name: project_name.clone(), + type_name: type_name.clone(), + type_label: label.clone(), + path: summary.path, + title: summary.title, + status, + feature: scenarios.feature, + scenario_count: scenarios.scenario_count, + step_count: scenarios.step_count, + scenarios_without_steps, + }; + + match scenario_lane(&card) { + ScenarioLane::MissingFeature => missing_feature.push(card), + ScenarioLane::MissingScenarios => missing_scenarios.push(card), + ScenarioLane::NeedsSteps => needs_steps.push(card), + ScenarioLane::Ready => ready.push(card), + } + total_docs += 1; + } + } + + Ok(DocScenarioBoard { + total_docs, + columns: vec![ + scenario_column("missing-feature", "Missing feature", missing_feature), + scenario_column("missing-scenarios", "Missing scenarios", missing_scenarios), + scenario_column("needs-steps", "Needs steps", needs_steps), + scenario_column("ready", "Ready", ready), + ], + }) +} + +fn summarize_scenarios(input: SummarizeDocInput) -> Result { + let path = validate_doc_path(input.path)?; + validate_preview_len(&input.preview)?; + + let (_has_front_matter, properties, body) = parse_front_matter(&input.preview); + let title = front_matter_value(&properties, "title").unwrap_or_else(|| fallback_title(&path)); + let mut feature = front_matter_value(&properties, "feature"); + let mut scenarios = Vec::new(); + let mut current = None; + + for raw_line in body.lines() { + let line = normalize_bdd_line(raw_line); + if line.is_empty() || line.starts_with("```") || line.starts_with("~~~") { + continue; + } + + if let Some(raw_feature) = strip_ascii_prefix(line, "Feature:") { + let cleaned = raw_feature.trim(); + if !cleaned.is_empty() { + feature = Some(cleaned.to_string()); + } + continue; + } + + if let Some((kind, title)) = bdd_scenario_heading(line) { + finish_bdd_scenario(&mut scenarios, &mut current); + current = Some(BddScenarioDraft::new(kind, title)); + continue; + } + + if let Some(step) = bdd_step(line) { + current + .get_or_insert_with(|| BddScenarioDraft::new("background", "Background")) + .steps + .push(step); + } + } + + finish_bdd_scenario(&mut scenarios, &mut current); + let step_count = scenarios + .iter() + .map(|scenario| scenario.step_count) + .sum::(); + + Ok(BddSummary { + path, + title, + feature, + scenario_count: scenarios.len() as u32, + step_count, + scenarios, + }) +} + +fn summarize_checklists(input: SummarizeDocInput) -> Result { + let path = validate_doc_path(input.path)?; + validate_preview_len(&input.preview)?; + + let (_has_front_matter, properties, body) = parse_front_matter(&input.preview); + let title = front_matter_value(&properties, "title").unwrap_or_else(|| fallback_title(&path)); + let mut sections = Vec::new(); + let mut current_heading = None; + let mut in_fence = false; + + for raw_line in body.lines() { + let line = normalize_markdown_line(raw_line); + if line.starts_with("```") || line.starts_with("~~~") { + in_fence = !in_fence; + continue; + } + if in_fence || line.is_empty() { + continue; + } + + if let Some(heading) = markdown_heading(line) { + current_heading = Some(heading); + continue; + } + + if let Some(item) = checklist_item(line) { + push_checklist_item(&mut sections, current_heading.as_deref(), item); + } + } + + let sections = sections + .into_iter() + .map(DocChecklistSectionDraft::finish) + .collect::>(); + let total_items = sections + .iter() + .map(|section| section.item_count) + .sum::(); + let checked_items = sections + .iter() + .map(|section| section.checked_count) + .sum::(); + + Ok(DocChecklistSummary { + path, + title, + total_items, + checked_items, + sections, + }) +} + +fn summarize_references(input: SummarizeDocInput) -> Result { + let path = validate_doc_path(input.path)?; + validate_preview_len(&input.preview)?; + + let (_has_front_matter, properties, body) = parse_front_matter(&input.preview); + let title = front_matter_value(&properties, "title").unwrap_or_else(|| fallback_title(&path)); + let mut references = Vec::new(); + let mut in_fence = false; + + for (line_index, raw_line) in body.lines().enumerate() { + let line = normalize_markdown_line(raw_line); + if line.starts_with("```") || line.starts_with("~~~") { + in_fence = !in_fence; + continue; + } + if in_fence || line.is_empty() { + continue; + } + + let line_number = line_index as u32 + 1; + extract_markdown_link_references(line, line_number, &mut references); + extract_plain_uri_references(line, line_number, &mut references); + extract_issue_number_references(line, line_number, &mut references); + } + + Ok(DocReferenceSummary { + path, + title, + reference_count: references.len() as u32, + references, + }) +} + +fn summarize_outline(input: SummarizeDocInput) -> Result { + let path = validate_doc_path(input.path)?; + validate_preview_len(&input.preview)?; + + let (_has_front_matter, properties, body) = parse_front_matter(&input.preview); + let title = front_matter_value(&properties, "title").unwrap_or_else(|| fallback_title(&path)); + let mut headings = Vec::new(); + let mut slug_counts = HashMap::new(); + let mut in_fence = false; + + for (line_index, raw_line) in body.lines().enumerate() { + let line = normalize_markdown_line(raw_line); + if line.starts_with("```") || line.starts_with("~~~") { + in_fence = !in_fence; + continue; + } + if in_fence || line.is_empty() { + continue; + } + + if let Some((level, title)) = markdown_heading_with_level(line) { + let slug = unique_heading_slug(heading_slug(&title), &mut slug_counts); + headings.push(DocOutlineHeading { + level, + title, + slug, + line: line_index as u32 + 1, + }); + } + } + + Ok(DocOutlineSummary { + path, + title, + heading_count: headings.len() as u32, + headings, + }) +} + +fn summarize_decisions(input: SummarizeDocInput) -> Result { + let path = validate_doc_path(input.path)?; + validate_preview_len(&input.preview)?; + + let (_has_front_matter, properties, body) = parse_front_matter(&input.preview); + let title = front_matter_value(&properties, "title").unwrap_or_else(|| fallback_title(&path)); + let mut items = Vec::new(); + let mut current_kind = None; + let mut in_fence = false; + + for (line_index, raw_line) in body.lines().enumerate() { + let line = normalize_markdown_line(raw_line); + if line.starts_with("```") || line.starts_with("~~~") { + in_fence = !in_fence; + continue; + } + if in_fence || line.is_empty() { + continue; + } + + let line_number = line_index as u32 + 1; + if let Some((_level, heading)) = markdown_heading_with_level(line) { + current_kind = decision_heading_kind(&heading); + if let Some((kind, text)) = prefixed_decision_text(&heading) { + push_decision_item(&mut items, kind, text, line_number); + } + continue; + } + + if let Some((kind, text)) = prefixed_decision_text(line) { + push_decision_item(&mut items, kind, text, line_number); + continue; + } + + if let Some(kind) = current_kind { + if let Some(text) = section_decision_text(line) { + push_decision_item(&mut items, kind, text, line_number); + } + } + } + + Ok(DocDecisionSummary { + path, + title, + decision_count: decision_kind_count(&items, "decision"), + open_question_count: decision_kind_count(&items, "open-question"), + risk_count: decision_kind_count(&items, "risk"), + items, + }) +} + +fn decision_heading_kind(title: &str) -> Option<&'static str> { + match heading_slug(title).as_str() { + "decision" | "decisions" | "design-decisions" | "accepted-decisions" => Some("decision"), + "open-question" | "open-questions" | "questions" | "unknowns" => Some("open-question"), + "risk" | "risks" | "risk-mitigations" | "risks-mitigations" => Some("risk"), + _ => None, + } +} + +fn prefixed_decision_text(line: &str) -> Option<(&'static str, String)> { + let line = strip_task_marker(strip_markdown_list_marker(line).unwrap_or(line)).trim(); + [ + ("Decision:", "decision"), + ("Decided:", "decision"), + ("Open question:", "open-question"), + ("Question:", "open-question"), + ("Risk:", "risk"), + ] + .into_iter() + .find_map(|(prefix, kind)| { + strip_ascii_prefix(line, prefix) + .and_then(|text| clean_optional_label(text.to_string()).map(|cleaned| (kind, cleaned))) + }) +} + +fn section_decision_text(line: &str) -> Option { + let text = strip_markdown_list_marker(line)?; + clean_optional_label(strip_task_marker(text).to_string()) +} + +fn strip_task_marker(text: &str) -> &str { + let text = text.trim(); + ["[ ]", "[x]", "[X]"] + .into_iter() + .find_map(|prefix| text.strip_prefix(prefix)) + .map(str::trim) + .unwrap_or(text) +} + +fn push_decision_item( + items: &mut Vec, + kind: &'static str, + text: String, + line: u32, +) { + items.push(DocDecisionItem { + kind: kind.to_string(), + text, + line, + }); +} + +fn decision_kind_count(items: &[DocDecisionItem], kind: &str) -> u32 { + items.iter().filter(|item| item.kind == kind).count() as u32 +} + +fn extract_markdown_link_references( + line: &str, + line_number: u32, + references: &mut Vec, +) { + let mut remaining = line; + while let Some(open_label) = remaining.find('[') { + let after_open = &remaining[open_label + 1..]; + let Some(close_label) = after_open.find(']') else { + break; + }; + let label = &after_open[..close_label]; + let after_label = &after_open[close_label + 1..]; + if !after_label.starts_with('(') { + remaining = after_label; + continue; + } + let after_open_target = &after_label[1..]; + let Some(close_target) = after_open_target.find(')') else { + break; + }; + let raw_target = after_open_target[..close_target] + .split_whitespace() + .next() + .unwrap_or_default(); + if let Some(reference) = doc_reference(raw_target, Some(label), line_number) { + push_reference_once(references, reference); + } + remaining = &after_open_target[close_target + 1..]; + } +} + +fn extract_plain_uri_references(line: &str, line_number: u32, references: &mut Vec) { + let mut search_start = 0; + while let Some(offset) = line[search_start..].find("comtrya://") { + let start = search_start + offset; + if start > 0 && line.as_bytes()[start - 1] == b'(' { + search_start = start + "comtrya://".len(); + continue; + } + + let raw_target = reference_token(&line[start..]); + if let Some(reference) = doc_reference(raw_target, None, line_number) { + push_reference_once(references, reference); + } + search_start = start + raw_target.len().max("comtrya://".len()); + } +} + +fn extract_issue_number_references( + line: &str, + line_number: u32, + references: &mut Vec, +) { + let bytes = line.as_bytes(); + let mut idx = 0; + while idx < bytes.len() { + if bytes[idx] != b'#' || idx + 1 >= bytes.len() || !bytes[idx + 1].is_ascii_digit() { + idx += 1; + continue; + } + if idx > 0 && is_reference_word_byte(bytes[idx - 1]) { + idx += 1; + continue; + } + + let mut end = idx + 2; + while end < bytes.len() && bytes[end].is_ascii_digit() { + end += 1; + } + let target = &line[idx..end]; + if let Some(reference) = doc_reference(target, None, line_number) { + push_reference_once(references, reference); + } + idx = end; + } +} + +fn reference_token(raw: &str) -> &str { + let end = raw + .find(|ch: char| { + ch.is_ascii_whitespace() + || matches!(ch, ')' | ']' | '}' | '>' | '"' | '\'' | '`' | ',' | ';') + }) + .unwrap_or(raw.len()); + raw[..end].trim_end_matches(['.', '!', '?', ':']) +} + +fn doc_reference(target: &str, label: Option<&str>, line: u32) -> Option { + let target = target.trim(); + if target.is_empty() { + return None; + } + + let kind = reference_kind(target)?; + let label = label.and_then(|value| clean_optional_label(value.to_string())); + Some(DocReference { + kind, + target: target.to_string(), + label, + line, + }) +} + +fn reference_kind(target: &str) -> Option { + if target.starts_with('#') && target[1..].chars().all(|ch| ch.is_ascii_digit()) { + return Some("issue-number".to_string()); + } + + let rest = target.strip_prefix("comtrya://")?; + let kind = rest.split('/').next().unwrap_or_default().trim(); + (!kind.is_empty()).then(|| kind.to_string()) +} + +fn push_reference_once(references: &mut Vec, reference: DocReference) { + if references + .iter() + .any(|existing| existing.target == reference.target && existing.line == reference.line) + { + return; + } + references.push(reference); +} + +fn is_reference_word_byte(byte: u8) -> bool { + byte.is_ascii_alphanumeric() || matches!(byte, b'_' | b'-') +} + +struct DocChecklistSectionDraft { + heading: String, + items: Vec, +} + +impl DocChecklistSectionDraft { + fn new(heading: impl Into) -> Self { + Self { + heading: heading.into(), + items: Vec::new(), + } + } + + fn finish(self) -> DocChecklistSection { + let checked_count = self.items.iter().filter(|item| item.checked).count() as u32; + DocChecklistSection { + heading: self.heading, + item_count: self.items.len() as u32, + checked_count, + items: self.items, + } + } +} + +fn push_checklist_item( + sections: &mut Vec, + heading: Option<&str>, + item: DocChecklistItem, +) { + let heading = heading.unwrap_or("Checklist"); + let needs_section = sections + .last() + .map(|section| section.heading != heading) + .unwrap_or(true); + if needs_section { + sections.push(DocChecklistSectionDraft::new(heading)); + } + sections + .last_mut() + .expect("checklist section should exist") + .items + .push(item); +} + +fn normalize_markdown_line(line: &str) -> &str { + let mut line = line.trim(); + while let Some(rest) = line.strip_prefix('>') { + line = rest.trim_start(); + } + line +} + +fn markdown_heading(line: &str) -> Option { + markdown_heading_with_level(line).map(|(_level, title)| title) +} + +fn markdown_heading_with_level(line: &str) -> Option<(u32, String)> { + let level = line.chars().take_while(|ch| *ch == '#').count(); + if level == 0 || level > 6 { + return None; + } + let rest = line.get(level..)?; + if !rest + .chars() + .next() + .is_some_and(|ch| ch.is_ascii_whitespace()) + { + return None; + } + clean_optional_label(rest.trim().trim_end_matches('#').trim().to_string()) + .map(|title| (level as u32, title)) +} + +fn heading_slug(title: &str) -> String { + let mut slug = String::new(); + let mut pending_separator = false; + + for ch in title.chars() { + if ch.is_ascii_alphanumeric() { + if pending_separator && !slug.is_empty() { + slug.push('-'); + } + slug.push(ch.to_ascii_lowercase()); + pending_separator = false; + } else { + pending_separator = true; + } + } + + if slug.is_empty() { + "section".to_string() + } else { + slug + } +} + +fn unique_heading_slug(base: String, counts: &mut HashMap) -> String { + let count = counts.entry(base.clone()).or_insert(0); + *count += 1; + + if *count == 1 { + base + } else { + format!("{base}-{count}") + } +} + +fn checklist_item(line: &str) -> Option { + let item = strip_markdown_list_marker(line)?; + let (checked, rest) = if let Some(rest) = item.strip_prefix("[ ]") { + (false, rest) + } else if let Some(rest) = item + .strip_prefix("[x]") + .or_else(|| item.strip_prefix("[X]")) + { + (true, rest) + } else { + return None; + }; + let text = rest.trim(); + (!text.is_empty()).then(|| DocChecklistItem { + text: text.to_string(), + checked, + }) +} + +fn strip_markdown_list_marker(line: &str) -> Option<&str> { + ["- ", "* ", "+ "] + .into_iter() + .find_map(|prefix| line.strip_prefix(prefix)) + .or_else(|| { + let (marker, rest) = line.split_once(". ")?; + marker.chars().all(|ch| ch.is_ascii_digit()).then_some(rest) + }) +} + +#[derive(Default)] +struct BddScenarioDraft { + kind: String, + title: String, + steps: Vec, +} + +impl BddScenarioDraft { + fn new(kind: impl Into, title: impl Into) -> Self { + Self { + kind: kind.into(), + title: title.into(), + steps: Vec::new(), + } + } + + fn finish(self) -> BddScenario { + BddScenario { + kind: self.kind, + title: self.title, + step_count: self.steps.len() as u32, + steps: self.steps, + } + } +} + +fn finish_bdd_scenario(scenarios: &mut Vec, current: &mut Option) { + if let Some(scenario) = current.take() { + scenarios.push(scenario.finish()); + } +} + +fn normalize_bdd_line(line: &str) -> &str { + let mut line = line.trim(); + while let Some(rest) = line.strip_prefix('>') { + line = rest.trim_start(); + } + if let Some(rest) = line.strip_prefix("- ") { + return rest.trim_start(); + } + if let Some(rest) = line.strip_prefix("+ ") { + return rest.trim_start(); + } + strip_ordered_list_marker(line) +} + +fn strip_ordered_list_marker(line: &str) -> &str { + let Some((marker, rest)) = line.split_once(". ") else { + return line; + }; + if marker.chars().all(|ch| ch.is_ascii_digit()) { + rest.trim_start() + } else { + line + } +} + +fn bdd_scenario_heading(line: &str) -> Option<(&'static str, String)> { + [ + ("Scenario Outline:", "scenario-outline", "Scenario Outline"), + ("Scenario:", "scenario", "Scenario"), + ("Example:", "example", "Example"), + ("Background:", "background", "Background"), + ] + .into_iter() + .find_map(|(prefix, kind, fallback_title)| { + strip_ascii_prefix(line, prefix).map(|raw_title| { + let title = clean_optional_label(raw_title.to_string()) + .unwrap_or_else(|| fallback_title.to_string()); + (kind, title) + }) + }) +} + +fn bdd_step(line: &str) -> Option { + ["Given", "When", "Then", "And", "But", "*"] + .into_iter() + .find_map(|keyword| { + let rest = strip_ascii_prefix(line, keyword)?; + let starts_with_separator = rest + .chars() + .next() + .is_some_and(|ch| ch.is_ascii_whitespace()); + if !starts_with_separator { + return None; + } + let text = rest.trim(); + (!text.is_empty()).then(|| BddStep { + keyword: keyword.to_string(), + text: text.to_string(), + }) + }) +} + +fn strip_ascii_prefix<'a>(line: &'a str, prefix: &str) -> Option<&'a str> { + let candidate = line.get(..prefix.len())?; + candidate + .eq_ignore_ascii_case(prefix) + .then(|| &line[prefix.len()..]) +} + +fn summarize_doc_type(input: DocTypeInput) -> Result { + let project_name = required_field("project name", input.project_name)?; + let type_name = required_field("doc type name", input.type_name)?; + let slug = required_field("doc type slug", input.slug)?; + let label = clean_optional_label(input.label).unwrap_or_else(|| type_name.clone()); + let description = input.description.and_then(clean_optional_label); + + let mut docs = Vec::with_capacity(input.files.len()); + for file in input.files { + let path = validate_doc_path(file.path)?; + validate_preview_len(&file.preview)?; + docs.push(summarize_preview(&path, &file.preview)); + } + + Ok(DocTypeSummary { + project_name, + type_name, + label, + description, + slug, + doc_count: docs.len() as u32, + docs, + }) +} + +fn type_card(doc_type: &DocTypeSummary, doc: &DocSummary) -> DocTypeCard { + DocTypeCard { + project_name: doc_type.project_name.clone(), + type_name: doc_type.type_name.clone(), + type_label: doc_type.label.clone(), + slug: doc_type.slug.clone(), + path: doc.path.clone(), + title: doc.title.clone(), + status: property_value(doc, "status").unwrap_or_default(), + owner: property_value(doc, "owner"), + tags: property_value(doc, "tags") + .map(|value| parse_tag_list(&value)) + .unwrap_or_default(), + } +} + +fn status_card(doc_type: &DocTypeSummary, doc: &DocSummary) -> DocStatusCard { + let status = property_value(doc, "status").unwrap_or_default(); + DocStatusCard { + project_name: doc_type.project_name.clone(), + type_name: doc_type.type_name.clone(), + type_label: doc_type.label.clone(), + path: doc.path.clone(), + title: doc.title.clone(), + owner: property_value(doc, "owner"), + status, + } +} + +fn owner_card(doc_type: &DocTypeSummary, doc: &DocSummary) -> DocOwnerCard { + DocOwnerCard { + project_name: doc_type.project_name.clone(), + type_name: doc_type.type_name.clone(), + type_label: doc_type.label.clone(), + path: doc.path.clone(), + title: doc.title.clone(), + status: property_value(doc, "status").unwrap_or_default(), + owner: property_value(doc, "owner"), + } +} + +fn tag_card(doc_type: &DocTypeSummary, doc: &DocSummary) -> DocTagCard { + DocTagCard { + project_name: doc_type.project_name.clone(), + type_name: doc_type.type_name.clone(), + type_label: doc_type.label.clone(), + path: doc.path.clone(), + title: doc.title.clone(), + status: property_value(doc, "status").unwrap_or_default(), + tags: property_value(doc, "tags") + .map(|value| parse_tag_list(&value)) + .unwrap_or_default(), + } +} + +fn property_value(doc: &DocSummary, key: &str) -> Option { + doc.properties + .iter() + .find_map(|property| { + property + .key + .eq_ignore_ascii_case(key) + .then(|| property.value.trim()) + }) + .filter(|value| !value.is_empty()) + .map(ToString::to_string) +} + +fn front_matter_value(properties: &[(String, String)], key: &str) -> Option { + properties + .iter() + .find_map(|(property_key, value)| { + property_key.eq_ignore_ascii_case(key).then(|| value.trim()) + }) + .filter(|value| !value.is_empty()) + .map(ToString::to_string) +} + +fn type_column( + key: impl Into, + label: impl Into, + type_name: impl Into, + docs: Vec, +) -> DocTypeColumn { + DocTypeColumn { + key: key.into(), + label: label.into(), + type_name: type_name.into(), + count: docs.len() as u32, + docs, + } +} + +fn status_column( + key: impl Into, + label: impl Into, + docs: Vec, +) -> DocStatusColumn { + DocStatusColumn { + key: key.into(), + label: label.into(), + count: docs.len() as u32, + docs, + } +} + +fn owner_column( + key: impl Into, + label: impl Into, + owner: Option, + docs: Vec, +) -> DocOwnerColumn { + DocOwnerColumn { + key: key.into(), + label: label.into(), + owner, + count: docs.len() as u32, + docs, + } +} + +fn tag_column( + key: impl Into, + label: impl Into, + tag: Option, + docs: Vec, +) -> DocTagColumn { + DocTagColumn { + key: key.into(), + label: label.into(), + tag, + count: docs.len() as u32, + docs, + } +} + +fn project_column( + key: impl Into, + label: impl Into, + project_name: Option, + docs: Vec, +) -> DocProjectColumn { + DocProjectColumn { + key: key.into(), + label: label.into(), + project_name, + count: docs.len() as u32, + docs, + } +} + +fn readiness_column( + key: impl Into, + label: impl Into, + docs: Vec, +) -> DocReadinessColumn { + DocReadinessColumn { + key: key.into(), + label: label.into(), + count: docs.len() as u32, + docs, + } +} + +fn handoff_column( + key: impl Into, + label: impl Into, + docs: Vec, +) -> DocHandoffColumn { + DocHandoffColumn { + key: key.into(), + label: label.into(), + count: docs.len() as u32, + docs, + } +} + +fn implementation_column( + key: impl Into, + label: impl Into, + docs: Vec, +) -> DocImplementationColumn { + DocImplementationColumn { + key: key.into(), + label: label.into(), + count: docs.len() as u32, + docs, + } +} + +fn decision_column( + key: impl Into, + label: impl Into, + docs: Vec, +) -> DocDecisionColumn { + DocDecisionColumn { + key: key.into(), + label: label.into(), + count: docs.len() as u32, + docs, + } +} + +fn traceability_column( + key: impl Into, + label: impl Into, + docs: Vec, +) -> DocTraceabilityColumn { + DocTraceabilityColumn { + key: key.into(), + label: label.into(), + count: docs.len() as u32, + docs, + } +} + +fn scenario_column( + key: impl Into, + label: impl Into, + docs: Vec, +) -> DocScenarioColumn { + DocScenarioColumn { + key: key.into(), + label: label.into(), + count: docs.len() as u32, + docs, + } +} + +enum StatusLane { + Draft, + Active, + Done, + Other, + Missing, +} + +fn status_lane(status: &str) -> StatusLane { + match normalize_status(status).as_str() { + "" => StatusLane::Missing, + "draft" | "planned" | "planning" | "proposed" | "todo" | "backlog" => StatusLane::Draft, + "accepted" | "active" | "in-progress" | "ready" | "review" | "shipping" => { + StatusLane::Active + } + "closed" | "complete" | "completed" | "done" | "shipped" => StatusLane::Done, + _ => StatusLane::Other, + } +} + +fn normalize_status(status: &str) -> String { + status.trim().to_ascii_lowercase().replace([' ', '_'], "-") +} + +fn owner_key(owner: &str) -> String { + let mut key = String::new(); + let mut last_was_dash = false; + for ch in owner.trim().chars().flat_map(char::to_lowercase) { + if ch.is_ascii_alphanumeric() { + key.push(ch); + last_was_dash = false; + } else if !last_was_dash && !key.is_empty() { + key.push('-'); + last_was_dash = true; + } + } + while key.ends_with('-') { + key.pop(); + } + if key.is_empty() { + "unknown".to_string() + } else { + key + } +} + +fn tag_key(tag: &str) -> String { + owner_key(tag) +} + +fn doc_type_key(type_name: &str) -> String { + owner_key(type_name) +} + +fn project_key(project: &str) -> String { + owner_key(project) +} + +fn parse_tag_list(value: &str) -> Vec { + let trimmed = value + .trim() + .trim_start_matches('[') + .trim_end_matches(']') + .trim(); + if trimmed.is_empty() { + return Vec::new(); + } + + let mut tags = Vec::new(); + for raw in trimmed.split(',') { + let tag = raw + .trim() + .trim_matches('"') + .trim_matches('\'') + .trim() + .to_string(); + if tag.is_empty() || tags.iter().any(|existing| existing == &tag) { + continue; + } + tags.push(tag); + } + tags +} + +enum ReadinessLane { + NeedsCriteria, + InProgress, + Ready, +} + +enum HandoffLane { + NeedsCriteria, + NeedsScenarios, + NeedsProductReview, + ReadyForImplementation, + InImplementation, +} + +enum ImplementationLane { + NeedsAcceptance, + NeedsProductReview, + NeedsImplementationLink, + ReadyToBuild, + InImplementation, + Implemented, +} + +enum DecisionLane { + OpenQuestions, + Risks, + Decided, + MissingReviewState, +} + +enum TraceabilityLane { + Unlinked, + ImplementationLinked, + DocLinked, + OtherLinked, +} + +enum ScenarioLane { + MissingFeature, + MissingScenarios, + NeedsSteps, + Ready, +} + +fn readiness_lane(card: &DocReadinessCard) -> ReadinessLane { + if card.checklist_total > card.checklist_checked { + return ReadinessLane::InProgress; + } + + if card.scenario_count > 0 + || (card.checklist_total > 0 && card.checklist_checked == card.checklist_total) + { + return ReadinessLane::Ready; + } + + ReadinessLane::NeedsCriteria +} + +fn handoff_lane(card: &DocHandoffCard) -> HandoffLane { + if card.implementation_reference_count > 0 { + return HandoffLane::InImplementation; + } + + if card.checklist_total > card.checklist_checked + || (card.checklist_total == 0 && card.scenario_count == 0) + { + return HandoffLane::NeedsCriteria; + } + + if card.scenario_count == 0 { + return HandoffLane::NeedsScenarios; + } + + if card.open_question_count > 0 || card.risk_count > 0 { + return HandoffLane::NeedsProductReview; + } + + HandoffLane::ReadyForImplementation +} + +fn implementation_lane(card: &DocImplementationCard) -> ImplementationLane { + if card.implementation_reference_count > 0 && is_done_status(&card.status) { + return ImplementationLane::Implemented; + } + + if card.implementation_reference_count > 0 { + return ImplementationLane::InImplementation; + } + + if is_done_status(&card.status) { + return ImplementationLane::NeedsImplementationLink; + } + + if card.checklist_total > card.checklist_checked || card.scenario_count == 0 { + return ImplementationLane::NeedsAcceptance; + } + + if card.open_question_count > 0 || card.risk_count > 0 { + return ImplementationLane::NeedsProductReview; + } + + ImplementationLane::ReadyToBuild +} + +fn is_done_status(status: &str) -> bool { + matches!( + normalize_status(status).as_str(), + "closed" | "complete" | "completed" | "done" | "shipped" + ) +} + +fn decision_lane(card: &DocDecisionCard) -> DecisionLane { + if card.open_question_count > 0 { + return DecisionLane::OpenQuestions; + } + + if card.risk_count > 0 { + return DecisionLane::Risks; + } + + if card.decision_count > 0 { + return DecisionLane::Decided; + } + + DecisionLane::MissingReviewState +} + +fn traceability_lane(card: &DocTraceabilityCard) -> TraceabilityLane { + if card.implementation_reference_count > 0 { + return TraceabilityLane::ImplementationLinked; + } + + if card.doc_reference_count > 0 { + return TraceabilityLane::DocLinked; + } + + if card.other_reference_count > 0 { + return TraceabilityLane::OtherLinked; + } + + TraceabilityLane::Unlinked +} + +fn is_implementation_reference(kind: &str) -> bool { + matches!(kind, "epic" | "issue" | "issue-number" | "pull-request") +} + +fn scenario_lane(card: &DocScenarioCard) -> ScenarioLane { + if card.feature.is_none() { + return ScenarioLane::MissingFeature; + } + + if card.scenario_count == 0 { + return ScenarioLane::MissingScenarios; + } + + if card.step_count == 0 || card.scenarios_without_steps > 0 { + return ScenarioLane::NeedsSteps; + } + + ScenarioLane::Ready +} + +fn required_field(label: &str, value: String) -> Result { + let trimmed = value.trim(); + if trimmed.is_empty() { + return Err(err( + ErrorCode::BadInput, + format!("{label} must not be empty"), + )); + } + Ok(trimmed.to_string()) +} + +fn clean_optional_label(value: String) -> Option { + let trimmed = value.trim(); + (!trimmed.is_empty()).then(|| trimmed.to_string()) +} + +fn validate_doc_path(path: String) -> Result { + let path = path.trim(); + if path.is_empty() { + return Err(err(ErrorCode::BadInput, "doc path must not be empty")); + } + Ok(path.to_string()) +} + +fn validate_preview_len(preview: &str) -> Result<(), Error> { + if preview.len() > MAX_PREVIEW_LEN { + return Err(err( + ErrorCode::BadInput, + format!("doc preview must be at most {MAX_PREVIEW_LEN} bytes"), + )); + } + Ok(()) +} + +fn parse_front_matter(preview: &str) -> (bool, Vec<(String, String)>, &str) { + if !preview.starts_with("---") { + return (false, Vec::new(), preview); + } + let Some(end) = preview[3..].find("\n---").map(|idx| idx + 3) else { + return (false, Vec::new(), preview); + }; + let front = preview[3..end].trim(); + let body = preview[end + 4..] + .strip_prefix('\n') + .unwrap_or(&preview[end + 4..]); + let mut properties = Vec::new(); + for line in front.lines() { + let Some((raw_key, raw_value)) = line.split_once(':') else { + continue; + }; + let key = raw_key.trim(); + if key.is_empty() { + continue; + } + properties.push((key.to_string(), clean_front_matter_value(raw_value))); + } + (true, properties, body) +} + +fn clean_front_matter_value(raw: &str) -> String { + raw.trim() + .trim_matches('"') + .trim_matches('\'') + .trim() + .to_string() +} + +fn fallback_title(path: &str) -> String { + path.rsplit('/') + .next() + .filter(|name| !name.is_empty()) + .unwrap_or("(untitled)") + .to_string() +} + +fn body_excerpt(body: &str) -> String { + let collapsed = body.split_whitespace().collect::>().join(" "); + let mut out = collapsed.chars().take(EXCERPT_CHARS).collect::(); + if collapsed.chars().count() > EXCERPT_CHARS { + out.push_str("..."); + } + out +} impl DocsGuest for Component { fn ping() -> Result { Ok("ok".to_string()) } + + fn summarize_doc(input: SummarizeDocInput) -> Result { + let path = validate_doc_path(input.path)?; + validate_preview_len(&input.preview)?; + Ok(summarize_preview(&path, &input.preview)) + } + + fn summarize_catalog(input: DocCatalogInput) -> Result { + crate::summarize_catalog(input) + } + + fn type_board(input: DocCatalogInput) -> Result { + crate::type_board(input) + } + + fn status_board(input: DocCatalogInput) -> Result { + crate::status_board(input) + } + + fn owner_board(input: DocCatalogInput) -> Result { + crate::owner_board(input) + } + + fn tag_board(input: DocCatalogInput) -> Result { + crate::tag_board(input) + } + + fn project_board(input: DocCatalogInput) -> Result { + crate::project_board(input) + } + + fn summarize_scenarios(input: SummarizeDocInput) -> Result { + crate::summarize_scenarios(input) + } + + fn scenario_board(input: DocCatalogInput) -> Result { + crate::scenario_board(input) + } + + fn summarize_checklists(input: SummarizeDocInput) -> Result { + crate::summarize_checklists(input) + } + + fn summarize_references(input: SummarizeDocInput) -> Result { + crate::summarize_references(input) + } + + fn traceability_board(input: DocCatalogInput) -> Result { + crate::traceability_board(input) + } + + fn summarize_outline(input: SummarizeDocInput) -> Result { + crate::summarize_outline(input) + } + + fn summarize_decisions(input: SummarizeDocInput) -> Result { + crate::summarize_decisions(input) + } + + fn decision_board(input: DocCatalogInput) -> Result { + crate::decision_board(input) + } + + fn readiness_board(input: DocCatalogInput) -> Result { + crate::readiness_board(input) + } + + fn handoff_board(input: DocCatalogInput) -> Result { + crate::handoff_board(input) + } + + fn implementation_board(input: DocCatalogInput) -> Result { + crate::implementation_board(input) + } } impl ReactorGuest for Component { @@ -33,3 +2085,1641 @@ impl ReactorGuest for Component { } bindings::export!(Component with_types_in bindings); + +#[cfg(test)] +mod tests { + use super::bindings::exports::comtrya::ext_docs::docs::{ + DocCatalogInput, DocTypeInput, SummarizeDocInput, + }; + + use super::{ + decision_board, handoff_board, implementation_board, owner_board, project_board, + readiness_board, scenario_board, status_board, summarize_catalog, summarize_checklists, + summarize_decisions, summarize_outline, summarize_preview, summarize_references, + summarize_scenarios, tag_board, traceability_board, type_board, MAX_CATALOG_DOCS, + }; + + #[test] + fn summary_uses_front_matter_title_and_excerpt() { + let summary = summarize_preview( + "crates/server/docs/specs/extension-runtime.mdx", + "---\ntitle: Extension runtime\nowner: platform-maintainers\nstatus: shipping\n---\n\nFirst-party extensions are Component Model WASM components loaded by Wasmtime.", + ); + + assert_eq!( + summary.path, + "crates/server/docs/specs/extension-runtime.mdx" + ); + assert_eq!(summary.title, "Extension runtime"); + assert_eq!(summary.property_count, 3); + assert_eq!(summary.properties.len(), 3); + assert_eq!(summary.properties[0].key, "title"); + assert_eq!(summary.properties[0].value, "Extension runtime"); + assert_eq!(summary.properties[1].key, "owner"); + assert_eq!(summary.properties[1].value, "platform-maintainers"); + assert!(summary.has_front_matter); + assert!(summary.body_excerpt.starts_with("First-party extensions")); + } + + #[test] + fn summary_falls_back_to_filename_without_front_matter() { + let summary = summarize_preview("docs/plain-note.mdx", "No front matter here."); + + assert_eq!(summary.title, "plain-note.mdx"); + assert_eq!(summary.property_count, 0); + assert!(summary.properties.is_empty()); + assert!(!summary.has_front_matter); + assert_eq!(summary.body_excerpt, "No front matter here."); + } + + #[test] + fn catalog_groups_project_doc_types_and_summaries() { + let catalog = summarize_catalog(DocCatalogInput { + types: vec![ + DocTypeInput { + project_name: "backend".to_string(), + type_name: "prd".to_string(), + label: "Backend PRDs".to_string(), + description: Some("Product requirements".to_string()), + slug: "server/docs/prds".to_string(), + files: vec![SummarizeDocInput { + path: "crates/server/docs/prds/repository-docs-surface.mdx".to_string(), + preview: + "---\ntitle: Repository Docs Surface\nstatus: active\n---\n\nDevelopers expect a forge to keep product intent beside implementation." + .to_string(), + }], + }, + DocTypeInput { + project_name: "backend".to_string(), + type_name: "scenario".to_string(), + label: "BDD Scenarios".to_string(), + description: None, + slug: "server/docs/scenarios".to_string(), + files: vec![SummarizeDocInput { + path: "crates/server/docs/scenarios/repository-docs-surface.mdx" + .to_string(), + preview: + "---\ntitle: Repository docs are discoverable\nfeature: repository-docs\n---\n\nGiven the Comtrya repository has opted into ext_docs" + .to_string(), + }], + }, + ], + }) + .expect("catalog should summarize"); + + assert_eq!(catalog.total_docs, 2); + assert_eq!(catalog.types.len(), 2); + assert_eq!(catalog.types[0].project_name, "backend"); + assert_eq!(catalog.types[0].type_name, "prd"); + assert_eq!(catalog.types[0].doc_count, 1); + assert_eq!(catalog.types[0].docs[0].title, "Repository Docs Surface"); + assert_eq!(catalog.types[1].type_name, "scenario"); + assert_eq!(catalog.types[1].docs[0].properties[1].key, "feature"); + } + + #[test] + fn catalog_rejects_empty_type_metadata() { + let err = summarize_catalog(DocCatalogInput { + types: vec![DocTypeInput { + project_name: "backend".to_string(), + type_name: " ".to_string(), + label: String::new(), + description: None, + slug: "server/docs/prds".to_string(), + files: Vec::new(), + }], + }) + .expect_err("empty type name should be rejected"); + + assert!(err.message.contains("doc type name")); + } + + #[test] + fn catalog_rejects_too_many_docs() { + let files = (0..=MAX_CATALOG_DOCS) + .map(|idx| SummarizeDocInput { + path: format!("docs/{idx}.mdx"), + preview: "body".to_string(), + }) + .collect(); + + let err = summarize_catalog(DocCatalogInput { + types: vec![DocTypeInput { + project_name: "backend".to_string(), + type_name: "spec".to_string(), + label: "Specs".to_string(), + description: None, + slug: "server/docs/specs".to_string(), + files, + }], + }) + .expect_err("catalog limit should be enforced"); + + assert!(err.message.contains("4096")); + } + + #[test] + fn type_board_groups_docs_by_configured_type() { + let board = type_board(DocCatalogInput { + types: vec![ + DocTypeInput { + project_name: "backend".to_string(), + type_name: "prd".to_string(), + label: "Backend PRDs".to_string(), + description: None, + slug: "server/docs/prds".to_string(), + files: vec![SummarizeDocInput { + path: "crates/server/docs/prds/repository-docs-surface.mdx" + .to_string(), + preview: + "---\ntitle: Repository Docs Surface\nowner: Platform Maintainers\nstatus: active\ntags: [docs, product]\n---\n\nIntent." + .to_string(), + }], + }, + DocTypeInput { + project_name: "frontend".to_string(), + type_name: "prd".to_string(), + label: "Frontend PRDs".to_string(), + description: None, + slug: "frontend/docs/prds".to_string(), + files: vec![SummarizeDocInput { + path: "frontend/docs/prds/shell-navigation.mdx".to_string(), + preview: + "---\ntitle: Shell Navigation\nstatus: planned\n---\n\nIntent." + .to_string(), + }], + }, + DocTypeInput { + project_name: "backend".to_string(), + type_name: "scenario".to_string(), + label: "BDD Scenarios".to_string(), + description: None, + slug: "server/docs/scenarios".to_string(), + files: vec![SummarizeDocInput { + path: "crates/server/docs/scenarios/repository-docs-surface.mdx" + .to_string(), + preview: + "---\ntitle: Repository docs are discoverable\nstatus: review\ntags: bdd, docs\n---\n\nGiven..." + .to_string(), + }], + }, + DocTypeInput { + project_name: "backend".to_string(), + type_name: "spec".to_string(), + label: "Specs".to_string(), + description: None, + slug: "server/docs/specs".to_string(), + files: Vec::new(), + }, + ], + }) + .expect("type board should summarize"); + + assert_eq!(board.total_docs, 3); + assert_eq!( + board + .columns + .iter() + .map(|column| column.key.as_str()) + .collect::>(), + ["type-prd", "type-scenario", "type-spec"] + ); + + let prds = board + .columns + .iter() + .find(|column| column.key == "type-prd") + .expect("prd column"); + assert_eq!(prds.label, "prd"); + assert_eq!(prds.type_name, "prd"); + assert_eq!(prds.count, 2); + assert_eq!(prds.docs[0].project_name, "backend"); + assert_eq!(prds.docs[0].type_label, "Backend PRDs"); + assert_eq!(prds.docs[0].slug, "server/docs/prds"); + assert_eq!(prds.docs[0].owner.as_deref(), Some("Platform Maintainers")); + assert_eq!(prds.docs[0].tags, ["docs", "product"]); + assert_eq!(prds.docs[1].project_name, "frontend"); + assert_eq!(prds.docs[1].type_label, "Frontend PRDs"); + + let scenarios = board + .columns + .iter() + .find(|column| column.key == "type-scenario") + .expect("scenario column"); + assert_eq!(scenarios.count, 1); + assert_eq!(scenarios.docs[0].tags, ["bdd", "docs"]); + + let specs = board + .columns + .iter() + .find(|column| column.key == "type-spec") + .expect("spec column"); + assert_eq!(specs.label, "Specs"); + assert_eq!(specs.count, 0); + assert!(specs.docs.is_empty()); + } + + #[test] + fn status_board_groups_docs_by_front_matter_status() { + let board = status_board(DocCatalogInput { + types: vec![ + DocTypeInput { + project_name: "backend".to_string(), + type_name: "prd".to_string(), + label: "Backend PRDs".to_string(), + description: None, + slug: "server/docs/prds".to_string(), + files: vec![ + SummarizeDocInput { + path: "crates/server/docs/prds/repository-docs-surface.mdx" + .to_string(), + preview: + "---\ntitle: Repository Docs Surface\nowner: platform-maintainers\nstatus: active\n---\n\nIntent." + .to_string(), + }, + SummarizeDocInput { + path: "crates/server/docs/prds/repository-docs-next.mdx" + .to_string(), + preview: "---\ntitle: Next Docs Surface\nstatus: planned\n---\n\nIntent." + .to_string(), + }, + ], + }, + DocTypeInput { + project_name: "backend".to_string(), + type_name: "scenario".to_string(), + label: "BDD Scenarios".to_string(), + description: None, + slug: "server/docs/scenarios".to_string(), + files: vec![ + SummarizeDocInput { + path: "crates/server/docs/scenarios/repository-docs-surface.mdx" + .to_string(), + preview: + "---\ntitle: Repository docs are discoverable\nstatus: shipped\n---\n\nGiven..." + .to_string(), + }, + SummarizeDocInput { + path: "crates/server/docs/scenarios/missing-status.mdx".to_string(), + preview: "---\ntitle: Missing Status\n---\n\nGiven...".to_string(), + }, + ], + }, + ], + }) + .expect("status board should summarize"); + + assert_eq!(board.total_docs, 4); + let draft = board + .columns + .iter() + .find(|column| column.key == "draft") + .expect("draft column"); + assert_eq!(draft.count, 1); + assert_eq!(draft.docs[0].title, "Next Docs Surface"); + + let active = board + .columns + .iter() + .find(|column| column.key == "active") + .expect("active column"); + assert_eq!(active.count, 1); + assert_eq!( + active.docs[0].owner.as_deref(), + Some("platform-maintainers") + ); + assert_eq!(active.docs[0].type_label, "Backend PRDs"); + + let done = board + .columns + .iter() + .find(|column| column.key == "done") + .expect("done column"); + assert_eq!(done.count, 1); + + let missing = board + .columns + .iter() + .find(|column| column.key == "missing") + .expect("missing status column"); + assert_eq!(missing.count, 1); + assert_eq!(missing.docs[0].status, ""); + } + + #[test] + fn owner_board_groups_docs_by_front_matter_owner() { + let board = owner_board(DocCatalogInput { + types: vec![ + DocTypeInput { + project_name: "backend".to_string(), + type_name: "prd".to_string(), + label: "Backend PRDs".to_string(), + description: None, + slug: "server/docs/prds".to_string(), + files: vec![ + SummarizeDocInput { + path: "crates/server/docs/prds/repository-docs-surface.mdx" + .to_string(), + preview: + "---\ntitle: Repository Docs Surface\nowner: Platform Maintainers\nstatus: active\n---\n\nIntent." + .to_string(), + }, + SummarizeDocInput { + path: "crates/server/docs/prds/next-docs-surface.mdx".to_string(), + preview: + "---\ntitle: Next Docs Surface\nowner: product\nstatus: planned\n---\n\nIntent." + .to_string(), + }, + ], + }, + DocTypeInput { + project_name: "backend".to_string(), + type_name: "scenario".to_string(), + label: "BDD Scenarios".to_string(), + description: None, + slug: "server/docs/scenarios".to_string(), + files: vec![SummarizeDocInput { + path: "crates/server/docs/scenarios/missing-owner.mdx".to_string(), + preview: "---\ntitle: Missing Owner Scenario\nstatus: review\n---\n\nGiven..." + .to_string(), + }], + }, + ], + }) + .expect("owner board should summarize"); + + assert_eq!(board.total_docs, 3); + assert_eq!(board.columns.len(), 3); + + let unowned = board + .columns + .iter() + .find(|column| column.key == "unowned") + .expect("unowned column"); + assert_eq!(unowned.label, "Unowned"); + assert_eq!(unowned.owner, None); + assert_eq!(unowned.count, 1); + assert_eq!(unowned.docs[0].type_label, "BDD Scenarios"); + + let platform = board + .columns + .iter() + .find(|column| column.key == "owner-platform-maintainers") + .expect("platform owner column"); + assert_eq!(platform.label, "Platform Maintainers"); + assert_eq!(platform.owner.as_deref(), Some("Platform Maintainers")); + assert_eq!(platform.docs[0].status, "active"); + assert_eq!( + platform.docs[0].owner.as_deref(), + Some("Platform Maintainers") + ); + + let product = board + .columns + .iter() + .find(|column| column.key == "owner-product") + .expect("product owner column"); + assert_eq!(product.count, 1); + assert_eq!(product.docs[0].title, "Next Docs Surface"); + } + + #[test] + fn tag_board_groups_docs_by_front_matter_tags() { + let board = tag_board(DocCatalogInput { + types: vec![ + DocTypeInput { + project_name: "backend".to_string(), + type_name: "prd".to_string(), + label: "Backend PRDs".to_string(), + description: None, + slug: "server/docs/prds".to_string(), + files: vec![ + SummarizeDocInput { + path: "crates/server/docs/prds/repository-docs-surface.mdx" + .to_string(), + preview: + "---\ntitle: Repository Docs Surface\nstatus: active\ntags: [docs, projects, docs]\n---\n\nIntent." + .to_string(), + }, + SummarizeDocInput { + path: "crates/server/docs/prds/without-tags.mdx".to_string(), + preview: "---\ntitle: Untagged PRD\nstatus: planned\n---\n\nIntent." + .to_string(), + }, + ], + }, + DocTypeInput { + project_name: "backend".to_string(), + type_name: "scenario".to_string(), + label: "BDD Scenarios".to_string(), + description: None, + slug: "server/docs/scenarios".to_string(), + files: vec![SummarizeDocInput { + path: "crates/server/docs/scenarios/repository-docs-surface.mdx" + .to_string(), + preview: + "---\ntitle: Repository docs are discoverable\nstatus: review\ntags: bdd, docs\n---\n\nGiven..." + .to_string(), + }], + }, + ], + }) + .expect("tag board should summarize"); + + assert_eq!(board.total_docs, 3); + assert_eq!( + board + .columns + .iter() + .map(|column| column.key.as_str()) + .collect::>(), + ["untagged", "tag-bdd", "tag-docs", "tag-projects"] + ); + + let untagged = board + .columns + .iter() + .find(|column| column.key == "untagged") + .expect("untagged column"); + assert_eq!(untagged.count, 1); + assert_eq!(untagged.docs[0].title, "Untagged PRD"); + assert_eq!(untagged.tag, None); + + let docs = board + .columns + .iter() + .find(|column| column.key == "tag-docs") + .expect("docs tag column"); + assert_eq!(docs.label, "docs"); + assert_eq!(docs.tag.as_deref(), Some("docs")); + assert_eq!(docs.count, 2); + assert_eq!(docs.docs[0].tags, ["docs", "projects"]); + assert_eq!(docs.docs[1].type_label, "BDD Scenarios"); + + let bdd = board + .columns + .iter() + .find(|column| column.key == "tag-bdd") + .expect("bdd tag column"); + assert_eq!(bdd.count, 1); + assert_eq!(bdd.docs[0].title, "Repository docs are discoverable"); + } + + #[test] + fn project_board_groups_docs_by_project_and_unscoped_lane() { + let board = project_board(DocCatalogInput { + types: vec![ + DocTypeInput { + project_name: "backend".to_string(), + type_name: "prd".to_string(), + label: "Backend PRDs".to_string(), + description: None, + slug: "server/docs/prds".to_string(), + files: vec![SummarizeDocInput { + path: "crates/server/docs/prds/repository-docs-surface.mdx" + .to_string(), + preview: + "---\ntitle: Repository Docs Surface\nowner: platform-maintainers\nstatus: active\ntags: docs, product\n---\n\nIntent." + .to_string(), + }], + }, + DocTypeInput { + project_name: "backend".to_string(), + type_name: "scenario".to_string(), + label: "BDD Scenarios".to_string(), + description: None, + slug: "server/docs/scenarios".to_string(), + files: vec![SummarizeDocInput { + path: "crates/server/docs/scenarios/repository-docs-surface.mdx" + .to_string(), + preview: + "---\ntitle: Repository docs are discoverable\nstatus: review\n---\n\nGiven..." + .to_string(), + }], + }, + DocTypeInput { + project_name: "frontend shell".to_string(), + type_name: "spec".to_string(), + label: "Frontend Specs".to_string(), + description: None, + slug: "frontend/docs/specs".to_string(), + files: vec![SummarizeDocInput { + path: "frontend/docs/specs/shell-navigation.mdx".to_string(), + preview: + "---\ntitle: Shell Navigation\nstatus: planned\nowner: design\n---\n\nIntent." + .to_string(), + }], + }, + DocTypeInput { + project_name: " ".to_string(), + type_name: "prd".to_string(), + label: "Repo PRDs".to_string(), + description: None, + slug: "docs/prds".to_string(), + files: vec![SummarizeDocInput { + path: "docs/prds/repo-level-governance.mdx".to_string(), + preview: + "---\ntitle: Repo-level Governance\nstatus: draft\n---\n\nIntent." + .to_string(), + }], + }, + ], + }) + .expect("project board should summarize"); + + assert_eq!(board.total_docs, 4); + assert_eq!( + board + .columns + .iter() + .map(|column| column.key.as_str()) + .collect::>(), + ["unscoped", "project-backend", "project-frontend-shell"] + ); + + let unscoped = board + .columns + .iter() + .find(|column| column.key == "unscoped") + .expect("unscoped column"); + assert_eq!(unscoped.label, "Unscoped"); + assert_eq!(unscoped.project_name, None); + assert_eq!(unscoped.count, 1); + assert_eq!(unscoped.docs[0].project_name, ""); + assert_eq!(unscoped.docs[0].title, "Repo-level Governance"); + + let backend = board + .columns + .iter() + .find(|column| column.key == "project-backend") + .expect("backend project column"); + assert_eq!(backend.label, "backend"); + assert_eq!(backend.project_name.as_deref(), Some("backend")); + assert_eq!(backend.count, 2); + assert_eq!(backend.docs[0].type_label, "Backend PRDs"); + assert_eq!( + backend.docs[0].owner.as_deref(), + Some("platform-maintainers") + ); + assert_eq!(backend.docs[0].tags, ["docs", "product"]); + assert_eq!(backend.docs[1].type_name, "scenario"); + + let frontend = board + .columns + .iter() + .find(|column| column.key == "project-frontend-shell") + .expect("frontend shell project column"); + assert_eq!(frontend.count, 1); + assert_eq!(frontend.docs[0].status, "planned"); + assert_eq!(frontend.docs[0].owner.as_deref(), Some("design")); + } + + #[test] + fn summarize_scenarios_extracts_bdd_feature_and_steps() { + let summary = summarize_scenarios(SummarizeDocInput { + path: "crates/server/docs/scenarios/repository-docs-surface.mdx".to_string(), + preview: r#"--- +title: Repository docs are discoverable from project context +status: active +--- + +```gherkin +Feature: Repository docs + +Background: + Given the Comtrya repository has opted into ext_docs + +Scenario: Open project docs + Given a maintainer opens a repository + When they view project docs + Then they see specs, PRDs, and BDD scenarios + +Scenario Outline: Filter docs by status + Given docs have + When the catalog is summarized + Then the status lane is +``` +"# + .to_string(), + }) + .expect("BDD summary should parse"); + + assert_eq!( + summary.path, + "crates/server/docs/scenarios/repository-docs-surface.mdx" + ); + assert_eq!( + summary.title, + "Repository docs are discoverable from project context" + ); + assert_eq!(summary.feature.as_deref(), Some("Repository docs")); + assert_eq!(summary.scenario_count, 3); + assert_eq!(summary.step_count, 7); + assert_eq!(summary.scenarios[0].kind, "background"); + assert_eq!(summary.scenarios[0].title, "Background"); + assert_eq!(summary.scenarios[0].step_count, 1); + assert_eq!(summary.scenarios[1].kind, "scenario"); + assert_eq!(summary.scenarios[1].title, "Open project docs"); + assert_eq!(summary.scenarios[1].steps[0].keyword, "Given"); + assert_eq!(summary.scenarios[1].steps[1].keyword, "When"); + assert_eq!(summary.scenarios[1].steps[2].keyword, "Then"); + assert!(summary.scenarios[1].steps[2] + .text + .contains("specs, PRDs, and BDD scenarios")); + assert_eq!(summary.scenarios[2].kind, "scenario-outline"); + } + + #[test] + fn scenario_board_groups_docs_by_bdd_coverage() { + let board = scenario_board(DocCatalogInput { + types: vec![DocTypeInput { + project_name: "backend".to_string(), + type_name: "scenario".to_string(), + label: "BDD Scenarios".to_string(), + description: None, + slug: "server/docs/scenarios".to_string(), + files: vec![ + SummarizeDocInput { + path: "crates/server/docs/scenarios/missing-feature.mdx".to_string(), + preview: r#"--- +title: Missing Feature +status: draft +--- + +```gherkin +Scenario: Missing feature + Given a scenario exists without a feature +``` +"# + .to_string(), + }, + SummarizeDocInput { + path: "crates/server/docs/scenarios/missing-scenarios.mdx".to_string(), + preview: r#"--- +title: Missing Scenarios +status: review +--- + +```gherkin +Feature: Repository docs +``` +"# + .to_string(), + }, + SummarizeDocInput { + path: "crates/server/docs/scenarios/needs-steps.mdx".to_string(), + preview: r#"--- +title: Needs Steps +status: active +--- + +```gherkin +Feature: Repository docs + +Scenario: Open project docs +``` +"# + .to_string(), + }, + SummarizeDocInput { + path: "crates/server/docs/scenarios/ready.mdx".to_string(), + preview: r#"--- +title: Ready Scenario +status: accepted +--- + +```gherkin +Feature: Repository docs + +Scenario: Open project docs + Given a maintainer opens a repository + When they view project docs + Then they see PRDs and BDD scenarios +``` +"# + .to_string(), + }, + ], + }], + }) + .expect("scenario board should summarize"); + + assert_eq!(board.total_docs, 4); + + let missing_feature = board + .columns + .iter() + .find(|column| column.key == "missing-feature") + .expect("missing feature column"); + assert_eq!(missing_feature.count, 1); + assert_eq!(missing_feature.docs[0].title, "Missing Feature"); + assert_eq!(missing_feature.docs[0].scenario_count, 1); + assert_eq!(missing_feature.docs[0].feature.as_deref(), None); + + let missing_scenarios = board + .columns + .iter() + .find(|column| column.key == "missing-scenarios") + .expect("missing scenarios column"); + assert_eq!(missing_scenarios.count, 1); + assert_eq!( + missing_scenarios.docs[0].feature.as_deref(), + Some("Repository docs") + ); + assert_eq!(missing_scenarios.docs[0].scenario_count, 0); + + let needs_steps = board + .columns + .iter() + .find(|column| column.key == "needs-steps") + .expect("needs steps column"); + assert_eq!(needs_steps.count, 1); + assert_eq!(needs_steps.docs[0].scenarios_without_steps, 1); + assert_eq!(needs_steps.docs[0].status, "active"); + assert_eq!(needs_steps.docs[0].type_label, "BDD Scenarios"); + + let ready = board + .columns + .iter() + .find(|column| column.key == "ready") + .expect("ready column"); + assert_eq!(ready.count, 1); + assert_eq!(ready.docs[0].step_count, 3); + assert_eq!(ready.docs[0].status, "accepted"); + } + + #[test] + fn summarize_checklists_extracts_prd_acceptance_sections() { + let summary = summarize_checklists(SummarizeDocInput { + path: "crates/server/docs/prds/repository-docs-surface.mdx".to_string(), + preview: r#"--- +title: Repository Docs Surface +status: active +--- + +# Repository Docs Surface + +## Acceptance Criteria + +- [x] Project docs render beside implementation +- [ ] Scenario docs can be summarized without shell-specific parsing + +```md +- [ ] ignored example item +``` + +## Rollout + +1. [ ] Seed demo docs for specs and PRDs ++ [X] Gate docs operations in smoke +"# + .to_string(), + }) + .expect("checklist summary should parse"); + + assert_eq!( + summary.path, + "crates/server/docs/prds/repository-docs-surface.mdx" + ); + assert_eq!(summary.title, "Repository Docs Surface"); + assert_eq!(summary.total_items, 4); + assert_eq!(summary.checked_items, 2); + assert_eq!(summary.sections.len(), 2); + assert_eq!(summary.sections[0].heading, "Acceptance Criteria"); + assert_eq!(summary.sections[0].item_count, 2); + assert_eq!(summary.sections[0].checked_count, 1); + assert_eq!( + summary.sections[0].items[1].text, + "Scenario docs can be summarized without shell-specific parsing" + ); + assert!(!summary.sections[0].items[1].checked); + assert_eq!(summary.sections[1].heading, "Rollout"); + assert_eq!(summary.sections[1].item_count, 2); + assert_eq!(summary.sections[1].checked_count, 1); + } + + #[test] + fn summarize_references_extracts_forge_traceability_links() { + let summary = summarize_references(SummarizeDocInput { + path: "crates/server/docs/prds/repository-docs-surface.mdx".to_string(), + preview: r#"--- +title: Repository Docs Surface +status: active +--- + +## Traceability + +This PRD tracks [repository docs epic](comtrya://epic/epc_01KVJZ0TRACE) and #42. +BDD scenarios link to comtrya://doc/scenario/repository-docs-surface. +Implementation ships through comtrya://pull-request/pr_01KVJZ0TRACE. +[External reference](https://example.com/spec) is ignored. + +```md +comtrya://issue/ignored +#999 +``` +"# + .to_string(), + }) + .expect("reference summary should parse"); + + assert_eq!(summary.title, "Repository Docs Surface"); + assert_eq!(summary.reference_count, 4); + assert_eq!(summary.references[0].kind, "epic"); + assert_eq!( + summary.references[0].target, + "comtrya://epic/epc_01KVJZ0TRACE" + ); + assert_eq!( + summary.references[0].label.as_deref(), + Some("repository docs epic") + ); + assert_eq!(summary.references[1].kind, "issue-number"); + assert_eq!(summary.references[1].target, "#42"); + assert_eq!(summary.references[2].kind, "doc"); + assert_eq!( + summary.references[2].target, + "comtrya://doc/scenario/repository-docs-surface" + ); + assert_eq!(summary.references[3].kind, "pull-request"); + assert!(summary + .references + .iter() + .all(|reference| reference.line > 0)); + } + + #[test] + fn traceability_board_groups_docs_by_link_coverage() { + let board = traceability_board(DocCatalogInput { + types: vec![DocTypeInput { + project_name: "backend".to_string(), + type_name: "prd".to_string(), + label: "Backend PRDs".to_string(), + description: None, + slug: "server/docs/prds".to_string(), + files: vec![ + SummarizeDocInput { + path: "crates/server/docs/prds/unlinked.mdx".to_string(), + preview: r#"--- +title: Unlinked PRD +status: draft +--- + +Intent without implementation links. +"# + .to_string(), + }, + SummarizeDocInput { + path: "crates/server/docs/prds/implementation-linked.mdx".to_string(), + preview: r#"--- +title: Implementation Linked PRD +status: active +--- + +Tracks comtrya://epic/epc_01KVJZ0TRACE, #42, and comtrya://pull-request/pr_01KVJZ0TRACE. +"# + .to_string(), + }, + SummarizeDocInput { + path: "crates/server/docs/prds/doc-linked.mdx".to_string(), + preview: r#"--- +title: Doc Linked PRD +status: review +--- + +Scenario coverage lives at comtrya://doc/scenario/repository-docs-surface. +"# + .to_string(), + }, + SummarizeDocInput { + path: "crates/server/docs/prds/other-linked.mdx".to_string(), + preview: r#"--- +title: Other Linked PRD +status: planned +--- + +Release note lives at comtrya://release/rel_01KVJZ0TRACE. +"# + .to_string(), + }, + ], + }], + }) + .expect("traceability board should summarize"); + + assert_eq!(board.total_docs, 4); + + let unlinked = board + .columns + .iter() + .find(|column| column.key == "unlinked") + .expect("unlinked column"); + assert_eq!(unlinked.count, 1); + assert_eq!(unlinked.docs[0].title, "Unlinked PRD"); + assert_eq!(unlinked.docs[0].reference_count, 0); + + let implementation_linked = board + .columns + .iter() + .find(|column| column.key == "implementation-linked") + .expect("implementation linked column"); + assert_eq!(implementation_linked.count, 1); + assert_eq!( + implementation_linked.docs[0].title, + "Implementation Linked PRD" + ); + assert_eq!( + implementation_linked.docs[0].implementation_reference_count, + 3 + ); + assert_eq!(implementation_linked.docs[0].status, "active"); + assert_eq!(implementation_linked.docs[0].type_label, "Backend PRDs"); + assert_eq!(implementation_linked.docs[0].references.len(), 3); + + let doc_linked = board + .columns + .iter() + .find(|column| column.key == "doc-linked") + .expect("doc linked column"); + assert_eq!(doc_linked.count, 1); + assert_eq!(doc_linked.docs[0].doc_reference_count, 1); + assert_eq!(doc_linked.docs[0].references[0].kind, "doc"); + + let other_linked = board + .columns + .iter() + .find(|column| column.key == "other-linked") + .expect("other linked column"); + assert_eq!(other_linked.count, 1); + assert_eq!(other_linked.docs[0].other_reference_count, 1); + assert_eq!(other_linked.docs[0].references[0].kind, "release"); + } + + #[test] + fn summarize_outline_extracts_markdown_headings() { + let summary = summarize_outline(SummarizeDocInput { + path: "crates/server/docs/prds/repository-docs-surface.mdx".to_string(), + preview: r#"--- +title: Repository Docs Surface +status: active +--- + +# Repository Docs Surface + +## Acceptance Criteria + +```md +## Ignored Example +``` + +### Rollout + +## Acceptance Criteria +"# + .to_string(), + }) + .expect("outline summary should parse"); + + assert_eq!(summary.title, "Repository Docs Surface"); + assert_eq!(summary.heading_count, 4); + assert_eq!(summary.headings[0].level, 1); + assert_eq!(summary.headings[0].title, "Repository Docs Surface"); + assert_eq!(summary.headings[0].slug, "repository-docs-surface"); + assert_eq!(summary.headings[0].line, 2); + assert_eq!(summary.headings[1].level, 2); + assert_eq!(summary.headings[1].slug, "acceptance-criteria"); + assert_eq!(summary.headings[2].level, 3); + assert_eq!(summary.headings[2].slug, "rollout"); + assert_eq!(summary.headings[3].level, 2); + assert_eq!(summary.headings[3].slug, "acceptance-criteria-2"); + assert!(summary + .headings + .iter() + .all(|heading| heading.title != "Ignored Example")); + } + + #[test] + fn summarize_decisions_extracts_decisions_questions_and_risks() { + let summary = summarize_decisions(SummarizeDocInput { + path: "crates/server/docs/prds/repository-docs-surface.mdx".to_string(), + preview: r#"--- +title: Repository Docs Surface +status: active +--- + +# Repository Docs Surface + +## Decisions + +- Use ext_docs for product-doc semantics. +- Decision: Keep shell queries generic. + +## Open Questions + +- [ ] Should PRDs expose owner filters? +Question: Which doc types should render first? + +## Risks + +- Risk: Stale docs may look authoritative. + +```md +- Risk: ignored fenced example +Decision: ignored fenced decision +``` +"# + .to_string(), + }) + .expect("decision summary should parse"); + + assert_eq!(summary.title, "Repository Docs Surface"); + assert_eq!(summary.decision_count, 2); + assert_eq!(summary.open_question_count, 2); + assert_eq!(summary.risk_count, 1); + assert_eq!(summary.items.len(), 5); + assert_eq!(summary.items[0].kind, "decision"); + assert_eq!( + summary.items[0].text, + "Use ext_docs for product-doc semantics." + ); + assert_eq!(summary.items[1].text, "Keep shell queries generic."); + assert_eq!(summary.items[2].kind, "open-question"); + assert_eq!(summary.items[2].text, "Should PRDs expose owner filters?"); + assert_eq!( + summary.items[3].text, + "Which doc types should render first?" + ); + assert_eq!(summary.items[4].kind, "risk"); + assert!(summary.items.iter().all(|item| item.line > 0)); + assert!(summary + .items + .iter() + .all(|item| !item.text.contains("ignored fenced"))); + } + + #[test] + fn decision_board_groups_docs_by_review_state() { + let board = decision_board(DocCatalogInput { + types: vec![DocTypeInput { + project_name: "backend".to_string(), + type_name: "prd".to_string(), + label: "Backend PRDs".to_string(), + description: None, + slug: "server/docs/prds".to_string(), + files: vec![ + SummarizeDocInput { + path: "crates/server/docs/prds/open-question.mdx".to_string(), + preview: r#"--- +title: Open Question PRD +status: review +--- + +## Open Questions + +- [ ] Should PRDs expose owner filters? +"# + .to_string(), + }, + SummarizeDocInput { + path: "crates/server/docs/prds/risk.mdx".to_string(), + preview: r#"--- +title: Risky PRD +status: active +--- + +## Risks + +- Risk: Stale docs may look authoritative. +"# + .to_string(), + }, + SummarizeDocInput { + path: "crates/server/docs/prds/decided.mdx".to_string(), + preview: r#"--- +title: Decided PRD +status: accepted +--- + +## Decisions + +- Use ext_docs for product-doc semantics. +"# + .to_string(), + }, + SummarizeDocInput { + path: "crates/server/docs/prds/missing-review-state.mdx".to_string(), + preview: r#"--- +title: Missing Review State PRD +status: planned +--- + +Intent without decision review state. +"# + .to_string(), + }, + ], + }], + }) + .expect("decision board should summarize"); + + assert_eq!(board.total_docs, 4); + + let open_questions = board + .columns + .iter() + .find(|column| column.key == "open-questions") + .expect("open questions column"); + assert_eq!(open_questions.count, 1); + assert_eq!(open_questions.docs[0].title, "Open Question PRD"); + assert_eq!(open_questions.docs[0].open_question_count, 1); + assert_eq!(open_questions.docs[0].status, "review"); + assert_eq!(open_questions.docs[0].type_label, "Backend PRDs"); + + let risks = board + .columns + .iter() + .find(|column| column.key == "risks") + .expect("risks column"); + assert_eq!(risks.count, 1); + assert_eq!(risks.docs[0].title, "Risky PRD"); + assert_eq!(risks.docs[0].risk_count, 1); + + let decided = board + .columns + .iter() + .find(|column| column.key == "decided") + .expect("decided column"); + assert_eq!(decided.count, 1); + assert_eq!(decided.docs[0].decision_count, 1); + assert_eq!(decided.docs[0].status, "accepted"); + + let missing_review_state = board + .columns + .iter() + .find(|column| column.key == "missing-review-state") + .expect("missing review state column"); + assert_eq!(missing_review_state.count, 1); + assert_eq!( + missing_review_state.docs[0].title, + "Missing Review State PRD" + ); + } + + #[test] + fn readiness_board_groups_docs_by_product_readiness() { + let board = readiness_board(DocCatalogInput { + types: vec![ + DocTypeInput { + project_name: "backend".to_string(), + type_name: "prd".to_string(), + label: "Backend PRDs".to_string(), + description: None, + slug: "server/docs/prds".to_string(), + files: vec![ + SummarizeDocInput { + path: "crates/server/docs/prds/repository-docs-outline.mdx" + .to_string(), + preview: + "---\ntitle: Repository Docs Outline\nstatus: planned\n---\n\nIntent without criteria." + .to_string(), + }, + SummarizeDocInput { + path: "crates/server/docs/prds/repository-docs-surface.mdx" + .to_string(), + preview: r#"--- +title: Repository Docs Surface +status: active +--- + +## Acceptance Criteria + +- [x] Project docs render beside implementation +- [ ] Scenario docs can be summarized without shell-specific parsing + +## Traceability + +Tracks comtrya://epic/epc_01KVJZ0TRACE. +"# + .to_string(), + }, + ], + }, + DocTypeInput { + project_name: "backend".to_string(), + type_name: "scenario".to_string(), + label: "BDD Scenarios".to_string(), + description: None, + slug: "server/docs/scenarios".to_string(), + files: vec![SummarizeDocInput { + path: "crates/server/docs/scenarios/repository-docs-surface.mdx" + .to_string(), + preview: r#"--- +title: Repository docs are discoverable +status: active +--- + +Feature: Repository docs + +Scenario: Open project docs + Given a maintainer opens a repository + When they view project docs + Then they see specs, PRDs, and BDD scenarios +"# + .to_string(), + }], + }, + ], + }) + .expect("readiness board should summarize"); + + assert_eq!(board.total_docs, 3); + + let needs_criteria = board + .columns + .iter() + .find(|column| column.key == "needs-criteria") + .expect("needs criteria column"); + assert_eq!(needs_criteria.label, "Needs criteria"); + assert_eq!(needs_criteria.count, 1); + assert_eq!(needs_criteria.docs[0].title, "Repository Docs Outline"); + + let in_progress = board + .columns + .iter() + .find(|column| column.key == "in-progress") + .expect("in progress column"); + assert_eq!(in_progress.count, 1); + assert_eq!(in_progress.docs[0].type_label, "Backend PRDs"); + assert_eq!(in_progress.docs[0].status, "active"); + assert_eq!(in_progress.docs[0].checklist_total, 2); + assert_eq!(in_progress.docs[0].checklist_checked, 1); + assert_eq!(in_progress.docs[0].reference_count, 1); + + let ready = board + .columns + .iter() + .find(|column| column.key == "ready") + .expect("ready column"); + assert_eq!(ready.count, 1); + assert_eq!(ready.docs[0].type_name, "scenario"); + assert_eq!(ready.docs[0].scenario_count, 1); + } + + #[test] + fn handoff_board_groups_docs_by_implementation_handoff_state() { + let board = handoff_board(DocCatalogInput { + types: vec![DocTypeInput { + project_name: "backend".to_string(), + type_name: "prd".to_string(), + label: "Backend PRDs".to_string(), + description: None, + slug: "server/docs/prds".to_string(), + files: vec![ + SummarizeDocInput { + path: "crates/server/docs/prds/needs-criteria.mdx".to_string(), + preview: r#"--- +title: Needs Criteria PRD +status: planned +--- + +Intent without accepted criteria or scenarios. +"# + .to_string(), + }, + SummarizeDocInput { + path: "crates/server/docs/prds/needs-scenarios.mdx".to_string(), + preview: r#"--- +title: Needs Scenarios PRD +status: active +--- + +## Acceptance Criteria + +- [x] Project docs render beside implementation +"# + .to_string(), + }, + SummarizeDocInput { + path: "crates/server/docs/prds/needs-review.mdx".to_string(), + preview: r#"--- +title: Needs Review PRD +status: review +--- + +## Acceptance Criteria + +- [x] Product intent is clear + +Feature: Repository docs + +Scenario: Open project docs + Given a maintainer opens a repository + +## Open Questions + +Question: Should PRDs expose owner filters? +"# + .to_string(), + }, + SummarizeDocInput { + path: "crates/server/docs/prds/ready.mdx".to_string(), + preview: r#"--- +title: Ready PRD +status: accepted +--- + +## Acceptance Criteria + +- [x] Product intent is clear + +Feature: Repository docs + +Scenario: Open project docs + Given a maintainer opens a repository + When they view project docs + Then they see implementation-ready context +"# + .to_string(), + }, + SummarizeDocInput { + path: "crates/server/docs/prds/in-implementation.mdx".to_string(), + preview: r#"--- +title: In Implementation PRD +status: active +--- + +## Acceptance Criteria + +- [x] Product intent is clear + +Feature: Repository docs + +Scenario: Open project docs + Given a maintainer opens a repository + When they view project docs + Then they see linked implementation work + +## Traceability + +Tracks #42 and comtrya://pull-request/pr_01KVJZ0TRACE. +"# + .to_string(), + }, + ], + }], + }) + .expect("handoff board should summarize"); + + assert_eq!(board.total_docs, 5); + + let needs_criteria = board + .columns + .iter() + .find(|column| column.key == "needs-criteria") + .expect("needs criteria column"); + assert_eq!(needs_criteria.count, 1); + assert_eq!(needs_criteria.docs[0].title, "Needs Criteria PRD"); + assert_eq!(needs_criteria.docs[0].checklist_total, 0); + + let needs_scenarios = board + .columns + .iter() + .find(|column| column.key == "needs-scenarios") + .expect("needs scenarios column"); + assert_eq!(needs_scenarios.count, 1); + assert_eq!(needs_scenarios.docs[0].checklist_total, 1); + assert_eq!(needs_scenarios.docs[0].checklist_checked, 1); + assert_eq!(needs_scenarios.docs[0].scenario_count, 0); + + let needs_product_review = board + .columns + .iter() + .find(|column| column.key == "needs-product-review") + .expect("needs product review column"); + assert_eq!(needs_product_review.count, 1); + assert_eq!(needs_product_review.docs[0].open_question_count, 1); + assert_eq!(needs_product_review.docs[0].type_label, "Backend PRDs"); + + let ready = board + .columns + .iter() + .find(|column| column.key == "ready-for-implementation") + .expect("ready for implementation column"); + assert_eq!(ready.count, 1); + assert_eq!(ready.docs[0].title, "Ready PRD"); + assert_eq!(ready.docs[0].scenario_count, 1); + assert_eq!(ready.docs[0].implementation_reference_count, 0); + + let in_implementation = board + .columns + .iter() + .find(|column| column.key == "in-implementation") + .expect("in implementation column"); + assert_eq!(in_implementation.count, 1); + assert_eq!(in_implementation.docs[0].title, "In Implementation PRD"); + assert_eq!(in_implementation.docs[0].implementation_reference_count, 2); + assert_eq!(in_implementation.docs[0].status, "active"); + } + + #[test] + fn implementation_board_groups_docs_by_delivery_state() { + let board = implementation_board(DocCatalogInput { + types: vec![DocTypeInput { + project_name: "backend".to_string(), + type_name: "prd".to_string(), + label: "Backend PRDs".to_string(), + description: None, + slug: "server/docs/prds".to_string(), + files: vec![ + SummarizeDocInput { + path: "crates/server/docs/prds/needs-acceptance.mdx".to_string(), + preview: r#"--- +title: Needs Acceptance PRD +status: planned +--- + +Intent without accepted criteria or scenarios. +"# + .to_string(), + }, + SummarizeDocInput { + path: "crates/server/docs/prds/needs-review.mdx".to_string(), + preview: r#"--- +title: Needs Review PRD +status: review +--- + +## Acceptance Criteria + +- [x] Product intent is clear + +Feature: Repository docs + +Scenario: Open project docs + Given a maintainer opens a repository + When they view project docs + Then they see implementation-ready context + +## Open Questions + +Question: Should PRDs expose owner filters? +"# + .to_string(), + }, + SummarizeDocInput { + path: "crates/server/docs/prds/done-unlinked.mdx".to_string(), + preview: r#"--- +title: Done Unlinked PRD +status: shipped +--- + +## Acceptance Criteria + +- [x] Product intent is clear + +Feature: Repository docs + +Scenario: Open project docs + Given a maintainer opens a repository + When they view project docs + Then they see implementation-ready context +"# + .to_string(), + }, + SummarizeDocInput { + path: "crates/server/docs/prds/ready.mdx".to_string(), + preview: r#"--- +title: Ready PRD +status: accepted +--- + +## Acceptance Criteria + +- [x] Product intent is clear + +Feature: Repository docs + +Scenario: Open project docs + Given a maintainer opens a repository + When they view project docs + Then they see implementation-ready context +"# + .to_string(), + }, + SummarizeDocInput { + path: "crates/server/docs/prds/in-implementation.mdx".to_string(), + preview: r#"--- +title: In Implementation PRD +status: active +--- + +## Acceptance Criteria + +- [x] Product intent is clear + +Feature: Repository docs + +Scenario: Open project docs + Given a maintainer opens a repository + When they view project docs + Then they see linked implementation work + +## Traceability + +Tracks #42 and comtrya://pull-request/pr_01KVJZ0TRACE. +"# + .to_string(), + }, + SummarizeDocInput { + path: "crates/server/docs/prds/implemented.mdx".to_string(), + preview: r#"--- +title: Implemented PRD +status: done +--- + +## Acceptance Criteria + +- [x] Product intent is clear + +Feature: Repository docs + +Scenario: Open project docs + Given a maintainer opens a repository + When they view project docs + Then they see linked implementation work + +## Traceability + +Delivered by comtrya://issue/42 and comtrya://doc/scenario/repository-docs-surface. +"# + .to_string(), + }, + ], + }], + }) + .expect("implementation board should summarize"); + + assert_eq!(board.total_docs, 6); + + let needs_acceptance = board + .columns + .iter() + .find(|column| column.key == "needs-acceptance") + .expect("needs acceptance column"); + assert_eq!(needs_acceptance.count, 1); + assert_eq!(needs_acceptance.docs[0].title, "Needs Acceptance PRD"); + assert_eq!(needs_acceptance.docs[0].scenario_count, 0); + + let needs_product_review = board + .columns + .iter() + .find(|column| column.key == "needs-product-review") + .expect("needs product review column"); + assert_eq!(needs_product_review.count, 1); + assert_eq!(needs_product_review.docs[0].open_question_count, 1); + assert_eq!(needs_product_review.docs[0].checklist_checked, 1); + + let needs_implementation_link = board + .columns + .iter() + .find(|column| column.key == "needs-implementation-link") + .expect("needs implementation link column"); + assert_eq!(needs_implementation_link.count, 1); + assert_eq!(needs_implementation_link.docs[0].title, "Done Unlinked PRD"); + assert_eq!( + needs_implementation_link.docs[0].implementation_reference_count, + 0 + ); + + let ready = board + .columns + .iter() + .find(|column| column.key == "ready-to-build") + .expect("ready to build column"); + assert_eq!(ready.count, 1); + assert_eq!(ready.docs[0].title, "Ready PRD"); + assert_eq!(ready.docs[0].status, "accepted"); + assert_eq!(ready.docs[0].type_label, "Backend PRDs"); + + let in_implementation = board + .columns + .iter() + .find(|column| column.key == "in-implementation") + .expect("in implementation column"); + assert_eq!(in_implementation.count, 1); + assert_eq!(in_implementation.docs[0].title, "In Implementation PRD"); + assert_eq!(in_implementation.docs[0].implementation_reference_count, 2); + assert_eq!(in_implementation.docs[0].reference_count, 2); + + let implemented = board + .columns + .iter() + .find(|column| column.key == "implemented") + .expect("implemented column"); + assert_eq!(implemented.count, 1); + assert_eq!(implemented.docs[0].title, "Implemented PRD"); + assert_eq!(implemented.docs[0].implementation_reference_count, 1); + assert_eq!(implemented.docs[0].doc_reference_count, 1); + assert_eq!(implemented.docs[0].status, "done"); + } +} diff --git a/extensions/first-party/ext_docs/dist/ext_docs.wasm b/extensions/first-party/ext_docs/dist/ext_docs.wasm index e4857fd7..449d1d26 100644 Binary files a/extensions/first-party/ext_docs/dist/ext_docs.wasm and b/extensions/first-party/ext_docs/dist/ext_docs.wasm differ diff --git a/extensions/first-party/ext_docs/docs/rfcs/0001-generic-doc-types.mdx b/extensions/first-party/ext_docs/docs/rfcs/0001-generic-doc-types.mdx index 5d9e96a3..8f913158 100644 --- a/extensions/first-party/ext_docs/docs/rfcs/0001-generic-doc-types.mdx +++ b/extensions/first-party/ext_docs/docs/rfcs/0001-generic-doc-types.mdx @@ -11,4 +11,14 @@ status: accepted - `properties` — typed front-matter fields (string, int, bool, list, or `#Person`). - An implicit `body` — the MDX body of every file, validated as `string`. -The CUE schema for `#DocType` and `#Person` is registered in `manifest.json` under `contributes.cueSchemas`. The kernel writes that snippet into the materialised workdir before evaluating the repo's `package comtrya` config, so unification gives us free validation: a malformed `docs` block fails at CUE eval time, not at render time. +The CUE schema for `#DocType` and principal references is registered in `manifest.json` under `contributes.cueSchemas`. The kernel writes that snippet into the materialised workdir before evaluating the repo's `package comtrya` config, so unification gives us free validation: a malformed `docs` block fails at CUE eval time, not at render time. + +The extension backend owns document-summary parsing through `summarize-doc`. +That keeps title/front-matter/body-excerpt semantics in the Component Model +boundary instead of each UI surface inventing its own parser. + +Project-level docs surfaces use `summarize-catalog` once the kernel or UI has +enumerated the configured project doc types and matching repo files. The +catalog operation stays generic: it groups by declared project/type metadata +and summarizes each supplied file, but it does not hardcode ADR, spec, PRD, or +BDD scenario behavior into the kernel. diff --git a/extensions/first-party/ext_docs/ui/manifest.json b/extensions/first-party/ext_docs/ui/manifest.json index 43c36819..42fbd42a 100644 --- a/extensions/first-party/ext_docs/ui/manifest.json +++ b/extensions/first-party/ext_docs/ui/manifest.json @@ -5,8 +5,8 @@ "version": "0.1.0", "publisher": "comtrya-dev", "assets": { - "entry": "/_extensions/ext_docs/assets/index.js", - "entryIntegrity": "sha256-ccc7bd5e5754cf8ee0b2a6dd08cd71bd67c90c28a98a5998f906ec6861e1b79c", + "entry": "/ui-ext/6578745f646f6373/files/index.js", + "entryIntegrity": "sha256-3047101b36b1a7f598975bd1e4ee7e215760bd4311b2ce40518beb14952374a8", "styles": [] }, "permissions": [ diff --git a/extensions/first-party/ext_docs/ui/src/DocsPanel.vue b/extensions/first-party/ext_docs/ui/src/DocsPanel.vue index bae51695..81068757 100644 --- a/extensions/first-party/ext_docs/ui/src/DocsPanel.vue +++ b/extensions/first-party/ext_docs/ui/src/DocsPanel.vue @@ -17,9 +17,26 @@ * the `docs` field vanish from `comtryaConfig`. */ -import { computed, onMounted, ref, watch } from "vue"; -import { getGraphQLClient } from "@comtrya/sdk-core"; -import { bodyExcerpt, renderMarkdown, useShortcuts } from "@comtrya/sdk-vue"; +import { computed, onMounted, onUnmounted, ref, watch } from "vue"; +import { getGraphQLClient, type OpResult } from "@comtrya/sdk-core"; +import { + bodyExcerpt, + parseQueryFilters, + renderMarkdown, + useShortcuts, +} from "@comtrya/sdk-vue"; +import { extDocsXDocs } from "../../dist/ext_docs.client"; +import { + docFileMatches, + filterDocBoard, + hasDocsFilterQuery, +} from "./docs-board-filter"; +import { + DOCS_BOARD_TABS, + docsBoardFromRouteSubPath, + docsBoardHref, + type DocsBoardId, +} from "./docs-workbench-route"; interface DocProperty { // intentionally any — typed by the per-type `properties` CUE block @@ -64,18 +81,92 @@ interface RepositoryPayload { }; } +interface SummarizeDocInput { + path: string; + preview: string; +} + +interface DocCatalogTypeInput { + projectName: string; + typeName: string; + label: string; + description: string | null; + slug: string; + files: SummarizeDocInput[]; +} + +interface DocCatalogInput { + types: DocCatalogTypeInput[]; +} + +interface DocBoardCard { + projectName?: string; + typeName?: string; + typeLabel?: string; + path?: string; + title?: string; + status?: string | null; + owner?: string | null; + tags?: string[]; + feature?: string | null; + scenarioCount?: number; + stepCount?: number; + scenariosWithoutSteps?: number; + checklistTotal?: number; + checklistChecked?: number; + referenceCount?: number; + implementationReferenceCount?: number; + docReferenceCount?: number; + otherReferenceCount?: number; + decisionCount?: number; + openQuestionCount?: number; + riskCount?: number; +} + +interface DocBoardColumn { + key: string; + label: string; + count: number; + docs: DocBoardCard[]; +} + +interface DocBoard { + totalDocs: number; + columns: DocBoardColumn[]; +} + +interface ExtensionRouteParams { + scope?: string; + routePrefix?: string; + subPath?: string; + params?: Record; +} + const props = defineProps<{ workspaceId?: string; repositoryId?: string | null; repositoryPath?: string | null; repositorySegments?: string[]; + extensionSlot?: string | null; /** * When set (typically on a project home page), DocsPanel renders only * the named Project's doc types instead of every Project in the repo. */ projectName?: string; + routeParams?: ExtensionRouteParams; }>(); +const DOC_FILTER_KEYS = [ + "feature", + "is", + "owner", + "path", + "project", + "status", + "tag", + "type", +] as const; + const loadState = ref<"loading" | "ready" | "error">("loading"); const error = ref(null); const config = ref(null); @@ -84,6 +175,7 @@ const blobs = ref([]); const allProjects = computed( () => config.value?.projects ?? [], ); +const isOverviewSummary = computed(() => props.extensionSlot === "repository.main"); const projects = computed(() => { if (!props.projectName) return allProjects.value; @@ -102,6 +194,110 @@ const totalDocs = computed(() => { const expandedDocPath = ref(null); const focusedDocPath = ref(null); +const boardState = ref<"idle" | "loading" | "ready" | "error">("idle"); +const boardError = ref(null); +const activeBoardId = ref("type"); +const docSearch = ref(""); +const boards = ref>(emptyBoards()); +const boardTabs = DOCS_BOARD_TABS; +const activeBoard = computed(() => boards.value[activeBoardId.value]); +const docQuery = computed(() => parseQueryFilters(docSearch.value, DOC_FILTER_KEYS)); +const hasDocFilter = computed(() => hasDocsFilterQuery(docQuery.value)); +const visibleActiveBoard = computed(() => { + const board = activeBoard.value; + if (!board) return null; + return hasDocFilter.value ? filterDocBoard(board, docQuery.value) : board; +}); +const visibleBoardTotal = computed(() => visibleActiveBoard.value?.totalDocs ?? 0); +const activeBoardTotal = computed(() => activeBoard.value?.totalDocs ?? totalDocs.value); +const docTypeSummaries = computed(() => { + const byKey = new Map(); + for (const project of projects.value) { + for (const entry of docTypesFor(project)) { + const key = entry.key; + const current = byKey.get(key) ?? { + key, + label: entry.type.label || key, + count: 0, + }; + current.count += filesForType(project, entry.type).length; + byKey.set(key, current); + } + } + return [...byKey.values()].sort((a, b) => { + const byCount = b.count - a.count; + if (byCount !== 0) return byCount; + return a.label.localeCompare(b.label); + }); +}); +const visibleDocTypeSummaries = computed(() => + docTypeSummaries.value.filter((entry) => entry.count > 0).slice(0, 4), +); +const docsRouteHref = computed(() => { + const path = (props.repositoryPath ?? "") + .split("/") + .filter((segment) => segment.length > 0) + .map(encodeURIComponent) + .join("/"); + const params = new URLSearchParams(); + if (props.workspaceId) params.set("workspaceId", props.workspaceId); + if (props.repositoryId) params.set("repositoryId", props.repositoryId); + const query = params.toString(); + return `/r/${path || "repository"}/docs${query ? `?${query}` : ""}`; +}); +const overviewHeadline = computed(() => { + if (loadState.value === "loading") return "Loading"; + if (loadState.value === "error" || config.value?.error) return "Unavailable"; + if (totalDocs.value === 0) return "No specs"; + return `${totalDocs.value} specs`; +}); +const visibleProjects = computed(() => + projects.value.filter((project) => visibleDocTypesFor(project).length > 0), +); +const visibleCatalogTotal = computed(() => { + let total = 0; + for (const project of projects.value) { + for (const entry of docTypesFor(project)) { + total += visibleFilesForType(project, entry.key, entry.type).length; + } + } + return total; +}); +const docsWorkbenchCountLabel = computed(() => + hasDocFilter.value + ? `${visibleBoardTotal.value} of ${activeBoardTotal.value}` + : String(activeBoardTotal.value), +); +const docsWorkbenchCountIsPlural = computed(() => + (hasDocFilter.value ? visibleBoardTotal.value : activeBoardTotal.value) !== 1, +); +const docsFilterSummary = computed(() => + hasDocFilter.value + ? `${visibleCatalogTotal.value}/${totalDocs.value} specs | ${visibleProjects.value.length}/${projects.value.length} projects` + : "", +); + +function emptyBoards(): Record { + return { + type: null, + project: null, + owner: null, + tag: null, + status: null, + scenario: null, + readiness: null, + decision: null, + handoff: null, + traceability: null, + implementation: null, + }; +} + +function resetBoards(): void { + boards.value = emptyBoards(); + boardState.value = "idle"; + boardError.value = null; +} function isExpanded(path: string): boolean { return expandedDocPath.value === path; @@ -116,12 +312,17 @@ function focusDoc(path: string): void { focusedDocPath.value = path; } +function openDocsWorkbench(event: MouseEvent): void { + event.preventDefault(); + window.location.assign(docsRouteHref.value); +} + /** Flat list of every visible doc path in render order — for j/k nav. */ const orderedDocPaths = computed(() => { const out: string[] = []; - for (const project of projects.value) { - for (const entry of docTypesFor(project)) { - for (const doc of filesForType(project, entry.type)) { + for (const project of visibleProjects.value) { + for (const entry of visibleDocTypesFor(project)) { + for (const doc of visibleFilesForType(project, entry.key, entry.type)) { out.push(doc.path); } } @@ -180,13 +381,99 @@ useShortcuts({ }); onMounted(() => { + syncRouteStateFromLocation(); + window.addEventListener("popstate", syncRouteStateFromLocation); void load(); }); -watch(() => props.repositoryPath, () => void load()); +onUnmounted(() => { + window.removeEventListener("popstate", syncRouteStateFromLocation); +}); +watch( + [() => props.repositoryPath, () => props.projectName, () => props.extensionSlot], + () => void load(), +); +watch( + () => props.routeParams?.subPath, + () => syncBoardFromRoute(), +); +watch(docSearch, () => writeUrlSearch()); + +function syncBoardFromRoute(): void { + activeBoardId.value = docsBoardFromRouteSubPath(props.routeParams?.subPath); +} + +function syncRouteStateFromLocation(): void { + activeBoardId.value = docsBoardFromRouteSubPath(currentDocsSubPath()); + readUrlSearch(); +} + +function currentDocsSubPath(): string { + if (typeof window === "undefined") return props.routeParams?.subPath ?? "/"; + const segments = window.location.pathname.split("/").filter(Boolean); + if (segments[0] === "x" && segments[1] === "docs") { + return routeSubPathFromSegments(segments.slice(2)); + } + const docsIndex = segments.lastIndexOf("docs"); + if (docsIndex >= 0) { + return routeSubPathFromSegments(segments.slice(docsIndex + 1)); + } + return props.routeParams?.subPath ?? "/"; +} + +function boardHref(boardId: DocsBoardId): string { + if (typeof window === "undefined") return "#"; + return docsBoardHref({ + boardId, + pathname: window.location.pathname, + routeSubPath: currentDocsSubPath(), + search: window.location.search, + }); +} + +function selectBoard(boardId: DocsBoardId, event: MouseEvent): void { + event.preventDefault(); + activeBoardId.value = boardId; + if (typeof window === "undefined") return; + const href = boardHref(boardId); + const current = `${window.location.pathname}${window.location.search}`; + if (href !== current) { + window.history.pushState({}, "", href); + } +} + +function clearDocSearch(): void { + docSearch.value = ""; +} + +function onDocSearchEscape(): void { + if (docSearch.value) clearDocSearch(); +} + +function readUrlSearch(): void { + if (typeof window === "undefined") return; + docSearch.value = new URLSearchParams(window.location.search).get("q") ?? ""; +} + +function writeUrlSearch(): void { + if (typeof window === "undefined") return; + const params = new URLSearchParams(window.location.search); + const trimmed = docSearch.value.trim(); + if (trimmed) params.set("q", trimmed); + else params.delete("q"); + const next = params.toString(); + const target = `${window.location.pathname}${next ? `?${next}` : ""}`; + const current = `${window.location.pathname}${window.location.search}`; + if (target !== current) window.history.replaceState(window.history.state, "", target); +} + +function routeSubPathFromSegments(segments: string[]): string { + return segments.length > 0 ? `/${segments.join("/")}` : "/"; +} async function load(): Promise { loadState.value = "loading"; error.value = null; + resetBoards(); try { const segments = props.repositorySegments ?? []; if (segments.length === 0) { @@ -205,9 +492,17 @@ async function load(): Promise { config.value = resolved?.comtryaConfig ?? null; blobs.value = resolved?.blobs ?? []; loadState.value = "ready"; + if (isOverviewSummary.value) { + boards.value = emptyBoards(); + boardState.value = "ready"; + boardError.value = null; + } else { + void loadDocBoards(); + } } catch (caught) { loadState.value = "error"; error.value = caught instanceof Error ? caught.message : String(caught); + resetBoards(); } } @@ -230,6 +525,7 @@ interface DocFile { title: string; frontMatter: DocProperty; body: string; + preview: string; } function parseFrontMatter(raw: string | undefined | null): { props: DocProperty; body: string } { @@ -288,6 +584,7 @@ function filesForType(project: ComtryaProject, type: DocType): DocFile[] { title, frontMatter: props, body, + preview: blob.preview ?? "", }; }) .sort((a, b) => a.fileName.localeCompare(b.fileName)); @@ -300,6 +597,24 @@ function docTypesFor(project: ComtryaProject): Array<{ key: string; type: DocTyp .sort((a, b) => a.key.localeCompare(b.key)); } +function visibleDocTypesFor(project: ComtryaProject): Array<{ key: string; type: DocType }> { + return docTypesFor(project).filter( + (entry) => visibleFilesForType(project, entry.key, entry.type).length > 0, + ); +} + +function visibleFilesForType( + project: ComtryaProject, + typeName: string, + type: DocType, +): DocFile[] { + const files = filesForType(project, type); + if (!hasDocFilter.value) return files; + return files.filter((doc) => + docFileMatches(project, typeName, type, doc, docQuery.value), + ); +} + function propertyEntries(type: DocType): Array<{ name: string; spec: unknown }> { if (!type.properties) return []; return Object.entries(type.properties).map(([name, spec]) => ({ name, spec })); @@ -325,25 +640,238 @@ function describeFrontMatterValue(value: unknown): string { } return String(value); } + +function docCatalogInput(): DocCatalogInput { + const types: DocCatalogTypeInput[] = []; + for (const project of projects.value) { + for (const entry of docTypesFor(project)) { + types.push({ + projectName: project.name ?? "(unnamed project)", + typeName: entry.key, + label: entry.type.label || entry.key, + description: entry.type.description ?? null, + slug: entry.type.slug ?? "", + files: filesForType(project, entry.type).map((doc) => ({ + path: doc.path, + preview: doc.preview, + })), + }); + } + } + return { types }; +} + +function opValue(result: OpResult, label: string): T { + if (result.ok) return result.value as T; + throw new Error(`${label}: ${result.error.message}`); +} + +async function loadDocBoards(): Promise { + const input = docCatalogInput(); + if (!input.types.some((type) => type.files.length > 0)) { + boards.value = emptyBoards(); + boardState.value = "ready"; + boardError.value = null; + return; + } + + boardState.value = "loading"; + boardError.value = null; + try { + const [ + type, + project, + owner, + tag, + status, + scenario, + readiness, + decision, + handoff, + traceability, + implementation, + ] = await Promise.all([ + extDocsXDocs.typeBoard(input), + extDocsXDocs.projectBoard(input), + extDocsXDocs.ownerBoard(input), + extDocsXDocs.tagBoard(input), + extDocsXDocs.statusBoard(input), + extDocsXDocs.scenarioBoard(input), + extDocsXDocs.readinessBoard(input), + extDocsXDocs.decisionBoard(input), + extDocsXDocs.handoffBoard(input), + extDocsXDocs.traceabilityBoard(input), + extDocsXDocs.implementationBoard(input), + ]); + boards.value = { + type: opValue(type, "type board"), + project: opValue(project, "project board"), + owner: opValue(owner, "owner board"), + tag: opValue(tag, "tag board"), + status: opValue(status, "status board"), + scenario: opValue(scenario, "scenario board"), + readiness: opValue(readiness, "readiness board"), + decision: opValue(decision, "review board"), + handoff: opValue(handoff, "handoff board"), + traceability: opValue(traceability, "traceability board"), + implementation: opValue(implementation, "implementation board"), + }; + boardState.value = "ready"; + } catch (caught) { + boards.value = emptyBoards(); + boardState.value = "error"; + boardError.value = caught instanceof Error ? caught.message : String(caught); + } +} + +function boardTabTotal(id: DocsBoardId): number { + return boards.value[id]?.totalDocs ?? 0; +} + +function cardTypeLabel(card: DocBoardCard): string { + return card.typeLabel || card.typeName || "doc"; +} + +function metricRows(card: DocBoardCard): Array<{ label: string; value: string }> { + const rows: Array<{ label: string; value: string }> = []; + if (card.status) rows.push({ label: "status", value: card.status }); + if (card.projectName) rows.push({ label: "project", value: card.projectName }); + if (card.owner) rows.push({ label: "owner", value: card.owner }); + if (card.feature) rows.push({ label: "feature", value: card.feature }); + if (Array.isArray(card.tags) && card.tags.length > 0) { + rows.push({ label: "tags", value: card.tags.join(", ") }); + } + if (typeof card.scenarioCount === "number") { + rows.push({ label: "scenarios", value: String(card.scenarioCount) }); + } + if (typeof card.stepCount === "number") { + rows.push({ label: "steps", value: String(card.stepCount) }); + } + if ( + typeof card.scenariosWithoutSteps === "number" && + card.scenariosWithoutSteps > 0 + ) { + rows.push({ + label: "empty", + value: String(card.scenariosWithoutSteps), + }); + } + if (typeof card.checklistTotal === "number") { + rows.push({ + label: "checklist", + value: `${card.checklistChecked ?? 0}/${card.checklistTotal}`, + }); + } + if (typeof card.referenceCount === "number") { + rows.push({ label: "refs", value: String(card.referenceCount) }); + } + if (typeof card.implementationReferenceCount === "number") { + rows.push({ + label: "impl refs", + value: String(card.implementationReferenceCount), + }); + } + if (typeof card.docReferenceCount === "number") { + rows.push({ label: "doc refs", value: String(card.docReferenceCount) }); + } + if (typeof card.otherReferenceCount === "number" && card.otherReferenceCount > 0) { + rows.push({ label: "other refs", value: String(card.otherReferenceCount) }); + } + if (typeof card.decisionCount === "number") { + rows.push({ label: "decisions", value: String(card.decisionCount) }); + } + if (typeof card.openQuestionCount === "number") { + rows.push({ label: "questions", value: String(card.openQuestionCount) }); + } + if (typeof card.riskCount === "number") { + rows.push({ label: "risks", value: String(card.riskCount) }); + } + return rows; +} @@ -438,6 +1090,171 @@ function describeFrontMatterValue(value: unknown): string { display: grid; gap: 14px; font-family: var(--font-sans, system-ui); + min-width: 0; +} + +.docs-panel--summary { + gap: 0; +} + +.docs-overview-card { + min-width: 0; + display: grid; + gap: 12px; + padding: 14px; + color: var(--fg, rgba(255,255,255,0.94)); +} + +.docs-overview-head { + min-width: 0; + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 12px; +} + +.docs-overview-head h2 { + margin: 0; + font-family: var(--font-sans, system-ui); + font-size: 16px; + font-weight: 600; + line-height: 1.2; + letter-spacing: 0; +} + +.docs-overview-eyebrow { + margin: 0 0 4px; + overflow: hidden; + color: var(--fg-3, rgba(255,255,255,0.52)); + font-family: var(--font-sans, system-ui); + font-size: 12px; + line-height: 1.2; + text-overflow: ellipsis; + white-space: nowrap; +} + +.docs-overview-pill { + flex: 0 0 auto; + min-height: 24px; + display: inline-flex; + align-items: center; + border: 0.5px solid var(--line-2, rgba(255,255,255,0.12)); + border-radius: var(--r-sm, 6px); + padding: 0 8px; + color: var(--accent, #3b82f6); + background: var(--accent-soft, rgba(59,130,246,0.14)); + font-size: 12px; + line-height: 1; + white-space: nowrap; +} + +.docs-overview-copy, +.docs-overview-message { + margin: 0; + color: var(--fg-2, rgba(255,255,255,0.74)); + font-size: 13px; + line-height: 1.45; +} + +.docs-overview-message { + border: 0.5px solid var(--line-2, rgba(255,255,255,0.12)); + border-radius: var(--r-sm, 6px); + padding: 10px 12px; + background: var(--surface, rgba(255,255,255,0.03)); +} + +.docs-overview-message.error { + color: var(--err, #f87171); + border-color: var(--err-soft, rgba(248,113,113,0.2)); + background: var(--err-soft, rgba(248,113,113,0.12)); +} + +.docs-overview-stats { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 8px; + margin: 0; +} + +.docs-overview-stats > div { + min-width: 0; + border: 0.5px solid var(--line-2, rgba(255,255,255,0.12)); + border-radius: var(--r-sm, 6px); + padding: 9px; + background: var(--surface, rgba(255,255,255,0.03)); +} + +.docs-overview-stats dt { + overflow-wrap: anywhere; + color: var(--fg-3, rgba(255,255,255,0.52)); + font-size: 11px; + line-height: 1.25; +} + +.docs-overview-stats dd { + margin: 6px 0 0; + color: var(--fg, rgba(255,255,255,0.94)); + font-family: var(--font-mono, monospace); + font-size: 18px; + font-weight: 600; + line-height: 1; +} + +.docs-overview-types { + display: grid; + gap: 6px; + margin: 0; + padding: 0; + list-style: none; +} + +.docs-overview-types li { + min-width: 0; + display: grid; + grid-template-columns: minmax(0, 1fr) auto; + gap: 10px; + align-items: center; + border: 0.5px solid var(--line, rgba(255,255,255,0.07)); + border-radius: var(--r-sm, 6px); + padding: 8px 9px; + background: var(--surface, rgba(255,255,255,0.03)); +} + +.docs-overview-types span { + min-width: 0; + overflow: hidden; + color: var(--fg-2, rgba(255,255,255,0.74)); + font-size: 13px; + line-height: 1.2; + text-overflow: ellipsis; + white-space: nowrap; +} + +.docs-overview-types strong { + color: var(--fg, rgba(255,255,255,0.94)); + font-family: var(--font-mono, monospace); + font-size: 12px; + line-height: 1; +} + +.docs-overview-link { + min-height: 32px; + display: inline-flex; + align-items: center; + justify-content: center; + border: 0.5px solid var(--line-2, rgba(255,255,255,0.12)); + border-radius: var(--r-sm, 6px); + padding: 0 10px; + color: var(--fg, rgba(255,255,255,0.94)); + background: var(--surface, rgba(255,255,255,0.03)); + font-size: 13px; + font-weight: 600; + text-decoration: none; +} + +.docs-overview-link:hover { + border-color: var(--accent, #3b82f6); + color: var(--accent, #3b82f6); } .docs-panel .docs-head { @@ -480,6 +1297,251 @@ function describeFrontMatterValue(value: unknown): string { color: var(--accent-err, #c9341c); } +.docs-panel .docs-workbench { + border: 0.5px solid var(--line, rgba(255,255,255,0.07)); + background: var(--surface, rgba(255,255,255,0.03)); +} + +.docs-panel .docs-workbench-head { + display: grid; + grid-template-columns: minmax(160px, 1fr) auto; + align-items: start; + gap: 12px; + padding: 10px 12px; + border-bottom: 0.5px solid var(--line, rgba(255,255,255,0.07)); +} + +.docs-panel .docs-workbench-title { + display: flex; + align-items: baseline; + gap: 10px; + min-width: 0; +} + +.docs-panel .docs-workbench-title h3 { + margin: 0; + font-family: var(--font-serif, system-ui); + font-size: 16px; + line-height: 1; +} + +.docs-panel .docs-board-tabs { + display: flex; + flex-wrap: wrap; + justify-content: flex-end; + gap: 4px; +} + +.docs-panel .docs-board-tab { + display: inline-flex; + align-items: center; + gap: 7px; + min-height: 30px; + max-width: 100%; + border: 0.5px solid var(--line, rgba(255,255,255,0.07)); + border-radius: 6px; + background: var(--bg, #0a0b0e); + color: var(--fg-2, rgba(255,255,255,0.74)); + font-family: var(--font-mono, monospace); + font-size: 11px; + line-height: 1; + white-space: nowrap; + cursor: pointer; +} + +.docs-panel .docs-board-tab:hover, +.docs-panel .docs-board-tab.active { + border-color: var(--fg-3, rgba(255,255,255,0.52)); + color: var(--fg, rgba(255,255,255,0.94)); +} + +.docs-panel .docs-board-tab.active { + background: var(--bg-2, #0e1014); +} + +.docs-panel .docs-board-tab strong { + min-width: 16px; + border-radius: 6px; + padding: 3px 5px; + background: var(--surface-2, rgba(255,255,255,0.06)); + color: var(--fg, rgba(255,255,255,0.94)); + text-align: center; + font-weight: 700; +} + +.docs-panel .docs-workbench-toolbar { + display: flex; + flex-wrap: wrap; + gap: 8px; + align-items: center; + padding: 10px 12px; + border-bottom: 0.5px solid var(--line, rgba(255,255,255,0.07)); + background: var(--surface, rgba(255,255,255,0.03)); +} + +.docs-panel .docs-search { + flex: 1 1 280px; + min-width: 0; +} + +.docs-panel .docs-search input { + width: 100%; + border: 0.5px solid var(--line, rgba(255,255,255,0.07)); + border-radius: var(--r-sm, 6px); + background: var(--bg, #0a0b0e); + color: var(--fg, rgba(255,255,255,0.94)); + font: inherit; + padding: 8px 10px; +} + +.docs-panel .docs-search input:focus { + border-color: var(--accent-blue, #1d55a6); + outline: 2px solid color-mix(in srgb, var(--accent-blue, #1d55a6) 32%, transparent); + outline-offset: 1px; +} + +.docs-panel .docs-clear { + border: 0.5px solid var(--line, rgba(255,255,255,0.07)); + border-radius: var(--r-sm, 6px); + background: var(--bg-2, #0e1014); + color: var(--fg, rgba(255,255,255,0.94)); + cursor: pointer; + font: inherit; + padding: 8px 10px; +} + +.docs-panel .docs-clear:hover { + border-color: var(--fg-3, rgba(255,255,255,0.52)); +} + +.docs-panel .docs-filter-summary { + min-width: 0; + color: var(--fg-3, rgba(255,255,255,0.52)); + font-family: var(--font-mono, monospace); + font-size: 11px; + line-height: 1.3; + overflow-wrap: anywhere; +} + +.docs-panel .docs-board-status { + margin: 0; + padding: 12px; +} + +.docs-panel .docs-board { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); + gap: 10px; + padding: 10px; + align-items: start; +} + +.docs-panel .docs-board-column { + min-width: 0; + border: 0.5px solid var(--line, rgba(255,255,255,0.07)); + background: var(--bg, #0a0b0e); +} + +.docs-panel .docs-board-column-head { + display: flex; + align-items: center; + justify-content: space-between; + gap: 8px; + padding: 8px 10px; + border-bottom: 0.5px solid var(--line, rgba(255,255,255,0.07)); + background: var(--bg-2, #0e1014); +} + +.docs-panel .docs-board-column-head h4 { + margin: 0; + min-width: 0; + overflow-wrap: anywhere; + font-family: var(--font-mono, monospace); + font-size: 12px; + line-height: 1.2; + color: var(--fg, rgba(255,255,255,0.94)); +} + +.docs-panel .docs-board-column-head span { + flex: 0 0 auto; + font-family: var(--font-mono, monospace); + font-size: 11px; + color: var(--fg-3, rgba(255,255,255,0.52)); +} + +.docs-panel .docs-board-cards { + list-style: none; + margin: 0; + padding: 8px; + display: grid; + gap: 8px; +} + +.docs-panel .docs-board-card { + min-width: 0; + border: 0.5px solid var(--line, rgba(255,255,255,0.07)); + border-radius: 6px; + padding: 8px; + background: var(--surface, rgba(255,255,255,0.03)); +} + +.docs-panel .docs-board-card-head { + display: grid; + gap: 3px; + min-width: 0; +} + +.docs-panel .docs-board-card-head strong { + min-width: 0; + overflow-wrap: anywhere; + font-family: var(--font-serif, system-ui); + font-size: 13px; + line-height: 1.2; +} + +.docs-panel .docs-board-type { + font-family: var(--font-mono, monospace); + font-size: 10px; + line-height: 1; + color: var(--accent-blue, #1d55a6); +} + +.docs-panel .docs-board-path { + display: block; + margin-top: 6px; + overflow-wrap: anywhere; + font-family: var(--font-mono, monospace); + font-size: 10px; + line-height: 1.3; + color: var(--fg-3, rgba(255,255,255,0.52)); +} + +.docs-panel .docs-board-metrics { + display: grid; + grid-template-columns: minmax(64px, max-content) 1fr; + gap: 2px 8px; + margin: 8px 0 0; + font-family: var(--font-mono, monospace); + font-size: 10px; + line-height: 1.35; +} + +.docs-panel .docs-board-metrics dt { + color: var(--fg-4, rgba(255,255,255,0.34)); +} + +.docs-panel .docs-board-metrics dd { + margin: 0; + min-width: 0; + overflow-wrap: anywhere; + color: var(--fg-2, rgba(255,255,255,0.74)); +} + +.docs-panel .docs-board-empty { + margin: 0; + padding: 8px 10px 10px; +} + .docs-panel .docs-project { border: 0.5px solid var(--fg, rgba(255,255,255,0.94)); background: var(--bg, #0a0b0e); @@ -735,4 +1797,25 @@ function describeFrontMatterValue(value: unknown): string { .docs-panel .no-files { margin: 0; } + +@media (max-width: 760px) { + .docs-panel .docs-workbench-head { + grid-template-columns: 1fr; + } + + .docs-panel .docs-board-tabs { + justify-content: flex-start; + } + + .docs-panel .docs-workbench-toolbar { + align-items: stretch; + flex-direction: column; + } + + .docs-panel .docs-search, + .docs-panel .docs-clear { + flex: 0 1 auto; + width: 100%; + } +} diff --git a/extensions/first-party/ext_docs/ui/src/docs-board-filter.test.ts b/extensions/first-party/ext_docs/ui/src/docs-board-filter.test.ts new file mode 100644 index 00000000..263b3caa --- /dev/null +++ b/extensions/first-party/ext_docs/ui/src/docs-board-filter.test.ts @@ -0,0 +1,152 @@ +import { describe, expect, test } from "bun:test"; +import { + docFileMatches, + filterDocBoard, + type DocsFilterQuery, + type FilterableDocBoard, + type FilterableDocFile, + type FilterableDocType, + type FilterableProject, +} from "./docs-board-filter"; + +function query(text = "", filters: Record = {}): DocsFilterQuery { + return { text, filters }; +} + +const board: FilterableDocBoard = { + totalDocs: 3, + columns: [ + { + key: "prd", + label: "PRDs", + count: 2, + docs: [ + { + projectName: "frontend", + typeName: "prd", + typeLabel: "Frontend PRDs", + path: "frontend/docs/prds/0001-keyboard-first-shell.mdx", + title: "Keyboard-first shell", + status: "shipping", + owner: "frontend-maintainers", + tags: ["shell", "keyboard"], + }, + { + projectName: "backend", + typeName: "prd", + typeLabel: "Backend PRDs", + path: "crates/server/docs/prds/repository-docs-surface.mdx", + title: "Repository Docs Surface", + status: "active", + owner: "platform-maintainers", + tags: ["docs", "projects"], + }, + ], + }, + { + key: "scenario", + label: "BDD Scenarios", + count: 1, + docs: [ + { + projectName: "backend", + typeName: "scenario", + typeLabel: "BDD Scenarios", + path: "crates/server/docs/scenarios/repository-docs-surface.mdx", + title: "Repository docs are discoverable from project context", + status: "active", + owner: "platform-maintainers", + tags: ["docs", "projects", "bdd"], + feature: "repository docs", + scenarioCount: 2, + stepCount: 6, + }, + ], + }, + ], +}; + +const project: FilterableProject = { + name: "backend", + root: "crates/server", + labels: ["rust"], +}; + +const docType: FilterableDocType = { + label: "BDD Scenarios", + slug: "docs/scenarios", + description: "Executable behavior examples", +}; + +const docFile: FilterableDocFile = { + path: "crates/server/docs/scenarios/repository-docs-surface.mdx", + fileName: "repository-docs-surface.mdx", + title: "Repository docs are discoverable from project context", + frontMatter: { + status: "active", + owner: "platform-maintainers", + tags: ["docs", "projects", "bdd"], + feature: "repository docs", + }, + body: "Given a repository with Project docs, When I open Specs, Then PRDs and BDD scenarios are visible.", + preview: "", +}; + +describe("filterDocBoard", () => { + test("filters board cards by type, project, status alias, and text", () => { + const filtered = filterDocBoard( + board, + query("project context", { + type: ["scenario"], + project: ["backend"], + is: ["open"], + }), + ); + + expect(filtered.totalDocs).toBe(1); + expect(filtered.columns.map((column) => column.count)).toEqual([0, 1]); + expect(filtered.columns[1]?.docs[0]?.title).toBe( + "Repository docs are discoverable from project context", + ); + }); + + test("requires all requested tags to match", () => { + const filtered = filterDocBoard( + board, + query("", { tag: ["docs", "bdd"] }), + ); + + expect(filtered.totalDocs).toBe(1); + expect(filtered.columns[1]?.docs[0]?.typeLabel).toBe("BDD Scenarios"); + }); +}); + +describe("docFileMatches", () => { + test("matches repo docs by front matter, path, and body text", () => { + expect( + docFileMatches( + project, + "scenario", + docType, + docFile, + query("repository with project docs", { + owner: ["platform"], + path: ["scenarios"], + feature: ["repository"], + }), + ), + ).toBe(true); + }); + + test("rejects docs outside requested type or status", () => { + expect( + docFileMatches( + project, + "scenario", + docType, + docFile, + query("", { type: ["prd"], status: ["accepted"] }), + ), + ).toBe(false); + }); +}); diff --git a/extensions/first-party/ext_docs/ui/src/docs-board-filter.ts b/extensions/first-party/ext_docs/ui/src/docs-board-filter.ts new file mode 100644 index 00000000..ba9efb77 --- /dev/null +++ b/extensions/first-party/ext_docs/ui/src/docs-board-filter.ts @@ -0,0 +1,245 @@ +export interface DocsFilterQuery { + text: string; + filters: Record; +} + +export interface FilterableDocBoardCard { + projectName?: string; + typeName?: string; + typeLabel?: string; + path?: string; + title?: string; + status?: string | null; + owner?: string | null; + tags?: string[]; + feature?: string | null; + scenarioCount?: number; + stepCount?: number; + scenariosWithoutSteps?: number; + checklistTotal?: number; + checklistChecked?: number; + referenceCount?: number; + implementationReferenceCount?: number; + docReferenceCount?: number; + otherReferenceCount?: number; + decisionCount?: number; + openQuestionCount?: number; + riskCount?: number; +} + +export interface FilterableDocBoardColumn { + key: string; + label: string; + count: number; + docs: FilterableDocBoardCard[]; +} + +export interface FilterableDocBoard { + totalDocs: number; + columns: FilterableDocBoardColumn[]; +} + +export interface FilterableProject { + name?: string; + root?: string; + labels?: string[]; +} + +export interface FilterableDocType { + slug?: string; + label?: string; + description?: string; +} + +export interface FilterableDocFile { + path: string; + fileName: string; + title: string; + frontMatter: Record; + body: string; + preview: string; +} + +export function filterDocBoard( + board: TBoard, + query: DocsFilterQuery, +): TBoard { + if (!hasDocsFilterQuery(query)) return board; + const columns = board.columns.map((column) => { + const docs = column.docs.filter((doc) => docBoardCardMatches(doc, query)); + return { + ...column, + count: docs.length, + docs, + }; + }); + return { + ...board, + totalDocs: columns.reduce((sum, column) => sum + column.docs.length, 0), + columns, + }; +} + +export function docFileMatches( + project: FilterableProject, + typeName: string, + type: FilterableDocType, + doc: FilterableDocFile, + query: DocsFilterQuery, +): boolean { + if (!hasDocsFilterQuery(query)) return true; + if (!matchesAnyQuery([typeName, type.label], query.filters.type ?? [])) return false; + if (!matchesAnyQuery([project.name], query.filters.project ?? [])) return false; + if (!matchesAnyQuery([doc.frontMatter.owner], query.filters.owner ?? [])) return false; + if (!matchesStatusQuery(doc.frontMatter.status, statusFilters(query))) return false; + if (!matchesAllQuery(frontMatterList(doc.frontMatter.tags), query.filters.tag ?? [])) { + return false; + } + if (!matchesAnyQuery([doc.path, doc.fileName], query.filters.path ?? [])) return false; + if (!matchesAnyQuery([doc.frontMatter.feature], query.filters.feature ?? [])) { + return false; + } + return matchesText(docFileSearchFields(project, typeName, type, doc), query.text); +} + +export function hasDocsFilterQuery(query: DocsFilterQuery): boolean { + return ( + query.text.trim().length > 0 || + Object.values(query.filters).some((values) => values.length > 0) + ); +} + +function docBoardCardMatches( + card: FilterableDocBoardCard, + query: DocsFilterQuery, +): boolean { + if (!matchesAnyQuery([card.typeName, card.typeLabel], query.filters.type ?? [])) { + return false; + } + if (!matchesAnyQuery([card.projectName], query.filters.project ?? [])) return false; + if (!matchesAnyQuery([card.owner], query.filters.owner ?? [])) return false; + if (!matchesStatusQuery(card.status, statusFilters(query))) return false; + if (!matchesAllQuery(card.tags ?? [], query.filters.tag ?? [])) return false; + if (!matchesAnyQuery([card.path], query.filters.path ?? [])) return false; + if (!matchesAnyQuery([card.feature], query.filters.feature ?? [])) return false; + return matchesText(docBoardCardSearchFields(card), query.text); +} + +function statusFilters(query: DocsFilterQuery): string[] { + return [...(query.filters.status ?? []), ...(query.filters.is ?? [])]; +} + +function matchesStatusQuery(value: unknown, filters: string[]): boolean { + if (filters.length === 0) return true; + const normalizedValue = normalizeSearchValue(value); + return filters.some((filter) => { + const normalizedFilter = normalizeSearchValue(filter); + const expected = STATUS_ALIASES[normalizedFilter] ?? [normalizedFilter]; + return expected.includes(normalizedValue) || normalizedValue.includes(normalizedFilter); + }); +} + +function matchesAnyQuery(values: unknown[], filters: string[]): boolean { + if (filters.length === 0) return true; + const haystack = values.flatMap(searchableValues).map(normalizeSearchValue).filter(Boolean); + return filters.some((filter) => + haystack.some((value) => value.includes(normalizeSearchValue(filter))), + ); +} + +function matchesAllQuery(values: unknown[], filters: string[]): boolean { + if (filters.length === 0) return true; + const haystack = values.flatMap(searchableValues).map(normalizeSearchValue).filter(Boolean); + return filters.every((filter) => + haystack.some((value) => value.includes(normalizeSearchValue(filter))), + ); +} + +function matchesText(values: unknown[], text: string): boolean { + const needle = normalizeSearchValue(text); + if (!needle) return true; + return values.flatMap(searchableValues).map(normalizeSearchValue).join(" ").includes(needle); +} + +function docBoardCardSearchFields(card: FilterableDocBoardCard): unknown[] { + return [ + card.projectName, + card.typeName, + card.typeLabel, + card.path, + card.title, + card.status, + card.owner, + card.tags, + card.feature, + card.scenarioCount, + card.stepCount, + card.scenariosWithoutSteps, + card.checklistTotal, + card.checklistChecked, + card.referenceCount, + card.implementationReferenceCount, + card.docReferenceCount, + card.otherReferenceCount, + card.decisionCount, + card.openQuestionCount, + card.riskCount, + ]; +} + +function docFileSearchFields( + project: FilterableProject, + typeName: string, + type: FilterableDocType, + doc: FilterableDocFile, +): unknown[] { + return [ + project.name, + project.root, + project.labels, + typeName, + type.label, + type.slug, + type.description, + doc.path, + doc.fileName, + doc.title, + doc.frontMatter, + doc.body, + doc.preview, + ]; +} + +function frontMatterList(value: unknown): unknown[] { + return Array.isArray(value) ? value : [value]; +} + +function searchableValues(value: unknown): string[] { + if (value === null || value === undefined) return []; + if (Array.isArray(value)) return value.flatMap(searchableValues); + if (typeof value === "object") { + return Object.entries(value as Record).flatMap(([key, item]) => [ + key, + ...searchableValues(item), + ]); + } + return [String(value)]; +} + +function normalizeSearchValue(value: unknown): string { + return String(value ?? "").trim().toLowerCase(); +} + +const STATUS_ALIASES: Record = { + active: ["active"], + accepted: ["accepted"], + done: ["accepted", "shipping", "shipped"], + draft: ["draft", "proposed"], + implemented: ["implemented", "shipping", "shipped"], + open: ["active", "draft", "proposed"], + planned: ["planned", "proposed"], + proposed: ["proposed", "draft"], + review: ["review", "in-review"], + shipping: ["shipping", "shipped"], + shipped: ["shipping", "shipped"], +}; diff --git a/extensions/first-party/ext_docs/ui/src/docs-workbench-route.test.ts b/extensions/first-party/ext_docs/ui/src/docs-workbench-route.test.ts new file mode 100644 index 00000000..7896eb30 --- /dev/null +++ b/extensions/first-party/ext_docs/ui/src/docs-workbench-route.test.ts @@ -0,0 +1,53 @@ +import { describe, expect, test } from "bun:test"; +import { + docsBoardFromRouteSubPath, + docsBoardHref, +} from "./docs-workbench-route"; + +describe("docs workbench routes", () => { + test("maps root and spec-oriented aliases to the specs board", () => { + expect(docsBoardFromRouteSubPath("/")).toBe("type"); + expect(docsBoardFromRouteSubPath("/types")).toBe("type"); + expect(docsBoardFromRouteSubPath("/specs")).toBe("type"); + expect(docsBoardFromRouteSubPath("/prds")).toBe("type"); + }); + + test("maps scenario-oriented aliases to the scenarios board", () => { + expect(docsBoardFromRouteSubPath("/scenarios")).toBe("scenario"); + expect(docsBoardFromRouteSubPath("/bdd")).toBe("scenario"); + expect(docsBoardFromRouteSubPath("/bdd-scenarios")).toBe("scenario"); + }); + + test("builds canonical extension workbench links and preserves query context", () => { + expect( + docsBoardHref({ + boardId: "scenario", + pathname: "/x/docs", + routeSubPath: "/", + search: "?workspaceId=ws_1", + }), + ).toBe("/x/docs/scenarios?workspaceId=ws_1"); + + expect( + docsBoardHref({ + boardId: "type", + pathname: "/x/docs/scenarios", + routeSubPath: "/scenarios", + search: "?workspaceId=ws_1", + }), + ).toBe("/x/docs?workspaceId=ws_1"); + }); + + test("builds repo-embedded workbench links from the forwarded extension subpath", () => { + expect( + docsBoardHref({ + boardId: "readiness", + pathname: "/r/comtrya/dogfood/docs/scenarios", + routeSubPath: "/scenarios", + search: "?workspaceId=ws_1&repositoryId=repo_1", + }), + ).toBe( + "/r/comtrya/dogfood/docs/readiness?workspaceId=ws_1&repositoryId=repo_1", + ); + }); +}); diff --git a/extensions/first-party/ext_docs/ui/src/docs-workbench-route.ts b/extensions/first-party/ext_docs/ui/src/docs-workbench-route.ts new file mode 100644 index 00000000..de989bb7 --- /dev/null +++ b/extensions/first-party/ext_docs/ui/src/docs-workbench-route.ts @@ -0,0 +1,106 @@ +export type DocsBoardId = + | "type" + | "project" + | "owner" + | "tag" + | "status" + | "scenario" + | "readiness" + | "decision" + | "handoff" + | "traceability" + | "implementation"; + +export interface DocsBoardTab { + id: DocsBoardId; + label: string; + pathSegment: string; +} + +export const DOCS_BOARD_TABS: DocsBoardTab[] = [ + { id: "type", label: "Specs", pathSegment: "" }, + { id: "project", label: "Projects", pathSegment: "projects" }, + { id: "owner", label: "Owners", pathSegment: "owners" }, + { id: "tag", label: "Tags", pathSegment: "tags" }, + { id: "status", label: "Status", pathSegment: "status" }, + { id: "scenario", label: "Scenarios", pathSegment: "scenarios" }, + { id: "readiness", label: "Readiness", pathSegment: "readiness" }, + { id: "decision", label: "Review", pathSegment: "review" }, + { id: "handoff", label: "Handoff", pathSegment: "handoff" }, + { id: "traceability", label: "Traceability", pathSegment: "traceability" }, + { id: "implementation", label: "Implementation", pathSegment: "implementation" }, +]; + +const BOARD_ALIASES: Record = { + "": "type", + bdd: "scenario", + "bdd-scenarios": "scenario", + decision: "decision", + decisions: "decision", + handoff: "handoff", + implementation: "implementation", + owner: "owner", + owners: "owner", + prd: "type", + prds: "type", + project: "project", + projects: "project", + readiness: "readiness", + review: "decision", + scenario: "scenario", + scenarios: "scenario", + spec: "type", + specs: "type", + status: "status", + tag: "tag", + tags: "tag", + traceability: "traceability", + type: "type", + types: "type", +}; + +export function docsBoardFromRouteSubPath( + routeSubPath: string | null | undefined, +): DocsBoardId { + const segment = firstRouteSegment(routeSubPath); + return BOARD_ALIASES[segment] ?? "type"; +} + +export function docsBoardHref(input: { + boardId: DocsBoardId; + pathname: string; + routeSubPath?: string | null; + search?: string | null; +}): string { + const basePath = docsWorkbenchBasePath(input.pathname, input.routeSubPath); + const segment = pathSegmentForBoard(input.boardId); + const path = segment ? `${basePath}/${segment}` : basePath; + const search = input.search && input.search !== "?" ? input.search : ""; + return `${path}${search}`; +} + +function pathSegmentForBoard(boardId: DocsBoardId): string { + return DOCS_BOARD_TABS.find((tab) => tab.id === boardId)?.pathSegment ?? ""; +} + +function docsWorkbenchBasePath(pathname: string, routeSubPath: string | null | undefined): string { + const cleanPath = stripTrailingSlashes(pathname || "/"); + const cleanSubPath = stripTrailingSlashes(routeSubPath || "/"); + if (cleanSubPath !== "/" && cleanPath.endsWith(cleanSubPath)) { + return stripTrailingSlashes(cleanPath.slice(0, -cleanSubPath.length) || "/"); + } + return cleanPath; +} + +function firstRouteSegment(routeSubPath: string | null | undefined): string { + return (routeSubPath ?? "") + .split("/") + .filter(Boolean)[0] + ?.toLowerCase() ?? ""; +} + +function stripTrailingSlashes(value: string): string { + let end = value.length; + while (end > 1 && value.charCodeAt(end - 1) === 0x2f) end -= 1; + return value.slice(0, end); +} diff --git a/extensions/first-party/ext_docs/ui/src/register.ts b/extensions/first-party/ext_docs/ui/src/register.ts index d17a5f7b..209303ba 100644 --- a/extensions/first-party/ext_docs/ui/src/register.ts +++ b/extensions/first-party/ext_docs/ui/src/register.ts @@ -12,6 +12,13 @@ interface ExtensionHost { defaultPriority?: number; requiredPermission: string; }): unknown; + registerRoute( + path: string, + contribution: { + element: string; + requiredPermission: string; + }, + ): unknown; } interface ExtensionDefinition { @@ -31,6 +38,14 @@ const extension: ExtensionDefinition = { defaultPriority: 80, requiredPermission: "workspace.read", }); + host.registerRoute("/", { + element: DOCS_PANEL_TAG, + requiredPermission: "workspace.read", + }); + host.registerRoute("/:board", { + element: DOCS_PANEL_TAG, + requiredPermission: "workspace.read", + }); }, }; diff --git a/extensions/first-party/ext_docs/ui/vite.config.ts b/extensions/first-party/ext_docs/ui/vite.config.ts index 86a293e4..560aa258 100644 --- a/extensions/first-party/ext_docs/ui/vite.config.ts +++ b/extensions/first-party/ext_docs/ui/vite.config.ts @@ -6,6 +6,7 @@ const fromHere = (path: string): string => fileURLToPath(new URL(path, import.me export default defineConfig({ root: fromHere("."), + envPrefix: ["VITE_", "PUBLIC_"], define: { "process.env.NODE_ENV": JSON.stringify("production"), }, diff --git a/extensions/first-party/ext_docs/wit/docs.wit b/extensions/first-party/ext_docs/wit/docs.wit index 1ebba36d..24f620b7 100644 --- a/extensions/first-party/ext_docs/wit/docs.wit +++ b/extensions/first-party/ext_docs/wit/docs.wit @@ -6,19 +6,497 @@ // `package comtrya` configuration and exposes the result on // `repository.comtryaConfig`; ext_docs's UI reads it. // -// No backend ops are needed in 0.1.0 — the data path is kernel-owned -// (CUE evaluation + repo file tree). `ping` exists only because the -// kernel requires every first-party extension to ship a real WASM -// component with at least one exported interface op. +// The kernel owns CUE evaluation and repo file enumeration. ext_docs owns +// document semantics such as front-matter extraction so ADRs, specs, PRDs, +// scenarios, and future user-defined types use one parser. package comtrya:ext-docs@0.1.0; interface docs { use comtrya:platform/types@0.1.0.{error}; - /// Liveness ping. 0.2.0 will add typed ops for front-matter - /// extraction once we move parsing off the UI. + record summarize-doc-input { + path: string, + preview: string, + } + + record doc-type-input { + project-name: string, + type-name: string, + label: string, + description: option, + slug: string, + files: list, + } + + record doc-catalog-input { + types: list, + } + + record doc-property { + key: string, + value: string, + } + + record doc-summary { + path: string, + title: string, + property-count: u32, + properties: list, + body-excerpt: string, + has-front-matter: bool, + } + + record doc-type-summary { + project-name: string, + type-name: string, + label: string, + description: option, + slug: string, + doc-count: u32, + docs: list, + } + + record doc-catalog { + total-docs: u32, + types: list, + } + + record doc-type-card { + project-name: string, + type-name: string, + type-label: string, + slug: string, + path: string, + title: string, + status: string, + owner: option, + tags: list, + } + + record doc-type-column { + key: string, + label: string, + type-name: string, + count: u32, + docs: list, + } + + record doc-type-board { + total-docs: u32, + columns: list, + } + + record doc-status-card { + project-name: string, + type-name: string, + type-label: string, + path: string, + title: string, + status: string, + owner: option, + } + + record doc-status-column { + key: string, + label: string, + count: u32, + docs: list, + } + + record doc-status-board { + total-docs: u32, + columns: list, + } + + record doc-owner-card { + project-name: string, + type-name: string, + type-label: string, + path: string, + title: string, + status: string, + owner: option, + } + + record doc-owner-column { + key: string, + label: string, + owner: option, + count: u32, + docs: list, + } + + record doc-owner-board { + total-docs: u32, + columns: list, + } + + record doc-tag-card { + project-name: string, + type-name: string, + type-label: string, + path: string, + title: string, + status: string, + tags: list, + } + + record doc-tag-column { + key: string, + label: string, + tag: option, + count: u32, + docs: list, + } + + record doc-tag-board { + total-docs: u32, + columns: list, + } + + record doc-project-card { + project-name: string, + type-name: string, + type-label: string, + path: string, + title: string, + status: string, + owner: option, + tags: list, + } + + record doc-project-column { + key: string, + label: string, + project-name: option, + count: u32, + docs: list, + } + + record doc-project-board { + total-docs: u32, + columns: list, + } + + record bdd-step { + keyword: string, + text: string, + } + + record bdd-scenario { + kind: string, + title: string, + step-count: u32, + steps: list, + } + + record bdd-summary { + path: string, + title: string, + feature: option, + scenario-count: u32, + step-count: u32, + scenarios: list, + } + + record doc-scenario-card { + project-name: string, + type-name: string, + type-label: string, + path: string, + title: string, + status: string, + feature: option, + scenario-count: u32, + step-count: u32, + scenarios-without-steps: u32, + } + + record doc-scenario-column { + key: string, + label: string, + count: u32, + docs: list, + } + + record doc-scenario-board { + total-docs: u32, + columns: list, + } + + record doc-checklist-item { + text: string, + checked: bool, + } + + record doc-checklist-section { + heading: string, + item-count: u32, + checked-count: u32, + items: list, + } + + record doc-checklist-summary { + path: string, + title: string, + total-items: u32, + checked-items: u32, + sections: list, + } + + record doc-reference { + kind: string, + target: string, + label: option, + line: u32, + } + + record doc-reference-summary { + path: string, + title: string, + reference-count: u32, + references: list, + } + + record doc-traceability-card { + project-name: string, + type-name: string, + type-label: string, + path: string, + title: string, + status: string, + reference-count: u32, + implementation-reference-count: u32, + doc-reference-count: u32, + other-reference-count: u32, + references: list, + } + + record doc-traceability-column { + key: string, + label: string, + count: u32, + docs: list, + } + + record doc-traceability-board { + total-docs: u32, + columns: list, + } + + record doc-outline-heading { + level: u32, + title: string, + slug: string, + line: u32, + } + + record doc-outline-summary { + path: string, + title: string, + heading-count: u32, + headings: list, + } + + record doc-decision-item { + kind: string, + text: string, + line: u32, + } + + record doc-decision-summary { + path: string, + title: string, + decision-count: u32, + open-question-count: u32, + risk-count: u32, + items: list, + } + + record doc-decision-card { + project-name: string, + type-name: string, + type-label: string, + path: string, + title: string, + status: string, + decision-count: u32, + open-question-count: u32, + risk-count: u32, + } + + record doc-decision-column { + key: string, + label: string, + count: u32, + docs: list, + } + + record doc-decision-board { + total-docs: u32, + columns: list, + } + + record doc-readiness-card { + project-name: string, + type-name: string, + type-label: string, + path: string, + title: string, + status: string, + checklist-total: u32, + checklist-checked: u32, + scenario-count: u32, + reference-count: u32, + } + + record doc-readiness-column { + key: string, + label: string, + count: u32, + docs: list, + } + + record doc-readiness-board { + total-docs: u32, + columns: list, + } + + record doc-handoff-card { + project-name: string, + type-name: string, + type-label: string, + path: string, + title: string, + status: string, + checklist-total: u32, + checklist-checked: u32, + scenario-count: u32, + implementation-reference-count: u32, + open-question-count: u32, + risk-count: u32, + } + + record doc-handoff-column { + key: string, + label: string, + count: u32, + docs: list, + } + + record doc-handoff-board { + total-docs: u32, + columns: list, + } + + record doc-implementation-card { + project-name: string, + type-name: string, + type-label: string, + path: string, + title: string, + status: string, + checklist-total: u32, + checklist-checked: u32, + scenario-count: u32, + reference-count: u32, + implementation-reference-count: u32, + doc-reference-count: u32, + open-question-count: u32, + risk-count: u32, + } + + record doc-implementation-column { + key: string, + label: string, + count: u32, + docs: list, + } + + record doc-implementation-board { + total-docs: u32, + columns: list, + } + + /// Liveness ping. ping: func() -> result; + + /// Parse one Markdown/MDX preview into the normalized summary shape + /// consumed by docs surfaces. + summarize-doc: func(input: summarize-doc-input) -> result; + + /// Build a normalized catalog for already-enumerated project doc types. + /// The kernel or UI supplies the project/type/file enumeration; ext_docs + /// owns parsing and summary semantics for every file in the catalog. + summarize-catalog: func(input: doc-catalog-input) -> result; + + /// Group already-enumerated project docs by declared doc type so PRDs, + /// specs, BDD scenarios, ADRs, and user-defined types are visible even + /// when a configured type has no files yet. + type-board: func(input: doc-catalog-input) -> result; + + /// Group already-enumerated project docs into familiar product-status lanes. + /// Status comes from front matter; missing or unknown statuses are surfaced + /// explicitly so project docs do not look healthier than they are. + status-board: func(input: doc-catalog-input) -> result; + + /// Group project docs by front-matter owner so specs, PRDs, and BDD scenarios + /// can be reviewed by responsibility instead of only by type or lifecycle. + owner-board: func(input: doc-catalog-input) -> result; + + /// Group project docs by front-matter tags so specs, PRDs, and BDD scenarios + /// can be browsed by product area without shell-side taxonomy parsing. + tag-board: func(input: doc-catalog-input) -> result; + + /// Group project docs by their owning project, with an explicit Unscoped lane + /// for docs that are intentionally repo-level rather than project-specific. + project-board: func(input: doc-catalog-input) -> result; + + /// Extract the BDD shape from a Markdown/MDX document so scenario docs can be + /// indexed beside PRDs and specs without the shell parsing Gherkin itself. + summarize-scenarios: func(input: summarize-doc-input) -> result; + + /// Group BDD scenario docs by missing feature/scenario/step coverage so + /// behavior specs can be reviewed like a first-class work queue. + scenario-board: func(input: doc-catalog-input) -> result; + + /// Extract Markdown task-list sections from PRDs and specs so acceptance + /// criteria and rollout readiness can be surfaced by extension UIs. + summarize-checklists: func(input: summarize-doc-input) -> result; + + /// Extract forge-local references from product docs so PRDs, specs, BDD + /// scenarios, issues, epics, and pull requests can be traced together. + summarize-references: func(input: summarize-doc-input) -> result; + + /// Group product docs by implementation and document traceability so + /// unlinked PRDs/specs/scenarios are visible before work drifts away. + traceability-board: func(input: doc-catalog-input) -> result; + + /// Extract a Markdown/MDX heading outline so docs surfaces can render + /// familiar in-page navigation without shell-side Markdown parsing. + summarize-outline: func(input: summarize-doc-input) -> result; + + /// Extract decisions, open questions, and risks from PRDs/specs so product + /// docs can expose review state without shell-side Markdown parsing. + summarize-decisions: func(input: summarize-doc-input) -> result; + + /// Group product docs by decision-review state so PRDs/specs with open + /// questions or risks are visible before they drift away from implementation. + decision-board: func(input: doc-catalog-input) -> result; + + /// Group product docs by readiness signals from acceptance criteria, + /// BDD scenarios, and forge-local traceability links. + readiness-board: func(input: doc-catalog-input) -> result; + + /// Group product docs by implementation handoff state so specs, PRDs, and + /// BDD scenarios can move from product review into linked forge work. + handoff-board: func(input: doc-catalog-input) -> result; + + /// Group product docs by implementation delivery state so specs, PRDs, and + /// BDD scenarios expose acceptance coverage, review blockers, linked forge + /// work, and implemented requirements in one familiar queue. + implementation-board: func(input: doc-catalog-input) -> result; } world ext-docs { diff --git a/extensions/first-party/ext_epics/assets/index.js b/extensions/first-party/ext_epics/assets/index.js index 656ed4c2..5d2706e6 100644 --- a/extensions/first-party/ext_epics/assets/index.js +++ b/extensions/first-party/ext_epics/assets/index.js @@ -1,420 +1,92 @@ -//#region packages/sdk-core/src/session.ts -var e, t; -async function n(n = {}) { - return e && e.expiresAtMs > Date.now() + 5e3 ? e.token : (t ||= i(n).finally(() => { - t = void 0; - }), t); -} -function r() { - e = void 0; -} -async function i(t) { - let n = t.operatorCode ?? a(), r = t.fetchImpl ?? fetch, i = t.baseUrl ?? ""; - if (!n) return; - let o = await r(`${i}/auth/token-exchange`, { - method: "POST", - headers: { "content-type": "application/json" }, - body: JSON.stringify({ - grantType: "urn:comtrya:grant:operator-code", - subjectToken: n, - subjectTokenType: "urn:comtrya:token-type:operator-code", - requestedResource: "comtrya://workspace", - requestedActions: [ - "graphql:read", - "graphql:write", - "events:read", - "git:read", - "checks:read" - ] - }) - }); - if (!o.ok) throw Error(`token-exchange failed (${o.status}): ${await o.text()}`); - let s = await o.json(); - if (!s.accessToken) throw Error("token-exchange response missing accessToken"); - let c = (s.expiresIn ?? 1800) * 1e3; - return e = { - token: s.accessToken, - expiresAtMs: Date.now() + c - }, e.token; -} -function a() { - try { - return { - BASE_URL: "/", - DEV: !1, - MODE: "production", - PROD: !0, - SSR: !1 - }?.PUBLIC_COMTRYA_OPERATOR_CODE; - } catch { - return; - } -} -//#endregion -//#region packages/sdk-core/src/runtime.ts -async function o(e, t, i, a, o = {}) { - let l = `${o.baseUrl ?? ""}/api/ops/${encodeURIComponent(e)}/${encodeURIComponent(t)}/${encodeURIComponent(i)}`, u = { "content-type": "application/json" }, d = o.token ?? await n(); - d && (u.authorization = `Bearer ${d}`); - try { - let e = await fetch(l, { - method: "POST", - headers: u, - body: JSON.stringify(a ?? null), - signal: o.signal, - credentials: "include" - }); - e.status === 401 && r(); - let t = await e.text(); - if (!e.ok) { - let n; - try { - n = t ? JSON.parse(t) : void 0; - } catch { - n = void 0; - } - let r = c(e.status), i = typeof n?.message == "string" ? n.message : void 0; - return { - ok: !1, - error: { - code: s(n?.code) ?? r, - message: i ?? (t || e.statusText), - path: n?.path - } - }; - } - return { - ok: !0, - value: t ? JSON.parse(t) : null - }; - } catch (e) { - return { - ok: !1, - error: { - code: "unavailable", - message: e instanceof Error ? e.message : String(e) - } - }; - } -} -function s(e) { - switch (e) { - case "not-found": - case "conflict": - case "forbidden": - case "unauthenticated": - case "bad-input": - case "internal": - case "unavailable": return e; - default: return; - } -} -function c(e) { - switch (e) { - case 400: return "bad-input"; - case 401: return "unauthenticated"; - case 403: return "forbidden"; - case 404: return "not-found"; - case 409: return "conflict"; - case 503: return "unavailable"; - default: return "internal"; - } -} -//#endregion -//#region packages/sdk-core/src/graphql-client.ts -var l = { - endpoint: "/graphql", - credentials: "include", - fetchImpl: typeof fetch < "u" ? fetch.bind(globalThis) : (() => { - throw Error("no fetch implementation available"); - }) -}, u; -function d() { - return u ||= f(l), u; -} -function f(e) { - let t = async (t, i) => { - let a = await n(), o = { "Content-Type": "application/json" }; - a && (o.Authorization = `Bearer ${a}`); - let s = await e.fetchImpl(e.endpoint, { - method: "POST", - credentials: e.credentials, - headers: o, - body: JSON.stringify({ - query: t, - variables: i - }) - }); - s.status === 401 && r(); - let c; - try { - c = await s.json(); - } catch (e) { - throw Error(`GraphQL response was not JSON: ${e instanceof Error ? e.message : String(e)}`); - } - if (!s.ok || c.errors?.length) throw Error(c.errors?.[0]?.message ?? s.statusText ?? "GraphQL request failed"); - if (c.data === void 0) throw Error("GraphQL response did not include data"); - return c.data; - }; - return { - query: t, - mutate: t - }; -} -//#endregion -//#region packages/sdk-core/src/route-registry.ts -function p(e, t = "/") { - if (!e || e.length === 0) throw Error("buildExtensionUrl requires a non-empty routePrefix"); - if (e.includes("/")) throw Error(`routePrefix "${e}" must be a single path segment under /x/`); - let n = t.startsWith("/") ? t : `/${t}`, r = n.length; - for (; r > 1 && n.charCodeAt(r - 1) === 47;) --r; - return `/x/${e}${n === "/" ? "" : n.slice(0, r)}`; -} -//#endregion -//#region packages/sdk-core/src/live-events.ts -function m(e) { - let t = e.baseUrl ?? "", n = new AbortController(); - return h(t, e, n.signal), () => n.abort(); -} -async function h(e, t, n) { - try { - let r = await g(e, n, t.token), i = `${e}/events?session=${encodeURIComponent(r)}`, a = await fetch(i, { - credentials: "include", - headers: _(t.token, { Accept: "text/event-stream" }), - signal: n - }); - if (!a.ok) throw Error(`event stream failed: HTTP ${a.status}`); - await v(a, t, n); - } catch (e) { - if (n.aborted) return; - t.onError?.(e instanceof Error ? e : Error(String(e))); - } -} -async function g(e, t, n) { - let r = await fetch(`${e}/events/session`, { - method: "POST", - credentials: "include", - headers: _(n, { "Content-Type": "application/json" }), - body: "{}", - signal: t - }), i = await r.json(); - if (!r.ok || !i.session) throw Error(i.errors?.[0]?.message ?? "event stream session failed"); - return i.session; -} -function _(e, t) { - return e ? { - ...t, - Authorization: `Bearer ${e}` - } : t; -} -async function v(e, t, n) { - let r = e.body?.getReader(); - if (!r) { - y(await e.text(), t); - return; - } - let i = new TextDecoder(), a = ""; - for (; !n.aborted;) { - let e = await r.read(); - if (e.done) break; - a += i.decode(e.value, { stream: !0 }); - let n = a.split("\n\n"); - a = n.pop() ?? ""; - for (let e of n) ee(e, t); - } - a += i.decode(), y(a, t); -} -function y(e, t) { - for (let n of e.split("\n\n")) ee(n, t); -} -function ee(e, t) { - let n = e.split("\n"), r = n.find((e) => e.startsWith("event: "))?.slice(7), i = n.filter((e) => e.startsWith("data: ")).map((e) => e.slice(6)).join("\n"); - if (i) try { - let e = te(JSON.parse(i), r); - if (t.type && e.eventType !== t.type || t.source && e.emitterExtension !== t.source && e.sourceUri !== t.source) return; - t.onEvent(e); - } catch {} -} -function te(e, t) { - let n = ne(e) ? e : {}, r = ne(n.data) ? n.data : {}, i = b(r.eventType) ?? b(n.type) ?? t ?? ""; - return { - id: b(r.id) ?? b(n.id) ?? "", - eventType: i, - payloadB64: b(r.payloadB64) ?? "", - timestampMs: re(r.timestampMs) ?? ie(re(n.time)) ?? Date.now(), - sourceUri: b(r.sourceUri) ?? b(n.source) ?? "", - emitterExtension: b(r.emitterExtension) ?? b(r.extensionId) ?? b(n.source) ?? "", - raw: e - }; -} -function ne(e) { - return typeof e == "object" && !!e; -} -function b(e) { - return typeof e == "string" ? e : void 0; -} -function re(e) { - return typeof e == "number" && Number.isFinite(e) ? e : void 0; -} -function ie(e) { - return e === void 0 ? void 0 : e * 1e3; -} -//#endregion -//#region node_modules/.bun/tinykeys@3.0.0/node_modules/tinykeys/dist/tinykeys.module.js -var x = [ - "Shift", - "Meta", - "Alt", - "Control" -], ae = typeof navigator == "object" ? navigator.platform : "", oe = /Mac|iPod|iPhone|iPad/.test(ae), se = oe ? "Meta" : "Control", ce = ae === "Win32" ? ["Control", "Alt"] : oe ? ["Alt"] : []; -function S(e, t) { - return typeof e.getModifierState == "function" && (e.getModifierState(t) || ce.includes(t) && e.getModifierState("AltGraph")); -} -function le(e) { - return e.trim().split(" ").map(function(e) { - var t = e.split(/\b\+/), n = t.pop(), r = n.match(/^\((.+)\)$/); - return r && (n = RegExp("^" + r[1] + "$")), [t = t.map(function(e) { - return e === "$mod" ? se : e; - }), n]; - }); -} -function ue(e, t) { - var n = t[0], r = t[1]; - return !((r instanceof RegExp ? !r.test(e.key) && !r.test(e.code) : r.toUpperCase() !== e.key.toUpperCase() && r !== e.code) || n.find(function(t) { - return !S(e, t); - }) || x.find(function(t) { - return !n.includes(t) && r !== t && S(e, t); - })); -} -function de(e, t) { - t === void 0 && (t = {}); - var n = t.timeout ?? 1e3, r = Object.keys(e).map(function(t) { - return [le(t), e[t]]; - }), i = /* @__PURE__ */ new Map(), a = null; - return function(e) { - e instanceof KeyboardEvent && (r.forEach(function(t) { - var n = t[0], r = t[1], a = i.get(n) || n; - ue(e, a[0]) ? a.length > 1 ? i.set(n, a.slice(1)) : (i.delete(n), r(e)) : S(e, e.key) || i.delete(n); - }), a && clearTimeout(a), a = setTimeout(i.clear.bind(i), n)); - }; -} -function fe(e, t, n) { - var r = n === void 0 ? {} : n, i = r.event, a = i === void 0 ? "keydown" : i, o = r.capture, s = de(t, { timeout: r.timeout }); - return e.addEventListener(a, s, o), function() { - e.removeEventListener(a, s, o); - }; -} -//#endregion -//#region packages/sdk-core/src/command-palette.ts -var C = /* @__PURE__ */ new Map(), w = /* @__PURE__ */ new Set(); -function T(e) { - C.set(e.id, e); - for (let e of w) e(); - return () => { - C.delete(e.id); - for (let e of w) e(); - }; -} -//#endregion -//#region packages/sdk-core/src/workspace-store.ts -var pe = null, me = []; -function he() { - return pe; -} -function ge() { - return pe === null ? new Promise((e) => { - me.push(e); - }) : Promise.resolve(pe); -} -//#endregion //#region node_modules/.bun/@vue+shared@3.5.34/node_modules/@vue/shared/dist/shared.esm-bundler.js /* @__NO_SIDE_EFFECTS__ */ -function _e(e) { +function e(e) { let t = /* @__PURE__ */ Object.create(null); for (let n of e.split(",")) t[n] = 1; return (e) => e in t; } -var E = {}, ve = [], ye = () => {}, be = () => !1, xe = (e) => e.charCodeAt(0) === 111 && e.charCodeAt(1) === 110 && (e.charCodeAt(2) > 122 || e.charCodeAt(2) < 97), Se = (e) => e.startsWith("onUpdate:"), D = Object.assign, Ce = (e, t) => { +var t = {}, n = [], r = () => {}, i = () => !1, a = (e) => e.charCodeAt(0) === 111 && e.charCodeAt(1) === 110 && (e.charCodeAt(2) > 122 || e.charCodeAt(2) < 97), o = (e) => e.startsWith("onUpdate:"), s = Object.assign, c = (e, t) => { let n = e.indexOf(t); n > -1 && e.splice(n, 1); -}, we = Object.prototype.hasOwnProperty, O = (e, t) => we.call(e, t), k = Array.isArray, Te = (e) => je(e) === "[object Map]", Ee = (e) => je(e) === "[object Set]", De = (e) => je(e) === "[object Date]", A = (e) => typeof e == "function", j = (e) => typeof e == "string", Oe = (e) => typeof e == "symbol", M = (e) => typeof e == "object" && !!e, ke = (e) => (M(e) || A(e)) && A(e.then) && A(e.catch), Ae = Object.prototype.toString, je = (e) => Ae.call(e), Me = (e) => je(e).slice(8, -1), Ne = (e) => je(e) === "[object Object]", Pe = (e) => j(e) && e !== "NaN" && e[0] !== "-" && "" + parseInt(e, 10) === e, Fe = /* @__PURE__ */ _e(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"), Ie = (e) => { +}, l = Object.prototype.hasOwnProperty, u = (e, t) => l.call(e, t), d = Array.isArray, f = (e) => x(e) === "[object Map]", p = (e) => x(e) === "[object Set]", m = (e) => x(e) === "[object Date]", h = (e) => typeof e == "function", g = (e) => typeof e == "string", _ = (e) => typeof e == "symbol", v = (e) => typeof e == "object" && !!e, y = (e) => (v(e) || h(e)) && h(e.then) && h(e.catch), b = Object.prototype.toString, x = (e) => b.call(e), S = (e) => x(e).slice(8, -1), C = (e) => x(e) === "[object Object]", w = (e) => g(e) && e !== "NaN" && e[0] !== "-" && "" + parseInt(e, 10) === e, ee = /* @__PURE__ */ e(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"), te = (e) => { let t = /* @__PURE__ */ Object.create(null); return ((n) => t[n] || (t[n] = e(n))); -}, Le = /-\w/g, Re = Ie((e) => e.replace(Le, (e) => e.slice(1).toUpperCase())), ze = /\B([A-Z])/g, Be = Ie((e) => e.replace(ze, "-$1").toLowerCase()), Ve = Ie((e) => e.charAt(0).toUpperCase() + e.slice(1)), He = Ie((e) => e ? `on${Ve(e)}` : ""), Ue = (e, t) => !Object.is(e, t), We = (e, ...t) => { +}, ne = /-\w/g, T = te((e) => e.replace(ne, (e) => e.slice(1).toUpperCase())), re = /\B([A-Z])/g, E = te((e) => e.replace(re, "-$1").toLowerCase()), D = te((e) => e.charAt(0).toUpperCase() + e.slice(1)), ie = te((e) => e ? `on${D(e)}` : ""), O = (e, t) => !Object.is(e, t), ae = (e, ...t) => { for (let n = 0; n < e.length; n++) e[n](...t); -}, Ge = (e, t, n, r = !1) => { +}, k = (e, t, n, r = !1) => { Object.defineProperty(e, t, { configurable: !0, enumerable: !1, writable: r, value: n }); -}, Ke = (e) => { +}, oe = (e) => { let t = parseFloat(e); return isNaN(t) ? e : t; -}, qe = (e) => { - let t = j(e) ? Number(e) : NaN; +}, se = (e) => { + let t = g(e) ? Number(e) : NaN; return isNaN(t) ? e : t; -}, Je, Ye = () => Je ||= typeof globalThis < "u" ? globalThis : typeof self < "u" ? self : typeof window < "u" ? window : typeof global < "u" ? global : {}; -function Xe(e) { - if (k(e)) { +}, A, j = () => A ||= typeof globalThis < "u" ? globalThis : typeof self < "u" ? self : typeof window < "u" ? window : typeof global < "u" ? global : {}; +function ce(e) { + if (d(e)) { let t = {}; for (let n = 0; n < e.length; n++) { - let r = e[n], i = j(r) ? et(r) : Xe(r); + let r = e[n], i = g(r) ? fe(r) : ce(r); if (i) for (let e in i) t[e] = i[e]; } return t; - } else if (j(e) || M(e)) return e; + } else if (g(e) || v(e)) return e; } -var Ze = /;(?![^(]*\))/g, Qe = /:([^]+)/, $e = /\/\*[^]*?\*\//g; -function et(e) { +var le = /;(?![^(]*\))/g, ue = /:([^]+)/, de = /\/\*[^]*?\*\//g; +function fe(e) { let t = {}; - return e.replace($e, "").split(Ze).forEach((e) => { + return e.replace(de, "").split(le).forEach((e) => { if (e) { - let n = e.split(Qe); + let n = e.split(ue); n.length > 1 && (t[n[0].trim()] = n[1].trim()); } }), t; } -function tt(e) { +function M(e) { let t = ""; - if (j(e)) t = e; - else if (k(e)) for (let n = 0; n < e.length; n++) { - let r = tt(e[n]); + if (g(e)) t = e; + else if (d(e)) for (let n = 0; n < e.length; n++) { + let r = M(e[n]); r && (t += r + " "); } - else if (M(e)) for (let n in e) e[n] && (t += n + " "); + else if (v(e)) for (let n in e) e[n] && (t += n + " "); return t.trim(); } -var nt = "itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly", rt = /* @__PURE__ */ _e(nt); -nt + ""; -function it(e) { +var pe = "itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly", me = /* @__PURE__ */ e(pe); +pe + ""; +function he(e) { return !!e || e === ""; } -function at(e, t) { +function ge(e, t) { if (e.length !== t.length) return !1; let n = !0; - for (let r = 0; n && r < e.length; r++) n = ot(e[r], t[r]); + for (let r = 0; n && r < e.length; r++) n = _e(e[r], t[r]); return n; } -function ot(e, t) { +function _e(e, t) { if (e === t) return !0; - let n = De(e), r = De(t); + let n = m(e), r = m(t); if (n || r) return n && r ? e.getTime() === t.getTime() : !1; - if (n = Oe(e), r = Oe(t), n || r) return e === t; - if (n = k(e), r = k(t), n || r) return n && r ? at(e, t) : !1; - if (n = M(e), r = M(t), n || r) { + if (n = _(e), r = _(t), n || r) return e === t; + if (n = d(e), r = d(t), n || r) return n && r ? ge(e, t) : !1; + if (n = v(e), r = v(t), n || r) { if (!n || !r || Object.keys(e).length !== Object.keys(t).length) return !1; for (let n in e) { let r = e.hasOwnProperty(n), i = t.hasOwnProperty(n); - if (r && !i || !r && i || !ot(e[n], t[n])) return !1; + if (r && !i || !r && i || !_e(e[n], t[n])) return !1; } } return String(e) === String(t); } -function st(e, t) { - return e.findIndex((e) => ot(e, t)); +function ve(e, t) { + return e.findIndex((e) => _e(e, t)); } -var ct = (e) => !!(e && e.__v_isRef === !0), N = (e) => j(e) ? e : e == null ? "" : k(e) || M(e) && (e.toString === Ae || !A(e.toString)) ? ct(e) ? N(e.value) : JSON.stringify(e, lt, 2) : String(e), lt = (e, t) => ct(t) ? lt(e, t.value) : Te(t) ? { [`Map(${t.size})`]: [...t.entries()].reduce((e, [t, n], r) => (e[ut(t, r) + " =>"] = n, e), {}) } : Ee(t) ? { [`Set(${t.size})`]: [...t.values()].map((e) => ut(e)) } : Oe(t) ? ut(t) : M(t) && !k(t) && !Ne(t) ? String(t) : t, ut = (e, t = "") => Oe(e) ? `Symbol(${e.description ?? t})` : e, P, dt = class { +var ye = (e) => !!(e && e.__v_isRef === !0), N = (e) => g(e) ? e : e == null ? "" : d(e) || v(e) && (e.toString === b || !h(e.toString)) ? ye(e) ? N(e.value) : JSON.stringify(e, be, 2) : String(e), be = (e, t) => ye(t) ? be(e, t.value) : f(t) ? { [`Map(${t.size})`]: [...t.entries()].reduce((e, [t, n], r) => (e[xe(t, r) + " =>"] = n, e), {}) } : p(t) ? { [`Set(${t.size})`]: [...t.values()].map((e) => xe(e)) } : _(t) ? xe(t) : v(t) && !d(t) && !C(t) ? String(t) : t, xe = (e, t = "") => _(e) ? `Symbol(${e.description ?? t})` : e, P, Se = class { constructor(e = !1) { this.detached = e, this._active = !0, this._on = 0, this.effects = [], this.cleanups = [], this._isPaused = !1, this._warnOnRun = !0, this.__v_skip = !0, !e && P && (P.active ? (this.parent = P, this.index = (P.scopes ||= []).push(this) - 1) : (this._active = !1, this._warnOnRun = !1)); } @@ -484,10 +156,10 @@ var ct = (e) => !!(e && e.__v_isRef === !0), N = (e) => j(e) ? e : e == null ? " } } }; -function ft() { +function Ce() { return P; } -var F, pt = /* @__PURE__ */ new WeakSet(), mt = class { +var F, we = /* @__PURE__ */ new WeakSet(), Te = class { constructor(e) { this.fn = e, this.deps = void 0, this.depsTail = void 0, this.flags = 5, this.next = void 0, this.cleanup = void 0, this.scheduler = void 0, P && (P.active ? P.effects.push(this) : this.flags &= -2); } @@ -495,61 +167,61 @@ var F, pt = /* @__PURE__ */ new WeakSet(), mt = class { this.flags |= 64; } resume() { - this.flags & 64 && (this.flags &= -65, pt.has(this) && (pt.delete(this), this.trigger())); + this.flags & 64 && (this.flags &= -65, we.has(this) && (we.delete(this), this.trigger())); } notify() { - this.flags & 2 && !(this.flags & 32) || this.flags & 8 || vt(this); + this.flags & 2 && !(this.flags & 32) || this.flags & 8 || ke(this); } run() { if (!(this.flags & 1)) return this.fn(); - this.flags |= 2, jt(this), xt(this); - let e = F, t = Dt; - F = this, Dt = !0; + this.flags |= 2, He(this), Me(this); + let e = F, t = Re; + F = this, Re = !0; try { return this.fn(); } finally { - St(this), F = e, Dt = t, this.flags &= -3; + Ne(this), F = e, Re = t, this.flags &= -3; } } stop() { if (this.flags & 1) { - for (let e = this.deps; e; e = e.nextDep) Tt(e); - this.deps = this.depsTail = void 0, jt(this), this.onStop && this.onStop(), this.flags &= -2; + for (let e = this.deps; e; e = e.nextDep) Ie(e); + this.deps = this.depsTail = void 0, He(this), this.onStop && this.onStop(), this.flags &= -2; } } trigger() { - this.flags & 64 ? pt.add(this) : this.scheduler ? this.scheduler() : this.runIfDirty(); + this.flags & 64 ? we.add(this) : this.scheduler ? this.scheduler() : this.runIfDirty(); } runIfDirty() { - Ct(this) && this.run(); + Pe(this) && this.run(); } get dirty() { - return Ct(this); + return Pe(this); } -}, ht = 0, gt, _t; -function vt(e, t = !1) { +}, Ee = 0, De, Oe; +function ke(e, t = !1) { if (e.flags |= 8, t) { - e.next = _t, _t = e; + e.next = Oe, Oe = e; return; } - e.next = gt, gt = e; + e.next = De, De = e; } -function yt() { - ht++; +function Ae() { + Ee++; } -function bt() { - if (--ht > 0) return; - if (_t) { - let e = _t; - for (_t = void 0; e;) { +function je() { + if (--Ee > 0) return; + if (Oe) { + let e = Oe; + for (Oe = void 0; e;) { let t = e.next; e.next = void 0, e.flags &= -9, e = t; } } let e; - for (; gt;) { - let t = gt; - for (gt = void 0; t;) { + for (; De;) { + let t = De; + for (De = void 0; t;) { let n = t.next; if (t.next = void 0, t.flags &= -9, t.flags & 1) try { t.trigger(); @@ -561,57 +233,57 @@ function bt() { } if (e) throw e; } -function xt(e) { +function Me(e) { for (let t = e.deps; t; t = t.nextDep) t.version = -1, t.prevActiveLink = t.dep.activeLink, t.dep.activeLink = t; } -function St(e) { +function Ne(e) { let t, n = e.depsTail, r = n; for (; r;) { let e = r.prevDep; - r.version === -1 ? (r === n && (n = e), Tt(r), Et(r)) : t = r, r.dep.activeLink = r.prevActiveLink, r.prevActiveLink = void 0, r = e; + r.version === -1 ? (r === n && (n = e), Ie(r), Le(r)) : t = r, r.dep.activeLink = r.prevActiveLink, r.prevActiveLink = void 0, r = e; } e.deps = t, e.depsTail = n; } -function Ct(e) { - for (let t = e.deps; t; t = t.nextDep) if (t.dep.version !== t.version || t.dep.computed && (wt(t.dep.computed) || t.dep.version !== t.version)) return !0; +function Pe(e) { + for (let t = e.deps; t; t = t.nextDep) if (t.dep.version !== t.version || t.dep.computed && (Fe(t.dep.computed) || t.dep.version !== t.version)) return !0; return !!e._dirty; } -function wt(e) { - if (e.flags & 4 && !(e.flags & 16) || (e.flags &= -17, e.globalVersion === Mt) || (e.globalVersion = Mt, !e.isSSR && e.flags & 128 && (!e.deps && !e._dirty || !Ct(e)))) return; +function Fe(e) { + if (e.flags & 4 && !(e.flags & 16) || (e.flags &= -17, e.globalVersion === Ue) || (e.globalVersion = Ue, !e.isSSR && e.flags & 128 && (!e.deps && !e._dirty || !Pe(e)))) return; e.flags |= 2; - let t = e.dep, n = F, r = Dt; - F = e, Dt = !0; + let t = e.dep, n = F, r = Re; + F = e, Re = !0; try { - xt(e); + Me(e); let n = e.fn(e._value); - (t.version === 0 || Ue(n, e._value)) && (e.flags |= 128, e._value = n, t.version++); + (t.version === 0 || O(n, e._value)) && (e.flags |= 128, e._value = n, t.version++); } catch (e) { throw t.version++, e; } finally { - F = n, Dt = r, St(e), e.flags &= -3; + F = n, Re = r, Ne(e), e.flags &= -3; } } -function Tt(e, t = !1) { +function Ie(e, t = !1) { let { dep: n, prevSub: r, nextSub: i } = e; if (r && (r.nextSub = i, e.prevSub = void 0), i && (i.prevSub = r, e.nextSub = void 0), n.subs === e && (n.subs = r, !r && n.computed)) { n.computed.flags &= -5; - for (let e = n.computed.deps; e; e = e.nextDep) Tt(e, !0); + for (let e = n.computed.deps; e; e = e.nextDep) Ie(e, !0); } !t && !--n.sc && n.map && n.map.delete(n.key); } -function Et(e) { +function Le(e) { let { prevDep: t, nextDep: n } = e; t && (t.nextDep = n, e.prevDep = void 0), n && (n.prevDep = t, e.nextDep = void 0); } -var Dt = !0, Ot = []; -function kt() { - Ot.push(Dt), Dt = !1; +var Re = !0, ze = []; +function Be() { + ze.push(Re), Re = !1; } -function At() { - let e = Ot.pop(); - Dt = e === void 0 ? !0 : e; +function Ve() { + let e = ze.pop(); + Re = e === void 0 ? !0 : e; } -function jt(e) { +function He(e) { let { cleanup: t } = e; if (e.cleanup = void 0, t) { let e = F; @@ -623,18 +295,18 @@ function jt(e) { } } } -var Mt = 0, Nt = class { +var Ue = 0, We = class { constructor(e, t) { this.sub = e, this.dep = t, this.version = t.version, this.nextDep = this.prevDep = this.nextSub = this.prevSub = this.prevActiveLink = void 0; } -}, Pt = class { +}, Ge = class { constructor(e) { this.computed = e, this.version = 0, this.activeLink = void 0, this.subs = void 0, this.map = void 0, this.key = void 0, this.sc = 0, this.__v_skip = !0; } track(e) { - if (!F || !Dt || F === this.computed) return; + if (!F || !Re || F === this.computed) return; let t = this.activeLink; - if (t === void 0 || t.sub !== F) t = this.activeLink = new Nt(F, this), F.deps ? (t.prevDep = F.depsTail, F.depsTail.nextDep = t, F.depsTail = t) : F.deps = F.depsTail = t, Ft(t); + if (t === void 0 || t.sub !== F) t = this.activeLink = new We(F, this), F.deps ? (t.prevDep = F.depsTail, F.depsTail.nextDep = t, F.depsTail = t) : F.deps = F.depsTail = t, Ke(t); else if (t.version === -1 && (t.version = this.version, t.nextDep)) { let e = t.nextDep; e.prevDep = t.prevDep, t.prevDep && (t.prevDep.nextDep = e), t.prevDep = F.depsTail, t.nextDep = void 0, F.depsTail.nextDep = t, F.depsTail = t, F.deps === t && (F.deps = e); @@ -642,213 +314,213 @@ var Mt = 0, Nt = class { return t; } trigger(e) { - this.version++, Mt++, this.notify(e); + this.version++, Ue++, this.notify(e); } notify(e) { - yt(); + Ae(); try { for (let e = this.subs; e; e = e.prevSub) e.sub.notify() && e.sub.dep.notify(); } finally { - bt(); + je(); } } }; -function Ft(e) { +function Ke(e) { if (e.dep.sc++, e.sub.flags & 4) { let t = e.dep.computed; if (t && !e.dep.subs) { t.flags |= 20; - for (let e = t.deps; e; e = e.nextDep) Ft(e); + for (let e = t.deps; e; e = e.nextDep) Ke(e); } let n = e.dep.subs; n !== e && (e.prevSub = n, n && (n.nextSub = e)), e.dep.subs = e; } } -var It = /* @__PURE__ */ new WeakMap(), Lt = /* @__PURE__ */ Symbol(""), Rt = /* @__PURE__ */ Symbol(""), zt = /* @__PURE__ */ Symbol(""); +var qe = /* @__PURE__ */ new WeakMap(), Je = /* @__PURE__ */ Symbol(""), Ye = /* @__PURE__ */ Symbol(""), Xe = /* @__PURE__ */ Symbol(""); function I(e, t, n) { - if (Dt && F) { - let t = It.get(e); - t || It.set(e, t = /* @__PURE__ */ new Map()); + if (Re && F) { + let t = qe.get(e); + t || qe.set(e, t = /* @__PURE__ */ new Map()); let r = t.get(n); - r || (t.set(n, r = new Pt()), r.map = t, r.key = n), r.track(); + r || (t.set(n, r = new Ge()), r.map = t, r.key = n), r.track(); } } -function Bt(e, t, n, r, i, a) { - let o = It.get(e); +function Ze(e, t, n, r, i, a) { + let o = qe.get(e); if (!o) { - Mt++; + Ue++; return; } let s = (e) => { e && e.trigger(); }; - if (yt(), t === "clear") o.forEach(s); + if (Ae(), t === "clear") o.forEach(s); else { - let i = k(e), a = i && Pe(n); + let i = d(e), a = i && w(n); if (i && n === "length") { let e = Number(r); o.forEach((t, n) => { - (n === "length" || n === zt || !Oe(n) && n >= e) && s(t); + (n === "length" || n === Xe || !_(n) && n >= e) && s(t); }); - } else switch ((n !== void 0 || o.has(void 0)) && s(o.get(n)), a && s(o.get(zt)), t) { + } else switch ((n !== void 0 || o.has(void 0)) && s(o.get(n)), a && s(o.get(Xe)), t) { case "add": - i ? a && s(o.get("length")) : (s(o.get(Lt)), Te(e) && s(o.get(Rt))); + i ? a && s(o.get("length")) : (s(o.get(Je)), f(e) && s(o.get(Ye))); break; case "delete": - i || (s(o.get(Lt)), Te(e) && s(o.get(Rt))); + i || (s(o.get(Je)), f(e) && s(o.get(Ye))); break; case "set": - Te(e) && s(o.get(Lt)); + f(e) && s(o.get(Je)); break; } } - bt(); + je(); } -function Vt(e) { +function Qe(e) { let t = /* @__PURE__ */ L(e); - return t === e ? t : (I(t, "iterate", zt), /* @__PURE__ */ On(e) ? t : t.map(jn)); + return t === e ? t : (I(t, "iterate", Xe), /* @__PURE__ */ Rt(e) ? t : t.map(Vt)); } -function Ht(e) { - return I(e = /* @__PURE__ */ L(e), "iterate", zt), e; +function $e(e) { + return I(e = /* @__PURE__ */ L(e), "iterate", Xe), e; } -function Ut(e, t) { - return /* @__PURE__ */ Dn(e) ? Mn(/* @__PURE__ */ En(e) ? jn(t) : t) : jn(t); +function et(e, t) { + return /* @__PURE__ */ Lt(e) ? Ht(/* @__PURE__ */ It(e) ? Vt(t) : t) : Vt(t); } -var Wt = { +var tt = { __proto__: null, [Symbol.iterator]() { - return Gt(this, Symbol.iterator, (e) => Ut(this, e)); + return nt(this, Symbol.iterator, (e) => et(this, e)); }, concat(...e) { - return Vt(this).concat(...e.map((e) => k(e) ? Vt(e) : e)); + return Qe(this).concat(...e.map((e) => d(e) ? Qe(e) : e)); }, entries() { - return Gt(this, "entries", (e) => (e[1] = Ut(this, e[1]), e)); + return nt(this, "entries", (e) => (e[1] = et(this, e[1]), e)); }, every(e, t) { - return qt(this, "every", e, t, void 0, arguments); + return it(this, "every", e, t, void 0, arguments); }, filter(e, t) { - return qt(this, "filter", e, t, (e) => e.map((e) => Ut(this, e)), arguments); + return it(this, "filter", e, t, (e) => e.map((e) => et(this, e)), arguments); }, find(e, t) { - return qt(this, "find", e, t, (e) => Ut(this, e), arguments); + return it(this, "find", e, t, (e) => et(this, e), arguments); }, findIndex(e, t) { - return qt(this, "findIndex", e, t, void 0, arguments); + return it(this, "findIndex", e, t, void 0, arguments); }, findLast(e, t) { - return qt(this, "findLast", e, t, (e) => Ut(this, e), arguments); + return it(this, "findLast", e, t, (e) => et(this, e), arguments); }, findLastIndex(e, t) { - return qt(this, "findLastIndex", e, t, void 0, arguments); + return it(this, "findLastIndex", e, t, void 0, arguments); }, forEach(e, t) { - return qt(this, "forEach", e, t, void 0, arguments); + return it(this, "forEach", e, t, void 0, arguments); }, includes(...e) { - return Yt(this, "includes", e); + return ot(this, "includes", e); }, indexOf(...e) { - return Yt(this, "indexOf", e); + return ot(this, "indexOf", e); }, join(e) { - return Vt(this).join(e); + return Qe(this).join(e); }, lastIndexOf(...e) { - return Yt(this, "lastIndexOf", e); + return ot(this, "lastIndexOf", e); }, map(e, t) { - return qt(this, "map", e, t, void 0, arguments); + return it(this, "map", e, t, void 0, arguments); }, pop() { - return Xt(this, "pop"); + return st(this, "pop"); }, push(...e) { - return Xt(this, "push", e); + return st(this, "push", e); }, reduce(e, ...t) { - return Jt(this, "reduce", e, t); + return at(this, "reduce", e, t); }, reduceRight(e, ...t) { - return Jt(this, "reduceRight", e, t); + return at(this, "reduceRight", e, t); }, shift() { - return Xt(this, "shift"); + return st(this, "shift"); }, some(e, t) { - return qt(this, "some", e, t, void 0, arguments); + return it(this, "some", e, t, void 0, arguments); }, splice(...e) { - return Xt(this, "splice", e); + return st(this, "splice", e); }, toReversed() { - return Vt(this).toReversed(); + return Qe(this).toReversed(); }, toSorted(e) { - return Vt(this).toSorted(e); + return Qe(this).toSorted(e); }, toSpliced(...e) { - return Vt(this).toSpliced(...e); + return Qe(this).toSpliced(...e); }, unshift(...e) { - return Xt(this, "unshift", e); + return st(this, "unshift", e); }, values() { - return Gt(this, "values", (e) => Ut(this, e)); + return nt(this, "values", (e) => et(this, e)); } }; -function Gt(e, t, n) { - let r = Ht(e), i = r[t](); - return r !== e && !/* @__PURE__ */ On(e) && (i._next = i.next, i.next = () => { +function nt(e, t, n) { + let r = $e(e), i = r[t](); + return r !== e && !/* @__PURE__ */ Rt(e) && (i._next = i.next, i.next = () => { let e = i._next(); return e.done || (e.value = n(e.value)), e; }), i; } -var Kt = Array.prototype; -function qt(e, t, n, r, i, a) { - let o = Ht(e), s = o !== e && !/* @__PURE__ */ On(e), c = o[t]; - if (c !== Kt[t]) { +var rt = Array.prototype; +function it(e, t, n, r, i, a) { + let o = $e(e), s = o !== e && !/* @__PURE__ */ Rt(e), c = o[t]; + if (c !== rt[t]) { let t = c.apply(e, a); - return s ? jn(t) : t; + return s ? Vt(t) : t; } let l = n; o !== e && (s ? l = function(t, r) { - return n.call(this, Ut(e, t), r, e); + return n.call(this, et(e, t), r, e); } : n.length > 2 && (l = function(t, r) { return n.call(this, t, r, e); })); let u = c.call(o, l, r); return s && i ? i(u) : u; } -function Jt(e, t, n, r) { - let i = Ht(e), a = i !== e && !/* @__PURE__ */ On(e), o = n, s = !1; +function at(e, t, n, r) { + let i = $e(e), a = i !== e && !/* @__PURE__ */ Rt(e), o = n, s = !1; i !== e && (a ? (s = r.length === 0, o = function(t, r, i) { - return s && (s = !1, t = Ut(e, t)), n.call(this, t, Ut(e, r), i, e); + return s && (s = !1, t = et(e, t)), n.call(this, t, et(e, r), i, e); }) : n.length > 3 && (o = function(t, r, i) { return n.call(this, t, r, i, e); })); let c = i[t](o, ...r); - return s ? Ut(e, c) : c; + return s ? et(e, c) : c; } -function Yt(e, t, n) { +function ot(e, t, n) { let r = /* @__PURE__ */ L(e); - I(r, "iterate", zt); + I(r, "iterate", Xe); let i = r[t](...n); - return (i === -1 || i === !1) && /* @__PURE__ */ kn(n[0]) ? (n[0] = /* @__PURE__ */ L(n[0]), r[t](...n)) : i; + return (i === -1 || i === !1) && /* @__PURE__ */ zt(n[0]) ? (n[0] = /* @__PURE__ */ L(n[0]), r[t](...n)) : i; } -function Xt(e, t, n = []) { - kt(), yt(); +function st(e, t, n = []) { + Be(), Ae(); let r = (/* @__PURE__ */ L(e))[t].apply(e, n); - return bt(), At(), r; + return je(), Ve(), r; } -var Zt = /* @__PURE__ */ _e("__proto__,__v_isRef,__isVue"), Qt = new Set(/* @__PURE__ */ Object.getOwnPropertyNames(Symbol).filter((e) => e !== "arguments" && e !== "caller").map((e) => Symbol[e]).filter(Oe)); -function $t(e) { - Oe(e) || (e = String(e)); +var ct = /* @__PURE__ */ e("__proto__,__v_isRef,__isVue"), lt = new Set(/* @__PURE__ */ Object.getOwnPropertyNames(Symbol).filter((e) => e !== "arguments" && e !== "caller").map((e) => Symbol[e]).filter(_)); +function ut(e) { + _(e) || (e = String(e)); let t = /* @__PURE__ */ L(this); return I(t, "has", e), t.hasOwnProperty(e); } -var en = class { +var dt = class { constructor(e = !1, t = !1) { this._isReadonly = e, this._isShallow = t; } @@ -858,46 +530,46 @@ var en = class { if (t === "__v_isReactive") return !r; if (t === "__v_isReadonly") return r; if (t === "__v_isShallow") return i; - if (t === "__v_raw") return n === (r ? i ? yn : vn : i ? _n : gn).get(e) || Object.getPrototypeOf(e) === Object.getPrototypeOf(n) ? e : void 0; - let a = k(e); + if (t === "__v_raw") return n === (r ? i ? kt : Ot : i ? Dt : Et).get(e) || Object.getPrototypeOf(e) === Object.getPrototypeOf(n) ? e : void 0; + let a = d(e); if (!r) { let e; - if (a && (e = Wt[t])) return e; - if (t === "hasOwnProperty") return $t; + if (a && (e = tt[t])) return e; + if (t === "hasOwnProperty") return ut; } let o = Reflect.get(e, t, /* @__PURE__ */ R(e) ? e : n); - if ((Oe(t) ? Qt.has(t) : Zt(t)) || (r || I(e, "get", t), i)) return o; + if ((_(t) ? lt.has(t) : ct(t)) || (r || I(e, "get", t), i)) return o; if (/* @__PURE__ */ R(o)) { - let e = a && Pe(t) ? o : o.value; - return r && M(e) ? /* @__PURE__ */ wn(e) : e; + let e = a && w(t) ? o : o.value; + return r && v(e) ? /* @__PURE__ */ Pt(e) : e; } - return M(o) ? r ? /* @__PURE__ */ wn(o) : /* @__PURE__ */ Sn(o) : o; + return v(o) ? r ? /* @__PURE__ */ Pt(o) : /* @__PURE__ */ Mt(o) : o; } -}, tn = class extends en { +}, ft = class extends dt { constructor(e = !1) { super(!1, e); } set(e, t, n, r) { - let i = e[t], a = k(e) && Pe(t); + let i = e[t], a = d(e) && w(t); if (!this._isShallow) { - let e = /* @__PURE__ */ Dn(i); - if (!/* @__PURE__ */ On(n) && !/* @__PURE__ */ Dn(n) && (i = /* @__PURE__ */ L(i), n = /* @__PURE__ */ L(n)), !a && /* @__PURE__ */ R(i) && !/* @__PURE__ */ R(n)) return e || (i.value = n), !0; + let e = /* @__PURE__ */ Lt(i); + if (!/* @__PURE__ */ Rt(n) && !/* @__PURE__ */ Lt(n) && (i = /* @__PURE__ */ L(i), n = /* @__PURE__ */ L(n)), !a && /* @__PURE__ */ R(i) && !/* @__PURE__ */ R(n)) return e || (i.value = n), !0; } - let o = a ? Number(t) < e.length : O(e, t), s = Reflect.set(e, t, n, /* @__PURE__ */ R(e) ? e : r); - return e === /* @__PURE__ */ L(r) && (o ? Ue(n, i) && Bt(e, "set", t, n, i) : Bt(e, "add", t, n)), s; + let o = a ? Number(t) < e.length : u(e, t), s = Reflect.set(e, t, n, /* @__PURE__ */ R(e) ? e : r); + return e === /* @__PURE__ */ L(r) && (o ? O(n, i) && Ze(e, "set", t, n, i) : Ze(e, "add", t, n)), s; } deleteProperty(e, t) { - let n = O(e, t), r = e[t], i = Reflect.deleteProperty(e, t); - return i && n && Bt(e, "delete", t, void 0, r), i; + let n = u(e, t), r = e[t], i = Reflect.deleteProperty(e, t); + return i && n && Ze(e, "delete", t, void 0, r), i; } has(e, t) { let n = Reflect.has(e, t); - return (!Oe(t) || !Qt.has(t)) && I(e, "has", t), n; + return (!_(t) || !lt.has(t)) && I(e, "has", t), n; } ownKeys(e) { - return I(e, "iterate", k(e) ? "length" : Lt), Reflect.ownKeys(e); + return I(e, "iterate", d(e) ? "length" : Je), Reflect.ownKeys(e); } -}, nn = class extends en { +}, pt = class extends dt { constructor(e = !1) { super(!0, e); } @@ -907,76 +579,76 @@ var en = class { deleteProperty(e, t) { return !0; } -}, rn = /* @__PURE__ */ new tn(), an = /* @__PURE__ */ new nn(), on = /* @__PURE__ */ new tn(!0), sn = (e) => e, cn = (e) => Reflect.getPrototypeOf(e); -function ln(e, t, n) { +}, mt = /* @__PURE__ */ new ft(), ht = /* @__PURE__ */ new pt(), gt = /* @__PURE__ */ new ft(!0), _t = (e) => e, vt = (e) => Reflect.getPrototypeOf(e); +function yt(e, t, n) { return function(...r) { - let i = this.__v_raw, a = /* @__PURE__ */ L(i), o = Te(a), s = e === "entries" || e === Symbol.iterator && o, c = e === "keys" && o, l = i[e](...r), u = n ? sn : t ? Mn : jn; - return !t && I(a, "iterate", c ? Rt : Lt), D(Object.create(l), { next() { - let { value: e, done: t } = l.next(); + let i = this.__v_raw, a = /* @__PURE__ */ L(i), o = f(a), c = e === "entries" || e === Symbol.iterator && o, l = e === "keys" && o, u = i[e](...r), d = n ? _t : t ? Ht : Vt; + return !t && I(a, "iterate", l ? Ye : Je), s(Object.create(u), { next() { + let { value: e, done: t } = u.next(); return t ? { value: e, done: t } : { - value: s ? [u(e[0]), u(e[1])] : u(e), + value: c ? [d(e[0]), d(e[1])] : d(e), done: t }; } }); }; } -function un(e) { +function bt(e) { return function(...t) { return e === "delete" ? !1 : e === "clear" ? void 0 : this; }; } -function dn(e, t) { +function xt(e, t) { let n = { get(n) { let r = this.__v_raw, i = /* @__PURE__ */ L(r), a = /* @__PURE__ */ L(n); - e || (Ue(n, a) && I(i, "get", n), I(i, "get", a)); - let { has: o } = cn(i), s = t ? sn : e ? Mn : jn; + e || (O(n, a) && I(i, "get", n), I(i, "get", a)); + let { has: o } = vt(i), s = t ? _t : e ? Ht : Vt; if (o.call(i, n)) return s(r.get(n)); if (o.call(i, a)) return s(r.get(a)); r !== i && r.get(n); }, get size() { let t = this.__v_raw; - return !e && I(/* @__PURE__ */ L(t), "iterate", Lt), t.size; + return !e && I(/* @__PURE__ */ L(t), "iterate", Je), t.size; }, has(t) { let n = this.__v_raw, r = /* @__PURE__ */ L(n), i = /* @__PURE__ */ L(t); - return e || (Ue(t, i) && I(r, "has", t), I(r, "has", i)), t === i ? n.has(t) : n.has(t) || n.has(i); + return e || (O(t, i) && I(r, "has", t), I(r, "has", i)), t === i ? n.has(t) : n.has(t) || n.has(i); }, forEach(n, r) { - let i = this, a = i.__v_raw, o = /* @__PURE__ */ L(a), s = t ? sn : e ? Mn : jn; - return !e && I(o, "iterate", Lt), a.forEach((e, t) => n.call(r, s(e), s(t), i)); + let i = this, a = i.__v_raw, o = /* @__PURE__ */ L(a), s = t ? _t : e ? Ht : Vt; + return !e && I(o, "iterate", Je), a.forEach((e, t) => n.call(r, s(e), s(t), i)); } }; - return D(n, e ? { - add: un("add"), - set: un("set"), - delete: un("delete"), - clear: un("clear") + return s(n, e ? { + add: bt("add"), + set: bt("set"), + delete: bt("delete"), + clear: bt("clear") } : { add(e) { - let n = /* @__PURE__ */ L(this), r = cn(n), i = /* @__PURE__ */ L(e), a = !t && !/* @__PURE__ */ On(e) && !/* @__PURE__ */ Dn(e) ? i : e; - return r.has.call(n, a) || Ue(e, a) && r.has.call(n, e) || Ue(i, a) && r.has.call(n, i) || (n.add(a), Bt(n, "add", a, a)), this; + let n = /* @__PURE__ */ L(this), r = vt(n), i = /* @__PURE__ */ L(e), a = !t && !/* @__PURE__ */ Rt(e) && !/* @__PURE__ */ Lt(e) ? i : e; + return r.has.call(n, a) || O(e, a) && r.has.call(n, e) || O(i, a) && r.has.call(n, i) || (n.add(a), Ze(n, "add", a, a)), this; }, set(e, n) { - !t && !/* @__PURE__ */ On(n) && !/* @__PURE__ */ Dn(n) && (n = /* @__PURE__ */ L(n)); - let r = /* @__PURE__ */ L(this), { has: i, get: a } = cn(r), o = i.call(r, e); + !t && !/* @__PURE__ */ Rt(n) && !/* @__PURE__ */ Lt(n) && (n = /* @__PURE__ */ L(n)); + let r = /* @__PURE__ */ L(this), { has: i, get: a } = vt(r), o = i.call(r, e); o ||= (e = /* @__PURE__ */ L(e), i.call(r, e)); let s = a.call(r, e); - return r.set(e, n), o ? Ue(n, s) && Bt(r, "set", e, n, s) : Bt(r, "add", e, n), this; + return r.set(e, n), o ? O(n, s) && Ze(r, "set", e, n, s) : Ze(r, "add", e, n), this; }, delete(e) { - let t = /* @__PURE__ */ L(this), { has: n, get: r } = cn(t), i = n.call(t, e); + let t = /* @__PURE__ */ L(this), { has: n, get: r } = vt(t), i = n.call(t, e); i ||= (e = /* @__PURE__ */ L(e), n.call(t, e)); let a = r ? r.call(t, e) : void 0, o = t.delete(e); - return i && Bt(t, "delete", e, void 0, a), o; + return i && Ze(t, "delete", e, void 0, a), o; }, clear() { let e = /* @__PURE__ */ L(this), t = e.size !== 0, n = e.clear(); - return t && Bt(e, "clear", void 0, void 0, void 0), n; + return t && Ze(e, "clear", void 0, void 0, void 0), n; } }), [ "keys", @@ -984,15 +656,15 @@ function dn(e, t) { "entries", Symbol.iterator ].forEach((r) => { - n[r] = ln(r, e, t); + n[r] = yt(r, e, t); }), n; } -function fn(e, t) { - let n = dn(e, t); - return (t, r, i) => r === "__v_isReactive" ? !e : r === "__v_isReadonly" ? e : r === "__v_raw" ? t : Reflect.get(O(n, r) && r in t ? n : t, r, i); +function St(e, t) { + let n = xt(e, t); + return (t, r, i) => r === "__v_isReactive" ? !e : r === "__v_isReadonly" ? e : r === "__v_raw" ? t : Reflect.get(u(n, r) && r in t ? n : t, r, i); } -var pn = { get: /* @__PURE__ */ fn(!1, !1) }, mn = { get: /* @__PURE__ */ fn(!1, !0) }, hn = { get: /* @__PURE__ */ fn(!0, !1) }, gn = /* @__PURE__ */ new WeakMap(), _n = /* @__PURE__ */ new WeakMap(), vn = /* @__PURE__ */ new WeakMap(), yn = /* @__PURE__ */ new WeakMap(); -function bn(e) { +var Ct = { get: /* @__PURE__ */ St(!1, !1) }, wt = { get: /* @__PURE__ */ St(!1, !0) }, Tt = { get: /* @__PURE__ */ St(!0, !1) }, Et = /* @__PURE__ */ new WeakMap(), Dt = /* @__PURE__ */ new WeakMap(), Ot = /* @__PURE__ */ new WeakMap(), kt = /* @__PURE__ */ new WeakMap(); +function At(e) { switch (e) { case "Object": case "Array": return 1; @@ -1003,24 +675,24 @@ function bn(e) { default: return 0; } } -function xn(e) { - return e.__v_skip || !Object.isExtensible(e) ? 0 : bn(Me(e)); +function jt(e) { + return e.__v_skip || !Object.isExtensible(e) ? 0 : At(S(e)); } /* @__NO_SIDE_EFFECTS__ */ -function Sn(e) { - return /* @__PURE__ */ Dn(e) ? e : Tn(e, !1, rn, pn, gn); +function Mt(e) { + return /* @__PURE__ */ Lt(e) ? e : Ft(e, !1, mt, Ct, Et); } /* @__NO_SIDE_EFFECTS__ */ -function Cn(e) { - return Tn(e, !1, on, mn, _n); +function Nt(e) { + return Ft(e, !1, gt, wt, Dt); } /* @__NO_SIDE_EFFECTS__ */ -function wn(e) { - return Tn(e, !0, an, hn, vn); +function Pt(e) { + return Ft(e, !0, ht, Tt, Ot); } -function Tn(e, t, n, r, i) { - if (!M(e) || e.__v_raw && !(t && e.__v_isReactive)) return e; - let a = xn(e); +function Ft(e, t, n, r, i) { + if (!v(e) || e.__v_raw && !(t && e.__v_isReactive)) return e; + let a = jt(e); if (a === 0) return e; let o = i.get(e); if (o) return o; @@ -1028,19 +700,19 @@ function Tn(e, t, n, r, i) { return i.set(e, s), s; } /* @__NO_SIDE_EFFECTS__ */ -function En(e) { - return /* @__PURE__ */ Dn(e) ? /* @__PURE__ */ En(e.__v_raw) : !!(e && e.__v_isReactive); +function It(e) { + return /* @__PURE__ */ Lt(e) ? /* @__PURE__ */ It(e.__v_raw) : !!(e && e.__v_isReactive); } /* @__NO_SIDE_EFFECTS__ */ -function Dn(e) { +function Lt(e) { return !!(e && e.__v_isReadonly); } /* @__NO_SIDE_EFFECTS__ */ -function On(e) { +function Rt(e) { return !!(e && e.__v_isShallow); } /* @__NO_SIDE_EFFECTS__ */ -function kn(e) { +function zt(e) { return e ? !!e.__v_raw : !1; } /* @__NO_SIDE_EFFECTS__ */ @@ -1048,362 +720,362 @@ function L(e) { let t = e && e.__v_raw; return t ? /* @__PURE__ */ L(t) : e; } -function An(e) { - return !O(e, "__v_skip") && Object.isExtensible(e) && Ge(e, "__v_skip", !0), e; +function Bt(e) { + return !u(e, "__v_skip") && Object.isExtensible(e) && k(e, "__v_skip", !0), e; } -var jn = (e) => M(e) ? /* @__PURE__ */ Sn(e) : e, Mn = (e) => M(e) ? /* @__PURE__ */ wn(e) : e; +var Vt = (e) => v(e) ? /* @__PURE__ */ Mt(e) : e, Ht = (e) => v(e) ? /* @__PURE__ */ Pt(e) : e; /* @__NO_SIDE_EFFECTS__ */ function R(e) { return e ? e.__v_isRef === !0 : !1; } /* @__NO_SIDE_EFFECTS__ */ function z(e) { - return Nn(e, !1); + return Ut(e, !1); } -function Nn(e, t) { - return /* @__PURE__ */ R(e) ? e : new Pn(e, t); +function Ut(e, t) { + return /* @__PURE__ */ R(e) ? e : new Wt(e, t); } -var Pn = class { +var Wt = class { constructor(e, t) { - this.dep = new Pt(), this.__v_isRef = !0, this.__v_isShallow = !1, this._rawValue = t ? e : /* @__PURE__ */ L(e), this._value = t ? e : jn(e), this.__v_isShallow = t; + this.dep = new Ge(), this.__v_isRef = !0, this.__v_isShallow = !1, this._rawValue = t ? e : /* @__PURE__ */ L(e), this._value = t ? e : Vt(e), this.__v_isShallow = t; } get value() { return this.dep.track(), this._value; } set value(e) { - let t = this._rawValue, n = this.__v_isShallow || /* @__PURE__ */ On(e) || /* @__PURE__ */ Dn(e); - e = n ? e : /* @__PURE__ */ L(e), Ue(e, t) && (this._rawValue = e, this._value = n ? e : jn(e), this.dep.trigger()); + let t = this._rawValue, n = this.__v_isShallow || /* @__PURE__ */ Rt(e) || /* @__PURE__ */ Lt(e); + e = n ? e : /* @__PURE__ */ L(e), O(e, t) && (this._rawValue = e, this._value = n ? e : Vt(e), this.dep.trigger()); } }; function B(e) { return /* @__PURE__ */ R(e) ? e.value : e; } -var Fn = { +var Gt = { get: (e, t, n) => t === "__v_raw" ? e : B(Reflect.get(e, t, n)), set: (e, t, n, r) => { let i = e[t]; return /* @__PURE__ */ R(i) && !/* @__PURE__ */ R(n) ? (i.value = n, !0) : Reflect.set(e, t, n, r); } }; -function In(e) { - return /* @__PURE__ */ En(e) ? e : new Proxy(e, Fn); +function Kt(e) { + return /* @__PURE__ */ It(e) ? e : new Proxy(e, Gt); } -var Ln = class { +var qt = class { constructor(e, t, n) { - this.fn = e, this.setter = t, this._value = void 0, this.dep = new Pt(this), this.__v_isRef = !0, this.deps = void 0, this.depsTail = void 0, this.flags = 16, this.globalVersion = Mt - 1, this.next = void 0, this.effect = this, this.__v_isReadonly = !t, this.isSSR = n; + this.fn = e, this.setter = t, this._value = void 0, this.dep = new Ge(this), this.__v_isRef = !0, this.deps = void 0, this.depsTail = void 0, this.flags = 16, this.globalVersion = Ue - 1, this.next = void 0, this.effect = this, this.__v_isReadonly = !t, this.isSSR = n; } notify() { - if (this.flags |= 16, !(this.flags & 8) && F !== this) return vt(this, !0), !0; + if (this.flags |= 16, !(this.flags & 8) && F !== this) return ke(this, !0), !0; } get value() { let e = this.dep.track(); - return wt(this), e && (e.version = this.dep.version), this._value; + return Fe(this), e && (e.version = this.dep.version), this._value; } set value(e) { this.setter && this.setter(e); } }; /* @__NO_SIDE_EFFECTS__ */ -function Rn(e, t, n = !1) { +function Jt(e, t, n = !1) { let r, i; - return A(e) ? r = e : (r = e.get, i = e.set), new Ln(r, i, n); + return h(e) ? r = e : (r = e.get, i = e.set), new qt(r, i, n); } -var zn = {}, Bn = /* @__PURE__ */ new WeakMap(), Vn = void 0; -function Hn(e, t = !1, n = Vn) { +var Yt = {}, Xt = /* @__PURE__ */ new WeakMap(), Zt = void 0; +function Qt(e, t = !1, n = Zt) { if (n) { - let t = Bn.get(n); - t || Bn.set(n, t = []), t.push(e); + let t = Xt.get(n); + t || Xt.set(n, t = []), t.push(e); } } -function Un(e, t, n = E) { - let { immediate: r, deep: i, once: a, scheduler: o, augmentJob: s, call: c } = n, l = (e) => i ? e : /* @__PURE__ */ On(e) || i === !1 || i === 0 ? Wn(e, 1) : Wn(e), u, d, f, p, m = !1, h = !1; - if (/* @__PURE__ */ R(e) ? (d = () => e.value, m = /* @__PURE__ */ On(e)) : /* @__PURE__ */ En(e) ? (d = () => l(e), m = !0) : k(e) ? (h = !0, m = e.some((e) => /* @__PURE__ */ En(e) || /* @__PURE__ */ On(e)), d = () => e.map((e) => { +function $t(e, n, i = t) { + let { immediate: a, deep: o, once: s, scheduler: l, augmentJob: u, call: f } = i, p = (e) => o ? e : /* @__PURE__ */ Rt(e) || o === !1 || o === 0 ? en(e, 1) : en(e), m, g, _, v, y = !1, b = !1; + if (/* @__PURE__ */ R(e) ? (g = () => e.value, y = /* @__PURE__ */ Rt(e)) : /* @__PURE__ */ It(e) ? (g = () => p(e), y = !0) : d(e) ? (b = !0, y = e.some((e) => /* @__PURE__ */ It(e) || /* @__PURE__ */ Rt(e)), g = () => e.map((e) => { if (/* @__PURE__ */ R(e)) return e.value; - if (/* @__PURE__ */ En(e)) return l(e); - if (A(e)) return c ? c(e, 2) : e(); - })) : d = A(e) ? t ? c ? () => c(e, 2) : e : () => { - if (f) { - kt(); + if (/* @__PURE__ */ It(e)) return p(e); + if (h(e)) return f ? f(e, 2) : e(); + })) : g = h(e) ? n ? f ? () => f(e, 2) : e : () => { + if (_) { + Be(); try { - f(); + _(); } finally { - At(); + Ve(); } } - let t = Vn; - Vn = u; + let t = Zt; + Zt = m; try { - return c ? c(e, 3, [p]) : e(p); + return f ? f(e, 3, [v]) : e(v); } finally { - Vn = t; + Zt = t; } - } : ye, t && i) { - let e = d, t = i === !0 ? Infinity : i; - d = () => Wn(e(), t); + } : r, n && o) { + let e = g, t = o === !0 ? Infinity : o; + g = () => en(e(), t); } - let g = ft(), _ = () => { - u.stop(), g && g.active && Ce(g.effects, u); + let x = Ce(), S = () => { + m.stop(), x && x.active && c(x.effects, m); }; - if (a && t) { - let e = t; - t = (...t) => { - e(...t), _(); + if (s && n) { + let e = n; + n = (...t) => { + e(...t), S(); }; } - let v = h ? Array(e.length).fill(zn) : zn, y = (e) => { - if (!(!(u.flags & 1) || !u.dirty && !e)) if (t) { - let e = u.run(); - if (i || m || (h ? e.some((e, t) => Ue(e, v[t])) : Ue(e, v))) { - f && f(); - let n = Vn; - Vn = u; + let C = b ? Array(e.length).fill(Yt) : Yt, w = (e) => { + if (!(!(m.flags & 1) || !m.dirty && !e)) if (n) { + let e = m.run(); + if (o || y || (b ? e.some((e, t) => O(e, C[t])) : O(e, C))) { + _ && _(); + let t = Zt; + Zt = m; try { - let n = [ + let t = [ e, - v === zn ? void 0 : h && v[0] === zn ? [] : v, - p + C === Yt ? void 0 : b && C[0] === Yt ? [] : C, + v ]; - v = e, c ? c(t, 3, n) : t(...n); + C = e, f ? f(n, 3, t) : n(...t); } finally { - Vn = n; + Zt = t; } } - } else u.run(); + } else m.run(); }; - return s && s(y), u = new mt(d), u.scheduler = o ? () => o(y, !1) : y, p = (e) => Hn(e, !1, u), f = u.onStop = () => { - let e = Bn.get(u); + return u && u(w), m = new Te(g), m.scheduler = l ? () => l(w, !1) : w, v = (e) => Qt(e, !1, m), _ = m.onStop = () => { + let e = Xt.get(m); if (e) { - if (c) c(e, 4); + if (f) f(e, 4); else for (let t of e) t(); - Bn.delete(u); + Xt.delete(m); } - }, t ? r ? y(!0) : v = u.run() : o ? o(y.bind(null, !0), !0) : u.run(), _.pause = u.pause.bind(u), _.resume = u.resume.bind(u), _.stop = _, _; + }, n ? a ? w(!0) : C = m.run() : l ? l(w.bind(null, !0), !0) : m.run(), S.pause = m.pause.bind(m), S.resume = m.resume.bind(m), S.stop = S, S; } -function Wn(e, t = Infinity, n) { - if (t <= 0 || !M(e) || e.__v_skip || (n ||= /* @__PURE__ */ new Map(), (n.get(e) || 0) >= t)) return e; - if (n.set(e, t), t--, /* @__PURE__ */ R(e)) Wn(e.value, t, n); - else if (k(e)) for (let r = 0; r < e.length; r++) Wn(e[r], t, n); - else if (Ee(e) || Te(e)) e.forEach((e) => { - Wn(e, t, n); +function en(e, t = Infinity, n) { + if (t <= 0 || !v(e) || e.__v_skip || (n ||= /* @__PURE__ */ new Map(), (n.get(e) || 0) >= t)) return e; + if (n.set(e, t), t--, /* @__PURE__ */ R(e)) en(e.value, t, n); + else if (d(e)) for (let r = 0; r < e.length; r++) en(e[r], t, n); + else if (p(e) || f(e)) e.forEach((e) => { + en(e, t, n); }); - else if (Ne(e)) { - for (let r in e) Wn(e[r], t, n); - for (let r of Object.getOwnPropertySymbols(e)) Object.prototype.propertyIsEnumerable.call(e, r) && Wn(e[r], t, n); + else if (C(e)) { + for (let r in e) en(e[r], t, n); + for (let r of Object.getOwnPropertySymbols(e)) Object.prototype.propertyIsEnumerable.call(e, r) && en(e[r], t, n); } return e; } //#endregion //#region node_modules/.bun/@vue+runtime-core@3.5.34/node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js -function Gn(e, t, n, r) { +function tn(e, t, n, r) { try { return r ? e(...r) : e(); } catch (e) { - qn(e, t, n); + rn(e, t, n); } } -function Kn(e, t, n, r) { - if (A(e)) { - let i = Gn(e, t, n, r); - return i && ke(i) && i.catch((e) => { - qn(e, t, n); +function nn(e, t, n, r) { + if (h(e)) { + let i = tn(e, t, n, r); + return i && y(i) && i.catch((e) => { + rn(e, t, n); }), i; } - if (k(e)) { + if (d(e)) { let i = []; - for (let a = 0; a < e.length; a++) i.push(Kn(e[a], t, n, r)); + for (let a = 0; a < e.length; a++) i.push(nn(e[a], t, n, r)); return i; } } -function qn(e, t, n, r = !0) { - let i = t ? t.vnode : null, { errorHandler: a, throwUnhandledErrorInProduction: o } = t && t.appContext.config || E; - if (t) { - let r = t.parent, i = t.proxy, o = `https://vuejs.org/error-reference/#runtime-${n}`; - for (; r;) { - let t = r.ec; - if (t) { - for (let n = 0; n < t.length; n++) if (t[n](e, i, o) === !1) return; +function rn(e, n, r, i = !0) { + let a = n ? n.vnode : null, { errorHandler: o, throwUnhandledErrorInProduction: s } = n && n.appContext.config || t; + if (n) { + let t = n.parent, i = n.proxy, a = `https://vuejs.org/error-reference/#runtime-${r}`; + for (; t;) { + let n = t.ec; + if (n) { + for (let t = 0; t < n.length; t++) if (n[t](e, i, a) === !1) return; } - r = r.parent; + t = t.parent; } - if (a) { - kt(), Gn(a, null, 10, [ + if (o) { + Be(), tn(o, null, 10, [ e, i, - o - ]), At(); + a + ]), Ve(); return; } } - Jn(e, n, i, r, o); + an(e, r, a, i, s); } -function Jn(e, t, n, r = !0, i = !1) { +function an(e, t, n, r = !0, i = !1) { if (i) throw e; console.error(e); } -var V = [], Yn = -1, Xn = [], Zn = null, Qn = 0, $n = /* @__PURE__ */ Promise.resolve(), er = null; -function tr(e) { - let t = er || $n; +var on = [], sn = -1, cn = [], ln = null, un = 0, dn = /* @__PURE__ */ Promise.resolve(), fn = null; +function pn(e) { + let t = fn || dn; return e ? t.then(this ? e.bind(this) : e) : t; } -function nr(e) { - let t = Yn + 1, n = V.length; +function mn(e) { + let t = sn + 1, n = on.length; for (; t < n;) { - let r = t + n >>> 1, i = V[r], a = cr(i); + let r = t + n >>> 1, i = on[r], a = bn(i); a < e || a === e && i.flags & 2 ? t = r + 1 : n = r; } return t; } -function rr(e) { +function hn(e) { if (!(e.flags & 1)) { - let t = cr(e), n = V[V.length - 1]; - !n || !(e.flags & 2) && t >= cr(n) ? V.push(e) : V.splice(nr(t), 0, e), e.flags |= 1, ir(); + let t = bn(e), n = on[on.length - 1]; + !n || !(e.flags & 2) && t >= bn(n) ? on.push(e) : on.splice(mn(t), 0, e), e.flags |= 1, gn(); } } -function ir() { - er ||= $n.then(lr); +function gn() { + fn ||= dn.then(xn); } -function ar(e) { - k(e) ? Xn.push(...e) : Zn && e.id === -1 ? Zn.splice(Qn + 1, 0, e) : e.flags & 1 || (Xn.push(e), e.flags |= 1), ir(); +function _n(e) { + d(e) ? cn.push(...e) : ln && e.id === -1 ? ln.splice(un + 1, 0, e) : e.flags & 1 || (cn.push(e), e.flags |= 1), gn(); } -function or(e, t, n = Yn + 1) { - for (; n < V.length; n++) { - let t = V[n]; +function vn(e, t, n = sn + 1) { + for (; n < on.length; n++) { + let t = on[n]; if (t && t.flags & 2) { if (e && t.id !== e.uid) continue; - V.splice(n, 1), n--, t.flags & 4 && (t.flags &= -2), t(), t.flags & 4 || (t.flags &= -2); + on.splice(n, 1), n--, t.flags & 4 && (t.flags &= -2), t(), t.flags & 4 || (t.flags &= -2); } } } -function sr(e) { - if (Xn.length) { - let e = [...new Set(Xn)].sort((e, t) => cr(e) - cr(t)); - if (Xn.length = 0, Zn) { - Zn.push(...e); +function yn(e) { + if (cn.length) { + let e = [...new Set(cn)].sort((e, t) => bn(e) - bn(t)); + if (cn.length = 0, ln) { + ln.push(...e); return; } - for (Zn = e, Qn = 0; Qn < Zn.length; Qn++) { - let e = Zn[Qn]; + for (ln = e, un = 0; un < ln.length; un++) { + let e = ln[un]; e.flags & 4 && (e.flags &= -2), e.flags & 8 || e(), e.flags &= -2; } - Zn = null, Qn = 0; + ln = null, un = 0; } } -var cr = (e) => e.id == null ? e.flags & 2 ? -1 : Infinity : e.id; -function lr(e) { +var bn = (e) => e.id == null ? e.flags & 2 ? -1 : Infinity : e.id; +function xn(e) { try { - for (Yn = 0; Yn < V.length; Yn++) { - let e = V[Yn]; - e && !(e.flags & 8) && (e.flags & 4 && (e.flags &= -2), Gn(e, e.i, e.i ? 15 : 14), e.flags & 4 || (e.flags &= -2)); + for (sn = 0; sn < on.length; sn++) { + let e = on[sn]; + e && !(e.flags & 8) && (e.flags & 4 && (e.flags &= -2), tn(e, e.i, e.i ? 15 : 14), e.flags & 4 || (e.flags &= -2)); } } finally { - for (; Yn < V.length; Yn++) { - let e = V[Yn]; + for (; sn < on.length; sn++) { + let e = on[sn]; e && (e.flags &= -2); } - Yn = -1, V.length = 0, sr(e), er = null, (V.length || Xn.length) && lr(e); + sn = -1, on.length = 0, yn(e), fn = null, (on.length || cn.length) && xn(e); } } -var ur = null, dr = null; -function fr(e) { - let t = ur; - return ur = e, dr = e && e.type.__scopeId || null, t; +var Sn = null, Cn = null; +function wn(e) { + let t = Sn; + return Sn = e, Cn = e && e.type.__scopeId || null, t; } -function pr(e, t = ur, n) { +function Tn(e, t = Sn, n) { if (!t || e._n) return e; let r = (...n) => { - r._d && ya(-1); - let i = fr(t), a; + r._d && Ai(-1); + let i = wn(t), a; try { a = e(...n); } finally { - fr(i), r._d && ya(1); + wn(i), r._d && Ai(1); } return a; }; return r._n = !0, r._c = !0, r._d = !0, r; } -function mr(e, t) { - if (ur === null) return e; - let n = $a(ur), r = e.dirs ||= []; - for (let e = 0; e < t.length; e++) { - let [i, a, o, s = E] = t[e]; - i && (A(i) && (i = { - mounted: i, - updated: i - }), i.deep && Wn(a), r.push({ - dir: i, - instance: n, - value: a, +function En(e, n) { + if (Sn === null) return e; + let r = da(Sn), i = e.dirs ||= []; + for (let e = 0; e < n.length; e++) { + let [a, o, s, c = t] = n[e]; + a && (h(a) && (a = { + mounted: a, + updated: a + }), a.deep && en(o), i.push({ + dir: a, + instance: r, + value: o, oldValue: void 0, - arg: o, - modifiers: s + arg: s, + modifiers: c })); } return e; } -function hr(e, t, n, r) { +function Dn(e, t, n, r) { let i = e.dirs, a = t && t.dirs; for (let o = 0; o < i.length; o++) { let s = i[o]; a && (s.oldValue = a[o].value); let c = s.dir[r]; - c && (kt(), Kn(c, n, 8, [ + c && (Be(), nn(c, n, 8, [ e.el, s, e, t - ]), At()); + ]), Ve()); } } -function gr(e, t) { - if (Y) { - let n = Y.provides, r = Y.parent && Y.parent.provides; - r === n && (n = Y.provides = Object.create(r)), n[e] = t; +function On(e, t) { + if (Yi) { + let n = Yi.provides, r = Yi.parent && Yi.parent.provides; + r === n && (n = Yi.provides = Object.create(r)), n[e] = t; } } -function _r(e, t, n = !1) { - let r = Ra(); - if (r || Si) { - let i = Si ? Si._context.provides : r ? r.parent == null || r.ce ? r.vnode.appContext && r.vnode.appContext.provides : r.parent.provides : void 0; +function kn(e, t, n = !1) { + let r = Xi(); + if (r || Nr) { + let i = Nr ? Nr._context.provides : r ? r.parent == null || r.ce ? r.vnode.appContext && r.vnode.appContext.provides : r.parent.provides : void 0; if (i && e in i) return i[e]; - if (arguments.length > 1) return n && A(t) ? t.call(r && r.proxy) : t; + if (arguments.length > 1) return n && h(t) ? t.call(r && r.proxy) : t; } } -var vr = /* @__PURE__ */ Symbol.for("v-scx"), yr = () => _r(vr); -function br(e, t, n) { - return xr(e, t, n); +var An = /* @__PURE__ */ Symbol.for("v-scx"), jn = () => kn(An); +function V(e, t, n) { + return Mn(e, t, n); } -function xr(e, t, n = E) { - let { immediate: r, deep: i, flush: a, once: o } = n, s = D({}, n), c = t && r || !t && a !== "post", l; - if (Wa) { - if (a === "sync") { - let e = yr(); - l = e.__watcherHandles ||= []; - } else if (!c) { +function Mn(e, n, i = t) { + let { immediate: a, deep: o, flush: c, once: l } = i, u = s({}, i), d = n && a || !n && c !== "post", f; + if (na) { + if (c === "sync") { + let e = jn(); + f = e.__watcherHandles ||= []; + } else if (!d) { let e = () => {}; - return e.stop = ye, e.resume = ye, e.pause = ye, e; - } - } - let u = Y; - s.call = (e, t, n) => Kn(e, u, t, n); - let d = !1; - a === "post" ? s.scheduler = (e) => { - $i(e, u && u.suspense); - } : a !== "sync" && (d = !0, s.scheduler = (e, t) => { - t ? e() : rr(e); - }), s.augmentJob = (e) => { - t && (e.flags |= 4), d && (e.flags |= 2, u && (e.id = u.uid, e.i = u)); + return e.stop = r, e.resume = r, e.pause = r, e; + } + } + let p = Yi; + u.call = (e, t, n) => nn(e, p, t, n); + let m = !1; + c === "post" ? u.scheduler = (e) => { + ui(e, p && p.suspense); + } : c !== "sync" && (m = !0, u.scheduler = (e, t) => { + t ? e() : hn(e); + }), u.augmentJob = (e) => { + n && (e.flags |= 4), m && (e.flags |= 2, p && (e.id = p.uid, e.i = p)); }; - let f = Un(e, t, s); - return Wa && (l ? l.push(f) : c && f()), f; + let h = $t(e, n, u); + return na && (f ? f.push(h) : d && h()), h; } -function Sr(e, t, n) { - let r = this.proxy, i = j(e) ? e.includes(".") ? Cr(r, e) : () => r[e] : e.bind(r, r), a; - A(t) ? a = t : (a = t.handler, n = t); - let o = Va(this), s = xr(i, a.bind(r), n); +function Nn(e, t, n) { + let r = this.proxy, i = g(e) ? e.includes(".") ? Pn(r, e) : () => r[e] : e.bind(r, r), a; + h(t) ? a = t : (a = t.handler, n = t); + let o = $i(this), s = Mn(i, a.bind(r), n); return o(), s; } -function Cr(e, t) { +function Pn(e, t) { let n = t.split("."); return () => { let t = e; @@ -1411,81 +1083,81 @@ function Cr(e, t) { return t; }; } -var wr = /* @__PURE__ */ Symbol("_vte"), Tr = (e) => e.__isTeleport, Er = /* @__PURE__ */ Symbol("_leaveCb"); -function Dr(e, t) { - e.shapeFlag & 6 && e.component ? (e.transition = t, Dr(e.component.subTree, t)) : e.shapeFlag & 128 ? (e.ssContent.transition = t.clone(e.ssContent), e.ssFallback.transition = t.clone(e.ssFallback)) : e.transition = t; +var Fn = /* @__PURE__ */ Symbol("_vte"), In = (e) => e.__isTeleport, Ln = /* @__PURE__ */ Symbol("_leaveCb"); +function Rn(e, t) { + e.shapeFlag & 6 && e.component ? (e.transition = t, Rn(e.component.subTree, t)) : e.shapeFlag & 128 ? (e.ssContent.transition = t.clone(e.ssContent), e.ssFallback.transition = t.clone(e.ssFallback)) : e.transition = t; } /* @__NO_SIDE_EFFECTS__ */ -function Or(e, t) { - return A(e) ? D({ name: e.name }, t, { setup: e }) : e; +function zn(e, t) { + return h(e) ? s({ name: e.name }, t, { setup: e }) : e; } -function kr(e) { +function Bn(e) { e.ids = [ e.ids[0] + e.ids[2]++ + "-", 0, 0 ]; } -function Ar(e, t) { +function Vn(e, t) { let n; return !!((n = Object.getOwnPropertyDescriptor(e, t)) && !n.configurable); } -var jr = /* @__PURE__ */ new WeakMap(); -function Mr(e, t, n, r, i = !1) { - if (k(e)) { - e.forEach((e, a) => Mr(e, t && (k(t) ? t[a] : t), n, r, i)); +var Hn = /* @__PURE__ */ new WeakMap(); +function Un(e, n, r, a, o = !1) { + if (d(e)) { + e.forEach((e, t) => Un(e, n && (d(n) ? n[t] : n), r, a, o)); return; } - if (Pr(r) && !i) { - r.shapeFlag & 512 && r.type.__asyncResolved && r.component.subTree.component && Mr(e, t, n, r.component.subTree); + if (Gn(a) && !o) { + a.shapeFlag & 512 && a.type.__asyncResolved && a.component.subTree.component && Un(e, n, r, a.component.subTree); return; } - let a = r.shapeFlag & 4 ? $a(r.component) : r.el, o = i ? null : a, { i: s, r: c } = e, l = t && t.r, u = s.refs === E ? s.refs = {} : s.refs, d = s.setupState, f = /* @__PURE__ */ L(d), p = d === E ? be : (e) => Ar(u, e) ? !1 : O(f, e), m = (e, t) => !(t && Ar(u, t)); - if (l != null && l !== c) { - if (Nr(t), j(l)) u[l] = null, p(l) && (d[l] = null); - else if (/* @__PURE__ */ R(l)) { - let e = t; - m(l, e.k) && (l.value = null), e.k && (u[e.k] = null); + let s = a.shapeFlag & 4 ? da(a.component) : a.el, l = o ? null : s, { i: f, r: p } = e, m = n && n.r, _ = f.refs === t ? f.refs = {} : f.refs, v = f.setupState, y = /* @__PURE__ */ L(v), b = v === t ? i : (e) => Vn(_, e) ? !1 : u(y, e), x = (e, t) => !(t && Vn(_, t)); + if (m != null && m !== p) { + if (Wn(n), g(m)) _[m] = null, b(m) && (v[m] = null); + else if (/* @__PURE__ */ R(m)) { + let e = n; + x(m, e.k) && (m.value = null), e.k && (_[e.k] = null); } } - if (A(c)) Gn(c, s, 12, [o, u]); + if (h(p)) tn(p, f, 12, [l, _]); else { - let t = j(c), r = /* @__PURE__ */ R(c); - if (t || r) { - let s = () => { + let t = g(p), n = /* @__PURE__ */ R(p); + if (t || n) { + let i = () => { if (e.f) { - let n = t ? p(c) ? d[c] : u[c] : m(c) || !e.k ? c.value : u[e.k]; - if (i) k(n) && Ce(n, a); - else if (k(n)) n.includes(a) || n.push(a); - else if (t) u[c] = [a], p(c) && (d[c] = u[c]); + let n = t ? b(p) ? v[p] : _[p] : x(p) || !e.k ? p.value : _[e.k]; + if (o) d(n) && c(n, s); + else if (d(n)) n.includes(s) || n.push(s); + else if (t) _[p] = [s], b(p) && (v[p] = _[p]); else { - let t = [a]; - m(c, e.k) && (c.value = t), e.k && (u[e.k] = t); + let t = [s]; + x(p, e.k) && (p.value = t), e.k && (_[e.k] = t); } - } else t ? (u[c] = o, p(c) && (d[c] = o)) : r && (m(c, e.k) && (c.value = o), e.k && (u[e.k] = o)); + } else t ? (_[p] = l, b(p) && (v[p] = l)) : n && (x(p, e.k) && (p.value = l), e.k && (_[e.k] = l)); }; - if (o) { + if (l) { let t = () => { - s(), jr.delete(e); + i(), Hn.delete(e); }; - t.id = -1, jr.set(e, t), $i(t, n); - } else Nr(e), s(); + t.id = -1, Hn.set(e, t), ui(t, r); + } else Wn(e), i(); } } } -function Nr(e) { - let t = jr.get(e); - t && (t.flags |= 8, jr.delete(e)); +function Wn(e) { + let t = Hn.get(e); + t && (t.flags |= 8, Hn.delete(e)); } -Ye().requestIdleCallback, Ye().cancelIdleCallback; -var Pr = (e) => !!e.type.__asyncLoader, Fr = (e) => e.type.__isKeepAlive; -function Ir(e, t) { - Rr(e, "a", t); +j().requestIdleCallback, j().cancelIdleCallback; +var Gn = (e) => !!e.type.__asyncLoader, Kn = (e) => e.type.__isKeepAlive; +function qn(e, t) { + Yn(e, "a", t); } -function Lr(e, t) { - Rr(e, "da", t); +function Jn(e, t) { + Yn(e, "da", t); } -function Rr(e, t, n = Y) { +function Yn(e, t, n = Yi) { let r = e.__wdc ||= () => { let t = n; for (; t;) { @@ -1494,44 +1166,44 @@ function Rr(e, t, n = Y) { } return e(); }; - if (Br(t, r, n), n) { + if (Zn(t, r, n), n) { let e = n.parent; - for (; e && e.parent;) Fr(e.parent.vnode) && zr(r, t, n, e), e = e.parent; + for (; e && e.parent;) Kn(e.parent.vnode) && Xn(r, t, n, e), e = e.parent; } } -function zr(e, t, n, r) { - let i = Br(t, e, r, !0); - qr(() => { - Ce(r[t], i); +function Xn(e, t, n, r) { + let i = Zn(t, e, r, !0); + ir(() => { + c(r[t], i); }, n); } -function Br(e, t, n = Y, r = !1) { +function Zn(e, t, n = Yi, r = !1) { if (n) { let i = n[e] || (n[e] = []), a = t.__weh ||= (...r) => { - kt(); - let i = Va(n), a = Kn(t, n, e, r); - return i(), At(), a; + Be(); + let i = $i(n), a = nn(t, n, e, r); + return i(), Ve(), a; }; return r ? i.unshift(a) : i.push(a), a; } } -var Vr = (e) => (t, n = Y) => { - (!Wa || e === "sp") && Br(e, (...e) => t(...e), n); -}, Hr = Vr("bm"), Ur = Vr("m"), Wr = Vr("bu"), Gr = Vr("u"), Kr = Vr("bum"), qr = Vr("um"), Jr = Vr("sp"), Yr = Vr("rtg"), Xr = Vr("rtc"); -function Zr(e, t = Y) { - Br("ec", e, t); +var Qn = (e) => (t, n = Yi) => { + (!na || e === "sp") && Zn(e, (...e) => t(...e), n); +}, $n = Qn("bm"), er = Qn("m"), tr = Qn("bu"), nr = Qn("u"), rr = Qn("bum"), ir = Qn("um"), ar = Qn("sp"), or = Qn("rtg"), sr = Qn("rtc"); +function cr(e, t = Yi) { + Zn("ec", e, t); } -var Qr = /* @__PURE__ */ Symbol.for("v-ndc"); -function $r(e, t, n, r) { - let i, a = n && n[r], o = k(e); - if (o || j(e)) { - let n = o && /* @__PURE__ */ En(e), r = !1, s = !1; - n && (r = !/* @__PURE__ */ On(e), s = /* @__PURE__ */ Dn(e), e = Ht(e)), i = Array(e.length); - for (let n = 0, o = e.length; n < o; n++) i[n] = t(r ? s ? Mn(jn(e[n])) : jn(e[n]) : e[n], n, void 0, a && a[n]); +var lr = /* @__PURE__ */ Symbol.for("v-ndc"); +function H(e, t, n, r) { + let i, a = n && n[r], o = d(e); + if (o || g(e)) { + let n = o && /* @__PURE__ */ It(e), r = !1, s = !1; + n && (r = !/* @__PURE__ */ Rt(e), s = /* @__PURE__ */ Lt(e), e = $e(e)), i = Array(e.length); + for (let n = 0, o = e.length; n < o; n++) i[n] = t(r ? s ? Ht(Vt(e[n])) : Vt(e[n]) : e[n], n, void 0, a && a[n]); } else if (typeof e == "number") { i = Array(e); for (let n = 0; n < e; n++) i[n] = t(n + 1, n, void 0, a && a[n]); - } else if (M(e)) if (e[Symbol.iterator]) i = Array.from(e, (e, n) => t(e, n, void 0, a && a[n])); + } else if (v(e)) if (e[Symbol.iterator]) i = Array.from(e, (e, n) => t(e, n, void 0, a && a[n])); else { let n = Object.keys(e); i = Array(n.length); @@ -1543,7 +1215,7 @@ function $r(e, t, n, r) { else i = []; return n && (n[r] = i), i; } -var ei = (e) => e ? Ua(e) ? $a(e) : ei(e.parent) : null, ti = /* @__PURE__ */ D(/* @__PURE__ */ Object.create(null), { +var ur = (e) => e ? ta(e) ? da(e) : ur(e.parent) : null, dr = /* @__PURE__ */ s(/* @__PURE__ */ Object.create(null), { $: (e) => e, $el: (e) => e.vnode.el, $data: (e) => e.data, @@ -1551,94 +1223,94 @@ var ei = (e) => e ? Ua(e) ? $a(e) : ei(e.parent) : null, ti = /* @__PURE__ */ D( $attrs: (e) => e.attrs, $slots: (e) => e.slots, $refs: (e) => e.refs, - $parent: (e) => ei(e.parent), - $root: (e) => ei(e.root), + $parent: (e) => ur(e.parent), + $root: (e) => ur(e.root), $host: (e) => e.ce, $emit: (e) => e.emit, - $options: (e) => ui(e), + $options: (e) => br(e), $forceUpdate: (e) => e.f ||= () => { - rr(e.update); + hn(e.update); }, - $nextTick: (e) => e.n ||= tr.bind(e.proxy), - $watch: (e) => Sr.bind(e) -}), ni = (e, t) => e !== E && !e.__isScriptSetup && O(e, t), ri = { - get({ _: e }, t) { - if (t === "__v_skip") return !0; - let { ctx: n, setupState: r, data: i, props: a, accessCache: o, type: s, appContext: c } = e; - if (t[0] !== "$") { - let e = o[t]; + $nextTick: (e) => e.n ||= pn.bind(e.proxy), + $watch: (e) => Nn.bind(e) +}), fr = (e, n) => e !== t && !e.__isScriptSetup && u(e, n), pr = { + get({ _: e }, n) { + if (n === "__v_skip") return !0; + let { ctx: r, setupState: i, data: a, props: o, accessCache: s, type: c, appContext: l } = e; + if (n[0] !== "$") { + let e = s[n]; if (e !== void 0) switch (e) { - case 1: return r[t]; - case 2: return i[t]; - case 4: return n[t]; - case 3: return a[t]; + case 1: return i[n]; + case 2: return a[n]; + case 4: return r[n]; + case 3: return o[n]; } - else if (ni(r, t)) return o[t] = 1, r[t]; - else if (i !== E && O(i, t)) return o[t] = 2, i[t]; - else if (O(a, t)) return o[t] = 3, a[t]; - else if (n !== E && O(n, t)) return o[t] = 4, n[t]; - else ai && (o[t] = 0); - } - let l = ti[t], u, d; - if (l) return t === "$attrs" && I(e.attrs, "get", ""), l(e); - if ((u = s.__cssModules) && (u = u[t])) return u; - if (n !== E && O(n, t)) return o[t] = 4, n[t]; - if (d = c.config.globalProperties, O(d, t)) return d[t]; + else if (fr(i, n)) return s[n] = 1, i[n]; + else if (a !== t && u(a, n)) return s[n] = 2, a[n]; + else if (u(o, n)) return s[n] = 3, o[n]; + else if (r !== t && u(r, n)) return s[n] = 4, r[n]; + else hr && (s[n] = 0); + } + let d = dr[n], f, p; + if (d) return n === "$attrs" && I(e.attrs, "get", ""), d(e); + if ((f = c.__cssModules) && (f = f[n])) return f; + if (r !== t && u(r, n)) return s[n] = 4, r[n]; + if (p = l.config.globalProperties, u(p, n)) return p[n]; }, - set({ _: e }, t, n) { - let { data: r, setupState: i, ctx: a } = e; - return ni(i, t) ? (i[t] = n, !0) : r !== E && O(r, t) ? (r[t] = n, !0) : O(e.props, t) || t[0] === "$" && t.slice(1) in e ? !1 : (a[t] = n, !0); + set({ _: e }, n, r) { + let { data: i, setupState: a, ctx: o } = e; + return fr(a, n) ? (a[n] = r, !0) : i !== t && u(i, n) ? (i[n] = r, !0) : u(e.props, n) || n[0] === "$" && n.slice(1) in e ? !1 : (o[n] = r, !0); }, - has({ _: { data: e, setupState: t, accessCache: n, ctx: r, appContext: i, props: a, type: o } }, s) { - let c; - return !!(n[s] || e !== E && s[0] !== "$" && O(e, s) || ni(t, s) || O(a, s) || O(r, s) || O(ti, s) || O(i.config.globalProperties, s) || (c = o.__cssModules) && c[s]); + has({ _: { data: e, setupState: n, accessCache: r, ctx: i, appContext: a, props: o, type: s } }, c) { + let l; + return !!(r[c] || e !== t && c[0] !== "$" && u(e, c) || fr(n, c) || u(o, c) || u(i, c) || u(dr, c) || u(a.config.globalProperties, c) || (l = s.__cssModules) && l[c]); }, defineProperty(e, t, n) { - return n.get == null ? O(n, "value") && this.set(e, t, n.value, null) : e._.accessCache[t] = 0, Reflect.defineProperty(e, t, n); + return n.get == null ? u(n, "value") && this.set(e, t, n.value, null) : e._.accessCache[t] = 0, Reflect.defineProperty(e, t, n); } }; -function ii(e) { - return k(e) ? e.reduce((e, t) => (e[t] = null, e), {}) : e; -} -var ai = !0; -function oi(e) { - let t = ui(e), n = e.proxy, r = e.ctx; - ai = !1, t.beforeCreate && ci(t.beforeCreate, e, "bc"); - let { data: i, computed: a, methods: o, watch: s, provide: c, inject: l, created: u, beforeMount: d, mounted: f, beforeUpdate: p, updated: m, activated: h, deactivated: g, beforeDestroy: _, beforeUnmount: v, destroyed: y, unmounted: ee, render: te, renderTracked: ne, renderTriggered: b, errorCaptured: re, serverPrefetch: ie, expose: x, inheritAttrs: ae, components: oe, directives: se, filters: ce } = t; - if (l && si(l, r, null), o) for (let e in o) { - let t = o[e]; - A(t) && (r[e] = t.bind(n)); - } - if (i) { - let t = i.call(n, n); - M(t) && (e.data = /* @__PURE__ */ Sn(t)); - } - if (ai = !0, a) for (let e in a) { - let t = a[e], i = X({ - get: A(t) ? t.bind(n, n) : A(t.get) ? t.get.bind(n, n) : ye, - set: !A(t) && A(t.set) ? t.set.bind(n) : ye +function mr(e) { + return d(e) ? e.reduce((e, t) => (e[t] = null, e), {}) : e; +} +var hr = !0; +function gr(e) { + let t = br(e), n = e.proxy, i = e.ctx; + hr = !1, t.beforeCreate && vr(t.beforeCreate, e, "bc"); + let { data: a, computed: o, methods: s, watch: c, provide: l, inject: u, created: f, beforeMount: p, mounted: m, beforeUpdate: g, updated: _, activated: y, deactivated: b, beforeDestroy: x, beforeUnmount: S, destroyed: C, unmounted: w, render: ee, renderTracked: te, renderTriggered: ne, errorCaptured: T, serverPrefetch: re, expose: E, inheritAttrs: D, components: ie, directives: O, filters: ae } = t; + if (u && _r(u, i, null), s) for (let e in s) { + let t = s[e]; + h(t) && (i[e] = t.bind(n)); + } + if (a) { + let t = a.call(n, n); + v(t) && (e.data = /* @__PURE__ */ Mt(t)); + } + if (hr = !0, o) for (let e in o) { + let t = o[e], a = Y({ + get: h(t) ? t.bind(n, n) : h(t.get) ? t.get.bind(n, n) : r, + set: !h(t) && h(t.set) ? t.set.bind(n) : r }); - Object.defineProperty(r, e, { + Object.defineProperty(i, e, { enumerable: !0, configurable: !0, - get: () => i.value, - set: (e) => i.value = e + get: () => a.value, + set: (e) => a.value = e }); } - if (s) for (let e in s) li(s[e], r, n, e); - if (c) { - let e = A(c) ? c.call(n) : c; + if (c) for (let e in c) yr(c[e], i, n, e); + if (l) { + let e = h(l) ? l.call(n) : l; Reflect.ownKeys(e).forEach((t) => { - gr(t, e[t]); + On(t, e[t]); }); } - u && ci(u, e, "c"); - function S(e, t) { - k(t) ? t.forEach((t) => e(t.bind(n))) : t && e(t.bind(n)); + f && vr(f, e, "c"); + function k(e, t) { + d(t) ? t.forEach((t) => e(t.bind(n))) : t && e(t.bind(n)); } - if (S(Hr, d), S(Ur, f), S(Wr, p), S(Gr, m), S(Ir, h), S(Lr, g), S(Zr, re), S(Xr, ne), S(Yr, b), S(Kr, v), S(qr, ee), S(Jr, ie), k(x)) if (x.length) { + if (k($n, p), k(er, m), k(tr, g), k(nr, _), k(qn, y), k(Jn, b), k(cr, T), k(sr, te), k(or, ne), k(rr, S), k(ir, w), k(ar, re), d(E)) if (E.length) { let t = e.exposed ||= {}; - x.forEach((e) => { + E.forEach((e) => { Object.defineProperty(t, e, { get: () => n[e], set: (t) => n[e] = t, @@ -1646,13 +1318,13 @@ function oi(e) { }); }); } else e.exposed ||= {}; - te && e.render === ye && (e.render = te), ae != null && (e.inheritAttrs = ae), oe && (e.components = oe), se && (e.directives = se), ie && kr(e); + ee && e.render === r && (e.render = ee), D != null && (e.inheritAttrs = D), ie && (e.components = ie), O && (e.directives = O), re && Bn(e); } -function si(e, t, n = ye) { - k(e) && (e = hi(e)); +function _r(e, t, n = r) { + d(e) && (e = Tr(e)); for (let n in e) { let r = e[n], i; - i = M(r) ? "default" in r ? _r(r.from || n, r.default, !0) : _r(r.from || n) : _r(r), /* @__PURE__ */ R(i) ? Object.defineProperty(t, n, { + i = v(r) ? "default" in r ? kn(r.from || n, r.default, !0) : kn(r.from || n) : kn(r), /* @__PURE__ */ R(i) ? Object.defineProperty(t, n, { enumerable: !0, configurable: !0, get: () => i.value, @@ -1660,97 +1332,97 @@ function si(e, t, n = ye) { }) : t[n] = i; } } -function ci(e, t, n) { - Kn(k(e) ? e.map((e) => e.bind(t.proxy)) : e.bind(t.proxy), t, n); +function vr(e, t, n) { + nn(d(e) ? e.map((e) => e.bind(t.proxy)) : e.bind(t.proxy), t, n); } -function li(e, t, n, r) { - let i = r.includes(".") ? Cr(n, r) : () => n[r]; - if (j(e)) { +function yr(e, t, n, r) { + let i = r.includes(".") ? Pn(n, r) : () => n[r]; + if (g(e)) { let n = t[e]; - A(n) && br(i, n); - } else if (A(e)) br(i, e.bind(n)); - else if (M(e)) if (k(e)) e.forEach((e) => li(e, t, n, r)); + h(n) && V(i, n); + } else if (h(e)) V(i, e.bind(n)); + else if (v(e)) if (d(e)) e.forEach((e) => yr(e, t, n, r)); else { - let r = A(e.handler) ? e.handler.bind(n) : t[e.handler]; - A(r) && br(i, r, e); + let r = h(e.handler) ? e.handler.bind(n) : t[e.handler]; + h(r) && V(i, r, e); } } -function ui(e) { +function br(e) { let t = e.type, { mixins: n, extends: r } = t, { mixins: i, optionsCache: a, config: { optionMergeStrategies: o } } = e.appContext, s = a.get(t), c; - return s ? c = s : !i.length && !n && !r ? c = t : (c = {}, i.length && i.forEach((e) => di(c, e, o, !0)), di(c, t, o)), M(t) && a.set(t, c), c; + return s ? c = s : !i.length && !n && !r ? c = t : (c = {}, i.length && i.forEach((e) => xr(c, e, o, !0)), xr(c, t, o)), v(t) && a.set(t, c), c; } -function di(e, t, n, r = !1) { +function xr(e, t, n, r = !1) { let { mixins: i, extends: a } = t; - a && di(e, a, n, !0), i && i.forEach((t) => di(e, t, n, !0)); + a && xr(e, a, n, !0), i && i.forEach((t) => xr(e, t, n, !0)); for (let i in t) if (!(r && i === "expose")) { - let r = fi[i] || n && n[i]; + let r = Sr[i] || n && n[i]; e[i] = r ? r(e[i], t[i]) : t[i]; } return e; } -var fi = { - data: pi, - props: _i, - emits: _i, - methods: gi, - computed: gi, - beforeCreate: H, - created: H, - beforeMount: H, - mounted: H, - beforeUpdate: H, - updated: H, - beforeDestroy: H, - beforeUnmount: H, - destroyed: H, - unmounted: H, - activated: H, - deactivated: H, - errorCaptured: H, - serverPrefetch: H, - components: gi, - directives: gi, - watch: vi, - provide: pi, - inject: mi +var Sr = { + data: Cr, + props: Or, + emits: Or, + methods: Dr, + computed: Dr, + beforeCreate: Er, + created: Er, + beforeMount: Er, + mounted: Er, + beforeUpdate: Er, + updated: Er, + beforeDestroy: Er, + beforeUnmount: Er, + destroyed: Er, + unmounted: Er, + activated: Er, + deactivated: Er, + errorCaptured: Er, + serverPrefetch: Er, + components: Dr, + directives: Dr, + watch: kr, + provide: Cr, + inject: wr }; -function pi(e, t) { +function Cr(e, t) { return t ? e ? function() { - return D(A(e) ? e.call(this, this) : e, A(t) ? t.call(this, this) : t); + return s(h(e) ? e.call(this, this) : e, h(t) ? t.call(this, this) : t); } : t : e; } -function mi(e, t) { - return gi(hi(e), hi(t)); +function wr(e, t) { + return Dr(Tr(e), Tr(t)); } -function hi(e) { - if (k(e)) { +function Tr(e) { + if (d(e)) { let t = {}; for (let n = 0; n < e.length; n++) t[e[n]] = e[n]; return t; } return e; } -function H(e, t) { +function Er(e, t) { return e ? [...new Set([].concat(e, t))] : t; } -function gi(e, t) { - return e ? D(/* @__PURE__ */ Object.create(null), e, t) : t; +function Dr(e, t) { + return e ? s(/* @__PURE__ */ Object.create(null), e, t) : t; } -function _i(e, t) { - return e ? k(e) && k(t) ? [.../* @__PURE__ */ new Set([...e, ...t])] : D(/* @__PURE__ */ Object.create(null), ii(e), ii(t ?? {})) : t; +function Or(e, t) { + return e ? d(e) && d(t) ? [.../* @__PURE__ */ new Set([...e, ...t])] : s(/* @__PURE__ */ Object.create(null), mr(e), mr(t ?? {})) : t; } -function vi(e, t) { +function kr(e, t) { if (!e) return t; if (!t) return e; - let n = D(/* @__PURE__ */ Object.create(null), e); - for (let r in t) n[r] = H(e[r], t[r]); + let n = s(/* @__PURE__ */ Object.create(null), e); + for (let r in t) n[r] = Er(e[r], t[r]); return n; } -function yi() { +function Ar() { return { app: null, config: { - isNativeTag: be, + isNativeTag: i, performance: !1, globalProperties: {}, optionMergeStrategies: {}, @@ -1767,156 +1439,156 @@ function yi() { emitsCache: /* @__PURE__ */ new WeakMap() }; } -var bi = 0; -function xi(e, t) { +var jr = 0; +function Mr(e, t) { return function(n, r = null) { - A(n) || (n = D({}, n)), r != null && !M(r) && (r = null); - let i = yi(), a = /* @__PURE__ */ new WeakSet(), o = [], s = !1, c = i.app = { - _uid: bi++, + h(n) || (n = s({}, n)), r != null && !v(r) && (r = null); + let i = Ar(), a = /* @__PURE__ */ new WeakSet(), o = [], c = !1, l = i.app = { + _uid: jr++, _component: n, _props: r, _container: null, _context: i, _instance: null, - version: to, + version: pa, get config() { return i.config; }, set config(e) {}, use(e, ...t) { - return a.has(e) || (e && A(e.install) ? (a.add(e), e.install(c, ...t)) : A(e) && (a.add(e), e(c, ...t))), c; + return a.has(e) || (e && h(e.install) ? (a.add(e), e.install(l, ...t)) : h(e) && (a.add(e), e(l, ...t))), l; }, mixin(e) { - return i.mixins.includes(e) || i.mixins.push(e), c; + return i.mixins.includes(e) || i.mixins.push(e), l; }, component(e, t) { - return t ? (i.components[e] = t, c) : i.components[e]; + return t ? (i.components[e] = t, l) : i.components[e]; }, directive(e, t) { - return t ? (i.directives[e] = t, c) : i.directives[e]; + return t ? (i.directives[e] = t, l) : i.directives[e]; }, - mount(a, o, l) { - if (!s) { - let u = c._ceVNode || Ea(n, r); - return u.appContext = i, l === !0 ? l = "svg" : l === !1 && (l = void 0), o && t ? t(u, a) : e(u, a, l), s = !0, c._container = a, a.__vue_app__ = c, $a(u.component); + mount(a, o, s) { + if (!c) { + let u = l._ceVNode || Li(n, r); + return u.appContext = i, s === !0 ? s = "svg" : s === !1 && (s = void 0), o && t ? t(u, a) : e(u, a, s), c = !0, l._container = a, a.__vue_app__ = l, da(u.component); } }, onUnmount(e) { o.push(e); }, unmount() { - s && (Kn(o, c._instance, 16), e(null, c._container), delete c._container.__vue_app__); + c && (nn(o, l._instance, 16), e(null, l._container), delete l._container.__vue_app__); }, provide(e, t) { - return i.provides[e] = t, c; + return i.provides[e] = t, l; }, runWithContext(e) { - let t = Si; - Si = c; + let t = Nr; + Nr = l; try { return e(); } finally { - Si = t; + Nr = t; } } }; - return c; + return l; }; } -var Si = null, Ci = (e, t) => t === "modelValue" || t === "model-value" ? e.modelModifiers : e[`${t}Modifiers`] || e[`${Re(t)}Modifiers`] || e[`${Be(t)}Modifiers`]; -function wi(e, t, ...n) { +var Nr = null, Pr = (e, t) => t === "modelValue" || t === "model-value" ? e.modelModifiers : e[`${t}Modifiers`] || e[`${T(t)}Modifiers`] || e[`${E(t)}Modifiers`]; +function Fr(e, n, ...r) { if (e.isUnmounted) return; - let r = e.vnode.props || E, i = n, a = t.startsWith("update:"), o = a && Ci(r, t.slice(7)); - o && (o.trim && (i = n.map((e) => j(e) ? e.trim() : e)), o.number && (i = n.map(Ke))); - let s, c = r[s = He(t)] || r[s = He(Re(t))]; - !c && a && (c = r[s = He(Be(t))]), c && Kn(c, e, 6, i); - let l = r[s + "Once"]; - if (l) { + let i = e.vnode.props || t, a = r, o = n.startsWith("update:"), s = o && Pr(i, n.slice(7)); + s && (s.trim && (a = r.map((e) => g(e) ? e.trim() : e)), s.number && (a = r.map(oe))); + let c, l = i[c = ie(n)] || i[c = ie(T(n))]; + !l && o && (l = i[c = ie(E(n))]), l && nn(l, e, 6, a); + let u = i[c + "Once"]; + if (u) { if (!e.emitted) e.emitted = {}; - else if (e.emitted[s]) return; - e.emitted[s] = !0, Kn(l, e, 6, i); + else if (e.emitted[c]) return; + e.emitted[c] = !0, nn(u, e, 6, a); } } -var Ti = /* @__PURE__ */ new WeakMap(); -function Ei(e, t, n = !1) { - let r = n ? Ti : t.emitsCache, i = r.get(e); +var Ir = /* @__PURE__ */ new WeakMap(); +function Lr(e, t, n = !1) { + let r = n ? Ir : t.emitsCache, i = r.get(e); if (i !== void 0) return i; - let a = e.emits, o = {}, s = !1; - if (!A(e)) { + let a = e.emits, o = {}, c = !1; + if (!h(e)) { let r = (e) => { - let n = Ei(e, t, !0); - n && (s = !0, D(o, n)); + let n = Lr(e, t, !0); + n && (c = !0, s(o, n)); }; !n && t.mixins.length && t.mixins.forEach(r), e.extends && r(e.extends), e.mixins && e.mixins.forEach(r); } - return !a && !s ? (M(e) && r.set(e, null), null) : (k(a) ? a.forEach((e) => o[e] = null) : D(o, a), M(e) && r.set(e, o), o); + return !a && !c ? (v(e) && r.set(e, null), null) : (d(a) ? a.forEach((e) => o[e] = null) : s(o, a), v(e) && r.set(e, o), o); } -function Di(e, t) { - return !e || !xe(t) ? !1 : (t = t.slice(2).replace(/Once$/, ""), O(e, t[0].toLowerCase() + t.slice(1)) || O(e, Be(t)) || O(e, t)); +function Rr(e, t) { + return !e || !a(t) ? !1 : (t = t.slice(2).replace(/Once$/, ""), u(e, t[0].toLowerCase() + t.slice(1)) || u(e, E(t)) || u(e, t)); } -function Oi(e) { - let { type: t, vnode: n, proxy: r, withProxy: i, propsOptions: [a], slots: o, attrs: s, emit: c, render: l, renderCache: u, props: d, data: f, setupState: p, ctx: m, inheritAttrs: h } = e, g = fr(e), _, v; +function zr(e) { + let { type: t, vnode: n, proxy: r, withProxy: i, propsOptions: [a], slots: s, attrs: c, emit: l, render: u, renderCache: d, props: f, data: p, setupState: m, ctx: h, inheritAttrs: g } = e, _ = wn(e), v, y; try { if (n.shapeFlag & 4) { let e = i || r, t = e; - _ = Aa(l.call(t, e, u, d, p, f, m)), v = s; + v = Vi(u.call(t, e, d, f, m, p, h)), y = c; } else { let e = t; - _ = Aa(e.length > 1 ? e(d, { - attrs: s, - slots: o, - emit: c - }) : e(d, null)), v = t.props ? s : ki(s); + v = Vi(e.length > 1 ? e(f, { + attrs: c, + slots: s, + emit: l + }) : e(f, null)), y = t.props ? c : Br(c); } } catch (t) { - ha.length = 0, qn(t, e, 1), _ = Ea(pa); + Ei.length = 0, rn(t, e, 1), v = Li(wi); } - let y = _; - if (v && h !== !1) { - let e = Object.keys(v), { shapeFlag: t } = y; - e.length && t & 7 && (a && e.some(Se) && (v = Ai(v, a)), y = ka(y, v, !1, !0)); + let b = v; + if (y && g !== !1) { + let e = Object.keys(y), { shapeFlag: t } = b; + e.length && t & 7 && (a && e.some(o) && (y = Vr(y, a)), b = Bi(b, y, !1, !0)); } - return n.dirs && (y = ka(y, null, !1, !0), y.dirs = y.dirs ? y.dirs.concat(n.dirs) : n.dirs), n.transition && Dr(y, n.transition), _ = y, fr(g), _; + return n.dirs && (b = Bi(b, null, !1, !0), b.dirs = b.dirs ? b.dirs.concat(n.dirs) : n.dirs), n.transition && Rn(b, n.transition), v = b, wn(_), v; } -var ki = (e) => { +var Br = (e) => { let t; - for (let n in e) (n === "class" || n === "style" || xe(n)) && ((t ||= {})[n] = e[n]); + for (let n in e) (n === "class" || n === "style" || a(n)) && ((t ||= {})[n] = e[n]); return t; -}, Ai = (e, t) => { +}, Vr = (e, t) => { let n = {}; - for (let r in e) (!Se(r) || !(r.slice(9) in t)) && (n[r] = e[r]); + for (let r in e) (!o(r) || !(r.slice(9) in t)) && (n[r] = e[r]); return n; }; -function ji(e, t, n) { +function Hr(e, t, n) { let { props: r, children: i, component: a } = e, { props: o, children: s, patchFlag: c } = t, l = a.emitsOptions; if (t.dirs || t.transition) return !0; if (n && c >= 0) { if (c & 1024) return !0; - if (c & 16) return r ? Mi(r, o, l) : !!o; + if (c & 16) return r ? Ur(r, o, l) : !!o; if (c & 8) { let e = t.dynamicProps; for (let t = 0; t < e.length; t++) { let n = e[t]; - if (Ni(o, r, n) && !Di(l, n)) return !0; + if (Wr(o, r, n) && !Rr(l, n)) return !0; } } - } else return (i || s) && (!s || !s.$stable) ? !0 : r === o ? !1 : r ? o ? Mi(r, o, l) : !0 : !!o; + } else return (i || s) && (!s || !s.$stable) ? !0 : r === o ? !1 : r ? o ? Ur(r, o, l) : !0 : !!o; return !1; } -function Mi(e, t, n) { +function Ur(e, t, n) { let r = Object.keys(t); if (r.length !== Object.keys(e).length) return !0; for (let i = 0; i < r.length; i++) { let a = r[i]; - if (Ni(t, e, a) && !Di(n, a)) return !0; + if (Wr(t, e, a) && !Rr(n, a)) return !0; } return !1; } -function Ni(e, t, n) { +function Wr(e, t, n) { let r = e[n], i = t[n]; - return n === "style" && M(r) && M(i) ? !ot(r, i) : r !== i; + return n === "style" && v(r) && v(i) ? !_e(r, i) : r !== i; } -function Pi({ vnode: e, parent: t, suspense: n }, r) { +function Gr({ vnode: e, parent: t, suspense: n }, r) { for (; t;) { let n = t.subTree; if (n.suspense && n.suspense.activeBranch === e && (n.suspense.vnode.el = n.el = r, e = n), n === e) (e = t.vnode).el = r, t = t.parent; @@ -1924,519 +1596,519 @@ function Pi({ vnode: e, parent: t, suspense: n }, r) { } n && n.activeBranch === e && (n.vnode.el = r); } -var Fi = {}, Ii = () => Object.create(Fi), Li = (e) => Object.getPrototypeOf(e) === Fi; -function Ri(e, t, n, r = !1) { - let i = {}, a = Ii(); - e.propsDefaults = /* @__PURE__ */ Object.create(null), Bi(e, t, i, a); +var Kr = {}, qr = () => Object.create(Kr), Jr = (e) => Object.getPrototypeOf(e) === Kr; +function Yr(e, t, n, r = !1) { + let i = {}, a = qr(); + e.propsDefaults = /* @__PURE__ */ Object.create(null), Zr(e, t, i, a); for (let t in e.propsOptions[0]) t in i || (i[t] = void 0); - n ? e.props = r ? i : /* @__PURE__ */ Cn(i) : e.type.props ? e.props = i : e.props = a, e.attrs = a; + n ? e.props = r ? i : /* @__PURE__ */ Nt(i) : e.type.props ? e.props = i : e.props = a, e.attrs = a; } -function zi(e, t, n, r) { +function Xr(e, t, n, r) { let { props: i, attrs: a, vnode: { patchFlag: o } } = e, s = /* @__PURE__ */ L(i), [c] = e.propsOptions, l = !1; if ((r || o > 0) && !(o & 16)) { if (o & 8) { let n = e.vnode.dynamicProps; for (let r = 0; r < n.length; r++) { let o = n[r]; - if (Di(e.emitsOptions, o)) continue; - let u = t[o]; - if (c) if (O(a, o)) u !== a[o] && (a[o] = u, l = !0); + if (Rr(e.emitsOptions, o)) continue; + let d = t[o]; + if (c) if (u(a, o)) d !== a[o] && (a[o] = d, l = !0); else { - let t = Re(o); - i[t] = Vi(c, s, t, u, e, !1); + let t = T(o); + i[t] = Qr(c, s, t, d, e, !1); } - else u !== a[o] && (a[o] = u, l = !0); + else d !== a[o] && (a[o] = d, l = !0); } } } else { - Bi(e, t, i, a) && (l = !0); + Zr(e, t, i, a) && (l = !0); let r; - for (let a in s) (!t || !O(t, a) && ((r = Be(a)) === a || !O(t, r))) && (c ? n && (n[a] !== void 0 || n[r] !== void 0) && (i[a] = Vi(c, s, a, void 0, e, !0)) : delete i[a]); - if (a !== s) for (let e in a) (!t || !O(t, e)) && (delete a[e], l = !0); + for (let a in s) (!t || !u(t, a) && ((r = E(a)) === a || !u(t, r))) && (c ? n && (n[a] !== void 0 || n[r] !== void 0) && (i[a] = Qr(c, s, a, void 0, e, !0)) : delete i[a]); + if (a !== s) for (let e in a) (!t || !u(t, e)) && (delete a[e], l = !0); } - l && Bt(e.attrs, "set", ""); + l && Ze(e.attrs, "set", ""); } -function Bi(e, t, n, r) { - let [i, a] = e.propsOptions, o = !1, s; - if (t) for (let c in t) { - if (Fe(c)) continue; - let l = t[c], u; - i && O(i, u = Re(c)) ? !a || !a.includes(u) ? n[u] = l : (s ||= {})[u] = l : Di(e.emitsOptions, c) || (!(c in r) || l !== r[c]) && (r[c] = l, o = !0); +function Zr(e, n, r, i) { + let [a, o] = e.propsOptions, s = !1, c; + if (n) for (let t in n) { + if (ee(t)) continue; + let l = n[t], d; + a && u(a, d = T(t)) ? !o || !o.includes(d) ? r[d] = l : (c ||= {})[d] = l : Rr(e.emitsOptions, t) || (!(t in i) || l !== i[t]) && (i[t] = l, s = !0); } - if (a) { - let t = /* @__PURE__ */ L(n), r = s || E; - for (let o = 0; o < a.length; o++) { - let s = a[o]; - n[s] = Vi(i, t, s, r[s], e, !O(r, s)); + if (o) { + let n = /* @__PURE__ */ L(r), i = c || t; + for (let t = 0; t < o.length; t++) { + let s = o[t]; + r[s] = Qr(a, n, s, i[s], e, !u(i, s)); } } - return o; + return s; } -function Vi(e, t, n, r, i, a) { +function Qr(e, t, n, r, i, a) { let o = e[n]; if (o != null) { - let e = O(o, "default"); + let e = u(o, "default"); if (e && r === void 0) { let e = o.default; - if (o.type !== Function && !o.skipFactory && A(e)) { + if (o.type !== Function && !o.skipFactory && h(e)) { let { propsDefaults: a } = i; if (n in a) r = a[n]; else { - let o = Va(i); + let o = $i(i); r = a[n] = e.call(null, t), o(); } } else r = e; i.ce && i.ce._setProp(n, r); } - o[0] && (a && !e ? r = !1 : o[1] && (r === "" || r === Be(n)) && (r = !0)); + o[0] && (a && !e ? r = !1 : o[1] && (r === "" || r === E(n)) && (r = !0)); } return r; } -var Hi = /* @__PURE__ */ new WeakMap(); -function Ui(e, t, n = !1) { - let r = n ? Hi : t.propsCache, i = r.get(e); - if (i) return i; - let a = e.props, o = {}, s = [], c = !1; - if (!A(e)) { - let r = (e) => { - c = !0; - let [n, r] = Ui(e, t, !0); - D(o, n), r && s.push(...r); +var $r = /* @__PURE__ */ new WeakMap(); +function ei(e, r, i = !1) { + let a = i ? $r : r.propsCache, o = a.get(e); + if (o) return o; + let c = e.props, l = {}, f = [], p = !1; + if (!h(e)) { + let t = (e) => { + p = !0; + let [t, n] = ei(e, r, !0); + s(l, t), n && f.push(...n); }; - !n && t.mixins.length && t.mixins.forEach(r), e.extends && r(e.extends), e.mixins && e.mixins.forEach(r); - } - if (!a && !c) return M(e) && r.set(e, ve), ve; - if (k(a)) for (let e = 0; e < a.length; e++) { - let t = Re(a[e]); - Wi(t) && (o[t] = E); - } - else if (a) for (let e in a) { - let t = Re(e); - if (Wi(t)) { - let n = a[e], r = o[t] = k(n) || A(n) ? { type: n } : D({}, n), i = r.type, c = !1, l = !0; - if (k(i)) for (let e = 0; e < i.length; ++e) { - let t = i[e], n = A(t) && t.name; + !i && r.mixins.length && r.mixins.forEach(t), e.extends && t(e.extends), e.mixins && e.mixins.forEach(t); + } + if (!c && !p) return v(e) && a.set(e, n), n; + if (d(c)) for (let e = 0; e < c.length; e++) { + let n = T(c[e]); + ti(n) && (l[n] = t); + } + else if (c) for (let e in c) { + let t = T(e); + if (ti(t)) { + let n = c[e], r = l[t] = d(n) || h(n) ? { type: n } : s({}, n), i = r.type, a = !1, o = !0; + if (d(i)) for (let e = 0; e < i.length; ++e) { + let t = i[e], n = h(t) && t.name; if (n === "Boolean") { - c = !0; + a = !0; break; - } else n === "String" && (l = !1); + } else n === "String" && (o = !1); } - else c = A(i) && i.name === "Boolean"; - r[0] = c, r[1] = l, (c || O(r, "default")) && s.push(t); + else a = h(i) && i.name === "Boolean"; + r[0] = a, r[1] = o, (a || u(r, "default")) && f.push(t); } } - let l = [o, s]; - return M(e) && r.set(e, l), l; + let m = [l, f]; + return v(e) && a.set(e, m), m; } -function Wi(e) { - return e[0] !== "$" && !Fe(e); +function ti(e) { + return e[0] !== "$" && !ee(e); } -var Gi = (e) => e === "_" || e === "_ctx" || e === "$stable", Ki = (e) => k(e) ? e.map(Aa) : [Aa(e)], qi = (e, t, n) => { +var ni = (e) => e === "_" || e === "_ctx" || e === "$stable", ri = (e) => d(e) ? e.map(Vi) : [Vi(e)], ii = (e, t, n) => { if (t._n) return t; - let r = pr((...e) => Ki(t(...e)), n); + let r = Tn((...e) => ri(t(...e)), n); return r._c = !1, r; -}, Ji = (e, t, n) => { +}, ai = (e, t, n) => { let r = e._ctx; for (let n in e) { - if (Gi(n)) continue; + if (ni(n)) continue; let i = e[n]; - if (A(i)) t[n] = qi(n, i, r); + if (h(i)) t[n] = ii(n, i, r); else if (i != null) { - let e = Ki(i); + let e = ri(i); t[n] = () => e; } } -}, Yi = (e, t) => { - let n = Ki(t); +}, oi = (e, t) => { + let n = ri(t); e.slots.default = () => n; -}, Xi = (e, t, n) => { - for (let r in t) (n || !Gi(r)) && (e[r] = t[r]); -}, Zi = (e, t, n) => { - let r = e.slots = Ii(); +}, si = (e, t, n) => { + for (let r in t) (n || !ni(r)) && (e[r] = t[r]); +}, ci = (e, t, n) => { + let r = e.slots = qr(); if (e.vnode.shapeFlag & 32) { let e = t._; - e ? (Xi(r, t, n), n && Ge(r, "_", e, !0)) : Ji(t, r); - } else t && Yi(e, t); -}, Qi = (e, t, n) => { - let { vnode: r, slots: i } = e, a = !0, o = E; - if (r.shapeFlag & 32) { - let e = t._; - e ? n && e === 1 ? a = !1 : Xi(i, t, n) : (a = !t.$stable, Ji(t, i)), o = t; - } else t && (Yi(e, t), o = { default: 1 }); - if (a) for (let e in i) !Gi(e) && o[e] == null && delete i[e]; -}, $i = da; -function ea(e) { - return ta(e); -} -function ta(e, t) { - let n = Ye(); - n.__VUE__ = !0; - let { insert: r, remove: i, patchProp: a, createElement: o, createText: s, createComment: c, setText: l, setElementText: u, parentNode: d, nextSibling: f, setScopeId: p = ye, insertStaticContent: m } = e, h = (e, t, n, r = null, i = null, a = null, o = void 0, s = null, c = !!t.dynamicChildren) => { + e ? (si(r, t, n), n && k(r, "_", e, !0)) : ai(t, r); + } else t && oi(e, t); +}, li = (e, n, r) => { + let { vnode: i, slots: a } = e, o = !0, s = t; + if (i.shapeFlag & 32) { + let e = n._; + e ? r && e === 1 ? o = !1 : si(a, n, r) : (o = !n.$stable, ai(n, a)), s = n; + } else n && (oi(e, n), s = { default: 1 }); + if (o) for (let e in a) !ni(e) && s[e] == null && delete a[e]; +}, ui = Si; +function di(e) { + return fi(e); +} +function fi(e, i) { + let a = j(); + a.__VUE__ = !0; + let { insert: o, remove: s, patchProp: c, createElement: l, createText: u, createComment: d, setText: f, setElementText: p, parentNode: m, nextSibling: h, setScopeId: g = r, insertStaticContent: _ } = e, v = (e, t, n, r = null, i = null, a = null, o = void 0, s = null, c = !!t.dynamicChildren) => { if (e === t) return; - e && !Ca(e, t) && (r = _e(e), T(e, i, a, !0), e = null), t.patchFlag === -2 && (c = !1, t.dynamicChildren = null); + e && !Pi(e, t) && (r = ge(e), fe(e, i, a, !0), e = null), t.patchFlag === -2 && (c = !1, t.dynamicChildren = null); let { type: l, ref: u, shapeFlag: d } = t; switch (l) { - case fa: - g(e, t, n, r); + case Ci: + y(e, t, n, r); break; - case pa: - _(e, t, n, r); + case wi: + b(e, t, n, r); break; - case ma: - e ?? v(t, n, r, o); + case Ti: + e ?? x(t, n, r, o); break; case U: - oe(e, t, n, r, i, a, o, s, c); + ie(e, t, n, r, i, a, o, s, c); break; - default: d & 1 ? te(e, t, n, r, i, a, o, s, c) : d & 6 ? se(e, t, n, r, i, a, o, s, c) : (d & 64 || d & 128) && l.process(e, t, n, r, i, a, o, s, c, Se); + default: d & 1 ? w(e, t, n, r, i, a, o, s, c) : d & 6 ? O(e, t, n, r, i, a, o, s, c) : (d & 64 || d & 128) && l.process(e, t, n, r, i, a, o, s, c, ye); } - u != null && i ? Mr(u, e && e.ref, a, t || e, !t) : u == null && e && e.ref != null && Mr(e.ref, null, a, e, !0); - }, g = (e, t, n, i) => { - if (e == null) r(t.el = s(t.children), n, i); + u != null && i ? Un(u, e && e.ref, a, t || e, !t) : u == null && e && e.ref != null && Un(e.ref, null, a, e, !0); + }, y = (e, t, n, r) => { + if (e == null) o(t.el = u(t.children), n, r); else { let n = t.el = e.el; - t.children !== e.children && l(n, t.children); - } - }, _ = (e, t, n, i) => { - e == null ? r(t.el = c(t.children || ""), n, i) : t.el = e.el; - }, v = (e, t, n, r) => { - [e.el, e.anchor] = m(e.children, t, n, r, e.el, e.anchor); - }, y = ({ el: e, anchor: t }, n, i) => { - let a; - for (; e && e !== t;) a = f(e), r(e, n, i), e = a; - r(t, n, i); - }, ee = ({ el: e, anchor: t }) => { + t.children !== e.children && f(n, t.children); + } + }, b = (e, t, n, r) => { + e == null ? o(t.el = d(t.children || ""), n, r) : t.el = e.el; + }, x = (e, t, n, r) => { + [e.el, e.anchor] = _(e.children, t, n, r, e.el, e.anchor); + }, S = ({ el: e, anchor: t }, n, r) => { + let i; + for (; e && e !== t;) i = h(e), o(e, n, r), e = i; + o(t, n, r); + }, C = ({ el: e, anchor: t }) => { let n; - for (; e && e !== t;) n = f(e), i(e), e = n; - i(t); - }, te = (e, t, n, r, i, a, o, s, c) => { - if (t.type === "svg" ? o = "svg" : t.type === "math" && (o = "mathml"), e == null) ne(t, n, r, i, a, o, s, c); + for (; e && e !== t;) n = h(e), s(e), e = n; + s(t); + }, w = (e, t, n, r, i, a, o, s, c) => { + if (t.type === "svg" ? o = "svg" : t.type === "math" && (o = "mathml"), e == null) te(t, n, r, i, a, o, s, c); else { let n = e.el && e.el._isVueCE ? e.el : null; try { - n && n._beginPatch(), ie(e, t, i, a, o, s, c); + n && n._beginPatch(), re(e, t, i, a, o, s, c); } finally { n && n._endPatch(); } } - }, ne = (e, t, n, i, s, c, l, d) => { - let f, p, { props: m, shapeFlag: h, transition: g, dirs: _ } = e; - if (f = e.el = o(e.type, c, m && m.is, m), h & 8 ? u(f, e.children) : h & 16 && re(e.children, f, null, i, s, na(e, c), l, d), _ && hr(e, null, i, "created"), b(f, e, e.scopeId, l, i), m) { - for (let e in m) e !== "value" && !Fe(e) && a(f, e, null, m[e], c, i); - "value" in m && a(f, "value", null, m.value, c), (p = m.onVnodeBeforeMount) && Pa(p, i, e); + }, te = (e, t, n, r, i, a, s, u) => { + let d, f, { props: m, shapeFlag: h, transition: g, dirs: _ } = e; + if (d = e.el = l(e.type, a, m && m.is, m), h & 8 ? p(d, e.children) : h & 16 && T(e.children, d, null, r, i, pi(e, a), s, u), _ && Dn(e, null, r, "created"), ne(d, e, e.scopeId, s, r), m) { + for (let e in m) e !== "value" && !ee(e) && c(d, e, null, m[e], a, r); + "value" in m && c(d, "value", null, m.value, a), (f = m.onVnodeBeforeMount) && Gi(f, r, e); } - _ && hr(e, null, i, "beforeMount"); - let v = ia(s, g); - v && g.beforeEnter(f), r(f, t, n), ((p = m && m.onVnodeMounted) || v || _) && $i(() => { + _ && Dn(e, null, r, "beforeMount"); + let v = hi(i, g); + v && g.beforeEnter(d), o(d, t, n), ((f = m && m.onVnodeMounted) || v || _) && ui(() => { try { - p && Pa(p, i, e), v && g.enter(f), _ && hr(e, null, i, "mounted"); + f && Gi(f, r, e), v && g.enter(d), _ && Dn(e, null, r, "mounted"); } finally {} - }, s); - }, b = (e, t, n, r, i) => { - if (n && p(e, n), r) for (let t = 0; t < r.length; t++) p(e, r[t]); + }, i); + }, ne = (e, t, n, r, i) => { + if (n && g(e, n), r) for (let t = 0; t < r.length; t++) g(e, r[t]); if (i) { let n = i.subTree; - if (t === n || ua(n.type) && (n.ssContent === t || n.ssFallback === t)) { + if (t === n || xi(n.type) && (n.ssContent === t || n.ssFallback === t)) { let t = i.vnode; - b(e, t, t.scopeId, t.slotScopeIds, i.parent); + ne(e, t, t.scopeId, t.slotScopeIds, i.parent); } } - }, re = (e, t, n, r, i, a, o, s, c = 0) => { - for (let l = c; l < e.length; l++) h(null, e[l] = s ? ja(e[l]) : Aa(e[l]), t, n, r, i, a, o, s); - }, ie = (e, t, n, r, i, o, s) => { - let c = t.el = e.el, { patchFlag: l, dynamicChildren: d, dirs: f } = t; - l |= e.patchFlag & 16; - let p = e.props || E, m = t.props || E, h; - if (n && ra(n, !1), (h = m.onVnodeBeforeUpdate) && Pa(h, n, t, e), f && hr(t, e, n, "beforeUpdate"), n && ra(n, !0), (p.innerHTML && m.innerHTML == null || p.textContent && m.textContent == null) && u(c, ""), d ? x(e.dynamicChildren, d, c, n, r, na(t, i), o) : s || de(e, t, c, null, n, r, na(t, i), o, !1), l > 0) { - if (l & 16) ae(c, p, m, n, i); - else if (l & 2 && p.class !== m.class && a(c, "class", null, m.class, i), l & 4 && a(c, "style", p.style, m.style, i), l & 8) { - let e = t.dynamicProps; + }, T = (e, t, n, r, i, a, o, s, c = 0) => { + for (let l = c; l < e.length; l++) v(null, e[l] = s ? Hi(e[l]) : Vi(e[l]), t, n, r, i, a, o, s); + }, re = (e, n, r, i, a, o, s) => { + let l = n.el = e.el, { patchFlag: u, dynamicChildren: d, dirs: f } = n; + u |= e.patchFlag & 16; + let m = e.props || t, h = n.props || t, g; + if (r && mi(r, !1), (g = h.onVnodeBeforeUpdate) && Gi(g, r, n, e), f && Dn(n, e, r, "beforeUpdate"), r && mi(r, !0), (m.innerHTML && h.innerHTML == null || m.textContent && h.textContent == null) && p(l, ""), d ? E(e.dynamicChildren, d, l, r, i, pi(n, a), o) : s || ce(e, n, l, null, r, i, pi(n, a), o, !1), u > 0) { + if (u & 16) D(l, m, h, r, a); + else if (u & 2 && m.class !== h.class && c(l, "class", null, h.class, a), u & 4 && c(l, "style", m.style, h.style, a), u & 8) { + let e = n.dynamicProps; for (let t = 0; t < e.length; t++) { - let r = e[t], o = p[r], s = m[r]; - (s !== o || r === "value") && a(c, r, o, s, i, n); + let n = e[t], i = m[n], o = h[n]; + (o !== i || n === "value") && c(l, n, i, o, a, r); } } - l & 1 && e.children !== t.children && u(c, t.children); - } else !s && d == null && ae(c, p, m, n, i); - ((h = m.onVnodeUpdated) || f) && $i(() => { - h && Pa(h, n, t, e), f && hr(t, e, n, "updated"); - }, r); - }, x = (e, t, n, r, i, a, o) => { + u & 1 && e.children !== n.children && p(l, n.children); + } else !s && d == null && D(l, m, h, r, a); + ((g = h.onVnodeUpdated) || f) && ui(() => { + g && Gi(g, r, n, e), f && Dn(n, e, r, "updated"); + }, i); + }, E = (e, t, n, r, i, a, o) => { for (let s = 0; s < t.length; s++) { let c = e[s], l = t[s]; - h(c, l, c.el && (c.type === U || !Ca(c, l) || c.shapeFlag & 198) ? d(c.el) : n, null, r, i, a, o, !0); - } - }, ae = (e, t, n, r, i) => { - if (t !== n) { - if (t !== E) for (let o in t) !Fe(o) && !(o in n) && a(e, o, t[o], null, i, r); - for (let o in n) { - if (Fe(o)) continue; - let s = n[o], c = t[o]; - s !== c && o !== "value" && a(e, o, c, s, i, r); + v(c, l, c.el && (c.type === U || !Pi(c, l) || c.shapeFlag & 198) ? m(c.el) : n, null, r, i, a, o, !0); + } + }, D = (e, n, r, i, a) => { + if (n !== r) { + if (n !== t) for (let t in n) !ee(t) && !(t in r) && c(e, t, n[t], null, a, i); + for (let t in r) { + if (ee(t)) continue; + let o = r[t], s = n[t]; + o !== s && t !== "value" && c(e, t, s, o, a, i); } - "value" in n && a(e, "value", t.value, n.value, i); - } - }, oe = (e, t, n, i, a, o, c, l, u) => { - let d = t.el = e ? e.el : s(""), f = t.anchor = e ? e.anchor : s(""), { patchFlag: p, dynamicChildren: m, slotScopeIds: h } = t; - h && (l = l ? l.concat(h) : h), e == null ? (r(d, n, i), r(f, n, i), re(t.children || [], n, f, a, o, c, l, u)) : p > 0 && p & 64 && m && e.dynamicChildren && e.dynamicChildren.length === m.length ? (x(e.dynamicChildren, m, n, a, o, c, l), (t.key != null || a && t === a.subTree) && aa(e, t, !0)) : de(e, t, n, f, a, o, c, l, u); - }, se = (e, t, n, r, i, a, o, s, c) => { - t.slotScopeIds = s, e == null ? t.shapeFlag & 512 ? i.ctx.activate(t, n, r, o, c) : ce(t, n, r, i, a, o, c) : S(e, t, c); - }, ce = (e, t, n, r, i, a, o) => { - let s = e.component = La(e, r, i); - if (Fr(e) && (s.ctx.renderer = Se), Ga(s, !1, o), s.asyncDep) { - if (i && i.registerDep(s, le, o), !e.el) { - let r = s.subTree = Ea(pa); - _(null, r, t, n), e.placeholder = r.el; + "value" in r && c(e, "value", n.value, r.value, a); + } + }, ie = (e, t, n, r, i, a, s, c, l) => { + let d = t.el = e ? e.el : u(""), f = t.anchor = e ? e.anchor : u(""), { patchFlag: p, dynamicChildren: m, slotScopeIds: h } = t; + h && (c = c ? c.concat(h) : h), e == null ? (o(d, n, r), o(f, n, r), T(t.children || [], n, f, i, a, s, c, l)) : p > 0 && p & 64 && m && e.dynamicChildren && e.dynamicChildren.length === m.length ? (E(e.dynamicChildren, m, n, i, a, s, c), (t.key != null || i && t === i.subTree) && gi(e, t, !0)) : ce(e, t, n, f, i, a, s, c, l); + }, O = (e, t, n, r, i, a, o, s, c) => { + t.slotScopeIds = s, e == null ? t.shapeFlag & 512 ? i.ctx.activate(t, n, r, o, c) : k(t, n, r, i, a, o, c) : oe(e, t, c); + }, k = (e, t, n, r, i, a, o) => { + let s = e.component = Ji(e, r, i); + if (Kn(e) && (s.ctx.renderer = ye), ra(s, !1, o), s.asyncDep) { + if (i && i.registerDep(s, se, o), !e.el) { + let r = s.subTree = Li(wi); + b(null, r, t, n), e.placeholder = r.el; } - } else le(s, e, t, n, i, a, o); - }, S = (e, t, n) => { + } else se(s, e, t, n, i, a, o); + }, oe = (e, t, n) => { let r = t.component = e.component; - if (ji(e, t, n)) if (r.asyncDep && !r.asyncResolved) { - ue(r, t, n); + if (Hr(e, t, n)) if (r.asyncDep && !r.asyncResolved) { + A(r, t, n); return; } else r.next = t, r.update(); else t.el = e.el, r.vnode = t; - }, le = (e, t, n, r, i, a, o) => { + }, se = (e, t, n, r, i, a, o) => { let s = () => { if (e.isMounted) { let { next: t, bu: n, u: r, parent: s, vnode: c } = e; { - let n = sa(e); + let n = vi(e); if (n) { - t && (t.el = c.el, ue(e, t, o)), n.asyncDep.then(() => { - $i(() => { + t && (t.el = c.el, A(e, t, o)), n.asyncDep.then(() => { + ui(() => { e.isUnmounted || l(); }, i); }); return; } } - let u = t, f; - ra(e, !1), t ? (t.el = c.el, ue(e, t, o)) : t = c, n && We(n), (f = t.props && t.props.onVnodeBeforeUpdate) && Pa(f, s, t, c), ra(e, !0); - let p = Oi(e), m = e.subTree; - e.subTree = p, h(m, p, d(m.el), _e(m), e, i, a), t.el = p.el, u === null && Pi(e, p.el), r && $i(r, i), (f = t.props && t.props.onVnodeUpdated) && $i(() => Pa(f, s, t, c), i); + let u = t, d; + mi(e, !1), t ? (t.el = c.el, A(e, t, o)) : t = c, n && ae(n), (d = t.props && t.props.onVnodeBeforeUpdate) && Gi(d, s, t, c), mi(e, !0); + let f = zr(e), p = e.subTree; + e.subTree = f, v(p, f, m(p.el), ge(p), e, i, a), t.el = f.el, u === null && Gr(e, f.el), r && ui(r, i), (d = t.props && t.props.onVnodeUpdated) && ui(() => Gi(d, s, t, c), i); } else { - let o, { el: s, props: c } = t, { bm: l, m: u, parent: d, root: f, type: p } = e, m = Pr(t); - if (ra(e, !1), l && We(l), !m && (o = c && c.onVnodeBeforeMount) && Pa(o, d, t), ra(e, !0), s && Ce) { + let o, { el: s, props: c } = t, { bm: l, m: u, parent: d, root: f, type: p } = e, m = Gn(t); + if (mi(e, !1), l && ae(l), !m && (o = c && c.onVnodeBeforeMount) && Gi(o, d, t), mi(e, !0), s && be) { let t = () => { - e.subTree = Oi(e), Ce(s, e.subTree, e, i, null); + e.subTree = zr(e), be(s, e.subTree, e, i, null); }; m && p.__asyncHydrate ? p.__asyncHydrate(s, e, t) : t(); } else { f.ce && f.ce._hasShadowRoot() && f.ce._injectChildStyle(p, e.parent ? e.parent.type : void 0); - let o = e.subTree = Oi(e); - h(null, o, n, r, e, i, a), t.el = o.el; + let o = e.subTree = zr(e); + v(null, o, n, r, e, i, a), t.el = o.el; } - if (u && $i(u, i), !m && (o = c && c.onVnodeMounted)) { + if (u && ui(u, i), !m && (o = c && c.onVnodeMounted)) { let e = t; - $i(() => Pa(o, d, e), i); + ui(() => Gi(o, d, e), i); } - (t.shapeFlag & 256 || d && Pr(d.vnode) && d.vnode.shapeFlag & 256) && e.a && $i(e.a, i), e.isMounted = !0, t = n = r = null; + (t.shapeFlag & 256 || d && Gn(d.vnode) && d.vnode.shapeFlag & 256) && e.a && ui(e.a, i), e.isMounted = !0, t = n = r = null; } }; e.scope.on(); - let c = e.effect = new mt(s); + let c = e.effect = new Te(s); e.scope.off(); let l = e.update = c.run.bind(c), u = e.job = c.runIfDirty.bind(c); - u.i = e, u.id = e.uid, c.scheduler = () => rr(u), ra(e, !0), l(); - }, ue = (e, t, n) => { + u.i = e, u.id = e.uid, c.scheduler = () => hn(u), mi(e, !0), l(); + }, A = (e, t, n) => { t.component = e; let r = e.vnode.props; - e.vnode = t, e.next = null, zi(e, t.props, r, n), Qi(e, t.children, n), kt(), or(e), At(); - }, de = (e, t, n, r, i, a, o, s, c = !1) => { - let l = e && e.children, d = e ? e.shapeFlag : 0, f = t.children, { patchFlag: p, shapeFlag: m } = t; - if (p > 0) { - if (p & 128) { - C(l, f, n, r, i, a, o, s, c); + e.vnode = t, e.next = null, Xr(e, t.props, r, n), li(e, t.children, n), Be(), vn(e), Ve(); + }, ce = (e, t, n, r, i, a, o, s, c = !1) => { + let l = e && e.children, u = e ? e.shapeFlag : 0, d = t.children, { patchFlag: f, shapeFlag: m } = t; + if (f > 0) { + if (f & 128) { + ue(l, d, n, r, i, a, o, s, c); return; - } else if (p & 256) { - fe(l, f, n, r, i, a, o, s, c); + } else if (f & 256) { + le(l, d, n, r, i, a, o, s, c); return; } } - m & 8 ? (d & 16 && ge(l, i, a), f !== l && u(n, f)) : d & 16 ? m & 16 ? C(l, f, n, r, i, a, o, s, c) : ge(l, i, a, !0) : (d & 8 && u(n, ""), m & 16 && re(f, n, r, i, a, o, s, c)); - }, fe = (e, t, n, r, i, a, o, s, c) => { - e ||= ve, t ||= ve; - let l = e.length, u = t.length, d = Math.min(l, u), f; - for (f = 0; f < d; f++) { - let r = t[f] = c ? ja(t[f]) : Aa(t[f]); - h(e[f], r, n, null, i, a, o, s, c); - } - l > u ? ge(e, i, a, !0, !1, d) : re(t, n, r, i, a, o, s, c, d); - }, C = (e, t, n, r, i, a, o, s, c) => { - let l = 0, u = t.length, d = e.length - 1, f = u - 1; - for (; l <= d && l <= f;) { - let r = e[l], u = t[l] = c ? ja(t[l]) : Aa(t[l]); - if (Ca(r, u)) h(r, u, n, null, i, a, o, s, c); + m & 8 ? (u & 16 && he(l, i, a), d !== l && p(n, d)) : u & 16 ? m & 16 ? ue(l, d, n, r, i, a, o, s, c) : he(l, i, a, !0) : (u & 8 && p(n, ""), m & 16 && T(d, n, r, i, a, o, s, c)); + }, le = (e, t, r, i, a, o, s, c, l) => { + e ||= n, t ||= n; + let u = e.length, d = t.length, f = Math.min(u, d), p; + for (p = 0; p < f; p++) { + let n = t[p] = l ? Hi(t[p]) : Vi(t[p]); + v(e[p], n, r, null, a, o, s, c, l); + } + u > d ? he(e, a, o, !0, !1, f) : T(t, r, i, a, o, s, c, l, f); + }, ue = (e, t, r, i, a, o, s, c, l) => { + let u = 0, d = t.length, f = e.length - 1, p = d - 1; + for (; u <= f && u <= p;) { + let n = e[u], i = t[u] = l ? Hi(t[u]) : Vi(t[u]); + if (Pi(n, i)) v(n, i, r, null, a, o, s, c, l); else break; - l++; + u++; } - for (; l <= d && l <= f;) { - let r = e[d], l = t[f] = c ? ja(t[f]) : Aa(t[f]); - if (Ca(r, l)) h(r, l, n, null, i, a, o, s, c); + for (; u <= f && u <= p;) { + let n = e[f], i = t[p] = l ? Hi(t[p]) : Vi(t[p]); + if (Pi(n, i)) v(n, i, r, null, a, o, s, c, l); else break; - d--, f--; + f--, p--; } - if (l > d) { - if (l <= f) { - let e = f + 1, d = e < u ? t[e].el : r; - for (; l <= f;) h(null, t[l] = c ? ja(t[l]) : Aa(t[l]), n, d, i, a, o, s, c), l++; + if (u > f) { + if (u <= p) { + let e = p + 1, n = e < d ? t[e].el : i; + for (; u <= p;) v(null, t[u] = l ? Hi(t[u]) : Vi(t[u]), r, n, a, o, s, c, l), u++; } - } else if (l > f) for (; l <= d;) T(e[l], i, a, !0), l++; + } else if (u > p) for (; u <= f;) fe(e[u], a, o, !0), u++; else { - let p = l, m = l, g = /* @__PURE__ */ new Map(); - for (l = m; l <= f; l++) { - let e = t[l] = c ? ja(t[l]) : Aa(t[l]); - e.key != null && g.set(e.key, l); + let m = u, h = u, g = /* @__PURE__ */ new Map(); + for (u = h; u <= p; u++) { + let e = t[u] = l ? Hi(t[u]) : Vi(t[u]); + e.key != null && g.set(e.key, u); } - let _, v = 0, y = f - m + 1, ee = !1, te = 0, ne = Array(y); - for (l = 0; l < y; l++) ne[l] = 0; - for (l = p; l <= d; l++) { - let r = e[l]; - if (v >= y) { - T(r, i, a, !0); + let _, y = 0, b = p - h + 1, x = !1, S = 0, C = Array(b); + for (u = 0; u < b; u++) C[u] = 0; + for (u = m; u <= f; u++) { + let n = e[u]; + if (y >= b) { + fe(n, a, o, !0); continue; } - let u; - if (r.key != null) u = g.get(r.key); - else for (_ = m; _ <= f; _++) if (ne[_ - m] === 0 && Ca(r, t[_])) { - u = _; + let i; + if (n.key != null) i = g.get(n.key); + else for (_ = h; _ <= p; _++) if (C[_ - h] === 0 && Pi(n, t[_])) { + i = _; break; } - u === void 0 ? T(r, i, a, !0) : (ne[u - m] = l + 1, u >= te ? te = u : ee = !0, h(r, t[u], n, null, i, a, o, s, c), v++); + i === void 0 ? fe(n, a, o, !0) : (C[i - h] = u + 1, i >= S ? S = i : x = !0, v(n, t[i], r, null, a, o, s, c, l), y++); } - let b = ee ? oa(ne) : ve; - for (_ = b.length - 1, l = y - 1; l >= 0; l--) { - let e = m + l, d = t[e], f = t[e + 1], p = e + 1 < u ? f.el || la(f) : r; - ne[l] === 0 ? h(null, d, n, p, i, a, o, s, c) : ee && (_ < 0 || l !== b[_] ? w(d, n, p, 2) : _--); + let w = x ? _i(C) : n; + for (_ = w.length - 1, u = b - 1; u >= 0; u--) { + let e = h + u, n = t[e], f = t[e + 1], p = e + 1 < d ? f.el || bi(f) : i; + C[u] === 0 ? v(null, n, r, p, a, o, s, c, l) : x && (_ < 0 || u !== w[_] ? de(n, r, p, 2) : _--); } } - }, w = (e, t, n, a, o = null) => { - let { el: s, type: c, transition: l, children: u, shapeFlag: d } = e; + }, de = (e, t, n, r, i = null) => { + let { el: a, type: c, transition: l, children: u, shapeFlag: d } = e; if (d & 6) { - w(e.component.subTree, t, n, a); + de(e.component.subTree, t, n, r); return; } if (d & 128) { - e.suspense.move(t, n, a); + e.suspense.move(t, n, r); return; } if (d & 64) { - c.move(e, t, n, Se); + c.move(e, t, n, ye); return; } if (c === U) { - r(s, t, n); - for (let e = 0; e < u.length; e++) w(u[e], t, n, a); - r(e.anchor, t, n); + o(a, t, n); + for (let e = 0; e < u.length; e++) de(u[e], t, n, r); + o(e.anchor, t, n); return; } - if (c === ma) { - y(e, t, n); + if (c === Ti) { + S(e, t, n); return; } - if (a !== 2 && d & 1 && l) if (a === 0) l.beforeEnter(s), r(s, t, n), $i(() => l.enter(s), o); + if (r !== 2 && d & 1 && l) if (r === 0) l.beforeEnter(a), o(a, t, n), ui(() => l.enter(a), i); else { - let { leave: a, delayLeave: o, afterLeave: c } = l, u = () => { - e.ctx.isUnmounted ? i(s) : r(s, t, n); + let { leave: r, delayLeave: i, afterLeave: c } = l, u = () => { + e.ctx.isUnmounted ? s(a) : o(a, t, n); }, d = () => { - s._isLeaving && s[Er](!0), a(s, () => { + a._isLeaving && a[Ln](!0), r(a, () => { u(), c && c(); }); }; - o ? o(s, u, d) : d(); + i ? i(a, u, d) : d(); } - else r(s, t, n); - }, T = (e, t, n, r = !1, i = !1) => { + else o(a, t, n); + }, fe = (e, t, n, r = !1, i = !1) => { let { type: a, props: o, ref: s, children: c, dynamicChildren: l, shapeFlag: u, patchFlag: d, dirs: f, cacheIndex: p, memo: m } = e; - if (d === -2 && (i = !1), s != null && (kt(), Mr(s, null, n, e, !0), At()), p != null && (t.renderCache[p] = void 0), u & 256) { + if (d === -2 && (i = !1), s != null && (Be(), Un(s, null, n, e, !0), Ve()), p != null && (t.renderCache[p] = void 0), u & 256) { t.ctx.deactivate(e); return; } - let h = u & 1 && f, g = !Pr(e), _; - if (g && (_ = o && o.onVnodeBeforeUnmount) && Pa(_, t, e), u & 6) he(e.component, n, r); + let h = u & 1 && f, g = !Gn(e), _; + if (g && (_ = o && o.onVnodeBeforeUnmount) && Gi(_, t, e), u & 6) me(e.component, n, r); else { if (u & 128) { e.suspense.unmount(n, r); return; } - h && hr(e, null, t, "beforeUnmount"), u & 64 ? e.type.remove(e, t, n, Se, r) : l && !l.hasOnce && (a !== U || d > 0 && d & 64) ? ge(l, t, n, !1, !0) : (a === U && d & 384 || !i && u & 16) && ge(c, t, n), r && pe(e); + h && Dn(e, null, t, "beforeUnmount"), u & 64 ? e.type.remove(e, t, n, ye, r) : l && !l.hasOnce && (a !== U || d > 0 && d & 64) ? he(l, t, n, !1, !0) : (a === U && d & 384 || !i && u & 16) && he(c, t, n), r && M(e); } let v = m != null && p == null; - (g && (_ = o && o.onVnodeUnmounted) || h || v) && $i(() => { - _ && Pa(_, t, e), h && hr(e, null, t, "unmounted"), v && (e.el = null); + (g && (_ = o && o.onVnodeUnmounted) || h || v) && ui(() => { + _ && Gi(_, t, e), h && Dn(e, null, t, "unmounted"), v && (e.el = null); }, n); - }, pe = (e) => { - let { type: t, el: n, anchor: r, transition: a } = e; + }, M = (e) => { + let { type: t, el: n, anchor: r, transition: i } = e; if (t === U) { - me(n, r); + pe(n, r); return; } - if (t === ma) { - ee(e); + if (t === Ti) { + C(e); return; } - let o = () => { - i(n), a && !a.persisted && a.afterLeave && a.afterLeave(); + let a = () => { + s(n), i && !i.persisted && i.afterLeave && i.afterLeave(); }; - if (e.shapeFlag & 1 && a && !a.persisted) { - let { leave: t, delayLeave: r } = a, i = () => t(n, o); - r ? r(e.el, o, i) : i(); - } else o(); - }, me = (e, t) => { + if (e.shapeFlag & 1 && i && !i.persisted) { + let { leave: t, delayLeave: r } = i, o = () => t(n, a); + r ? r(e.el, a, o) : o(); + } else a(); + }, pe = (e, t) => { let n; - for (; e !== t;) n = f(e), i(e), e = n; - i(t); - }, he = (e, t, n) => { + for (; e !== t;) n = h(e), s(e), e = n; + s(t); + }, me = (e, t, n) => { let { bum: r, scope: i, job: a, subTree: o, um: s, m: c, a: l } = e; - ca(c), ca(l), r && We(r), i.stop(), a && (a.flags |= 8, T(o, e, t, n)), s && $i(s, t), $i(() => { + yi(c), yi(l), r && ae(r), i.stop(), a && (a.flags |= 8, fe(o, e, t, n)), s && ui(s, t), ui(() => { e.isUnmounted = !0; }, t); - }, ge = (e, t, n, r = !1, i = !1, a = 0) => { - for (let o = a; o < e.length; o++) T(e[o], t, n, r, i); - }, _e = (e) => { - if (e.shapeFlag & 6) return _e(e.component.subTree); + }, he = (e, t, n, r = !1, i = !1, a = 0) => { + for (let o = a; o < e.length; o++) fe(e[o], t, n, r, i); + }, ge = (e) => { + if (e.shapeFlag & 6) return ge(e.component.subTree); if (e.shapeFlag & 128) return e.suspense.next(); - let t = f(e.anchor || e.el), n = t && t[wr]; - return n ? f(n) : t; - }, be = !1, xe = (e, t, n) => { + let t = h(e.anchor || e.el), n = t && t[Fn]; + return n ? h(n) : t; + }, _e = !1, ve = (e, t, n) => { let r; - e == null ? t._vnode && (T(t._vnode, null, null, !0), r = t._vnode.component) : h(t._vnode || null, e, t, null, null, null, n), t._vnode = e, be ||= (be = !0, or(r), sr(), !1); - }, Se = { - p: h, - um: T, - m: w, - r: pe, - mt: ce, - mc: re, - pc: de, - pbc: x, - n: _e, + e == null ? t._vnode && (fe(t._vnode, null, null, !0), r = t._vnode.component) : v(t._vnode || null, e, t, null, null, null, n), t._vnode = e, _e ||= (_e = !0, vn(r), yn(), !1); + }, ye = { + p: v, + um: fe, + m: de, + r: M, + mt: k, + mc: T, + pc: ce, + pbc: E, + n: ge, o: e - }, D, Ce; - return t && ([D, Ce] = t(Se)), { - render: xe, - hydrate: D, - createApp: xi(xe, D) + }, N, be; + return i && ([N, be] = i(ye)), { + render: ve, + hydrate: N, + createApp: Mr(ve, N) }; } -function na({ type: e, props: t }, n) { +function pi({ type: e, props: t }, n) { return n === "svg" && e === "foreignObject" || n === "mathml" && e === "annotation-xml" && t && t.encoding && t.encoding.includes("html") ? void 0 : n; } -function ra({ effect: e, job: t }, n) { +function mi({ effect: e, job: t }, n) { n ? (e.flags |= 32, t.flags |= 4) : (e.flags &= -33, t.flags &= -5); } -function ia(e, t) { +function hi(e, t) { return (!e || e && !e.pendingBranch) && t && !t.persisted; } -function aa(e, t, n = !1) { +function gi(e, t, n = !1) { let r = e.children, i = t.children; - if (k(r) && k(i)) for (let e = 0; e < r.length; e++) { + if (d(r) && d(i)) for (let e = 0; e < r.length; e++) { let t = r[e], a = i[e]; - a.shapeFlag & 1 && !a.dynamicChildren && ((a.patchFlag <= 0 || a.patchFlag === 32) && (a = i[e] = ja(i[e]), a.el = t.el), !n && a.patchFlag !== -2 && aa(t, a)), a.type === fa && (a.patchFlag === -1 && (a = i[e] = ja(a)), a.el = t.el), a.type === pa && !a.el && (a.el = t.el); + a.shapeFlag & 1 && !a.dynamicChildren && ((a.patchFlag <= 0 || a.patchFlag === 32) && (a = i[e] = Hi(i[e]), a.el = t.el), !n && a.patchFlag !== -2 && gi(t, a)), a.type === Ci && (a.patchFlag === -1 && (a = i[e] = Hi(a)), a.el = t.el), a.type === wi && !a.el && (a.el = t.el); } } -function oa(e) { +function _i(e) { let t = e.slice(), n = [0], r, i, a, o, s, c = e.length; for (r = 0; r < c; r++) { let c = e[r]; @@ -2452,50 +2124,50 @@ function oa(e) { for (a = n.length, o = n[a - 1]; a-- > 0;) n[a] = o, o = t[o]; return n; } -function sa(e) { +function vi(e) { let t = e.subTree.component; - if (t) return t.asyncDep && !t.asyncResolved ? t : sa(t); + if (t) return t.asyncDep && !t.asyncResolved ? t : vi(t); } -function ca(e) { +function yi(e) { if (e) for (let t = 0; t < e.length; t++) e[t].flags |= 8; } -function la(e) { +function bi(e) { if (e.placeholder) return e.placeholder; let t = e.component; - return t ? la(t.subTree) : null; + return t ? bi(t.subTree) : null; } -var ua = (e) => e.__isSuspense; -function da(e, t) { - t && t.pendingBranch ? k(e) ? t.effects.push(...e) : t.effects.push(e) : ar(e); +var xi = (e) => e.__isSuspense; +function Si(e, t) { + t && t.pendingBranch ? d(e) ? t.effects.push(...e) : t.effects.push(e) : _n(e); } -var U = /* @__PURE__ */ Symbol.for("v-fgt"), fa = /* @__PURE__ */ Symbol.for("v-txt"), pa = /* @__PURE__ */ Symbol.for("v-cmt"), ma = /* @__PURE__ */ Symbol.for("v-stc"), ha = [], ga = null; +var U = /* @__PURE__ */ Symbol.for("v-fgt"), Ci = /* @__PURE__ */ Symbol.for("v-txt"), wi = /* @__PURE__ */ Symbol.for("v-cmt"), Ti = /* @__PURE__ */ Symbol.for("v-stc"), Ei = [], Di = null; function W(e = !1) { - ha.push(ga = e ? null : []); + Ei.push(Di = e ? null : []); } -function _a() { - ha.pop(), ga = ha[ha.length - 1] || null; +function Oi() { + Ei.pop(), Di = Ei[Ei.length - 1] || null; } -var va = 1; -function ya(e, t = !1) { - va += e, e < 0 && ga && t && (ga.hasOnce = !0); +var ki = 1; +function Ai(e, t = !1) { + ki += e, e < 0 && Di && t && (Di.hasOnce = !0); } -function ba(e) { - return e.dynamicChildren = va > 0 ? ga || ve : null, _a(), va > 0 && ga && ga.push(e), e; +function ji(e) { + return e.dynamicChildren = ki > 0 ? Di || n : null, Oi(), ki > 0 && Di && Di.push(e), e; } function G(e, t, n, r, i, a) { - return ba(K(e, t, n, r, i, a, !0)); + return ji(K(e, t, n, r, i, a, !0)); } -function xa(e, t, n, r, i) { - return ba(Ea(e, t, n, r, i, !0)); +function Mi(e, t, n, r, i) { + return ji(Li(e, t, n, r, i, !0)); } -function Sa(e) { +function Ni(e) { return e ? e.__v_isVNode === !0 : !1; } -function Ca(e, t) { +function Pi(e, t) { return e.type === t.type && e.key === t.key; } -var wa = ({ key: e }) => e ?? null, Ta = ({ ref: e, ref_key: t, ref_for: n }) => (typeof e == "number" && (e = "" + e), e == null ? null : j(e) || /* @__PURE__ */ R(e) || A(e) ? { - i: ur, +var Fi = ({ key: e }) => e ?? null, Ii = ({ ref: e, ref_key: t, ref_for: n }) => (typeof e == "number" && (e = "" + e), e == null ? null : g(e) || /* @__PURE__ */ R(e) || h(e) ? { + i: Sn, r: e, k: t, f: !!n @@ -2506,9 +2178,9 @@ function K(e, t = null, n = null, r = 0, i = null, a = e === U ? 0 : 1, o = !1, __v_skip: !0, type: e, props: t, - key: t && wa(t), - ref: t && Ta(t), - scopeId: dr, + key: t && Fi(t), + ref: t && Ii(t), + scopeId: Cn, slotScopeIds: null, children: n, component: null, @@ -2528,35 +2200,35 @@ function K(e, t = null, n = null, r = 0, i = null, a = e === U ? 0 : 1, o = !1, dynamicProps: i, dynamicChildren: null, appContext: null, - ctx: ur + ctx: Sn }; - return s ? (Ma(c, n), a & 128 && e.normalize(c)) : n && (c.shapeFlag |= j(n) ? 8 : 16), va > 0 && !o && ga && (c.patchFlag > 0 || a & 6) && c.patchFlag !== 32 && ga.push(c), c; + return s ? (Ui(c, n), a & 128 && e.normalize(c)) : n && (c.shapeFlag |= g(n) ? 8 : 16), ki > 0 && !o && Di && (c.patchFlag > 0 || a & 6) && c.patchFlag !== 32 && Di.push(c), c; } -var Ea = Da; -function Da(e, t = null, n = null, r = 0, i = null, a = !1) { - if ((!e || e === Qr) && (e = pa), Sa(e)) { - let r = ka(e, t, !0); - return n && Ma(r, n), va > 0 && !a && ga && (r.shapeFlag & 6 ? ga[ga.indexOf(e)] = r : ga.push(r)), r.patchFlag = -2, r; +var Li = Ri; +function Ri(e, t = null, n = null, r = 0, i = null, a = !1) { + if ((!e || e === lr) && (e = wi), Ni(e)) { + let r = Bi(e, t, !0); + return n && Ui(r, n), ki > 0 && !a && Di && (r.shapeFlag & 6 ? Di[Di.indexOf(e)] = r : Di.push(r)), r.patchFlag = -2, r; } - if (eo(e) && (e = e.__vccOpts), t) { - t = Oa(t); + if (fa(e) && (e = e.__vccOpts), t) { + t = zi(t); let { class: e, style: n } = t; - e && !j(e) && (t.class = tt(e)), M(n) && (/* @__PURE__ */ kn(n) && !k(n) && (n = D({}, n)), t.style = Xe(n)); + e && !g(e) && (t.class = M(e)), v(n) && (/* @__PURE__ */ zt(n) && !d(n) && (n = s({}, n)), t.style = ce(n)); } - let o = j(e) ? 1 : ua(e) ? 128 : Tr(e) ? 64 : M(e) ? 4 : A(e) ? 2 : 0; + let o = g(e) ? 1 : xi(e) ? 128 : In(e) ? 64 : v(e) ? 4 : h(e) ? 2 : 0; return K(e, t, n, r, i, o, a, !0); } -function Oa(e) { - return e ? /* @__PURE__ */ kn(e) || Li(e) ? D({}, e) : e : null; +function zi(e) { + return e ? /* @__PURE__ */ zt(e) || Jr(e) ? s({}, e) : e : null; } -function ka(e, t, n = !1, r = !1) { - let { props: i, ref: a, patchFlag: o, children: s, transition: c } = e, l = t ? Na(i || {}, t) : i, u = { +function Bi(e, t, n = !1, r = !1) { + let { props: i, ref: a, patchFlag: o, children: s, transition: c } = e, l = t ? Wi(i || {}, t) : i, u = { __v_isVNode: !0, __v_skip: !0, type: e.type, props: l, - key: l && wa(l), - ref: t && t.ref ? n && a ? k(a) ? a.concat(Ta(t)) : [a, Ta(t)] : Ta(t) : a, + key: l && Fi(l), + ref: t && t.ref ? n && a ? d(a) ? a.concat(Ii(t)) : [a, Ii(t)] : Ii(t) : a, scopeId: e.scopeId, slotScopeIds: e.slotScopeIds, children: s, @@ -2573,85 +2245,85 @@ function ka(e, t, n = !1, r = !1) { transition: c, component: e.component, suspense: e.suspense, - ssContent: e.ssContent && ka(e.ssContent), - ssFallback: e.ssFallback && ka(e.ssFallback), + ssContent: e.ssContent && Bi(e.ssContent), + ssFallback: e.ssFallback && Bi(e.ssFallback), placeholder: e.placeholder, el: e.el, anchor: e.anchor, ctx: e.ctx, ce: e.ce }; - return c && r && Dr(u, c.clone(u)), u; + return c && r && Rn(u, c.clone(u)), u; } function q(e = " ", t = 0) { - return Ea(fa, null, e, t); + return Li(Ci, null, e, t); } function J(e = "", t = !1) { - return t ? (W(), xa(pa, null, e)) : Ea(pa, null, e); + return t ? (W(), Mi(wi, null, e)) : Li(wi, null, e); } -function Aa(e) { - return e == null || typeof e == "boolean" ? Ea(pa) : k(e) ? Ea(U, null, e.slice()) : Sa(e) ? ja(e) : Ea(fa, null, String(e)); +function Vi(e) { + return e == null || typeof e == "boolean" ? Li(wi) : d(e) ? Li(U, null, e.slice()) : Ni(e) ? Hi(e) : Li(Ci, null, String(e)); } -function ja(e) { - return e.el === null && e.patchFlag !== -1 || e.memo ? e : ka(e); +function Hi(e) { + return e.el === null && e.patchFlag !== -1 || e.memo ? e : Bi(e); } -function Ma(e, t) { +function Ui(e, t) { let n = 0, { shapeFlag: r } = e; if (t == null) t = null; - else if (k(t)) n = 16; + else if (d(t)) n = 16; else if (typeof t == "object") if (r & 65) { let n = t.default; - n && (n._c && (n._d = !1), Ma(e, n()), n._c && (n._d = !0)); + n && (n._c && (n._d = !1), Ui(e, n()), n._c && (n._d = !0)); return; } else { n = 32; let r = t._; - !r && !Li(t) ? t._ctx = ur : r === 3 && ur && (ur.slots._ === 1 ? t._ = 1 : (t._ = 2, e.patchFlag |= 1024)); + !r && !Jr(t) ? t._ctx = Sn : r === 3 && Sn && (Sn.slots._ === 1 ? t._ = 1 : (t._ = 2, e.patchFlag |= 1024)); } - else A(t) ? (t = { + else h(t) ? (t = { default: t, - _ctx: ur + _ctx: Sn }, n = 32) : (t = String(t), r & 64 ? (n = 16, t = [q(t)]) : n = 8); e.children = t, e.shapeFlag |= n; } -function Na(...e) { +function Wi(...e) { let t = {}; for (let n = 0; n < e.length; n++) { let r = e[n]; - for (let e in r) if (e === "class") t.class !== r.class && (t.class = tt([t.class, r.class])); - else if (e === "style") t.style = Xe([t.style, r.style]); - else if (xe(e)) { + for (let e in r) if (e === "class") t.class !== r.class && (t.class = M([t.class, r.class])); + else if (e === "style") t.style = ce([t.style, r.style]); + else if (a(e)) { let n = t[e], i = r[e]; - i && n !== i && !(k(n) && n.includes(i)) ? t[e] = n ? [].concat(n, i) : i : i == null && n == null && !Se(e) && (t[e] = i); + i && n !== i && !(d(n) && n.includes(i)) ? t[e] = n ? [].concat(n, i) : i : i == null && n == null && !o(e) && (t[e] = i); } else e !== "" && (t[e] = r[e]); } return t; } -function Pa(e, t, n, r = null) { - Kn(e, t, 7, [n, r]); +function Gi(e, t, n, r = null) { + nn(e, t, 7, [n, r]); } -var Fa = yi(), Ia = 0; -function La(e, t, n) { - let r = e.type, i = (t ? t.appContext : e.appContext) || Fa, a = { - uid: Ia++, +var Ki = Ar(), qi = 0; +function Ji(e, n, r) { + let i = e.type, a = (n ? n.appContext : e.appContext) || Ki, o = { + uid: qi++, vnode: e, - type: r, - parent: t, - appContext: i, + type: i, + parent: n, + appContext: a, root: null, next: null, subTree: null, effect: null, update: null, job: null, - scope: new dt(!0), + scope: new Se(!0), render: null, proxy: null, exposed: null, exposeProxy: null, withProxy: null, - provides: t ? t.provides : Object.create(i.provides), - ids: t ? t.ids : [ + provides: n ? n.provides : Object.create(a.provides), + ids: n ? n.ids : [ "", 0, 0 @@ -2660,22 +2332,22 @@ function La(e, t, n) { renderCache: [], components: null, directives: null, - propsOptions: Ui(r, i), - emitsOptions: Ei(r, i), + propsOptions: ei(i, a), + emitsOptions: Lr(i, a), emit: null, emitted: null, - propsDefaults: E, - inheritAttrs: r.inheritAttrs, - ctx: E, - data: E, - props: E, - attrs: E, - slots: E, - refs: E, - setupState: E, + propsDefaults: t, + inheritAttrs: i.inheritAttrs, + ctx: t, + data: t, + props: t, + attrs: t, + slots: t, + refs: t, + setupState: t, setupContext: null, - suspense: n, - suspenseId: n ? n.pendingId : 0, + suspense: r, + suspenseId: r ? r.pendingId : 0, asyncDep: null, asyncResolved: !1, isMounted: !1, @@ -2696,89 +2368,89 @@ function La(e, t, n) { ec: null, sp: null }; - return a.ctx = { _: a }, a.root = t ? t.root : a, a.emit = wi.bind(null, a), e.ce && e.ce(a), a; + return o.ctx = { _: o }, o.root = n ? n.root : o, o.emit = Fr.bind(null, o), e.ce && e.ce(o), o; } -var Y = null, Ra = () => Y || ur, za, Ba; +var Yi = null, Xi = () => Yi || Sn, Zi, Qi; { - let e = Ye(), t = (t, n) => { + let e = j(), t = (t, n) => { let r; return (r = e[t]) || (r = e[t] = []), r.push(n), (e) => { r.length > 1 ? r.forEach((t) => t(e)) : r[0](e); }; }; - za = t("__VUE_INSTANCE_SETTERS__", (e) => Y = e), Ba = t("__VUE_SSR_SETTERS__", (e) => Wa = e); + Zi = t("__VUE_INSTANCE_SETTERS__", (e) => Yi = e), Qi = t("__VUE_SSR_SETTERS__", (e) => na = e); } -var Va = (e) => { - let t = Y; - return za(e), e.scope.on(), () => { - e.scope.off(), za(t); +var $i = (e) => { + let t = Yi; + return Zi(e), e.scope.on(), () => { + e.scope.off(), Zi(t); }; -}, Ha = () => { - Y && Y.scope.off(), za(null); +}, ea = () => { + Yi && Yi.scope.off(), Zi(null); }; -function Ua(e) { +function ta(e) { return e.vnode.shapeFlag & 4; } -var Wa = !1; -function Ga(e, t = !1, n = !1) { - t && Ba(t); - let { props: r, children: i } = e.vnode, a = Ua(e); - Ri(e, r, a, t), Zi(e, i, n || t); - let o = a ? Ka(e, t) : void 0; - return t && Ba(!1), o; +var na = !1; +function ra(e, t = !1, n = !1) { + t && Qi(t); + let { props: r, children: i } = e.vnode, a = ta(e); + Yr(e, r, a, t), ci(e, i, n || t); + let o = a ? ia(e, t) : void 0; + return t && Qi(!1), o; } -function Ka(e, t) { +function ia(e, t) { let n = e.type; - e.accessCache = /* @__PURE__ */ Object.create(null), e.proxy = new Proxy(e.ctx, ri); + e.accessCache = /* @__PURE__ */ Object.create(null), e.proxy = new Proxy(e.ctx, pr); let { setup: r } = n; if (r) { - kt(); - let n = e.setupContext = r.length > 1 ? Qa(e) : null, i = Va(e), a = Gn(r, e, 0, [e.props, n]), o = ke(a); - if (At(), i(), (o || e.sp) && !Pr(e) && kr(e), o) { - if (a.then(Ha, Ha), t) return a.then((n) => { - qa(e, n, t); + Be(); + let n = e.setupContext = r.length > 1 ? ua(e) : null, i = $i(e), a = tn(r, e, 0, [e.props, n]), o = y(a); + if (Ve(), i(), (o || e.sp) && !Gn(e) && Bn(e), o) { + if (a.then(ea, ea), t) return a.then((n) => { + aa(e, n, t); }).catch((t) => { - qn(t, e, 0); + rn(t, e, 0); }); e.asyncDep = a; - } else qa(e, a, t); - } else Xa(e, t); + } else aa(e, a, t); + } else ca(e, t); } -function qa(e, t, n) { - A(t) ? e.type.__ssrInlineRender ? e.ssrRender = t : e.render = t : M(t) && (e.setupState = In(t)), Xa(e, n); +function aa(e, t, n) { + h(t) ? e.type.__ssrInlineRender ? e.ssrRender = t : e.render = t : v(t) && (e.setupState = Kt(t)), ca(e, n); } -var Ja, Ya; -function Xa(e, t, n) { - let r = e.type; +var oa, sa; +function ca(e, t, n) { + let i = e.type; if (!e.render) { - if (!t && Ja && !r.render) { - let t = r.template || ui(e).template; + if (!t && oa && !i.render) { + let t = i.template || br(e).template; if (t) { - let { isCustomElement: n, compilerOptions: i } = e.appContext.config, { delimiters: a, compilerOptions: o } = r; - r.render = Ja(t, D(D({ + let { isCustomElement: n, compilerOptions: r } = e.appContext.config, { delimiters: a, compilerOptions: o } = i; + i.render = oa(t, s(s({ isCustomElement: n, delimiters: a - }, i), o)); + }, r), o)); } } - e.render = r.render || ye, Ya && Ya(e); + e.render = i.render || r, sa && sa(e); } { - let t = Va(e); - kt(); + let t = $i(e); + Be(); try { - oi(e); + gr(e); } finally { - At(), t(); + Ve(), t(); } } } -var Za = { get(e, t) { +var la = { get(e, t) { return I(e, "get", ""), e[t]; } }; -function Qa(e) { +function ua(e) { return { - attrs: new Proxy(e.attrs, Za), + attrs: new Proxy(e.attrs, la), slots: e.slots, emit: e.emit, expose: (t) => { @@ -2786,25 +2458,25 @@ function Qa(e) { } }; } -function $a(e) { - return e.exposed ? e.exposeProxy ||= new Proxy(In(An(e.exposed)), { +function da(e) { + return e.exposed ? e.exposeProxy ||= new Proxy(Kt(Bt(e.exposed)), { get(t, n) { if (n in t) return t[n]; - if (n in ti) return ti[n](e); + if (n in dr) return dr[n](e); }, has(e, t) { - return t in e || t in ti; + return t in e || t in dr; } }) : e.proxy; } -function eo(e) { - return A(e) && "__vccOpts" in e; +function fa(e) { + return h(e) && "__vccOpts" in e; } -var X = (e, t) => /* @__PURE__ */ Rn(e, t, Wa), to = "3.5.34", no = void 0, ro = typeof window < "u" && window.trustedTypes; -if (ro) try { - no = /* @__PURE__ */ ro.createPolicy("vue", { createHTML: (e) => e }); +var Y = (e, t) => /* @__PURE__ */ Jt(e, t, na), pa = "3.5.34", ma = void 0, ha = typeof window < "u" && window.trustedTypes; +if (ha) try { + ma = /* @__PURE__ */ ha.createPolicy("vue", { createHTML: (e) => e }); } catch {} -var io = no ? (e) => no.createHTML(e) : (e) => e, ao = "http://www.w3.org/2000/svg", oo = "http://www.w3.org/1998/Math/MathML", so = typeof document < "u" ? document : null, co = so && /* @__PURE__ */ so.createElement("template"), lo = { +var ga = ma ? (e) => ma.createHTML(e) : (e) => e, _a = "http://www.w3.org/2000/svg", va = "http://www.w3.org/1998/Math/MathML", ya = typeof document < "u" ? document : null, ba = ya && /* @__PURE__ */ ya.createElement("template"), xa = { insert: (e, t, n) => { t.insertBefore(e, n || null); }, @@ -2813,11 +2485,11 @@ var io = no ? (e) => no.createHTML(e) : (e) => e, ao = "http://www.w3.org/2000/s t && t.removeChild(e); }, createElement: (e, t, n, r) => { - let i = t === "svg" ? so.createElementNS(ao, e) : t === "mathml" ? so.createElementNS(oo, e) : n ? so.createElement(e, { is: n }) : so.createElement(e); + let i = t === "svg" ? ya.createElementNS(_a, e) : t === "mathml" ? ya.createElementNS(va, e) : n ? ya.createElement(e, { is: n }) : ya.createElement(e); return e === "select" && r && r.multiple != null && i.setAttribute("multiple", r.multiple), i; }, - createText: (e) => so.createTextNode(e), - createComment: (e) => so.createComment(e), + createText: (e) => ya.createTextNode(e), + createComment: (e) => ya.createComment(e), setText: (e, t) => { e.nodeValue = t; }, @@ -2826,7 +2498,7 @@ var io = no ? (e) => no.createHTML(e) : (e) => e, ao = "http://www.w3.org/2000/s }, parentNode: (e) => e.parentNode, nextSibling: (e) => e.nextSibling, - querySelector: (e) => so.querySelector(e), + querySelector: (e) => ya.querySelector(e), setScopeId(e, t) { e.setAttribute(t, ""); }, @@ -2834,8 +2506,8 @@ var io = no ? (e) => no.createHTML(e) : (e) => e, ao = "http://www.w3.org/2000/s let o = n ? n.previousSibling : t.lastChild; if (i && (i === a || i.nextSibling)) for (; t.insertBefore(i.cloneNode(!0), n), !(i === a || !(i = i.nextSibling));); else { - co.innerHTML = io(r === "svg" ? `${e}` : r === "mathml" ? `${e}` : e); - let i = co.content; + ba.innerHTML = ga(r === "svg" ? `${e}` : r === "mathml" ? `${e}` : e); + let i = ba.content; if (r === "svg" || r === "mathml") { let e = i.firstChild; for (; e.firstChild;) i.appendChild(e.firstChild); @@ -2845,69 +2517,69 @@ var io = no ? (e) => no.createHTML(e) : (e) => e, ao = "http://www.w3.org/2000/s } return [o ? o.nextSibling : t.firstChild, n ? n.previousSibling : t.lastChild]; } -}, uo = /* @__PURE__ */ Symbol("_vtc"); -function fo(e, t, n) { - let r = e[uo]; +}, Sa = /* @__PURE__ */ Symbol("_vtc"); +function Ca(e, t, n) { + let r = e[Sa]; r && (t = (t ? [t, ...r] : [...r]).join(" ")), t == null ? e.removeAttribute("class") : n ? e.setAttribute("class", t) : e.className = t; } -var po = /* @__PURE__ */ Symbol("_vod"), mo = /* @__PURE__ */ Symbol("_vsh"), ho = /* @__PURE__ */ Symbol(""), go = /(?:^|;)\s*display\s*:/; -function _o(e, t, n) { - let r = e.style, i = j(n), a = !1; +var wa = /* @__PURE__ */ Symbol("_vod"), Ta = /* @__PURE__ */ Symbol("_vsh"), Ea = /* @__PURE__ */ Symbol(""), Da = /(?:^|;)\s*display\s*:/; +function Oa(e, t, n) { + let r = e.style, i = g(n), a = !1; if (n && !i) { - if (t) if (j(t)) for (let e of t.split(";")) { + if (t) if (g(t)) for (let e of t.split(";")) { let t = e.slice(0, e.indexOf(":")).trim(); - n[t] ?? yo(r, t, ""); + n[t] ?? Aa(r, t, ""); } - else for (let e in t) n[e] ?? yo(r, e, ""); + else for (let e in t) n[e] ?? Aa(r, e, ""); for (let i in n) { i === "display" && (a = !0); let o = n[i]; - o == null ? yo(r, i, "") : Co(e, i, !j(t) && t ? t[i] : void 0, o) || yo(r, i, o); + o == null ? Aa(r, i, "") : Pa(e, i, !g(t) && t ? t[i] : void 0, o) || Aa(r, i, o); } } else if (i) { if (t !== n) { - let e = r[ho]; - e && (n += ";" + e), r.cssText = n, a = go.test(n); + let e = r[Ea]; + e && (n += ";" + e), r.cssText = n, a = Da.test(n); } } else t && e.removeAttribute("style"); - po in e && (e[po] = a ? r.display : "", e[mo] && (r.display = "none")); + wa in e && (e[wa] = a ? r.display : "", e[Ta] && (r.display = "none")); } -var vo = /\s*!important$/; -function yo(e, t, n) { - if (k(n)) n.forEach((n) => yo(e, t, n)); +var ka = /\s*!important$/; +function Aa(e, t, n) { + if (d(n)) n.forEach((n) => Aa(e, t, n)); else if (n ??= "", t.startsWith("--")) e.setProperty(t, n); else { - let r = So(e, t); - vo.test(n) ? e.setProperty(Be(r), n.replace(vo, ""), "important") : e[r] = n; + let r = Na(e, t); + ka.test(n) ? e.setProperty(E(r), n.replace(ka, ""), "important") : e[r] = n; } } -var bo = [ +var ja = [ "Webkit", "Moz", "ms" -], xo = {}; -function So(e, t) { - let n = xo[t]; +], Ma = {}; +function Na(e, t) { + let n = Ma[t]; if (n) return n; - let r = Re(t); - if (r !== "filter" && r in e) return xo[t] = r; - r = Ve(r); - for (let n = 0; n < bo.length; n++) { - let i = bo[n] + r; - if (i in e) return xo[t] = i; + let r = T(t); + if (r !== "filter" && r in e) return Ma[t] = r; + r = D(r); + for (let n = 0; n < ja.length; n++) { + let i = ja[n] + r; + if (i in e) return Ma[t] = i; } return t; } -function Co(e, t, n, r) { - return e.tagName === "TEXTAREA" && (t === "width" || t === "height") && j(r) && n === r; +function Pa(e, t, n, r) { + return e.tagName === "TEXTAREA" && (t === "width" || t === "height") && g(r) && n === r; } -var wo = "http://www.w3.org/1999/xlink"; -function To(e, t, n, r, i, a = rt(t)) { - r && t.startsWith("xlink:") ? n == null ? e.removeAttributeNS(wo, t.slice(6, t.length)) : e.setAttributeNS(wo, t, n) : n == null || a && !it(n) ? e.removeAttribute(t) : e.setAttribute(t, a ? "" : Oe(n) ? String(n) : n); +var Fa = "http://www.w3.org/1999/xlink"; +function Ia(e, t, n, r, i, a = me(t)) { + r && t.startsWith("xlink:") ? n == null ? e.removeAttributeNS(Fa, t.slice(6, t.length)) : e.setAttributeNS(Fa, t, n) : n == null || a && !he(n) ? e.removeAttribute(t) : e.setAttribute(t, a ? "" : _(n) ? String(n) : n); } -function Eo(e, t, n, r, i) { +function La(e, t, n, r, i) { if (t === "innerHTML" || t === "textContent") { - n != null && (e[t] = t === "innerHTML" ? io(n) : n); + n != null && (e[t] = t === "innerHTML" ? ga(n) : n); return; } let a = e.tagName; @@ -2919,89 +2591,89 @@ function Eo(e, t, n, r, i) { let o = !1; if (n === "" || n == null) { let r = typeof e[t]; - r === "boolean" ? n = it(n) : n == null && r === "string" ? (n = "", o = !0) : r === "number" && (n = 0, o = !0); + r === "boolean" ? n = he(n) : n == null && r === "string" ? (n = "", o = !0) : r === "number" && (n = 0, o = !0); } try { e[t] = n; } catch {} o && e.removeAttribute(i || t); } -function Do(e, t, n, r) { +function Ra(e, t, n, r) { e.addEventListener(t, n, r); } -function Oo(e, t, n, r) { +function za(e, t, n, r) { e.removeEventListener(t, n, r); } -var ko = /* @__PURE__ */ Symbol("_vei"); -function Ao(e, t, n, r, i = null) { - let a = e[ko] || (e[ko] = {}), o = a[t]; +var Ba = /* @__PURE__ */ Symbol("_vei"); +function Va(e, t, n, r, i = null) { + let a = e[Ba] || (e[Ba] = {}), o = a[t]; if (r && o) o.value = r; else { - let [n, s] = Mo(t); - r ? Do(e, n, a[t] = Io(r, i), s) : o && (Oo(e, n, o, s), a[t] = void 0); + let [n, s] = Ua(t); + r ? Ra(e, n, a[t] = qa(r, i), s) : o && (za(e, n, o, s), a[t] = void 0); } } -var jo = /(?:Once|Passive|Capture)$/; -function Mo(e) { +var Ha = /(?:Once|Passive|Capture)$/; +function Ua(e) { let t; - if (jo.test(e)) { + if (Ha.test(e)) { t = {}; let n; - for (; n = e.match(jo);) e = e.slice(0, e.length - n[0].length), t[n[0].toLowerCase()] = !0; + for (; n = e.match(Ha);) e = e.slice(0, e.length - n[0].length), t[n[0].toLowerCase()] = !0; } - return [e[2] === ":" ? e.slice(3) : Be(e.slice(2)), t]; + return [e[2] === ":" ? e.slice(3) : E(e.slice(2)), t]; } -var No = 0, Po = /* @__PURE__ */ Promise.resolve(), Fo = () => No ||= (Po.then(() => No = 0), Date.now()); -function Io(e, t) { +var Wa = 0, Ga = /* @__PURE__ */ Promise.resolve(), Ka = () => Wa ||= (Ga.then(() => Wa = 0), Date.now()); +function qa(e, t) { let n = (e) => { if (!e._vts) e._vts = Date.now(); else if (e._vts <= n.attached) return; - Kn(Lo(e, n.value), t, 5, [e]); + nn(Ja(e, n.value), t, 5, [e]); }; - return n.value = e, n.attached = Fo(), n; + return n.value = e, n.attached = Ka(), n; } -function Lo(e, t) { - if (k(t)) { +function Ja(e, t) { + if (d(t)) { let n = e.stopImmediatePropagation; return e.stopImmediatePropagation = () => { n.call(e), e._stopped = !0; }, t.map((e) => (t) => !t._stopped && e && e(t)); } else return t; } -var Ro = (e) => e.charCodeAt(0) === 111 && e.charCodeAt(1) === 110 && e.charCodeAt(2) > 96 && e.charCodeAt(2) < 123, zo = (e, t, n, r, i, a) => { - let o = i === "svg"; - t === "class" ? fo(e, r, o) : t === "style" ? _o(e, n, r) : xe(t) ? Se(t) || Ao(e, t, n, r, a) : (t[0] === "." ? (t = t.slice(1), !0) : t[0] === "^" ? (t = t.slice(1), !1) : Bo(e, t, r, o)) ? (Eo(e, t, r), !e.tagName.includes("-") && (t === "value" || t === "checked" || t === "selected") && To(e, t, r, o, a, t !== "value")) : e._isVueCE && (Vo(e, t) || e._def.__asyncLoader && (/[A-Z]/.test(t) || !j(r))) ? Eo(e, Re(t), r, a, t) : (t === "true-value" ? e._trueValue = r : t === "false-value" && (e._falseValue = r), To(e, t, r, o)); +var Ya = (e) => e.charCodeAt(0) === 111 && e.charCodeAt(1) === 110 && e.charCodeAt(2) > 96 && e.charCodeAt(2) < 123, Xa = (e, t, n, r, i, s) => { + let c = i === "svg"; + t === "class" ? Ca(e, r, c) : t === "style" ? Oa(e, n, r) : a(t) ? o(t) || Va(e, t, n, r, s) : (t[0] === "." ? (t = t.slice(1), !0) : t[0] === "^" ? (t = t.slice(1), !1) : Za(e, t, r, c)) ? (La(e, t, r), !e.tagName.includes("-") && (t === "value" || t === "checked" || t === "selected") && Ia(e, t, r, c, s, t !== "value")) : e._isVueCE && (Qa(e, t) || e._def.__asyncLoader && (/[A-Z]/.test(t) || !g(r))) ? La(e, T(t), r, s, t) : (t === "true-value" ? e._trueValue = r : t === "false-value" && (e._falseValue = r), Ia(e, t, r, c)); }; -function Bo(e, t, n, r) { - if (r) return !!(t === "innerHTML" || t === "textContent" || t in e && Ro(t) && A(n)); +function Za(e, t, n, r) { + if (r) return !!(t === "innerHTML" || t === "textContent" || t in e && Ya(t) && h(n)); if (t === "spellcheck" || t === "draggable" || t === "translate" || t === "autocorrect" || t === "sandbox" && e.tagName === "IFRAME" || t === "form" || t === "list" && e.tagName === "INPUT" || t === "type" && e.tagName === "TEXTAREA") return !1; if (t === "width" || t === "height") { let t = e.tagName; if (t === "IMG" || t === "VIDEO" || t === "CANVAS" || t === "SOURCE") return !1; } - return Ro(t) && j(n) ? !1 : t in e; + return Ya(t) && g(n) ? !1 : t in e; } -function Vo(e, t) { +function Qa(e, t) { let n = e._def.props; if (!n) return !1; - let r = Re(t); - return Array.isArray(n) ? n.some((e) => Re(e) === r) : Object.keys(n).some((e) => Re(e) === r); + let r = T(t); + return Array.isArray(n) ? n.some((e) => T(e) === r) : Object.keys(n).some((e) => T(e) === r); } -var Ho = {}; +var $a = {}; /* @__NO_SIDE_EFFECTS__ */ -function Uo(e, t, n) { - let r = /* @__PURE__ */ Or(e, t); - Ne(r) && (r = D({}, r, t)); - class i extends Go { +function eo(e, t, n) { + let r = /* @__PURE__ */ zn(e, t); + C(r) && (r = s({}, r, t)); + class i extends no { constructor(e) { super(r, e, n); } } return i.def = r, i; } -var Wo = typeof HTMLElement < "u" ? HTMLElement : class {}, Go = class e extends Wo { - constructor(e, t = {}, n = us) { - super(), this._def = e, this._props = t, this._createApp = n, this._isVueCE = !0, this._instance = null, this._app = null, this._nonce = this._def.nonce, this._connected = !1, this._resolved = !1, this._patching = !1, this._dirty = !1, this._numberProps = null, this._styleChildren = /* @__PURE__ */ new WeakSet(), this._styleAnchors = /* @__PURE__ */ new WeakMap(), this._ob = null, this.shadowRoot && n !== us ? this._root = this.shadowRoot : e.shadowRoot === !1 ? this._root = this : (this.attachShadow(D({}, e.shadowRootOptions, { mode: "open" })), this._root = this.shadowRoot); +var to = typeof HTMLElement < "u" ? HTMLElement : class {}, no = class e extends to { + constructor(e, t = {}, n = So) { + super(), this._def = e, this._props = t, this._createApp = n, this._isVueCE = !0, this._instance = null, this._app = null, this._nonce = this._def.nonce, this._connected = !1, this._resolved = !1, this._patching = !1, this._dirty = !1, this._numberProps = null, this._styleChildren = /* @__PURE__ */ new WeakSet(), this._styleAnchors = /* @__PURE__ */ new WeakMap(), this._ob = null, this.shadowRoot && n !== So ? this._root = this.shadowRoot : e.shadowRoot === !1 ? this._root = this : (this.attachShadow(s({}, e.shadowRootOptions, { mode: "open" })), this._root = this.shadowRoot); } connectedCallback() { if (!this.isConnected) return; @@ -3022,7 +2694,7 @@ var Wo = typeof HTMLElement < "u" ? HTMLElement : class {}, Go = class e extends e && this._app && Object.setPrototypeOf(this._app._context.provides, e._instance.provides); } disconnectedCallback() { - this._connected = !1, tr(() => { + this._connected = !1, pn(() => { this._connected || (this._ob &&= (this._ob.disconnect(), null), this._app && this._app.unmount(), this._instance && (this._instance.ce = void 0), this._app = this._instance = null, this._teleportTargets &&= (this._teleportTargets.clear(), void 0)); }); } @@ -3036,9 +2708,9 @@ var Wo = typeof HTMLElement < "u" ? HTMLElement : class {}, Go = class e extends let e = (e, t = !1) => { this._resolved = !0, this._pendingResolve = void 0; let { props: n, styles: r } = e, i; - if (n && !k(n)) for (let e in n) { + if (n && !d(n)) for (let e in n) { let t = n[e]; - (t === Number || t && t.type === Number) && (e in this._props && (this._props[e] = qe(this._props[e])), (i ||= /* @__PURE__ */ Object.create(null))[Re(e)] = !0); + (t === Number || t && t.type === Number) && (e in this._props && (this._props[e] = se(this._props[e])), (i ||= /* @__PURE__ */ Object.create(null))[T(e)] = !0); } this._numberProps = i, this._resolveProps(e), this.shadowRoot && this._applyStyles(r), this._mount(e); }, t = this._def.__asyncLoader; @@ -3049,12 +2721,12 @@ var Wo = typeof HTMLElement < "u" ? HTMLElement : class {}, Go = class e extends _mount(e) { this._app = this._createApp(e), this._inheritParentContext(), e.configureApp && e.configureApp(this._app), this._app._ceVNode = this._createVNode(), this._app.mount(this._root); let t = this._instance && this._instance.exposed; - if (t) for (let e in t) O(this, e) || Object.defineProperty(this, e, { get: () => B(t[e]) }); + if (t) for (let e in t) u(this, e) || Object.defineProperty(this, e, { get: () => B(t[e]) }); } _resolveProps(e) { - let { props: t } = e, n = k(t) ? t : Object.keys(t || {}); + let { props: t } = e, n = d(t) ? t : Object.keys(t || {}); for (let e of Object.keys(this)) e[0] !== "_" && n.includes(e) && this._setProp(e, this[e]); - for (let e of n.map(Re)) Object.defineProperty(this, e, { + for (let e of n.map(T)) Object.defineProperty(this, e, { get() { return this._getProp(e); }, @@ -3065,33 +2737,33 @@ var Wo = typeof HTMLElement < "u" ? HTMLElement : class {}, Go = class e extends } _setAttr(e) { if (e.startsWith("data-v-")) return; - let t = this.hasAttribute(e), n = t ? this.getAttribute(e) : Ho, r = Re(e); - t && this._numberProps && this._numberProps[r] && (n = qe(n)), this._setProp(r, n, !1, !0); + let t = this.hasAttribute(e), n = t ? this.getAttribute(e) : $a, r = T(e); + t && this._numberProps && this._numberProps[r] && (n = se(n)), this._setProp(r, n, !1, !0); } _getProp(e) { return this._props[e]; } _setProp(e, t, n = !0, r = !1) { - if (t !== this._props[e] && (this._dirty = !0, t === Ho ? delete this._props[e] : (this._props[e] = t, e === "key" && this._app && (this._app._ceVNode.key = t)), r && this._instance && this._update(), n)) { + if (t !== this._props[e] && (this._dirty = !0, t === $a ? delete this._props[e] : (this._props[e] = t, e === "key" && this._app && (this._app._ceVNode.key = t)), r && this._instance && this._update(), n)) { let n = this._ob; - n && (this._processMutations(n.takeRecords()), n.disconnect()), t === !0 ? this.setAttribute(Be(e), "") : typeof t == "string" || typeof t == "number" ? this.setAttribute(Be(e), t + "") : t || this.removeAttribute(Be(e)), n && n.observe(this, { attributes: !0 }); + n && (this._processMutations(n.takeRecords()), n.disconnect()), t === !0 ? this.setAttribute(E(e), "") : typeof t == "string" || typeof t == "number" ? this.setAttribute(E(e), t + "") : t || this.removeAttribute(E(e)), n && n.observe(this, { attributes: !0 }); } } _update() { let e = this._createVNode(); - this._app && (e.appContext = this._app._context), ls(e, this._root); + this._app && (e.appContext = this._app._context), xo(e, this._root); } _createVNode() { let e = {}; this.shadowRoot || (e.onVnodeMounted = e.onVnodeUpdated = this._renderSlots.bind(this)); - let t = Ea(this._def, D(e, this._props)); + let t = Li(this._def, s(e, this._props)); return this._instance || (t.ce = (e) => { this._instance = e, e.ce = this, e.isCE = !0; let t = (e, t) => { - this.dispatchEvent(new CustomEvent(e, Ne(t[0]) ? D({ detail: t }, t[0]) : { detail: t })); + this.dispatchEvent(new CustomEvent(e, C(t[0]) ? s({ detail: t }, t[0]) : { detail: t })); }; e.emit = (e, ...n) => { - t(e, n), Be(e) !== e && t(Be(e), n); + t(e, n), E(e) !== e && t(E(e), n); }, this._setParent(); }), t; } @@ -3166,72 +2838,72 @@ var Wo = typeof HTMLElement < "u" ? HTMLElement : class {}, Go = class e extends return this._def.shadowRoot !== !1; } _removeChildStyle(e) {} -}, Ko = (e) => { +}, ro = (e) => { let t = e.props["onUpdate:modelValue"] || !1; - return k(t) ? (e) => We(t, e) : t; + return d(t) ? (e) => ae(t, e) : t; }; -function qo(e) { +function io(e) { e.target.composing = !0; } -function Jo(e) { +function ao(e) { let t = e.target; t.composing && (t.composing = !1, t.dispatchEvent(new Event("input"))); } -var Yo = /* @__PURE__ */ Symbol("_assign"); -function Xo(e, t, n) { - return t && (e = e.trim()), n && (e = Ke(e)), e; +var oo = /* @__PURE__ */ Symbol("_assign"); +function so(e, t, n) { + return t && (e = e.trim()), n && (e = oe(e)), e; } -var Zo = { +var co = { created(e, { modifiers: { lazy: t, trim: n, number: r } }, i) { - e[Yo] = Ko(i); + e[oo] = ro(i); let a = r || i.props && i.props.type === "number"; - Do(e, t ? "change" : "input", (t) => { - t.target.composing || e[Yo](Xo(e.value, n, a)); - }), (n || a) && Do(e, "change", () => { - e.value = Xo(e.value, n, a); - }), t || (Do(e, "compositionstart", qo), Do(e, "compositionend", Jo), Do(e, "change", Jo)); + Ra(e, t ? "change" : "input", (t) => { + t.target.composing || e[oo](so(e.value, n, a)); + }), (n || a) && Ra(e, "change", () => { + e.value = so(e.value, n, a); + }), t || (Ra(e, "compositionstart", io), Ra(e, "compositionend", ao), Ra(e, "change", ao)); }, mounted(e, { value: t }) { e.value = t ?? ""; }, beforeUpdate(e, { value: t, oldValue: n, modifiers: { lazy: r, trim: i, number: a } }, o) { - if (e[Yo] = Ko(o), e.composing) return; - let s = (a || e.type === "number") && !/^0\d/.test(e.value) ? Ke(e.value) : e.value, c = t ?? ""; + if (e[oo] = ro(o), e.composing) return; + let s = (a || e.type === "number") && !/^0\d/.test(e.value) ? oe(e.value) : e.value, c = t ?? ""; if (s === c) return; let l = e.getRootNode(); (l instanceof Document || l instanceof ShadowRoot) && l.activeElement === e && e.type !== "range" && (r && t === n || i && e.value.trim() === c) || (e.value = c); } -}, Qo = { +}, lo = { deep: !0, created(e, { value: t, modifiers: { number: n } }, r) { - let i = Ee(t); - Do(e, "change", () => { - let t = Array.prototype.filter.call(e.options, (e) => e.selected).map((e) => n ? Ke(es(e)) : es(e)); - e[Yo](e.multiple ? i ? new Set(t) : t : t[0]), e._assigning = !0, tr(() => { + let i = p(t); + Ra(e, "change", () => { + let t = Array.prototype.filter.call(e.options, (e) => e.selected).map((e) => n ? oe(fo(e)) : fo(e)); + e[oo](e.multiple ? i ? new Set(t) : t : t[0]), e._assigning = !0, pn(() => { e._assigning = !1; }); - }), e[Yo] = Ko(r); + }), e[oo] = ro(r); }, mounted(e, { value: t }) { - $o(e, t); + uo(e, t); }, beforeUpdate(e, t, n) { - e[Yo] = Ko(n); + e[oo] = ro(n); }, updated(e, { value: t }) { - e._assigning || $o(e, t); + e._assigning || uo(e, t); } }; -function $o(e, t) { - let n = e.multiple, r = k(t); - if (!(n && !r && !Ee(t))) { +function uo(e, t) { + let n = e.multiple, r = d(t); + if (!(n && !r && !p(t))) { for (let i = 0, a = e.options.length; i < a; i++) { - let a = e.options[i], o = es(a); + let a = e.options[i], o = fo(a); if (n) if (r) { let e = typeof o; - e === "string" || e === "number" ? a.selected = t.some((e) => String(e) === String(o)) : a.selected = st(t, o) > -1; + e === "string" || e === "number" ? a.selected = t.some((e) => String(e) === String(o)) : a.selected = ve(t, o) > -1; } else a.selected = t.has(o); - else if (ot(es(a), t)) { + else if (_e(fo(a), t)) { e.selectedIndex !== i && (e.selectedIndex = i); return; } @@ -3239,78 +2911,424 @@ function $o(e, t) { !n && e.selectedIndex !== -1 && (e.selectedIndex = -1); } } -function es(e) { +function fo(e) { return "_value" in e ? e._value : e.value; } -var ts = [ - "ctrl", - "shift", - "alt", - "meta" -], ns = { - stop: (e) => e.stopPropagation(), - prevent: (e) => e.preventDefault(), - self: (e) => e.target !== e.currentTarget, - ctrl: (e) => !e.ctrlKey, - shift: (e) => !e.shiftKey, - alt: (e) => !e.altKey, - meta: (e) => !e.metaKey, - left: (e) => "button" in e && e.button !== 0, - middle: (e) => "button" in e && e.button !== 1, - right: (e) => "button" in e && e.button !== 2, - exact: (e, t) => ts.some((n) => e[`${n}Key`] && !t.includes(n)) -}, rs = (e, t) => { - if (!e) return e; - let n = e._withMods ||= {}, r = t.join("."); - return n[r] || (n[r] = ((n, ...r) => { - for (let e = 0; e < t.length; e++) { - let r = ns[t[e]]; - if (r && r(n, t)) return; - } - return e(n, ...r); - })); -}, is = { - esc: "escape", - space: " ", - up: "arrow-up", - left: "arrow-left", - right: "arrow-right", - down: "arrow-down", - delete: "backspace" -}, as = (e, t) => { - let n = e._withKeys ||= {}, r = t.join("."); - return n[r] || (n[r] = ((n) => { - if (!("key" in n)) return; - let r = Be(n.key); - if (t.some((e) => e === r || is[e] === r)) return e(n); +var po = [ + "ctrl", + "shift", + "alt", + "meta" +], mo = { + stop: (e) => e.stopPropagation(), + prevent: (e) => e.preventDefault(), + self: (e) => e.target !== e.currentTarget, + ctrl: (e) => !e.ctrlKey, + shift: (e) => !e.shiftKey, + alt: (e) => !e.altKey, + meta: (e) => !e.metaKey, + left: (e) => "button" in e && e.button !== 0, + middle: (e) => "button" in e && e.button !== 1, + right: (e) => "button" in e && e.button !== 2, + exact: (e, t) => po.some((n) => e[`${n}Key`] && !t.includes(n)) +}, ho = (e, t) => { + if (!e) return e; + let n = e._withMods ||= {}, r = t.join("."); + return n[r] || (n[r] = ((n, ...r) => { + for (let e = 0; e < t.length; e++) { + let r = mo[t[e]]; + if (r && r(n, t)) return; + } + return e(n, ...r); + })); +}, go = { + esc: "escape", + space: " ", + up: "arrow-up", + left: "arrow-left", + right: "arrow-right", + down: "arrow-down", + delete: "backspace" +}, _o = (e, t) => { + let n = e._withKeys ||= {}, r = t.join("."); + return n[r] || (n[r] = ((n) => { + if (!("key" in n)) return; + let r = E(n.key); + if (t.some((e) => e === r || go[e] === r)) return e(n); + })); +}, vo = /* @__PURE__ */ s({ patchProp: Xa }, xa), yo; +function bo() { + return yo ||= di(vo); +} +var xo = ((...e) => { + bo().render(...e); +}), So = ((...e) => { + let t = bo().createApp(...e), { mount: n } = t; + return t.mount = (e) => { + let r = wo(e); + if (!r) return; + let i = t._component; + !h(i) && !i.render && !i.template && (i.template = r.innerHTML), r.nodeType === 1 && (r.textContent = ""); + let a = n(r, !1, Co(r)); + return r instanceof Element && (r.removeAttribute("v-cloak"), r.setAttribute("data-v-app", "")), a; + }, t; +}); +function Co(e) { + if (e instanceof SVGElement) return "svg"; + if (typeof MathMLElement == "function" && e instanceof MathMLElement) return "mathml"; +} +function wo(e) { + return g(e) ? document.querySelector(e) : e; +} +//#endregion +//#region packages/sdk-core/src/session.ts +var To = "__comtryaSessionState", Eo = "__comtryaOperatorCode"; +async function Do(e = {}) { + let t = Ao(); + if (t.current && t.current.expiresAtMs > Date.now() + 5e3) return t.current.token; + if (!t.inflight) { + let n = ko(e).finally(() => { + Ao().inflight === n && (Ao().inflight = void 0); + }); + t.inflight = n; + } + return t.inflight; +} +function Oo() { + Ao().current = void 0; +} +async function ko(e) { + let t = e.operatorCode ?? jo(), n = e.fetchImpl ?? fetch, r = e.baseUrl ?? ""; + if (!t) return; + let i = await n(`${r}/auth/token-exchange`, { + method: "POST", + headers: { "content-type": "application/json" }, + body: JSON.stringify({ + grantType: "urn:comtrya:grant:operator-code", + subjectToken: t, + subjectTokenType: "urn:comtrya:token-type:operator-code", + requestedResource: "comtrya://workspace", + requestedActions: [ + "graphql:read", + "graphql:write", + "events:read", + "git:read", + "checks:read" + ] + }) + }); + if (!i.ok) throw Error(`token-exchange failed (${i.status}): ${await i.text()}`); + let a = await i.json(); + if (!a.accessToken) throw Error("token-exchange response missing accessToken"); + let o = (a.expiresIn ?? 1800) * 1e3, s = { + token: a.accessToken, + expiresAtMs: Date.now() + o + }; + return Ao().current = s, s.token; +} +function Ao() { + let e = Mo(); + return e[To] ??= {}, e[To]; +} +function jo() { + let e = Mo()[Eo]; + if (e) return e; + try { + let e = { + BASE_URL: "/", + DEV: !1, + MODE: "production", + PROD: !0, + SSR: !1 + }?.PUBLIC_COMTRYA_OPERATOR_CODE; + return e && (Mo()[Eo] = e), e; + } catch { + return; + } +} +function Mo() { + return globalThis; +} +//#endregion +//#region packages/sdk-core/src/runtime.ts +async function X(e, t, n, r, i = {}) { + let a = `${i.baseUrl ?? ""}/api/ops/${encodeURIComponent(e)}/${encodeURIComponent(t)}/${encodeURIComponent(n)}`, o = { "content-type": "application/json" }, s = i.token ?? await Do(); + s && (o.authorization = `Bearer ${s}`); + try { + let e = await fetch(a, { + method: "POST", + headers: o, + body: JSON.stringify(r ?? null), + signal: i.signal, + credentials: "include" + }); + e.status === 401 && Oo(); + let t = await e.text(); + if (!e.ok) { + let n; + try { + n = t ? JSON.parse(t) : void 0; + } catch { + n = void 0; + } + let r = Po(e.status), i = typeof n?.message == "string" ? n.message : void 0; + return { + ok: !1, + error: { + code: No(n?.code) ?? r, + message: i ?? (t || e.statusText), + path: n?.path + } + }; + } + return { + ok: !0, + value: t ? JSON.parse(t) : null + }; + } catch (e) { + return { + ok: !1, + error: { + code: "unavailable", + message: e instanceof Error ? e.message : String(e) + } + }; + } +} +function No(e) { + switch (e) { + case "not-found": + case "conflict": + case "forbidden": + case "unauthenticated": + case "bad-input": + case "internal": + case "unavailable": return e; + default: return; + } +} +function Po(e) { + switch (e) { + case 400: return "bad-input"; + case 401: return "unauthenticated"; + case 403: return "forbidden"; + case 404: return "not-found"; + case 409: return "conflict"; + case 503: return "unavailable"; + default: return "internal"; + } +} +//#endregion +//#region packages/sdk-core/src/graphql-client.ts +var Fo = { + endpoint: "/graphql", + credentials: "include", + fetchImpl: typeof fetch < "u" ? fetch.bind(globalThis) : (() => { + throw Error("no fetch implementation available"); + }) +}, Io; +function Lo() { + return Io ||= Ro(Fo), Io; +} +function Ro(e) { + let t = async (t, n) => { + let r = await Do(), i = { "Content-Type": "application/json" }; + r && (i.Authorization = `Bearer ${r}`); + let a = await e.fetchImpl(e.endpoint, { + method: "POST", + credentials: e.credentials, + headers: i, + body: JSON.stringify({ + query: t, + variables: n + }) + }); + a.status === 401 && Oo(); + let o; + try { + o = await a.json(); + } catch (e) { + throw Error(`GraphQL response was not JSON: ${e instanceof Error ? e.message : String(e)}`); + } + if (!a.ok || o.errors?.length) throw Error(o.errors?.[0]?.message ?? a.statusText ?? "GraphQL request failed"); + if (o.data === void 0) throw Error("GraphQL response did not include data"); + return o.data; + }; + return { + query: t, + mutate: t + }; +} +//#endregion +//#region packages/sdk-core/src/route-registry.ts +function zo(e, t = "/") { + if (!e || e.length === 0) throw Error("buildExtensionUrl requires a non-empty routePrefix"); + if (e.includes("/")) throw Error(`routePrefix "${e}" must be a single path segment under /x/`); + let n = t.startsWith("/") ? t : `/${t}`, r = n.length; + for (; r > 1 && n.charCodeAt(r - 1) === 47;) --r; + return `/x/${e}${n === "/" ? "" : n.slice(0, r)}`; +} +//#endregion +//#region packages/sdk-core/src/live-events.ts +function Bo(e) { + let t = e.baseUrl ?? "", n = new AbortController(); + return Vo(t, e, n.signal), () => n.abort(); +} +async function Vo(e, t, n) { + try { + let r = await Ho(e, n, t.token); + t.onOpen?.(); + let i = `${e}/events?session=${encodeURIComponent(r)}`, a = await fetch(i, { + credentials: "include", + headers: Uo(t.token, { Accept: "text/event-stream" }), + signal: n + }); + if (!a.ok) throw Error(`event stream failed: HTTP ${a.status}`); + await Wo(a, t, n); + } catch (e) { + if (n.aborted) return; + t.onError?.(e instanceof Error ? e : Error(String(e))); + } +} +async function Ho(e, t, n) { + let r = await fetch(`${e}/events/session`, { + method: "POST", + credentials: "include", + headers: Uo(n, { "Content-Type": "application/json" }), + body: "{}", + signal: t + }), i = await r.json(); + if (!r.ok || !i.session) throw Error(i.errors?.[0]?.message ?? "event stream session failed"); + return i.session; +} +function Uo(e, t) { + return e ? { + ...t, + Authorization: `Bearer ${e}` + } : t; +} +async function Wo(e, t, n) { + let r = e.body?.getReader(); + if (!r) { + Go(await e.text(), t); + return; + } + let i = new TextDecoder(), a = ""; + for (; !n.aborted;) { + let e = await r.read(); + if (e.done) break; + a += i.decode(e.value, { stream: !0 }); + let n = a.split("\n\n"); + a = n.pop() ?? ""; + for (let e of n) Ko(e, t); + } + a += i.decode(), Go(a, t); +} +function Go(e, t) { + for (let n of e.split("\n\n")) Ko(n, t); +} +function Ko(e, t) { + let n = e.split("\n"), r = n.find((e) => e.startsWith("event: "))?.slice(7), i = n.filter((e) => e.startsWith("data: ")).map((e) => e.slice(6)).join("\n"); + if (i) try { + let e = qo(JSON.parse(i), r); + if (t.type && e.eventType !== t.type || t.source && e.emitterExtension !== t.source && e.sourceUri !== t.source) return; + t.onEvent(e); + } catch {} +} +function qo(e, t) { + let n = Jo(e) ? e : {}, r = Jo(n.data) ? n.data : {}, i = Yo(r.eventType) ?? Yo(n.type) ?? t ?? ""; + return { + id: Yo(r.id) ?? Yo(n.id) ?? "", + eventType: i, + payloadB64: Yo(r.payloadB64) ?? "", + timestampMs: Xo(r.timestampMs) ?? Zo(Xo(n.time)) ?? Date.now(), + sourceUri: Yo(r.sourceUri) ?? Yo(n.source) ?? "", + emitterExtension: Yo(r.emitterExtension) ?? Yo(r.extensionId) ?? Yo(n.source) ?? "", + raw: e + }; +} +function Jo(e) { + return typeof e == "object" && !!e; +} +function Yo(e) { + return typeof e == "string" ? e : void 0; +} +function Xo(e) { + return typeof e == "number" && Number.isFinite(e) ? e : void 0; +} +function Zo(e) { + return e === void 0 ? void 0 : e * 1e3; +} +//#endregion +//#region node_modules/.bun/tinykeys@3.0.0/node_modules/tinykeys/dist/tinykeys.module.js +var Qo = [ + "Shift", + "Meta", + "Alt", + "Control" +], $o = typeof navigator == "object" ? navigator.platform : "", es = /Mac|iPod|iPhone|iPad/.test($o), ts = es ? "Meta" : "Control", ns = $o === "Win32" ? ["Control", "Alt"] : es ? ["Alt"] : []; +function rs(e, t) { + return typeof e.getModifierState == "function" && (e.getModifierState(t) || ns.includes(t) && e.getModifierState("AltGraph")); +} +function is(e) { + return e.trim().split(" ").map(function(e) { + var t = e.split(/\b\+/), n = t.pop(), r = n.match(/^\((.+)\)$/); + return r && (n = RegExp("^" + r[1] + "$")), [t = t.map(function(e) { + return e === "$mod" ? ts : e; + }), n]; + }); +} +function as(e, t) { + var n = t[0], r = t[1]; + return !((r instanceof RegExp ? !r.test(e.key) && !r.test(e.code) : r.toUpperCase() !== e.key.toUpperCase() && r !== e.code) || n.find(function(t) { + return !rs(e, t); + }) || Qo.find(function(t) { + return !n.includes(t) && r !== t && rs(e, t); })); -}, os = /* @__PURE__ */ D({ patchProp: zo }, lo), ss; -function cs() { - return ss ||= ea(os); -} -var ls = ((...e) => { - cs().render(...e); -}), us = ((...e) => { - let t = cs().createApp(...e), { mount: n } = t; - return t.mount = (e) => { - let r = fs(e); - if (!r) return; - let i = t._component; - !A(i) && !i.render && !i.template && (i.template = r.innerHTML), r.nodeType === 1 && (r.textContent = ""); - let a = n(r, !1, ds(r)); - return r instanceof Element && (r.removeAttribute("v-cloak"), r.setAttribute("data-v-app", "")), a; - }, t; -}); -function ds(e) { - if (e instanceof SVGElement) return "svg"; - if (typeof MathMLElement == "function" && e instanceof MathMLElement) return "mathml"; } -function fs(e) { - return j(e) ? document.querySelector(e) : e; +function os(e, t) { + t === void 0 && (t = {}); + var n = t.timeout ?? 1e3, r = Object.keys(e).map(function(t) { + return [is(t), e[t]]; + }), i = /* @__PURE__ */ new Map(), a = null; + return function(e) { + e instanceof KeyboardEvent && (r.forEach(function(t) { + var n = t[0], r = t[1], a = i.get(n) || n; + as(e, a[0]) ? a.length > 1 ? i.set(n, a.slice(1)) : (i.delete(n), r(e)) : rs(e, e.key) || i.delete(n); + }), a && clearTimeout(a), a = setTimeout(i.clear.bind(i), n)); + }; +} +function ss(e, t, n) { + var r = n === void 0 ? {} : n, i = r.event, a = i === void 0 ? "keydown" : i, o = r.capture, s = os(t, { timeout: r.timeout }); + return e.addEventListener(a, s, o), function() { + e.removeEventListener(a, s, o); + }; +} +//#endregion +//#region packages/sdk-core/src/command-palette.ts +var cs = /* @__PURE__ */ new Map(), ls = /* @__PURE__ */ new Set(); +function us(e) { + cs.set(e.id, e); + for (let e of ls) e(); + return () => { + cs.delete(e.id); + for (let e of ls) e(); + }; +} +//#endregion +//#region packages/sdk-core/src/workspace-store.ts +var ds = null, fs = []; +function ps() { + return ds; +} +function ms() { + return ds === null ? new Promise((e) => { + fs.push(e); + }) : Promise.resolve(ds); } //#endregion //#region packages/sdk-vue/src/use-shortcuts.ts -function ps(e) { +function hs(e) { if (!(e instanceof HTMLElement)) return !1; if (e instanceof HTMLInputElement) { let t = e.type; @@ -3318,36 +3336,36 @@ function ps(e) { } return !!(e instanceof HTMLTextAreaElement || e.isContentEditable); } -function ms(e) { +function gs(e) { return /Escape/i.test(e) ? !0 : /\$mod|Cmd|Ctrl|Alt|Shift|Meta|Control/i.test(e); } -function hs(e) { +function _s(e) { let t = {}; for (let [n, r] of Object.entries(e)) { - if (ms(n)) { + if (gs(n)) { t[n] = r; continue; } t[n] = (e) => { - ps(e.target) || r(e); + hs(e.target) || r(e); }; } return t; } -function gs(e, t = {}) { +function vs(e, t = {}) { if (typeof window > "u") return; - let n = null, r = hs(e), i = () => { - n ||= fe(t.target ?? window, r); + let n = null, r = _s(e), i = () => { + n ||= ss(t.target ?? window, r); }, a = () => { n?.(), n = null; }; - t.enabled ? br(t.enabled, (e) => { + t.enabled ? V(t.enabled, (e) => { e ? i() : a(); - }, { immediate: !0 }) : i(), qr(a); + }, { immediate: !0 }) : i(), ir(a); } //#endregion //#region node_modules/.bun/marked@18.0.4/node_modules/marked/lib/marked.esm.js -function _s() { +function ys() { return { async: !1, breaks: !1, @@ -3361,12 +3379,12 @@ function _s() { walkTokens: null }; } -var vs = _s(); -function ys(e) { - vs = e; -} -var bs = { exec: () => null }; +var bs = ys(); function xs(e) { + bs = e; +} +var Ss = { exec: () => null }; +function Cs(e) { let t = []; return (n) => { let r = Math.max(0, Math.min(3, n - 1)), i = t[r]; @@ -3383,7 +3401,7 @@ function Z(e, t = "") { }; return r; } -var Ss = ((e = "") => { +var ws = ((e = "") => { try { return !!RegExp("(?<=1)(? { notSpaceStart: /^\S*/, endingNewline: /\n$/, listItemRegex: (e) => RegExp(`^( {0,3}${e})((?:[ ][^\\n]*)?(?:\\n|$))`), - nextBulletRegex: xs((e) => RegExp(`^ {0,${e}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`)), - hrRegex: xs((e) => RegExp(`^ {0,${e}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`)), - fencesBeginRegex: xs((e) => RegExp(`^ {0,${e}}(?:\`\`\`|~~~)`)), - headingBeginRegex: xs((e) => RegExp(`^ {0,${e}}#`)), - htmlBeginRegex: xs((e) => RegExp(`^ {0,${e}}<(?:[a-z].*>|!--)`, "i")), - blockquoteBeginRegex: xs((e) => RegExp(`^ {0,${e}}>`)) -}, Cs = /^(?:[ \t]*(?:\n|$))+/, ws = /^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/, Ts = /^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/, Es = /^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/, Ds = /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/, Os = / {0,3}(?:[*+-]|\d{1,9}[.)])/, ks = /^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/, As = Z(ks).replace(/bull/g, Os).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/\|table/g, "").getRegex(), js = Z(ks).replace(/bull/g, Os).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/table/g, / {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(), Ms = /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/, Ns = /^[^\n]+/, Ps = /(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/, Fs = Z(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label", Ps).replace("title", /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(), Is = Z(/^(bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g, Os).getRegex(), Ls = "address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul", Rs = /|$))/, zs = Z("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))", "i").replace("comment", Rs).replace("tag", Ls).replace("attribute", / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(), Bs = Z(Ms).replace("hr", Es).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("|table", "").replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", Ls).getRegex(), Vs = { - blockquote: Z(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph", Bs).getRegex(), - code: ws, - def: Fs, - fences: Ts, - heading: Ds, - hr: Es, - html: zs, - lheading: As, - list: Is, - newline: Cs, - paragraph: Bs, - table: bs, - text: Ns -}, Hs = Z("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr", Es).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("blockquote", " {0,3}>").replace("code", "(?: {4}| {0,3} )[^\\n]").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", Ls).getRegex(), Us = { - ...Vs, - lheading: js, - table: Hs, - paragraph: Z(Ms).replace("hr", Es).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("table", Hs).replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", Ls).getRegex() -}, Ws = { - ...Vs, - html: Z("^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))").replace("comment", Rs).replace(/tag/g, "(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(), + nextBulletRegex: Cs((e) => RegExp(`^ {0,${e}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`)), + hrRegex: Cs((e) => RegExp(`^ {0,${e}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`)), + fencesBeginRegex: Cs((e) => RegExp(`^ {0,${e}}(?:\`\`\`|~~~)`)), + headingBeginRegex: Cs((e) => RegExp(`^ {0,${e}}#`)), + htmlBeginRegex: Cs((e) => RegExp(`^ {0,${e}}<(?:[a-z].*>|!--)`, "i")), + blockquoteBeginRegex: Cs((e) => RegExp(`^ {0,${e}}>`)) +}, Ts = /^(?:[ \t]*(?:\n|$))+/, Es = /^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/, Ds = /^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/, Os = /^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/, ks = /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/, As = / {0,3}(?:[*+-]|\d{1,9}[.)])/, js = /^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/, Ms = Z(js).replace(/bull/g, As).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/\|table/g, "").getRegex(), Ns = Z(js).replace(/bull/g, As).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/table/g, / {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(), Ps = /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/, Fs = /^[^\n]+/, Is = /(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/, Ls = Z(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label", Is).replace("title", /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(), Rs = Z(/^(bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g, As).getRegex(), zs = "address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul", Bs = /|$))/, Vs = Z("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))", "i").replace("comment", Bs).replace("tag", zs).replace("attribute", / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(), Hs = Z(Ps).replace("hr", Os).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("|table", "").replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", zs).getRegex(), Us = { + blockquote: Z(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph", Hs).getRegex(), + code: Es, + def: Ls, + fences: Ds, + heading: ks, + hr: Os, + html: Vs, + lheading: Ms, + list: Rs, + newline: Ts, + paragraph: Hs, + table: Ss, + text: Fs +}, Ws = Z("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr", Os).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("blockquote", " {0,3}>").replace("code", "(?: {4}| {0,3} )[^\\n]").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", zs).getRegex(), Gs = { + ...Us, + lheading: Ns, + table: Ws, + paragraph: Z(Ps).replace("hr", Os).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("table", Ws).replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", zs).getRegex() +}, Ks = { + ...Us, + html: Z("^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))").replace("comment", Bs).replace(/tag/g, "(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(), def: /^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/, heading: /^(#{1,6})(.*)(?:\n+|$)/, - fences: bs, + fences: Ss, lheading: /^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/, - paragraph: Z(Ms).replace("hr", Es).replace("heading", " *#{1,6} *[^\n]").replace("lheading", As).replace("|table", "").replace("blockquote", " {0,3}>").replace("|fences", "").replace("|list", "").replace("|html", "").replace("|tag", "").getRegex() -}, Gs = /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/, Ks = /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/, qs = /^( {2,}|\\)\n(?!\s*$)/, Js = /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\`+)[^`]+\k(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace("precode-", Ss ? "(?`+)[^`]+\k(?!`)/).replace("html", /<(?! )[^<>]*?>/).getRegex(), rc = /^(?:\*+(?:((?!\*)punct)|([^\s*]))?)|^_+(?:((?!_)punct)|([^\s_]))?/, ic = Z(rc, "u").replace(/punct/g, Ys).getRegex(), ac = Z(rc, "u").replace(/punct/g, $s).getRegex(), oc = "^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)", sc = Z(oc, "gu").replace(/notPunctSpace/g, Zs).replace(/punctSpace/g, Xs).replace(/punct/g, Ys).getRegex(), cc = Z(oc, "gu").replace(/notPunctSpace/g, tc).replace(/punctSpace/g, ec).replace(/punct/g, $s).getRegex(), lc = Z("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)", "gu").replace(/notPunctSpace/g, Zs).replace(/punctSpace/g, Xs).replace(/punct/g, Ys).getRegex(), uc = Z(/^~~?(?:((?!~)punct)|[^\s~])/, "u").replace(/punct/g, Ys).getRegex(), dc = Z("^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)", "gu").replace(/notPunctSpace/g, Zs).replace(/punctSpace/g, Xs).replace(/punct/g, Ys).getRegex(), fc = Z(/\\(punct)/, "gu").replace(/punct/g, Ys).getRegex(), pc = Z(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme", /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email", /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(), mc = Z(Rs).replace("(?:-->|$)", "-->").getRegex(), hc = Z("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment", mc).replace("attribute", /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(), gc = /(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\])|[^\[\]\\`])*?/, _c = Z(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]+(?:\n[ \t]*)?|\n[ \t]*)(title))?\s*\)/).replace("label", gc).replace("href", /<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title", /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(), vc = Z(/^!?\[(label)\]\[(ref)\]/).replace("label", gc).replace("ref", Ps).getRegex(), yc = Z(/^!?\[(ref)\](?:\[\])?/).replace("ref", Ps).getRegex(), bc = Z("reflink|nolink(?!\\()", "g").replace("reflink", vc).replace("nolink", yc).getRegex(), xc = /[hH][tT][tT][pP][sS]?|[fF][tT][pP]/, Sc = { - _backpedal: bs, - anyPunctuation: fc, - autolink: pc, - blockSkip: nc, - br: qs, - code: Ks, - del: bs, - delLDelim: bs, - delRDelim: bs, - emStrongLDelim: ic, - emStrongRDelimAst: sc, - emStrongRDelimUnd: lc, - escape: Gs, - link: _c, - nolink: yc, - punctuation: Qs, - reflink: vc, - reflinkSearch: bc, - tag: hc, - text: Js, - url: bs -}, Cc = { - ...Sc, - link: Z(/^!?\[(label)\]\((.*?)\)/).replace("label", gc).getRegex(), - reflink: Z(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label", gc).getRegex() -}, wc = { - ...Sc, - emStrongRDelimAst: cc, - emStrongLDelim: ac, - delLDelim: uc, - delRDelim: dc, - url: Z(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol", xc).replace("email", /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(), - _backpedal: /(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/, - del: /^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/, - text: Z(/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\").replace("|fences", "").replace("|list", "").replace("|html", "").replace("|tag", "").getRegex() +}, qs = /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/, Js = /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/, Ys = /^( {2,}|\\)\n(?!\s*$)/, Xs = /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\`+)[^`]+\k(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace("precode-", ws ? "(?`+)[^`]+\k(?!`)/).replace("html", /<(?! )[^<>]*?>/).getRegex(), ac = /^(?:\*+(?:((?!\*)punct)|([^\s*]))?)|^_+(?:((?!_)punct)|([^\s_]))?/, oc = Z(ac, "u").replace(/punct/g, Zs).getRegex(), sc = Z(ac, "u").replace(/punct/g, tc).getRegex(), cc = "^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)", lc = Z(cc, "gu").replace(/notPunctSpace/g, $s).replace(/punctSpace/g, Qs).replace(/punct/g, Zs).getRegex(), uc = Z(cc, "gu").replace(/notPunctSpace/g, rc).replace(/punctSpace/g, nc).replace(/punct/g, tc).getRegex(), dc = Z("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)", "gu").replace(/notPunctSpace/g, $s).replace(/punctSpace/g, Qs).replace(/punct/g, Zs).getRegex(), fc = Z(/^~~?(?:((?!~)punct)|[^\s~])/, "u").replace(/punct/g, Zs).getRegex(), pc = Z("^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)", "gu").replace(/notPunctSpace/g, $s).replace(/punctSpace/g, Qs).replace(/punct/g, Zs).getRegex(), mc = Z(/\\(punct)/, "gu").replace(/punct/g, Zs).getRegex(), hc = Z(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme", /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email", /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(), gc = Z(Bs).replace("(?:-->|$)", "-->").getRegex(), _c = Z("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment", gc).replace("attribute", /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(), vc = /(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\])|[^\[\]\\`])*?/, yc = Z(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]+(?:\n[ \t]*)?|\n[ \t]*)(title))?\s*\)/).replace("label", vc).replace("href", /<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title", /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(), bc = Z(/^!?\[(label)\]\[(ref)\]/).replace("label", vc).replace("ref", Is).getRegex(), xc = Z(/^!?\[(ref)\](?:\[\])?/).replace("ref", Is).getRegex(), Sc = Z("reflink|nolink(?!\\()", "g").replace("reflink", bc).replace("nolink", xc).getRegex(), Cc = /[hH][tT][tT][pP][sS]?|[fF][tT][pP]/, wc = { + _backpedal: Ss, + anyPunctuation: mc, + autolink: hc, + blockSkip: ic, + br: Ys, + code: Js, + del: Ss, + delLDelim: Ss, + delRDelim: Ss, + emStrongLDelim: oc, + emStrongRDelimAst: lc, + emStrongRDelimUnd: dc, + escape: qs, + link: yc, + nolink: xc, + punctuation: ec, + reflink: bc, + reflinkSearch: Sc, + tag: _c, + text: Xs, + url: Ss }, Tc = { ...wc, - br: Z(qs).replace("{2,}", "*").getRegex(), - text: Z(wc.text).replace("\\b_", "\\b_| {2,}\\n").replace(/\{2,\}/g, "*").getRegex() + link: Z(/^!?\[(label)\]\((.*?)\)/).replace("label", vc).getRegex(), + reflink: Z(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label", vc).getRegex() }, Ec = { - normal: Vs, - gfm: Us, - pedantic: Ws + ...wc, + emStrongRDelimAst: uc, + emStrongLDelim: sc, + delLDelim: fc, + delRDelim: pc, + url: Z(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol", Cc).replace("email", /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(), + _backpedal: /(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/, + del: /^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/, + text: Z(/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\": ">", "\"": """, "'": "'" -}, kc = (e) => Oc[e]; -function Ac(e, t) { +}, jc = (e) => Ac[e]; +function Mc(e, t) { if (t) { - if (Q.escapeTest.test(e)) return e.replace(Q.escapeReplace, kc); - } else if (Q.escapeTestNoEncode.test(e)) return e.replace(Q.escapeReplaceNoEncode, kc); + if (Q.escapeTest.test(e)) return e.replace(Q.escapeReplace, jc); + } else if (Q.escapeTestNoEncode.test(e)) return e.replace(Q.escapeReplaceNoEncode, jc); return e; } -function jc(e) { +function Nc(e) { try { e = encodeURI(e).replace(Q.percentDecode, "%"); } catch { @@ -3543,7 +3561,7 @@ function jc(e) { } return e; } -function Mc(e, t) { +function Pc(e, t) { let n = e.replace(Q.findPipe, (e, t, n) => { let r = !1, i = t; for (; --i >= 0 && n[i] === "\\";) r = !r; @@ -3554,7 +3572,7 @@ function Mc(e, t) { for (; r < n.length; r++) n[r] = n[r].trim().replace(Q.slashPipe, "|"); return n; } -function Nc(e, t, n) { +function Fc(e, t, n) { let r = e.length; if (r === 0) return ""; let i = 0; @@ -3566,12 +3584,12 @@ function Nc(e, t, n) { } return e.slice(0, r - i); } -function Pc(e) { +function Ic(e) { let t = e.split("\n"), n = t.length - 1; for (; n >= 0 && Q.blankLine.test(t[n]);) n--; return t.length - n <= 2 ? e : t.slice(0, n + 1).join("\n"); } -function Fc(e, t) { +function Lc(e, t) { if (e.indexOf(t[1]) === -1) return -1; let n = 0; for (let r = 0; r < e.length; r++) if (e[r] === "\\") r++; @@ -3579,7 +3597,7 @@ function Fc(e, t) { else if (e[r] === t[1] && (n--, n < 0)) return r; return n > 0 ? -2 : -1; } -function Ic(e, t = 0) { +function Rc(e, t = 0) { let n = t, r = ""; for (let t of e) if (t === " ") { let e = 4 - n % 4; @@ -3587,7 +3605,7 @@ function Ic(e, t = 0) { } else r += t, n++; return r; } -function Lc(e, t, n, r, i) { +function zc(e, t, n, r, i) { let a = t.href, o = t.title || null, s = e[1].replace(i.other.outputLinkReplace, "$1"); r.state.inLink = !0; let c = { @@ -3600,7 +3618,7 @@ function Lc(e, t, n, r, i) { }; return r.state.inLink = !1, c; } -function Rc(e, t, n) { +function Bc(e, t, n) { let r = e.match(n.other.indentCodeCompensation); if (r === null) return t; let i = r[1]; @@ -3611,12 +3629,12 @@ function Rc(e, t, n) { return r.length >= i.length ? e.slice(i.length) : e; }).join("\n"); } -var zc = class { +var Vc = class { options; rules; lexer; constructor(e) { - this.options = e || vs; + this.options = e || bs; } space(e) { let t = this.rules.block.newline.exec(e); @@ -3628,7 +3646,7 @@ var zc = class { code(e) { let t = this.rules.block.code.exec(e); if (t) { - let e = this.options.pedantic ? t[0] : Pc(t[0]); + let e = this.options.pedantic ? t[0] : Ic(t[0]); return { type: "code", raw: e, @@ -3640,7 +3658,7 @@ var zc = class { fences(e) { let t = this.rules.block.fences.exec(e); if (t) { - let e = t[0], n = Rc(e, t[3] || "", this.rules); + let e = t[0], n = Bc(e, t[3] || "", this.rules); return { type: "code", raw: e, @@ -3654,12 +3672,12 @@ var zc = class { if (t) { let e = t[2].trim(); if (this.rules.other.endingHash.test(e)) { - let t = Nc(e, "#"); + let t = Fc(e, "#"); (this.options.pedantic || !t || this.rules.other.endingSpaceChar.test(t)) && (e = t.trim()); } return { type: "heading", - raw: Nc(t[0], "\n"), + raw: Fc(t[0], "\n"), depth: t[1].length, text: e, tokens: this.lexer.inline(e) @@ -3670,13 +3688,13 @@ var zc = class { let t = this.rules.block.hr.exec(e); if (t) return { type: "hr", - raw: Nc(t[0], "\n") + raw: Fc(t[0], "\n") }; } blockquote(e) { let t = this.rules.block.blockquote.exec(e); if (t) { - let e = Nc(t[0], "\n").split("\n"), n = "", r = "", i = []; + let e = Fc(t[0], "\n").split("\n"), n = "", r = "", i = []; for (; e.length > 0;) { let t = !1, a = [], o; for (o = 0; o < e.length; o++) if (this.rules.other.blockquoteStart.test(e[o])) a.push(e[o]), t = !0; @@ -3726,7 +3744,7 @@ ${c}` : c; let n = !1, r = "", s = ""; if (!(t = a.exec(e)) || this.rules.block.hr.test(e)) break; r = t[0], e = e.substring(r.length); - let c = Ic(t[2].split("\n", 1)[0], t[1].length), l = e.split("\n", 1)[0], u = !c.trim(), d = 0; + let c = Rc(t[2].split("\n", 1)[0], t[1].length), l = e.split("\n", 1)[0], u = !c.trim(), d = 0; if (this.options.pedantic ? (d = 2, s = c.trimStart()) : u ? d = t[1].length + 1 : (d = c.search(this.rules.other.nonSpaceChar), d = d > 4 ? 1 : d, s = c.slice(d), d += t[1].length), u && this.rules.other.blankLine.test(l) && (r += l + "\n", e = e.substring(l.length + 1), n = !0), !n) { let t = this.rules.other.nextBulletRegex(d), n = this.rules.other.hrRegex(d), i = this.rules.other.fencesBeginRegex(d), a = this.rules.other.headingBeginRegex(d), o = this.rules.other.htmlBeginRegex(d), f = this.rules.other.blockquoteBeginRegex(d); for (; e;) { @@ -3792,7 +3810,7 @@ ${c}` : c; html(e) { let t = this.rules.block.html.exec(e); if (t) { - let e = Pc(t[0]); + let e = Ic(t[0]); return { type: "html", block: !0, @@ -3809,7 +3827,7 @@ ${c}` : c; return { type: "def", tag: e, - raw: Nc(t[0], "\n"), + raw: Fc(t[0], "\n"), href: n, title: r }; @@ -3818,9 +3836,9 @@ ${c}` : c; table(e) { let t = this.rules.block.table.exec(e); if (!t || !this.rules.other.tableDelimiter.test(t[2])) return; - let n = Mc(t[1]), r = t[2].replace(this.rules.other.tableAlignChars, "").split("|"), i = t[3]?.trim() ? t[3].replace(this.rules.other.tableRowBlankLine, "").split("\n") : [], a = { + let n = Pc(t[1]), r = t[2].replace(this.rules.other.tableAlignChars, "").split("|"), i = t[3]?.trim() ? t[3].replace(this.rules.other.tableRowBlankLine, "").split("\n") : [], a = { type: "table", - raw: Nc(t[0], "\n"), + raw: Fc(t[0], "\n"), header: [], align: [], rows: [] @@ -3833,7 +3851,7 @@ ${c}` : c; header: !0, align: a.align[e] }); - for (let e of i) a.rows.push(Mc(e, a.header.length).map((e, t) => ({ + for (let e of i) a.rows.push(Pc(e, a.header.length).map((e, t) => ({ text: e, tokens: this.lexer.inline(e), header: !1, @@ -3848,7 +3866,7 @@ ${c}` : c; let e = t[1].trim(); return { type: "heading", - raw: Nc(t[0], "\n"), + raw: Fc(t[0], "\n"), depth: t[2].charAt(0) === "=" ? 1 : 2, text: e, tokens: this.lexer.inline(e) @@ -3901,10 +3919,10 @@ ${c}` : c; let e = t[2].trim(); if (!this.options.pedantic && this.rules.other.startAngleBracket.test(e)) { if (!this.rules.other.endAngleBracket.test(e)) return; - let t = Nc(e.slice(0, -1), "\\"); + let t = Fc(e.slice(0, -1), "\\"); if ((e.length - t.length) % 2 == 0) return; } else { - let e = Fc(t[2], "()"); + let e = Lc(t[2], "()"); if (e === -2) return; if (e > -1) { let n = (t[0].indexOf("!") === 0 ? 5 : 4) + t[1].length + e; @@ -3916,7 +3934,7 @@ ${c}` : c; let e = this.rules.other.pedanticHrefTitle.exec(n); e && (n = e[1], r = e[3]); } else r = t[3] ? t[3].slice(1, -1) : ""; - return n = n.trim(), this.rules.other.startAngleBracket.test(n) && (n = this.options.pedantic && !this.rules.other.endAngleBracket.test(e) ? n.slice(1) : n.slice(1, -1)), Lc(t, { + return n = n.trim(), this.rules.other.startAngleBracket.test(n) && (n = this.options.pedantic && !this.rules.other.endAngleBracket.test(e) ? n.slice(1) : n.slice(1, -1)), zc(t, { href: n && n.replace(this.rules.inline.anyPunctuation, "$1"), title: r && r.replace(this.rules.inline.anyPunctuation, "$1") }, t[0], this.lexer, this.rules); @@ -3934,7 +3952,7 @@ ${c}` : c; text: e }; } - return Lc(n, e, n[0], this.lexer, this.rules); + return zc(n, e, n[0], this.lexer, this.rules); } } emStrong(e, t, n = "") { @@ -4066,29 +4084,29 @@ ${c}` : c; }; } } -}, Bc = class e { +}, Hc = class e { tokens; options; state; inlineQueue; tokenizer; constructor(e) { - this.tokens = [], this.tokens.links = Object.create(null), this.options = e || vs, this.options.tokenizer = this.options.tokenizer || new zc(), this.tokenizer = this.options.tokenizer, this.tokenizer.options = this.options, this.tokenizer.lexer = this, this.inlineQueue = [], this.state = { + this.tokens = [], this.tokens.links = Object.create(null), this.options = e || bs, this.options.tokenizer = this.options.tokenizer || new Vc(), this.tokenizer = this.options.tokenizer, this.tokenizer.options = this.options, this.tokenizer.lexer = this, this.inlineQueue = [], this.state = { inLink: !1, inRawBlock: !1, top: !0 }; let t = { other: Q, - block: Ec.normal, - inline: Dc.normal + block: Oc.normal, + inline: kc.normal }; - this.options.pedantic ? (t.block = Ec.pedantic, t.inline = Dc.pedantic) : this.options.gfm && (t.block = Ec.gfm, this.options.breaks ? t.inline = Dc.breaks : t.inline = Dc.gfm), this.tokenizer.rules = t; + this.options.pedantic ? (t.block = Oc.pedantic, t.inline = kc.pedantic) : this.options.gfm && (t.block = Oc.gfm, this.options.breaks ? t.inline = kc.breaks : t.inline = kc.gfm), this.tokenizer.rules = t; } static get rules() { return { - block: Ec, - inline: Dc + block: Oc, + inline: kc }; } static lex(t, n) { @@ -4288,18 +4306,18 @@ ${c}` : c; if (this.options.silent) console.error(t); else throw Error(t); } -}, Vc = class { +}, Uc = class { options; parser; constructor(e) { - this.options = e || vs; + this.options = e || bs; } space(e) { return ""; } code({ text: e, lang: t, escaped: n }) { let r = (t || "").match(Q.notSpaceStart)?.[0], i = e.replace(Q.endingNewline, "") + "\n"; - return r ? "
    " + (n ? i : Ac(i, !0)) + "
    \n" : "
    " + (n ? i : Ac(i, !0)) + "
    \n"; + return r ? "
    " + (n ? i : Mc(i, !0)) + "
    \n" : "
    " + (n ? i : Mc(i, !0)) + "
    \n"; } blockquote({ tokens: e }) { return `
    @@ -4369,7 +4387,7 @@ ${e} return `${this.parser.parseInline(e)}`; } codespan({ text: e }) { - return `${Ac(e, !0)}`; + return `${Mc(e, !0)}`; } br(e) { return "
    "; @@ -4378,24 +4396,24 @@ ${e} return `${this.parser.parseInline(e)}`; } link({ href: e, title: t, tokens: n }) { - let r = this.parser.parseInline(n), i = jc(e); + let r = this.parser.parseInline(n), i = Nc(e); if (i === null) return r; e = i; let a = "
    ", a; + return t && (a += " title=\"" + Mc(t) + "\""), a += ">" + r + "", a; } image({ href: e, title: t, text: n, tokens: r }) { r && (n = this.parser.parseInline(r, this.parser.textRenderer)); - let i = jc(e); - if (i === null) return Ac(n); + let i = Nc(e); + if (i === null) return Mc(n); e = i; - let a = `${Ac(n)} checkbox({ raw: e }) { return e; } -}, Uc = class e { +}, Gc = class e { options; renderer; textRenderer; constructor(e) { - this.options = e || vs, this.options.renderer = this.options.renderer || new Vc(), this.renderer = this.options.renderer, this.renderer.options = this.options, this.renderer.parser = this, this.textRenderer = new Hc(); + this.options = e || bs, this.options.renderer = this.options.renderer || new Uc(), this.renderer = this.options.renderer, this.renderer.options = this.options, this.renderer.parser = this, this.textRenderer = new Wc(); } static parse(t, n) { return new e(n).parse(t); @@ -4577,11 +4595,11 @@ ${e} } return n; } -}, Wc = class { +}, Kc = class { options; block; constructor(e) { - this.options = e || vs; + this.options = e || bs; } static passThroughHooks = new Set([ "preprocess", @@ -4607,22 +4625,22 @@ ${e} return e; } provideLexer(e = this.block) { - return e ? Bc.lex : Bc.lexInline; + return e ? Hc.lex : Hc.lexInline; } provideParser(e = this.block) { - return e ? Uc.parse : Uc.parseInline; + return e ? Gc.parse : Gc.parseInline; } -}, Gc = class { - defaults = _s(); +}, qc = class { + defaults = ys(); options = this.setOptions; parse = this.parseMarkdown(!0); parseInline = this.parseMarkdown(!1); - Parser = Uc; - Renderer = Vc; - TextRenderer = Hc; - Lexer = Bc; - Tokenizer = zc; - Hooks = Wc; + Parser = Gc; + Renderer = Uc; + TextRenderer = Wc; + Lexer = Hc; + Tokenizer = Vc; + Hooks = Kc; constructor(...e) { this.use(...e); } @@ -4673,7 +4691,7 @@ ${e} } "childTokens" in e && e.childTokens && (t.childTokens[e.name] = e.childTokens); }), n.extensions = t), e.renderer) { - let t = this.defaults.renderer || new Vc(this.defaults); + let t = this.defaults.renderer || new Uc(this.defaults); for (let n in e.renderer) { if (!(n in t)) throw Error(`renderer '${n}' does not exist`); if (["options", "parser"].includes(n)) continue; @@ -4686,7 +4704,7 @@ ${e} n.renderer = t; } if (e.tokenizer) { - let t = this.defaults.tokenizer || new zc(this.defaults); + let t = this.defaults.tokenizer || new Vc(this.defaults); for (let n in e.tokenizer) { if (!(n in t)) throw Error(`tokenizer '${n}' does not exist`); if ([ @@ -4703,13 +4721,13 @@ ${e} n.tokenizer = t; } if (e.hooks) { - let t = this.defaults.hooks || new Wc(); + let t = this.defaults.hooks || new Kc(); for (let n in e.hooks) { if (!(n in t)) throw Error(`hook '${n}' does not exist`); if (["options", "block"].includes(n)) continue; let r = n, i = e.hooks[r], a = t[r]; - Wc.passThroughHooks.has(n) ? t[r] = (e) => { - if (this.defaults.async && Wc.passThroughHooksRespectAsync.has(n)) return (async () => { + Kc.passThroughHooks.has(n) ? t[r] = (e) => { + if (this.defaults.async && Kc.passThroughHooksRespectAsync.has(n)) return (async () => { let n = await i.call(t, e); return a.call(t, n); })(); @@ -4746,10 +4764,10 @@ ${e} }, this; } lexer(e, t) { - return Bc.lex(e, t ?? this.defaults); + return Hc.lex(e, t ?? this.defaults); } parser(e, t) { - return Uc.parse(e, t ?? this.defaults); + return Gc.parse(e, t ?? this.defaults); } parseMarkdown(e) { return (t, n) => { @@ -4761,16 +4779,16 @@ ${e} if (typeof t > "u" || t === null) return a(/* @__PURE__ */ Error("marked(): input parameter is undefined or null")); if (typeof t != "string") return a(/* @__PURE__ */ Error("marked(): input parameter is of type " + Object.prototype.toString.call(t) + ", string expected")); if (i.hooks && (i.hooks.options = i, i.hooks.block = e), i.async) return (async () => { - let n = i.hooks ? await i.hooks.preprocess(t) : t, r = await (i.hooks ? await i.hooks.provideLexer(e) : e ? Bc.lex : Bc.lexInline)(n, i), a = i.hooks ? await i.hooks.processAllTokens(r) : r; + let n = i.hooks ? await i.hooks.preprocess(t) : t, r = await (i.hooks ? await i.hooks.provideLexer(e) : e ? Hc.lex : Hc.lexInline)(n, i), a = i.hooks ? await i.hooks.processAllTokens(r) : r; i.walkTokens && await Promise.all(this.walkTokens(a, i.walkTokens)); - let o = await (i.hooks ? await i.hooks.provideParser(e) : e ? Uc.parse : Uc.parseInline)(a, i); + let o = await (i.hooks ? await i.hooks.provideParser(e) : e ? Gc.parse : Gc.parseInline)(a, i); return i.hooks ? await i.hooks.postprocess(o) : o; })().catch(a); try { i.hooks && (t = i.hooks.preprocess(t)); - let n = (i.hooks ? i.hooks.provideLexer(e) : e ? Bc.lex : Bc.lexInline)(t, i); + let n = (i.hooks ? i.hooks.provideLexer(e) : e ? Hc.lex : Hc.lexInline)(t, i); i.hooks && (n = i.hooks.processAllTokens(n)), i.walkTokens && this.walkTokens(n, i.walkTokens); - let r = (i.hooks ? i.hooks.provideParser(e) : e ? Uc.parse : Uc.parseInline)(n, i); + let r = (i.hooks ? i.hooks.provideParser(e) : e ? Gc.parse : Gc.parseInline)(n, i); return i.hooks && (r = i.hooks.postprocess(r)), r; } catch (e) { return a(e); @@ -4780,27 +4798,27 @@ ${e} onError(e, t) { return (n) => { if (n.message += "\nPlease report this to https://github.com/markedjs/marked.", e) { - let e = "

    An error occurred:

    " + Ac(n.message + "", !0) + "
    "; + let e = "

    An error occurred:

    " + Mc(n.message + "", !0) + "
    "; return t ? Promise.resolve(e) : e; } if (t) return Promise.reject(n); throw n; }; } -}, Kc = new Gc(); +}, Jc = new qc(); function $(e, t) { - return Kc.parse(e, t); + return Jc.parse(e, t); } $.options = $.setOptions = function(e) { - return Kc.setOptions(e), $.defaults = Kc.defaults, ys($.defaults), $; -}, $.getDefaults = _s, $.defaults = vs, $.use = function(...e) { - return Kc.use(...e), $.defaults = Kc.defaults, ys($.defaults), $; + return Jc.setOptions(e), $.defaults = Jc.defaults, xs($.defaults), $; +}, $.getDefaults = ys, $.defaults = bs, $.use = function(...e) { + return Jc.use(...e), $.defaults = Jc.defaults, xs($.defaults), $; }, $.walkTokens = function(e, t) { - return Kc.walkTokens(e, t); -}, $.parseInline = Kc.parseInline, $.Parser = Uc, $.parser = Uc.parse, $.Renderer = Vc, $.TextRenderer = Hc, $.Lexer = Bc, $.lexer = Bc.lex, $.Tokenizer = zc, $.Hooks = Wc, $.parse = $, $.options, $.setOptions, $.use, $.walkTokens, $.parseInline, Uc.parse, Bc.lex; + return Jc.walkTokens(e, t); +}, $.parseInline = Jc.parseInline, $.Parser = Gc, $.parser = Gc.parse, $.Renderer = Uc, $.TextRenderer = Wc, $.Lexer = Hc, $.lexer = Hc.lex, $.Tokenizer = Vc, $.Hooks = Kc, $.parse = $, $.options, $.setOptions, $.use, $.walkTokens, $.parseInline, Gc.parse, Hc.lex; //#endregion //#region packages/sdk-vue/src/markdown.ts -var qc = new Set(/* @__PURE__ */ "h1.h2.h3.h4.h5.h6.p.ul.ol.li.strong.em.b.i.code.pre.a.img.br.hr.blockquote.table.thead.tbody.tfoot.tr.th.td.dl.dt.dd.details.summary.sup.sub.del.ins.s.mark.abbr.cite.q.figure.figcaption.caption.span.div.section.article.aside.header.footer.nav.main".split(".")), Jc = new Set([ +var Yc = new Set(/* @__PURE__ */ "h1.h2.h3.h4.h5.h6.p.ul.ol.li.strong.em.b.i.code.pre.a.img.br.hr.blockquote.table.thead.tbody.tfoot.tr.th.td.dl.dt.dd.details.summary.sup.sub.del.ins.s.mark.abbr.cite.q.figure.figcaption.caption.span.div.section.article.aside.header.footer.nav.main".split(".")), Xc = new Set([ "class", "id", "title", @@ -4813,7 +4831,7 @@ var qc = new Set(/* @__PURE__ */ "h1.h2.h3.h4.h5.h6.p.ul.ol.li.strong.em.b.i.cod "aria-controls", "role", "data-lang" -]), Yc = { +]), Zc = { a: new Set([ "href", "rel", @@ -4832,29 +4850,29 @@ var qc = new Set(/* @__PURE__ */ "h1.h2.h3.h4.h5.h6.p.ul.ol.li.strong.em.b.i.cod "scope" ]), td: new Set(["colspan", "rowspan"]) -}, Xc = /^\s*(?:javascript|vbscript|data)\s*:/i; -function Zc(e) { - return !Xc.test(e); +}, Qc = /^\s*(?:javascript|vbscript|data)\s*:/i; +function $c(e) { + return !Qc.test(e); } -function Qc(e) { +function el(e) { return e.replace(/&/g, "&").replace(/"/g, """).replace(//g, ">"); } -function $c(e, t) { +function tl(e, t) { if (!t.trim()) return ""; let n = [], r = /\s+([a-zA-Z][a-zA-Z0-9_:-]*)(?:\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s"'`=>]+)))?/g, i, a = !1, o = []; for (; (i = r.exec(t)) !== null;) { let t = (i[1] ?? "").toLowerCase(), n = i[2] ?? i[3] ?? i[4] ?? ""; if (t.startsWith("on")) continue; - let r = Yc[e]; - (Jc.has(t) || r && r.has(t)) && ((t === "href" || t === "src") && !Zc(n) || (t === "rel" && (a = !0), o.push({ + let r = Zc[e]; + (Xc.has(t) || r && r.has(t)) && ((t === "href" || t === "src") && !$c(n) || (t === "rel" && (a = !0), o.push({ name: t, value: n }))); } - for (let { name: e, value: t } of o) n.push(" " + e + "=\"" + Qc(t) + "\""); + for (let { name: e, value: t } of o) n.push(" " + e + "=\"" + el(t) + "\""); return e === "a" && !a && n.push(" rel=\"noopener noreferrer\""), n.join(""); } -var el = [ +var nl = [ "script", "style", "iframe", @@ -4867,7 +4885,7 @@ var el = [ "textarea", "svg", "math" -], tl = new Set([ +], rl = new Set([ "input", "button", "meta", @@ -4875,9 +4893,9 @@ var el = [ "base", "applet" ]); -function nl(e) { +function il(e) { let t = e; - for (let e of el) { + for (let e of nl) { let n = RegExp("<" + e + "(\\s[^>]*)?>([\\s\\S]*?)<\\/" + e + ">", "gi"); t = t.replace(n, ""); let r = RegExp("<" + e + "(\\s[^>]*)?>", "gi"); @@ -4887,30 +4905,34 @@ function nl(e) { } return t = t.replace(/<(\/?)([a-zA-Z][a-zA-Z0-9-]*)(\s[^>]*)?(\/?)>/g, (e, t, n, r, i) => { let a = n.toLowerCase(); - if (tl.has(a) || !qc.has(a)) return ""; - let o = $c(a, r ?? ""), s = i ? " /" : ""; + if (rl.has(a) || !Yc.has(a)) return ""; + let o = tl(a, r ?? ""), s = i ? " /" : ""; return "<" + t + a + o + s + ">"; }), t; } -function rl(e, t) { +function al(e, t) { let n = encodeURIComponent(t); return e.split(/(]*>[\s\S]*?<\/code>)/).map((e, t) => t % 2 == 1 ? e : e.replace(/(^|[^\w&])#(\d+)\b/g, (e, t, r) => t + "#" + r + "")).join(""); } -function il(e, t = {}) { +function ol(e, t = {}) { if (!e) return ""; - let n = nl(new Gc().parse(e, { async: !1 })); - return t.workspaceId && (n = rl(n, t.workspaceId)), n; + let n = il(new qc().parse(e, { async: !1 })); + return t.workspaceId && (n = al(n, t.workspaceId)), n; +} +function sl(e, t = 280) { + let n = e.replace(/\s+/g, " ").trim(); + return n.length <= t ? n : n.slice(0, t) + "…"; } //#endregion //#region packages/sdk-vue/src/parse-query.ts -function al(e, t) { +function cl(e, t) { let n = {}, r = /* @__PURE__ */ new Set(), i = [], a = new Set(t); if (!e || !e.trim()) return { text: "", filters: n, unknown: [] }; - let o = ol(e); + let o = ll(e); for (let e of o) { if (e.kind === "plain") { i.push(e.text); @@ -4924,13 +4946,13 @@ function al(e, t) { unknown: Array.from(r) }; } -function ol(e) { +function ll(e) { let t = [], n = e.length, r = 0; for (; r < n;) { - for (; r < n && sl(e.charCodeAt(r));) r += 1; + for (; r < n && ul(e.charCodeAt(r));) r += 1; if (r >= n) break; let i = r, a = -1; - for (; r < n && !sl(e.charCodeAt(r));) { + for (; r < n && !ul(e.charCodeAt(r));) { if (e.charCodeAt(r) === 58 && a === -1 && (a = r, r + 1 < n && e.charCodeAt(r + 1) === 34)) { for (r += 2; r < n && e.charCodeAt(r) !== 34;) r += 1; r < n && (r += 1); @@ -4941,7 +4963,7 @@ function ol(e) { let o = e.slice(i, r); if (a > i) { let n = e.slice(i, a); - if (cl(n)) { + if (dl(n)) { let i = n.toLowerCase(), o = a + 1, s = e.slice(o, r); s.startsWith("\"") && s.endsWith("\"") && s.length >= 2 && (s = s.slice(1, -1)), t.push({ kind: "kv", @@ -4958,39 +4980,74 @@ function ol(e) { } return t; } -function sl(e) { +function ul(e) { return e === 32 || e === 9 || e === 10 || e === 13; } -function cl(e) { - if (e.length === 0 || !ll(e.charCodeAt(0))) return !1; +function dl(e) { + if (e.length === 0 || !fl(e.charCodeAt(0))) return !1; for (let t = 1; t < e.length; t += 1) { let n = e.charCodeAt(t); - if (!ll(n) && !ul(n) && n !== 95 && n !== 45) return !1; + if (!fl(n) && !pl(n) && n !== 95 && n !== 45) return !1; } return !0; } -function ll(e) { +function fl(e) { return e >= 65 && e <= 90 || e >= 97 && e <= 122; } -function ul(e) { +function pl(e) { return e >= 48 && e <= 57; } //#endregion +//#region packages/sdk-vue/src/project-query.ts +function ml(e, t) { + let n = _l(t.projectFilter); + if (!n) { + e.delete("project"); + return; + } + hl(n, t) ? e.set("project", n) : e.delete("project"); +} +function hl(e, t) { + let n = _l(t.scopedProjectName); + if (!n) return !0; + if (n !== e) return !1; + let r = gl(t.currentSearch); + return r.get("project") === e && !r.has("projectName"); +} +function gl(e) { + return e instanceof URLSearchParams ? new URLSearchParams(e) : new URLSearchParams(e ?? ""); +} +function _l(e) { + return (e?.trim() ?? "") || null; +} +//#endregion +//#region packages/sdk-vue/src/extension-hrefs.ts +function vl(e, t = "/", n = {}) { + let r = zo(e, t), i = yl(n.repositorySegments); + if (!i) return r; + let a = r.slice(`/x/${e}`.length); + return `${`/r/${i.map(encodeURIComponent).join("/")}`}/${encodeURIComponent(e)}${a}`; +} +function yl(e) { + let t = e?.map((e) => e.trim()).filter(Boolean) ?? []; + return t.length > 0 ? t : null; +} +//#endregion //#region packages/sdk-vue/src/classify-principal.ts -var dl = { +var bl = { kind: "unknown", label: "unknown", glyph: "·", tone: "neutral" }; -function fl(e) { - if (!e) return dl; +function xl(e) { + if (!e) return bl; let [t = "", ...n] = e.replace(/^comtrya:\/\//, "").split("/"), r = n.join("/") || e; switch (t) { case "user": return { kind: "human", label: r, - glyph: pl(r), + glyph: Sl(r), tone: "human" }; case "agent": return { @@ -5020,47 +5077,47 @@ function fl(e) { default: return { kind: "unknown", label: r, - glyph: pl(r) || "·", + glyph: Sl(r) || "·", tone: "neutral" }; } } -function pl(e) { +function Sl(e) { return e.slice(0, 1).toUpperCase(); } //#endregion //#region packages/sdk-vue/src/comtrya-config.ts -function ml() { +function Cl() { if (typeof window > "u") return []; let e = window.location.pathname; if (!e.startsWith("/r/")) return []; let t = e.slice(3), n = t.indexOf("/p/"); return (n >= 0 ? t.slice(0, n) : t).split("/").filter(Boolean).map(decodeURIComponent); } -async function hl(e) { +async function wl(e) { try { - let t = e ?? ml(); - return t.length === 0 ? [] : (((await d().query("query ComtryaProjects($segments: [String!]!) {\n workspace { repositoryByPath(segments: $segments) { comtryaConfig } }\n }", { segments: t })).workspace?.repositoryByPath?.comtryaConfig ?? null)?.projects ?? []).filter((e) => typeof e == "object" && !!e); + let t = e ?? Cl(); + return t.length === 0 ? [] : (((await Lo().query("query ComtryaProjects($segments: [String!]!) {\n workspace { repositoryByPath(segments: $segments) { comtryaConfig } }\n }", { segments: t })).workspace?.repositoryByPath?.comtryaConfig ?? null)?.projects ?? []).filter((e) => typeof e == "object" && !!e); } catch { return []; } } -async function gl(e, t) { - return ((await hl(t)).find((t) => t.name === e)?.owners ?? []).map((e) => e?.ref).filter((e) => typeof e == "string" && e.length > 0); +async function Tl(e, t) { + return ((await wl(t)).find((t) => t.name === e)?.owners ?? []).map((e) => e?.ref).filter((e) => typeof e == "string" && e.length > 0); } //#endregion //#region packages/sdk-vue/src/LabelPill.vue?vue&type=script&setup=true&lang.ts -var _l = ["title"], vl = { +var El = ["title"], Dl = { key: 0, class: "label-pill-value" -}, yl = { class: "label-pill-type" }, bl = { class: "label-pill-value" }, xl = /* @__PURE__ */ Or({ +}, Ol = { class: "label-pill-type" }, kl = { class: "label-pill-value" }, Al = /* @__PURE__ */ zn({ __name: "LabelPill", props: { name: { type: String }, catalog: { type: [Object, null] } }, setup(e) { - let t = e, n = X(() => t.catalog ? t.catalog[t.name] ?? null : null), r = X(() => { + let t = e, n = Y(() => t.catalog ? t.catalog[t.name] ?? null : null), r = Y(() => { let e = t.name.split("::"), r = e.length === 2 && !!e[0] && !!e[1], i = n.value?.kind; return r ? { kind: i ?? "scoped", @@ -5071,76 +5128,84 @@ var _l = ["title"], vl = { type: "", value: t.name }; - }), i = X(() => n.value?.color ?? null), a = X(() => n.value?.description ?? null); + }), i = Y(() => n.value?.color ?? null), a = Y(() => n.value?.description ?? null); return (e, t) => (W(), G("span", { - class: tt(["label-pill", [`label-pill--${r.value.kind}`]]), + class: M(["label-pill", [`label-pill--${r.value.kind}`]]), title: a.value ?? void 0, - style: Xe(i.value ? { "--label-color": i.value } : void 0) - }, [r.value.kind === "plain" ? (W(), G("span", vl, N(r.value.value), 1)) : (W(), G(U, { key: 1 }, [ - K("span", yl, N(r.value.type), 1), + style: ce(i.value ? { "--label-color": i.value } : void 0) + }, [r.value.kind === "plain" ? (W(), G("span", Dl, N(r.value.value), 1)) : (W(), G(U, { key: 1 }, [ + K("span", Ol, N(r.value.type), 1), t[0] ||= K("span", { class: "label-pill-sep", "aria-hidden": "true" }, "::", -1), - K("span", bl, N(r.value.value), 1) - ], 64))], 14, _l)); + K("span", kl, N(r.value.value), 1) + ], 64))], 14, El)); } }); //#endregion //#region packages/sdk-vue/src/index.ts -function Sl(e) { - Cl(e.tagName, e.component); - let t = /* @__PURE__ */ Uo(e.component, { shadowRoot: e.shadowRoot ?? !1 }); +function jl(e) { + Ml(e.tagName, e.component); + let t = /* @__PURE__ */ eo(e.component, { shadowRoot: e.shadowRoot ?? !1 }); for (let [n, r] of Object.entries(e.propertyAliases ?? {})) Object.defineProperty(t.prototype, n, { configurable: !0, get() { return this[r]; }, set(e) { - this[r] = e, typeof e == "string" && this.setAttribute(Tl(r), e); + this[r] = e, typeof e == "string" && this.setAttribute(Pl(r), e); } }); return typeof customElements < "u" && !customElements.get(e.tagName) && customElements.define(e.tagName, t), t; } -function Cl(e, t) { +function Ml(e, t) { if (typeof document > "u") return; - let n = wl(t); + let n = Nl(t); if (n.length === 0) return; let r = `comtrya-widget-styles:${e}`; if (document.head.querySelector(`style[data-comtrya-widget-styles="${r}"]`)) return; let i = document.createElement("style"); i.dataset.comtryaWidgetStyles = r, i.textContent = n.join("\n"), document.head.append(i); } -function wl(e) { +function Nl(e) { if (!e || typeof e != "object") return []; let t = e.styles; return Array.isArray(t) ? t.filter((e) => typeof e == "string") : []; } -function Tl(e) { +function Pl(e) { return e.replace(/[A-Z]/g, (e) => `-${e.toLowerCase()}`); } //#endregion //#region ../extensions/first-party/ext_epics/dist/ext_epics.client.ts -var El = { - createEpic: async (e) => o("ext_epics", "epics", "create-epic", e), - changeStateEpic: async (e) => o("ext_epics", "epics", "change-state-epic", e), - assignProject: async (e) => o("ext_epics", "epics", "assign-project", e), - getEpic: async (e) => o("ext_epics", "epics", "get-epic", e), - listEpics: async (e) => o("ext_epics", "epics", "list-epics", e), - byRefEpic: async (e) => o("ext_epics", "epics", "by-ref-epic", e), - byRefsEpic: async (e) => o("ext_epics", "epics", "by-refs-epic", e), - progressEpic: async (e) => o("ext_epics", "epics", "progress-epic", e), - issuesInEpic: async (e) => o("ext_epics", "epics", "issues-in-epic", e), - childrenOfEpic: async (e) => o("ext_epics", "epics", "children-of-epic", e) -}, Dl = "query($from: ResourceURN!, $kind: ResourceURN) {\n relations.outgoing(from: $from, kind: $kind) { id kind from to source target }\n}", Ol = "mutation($input: RelationCreateInput!) {\n relations.create(input: $input) { id kind from to source target }\n}", kl = "mutation($input: RelationDeleteInput!) {\n relations.delete(input: $input)\n}"; -function Al(e, t) { +var Fl = { + createEpic: async (e) => X("ext_epics", "epics", "create-epic", e), + changeStateEpic: async (e) => X("ext_epics", "epics", "change-state-epic", e), + assignProject: async (e) => X("ext_epics", "epics", "assign-project", e), + updateEpic: async (e) => X("ext_epics", "epics", "update-epic", e), + getEpic: async (e) => X("ext_epics", "epics", "get-epic", e), + listEpics: async (e) => X("ext_epics", "epics", "list-epics", e), + byRefEpic: async (e) => X("ext_epics", "epics", "by-ref-epic", e), + byRefsEpic: async (e) => X("ext_epics", "epics", "by-refs-epic", e), + progressEpic: async (e) => X("ext_epics", "epics", "progress-epic", e), + roadmapBoard: async (e) => X("ext_epics", "epics", "roadmap-board", e), + ownerBoard: async (e) => X("ext_epics", "epics", "owner-board", e), + projectBoard: async (e) => X("ext_epics", "epics", "project-board", e), + labelBoard: async (e) => X("ext_epics", "epics", "label-board", e), + priorityBoard: async (e) => X("ext_epics", "epics", "priority-board", e), + milestoneBoard: async (e) => X("ext_epics", "epics", "milestone-board", e), + targetBoard: async (e) => X("ext_epics", "epics", "target-board", e), + issuesInEpic: async (e) => X("ext_epics", "epics", "issues-in-epic", e), + childrenOfEpic: async (e) => X("ext_epics", "epics", "children-of-epic", e) +}, Il = "query($from: ResourceURN!, $kind: ResourceURN) {\n relations.outgoing(from: $from, kind: $kind) { id kind from to source target }\n}", Ll = "mutation($input: RelationCreateInput!) {\n relations.create(input: $input) { id kind from to source target }\n}", Rl = "mutation($input: RelationDeleteInput!) {\n relations.delete(input: $input)\n}"; +function zl(e, t) { if (e.ok) return e.value; throw Error(`${t}: ${e.error.message}`); } -function jl(e) { +function Bl(e) { return `comtrya://workspace/${e}`; } -function Ml(e) { +function Vl(e) { switch (e) { case "IN_PROGRESS": case "AT_RISK": @@ -5149,13 +5214,14 @@ function Ml(e) { default: return "PLANNED"; } } -function Nl(e) { +function Hl(e) { return { id: e.id, workspaceId: e.workspaceId ?? e.workspace?.replace(/^comtrya:\/\/workspace\//, "") ?? "", + number: e.number ?? null, title: e.title, bodyMarkdown: e.bodyMarkdown ?? "", - state: Ml(e.state), + state: Vl(e.state), targetDate: e.targetDate ?? null, ownerRef: e.ownerRef ?? null, labels: e.labels ?? [], @@ -5164,35 +5230,79 @@ function Nl(e) { projectName: e.projectName ?? null }; } -async function Pl(e, t) { - let n = Al(await El.byRefEpic(t), "epicByRef"); - return n ? Nl(n) : null; +function Ul(e) { + return { + workspace: e.workspace ?? "", + total: e.total ?? 0, + today: e.today ?? null, + columns: (e.columns ?? []).map((e) => ({ + key: e.key, + label: e.label, + count: e.count, + ownerRef: e.ownerRef ?? null, + projectName: e.projectName ?? null, + priority: e.priority ?? null, + milestone: e.milestone ?? null, + cards: (e.cards ?? []).map((e) => ({ + epic: Hl(e.epic), + progress: e.progress ?? null, + ownerRef: e.ownerRef ?? null, + projectName: e.projectName ?? null, + priority: e.priority ?? null, + priorityLabel: e.priorityLabel ?? null, + milestone: e.milestone ?? null, + milestoneLabel: e.milestoneLabel ?? null + })) + })) + }; +} +async function Wl(e, t) { + let n = zl(await Fl.byRefEpic(t), "epicByRef"); + return n ? Hl(n) : null; } -async function Fl(e, t) { - let n = Al(await El.listEpics({ - workspace: jl(t.workspaceId), +async function Gl(e, t) { + let n = zl(await Fl.listEpics({ + workspace: Bl(t.workspaceId), limit: 1024 - }), "listEpics").map(Nl), r = t.state ? Ml(t.state) : null; + }), "listEpics").map(Hl), r = t.state ? Vl(t.state) : null; return r ? n.filter((e) => e.state === r) : n; } -async function Il(e, t) { - return Al(await El.progressEpic(t), "epicProgress"); +async function Kl(e, t) { + let n = { + workspace: Bl(t.workspaceId), + limit: t.limit ?? 128 + }; + return Ul(zl(await ql(e)(n), `${e}Board`)); +} +function ql(e) { + switch (e) { + case "roadmap": return Fl.roadmapBoard; + case "project": return Fl.projectBoard; + case "owner": return Fl.ownerBoard; + case "priority": return Fl.priorityBoard; + case "milestone": return Fl.milestoneBoard; + case "label": return Fl.labelBoard; + case "target": return Fl.targetBoard; + } +} +async function Jl(e, t) { + return zl(await Fl.progressEpic(t), "epicProgress"); } -async function Ll(e, t, n = 1024) { - return Al(await El.issuesInEpic({ +async function Yl(e, t, n = 1024) { + return zl(await Fl.issuesInEpic({ ref: t, limit: n }), "issuesInEpic"); } -async function Rl(e, t, n) { - return Nl(Al(await El.changeStateEpic({ +async function Xl(e, t, n) { + return Hl(zl(await Fl.changeStateEpic({ id: t, state: n }), "changeEpicState")); } -async function zl(e, t) { - return Nl(Al(await El.createEpic({ - workspace: jl(t.workspaceId), +async function Zl(e, t) { + return Hl(zl(await Fl.createEpic({ + workspace: Bl(t.workspaceId), title: t.title, bodyMarkdown: t.bodyMarkdown ?? "", ownerRef: null, @@ -5202,27 +5312,27 @@ async function zl(e, t) { projectName: t.projectName ?? null }), "createEpic")); } -async function Bl(e, t) { - return Nl(Al(await El.assignProject({ +async function Ql(e, t) { + return Hl(zl(await Fl.assignProject({ id: e, projectName: t ?? null }), "assignProject")); } -async function Vl(e, t, n) { - return ((await e.query(Dl, n ? { +async function $l(e, t, n) { + return ((await e.query(Il, n ? { from: t, kind: n - } : { from: t })).relations?.outgoing ?? []).map(Wl); + } : { from: t })).relations?.outgoing ?? []).map(nu); } -async function Hl(e, t) { - let n = (await e.mutate(Ol, { input: t })).relations?.create; +async function eu(e, t) { + let n = (await e.mutate(Ll, { input: t })).relations?.create; if (!n) throw Error("relations.create returned no relation"); - return Wl(n); + return nu(n); } -async function Ul(e, t) { - return (await e.mutate(kl, { input: { id: t } })).relations?.delete ?? !1; +async function tu(e, t) { + return (await e.mutate(Rl, { input: { id: t } })).relations?.delete ?? !1; } -function Wl(e) { +function nu(e) { let t = e.from ?? e.source ?? "", n = e.to ?? e.target ?? ""; return { ...e, @@ -5234,20 +5344,20 @@ function Wl(e) { } //#endregion //#region ../extensions/first-party/ext_epics/ui/src/types.ts -function Gl() { - return he() ?? ""; +function ru() { + return ps() ?? ""; } -var Kl = "epics"; -function ql(e) { +var iu = "epics"; +function au(e) { return `comtrya://epic/${e.id}`; } -function Jl(e) { - return p(Kl, `/${e.workspaceId}/${e.id}`); +function ou(e) { + return zo(iu, `/${e.workspaceId}/${e.id}`); } -function Yl(e) { - return `${p(Kl, "/new")}?workspaceId=${e}`; +function su(e) { + return `${zo(iu, "/board")}?workspaceId=${e}`; } -function Xl(e) { +function cu(e) { switch (e) { case "PLANNED": return { label: "planned", @@ -5277,8 +5387,8 @@ function Xl(e) { } //#endregion //#region ../extensions/first-party/ext_epics/ui/src/epic-commands.ts -var Zl = /* @__PURE__ */ new Map(); -function Ql(e) { +var lu = /* @__PURE__ */ new Map(); +function uu(e) { return [ e.id, e.title, @@ -5286,7 +5396,7 @@ function Ql(e) { e.projectName ?? "" ].join("|"); } -var $l = [ +var du = [ { state: "IN_PROGRESS", verb: "in progress" @@ -5300,35 +5410,35 @@ var $l = [ verb: "canceled" } ]; -function eu(e) { +function fu(e) { return e.projectName ? ` (${e.projectName})` : ""; } -function tu(e, t) { - let n = [], r = eu(e); - n.push(T({ +function pu(e, t) { + let n = [], r = fu(e); + n.push(us({ id: `ext_epics.open.${e.id}`, title: `Open epic ${e.title}${r}`, category: "Epics", extensionId: "ext_epics", run: () => { - window.location.href = Jl(e); + window.location.href = ou(e); } })); - for (let { state: i, verb: a } of $l) e.state !== i && n.push(T({ + for (let { state: i, verb: a } of du) e.state !== i && n.push(us({ id: `ext_epics.mark.${i.toLowerCase()}.${e.id}`, title: `Mark epic ${e.title} ${a}${r}`, category: "Epics", extensionId: "ext_epics", run: async () => { - await Rl(t, e.id, i); + await Xl(t, e.id, i); } })); return () => n.forEach((e) => e()); } -async function nu(e, t) { +async function mu(e, t) { let n; try { - n = await Fl(e, { workspaceId: t }); + n = await Gl(e, { workspaceId: t }); } catch (e) { console.warn("[ext_epics] palette sync failed:", e); return; @@ -5336,23 +5446,23 @@ async function nu(e, t) { let r = /* @__PURE__ */ new Set(); for (let t of n) { r.add(t.id); - let n = Ql(t), i = Zl.get(t.id); - i && i.signature === n || (i?.unregister(), Zl.set(t.id, { + let n = uu(t), i = lu.get(t.id); + i && i.signature === n || (i?.unregister(), lu.set(t.id, { signature: n, - unregister: tu(t, e) + unregister: pu(t, e) })); } - for (let [e, t] of Zl) r.has(e) || (t.unregister(), Zl.delete(e)); + for (let [e, t] of lu) r.has(e) || (t.unregister(), lu.delete(e)); } -function ru(e) { +function hu(e) { let t = [], n = !1; - return ge().then((r) => { + return ms().then((r) => { if (!n) { - nu(e, r); - for (let n of ["dev.comtrya.epic.created", "dev.comtrya.epic.state-changed"]) t.push(m({ + mu(e, r); + for (let n of ["dev.comtrya.epic.created", "dev.comtrya.epic.state-changed"]) t.push(Bo({ type: n, onEvent: () => { - nu(e, r); + mu(e, r); }, onError: () => {} })); @@ -5360,25 +5470,25 @@ function ru(e) { }), () => { n = !0; for (let e of t) e(); - for (let e of Zl.values()) e.unregister(); - Zl.clear(); + for (let e of lu.values()) e.unregister(); + lu.clear(); }; } //#endregion //#region ../extensions/first-party/ext_epics/ui/src/EpicCard.vue?vue&type=script&setup=true&lang.ts -var iu = ["data-state"], au = ["data-epic-id"], ou = { class: "epic-card-title" }, su = ["href"], cu = ["data-author-kind", "title"], lu = { class: "owner-glyph" }, uu = ["title"], du = { +var gu = ["data-state"], _u = ["data-epic-id"], vu = { class: "epic-card-title" }, yu = ["href"], bu = ["data-author-kind", "title"], xu = { class: "owner-glyph" }, Su = ["title"], Cu = { key: 0, class: "epic-meta" -}, fu = { +}, wu = { key: 1, class: "epic-meta" -}, pu = { +}, Tu = { key: 1, class: "epic-line muted" -}, mu = { +}, Eu = { key: 2, class: "epic-card-fallback" -}, hu = { class: "epic-line muted" }, gu = { class: "epic-line warn" }, _u = /* @__PURE__ */ Or({ +}, Du = { class: "epic-line muted" }, Ou = { class: "epic-line warn" }, ku = /* @__PURE__ */ zn({ __name: "EpicCard", props: { client: { type: null }, @@ -5386,20 +5496,21 @@ var iu = ["data-state"], au = ["data-epic-id"], ou = { class: "epic-card-title" epic: { type: null }, ref: { type: String }, resourceRef: { type: String }, + repositorySegments: { type: Array }, activeOwner: { type: [String, null] }, activeProject: { type: [String, null] } }, emits: ["owner-click", "project-click"], setup(e, { emit: t }) { - let n = e, r = t, i = /* @__PURE__ */ z("idle"), a = /* @__PURE__ */ z(null), o = /* @__PURE__ */ z(n.epic ?? null), s = /* @__PURE__ */ z(null), c = X(() => n.resourceRef ?? n.ref ?? ""), l = X(() => n.client ?? n.comtryaClient), u = X(() => n.epic ?? o.value), d = X(() => Xl(u.value?.state)), f = X(() => (s.value?.issuesOpen ?? 0) + (s.value?.issuesClosed ?? 0)); - Ur(p), br(() => [ + let n = e, r = t, i = /* @__PURE__ */ z("idle"), a = /* @__PURE__ */ z(null), o = /* @__PURE__ */ z(n.epic ?? null), s = /* @__PURE__ */ z(null), c = Y(() => n.resourceRef ?? n.ref ?? ""), l = Y(() => n.client ?? n.comtryaClient), u = Y(() => n.epic ?? o.value), d = Y(() => cu(u.value?.state)), f = Y(() => u.value ? vl(iu, `/${u.value.workspaceId}/${u.value.id}`, { repositorySegments: n.repositorySegments }) : "#"), p = Y(() => (s.value?.issuesOpen ?? 0) + (s.value?.issuesClosed ?? 0)); + er(m), V(() => [ l.value, n.epic, c.value - ], () => void p()); - async function p() { + ], () => void m()); + async function m() { if (n.epic) { - o.value = n.epic, i.value = "ready", a.value = null, await m(); + o.value = n.epic, i.value = "ready", a.value = null, await h(); return; } if (!c.value) { @@ -5412,23 +5523,23 @@ var iu = ["data-state"], au = ["data-epic-id"], ou = { class: "epic-card-title" } i.value = "loading", a.value = null; try { - o.value = await Pl(l.value, c.value), i.value = o.value ? "ready" : "empty", await m(); + o.value = await Wl(l.value, c.value), i.value = o.value ? "ready" : "empty", await h(); } catch (e) { o.value = null, s.value = null, i.value = "error", a.value = e instanceof Error ? e.message : String(e); } } - async function m() { + async function h() { if (!l.value || !c.value) { s.value = null; return; } try { - s.value = await Il(l.value, c.value); + s.value = await Jl(l.value, c.value); } catch { s.value = null; } } - function h(e) { + function g(e) { if (!e) return { label: "unknown", glyph: "·", @@ -5471,82 +5582,82 @@ var iu = ["data-state"], au = ["data-epic-id"], ou = { class: "epic-card-title" "data-epic-id": u.value.id, "data-smoke": "epic-card-body" }, [ - K("div", ou, [ - K("span", { class: tt(["epic-pill", d.value.className]) }, N(d.value.label), 3), + K("div", vu, [ + K("span", { class: M(["epic-pill", d.value.className]) }, N(d.value.label), 3), K("a", { class: "epic-title-link", - href: B(Jl)(u.value) - }, N(u.value.title), 9, su), + href: f.value + }, N(u.value.title), 9, yu), u.value.ownerRef ? (W(), G("button", { key: 0, type: "button", - class: tt(["epic-owner", { active: n.activeOwner === u.value.ownerRef }]), - "data-author-kind": h(u.value.ownerRef).kind, + class: M(["epic-owner", { active: n.activeOwner === u.value.ownerRef }]), + "data-author-kind": g(u.value.ownerRef).kind, title: `${u.value.ownerRef}\nClick to filter by this owner`, - onClick: t[0] ||= rs((e) => r("owner-click", u.value.ownerRef), ["prevent", "stop"]) - }, [K("span", lu, N(h(u.value.ownerRef).glyph), 1), q(" " + N(h(u.value.ownerRef).label), 1)], 10, cu)) : J("", !0), + onClick: t[0] ||= ho((e) => r("owner-click", u.value.ownerRef), ["prevent", "stop"]) + }, [K("span", xu, N(g(u.value.ownerRef).glyph), 1), q(" " + N(g(u.value.ownerRef).label), 1)], 10, bu)) : J("", !0), u.value.projectName ? (W(), G("button", { key: 1, type: "button", - class: tt(["epic-project", { active: n.activeProject === u.value.projectName }]), + class: M(["epic-project", { active: n.activeProject === u.value.projectName }]), title: `${u.value.projectName}\nClick to filter by this project`, - onClick: t[1] ||= rs((e) => r("project-click", u.value.projectName), ["prevent", "stop"]) - }, [t[2] ||= K("span", { class: "project-glyph" }, "◇", -1), q(" " + N(u.value.projectName), 1)], 10, uu)) : J("", !0) + onClick: t[1] ||= ho((e) => r("project-click", u.value.projectName), ["prevent", "stop"]) + }, [t[2] ||= K("span", { class: "project-glyph" }, "◇", -1), q(" " + N(u.value.projectName), 1)], 10, Su)) : J("", !0) ]), - s.value ? (W(), G("div", du, [K("span", null, N(s.value.issuesClosed ?? 0) + "/" + N(f.value) + " issues", 1), K("span", null, N(s.value.percentComplete ?? 0) + "% complete", 1)])) : J("", !0), - u.value.targetDate ? (W(), G("div", fu, [K("span", null, "target: " + N(u.value.targetDate), 1)])) : J("", !0) - ], 8, au)) : i.value === "loading" ? (W(), G("p", pu, " Loading " + N(c.value), 1)) : (W(), G("div", mu, [K("p", hu, N(c.value || "epic"), 1), K("p", gu, N(a.value ?? "epic not found"), 1)]))], 8, iu)); + s.value ? (W(), G("div", Cu, [K("span", null, N(s.value.issuesClosed ?? 0) + "/" + N(p.value) + " issues", 1), K("span", null, N(s.value.percentComplete ?? 0) + "% complete", 1)])) : J("", !0), + u.value.targetDate ? (W(), G("div", wu, [K("span", null, "target: " + N(u.value.targetDate), 1)])) : J("", !0) + ], 8, _u)) : i.value === "loading" ? (W(), G("p", Tu, " Loading " + N(c.value), 1)) : (W(), G("div", Eu, [K("p", Du, N(c.value || "epic"), 1), K("p", Ou, N(a.value ?? "epic not found"), 1)]))], 8, gu)); } -}), vu = ".epic-card[data-v-c61c70a7]{display:block}.epic-card-body[data-v-c61c70a7]{border:.5px solid var(--line,#ffffff12);gap:6px;padding:10px 12px;display:grid}.epic-card-title[data-v-c61c70a7]{align-items:baseline;gap:8px;min-width:0;display:flex}.epic-pill[data-v-c61c70a7],.epic-meta[data-v-c61c70a7],.epic-line[data-v-c61c70a7]{font-family:var(--font-mono,monospace)}.epic-pill[data-v-c61c70a7]{border:.5px solid;padding:1px 8px;font-size:10px}.epic-project[data-v-c61c70a7]{font-family:var(--font-mono,monospace);color:var(--accent-blue,#1d55a6);cursor:pointer;font-size:11px;font:inherit;font-family:var(--font-mono,monospace);background:0 0;border:.5px solid;align-items:center;gap:4px;margin-left:auto;padding:0 6px;display:inline-flex}.epic-project[data-v-c61c70a7]:hover{background:var(--bg-2,#0e1014)}.epic-project.active[data-v-c61c70a7]{background:var(--fg,#fffffff0);color:var(--bg,#0a0b0e);border-color:var(--fg,#fffffff0)}.epic-owner+.epic-project[data-v-c61c70a7]{margin-left:4px}.epic-project .project-glyph[data-v-c61c70a7]{font-size:10px}.epic-owner[data-v-c61c70a7]{font-family:var(--font-mono,monospace);color:var(--fg-2,#ffffffbd);cursor:pointer;font-size:11px;font:inherit;font-family:var(--font-mono,monospace);background:0 0;border:1px dashed;align-items:center;gap:4px;margin-left:auto;padding:0 6px;display:inline-flex}.epic-owner[data-v-c61c70a7]:hover{background:var(--bg-2,#0e1014)}.epic-owner.active[data-v-c61c70a7]{background:var(--fg,#fffffff0);color:var(--bg,#0a0b0e);border-style:solid;border-color:var(--fg,#fffffff0)}.epic-owner.active .owner-glyph[data-v-c61c70a7]{color:inherit}.epic-owner .owner-glyph[data-v-c61c70a7]{place-items:center;width:12px;height:12px;font-size:9px;font-weight:700;display:inline-grid}.epic-owner[data-author-kind=agent][data-v-c61c70a7]{color:#6b3fa0}.epic-owner[data-author-kind=bot][data-v-c61c70a7]{color:var(--accent-blue,#1d55a6)}.epic-owner[data-author-kind=credential][data-v-c61c70a7]{color:var(--accent-yellow,#c89300)}.epic-owner[data-author-kind=team][data-v-c61c70a7]{color:var(--accent-teal,#087f6f)}.epic-state-good[data-v-c61c70a7]{color:var(--ok,#5dc879)}@supports (color:lab(0% 0 0)){.epic-state-good[data-v-c61c70a7]{color:var(--ok,lab(72.9029% -45.1402 29.5956))}}.epic-state-warn[data-v-c61c70a7]{color:var(--err,#ff645f)}@supports (color:lab(0% 0 0)){.epic-state-warn[data-v-c61c70a7]{color:var(--err,lab(63.3139% 59.7937 35.1683))}}.epic-state-muted[data-v-c61c70a7],.epic-meta[data-v-c61c70a7],.muted[data-v-c61c70a7]{color:var(--fg-3,#ffffff85)}.epic-title-link[data-v-c61c70a7]{min-width:0;color:inherit;font-family:var(--font-serif,system-ui);overflow-wrap:anywhere;font-weight:600}.epic-meta[data-v-c61c70a7]{flex-wrap:wrap;gap:8px;font-size:11px;display:flex}.epic-line[data-v-c61c70a7]{margin:4px 0;font-size:12px}.warn[data-v-c61c70a7]{color:var(--err,#ff645f)}@supports (color:lab(0% 0 0)){.warn[data-v-c61c70a7]{color:var(--err,lab(63.3139% 59.7937 35.1683))}}", yu = (e, t) => { +}), Au = ".epic-card[data-v-268f3a3f]{display:block}.epic-card-body[data-v-268f3a3f]{border:.5px solid var(--line,#ffffff12);gap:6px;padding:10px 12px;display:grid}.epic-card-title[data-v-268f3a3f]{align-items:baseline;gap:8px;min-width:0;display:flex}.epic-pill[data-v-268f3a3f],.epic-meta[data-v-268f3a3f],.epic-line[data-v-268f3a3f]{font-family:var(--font-mono,monospace)}.epic-pill[data-v-268f3a3f]{border:.5px solid;padding:1px 8px;font-size:10px}.epic-project[data-v-268f3a3f]{font-family:var(--font-mono,monospace);color:var(--accent-blue,#1d55a6);cursor:pointer;font-size:11px;font:inherit;font-family:var(--font-mono,monospace);background:0 0;border:.5px solid;align-items:center;gap:4px;margin-left:auto;padding:0 6px;display:inline-flex}.epic-project[data-v-268f3a3f]:hover{background:var(--bg-2,#0e1014)}.epic-project.active[data-v-268f3a3f]{background:var(--fg,#fffffff0);color:var(--bg,#0a0b0e);border-color:var(--fg,#fffffff0)}.epic-owner+.epic-project[data-v-268f3a3f]{margin-left:4px}.epic-project .project-glyph[data-v-268f3a3f]{font-size:10px}.epic-owner[data-v-268f3a3f]{font-family:var(--font-mono,monospace);color:var(--fg-2,#ffffffbd);cursor:pointer;font-size:11px;font:inherit;font-family:var(--font-mono,monospace);background:0 0;border:1px dashed;align-items:center;gap:4px;margin-left:auto;padding:0 6px;display:inline-flex}.epic-owner[data-v-268f3a3f]:hover{background:var(--bg-2,#0e1014)}.epic-owner.active[data-v-268f3a3f]{background:var(--fg,#fffffff0);color:var(--bg,#0a0b0e);border-style:solid;border-color:var(--fg,#fffffff0)}.epic-owner.active .owner-glyph[data-v-268f3a3f]{color:inherit}.epic-owner .owner-glyph[data-v-268f3a3f]{place-items:center;width:12px;height:12px;font-size:9px;font-weight:700;display:inline-grid}.epic-owner[data-author-kind=agent][data-v-268f3a3f]{color:#6b3fa0}.epic-owner[data-author-kind=bot][data-v-268f3a3f]{color:var(--accent-blue,#1d55a6)}.epic-owner[data-author-kind=credential][data-v-268f3a3f]{color:var(--accent-yellow,#c89300)}.epic-owner[data-author-kind=team][data-v-268f3a3f]{color:var(--accent-teal,#087f6f)}.epic-state-good[data-v-268f3a3f]{color:var(--ok,#5dc879)}@supports (color:lab(0% 0 0)){.epic-state-good[data-v-268f3a3f]{color:var(--ok,lab(72.9029% -45.1402 29.5956))}}.epic-state-warn[data-v-268f3a3f]{color:var(--err,#ff645f)}@supports (color:lab(0% 0 0)){.epic-state-warn[data-v-268f3a3f]{color:var(--err,lab(63.3139% 59.7937 35.1683))}}.epic-state-muted[data-v-268f3a3f],.epic-meta[data-v-268f3a3f],.muted[data-v-268f3a3f]{color:var(--fg-3,#ffffff85)}.epic-title-link[data-v-268f3a3f]{min-width:0;color:inherit;font-family:var(--font-serif,system-ui);overflow-wrap:anywhere;font-weight:600}.epic-meta[data-v-268f3a3f]{flex-wrap:wrap;gap:8px;font-size:11px;display:flex}.epic-line[data-v-268f3a3f]{margin:4px 0;font-size:12px}.warn[data-v-268f3a3f]{color:var(--err,#ff645f)}@supports (color:lab(0% 0 0)){.warn[data-v-268f3a3f]{color:var(--err,lab(63.3139% 59.7937 35.1683))}}", ju = (e, t) => { let n = e.__vccOpts || e; for (let [e, r] of t) n[e] = r; return n; -}, bu = /* @__PURE__ */ yu(_u, [["styles", [vu]], ["__scopeId", "data-v-c61c70a7"]]); +}, Mu = /* @__PURE__ */ ju(ku, [["styles", [Au]], ["__scopeId", "data-v-268f3a3f"]]); //#endregion //#region ../extensions/first-party/ext_epics/ui/src/issue-rows.ts -function xu(e, t = "") { +function Nu(e, t = "") { return typeof e == "string" ? e : t; } -function Su(e) { +function Pu(e) { return typeof e == "number" && Number.isFinite(e) ? e : null; } -function Cu(e) { +function Fu(e) { let t = typeof e == "string" ? e.toUpperCase() : ""; return t === "CLOSED" ? "CLOSED" : t === "REOPENED" ? "REOPENED" : "OPEN"; } -function wu(e) { +function Iu(e) { return typeof e == "string" ? e.match(/^comtrya:\/\/workspace\/([^/]+)(?:\/repository\/[^/]+)?$/)?.[1] ?? null : null; } -async function Tu(e) { - let t = await o("ext_issues", "issues", "by-ref-issue", e); +async function Lu(e) { + let t = await X("ext_issues", "issues", "by-ref-issue", e); if (!t.ok || !t.value || typeof t.value != "object") return null; - let n = t.value, r = Su(n.number), i = wu(n.repository), a = r !== null && i ? p("issues", `/${i}/${r}`) : null; + let n = t.value, r = Pu(n.number), i = Iu(n.repository), a = r !== null && i ? zo("issues", `/${i}/${r}`) : null; return { ref: e, - id: xu(n.id), + id: Nu(n.id), number: r, - title: xu(n.title, "(untitled)"), - state: Cu(n.state), + title: Nu(n.title, "(untitled)"), + state: Fu(n.state), projectName: typeof n.projectName == "string" ? n.projectName : null, labels: Array.isArray(n.labels) ? n.labels.filter((e) => typeof e == "string") : [], authorRef: typeof n.authorRef == "string" ? n.authorRef : null, href: a }; } -async function Eu(e) { - return (await Promise.all(e.map((e) => Tu(e)))).filter((e) => e !== null); +async function Ru(e) { + return (await Promise.all(e.map((e) => Lu(e)))).filter((e) => e !== null); } //#endregion //#region ../extensions/first-party/ext_epics/ui/src/epic-detail-styles.ts -var Du = "ext-epics-detail-styles", Ou = "\n.epic-detail {\n max-width: 880px;\n display: grid;\n gap: 24px;\n padding: 24px 0 48px;\n font-family: var(--serif, \"Bitter\", Georgia, ui-serif, serif);\n}\n\n.epic-detail .epic-line,\n.epic-detail .epic-meta,\n.epic-detail .epic-progress,\n.epic-detail .epic-issues-list,\n.epic-detail .epic-actions,\n.epic-detail .epic-actions-heading,\n.epic-detail .epic-kbd-hint,\n.epic-detail .epic-section-count {\n font-family: var(--mono, \"Monaspace Neon\", \"Monaspace Neon Var\", ui-monospace, monospace);\n}\n\n.epic-header { display: grid; gap: 6px; }\n\n.epic-overline {\n margin: 0;\n font-family: var(--mono, \"Monaspace Neon\", \"Monaspace Neon Var\", ui-monospace, monospace);\n font-size: 10px;\n letter-spacing: 0.18em;\n text-transform: uppercase;\n color: var(--ink-faint, #6e6a62);\n}\n\n.epic-title {\n margin: 0;\n font-family: var(--display, \"Bitter\", Georgia, ui-serif, serif);\n font-weight: 600;\n font-size: 28px;\n letter-spacing: -0.01em;\n line-height: 1.15;\n color: var(--ink, #1a1a1a);\n}\n\n.epic-meta {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n align-items: center;\n font-size: 11.5px;\n color: var(--ink-faint, #6e6a62);\n}\n\n.epic-pill {\n padding: 1px 8px;\n border: 1px solid currentColor;\n text-transform: lowercase;\n}\n\n.epic-state-good { color: var(--ink-go, #087f6f); }\n.epic-state-warn { color: var(--ink-warn, #c2410c); }\n.epic-state-muted, .muted { color: var(--ink-faint, #888); }\n.epic-line.warn { color: var(--ink-warn, #c2410c); }\n\n.epic-chip {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 1px 7px;\n border-radius: 2px;\n font-size: 11px;\n line-height: 16px;\n white-space: nowrap;\n}\n\n.epic-chip .chip-glyph {\n font-size: 10px;\n}\n\n.epic-chip.tone-blue {\n background: var(--chip-blue-bg, #e5edf7);\n color: var(--chip-blue-ink, #1f3b6a);\n}\n.epic-chip.tone-teal {\n background: var(--chip-teal-bg, #d8f0eb);\n color: var(--chip-teal-ink, #0c5f54);\n}\n.epic-chip.tone-grey {\n background: var(--chip-grey-bg, #ececea);\n color: var(--chip-grey-ink, #4a4a45);\n}\n.epic-chip.compact {\n padding: 0 6px;\n font-size: 10.5px;\n}\n\n.epic-meta-time {\n margin-left: auto;\n color: var(--ink-faint, #888);\n}\n\n.epic-progress {\n display: grid;\n gap: 8px;\n padding: 12px 14px;\n border: 1px solid var(--ink-rule, #d8d6cf);\n border-radius: 2px;\n background: var(--surface-2, #faf9f5);\n}\n\n/* \"Routed to\" panel — CUE Project ownership surfaced on the\n * detail page. Same paper-card aesthetic as the progress\n * panel above; owner chips carry classifier-glyph borders\n * so the visual vocabulary matches IssueDetail iter 59. */\n.epic-routed {\n display: grid;\n gap: 8px;\n padding: 12px 14px;\n border: 1px solid var(--ink-rule, #d8d6cf);\n background: var(--surface-2, #faf9f5);\n}\n\n.epic-routed-head {\n display: flex;\n align-items: baseline;\n gap: 10px;\n}\n\n.epic-routed-label {\n font-family: var(--mono, \"Monaspace Neon\", \"Monaspace Neon Var\", ui-monospace, monospace);\n font-size: 11px;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n color: var(--ink-faint, #6e6a62);\n}\n\n.epic-routed-project {\n margin-left: auto;\n font-family: var(--mono, \"Monaspace Neon\", \"Monaspace Neon Var\", ui-monospace, monospace);\n font-size: 11px;\n color: var(--accent-blue, #1d55a6);\n text-decoration: none;\n letter-spacing: 0.02em;\n}\n\n.epic-routed-project:hover {\n text-decoration: underline;\n text-underline-offset: 2px;\n}\n\n/* iter 69 — inline Project picker on EpicDetail. Mirrors the\n * iter 68 IssueDetail select styling so both detail surfaces\n * read identically. */\n.epic-project-select {\n width: 100%;\n border: 1.5px solid var(--ink-rule, #d8d6cf);\n background: var(--paper, #fffdf8);\n color: var(--ink, #111);\n padding: 8px 10px;\n font-family: var(--mono, \"Monaspace Neon\", \"Monaspace Neon Var\", ui-monospace, monospace);\n font-size: 13px;\n outline: none;\n transition: border-color 120ms ease;\n}\n\n.epic-project-select:focus {\n border-color: var(--ink, #1a1a1a);\n}\n\n.epic-project-select:disabled {\n cursor: wait;\n opacity: 0.55;\n}\n\n.epic-routed-list {\n list-style: none;\n padding: 0;\n margin: 0;\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.epic-routed-owner {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 2px 8px;\n border: 1px solid currentColor;\n color: var(--ink, #111);\n font-family: var(--mono, \"Monaspace Neon\", \"Monaspace Neon Var\", ui-monospace, monospace);\n font-size: 11px;\n letter-spacing: 0.02em;\n}\n\n.epic-routed-owner .chip-glyph {\n font-family: var(--display, \"Bitter\", Georgia, ui-serif, serif);\n font-size: 12px;\n line-height: 1;\n}\n\n.epic-routed-owner[data-author-kind=\"team\"] { color: var(--accent-teal, #087f6f); }\n.epic-routed-owner[data-author-kind=\"human\"] { color: var(--ink, #111); }\n.epic-routed-owner[data-author-kind=\"agent\"] { color: #6b3fa0; }\n.epic-routed-owner[data-author-kind=\"bot\"] { color: var(--accent-blue, #1d55a6); }\n.epic-routed-owner[data-author-kind=\"credential\"] { color: var(--accent-yellow, #c89300); }\n\n.epic-routed-source {\n margin: 0;\n font-family: var(--mono, \"Monaspace Neon\", \"Monaspace Neon Var\", ui-monospace, monospace);\n font-size: 11px;\n color: var(--ink-faint, #6e6a62);\n}\n\n.epic-routed-source code {\n font-family: var(--mono, \"Monaspace Neon\", \"Monaspace Neon Var\", ui-monospace, monospace);\n font-size: 11px;\n padding: 0 4px;\n background: var(--paper-tint, #f2efe7);\n color: var(--ink-soft, #2c2b28);\n}\n\n.epic-progress-head {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n align-items: baseline;\n font-size: 12px;\n color: var(--ink-faint, #6e6a62);\n}\n\n.epic-progress-stat {\n display: inline-flex;\n align-items: baseline;\n gap: 4px;\n}\n\n.epic-progress-stat strong {\n font-weight: 600;\n color: var(--ink, #1a1a1a);\n font-size: 15px;\n font-variant-numeric: tabular-nums;\n}\n\n.epic-progress-stat .stat-of {\n color: var(--ink-faint, #888);\n}\n\n.epic-progress-stat .stat-label {\n color: var(--ink-faint, #6e6a62);\n font-size: 11px;\n letter-spacing: 0.02em;\n}\n\n.epic-progress-sep {\n color: var(--ink-rule, #c8c6bf);\n padding: 0 2px;\n}\n\n.epic-progress-bar {\n height: 4px;\n background: var(--ink-rule-soft, #ebe9e2);\n border-radius: 2px;\n overflow: hidden;\n}\n\n.epic-progress-fill {\n height: 100%;\n background: var(--ink-go, #087f6f);\n transition: width 200ms ease;\n}\n\n.epic-body {\n margin: 0;\n font-size: 15.5px;\n line-height: 1.6;\n color: var(--ink, #1a1a1a);\n}\n\n.epic-body.muted {\n padding: 12px 14px;\n border: 1px dashed var(--ink-rule, #d8d6cf);\n border-radius: 2px;\n color: var(--ink-faint, #888);\n font-size: 12px;\n font-family: var(--mono, \"Monaspace Neon\", \"Monaspace Neon Var\", ui-monospace, monospace);\n}\n\n.epic-body.prose h1,\n.epic-body.prose h2,\n.epic-body.prose h3,\n.epic-body.prose h4 {\n margin: 16px 0 6px;\n font-family: var(--display, \"Bitter\", Georgia, ui-serif, serif);\n font-weight: 600;\n line-height: 1.2;\n letter-spacing: -0.005em;\n}\n\n.epic-body.prose h1 { font-size: 20px; }\n.epic-body.prose h2 { font-size: 17px; }\n.epic-body.prose h3 { font-size: 15px; }\n\n.epic-body.prose p {\n margin: 8px 0;\n}\n\n.epic-body.prose ul {\n margin: 6px 0 6px 20px;\n padding: 0;\n}\n\n.epic-body.prose li {\n margin: 2px 0;\n}\n\n.epic-body.prose code {\n font-family: var(--mono, \"Monaspace Neon\", \"Monaspace Neon Var\", ui-monospace, monospace);\n background: var(--ink-rule-soft, #efeee8);\n padding: 0 4px;\n border-radius: 2px;\n font-size: 0.9em;\n}\n\n.epic-body.prose pre {\n background: var(--surface-2, #f7f6f1);\n border: 1px solid var(--ink-rule, #d8d6cf);\n border-radius: 2px;\n padding: 10px 12px;\n overflow-x: auto;\n font-size: 12.5px;\n font-family: var(--mono, \"Monaspace Neon\", \"Monaspace Neon Var\", ui-monospace, monospace);\n}\n\n.epic-body.prose pre code {\n background: transparent;\n padding: 0;\n}\n\n.epic-section { display: grid; gap: 8px; }\n\n.epic-section-head {\n display: flex;\n align-items: baseline;\n gap: 8px;\n padding-bottom: 6px;\n border-bottom: 1px solid var(--ink-rule-soft, #ebe9e2);\n}\n\n.epic-section h3 {\n margin: 0;\n font-family: var(--display, \"Bitter\", Georgia, ui-serif, serif);\n font-weight: 600;\n font-size: 13px;\n letter-spacing: -0.005em;\n}\n\n.epic-section-count {\n margin-left: auto;\n font-size: 11px;\n color: var(--ink-faint, #888);\n font-variant-numeric: tabular-nums;\n}\n\n.epic-section-count [data-zero=\"true\"] { color: var(--ink-rule, #c8c6bf); }\n.epic-section-count .sep { padding: 0 2px; color: var(--ink-rule, #c8c6bf); }\n\n.epic-issues-list {\n list-style: none;\n margin: 0;\n padding: 0;\n display: grid;\n}\n\n.epic-issue-row {\n display: grid;\n grid-template-columns: 18px 56px 1fr auto;\n align-items: center;\n gap: 10px;\n padding: 6px 8px;\n border-bottom: 1px solid var(--ink-rule-soft, #ebe9e2);\n font-size: 12.5px;\n cursor: pointer;\n outline: none;\n}\n\n.epic-issue-row:last-child { border-bottom: none; }\n\n.epic-issue-row:hover,\n.epic-issue-row.focused,\n.epic-issue-row:focus {\n background: var(--surface-2, #faf9f5);\n}\n\n.epic-issue-row .row-state {\n text-align: center;\n font-size: 11px;\n}\n\n.epic-issue-row .row-state[data-state=\"OPEN\"],\n.epic-issue-row .row-state[data-state=\"REOPENED\"] {\n color: var(--ink-go, #087f6f);\n}\n.epic-issue-row .row-state[data-state=\"CLOSED\"] {\n color: var(--ink-faint, #888);\n}\n\n.epic-issue-row.state-closed {\n color: var(--ink-faint, #888);\n}\n.epic-issue-row.state-closed .row-title {\n text-decoration: line-through;\n text-decoration-color: var(--ink-rule, #c8c6bf);\n}\n\n.epic-issue-row .row-number {\n font-family: var(--mono, \"Monaspace Neon\", \"Monaspace Neon Var\", ui-monospace, monospace);\n font-size: 11.5px;\n color: var(--ink-faint, #6e6a62);\n font-variant-numeric: tabular-nums;\n}\n\n.epic-issue-row .row-title {\n font-family: var(--display, \"Bitter\", Georgia, ui-serif, serif);\n font-size: 13px;\n color: var(--ink, #1a1a1a);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.epic-issue-row .row-trailing {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n flex-wrap: nowrap;\n}\n\n.row-author {\n display: inline-flex;\n align-items: center;\n gap: 3px;\n font-family: var(--mono, \"Monaspace Neon\", \"Monaspace Neon Var\", ui-monospace, monospace);\n font-size: 10.5px;\n color: var(--ink-faint, #888);\n}\n\n.row-author[data-author-kind=\"agent\"] { color: var(--ink-go, #087f6f); }\n.row-author[data-author-kind=\"credential\"],\n.row-author[data-author-kind=\"bot\"] { color: var(--ink-warn, #c2410c); }\n\n.epic-kbd-hint {\n margin: 0;\n font-size: 10.5px;\n color: var(--ink-faint, #888);\n}\n\n.epic-kbd-hint kbd {\n font-family: var(--mono, \"Monaspace Neon\", \"Monaspace Neon Var\", ui-monospace, monospace);\n font-size: 10px;\n padding: 0 4px;\n border: 1px solid var(--ink-rule, #d8d6cf);\n border-radius: 2px;\n background: var(--surface-2, #faf9f5);\n}\n\n.epic-actions-section {\n display: grid;\n gap: 8px;\n padding-top: 12px;\n border-top: 1px solid var(--ink-rule-soft, #ebe9e2);\n}\n\n.epic-actions-heading {\n margin: 0;\n font-family: var(--mono, \"Monaspace Neon\", \"Monaspace Neon Var\", ui-monospace, monospace);\n font-size: 10.5px;\n letter-spacing: 0.16em;\n text-transform: uppercase;\n color: var(--ink-faint, #6e6a62);\n font-weight: 500;\n}\n\n.epic-actions {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.epic-actions button {\n padding: 4px 12px;\n font-family: var(--mono, \"Monaspace Neon\", \"Monaspace Neon Var\", ui-monospace, monospace);\n font-size: 11px;\n border: 1px solid var(--ink-rule, #d8d6cf);\n background: var(--surface-2, #faf9f5);\n color: var(--ink, #1a1a1a);\n cursor: pointer;\n letter-spacing: 0.01em;\n}\n\n.epic-actions button:hover:not(:disabled) {\n background: var(--ink, #1a1a1a);\n color: var(--surface, #ffffff);\n border-color: var(--ink, #1a1a1a);\n}\n\n.epic-actions button:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n.epic-comments {\n display: grid;\n gap: 8px;\n}\n\n.epic-comments-head {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n gap: 12px;\n border-bottom: 1.5px solid var(--ink, #111);\n padding-bottom: 4px;\n}\n\n.epic-comments-head h2 {\n margin: 0;\n font-family: var(--display, \"Bitter\", Georgia, ui-serif, serif);\n font-size: 18px;\n}\n\n.epic-comments-count {\n font-family: var(--mono, \"Monaspace Neon\", \"Monaspace Neon Var\", ui-monospace, monospace);\n font-size: 13px;\n color: var(--ink-faint, #68645c);\n font-weight: normal;\n}\n"; -function ku() { - if (typeof document > "u" || document.getElementById(Du)) return; +var zu = "ext-epics-detail-styles", Bu = "\n.epic-detail {\n max-width: 880px;\n display: grid;\n gap: 24px;\n padding: 24px 0 48px;\n font-family: var(--serif, \"Bitter\", Georgia, ui-serif, serif);\n}\n\n.epic-detail .epic-line,\n.epic-detail .epic-meta,\n.epic-detail .epic-progress,\n.epic-detail .epic-issues-list,\n.epic-detail .epic-actions,\n.epic-detail .epic-actions-heading,\n.epic-detail .epic-kbd-hint,\n.epic-detail .epic-section-count {\n font-family: var(--mono, \"Monaspace Neon\", \"Monaspace Neon Var\", ui-monospace, monospace);\n}\n\n.epic-header { display: grid; gap: 6px; }\n\n.epic-overline {\n margin: 0;\n font-family: var(--mono, \"Monaspace Neon\", \"Monaspace Neon Var\", ui-monospace, monospace);\n font-size: 10px;\n letter-spacing: 0.18em;\n text-transform: uppercase;\n color: var(--ink-faint, #6e6a62);\n}\n\n.epic-title {\n margin: 0;\n font-family: var(--display, \"Bitter\", Georgia, ui-serif, serif);\n font-weight: 600;\n font-size: 28px;\n letter-spacing: -0.01em;\n line-height: 1.15;\n color: var(--ink, #1a1a1a);\n}\n\n.epic-meta {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n align-items: center;\n font-size: 11.5px;\n color: var(--ink-faint, #6e6a62);\n}\n\n.epic-pill {\n padding: 1px 8px;\n border: 1px solid currentColor;\n text-transform: lowercase;\n}\n\n.epic-state-good { color: var(--ink-go, #087f6f); }\n.epic-state-warn { color: var(--ink-warn, #c2410c); }\n.epic-state-muted, .muted { color: var(--ink-faint, #888); }\n.epic-line.warn { color: var(--ink-warn, #c2410c); }\n\n.epic-chip {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 1px 7px;\n border-radius: 2px;\n font-size: 11px;\n line-height: 16px;\n white-space: nowrap;\n}\n\n.epic-chip .chip-glyph {\n font-size: 10px;\n}\n\n.epic-chip.tone-blue {\n background: var(--chip-blue-bg, #e5edf7);\n color: var(--chip-blue-ink, #1f3b6a);\n}\n.epic-chip.tone-teal {\n background: var(--chip-teal-bg, #d8f0eb);\n color: var(--chip-teal-ink, #0c5f54);\n}\n.epic-chip.tone-grey {\n background: var(--chip-grey-bg, #ececea);\n color: var(--chip-grey-ink, #4a4a45);\n}\n.epic-chip.compact {\n padding: 0 6px;\n font-size: 10.5px;\n}\n\n.epic-meta-time {\n margin-left: auto;\n color: var(--ink-faint, #888);\n}\n\n.epic-progress {\n display: grid;\n gap: 8px;\n padding: 12px 14px;\n border: 1px solid var(--ink-rule, #d8d6cf);\n border-radius: 2px;\n background: var(--surface-2, #faf9f5);\n}\n\n/* \"Routed to\" panel — CUE Project ownership surfaced on the\n * detail page. Same paper-card aesthetic as the progress\n * panel above; owner chips carry classifier-glyph borders\n * so the visual vocabulary matches IssueDetail iter 59. */\n.epic-routed {\n display: grid;\n gap: 8px;\n padding: 12px 14px;\n border: 1px solid var(--ink-rule, #d8d6cf);\n background: var(--surface-2, #faf9f5);\n}\n\n.epic-routed-head {\n display: flex;\n align-items: baseline;\n gap: 10px;\n}\n\n.epic-routed-label {\n font-family: var(--mono, \"Monaspace Neon\", \"Monaspace Neon Var\", ui-monospace, monospace);\n font-size: 11px;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n color: var(--ink-faint, #6e6a62);\n}\n\n.epic-routed-project {\n margin-left: auto;\n font-family: var(--mono, \"Monaspace Neon\", \"Monaspace Neon Var\", ui-monospace, monospace);\n font-size: 11px;\n color: var(--accent-blue, #1d55a6);\n text-decoration: none;\n letter-spacing: 0.02em;\n}\n\n.epic-routed-project:hover {\n text-decoration: underline;\n text-underline-offset: 2px;\n}\n\n/* iter 69 — inline Project picker on EpicDetail. Mirrors the\n * iter 68 IssueDetail select styling so both detail surfaces\n * read identically. */\n.epic-project-select {\n width: 100%;\n border: 1.5px solid var(--ink-rule, #d8d6cf);\n background: var(--paper, #fffdf8);\n color: var(--ink, #111);\n padding: 8px 10px;\n font-family: var(--mono, \"Monaspace Neon\", \"Monaspace Neon Var\", ui-monospace, monospace);\n font-size: 13px;\n outline: none;\n transition: border-color 120ms ease;\n}\n\n.epic-project-select:focus {\n border-color: var(--ink, #1a1a1a);\n}\n\n.epic-project-select:disabled {\n cursor: wait;\n opacity: 0.55;\n}\n\n.epic-routed-list {\n list-style: none;\n padding: 0;\n margin: 0;\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.epic-routed-owner {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 2px 8px;\n border: 1px solid currentColor;\n color: var(--ink, #111);\n font-family: var(--mono, \"Monaspace Neon\", \"Monaspace Neon Var\", ui-monospace, monospace);\n font-size: 11px;\n letter-spacing: 0.02em;\n}\n\n.epic-routed-owner .chip-glyph {\n font-family: var(--display, \"Bitter\", Georgia, ui-serif, serif);\n font-size: 12px;\n line-height: 1;\n}\n\n.epic-routed-owner[data-author-kind=\"team\"] { color: var(--accent-teal, #087f6f); }\n.epic-routed-owner[data-author-kind=\"human\"] { color: var(--ink, #111); }\n.epic-routed-owner[data-author-kind=\"agent\"] { color: #6b3fa0; }\n.epic-routed-owner[data-author-kind=\"bot\"] { color: var(--accent-blue, #1d55a6); }\n.epic-routed-owner[data-author-kind=\"credential\"] { color: var(--accent-yellow, #c89300); }\n\n.epic-routed-source {\n margin: 0;\n font-family: var(--mono, \"Monaspace Neon\", \"Monaspace Neon Var\", ui-monospace, monospace);\n font-size: 11px;\n color: var(--ink-faint, #6e6a62);\n}\n\n.epic-routed-source code {\n font-family: var(--mono, \"Monaspace Neon\", \"Monaspace Neon Var\", ui-monospace, monospace);\n font-size: 11px;\n padding: 0 4px;\n background: var(--paper-tint, #f2efe7);\n color: var(--ink-soft, #2c2b28);\n}\n\n.epic-progress-head {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n align-items: baseline;\n font-size: 12px;\n color: var(--ink-faint, #6e6a62);\n}\n\n.epic-progress-stat {\n display: inline-flex;\n align-items: baseline;\n gap: 4px;\n}\n\n.epic-progress-stat strong {\n font-weight: 600;\n color: var(--ink, #1a1a1a);\n font-size: 15px;\n font-variant-numeric: tabular-nums;\n}\n\n.epic-progress-stat .stat-of {\n color: var(--ink-faint, #888);\n}\n\n.epic-progress-stat .stat-label {\n color: var(--ink-faint, #6e6a62);\n font-size: 11px;\n letter-spacing: 0.02em;\n}\n\n.epic-progress-sep {\n color: var(--ink-rule, #c8c6bf);\n padding: 0 2px;\n}\n\n.epic-progress-bar {\n height: 4px;\n background: var(--ink-rule-soft, #ebe9e2);\n border-radius: 2px;\n overflow: hidden;\n}\n\n.epic-progress-fill {\n height: 100%;\n background: var(--ink-go, #087f6f);\n transition: width 200ms ease;\n}\n\n.epic-body {\n margin: 0;\n font-size: 15.5px;\n line-height: 1.6;\n color: var(--ink, #1a1a1a);\n}\n\n.epic-body.muted {\n padding: 12px 14px;\n border: 1px dashed var(--ink-rule, #d8d6cf);\n border-radius: 2px;\n color: var(--ink-faint, #888);\n font-size: 12px;\n font-family: var(--mono, \"Monaspace Neon\", \"Monaspace Neon Var\", ui-monospace, monospace);\n}\n\n.epic-body.prose h1,\n.epic-body.prose h2,\n.epic-body.prose h3,\n.epic-body.prose h4 {\n margin: 16px 0 6px;\n font-family: var(--display, \"Bitter\", Georgia, ui-serif, serif);\n font-weight: 600;\n line-height: 1.2;\n letter-spacing: -0.005em;\n}\n\n.epic-body.prose h1 { font-size: 20px; }\n.epic-body.prose h2 { font-size: 17px; }\n.epic-body.prose h3 { font-size: 15px; }\n\n.epic-body.prose p {\n margin: 8px 0;\n}\n\n.epic-body.prose ul {\n margin: 6px 0 6px 20px;\n padding: 0;\n}\n\n.epic-body.prose li {\n margin: 2px 0;\n}\n\n.epic-body.prose code {\n font-family: var(--mono, \"Monaspace Neon\", \"Monaspace Neon Var\", ui-monospace, monospace);\n background: var(--ink-rule-soft, #efeee8);\n padding: 0 4px;\n border-radius: 2px;\n font-size: 0.9em;\n}\n\n.epic-body.prose pre {\n background: var(--surface-2, #f7f6f1);\n border: 1px solid var(--ink-rule, #d8d6cf);\n border-radius: 2px;\n padding: 10px 12px;\n overflow-x: auto;\n font-size: 12.5px;\n font-family: var(--mono, \"Monaspace Neon\", \"Monaspace Neon Var\", ui-monospace, monospace);\n}\n\n.epic-body.prose pre code {\n background: transparent;\n padding: 0;\n}\n\n.epic-section { display: grid; gap: 8px; }\n\n.epic-section-head {\n display: flex;\n align-items: baseline;\n gap: 8px;\n padding-bottom: 6px;\n border-bottom: 1px solid var(--ink-rule-soft, #ebe9e2);\n}\n\n.epic-section h3 {\n margin: 0;\n font-family: var(--display, \"Bitter\", Georgia, ui-serif, serif);\n font-weight: 600;\n font-size: 13px;\n letter-spacing: -0.005em;\n}\n\n.epic-section-count {\n margin-left: auto;\n font-size: 11px;\n color: var(--ink-faint, #888);\n font-variant-numeric: tabular-nums;\n}\n\n.epic-section-count [data-zero=\"true\"] { color: var(--ink-rule, #c8c6bf); }\n.epic-section-count .sep { padding: 0 2px; color: var(--ink-rule, #c8c6bf); }\n\n.epic-issues-list {\n list-style: none;\n margin: 0;\n padding: 0;\n display: grid;\n}\n\n.epic-issue-row {\n display: grid;\n grid-template-columns: 18px 56px 1fr auto;\n align-items: center;\n gap: 10px;\n padding: 6px 8px;\n border-bottom: 1px solid var(--ink-rule-soft, #ebe9e2);\n font-size: 12.5px;\n cursor: pointer;\n outline: none;\n}\n\n.epic-issue-row:last-child { border-bottom: none; }\n\n.epic-issue-row:hover,\n.epic-issue-row.focused,\n.epic-issue-row:focus {\n background: var(--surface-2, #faf9f5);\n}\n\n.epic-issue-row .row-state {\n text-align: center;\n font-size: 11px;\n}\n\n.epic-issue-row .row-state[data-state=\"OPEN\"],\n.epic-issue-row .row-state[data-state=\"REOPENED\"] {\n color: var(--ink-go, #087f6f);\n}\n.epic-issue-row .row-state[data-state=\"CLOSED\"] {\n color: var(--ink-faint, #888);\n}\n\n.epic-issue-row.state-closed {\n color: var(--ink-faint, #888);\n}\n.epic-issue-row.state-closed .row-title {\n text-decoration: line-through;\n text-decoration-color: var(--ink-rule, #c8c6bf);\n}\n\n.epic-issue-row .row-number {\n font-family: var(--mono, \"Monaspace Neon\", \"Monaspace Neon Var\", ui-monospace, monospace);\n font-size: 11.5px;\n color: var(--ink-faint, #6e6a62);\n font-variant-numeric: tabular-nums;\n}\n\n.epic-issue-row .row-title {\n font-family: var(--display, \"Bitter\", Georgia, ui-serif, serif);\n font-size: 13px;\n color: var(--ink, #1a1a1a);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.epic-issue-row .row-trailing {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n flex-wrap: nowrap;\n}\n\n.row-author {\n display: inline-flex;\n align-items: center;\n gap: 3px;\n font-family: var(--mono, \"Monaspace Neon\", \"Monaspace Neon Var\", ui-monospace, monospace);\n font-size: 10.5px;\n color: var(--ink-faint, #888);\n}\n\n.row-author[data-author-kind=\"agent\"] { color: var(--ink-go, #087f6f); }\n.row-author[data-author-kind=\"credential\"],\n.row-author[data-author-kind=\"bot\"] { color: var(--ink-warn, #c2410c); }\n\n.epic-kbd-hint {\n margin: 0;\n font-size: 10.5px;\n color: var(--ink-faint, #888);\n}\n\n.epic-kbd-hint kbd {\n font-family: var(--mono, \"Monaspace Neon\", \"Monaspace Neon Var\", ui-monospace, monospace);\n font-size: 10px;\n padding: 0 4px;\n border: 1px solid var(--ink-rule, #d8d6cf);\n border-radius: 2px;\n background: var(--surface-2, #faf9f5);\n}\n\n.epic-actions-section {\n display: grid;\n gap: 8px;\n padding-top: 12px;\n border-top: 1px solid var(--ink-rule-soft, #ebe9e2);\n}\n\n.epic-actions-heading {\n margin: 0;\n font-family: var(--mono, \"Monaspace Neon\", \"Monaspace Neon Var\", ui-monospace, monospace);\n font-size: 10.5px;\n letter-spacing: 0.16em;\n text-transform: uppercase;\n color: var(--ink-faint, #6e6a62);\n font-weight: 500;\n}\n\n.epic-actions {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.epic-actions button {\n padding: 4px 12px;\n font-family: var(--mono, \"Monaspace Neon\", \"Monaspace Neon Var\", ui-monospace, monospace);\n font-size: 11px;\n border: 1px solid var(--ink-rule, #d8d6cf);\n background: var(--surface-2, #faf9f5);\n color: var(--ink, #1a1a1a);\n cursor: pointer;\n letter-spacing: 0.01em;\n}\n\n.epic-actions button:hover:not(:disabled) {\n background: var(--ink, #1a1a1a);\n color: var(--surface, #ffffff);\n border-color: var(--ink, #1a1a1a);\n}\n\n.epic-actions button:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n.epic-comments {\n display: grid;\n gap: 8px;\n}\n\n.epic-comments-head {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n gap: 12px;\n border-bottom: 1.5px solid var(--ink, #111);\n padding-bottom: 4px;\n}\n\n.epic-comments-head h2 {\n margin: 0;\n font-family: var(--display, \"Bitter\", Georgia, ui-serif, serif);\n font-size: 18px;\n}\n\n.epic-comments-count {\n font-family: var(--mono, \"Monaspace Neon\", \"Monaspace Neon Var\", ui-monospace, monospace);\n font-size: 13px;\n color: var(--ink-faint, #68645c);\n font-weight: normal;\n}\n"; +function Vu() { + if (typeof document > "u" || document.getElementById(zu)) return; let e = document.createElement("style"); - e.id = Du, e.textContent = Ou, document.head.appendChild(e); + e.id = zu, e.textContent = Bu, document.head.appendChild(e); } //#endregion //#region ../extensions/first-party/ext_epics/ui/src/CustomElementHost.vue -var Au = /* @__PURE__ */ yu(/* @__PURE__ */ Or({ +var Hu = /* @__PURE__ */ ju(/* @__PURE__ */ zn({ __name: "CustomElementHost", props: { tag: { type: String }, @@ -5561,7 +5672,7 @@ var Au = /* @__PURE__ */ yu(/* @__PURE__ */ Or({ }, setup(e) { let t = e, n = /* @__PURE__ */ z(null), r = null; - Ur(i), br(() => [ + er(i), V(() => [ t.tag, t.attributes, t.properties @@ -5584,79 +5695,79 @@ var Au = /* @__PURE__ */ yu(/* @__PURE__ */ Or({ }), [["styles", [".custom-element-host[data-v-cf896d02]{display:contents}"]], ["__scopeId", "data-v-cf896d02"]]); //#endregion //#region ../extensions/first-party/ext_epics/ui/src/project-policy.ts -async function ju(e) { - return { ownerRefs: await gl(e) }; +async function Uu(e) { + return { ownerRefs: await Tl(e) }; } //#endregion //#region ../extensions/first-party/ext_epics/ui/src/EpicDetail.vue?vue&type=script&setup=true&lang.ts -var Mu = ["data-state", "data-epic-id"], Nu = { +var Wu = ["data-state", "data-epic-id"], Gu = { key: 0, class: "epic-line muted" -}, Pu = { +}, Ku = { key: 1, class: "epic-line warn" -}, Fu = { +}, qu = { key: 2, class: "epic-line warn" -}, Iu = { class: "epic-header" }, Lu = { class: "epic-title" }, Ru = { class: "epic-meta" }, zu = ["title"], Bu = { +}, Ju = { class: "epic-header" }, Yu = { class: "epic-title" }, Xu = { class: "epic-meta" }, Zu = ["title"], Qu = { key: 1, class: "epic-chip tone-grey", title: "Owner" -}, Vu = { +}, $u = { key: 2, class: "epic-chip tone-grey" -}, Hu = { +}, ed = { key: 3, class: "epic-meta-time" -}, Uu = { +}, td = { key: 0, class: "epic-progress", "data-smoke": "epic-progress" -}, Wu = { class: "epic-progress-head" }, Gu = { class: "epic-progress-stat" }, Ku = { class: "stat-of" }, qu = { class: "epic-progress-stat" }, Ju = { +}, nd = { class: "epic-progress-head" }, rd = { class: "epic-progress-stat" }, id = { class: "stat-of" }, ad = { class: "epic-progress-stat" }, od = { key: 0, class: "epic-progress-sep" -}, Yu = { +}, sd = { key: 1, class: "epic-progress-stat" -}, Xu = ["aria-valuenow"], Zu = { +}, cd = ["aria-valuenow"], ld = { class: "epic-routed", "data-smoke": "epic-project-picker" -}, Qu = { class: "epic-routed-head" }, $u = ["href", "title"], ed = ["value", "disabled"], td = ["value"], nd = { +}, ud = { class: "epic-routed-head" }, dd = ["href", "title"], fd = ["value", "disabled"], pd = ["value"], md = { key: 0, class: "epic-line warn", role: "alert" -}, rd = { +}, hd = { key: 1, class: "epic-routed", "data-smoke": "epic-project-owners" -}, id = { class: "epic-routed-head" }, ad = ["href", "title"], od = { class: "epic-routed-list" }, sd = ["data-author-kind", "title"], cd = { class: "chip-glyph" }, ld = { class: "epic-routed-source" }, ud = ["data-epic-id", "innerHTML"], dd = { +}, gd = { class: "epic-routed-head" }, _d = ["href", "title"], vd = { class: "epic-routed-list" }, yd = ["data-author-kind", "title"], bd = { class: "chip-glyph" }, xd = { class: "epic-routed-source" }, Sd = ["data-epic-id", "innerHTML"], Cd = { key: 3, class: "epic-body muted" -}, fd = { +}, wd = { class: "epic-section", "data-smoke": "epic-issues" -}, pd = { class: "epic-section-head" }, md = { class: "epic-section-count" }, hd = ["data-zero"], gd = ["data-zero"], _d = { +}, Td = { class: "epic-section-head" }, Ed = { class: "epic-section-count" }, Dd = ["data-zero"], Od = ["data-zero"], kd = { key: 0, class: "epic-line muted" -}, vd = { +}, Ad = { key: 1, class: "epic-issues-list", "data-smoke": "epic-issues-list" -}, yd = [ +}, jd = [ "onClick", "onKeydown", "onFocus" -], bd = ["data-state"], xd = { key: 0 }, Sd = { key: 1 }, Cd = { class: "row-number" }, wd = { class: "row-title" }, Td = { class: "row-trailing" }, Ed = ["title"], Dd = ["data-author-kind", "title"], Od = { class: "author-glyph" }, kd = { +], Md = ["data-state"], Nd = { key: 0 }, Pd = { key: 1 }, Fd = { class: "row-number" }, Id = { class: "row-title" }, Ld = { class: "row-trailing" }, Rd = ["title"], zd = ["data-author-kind", "title"], Bd = { class: "author-glyph" }, Vd = { key: 2, class: "epic-kbd-hint muted" -}, Ad = { class: "epic-actions-section" }, jd = { class: "epic-actions" }, Md = ["disabled", "onClick"], Nd = { +}, Hd = { class: "epic-actions-section" }, Ud = { class: "epic-actions" }, Wd = ["disabled", "onClick"], Gd = { key: 0, class: "epic-line warn", role: "alert" -}, Pd = { class: "epic-comments-head" }, Fd = { +}, Kd = { class: "epic-comments-head" }, qd = { key: 0, class: "epic-comments-count" -}, Id = /* @__PURE__ */ Or({ +}, Jd = /* @__PURE__ */ zn({ __name: "EpicDetail", props: { client: { type: null }, @@ -5673,120 +5784,120 @@ var Mu = ["data-state", "data-epic-id"], Nu = { "IN_PROGRESS", "DONE", "CANCELED" - ], r = /* @__PURE__ */ z("idle"), i = /* @__PURE__ */ z("idle"), a = /* @__PURE__ */ z(null), o = /* @__PURE__ */ z(null), s = /* @__PURE__ */ z(t.epic ?? null), c = /* @__PURE__ */ z(null), l = /* @__PURE__ */ z([]), u = /* @__PURE__ */ z(null), d = X(() => t.client ?? t.comtryaClient), f = X(() => t.workspaceId ?? t.routeParams?.params?.workspaceId ?? Gl()), p = X(() => t.id ?? t.routeParams?.params?.id ?? ""), m = X(() => t.epic ? ql(t.epic) : `comtrya://epic/${p.value}`), h = X(() => s.value ?? t.epic ?? null), g = X(() => Xl(h.value?.state)), _ = X(() => n.filter((e) => e !== h.value?.state)), v = X(() => (c.value?.issuesOpen ?? 0) + (c.value?.issuesClosed ?? 0)), y = X(() => Math.max(0, Math.min(100, c.value?.percentComplete ?? 0))), ee = X(() => l.value.filter((e) => e.state !== "CLOSED").length), te = X(() => l.value.filter((e) => e.state === "CLOSED").length), ne = X(() => il(h.value?.bodyMarkdown ?? "", { workspaceId: f.value })), b = X(() => d.value && !!p.value), re = X(() => { + ], r = /* @__PURE__ */ z("idle"), i = /* @__PURE__ */ z("idle"), a = /* @__PURE__ */ z(null), o = /* @__PURE__ */ z(null), s = /* @__PURE__ */ z(t.epic ?? null), c = /* @__PURE__ */ z(null), l = /* @__PURE__ */ z([]), u = /* @__PURE__ */ z(null), d = Y(() => t.client ?? t.comtryaClient), f = Y(() => t.workspaceId ?? t.routeParams?.params?.workspaceId ?? ru()), p = Y(() => t.id ?? t.routeParams?.params?.id ?? ""), m = Y(() => t.epic ? au(t.epic) : `comtrya://epic/${p.value}`), h = Y(() => s.value ?? t.epic ?? null), g = Y(() => cu(h.value?.state)), _ = Y(() => n.filter((e) => e !== h.value?.state)), v = Y(() => (c.value?.issuesOpen ?? 0) + (c.value?.issuesClosed ?? 0)), y = Y(() => Math.max(0, Math.min(100, c.value?.percentComplete ?? 0))), b = Y(() => l.value.filter((e) => e.state !== "CLOSED").length), x = Y(() => l.value.filter((e) => e.state === "CLOSED").length), S = Y(() => ol(h.value?.bodyMarkdown ?? "", { workspaceId: f.value })), C = Y(() => d.value && !!p.value), w = Y(() => { let e = h.value?.ownerRef; return e ? e.startsWith("comtrya://user/") ? e.slice(15) : e.startsWith("comtrya://agent/") ? `${e.slice(16)} (agent)` : e : null; - }), ie = X(() => ge(h.value?.createdAt)), x = /* @__PURE__ */ z(null); - function ae(e) { + }), ee = Y(() => de(h.value?.createdAt)), te = /* @__PURE__ */ z(null); + function ne(e) { let t = e.detail; - t && typeof t.count == "number" && (x.value = t.count); + t && typeof t.count == "number" && (te.value = t.count); } - let oe = /* @__PURE__ */ z(null), se = X(() => oe.value?.ownerRefs ?? []); - br(() => h.value?.projectName ?? "", async (e) => { + let T = /* @__PURE__ */ z(null), re = Y(() => T.value?.ownerRefs ?? []); + V(() => h.value?.projectName ?? "", async (e) => { if (!e) { - oe.value = null; + T.value = null; return; } try { - oe.value = await ju(e); + T.value = await Uu(e); } catch { - oe.value = null; + T.value = null; } }, { immediate: !0 }); - let ce = fl, S = /* @__PURE__ */ z([]), le = /* @__PURE__ */ z("idle"), ue = /* @__PURE__ */ z(null); - Ur(async () => { + let E = xl, D = /* @__PURE__ */ z([]), ie = /* @__PURE__ */ z("idle"), O = /* @__PURE__ */ z(null); + er(async () => { try { - S.value = await hl(); + D.value = await wl(); } catch { - S.value = []; + D.value = []; } }); - async function de(e) { + async function ae(e) { let t = e.target; if (!t || !h.value) return; let n = h.value, r = t.value || null; if ((n.projectName ?? null) === r) return; - le.value = "submitting", ue.value = null; + ie.value = "submitting", O.value = null; let i = n.projectName ?? null; s.value = { ...n, projectName: r }; try { - s.value = await Bl(n.id, r); + s.value = await Ql(n.id, r); } catch (e) { s.value = { ...n, projectName: i - }, t.value = i ?? "", ue.value = e instanceof Error ? e.message : String(e); + }, t.value = i ?? "", O.value = e instanceof Error ? e.message : String(e); } finally { - le.value = "idle"; + ie.value = "idle"; } } - Ur(() => { - ku(), C(); + er(() => { + Vu(), oe(); }); - let fe = (e) => { + let k = (e) => { if (l.value.length === 0) return; let t = u.value === null ? 0 : Math.max(0, Math.min(l.value.length - 1, u.value + e)); - u.value = t, tr(() => he(t)); + u.value = t, pn(() => ue(t)); }; - gs({ + vs({ j: (e) => { - e.preventDefault(), fe(1); + e.preventDefault(), k(1); }, ArrowDown: (e) => { - e.preventDefault(), fe(1); + e.preventDefault(), k(1); }, k: (e) => { - e.preventDefault(), fe(-1); + e.preventDefault(), k(-1); }, ArrowUp: (e) => { - e.preventDefault(), fe(-1); + e.preventDefault(), k(-1); }, Enter: (e) => { if (u.value === null) return; let t = l.value[u.value]; - t && (e.preventDefault(), me(t)); + t && (e.preventDefault(), le(t)); } - }), br(() => [ + }), V(() => [ d.value, t.epic, f.value, p.value - ], () => void C()); - async function C() { + ], () => void oe()); + async function oe() { if (t.epic) { - s.value = t.epic, r.value = "ready", a.value = null, await w(); + s.value = t.epic, r.value = "ready", a.value = null, await se(); return; } - if (!b.value || !d.value) { + if (!C.value || !d.value) { s.value = null, c.value = null, l.value = [], r.value = "error", a.value = "epic-detail: missing params"; return; } r.value = "loading", a.value = null; try { - s.value = await Pl(d.value, m.value), r.value = s.value ? "ready" : "empty", await w(); + s.value = await Wl(d.value, m.value), r.value = s.value ? "ready" : "empty", await se(); } catch (e) { s.value = null, c.value = null, l.value = [], r.value = "error", a.value = e instanceof Error ? e.message : String(e); } } - async function w() { + async function se() { if (!d.value || !h.value) { c.value = null, l.value = []; return; } - let e = ql(h.value), [t, n] = await Promise.allSettled([Il(d.value, e), Ll(d.value, e)]); - c.value = t.status === "fulfilled" ? t.value : null, l.value = await Eu(n.status === "fulfilled" ? n.value : []), l.value.sort((e, t) => { + let e = au(h.value), [t, n] = await Promise.allSettled([Jl(d.value, e), Yl(d.value, e)]); + c.value = t.status === "fulfilled" ? t.value : null, l.value = await Ru(n.status === "fulfilled" ? n.value : []), l.value.sort((e, t) => { let n = e.state !== "CLOSED"; return n === (t.state !== "CLOSED") ? (t.number ?? 0) - (e.number ?? 0) : n ? -1 : 1; }); } - async function T(e) { + async function A(e) { if (!(!d.value || !h.value)) { i.value = "submitting", o.value = null; try { - s.value = await Rl(d.value, h.value.id, e), await w(); + s.value = await Xl(d.value, h.value.id, e), await se(); } catch (e) { o.value = e instanceof Error ? e.message : String(e); } finally { @@ -5794,17 +5905,17 @@ var Mu = ["data-state", "data-epic-id"], Nu = { } } } - function pe(e) { + function j(e) { return e.toLowerCase().replace("_", " "); } - function me(e) { + function le(e) { e.href && window.location.assign(e.href); } - function he(e) { + function ue(e) { let t = document.querySelector(".epic-detail [data-smoke=\"epic-issues-list\"]"); t && t.querySelectorAll(".epic-issue-row")[e]?.focus(); } - function ge(e) { + function de(e) { if (!e) return null; let t = new Date(e).getTime(); if (!Number.isFinite(t)) return null; @@ -5816,37 +5927,37 @@ var Mu = ["data-state", "data-epic-id"], Nu = { "data-state": r.value, "data-epic-id": h.value?.id, "data-smoke": "epic-detail" - }, [r.value === "loading" ? (W(), G("p", Nu, "Loading epic")) : r.value === "error" ? (W(), G("p", Pu, N(a.value), 1)) : h.value ? (W(), G(U, { key: 3 }, [ - K("header", Iu, [ + }, [r.value === "loading" ? (W(), G("p", Gu, "Loading epic")) : r.value === "error" ? (W(), G("p", Ku, N(a.value), 1)) : h.value ? (W(), G(U, { key: 3 }, [ + K("header", Ju, [ n[2] ||= K("p", { class: "epic-overline" }, "epic", -1), - K("h1", Lu, N(h.value.title), 1), - K("div", Ru, [ - K("span", { class: tt(["epic-pill", g.value.className]) }, N(g.value.label), 3), + K("h1", Yu, N(h.value.title), 1), + K("div", Xu, [ + K("span", { class: M(["epic-pill", g.value.className]) }, N(g.value.label), 3), h.value.projectName ? (W(), G("span", { key: 0, class: "epic-chip tone-blue", title: `Scoped to project ${h.value.projectName}` - }, [n[0] ||= K("span", { class: "chip-glyph" }, "◇", -1), q(N(h.value.projectName), 1)], 8, zu)) : J("", !0), - (W(!0), G(U, null, $r(h.value.labels, (t) => (W(), xa(B(xl), { + }, [n[0] ||= K("span", { class: "chip-glyph" }, "◇", -1), q(N(h.value.projectName), 1)], 8, Zu)) : J("", !0), + (W(!0), G(U, null, H(h.value.labels, (t) => (W(), Mi(B(Al), { key: t, name: t, catalog: e.labelCatalog }, null, 8, ["name", "catalog"]))), 128)), - re.value ? (W(), G("span", Bu, [n[1] ||= K("span", { class: "chip-glyph" }, "@", -1), q(N(re.value), 1)])) : J("", !0), - h.value.targetDate ? (W(), G("span", Vu, " target " + N(h.value.targetDate), 1)) : J("", !0), - ie.value ? (W(), G("span", Hu, "opened " + N(ie.value), 1)) : J("", !0) + w.value ? (W(), G("span", Qu, [n[1] ||= K("span", { class: "chip-glyph" }, "@", -1), q(N(w.value), 1)])) : J("", !0), + h.value.targetDate ? (W(), G("span", $u, " target " + N(h.value.targetDate), 1)) : J("", !0), + ee.value ? (W(), G("span", ed, "opened " + N(ee.value), 1)) : J("", !0) ]) ]), - c.value || l.value.length > 0 ? (W(), G("section", Uu, [K("div", Wu, [ - K("span", Gu, [ - K("strong", null, N(c.value?.issuesClosed ?? te.value), 1), - K("span", Ku, "/ " + N(v.value || l.value.length), 1), + c.value || l.value.length > 0 ? (W(), G("section", td, [K("div", nd, [ + K("span", rd, [ + K("strong", null, N(c.value?.issuesClosed ?? x.value), 1), + K("span", id, "/ " + N(v.value || l.value.length), 1), n[3] ||= K("span", { class: "stat-label" }, "closed", -1) ]), n[6] ||= K("span", { class: "epic-progress-sep" }, "·", -1), - K("span", qu, [K("strong", null, N(y.value), 1), n[4] ||= K("span", { class: "stat-label" }, "% complete", -1)]), - (c.value?.childEpicsOpen ?? 0) + (c.value?.childEpicsClosed ?? 0) > 0 ? (W(), G("span", Ju, "·")) : J("", !0), - (c.value?.childEpicsOpen ?? 0) + (c.value?.childEpicsClosed ?? 0) > 0 ? (W(), G("span", Yu, [K("strong", null, N(c.value?.childEpicsOpen ?? 0), 1), n[5] ||= K("span", { class: "stat-label" }, "child epics open", -1)])) : J("", !0) + K("span", ad, [K("strong", null, N(y.value), 1), n[4] ||= K("span", { class: "stat-label" }, "% complete", -1)]), + (c.value?.childEpicsOpen ?? 0) + (c.value?.childEpicsClosed ?? 0) > 0 ? (W(), G("span", od, "·")) : J("", !0), + (c.value?.childEpicsOpen ?? 0) + (c.value?.childEpicsClosed ?? 0) > 0 ? (W(), G("span", sd, [K("strong", null, N(c.value?.childEpicsOpen ?? 0), 1), n[5] ||= K("span", { class: "stat-label" }, "child epics open", -1)])) : J("", !0) ]), K("div", { class: "epic-progress-bar", "aria-valuenow": y.value, @@ -5854,98 +5965,98 @@ var Mu = ["data-state", "data-epic-id"], Nu = { "aria-valuemax": "100" }, [K("div", { class: "epic-progress-fill", - style: Xe({ width: y.value + "%" }) - }, null, 4)], 8, Xu)])) : J("", !0), - K("section", Zu, [ - K("header", Qu, [n[7] ||= K("span", { class: "epic-routed-label" }, "Project", -1), h.value.projectName ? (W(), G("a", { + style: ce({ width: y.value + "%" }) + }, null, 4)], 8, cd)])) : J("", !0), + K("section", ld, [ + K("header", ud, [n[7] ||= K("span", { class: "epic-routed-label" }, "Project", -1), h.value.projectName ? (W(), G("a", { key: 0, href: `/x/epics/?project=${encodeURIComponent(h.value.projectName)}`, class: "epic-routed-project", title: `Filter epics to project ${h.value.projectName}` - }, "◇ " + N(h.value.projectName), 9, $u)) : J("", !0)]), + }, "◇ " + N(h.value.projectName), 9, dd)) : J("", !0)]), K("select", { class: "epic-project-select", "data-smoke": "epic-project-select", value: h.value.projectName ?? "", - disabled: le.value === "submitting", - onChange: de - }, [n[8] ||= K("option", { value: "" }, "— no project —", -1), (W(!0), G(U, null, $r(S.value, (e) => (W(), G("option", { + disabled: ie.value === "submitting", + onChange: ae + }, [n[8] ||= K("option", { value: "" }, "— no project —", -1), (W(!0), G(U, null, H(D.value, (e) => (W(), G("option", { key: e.name, value: e.name ?? "" - }, N(e.name), 9, td))), 128))], 40, ed), - ue.value ? (W(), G("p", nd, N(ue.value), 1)) : J("", !0), + }, N(e.name), 9, pd))), 128))], 40, fd), + O.value ? (W(), G("p", md, N(O.value), 1)) : J("", !0), n[9] ||= K("p", { class: "epic-routed-source" }, [ q(" Stamps "), K("code", null, "projectName"), q(" on this epic. Lights up workspace per-Project counts. ") ], -1) ]), - h.value.projectName && se.value.length > 0 ? (W(), G("section", rd, [ - K("header", id, [n[10] ||= K("span", { class: "epic-routed-label" }, "Routed to", -1), K("a", { + h.value.projectName && re.value.length > 0 ? (W(), G("section", hd, [ + K("header", gd, [n[10] ||= K("span", { class: "epic-routed-label" }, "Routed to", -1), K("a", { href: `/x/epics/?project=${encodeURIComponent(h.value.projectName)}`, class: "epic-routed-project", title: `Filter epics to project ${h.value.projectName}` - }, "◇ " + N(h.value.projectName), 9, ad)]), - K("ul", od, [(W(!0), G(U, null, $r(se.value, (e) => (W(), G("li", { + }, "◇ " + N(h.value.projectName), 9, _d)]), + K("ul", vd, [(W(!0), G(U, null, H(re.value, (e) => (W(), G("li", { key: e, class: "epic-routed-owner", - "data-author-kind": B(ce)(e).kind, + "data-author-kind": B(E)(e).kind, title: e - }, [K("span", cd, N(B(ce)(e).glyph), 1), q(" " + N(B(ce)(e).label), 1)], 8, sd))), 128))]), - K("p", ld, [ + }, [K("span", bd, N(B(E)(e).glyph), 1), q(" " + N(B(E)(e).label), 1)], 8, yd))), 128))]), + K("p", xd, [ n[11] ||= q(" From ", -1), n[12] ||= K("code", null, "package comtrya", -1), q(" · projects." + N(h.value.projectName) + ".owners ", 1) ]) ])) : J("", !0), - ne.value ? (W(), G("article", { + S.value ? (W(), G("article", { key: 2, class: "epic-body prose", "data-epic-id": h.value.id, "data-smoke": "epic-detail-main", - innerHTML: ne.value - }, null, 8, ud)) : (W(), G("p", dd, "No description yet.")), - K("section", fd, [ - K("header", pd, [n[16] ||= K("h3", null, "Issues in this epic", -1), K("span", md, [ - K("span", { "data-zero": ee.value === 0 }, N(ee.value), 9, hd), + innerHTML: S.value + }, null, 8, Sd)) : (W(), G("p", Cd, "No description yet.")), + K("section", wd, [ + K("header", Td, [n[16] ||= K("h3", null, "Issues in this epic", -1), K("span", Ed, [ + K("span", { "data-zero": b.value === 0 }, N(b.value), 9, Dd), n[13] ||= q(" open ", -1), n[14] ||= K("span", { class: "sep" }, "·", -1), - K("span", { "data-zero": te.value === 0 }, N(te.value), 9, gd), + K("span", { "data-zero": x.value === 0 }, N(x.value), 9, Od), n[15] ||= q(" closed ", -1) ])]), - l.value.length === 0 ? (W(), G("p", _d, " No issues linked yet. Link issues via the issue's \"part of epic\" relation. ")) : (W(), G("ul", vd, [(W(!0), G(U, null, $r(l.value, (e, t) => (W(), G("li", { + l.value.length === 0 ? (W(), G("p", kd, " No issues linked yet. Link issues via the issue's \"part of epic\" relation. ")) : (W(), G("ul", Ad, [(W(!0), G(U, null, H(l.value, (e, t) => (W(), G("li", { key: e.ref, - class: tt(["epic-issue-row", [`state-${e.state.toLowerCase()}`, { focused: u.value === t }]]), + class: M(["epic-issue-row", [`state-${e.state.toLowerCase()}`, { focused: u.value === t }]]), tabindex: "0", - onClick: (t) => me(e), - onKeydown: [as(rs((t) => me(e), ["prevent"]), ["enter"]), as(rs((t) => me(e), ["prevent"]), ["space"])], + onClick: (t) => le(e), + onKeydown: [_o(ho((t) => le(e), ["prevent"]), ["enter"]), _o(ho((t) => le(e), ["prevent"]), ["space"])], onFocus: (e) => u.value = t }, [ K("span", { class: "row-state", "data-state": e.state - }, [e.state === "CLOSED" ? (W(), G("span", xd, "●")) : (W(), G("span", Sd, "○"))], 8, bd), - K("span", Cd, "#" + N(e.number ?? "—"), 1), - K("span", wd, N(e.title), 1), - K("span", Td, [ + }, [e.state === "CLOSED" ? (W(), G("span", Nd, "●")) : (W(), G("span", Pd, "○"))], 8, Md), + K("span", Fd, "#" + N(e.number ?? "—"), 1), + K("span", Id, N(e.title), 1), + K("span", Ld, [ e.projectName ? (W(), G("span", { key: 0, class: "epic-chip tone-blue compact", title: e.projectName - }, [n[17] ||= K("span", { class: "chip-glyph" }, "◇", -1), q(N(e.projectName), 1)], 8, Ed)) : J("", !0), - (W(!0), G(U, null, $r(e.labels, (e) => (W(), xa(B(xl), { + }, [n[17] ||= K("span", { class: "chip-glyph" }, "◇", -1), q(N(e.projectName), 1)], 8, Rd)) : J("", !0), + (W(!0), G(U, null, H(e.labels, (e) => (W(), Mi(B(Al), { key: e, name: e }, null, 8, ["name"]))), 128)), e.authorRef ? (W(), G("span", { key: 1, class: "row-author", - "data-author-kind": B(fl)(e.authorRef).kind, + "data-author-kind": B(xl)(e.authorRef).kind, title: e.authorRef - }, [K("span", Od, N(B(fl)(e.authorRef).glyph), 1), q(" " + N(B(fl)(e.authorRef).label), 1)], 8, Dd)) : J("", !0) + }, [K("span", Bd, N(B(xl)(e.authorRef).glyph), 1), q(" " + N(B(xl)(e.authorRef).label), 1)], 8, zd)) : J("", !0) ]) - ], 42, yd))), 128))])), - l.value.length > 0 ? (W(), G("p", kd, [...n[18] ||= [ + ], 42, jd))), 128))])), + l.value.length > 0 ? (W(), G("p", Vd, [...n[18] ||= [ K("kbd", null, "j", -1), q(" / ", -1), K("kbd", null, "k", -1), @@ -5954,94 +6065,525 @@ var Mu = ["data-state", "data-epic-id"], Nu = { q(" open ", -1) ]])) : J("", !0) ]), - K("section", Ad, [ + K("section", Hd, [ n[19] ||= K("h3", { class: "epic-actions-heading" }, "Change state", -1), - K("div", jd, [(W(!0), G(U, null, $r(_.value, (e) => (W(), G("button", { + K("div", Ud, [(W(!0), G(U, null, H(_.value, (e) => (W(), G("button", { key: e, type: "button", disabled: i.value === "submitting", - onClick: (t) => T(e) - }, " mark " + N(pe(e)), 9, Md))), 128))]), - o.value ? (W(), G("p", Nd, N(o.value), 1)) : J("", !0) + onClick: (t) => A(e) + }, " mark " + N(j(e)), 9, Wd))), 128))]), + o.value ? (W(), G("p", Gd, N(o.value), 1)) : J("", !0) ]), K("section", { class: "epic-comments", - onCommentThreadUpdate: ae - }, [K("header", Pd, [K("h2", null, [n[20] ||= q(" Discussion", -1), x.value === null ? J("", !0) : (W(), G("span", Fd, " (" + N(x.value) + ")", 1))])]), Ea(Au, { + onCommentThreadUpdate: ne + }, [K("header", Kd, [K("h2", null, [n[20] ||= q(" Discussion", -1), te.value === null ? J("", !0) : (W(), G("span", qd, " (" + N(te.value) + ")", 1))])]), Li(Hu, { tag: "comtrya-comment-thread", - attributes: { target: B(ql)(h.value) }, + attributes: { target: B(au)(h.value) }, properties: { - target: B(ql)(h.value), + target: B(au)(h.value), comtryaClient: d.value } }, null, 8, ["attributes", "properties"])], 32) - ], 64)) : (W(), G("p", Fu, " No epic " + N(p.value || "?") + " in " + N(f.value), 1))], 8, Mu)); + ], 64)) : (W(), G("p", qu, " No epic " + N(p.value || "?") + " in " + N(f.value), 1))], 8, Wu)); + } +}), Yd = { + class: "epics-roadmap", + "data-smoke": "epics-roadmap-board" +}, Xd = { class: "epics-roadmap-head" }, Zd = { class: "epics-roadmap-title" }, Qd = { class: "epics-roadmap-subtitle" }, $d = ["href"], ef = { class: "epics-roadmap-toolbar" }, tf = { + class: "epics-roadmap-tabs", + "aria-label": "Epic roadmap views" +}, nf = [ + "aria-pressed", + "aria-label", + "title", + "onClick" +], rf = { class: "epics-roadmap-search" }, af = { + key: 0, + class: "epics-roadmap-status" +}, of = { + key: 1, + class: "epics-roadmap-status error", + role: "alert" +}, sf = { + key: 2, + class: "epics-roadmap-status" +}, cf = { + key: 3, + class: "epics-roadmap-status" +}, lf = ["data-board", "aria-label"], uf = { class: "epics-roadmap-column-head" }, df = { + key: 0, + class: "epics-roadmap-cards" +}, ff = ["onMouseenter"], pf = ["href", "aria-label"], mf = { class: "epics-roadmap-card-head" }, hf = { class: "epic-number" }, gf = { class: "epics-roadmap-card-title" }, _f = { + key: 0, + class: "epics-roadmap-card-copy" +}, vf = { class: "epics-roadmap-progress" }, yf = ["aria-label", "aria-valuenow"], bf = { class: "epics-roadmap-card-meta" }, xf = { + key: 0, + class: "epic-age" +}, Sf = { + key: 1, + class: "epic-age" +}, Cf = { + key: 1, + class: "epics-roadmap-card-tags" +}, wf = { + key: 1, + class: "epics-roadmap-empty" +}, Tf = /* @__PURE__ */ ju(/* @__PURE__ */ zn({ + __name: "EpicRoadmapBoard", + props: { + workspaceId: { + default: ru(), + type: String + }, + repositoryId: { + default: null, + type: [String, null] + }, + repositorySegments: { type: Array }, + routeParams: { type: null }, + labelCatalog: { + default: null, + type: null + } + }, + setup(e) { + let t = e, n = [ + { + id: "roadmap", + label: "Roadmap", + hint: "state lanes" + }, + { + id: "project", + label: "Projects", + hint: "CUE project lanes" + }, + { + id: "owner", + label: "Owners", + hint: "owner lanes" + }, + { + id: "priority", + label: "Priority", + hint: "priority labels" + }, + { + id: "milestone", + label: "Milestones", + hint: "release labels" + }, + { + id: "label", + label: "Labels", + hint: "label lanes" + }, + { + id: "target", + label: "Targets", + hint: "target date health" + } + ], r = [ + "is", + "owner", + "project", + "label", + "priority", + "milestone", + "target" + ], i = { + planned: "PLANNED", + "in-progress": "IN_PROGRESS", + in_progress: "IN_PROGRESS", + inprogress: "IN_PROGRESS", + "at-risk": "AT_RISK", + at_risk: "AT_RISK", + atrisk: "AT_RISK", + done: "DONE", + closed: "DONE", + canceled: "CANCELED", + cancelled: "CANCELED" + }, a = /* @__PURE__ */ z("idle"), o = /* @__PURE__ */ z(null), s = /* @__PURE__ */ z("roadmap"), c = /* @__PURE__ */ z(""), l = /* @__PURE__ */ z(C()), u = /* @__PURE__ */ z(null), d = Y(() => t.workspaceId || t.routeParams?.params?.workspaceId || ru()), f = Y(() => l.value[s.value]), p = Y(() => cl(c.value, r)), m = Y(() => c.value.trim().length > 0), h = Y(() => { + let e = f.value; + if (!e || !m.value) return e; + let t = e.columns.map((e) => { + let t = e.cards.filter(D); + return { + ...e, + count: t.length, + cards: t + }; + }); + return { + ...e, + total: t.reduce((e, t) => e + t.cards.length, 0), + columns: t + }; + }), g = Y(() => h.value?.total ?? 0), _ = Y(() => f.value?.total ?? 0), v = Y(() => n.find((e) => e.id === s.value)?.label ?? "Roadmap"), y = Y(() => { + let e = vl(iu, "/new", { repositorySegments: t.repositorySegments }), n = new URLSearchParams({ workspaceId: d.value }); + return t.repositoryId && n.set("repositoryId", t.repositoryId), `${e}?${n.toString()}`; + }), b = (e) => vl(iu, `/${e.workspaceId}/${e.id}`, { repositorySegments: t.repositorySegments }), x = Y(() => { + let e = []; + for (let t of h.value?.columns ?? []) for (let n of t.cards) e.includes(n.epic.id) || e.push(n.epic.id); + return e; + }), S = Y(() => { + let e = u.value; + if (!e) return null; + for (let t of h.value?.columns ?? []) { + let n = t.cards.find((t) => t.epic.id === e); + if (n) return n; + } + return null; + }); + er(() => { + se(), window.addEventListener("popstate", j), w(); + }), ir(() => { + window.removeEventListener("popstate", j); + }), V(d, () => void w()), V(s, () => { + u.value = x.value[0] ?? null; + }), V(x, (e) => { + e.includes(u.value ?? "") || (u.value = e[0] ?? null); + }), V(c, () => A()), vs({ + h: (e) => { + e.preventDefault(), T(-1); + }, + ArrowLeft: (e) => { + e.preventDefault(), T(-1); + }, + l: (e) => { + e.preventDefault(), T(1); + }, + ArrowRight: (e) => { + e.preventDefault(), T(1); + }, + j: (e) => { + e.preventDefault(), re(1); + }, + ArrowDown: (e) => { + e.preventDefault(), re(1); + }, + k: (e) => { + e.preventDefault(), re(-1); + }, + ArrowUp: (e) => { + e.preventDefault(), re(-1); + }, + Enter: (e) => { + let t = S.value?.epic; + t && (e.preventDefault(), window.location.href = b(t)); + } + }); + function C() { + return { + roadmap: null, + project: null, + owner: null, + priority: null, + milestone: null, + label: null, + target: null + }; + } + async function w() { + a.value = "loading", o.value = null; + try { + let e = { + workspaceId: d.value, + limit: 128 + }, [t, n, r, i, o, s, c] = await Promise.all([ + Kl("roadmap", e), + Kl("project", e), + Kl("owner", e), + Kl("priority", e), + Kl("milestone", e), + Kl("label", e), + Kl("target", e) + ]); + l.value = { + roadmap: t, + project: n, + owner: r, + priority: i, + milestone: o, + label: s, + target: c + }, a.value = "ready", u.value = x.value[0] ?? null; + } catch (e) { + l.value = C(), u.value = null, a.value = "error", o.value = e instanceof Error ? e.message : String(e); + } + } + function ee(e) { + return l.value[e]?.total ?? 0; + } + function te(e) { + s.value = e; + } + function ne() { + c.value = ""; + } + function T(e) { + let t = n.findIndex((e) => e.id === s.value); + s.value = n[Math.max(0, Math.min(n.length - 1, t + e))]?.id ?? s.value; + } + function re(e) { + let t = x.value; + if (t.length === 0) return; + let n = u.value ? t.indexOf(u.value) : -1; + u.value = t[Math.max(0, Math.min(t.length - 1, n + e))] ?? null; + } + function E(e) { + let t = []; + return e.epic.projectName && t.push(`project:${e.epic.projectName}`), (e.ownerRef ?? e.epic.ownerRef) && t.push(le(e.ownerRef ?? e.epic.ownerRef ?? "")), e.priorityLabel && t.push(e.priorityLabel), e.milestoneLabel && t.push(e.milestoneLabel), e.epic.targetDate && t.push(`target:${e.epic.targetDate}`), t; + } + function D(e) { + let t = p.value; + if (!ie(e.epic.state, t.filters.is ?? []) || !O([e.epic.projectName, e.projectName], t.filters.project ?? []) || !O([ + e.epic.ownerRef, + e.ownerRef, + le(e.ownerRef ?? e.epic.ownerRef ?? "") + ], t.filters.owner ?? []) || !ae(e.epic.labels ?? [], t.filters.label ?? []) || !O([e.priority, e.priorityLabel], t.filters.priority ?? []) || !O([e.milestone, e.milestoneLabel], t.filters.milestone ?? []) || !O([e.epic.targetDate], t.filters.target ?? [])) return !1; + let n = t.text.trim().toLowerCase(); + return !n || k(e).includes(n); + } + function ie(e, t) { + return t.length === 0 ? !0 : t.some((t) => { + let n = t.toLowerCase(), r = i[n]; + return r ? r === e : e.toLowerCase().includes(n); + }); + } + function O(e, t) { + if (t.length === 0) return !0; + let n = e.map(oe).filter(Boolean); + return t.some((e) => n.some((t) => t.includes(oe(e)))); + } + function ae(e, t) { + if (t.length === 0) return !0; + let n = e.map(oe).filter(Boolean); + return t.every((e) => n.some((t) => t.includes(oe(e)))); + } + function k(e) { + return [ + e.epic.number ? `#${e.epic.number}` : "", + e.epic.title, + e.epic.bodyMarkdown, + cu(e.epic.state).label, + e.epic.projectName, + e.projectName, + e.epic.ownerRef, + e.ownerRef, + le(e.ownerRef ?? e.epic.ownerRef ?? ""), + e.priority, + e.priorityLabel, + e.milestone, + e.milestoneLabel, + e.epic.targetDate, + ...e.epic.labels ?? [], + ...E(e) + ].map(oe).join(" "); + } + function oe(e) { + return String(e ?? "").trim().toLowerCase(); + } + function se() { + typeof window > "u" || (c.value = new URLSearchParams(window.location.search).get("q") ?? ""); + } + function A() { + if (typeof window > "u") return; + let e = new URLSearchParams(window.location.search), t = c.value.trim(); + t ? e.set("q", t) : e.delete("q"); + let n = e.toString(), r = `${window.location.pathname}${n ? `?${n}` : ""}${window.location.hash}`; + r !== `${window.location.pathname}${window.location.search}${window.location.hash}` && window.history.replaceState(window.history.state, "", r); + } + function j() { + se(), pn(() => { + u.value ||= x.value[0] ?? null; + }); + } + function le(e) { + let t = xl(e); + return `${t.glyph} ${t.label}`; + } + function ue(e) { + let t = e.progress?.percentComplete ?? 0; + return Number.isFinite(t) ? Math.max(0, Math.min(100, t)) : 0; + } + function de(e) { + let t = e.progress; + if (!t) return "0% complete"; + let n = t.issuesClosed ?? 0, r = n + (t.issuesOpen ?? 0); + return r > 0 ? `${n}/${r} issues · ${ue(e)}%` : `${ue(e)}% complete`; + } + function fe(e) { + if (!e) return ""; + let t = Date.parse(e); + if (Number.isNaN(t)) return e; + let n = Math.max(0, Date.now() - t), r = 6e4, i = 60 * r, a = 24 * i, o = 7 * a; + return n < r ? "just now" : n < i ? `${Math.floor(n / r)}m ago` : n < a ? `${Math.floor(n / i)}h ago` : n < o ? `${Math.floor(n / a)}d ago` : `${Math.floor(n / o)}w ago`; + } + return (t, r) => (W(), G("section", Yd, [ + K("header", Xd, [K("div", Zd, [r[1] ||= K("h2", null, "Epics roadmap", -1), K("span", Qd, [a.value === "loading" ? (W(), G(U, { key: 0 }, [q("loading roadmap...")], 64)) : a.value === "error" ? (W(), G(U, { key: 1 }, [q("roadmap unavailable")], 64)) : m.value ? (W(), G(U, { key: 2 }, [ + q(N(g.value) + " of " + N(_.value) + " epic", 1), + _.value === 1 ? J("", !0) : (W(), G(U, { key: 0 }, [q("s")], 64)), + q(" on " + N(v.value.toLowerCase()), 1) + ], 64)) : (W(), G(U, { key: 3 }, [ + q(N(g.value) + " epic", 1), + g.value === 1 ? J("", !0) : (W(), G(U, { key: 0 }, [q("s")], 64)), + q(" on " + N(v.value.toLowerCase()), 1) + ], 64))])]), K("a", { + href: y.value, + class: "epics-roadmap-new" + }, "New epic", 8, $d)]), + K("div", ef, [ + K("nav", tf, [(W(), G(U, null, H(n, (e) => K("button", { + key: e.id, + type: "button", + class: M(["epics-roadmap-tab", { active: s.value === e.id }]), + "aria-pressed": s.value === e.id, + "aria-label": `${e.label}: ${ee(e.id)} epics. ${e.hint}`, + title: e.hint, + onClick: (t) => te(e.id) + }, [K("span", null, N(e.label), 1), K("strong", null, N(ee(e.id)), 1)], 10, nf)), 64))]), + K("label", rf, [En(K("input", { + "data-epics-roadmap-search": "", + "onUpdate:modelValue": r[0] ||= (e) => c.value = e, + type: "search", + placeholder: "Filter epics: is:planned project:kernel roadmap", + autocomplete: "off", + "aria-label": "Filter epics roadmap" + }, null, 512), [[co, c.value]])]), + c.value ? (W(), G("button", { + key: 0, + type: "button", + class: "epics-roadmap-clear", + "aria-label": "Clear roadmap filter", + onClick: ne + }, " Clear ")) : J("", !0) + ]), + a.value === "loading" ? (W(), G("p", af, " Loading roadmap... ")) : a.value === "error" ? (W(), G("p", of, N(o.value), 1)) : f.value && f.value.columns.length === 0 ? (W(), G("p", sf, " No roadmap columns yet. ")) : m.value && h.value && g.value === 0 ? (W(), G("p", cf, " No epics match the current board filter. ")) : h.value ? (W(), G("div", { + key: 4, + class: "epics-roadmap-columns", + "data-board": s.value, + "aria-label": `${v.value} epic board`, + tabindex: "0" + }, [(W(!0), G(U, null, H(h.value.columns, (t) => (W(), G("section", { + key: t.key, + class: "epics-roadmap-column" + }, [K("header", uf, [K("h3", null, N(t.label), 1), K("span", null, N(t.count), 1)]), t.cards.length > 0 ? (W(), G("ol", df, [(W(!0), G(U, null, H(t.cards, (n) => (W(), G("li", { + key: `${t.key}-${n.epic.id}`, + class: M(["epics-roadmap-card", { focused: u.value === n.epic.id }]), + onMouseenter: (e) => u.value = n.epic.id + }, [K("a", { + class: "epics-roadmap-card-link", + href: b(n.epic), + "aria-label": `Open epic #${n.epic.number ?? n.epic.id.slice(-4)}: ${n.epic.title}` + }, [ + K("header", mf, [K("span", hf, " #" + N(n.epic.number ?? n.epic.id.slice(-4)), 1), K("span", { class: M(["epic-state", B(cu)(n.epic.state).className]) }, N(B(cu)(n.epic.state).label), 3)]), + K("strong", gf, N(n.epic.title), 1), + n.epic.bodyMarkdown ? (W(), G("p", _f, N(B(sl)(n.epic.bodyMarkdown)), 1)) : J("", !0), + K("div", vf, [K("div", { + class: "epics-roadmap-progress-bar", + role: "progressbar", + "aria-label": de(n), + "aria-valuenow": ue(n), + "aria-valuemin": "0", + "aria-valuemax": "100" + }, [K("span", { style: ce({ width: ue(n) + "%" }) }, null, 4)], 8, yf), K("span", null, N(de(n)), 1)]), + K("div", bf, [n.epic.createdAt ? (W(), G("span", xf, " opened " + N(fe(n.epic.createdAt)), 1)) : J("", !0), f.value.today && s.value === "target" ? (W(), G("span", Sf, " today " + N(f.value.today), 1)) : J("", !0)]), + E(n).length > 0 || (n.epic.labels ?? []).length > 0 ? (W(), G("div", Cf, [(W(!0), G(U, null, H(E(n), (e) => (W(), G("span", { + key: `${n.epic.id}-${e}`, + class: "epics-roadmap-badge" + }, N(e), 1))), 128)), (W(!0), G(U, null, H(n.epic.labels ?? [], (t) => (W(), Mi(B(Al), { + key: `${n.epic.id}-${t}`, + name: t, + catalog: e.labelCatalog + }, null, 8, ["name", "catalog"]))), 128))])) : J("", !0) + ], 8, pf)], 42, ff))), 128))])) : (W(), G("p", wf, "No epics"))]))), 128))], 8, lf)) : J("", !0), + r[2] ||= K("footer", { class: "epics-roadmap-foot" }, [K("span", null, [ + K("kbd", null, "h"), + q("/"), + K("kbd", null, "l"), + q(" board · "), + K("kbd", null, "j"), + q("/"), + K("kbd", null, "k"), + q(" card · "), + K("kbd", null, "enter"), + q(" open") + ])], -1) + ])); } -}), Ld = ["data-state"], Rd = { class: "epics-list-header" }, zd = ["href"], Bd = { +}), [["styles", [".epics-roadmap[data-v-7fccd138]{min-width:0;color:var(--fg,#fffffff0);font-family:var(--font-sans,system-ui);gap:14px;display:grid}.epics-roadmap-head[data-v-7fccd138],.epics-roadmap-column-head[data-v-7fccd138],.epics-roadmap-card-head[data-v-7fccd138],.epics-roadmap-card-meta[data-v-7fccd138],.epics-roadmap-card-tags[data-v-7fccd138],.epics-roadmap-foot[data-v-7fccd138]{align-items:center;min-width:0;display:flex}.epics-roadmap-head[data-v-7fccd138]{justify-content:space-between;gap:12px}.epics-roadmap-title[data-v-7fccd138]{gap:4px;min-width:0;display:grid}.epics-roadmap-title h2[data-v-7fccd138]{font-family:var(--font-serif,system-ui);letter-spacing:0;margin:0;font-size:22px;line-height:1.2}.epics-roadmap-subtitle[data-v-7fccd138],.epics-roadmap-status[data-v-7fccd138],.epics-roadmap-empty[data-v-7fccd138],.epics-roadmap-foot[data-v-7fccd138]{color:var(--fg-3,#ffffff85);font-size:12px}.epics-roadmap-new[data-v-7fccd138]{border:.5px solid var(--line-2,#ffffff1f);border-radius:var(--r-sm,6px);min-height:30px;color:var(--fg,#fffffff0);background:var(--surface,#ffffff0a);flex:none;justify-content:center;align-items:center;padding:0 11px;font-size:13px;text-decoration:none;display:inline-flex}.epics-roadmap-tabs[data-v-7fccd138]{flex:460px;gap:6px;min-width:0;padding-bottom:2px;display:flex;overflow-x:auto}.epics-roadmap-toolbar[data-v-7fccd138]{flex-wrap:wrap;align-items:center;gap:8px;min-width:0;display:flex}.epics-roadmap-tab[data-v-7fccd138]{border:.5px solid var(--line,#ffffff14);border-radius:var(--r-sm,6px);min-height:32px;color:var(--fg-2,#ffffffc2);background:var(--surface,#ffffff08);font:inherit;white-space:nowrap;flex:none;align-items:center;gap:8px;padding:0 10px;font-size:12px;display:inline-flex}.epics-roadmap-tab.active[data-v-7fccd138]{border-color:var(--accent,#3b82f6);color:var(--fg,#fffffff0);background:var(--accent-soft,#3b82f624)}.epics-roadmap-tab strong[data-v-7fccd138]{font-family:var(--font-mono,monospace);font-size:11px;font-weight:600}.epics-roadmap-search[data-v-7fccd138]{border:.5px solid var(--line,#ffffff14);border-radius:var(--r-sm,6px);background:var(--bg,#0a0b0e);flex:280px;align-items:center;min-width:220px;padding:0 10px;display:inline-flex}.epics-roadmap-search input[data-v-7fccd138]{width:100%;min-width:0;color:inherit;font-family:var(--font-mono,monospace);background:0 0;border:0;outline:none;padding:8px 0;font-size:12px}.epics-roadmap-search input[data-v-7fccd138]::placeholder{color:var(--fg-3,#ffffff85)}.epics-roadmap-clear[data-v-7fccd138]{border:.5px solid var(--line,#ffffff14);border-radius:var(--r-sm,6px);min-height:32px;color:var(--fg-2,#ffffffc2);background:var(--surface,#ffffff08);font:inherit;flex:none;padding:0 10px;font-size:12px}.epics-roadmap-status[data-v-7fccd138]{border:.5px solid var(--line,#ffffff14);border-radius:var(--r-sm,6px);background:var(--surface,#ffffff08);margin:0;padding:12px}.epics-roadmap-status.error[data-v-7fccd138]{color:var(--err,#f87171);border-color:var(--err-soft,#f8717133);background:var(--err-soft,#f871711f)}.epics-roadmap-columns[data-v-7fccd138]{overscroll-behavior-x:contain;scrollbar-gutter:stable;grid-auto-columns:minmax(270px,1fr);grid-auto-flow:column;gap:10px;min-width:0;padding-bottom:6px;display:grid;overflow-x:auto}.epics-roadmap-columns[data-v-7fccd138]:focus-visible{outline:1.5px solid var(--accent,#3b82f6);outline-offset:3px}.epics-roadmap-column[data-v-7fccd138]{border:.5px solid var(--line,#ffffff14);border-radius:var(--r-sm,6px);background:var(--surface,#ffffff06);align-content:start;gap:8px;min-width:0;display:grid}.epics-roadmap-column-head[data-v-7fccd138]{justify-content:space-between;gap:8px;padding:10px 10px 0}.epics-roadmap-column-head h3[data-v-7fccd138]{text-overflow:ellipsis;white-space:nowrap;min-width:0;margin:0;font-size:13px;font-weight:650;line-height:1.2;overflow:hidden}.epics-roadmap-column-head span[data-v-7fccd138]{color:var(--fg-3,#ffffff85);font-family:var(--font-mono,monospace);flex:none;font-size:11px}.epics-roadmap-cards[data-v-7fccd138]{gap:8px;min-width:0;margin:0;padding:0 8px 8px;list-style:none;display:grid}.epics-roadmap-card[data-v-7fccd138]{min-width:0}.epics-roadmap-card-link[data-v-7fccd138]{border:.5px solid var(--line,#ffffff14);border-radius:var(--r-sm,6px);min-width:0;color:inherit;background:var(--surface-2,#ffffff0b);gap:8px;padding:10px;text-decoration:none;display:grid}.epics-roadmap-card.focused .epics-roadmap-card-link[data-v-7fccd138],.epics-roadmap-card-link[data-v-7fccd138]:focus-visible{outline:1.5px solid var(--accent,#3b82f6);outline-offset:2px}.epics-roadmap-card-head[data-v-7fccd138]{font-family:var(--font-mono,monospace);justify-content:space-between;gap:8px;font-size:11px}.epic-number[data-v-7fccd138],.epic-age[data-v-7fccd138]{color:var(--fg-3,#ffffff85)}.epic-state[data-v-7fccd138]{border:.5px solid;border-radius:999px;flex:none;padding:1px 7px;font-size:10px}.epic-state-good[data-v-7fccd138]{color:var(--ok,#5dc879)}@supports (color:lab(0% 0 0)){.epic-state-good[data-v-7fccd138]{color:var(--ok,lab(72.9029% -45.1402 29.5956))}}.epic-state-warn[data-v-7fccd138]{color:var(--warn,#f59e0b)}.epic-state-muted[data-v-7fccd138]{color:var(--fg-3,#ffffff85)}.epics-roadmap-card-title[data-v-7fccd138]{overflow-wrap:anywhere;min-width:0;font-size:13px;line-height:1.35}.epics-roadmap-card-copy[data-v-7fccd138]{color:var(--fg-2,#ffffffc2);-webkit-line-clamp:2;-webkit-box-orient:vertical;margin:0;font-size:12px;line-height:1.4;display:-webkit-box;overflow:hidden}.epics-roadmap-progress[data-v-7fccd138]{gap:5px;min-width:0;display:grid}.epics-roadmap-progress-bar[data-v-7fccd138]{background:var(--surface,#ffffff12);border-radius:999px;height:5px;overflow:hidden}.epics-roadmap-progress-bar span[data-v-7fccd138]{border-radius:inherit;background:var(--accent,#3b82f6);height:100%;display:block}.epics-roadmap-progress>span[data-v-7fccd138]{color:var(--fg-3,#ffffff85);font-family:var(--font-mono,monospace);font-size:11px}.epics-roadmap-card-meta[data-v-7fccd138],.epics-roadmap-card-tags[data-v-7fccd138]{flex-wrap:wrap;gap:6px}.epics-roadmap-badge[data-v-7fccd138]{border:.5px solid var(--line,#ffffff14);min-width:0;color:var(--fg-2,#ffffffc2);background:var(--surface,#ffffff08);border-radius:999px;align-items:center;gap:4px;padding:2px 7px;font-size:11px;line-height:1.2;display:inline-flex}.epics-roadmap-empty[data-v-7fccd138]{margin:0;padding:0 10px 12px}.epics-roadmap-foot[data-v-7fccd138]{justify-content:flex-end;gap:6px}.epics-roadmap-foot kbd[data-v-7fccd138]{border:.5px solid var(--line,#ffffff14);color:var(--fg-2,#ffffffbd);background:var(--surface,#ffffff0a);font-family:var(--font-mono,monospace);border-radius:4px;padding:1px 5px;font-size:10px}@media (max-width:720px){.epics-roadmap-head[data-v-7fccd138]{flex-direction:column;align-items:stretch}.epics-roadmap-new[data-v-7fccd138]{align-self:flex-start}.epics-roadmap-columns[data-v-7fccd138]{grid-auto-columns:minmax(250px,88vw)}}"]], ["__scopeId", "data-v-7fccd138"]]), Ef = ["data-state"], Df = { class: "epics-list-header" }, Of = { class: "epics-list-actions" }, kf = ["href"], Af = ["href"], jf = { key: 0, class: "epics-controls" -}, Vd = { +}, Mf = { class: "epics-filter-row", role: "tablist", "aria-label": "Filter epics by state" -}, Hd = ["aria-selected", "onClick"], Ud = { class: "count" }, Wd = { class: "epics-search" }, Gd = { +}, Nf = ["aria-selected", "onClick"], Pf = { class: "count" }, Ff = { class: "epics-search" }, If = { key: 1, class: "epics-query-chips", "data-smoke": "epics-query-chips", "aria-label": "Parsed search filters" -}, Kd = ["title"], qd = { +}, Lf = ["title"], Rf = { key: 2, class: "epics-owner-filter", "data-smoke": "epics-owner-filter" -}, Jd = ["title"], Yd = { +}, zf = ["title"], Bf = { key: 3, class: "epics-project-filter", "data-smoke": "epics-project-filter" -}, Xd = ["title"], Zd = ["data-busy"], Qd = ["placeholder", "disabled"], $d = { +}, Vf = ["title"], Hf = ["data-busy"], Uf = ["placeholder", "disabled"], Wf = { key: 0, class: "quick-add-status" -}, ef = ["title"], tf = { +}, Gf = ["title"], Kf = { key: 4, class: "epic-line warn", role: "alert" -}, nf = { +}, qf = { key: 5, class: "epics-bulk-bar", "data-smoke": "epics-bulk-bar" -}, rf = { class: "count" }, af = { class: "bulk-reproject" }, of = ["disabled"], sf = ["value"], cf = ["disabled"], lf = { +}, Jf = { class: "count" }, Yf = { class: "bulk-reproject" }, Xf = ["disabled"], Zf = ["value"], Qf = ["disabled"], $f = { key: 6, class: "epic-line warn", role: "alert" -}, uf = { +}, ep = { key: 7, class: "epic-line muted" -}, df = { +}, tp = { key: 8, class: "epic-line warn" -}, ff = { +}, np = { key: 9, class: "epic-line muted" -}, pf = { +}, rp = { key: 10, class: "epic-line muted" -}, mf = { +}, ip = { key: 11, class: "epics-list-items", role: "listbox", "aria-label": "Epic list" -}, hf = ["aria-selected", "onMouseenter"], gf = { +}, ap = ["aria-selected", "onMouseenter"], op = { key: 12, class: "epics-list-foot" -}, _f = /* @__PURE__ */ yu(/* @__PURE__ */ Or({ +}, sp = /* @__PURE__ */ ju(/* @__PURE__ */ zn({ __name: "EpicsList", props: { client: { type: null }, comtryaClient: { type: null }, epics: { type: [Array, null] }, workspaceId: { - default: Gl(), + default: ru(), type: String }, + repositoryId: { + default: null, + type: [String, null] + }, + repositorySegments: { type: Array }, state: { default: null, type: [String, null] @@ -6092,7 +6634,7 @@ var Mu = ["data-state", "data-epic-id"], Nu = { "DONE", "CANCELED", "ALL" - ]), i = /* @__PURE__ */ z("idle"), a = /* @__PURE__ */ z(null), o = /* @__PURE__ */ z(t.epics ?? []), s = /* @__PURE__ */ z("ALL"), c = /* @__PURE__ */ z(""), l = /* @__PURE__ */ z(""), u = /* @__PURE__ */ z(""), d = X(() => { + ]), i = /* @__PURE__ */ z("idle"), a = /* @__PURE__ */ z(null), o = /* @__PURE__ */ z(t.epics ?? []), s = /* @__PURE__ */ z("ALL"), c = /* @__PURE__ */ z(""), l = /* @__PURE__ */ z(""), u = /* @__PURE__ */ z(""), d = Y(() => { let e = t.epics ?? o.value; return t.projectName ? e.filter((e) => e.projectName === t.projectName) : e; }), f = [ @@ -6108,20 +6650,20 @@ var Mu = ["data-state", "data-epic-id"], Nu = { canceled: "CANCELED", cancelled: "CANCELED", all: "ALL" - }, m = X(() => al(c.value, f)), h = X(() => { + }, m = Y(() => cl(c.value, f)), h = Y(() => { for (let e of m.value.filters.is ?? []) { let t = p[e.toLowerCase()]; if (t) return t; } return s.value; - }), g = X(() => { + }), g = Y(() => { for (let e of m.value.filters.owner ?? []) if (e.startsWith("comtrya://")) return e; return l.value; - }), _ = X(() => { + }), _ = Y(() => { if (t.projectName) return ""; for (let e of m.value.filters.project ?? []) if (e.trim()) return e.trim(); return u.value; - }), v = X(() => { + }), v = Y(() => { let e = d.value, t = h.value; t !== "ALL" && (e = e.filter((e) => e.state === t)); let n = _.value; @@ -6133,7 +6675,7 @@ var Mu = ["data-state", "data-epic-id"], Nu = { let t = (e.ownerRef ?? "").split("/").pop() ?? ""; return `${e.title} ${t} ${e.projectName ?? ""}`.toLowerCase().includes(i); })), e; - }), y = X(() => { + }), y = Y(() => { let e = []; for (let t of m.value.filters.is ?? []) { let n = p[t.toLowerCase()]; @@ -6147,7 +6689,7 @@ var Mu = ["data-state", "data-epic-id"], Nu = { for (let t of m.value.filters.owner ?? []) e.push({ key: "owner", value: t, - label: `→ ${re(t)}`, + label: `→ ${w(t)}`, tone: "owner" }); for (let t of m.value.filters.project ?? []) e.push({ @@ -6164,22 +6706,22 @@ var Mu = ["data-state", "data-epic-id"], Nu = { }); return e; }); - function ee(e) { + function b(e) { l.value === e ? l.value = "" : l.value = e; } - function te() { + function x() { l.value = ""; } - function ne(e) { + function S(e) { u.value === e ? u.value = "" : u.value = e; } - function b() { + function C() { u.value = ""; } - function re(e) { + function w(e) { return e.replace(/^comtrya:\/\/[a-z]+\//, ""); } - let ie = X(() => { + let ee = Y(() => { let e = { PLANNED: 0, IN_PROGRESS: 0, @@ -6189,99 +6731,108 @@ var Mu = ["data-state", "data-epic-id"], Nu = { }; for (let t of d.value) t.state === "PLANNED" ? e.PLANNED += 1 : t.state === "IN_PROGRESS" ? e.IN_PROGRESS += 1 : t.state === "DONE" ? e.DONE += 1 : t.state === "CANCELED" && (e.CANCELED += 1); return e; - }), x = X(() => t.client ?? t.comtryaClient), ae = X(() => { - let e = Yl(t.workspaceId); - return t.projectName ? `${e}&projectName=${encodeURIComponent(t.projectName)}` : e; - }), oe = /* @__PURE__ */ z(""), se = /* @__PURE__ */ z(!1), ce = /* @__PURE__ */ z(null), S = X(() => t.projectName ?? _.value ?? null), le = X(() => { - let e = S.value; + }), te = Y(() => t.client ?? t.comtryaClient), ne = Y(() => { + let e = vl(iu, "/new", { repositorySegments: t.repositorySegments }), n = re(); + return t.projectName && n.set("projectName", t.projectName), `${e}?${n.toString()}`; + }), T = Y(() => { + if (typeof window > "u") return su(t.workspaceId); + let e = window.location.pathname.replace(/\/$/, ""); + return e.endsWith("/epics") ? `${e}/board${window.location.search}` : `${vl(iu, "/board", { repositorySegments: t.repositorySegments })}?${re().toString()}`; + }); + function re() { + let e = new URLSearchParams({ workspaceId: t.workspaceId }); + return t.repositoryId && e.set("repositoryId", t.repositoryId), e; + } + let E = /* @__PURE__ */ z(""), D = /* @__PURE__ */ z(!1), ie = /* @__PURE__ */ z(null), O = Y(() => t.projectName ?? _.value ?? null), ae = Y(() => { + let e = O.value; return e ? `New epic in ${e}…` : "New epic…"; }); - function ue() { + function k() { document.querySelector("[data-smoke=\"epics-quick-add\"]")?.focus(); } - function de(e) { - e.preventDefault(), oe.value = "", ce.value = null, e.target?.blur(); + function oe(e) { + e.preventDefault(), E.value = "", ie.value = null, e.target?.blur(); } - async function fe() { - let e = oe.value.trim(); - if (!(!e || se.value)) { - se.value = !0, ce.value = null; + async function se() { + let e = E.value.trim(); + if (!(!e || D.value)) { + D.value = !0, ie.value = null; try { - let n = await zl(x.value, { + let n = await Zl(te.value, { workspaceId: t.workspaceId, title: e, bodyMarkdown: "", - projectName: S.value + projectName: O.value }); - o.value.some((e) => e.id === n.id) || (o.value = [n, ...o.value]), oe.value = "", i.value = "ready", Se(), tr(ue); + o.value.some((e) => e.id === n.id) || (o.value = [n, ...o.value]), E.value = "", i.value = "ready", ye(), pn(k); } catch (e) { - ce.value = e instanceof Error ? e.message : String(e); + ie.value = e instanceof Error ? e.message : String(e); } finally { - se.value = !1; + D.value = !1; } } } - let C = /* @__PURE__ */ z(0), w = /* @__PURE__ */ z(/* @__PURE__ */ new Set()), T = /* @__PURE__ */ z(!1), pe = /* @__PURE__ */ z(null), me = /* @__PURE__ */ z([]); - Ur(async () => { + let A = /* @__PURE__ */ z(0), j = /* @__PURE__ */ z(/* @__PURE__ */ new Set()), ce = /* @__PURE__ */ z(!1), le = /* @__PURE__ */ z(null), ue = /* @__PURE__ */ z([]); + er(async () => { try { - me.value = await hl(); + ue.value = await wl(t.repositorySegments); } catch { - me.value = []; + ue.value = []; } - }), br(v, (e) => { - C.value >= e.length && (C.value = Math.max(0, e.length - 1)); + }), V(v, (e) => { + A.value >= e.length && (A.value = Math.max(0, e.length - 1)); }); - function he(e) { - let t = new Set(w.value); - t.has(e) ? t.delete(e) : t.add(e), w.value = t; + function de(e) { + let t = new Set(j.value); + t.has(e) ? t.delete(e) : t.add(e), j.value = t; } - function ge() { - w.value = /* @__PURE__ */ new Set(), pe.value = null; + function fe() { + j.value = /* @__PURE__ */ new Set(), le.value = null; } - async function _e(e) { - if (w.value.size === 0 || T.value) return; - let t = Array.from(w.value); - T.value = !0, pe.value = null; + async function pe(e) { + if (j.value.size === 0 || ce.value) return; + let t = Array.from(j.value); + ce.value = !0, le.value = null; try { - let n = await Promise.allSettled(t.map((t) => Bl(t, e))), r = /* @__PURE__ */ new Map(), i = /* @__PURE__ */ new Set(); + let n = await Promise.allSettled(t.map((t) => Ql(t, e))), r = /* @__PURE__ */ new Map(), i = /* @__PURE__ */ new Set(); if (n.forEach((e, n) => { let a = t[n]; e.status === "fulfilled" ? r.set(a, e.value) : i.add(a); - }), o.value = o.value.map((e) => r.get(e.id) ?? e), w.value = i, i.size > 0) { + }), o.value = o.value.map((e) => r.get(e.id) ?? e), j.value = i, i.size > 0) { let n = e ?? "(no project)"; - pe.value = `${i.size} of ${t.length} reassignments to ${n} failed; retry the remaining selection.`; + le.value = `${i.size} of ${t.length} reassignments to ${n} failed; retry the remaining selection.`; } } catch (e) { - pe.value = e instanceof Error ? e.message : String(e); + le.value = e instanceof Error ? e.message : String(e); } finally { - T.value = !1; + ce.value = !1; } } - function E(e) { + function me(e) { let t = e.target; if (!t) return; let n = t.value, r = n === "__NONE__" ? null : n || null; - t.value = "", n !== "" && _e(r); + t.value = "", n !== "" && pe(r); } - gs({ + vs({ c: (e) => { - e.preventDefault(), ue(); + e.preventDefault(), k(); }, j: (e) => { - v.value.length !== 0 && (e.preventDefault(), C.value = Math.min(v.value.length - 1, C.value + 1)); + v.value.length !== 0 && (e.preventDefault(), A.value = Math.min(v.value.length - 1, A.value + 1)); }, k: (e) => { - v.value.length !== 0 && (e.preventDefault(), C.value = Math.max(0, C.value - 1)); + v.value.length !== 0 && (e.preventDefault(), A.value = Math.max(0, A.value - 1)); }, " ": (e) => { - let t = v.value[C.value]; - t && (e.preventDefault(), he(t.id)); + let t = v.value[A.value]; + t && (e.preventDefault(), de(t.id)); }, Escape: (e) => { - w.value.size !== 0 && (e.preventDefault(), ge()); + j.value.size !== 0 && (e.preventDefault(), fe()); } }); - function ve() { + function he() { if (typeof window > "u") return; let e = new URLSearchParams(window.location.search), t = (e.get("state") ?? "").toUpperCase(); r.has(t) && (s.value = t); @@ -6292,50 +6843,54 @@ var Mu = ["data-state", "data-epic-id"], Nu = { let a = e.get("q"); a !== null && (c.value = a); } - function ye() { + function ge() { if (typeof window > "u") return; - let e = new URLSearchParams(window.location.search); - s.value === "ALL" ? e.delete("state") : e.set("state", s.value), l.value ? e.set("owner", l.value) : e.delete("owner"), u.value && !t.projectName ? e.set("project", u.value) : e.delete("project"); - let n = c.value.trim(); - n ? e.set("q", n) : e.delete("q"); - let r = e.toString(), i = `${window.location.pathname}${r ? `?${r}` : ""}${window.location.hash}`; - i !== `${window.location.pathname}${window.location.search}${window.location.hash}` && window.history.replaceState(window.history.state, "", i); - } - let be = !1; - function xe() { - be = !0, ve(), tr(() => { - be = !1; + let e = window.location.search, n = new URLSearchParams(e); + s.value === "ALL" ? n.delete("state") : n.set("state", s.value), l.value ? n.set("owner", l.value) : n.delete("owner"), ml(n, { + projectFilter: u.value, + scopedProjectName: t.projectName, + currentSearch: e + }); + let r = c.value.trim(); + r ? n.set("q", r) : n.delete("q"); + let i = n.toString(), a = `${window.location.pathname}${i ? `?${i}` : ""}${window.location.hash}`; + a !== `${window.location.pathname}${window.location.search}${window.location.hash}` && window.history.replaceState(window.history.state, "", a); + } + let _e = !1; + function ve() { + _e = !0, he(), pn(() => { + _e = !1; }); } - Ur(() => { - be = !0, ve(), be = !1, Se(), window.addEventListener("popstate", xe); - }), qr(() => { - window.removeEventListener("popstate", xe); - }), br(() => [ - x.value, + er(() => { + _e = !0, he(), _e = !1, ye(), window.addEventListener("popstate", ve); + }), ir(() => { + window.removeEventListener("popstate", ve); + }), V(() => [ + te.value, t.epics, t.workspaceId, t.state - ], () => void Se()), br([ + ], () => void ye()), V([ s, l, u, c ], () => { - be || ye(); + _e || ge(); }); - async function Se() { + async function ye() { if (t.epics) { o.value = t.epics, i.value = t.epics.length > 0 ? "ready" : "empty", a.value = null; return; } - if (!x.value) { + if (!te.value) { o.value = [], i.value = "error", a.value = "epics: no client"; return; } i.value = "loading", a.value = null; try { - o.value = await Fl(x.value, { + o.value = await Gl(te.value, { workspaceId: t.workspaceId, state: t.state }), i.value = o.value.length > 0 ? "ready" : "empty"; @@ -6348,29 +6903,29 @@ var Mu = ["data-state", "data-epic-id"], Nu = { "data-state": i.value, "data-smoke": "epics-list" }, [ - K("header", Rd, [K("h3", null, N(e.title), 1), e.showNewLink ? (W(), G("a", { + K("header", Df, [K("h3", null, N(e.title), 1), K("div", Of, [K("a", { href: T.value }, "board", 8, kf), e.showNewLink ? (W(), G("a", { key: 0, - href: ae.value - }, "+ new", 8, zd)) : J("", !0)]), - d.value.length > 0 ? (W(), G("div", Bd, [K("div", Vd, [(W(), G(U, null, $r(n, (e) => K("button", { + href: ne.value + }, "+ new", 8, Af)) : J("", !0)])]), + d.value.length > 0 ? (W(), G("div", jf, [K("div", Mf, [(W(), G(U, null, H(n, (e) => K("button", { key: e.id, type: "button", role: "tab", "aria-selected": s.value === e.id, - class: tt(["epics-filter", { active: s.value === e.id }]), + class: M(["epics-filter", { active: s.value === e.id }]), onClick: (t) => s.value = e.id - }, [K("span", null, N(e.label), 1), K("span", Ud, N(ie.value[e.id]), 1)], 10, Hd)), 64))]), K("label", Wd, [mr(K("input", { + }, [K("span", null, N(e.label), 1), K("span", Pf, N(ee.value[e.id]), 1)], 10, Nf)), 64))]), K("label", Ff, [En(K("input", { "data-epics-search": "", "onUpdate:modelValue": o[0] ||= (e) => c.value = e, type: "search", placeholder: "Filter — try is:in-progress · project: · owner: · text", autocomplete: "off" - }, null, 512), [[Zo, c.value]])])])) : J("", !0), - y.value.length > 0 ? (W(), G("div", Gd, [(W(!0), G(U, null, $r(y.value, (e) => (W(), G("span", { + }, null, 512), [[co, c.value]])])])) : J("", !0), + y.value.length > 0 ? (W(), G("div", If, [(W(!0), G(U, null, H(y.value, (e) => (W(), G("span", { key: `${e.key}:${e.value || "unknown"}`, - class: tt(["query-chip", `tone-${e.tone}`]), + class: M(["query-chip", `tone-${e.tone}`]), title: e.tone === "unknown" ? `Unknown filter key: ${e.key}` : e.value - }, N(e.label), 11, Kd))), 128)), o[2] ||= K("span", { class: "query-chips-hint" }, [ + }, N(e.label), 11, Lf))), 128)), o[2] ||= K("span", { class: "query-chips-hint" }, [ q(" syntax: "), K("code", null, "is:in-progress"), q(" · "), @@ -6378,55 +6933,55 @@ var Mu = ["data-state", "data-epic-id"], Nu = { q(" · "), K("code", null, "owner:") ], -1)])) : J("", !0), - l.value ? (W(), G("div", qd, [ + l.value ? (W(), G("div", Rf, [ o[3] ||= K("span", { class: "prefix" }, "owner", -1), K("span", { class: "active-chip", title: l.value - }, N(re(l.value)), 9, Jd), + }, N(w(l.value)), 9, zf), K("button", { type: "button", class: "clear", - onClick: te, + onClick: x, "aria-label": "Clear owner filter" }, "clear ✕") ])) : J("", !0), - u.value && !t.projectName ? (W(), G("div", Yd, [ + u.value && !t.projectName ? (W(), G("div", Bf, [ o[5] ||= K("span", { class: "prefix" }, "project", -1), K("span", { class: "active-chip", title: `Scoped to project ${u.value}` - }, [o[4] ||= K("span", { class: "project-glyph" }, "◇", -1), q(" " + N(u.value), 1)], 8, Xd), + }, [o[4] ||= K("span", { class: "project-glyph" }, "◇", -1), q(" " + N(u.value), 1)], 8, Vf), K("button", { type: "button", class: "clear", - onClick: b, + onClick: C, "aria-label": "Clear project filter" }, "clear ✕") ])) : J("", !0), K("form", { class: "epics-quick-add", - "data-busy": se.value ? "true" : "false", - onSubmit: rs(fe, ["prevent"]) + "data-busy": D.value ? "true" : "false", + onSubmit: ho(se, ["prevent"]) }, [ o[6] ||= K("span", { class: "quick-add-glyph", "aria-hidden": "true" }, "+", -1), - mr(K("input", { - "onUpdate:modelValue": o[1] ||= (e) => oe.value = e, + En(K("input", { + "onUpdate:modelValue": o[1] ||= (e) => E.value = e, "data-smoke": "epics-quick-add", type: "text", autocomplete: "off", - placeholder: le.value, - disabled: se.value, - onKeydown: as(de, ["esc"]) - }, null, 40, Qd), [[Zo, oe.value]]), - se.value ? (W(), G("span", $d, "creating…")) : S.value ? (W(), G("span", { + placeholder: ae.value, + disabled: D.value, + onKeydown: _o(oe, ["esc"]) + }, null, 40, Uf), [[co, E.value]]), + D.value ? (W(), G("span", Wf, "creating…")) : O.value ? (W(), G("span", { key: 1, class: "quick-add-chip tone-blue", - title: `Stamps projectName = ${S.value} on create` - }, "◇ " + N(S.value), 9, ef)) : J("", !0), + title: `Stamps projectName = ${O.value} on create` + }, "◇ " + N(O.value), 9, Gf)) : J("", !0), o[7] ||= K("span", { class: "quick-add-hint" }, [ K("kbd", null, "↵"), q(" create · "), @@ -6435,15 +6990,15 @@ var Mu = ["data-state", "data-epic-id"], Nu = { K("kbd", null, "c"), q(" focus ") ], -1) - ], 40, Zd), - ce.value ? (W(), G("p", tf, N(ce.value), 1)) : J("", !0), - w.value.size > 0 ? (W(), G("div", nf, [ - K("span", rf, N(w.value.size) + " selected", 1), - K("label", af, [o[10] ||= K("span", { class: "bulk-reproject-label" }, "reproject →", -1), K("select", { + ], 40, Hf), + ie.value ? (W(), G("p", Kf, N(ie.value), 1)) : J("", !0), + j.value.size > 0 ? (W(), G("div", qf, [ + K("span", Jf, N(j.value.size) + " selected", 1), + K("label", Yf, [o[10] ||= K("span", { class: "bulk-reproject-label" }, "reproject →", -1), K("select", { class: "bulk-reproject-select", "data-smoke": "epics-bulk-reproject", - disabled: T.value, - onChange: E + disabled: ce.value, + onChange: me }, [ o[8] ||= K("option", { value: "", @@ -6451,45 +7006,47 @@ var Mu = ["data-state", "data-epic-id"], Nu = { selected: "" }, "pick project…", -1), o[9] ||= K("option", { value: "__NONE__" }, "— no project —", -1), - (W(!0), G(U, null, $r(me.value, (e) => (W(), G("option", { + (W(!0), G(U, null, H(ue.value, (e) => (W(), G("option", { key: e.name, value: e.name ?? "" - }, "◇ " + N(e.name), 9, sf))), 128)) - ], 40, of)]), + }, "◇ " + N(e.name), 9, Zf))), 128)) + ], 40, Xf)]), K("button", { type: "button", class: "bulk-clear", - disabled: T.value, - onClick: ge - }, [...o[11] ||= [q("clear ", -1), K("kbd", null, "esc", -1)]], 8, cf), + disabled: ce.value, + onClick: fe + }, [...o[11] ||= [q("clear ", -1), K("kbd", null, "esc", -1)]], 8, Qf), o[12] ||= K("span", { class: "hint" }, [K("kbd", null, "space"), q(" toggle row ")], -1) ])) : J("", !0), - pe.value ? (W(), G("p", lf, N(pe.value), 1)) : J("", !0), - i.value === "loading" ? (W(), G("p", uf, "Loading epics")) : i.value === "error" ? (W(), G("p", df, N(a.value), 1)) : d.value.length === 0 ? (W(), G("p", ff, "No epics yet.")) : v.value.length === 0 ? (W(), G("p", pf, " No " + N(s.value.toLowerCase().replace("_", " ")) + " epics in scope. ", 1)) : (W(), G("ul", mf, [(W(!0), G(U, null, $r(v.value, (e, t) => (W(), G("li", { - key: e.id, - class: tt({ - focused: t === C.value, - selected: w.value.has(e.id) + le.value ? (W(), G("p", $f, N(le.value), 1)) : J("", !0), + i.value === "loading" ? (W(), G("p", ep, "Loading epics")) : i.value === "error" ? (W(), G("p", tp, N(a.value), 1)) : d.value.length === 0 ? (W(), G("p", np, "No epics yet.")) : v.value.length === 0 ? (W(), G("p", rp, " No " + N(s.value.toLowerCase().replace("_", " ")) + " epics in scope. ", 1)) : (W(), G("ul", ip, [(W(!0), G(U, null, H(v.value, (t, n) => (W(), G("li", { + key: t.id, + class: M({ + focused: n === A.value, + selected: j.value.has(t.id) }), - "aria-selected": w.value.has(e.id), + "aria-selected": j.value.has(t.id), role: "option", - onMouseenter: (e) => C.value = t - }, [Ea(bu, { - epic: e, - "resource-ref": B(ql)(e), - client: x.value, + onMouseenter: (e) => A.value = n + }, [Li(Mu, { + epic: t, + "resource-ref": B(au)(t), + client: te.value, + "repository-segments": e.repositorySegments, "active-owner": l.value, "active-project": u.value, - onOwnerClick: ee, - onProjectClick: ne + onOwnerClick: b, + onProjectClick: S }, null, 8, [ "epic", "resource-ref", "client", + "repository-segments", "active-owner", "active-project" - ])], 42, hf))), 128))])), - v.value.length > 0 ? (W(), G("footer", gf, [...o[13] ||= [ + ])], 42, ap))), 128))])), + v.value.length > 0 ? (W(), G("footer", op, [...o[13] ||= [ K("kbd", null, "j", -1), q(), K("kbd", null, "k", -1), @@ -6499,37 +7056,37 @@ var Mu = ["data-state", "data-epic-id"], Nu = { K("kbd", null, "c", -1), q(" create ", -1) ]])) : J("", !0) - ], 8, Ld)); + ], 8, Ef)); } -}), [["styles", [".epics-list[data-v-25a0998d]{gap:8px;display:grid}.epics-list-header[data-v-25a0998d]{justify-content:space-between;align-items:baseline;gap:12px;display:flex}.epics-list-header h3[data-v-25a0998d]{font-family:var(--font-serif,system-ui);margin:0;font-size:14px}.epics-list-header a[data-v-25a0998d],.epic-line[data-v-25a0998d]{font-family:var(--font-mono,monospace);font-size:12px}.epics-list-header a[data-v-25a0998d]{color:var(--fg-3,#ffffff85);text-decoration:none}.epics-controls[data-v-25a0998d]{flex-wrap:wrap;align-items:center;gap:12px;margin-bottom:4px;display:flex}.epics-search[data-v-25a0998d]{border:.5px solid var(--line,#ffffff12);background:var(--bg,#0a0b0e);flex:280px;align-items:center;gap:6px;padding:0 8px;display:inline-flex}.epics-search input[data-v-25a0998d]{font-family:var(--font-mono,monospace);color:inherit;background:0 0;border:0;outline:none;flex:1;min-width:0;padding:6px 0;font-size:12px}.epics-search input[data-v-25a0998d]::placeholder{color:var(--fg-3,#ffffff85)}.epics-query-chips[data-v-25a0998d]{font-family:var(--font-mono,monospace);flex-wrap:wrap;align-items:center;gap:6px;margin-bottom:4px;font-size:11px;display:flex}.epics-query-chips .query-chip[data-v-25a0998d]{letter-spacing:.02em;white-space:nowrap;border:.5px solid;align-items:center;padding:1px 7px;display:inline-flex}.epics-query-chips .query-chip.tone-is[data-v-25a0998d]{color:var(--accent-teal,#087f6f)}.epics-query-chips .query-chip.tone-owner[data-v-25a0998d]{color:var(--fg,#fffffff0)}.epics-query-chips .query-chip.tone-project[data-v-25a0998d]{color:var(--accent-blue,#1d55a6)}.epics-query-chips .query-chip.tone-unknown[data-v-25a0998d]{color:var(--accent-yellow,#c89300);border-style:dashed}.epics-query-chips .query-chips-hint[data-v-25a0998d]{color:var(--fg-3,#ffffff85);letter-spacing:0;margin-left:4px}.epics-query-chips .query-chips-hint code[data-v-25a0998d]{font-family:var(--font-mono,monospace);background:var(--bg-2,#0e1014);color:var(--fg-2,#ffffffbd);padding:0 4px;font-size:11px}.epics-filter-row[data-v-25a0998d]{border:.5px solid var(--fg,#fffffff0);flex-wrap:wrap;align-self:flex-start;gap:0;display:inline-flex}.epics-filter[data-v-25a0998d]{color:inherit;cursor:pointer;font-family:var(--font-mono,monospace);background:0 0;border:0;align-items:center;gap:6px;padding:4px 9px;font-size:11px;display:inline-flex}.epics-filter[data-v-25a0998d]:not(:last-child){border-right:.5px solid var(--line,#ffffff12)}.epics-filter.active[data-v-25a0998d]{background:var(--fg,#fffffff0);color:var(--bg,#0a0b0e)}.epics-filter .count[data-v-25a0998d]{color:var(--fg-3,#ffffff85);font-variant-numeric:tabular-nums}.epics-filter.active .count[data-v-25a0998d]{color:var(--bg-2,#0e1014)}.epics-owner-filter[data-v-25a0998d]{border:.5px solid var(--line,#ffffff12);background:var(--bg-2,#0e1014);font-family:var(--font-mono,monospace);align-self:flex-start;align-items:center;gap:8px;padding:6px 10px;font-size:11px;display:inline-flex}.epics-owner-filter .prefix[data-v-25a0998d]{color:var(--fg-3,#ffffff85);letter-spacing:.04em;text-transform:lowercase}.epics-owner-filter .active-chip[data-v-25a0998d]{border:.5px solid var(--fg,#fffffff0);color:var(--fg,#fffffff0);padding:0 5px}.epics-owner-filter .clear[data-v-25a0998d]{color:var(--fg-3,#ffffff85);font-family:var(--font-mono,monospace);cursor:pointer;background:0 0;border:0;margin-left:auto;padding:0 2px;font-size:10.5px}.epics-owner-filter .clear[data-v-25a0998d]:hover{color:var(--fg,#fffffff0)}.epics-project-filter[data-v-25a0998d]{border:.5px solid var(--line,#ffffff12);background:var(--bg-2,#0e1014);font-family:var(--font-mono,monospace);align-self:flex-start;align-items:center;gap:8px;padding:6px 10px;font-size:11px;display:inline-flex}.epics-project-filter .prefix[data-v-25a0998d]{color:var(--fg-3,#ffffff85);letter-spacing:.04em;text-transform:lowercase}.epics-project-filter .active-chip[data-v-25a0998d]{color:var(--accent-blue,#1d55a6);border:.5px solid;align-items:center;gap:4px;padding:0 5px;display:inline-flex}.epics-project-filter .project-glyph[data-v-25a0998d]{font-size:10px}.epics-project-filter .clear[data-v-25a0998d]{color:var(--fg-3,#ffffff85);font-family:var(--font-mono,monospace);cursor:pointer;background:0 0;border:0;margin-left:auto;padding:0 2px;font-size:10.5px}.epics-project-filter .clear[data-v-25a0998d]:hover{color:var(--fg,#fffffff0)}.epics-quick-add[data-v-25a0998d]{border:.5px solid var(--line,#ffffff12);background:var(--bg,#0a0b0e);align-items:center;gap:8px;padding:6px 10px 6px 6px;transition:border-color .12s;display:flex}.epics-quick-add[data-v-25a0998d]:focus-within{border-color:var(--fg,#fffffff0)}.epics-quick-add[data-busy=true][data-v-25a0998d]{opacity:.85;border-style:dashed}.epics-quick-add .quick-add-glyph[data-v-25a0998d]{width:22px;height:22px;font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);border:.5px solid;border-radius:2px;place-items:center;font-size:13px;display:inline-grid}.epics-quick-add input[data-v-25a0998d]{min-width:0;color:inherit;font-family:var(--font-serif,system-ui);background:0 0;border:0;outline:none;flex:1;padding:4px 0;font-size:15px}.epics-quick-add input[data-v-25a0998d]::placeholder{color:var(--fg-4,#ffffff57);font-style:italic}.epics-quick-add .quick-add-status[data-v-25a0998d]{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);font-size:11px}.epics-quick-add .quick-add-chip[data-v-25a0998d]{font-family:var(--font-mono,monospace);letter-spacing:.02em;white-space:nowrap;border:.5px solid;align-items:center;padding:1px 6px;font-size:10.5px;display:inline-flex}.epics-quick-add .quick-add-chip.tone-blue[data-v-25a0998d]{color:var(--accent-blue,#1d55a6)}.epics-quick-add .quick-add-hint[data-v-25a0998d]{font-family:var(--font-mono,monospace);color:var(--fg-4,#ffffff57);white-space:nowrap;font-size:10.5px}.epics-quick-add .quick-add-hint kbd[data-v-25a0998d]{font-family:var(--font-mono,monospace);border:.5px solid var(--line,#ffffff12);margin:0 1px;padding:0 4px;font-size:10px}.epics-list-items[data-v-25a0998d]{gap:8px;margin:0;padding:0;list-style:none;display:grid}.epics-list-items>li[data-v-25a0998d]{transition:background 80ms;position:relative}.epics-list-items>li.focused[data-v-25a0998d]{background:var(--bg-2,#0e1014)}.epics-list-items>li.selected[data-v-25a0998d]{box-shadow:inset 3px 0 0 var(--fg,#fffffff0)}.epics-list-items>li.focused.selected[data-v-25a0998d]{box-shadow:inset 3px 0 0 var(--accent-teal,#087f6f)}.epics-list-foot[data-v-25a0998d]{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);letter-spacing:.04em;margin-top:8px;font-size:11px}.epics-list-foot kbd[data-v-25a0998d]{font-family:var(--font-mono,monospace);border:.5px solid var(--line,#ffffff12);margin:0 1px;padding:0 4px;font-size:10px}.epics-bulk-bar[data-v-25a0998d]{background:var(--fg,#fffffff0);color:var(--bg,#0a0b0e);font-family:var(--font-mono,monospace);z-index:1;flex-wrap:wrap;align-items:center;gap:12px;padding:8px 12px;font-size:11px;display:flex;position:sticky;top:0}.epics-bulk-bar .count[data-v-25a0998d]{font-weight:600}.epics-bulk-bar .bulk-reproject[data-v-25a0998d]{align-items:center;gap:6px;display:inline-flex}.epics-bulk-bar .bulk-reproject-label[data-v-25a0998d]{color:var(--bg-2,#0e1014);letter-spacing:.04em}.epics-bulk-bar .bulk-reproject-select[data-v-25a0998d]{border:.5px solid var(--bg-2,#0e1014);color:var(--bg,#0a0b0e);font-family:var(--font-mono,monospace);cursor:pointer;background:0 0;outline:none;padding:2px 6px;font-size:11px}.epics-bulk-bar .bulk-reproject-select[data-v-25a0998d]:disabled{opacity:.5;cursor:wait}.epics-bulk-bar .bulk-reproject-select option[data-v-25a0998d]{background:var(--fg,#fffffff0);color:var(--bg,#0a0b0e)}.epics-bulk-bar .bulk-clear[data-v-25a0998d]{color:var(--bg-2,#0e1014);font-family:var(--font-mono,monospace);cursor:pointer;background:0 0;border:0;margin-left:auto;padding:0 4px;font-size:11px}.epics-bulk-bar .bulk-clear kbd[data-v-25a0998d]{border:.5px solid;margin-left:4px;padding:0 4px;font-size:10px}.epics-bulk-bar .hint[data-v-25a0998d]{color:var(--bg-2,#0e1014);letter-spacing:.04em;font-size:10.5px}.epics-bulk-bar .hint kbd[data-v-25a0998d]{border:.5px solid;padding:0 4px;font-size:10px}.epic-line[data-v-25a0998d]{margin:4px 0}.muted[data-v-25a0998d]{color:var(--fg-3,#ffffff85)}.warn[data-v-25a0998d]{color:var(--err,#ff645f)}@supports (color:lab(0% 0 0)){.warn[data-v-25a0998d]{color:var(--err,lab(63.3139% 59.7937 35.1683))}}"]], ["__scopeId", "data-v-25a0998d"]]), vf = { +}), [["styles", [".epics-list[data-v-bc83a744]{gap:8px;min-width:0;max-width:100%;display:grid}.epics-list-header[data-v-bc83a744]{flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:12px;min-width:0;max-width:100%;display:flex}.epics-list-header h3[data-v-bc83a744]{font-family:var(--font-serif,system-ui);margin:0;font-size:14px}.epics-list-header a[data-v-bc83a744],.epic-line[data-v-bc83a744]{font-family:var(--font-mono,monospace);font-size:12px}.epics-list-actions[data-v-bc83a744]{flex-wrap:wrap;align-items:center;gap:10px;display:flex}.epic-line[data-v-bc83a744]{overflow-wrap:anywhere;min-width:0}.epics-list-header a[data-v-bc83a744]{color:var(--fg-3,#ffffff85);text-decoration:none}.epics-controls[data-v-bc83a744]{flex-wrap:wrap;align-items:center;gap:12px;margin-bottom:4px;display:flex}.epics-search[data-v-bc83a744]{border:.5px solid var(--line,#ffffff12);background:var(--bg,#0a0b0e);flex:280px;align-items:center;gap:6px;padding:0 8px;display:inline-flex}.epics-search input[data-v-bc83a744]{font-family:var(--font-mono,monospace);color:inherit;background:0 0;border:0;outline:none;flex:1;min-width:0;padding:6px 0;font-size:12px}.epics-search input[data-v-bc83a744]::placeholder{color:var(--fg-3,#ffffff85)}.epics-query-chips[data-v-bc83a744]{font-family:var(--font-mono,monospace);flex-wrap:wrap;align-items:center;gap:6px;margin-bottom:4px;font-size:11px;display:flex}.epics-query-chips .query-chip[data-v-bc83a744]{letter-spacing:.02em;white-space:nowrap;border:.5px solid;align-items:center;padding:1px 7px;display:inline-flex}.epics-query-chips .query-chip.tone-is[data-v-bc83a744]{color:var(--accent-teal,#087f6f)}.epics-query-chips .query-chip.tone-owner[data-v-bc83a744]{color:var(--fg,#fffffff0)}.epics-query-chips .query-chip.tone-project[data-v-bc83a744]{color:var(--accent-blue,#1d55a6)}.epics-query-chips .query-chip.tone-unknown[data-v-bc83a744]{color:var(--accent-yellow,#c89300);border-style:dashed}.epics-query-chips .query-chips-hint[data-v-bc83a744]{color:var(--fg-3,#ffffff85);letter-spacing:0;margin-left:4px}.epics-query-chips .query-chips-hint code[data-v-bc83a744]{font-family:var(--font-mono,monospace);background:var(--bg-2,#0e1014);color:var(--fg-2,#ffffffbd);padding:0 4px;font-size:11px}.epics-filter-row[data-v-bc83a744]{border:.5px solid var(--fg,#fffffff0);flex-wrap:wrap;align-self:flex-start;gap:0;display:inline-flex}.epics-filter[data-v-bc83a744]{color:inherit;cursor:pointer;font-family:var(--font-mono,monospace);background:0 0;border:0;align-items:center;gap:6px;padding:4px 9px;font-size:11px;display:inline-flex}.epics-filter[data-v-bc83a744]:not(:last-child){border-right:.5px solid var(--line,#ffffff12)}.epics-filter.active[data-v-bc83a744]{background:var(--fg,#fffffff0);color:var(--bg,#0a0b0e)}.epics-filter .count[data-v-bc83a744]{color:var(--fg-3,#ffffff85);font-variant-numeric:tabular-nums}.epics-filter.active .count[data-v-bc83a744]{color:var(--bg-2,#0e1014)}.epics-owner-filter[data-v-bc83a744]{border:.5px solid var(--line,#ffffff12);background:var(--bg-2,#0e1014);font-family:var(--font-mono,monospace);align-self:flex-start;align-items:center;gap:8px;padding:6px 10px;font-size:11px;display:inline-flex}.epics-owner-filter .prefix[data-v-bc83a744]{color:var(--fg-3,#ffffff85);letter-spacing:.04em;text-transform:lowercase}.epics-owner-filter .active-chip[data-v-bc83a744]{border:.5px solid var(--fg,#fffffff0);color:var(--fg,#fffffff0);padding:0 5px}.epics-owner-filter .clear[data-v-bc83a744]{color:var(--fg-3,#ffffff85);font-family:var(--font-mono,monospace);cursor:pointer;background:0 0;border:0;margin-left:auto;padding:0 2px;font-size:10.5px}.epics-owner-filter .clear[data-v-bc83a744]:hover{color:var(--fg,#fffffff0)}.epics-project-filter[data-v-bc83a744]{border:.5px solid var(--line,#ffffff12);background:var(--bg-2,#0e1014);font-family:var(--font-mono,monospace);align-self:flex-start;align-items:center;gap:8px;padding:6px 10px;font-size:11px;display:inline-flex}.epics-project-filter .prefix[data-v-bc83a744]{color:var(--fg-3,#ffffff85);letter-spacing:.04em;text-transform:lowercase}.epics-project-filter .active-chip[data-v-bc83a744]{color:var(--accent-blue,#1d55a6);border:.5px solid;align-items:center;gap:4px;padding:0 5px;display:inline-flex}.epics-project-filter .project-glyph[data-v-bc83a744]{font-size:10px}.epics-project-filter .clear[data-v-bc83a744]{color:var(--fg-3,#ffffff85);font-family:var(--font-mono,monospace);cursor:pointer;background:0 0;border:0;margin-left:auto;padding:0 2px;font-size:10.5px}.epics-project-filter .clear[data-v-bc83a744]:hover{color:var(--fg,#fffffff0)}.epics-quick-add[data-v-bc83a744]{border:.5px solid var(--line,#ffffff12);background:var(--bg,#0a0b0e);flex-wrap:wrap;align-items:center;gap:8px;min-width:0;max-width:100%;padding:6px 10px 6px 6px;transition:border-color .12s;display:flex}.epics-quick-add[data-v-bc83a744]:focus-within{border-color:var(--fg,#fffffff0)}.epics-quick-add[data-busy=true][data-v-bc83a744]{opacity:.85;border-style:dashed}.epics-quick-add .quick-add-glyph[data-v-bc83a744]{width:22px;height:22px;font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);border:.5px solid;border-radius:2px;place-items:center;font-size:13px;display:inline-grid}.epics-quick-add input[data-v-bc83a744]{min-width:0;color:inherit;font-family:var(--font-serif,system-ui);background:0 0;border:0;outline:none;flex:180px;padding:4px 0;font-size:15px}.epics-quick-add input[data-v-bc83a744]::placeholder{color:var(--fg-4,#ffffff57);font-style:italic}.epics-quick-add .quick-add-status[data-v-bc83a744]{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);flex:0 auto;font-size:11px}.epics-quick-add .quick-add-chip[data-v-bc83a744]{min-width:0;max-width:100%;font-family:var(--font-mono,monospace);letter-spacing:.02em;white-space:nowrap;border:.5px solid;flex:0 auto;align-items:center;padding:1px 6px;font-size:10.5px;display:inline-flex}.epics-quick-add .quick-add-chip.tone-blue[data-v-bc83a744]{color:var(--accent-blue,#1d55a6)}.epics-quick-add .quick-add-hint[data-v-bc83a744]{min-width:0;font-family:var(--font-mono,monospace);color:var(--fg-4,#ffffff57);white-space:normal;flex:180px;font-size:10.5px}.epics-quick-add .quick-add-hint kbd[data-v-bc83a744]{font-family:var(--font-mono,monospace);border:.5px solid var(--line,#ffffff12);margin:0 1px;padding:0 4px;font-size:10px}.epics-list-items[data-v-bc83a744]{gap:8px;margin:0;padding:0;list-style:none;display:grid}.epics-list-items>li[data-v-bc83a744]{transition:background 80ms;position:relative}.epics-list-items>li.focused[data-v-bc83a744]{background:var(--bg-2,#0e1014)}.epics-list-items>li.selected[data-v-bc83a744]{box-shadow:inset 3px 0 0 var(--fg,#fffffff0)}.epics-list-items>li.focused.selected[data-v-bc83a744]{box-shadow:inset 3px 0 0 var(--accent-teal,#087f6f)}.epics-list-foot[data-v-bc83a744]{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);letter-spacing:.04em;margin-top:8px;font-size:11px}.epics-list-foot kbd[data-v-bc83a744]{font-family:var(--font-mono,monospace);border:.5px solid var(--line,#ffffff12);margin:0 1px;padding:0 4px;font-size:10px}.epics-bulk-bar[data-v-bc83a744]{background:var(--fg,#fffffff0);color:var(--bg,#0a0b0e);font-family:var(--font-mono,monospace);z-index:1;flex-wrap:wrap;align-items:center;gap:12px;padding:8px 12px;font-size:11px;display:flex;position:sticky;top:0}.epics-bulk-bar .count[data-v-bc83a744]{font-weight:600}.epics-bulk-bar .bulk-reproject[data-v-bc83a744]{align-items:center;gap:6px;display:inline-flex}.epics-bulk-bar .bulk-reproject-label[data-v-bc83a744]{color:var(--bg-2,#0e1014);letter-spacing:.04em}.epics-bulk-bar .bulk-reproject-select[data-v-bc83a744]{border:.5px solid var(--bg-2,#0e1014);color:var(--bg,#0a0b0e);font-family:var(--font-mono,monospace);cursor:pointer;background:0 0;outline:none;padding:2px 6px;font-size:11px}.epics-bulk-bar .bulk-reproject-select[data-v-bc83a744]:disabled{opacity:.5;cursor:wait}.epics-bulk-bar .bulk-reproject-select option[data-v-bc83a744]{background:var(--fg,#fffffff0);color:var(--bg,#0a0b0e)}.epics-bulk-bar .bulk-clear[data-v-bc83a744]{color:var(--bg-2,#0e1014);font-family:var(--font-mono,monospace);cursor:pointer;background:0 0;border:0;margin-left:auto;padding:0 4px;font-size:11px}.epics-bulk-bar .bulk-clear kbd[data-v-bc83a744]{border:.5px solid;margin-left:4px;padding:0 4px;font-size:10px}.epics-bulk-bar .hint[data-v-bc83a744]{color:var(--bg-2,#0e1014);letter-spacing:.04em;font-size:10.5px}.epics-bulk-bar .hint kbd[data-v-bc83a744]{border:.5px solid;padding:0 4px;font-size:10px}.epic-line[data-v-bc83a744]{margin:4px 0}.muted[data-v-bc83a744]{color:var(--fg-3,#ffffff85)}.warn[data-v-bc83a744]{color:var(--err,#ff645f)}@supports (color:lab(0% 0 0)){.warn[data-v-bc83a744]{color:var(--err,lab(63.3139% 59.7937 35.1683))}}"]], ["__scopeId", "data-v-bc83a744"]]), cp = { class: "issue-epic-linker", "data-smoke": "issue-epic-linker" -}, yf = { class: "issue-epic-linker-header" }, bf = { +}, lp = { class: "issue-epic-linker-header" }, up = { key: 0, class: "epic-linker-line muted" -}, xf = { +}, dp = { key: 1, class: "epic-linker-line warn" -}, Sf = { +}, fp = { key: 2, class: "linked-epics" -}, Cf = ["href"], wf = { +}, pp = ["href"], mp = { key: 0, class: "epic-linker-line muted" -}, Tf = ["disabled", "onClick"], Ef = { +}, hp = ["disabled", "onClick"], gp = { key: 3, class: "linked-epics" -}, Df = { class: "epic-linker-line muted" }, Of = ["disabled", "onClick"], kf = { +}, _p = { class: "epic-linker-line muted" }, vp = ["disabled", "onClick"], yp = { key: 4, class: "epic-linker-line muted" -}, Af = ["value"], jf = ["disabled"], Mf = { +}, bp = ["value"], xp = ["disabled"], Sp = { key: 6, class: "epic-linker-line muted" -}, Nf = { +}, Cp = { key: 7, class: "epic-linker-line warn", role: "alert" -}, Pf = "comtrya://rel/part-of", Ff = /* @__PURE__ */ yu(/* @__PURE__ */ Or({ +}, wp = "comtrya://rel/part-of", Tp = /* @__PURE__ */ ju(/* @__PURE__ */ zn({ __name: "IssueEpicLinker", props: { client: { type: null }, @@ -6543,24 +7100,24 @@ var Mu = ["data-state", "data-epic-id"], Nu = { }, emits: ["comtrya-relationship-changed"], setup(e, { emit: t }) { - let n = e, r = t, i = X(() => n.client ?? n.comtryaClient), a = X(() => n.workspaceId ?? n.issue?.workspaceId ?? Gl()), o = X(() => n.issue?.id ? `comtrya://issue/${n.issue.id}` : ""), s = X(() => { + let n = e, r = t, i = Y(() => n.client ?? n.comtryaClient), a = Y(() => n.workspaceId ?? n.issue?.workspaceId ?? ru()), o = Y(() => n.issue?.id ? `comtrya://issue/${n.issue.id}` : ""), s = Y(() => { let e = u.value; - return h.value.filter((t) => e.has(ql(t))); - }), c = X(() => { - let e = new Set(h.value.map((e) => ql(e))); + return h.value.filter((t) => e.has(au(t))); + }), c = Y(() => { + let e = new Set(h.value.map((e) => au(e))); return [...u.value].filter((t) => !e.has(t)); - }), l = X(() => { + }), l = Y(() => { let e = u.value, t = n.issue?.projectName ?? null; - return h.value.filter((t) => !e.has(ql(t))).sort((e, n) => (t && e.projectName === t ? 0 : 1) - (t && n.projectName === t ? 0 : 1) || (e.projectName ?? "").localeCompare(n.projectName ?? "") || e.title.localeCompare(n.title)); - }), u = X(() => new Set(g.value.filter((e) => e.kind === Pf).map((e) => b(e)).filter((e) => e.startsWith("comtrya://epic/")))), d = /* @__PURE__ */ z("idle"), f = /* @__PURE__ */ z(null), p = /* @__PURE__ */ z("idle"), m = /* @__PURE__ */ z(null), h = /* @__PURE__ */ z([]), g = /* @__PURE__ */ z([]), _ = /* @__PURE__ */ z(""); - br(() => [ + return h.value.filter((t) => !e.has(au(t))).sort((e, n) => (t && e.projectName === t ? 0 : 1) - (t && n.projectName === t ? 0 : 1) || (e.projectName ?? "").localeCompare(n.projectName ?? "") || e.title.localeCompare(n.title)); + }), u = Y(() => new Set(g.value.filter((e) => e.kind === wp).map((e) => C(e)).filter((e) => e.startsWith("comtrya://epic/")))), d = /* @__PURE__ */ z("idle"), f = /* @__PURE__ */ z(null), p = /* @__PURE__ */ z("idle"), m = /* @__PURE__ */ z(null), h = /* @__PURE__ */ z([]), g = /* @__PURE__ */ z([]), _ = /* @__PURE__ */ z(""); + V(() => [ i.value, a.value, o.value, n.refreshKey, n.relationshipRefreshKey - ], () => void v(), { immediate: !0 }), br(l, (e) => { - e.some((e) => ql(e) === _.value) || (_.value = e[0] ? ql(e[0]) : ""); + ], () => void v(), { immediate: !0 }), V(l, (e) => { + e.some((e) => au(e) === _.value) || (_.value = e[0] ? au(e[0]) : ""); }, { immediate: !0 }); async function v() { let e = i.value; @@ -6570,7 +7127,7 @@ var Mu = ["data-state", "data-epic-id"], Nu = { } d.value = "loading", f.value = null; try { - let [t, n] = await Promise.all([Fl(e, { workspaceId: a.value }), Vl(e, o.value, Pf)]); + let [t, n] = await Promise.all([Gl(e, { workspaceId: a.value }), $l(e, o.value, wp)]); h.value = t, g.value = n, d.value = "ready"; } catch (e) { h.value = [], g.value = [], d.value = "error", f.value = e instanceof Error ? e.message : String(e); @@ -6581,12 +7138,12 @@ var Mu = ["data-state", "data-epic-id"], Nu = { if (!(!e || !o.value || !_.value)) { p.value = "submitting", m.value = null; try { - let t = await Hl(e, { + let t = await eu(e, { from: o.value, to: _.value, - kind: Pf + kind: wp }); - await v(), re("created", t); + await v(), w("created", t); } catch (e) { m.value = e instanceof Error ? e.message : String(e); } finally { @@ -6594,12 +7151,12 @@ var Mu = ["data-state", "data-epic-id"], Nu = { } } } - async function ee(e) { + async function b(e) { let t = i.value; if (t) { p.value = "submitting", m.value = null; try { - await Ul(t, e.id), await v(), re("deleted", e); + await tu(t, e.id), await v(), w("deleted", e); } catch (e) { m.value = e instanceof Error ? e.message : String(e); } finally { @@ -6607,139 +7164,151 @@ var Mu = ["data-state", "data-epic-id"], Nu = { } } } - async function te(e) { - let t = ne(e); - t && await ee(t); + async function x(e) { + let t = S(e); + t && await b(t); } - function ne(e) { - return g.value.find((t) => b(t) === e); + function S(e) { + return g.value.find((t) => C(t) === e); } - function b(e) { + function C(e) { return e.to ?? e.target ?? ""; } - function re(e, t) { + function w(e, t) { r("comtrya-relationship-changed", { source: "issue-epic-linker", action: e, relation: t }); } - return (e, t) => (W(), G("section", vf, [ - K("header", yf, [K("div", null, [t[1] ||= K("h2", null, "Epic", -1), K("p", null, N(s.value.length + c.value.length) + " linked", 1)])]), - d.value === "loading" ? (W(), G("p", bf, "Loading epics")) : d.value === "error" ? (W(), G("p", xf, N(f.value), 1)) : J("", !0), - d.value === "ready" && s.value.length > 0 ? (W(), G("div", Sf, [(W(!0), G(U, null, $r(s.value, (e) => (W(), G("article", { + return (e, t) => (W(), G("section", cp, [ + K("header", lp, [K("div", null, [t[1] ||= K("h2", null, "Epic", -1), K("p", null, N(s.value.length + c.value.length) + " linked", 1)])]), + d.value === "loading" ? (W(), G("p", up, "Loading epics")) : d.value === "error" ? (W(), G("p", dp, N(f.value), 1)) : J("", !0), + d.value === "ready" && s.value.length > 0 ? (W(), G("div", fp, [(W(!0), G(U, null, H(s.value, (e) => (W(), G("article", { key: e.id, class: "linked-epic" }, [K("div", null, [ - K("span", { class: tt(["epic-state", B(Xl)(e.state).className]) }, N(B(Xl)(e.state).label), 3), - K("a", { href: B(Jl)(e) }, N(e.title), 9, Cf), - e.projectName ? (W(), G("p", wf, N(e.projectName), 1)) : J("", !0) + K("span", { class: M(["epic-state", B(cu)(e.state).className]) }, N(B(cu)(e.state).label), 3), + K("a", { href: B(ou)(e) }, N(e.title), 9, pp), + e.projectName ? (W(), G("p", mp, N(e.projectName), 1)) : J("", !0) ]), K("button", { type: "button", disabled: p.value === "submitting", - onClick: (t) => te(B(ql)(e)) - }, " Remove ", 8, Tf)]))), 128))])) : J("", !0), - d.value === "ready" && c.value.length > 0 ? (W(), G("div", Ef, [(W(!0), G(U, null, $r(c.value, (e) => (W(), G("article", { + onClick: (t) => x(B(au)(e)) + }, " Remove ", 8, hp)]))), 128))])) : J("", !0), + d.value === "ready" && c.value.length > 0 ? (W(), G("div", gp, [(W(!0), G(U, null, H(c.value, (e) => (W(), G("article", { key: e, class: "linked-epic" - }, [K("p", Df, N(e), 1), ne(e) ? (W(), G("button", { + }, [K("p", _p, N(e), 1), S(e) ? (W(), G("button", { key: 0, type: "button", disabled: p.value === "submitting", - onClick: (t) => te(e) - }, " Remove ", 8, Of)) : J("", !0)]))), 128))])) : J("", !0), - d.value === "ready" && s.value.length === 0 && c.value.length === 0 ? (W(), G("p", kf, " Not linked to an epic. ")) : J("", !0), + onClick: (t) => x(e) + }, " Remove ", 8, vp)) : J("", !0)]))), 128))])) : J("", !0), + d.value === "ready" && s.value.length === 0 && c.value.length === 0 ? (W(), G("p", yp, " Not linked to an epic. ")) : J("", !0), d.value === "ready" && l.value.length > 0 ? (W(), G("form", { key: 5, class: "epic-linker-form", - onSubmit: rs(y, ["prevent"]) - }, [K("label", null, [t[2] ||= K("span", null, "Link epic", -1), mr(K("select", { + onSubmit: ho(y, ["prevent"]) + }, [K("label", null, [t[2] ||= K("span", null, "Link epic", -1), En(K("select", { "onUpdate:modelValue": t[0] ||= (e) => _.value = e, "aria-label": "Epic" - }, [(W(!0), G(U, null, $r(l.value, (e) => (W(), G("option", { + }, [(W(!0), G(U, null, H(l.value, (e) => (W(), G("option", { key: e.id, - value: B(ql)(e) - }, N(e.title) + N(e.projectName ? ` - ${e.projectName}` : ""), 9, Af))), 128))], 512), [[Qo, _.value]])]), K("button", { + value: B(au)(e) + }, N(e.title) + N(e.projectName ? ` - ${e.projectName}` : ""), 9, bp))), 128))], 512), [[lo, _.value]])]), K("button", { type: "submit", disabled: p.value === "submitting" || !_.value - }, " Link ", 8, jf)], 32)) : d.value === "ready" && l.value.length === 0 ? (W(), G("p", Mf, " No eligible epics. ")) : J("", !0), - m.value ? (W(), G("p", Nf, N(m.value), 1)) : J("", !0) + }, " Link ", 8, xp)], 32)) : d.value === "ready" && l.value.length === 0 ? (W(), G("p", Sp, " No eligible epics. ")) : J("", !0), + m.value ? (W(), G("p", Cp, N(m.value), 1)) : J("", !0) ])); } -}), [["styles", [".issue-epic-linker[data-v-7883bb2f]{border:.5px solid var(--line,#ffffff12);background:var(--surface);color:var(--fg,#fffffff0);font-family:var(--font-mono,monospace);gap:12px;padding:14px;font-size:12px;display:grid}.issue-epic-linker-header[data-v-7883bb2f]{border-bottom:.5px solid var(--line,#ffffff12);align-items:center;min-height:36px;display:flex}.issue-epic-linker-header h2[data-v-7883bb2f]{font-family:var(--font-serif,system-ui);margin:0;font-size:18px;line-height:1}.issue-epic-linker-header p[data-v-7883bb2f],.epic-linker-line[data-v-7883bb2f]{margin:4px 0 0;font-size:11px}.linked-epics[data-v-7883bb2f],.epic-linker-form[data-v-7883bb2f]{gap:8px;display:grid}.linked-epic[data-v-7883bb2f]{grid-template-columns:minmax(0,1fr) auto;align-items:start;gap:8px;display:grid}.linked-epic a[data-v-7883bb2f]{color:inherit;overflow-wrap:anywhere;text-decoration:none}.linked-epic a[data-v-7883bb2f]:hover{text-decoration:underline}.epic-state[data-v-7883bb2f]{border:.5px solid;margin-right:6px;padding:1px 6px;font-size:10px;display:inline-flex}.epic-linker-form[data-v-7883bb2f]{border-top:.5px solid var(--line,#ffffff12);padding-top:12px}.epic-linker-form label[data-v-7883bb2f]{gap:4px;min-width:0;display:grid}.epic-linker-form label>span[data-v-7883bb2f]{color:var(--fg-3,#ffffff85);letter-spacing:.08em;text-transform:uppercase;font-size:10px}.epic-linker-form select[data-v-7883bb2f],.epic-linker-form button[data-v-7883bb2f],.linked-epic button[data-v-7883bb2f]{border:.5px solid var(--fg,#fffffff0);min-height:32px;color:inherit;font:inherit;background:0 0}.epic-linker-form select[data-v-7883bb2f]{width:100%;max-width:100%;padding:5px 8px}.epic-linker-form button[data-v-7883bb2f],.linked-epic button[data-v-7883bb2f]{cursor:pointer;padding:5px 10px}.epic-linker-form button[data-v-7883bb2f]:disabled,.linked-epic button[data-v-7883bb2f]:disabled{cursor:wait;opacity:.55}.muted[data-v-7883bb2f]{color:var(--fg-3,#ffffff85)}.warn[data-v-7883bb2f]{color:var(--err,#ff645f)}@supports (color:lab(0% 0 0)){.warn[data-v-7883bb2f]{color:var(--err,lab(63.3139% 59.7937 35.1683))}}"]], ["__scopeId", "data-v-7883bb2f"]]), If = "epics", Lf = "ext_epics", Rf = "comtrya-epic-card", zf = "comtrya-epics-board", Bf = "comtrya-epics-index", Vf = "comtrya-epic-detail", Hf = "comtrya-issue-epic-linker", Uf = "comtrya-epic-new"; -Sl({ - tagName: Rf, - component: bu, +}), [["styles", [".issue-epic-linker[data-v-7883bb2f]{border:.5px solid var(--line,#ffffff12);background:var(--surface);color:var(--fg,#fffffff0);font-family:var(--font-mono,monospace);gap:12px;padding:14px;font-size:12px;display:grid}.issue-epic-linker-header[data-v-7883bb2f]{border-bottom:.5px solid var(--line,#ffffff12);align-items:center;min-height:36px;display:flex}.issue-epic-linker-header h2[data-v-7883bb2f]{font-family:var(--font-serif,system-ui);margin:0;font-size:18px;line-height:1}.issue-epic-linker-header p[data-v-7883bb2f],.epic-linker-line[data-v-7883bb2f]{margin:4px 0 0;font-size:11px}.linked-epics[data-v-7883bb2f],.epic-linker-form[data-v-7883bb2f]{gap:8px;display:grid}.linked-epic[data-v-7883bb2f]{grid-template-columns:minmax(0,1fr) auto;align-items:start;gap:8px;display:grid}.linked-epic a[data-v-7883bb2f]{color:inherit;overflow-wrap:anywhere;text-decoration:none}.linked-epic a[data-v-7883bb2f]:hover{text-decoration:underline}.epic-state[data-v-7883bb2f]{border:.5px solid;margin-right:6px;padding:1px 6px;font-size:10px;display:inline-flex}.epic-linker-form[data-v-7883bb2f]{border-top:.5px solid var(--line,#ffffff12);padding-top:12px}.epic-linker-form label[data-v-7883bb2f]{gap:4px;min-width:0;display:grid}.epic-linker-form label>span[data-v-7883bb2f]{color:var(--fg-3,#ffffff85);letter-spacing:.08em;text-transform:uppercase;font-size:10px}.epic-linker-form select[data-v-7883bb2f],.epic-linker-form button[data-v-7883bb2f],.linked-epic button[data-v-7883bb2f]{border:.5px solid var(--fg,#fffffff0);min-height:32px;color:inherit;font:inherit;background:0 0}.epic-linker-form select[data-v-7883bb2f]{width:100%;max-width:100%;padding:5px 8px}.epic-linker-form button[data-v-7883bb2f],.linked-epic button[data-v-7883bb2f]{cursor:pointer;padding:5px 10px}.epic-linker-form button[data-v-7883bb2f]:disabled,.linked-epic button[data-v-7883bb2f]:disabled{cursor:wait;opacity:.55}.muted[data-v-7883bb2f]{color:var(--fg-3,#ffffff85)}.warn[data-v-7883bb2f]{color:var(--err,#ff645f)}@supports (color:lab(0% 0 0)){.warn[data-v-7883bb2f]{color:var(--err,lab(63.3139% 59.7937 35.1683))}}"]], ["__scopeId", "data-v-7883bb2f"]]), Ep = "epics", Dp = "ext_epics", Op = "comtrya-epic-card", kp = "comtrya-epics-board", Ap = "comtrya-epics-index", jp = "comtrya-epics-roadmap", Mp = "comtrya-epic-detail", Np = "comtrya-issue-epic-linker", Pp = "comtrya-epic-new"; +jl({ + tagName: Op, + component: Mu, propertyAliases: { ref: "resourceRef" } -}), Sl({ - tagName: zf, - component: _f -}), Sl({ - tagName: Bf, - component: _f -}), Sl({ - tagName: Vf, - component: Id -}), Sl({ - tagName: Hf, - component: Ff -}), Gf(); -var Wf = { - id: Lf, +}), jl({ + tagName: kp, + component: sp +}), jl({ + tagName: Ap, + component: sp +}), jl({ + tagName: jp, + component: Tf +}), jl({ + tagName: Mp, + component: Jd +}), jl({ + tagName: Np, + component: Tp +}), Ip(); +var Fp = { + id: Dp, setup(e) { e.registerCard({ resourceKind: "epic", - element: Rf, + element: Op, requiredPermission: "epics.read" }), e.registerRelationshipTargetProvider({ resourceKind: "epic", - loadTargets: async (t) => (await Fl(e.client, { workspaceId: t.workspaceId ?? Gl() })).map((e) => ({ - ref: ql(e), + loadTargets: async (t) => (await Gl(e.client, { workspaceId: t.workspaceId ?? ru() })).map((e) => ({ + ref: au(e), kind: "epic", title: e.title, subtitle: e.state.toLowerCase().replace(/_/g, " ") })) }), e.registerWidget({ id: "epics-board", - element: zf, + element: kp, defaultSlot: "repository.sidebar", defaultPriority: 100, requiredPermission: "epics.read" }), e.registerWidget({ id: "issue-epic-linker", - element: Hf, + element: Np, defaultSlot: "issue.detail.sidebar", defaultPriority: 90, requiredPermission: "epics.write" }), e.registerRoute("/", { - element: Bf, + element: Ap, + requiredPermission: "epics.read" + }), e.registerRoute("/board", { + element: jp, requiredPermission: "epics.read" }), e.registerRoute("/new", { - element: Uf, + element: Pp, requiredPermission: "epics.write" }), e.registerRoute("/:workspaceId/:id", { - element: Vf, + element: Mp, requiredPermission: "epics.read" - }), ru(e.client); + }), hu(e.client); } }; -function Gf() { - typeof customElements > "u" || customElements.get(Uf) || customElements.define(Uf, class extends HTMLElement { +function Ip() { + typeof customElements > "u" || customElements.get(Pp) || customElements.define(Pp, class extends HTMLElement { routeParams; + workspaceId; + repositorySegments; connectedCallback() { - let e = Kf(this.routeParams); - this.replaceChildren(qf(e)); + let e = Lp(this.routeParams, { + workspaceId: this.workspaceId, + repositorySegments: this.repositorySegments + }); + this.replaceChildren(Rp(e)); } }); } -function Kf(e) { - let t = new URLSearchParams(window.location.search); +function Lp(e, t = {}) { + let n = new URLSearchParams(window.location.search), r = t.repositorySegments?.map((e) => e.trim()).filter(Boolean); return { - workspaceId: t.get("workspaceId") ?? e?.params?.workspaceId ?? Gl(), - projectName: t.get("projectName") ?? e?.params?.projectName ?? null + workspaceId: t.workspaceId ?? n.get("workspaceId") ?? e?.params?.workspaceId ?? ru(), + repositorySegments: r?.length ? r : void 0, + projectName: n.get("projectName") ?? e?.params?.projectName ?? null }; } -function qf(e) { +function Rp(e) { let t = document.createElement("main"); t.className = "epic-new", t.dataset.smoke = "epic-new"; let n = document.createElement("h3"); @@ -6749,11 +7318,19 @@ function qf(e) { let a = document.createElement("select"); a.className = "epic-new-project-select", a.dataset.smoke = "epic-new-project"; let o = document.createElement("option"); - o.value = "", o.textContent = "— no project —", a.append(o), hl().then((t) => { - for (let n of t) { - if (!n.name) continue; + o.value = "", o.textContent = "— no project —", a.append(o), wl(e.repositorySegments).then((t) => { + let n = !1; + for (let r of t) { + if (!r.name) continue; let t = document.createElement("option"); - t.value = n.name, t.textContent = n.name, n.name === e.projectName && (t.selected = !0), a.append(t); + t.value = r.name, t.textContent = r.name, r.name === e.projectName && (t.selected = !0, n = !0), a.append(t); + } + if (e.projectName) { + if (!n) { + let t = document.createElement("option"); + t.value = e.projectName, t.textContent = e.projectName, t.selected = !0, a.append(t); + } + a.value = e.projectName; } }), a.addEventListener("change", () => { n.textContent = a.value ? `New epic in ${a.value}` : "New epic"; @@ -6762,23 +7339,23 @@ function qf(e) { s.rows = 5, s.placeholder = "Description (optional)"; let c = document.createElement("button"); c.type = "submit", c.textContent = "Create epic"; - let l = Jf("", "warn"); + let l = zp("", "warn"); return l.setAttribute("role", "alert"), l.hidden = !0, r.append(i, a, s, c, l), r.addEventListener("submit", (t) => { - t.preventDefault(), c.disabled = !0, l.hidden = !0, zl(void 0, { + t.preventDefault(), c.disabled = !0, l.hidden = !0, Zl(void 0, { workspaceId: e.workspaceId, - projectName: a.value || null, + projectName: a.value || e.projectName || null, title: i.value.trim(), bodyMarkdown: s.value - }).then((e) => { - window.location.assign(p(If, `/${e.workspaceId}/${e.id}`)); + }).then((t) => { + window.location.assign(vl(Ep, `/${t.workspaceId}/${t.id}`, { repositorySegments: e.repositorySegments })); }).catch((e) => { l.textContent = e instanceof Error ? e.message : String(e), l.hidden = !1, c.disabled = !1; }); }), t.append(n, r), t; } -function Jf(e, t) { +function zp(e, t) { let n = document.createElement("p"); return n.className = `epic-line ${t}`, n.textContent = e, n; } //#endregion -export { Wf as default }; +export { Fp as default }; diff --git a/extensions/first-party/ext_epics/component/src/lib.rs b/extensions/first-party/ext_epics/component/src/lib.rs index 44d993b6..989f8975 100644 --- a/extensions/first-party/ext_epics/component/src/lib.rs +++ b/extensions/first-party/ext_epics/component/src/lib.rs @@ -10,12 +10,19 @@ use bindings::comtrya::platform::storage; use bindings::comtrya::platform::time; use bindings::comtrya::platform::types::{Error, ErrorCode, Event}; use bindings::exports::comtrya::ext_epics::epics::{ - AssignProjectInput, ChangeStateEpicInput, CreateEpicInput, Epic, EpicProgress, EpicState, - Guest as EpicsGuest, UpdateEpicInput, + AssignProjectInput, ChangeStateEpicInput, CreateEpicInput, Epic, EpicLabelBoard, + EpicLabelCard, EpicLabelColumn, EpicMilestoneBoard, EpicMilestoneCard, EpicMilestoneColumn, + EpicOwnerBoard, EpicOwnerCard, EpicOwnerColumn, EpicPriorityBoard, EpicPriorityCard, + EpicPriorityColumn, EpicProgress, EpicProjectBoard, EpicProjectCard, EpicProjectColumn, + EpicRoadmapBoard, EpicRoadmapCard, EpicRoadmapColumn, EpicState, EpicTargetBoard, + EpicTargetCard, EpicTargetColumn, Guest as EpicsGuest, LabelBoardInput, MilestoneBoardInput, + OwnerBoardInput, PriorityBoardInput, ProjectBoardInput, RoadmapBoardInput, TargetBoardInput, + UpdateEpicInput, }; use bindings::exports::comtrya::platform::reactor::{Guest as ReactorGuest, Reaction}; use serde::{Deserialize, Serialize}; +use std::collections::BTreeMap; const COLLECTION: &str = "epics"; const COUNTER_COLLECTION: &str = "ext_epics_meta"; @@ -149,8 +156,9 @@ fn next_epic_number(workspace_id: &str) -> Result { } let assigned = counter.next; counter.next = counter.next.saturating_add(1); - let bytes = serde_json::to_vec(&counter) - .map_err(|e| err(ErrorCode::Internal, format!("serialise epic counter: {e}")))?; + let bytes = serde_json::to_vec(&counter).map_err(|e| { + err(ErrorCode::Internal, format!("serialise epic counter: {e}")) + })?; match storage::update_commit( COUNTER_COLLECTION, &counter.storage_id, @@ -173,8 +181,9 @@ fn next_epic_number(workspace_id: &str) -> Result { storage_id: storage_id.clone(), next: 2, }; - let bytes = serde_json::to_vec(&counter) - .map_err(|e| err(ErrorCode::Internal, format!("serialise epic counter: {e}")))?; + let bytes = serde_json::to_vec(&counter).map_err(|e| { + err(ErrorCode::Internal, format!("serialise epic counter: {e}")) + })?; match storage::create( COUNTER_COLLECTION, &storage_id, @@ -223,6 +232,23 @@ fn state_from_str(state: &str) -> EpicState { } } +fn can_transition_epic_state(current: &str, next: &str) -> bool { + if current == next { + return true; + } + matches!( + (current, next), + ("PLANNED", "IN_PROGRESS") + | ("PLANNED", "CANCELED") + | ("IN_PROGRESS", "AT_RISK") + | ("IN_PROGRESS", "DONE") + | ("IN_PROGRESS", "CANCELED") + | ("AT_RISK", "IN_PROGRESS") + | ("AT_RISK", "DONE") + | ("AT_RISK", "CANCELED") + ) +} + fn workspace_id(workspace: &str) -> Option { workspace .strip_prefix("comtrya://workspace/") @@ -411,6 +437,547 @@ fn epic_uri(id: &str) -> String { format!("comtrya://epic/{id}") } +#[derive(Clone, Copy)] +enum RoadmapLane { + Planned, + InProgress, + AtRisk, + Done, + Canceled, +} + +fn roadmap_lane(state: EpicState) -> RoadmapLane { + match state { + EpicState::Planned => RoadmapLane::Planned, + EpicState::InProgress => RoadmapLane::InProgress, + EpicState::AtRisk => RoadmapLane::AtRisk, + EpicState::Done => RoadmapLane::Done, + EpicState::Canceled => RoadmapLane::Canceled, + } +} + +fn roadmap_column(key: &str, label: &str, cards: Vec) -> EpicRoadmapColumn { + EpicRoadmapColumn { + key: key.to_string(), + label: label.to_string(), + count: cards.len() as u32, + cards, + } +} + +fn roadmap_columns(cards: Vec) -> Vec { + let mut planned = Vec::new(); + let mut in_progress = Vec::new(); + let mut at_risk = Vec::new(); + let mut done = Vec::new(); + let mut canceled = Vec::new(); + + for card in cards { + match roadmap_lane(card.epic.state) { + RoadmapLane::Planned => planned.push(card), + RoadmapLane::InProgress => in_progress.push(card), + RoadmapLane::AtRisk => at_risk.push(card), + RoadmapLane::Done => done.push(card), + RoadmapLane::Canceled => canceled.push(card), + } + } + + vec![ + roadmap_column("planned", "Planned", planned), + roadmap_column("in-progress", "In progress", in_progress), + roadmap_column("at-risk", "At risk", at_risk), + roadmap_column("done", "Done", done), + roadmap_column("canceled", "Canceled", canceled), + ] +} + +fn epic_owner_key(owner_ref: &str) -> String { + let raw = owner_ref + .trim() + .strip_prefix("comtrya://") + .unwrap_or(owner_ref); + let mut key = String::new(); + let mut last_dash = false; + for byte in raw.bytes() { + if byte.is_ascii_alphanumeric() { + key.push(byte.to_ascii_lowercase() as char); + last_dash = false; + } else if !last_dash { + key.push('-'); + last_dash = true; + } + } + let key = key.trim_matches('-'); + if key.is_empty() { + "owner".to_string() + } else { + format!("owner-{key}") + } +} + +fn owner_column( + key: &str, + label: &str, + owner_ref: Option, + cards: Vec, +) -> EpicOwnerColumn { + EpicOwnerColumn { + key: key.to_string(), + label: label.to_string(), + owner_ref, + count: cards.len() as u32, + cards, + } +} + +fn owner_columns(cards: Vec) -> Vec { + let mut unowned = Vec::new(); + let mut owned: BTreeMap)> = BTreeMap::new(); + + for card in cards { + let owner_ref = card + .epic + .owner_ref + .as_deref() + .map(str::trim) + .filter(|owner_ref| !owner_ref.is_empty()) + .map(str::to_string); + let Some(owner_ref) = owner_ref else { + unowned.push(card); + continue; + }; + let key = epic_owner_key(&owner_ref); + let entry = owned.entry(key).or_insert_with(|| (owner_ref, Vec::new())); + entry.1.push(card); + } + + let mut columns = vec![owner_column("unowned", "Unowned", None, unowned)]; + columns.extend(owned.into_iter().map(|(key, (owner_ref, cards))| { + owner_column(&key, &owner_ref, Some(owner_ref.clone()), cards) + })); + columns +} + +fn epic_project_key(project_name: &str) -> String { + let mut key = String::new(); + let mut last_dash = false; + for byte in project_name.trim().bytes() { + if byte.is_ascii_alphanumeric() { + key.push(byte.to_ascii_lowercase() as char); + last_dash = false; + } else if !last_dash { + key.push('-'); + last_dash = true; + } + } + let key = key.trim_matches('-'); + if key.is_empty() { + "project".to_string() + } else { + format!("project-{key}") + } +} + +fn project_column( + key: &str, + label: &str, + project_name: Option, + cards: Vec, +) -> EpicProjectColumn { + EpicProjectColumn { + key: key.to_string(), + label: label.to_string(), + project_name, + count: cards.len() as u32, + cards, + } +} + +fn project_columns(cards: Vec) -> Vec { + let mut unscoped = Vec::new(); + let mut scoped: BTreeMap)> = BTreeMap::new(); + + for card in cards { + let project_name = card + .epic + .project_name + .as_deref() + .map(str::trim) + .filter(|project_name| !project_name.is_empty()) + .map(str::to_string); + let Some(project_name) = project_name else { + unscoped.push(card); + continue; + }; + let key = epic_project_key(&project_name); + let entry = scoped + .entry(key) + .or_insert_with(|| (project_name, Vec::new())); + entry.1.push(card); + } + + let mut columns = vec![project_column("unscoped", "Unscoped", None, unscoped)]; + columns.extend(scoped.into_iter().map(|(key, (project_name, cards))| { + project_column(&key, &project_name, Some(project_name.clone()), cards) + })); + columns +} + +fn epic_label_key(label: &str) -> String { + let mut key = String::new(); + let mut last_dash = false; + for byte in label.trim().bytes() { + if byte.is_ascii_alphanumeric() { + key.push(byte.to_ascii_lowercase() as char); + last_dash = false; + } else if !last_dash { + key.push('-'); + last_dash = true; + } + } + let key = key.trim_matches('-'); + if key.is_empty() { + "label".to_string() + } else { + format!("label-{key}") + } +} + +fn label_column(key: &str, label: &str, cards: Vec) -> EpicLabelColumn { + EpicLabelColumn { + key: key.to_string(), + label: label.to_string(), + count: cards.len() as u32, + cards, + } +} + +fn label_columns(cards: Vec) -> Vec { + let mut unlabeled = Vec::new(); + let mut labeled: BTreeMap)> = BTreeMap::new(); + + for card in cards { + let labels: Vec = card + .epic + .labels + .iter() + .map(|label| label.trim()) + .filter(|label| !label.is_empty()) + .map(str::to_string) + .collect(); + if labels.is_empty() { + unlabeled.push(card); + continue; + } + for label in labels { + let key = epic_label_key(&label); + let entry = labeled.entry(key).or_insert_with(|| (label, Vec::new())); + entry.1.push(EpicLabelCard { + epic: card.epic.clone(), + progress: card.progress.clone(), + }); + } + } + + let mut columns = vec![label_column("unlabeled", "Unlabeled", unlabeled)]; + columns.extend( + labeled + .into_iter() + .map(|(key, (label, cards))| label_column(&key, &label, cards)), + ); + columns +} + +fn priority_column( + key: &str, + label: &str, + priority: Option<&str>, + cards: Vec, +) -> EpicPriorityColumn { + EpicPriorityColumn { + key: key.to_string(), + label: label.to_string(), + priority: priority.map(str::to_string), + count: cards.len() as u32, + cards, + } +} + +fn priority_columns(cards: Vec) -> Vec { + let mut p0 = Vec::new(); + let mut p1 = Vec::new(); + let mut p2 = Vec::new(); + let mut p3 = Vec::new(); + let mut unprioritized = Vec::new(); + let mut completed = Vec::new(); + + for card in cards { + if matches!(card.epic.state, EpicState::Done | EpicState::Canceled) { + completed.push(card); + continue; + } + match card.priority.as_deref() { + Some("p0") => p0.push(card), + Some("p1") => p1.push(card), + Some("p2") => p2.push(card), + Some("p3") => p3.push(card), + _ => unprioritized.push(card), + } + } + + vec![ + priority_column("p0", "P0 critical", Some("p0"), p0), + priority_column("p1", "P1 high", Some("p1"), p1), + priority_column("p2", "P2 medium", Some("p2"), p2), + priority_column("p3", "P3 low", Some("p3"), p3), + priority_column("unprioritized", "No priority", None, unprioritized), + priority_column("completed", "Completed", None, completed), + ] +} + +struct EpicPriority { + key: &'static str, + rank: u8, + source_label: String, +} + +fn epic_priority(epic: &Epic) -> Option { + epic.labels + .iter() + .filter_map(|label| priority_from_label(label)) + .min_by_key(|priority| priority.rank) +} + +fn priority_from_label(label: &str) -> Option { + let normalized = normalize_priority_label(label); + let key = match normalized.as_str() { + "p0" | "0" | "critical" | "urgent" | "blocker" => "p0", + "p1" | "1" | "high" => "p1", + "p2" | "2" | "medium" | "normal" => "p2", + "p3" | "3" | "low" | "minor" => "p3", + _ => return None, + }; + Some(EpicPriority { + key, + rank: priority_rank(key), + source_label: label.trim().to_string(), + }) +} + +fn normalize_priority_label(label: &str) -> String { + let trimmed = label.trim().to_ascii_lowercase(); + let value = ["priority", "prio"] + .into_iter() + .find_map(|prefix| trimmed.strip_prefix(prefix)) + .unwrap_or(trimmed.as_str()) + .trim_start_matches(|ch| matches!(ch, ':' | '/' | '-')); + value + .trim_matches(|ch: char| !ch.is_ascii_alphanumeric()) + .to_string() +} + +fn priority_rank(key: &str) -> u8 { + match key { + "p0" => 0, + "p1" => 1, + "p2" => 2, + "p3" => 3, + _ => u8::MAX, + } +} + +fn milestone_column( + key: &str, + label: &str, + milestone: Option, + cards: Vec, +) -> EpicMilestoneColumn { + EpicMilestoneColumn { + key: key.to_string(), + label: label.to_string(), + milestone, + count: cards.len() as u32, + cards, + } +} + +fn milestone_columns(cards: Vec) -> Vec { + let mut unscheduled = Vec::new(); + let mut scheduled: BTreeMap)> = BTreeMap::new(); + let mut completed = Vec::new(); + + for card in cards { + if matches!(card.epic.state, EpicState::Done | EpicState::Canceled) { + completed.push(card); + continue; + } + let Some(milestone) = card.milestone.clone() else { + unscheduled.push(card); + continue; + }; + let key = epic_milestone_key(&milestone); + let entry = scheduled + .entry(key) + .or_insert_with(|| (milestone, Vec::new())); + entry.1.push(card); + } + + let mut columns = vec![milestone_column( + "no-milestone", + "No milestone", + None, + unscheduled, + )]; + columns.extend(scheduled.into_iter().map(|(key, (milestone, cards))| { + milestone_column(&key, &milestone, Some(milestone.clone()), cards) + })); + columns.push(milestone_column( + "completed", + "Completed", + None, + completed, + )); + columns +} + +struct EpicMilestone { + value: String, + source_label: String, +} + +fn epic_milestone(epic: &Epic) -> Option { + epic.labels + .iter() + .find_map(|label| milestone_from_label(label)) +} + +fn milestone_from_label(label: &str) -> Option { + let trimmed = label.trim(); + let lower = trimmed.to_ascii_lowercase(); + for prefix in ["milestone", "release"] { + if !lower.starts_with(prefix) { + continue; + } + let raw_rest = &trimmed[prefix.len()..]; + if !raw_rest + .starts_with(|ch: char| ch.is_ascii_whitespace() || matches!(ch, ':' | '/' | '-')) + { + continue; + } + let value = raw_rest + .trim_start() + .trim_start_matches(|ch| matches!(ch, ':' | '/' | '-')) + .trim(); + if value.is_empty() { + return None; + } + return Some(EpicMilestone { + value: value.to_string(), + source_label: trimmed.to_string(), + }); + } + None +} + +fn epic_milestone_key(milestone: &str) -> String { + let mut key = String::new(); + let mut last_dash = false; + for byte in milestone.trim().bytes() { + if byte.is_ascii_alphanumeric() { + key.push(byte.to_ascii_lowercase() as char); + last_dash = false; + } else if !last_dash { + key.push('-'); + last_dash = true; + } + } + let key = key.trim_matches('-'); + if key.is_empty() { + "milestone".to_string() + } else { + format!("milestone-{key}") + } +} + +#[derive(Clone, Copy)] +enum TargetLane { + NoTarget, + Overdue, + DueToday, + Upcoming, + Completed, + InvalidTarget, +} + +fn iso_date_prefix(value: &str) -> Option<&str> { + let date = value.trim().get(..10)?; + let bytes = date.as_bytes(); + let valid = bytes.len() == 10 + && bytes[0..4].iter().all(u8::is_ascii_digit) + && bytes[4] == b'-' + && bytes[5..7].iter().all(u8::is_ascii_digit) + && bytes[7] == b'-' + && bytes[8..10].iter().all(u8::is_ascii_digit); + valid.then_some(date) +} + +fn target_lane(epic: &Epic, today: &str) -> TargetLane { + if matches!(epic.state, EpicState::Done | EpicState::Canceled) { + return TargetLane::Completed; + } + let Some(target_date) = epic.target_date.as_deref() else { + return TargetLane::NoTarget; + }; + let Some(target_date) = iso_date_prefix(target_date) else { + return TargetLane::InvalidTarget; + }; + if target_date < today { + TargetLane::Overdue + } else if target_date == today { + TargetLane::DueToday + } else { + TargetLane::Upcoming + } +} + +fn target_column(key: &str, label: &str, cards: Vec) -> EpicTargetColumn { + EpicTargetColumn { + key: key.to_string(), + label: label.to_string(), + count: cards.len() as u32, + cards, + } +} + +fn target_columns(cards: Vec, today: &str) -> Vec { + let mut no_target = Vec::new(); + let mut overdue = Vec::new(); + let mut due_today = Vec::new(); + let mut upcoming = Vec::new(); + let mut completed = Vec::new(); + let mut invalid_target = Vec::new(); + + for card in cards { + match target_lane(&card.epic, today) { + TargetLane::NoTarget => no_target.push(card), + TargetLane::Overdue => overdue.push(card), + TargetLane::DueToday => due_today.push(card), + TargetLane::Upcoming => upcoming.push(card), + TargetLane::Completed => completed.push(card), + TargetLane::InvalidTarget => invalid_target.push(card), + } + } + + vec![ + target_column("no-target", "No target", no_target), + target_column("overdue", "Overdue", overdue), + target_column("due-today", "Due today", due_today), + target_column("upcoming", "Upcoming", upcoming), + target_column("completed", "Completed", completed), + target_column("invalid-target", "Invalid target", invalid_target), + ] +} + impl EpicsGuest for Component { fn create_epic(input: CreateEpicInput) -> Result { let (workspace_id, workspace) = workspace_uri(input.workspace.trim())?; @@ -476,11 +1043,21 @@ impl EpicsGuest for Component { fn change_state_epic(input: ChangeStateEpicInput) -> Result { let snap = storage::update_begin(COLLECTION, &input.id)?; let mut stored = decode(&input.id, &snap.data)?; - let now = time::now_iso(); + let current = stored.state.clone(); let state = state_to_str(input.state).to_string(); + if current == state { + return Ok(stored.to_wit()); + } + if !can_transition_epic_state(¤t, &state) { + return Err(err( + ErrorCode::BadInput, + format!("invalid epic state transition: {current} -> {state}"), + )); + } + let now = time::now_iso(); stored.state = state.clone(); stored.updated_at = now.clone(); - stored.closed_at = if matches!(input.state, EpicState::Done | EpicState::Canceled) { + stored.closed_at = if matches!(state.as_str(), "DONE" | "CANCELED") { Some(now) } else { None @@ -604,6 +1181,9 @@ impl EpicsGuest for Component { let workspace_id = workspace_id(&workspace) .ok_or_else(|| err(ErrorCode::BadInput, "epics.list requires a workspace"))?; let limit = limit.min(1024) as usize; + if limit == 0 { + return Ok(Vec::new()); + } let mut out = Vec::new(); scan_epics(|stored| { if stored.workspace_id == workspace_id { @@ -658,6 +1238,173 @@ impl EpicsGuest for Component { }) } + fn roadmap_board(input: RoadmapBoardInput) -> Result { + let (_, workspace) = workspace_uri(input.workspace.trim())?; + let limit = input.limit.min(1024); + let epics = if limit == 0 { + Vec::new() + } else { + Self::list_epics(workspace.clone(), limit)? + }; + let mut cards = Vec::with_capacity(epics.len()); + for epic in epics { + let progress = Self::progress_epic(epic_uri(&epic.id))?; + cards.push(EpicRoadmapCard { epic, progress }); + } + let total = cards.len() as u32; + Ok(EpicRoadmapBoard { + workspace, + total, + columns: roadmap_columns(cards), + }) + } + + fn owner_board(input: OwnerBoardInput) -> Result { + let (_, workspace) = workspace_uri(input.workspace.trim())?; + let limit = input.limit.min(1024); + let epics = if limit == 0 { + Vec::new() + } else { + Self::list_epics(workspace.clone(), limit)? + }; + let mut cards = Vec::with_capacity(epics.len()); + for epic in epics { + let progress = Self::progress_epic(epic_uri(&epic.id))?; + cards.push(EpicOwnerCard { epic, progress }); + } + let total = cards.len() as u32; + Ok(EpicOwnerBoard { + workspace, + total, + columns: owner_columns(cards), + }) + } + + fn project_board(input: ProjectBoardInput) -> Result { + let (_, workspace) = workspace_uri(input.workspace.trim())?; + let limit = input.limit.min(1024); + let epics = if limit == 0 { + Vec::new() + } else { + Self::list_epics(workspace.clone(), limit)? + }; + let mut cards = Vec::with_capacity(epics.len()); + for epic in epics { + let progress = Self::progress_epic(epic_uri(&epic.id))?; + cards.push(EpicProjectCard { epic, progress }); + } + let total = cards.len() as u32; + Ok(EpicProjectBoard { + workspace, + total, + columns: project_columns(cards), + }) + } + + fn label_board(input: LabelBoardInput) -> Result { + let (_, workspace) = workspace_uri(input.workspace.trim())?; + let limit = input.limit.min(1024); + let epics = if limit == 0 { + Vec::new() + } else { + Self::list_epics(workspace.clone(), limit)? + }; + let mut cards = Vec::with_capacity(epics.len()); + for epic in epics { + let progress = Self::progress_epic(epic_uri(&epic.id))?; + cards.push(EpicLabelCard { epic, progress }); + } + let total = cards.len() as u32; + Ok(EpicLabelBoard { + workspace, + total, + columns: label_columns(cards), + }) + } + + fn priority_board(input: PriorityBoardInput) -> Result { + let (_, workspace) = workspace_uri(input.workspace.trim())?; + let limit = input.limit.min(1024); + let epics = if limit == 0 { + Vec::new() + } else { + Self::list_epics(workspace.clone(), limit)? + }; + let mut cards = Vec::with_capacity(epics.len()); + for epic in epics { + let progress = Self::progress_epic(epic_uri(&epic.id))?; + let priority = epic_priority(&epic); + cards.push(EpicPriorityCard { + epic, + progress, + priority: priority.as_ref().map(|priority| priority.key.to_string()), + priority_label: priority + .as_ref() + .map(|priority| priority.source_label.clone()), + }); + } + let total = cards.len() as u32; + Ok(EpicPriorityBoard { + workspace, + total, + columns: priority_columns(cards), + }) + } + + fn milestone_board(input: MilestoneBoardInput) -> Result { + let (_, workspace) = workspace_uri(input.workspace.trim())?; + let limit = input.limit.min(1024); + let epics = if limit == 0 { + Vec::new() + } else { + Self::list_epics(workspace.clone(), limit)? + }; + let mut cards = Vec::with_capacity(epics.len()); + for epic in epics { + let progress = Self::progress_epic(epic_uri(&epic.id))?; + let milestone = epic_milestone(&epic); + cards.push(EpicMilestoneCard { + epic, + progress, + milestone: milestone.as_ref().map(|milestone| milestone.value.clone()), + milestone_label: milestone + .as_ref() + .map(|milestone| milestone.source_label.clone()), + }); + } + let total = cards.len() as u32; + Ok(EpicMilestoneBoard { + workspace, + total, + columns: milestone_columns(cards), + }) + } + + fn target_board(input: TargetBoardInput) -> Result { + let (_, workspace) = workspace_uri(input.workspace.trim())?; + let limit = input.limit.min(1024); + let epics = if limit == 0 { + Vec::new() + } else { + Self::list_epics(workspace.clone(), limit)? + }; + let today = iso_date_prefix(&time::now_iso()) + .unwrap_or("0000-00-00") + .to_string(); + let mut cards = Vec::with_capacity(epics.len()); + for epic in epics { + let progress = Self::progress_epic(epic_uri(&epic.id))?; + cards.push(EpicTargetCard { epic, progress }); + } + let total = cards.len() as u32; + Ok(EpicTargetBoard { + workspace, + today: today.clone(), + total, + columns: target_columns(cards, &today), + }) + } + fn issues_in_epic(ref_: String, limit: u32) -> Result, Error> { member_uris(&ref_, "issue", limit) } @@ -678,3 +1425,355 @@ impl ReactorGuest for Component { } bindings::export!(Component with_types_in bindings); + +#[cfg(test)] +mod tests { + use super::*; + + fn epic(id: &str, state: EpicState) -> Epic { + Epic { + id: id.to_string(), + workspace: "comtrya://workspace/ws_test".to_string(), + title: id.to_string(), + body_markdown: String::new(), + state, + number: 1, + target_date: None, + owner_ref: None, + labels: Vec::new(), + created_at: "2026-06-20T00:00:00Z".to_string(), + updated_at: "2026-06-20T00:00:00Z".to_string(), + closed_at: None, + project_name: None, + } + } + + fn progress(percent_complete: u64) -> EpicProgress { + EpicProgress { + issues_open: 0, + issues_closed: 0, + child_epics_open: 0, + child_epics_closed: 0, + percent_complete, + } + } + + fn card(id: &str, state: EpicState, percent_complete: u64) -> EpicRoadmapCard { + EpicRoadmapCard { + epic: epic(id, state), + progress: progress(percent_complete), + } + } + + fn owner_card(id: &str, owner_ref: Option<&str>) -> EpicOwnerCard { + let mut epic = epic(id, EpicState::Planned); + epic.owner_ref = owner_ref.map(str::to_string); + EpicOwnerCard { + epic, + progress: progress(0), + } + } + + fn project_card(id: &str, project_name: Option<&str>) -> EpicProjectCard { + let mut epic = epic(id, EpicState::Planned); + epic.project_name = project_name.map(str::to_string); + EpicProjectCard { + epic, + progress: progress(0), + } + } + + fn label_card(id: &str, labels: &[&str]) -> EpicLabelCard { + let mut epic = epic(id, EpicState::Planned); + epic.labels = labels.iter().map(|label| label.to_string()).collect(); + EpicLabelCard { + epic, + progress: progress(0), + } + } + + fn priority_card(id: &str, state: EpicState, labels: &[&str]) -> EpicPriorityCard { + let mut epic = epic(id, state); + epic.labels = labels.iter().map(|label| label.to_string()).collect(); + let priority = epic_priority(&epic); + EpicPriorityCard { + epic, + progress: progress(0), + priority: priority.as_ref().map(|priority| priority.key.to_string()), + priority_label: priority + .as_ref() + .map(|priority| priority.source_label.clone()), + } + } + + fn milestone_card(id: &str, state: EpicState, labels: &[&str]) -> EpicMilestoneCard { + let mut epic = epic(id, state); + epic.labels = labels.iter().map(|label| label.to_string()).collect(); + let milestone = epic_milestone(&epic); + EpicMilestoneCard { + epic, + progress: progress(0), + milestone: milestone.as_ref().map(|milestone| milestone.value.clone()), + milestone_label: milestone + .as_ref() + .map(|milestone| milestone.source_label.clone()), + } + } + + fn target_card(id: &str, state: EpicState, target_date: Option<&str>) -> EpicTargetCard { + let mut epic = epic(id, state); + epic.target_date = target_date.map(str::to_string); + EpicTargetCard { + epic, + progress: progress(0), + } + } + + #[test] + fn roadmap_columns_group_cards_by_epic_state() { + let columns = roadmap_columns(vec![ + card("planned", EpicState::Planned, 0), + card("risk", EpicState::AtRisk, 25), + card("doing", EpicState::InProgress, 50), + card("done", EpicState::Done, 100), + card("canceled", EpicState::Canceled, 0), + ]); + + let keys: Vec<_> = columns.iter().map(|column| column.key.as_str()).collect(); + assert_eq!( + keys, + ["planned", "in-progress", "at-risk", "done", "canceled"] + ); + assert_eq!(columns.iter().map(|column| column.count).sum::(), 5); + assert_eq!(columns[0].cards[0].epic.id, "planned"); + assert_eq!(columns[1].cards[0].progress.percent_complete, 50); + assert_eq!(columns[2].cards[0].epic.id, "risk"); + assert_eq!(columns[3].cards[0].epic.id, "done"); + assert_eq!(columns[4].cards[0].epic.id, "canceled"); + } + + #[test] + fn owner_columns_group_unowned_and_owned_epics() { + let columns = owner_columns(vec![ + owner_card("unowned", None), + owner_card("rawkode", Some("comtrya://user/rawkode")), + owner_card("team", Some("comtrya://team/platform-maintainers")), + owner_card("rawkode-two", Some("comtrya://user/rawkode")), + ]); + + let keys: Vec<_> = columns.iter().map(|column| column.key.as_str()).collect(); + assert_eq!( + keys, + [ + "unowned", + "owner-team-platform-maintainers", + "owner-user-rawkode" + ] + ); + assert_eq!(columns[0].owner_ref, None); + assert_eq!(columns[0].cards[0].epic.id, "unowned"); + assert_eq!( + columns[1].owner_ref.as_deref(), + Some("comtrya://team/platform-maintainers") + ); + assert_eq!(columns[1].cards[0].epic.id, "team"); + assert_eq!( + columns[2].owner_ref.as_deref(), + Some("comtrya://user/rawkode") + ); + assert_eq!(columns[2].count, 2); + assert_eq!( + columns[2] + .cards + .iter() + .map(|card| card.epic.id.as_str()) + .collect::>(), + ["rawkode", "rawkode-two"] + ); + } + + #[test] + fn project_columns_group_unscoped_and_project_epics() { + let columns = project_columns(vec![ + project_card("unscoped", None), + project_card("kernel", Some("kernel")), + project_card("product", Some("Product Design")), + project_card("kernel-two", Some("kernel")), + ]); + + let keys: Vec<_> = columns.iter().map(|column| column.key.as_str()).collect(); + assert_eq!( + keys, + ["unscoped", "project-kernel", "project-product-design"] + ); + assert_eq!(columns[0].project_name, None); + assert_eq!(columns[0].cards[0].epic.id, "unscoped"); + assert_eq!(columns[1].project_name.as_deref(), Some("kernel")); + assert_eq!(columns[1].count, 2); + assert_eq!( + columns[1] + .cards + .iter() + .map(|card| card.epic.id.as_str()) + .collect::>(), + ["kernel", "kernel-two"] + ); + assert_eq!(columns[2].project_name.as_deref(), Some("Product Design")); + assert_eq!(columns[2].cards[0].epic.id, "product"); + } + + #[test] + fn label_columns_group_unlabeled_and_labeled_epics() { + let columns = label_columns(vec![ + label_card("unlabeled", &[]), + label_card("planning", &["planning"]), + label_card("release", &["release"]), + label_card("multi", &["planning", "release"]), + label_card("blank", &[" "]), + ]); + + let keys: Vec<_> = columns.iter().map(|column| column.key.as_str()).collect(); + assert_eq!(keys, ["unlabeled", "label-planning", "label-release"]); + assert_eq!(columns[0].count, 2); + assert_eq!( + columns[0] + .cards + .iter() + .map(|card| card.epic.id.as_str()) + .collect::>(), + ["unlabeled", "blank"] + ); + assert_eq!( + columns[1] + .cards + .iter() + .map(|card| card.epic.id.as_str()) + .collect::>(), + ["planning", "multi"] + ); + assert_eq!( + columns[2] + .cards + .iter() + .map(|card| card.epic.id.as_str()) + .collect::>(), + ["release", "multi"] + ); + } + + #[test] + fn priority_columns_group_active_epics_by_highest_priority() { + let columns = priority_columns(vec![ + priority_card("blocker", EpicState::AtRisk, &["priority::p1", "urgent"]), + priority_card("high", EpicState::InProgress, &["prio/high"]), + priority_card("medium", EpicState::Planned, &["P2"]), + priority_card("low", EpicState::Planned, &["minor"]), + priority_card("none", EpicState::Planned, &["planning"]), + priority_card("done", EpicState::Done, &["priority::p0"]), + priority_card("canceled", EpicState::Canceled, &[]), + ]); + + let keys: Vec<_> = columns.iter().map(|column| column.key.as_str()).collect(); + assert_eq!( + keys, + ["p0", "p1", "p2", "p3", "unprioritized", "completed"] + ); + assert_eq!(columns[0].cards[0].epic.id, "blocker"); + assert_eq!(columns[0].cards[0].priority.as_deref(), Some("p0")); + assert_eq!( + columns[0].cards[0].priority_label.as_deref(), + Some("urgent") + ); + assert_eq!(columns[1].cards[0].epic.id, "high"); + assert_eq!(columns[2].cards[0].epic.id, "medium"); + assert_eq!(columns[3].cards[0].epic.id, "low"); + assert_eq!(columns[4].cards[0].epic.id, "none"); + assert_eq!( + columns[5] + .cards + .iter() + .map(|card| card.epic.id.as_str()) + .collect::>(), + ["done", "canceled"] + ); + assert_eq!(columns[5].cards[0].priority.as_deref(), Some("p0")); + } + + #[test] + fn milestone_columns_group_active_epics_by_release_label() { + let columns = milestone_columns(vec![ + milestone_card("unscheduled", EpicState::Planned, &["planning"]), + milestone_card("q4", EpicState::InProgress, &["milestone::Q4"]), + milestone_card("launch", EpicState::AtRisk, &["release/Launch GA"]), + milestone_card("q4-two", EpicState::Planned, &["milestone-Q4"]), + milestone_card("done", EpicState::Done, &["milestone::Q4"]), + milestone_card("canceled", EpicState::Canceled, &[]), + ]); + + let keys: Vec<_> = columns.iter().map(|column| column.key.as_str()).collect(); + assert_eq!( + keys, + [ + "no-milestone", + "milestone-launch-ga", + "milestone-q4", + "completed" + ] + ); + assert_eq!(columns[0].cards[0].epic.id, "unscheduled"); + assert_eq!(columns[1].milestone.as_deref(), Some("Launch GA")); + assert_eq!(columns[1].cards[0].milestone_label.as_deref(), Some("release/Launch GA")); + assert_eq!(columns[2].milestone.as_deref(), Some("Q4")); + assert_eq!( + columns[2] + .cards + .iter() + .map(|card| card.epic.id.as_str()) + .collect::>(), + ["q4", "q4-two"] + ); + assert_eq!( + columns[3] + .cards + .iter() + .map(|card| card.epic.id.as_str()) + .collect::>(), + ["done", "canceled"] + ); + assert_eq!(columns[3].cards[0].milestone.as_deref(), Some("Q4")); + } + + #[test] + fn target_columns_group_epics_by_target_health() { + let columns = target_columns( + vec![ + target_card("untargeted", EpicState::Planned, None), + target_card("late", EpicState::InProgress, Some("2026-06-19")), + target_card("today", EpicState::AtRisk, Some("2026-06-20")), + target_card("next", EpicState::Planned, Some("2026-06-21")), + target_card("done", EpicState::Done, Some("2026-06-01")), + target_card("bad", EpicState::Planned, Some("soon")), + ], + "2026-06-20", + ); + + let keys: Vec<_> = columns.iter().map(|column| column.key.as_str()).collect(); + assert_eq!( + keys, + [ + "no-target", + "overdue", + "due-today", + "upcoming", + "completed", + "invalid-target" + ] + ); + assert_eq!(columns[0].cards[0].epic.id, "untargeted"); + assert_eq!(columns[1].cards[0].epic.id, "late"); + assert_eq!(columns[2].cards[0].epic.id, "today"); + assert_eq!(columns[3].cards[0].epic.id, "next"); + assert_eq!(columns[4].cards[0].epic.id, "done"); + assert_eq!(columns[5].cards[0].epic.id, "bad"); + } +} diff --git a/extensions/first-party/ext_epics/dist/ext_epics.wasm b/extensions/first-party/ext_epics/dist/ext_epics.wasm index e53ebb3d..566b960e 100644 Binary files a/extensions/first-party/ext_epics/dist/ext_epics.wasm and b/extensions/first-party/ext_epics/dist/ext_epics.wasm differ diff --git a/extensions/first-party/ext_epics/manifest.json b/extensions/first-party/ext_epics/manifest.json index 06927470..b1e784be 100644 --- a/extensions/first-party/ext_epics/manifest.json +++ b/extensions/first-party/ext_epics/manifest.json @@ -79,6 +79,15 @@ "requiresExtensionPoints": [ { "provider": "ext_issues", "point": "issue-membership", "version": 1 } ], + "dispatchRoutes": [ + { "op": "epics.roadmap-board", "scope": "instance" }, + { "op": "epics.owner-board", "scope": "instance" }, + { "op": "epics.project-board", "scope": "instance" }, + { "op": "epics.label-board", "scope": "instance" }, + { "op": "epics.priority-board", "scope": "instance" }, + { "op": "epics.milestone-board", "scope": "instance" }, + { "op": "epics.target-board", "scope": "instance" } + ], "reactor": { "allowedMutations": [], "allowedEmits": [] diff --git a/extensions/first-party/ext_epics/ui/manifest.json b/extensions/first-party/ext_epics/ui/manifest.json index f73281fe..ed57150b 100644 --- a/extensions/first-party/ext_epics/ui/manifest.json +++ b/extensions/first-party/ext_epics/ui/manifest.json @@ -5,8 +5,8 @@ "version": "0.1.0", "publisher": "comtrya-dev", "assets": { - "entry": "/_extensions/ext_epics/assets/index.js", - "entryIntegrity": "sha256-ac5845143d90c7a3be20b4c3bd2560ba3873d179795306d87e7a24169c090977", + "entry": "/ui-ext/6578745f6570696373/files/index.js", + "entryIntegrity": "sha256-a231f473b05a4e500973ac1151720339913a0eb0290d2cc7824ca6e9d11dd22a", "styles": [] }, "permissions": [ diff --git a/extensions/first-party/ext_epics/ui/src/EpicCard.vue b/extensions/first-party/ext_epics/ui/src/EpicCard.vue index 4779c241..ae37927a 100644 --- a/extensions/first-party/ext_epics/ui/src/EpicCard.vue +++ b/extensions/first-party/ext_epics/ui/src/EpicCard.vue @@ -1,8 +1,9 @@ + + + + diff --git a/extensions/first-party/ext_epics/ui/src/EpicsList.vue b/extensions/first-party/ext_epics/ui/src/EpicsList.vue index 721dd914..fdc0fd8d 100644 --- a/extensions/first-party/ext_epics/ui/src/EpicsList.vue +++ b/extensions/first-party/ext_epics/ui/src/EpicsList.vue @@ -1,17 +1,20 @@ + + + + diff --git a/extensions/first-party/ext_issues/ui/src/IssuesList.vue b/extensions/first-party/ext_issues/ui/src/IssuesList.vue index caa2125b..8728c1b2 100644 --- a/extensions/first-party/ext_issues/ui/src/IssuesList.vue +++ b/extensions/first-party/ext_issues/ui/src/IssuesList.vue @@ -2,9 +2,11 @@ import { computed, nextTick, onMounted, onUnmounted, ref, watch } from "vue"; import { classifyPrincipal as authorLabel, + extensionHref, fetchComtryaProjects, LabelPill, parseQueryFilters, + syncProjectFilterParam, useShortcuts, type ComtryaProject, type LabelCatalog, @@ -18,8 +20,7 @@ import { import { resolveIssuesPolicy, type IssuesPolicy } from "./policy"; import { defaultWorkspaceId, - issueHref, - newIssueHref as newIssueHrefBuilder, + EXT_ISSUES_ROUTE_PREFIX, stateTone, type ComtryaGraphQLClient, type ExtensionRouteParams, @@ -35,6 +36,7 @@ const props = withDefaults(defineProps<{ issues?: Issue[] | null; workspaceId?: string; repositoryId?: string | null; + repositorySegments?: string[]; routeParams?: ExtensionRouteParams; state?: string | null; title?: string; @@ -165,7 +167,7 @@ const availableProjects = ref([]); onMounted(async () => { try { - availableProjects.value = await fetchComtryaProjects(); + availableProjects.value = await fetchComtryaProjects(props.repositorySegments); } catch { availableProjects.value = []; } @@ -240,6 +242,7 @@ const routeContext = computed(() => { workspaceId: props.workspaceId, repositoryId: props.repositoryId, + repositorySegments: props.repositorySegments, routeParams: props.routeParams, projectName: props.projectName, state: props.state, @@ -252,12 +255,18 @@ const effectiveRepositoryId = computed(() => routeContext.value.repositoryId ?? const effectiveProjectName = computed(() => routeContext.value.projectName ?? null); const effectiveRouteState = computed(() => routeContext.value.state ?? null); const newIssueHref = computed(() => { - const base = newIssueHrefBuilder(); + const base = extensionHref(EXT_ISSUES_ROUTE_PREFIX, "/new", { + repositorySegments: routeContext.value.repositorySegments, + }); const params = new URLSearchParams({ workspaceId: effectiveWorkspaceId.value }); if (effectiveRepositoryId.value) params.set("repositoryId", effectiveRepositoryId.value); if (effectiveProjectName.value) params.set("projectName", effectiveProjectName.value); return `${base}?${params.toString()}`; }); +const issueListHref = (issue: Issue): string => + extensionHref(EXT_ISSUES_ROUTE_PREFIX, `/${issue.workspaceId}/${issue.number}`, { + repositorySegments: routeContext.value.repositorySegments, + }); const matchesFilter = (issue: Issue, f: Filter): boolean => { if (f === "ALL") return true; @@ -524,7 +533,8 @@ function readUrlState(): void { function writeUrlState(): void { if (typeof window === "undefined") return; - const params = new URLSearchParams(window.location.search); + const currentSearch = window.location.search; + const params = new URLSearchParams(currentSearch); // OPEN is the default — keep it out of the URL so a clean // "/x/issues/" link stays clean. if (filter.value === "OPEN") params.delete("state"); @@ -534,15 +544,18 @@ function writeUrlState(): void { else params.delete("q"); if (assigneeFilter.value) params.set("assignee", assigneeFilter.value); else params.delete("assignee"); - // Skip writing `?project=` when the list is project-scoped via - // its prop — the project comes from the route already. - if (projectFilter.value && !effectiveProjectName.value) params.set("project", projectFilter.value); - else params.delete("project"); + syncProjectFilterParam(params, { + projectFilter: projectFilter.value, + scopedProjectName: effectiveProjectName.value, + currentSearch, + }); const next = params.toString(); - const target = `${window.location.pathname}${next ? `?${next}` : ""}${window.location.hash}`; - if (target !== `${window.location.pathname}${window.location.search}${window.location.hash}`) { + const nextSearch = next ? `?${next}` : ""; + const target = `${window.location.pathname}${nextSearch}${window.location.hash}`; + if (target !== `${window.location.pathname}${currentSearch}${window.location.hash}`) { window.history.replaceState(window.history.state, "", target); } + locationSearch.value = nextSearch; } let suppressUrlWrite = false; @@ -609,7 +622,7 @@ useShortcuts({ const issue = filtered.value[focused.value]; if (!issue) return; event.preventDefault(); - window.location.href = issueHref(issue); + window.location.href = issueListHref(issue); }, " ": (event) => { const issue = filtered.value[focused.value]; @@ -933,7 +946,7 @@ async function submitQuickAdd(): Promise { :aria-selected="index === focused" @mouseenter="focused = index" > - + #{{ issue.number }} {{ issue.title }} @@ -1013,6 +1026,7 @@ async function submitQuickAdd(): Promise { diff --git a/extensions/first-party/ext_issues/ui/src/api.ts b/extensions/first-party/ext_issues/ui/src/api.ts index 88be4acd..e83885df 100644 --- a/extensions/first-party/ext_issues/ui/src/api.ts +++ b/extensions/first-party/ext_issues/ui/src/api.ts @@ -48,6 +48,62 @@ interface OpenIssueInput { assignees?: string[] | null; } +export type IssueBoardId = + | "workflow" + | "priority" + | "project" + | "assignee" + | "label" + | "milestone" + | "author" + | "triage"; + +interface WitIssueBoardCard { + issue: WitIssue; + priority?: string | null; + priorityLabel?: string | null; + milestone?: string | null; + milestoneLabel?: string | null; + workflow?: string | null; + workflowLabel?: string | null; +} + +interface WitIssueBoardColumn { + key: string; + label: string; + count: number; + cards?: WitIssueBoardCard[] | null; +} + +interface WitIssueBoard { + repository?: string | null; + total?: number | null; + columns?: WitIssueBoardColumn[] | null; +} + +export interface IssueBoardCard { + issue: Issue; + priority?: string | null; + priorityLabel?: string | null; + milestone?: string | null; + milestoneLabel?: string | null; + workflow?: string | null; + workflowLabel?: string | null; +} + +export interface IssueBoardColumn { + key: string; + label: string; + count: number; + cards: IssueBoardCard[]; +} + +export interface IssueBoard { + repository: string; + total: number; + columns: IssueBoardColumn[]; +} + function opValue(result: OpResult, label: string): T { if (result.ok) return result.value as T; throw new Error(`${label}: ${result.error.message}`); @@ -108,6 +164,27 @@ function normalizeIssue(value: WitIssue): Issue { }; } +function normalizeIssueBoard(value: WitIssueBoard): IssueBoard { + return { + repository: value.repository ?? "", + total: value.total ?? 0, + columns: (value.columns ?? []).map((column) => ({ + key: column.key, + label: column.label, + count: column.count, + cards: (column.cards ?? []).map((card) => ({ + issue: normalizeIssue(card.issue), + priority: card.priority ?? null, + priorityLabel: card.priorityLabel ?? null, + milestone: card.milestone ?? null, + milestoneLabel: card.milestoneLabel ?? null, + workflow: card.workflow ?? null, + workflowLabel: card.workflowLabel ?? null, + })), + })), + }; +} + export async function listIssues( _client: ComtryaGraphQLClient, variables: { @@ -125,6 +202,45 @@ export async function listIssues( return state ? issues.filter((issue) => issue.state === state) : issues; } +export async function loadIssueBoard( + board: IssueBoardId, + variables: { + workspaceId: string; + repositoryId?: string | null; + limit?: number; + }, +): Promise { + const input = { + repository: repositoryUri(variables.workspaceId, variables.repositoryId), + limit: variables.limit ?? 128, + }; + const result = await issueBoardOp(board)(input); + return normalizeIssueBoard(opValue(result, `${board}Board`)); +} + +function issueBoardOp( + board: IssueBoardId, +): (input: unknown) => Promise> { + switch (board) { + case "workflow": + return extIssuesXIssues.workflowBoard; + case "priority": + return extIssuesXIssues.priorityBoard; + case "project": + return extIssuesXIssues.projectBoard; + case "assignee": + return extIssuesXIssues.assigneeBoard; + case "label": + return extIssuesXIssues.labelBoard; + case "milestone": + return extIssuesXIssues.milestoneBoard; + case "author": + return extIssuesXIssues.authorBoard; + case "triage": + return extIssuesXIssues.triageBoard; + } +} + export async function issueByRef( _client: ComtryaGraphQLClient, ref: string, diff --git a/extensions/first-party/ext_issues/ui/src/index.ts b/extensions/first-party/ext_issues/ui/src/index.ts index 4b833ebd..82279e4e 100644 --- a/extensions/first-party/ext_issues/ui/src/index.ts +++ b/extensions/first-party/ext_issues/ui/src/index.ts @@ -1,4 +1,5 @@ export { default as CustomElementHost } from "./CustomElementHost.vue"; +export { default as IssueBoard } from "./IssueBoard.vue"; export { default as IssueCard } from "./IssueCard.vue"; export { default as IssueDetail } from "./IssueDetail.vue"; export { default as IssuesList } from "./IssuesList.vue"; diff --git a/extensions/first-party/ext_issues/ui/src/issue-board-filter.test.ts b/extensions/first-party/ext_issues/ui/src/issue-board-filter.test.ts new file mode 100644 index 00000000..1edf77ca --- /dev/null +++ b/extensions/first-party/ext_issues/ui/src/issue-board-filter.test.ts @@ -0,0 +1,124 @@ +import { describe, expect, test } from "bun:test"; +import { + filterIssueBoard, + type FilterableIssueBoard, + type IssueBoardFilterQuery, +} from "./issue-board-filter"; + +function query(text = "", filters: Record = {}): IssueBoardFilterQuery { + return { text, filters }; +} + +const board: FilterableIssueBoard = { + total: 3, + columns: [ + { + key: "ready", + label: "Ready", + count: 2, + cards: [ + { + issue: { + number: 1, + title: "first issue", + bodyMarkdown: "Tracks the first slice of work.", + state: "OPEN", + authorRef: "comtrya://agent/ci", + assignees: ["comtrya://user/rawkode"], + labels: ["kind::ux", "priority::p0", "status::ready"], + projectName: "kernel", + }, + priority: "p0", + priorityLabel: "P0", + milestone: "v1.0", + milestoneLabel: "v1.0", + workflow: "ready", + workflowLabel: "status::ready", + }, + { + issue: { + number: 2, + title: "second issue", + state: "OPEN", + authorRef: "comtrya://user/rawkode", + labels: ["kind::bug", "priority::p1", "workflow/in-progress"], + projectName: "kernel", + }, + priority: "p1", + priorityLabel: "P1", + milestone: "v2.0", + milestoneLabel: "v2.0", + workflow: "in-progress", + workflowLabel: "workflow/in-progress", + }, + ], + }, + { + key: "closed", + label: "Closed", + count: 1, + cards: [ + { + issue: { + number: 3, + title: "closed follow-up", + state: "CLOSED", + authorRef: "comtrya://user/platform", + labels: ["kind::cleanup"], + projectName: "docs", + }, + }, + ], + }, + ], +}; + +describe("filterIssueBoard", () => { + test("filters cards by state alias, project, assignee, label, and text", () => { + const filtered = filterIssueBoard( + board, + query("first slice", { + is: ["open"], + project: ["kernel"], + assignee: ["rawkode"], + label: ["kind::ux"], + }), + ); + + expect(filtered.total).toBe(1); + expect(filtered.columns.map((column) => column.count)).toEqual([1, 0]); + expect(filtered.columns[0]?.cards[0]?.issue.number).toBe(1); + }); + + test("matches issue number, priority, milestone, and workflow filters", () => { + const filtered = filterIssueBoard( + board, + query("", { + issue: ["#2"], + priority: ["p1"], + milestone: ["v2"], + workflow: ["progress"], + }), + ); + + expect(filtered.total).toBe(1); + expect(filtered.columns[0]?.cards[0]?.issue.title).toBe("second issue"); + }); + + test("requires all requested labels", () => { + const filtered = filterIssueBoard( + board, + query("", { label: ["kind::bug", "priority::p1"] }), + ); + + expect(filtered.total).toBe(1); + expect(filtered.columns[0]?.cards[0]?.issue.number).toBe(2); + }); + + test("rejects cards outside requested state", () => { + const filtered = filterIssueBoard(board, query("", { is: ["done"] })); + + expect(filtered.total).toBe(1); + expect(filtered.columns[1]?.cards[0]?.issue.title).toBe("closed follow-up"); + }); +}); diff --git a/extensions/first-party/ext_issues/ui/src/issue-board-filter.ts b/extensions/first-party/ext_issues/ui/src/issue-board-filter.ts new file mode 100644 index 00000000..06ffe472 --- /dev/null +++ b/extensions/first-party/ext_issues/ui/src/issue-board-filter.ts @@ -0,0 +1,178 @@ +export interface IssueBoardFilterQuery { + text: string; + filters: Record; +} + +export interface FilterableIssue { + number: number; + title: string; + bodyMarkdown?: string | null; + state?: string | null; + stateReason?: string | null; + authorRef?: string | null; + assignees?: string[] | null; + labels?: string[] | null; + projectName?: string | null; +} + +export interface FilterableIssueBoardCard { + issue: FilterableIssue; + priority?: string | null; + priorityLabel?: string | null; + milestone?: string | null; + milestoneLabel?: string | null; + workflow?: string | null; + workflowLabel?: string | null; +} + +export interface FilterableIssueBoardColumn { + key: string; + label: string; + count: number; + cards: FilterableIssueBoardCard[]; +} + +export interface FilterableIssueBoard { + total: number; + columns: FilterableIssueBoardColumn[]; +} + +export function filterIssueBoard( + board: TBoard, + query: IssueBoardFilterQuery, +): TBoard { + if (!hasIssueBoardFilterQuery(query)) return board; + const columns = board.columns.map((column) => { + const cards = column.cards.filter((card) => issueBoardCardMatches(card, query)); + return { + ...column, + count: cards.length, + cards, + }; + }); + return { + ...board, + total: columns.reduce((sum, column) => sum + column.cards.length, 0), + columns, + }; +} + +export function hasIssueBoardFilterQuery(query: IssueBoardFilterQuery): boolean { + return ( + query.text.trim().length > 0 || + Object.values(query.filters).some((values) => values.length > 0) + ); +} + +function issueBoardCardMatches( + card: FilterableIssueBoardCard, + query: IssueBoardFilterQuery, +): boolean { + if (!matchesIssueNumber(card.issue.number, query.filters.issue ?? [])) return false; + if (!matchesIssueState(card.issue.state, stateFilters(query))) return false; + if (!matchesAnyQuery([card.issue.projectName], query.filters.project ?? [])) return false; + if (!matchesAnyQuery([card.issue.authorRef], query.filters.author ?? [])) return false; + if (!matchesAnyQuery(card.issue.assignees ?? [], query.filters.assignee ?? [])) { + return false; + } + if (!matchesAllQuery(card.issue.labels ?? [], query.filters.label ?? [])) return false; + if (!matchesAnyQuery([card.priority, card.priorityLabel], query.filters.priority ?? [])) { + return false; + } + if (!matchesAnyQuery([card.milestone, card.milestoneLabel], query.filters.milestone ?? [])) { + return false; + } + if (!matchesAnyQuery([card.workflow, card.workflowLabel], query.filters.workflow ?? [])) { + return false; + } + return matchesText(issueBoardCardSearchFields(card), query.text); +} + +function stateFilters(query: IssueBoardFilterQuery): string[] { + return [...(query.filters.state ?? []), ...(query.filters.status ?? []), ...(query.filters.is ?? [])]; +} + +function matchesIssueNumber(value: number, filters: string[]): boolean { + if (filters.length === 0) return true; + const normalizedValue = String(value); + return filters.some((filter) => normalizeSearchValue(filter).replace(/^#/, "") === normalizedValue); +} + +function matchesIssueState(value: unknown, filters: string[]): boolean { + if (filters.length === 0) return true; + const normalizedValue = normalizeSearchValue(value); + return filters.some((filter) => { + const normalizedFilter = normalizeSearchValue(filter); + const expected = STATE_ALIASES[normalizedFilter] ?? [normalizedFilter]; + return expected.includes(normalizedValue) || normalizedValue.includes(normalizedFilter); + }); +} + +function matchesAnyQuery(values: unknown[], filters: string[]): boolean { + if (filters.length === 0) return true; + const haystack = values.flatMap(searchableValues).map(normalizeSearchValue).filter(Boolean); + return filters.some((filter) => + haystack.some((value) => value.includes(normalizeSearchValue(filter))), + ); +} + +function matchesAllQuery(values: unknown[], filters: string[]): boolean { + if (filters.length === 0) return true; + const haystack = values.flatMap(searchableValues).map(normalizeSearchValue).filter(Boolean); + return filters.every((filter) => + haystack.some((value) => value.includes(normalizeSearchValue(filter))), + ); +} + +function matchesText(values: unknown[], text: string): boolean { + const needle = normalizeSearchValue(text); + if (!needle) return true; + return values.flatMap(searchableValues).map(normalizeSearchValue).join(" ").includes(needle); +} + +function issueBoardCardSearchFields(card: FilterableIssueBoardCard): unknown[] { + return [ + card.issue.number, + `#${card.issue.number}`, + card.issue.title, + card.issue.bodyMarkdown, + card.issue.state, + card.issue.stateReason, + card.issue.authorRef, + card.issue.assignees, + card.issue.labels, + card.issue.projectName, + card.priority, + card.priorityLabel, + card.milestone, + card.milestoneLabel, + card.workflow, + card.workflowLabel, + ]; +} + +function searchableValues(value: unknown): string[] { + if (value === null || value === undefined) return []; + if (Array.isArray(value)) return value.flatMap(searchableValues); + if (typeof value === "object") { + return Object.entries(value as Record).flatMap(([key, item]) => [ + key, + ...searchableValues(item), + ]); + } + return [String(value)]; +} + +function normalizeSearchValue(value: unknown): string { + return String(value ?? "").trim().toLowerCase(); +} + +const STATE_ALIASES: Record = { + active: ["open", "reopened"], + closed: ["closed"], + done: ["closed"], + open: ["open", "reopened"], + opened: ["open", "reopened"], + reopened: ["reopened"], + resolved: ["closed"], +}; diff --git a/extensions/first-party/ext_issues/ui/src/policy.ts b/extensions/first-party/ext_issues/ui/src/policy.ts index a023bbd1..c32de463 100644 --- a/extensions/first-party/ext_issues/ui/src/policy.ts +++ b/extensions/first-party/ext_issues/ui/src/policy.ts @@ -47,6 +47,7 @@ interface IssuesPolicyConfig { } export type SegmentsSource = "location" | "referrer"; +export type RepositorySegmentsSource = SegmentsSource | string[]; export function repositorySegmentsFromLocation( source: SegmentsSource = "location", @@ -82,10 +83,12 @@ function pathFromReferrer(): string { */ export async function resolveIssuesPolicy( projectName: string, - source: SegmentsSource = "location", + source: RepositorySegmentsSource = "location", ): Promise { try { - const segments = repositorySegmentsFromLocation(source); + const segments = Array.isArray(source) + ? source.map((segment) => segment.trim()).filter(Boolean) + : repositorySegmentsFromLocation(source); if (segments.length === 0) return EMPTY_POLICY; const data = await getGraphQLClient().query( `query Q($segments: [String!]!) { diff --git a/extensions/first-party/ext_issues/ui/src/register.ts b/extensions/first-party/ext_issues/ui/src/register.ts index 5d2daaa3..b8232110 100644 --- a/extensions/first-party/ext_issues/ui/src/register.ts +++ b/extensions/first-party/ext_issues/ui/src/register.ts @@ -1,4 +1,5 @@ -import { defineExtensionWidget, fetchComtryaProjects } from "@comtrya/sdk-vue"; +import { defineExtensionWidget, extensionHref, fetchComtryaProjects } from "@comtrya/sdk-vue"; +import IssueBoard from "./IssueBoard.vue"; import IssueCard from "./IssueCard.vue"; import IssueDetail from "./IssueDetail.vue"; import IssueRelationships from "./IssueRelationships.vue"; @@ -9,7 +10,7 @@ import { resolveIssuesPolicy } from "./policy"; import { issueRouteContext } from "./route-context"; import { defaultWorkspaceId, - issueHref, + EXT_ISSUES_ROUTE_PREFIX, issueRef, type ComtryaGraphQLClient, type ExtensionRouteParams, @@ -17,6 +18,7 @@ import { const EXTENSION_ID = "ext_issues"; const ISSUE_CARD_TAG = "comtrya-issue-card"; +const ISSUE_BOARD_TAG = "comtrya-issue-board"; const ISSUES_LIST_TAG = "comtrya-issues-list"; const ISSUES_REPO_LIST_TAG = "comtrya-issues-repo-list"; const ISSUE_DETAIL_TAG = "comtrya-issue-detail"; @@ -68,6 +70,7 @@ defineExtensionWidget({ component: IssueCard, propertyAliases: { ref: "resourceRef" }, }); +defineExtensionWidget({ tagName: ISSUE_BOARD_TAG, component: IssueBoard }); defineExtensionWidget({ tagName: ISSUES_LIST_TAG, component: IssuesList }); defineExtensionWidget({ tagName: ISSUES_REPO_LIST_TAG, component: IssuesList }); defineExtensionWidget({ tagName: ISSUE_DETAIL_TAG, component: IssueDetail }); @@ -108,6 +111,10 @@ const extension: ExtensionDefinition = { element: ISSUES_LIST_TAG, requiredPermission: "issues.read", }); + host.registerRoute("/board", { + element: ISSUE_BOARD_TAG, + requiredPermission: "issues.read", + }); host.registerRoute("/new", { element: ISSUE_NEW_TAG, requiredPermission: "issues.write", @@ -131,6 +138,7 @@ function defineIssueNewElement(): void { routeParams?: ExtensionRouteParams; workspaceId?: string; repositoryId?: string | null; + repositorySegments?: string[]; connectedCallback(): void { this.replaceChildren( @@ -138,6 +146,7 @@ function defineIssueNewElement(): void { routeParams: this.routeParams, workspaceId: this.workspaceId, repositoryId: this.repositoryId, + repositorySegments: this.repositorySegments, })), ); } @@ -149,6 +158,7 @@ function defineIssueNewElement(): void { function issueNewForm(context: { workspaceId: string; repositoryId?: string | null; + repositorySegments?: string[]; projectName?: string | null; }): HTMLElement { ensureIssueNewStyles(); @@ -246,7 +256,10 @@ function issueNewForm(context: { return; } overline.textContent = `${projectName} · issue`; - void resolveIssuesPolicy(projectName, "referrer").then((policy) => { + void resolveIssuesPolicy( + projectName, + context.repositorySegments ?? "referrer", + ).then((policy) => { // Refresh defaultLabels — replace any prior auto-fill with // the new project's, preserving user-typed entries. const existing = parseLabels(labelsInput.value); @@ -293,16 +306,30 @@ function issueNewForm(context: { // Hydrate the picker from the repo's CUE projects. Failure paths // (no repo segments, network) leave the placeholder option only, // so the form still works as a "no project" submission. - void fetchComtryaProjects().then((projects) => { + void fetchComtryaProjects(context.repositorySegments).then((projects) => { + let hasContextProject = false; for (const project of projects) { if (!project.name) continue; const option = document.createElement("option"); option.value = project.name; option.textContent = project.name; - if (project.name === context.projectName) option.selected = true; + if (project.name === context.projectName) { + option.selected = true; + hasContextProject = true; + } projectSelect.append(option); } - if (context.projectName) applyPolicy(context.projectName); + if (context.projectName) { + if (!hasContextProject) { + const option = document.createElement("option"); + option.value = context.projectName; + option.textContent = context.projectName; + option.selected = true; + projectSelect.append(option); + } + projectSelect.value = context.projectName; + applyPolicy(context.projectName); + } }); projectSelect.addEventListener("change", () => { @@ -338,14 +365,18 @@ function issueNewForm(context: { void openIssue({ workspaceId: context.workspaceId, repositoryId: context.repositoryId, - projectName: projectSelect.value || null, + projectName: projectSelect.value || context.projectName || null, title: titleInput.value.trim(), bodyMarkdown: bodyInput.value, labels: parseLabels(labelsInput.value), closeOnMerge: resolvedCloseOnMerge, }) .then((created) => { - window.location.assign(issueHref(created)); + window.location.assign( + extensionHref(EXT_ISSUES_ROUTE_PREFIX, `/${created.workspaceId}/${created.number}`, { + repositorySegments: context.repositorySegments, + }), + ); }) .catch((error: unknown) => { errorBox.textContent = error instanceof Error ? error.message : String(error); diff --git a/extensions/first-party/ext_issues/ui/src/route-context.test.ts b/extensions/first-party/ext_issues/ui/src/route-context.test.ts index 5486681f..e699269f 100644 --- a/extensions/first-party/ext_issues/ui/src/route-context.test.ts +++ b/extensions/first-party/ext_issues/ui/src/route-context.test.ts @@ -97,4 +97,23 @@ describe("issueRouteContext", () => { state: null, }); }); + + test("host repository segments are preserved for embedded repo routes", () => { + expect( + issueRouteContext( + { + workspaceId: "ws_host", + repositoryId: "repo_host", + repositorySegments: [" comtrya ", "dogfood", ""], + }, + "?repositoryId=repo_query", + ), + ).toEqual({ + workspaceId: "ws_host", + repositoryId: "repo_host", + repositorySegments: ["comtrya", "dogfood"], + projectName: null, + state: null, + }); + }); }); diff --git a/extensions/first-party/ext_issues/ui/src/route-context.ts b/extensions/first-party/ext_issues/ui/src/route-context.ts index eb2a5529..b92c0cd1 100644 --- a/extensions/first-party/ext_issues/ui/src/route-context.ts +++ b/extensions/first-party/ext_issues/ui/src/route-context.ts @@ -3,6 +3,7 @@ import { defaultWorkspaceId, type ExtensionRouteParams } from "./types"; export interface IssueRouteContextInput { workspaceId?: string | null; repositoryId?: string | null; + repositorySegments?: string[]; projectName?: string | null; state?: string | null; routeParams?: ExtensionRouteParams; @@ -11,6 +12,7 @@ export interface IssueRouteContextInput { export interface IssueRouteContext { workspaceId: string; repositoryId?: string | null; + repositorySegments?: string[]; projectName?: string | null; state?: string | null; } @@ -31,7 +33,7 @@ export function issueRouteContext( const routeProjectName = present(input.routeParams?.params?.projectName); const queryProjectName = present(params.get("projectName")); - return { + const context: IssueRouteContext = { workspaceId: explicitRepositoryId ? inputWorkspaceId ?? routeWorkspaceId ?? queryWorkspaceId ?? defaultWorkspaceId() : queryWorkspaceId ?? inputWorkspaceId ?? routeWorkspaceId ?? defaultWorkspaceId(), @@ -39,6 +41,9 @@ export function issueRouteContext( projectName: inputProjectName ?? routeProjectName ?? queryProjectName ?? null, state: present(params.get("state")) ?? present(input.state) ?? null, }; + const segments = normalizedSegments(input.repositorySegments); + if (segments) context.repositorySegments = segments; + return context; } function currentSearch(): string { @@ -50,3 +55,8 @@ function present(value: string | null | undefined): string | undefined { const trimmed = value.trim(); return trimmed ? trimmed : undefined; } + +function normalizedSegments(value: string[] | undefined): string[] | undefined { + const segments = value?.map((segment) => segment.trim()).filter(Boolean) ?? []; + return segments.length > 0 ? segments : undefined; +} diff --git a/extensions/first-party/ext_issues/ui/vite.config.ts b/extensions/first-party/ext_issues/ui/vite.config.ts index 86a293e4..560aa258 100644 --- a/extensions/first-party/ext_issues/ui/vite.config.ts +++ b/extensions/first-party/ext_issues/ui/vite.config.ts @@ -6,6 +6,7 @@ const fromHere = (path: string): string => fileURLToPath(new URL(path, import.me export default defineConfig({ root: fromHere("."), + envPrefix: ["VITE_", "PUBLIC_"], define: { "process.env.NODE_ENV": JSON.stringify("production"), }, diff --git a/extensions/first-party/ext_issues/wit/issues.wit b/extensions/first-party/ext_issues/wit/issues.wit index 4788be74..0a2bf67e 100644 --- a/extensions/first-party/ext_issues/wit/issues.wit +++ b/extensions/first-party/ext_issues/wit/issues.wit @@ -5,7 +5,7 @@ // The kernel codegen reads this file at install time and produces the // GraphQL dispatch table + a typed TS client. -package comtrya:ext-issues@0.1.8; +package comtrya:ext-issues@0.1.13; interface issues { use comtrya:platform/types@0.1.0.{id, uri, iso-timestamp, error}; @@ -63,6 +63,198 @@ interface issues { closed: u64, } + record issue-triage-board-input { + repository: uri, + %limit: u32, + } + + record issue-triage-card { + issue: issue, + } + + record issue-triage-column { + key: string, + label: string, + count: u32, + cards: list, + } + + record issue-triage-board { + repository: uri, + total: u32, + columns: list, + } + + record issue-label-board-input { + repository: uri, + %limit: u32, + } + + record issue-label-card { + issue: issue, + } + + record issue-label-column { + key: string, + label: string, + count: u32, + cards: list, + } + + record issue-label-board { + repository: uri, + // Number of issues considered. Individual labeled cards can appear in + // more than one column because an issue can carry multiple labels. + total: u32, + columns: list, + } + + record issue-assignee-board-input { + repository: uri, + %limit: u32, + } + + record issue-assignee-card { + issue: issue, + } + + record issue-assignee-column { + key: string, + label: string, + assignee: option, + count: u32, + cards: list, + } + + record issue-assignee-board { + repository: uri, + // Number of issues considered. Individual assigned cards can appear in + // more than one column because an issue can have multiple assignees. + total: u32, + columns: list, + } + + record issue-author-board-input { + repository: uri, + %limit: u32, + } + + record issue-author-card { + issue: issue, + } + + record issue-author-column { + key: string, + label: string, + author-ref: option, + count: u32, + cards: list, + } + + record issue-author-board { + repository: uri, + total: u32, + columns: list, + } + + record issue-project-board-input { + repository: uri, + %limit: u32, + } + + record issue-project-card { + issue: issue, + } + + record issue-project-column { + key: string, + label: string, + project-name: option, + count: u32, + cards: list, + } + + record issue-project-board { + repository: uri, + total: u32, + columns: list, + } + + record issue-priority-board-input { + repository: uri, + %limit: u32, + } + + record issue-priority-card { + issue: issue, + priority: option, + priority-label: option, + } + + record issue-priority-column { + key: string, + label: string, + priority: option, + count: u32, + cards: list, + } + + record issue-priority-board { + repository: uri, + total: u32, + columns: list, + } + + record issue-milestone-board-input { + repository: uri, + %limit: u32, + } + + record issue-milestone-card { + issue: issue, + milestone: option, + milestone-label: option, + } + + record issue-milestone-column { + key: string, + label: string, + milestone: option, + count: u32, + cards: list, + } + + record issue-milestone-board { + repository: uri, + total: u32, + columns: list, + } + + record issue-workflow-board-input { + repository: uri, + %limit: u32, + } + + record issue-workflow-card { + issue: issue, + workflow: option, + workflow-label: option, + } + + record issue-workflow-column { + key: string, + label: string, + workflow: option, + count: u32, + cards: list, + } + + record issue-workflow-board { + repository: uri, + total: u32, + columns: list, + } + record open-issue-input { repository: uri, title: string, @@ -126,6 +318,32 @@ interface issues { update-issue: func(input: update-issue-input) -> result; get-issue: func(%id: id) -> result, error>; list-issues: func(repository: uri, %limit: u32) -> result, error>; + /// Familiar issue triage lanes for work queues. Closed issues are terminal; + /// open issues that opt out of auto-close are separated from ordinary + /// owner assignment lanes so maintainers can find manual follow-up work. + triage-board: func(input: issue-triage-board-input) -> result; + /// Familiar issue taxonomy lanes. Unlabeled work is explicit, while labeled + /// work appears once per label so maintainers can scan cross-cutting slices. + label-board: func(input: issue-label-board-input) -> result; + /// Familiar ownership lanes. Unassigned work is explicit, while assigned + /// work appears once per assignee so owners can scan their active slice. + assignee-board: func(input: issue-assignee-board-input) -> result; + /// Familiar authored-by lanes. Closed issues are terminal, while active + /// issues are grouped by their creator so contributors can scan their work. + author-board: func(input: issue-author-board-input) -> result; + /// Familiar product/project lanes. Unscoped work is explicit, while scoped + /// issues are grouped by their stamped project name. + project-board: func(input: issue-project-board-input) -> result; + /// Familiar priority lanes derived from issue labels. Closed issues are + /// terminal, while open issues use their highest priority label. + priority-board: func(input: issue-priority-board-input) -> result; + /// Familiar milestone/release lanes derived from issue labels. Closed issues + /// are terminal, while open issues use their first milestone or release label. + milestone-board: func(input: issue-milestone-board-input) -> result; + /// Familiar Kanban workflow lanes derived from issue labels. Closed issues + /// are terminal, while open issues use status/stage/workflow labels when + /// present and otherwise land in Untriaged. + workflow-board: func(input: issue-workflow-board-input) -> result; by-ref-issue: func(%ref: uri) -> result, error>; by-refs-issue: func(refs: list) -> result>, error>; by-number-issue: func(workspace-id: id, number: u64) -> result, error>; diff --git a/extensions/first-party/ext_pull_requests/assets/index.js b/extensions/first-party/ext_pull_requests/assets/index.js index 700685ef..98aab96d 100644 --- a/extensions/first-party/ext_pull_requests/assets/index.js +++ b/extensions/first-party/ext_pull_requests/assets/index.js @@ -8,84 +8,84 @@ function e(e) { var t = {}, n = [], r = () => {}, i = () => !1, a = (e) => e.charCodeAt(0) === 111 && e.charCodeAt(1) === 110 && (e.charCodeAt(2) > 122 || e.charCodeAt(2) < 97), o = (e) => e.startsWith("onUpdate:"), s = Object.assign, c = (e, t) => { let n = e.indexOf(t); n > -1 && e.splice(n, 1); -}, l = Object.prototype.hasOwnProperty, u = (e, t) => l.call(e, t), d = Array.isArray, f = (e) => x(e) === "[object Map]", p = (e) => x(e) === "[object Set]", m = (e) => x(e) === "[object Date]", h = (e) => typeof e == "function", g = (e) => typeof e == "string", _ = (e) => typeof e == "symbol", v = (e) => typeof e == "object" && !!e, y = (e) => (v(e) || h(e)) && h(e.then) && h(e.catch), b = Object.prototype.toString, x = (e) => b.call(e), S = (e) => x(e).slice(8, -1), C = (e) => x(e) === "[object Object]", w = (e) => g(e) && e !== "NaN" && e[0] !== "-" && "" + parseInt(e, 10) === e, ee = /* @__PURE__ */ e(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"), T = (e) => { +}, l = Object.prototype.hasOwnProperty, u = (e, t) => l.call(e, t), d = Array.isArray, f = (e) => x(e) === "[object Map]", p = (e) => x(e) === "[object Set]", m = (e) => x(e) === "[object Date]", h = (e) => typeof e == "function", g = (e) => typeof e == "string", _ = (e) => typeof e == "symbol", v = (e) => typeof e == "object" && !!e, y = (e) => (v(e) || h(e)) && h(e.then) && h(e.catch), b = Object.prototype.toString, x = (e) => b.call(e), S = (e) => x(e).slice(8, -1), C = (e) => x(e) === "[object Object]", w = (e) => g(e) && e !== "NaN" && e[0] !== "-" && "" + parseInt(e, 10) === e, ee = /* @__PURE__ */ e(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"), te = (e) => { let t = /* @__PURE__ */ Object.create(null); return ((n) => t[n] || (t[n] = e(n))); -}, te = /-\w/g, E = T((e) => e.replace(te, (e) => e.slice(1).toUpperCase())), ne = /\B([A-Z])/g, D = T((e) => e.replace(ne, "-$1").toLowerCase()), re = T((e) => e.charAt(0).toUpperCase() + e.slice(1)), ie = T((e) => e ? `on${re(e)}` : ""), O = (e, t) => !Object.is(e, t), ae = (e, ...t) => { +}, ne = /-\w/g, T = te((e) => e.replace(ne, (e) => e.slice(1).toUpperCase())), re = /\B([A-Z])/g, E = te((e) => e.replace(re, "-$1").toLowerCase()), ie = te((e) => e.charAt(0).toUpperCase() + e.slice(1)), ae = te((e) => e ? `on${ie(e)}` : ""), D = (e, t) => !Object.is(e, t), oe = (e, ...t) => { for (let n = 0; n < e.length; n++) e[n](...t); -}, k = (e, t, n, r = !1) => { +}, O = (e, t, n, r = !1) => { Object.defineProperty(e, t, { configurable: !0, enumerable: !1, writable: r, value: n }); -}, oe = (e) => { +}, se = (e) => { let t = parseFloat(e); return isNaN(t) ? e : t; -}, se = (e) => { +}, ce = (e) => { let t = g(e) ? Number(e) : NaN; return isNaN(t) ? e : t; -}, ce, le = () => ce ||= typeof globalThis < "u" ? globalThis : typeof self < "u" ? self : typeof window < "u" ? window : typeof global < "u" ? global : {}; -function ue(e) { +}, le, ue = () => le ||= typeof globalThis < "u" ? globalThis : typeof self < "u" ? self : typeof window < "u" ? window : typeof global < "u" ? global : {}; +function de(e) { if (d(e)) { let t = {}; for (let n = 0; n < e.length; n++) { - let r = e[n], i = g(r) ? me(r) : ue(r); + let r = e[n], i = g(r) ? he(r) : de(r); if (i) for (let e in i) t[e] = i[e]; } return t; } else if (g(e) || v(e)) return e; } -var de = /;(?![^(]*\))/g, fe = /:([^]+)/, pe = /\/\*[^]*?\*\//g; -function me(e) { +var fe = /;(?![^(]*\))/g, pe = /:([^]+)/, me = /\/\*[^]*?\*\//g; +function he(e) { let t = {}; - return e.replace(pe, "").split(de).forEach((e) => { + return e.replace(me, "").split(fe).forEach((e) => { if (e) { - let n = e.split(fe); + let n = e.split(pe); n.length > 1 && (t[n[0].trim()] = n[1].trim()); } }), t; } -function A(e) { +function k(e) { let t = ""; if (g(e)) t = e; else if (d(e)) for (let n = 0; n < e.length; n++) { - let r = A(e[n]); + let r = k(e[n]); r && (t += r + " "); } else if (v(e)) for (let n in e) e[n] && (t += n + " "); return t.trim(); } -var he = "itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly", ge = /* @__PURE__ */ e(he); -he + ""; -function _e(e) { +var ge = "itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly", _e = /* @__PURE__ */ e(ge); +ge + ""; +function ve(e) { return !!e || e === ""; } -function ve(e, t) { +function ye(e, t) { if (e.length !== t.length) return !1; let n = !0; - for (let r = 0; n && r < e.length; r++) n = ye(e[r], t[r]); + for (let r = 0; n && r < e.length; r++) n = be(e[r], t[r]); return n; } -function ye(e, t) { +function be(e, t) { if (e === t) return !0; let n = m(e), r = m(t); if (n || r) return n && r ? e.getTime() === t.getTime() : !1; if (n = _(e), r = _(t), n || r) return e === t; - if (n = d(e), r = d(t), n || r) return n && r ? ve(e, t) : !1; + if (n = d(e), r = d(t), n || r) return n && r ? ye(e, t) : !1; if (n = v(e), r = v(t), n || r) { if (!n || !r || Object.keys(e).length !== Object.keys(t).length) return !1; for (let n in e) { let r = e.hasOwnProperty(n), i = t.hasOwnProperty(n); - if (r && !i || !r && i || !ye(e[n], t[n])) return !1; + if (r && !i || !r && i || !be(e[n], t[n])) return !1; } } return String(e) === String(t); } -var be = (e) => !!(e && e.__v_isRef === !0), j = (e) => g(e) ? e : e == null ? "" : d(e) || v(e) && (e.toString === b || !h(e.toString)) ? be(e) ? j(e.value) : JSON.stringify(e, xe, 2) : String(e), xe = (e, t) => be(t) ? xe(e, t.value) : f(t) ? { [`Map(${t.size})`]: [...t.entries()].reduce((e, [t, n], r) => (e[Se(t, r) + " =>"] = n, e), {}) } : p(t) ? { [`Set(${t.size})`]: [...t.values()].map((e) => Se(e)) } : _(t) ? Se(t) : v(t) && !d(t) && !C(t) ? String(t) : t, Se = (e, t = "") => _(e) ? `Symbol(${e.description ?? t})` : e, M, Ce = class { +var xe = (e) => !!(e && e.__v_isRef === !0), A = (e) => g(e) ? e : e == null ? "" : d(e) || v(e) && (e.toString === b || !h(e.toString)) ? xe(e) ? A(e.value) : JSON.stringify(e, Se, 2) : String(e), Se = (e, t) => xe(t) ? Se(e, t.value) : f(t) ? { [`Map(${t.size})`]: [...t.entries()].reduce((e, [t, n], r) => (e[Ce(t, r) + " =>"] = n, e), {}) } : p(t) ? { [`Set(${t.size})`]: [...t.values()].map((e) => Ce(e)) } : _(t) ? Ce(t) : v(t) && !d(t) && !C(t) ? String(t) : t, Ce = (e, t = "") => _(e) ? `Symbol(${e.description ?? t})` : e, j, we = class { constructor(e = !1) { - this.detached = e, this._active = !0, this._on = 0, this.effects = [], this.cleanups = [], this._isPaused = !1, this._warnOnRun = !0, this.__v_skip = !0, !e && M && (M.active ? (this.parent = M, this.index = (M.scopes ||= []).push(this) - 1) : (this._active = !1, this._warnOnRun = !1)); + this.detached = e, this._active = !0, this._on = 0, this.effects = [], this.cleanups = [], this._isPaused = !1, this._warnOnRun = !0, this.__v_skip = !0, !e && j && (j.active ? (this.parent = j, this.index = (j.scopes ||= []).push(this) - 1) : (this._active = !1, this._warnOnRun = !1)); } get active() { return this._active; @@ -108,22 +108,22 @@ var be = (e) => !!(e && e.__v_isRef === !0), j = (e) => g(e) ? e : e == null ? " } run(e) { if (this._active) { - let t = M; + let t = j; try { - return M = this, e(); + return j = this, e(); } finally { - M = t; + j = t; } } } on() { - ++this._on === 1 && (this.prevScope = M, M = this); + ++this._on === 1 && (this.prevScope = j, j = this); } off() { if (this._on > 0 && --this._on === 0) { - if (M === this) M = this.prevScope; + if (j === this) j = this.prevScope; else { - let e = M; + let e = j; for (; e;) { if (e.prevScope === this) { e.prevScope = this.prevScope; @@ -153,72 +153,72 @@ var be = (e) => !!(e && e.__v_isRef === !0), j = (e) => g(e) ? e : e == null ? " } } }; -function we() { - return M; +function Te() { + return j; } -var N, Te = /* @__PURE__ */ new WeakSet(), Ee = class { +var M, Ee = /* @__PURE__ */ new WeakSet(), De = class { constructor(e) { - this.fn = e, this.deps = void 0, this.depsTail = void 0, this.flags = 5, this.next = void 0, this.cleanup = void 0, this.scheduler = void 0, M && (M.active ? M.effects.push(this) : this.flags &= -2); + this.fn = e, this.deps = void 0, this.depsTail = void 0, this.flags = 5, this.next = void 0, this.cleanup = void 0, this.scheduler = void 0, j && (j.active ? j.effects.push(this) : this.flags &= -2); } pause() { this.flags |= 64; } resume() { - this.flags & 64 && (this.flags &= -65, Te.has(this) && (Te.delete(this), this.trigger())); + this.flags & 64 && (this.flags &= -65, Ee.has(this) && (Ee.delete(this), this.trigger())); } notify() { - this.flags & 2 && !(this.flags & 32) || this.flags & 8 || Ae(this); + this.flags & 2 && !(this.flags & 32) || this.flags & 8 || je(this); } run() { if (!(this.flags & 1)) return this.fn(); - this.flags |= 2, Ue(this), Ne(this); - let e = N, t = ze; - N = this, ze = !0; + this.flags |= 2, We(this), Pe(this); + let e = M, t = Be; + M = this, Be = !0; try { return this.fn(); } finally { - Pe(this), N = e, ze = t, this.flags &= -3; + Fe(this), M = e, Be = t, this.flags &= -3; } } stop() { if (this.flags & 1) { - for (let e = this.deps; e; e = e.nextDep) Le(e); - this.deps = this.depsTail = void 0, Ue(this), this.onStop && this.onStop(), this.flags &= -2; + for (let e = this.deps; e; e = e.nextDep) Re(e); + this.deps = this.depsTail = void 0, We(this), this.onStop && this.onStop(), this.flags &= -2; } } trigger() { - this.flags & 64 ? Te.add(this) : this.scheduler ? this.scheduler() : this.runIfDirty(); + this.flags & 64 ? Ee.add(this) : this.scheduler ? this.scheduler() : this.runIfDirty(); } runIfDirty() { - Fe(this) && this.run(); + Ie(this) && this.run(); } get dirty() { - return Fe(this); + return Ie(this); } -}, De = 0, Oe, ke; -function Ae(e, t = !1) { +}, Oe = 0, ke, Ae; +function je(e, t = !1) { if (e.flags |= 8, t) { - e.next = ke, ke = e; + e.next = Ae, Ae = e; return; } - e.next = Oe, Oe = e; -} -function je() { - De++; + e.next = ke, ke = e; } function Me() { - if (--De > 0) return; - if (ke) { - let e = ke; - for (ke = void 0; e;) { + Oe++; +} +function Ne() { + if (--Oe > 0) return; + if (Ae) { + let e = Ae; + for (Ae = void 0; e;) { let t = e.next; e.next = void 0, e.flags &= -9, e = t; } } let e; - for (; Oe;) { - let t = Oe; - for (Oe = void 0; t;) { + for (; ke;) { + let t = ke; + for (ke = void 0; t;) { let n = t.next; if (t.next = void 0, t.flags &= -9, t.flags & 1) try { t.trigger(); @@ -230,294 +230,294 @@ function Me() { } if (e) throw e; } -function Ne(e) { +function Pe(e) { for (let t = e.deps; t; t = t.nextDep) t.version = -1, t.prevActiveLink = t.dep.activeLink, t.dep.activeLink = t; } -function Pe(e) { +function Fe(e) { let t, n = e.depsTail, r = n; for (; r;) { let e = r.prevDep; - r.version === -1 ? (r === n && (n = e), Le(r), Re(r)) : t = r, r.dep.activeLink = r.prevActiveLink, r.prevActiveLink = void 0, r = e; + r.version === -1 ? (r === n && (n = e), Re(r), ze(r)) : t = r, r.dep.activeLink = r.prevActiveLink, r.prevActiveLink = void 0, r = e; } e.deps = t, e.depsTail = n; } -function Fe(e) { - for (let t = e.deps; t; t = t.nextDep) if (t.dep.version !== t.version || t.dep.computed && (Ie(t.dep.computed) || t.dep.version !== t.version)) return !0; +function Ie(e) { + for (let t = e.deps; t; t = t.nextDep) if (t.dep.version !== t.version || t.dep.computed && (Le(t.dep.computed) || t.dep.version !== t.version)) return !0; return !!e._dirty; } -function Ie(e) { - if (e.flags & 4 && !(e.flags & 16) || (e.flags &= -17, e.globalVersion === We) || (e.globalVersion = We, !e.isSSR && e.flags & 128 && (!e.deps && !e._dirty || !Fe(e)))) return; +function Le(e) { + if (e.flags & 4 && !(e.flags & 16) || (e.flags &= -17, e.globalVersion === Ge) || (e.globalVersion = Ge, !e.isSSR && e.flags & 128 && (!e.deps && !e._dirty || !Ie(e)))) return; e.flags |= 2; - let t = e.dep, n = N, r = ze; - N = e, ze = !0; + let t = e.dep, n = M, r = Be; + M = e, Be = !0; try { - Ne(e); + Pe(e); let n = e.fn(e._value); - (t.version === 0 || O(n, e._value)) && (e.flags |= 128, e._value = n, t.version++); + (t.version === 0 || D(n, e._value)) && (e.flags |= 128, e._value = n, t.version++); } catch (e) { throw t.version++, e; } finally { - N = n, ze = r, Pe(e), e.flags &= -3; + M = n, Be = r, Fe(e), e.flags &= -3; } } -function Le(e, t = !1) { +function Re(e, t = !1) { let { dep: n, prevSub: r, nextSub: i } = e; if (r && (r.nextSub = i, e.prevSub = void 0), i && (i.prevSub = r, e.nextSub = void 0), n.subs === e && (n.subs = r, !r && n.computed)) { n.computed.flags &= -5; - for (let e = n.computed.deps; e; e = e.nextDep) Le(e, !0); + for (let e = n.computed.deps; e; e = e.nextDep) Re(e, !0); } !t && !--n.sc && n.map && n.map.delete(n.key); } -function Re(e) { +function ze(e) { let { prevDep: t, nextDep: n } = e; t && (t.nextDep = n, e.prevDep = void 0), n && (n.prevDep = t, e.nextDep = void 0); } -var ze = !0, Be = []; -function Ve() { - Be.push(ze), ze = !1; -} +var Be = !0, Ve = []; function He() { - let e = Be.pop(); - ze = e === void 0 ? !0 : e; + Ve.push(Be), Be = !1; +} +function Ue() { + let e = Ve.pop(); + Be = e === void 0 ? !0 : e; } -function Ue(e) { +function We(e) { let { cleanup: t } = e; if (e.cleanup = void 0, t) { - let e = N; - N = void 0; + let e = M; + M = void 0; try { t(); } finally { - N = e; + M = e; } } } -var We = 0, Ge = class { +var Ge = 0, Ke = class { constructor(e, t) { this.sub = e, this.dep = t, this.version = t.version, this.nextDep = this.prevDep = this.nextSub = this.prevSub = this.prevActiveLink = void 0; } -}, Ke = class { +}, qe = class { constructor(e) { this.computed = e, this.version = 0, this.activeLink = void 0, this.subs = void 0, this.map = void 0, this.key = void 0, this.sc = 0, this.__v_skip = !0; } track(e) { - if (!N || !ze || N === this.computed) return; + if (!M || !Be || M === this.computed) return; let t = this.activeLink; - if (t === void 0 || t.sub !== N) t = this.activeLink = new Ge(N, this), N.deps ? (t.prevDep = N.depsTail, N.depsTail.nextDep = t, N.depsTail = t) : N.deps = N.depsTail = t, qe(t); + if (t === void 0 || t.sub !== M) t = this.activeLink = new Ke(M, this), M.deps ? (t.prevDep = M.depsTail, M.depsTail.nextDep = t, M.depsTail = t) : M.deps = M.depsTail = t, Je(t); else if (t.version === -1 && (t.version = this.version, t.nextDep)) { let e = t.nextDep; - e.prevDep = t.prevDep, t.prevDep && (t.prevDep.nextDep = e), t.prevDep = N.depsTail, t.nextDep = void 0, N.depsTail.nextDep = t, N.depsTail = t, N.deps === t && (N.deps = e); + e.prevDep = t.prevDep, t.prevDep && (t.prevDep.nextDep = e), t.prevDep = M.depsTail, t.nextDep = void 0, M.depsTail.nextDep = t, M.depsTail = t, M.deps === t && (M.deps = e); } return t; } trigger(e) { - this.version++, We++, this.notify(e); + this.version++, Ge++, this.notify(e); } notify(e) { - je(); + Me(); try { for (let e = this.subs; e; e = e.prevSub) e.sub.notify() && e.sub.dep.notify(); } finally { - Me(); + Ne(); } } }; -function qe(e) { +function Je(e) { if (e.dep.sc++, e.sub.flags & 4) { let t = e.dep.computed; if (t && !e.dep.subs) { t.flags |= 20; - for (let e = t.deps; e; e = e.nextDep) qe(e); + for (let e = t.deps; e; e = e.nextDep) Je(e); } let n = e.dep.subs; n !== e && (e.prevSub = n, n && (n.nextSub = e)), e.dep.subs = e; } } -var Je = /* @__PURE__ */ new WeakMap(), Ye = /* @__PURE__ */ Symbol(""), Xe = /* @__PURE__ */ Symbol(""), Ze = /* @__PURE__ */ Symbol(""); -function P(e, t, n) { - if (ze && N) { - let t = Je.get(e); - t || Je.set(e, t = /* @__PURE__ */ new Map()); +var Ye = /* @__PURE__ */ new WeakMap(), Xe = /* @__PURE__ */ Symbol(""), Ze = /* @__PURE__ */ Symbol(""), Qe = /* @__PURE__ */ Symbol(""); +function N(e, t, n) { + if (Be && M) { + let t = Ye.get(e); + t || Ye.set(e, t = /* @__PURE__ */ new Map()); let r = t.get(n); - r || (t.set(n, r = new Ke()), r.map = t, r.key = n), r.track(); + r || (t.set(n, r = new qe()), r.map = t, r.key = n), r.track(); } } -function Qe(e, t, n, r, i, a) { - let o = Je.get(e); +function $e(e, t, n, r, i, a) { + let o = Ye.get(e); if (!o) { - We++; + Ge++; return; } let s = (e) => { e && e.trigger(); }; - if (je(), t === "clear") o.forEach(s); + if (Me(), t === "clear") o.forEach(s); else { let i = d(e), a = i && w(n); if (i && n === "length") { let e = Number(r); o.forEach((t, n) => { - (n === "length" || n === Ze || !_(n) && n >= e) && s(t); + (n === "length" || n === Qe || !_(n) && n >= e) && s(t); }); - } else switch ((n !== void 0 || o.has(void 0)) && s(o.get(n)), a && s(o.get(Ze)), t) { + } else switch ((n !== void 0 || o.has(void 0)) && s(o.get(n)), a && s(o.get(Qe)), t) { case "add": - i ? a && s(o.get("length")) : (s(o.get(Ye)), f(e) && s(o.get(Xe))); + i ? a && s(o.get("length")) : (s(o.get(Xe)), f(e) && s(o.get(Ze))); break; case "delete": - i || (s(o.get(Ye)), f(e) && s(o.get(Xe))); + i || (s(o.get(Xe)), f(e) && s(o.get(Ze))); break; case "set": - f(e) && s(o.get(Ye)); + f(e) && s(o.get(Xe)); break; } } - Me(); -} -function $e(e) { - let t = /* @__PURE__ */ F(e); - return t === e ? t : (P(t, "iterate", Ze), /* @__PURE__ */ zt(e) ? t : t.map(Ht)); + Ne(); } function et(e) { - return P(e = /* @__PURE__ */ F(e), "iterate", Ze), e; + let t = /* @__PURE__ */ P(e); + return t === e ? t : (N(t, "iterate", Qe), /* @__PURE__ */ Bt(e) ? t : t.map(Ut)); } -function tt(e, t) { - return /* @__PURE__ */ Rt(e) ? Ut(/* @__PURE__ */ Lt(e) ? Ht(t) : t) : Ht(t); +function tt(e) { + return N(e = /* @__PURE__ */ P(e), "iterate", Qe), e; } -var nt = { +function nt(e, t) { + return /* @__PURE__ */ zt(e) ? Wt(/* @__PURE__ */ Rt(e) ? Ut(t) : t) : Ut(t); +} +var rt = { __proto__: null, [Symbol.iterator]() { - return rt(this, Symbol.iterator, (e) => tt(this, e)); + return it(this, Symbol.iterator, (e) => nt(this, e)); }, concat(...e) { - return $e(this).concat(...e.map((e) => d(e) ? $e(e) : e)); + return et(this).concat(...e.map((e) => d(e) ? et(e) : e)); }, entries() { - return rt(this, "entries", (e) => (e[1] = tt(this, e[1]), e)); + return it(this, "entries", (e) => (e[1] = nt(this, e[1]), e)); }, every(e, t) { - return at(this, "every", e, t, void 0, arguments); + return ot(this, "every", e, t, void 0, arguments); }, filter(e, t) { - return at(this, "filter", e, t, (e) => e.map((e) => tt(this, e)), arguments); + return ot(this, "filter", e, t, (e) => e.map((e) => nt(this, e)), arguments); }, find(e, t) { - return at(this, "find", e, t, (e) => tt(this, e), arguments); + return ot(this, "find", e, t, (e) => nt(this, e), arguments); }, findIndex(e, t) { - return at(this, "findIndex", e, t, void 0, arguments); + return ot(this, "findIndex", e, t, void 0, arguments); }, findLast(e, t) { - return at(this, "findLast", e, t, (e) => tt(this, e), arguments); + return ot(this, "findLast", e, t, (e) => nt(this, e), arguments); }, findLastIndex(e, t) { - return at(this, "findLastIndex", e, t, void 0, arguments); + return ot(this, "findLastIndex", e, t, void 0, arguments); }, forEach(e, t) { - return at(this, "forEach", e, t, void 0, arguments); + return ot(this, "forEach", e, t, void 0, arguments); }, includes(...e) { - return st(this, "includes", e); + return ct(this, "includes", e); }, indexOf(...e) { - return st(this, "indexOf", e); + return ct(this, "indexOf", e); }, join(e) { - return $e(this).join(e); + return et(this).join(e); }, lastIndexOf(...e) { - return st(this, "lastIndexOf", e); + return ct(this, "lastIndexOf", e); }, map(e, t) { - return at(this, "map", e, t, void 0, arguments); + return ot(this, "map", e, t, void 0, arguments); }, pop() { - return ct(this, "pop"); + return lt(this, "pop"); }, push(...e) { - return ct(this, "push", e); + return lt(this, "push", e); }, reduce(e, ...t) { - return ot(this, "reduce", e, t); + return st(this, "reduce", e, t); }, reduceRight(e, ...t) { - return ot(this, "reduceRight", e, t); + return st(this, "reduceRight", e, t); }, shift() { - return ct(this, "shift"); + return lt(this, "shift"); }, some(e, t) { - return at(this, "some", e, t, void 0, arguments); + return ot(this, "some", e, t, void 0, arguments); }, splice(...e) { - return ct(this, "splice", e); + return lt(this, "splice", e); }, toReversed() { - return $e(this).toReversed(); + return et(this).toReversed(); }, toSorted(e) { - return $e(this).toSorted(e); + return et(this).toSorted(e); }, toSpliced(...e) { - return $e(this).toSpliced(...e); + return et(this).toSpliced(...e); }, unshift(...e) { - return ct(this, "unshift", e); + return lt(this, "unshift", e); }, values() { - return rt(this, "values", (e) => tt(this, e)); + return it(this, "values", (e) => nt(this, e)); } }; -function rt(e, t, n) { - let r = et(e), i = r[t](); - return r !== e && !/* @__PURE__ */ zt(e) && (i._next = i.next, i.next = () => { +function it(e, t, n) { + let r = tt(e), i = r[t](); + return r !== e && !/* @__PURE__ */ Bt(e) && (i._next = i.next, i.next = () => { let e = i._next(); return e.done || (e.value = n(e.value)), e; }), i; } -var it = Array.prototype; -function at(e, t, n, r, i, a) { - let o = et(e), s = o !== e && !/* @__PURE__ */ zt(e), c = o[t]; - if (c !== it[t]) { +var at = Array.prototype; +function ot(e, t, n, r, i, a) { + let o = tt(e), s = o !== e && !/* @__PURE__ */ Bt(e), c = o[t]; + if (c !== at[t]) { let t = c.apply(e, a); - return s ? Ht(t) : t; + return s ? Ut(t) : t; } let l = n; o !== e && (s ? l = function(t, r) { - return n.call(this, tt(e, t), r, e); + return n.call(this, nt(e, t), r, e); } : n.length > 2 && (l = function(t, r) { return n.call(this, t, r, e); })); let u = c.call(o, l, r); return s && i ? i(u) : u; } -function ot(e, t, n, r) { - let i = et(e), a = i !== e && !/* @__PURE__ */ zt(e), o = n, s = !1; +function st(e, t, n, r) { + let i = tt(e), a = i !== e && !/* @__PURE__ */ Bt(e), o = n, s = !1; i !== e && (a ? (s = r.length === 0, o = function(t, r, i) { - return s && (s = !1, t = tt(e, t)), n.call(this, t, tt(e, r), i, e); + return s && (s = !1, t = nt(e, t)), n.call(this, t, nt(e, r), i, e); }) : n.length > 3 && (o = function(t, r, i) { return n.call(this, t, r, i, e); })); let c = i[t](o, ...r); - return s ? tt(e, c) : c; + return s ? nt(e, c) : c; } -function st(e, t, n) { - let r = /* @__PURE__ */ F(e); - P(r, "iterate", Ze); +function ct(e, t, n) { + let r = /* @__PURE__ */ P(e); + N(r, "iterate", Qe); let i = r[t](...n); - return (i === -1 || i === !1) && /* @__PURE__ */ Bt(n[0]) ? (n[0] = /* @__PURE__ */ F(n[0]), r[t](...n)) : i; + return (i === -1 || i === !1) && /* @__PURE__ */ Vt(n[0]) ? (n[0] = /* @__PURE__ */ P(n[0]), r[t](...n)) : i; } -function ct(e, t, n = []) { - Ve(), je(); - let r = (/* @__PURE__ */ F(e))[t].apply(e, n); - return Me(), He(), r; +function lt(e, t, n = []) { + He(), Me(); + let r = (/* @__PURE__ */ P(e))[t].apply(e, n); + return Ne(), Ue(), r; } -var lt = /* @__PURE__ */ e("__proto__,__v_isRef,__isVue"), ut = new Set(/* @__PURE__ */ Object.getOwnPropertyNames(Symbol).filter((e) => e !== "arguments" && e !== "caller").map((e) => Symbol[e]).filter(_)); -function dt(e) { +var ut = /* @__PURE__ */ e("__proto__,__v_isRef,__isVue"), dt = new Set(/* @__PURE__ */ Object.getOwnPropertyNames(Symbol).filter((e) => e !== "arguments" && e !== "caller").map((e) => Symbol[e]).filter(_)); +function ft(e) { _(e) || (e = String(e)); - let t = /* @__PURE__ */ F(this); - return P(t, "has", e), t.hasOwnProperty(e); + let t = /* @__PURE__ */ P(this); + return N(t, "has", e), t.hasOwnProperty(e); } -var ft = class { +var pt = class { constructor(e = !1, t = !1) { this._isReadonly = e, this._isShallow = t; } @@ -527,46 +527,46 @@ var ft = class { if (t === "__v_isReactive") return !r; if (t === "__v_isReadonly") return r; if (t === "__v_isShallow") return i; - if (t === "__v_raw") return n === (r ? i ? At : kt : i ? Ot : Dt).get(e) || Object.getPrototypeOf(e) === Object.getPrototypeOf(n) ? e : void 0; + if (t === "__v_raw") return n === (r ? i ? jt : At : i ? kt : Ot).get(e) || Object.getPrototypeOf(e) === Object.getPrototypeOf(n) ? e : void 0; let a = d(e); if (!r) { let e; - if (a && (e = nt[t])) return e; - if (t === "hasOwnProperty") return dt; + if (a && (e = rt[t])) return e; + if (t === "hasOwnProperty") return ft; } - let o = Reflect.get(e, t, /* @__PURE__ */ I(e) ? e : n); - if ((_(t) ? ut.has(t) : lt(t)) || (r || P(e, "get", t), i)) return o; - if (/* @__PURE__ */ I(o)) { + let o = Reflect.get(e, t, /* @__PURE__ */ F(e) ? e : n); + if ((_(t) ? dt.has(t) : ut(t)) || (r || N(e, "get", t), i)) return o; + if (/* @__PURE__ */ F(o)) { let e = a && w(t) ? o : o.value; - return r && v(e) ? /* @__PURE__ */ Ft(e) : e; + return r && v(e) ? /* @__PURE__ */ It(e) : e; } - return v(o) ? r ? /* @__PURE__ */ Ft(o) : /* @__PURE__ */ Nt(o) : o; + return v(o) ? r ? /* @__PURE__ */ It(o) : /* @__PURE__ */ Pt(o) : o; } -}, pt = class extends ft { +}, mt = class extends pt { constructor(e = !1) { super(!1, e); } set(e, t, n, r) { let i = e[t], a = d(e) && w(t); if (!this._isShallow) { - let e = /* @__PURE__ */ Rt(i); - if (!/* @__PURE__ */ zt(n) && !/* @__PURE__ */ Rt(n) && (i = /* @__PURE__ */ F(i), n = /* @__PURE__ */ F(n)), !a && /* @__PURE__ */ I(i) && !/* @__PURE__ */ I(n)) return e || (i.value = n), !0; + let e = /* @__PURE__ */ zt(i); + if (!/* @__PURE__ */ Bt(n) && !/* @__PURE__ */ zt(n) && (i = /* @__PURE__ */ P(i), n = /* @__PURE__ */ P(n)), !a && /* @__PURE__ */ F(i) && !/* @__PURE__ */ F(n)) return e || (i.value = n), !0; } - let o = a ? Number(t) < e.length : u(e, t), s = Reflect.set(e, t, n, /* @__PURE__ */ I(e) ? e : r); - return e === /* @__PURE__ */ F(r) && (o ? O(n, i) && Qe(e, "set", t, n, i) : Qe(e, "add", t, n)), s; + let o = a ? Number(t) < e.length : u(e, t), s = Reflect.set(e, t, n, /* @__PURE__ */ F(e) ? e : r); + return e === /* @__PURE__ */ P(r) && (o ? D(n, i) && $e(e, "set", t, n, i) : $e(e, "add", t, n)), s; } deleteProperty(e, t) { let n = u(e, t), r = e[t], i = Reflect.deleteProperty(e, t); - return i && n && Qe(e, "delete", t, void 0, r), i; + return i && n && $e(e, "delete", t, void 0, r), i; } has(e, t) { let n = Reflect.has(e, t); - return (!_(t) || !ut.has(t)) && P(e, "has", t), n; + return (!_(t) || !dt.has(t)) && N(e, "has", t), n; } ownKeys(e) { - return P(e, "iterate", d(e) ? "length" : Ye), Reflect.ownKeys(e); + return N(e, "iterate", d(e) ? "length" : Xe), Reflect.ownKeys(e); } -}, mt = class extends ft { +}, ht = class extends pt { constructor(e = !1) { super(!0, e); } @@ -576,11 +576,11 @@ var ft = class { deleteProperty(e, t) { return !0; } -}, ht = /* @__PURE__ */ new pt(), gt = /* @__PURE__ */ new mt(), _t = /* @__PURE__ */ new pt(!0), vt = (e) => e, yt = (e) => Reflect.getPrototypeOf(e); -function bt(e, t, n) { +}, gt = /* @__PURE__ */ new mt(), _t = /* @__PURE__ */ new ht(), vt = /* @__PURE__ */ new mt(!0), yt = (e) => e, bt = (e) => Reflect.getPrototypeOf(e); +function xt(e, t, n) { return function(...r) { - let i = this.__v_raw, a = /* @__PURE__ */ F(i), o = f(a), c = e === "entries" || e === Symbol.iterator && o, l = e === "keys" && o, u = i[e](...r), d = n ? vt : t ? Ut : Ht; - return !t && P(a, "iterate", l ? Xe : Ye), s(Object.create(u), { next() { + let i = this.__v_raw, a = /* @__PURE__ */ P(i), o = f(a), c = e === "entries" || e === Symbol.iterator && o, l = e === "keys" && o, u = i[e](...r), d = n ? yt : t ? Wt : Ut; + return !t && N(a, "iterate", l ? Ze : Xe), s(Object.create(u), { next() { let { value: e, done: t } = u.next(); return t ? { value: e, @@ -592,60 +592,60 @@ function bt(e, t, n) { } }); }; } -function xt(e) { +function St(e) { return function(...t) { return e === "delete" ? !1 : e === "clear" ? void 0 : this; }; } -function St(e, t) { +function Ct(e, t) { let n = { get(n) { - let r = this.__v_raw, i = /* @__PURE__ */ F(r), a = /* @__PURE__ */ F(n); - e || (O(n, a) && P(i, "get", n), P(i, "get", a)); - let { has: o } = yt(i), s = t ? vt : e ? Ut : Ht; + let r = this.__v_raw, i = /* @__PURE__ */ P(r), a = /* @__PURE__ */ P(n); + e || (D(n, a) && N(i, "get", n), N(i, "get", a)); + let { has: o } = bt(i), s = t ? yt : e ? Wt : Ut; if (o.call(i, n)) return s(r.get(n)); if (o.call(i, a)) return s(r.get(a)); r !== i && r.get(n); }, get size() { let t = this.__v_raw; - return !e && P(/* @__PURE__ */ F(t), "iterate", Ye), t.size; + return !e && N(/* @__PURE__ */ P(t), "iterate", Xe), t.size; }, has(t) { - let n = this.__v_raw, r = /* @__PURE__ */ F(n), i = /* @__PURE__ */ F(t); - return e || (O(t, i) && P(r, "has", t), P(r, "has", i)), t === i ? n.has(t) : n.has(t) || n.has(i); + let n = this.__v_raw, r = /* @__PURE__ */ P(n), i = /* @__PURE__ */ P(t); + return e || (D(t, i) && N(r, "has", t), N(r, "has", i)), t === i ? n.has(t) : n.has(t) || n.has(i); }, forEach(n, r) { - let i = this, a = i.__v_raw, o = /* @__PURE__ */ F(a), s = t ? vt : e ? Ut : Ht; - return !e && P(o, "iterate", Ye), a.forEach((e, t) => n.call(r, s(e), s(t), i)); + let i = this, a = i.__v_raw, o = /* @__PURE__ */ P(a), s = t ? yt : e ? Wt : Ut; + return !e && N(o, "iterate", Xe), a.forEach((e, t) => n.call(r, s(e), s(t), i)); } }; return s(n, e ? { - add: xt("add"), - set: xt("set"), - delete: xt("delete"), - clear: xt("clear") + add: St("add"), + set: St("set"), + delete: St("delete"), + clear: St("clear") } : { add(e) { - let n = /* @__PURE__ */ F(this), r = yt(n), i = /* @__PURE__ */ F(e), a = !t && !/* @__PURE__ */ zt(e) && !/* @__PURE__ */ Rt(e) ? i : e; - return r.has.call(n, a) || O(e, a) && r.has.call(n, e) || O(i, a) && r.has.call(n, i) || (n.add(a), Qe(n, "add", a, a)), this; + let n = /* @__PURE__ */ P(this), r = bt(n), i = /* @__PURE__ */ P(e), a = !t && !/* @__PURE__ */ Bt(e) && !/* @__PURE__ */ zt(e) ? i : e; + return r.has.call(n, a) || D(e, a) && r.has.call(n, e) || D(i, a) && r.has.call(n, i) || (n.add(a), $e(n, "add", a, a)), this; }, set(e, n) { - !t && !/* @__PURE__ */ zt(n) && !/* @__PURE__ */ Rt(n) && (n = /* @__PURE__ */ F(n)); - let r = /* @__PURE__ */ F(this), { has: i, get: a } = yt(r), o = i.call(r, e); - o ||= (e = /* @__PURE__ */ F(e), i.call(r, e)); + !t && !/* @__PURE__ */ Bt(n) && !/* @__PURE__ */ zt(n) && (n = /* @__PURE__ */ P(n)); + let r = /* @__PURE__ */ P(this), { has: i, get: a } = bt(r), o = i.call(r, e); + o ||= (e = /* @__PURE__ */ P(e), i.call(r, e)); let s = a.call(r, e); - return r.set(e, n), o ? O(n, s) && Qe(r, "set", e, n, s) : Qe(r, "add", e, n), this; + return r.set(e, n), o ? D(n, s) && $e(r, "set", e, n, s) : $e(r, "add", e, n), this; }, delete(e) { - let t = /* @__PURE__ */ F(this), { has: n, get: r } = yt(t), i = n.call(t, e); - i ||= (e = /* @__PURE__ */ F(e), n.call(t, e)); + let t = /* @__PURE__ */ P(this), { has: n, get: r } = bt(t), i = n.call(t, e); + i ||= (e = /* @__PURE__ */ P(e), n.call(t, e)); let a = r ? r.call(t, e) : void 0, o = t.delete(e); - return i && Qe(t, "delete", e, void 0, a), o; + return i && $e(t, "delete", e, void 0, a), o; }, clear() { - let e = /* @__PURE__ */ F(this), t = e.size !== 0, n = e.clear(); - return t && Qe(e, "clear", void 0, void 0, void 0), n; + let e = /* @__PURE__ */ P(this), t = e.size !== 0, n = e.clear(); + return t && $e(e, "clear", void 0, void 0, void 0), n; } }), [ "keys", @@ -653,15 +653,15 @@ function St(e, t) { "entries", Symbol.iterator ].forEach((r) => { - n[r] = bt(r, e, t); + n[r] = xt(r, e, t); }), n; } -function Ct(e, t) { - let n = St(e, t); +function wt(e, t) { + let n = Ct(e, t); return (t, r, i) => r === "__v_isReactive" ? !e : r === "__v_isReadonly" ? e : r === "__v_raw" ? t : Reflect.get(u(n, r) && r in t ? n : t, r, i); } -var wt = { get: /* @__PURE__ */ Ct(!1, !1) }, Tt = { get: /* @__PURE__ */ Ct(!1, !0) }, Et = { get: /* @__PURE__ */ Ct(!0, !1) }, Dt = /* @__PURE__ */ new WeakMap(), Ot = /* @__PURE__ */ new WeakMap(), kt = /* @__PURE__ */ new WeakMap(), At = /* @__PURE__ */ new WeakMap(); -function jt(e) { +var Tt = { get: /* @__PURE__ */ wt(!1, !1) }, Et = { get: /* @__PURE__ */ wt(!1, !0) }, Dt = { get: /* @__PURE__ */ wt(!0, !1) }, Ot = /* @__PURE__ */ new WeakMap(), kt = /* @__PURE__ */ new WeakMap(), At = /* @__PURE__ */ new WeakMap(), jt = /* @__PURE__ */ new WeakMap(); +function Mt(e) { switch (e) { case "Object": case "Array": return 1; @@ -672,24 +672,24 @@ function jt(e) { default: return 0; } } -function Mt(e) { - return e.__v_skip || !Object.isExtensible(e) ? 0 : jt(S(e)); -} -/* @__NO_SIDE_EFFECTS__ */ function Nt(e) { - return /* @__PURE__ */ Rt(e) ? e : It(e, !1, ht, wt, Dt); + return e.__v_skip || !Object.isExtensible(e) ? 0 : Mt(S(e)); } /* @__NO_SIDE_EFFECTS__ */ function Pt(e) { - return It(e, !1, _t, Tt, Ot); + return /* @__PURE__ */ zt(e) ? e : Lt(e, !1, gt, Tt, Ot); } /* @__NO_SIDE_EFFECTS__ */ function Ft(e) { - return It(e, !0, gt, Et, kt); + return Lt(e, !1, vt, Et, kt); } -function It(e, t, n, r, i) { +/* @__NO_SIDE_EFFECTS__ */ +function It(e) { + return Lt(e, !0, _t, Dt, At); +} +function Lt(e, t, n, r, i) { if (!v(e) || e.__v_raw && !(t && e.__v_isReactive)) return e; - let a = Mt(e); + let a = Nt(e); if (a === 0) return e; let o = i.get(e); if (o) return o; @@ -697,120 +697,120 @@ function It(e, t, n, r, i) { return i.set(e, s), s; } /* @__NO_SIDE_EFFECTS__ */ -function Lt(e) { - return /* @__PURE__ */ Rt(e) ? /* @__PURE__ */ Lt(e.__v_raw) : !!(e && e.__v_isReactive); +function Rt(e) { + return /* @__PURE__ */ zt(e) ? /* @__PURE__ */ Rt(e.__v_raw) : !!(e && e.__v_isReactive); } /* @__NO_SIDE_EFFECTS__ */ -function Rt(e) { +function zt(e) { return !!(e && e.__v_isReadonly); } /* @__NO_SIDE_EFFECTS__ */ -function zt(e) { +function Bt(e) { return !!(e && e.__v_isShallow); } /* @__NO_SIDE_EFFECTS__ */ -function Bt(e) { +function Vt(e) { return e ? !!e.__v_raw : !1; } /* @__NO_SIDE_EFFECTS__ */ -function F(e) { +function P(e) { let t = e && e.__v_raw; - return t ? /* @__PURE__ */ F(t) : e; + return t ? /* @__PURE__ */ P(t) : e; } -function Vt(e) { - return !u(e, "__v_skip") && Object.isExtensible(e) && k(e, "__v_skip", !0), e; +function Ht(e) { + return !u(e, "__v_skip") && Object.isExtensible(e) && O(e, "__v_skip", !0), e; } -var Ht = (e) => v(e) ? /* @__PURE__ */ Nt(e) : e, Ut = (e) => v(e) ? /* @__PURE__ */ Ft(e) : e; +var Ut = (e) => v(e) ? /* @__PURE__ */ Pt(e) : e, Wt = (e) => v(e) ? /* @__PURE__ */ It(e) : e; /* @__NO_SIDE_EFFECTS__ */ -function I(e) { +function F(e) { return e ? e.__v_isRef === !0 : !1; } /* @__NO_SIDE_EFFECTS__ */ -function L(e) { - return Wt(e, !1); +function I(e) { + return Gt(e, !1); } -function Wt(e, t) { - return /* @__PURE__ */ I(e) ? e : new Gt(e, t); +function Gt(e, t) { + return /* @__PURE__ */ F(e) ? e : new Kt(e, t); } -var Gt = class { +var Kt = class { constructor(e, t) { - this.dep = new Ke(), this.__v_isRef = !0, this.__v_isShallow = !1, this._rawValue = t ? e : /* @__PURE__ */ F(e), this._value = t ? e : Ht(e), this.__v_isShallow = t; + this.dep = new qe(), this.__v_isRef = !0, this.__v_isShallow = !1, this._rawValue = t ? e : /* @__PURE__ */ P(e), this._value = t ? e : Ut(e), this.__v_isShallow = t; } get value() { return this.dep.track(), this._value; } set value(e) { - let t = this._rawValue, n = this.__v_isShallow || /* @__PURE__ */ zt(e) || /* @__PURE__ */ Rt(e); - e = n ? e : /* @__PURE__ */ F(e), O(e, t) && (this._rawValue = e, this._value = n ? e : Ht(e), this.dep.trigger()); + let t = this._rawValue, n = this.__v_isShallow || /* @__PURE__ */ Bt(e) || /* @__PURE__ */ zt(e); + e = n ? e : /* @__PURE__ */ P(e), D(e, t) && (this._rawValue = e, this._value = n ? e : Ut(e), this.dep.trigger()); } }; -function R(e) { - return /* @__PURE__ */ I(e) ? e.value : e; +function L(e) { + return /* @__PURE__ */ F(e) ? e.value : e; } -var Kt = { - get: (e, t, n) => t === "__v_raw" ? e : R(Reflect.get(e, t, n)), +var qt = { + get: (e, t, n) => t === "__v_raw" ? e : L(Reflect.get(e, t, n)), set: (e, t, n, r) => { let i = e[t]; - return /* @__PURE__ */ I(i) && !/* @__PURE__ */ I(n) ? (i.value = n, !0) : Reflect.set(e, t, n, r); + return /* @__PURE__ */ F(i) && !/* @__PURE__ */ F(n) ? (i.value = n, !0) : Reflect.set(e, t, n, r); } }; -function qt(e) { - return /* @__PURE__ */ Lt(e) ? e : new Proxy(e, Kt); +function Jt(e) { + return /* @__PURE__ */ Rt(e) ? e : new Proxy(e, qt); } -var Jt = class { +var Yt = class { constructor(e, t, n) { - this.fn = e, this.setter = t, this._value = void 0, this.dep = new Ke(this), this.__v_isRef = !0, this.deps = void 0, this.depsTail = void 0, this.flags = 16, this.globalVersion = We - 1, this.next = void 0, this.effect = this, this.__v_isReadonly = !t, this.isSSR = n; + this.fn = e, this.setter = t, this._value = void 0, this.dep = new qe(this), this.__v_isRef = !0, this.deps = void 0, this.depsTail = void 0, this.flags = 16, this.globalVersion = Ge - 1, this.next = void 0, this.effect = this, this.__v_isReadonly = !t, this.isSSR = n; } notify() { - if (this.flags |= 16, !(this.flags & 8) && N !== this) return Ae(this, !0), !0; + if (this.flags |= 16, !(this.flags & 8) && M !== this) return je(this, !0), !0; } get value() { let e = this.dep.track(); - return Ie(this), e && (e.version = this.dep.version), this._value; + return Le(this), e && (e.version = this.dep.version), this._value; } set value(e) { this.setter && this.setter(e); } }; /* @__NO_SIDE_EFFECTS__ */ -function Yt(e, t, n = !1) { +function Xt(e, t, n = !1) { let r, i; - return h(e) ? r = e : (r = e.get, i = e.set), new Jt(r, i, n); + return h(e) ? r = e : (r = e.get, i = e.set), new Yt(r, i, n); } -var Xt = {}, Zt = /* @__PURE__ */ new WeakMap(), Qt = void 0; -function $t(e, t = !1, n = Qt) { +var Zt = {}, Qt = /* @__PURE__ */ new WeakMap(), $t = void 0; +function en(e, t = !1, n = $t) { if (n) { - let t = Zt.get(n); - t || Zt.set(n, t = []), t.push(e); + let t = Qt.get(n); + t || Qt.set(n, t = []), t.push(e); } } -function en(e, n, i = t) { - let { immediate: a, deep: o, once: s, scheduler: l, augmentJob: u, call: f } = i, p = (e) => o ? e : /* @__PURE__ */ zt(e) || o === !1 || o === 0 ? tn(e, 1) : tn(e), m, g, _, v, y = !1, b = !1; - if (/* @__PURE__ */ I(e) ? (g = () => e.value, y = /* @__PURE__ */ zt(e)) : /* @__PURE__ */ Lt(e) ? (g = () => p(e), y = !0) : d(e) ? (b = !0, y = e.some((e) => /* @__PURE__ */ Lt(e) || /* @__PURE__ */ zt(e)), g = () => e.map((e) => { - if (/* @__PURE__ */ I(e)) return e.value; - if (/* @__PURE__ */ Lt(e)) return p(e); +function tn(e, n, i = t) { + let { immediate: a, deep: o, once: s, scheduler: l, augmentJob: u, call: f } = i, p = (e) => o ? e : /* @__PURE__ */ Bt(e) || o === !1 || o === 0 ? nn(e, 1) : nn(e), m, g, _, v, y = !1, b = !1; + if (/* @__PURE__ */ F(e) ? (g = () => e.value, y = /* @__PURE__ */ Bt(e)) : /* @__PURE__ */ Rt(e) ? (g = () => p(e), y = !0) : d(e) ? (b = !0, y = e.some((e) => /* @__PURE__ */ Rt(e) || /* @__PURE__ */ Bt(e)), g = () => e.map((e) => { + if (/* @__PURE__ */ F(e)) return e.value; + if (/* @__PURE__ */ Rt(e)) return p(e); if (h(e)) return f ? f(e, 2) : e(); })) : g = h(e) ? n ? f ? () => f(e, 2) : e : () => { if (_) { - Ve(); + He(); try { _(); } finally { - He(); + Ue(); } } - let t = Qt; - Qt = m; + let t = $t; + $t = m; try { return f ? f(e, 3, [v]) : e(v); } finally { - Qt = t; + $t = t; } } : r, n && o) { let e = g, t = o === !0 ? Infinity : o; - g = () => tn(e(), t); + g = () => nn(e(), t); } - let x = we(), S = () => { + let x = Te(), S = () => { m.stop(), x && x.active && c(x.effects, m); }; if (s && n) { @@ -819,71 +819,71 @@ function en(e, n, i = t) { e(...t), S(); }; } - let C = b ? Array(e.length).fill(Xt) : Xt, w = (e) => { + let C = b ? Array(e.length).fill(Zt) : Zt, w = (e) => { if (!(!(m.flags & 1) || !m.dirty && !e)) if (n) { let e = m.run(); - if (o || y || (b ? e.some((e, t) => O(e, C[t])) : O(e, C))) { + if (o || y || (b ? e.some((e, t) => D(e, C[t])) : D(e, C))) { _ && _(); - let t = Qt; - Qt = m; + let t = $t; + $t = m; try { let t = [ e, - C === Xt ? void 0 : b && C[0] === Xt ? [] : C, + C === Zt ? void 0 : b && C[0] === Zt ? [] : C, v ]; C = e, f ? f(n, 3, t) : n(...t); } finally { - Qt = t; + $t = t; } } } else m.run(); }; - return u && u(w), m = new Ee(g), m.scheduler = l ? () => l(w, !1) : w, v = (e) => $t(e, !1, m), _ = m.onStop = () => { - let e = Zt.get(m); + return u && u(w), m = new De(g), m.scheduler = l ? () => l(w, !1) : w, v = (e) => en(e, !1, m), _ = m.onStop = () => { + let e = Qt.get(m); if (e) { if (f) f(e, 4); else for (let t of e) t(); - Zt.delete(m); + Qt.delete(m); } }, n ? a ? w(!0) : C = m.run() : l ? l(w.bind(null, !0), !0) : m.run(), S.pause = m.pause.bind(m), S.resume = m.resume.bind(m), S.stop = S, S; } -function tn(e, t = Infinity, n) { +function nn(e, t = Infinity, n) { if (t <= 0 || !v(e) || e.__v_skip || (n ||= /* @__PURE__ */ new Map(), (n.get(e) || 0) >= t)) return e; - if (n.set(e, t), t--, /* @__PURE__ */ I(e)) tn(e.value, t, n); - else if (d(e)) for (let r = 0; r < e.length; r++) tn(e[r], t, n); + if (n.set(e, t), t--, /* @__PURE__ */ F(e)) nn(e.value, t, n); + else if (d(e)) for (let r = 0; r < e.length; r++) nn(e[r], t, n); else if (p(e) || f(e)) e.forEach((e) => { - tn(e, t, n); + nn(e, t, n); }); else if (C(e)) { - for (let r in e) tn(e[r], t, n); - for (let r of Object.getOwnPropertySymbols(e)) Object.prototype.propertyIsEnumerable.call(e, r) && tn(e[r], t, n); + for (let r in e) nn(e[r], t, n); + for (let r of Object.getOwnPropertySymbols(e)) Object.prototype.propertyIsEnumerable.call(e, r) && nn(e[r], t, n); } return e; } //#endregion //#region node_modules/.bun/@vue+runtime-core@3.5.34/node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js -function nn(e, t, n, r) { +function rn(e, t, n, r) { try { return r ? e(...r) : e(); } catch (e) { - an(e, t, n); + on(e, t, n); } } -function rn(e, t, n, r) { +function an(e, t, n, r) { if (h(e)) { - let i = nn(e, t, n, r); + let i = rn(e, t, n, r); return i && y(i) && i.catch((e) => { - an(e, t, n); + on(e, t, n); }), i; } if (d(e)) { let i = []; - for (let a = 0; a < e.length; a++) i.push(rn(e[a], t, n, r)); + for (let a = 0; a < e.length; a++) i.push(an(e[a], t, n, r)); return i; } } -function an(e, n, r, i = !0) { +function on(e, n, r, i = !0) { let a = n ? n.vnode : null, { errorHandler: o, throwUnhandledErrorInProduction: s } = n && n.appContext.config || t; if (n) { let t = n.parent, i = n.proxy, a = `https://vuejs.org/error-reference/#runtime-${r}`; @@ -895,111 +895,111 @@ function an(e, n, r, i = !0) { t = t.parent; } if (o) { - Ve(), nn(o, null, 10, [ + He(), rn(o, null, 10, [ e, i, a - ]), He(); + ]), Ue(); return; } } - on(e, r, a, i, s); + sn(e, r, a, i, s); } -function on(e, t, n, r = !0, i = !1) { +function sn(e, t, n, r = !0, i = !1) { if (i) throw e; console.error(e); } -var z = [], sn = -1, cn = [], ln = null, un = 0, dn = /* @__PURE__ */ Promise.resolve(), fn = null; -function pn(e) { - let t = fn || dn; +var R = [], cn = -1, ln = [], un = null, dn = 0, fn = /* @__PURE__ */ Promise.resolve(), pn = null; +function mn(e) { + let t = pn || fn; return e ? t.then(this ? e.bind(this) : e) : t; } -function mn(e) { - let t = sn + 1, n = z.length; +function hn(e) { + let t = cn + 1, n = R.length; for (; t < n;) { - let r = t + n >>> 1, i = z[r], a = bn(i); + let r = t + n >>> 1, i = R[r], a = xn(i); a < e || a === e && i.flags & 2 ? t = r + 1 : n = r; } return t; } -function hn(e) { +function gn(e) { if (!(e.flags & 1)) { - let t = bn(e), n = z[z.length - 1]; - !n || !(e.flags & 2) && t >= bn(n) ? z.push(e) : z.splice(mn(t), 0, e), e.flags |= 1, gn(); + let t = xn(e), n = R[R.length - 1]; + !n || !(e.flags & 2) && t >= xn(n) ? R.push(e) : R.splice(hn(t), 0, e), e.flags |= 1, _n(); } } -function gn() { - fn ||= dn.then(xn); +function _n() { + pn ||= fn.then(Sn); } -function _n(e) { - d(e) ? cn.push(...e) : ln && e.id === -1 ? ln.splice(un + 1, 0, e) : e.flags & 1 || (cn.push(e), e.flags |= 1), gn(); +function vn(e) { + d(e) ? ln.push(...e) : un && e.id === -1 ? un.splice(dn + 1, 0, e) : e.flags & 1 || (ln.push(e), e.flags |= 1), _n(); } -function vn(e, t, n = sn + 1) { - for (; n < z.length; n++) { - let t = z[n]; +function yn(e, t, n = cn + 1) { + for (; n < R.length; n++) { + let t = R[n]; if (t && t.flags & 2) { if (e && t.id !== e.uid) continue; - z.splice(n, 1), n--, t.flags & 4 && (t.flags &= -2), t(), t.flags & 4 || (t.flags &= -2); + R.splice(n, 1), n--, t.flags & 4 && (t.flags &= -2), t(), t.flags & 4 || (t.flags &= -2); } } } -function yn(e) { - if (cn.length) { - let e = [...new Set(cn)].sort((e, t) => bn(e) - bn(t)); - if (cn.length = 0, ln) { - ln.push(...e); +function bn(e) { + if (ln.length) { + let e = [...new Set(ln)].sort((e, t) => xn(e) - xn(t)); + if (ln.length = 0, un) { + un.push(...e); return; } - for (ln = e, un = 0; un < ln.length; un++) { - let e = ln[un]; + for (un = e, dn = 0; dn < un.length; dn++) { + let e = un[dn]; e.flags & 4 && (e.flags &= -2), e.flags & 8 || e(), e.flags &= -2; } - ln = null, un = 0; + un = null, dn = 0; } } -var bn = (e) => e.id == null ? e.flags & 2 ? -1 : Infinity : e.id; -function xn(e) { +var xn = (e) => e.id == null ? e.flags & 2 ? -1 : Infinity : e.id; +function Sn(e) { try { - for (sn = 0; sn < z.length; sn++) { - let e = z[sn]; - e && !(e.flags & 8) && (e.flags & 4 && (e.flags &= -2), nn(e, e.i, e.i ? 15 : 14), e.flags & 4 || (e.flags &= -2)); + for (cn = 0; cn < R.length; cn++) { + let e = R[cn]; + e && !(e.flags & 8) && (e.flags & 4 && (e.flags &= -2), rn(e, e.i, e.i ? 15 : 14), e.flags & 4 || (e.flags &= -2)); } } finally { - for (; sn < z.length; sn++) { - let e = z[sn]; + for (; cn < R.length; cn++) { + let e = R[cn]; e && (e.flags &= -2); } - sn = -1, z.length = 0, yn(e), fn = null, (z.length || cn.length) && xn(e); + cn = -1, R.length = 0, bn(e), pn = null, (R.length || ln.length) && Sn(e); } } -var Sn = null, Cn = null; -function wn(e) { - let t = Sn; - return Sn = e, Cn = e && e.type.__scopeId || null, t; +var Cn = null, wn = null; +function Tn(e) { + let t = Cn; + return Cn = e, wn = e && e.type.__scopeId || null, t; } -function Tn(e, t = Sn, n) { +function En(e, t = Cn, n) { if (!t || e._n) return e; let r = (...n) => { r._d && ki(-1); - let i = wn(t), a; + let i = Tn(t), a; try { a = e(...n); } finally { - wn(i), r._d && ki(1); + Tn(i), r._d && ki(1); } return a; }; return r._n = !0, r._c = !0, r._d = !0, r; } -function En(e, n) { - if (Sn === null) return e; - let r = ua(Sn), i = e.dirs ||= []; +function Dn(e, n) { + if (Cn === null) return e; + let r = ua(Cn), i = e.dirs ||= []; for (let e = 0; e < n.length; e++) { let [a, o, s, c = t] = n[e]; a && (h(a) && (a = { mounted: a, updated: a - }), a.deep && tn(o), i.push({ + }), a.deep && nn(o), i.push({ dir: a, instance: r, value: o, @@ -1010,43 +1010,43 @@ function En(e, n) { } return e; } -function Dn(e, t, n, r) { +function On(e, t, n, r) { let i = e.dirs, a = t && t.dirs; for (let o = 0; o < i.length; o++) { let s = i[o]; a && (s.oldValue = a[o].value); let c = s.dir[r]; - c && (Ve(), rn(c, n, 8, [ + c && (He(), an(c, n, 8, [ e.el, s, e, t - ]), He()); + ]), Ue()); } } -function On(e, t) { +function kn(e, t) { if (Y) { let n = Y.provides, r = Y.parent && Y.parent.provides; r === n && (n = Y.provides = Object.create(r)), n[e] = t; } } -function kn(e, t, n = !1) { +function An(e, t, n = !1) { let r = Yi(); - if (r || Nr) { - let i = Nr ? Nr._context.provides : r ? r.parent == null || r.ce ? r.vnode.appContext && r.vnode.appContext.provides : r.parent.provides : void 0; + if (r || Pr) { + let i = Pr ? Pr._context.provides : r ? r.parent == null || r.ce ? r.vnode.appContext && r.vnode.appContext.provides : r.parent.provides : void 0; if (i && e in i) return i[e]; if (arguments.length > 1) return n && h(t) ? t.call(r && r.proxy) : t; } } -var An = /* @__PURE__ */ Symbol.for("v-scx"), jn = () => kn(An); -function B(e, t, n) { - return Mn(e, t, n); +var jn = /* @__PURE__ */ Symbol.for("v-scx"), Mn = () => An(jn); +function Nn(e, t, n) { + return Pn(e, t, n); } -function Mn(e, n, i = t) { +function Pn(e, n, i = t) { let { immediate: a, deep: o, flush: c, once: l } = i, u = s({}, i), d = n && a || !n && c !== "post", f; if (ta) { if (c === "sync") { - let e = jn(); + let e = Mn(); f = e.__watcherHandles ||= []; } else if (!d) { let e = () => {}; @@ -1054,25 +1054,25 @@ function Mn(e, n, i = t) { } } let p = Y; - u.call = (e, t, n) => rn(e, p, t, n); + u.call = (e, t, n) => an(e, p, t, n); let m = !1; c === "post" ? u.scheduler = (e) => { - H(e, p && p.suspense); + V(e, p && p.suspense); } : c !== "sync" && (m = !0, u.scheduler = (e, t) => { - t ? e() : hn(e); + t ? e() : gn(e); }), u.augmentJob = (e) => { n && (e.flags |= 4), m && (e.flags |= 2, p && (e.id = p.uid, e.i = p)); }; - let h = en(e, n, u); + let h = tn(e, n, u); return ta && (f ? f.push(h) : d && h()), h; } -function Nn(e, t, n) { - let r = this.proxy, i = g(e) ? e.includes(".") ? Pn(r, e) : () => r[e] : e.bind(r, r), a; +function Fn(e, t, n) { + let r = this.proxy, i = g(e) ? e.includes(".") ? In(r, e) : () => r[e] : e.bind(r, r), a; h(t) ? a = t : (a = t.handler, n = t); - let o = Qi(this), s = Mn(i, a.bind(r), n); + let o = Qi(this), s = Pn(i, a.bind(r), n); return o(), s; } -function Pn(e, t) { +function In(e, t) { let n = t.split("."); return () => { let t = e; @@ -1080,46 +1080,46 @@ function Pn(e, t) { return t; }; } -var Fn = /* @__PURE__ */ Symbol("_vte"), In = (e) => e.__isTeleport, Ln = /* @__PURE__ */ Symbol("_leaveCb"); -function Rn(e, t) { - e.shapeFlag & 6 && e.component ? (e.transition = t, Rn(e.component.subTree, t)) : e.shapeFlag & 128 ? (e.ssContent.transition = t.clone(e.ssContent), e.ssFallback.transition = t.clone(e.ssFallback)) : e.transition = t; +var Ln = /* @__PURE__ */ Symbol("_vte"), Rn = (e) => e.__isTeleport, zn = /* @__PURE__ */ Symbol("_leaveCb"); +function Bn(e, t) { + e.shapeFlag & 6 && e.component ? (e.transition = t, Bn(e.component.subTree, t)) : e.shapeFlag & 128 ? (e.ssContent.transition = t.clone(e.ssContent), e.ssFallback.transition = t.clone(e.ssFallback)) : e.transition = t; } /* @__NO_SIDE_EFFECTS__ */ -function zn(e, t) { +function Vn(e, t) { return h(e) ? s({ name: e.name }, t, { setup: e }) : e; } -function Bn(e) { +function Hn(e) { e.ids = [ e.ids[0] + e.ids[2]++ + "-", 0, 0 ]; } -function Vn(e, t) { +function Un(e, t) { let n; return !!((n = Object.getOwnPropertyDescriptor(e, t)) && !n.configurable); } -var Hn = /* @__PURE__ */ new WeakMap(); -function Un(e, n, r, a, o = !1) { +var Wn = /* @__PURE__ */ new WeakMap(); +function Gn(e, n, r, a, o = !1) { if (d(e)) { - e.forEach((e, t) => Un(e, n && (d(n) ? n[t] : n), r, a, o)); + e.forEach((e, t) => Gn(e, n && (d(n) ? n[t] : n), r, a, o)); return; } - if (Gn(a) && !o) { - a.shapeFlag & 512 && a.type.__asyncResolved && a.component.subTree.component && Un(e, n, r, a.component.subTree); + if (qn(a) && !o) { + a.shapeFlag & 512 && a.type.__asyncResolved && a.component.subTree.component && Gn(e, n, r, a.component.subTree); return; } - let s = a.shapeFlag & 4 ? ua(a.component) : a.el, l = o ? null : s, { i: f, r: p } = e, m = n && n.r, _ = f.refs === t ? f.refs = {} : f.refs, v = f.setupState, y = /* @__PURE__ */ F(v), b = v === t ? i : (e) => Vn(_, e) ? !1 : u(y, e), x = (e, t) => !(t && Vn(_, t)); + let s = a.shapeFlag & 4 ? ua(a.component) : a.el, l = o ? null : s, { i: f, r: p } = e, m = n && n.r, _ = f.refs === t ? f.refs = {} : f.refs, v = f.setupState, y = /* @__PURE__ */ P(v), b = v === t ? i : (e) => Un(_, e) ? !1 : u(y, e), x = (e, t) => !(t && Un(_, t)); if (m != null && m !== p) { - if (Wn(n), g(m)) _[m] = null, b(m) && (v[m] = null); - else if (/* @__PURE__ */ I(m)) { + if (Kn(n), g(m)) _[m] = null, b(m) && (v[m] = null); + else if (/* @__PURE__ */ F(m)) { let e = n; x(m, e.k) && (m.value = null), e.k && (_[e.k] = null); } } - if (h(p)) nn(p, f, 12, [l, _]); + if (h(p)) rn(p, f, 12, [l, _]); else { - let t = g(p), n = /* @__PURE__ */ I(p); + let t = g(p), n = /* @__PURE__ */ F(p); if (t || n) { let i = () => { if (e.f) { @@ -1135,26 +1135,26 @@ function Un(e, n, r, a, o = !1) { }; if (l) { let t = () => { - i(), Hn.delete(e); + i(), Wn.delete(e); }; - t.id = -1, Hn.set(e, t), H(t, r); - } else Wn(e), i(); + t.id = -1, Wn.set(e, t), V(t, r); + } else Kn(e), i(); } } } -function Wn(e) { - let t = Hn.get(e); - t && (t.flags |= 8, Hn.delete(e)); +function Kn(e) { + let t = Wn.get(e); + t && (t.flags |= 8, Wn.delete(e)); } -le().requestIdleCallback, le().cancelIdleCallback; -var Gn = (e) => !!e.type.__asyncLoader, Kn = (e) => e.type.__isKeepAlive; -function qn(e, t) { - Yn(e, "a", t); +ue().requestIdleCallback, ue().cancelIdleCallback; +var qn = (e) => !!e.type.__asyncLoader, Jn = (e) => e.type.__isKeepAlive; +function Yn(e, t) { + Zn(e, "a", t); } -function Jn(e, t) { - Yn(e, "da", t); +function Xn(e, t) { + Zn(e, "da", t); } -function Yn(e, t, n = Y) { +function Zn(e, t, n = Y) { let r = e.__wdc ||= () => { let t = n; for (; t;) { @@ -1163,40 +1163,40 @@ function Yn(e, t, n = Y) { } return e(); }; - if (Zn(t, r, n), n) { + if ($n(t, r, n), n) { let e = n.parent; - for (; e && e.parent;) Kn(e.parent.vnode) && Xn(r, t, n, e), e = e.parent; + for (; e && e.parent;) Jn(e.parent.vnode) && Qn(r, t, n, e), e = e.parent; } } -function Xn(e, t, n, r) { - let i = Zn(t, e, r, !0); - ir(() => { +function Qn(e, t, n, r) { + let i = $n(t, e, r, !0); + or(() => { c(r[t], i); }, n); } -function Zn(e, t, n = Y, r = !1) { +function $n(e, t, n = Y, r = !1) { if (n) { let i = n[e] || (n[e] = []), a = t.__weh ||= (...r) => { - Ve(); - let i = Qi(n), a = rn(t, n, e, r); - return i(), He(), a; + He(); + let i = Qi(n), a = an(t, n, e, r); + return i(), Ue(), a; }; return r ? i.unshift(a) : i.push(a), a; } } -var Qn = (e) => (t, n = Y) => { - (!ta || e === "sp") && Zn(e, (...e) => t(...e), n); -}, $n = Qn("bm"), er = Qn("m"), tr = Qn("bu"), nr = Qn("u"), rr = Qn("bum"), ir = Qn("um"), ar = Qn("sp"), or = Qn("rtg"), sr = Qn("rtc"); -function cr(e, t = Y) { - Zn("ec", e, t); +var er = (e) => (t, n = Y) => { + (!ta || e === "sp") && $n(e, (...e) => t(...e), n); +}, tr = er("bm"), nr = er("m"), rr = er("bu"), ir = er("u"), ar = er("bum"), or = er("um"), sr = er("sp"), cr = er("rtg"), lr = er("rtc"); +function ur(e, t = Y) { + $n("ec", e, t); } -var lr = /* @__PURE__ */ Symbol.for("v-ndc"); -function ur(e, t, n, r) { +var dr = /* @__PURE__ */ Symbol.for("v-ndc"); +function z(e, t, n, r) { let i, a = n && n[r], o = d(e); if (o || g(e)) { - let n = o && /* @__PURE__ */ Lt(e), r = !1, s = !1; - n && (r = !/* @__PURE__ */ zt(e), s = /* @__PURE__ */ Rt(e), e = et(e)), i = Array(e.length); - for (let n = 0, o = e.length; n < o; n++) i[n] = t(r ? s ? Ut(Ht(e[n])) : Ht(e[n]) : e[n], n, void 0, a && a[n]); + let n = o && /* @__PURE__ */ Rt(e), r = !1, s = !1; + n && (r = !/* @__PURE__ */ Bt(e), s = /* @__PURE__ */ zt(e), e = tt(e)), i = Array(e.length); + for (let n = 0, o = e.length; n < o; n++) i[n] = t(r ? s ? Wt(Ut(e[n])) : Ut(e[n]) : e[n], n, void 0, a && a[n]); } else if (typeof e == "number") { i = Array(e); for (let n = 0; n < e; n++) i[n] = t(n + 1, n, void 0, a && a[n]); @@ -1212,7 +1212,7 @@ function ur(e, t, n, r) { else i = []; return n && (n[r] = i), i; } -var dr = (e) => e ? ea(e) ? ua(e) : dr(e.parent) : null, fr = /* @__PURE__ */ s(/* @__PURE__ */ Object.create(null), { +var fr = (e) => e ? ea(e) ? ua(e) : fr(e.parent) : null, pr = /* @__PURE__ */ s(/* @__PURE__ */ Object.create(null), { $: (e) => e, $el: (e) => e.vnode.el, $data: (e) => e.data, @@ -1220,17 +1220,17 @@ var dr = (e) => e ? ea(e) ? ua(e) : dr(e.parent) : null, fr = /* @__PURE__ */ s( $attrs: (e) => e.attrs, $slots: (e) => e.slots, $refs: (e) => e.refs, - $parent: (e) => dr(e.parent), - $root: (e) => dr(e.root), + $parent: (e) => fr(e.parent), + $root: (e) => fr(e.root), $host: (e) => e.ce, $emit: (e) => e.emit, - $options: (e) => xr(e), + $options: (e) => Sr(e), $forceUpdate: (e) => e.f ||= () => { - hn(e.update); + gn(e.update); }, - $nextTick: (e) => e.n ||= pn.bind(e.proxy), - $watch: (e) => Nn.bind(e) -}), pr = (e, n) => e !== t && !e.__isScriptSetup && u(e, n), mr = { + $nextTick: (e) => e.n ||= mn.bind(e.proxy), + $watch: (e) => Fn.bind(e) +}), mr = (e, n) => e !== t && !e.__isScriptSetup && u(e, n), hr = { get({ _: e }, n) { if (n === "__v_skip") return !0; let { ctx: r, setupState: i, data: a, props: o, accessCache: s, type: c, appContext: l } = e; @@ -1242,47 +1242,47 @@ var dr = (e) => e ? ea(e) ? ua(e) : dr(e.parent) : null, fr = /* @__PURE__ */ s( case 4: return r[n]; case 3: return o[n]; } - else if (pr(i, n)) return s[n] = 1, i[n]; + else if (mr(i, n)) return s[n] = 1, i[n]; else if (a !== t && u(a, n)) return s[n] = 2, a[n]; else if (u(o, n)) return s[n] = 3, o[n]; else if (r !== t && u(r, n)) return s[n] = 4, r[n]; - else gr && (s[n] = 0); + else _r && (s[n] = 0); } - let d = fr[n], f, p; - if (d) return n === "$attrs" && P(e.attrs, "get", ""), d(e); + let d = pr[n], f, p; + if (d) return n === "$attrs" && N(e.attrs, "get", ""), d(e); if ((f = c.__cssModules) && (f = f[n])) return f; if (r !== t && u(r, n)) return s[n] = 4, r[n]; if (p = l.config.globalProperties, u(p, n)) return p[n]; }, set({ _: e }, n, r) { let { data: i, setupState: a, ctx: o } = e; - return pr(a, n) ? (a[n] = r, !0) : i !== t && u(i, n) ? (i[n] = r, !0) : u(e.props, n) || n[0] === "$" && n.slice(1) in e ? !1 : (o[n] = r, !0); + return mr(a, n) ? (a[n] = r, !0) : i !== t && u(i, n) ? (i[n] = r, !0) : u(e.props, n) || n[0] === "$" && n.slice(1) in e ? !1 : (o[n] = r, !0); }, has({ _: { data: e, setupState: n, accessCache: r, ctx: i, appContext: a, props: o, type: s } }, c) { let l; - return !!(r[c] || e !== t && c[0] !== "$" && u(e, c) || pr(n, c) || u(o, c) || u(i, c) || u(fr, c) || u(a.config.globalProperties, c) || (l = s.__cssModules) && l[c]); + return !!(r[c] || e !== t && c[0] !== "$" && u(e, c) || mr(n, c) || u(o, c) || u(i, c) || u(pr, c) || u(a.config.globalProperties, c) || (l = s.__cssModules) && l[c]); }, defineProperty(e, t, n) { return n.get == null ? u(n, "value") && this.set(e, t, n.value, null) : e._.accessCache[t] = 0, Reflect.defineProperty(e, t, n); } }; -function hr(e) { +function gr(e) { return d(e) ? e.reduce((e, t) => (e[t] = null, e), {}) : e; } -var gr = !0; -function _r(e) { - let t = xr(e), n = e.proxy, i = e.ctx; - gr = !1, t.beforeCreate && yr(t.beforeCreate, e, "bc"); - let { data: a, computed: o, methods: s, watch: c, provide: l, inject: u, created: f, beforeMount: p, mounted: m, beforeUpdate: g, updated: _, activated: y, deactivated: b, beforeDestroy: x, beforeUnmount: S, destroyed: C, unmounted: w, render: ee, renderTracked: T, renderTriggered: te, errorCaptured: E, serverPrefetch: ne, expose: D, inheritAttrs: re, components: ie, directives: O, filters: ae } = t; - if (u && vr(u, i, null), s) for (let e in s) { +var _r = !0; +function vr(e) { + let t = Sr(e), n = e.proxy, i = e.ctx; + _r = !1, t.beforeCreate && br(t.beforeCreate, e, "bc"); + let { data: a, computed: o, methods: s, watch: c, provide: l, inject: u, created: f, beforeMount: p, mounted: m, beforeUpdate: g, updated: _, activated: y, deactivated: b, beforeDestroy: x, beforeUnmount: S, destroyed: C, unmounted: w, render: ee, renderTracked: te, renderTriggered: ne, errorCaptured: T, serverPrefetch: re, expose: E, inheritAttrs: ie, components: ae, directives: D, filters: oe } = t; + if (u && yr(u, i, null), s) for (let e in s) { let t = s[e]; h(t) && (i[e] = t.bind(n)); } if (a) { let t = a.call(n, n); - v(t) && (e.data = /* @__PURE__ */ Nt(t)); + v(t) && (e.data = /* @__PURE__ */ Pt(t)); } - if (gr = !0, o) for (let e in o) { + if (_r = !0, o) for (let e in o) { let t = o[e], a = X({ get: h(t) ? t.bind(n, n) : h(t.get) ? t.get.bind(n, n) : r, set: !h(t) && h(t.set) ? t.set.bind(n) : r @@ -1294,20 +1294,20 @@ function _r(e) { set: (e) => a.value = e }); } - if (c) for (let e in c) br(c[e], i, n, e); + if (c) for (let e in c) xr(c[e], i, n, e); if (l) { let e = h(l) ? l.call(n) : l; Reflect.ownKeys(e).forEach((t) => { - On(t, e[t]); + kn(t, e[t]); }); } - f && yr(f, e, "c"); - function k(e, t) { + f && br(f, e, "c"); + function O(e, t) { d(t) ? t.forEach((t) => e(t.bind(n))) : t && e(t.bind(n)); } - if (k($n, p), k(er, m), k(tr, g), k(nr, _), k(qn, y), k(Jn, b), k(cr, E), k(sr, T), k(or, te), k(rr, S), k(ir, w), k(ar, ne), d(D)) if (D.length) { + if (O(tr, p), O(nr, m), O(rr, g), O(ir, _), O(Yn, y), O(Xn, b), O(ur, T), O(lr, te), O(cr, ne), O(ar, S), O(or, w), O(sr, re), d(E)) if (E.length) { let t = e.exposed ||= {}; - D.forEach((e) => { + E.forEach((e) => { Object.defineProperty(t, e, { get: () => n[e], set: (t) => n[e] = t, @@ -1315,13 +1315,13 @@ function _r(e) { }); }); } else e.exposed ||= {}; - ee && e.render === r && (e.render = ee), re != null && (e.inheritAttrs = re), ie && (e.components = ie), O && (e.directives = O), ne && Bn(e); + ee && e.render === r && (e.render = ee), ie != null && (e.inheritAttrs = ie), ae && (e.components = ae), D && (e.directives = D), re && Hn(e); } -function vr(e, t, n = r) { - d(e) && (e = Er(e)); +function yr(e, t, n = r) { + d(e) && (e = Dr(e)); for (let n in e) { let r = e[n], i; - i = v(r) ? "default" in r ? kn(r.from || n, r.default, !0) : kn(r.from || n) : kn(r), /* @__PURE__ */ I(i) ? Object.defineProperty(t, n, { + i = v(r) ? "default" in r ? An(r.from || n, r.default, !0) : An(r.from || n) : An(r), /* @__PURE__ */ F(i) ? Object.defineProperty(t, n, { enumerable: !0, configurable: !0, get: () => i.value, @@ -1329,69 +1329,69 @@ function vr(e, t, n = r) { }) : t[n] = i; } } -function yr(e, t, n) { - rn(d(e) ? e.map((e) => e.bind(t.proxy)) : e.bind(t.proxy), t, n); +function br(e, t, n) { + an(d(e) ? e.map((e) => e.bind(t.proxy)) : e.bind(t.proxy), t, n); } -function br(e, t, n, r) { - let i = r.includes(".") ? Pn(n, r) : () => n[r]; +function xr(e, t, n, r) { + let i = r.includes(".") ? In(n, r) : () => n[r]; if (g(e)) { let n = t[e]; - h(n) && B(i, n); - } else if (h(e)) B(i, e.bind(n)); - else if (v(e)) if (d(e)) e.forEach((e) => br(e, t, n, r)); + h(n) && Nn(i, n); + } else if (h(e)) Nn(i, e.bind(n)); + else if (v(e)) if (d(e)) e.forEach((e) => xr(e, t, n, r)); else { let r = h(e.handler) ? e.handler.bind(n) : t[e.handler]; - h(r) && B(i, r, e); + h(r) && Nn(i, r, e); } } -function xr(e) { +function Sr(e) { let t = e.type, { mixins: n, extends: r } = t, { mixins: i, optionsCache: a, config: { optionMergeStrategies: o } } = e.appContext, s = a.get(t), c; - return s ? c = s : !i.length && !n && !r ? c = t : (c = {}, i.length && i.forEach((e) => Sr(c, e, o, !0)), Sr(c, t, o)), v(t) && a.set(t, c), c; + return s ? c = s : !i.length && !n && !r ? c = t : (c = {}, i.length && i.forEach((e) => Cr(c, e, o, !0)), Cr(c, t, o)), v(t) && a.set(t, c), c; } -function Sr(e, t, n, r = !1) { +function Cr(e, t, n, r = !1) { let { mixins: i, extends: a } = t; - a && Sr(e, a, n, !0), i && i.forEach((t) => Sr(e, t, n, !0)); + a && Cr(e, a, n, !0), i && i.forEach((t) => Cr(e, t, n, !0)); for (let i in t) if (!(r && i === "expose")) { - let r = Cr[i] || n && n[i]; + let r = wr[i] || n && n[i]; e[i] = r ? r(e[i], t[i]) : t[i]; } return e; } -var Cr = { - data: wr, - props: Or, - emits: Or, - methods: Dr, - computed: Dr, - beforeCreate: V, - created: V, - beforeMount: V, - mounted: V, - beforeUpdate: V, - updated: V, - beforeDestroy: V, - beforeUnmount: V, - destroyed: V, - unmounted: V, - activated: V, - deactivated: V, - errorCaptured: V, - serverPrefetch: V, - components: Dr, - directives: Dr, - watch: kr, - provide: wr, - inject: Tr +var wr = { + data: Tr, + props: kr, + emits: kr, + methods: Or, + computed: Or, + beforeCreate: B, + created: B, + beforeMount: B, + mounted: B, + beforeUpdate: B, + updated: B, + beforeDestroy: B, + beforeUnmount: B, + destroyed: B, + unmounted: B, + activated: B, + deactivated: B, + errorCaptured: B, + serverPrefetch: B, + components: Or, + directives: Or, + watch: Ar, + provide: Tr, + inject: Er }; -function wr(e, t) { +function Tr(e, t) { return t ? e ? function() { return s(h(e) ? e.call(this, this) : e, h(t) ? t.call(this, this) : t); } : t : e; } -function Tr(e, t) { - return Dr(Er(e), Er(t)); +function Er(e, t) { + return Or(Dr(e), Dr(t)); } -function Er(e) { +function Dr(e) { if (d(e)) { let t = {}; for (let n = 0; n < e.length; n++) t[e[n]] = e[n]; @@ -1399,23 +1399,23 @@ function Er(e) { } return e; } -function V(e, t) { +function B(e, t) { return e ? [...new Set([].concat(e, t))] : t; } -function Dr(e, t) { - return e ? s(/* @__PURE__ */ Object.create(null), e, t) : t; -} function Or(e, t) { - return e ? d(e) && d(t) ? [.../* @__PURE__ */ new Set([...e, ...t])] : s(/* @__PURE__ */ Object.create(null), hr(e), hr(t ?? {})) : t; + return e ? s(/* @__PURE__ */ Object.create(null), e, t) : t; } function kr(e, t) { + return e ? d(e) && d(t) ? [.../* @__PURE__ */ new Set([...e, ...t])] : s(/* @__PURE__ */ Object.create(null), gr(e), gr(t ?? {})) : t; +} +function Ar(e, t) { if (!e) return t; if (!t) return e; let n = s(/* @__PURE__ */ Object.create(null), e); - for (let r in t) n[r] = V(e[r], t[r]); + for (let r in t) n[r] = B(e[r], t[r]); return n; } -function Ar() { +function jr() { return { app: null, config: { @@ -1436,12 +1436,12 @@ function Ar() { emitsCache: /* @__PURE__ */ new WeakMap() }; } -var jr = 0; -function Mr(e, t) { +var Mr = 0; +function Nr(e, t) { return function(n, r = null) { h(n) || (n = s({}, n)), r != null && !v(r) && (r = null); - let i = Ar(), a = /* @__PURE__ */ new WeakSet(), o = [], c = !1, l = i.app = { - _uid: jr++, + let i = jr(), a = /* @__PURE__ */ new WeakSet(), o = [], c = !1, l = i.app = { + _uid: Mr++, _component: n, _props: r, _container: null, @@ -1474,57 +1474,57 @@ function Mr(e, t) { o.push(e); }, unmount() { - c && (rn(o, l._instance, 16), e(null, l._container), delete l._container.__vue_app__); + c && (an(o, l._instance, 16), e(null, l._container), delete l._container.__vue_app__); }, provide(e, t) { return i.provides[e] = t, l; }, runWithContext(e) { - let t = Nr; - Nr = l; + let t = Pr; + Pr = l; try { return e(); } finally { - Nr = t; + Pr = t; } } }; return l; }; } -var Nr = null, Pr = (e, t) => t === "modelValue" || t === "model-value" ? e.modelModifiers : e[`${t}Modifiers`] || e[`${E(t)}Modifiers`] || e[`${D(t)}Modifiers`]; -function Fr(e, n, ...r) { +var Pr = null, Fr = (e, t) => t === "modelValue" || t === "model-value" ? e.modelModifiers : e[`${t}Modifiers`] || e[`${T(t)}Modifiers`] || e[`${E(t)}Modifiers`]; +function Ir(e, n, ...r) { if (e.isUnmounted) return; - let i = e.vnode.props || t, a = r, o = n.startsWith("update:"), s = o && Pr(i, n.slice(7)); - s && (s.trim && (a = r.map((e) => g(e) ? e.trim() : e)), s.number && (a = r.map(oe))); - let c, l = i[c = ie(n)] || i[c = ie(E(n))]; - !l && o && (l = i[c = ie(D(n))]), l && rn(l, e, 6, a); + let i = e.vnode.props || t, a = r, o = n.startsWith("update:"), s = o && Fr(i, n.slice(7)); + s && (s.trim && (a = r.map((e) => g(e) ? e.trim() : e)), s.number && (a = r.map(se))); + let c, l = i[c = ae(n)] || i[c = ae(T(n))]; + !l && o && (l = i[c = ae(E(n))]), l && an(l, e, 6, a); let u = i[c + "Once"]; if (u) { if (!e.emitted) e.emitted = {}; else if (e.emitted[c]) return; - e.emitted[c] = !0, rn(u, e, 6, a); + e.emitted[c] = !0, an(u, e, 6, a); } } -var Ir = /* @__PURE__ */ new WeakMap(); -function Lr(e, t, n = !1) { - let r = n ? Ir : t.emitsCache, i = r.get(e); +var Lr = /* @__PURE__ */ new WeakMap(); +function Rr(e, t, n = !1) { + let r = n ? Lr : t.emitsCache, i = r.get(e); if (i !== void 0) return i; let a = e.emits, o = {}, c = !1; if (!h(e)) { let r = (e) => { - let n = Lr(e, t, !0); + let n = Rr(e, t, !0); n && (c = !0, s(o, n)); }; !n && t.mixins.length && t.mixins.forEach(r), e.extends && r(e.extends), e.mixins && e.mixins.forEach(r); } return !a && !c ? (v(e) && r.set(e, null), null) : (d(a) ? a.forEach((e) => o[e] = null) : s(o, a), v(e) && r.set(e, o), o); } -function Rr(e, t) { - return !e || !a(t) ? !1 : (t = t.slice(2).replace(/Once$/, ""), u(e, t[0].toLowerCase() + t.slice(1)) || u(e, D(t)) || u(e, t)); +function zr(e, t) { + return !e || !a(t) ? !1 : (t = t.slice(2).replace(/Once$/, ""), u(e, t[0].toLowerCase() + t.slice(1)) || u(e, E(t)) || u(e, t)); } -function zr(e) { - let { type: t, vnode: n, proxy: r, withProxy: i, propsOptions: [a], slots: s, attrs: c, emit: l, render: u, renderCache: d, props: f, data: p, setupState: m, ctx: h, inheritAttrs: g } = e, _ = wn(e), v, y; +function Br(e) { + let { type: t, vnode: n, proxy: r, withProxy: i, propsOptions: [a], slots: s, attrs: c, emit: l, render: u, renderCache: d, props: f, data: p, setupState: m, ctx: h, inheritAttrs: g } = e, _ = Tn(e), v, y; try { if (n.shapeFlag & 4) { let e = i || r, t = e; @@ -1535,57 +1535,57 @@ function zr(e) { attrs: c, slots: s, emit: l - }) : e(f, null)), y = t.props ? c : Br(c); + }) : e(f, null)), y = t.props ? c : Vr(c); } } catch (t) { - Ti.length = 0, an(t, e, 1), v = Ii(Ci); + Ei.length = 0, on(t, e, 1), v = Ii(wi); } let b = v; if (y && g !== !1) { let e = Object.keys(y), { shapeFlag: t } = b; - e.length && t & 7 && (a && e.some(o) && (y = Vr(y, a)), b = zi(b, y, !1, !0)); + e.length && t & 7 && (a && e.some(o) && (y = Hr(y, a)), b = zi(b, y, !1, !0)); } - return n.dirs && (b = zi(b, null, !1, !0), b.dirs = b.dirs ? b.dirs.concat(n.dirs) : n.dirs), n.transition && Rn(b, n.transition), v = b, wn(_), v; + return n.dirs && (b = zi(b, null, !1, !0), b.dirs = b.dirs ? b.dirs.concat(n.dirs) : n.dirs), n.transition && Bn(b, n.transition), v = b, Tn(_), v; } -var Br = (e) => { +var Vr = (e) => { let t; for (let n in e) (n === "class" || n === "style" || a(n)) && ((t ||= {})[n] = e[n]); return t; -}, Vr = (e, t) => { +}, Hr = (e, t) => { let n = {}; for (let r in e) (!o(r) || !(r.slice(9) in t)) && (n[r] = e[r]); return n; }; -function Hr(e, t, n) { +function Ur(e, t, n) { let { props: r, children: i, component: a } = e, { props: o, children: s, patchFlag: c } = t, l = a.emitsOptions; if (t.dirs || t.transition) return !0; if (n && c >= 0) { if (c & 1024) return !0; - if (c & 16) return r ? Ur(r, o, l) : !!o; + if (c & 16) return r ? Wr(r, o, l) : !!o; if (c & 8) { let e = t.dynamicProps; for (let t = 0; t < e.length; t++) { let n = e[t]; - if (Wr(o, r, n) && !Rr(l, n)) return !0; + if (Gr(o, r, n) && !zr(l, n)) return !0; } } - } else return (i || s) && (!s || !s.$stable) ? !0 : r === o ? !1 : r ? o ? Ur(r, o, l) : !0 : !!o; + } else return (i || s) && (!s || !s.$stable) ? !0 : r === o ? !1 : r ? o ? Wr(r, o, l) : !0 : !!o; return !1; } -function Ur(e, t, n) { +function Wr(e, t, n) { let r = Object.keys(t); if (r.length !== Object.keys(e).length) return !0; for (let i = 0; i < r.length; i++) { let a = r[i]; - if (Wr(t, e, a) && !Rr(n, a)) return !0; + if (Gr(t, e, a) && !zr(n, a)) return !0; } return !1; } -function Wr(e, t, n) { +function Gr(e, t, n) { let r = e[n], i = t[n]; - return n === "style" && v(r) && v(i) ? !ye(r, i) : r !== i; + return n === "style" && v(r) && v(i) ? !be(r, i) : r !== i; } -function Gr({ vnode: e, parent: t, suspense: n }, r) { +function Kr({ vnode: e, parent: t, suspense: n }, r) { for (; t;) { let n = t.subTree; if (n.suspense && n.suspense.activeBranch === e && (n.suspense.vnode.el = n.el = r, e = n), n === e) (e = t.vnode).el = r, t = t.parent; @@ -1593,55 +1593,55 @@ function Gr({ vnode: e, parent: t, suspense: n }, r) { } n && n.activeBranch === e && (n.vnode.el = r); } -var Kr = {}, qr = () => Object.create(Kr), Jr = (e) => Object.getPrototypeOf(e) === Kr; -function Yr(e, t, n, r = !1) { - let i = {}, a = qr(); - e.propsDefaults = /* @__PURE__ */ Object.create(null), Zr(e, t, i, a); +var qr = {}, Jr = () => Object.create(qr), Yr = (e) => Object.getPrototypeOf(e) === qr; +function Xr(e, t, n, r = !1) { + let i = {}, a = Jr(); + e.propsDefaults = /* @__PURE__ */ Object.create(null), Qr(e, t, i, a); for (let t in e.propsOptions[0]) t in i || (i[t] = void 0); - n ? e.props = r ? i : /* @__PURE__ */ Pt(i) : e.type.props ? e.props = i : e.props = a, e.attrs = a; + n ? e.props = r ? i : /* @__PURE__ */ Ft(i) : e.type.props ? e.props = i : e.props = a, e.attrs = a; } -function Xr(e, t, n, r) { - let { props: i, attrs: a, vnode: { patchFlag: o } } = e, s = /* @__PURE__ */ F(i), [c] = e.propsOptions, l = !1; +function Zr(e, t, n, r) { + let { props: i, attrs: a, vnode: { patchFlag: o } } = e, s = /* @__PURE__ */ P(i), [c] = e.propsOptions, l = !1; if ((r || o > 0) && !(o & 16)) { if (o & 8) { let n = e.vnode.dynamicProps; for (let r = 0; r < n.length; r++) { let o = n[r]; - if (Rr(e.emitsOptions, o)) continue; + if (zr(e.emitsOptions, o)) continue; let d = t[o]; if (c) if (u(a, o)) d !== a[o] && (a[o] = d, l = !0); else { - let t = E(o); - i[t] = Qr(c, s, t, d, e, !1); + let t = T(o); + i[t] = $r(c, s, t, d, e, !1); } else d !== a[o] && (a[o] = d, l = !0); } } } else { - Zr(e, t, i, a) && (l = !0); + Qr(e, t, i, a) && (l = !0); let r; - for (let a in s) (!t || !u(t, a) && ((r = D(a)) === a || !u(t, r))) && (c ? n && (n[a] !== void 0 || n[r] !== void 0) && (i[a] = Qr(c, s, a, void 0, e, !0)) : delete i[a]); + for (let a in s) (!t || !u(t, a) && ((r = E(a)) === a || !u(t, r))) && (c ? n && (n[a] !== void 0 || n[r] !== void 0) && (i[a] = $r(c, s, a, void 0, e, !0)) : delete i[a]); if (a !== s) for (let e in a) (!t || !u(t, e)) && (delete a[e], l = !0); } - l && Qe(e.attrs, "set", ""); + l && $e(e.attrs, "set", ""); } -function Zr(e, n, r, i) { +function Qr(e, n, r, i) { let [a, o] = e.propsOptions, s = !1, c; if (n) for (let t in n) { if (ee(t)) continue; let l = n[t], d; - a && u(a, d = E(t)) ? !o || !o.includes(d) ? r[d] = l : (c ||= {})[d] = l : Rr(e.emitsOptions, t) || (!(t in i) || l !== i[t]) && (i[t] = l, s = !0); + a && u(a, d = T(t)) ? !o || !o.includes(d) ? r[d] = l : (c ||= {})[d] = l : zr(e.emitsOptions, t) || (!(t in i) || l !== i[t]) && (i[t] = l, s = !0); } if (o) { - let n = /* @__PURE__ */ F(r), i = c || t; + let n = /* @__PURE__ */ P(r), i = c || t; for (let t = 0; t < o.length; t++) { let s = o[t]; - r[s] = Qr(a, n, s, i[s], e, !u(i, s)); + r[s] = $r(a, n, s, i[s], e, !u(i, s)); } } return s; } -function Qr(e, t, n, r, i, a) { +function $r(e, t, n, r, i, a) { let o = e[n]; if (o != null) { let e = u(o, "default"); @@ -1657,31 +1657,31 @@ function Qr(e, t, n, r, i, a) { } else r = e; i.ce && i.ce._setProp(n, r); } - o[0] && (a && !e ? r = !1 : o[1] && (r === "" || r === D(n)) && (r = !0)); + o[0] && (a && !e ? r = !1 : o[1] && (r === "" || r === E(n)) && (r = !0)); } return r; } -var $r = /* @__PURE__ */ new WeakMap(); -function ei(e, r, i = !1) { - let a = i ? $r : r.propsCache, o = a.get(e); +var ei = /* @__PURE__ */ new WeakMap(); +function ti(e, r, i = !1) { + let a = i ? ei : r.propsCache, o = a.get(e); if (o) return o; let c = e.props, l = {}, f = [], p = !1; if (!h(e)) { let t = (e) => { p = !0; - let [t, n] = ei(e, r, !0); + let [t, n] = ti(e, r, !0); s(l, t), n && f.push(...n); }; !i && r.mixins.length && r.mixins.forEach(t), e.extends && t(e.extends), e.mixins && e.mixins.forEach(t); } if (!c && !p) return v(e) && a.set(e, n), n; if (d(c)) for (let e = 0; e < c.length; e++) { - let n = E(c[e]); - ti(n) && (l[n] = t); + let n = T(c[e]); + ni(n) && (l[n] = t); } else if (c) for (let e in c) { - let t = E(e); - if (ti(t)) { + let t = T(e); + if (ni(t)) { let n = c[e], r = l[t] = d(n) || h(n) ? { type: n } : s({}, n), i = r.type, a = !1, o = !0; if (d(i)) for (let e = 0; e < i.length; ++e) { let t = i[e], n = h(t) && t.name; @@ -1697,69 +1697,69 @@ function ei(e, r, i = !1) { let m = [l, f]; return v(e) && a.set(e, m), m; } -function ti(e) { +function ni(e) { return e[0] !== "$" && !ee(e); } -var ni = (e) => e === "_" || e === "_ctx" || e === "$stable", ri = (e) => d(e) ? e.map(Vi) : [Vi(e)], ii = (e, t, n) => { +var ri = (e) => e === "_" || e === "_ctx" || e === "$stable", ii = (e) => d(e) ? e.map(Vi) : [Vi(e)], ai = (e, t, n) => { if (t._n) return t; - let r = Tn((...e) => ri(t(...e)), n); + let r = En((...e) => ii(t(...e)), n); return r._c = !1, r; -}, ai = (e, t, n) => { +}, oi = (e, t, n) => { let r = e._ctx; for (let n in e) { - if (ni(n)) continue; + if (ri(n)) continue; let i = e[n]; - if (h(i)) t[n] = ii(n, i, r); + if (h(i)) t[n] = ai(n, i, r); else if (i != null) { - let e = ri(i); + let e = ii(i); t[n] = () => e; } } -}, oi = (e, t) => { - let n = ri(t); +}, si = (e, t) => { + let n = ii(t); e.slots.default = () => n; -}, si = (e, t, n) => { - for (let r in t) (n || !ni(r)) && (e[r] = t[r]); }, ci = (e, t, n) => { - let r = e.slots = qr(); + for (let r in t) (n || !ri(r)) && (e[r] = t[r]); +}, li = (e, t, n) => { + let r = e.slots = Jr(); if (e.vnode.shapeFlag & 32) { let e = t._; - e ? (si(r, t, n), n && k(r, "_", e, !0)) : ai(t, r); - } else t && oi(e, t); -}, li = (e, n, r) => { + e ? (ci(r, t, n), n && O(r, "_", e, !0)) : oi(t, r); + } else t && si(e, t); +}, ui = (e, n, r) => { let { vnode: i, slots: a } = e, o = !0, s = t; if (i.shapeFlag & 32) { let e = n._; - e ? r && e === 1 ? o = !1 : si(a, n, r) : (o = !n.$stable, ai(n, a)), s = n; - } else n && (oi(e, n), s = { default: 1 }); - if (o) for (let e in a) !ni(e) && s[e] == null && delete a[e]; -}, H = xi; -function ui(e) { - return di(e); -} -function di(e, i) { - let a = le(); + e ? r && e === 1 ? o = !1 : ci(a, n, r) : (o = !n.$stable, oi(n, a)), s = n; + } else n && (si(e, n), s = { default: 1 }); + if (o) for (let e in a) !ri(e) && s[e] == null && delete a[e]; +}, V = Si; +function di(e) { + return fi(e); +} +function fi(e, i) { + let a = ue(); a.__VUE__ = !0; let { insert: o, remove: s, patchProp: c, createElement: l, createText: u, createComment: d, setText: f, setElementText: p, parentNode: m, nextSibling: h, setScopeId: g = r, insertStaticContent: _ } = e, v = (e, t, n, r = null, i = null, a = null, o = void 0, s = null, c = !!t.dynamicChildren) => { if (e === t) return; - e && !Ni(e, t) && (r = ve(e), me(e, i, a, !0), e = null), t.patchFlag === -2 && (c = !1, t.dynamicChildren = null); + e && !Ni(e, t) && (r = ye(e), he(e, i, a, !0), e = null), t.patchFlag === -2 && (c = !1, t.dynamicChildren = null); let { type: l, ref: u, shapeFlag: d } = t; switch (l) { - case Si: + case Ci: y(e, t, n, r); break; - case Ci: + case wi: b(e, t, n, r); break; - case wi: + case Ti: e ?? x(t, n, r, o); break; - case U: - ie(e, t, n, r, i, a, o, s, c); + case H: + ae(e, t, n, r, i, a, o, s, c); break; - default: d & 1 ? w(e, t, n, r, i, a, o, s, c) : d & 6 ? O(e, t, n, r, i, a, o, s, c) : (d & 64 || d & 128) && l.process(e, t, n, r, i, a, o, s, c, j); + default: d & 1 ? w(e, t, n, r, i, a, o, s, c) : d & 6 ? D(e, t, n, r, i, a, o, s, c) : (d & 64 || d & 128) && l.process(e, t, n, r, i, a, o, s, c, A); } - u != null && i ? Un(u, e && e.ref, a, t || e, !t) : u == null && e && e.ref != null && Un(e.ref, null, a, e, !0); + u != null && i ? Gn(u, e && e.ref, a, t || e, !t) : u == null && e && e.ref != null && Gn(e.ref, null, a, e, !0); }, y = (e, t, n, r) => { if (e == null) o(t.el = u(t.children), n, r); else { @@ -1779,45 +1779,45 @@ function di(e, i) { for (; e && e !== t;) n = h(e), s(e), e = n; s(t); }, w = (e, t, n, r, i, a, o, s, c) => { - if (t.type === "svg" ? o = "svg" : t.type === "math" && (o = "mathml"), e == null) T(t, n, r, i, a, o, s, c); + if (t.type === "svg" ? o = "svg" : t.type === "math" && (o = "mathml"), e == null) te(t, n, r, i, a, o, s, c); else { let n = e.el && e.el._isVueCE ? e.el : null; try { - n && n._beginPatch(), ne(e, t, i, a, o, s, c); + n && n._beginPatch(), re(e, t, i, a, o, s, c); } finally { n && n._endPatch(); } } - }, T = (e, t, n, r, i, a, s, u) => { + }, te = (e, t, n, r, i, a, s, u) => { let d, f, { props: m, shapeFlag: h, transition: g, dirs: _ } = e; - if (d = e.el = l(e.type, a, m && m.is, m), h & 8 ? p(d, e.children) : h & 16 && E(e.children, d, null, r, i, fi(e, a), s, u), _ && Dn(e, null, r, "created"), te(d, e, e.scopeId, s, r), m) { + if (d = e.el = l(e.type, a, m && m.is, m), h & 8 ? p(d, e.children) : h & 16 && T(e.children, d, null, r, i, pi(e, a), s, u), _ && On(e, null, r, "created"), ne(d, e, e.scopeId, s, r), m) { for (let e in m) e !== "value" && !ee(e) && c(d, e, null, m[e], a, r); "value" in m && c(d, "value", null, m.value, a), (f = m.onVnodeBeforeMount) && Gi(f, r, e); } - _ && Dn(e, null, r, "beforeMount"); - let v = mi(i, g); - v && g.beforeEnter(d), o(d, t, n), ((f = m && m.onVnodeMounted) || v || _) && H(() => { + _ && On(e, null, r, "beforeMount"); + let v = hi(i, g); + v && g.beforeEnter(d), o(d, t, n), ((f = m && m.onVnodeMounted) || v || _) && V(() => { try { - f && Gi(f, r, e), v && g.enter(d), _ && Dn(e, null, r, "mounted"); + f && Gi(f, r, e), v && g.enter(d), _ && On(e, null, r, "mounted"); } finally {} }, i); - }, te = (e, t, n, r, i) => { + }, ne = (e, t, n, r, i) => { if (n && g(e, n), r) for (let t = 0; t < r.length; t++) g(e, r[t]); if (i) { let n = i.subTree; - if (t === n || bi(n.type) && (n.ssContent === t || n.ssFallback === t)) { + if (t === n || xi(n.type) && (n.ssContent === t || n.ssFallback === t)) { let t = i.vnode; - te(e, t, t.scopeId, t.slotScopeIds, i.parent); + ne(e, t, t.scopeId, t.slotScopeIds, i.parent); } } - }, E = (e, t, n, r, i, a, o, s, c = 0) => { + }, T = (e, t, n, r, i, a, o, s, c = 0) => { for (let l = c; l < e.length; l++) v(null, e[l] = s ? Hi(e[l]) : Vi(e[l]), t, n, r, i, a, o, s); - }, ne = (e, n, r, i, a, o, s) => { + }, re = (e, n, r, i, a, o, s) => { let l = n.el = e.el, { patchFlag: u, dynamicChildren: d, dirs: f } = n; u |= e.patchFlag & 16; let m = e.props || t, h = n.props || t, g; - if (r && pi(r, !1), (g = h.onVnodeBeforeUpdate) && Gi(g, r, n, e), f && Dn(n, e, r, "beforeUpdate"), r && pi(r, !0), (m.innerHTML && h.innerHTML == null || m.textContent && h.textContent == null) && p(l, ""), d ? D(e.dynamicChildren, d, l, r, i, fi(n, a), o) : s || ue(e, n, l, null, r, i, fi(n, a), o, !1), u > 0) { - if (u & 16) re(l, m, h, r, a); + if (r && mi(r, !1), (g = h.onVnodeBeforeUpdate) && Gi(g, r, n, e), f && On(n, e, r, "beforeUpdate"), r && mi(r, !0), (m.innerHTML && h.innerHTML == null || m.textContent && h.textContent == null) && p(l, ""), d ? E(e.dynamicChildren, d, l, r, i, pi(n, a), o) : s || de(e, n, l, null, r, i, pi(n, a), o, !1), u > 0) { + if (u & 16) ie(l, m, h, r, a); else if (u & 2 && m.class !== h.class && c(l, "class", null, h.class, a), u & 4 && c(l, "style", m.style, h.style, a), u & 8) { let e = n.dynamicProps; for (let t = 0; t < e.length; t++) { @@ -1826,16 +1826,16 @@ function di(e, i) { } } u & 1 && e.children !== n.children && p(l, n.children); - } else !s && d == null && re(l, m, h, r, a); - ((g = h.onVnodeUpdated) || f) && H(() => { - g && Gi(g, r, n, e), f && Dn(n, e, r, "updated"); + } else !s && d == null && ie(l, m, h, r, a); + ((g = h.onVnodeUpdated) || f) && V(() => { + g && Gi(g, r, n, e), f && On(n, e, r, "updated"); }, i); - }, D = (e, t, n, r, i, a, o) => { + }, E = (e, t, n, r, i, a, o) => { for (let s = 0; s < t.length; s++) { let c = e[s], l = t[s]; - v(c, l, c.el && (c.type === U || !Ni(c, l) || c.shapeFlag & 198) ? m(c.el) : n, null, r, i, a, o, !0); + v(c, l, c.el && (c.type === H || !Ni(c, l) || c.shapeFlag & 198) ? m(c.el) : n, null, r, i, a, o, !0); } - }, re = (e, n, r, i, a) => { + }, ie = (e, n, r, i, a) => { if (n !== r) { if (n !== t) for (let t in n) !ee(t) && !(t in r) && c(e, t, n[t], null, a, i); for (let t in r) { @@ -1845,35 +1845,35 @@ function di(e, i) { } "value" in r && c(e, "value", n.value, r.value, a); } - }, ie = (e, t, n, r, i, a, s, c, l) => { + }, ae = (e, t, n, r, i, a, s, c, l) => { let d = t.el = e ? e.el : u(""), f = t.anchor = e ? e.anchor : u(""), { patchFlag: p, dynamicChildren: m, slotScopeIds: h } = t; - h && (c = c ? c.concat(h) : h), e == null ? (o(d, n, r), o(f, n, r), E(t.children || [], n, f, i, a, s, c, l)) : p > 0 && p & 64 && m && e.dynamicChildren && e.dynamicChildren.length === m.length ? (D(e.dynamicChildren, m, n, i, a, s, c), (t.key != null || i && t === i.subTree) && hi(e, t, !0)) : ue(e, t, n, f, i, a, s, c, l); - }, O = (e, t, n, r, i, a, o, s, c) => { - t.slotScopeIds = s, e == null ? t.shapeFlag & 512 ? i.ctx.activate(t, n, r, o, c) : k(t, n, r, i, a, o, c) : oe(e, t, c); - }, k = (e, t, n, r, i, a, o) => { + h && (c = c ? c.concat(h) : h), e == null ? (o(d, n, r), o(f, n, r), T(t.children || [], n, f, i, a, s, c, l)) : p > 0 && p & 64 && m && e.dynamicChildren && e.dynamicChildren.length === m.length ? (E(e.dynamicChildren, m, n, i, a, s, c), (t.key != null || i && t === i.subTree) && gi(e, t, !0)) : de(e, t, n, f, i, a, s, c, l); + }, D = (e, t, n, r, i, a, o, s, c) => { + t.slotScopeIds = s, e == null ? t.shapeFlag & 512 ? i.ctx.activate(t, n, r, o, c) : O(t, n, r, i, a, o, c) : se(e, t, c); + }, O = (e, t, n, r, i, a, o) => { let s = e.component = Ji(e, r, i); - if (Kn(e) && (s.ctx.renderer = j), na(s, !1, o), s.asyncDep) { - if (i && i.registerDep(s, se, o), !e.el) { - let r = s.subTree = Ii(Ci); + if (Jn(e) && (s.ctx.renderer = A), na(s, !1, o), s.asyncDep) { + if (i && i.registerDep(s, ce, o), !e.el) { + let r = s.subTree = Ii(wi); b(null, r, t, n), e.placeholder = r.el; } - } else se(s, e, t, n, i, a, o); - }, oe = (e, t, n) => { + } else ce(s, e, t, n, i, a, o); + }, se = (e, t, n) => { let r = t.component = e.component; - if (Hr(e, t, n)) if (r.asyncDep && !r.asyncResolved) { - ce(r, t, n); + if (Ur(e, t, n)) if (r.asyncDep && !r.asyncResolved) { + le(r, t, n); return; } else r.next = t, r.update(); else t.el = e.el, r.vnode = t; - }, se = (e, t, n, r, i, a, o) => { + }, ce = (e, t, n, r, i, a, o) => { let s = () => { if (e.isMounted) { let { next: t, bu: n, u: r, parent: s, vnode: c } = e; { - let n = _i(e); + let n = vi(e); if (n) { - t && (t.el = c.el, ce(e, t, o)), n.asyncDep.then(() => { - H(() => { + t && (t.el = c.el, le(e, t, o)), n.asyncDep.then(() => { + V(() => { e.isUnmounted || l(); }, i); }); @@ -1881,58 +1881,58 @@ function di(e, i) { } } let u = t, d; - pi(e, !1), t ? (t.el = c.el, ce(e, t, o)) : t = c, n && ae(n), (d = t.props && t.props.onVnodeBeforeUpdate) && Gi(d, s, t, c), pi(e, !0); - let f = zr(e), p = e.subTree; - e.subTree = f, v(p, f, m(p.el), ve(p), e, i, a), t.el = f.el, u === null && Gr(e, f.el), r && H(r, i), (d = t.props && t.props.onVnodeUpdated) && H(() => Gi(d, s, t, c), i); + mi(e, !1), t ? (t.el = c.el, le(e, t, o)) : t = c, n && oe(n), (d = t.props && t.props.onVnodeBeforeUpdate) && Gi(d, s, t, c), mi(e, !0); + let f = Br(e), p = e.subTree; + e.subTree = f, v(p, f, m(p.el), ye(p), e, i, a), t.el = f.el, u === null && Kr(e, f.el), r && V(r, i), (d = t.props && t.props.onVnodeUpdated) && V(() => Gi(d, s, t, c), i); } else { - let o, { el: s, props: c } = t, { bm: l, m: u, parent: d, root: f, type: p } = e, m = Gn(t); - if (pi(e, !1), l && ae(l), !m && (o = c && c.onVnodeBeforeMount) && Gi(o, d, t), pi(e, !0), s && Se) { + let o, { el: s, props: c } = t, { bm: l, m: u, parent: d, root: f, type: p } = e, m = qn(t); + if (mi(e, !1), l && oe(l), !m && (o = c && c.onVnodeBeforeMount) && Gi(o, d, t), mi(e, !0), s && Ce) { let t = () => { - e.subTree = zr(e), Se(s, e.subTree, e, i, null); + e.subTree = Br(e), Ce(s, e.subTree, e, i, null); }; m && p.__asyncHydrate ? p.__asyncHydrate(s, e, t) : t(); } else { f.ce && f.ce._hasShadowRoot() && f.ce._injectChildStyle(p, e.parent ? e.parent.type : void 0); - let o = e.subTree = zr(e); + let o = e.subTree = Br(e); v(null, o, n, r, e, i, a), t.el = o.el; } - if (u && H(u, i), !m && (o = c && c.onVnodeMounted)) { + if (u && V(u, i), !m && (o = c && c.onVnodeMounted)) { let e = t; - H(() => Gi(o, d, e), i); + V(() => Gi(o, d, e), i); } - (t.shapeFlag & 256 || d && Gn(d.vnode) && d.vnode.shapeFlag & 256) && e.a && H(e.a, i), e.isMounted = !0, t = n = r = null; + (t.shapeFlag & 256 || d && qn(d.vnode) && d.vnode.shapeFlag & 256) && e.a && V(e.a, i), e.isMounted = !0, t = n = r = null; } }; e.scope.on(); - let c = e.effect = new Ee(s); + let c = e.effect = new De(s); e.scope.off(); let l = e.update = c.run.bind(c), u = e.job = c.runIfDirty.bind(c); - u.i = e, u.id = e.uid, c.scheduler = () => hn(u), pi(e, !0), l(); - }, ce = (e, t, n) => { + u.i = e, u.id = e.uid, c.scheduler = () => gn(u), mi(e, !0), l(); + }, le = (e, t, n) => { t.component = e; let r = e.vnode.props; - e.vnode = t, e.next = null, Xr(e, t.props, r, n), li(e, t.children, n), Ve(), vn(e), He(); - }, ue = (e, t, n, r, i, a, o, s, c = !1) => { + e.vnode = t, e.next = null, Zr(e, t.props, r, n), ui(e, t.children, n), He(), yn(e), Ue(); + }, de = (e, t, n, r, i, a, o, s, c = !1) => { let l = e && e.children, u = e ? e.shapeFlag : 0, d = t.children, { patchFlag: f, shapeFlag: m } = t; if (f > 0) { if (f & 128) { - fe(l, d, n, r, i, a, o, s, c); + pe(l, d, n, r, i, a, o, s, c); return; } else if (f & 256) { - de(l, d, n, r, i, a, o, s, c); + fe(l, d, n, r, i, a, o, s, c); return; } } - m & 8 ? (u & 16 && _e(l, i, a), d !== l && p(n, d)) : u & 16 ? m & 16 ? fe(l, d, n, r, i, a, o, s, c) : _e(l, i, a, !0) : (u & 8 && p(n, ""), m & 16 && E(d, n, r, i, a, o, s, c)); - }, de = (e, t, r, i, a, o, s, c, l) => { + m & 8 ? (u & 16 && ve(l, i, a), d !== l && p(n, d)) : u & 16 ? m & 16 ? pe(l, d, n, r, i, a, o, s, c) : ve(l, i, a, !0) : (u & 8 && p(n, ""), m & 16 && T(d, n, r, i, a, o, s, c)); + }, fe = (e, t, r, i, a, o, s, c, l) => { e ||= n, t ||= n; let u = e.length, d = t.length, f = Math.min(u, d), p; for (p = 0; p < f; p++) { let n = t[p] = l ? Hi(t[p]) : Vi(t[p]); v(e[p], n, r, null, a, o, s, c, l); } - u > d ? _e(e, a, o, !0, !1, f) : E(t, r, i, a, o, s, c, l, f); - }, fe = (e, t, r, i, a, o, s, c, l) => { + u > d ? ve(e, a, o, !0, !1, f) : T(t, r, i, a, o, s, c, l, f); + }, pe = (e, t, r, i, a, o, s, c, l) => { let u = 0, d = t.length, f = e.length - 1, p = d - 1; for (; u <= f && u <= p;) { let n = e[u], i = t[u] = l ? Hi(t[u]) : Vi(t[u]); @@ -1951,7 +1951,7 @@ function di(e, i) { let e = p + 1, n = e < d ? t[e].el : i; for (; u <= p;) v(null, t[u] = l ? Hi(t[u]) : Vi(t[u]), r, n, a, o, s, c, l), u++; } - } else if (u > p) for (; u <= f;) me(e[u], a, o, !0), u++; + } else if (u > p) for (; u <= f;) he(e[u], a, o, !0), u++; else { let m = u, h = u, g = /* @__PURE__ */ new Map(); for (u = h; u <= p; u++) { @@ -1963,7 +1963,7 @@ function di(e, i) { for (u = m; u <= f; u++) { let n = e[u]; if (y >= b) { - me(n, a, o, !0); + he(n, a, o, !0); continue; } let i; @@ -1972,18 +1972,18 @@ function di(e, i) { i = _; break; } - i === void 0 ? me(n, a, o, !0) : (C[i - h] = u + 1, i >= S ? S = i : x = !0, v(n, t[i], r, null, a, o, s, c, l), y++); + i === void 0 ? he(n, a, o, !0) : (C[i - h] = u + 1, i >= S ? S = i : x = !0, v(n, t[i], r, null, a, o, s, c, l), y++); } - let w = x ? gi(C) : n; + let w = x ? _i(C) : n; for (_ = w.length - 1, u = b - 1; u >= 0; u--) { - let e = h + u, n = t[e], f = t[e + 1], p = e + 1 < d ? f.el || yi(f) : i; - C[u] === 0 ? v(null, n, r, p, a, o, s, c, l) : x && (_ < 0 || u !== w[_] ? pe(n, r, p, 2) : _--); + let e = h + u, n = t[e], f = t[e + 1], p = e + 1 < d ? f.el || bi(f) : i; + C[u] === 0 ? v(null, n, r, p, a, o, s, c, l) : x && (_ < 0 || u !== w[_] ? me(n, r, p, 2) : _--); } } - }, pe = (e, t, n, r, i = null) => { + }, me = (e, t, n, r, i = null) => { let { el: a, type: c, transition: l, children: u, shapeFlag: d } = e; if (d & 6) { - pe(e.component.subTree, t, n, r); + me(e.component.subTree, t, n, r); return; } if (d & 128) { @@ -1991,57 +1991,57 @@ function di(e, i) { return; } if (d & 64) { - c.move(e, t, n, j); + c.move(e, t, n, A); return; } - if (c === U) { + if (c === H) { o(a, t, n); - for (let e = 0; e < u.length; e++) pe(u[e], t, n, r); + for (let e = 0; e < u.length; e++) me(u[e], t, n, r); o(e.anchor, t, n); return; } - if (c === wi) { + if (c === Ti) { S(e, t, n); return; } - if (r !== 2 && d & 1 && l) if (r === 0) l.beforeEnter(a), o(a, t, n), H(() => l.enter(a), i); + if (r !== 2 && d & 1 && l) if (r === 0) l.beforeEnter(a), o(a, t, n), V(() => l.enter(a), i); else { let { leave: r, delayLeave: i, afterLeave: c } = l, u = () => { e.ctx.isUnmounted ? s(a) : o(a, t, n); }, d = () => { - a._isLeaving && a[Ln](!0), r(a, () => { + a._isLeaving && a[zn](!0), r(a, () => { u(), c && c(); }); }; i ? i(a, u, d) : d(); } else o(a, t, n); - }, me = (e, t, n, r = !1, i = !1) => { + }, he = (e, t, n, r = !1, i = !1) => { let { type: a, props: o, ref: s, children: c, dynamicChildren: l, shapeFlag: u, patchFlag: d, dirs: f, cacheIndex: p, memo: m } = e; - if (d === -2 && (i = !1), s != null && (Ve(), Un(s, null, n, e, !0), He()), p != null && (t.renderCache[p] = void 0), u & 256) { + if (d === -2 && (i = !1), s != null && (He(), Gn(s, null, n, e, !0), Ue()), p != null && (t.renderCache[p] = void 0), u & 256) { t.ctx.deactivate(e); return; } - let h = u & 1 && f, g = !Gn(e), _; - if (g && (_ = o && o.onVnodeBeforeUnmount) && Gi(_, t, e), u & 6) ge(e.component, n, r); + let h = u & 1 && f, g = !qn(e), _; + if (g && (_ = o && o.onVnodeBeforeUnmount) && Gi(_, t, e), u & 6) _e(e.component, n, r); else { if (u & 128) { e.suspense.unmount(n, r); return; } - h && Dn(e, null, t, "beforeUnmount"), u & 64 ? e.type.remove(e, t, n, j, r) : l && !l.hasOnce && (a !== U || d > 0 && d & 64) ? _e(l, t, n, !1, !0) : (a === U && d & 384 || !i && u & 16) && _e(c, t, n), r && A(e); + h && On(e, null, t, "beforeUnmount"), u & 64 ? e.type.remove(e, t, n, A, r) : l && !l.hasOnce && (a !== H || d > 0 && d & 64) ? ve(l, t, n, !1, !0) : (a === H && d & 384 || !i && u & 16) && ve(c, t, n), r && k(e); } let v = m != null && p == null; - (g && (_ = o && o.onVnodeUnmounted) || h || v) && H(() => { - _ && Gi(_, t, e), h && Dn(e, null, t, "unmounted"), v && (e.el = null); + (g && (_ = o && o.onVnodeUnmounted) || h || v) && V(() => { + _ && Gi(_, t, e), h && On(e, null, t, "unmounted"), v && (e.el = null); }, n); - }, A = (e) => { + }, k = (e) => { let { type: t, el: n, anchor: r, transition: i } = e; - if (t === U) { - he(n, r); + if (t === H) { + ge(n, r); return; } - if (t === wi) { + if (t === Ti) { C(e); return; } @@ -2052,60 +2052,60 @@ function di(e, i) { let { leave: t, delayLeave: r } = i, o = () => t(n, a); r ? r(e.el, a, o) : o(); } else a(); - }, he = (e, t) => { + }, ge = (e, t) => { let n; for (; e !== t;) n = h(e), s(e), e = n; s(t); - }, ge = (e, t, n) => { + }, _e = (e, t, n) => { let { bum: r, scope: i, job: a, subTree: o, um: s, m: c, a: l } = e; - vi(c), vi(l), r && ae(r), i.stop(), a && (a.flags |= 8, me(o, e, t, n)), s && H(s, t), H(() => { + yi(c), yi(l), r && oe(r), i.stop(), a && (a.flags |= 8, he(o, e, t, n)), s && V(s, t), V(() => { e.isUnmounted = !0; }, t); - }, _e = (e, t, n, r = !1, i = !1, a = 0) => { - for (let o = a; o < e.length; o++) me(e[o], t, n, r, i); - }, ve = (e) => { - if (e.shapeFlag & 6) return ve(e.component.subTree); + }, ve = (e, t, n, r = !1, i = !1, a = 0) => { + for (let o = a; o < e.length; o++) he(e[o], t, n, r, i); + }, ye = (e) => { + if (e.shapeFlag & 6) return ye(e.component.subTree); if (e.shapeFlag & 128) return e.suspense.next(); - let t = h(e.anchor || e.el), n = t && t[Fn]; + let t = h(e.anchor || e.el), n = t && t[Ln]; return n ? h(n) : t; - }, ye = !1, be = (e, t, n) => { + }, be = !1, xe = (e, t, n) => { let r; - e == null ? t._vnode && (me(t._vnode, null, null, !0), r = t._vnode.component) : v(t._vnode || null, e, t, null, null, null, n), t._vnode = e, ye ||= (ye = !0, vn(r), yn(), !1); - }, j = { + e == null ? t._vnode && (he(t._vnode, null, null, !0), r = t._vnode.component) : v(t._vnode || null, e, t, null, null, null, n), t._vnode = e, be ||= (be = !0, yn(r), bn(), !1); + }, A = { p: v, - um: me, - m: pe, - r: A, - mt: k, - mc: E, - pc: ue, - pbc: D, - n: ve, + um: he, + m: me, + r: k, + mt: O, + mc: T, + pc: de, + pbc: E, + n: ye, o: e - }, xe, Se; - return i && ([xe, Se] = i(j)), { - render: be, - hydrate: xe, - createApp: Mr(be, xe) + }, Se, Ce; + return i && ([Se, Ce] = i(A)), { + render: xe, + hydrate: Se, + createApp: Nr(xe, Se) }; } -function fi({ type: e, props: t }, n) { +function pi({ type: e, props: t }, n) { return n === "svg" && e === "foreignObject" || n === "mathml" && e === "annotation-xml" && t && t.encoding && t.encoding.includes("html") ? void 0 : n; } -function pi({ effect: e, job: t }, n) { +function mi({ effect: e, job: t }, n) { n ? (e.flags |= 32, t.flags |= 4) : (e.flags &= -33, t.flags &= -5); } -function mi(e, t) { +function hi(e, t) { return (!e || e && !e.pendingBranch) && t && !t.persisted; } -function hi(e, t, n = !1) { +function gi(e, t, n = !1) { let r = e.children, i = t.children; if (d(r) && d(i)) for (let e = 0; e < r.length; e++) { let t = r[e], a = i[e]; - a.shapeFlag & 1 && !a.dynamicChildren && ((a.patchFlag <= 0 || a.patchFlag === 32) && (a = i[e] = Hi(i[e]), a.el = t.el), !n && a.patchFlag !== -2 && hi(t, a)), a.type === Si && (a.patchFlag === -1 && (a = i[e] = Hi(a)), a.el = t.el), a.type === Ci && !a.el && (a.el = t.el); + a.shapeFlag & 1 && !a.dynamicChildren && ((a.patchFlag <= 0 || a.patchFlag === 32) && (a = i[e] = Hi(i[e]), a.el = t.el), !n && a.patchFlag !== -2 && gi(t, a)), a.type === Ci && (a.patchFlag === -1 && (a = i[e] = Hi(a)), a.el = t.el), a.type === wi && !a.el && (a.el = t.el); } } -function gi(e) { +function _i(e) { let t = e.slice(), n = [0], r, i, a, o, s, c = e.length; for (r = 0; r < c; r++) { let c = e[r]; @@ -2121,35 +2121,35 @@ function gi(e) { for (a = n.length, o = n[a - 1]; a-- > 0;) n[a] = o, o = t[o]; return n; } -function _i(e) { +function vi(e) { let t = e.subTree.component; - if (t) return t.asyncDep && !t.asyncResolved ? t : _i(t); + if (t) return t.asyncDep && !t.asyncResolved ? t : vi(t); } -function vi(e) { +function yi(e) { if (e) for (let t = 0; t < e.length; t++) e[t].flags |= 8; } -function yi(e) { +function bi(e) { if (e.placeholder) return e.placeholder; let t = e.component; - return t ? yi(t.subTree) : null; + return t ? bi(t.subTree) : null; } -var bi = (e) => e.__isSuspense; -function xi(e, t) { - t && t.pendingBranch ? d(e) ? t.effects.push(...e) : t.effects.push(e) : _n(e); +var xi = (e) => e.__isSuspense; +function Si(e, t) { + t && t.pendingBranch ? d(e) ? t.effects.push(...e) : t.effects.push(e) : vn(e); } -var U = /* @__PURE__ */ Symbol.for("v-fgt"), Si = /* @__PURE__ */ Symbol.for("v-txt"), Ci = /* @__PURE__ */ Symbol.for("v-cmt"), wi = /* @__PURE__ */ Symbol.for("v-stc"), Ti = [], Ei = null; +var H = /* @__PURE__ */ Symbol.for("v-fgt"), Ci = /* @__PURE__ */ Symbol.for("v-txt"), wi = /* @__PURE__ */ Symbol.for("v-cmt"), Ti = /* @__PURE__ */ Symbol.for("v-stc"), Ei = [], U = null; function W(e = !1) { - Ti.push(Ei = e ? null : []); + Ei.push(U = e ? null : []); } function Di() { - Ti.pop(), Ei = Ti[Ti.length - 1] || null; + Ei.pop(), U = Ei[Ei.length - 1] || null; } var Oi = 1; function ki(e, t = !1) { - Oi += e, e < 0 && Ei && t && (Ei.hasOnce = !0); + Oi += e, e < 0 && U && t && (U.hasOnce = !0); } function Ai(e) { - return e.dynamicChildren = Oi > 0 ? Ei || n : null, Di(), Oi > 0 && Ei && Ei.push(e), e; + return e.dynamicChildren = Oi > 0 ? U || n : null, Di(), Oi > 0 && U && U.push(e), e; } function G(e, t, n, r, i, a) { return Ai(K(e, t, n, r, i, a, !0)); @@ -2163,13 +2163,13 @@ function Mi(e) { function Ni(e, t) { return e.type === t.type && e.key === t.key; } -var Pi = ({ key: e }) => e ?? null, Fi = ({ ref: e, ref_key: t, ref_for: n }) => (typeof e == "number" && (e = "" + e), e == null ? null : g(e) || /* @__PURE__ */ I(e) || h(e) ? { - i: Sn, +var Pi = ({ key: e }) => e ?? null, Fi = ({ ref: e, ref_key: t, ref_for: n }) => (typeof e == "number" && (e = "" + e), e == null ? null : g(e) || /* @__PURE__ */ F(e) || h(e) ? { + i: Cn, r: e, k: t, f: !!n } : e); -function K(e, t = null, n = null, r = 0, i = null, a = e === U ? 0 : 1, o = !1, s = !1) { +function K(e, t = null, n = null, r = 0, i = null, a = e === H ? 0 : 1, o = !1, s = !1) { let c = { __v_isVNode: !0, __v_skip: !0, @@ -2177,7 +2177,7 @@ function K(e, t = null, n = null, r = 0, i = null, a = e === U ? 0 : 1, o = !1, props: t, key: t && Pi(t), ref: t && Fi(t), - scopeId: Cn, + scopeId: wn, slotScopeIds: null, children: n, component: null, @@ -2197,26 +2197,26 @@ function K(e, t = null, n = null, r = 0, i = null, a = e === U ? 0 : 1, o = !1, dynamicProps: i, dynamicChildren: null, appContext: null, - ctx: Sn + ctx: Cn }; - return s ? (Ui(c, n), a & 128 && e.normalize(c)) : n && (c.shapeFlag |= g(n) ? 8 : 16), Oi > 0 && !o && Ei && (c.patchFlag > 0 || a & 6) && c.patchFlag !== 32 && Ei.push(c), c; + return s ? (Ui(c, n), a & 128 && e.normalize(c)) : n && (c.shapeFlag |= g(n) ? 8 : 16), Oi > 0 && !o && U && (c.patchFlag > 0 || a & 6) && c.patchFlag !== 32 && U.push(c), c; } var Ii = Li; function Li(e, t = null, n = null, r = 0, i = null, a = !1) { - if ((!e || e === lr) && (e = Ci), Mi(e)) { + if ((!e || e === dr) && (e = wi), Mi(e)) { let r = zi(e, t, !0); - return n && Ui(r, n), Oi > 0 && !a && Ei && (r.shapeFlag & 6 ? Ei[Ei.indexOf(e)] = r : Ei.push(r)), r.patchFlag = -2, r; + return n && Ui(r, n), Oi > 0 && !a && U && (r.shapeFlag & 6 ? U[U.indexOf(e)] = r : U.push(r)), r.patchFlag = -2, r; } if (da(e) && (e = e.__vccOpts), t) { t = Ri(t); let { class: e, style: n } = t; - e && !g(e) && (t.class = A(e)), v(n) && (/* @__PURE__ */ Bt(n) && !d(n) && (n = s({}, n)), t.style = ue(n)); + e && !g(e) && (t.class = k(e)), v(n) && (/* @__PURE__ */ Vt(n) && !d(n) && (n = s({}, n)), t.style = de(n)); } - let o = g(e) ? 1 : bi(e) ? 128 : In(e) ? 64 : v(e) ? 4 : h(e) ? 2 : 0; + let o = g(e) ? 1 : xi(e) ? 128 : Rn(e) ? 64 : v(e) ? 4 : h(e) ? 2 : 0; return K(e, t, n, r, i, o, a, !0); } function Ri(e) { - return e ? /* @__PURE__ */ Bt(e) || Jr(e) ? s({}, e) : e : null; + return e ? /* @__PURE__ */ Vt(e) || Yr(e) ? s({}, e) : e : null; } function zi(e, t, n = !1, r = !1) { let { props: i, ref: a, patchFlag: o, children: s, transition: c } = e, l = t ? Wi(i || {}, t) : i, u = { @@ -2234,7 +2234,7 @@ function zi(e, t, n = !1, r = !1) { targetAnchor: e.targetAnchor, staticCount: e.staticCount, shapeFlag: e.shapeFlag, - patchFlag: t && e.type !== U ? o === -1 ? 16 : o | 16 : o, + patchFlag: t && e.type !== H ? o === -1 ? 16 : o | 16 : o, dynamicProps: e.dynamicProps, dynamicChildren: e.dynamicChildren, appContext: e.appContext, @@ -2250,20 +2250,20 @@ function zi(e, t, n = !1, r = !1) { ctx: e.ctx, ce: e.ce }; - return c && r && Rn(u, c.clone(u)), u; + return c && r && Bn(u, c.clone(u)), u; } function q(e = " ", t = 0) { - return Ii(Si, null, e, t); + return Ii(Ci, null, e, t); } function Bi(e, t) { - let n = Ii(wi, null, e); + let n = Ii(Ti, null, e); return n.staticCount = t, n; } function J(e = "", t = !1) { - return t ? (W(), ji(Ci, null, e)) : Ii(Ci, null, e); + return t ? (W(), ji(wi, null, e)) : Ii(wi, null, e); } function Vi(e) { - return e == null || typeof e == "boolean" ? Ii(Ci) : d(e) ? Ii(U, null, e.slice()) : Mi(e) ? Hi(e) : Ii(Si, null, String(e)); + return e == null || typeof e == "boolean" ? Ii(wi) : d(e) ? Ii(H, null, e.slice()) : Mi(e) ? Hi(e) : Ii(Ci, null, String(e)); } function Hi(e) { return e.el === null && e.patchFlag !== -1 || e.memo ? e : zi(e); @@ -2279,11 +2279,11 @@ function Ui(e, t) { } else { n = 32; let r = t._; - !r && !Jr(t) ? t._ctx = Sn : r === 3 && Sn && (Sn.slots._ === 1 ? t._ = 1 : (t._ = 2, e.patchFlag |= 1024)); + !r && !Yr(t) ? t._ctx = Cn : r === 3 && Cn && (Cn.slots._ === 1 ? t._ = 1 : (t._ = 2, e.patchFlag |= 1024)); } else h(t) ? (t = { default: t, - _ctx: Sn + _ctx: Cn }, n = 32) : (t = String(t), r & 64 ? (n = 16, t = [q(t)]) : n = 8); e.children = t, e.shapeFlag |= n; } @@ -2291,8 +2291,8 @@ function Wi(...e) { let t = {}; for (let n = 0; n < e.length; n++) { let r = e[n]; - for (let e in r) if (e === "class") t.class !== r.class && (t.class = A([t.class, r.class])); - else if (e === "style") t.style = ue([t.style, r.style]); + for (let e in r) if (e === "class") t.class !== r.class && (t.class = k([t.class, r.class])); + else if (e === "style") t.style = de([t.style, r.style]); else if (a(e)) { let n = t[e], i = r[e]; i && n !== i && !(d(n) && n.includes(i)) ? t[e] = n ? [].concat(n, i) : i : i == null && n == null && !o(e) && (t[e] = i); @@ -2301,9 +2301,9 @@ function Wi(...e) { return t; } function Gi(e, t, n, r = null) { - rn(e, t, 7, [n, r]); + an(e, t, 7, [n, r]); } -var Ki = Ar(), qi = 0; +var Ki = jr(), qi = 0; function Ji(e, n, r) { let i = e.type, a = (n ? n.appContext : e.appContext) || Ki, o = { uid: qi++, @@ -2317,7 +2317,7 @@ function Ji(e, n, r) { effect: null, update: null, job: null, - scope: new Ce(!0), + scope: new we(!0), render: null, proxy: null, exposed: null, @@ -2333,8 +2333,8 @@ function Ji(e, n, r) { renderCache: [], components: null, directives: null, - propsOptions: ei(i, a), - emitsOptions: Lr(i, a), + propsOptions: ti(i, a), + emitsOptions: Rr(i, a), emit: null, emitted: null, propsDefaults: t, @@ -2369,11 +2369,11 @@ function Ji(e, n, r) { ec: null, sp: null }; - return o.ctx = { _: o }, o.root = n ? n.root : o, o.emit = Fr.bind(null, o), e.ce && e.ce(o), o; + return o.ctx = { _: o }, o.root = n ? n.root : o, o.emit = Ir.bind(null, o), e.ce && e.ce(o), o; } -var Y = null, Yi = () => Y || Sn, Xi, Zi; +var Y = null, Yi = () => Y || Cn, Xi, Zi; { - let e = le(), t = (t, n) => { + let e = ue(), t = (t, n) => { let r; return (r = e[t]) || (r = e[t] = []), r.push(n), (e) => { r.length > 1 ? r.forEach((t) => t(e)) : r[0](e); @@ -2396,36 +2396,36 @@ var ta = !1; function na(e, t = !1, n = !1) { t && Zi(t); let { props: r, children: i } = e.vnode, a = ea(e); - Yr(e, r, a, t), ci(e, i, n || t); + Xr(e, r, a, t), li(e, i, n || t); let o = a ? ra(e, t) : void 0; return t && Zi(!1), o; } function ra(e, t) { let n = e.type; - e.accessCache = /* @__PURE__ */ Object.create(null), e.proxy = new Proxy(e.ctx, mr); + e.accessCache = /* @__PURE__ */ Object.create(null), e.proxy = new Proxy(e.ctx, hr); let { setup: r } = n; if (r) { - Ve(); - let n = e.setupContext = r.length > 1 ? la(e) : null, i = Qi(e), a = nn(r, e, 0, [e.props, n]), o = y(a); - if (He(), i(), (o || e.sp) && !Gn(e) && Bn(e), o) { + He(); + let n = e.setupContext = r.length > 1 ? la(e) : null, i = Qi(e), a = rn(r, e, 0, [e.props, n]), o = y(a); + if (Ue(), i(), (o || e.sp) && !qn(e) && Hn(e), o) { if (a.then($i, $i), t) return a.then((n) => { ia(e, n, t); }).catch((t) => { - an(t, e, 0); + on(t, e, 0); }); e.asyncDep = a; } else ia(e, a, t); } else sa(e, t); } function ia(e, t, n) { - h(t) ? e.type.__ssrInlineRender ? e.ssrRender = t : e.render = t : v(t) && (e.setupState = qt(t)), sa(e, n); + h(t) ? e.type.__ssrInlineRender ? e.ssrRender = t : e.render = t : v(t) && (e.setupState = Jt(t)), sa(e, n); } var aa, oa; function sa(e, t, n) { let i = e.type; if (!e.render) { if (!t && aa && !i.render) { - let t = i.template || xr(e).template; + let t = i.template || Sr(e).template; if (t) { let { isCustomElement: n, compilerOptions: r } = e.appContext.config, { delimiters: a, compilerOptions: o } = i; i.render = aa(t, s(s({ @@ -2438,16 +2438,16 @@ function sa(e, t, n) { } { let t = Qi(e); - Ve(); + He(); try { - _r(e); + vr(e); } finally { - He(), t(); + Ue(), t(); } } } var ca = { get(e, t) { - return P(e, "get", ""), e[t]; + return N(e, "get", ""), e[t]; } }; function la(e) { return { @@ -2460,20 +2460,20 @@ function la(e) { }; } function ua(e) { - return e.exposed ? e.exposeProxy ||= new Proxy(qt(Vt(e.exposed)), { + return e.exposed ? e.exposeProxy ||= new Proxy(Jt(Ht(e.exposed)), { get(t, n) { if (n in t) return t[n]; - if (n in fr) return fr[n](e); + if (n in pr) return pr[n](e); }, has(e, t) { - return t in e || t in fr; + return t in e || t in pr; } }) : e.proxy; } function da(e) { return h(e) && "__vccOpts" in e; } -var X = (e, t) => /* @__PURE__ */ Yt(e, t, ta), fa = "3.5.34", pa = void 0, ma = typeof window < "u" && window.trustedTypes; +var X = (e, t) => /* @__PURE__ */ Xt(e, t, ta), fa = "3.5.34", pa = void 0, ma = typeof window < "u" && window.trustedTypes; if (ma) try { pa = /* @__PURE__ */ ma.createPolicy("vue", { createHTML: (e) => e }); } catch {} @@ -2551,7 +2551,7 @@ function ka(e, t, n) { else if (n ??= "", t.startsWith("--")) e.setProperty(t, n); else { let r = Ma(e, t); - Oa.test(n) ? e.setProperty(D(r), n.replace(Oa, ""), "important") : e[r] = n; + Oa.test(n) ? e.setProperty(E(r), n.replace(Oa, ""), "important") : e[r] = n; } } var Aa = [ @@ -2562,9 +2562,9 @@ var Aa = [ function Ma(e, t) { let n = ja[t]; if (n) return n; - let r = E(t); + let r = T(t); if (r !== "filter" && r in e) return ja[t] = r; - r = re(r); + r = ie(r); for (let n = 0; n < Aa.length; n++) { let i = Aa[n] + r; if (i in e) return ja[t] = i; @@ -2575,8 +2575,8 @@ function Na(e, t, n, r) { return e.tagName === "TEXTAREA" && (t === "width" || t === "height") && g(r) && n === r; } var Pa = "http://www.w3.org/1999/xlink"; -function Fa(e, t, n, r, i, a = ge(t)) { - r && t.startsWith("xlink:") ? n == null ? e.removeAttributeNS(Pa, t.slice(6, t.length)) : e.setAttributeNS(Pa, t, n) : n == null || a && !_e(n) ? e.removeAttribute(t) : e.setAttribute(t, a ? "" : _(n) ? String(n) : n); +function Fa(e, t, n, r, i, a = _e(t)) { + r && t.startsWith("xlink:") ? n == null ? e.removeAttributeNS(Pa, t.slice(6, t.length)) : e.setAttributeNS(Pa, t, n) : n == null || a && !ve(n) ? e.removeAttribute(t) : e.setAttribute(t, a ? "" : _(n) ? String(n) : n); } function Ia(e, t, n, r, i) { if (t === "innerHTML" || t === "textContent") { @@ -2592,7 +2592,7 @@ function Ia(e, t, n, r, i) { let o = !1; if (n === "" || n == null) { let r = typeof e[t]; - r === "boolean" ? n = _e(n) : n == null && r === "string" ? (n = "", o = !0) : r === "number" && (n = 0, o = !0); + r === "boolean" ? n = ve(n) : n == null && r === "string" ? (n = "", o = !0) : r === "number" && (n = 0, o = !0); } try { e[t] = n; @@ -2622,14 +2622,14 @@ function Ha(e) { let n; for (; n = e.match(Va);) e = e.slice(0, e.length - n[0].length), t[n[0].toLowerCase()] = !0; } - return [e[2] === ":" ? e.slice(3) : D(e.slice(2)), t]; + return [e[2] === ":" ? e.slice(3) : E(e.slice(2)), t]; } var Ua = 0, Wa = /* @__PURE__ */ Promise.resolve(), Ga = () => Ua ||= (Wa.then(() => Ua = 0), Date.now()); function Ka(e, t) { let n = (e) => { if (!e._vts) e._vts = Date.now(); else if (e._vts <= n.attached) return; - rn(qa(e, n.value), t, 5, [e]); + an(qa(e, n.value), t, 5, [e]); }; return n.value = e, n.attached = Ga(), n; } @@ -2643,7 +2643,7 @@ function qa(e, t) { } var Ja = (e) => e.charCodeAt(0) === 111 && e.charCodeAt(1) === 110 && e.charCodeAt(2) > 96 && e.charCodeAt(2) < 123, Ya = (e, t, n, r, i, s) => { let c = i === "svg"; - t === "class" ? Sa(e, r, c) : t === "style" ? Da(e, n, r) : a(t) ? o(t) || Ba(e, t, n, r, s) : (t[0] === "." ? (t = t.slice(1), !0) : t[0] === "^" ? (t = t.slice(1), !1) : Xa(e, t, r, c)) ? (Ia(e, t, r), !e.tagName.includes("-") && (t === "value" || t === "checked" || t === "selected") && Fa(e, t, r, c, s, t !== "value")) : e._isVueCE && (Za(e, t) || e._def.__asyncLoader && (/[A-Z]/.test(t) || !g(r))) ? Ia(e, E(t), r, s, t) : (t === "true-value" ? e._trueValue = r : t === "false-value" && (e._falseValue = r), Fa(e, t, r, c)); + t === "class" ? Sa(e, r, c) : t === "style" ? Da(e, n, r) : a(t) ? o(t) || Ba(e, t, n, r, s) : (t[0] === "." ? (t = t.slice(1), !0) : t[0] === "^" ? (t = t.slice(1), !1) : Xa(e, t, r, c)) ? (Ia(e, t, r), !e.tagName.includes("-") && (t === "value" || t === "checked" || t === "selected") && Fa(e, t, r, c, s, t !== "value")) : e._isVueCE && (Za(e, t) || e._def.__asyncLoader && (/[A-Z]/.test(t) || !g(r))) ? Ia(e, T(t), r, s, t) : (t === "true-value" ? e._trueValue = r : t === "false-value" && (e._falseValue = r), Fa(e, t, r, c)); }; function Xa(e, t, n, r) { if (r) return !!(t === "innerHTML" || t === "textContent" || t in e && Ja(t) && h(n)); @@ -2657,13 +2657,13 @@ function Xa(e, t, n, r) { function Za(e, t) { let n = e._def.props; if (!n) return !1; - let r = E(t); - return Array.isArray(n) ? n.some((e) => E(e) === r) : Object.keys(n).some((e) => E(e) === r); + let r = T(t); + return Array.isArray(n) ? n.some((e) => T(e) === r) : Object.keys(n).some((e) => T(e) === r); } var Qa = {}; /* @__NO_SIDE_EFFECTS__ */ function $a(e, t, n) { - let r = /* @__PURE__ */ zn(e, t); + let r = /* @__PURE__ */ Vn(e, t); C(r) && (r = s({}, r, t)); class i extends to { constructor(e) { @@ -2695,7 +2695,7 @@ var eo = typeof HTMLElement < "u" ? HTMLElement : class {}, to = class e extends e && this._app && Object.setPrototypeOf(this._app._context.provides, e._instance.provides); } disconnectedCallback() { - this._connected = !1, pn(() => { + this._connected = !1, mn(() => { this._connected || (this._ob &&= (this._ob.disconnect(), null), this._app && this._app.unmount(), this._instance && (this._instance.ce = void 0), this._app = this._instance = null, this._teleportTargets &&= (this._teleportTargets.clear(), void 0)); }); } @@ -2711,7 +2711,7 @@ var eo = typeof HTMLElement < "u" ? HTMLElement : class {}, to = class e extends let { props: n, styles: r } = e, i; if (n && !d(n)) for (let e in n) { let t = n[e]; - (t === Number || t && t.type === Number) && (e in this._props && (this._props[e] = se(this._props[e])), (i ||= /* @__PURE__ */ Object.create(null))[E(e)] = !0); + (t === Number || t && t.type === Number) && (e in this._props && (this._props[e] = ce(this._props[e])), (i ||= /* @__PURE__ */ Object.create(null))[T(e)] = !0); } this._numberProps = i, this._resolveProps(e), this.shadowRoot && this._applyStyles(r), this._mount(e); }, t = this._def.__asyncLoader; @@ -2722,12 +2722,12 @@ var eo = typeof HTMLElement < "u" ? HTMLElement : class {}, to = class e extends _mount(e) { this._app = this._createApp(e), this._inheritParentContext(), e.configureApp && e.configureApp(this._app), this._app._ceVNode = this._createVNode(), this._app.mount(this._root); let t = this._instance && this._instance.exposed; - if (t) for (let e in t) u(this, e) || Object.defineProperty(this, e, { get: () => R(t[e]) }); + if (t) for (let e in t) u(this, e) || Object.defineProperty(this, e, { get: () => L(t[e]) }); } _resolveProps(e) { let { props: t } = e, n = d(t) ? t : Object.keys(t || {}); for (let e of Object.keys(this)) e[0] !== "_" && n.includes(e) && this._setProp(e, this[e]); - for (let e of n.map(E)) Object.defineProperty(this, e, { + for (let e of n.map(T)) Object.defineProperty(this, e, { get() { return this._getProp(e); }, @@ -2738,8 +2738,8 @@ var eo = typeof HTMLElement < "u" ? HTMLElement : class {}, to = class e extends } _setAttr(e) { if (e.startsWith("data-v-")) return; - let t = this.hasAttribute(e), n = t ? this.getAttribute(e) : Qa, r = E(e); - t && this._numberProps && this._numberProps[r] && (n = se(n)), this._setProp(r, n, !1, !0); + let t = this.hasAttribute(e), n = t ? this.getAttribute(e) : Qa, r = T(e); + t && this._numberProps && this._numberProps[r] && (n = ce(n)), this._setProp(r, n, !1, !0); } _getProp(e) { return this._props[e]; @@ -2747,7 +2747,7 @@ var eo = typeof HTMLElement < "u" ? HTMLElement : class {}, to = class e extends _setProp(e, t, n = !0, r = !1) { if (t !== this._props[e] && (this._dirty = !0, t === Qa ? delete this._props[e] : (this._props[e] = t, e === "key" && this._app && (this._app._ceVNode.key = t)), r && this._instance && this._update(), n)) { let n = this._ob; - n && (this._processMutations(n.takeRecords()), n.disconnect()), t === !0 ? this.setAttribute(D(e), "") : typeof t == "string" || typeof t == "number" ? this.setAttribute(D(e), t + "") : t || this.removeAttribute(D(e)), n && n.observe(this, { attributes: !0 }); + n && (this._processMutations(n.takeRecords()), n.disconnect()), t === !0 ? this.setAttribute(E(e), "") : typeof t == "string" || typeof t == "number" ? this.setAttribute(E(e), t + "") : t || this.removeAttribute(E(e)), n && n.observe(this, { attributes: !0 }); } } _update() { @@ -2764,7 +2764,7 @@ var eo = typeof HTMLElement < "u" ? HTMLElement : class {}, to = class e extends this.dispatchEvent(new CustomEvent(e, C(t[0]) ? s({ detail: t }, t[0]) : { detail: t })); }; e.emit = (e, ...n) => { - t(e, n), D(e) !== e && t(D(e), n); + t(e, n), E(e) !== e && t(E(e), n); }, this._setParent(); }), t; } @@ -2841,7 +2841,7 @@ var eo = typeof HTMLElement < "u" ? HTMLElement : class {}, to = class e extends _removeChildStyle(e) {} }, no = (e) => { let t = e.props["onUpdate:modelValue"] || !1; - return d(t) ? (e) => ae(t, e) : t; + return d(t) ? (e) => oe(t, e) : t; }; function ro(e) { e.target.composing = !0; @@ -2852,7 +2852,7 @@ function io(e) { } var ao = /* @__PURE__ */ Symbol("_assign"); function oo(e, t, n) { - return t && (e = e.trim()), n && (e = oe(e)), e; + return t && (e = e.trim()), n && (e = se(e)), e; } var so = { created(e, { modifiers: { lazy: t, trim: n, number: r } }, i) { @@ -2869,7 +2869,7 @@ var so = { }, beforeUpdate(e, { value: t, oldValue: n, modifiers: { lazy: r, trim: i, number: a } }, o) { if (e[ao] = no(o), e.composing) return; - let s = (a || e.type === "number") && !/^0\d/.test(e.value) ? oe(e.value) : e.value, c = t ?? ""; + let s = (a || e.type === "number") && !/^0\d/.test(e.value) ? se(e.value) : e.value, c = t ?? ""; if (s === c) return; let l = e.getRootNode(); (l instanceof Document || l instanceof ShadowRoot) && l.activeElement === e && e.type !== "range" && (r && t === n || i && e.value.trim() === c) || (e.value = c); @@ -2913,12 +2913,12 @@ var so = { let n = e._withKeys ||= {}, r = t.join("."); return n[r] || (n[r] = ((n) => { if (!("key" in n)) return; - let r = D(n.key); + let r = E(n.key); if (t.some((e) => e === r || fo[e] === r)) return e(n); })); }, mo = /* @__PURE__ */ s({ patchProp: Ya }, ba), ho; function go() { - return ho ||= ui(mo); + return ho ||= di(mo); } var _o = ((...e) => { go().render(...e); @@ -2942,17 +2942,23 @@ function bo(e) { } //#endregion //#region packages/sdk-core/src/session.ts -var xo, So; +var xo = "__comtryaSessionState", So = "__comtryaOperatorCode"; async function Co(e = {}) { - return xo && xo.expiresAtMs > Date.now() + 5e3 ? xo.token : (So ||= To(e).finally(() => { - So = void 0; - }), So); + let t = Eo(); + if (t.current && t.current.expiresAtMs > Date.now() + 5e3) return t.current.token; + if (!t.inflight) { + let n = To(e).finally(() => { + Eo().inflight === n && (Eo().inflight = void 0); + }); + t.inflight = n; + } + return t.inflight; } function wo() { - xo = void 0; + Eo().current = void 0; } async function To(e) { - let t = e.operatorCode ?? Eo(), n = e.fetchImpl ?? fetch, r = e.baseUrl ?? ""; + let t = e.operatorCode ?? Do(), n = e.fetchImpl ?? fetch, r = e.baseUrl ?? ""; if (!t) return; let i = await n(`${r}/auth/token-exchange`, { method: "POST", @@ -2974,28 +2980,38 @@ async function To(e) { if (!i.ok) throw Error(`token-exchange failed (${i.status}): ${await i.text()}`); let a = await i.json(); if (!a.accessToken) throw Error("token-exchange response missing accessToken"); - let o = (a.expiresIn ?? 1800) * 1e3; - return xo = { + let o = (a.expiresIn ?? 1800) * 1e3, s = { token: a.accessToken, expiresAtMs: Date.now() + o - }, xo.token; + }; + return Eo().current = s, s.token; } function Eo() { + let e = Oo(); + return e[xo] ??= {}, e[xo]; +} +function Do() { + let e = Oo()[So]; + if (e) return e; try { - return { + let e = { BASE_URL: "/", DEV: !1, MODE: "production", PROD: !0, SSR: !1 }?.PUBLIC_COMTRYA_OPERATOR_CODE; + return e && (Oo()[So] = e), e; } catch { return; } } +function Oo() { + return globalThis; +} //#endregion //#region packages/sdk-core/src/runtime.ts -async function Do(e, t, n, r, i = {}) { +async function ko(e, t, n, r, i = {}) { let a = `${i.baseUrl ?? ""}/api/ops/${encodeURIComponent(e)}/${encodeURIComponent(t)}/${encodeURIComponent(n)}`, o = { "content-type": "application/json" }, s = i.token ?? await Co(); s && (o.authorization = `Bearer ${s}`); try { @@ -3015,11 +3031,11 @@ async function Do(e, t, n, r, i = {}) { } catch { n = void 0; } - let r = ko(e.status), i = typeof n?.message == "string" ? n.message : void 0; + let r = jo(e.status), i = typeof n?.message == "string" ? n.message : void 0; return { ok: !1, error: { - code: Oo(n?.code) ?? r, + code: Ao(n?.code) ?? r, message: i ?? (t || e.statusText), path: n?.path } @@ -3039,7 +3055,7 @@ async function Do(e, t, n, r, i = {}) { }; } } -function Oo(e) { +function Ao(e) { switch (e) { case "not-found": case "conflict": @@ -3051,7 +3067,7 @@ function Oo(e) { default: return; } } -function ko(e) { +function jo(e) { switch (e) { case 400: return "bad-input"; case 401: return "unauthenticated"; @@ -3064,17 +3080,17 @@ function ko(e) { } //#endregion //#region packages/sdk-core/src/graphql-client.ts -var Ao = { +var Mo = { endpoint: "/graphql", credentials: "include", fetchImpl: typeof fetch < "u" ? fetch.bind(globalThis) : (() => { throw Error("no fetch implementation available"); }) -}, jo; -function Mo() { - return jo ||= No(Ao), jo; +}, No; +function Po() { + return No ||= Fo(Mo), No; } -function No(e) { +function Fo(e) { let t = async (t, n) => { let r = await Co(), i = { "Content-Type": "application/json" }; r && (i.Authorization = `Bearer ${r}`); @@ -3105,7 +3121,7 @@ function No(e) { } //#endregion //#region packages/sdk-core/src/route-registry.ts -function Po(e, t = "/") { +function Io(e, t = "/") { if (!e || e.length === 0) throw Error("buildExtensionUrl requires a non-empty routePrefix"); if (e.includes("/")) throw Error(`routePrefix "${e}" must be a single path segment under /x/`); let n = t.startsWith("/") ? t : `/${t}`, r = n.length; @@ -3114,45 +3130,45 @@ function Po(e, t = "/") { } //#endregion //#region packages/sdk-core/src/live-events.ts -function Fo(e) { +function Lo(e) { let t = e.baseUrl ?? "", n = new AbortController(); - return Io(t, e, n.signal), () => n.abort(); + return Ro(t, e, n.signal), () => n.abort(); } -async function Io(e, t, n) { +async function Ro(e, t, n) { try { - let r = await Lo(e, n, t.token), i = `${e}/events?session=${encodeURIComponent(r)}`, a = await fetch(i, { + let r = await zo(e, n, t.token), i = `${e}/events?session=${encodeURIComponent(r)}`, a = await fetch(i, { credentials: "include", - headers: Ro(t.token, { Accept: "text/event-stream" }), + headers: Bo(t.token, { Accept: "text/event-stream" }), signal: n }); if (!a.ok) throw Error(`event stream failed: HTTP ${a.status}`); - await zo(a, t, n); + await Vo(a, t, n); } catch (e) { if (n.aborted) return; t.onError?.(e instanceof Error ? e : Error(String(e))); } } -async function Lo(e, t, n) { +async function zo(e, t, n) { let r = await fetch(`${e}/events/session`, { method: "POST", credentials: "include", - headers: Ro(n, { "Content-Type": "application/json" }), + headers: Bo(n, { "Content-Type": "application/json" }), body: "{}", signal: t }), i = await r.json(); if (!r.ok || !i.session) throw Error(i.errors?.[0]?.message ?? "event stream session failed"); return i.session; } -function Ro(e, t) { +function Bo(e, t) { return e ? { ...t, Authorization: `Bearer ${e}` } : t; } -async function zo(e, t, n) { +async function Vo(e, t, n) { let r = e.body?.getReader(); if (!r) { - Bo(await e.text(), t); + Ho(await e.text(), t); return; } let i = new TextDecoder(), a = ""; @@ -3162,112 +3178,115 @@ async function zo(e, t, n) { a += i.decode(e.value, { stream: !0 }); let n = a.split("\n\n"); a = n.pop() ?? ""; - for (let e of n) Vo(e, t); + for (let e of n) Uo(e, t); } - a += i.decode(), Bo(a, t); + a += i.decode(), Ho(a, t); } -function Bo(e, t) { - for (let n of e.split("\n\n")) Vo(n, t); +function Ho(e, t) { + for (let n of e.split("\n\n")) Uo(n, t); } -function Vo(e, t) { +function Uo(e, t) { let n = e.split("\n"), r = n.find((e) => e.startsWith("event: "))?.slice(7), i = n.filter((e) => e.startsWith("data: ")).map((e) => e.slice(6)).join("\n"); if (i) try { - let e = Ho(JSON.parse(i), r); + let e = Wo(JSON.parse(i), r); if (t.type && e.eventType !== t.type || t.source && e.emitterExtension !== t.source && e.sourceUri !== t.source) return; t.onEvent(e); } catch {} } -function Ho(e, t) { - let n = Uo(e) ? e : {}, r = Uo(n.data) ? n.data : {}, i = Wo(r.eventType) ?? Wo(n.type) ?? t ?? ""; +function Wo(e, t) { + let n = Go(e) ? e : {}, r = Go(n.data) ? n.data : {}, i = Ko(r.eventType) ?? Ko(n.type) ?? t ?? ""; return { - id: Wo(r.id) ?? Wo(n.id) ?? "", + id: Ko(r.id) ?? Ko(n.id) ?? "", eventType: i, - payloadB64: Wo(r.payloadB64) ?? "", - timestampMs: Go(r.timestampMs) ?? Ko(Go(n.time)) ?? Date.now(), - sourceUri: Wo(r.sourceUri) ?? Wo(n.source) ?? "", - emitterExtension: Wo(r.emitterExtension) ?? Wo(r.extensionId) ?? Wo(n.source) ?? "", + payloadB64: Ko(r.payloadB64) ?? "", + timestampMs: qo(r.timestampMs) ?? Jo(qo(n.time)) ?? Date.now(), + sourceUri: Ko(r.sourceUri) ?? Ko(n.source) ?? "", + emitterExtension: Ko(r.emitterExtension) ?? Ko(r.extensionId) ?? Ko(n.source) ?? "", raw: e }; } -function Uo(e) { +function Go(e) { return typeof e == "object" && !!e; } -function Wo(e) { +function Ko(e) { return typeof e == "string" ? e : void 0; } -function Go(e) { +function qo(e) { return typeof e == "number" && Number.isFinite(e) ? e : void 0; } -function Ko(e) { +function Jo(e) { return e === void 0 ? void 0 : e * 1e3; } //#endregion //#region node_modules/.bun/tinykeys@3.0.0/node_modules/tinykeys/dist/tinykeys.module.js -var qo = [ +var Yo = [ "Shift", "Meta", "Alt", "Control" -], Jo = typeof navigator == "object" ? navigator.platform : "", Yo = /Mac|iPod|iPhone|iPad/.test(Jo), Xo = Yo ? "Meta" : "Control", Zo = Jo === "Win32" ? ["Control", "Alt"] : Yo ? ["Alt"] : []; -function Qo(e, t) { - return typeof e.getModifierState == "function" && (e.getModifierState(t) || Zo.includes(t) && e.getModifierState("AltGraph")); +], Xo = typeof navigator == "object" ? navigator.platform : "", Zo = /Mac|iPod|iPhone|iPad/.test(Xo), Qo = Zo ? "Meta" : "Control", $o = Xo === "Win32" ? ["Control", "Alt"] : Zo ? ["Alt"] : []; +function es(e, t) { + return typeof e.getModifierState == "function" && (e.getModifierState(t) || $o.includes(t) && e.getModifierState("AltGraph")); } -function $o(e) { +function ts(e) { return e.trim().split(" ").map(function(e) { var t = e.split(/\b\+/), n = t.pop(), r = n.match(/^\((.+)\)$/); return r && (n = RegExp("^" + r[1] + "$")), [t = t.map(function(e) { - return e === "$mod" ? Xo : e; + return e === "$mod" ? Qo : e; }), n]; }); } -function es(e, t) { +function ns(e, t) { var n = t[0], r = t[1]; return !((r instanceof RegExp ? !r.test(e.key) && !r.test(e.code) : r.toUpperCase() !== e.key.toUpperCase() && r !== e.code) || n.find(function(t) { - return !Qo(e, t); - }) || qo.find(function(t) { - return !n.includes(t) && r !== t && Qo(e, t); + return !es(e, t); + }) || Yo.find(function(t) { + return !n.includes(t) && r !== t && es(e, t); })); } -function ts(e, t) { +function rs(e, t) { t === void 0 && (t = {}); var n = t.timeout ?? 1e3, r = Object.keys(e).map(function(t) { - return [$o(t), e[t]]; + return [ts(t), e[t]]; }), i = /* @__PURE__ */ new Map(), a = null; return function(e) { e instanceof KeyboardEvent && (r.forEach(function(t) { var n = t[0], r = t[1], a = i.get(n) || n; - es(e, a[0]) ? a.length > 1 ? i.set(n, a.slice(1)) : (i.delete(n), r(e)) : Qo(e, e.key) || i.delete(n); + ns(e, a[0]) ? a.length > 1 ? i.set(n, a.slice(1)) : (i.delete(n), r(e)) : es(e, e.key) || i.delete(n); }), a && clearTimeout(a), a = setTimeout(i.clear.bind(i), n)); }; } -function ns(e, t, n) { - var r = n === void 0 ? {} : n, i = r.event, a = i === void 0 ? "keydown" : i, o = r.capture, s = ts(t, { timeout: r.timeout }); +function is(e, t, n) { + var r = n === void 0 ? {} : n, i = r.event, a = i === void 0 ? "keydown" : i, o = r.capture, s = rs(t, { timeout: r.timeout }); return e.addEventListener(a, s, o), function() { e.removeEventListener(a, s, o); }; } //#endregion //#region packages/sdk-core/src/command-palette.ts -var rs = /* @__PURE__ */ new Map(), is = /* @__PURE__ */ new Set(); -function as(e) { - rs.set(e.id, e); - for (let e of is) e(); +var as = /* @__PURE__ */ new Map(), os = /* @__PURE__ */ new Set(); +function ss(e) { + as.set(e.id, e); + for (let e of os) e(); return () => { - rs.delete(e.id); - for (let e of is) e(); + as.delete(e.id); + for (let e of os) e(); }; } //#endregion //#region packages/sdk-core/src/workspace-store.ts -var os = null, ss = []; -function cs() { - return os === null ? new Promise((e) => { - ss.push(e); - }) : Promise.resolve(os); +var cs = null, ls = []; +function us() { + return cs; +} +function ds() { + return cs === null ? new Promise((e) => { + ls.push(e); + }) : Promise.resolve(cs); } //#endregion //#region packages/sdk-vue/src/use-shortcuts.ts -function ls(e) { +function fs(e) { if (!(e instanceof HTMLElement)) return !1; if (e instanceof HTMLInputElement) { let t = e.type; @@ -3275,36 +3294,36 @@ function ls(e) { } return !!(e instanceof HTMLTextAreaElement || e.isContentEditable); } -function us(e) { +function ps(e) { return /Escape/i.test(e) ? !0 : /\$mod|Cmd|Ctrl|Alt|Shift|Meta|Control/i.test(e); } -function ds(e) { +function ms(e) { let t = {}; for (let [n, r] of Object.entries(e)) { - if (us(n)) { + if (ps(n)) { t[n] = r; continue; } t[n] = (e) => { - ls(e.target) || r(e); + fs(e.target) || r(e); }; } return t; } -function fs(e, t = {}) { +function hs(e, t = {}) { if (typeof window > "u") return; - let n = null, r = ds(e), i = () => { - n ||= ns(t.target ?? window, r); + let n = null, r = ms(e), i = () => { + n ||= is(t.target ?? window, r); }, a = () => { n?.(), n = null; }; - t.enabled ? B(t.enabled, (e) => { + t.enabled ? Nn(t.enabled, (e) => { e ? i() : a(); - }, { immediate: !0 }) : i(), ir(a); + }, { immediate: !0 }) : i(), or(a); } //#endregion //#region node_modules/.bun/marked@18.0.4/node_modules/marked/lib/marked.esm.js -function ps() { +function gs() { return { async: !1, breaks: !1, @@ -3318,12 +3337,12 @@ function ps() { walkTokens: null }; } -var ms = ps(); -function hs(e) { - ms = e; +var _s = gs(); +function vs(e) { + _s = e; } -var gs = { exec: () => null }; -function _s(e) { +var ys = { exec: () => null }; +function bs(e) { let t = []; return (n) => { let r = Math.max(0, Math.min(3, n - 1)), i = t[r]; @@ -3340,7 +3359,7 @@ function Z(e, t = "") { }; return r; } -var vs = ((e = "") => { +var xs = ((e = "") => { try { return !!RegExp("(?<=1)(? { notSpaceStart: /^\S*/, endingNewline: /\n$/, listItemRegex: (e) => RegExp(`^( {0,3}${e})((?:[ ][^\\n]*)?(?:\\n|$))`), - nextBulletRegex: _s((e) => RegExp(`^ {0,${e}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`)), - hrRegex: _s((e) => RegExp(`^ {0,${e}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`)), - fencesBeginRegex: _s((e) => RegExp(`^ {0,${e}}(?:\`\`\`|~~~)`)), - headingBeginRegex: _s((e) => RegExp(`^ {0,${e}}#`)), - htmlBeginRegex: _s((e) => RegExp(`^ {0,${e}}<(?:[a-z].*>|!--)`, "i")), - blockquoteBeginRegex: _s((e) => RegExp(`^ {0,${e}}>`)) -}, ys = /^(?:[ \t]*(?:\n|$))+/, bs = /^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/, xs = /^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/, Ss = /^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/, Cs = /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/, ws = / {0,3}(?:[*+-]|\d{1,9}[.)])/, Ts = /^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/, Es = Z(Ts).replace(/bull/g, ws).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/\|table/g, "").getRegex(), Ds = Z(Ts).replace(/bull/g, ws).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/table/g, / {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(), Os = /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/, ks = /^[^\n]+/, As = /(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/, js = Z(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label", As).replace("title", /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(), Ms = Z(/^(bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g, ws).getRegex(), Ns = "address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul", Ps = /|$))/, Fs = Z("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))", "i").replace("comment", Ps).replace("tag", Ns).replace("attribute", / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(), Is = Z(Os).replace("hr", Ss).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("|table", "").replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", Ns).getRegex(), Ls = { - blockquote: Z(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph", Is).getRegex(), - code: bs, - def: js, - fences: xs, - heading: Cs, - hr: Ss, - html: Fs, - lheading: Es, - list: Ms, - newline: ys, - paragraph: Is, - table: gs, - text: ks -}, Rs = Z("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr", Ss).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("blockquote", " {0,3}>").replace("code", "(?: {4}| {0,3} )[^\\n]").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", Ns).getRegex(), zs = { - ...Ls, - lheading: Ds, - table: Rs, - paragraph: Z(Os).replace("hr", Ss).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("table", Rs).replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", Ns).getRegex() -}, Bs = { - ...Ls, - html: Z("^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))").replace("comment", Ps).replace(/tag/g, "(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(), + nextBulletRegex: bs((e) => RegExp(`^ {0,${e}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`)), + hrRegex: bs((e) => RegExp(`^ {0,${e}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`)), + fencesBeginRegex: bs((e) => RegExp(`^ {0,${e}}(?:\`\`\`|~~~)`)), + headingBeginRegex: bs((e) => RegExp(`^ {0,${e}}#`)), + htmlBeginRegex: bs((e) => RegExp(`^ {0,${e}}<(?:[a-z].*>|!--)`, "i")), + blockquoteBeginRegex: bs((e) => RegExp(`^ {0,${e}}>`)) +}, Ss = /^(?:[ \t]*(?:\n|$))+/, Cs = /^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/, ws = /^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/, Ts = /^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/, Es = /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/, Ds = / {0,3}(?:[*+-]|\d{1,9}[.)])/, Os = /^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/, ks = Z(Os).replace(/bull/g, Ds).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/\|table/g, "").getRegex(), As = Z(Os).replace(/bull/g, Ds).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/table/g, / {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(), js = /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/, Ms = /^[^\n]+/, Ns = /(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/, Ps = Z(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label", Ns).replace("title", /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(), Fs = Z(/^(bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g, Ds).getRegex(), Is = "address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul", Ls = /|$))/, Rs = Z("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))", "i").replace("comment", Ls).replace("tag", Is).replace("attribute", / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(), zs = Z(js).replace("hr", Ts).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("|table", "").replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", Is).getRegex(), Bs = { + blockquote: Z(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph", zs).getRegex(), + code: Cs, + def: Ps, + fences: ws, + heading: Es, + hr: Ts, + html: Rs, + lheading: ks, + list: Fs, + newline: Ss, + paragraph: zs, + table: ys, + text: Ms +}, Vs = Z("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr", Ts).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("blockquote", " {0,3}>").replace("code", "(?: {4}| {0,3} )[^\\n]").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", Is).getRegex(), Hs = { + ...Bs, + lheading: As, + table: Vs, + paragraph: Z(js).replace("hr", Ts).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("table", Vs).replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", Is).getRegex() +}, Us = { + ...Bs, + html: Z("^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))").replace("comment", Ls).replace(/tag/g, "(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(), def: /^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/, heading: /^(#{1,6})(.*)(?:\n+|$)/, - fences: gs, + fences: ys, lheading: /^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/, - paragraph: Z(Os).replace("hr", Ss).replace("heading", " *#{1,6} *[^\n]").replace("lheading", Es).replace("|table", "").replace("blockquote", " {0,3}>").replace("|fences", "").replace("|list", "").replace("|html", "").replace("|tag", "").getRegex() -}, Vs = /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/, Hs = /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/, Us = /^( {2,}|\\)\n(?!\s*$)/, Ws = /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\`+)[^`]+\k(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace("precode-", vs ? "(?`+)[^`]+\k(?!`)/).replace("html", /<(?! )[^<>]*?>/).getRegex(), $s = /^(?:\*+(?:((?!\*)punct)|([^\s*]))?)|^_+(?:((?!_)punct)|([^\s_]))?/, ec = Z($s, "u").replace(/punct/g, Gs).getRegex(), tc = Z($s, "u").replace(/punct/g, Ys).getRegex(), nc = "^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)", rc = Z(nc, "gu").replace(/notPunctSpace/g, qs).replace(/punctSpace/g, Ks).replace(/punct/g, Gs).getRegex(), ic = Z(nc, "gu").replace(/notPunctSpace/g, Zs).replace(/punctSpace/g, Xs).replace(/punct/g, Ys).getRegex(), ac = Z("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)", "gu").replace(/notPunctSpace/g, qs).replace(/punctSpace/g, Ks).replace(/punct/g, Gs).getRegex(), oc = Z(/^~~?(?:((?!~)punct)|[^\s~])/, "u").replace(/punct/g, Gs).getRegex(), sc = Z("^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)", "gu").replace(/notPunctSpace/g, qs).replace(/punctSpace/g, Ks).replace(/punct/g, Gs).getRegex(), cc = Z(/\\(punct)/, "gu").replace(/punct/g, Gs).getRegex(), lc = Z(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme", /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email", /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(), uc = Z(Ps).replace("(?:-->|$)", "-->").getRegex(), dc = Z("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment", uc).replace("attribute", /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(), fc = /(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\])|[^\[\]\\`])*?/, pc = Z(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]+(?:\n[ \t]*)?|\n[ \t]*)(title))?\s*\)/).replace("label", fc).replace("href", /<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title", /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(), mc = Z(/^!?\[(label)\]\[(ref)\]/).replace("label", fc).replace("ref", As).getRegex(), hc = Z(/^!?\[(ref)\](?:\[\])?/).replace("ref", As).getRegex(), gc = Z("reflink|nolink(?!\\()", "g").replace("reflink", mc).replace("nolink", hc).getRegex(), _c = /[hH][tT][tT][pP][sS]?|[fF][tT][pP]/, vc = { - _backpedal: gs, - anyPunctuation: cc, - autolink: lc, - blockSkip: Qs, - br: Us, - code: Hs, - del: gs, - delLDelim: gs, - delRDelim: gs, - emStrongLDelim: ec, - emStrongRDelimAst: rc, - emStrongRDelimUnd: ac, - escape: Vs, - link: pc, - nolink: hc, - punctuation: Js, - reflink: mc, - reflinkSearch: gc, - tag: dc, - text: Ws, - url: gs -}, yc = { - ...vc, - link: Z(/^!?\[(label)\]\((.*?)\)/).replace("label", fc).getRegex(), - reflink: Z(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label", fc).getRegex() -}, bc = { - ...vc, - emStrongRDelimAst: ic, - emStrongLDelim: tc, - delLDelim: oc, - delRDelim: sc, - url: Z(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol", _c).replace("email", /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(), - _backpedal: /(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/, - del: /^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/, - text: Z(/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\").replace("|fences", "").replace("|list", "").replace("|html", "").replace("|tag", "").getRegex() +}, Ws = /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/, Gs = /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/, Ks = /^( {2,}|\\)\n(?!\s*$)/, qs = /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\`+)[^`]+\k(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace("precode-", xs ? "(?`+)[^`]+\k(?!`)/).replace("html", /<(?! )[^<>]*?>/).getRegex(), nc = /^(?:\*+(?:((?!\*)punct)|([^\s*]))?)|^_+(?:((?!_)punct)|([^\s_]))?/, rc = Z(nc, "u").replace(/punct/g, Js).getRegex(), ic = Z(nc, "u").replace(/punct/g, Qs).getRegex(), ac = "^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)", oc = Z(ac, "gu").replace(/notPunctSpace/g, Xs).replace(/punctSpace/g, Ys).replace(/punct/g, Js).getRegex(), sc = Z(ac, "gu").replace(/notPunctSpace/g, ec).replace(/punctSpace/g, $s).replace(/punct/g, Qs).getRegex(), cc = Z("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)", "gu").replace(/notPunctSpace/g, Xs).replace(/punctSpace/g, Ys).replace(/punct/g, Js).getRegex(), lc = Z(/^~~?(?:((?!~)punct)|[^\s~])/, "u").replace(/punct/g, Js).getRegex(), uc = Z("^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)", "gu").replace(/notPunctSpace/g, Xs).replace(/punctSpace/g, Ys).replace(/punct/g, Js).getRegex(), dc = Z(/\\(punct)/, "gu").replace(/punct/g, Js).getRegex(), fc = Z(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme", /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email", /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(), pc = Z(Ls).replace("(?:-->|$)", "-->").getRegex(), mc = Z("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment", pc).replace("attribute", /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(), hc = /(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\])|[^\[\]\\`])*?/, gc = Z(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]+(?:\n[ \t]*)?|\n[ \t]*)(title))?\s*\)/).replace("label", hc).replace("href", /<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title", /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(), _c = Z(/^!?\[(label)\]\[(ref)\]/).replace("label", hc).replace("ref", Ns).getRegex(), vc = Z(/^!?\[(ref)\](?:\[\])?/).replace("ref", Ns).getRegex(), yc = Z("reflink|nolink(?!\\()", "g").replace("reflink", _c).replace("nolink", vc).getRegex(), bc = /[hH][tT][tT][pP][sS]?|[fF][tT][pP]/, xc = { + _backpedal: ys, + anyPunctuation: dc, + autolink: fc, + blockSkip: tc, + br: Ks, + code: Gs, + del: ys, + delLDelim: ys, + delRDelim: ys, + emStrongLDelim: rc, + emStrongRDelimAst: oc, + emStrongRDelimUnd: cc, + escape: Ws, + link: gc, + nolink: vc, + punctuation: Zs, + reflink: _c, + reflinkSearch: yc, + tag: mc, + text: qs, + url: ys }, Sc = { - normal: Ls, - gfm: zs, - pedantic: Bs + ...xc, + link: Z(/^!?\[(label)\]\((.*?)\)/).replace("label", hc).getRegex(), + reflink: Z(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label", hc).getRegex() }, Cc = { - normal: vc, - gfm: bc, - breaks: xc, - pedantic: yc + ...xc, + emStrongRDelimAst: sc, + emStrongLDelim: ic, + delLDelim: lc, + delRDelim: uc, + url: Z(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol", bc).replace("email", /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(), + _backpedal: /(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/, + del: /^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/, + text: Z(/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\": ">", "\"": """, "'": "'" -}, Tc = (e) => wc[e]; -function Ec(e, t) { +}, Oc = (e) => Dc[e]; +function kc(e, t) { if (t) { - if (Q.escapeTest.test(e)) return e.replace(Q.escapeReplace, Tc); - } else if (Q.escapeTestNoEncode.test(e)) return e.replace(Q.escapeReplaceNoEncode, Tc); + if (Q.escapeTest.test(e)) return e.replace(Q.escapeReplace, Oc); + } else if (Q.escapeTestNoEncode.test(e)) return e.replace(Q.escapeReplaceNoEncode, Oc); return e; } -function Dc(e) { +function Ac(e) { try { e = encodeURI(e).replace(Q.percentDecode, "%"); } catch { @@ -3500,7 +3519,7 @@ function Dc(e) { } return e; } -function Oc(e, t) { +function jc(e, t) { let n = e.replace(Q.findPipe, (e, t, n) => { let r = !1, i = t; for (; --i >= 0 && n[i] === "\\";) r = !r; @@ -3511,7 +3530,7 @@ function Oc(e, t) { for (; r < n.length; r++) n[r] = n[r].trim().replace(Q.slashPipe, "|"); return n; } -function kc(e, t, n) { +function Mc(e, t, n) { let r = e.length; if (r === 0) return ""; let i = 0; @@ -3523,12 +3542,12 @@ function kc(e, t, n) { } return e.slice(0, r - i); } -function Ac(e) { +function Nc(e) { let t = e.split("\n"), n = t.length - 1; for (; n >= 0 && Q.blankLine.test(t[n]);) n--; return t.length - n <= 2 ? e : t.slice(0, n + 1).join("\n"); } -function jc(e, t) { +function Pc(e, t) { if (e.indexOf(t[1]) === -1) return -1; let n = 0; for (let r = 0; r < e.length; r++) if (e[r] === "\\") r++; @@ -3536,7 +3555,7 @@ function jc(e, t) { else if (e[r] === t[1] && (n--, n < 0)) return r; return n > 0 ? -2 : -1; } -function Mc(e, t = 0) { +function Fc(e, t = 0) { let n = t, r = ""; for (let t of e) if (t === " ") { let e = 4 - n % 4; @@ -3544,7 +3563,7 @@ function Mc(e, t = 0) { } else r += t, n++; return r; } -function Nc(e, t, n, r, i) { +function Ic(e, t, n, r, i) { let a = t.href, o = t.title || null, s = e[1].replace(i.other.outputLinkReplace, "$1"); r.state.inLink = !0; let c = { @@ -3557,7 +3576,7 @@ function Nc(e, t, n, r, i) { }; return r.state.inLink = !1, c; } -function Pc(e, t, n) { +function Lc(e, t, n) { let r = e.match(n.other.indentCodeCompensation); if (r === null) return t; let i = r[1]; @@ -3568,12 +3587,12 @@ function Pc(e, t, n) { return r.length >= i.length ? e.slice(i.length) : e; }).join("\n"); } -var Fc = class { +var Rc = class { options; rules; lexer; constructor(e) { - this.options = e || ms; + this.options = e || _s; } space(e) { let t = this.rules.block.newline.exec(e); @@ -3585,7 +3604,7 @@ var Fc = class { code(e) { let t = this.rules.block.code.exec(e); if (t) { - let e = this.options.pedantic ? t[0] : Ac(t[0]); + let e = this.options.pedantic ? t[0] : Nc(t[0]); return { type: "code", raw: e, @@ -3597,7 +3616,7 @@ var Fc = class { fences(e) { let t = this.rules.block.fences.exec(e); if (t) { - let e = t[0], n = Pc(e, t[3] || "", this.rules); + let e = t[0], n = Lc(e, t[3] || "", this.rules); return { type: "code", raw: e, @@ -3611,12 +3630,12 @@ var Fc = class { if (t) { let e = t[2].trim(); if (this.rules.other.endingHash.test(e)) { - let t = kc(e, "#"); + let t = Mc(e, "#"); (this.options.pedantic || !t || this.rules.other.endingSpaceChar.test(t)) && (e = t.trim()); } return { type: "heading", - raw: kc(t[0], "\n"), + raw: Mc(t[0], "\n"), depth: t[1].length, text: e, tokens: this.lexer.inline(e) @@ -3627,13 +3646,13 @@ var Fc = class { let t = this.rules.block.hr.exec(e); if (t) return { type: "hr", - raw: kc(t[0], "\n") + raw: Mc(t[0], "\n") }; } blockquote(e) { let t = this.rules.block.blockquote.exec(e); if (t) { - let e = kc(t[0], "\n").split("\n"), n = "", r = "", i = []; + let e = Mc(t[0], "\n").split("\n"), n = "", r = "", i = []; for (; e.length > 0;) { let t = !1, a = [], o; for (o = 0; o < e.length; o++) if (this.rules.other.blockquoteStart.test(e[o])) a.push(e[o]), t = !0; @@ -3683,7 +3702,7 @@ ${c}` : c; let n = !1, r = "", s = ""; if (!(t = a.exec(e)) || this.rules.block.hr.test(e)) break; r = t[0], e = e.substring(r.length); - let c = Mc(t[2].split("\n", 1)[0], t[1].length), l = e.split("\n", 1)[0], u = !c.trim(), d = 0; + let c = Fc(t[2].split("\n", 1)[0], t[1].length), l = e.split("\n", 1)[0], u = !c.trim(), d = 0; if (this.options.pedantic ? (d = 2, s = c.trimStart()) : u ? d = t[1].length + 1 : (d = c.search(this.rules.other.nonSpaceChar), d = d > 4 ? 1 : d, s = c.slice(d), d += t[1].length), u && this.rules.other.blankLine.test(l) && (r += l + "\n", e = e.substring(l.length + 1), n = !0), !n) { let t = this.rules.other.nextBulletRegex(d), n = this.rules.other.hrRegex(d), i = this.rules.other.fencesBeginRegex(d), a = this.rules.other.headingBeginRegex(d), o = this.rules.other.htmlBeginRegex(d), f = this.rules.other.blockquoteBeginRegex(d); for (; e;) { @@ -3749,7 +3768,7 @@ ${c}` : c; html(e) { let t = this.rules.block.html.exec(e); if (t) { - let e = Ac(t[0]); + let e = Nc(t[0]); return { type: "html", block: !0, @@ -3766,7 +3785,7 @@ ${c}` : c; return { type: "def", tag: e, - raw: kc(t[0], "\n"), + raw: Mc(t[0], "\n"), href: n, title: r }; @@ -3775,9 +3794,9 @@ ${c}` : c; table(e) { let t = this.rules.block.table.exec(e); if (!t || !this.rules.other.tableDelimiter.test(t[2])) return; - let n = Oc(t[1]), r = t[2].replace(this.rules.other.tableAlignChars, "").split("|"), i = t[3]?.trim() ? t[3].replace(this.rules.other.tableRowBlankLine, "").split("\n") : [], a = { + let n = jc(t[1]), r = t[2].replace(this.rules.other.tableAlignChars, "").split("|"), i = t[3]?.trim() ? t[3].replace(this.rules.other.tableRowBlankLine, "").split("\n") : [], a = { type: "table", - raw: kc(t[0], "\n"), + raw: Mc(t[0], "\n"), header: [], align: [], rows: [] @@ -3790,7 +3809,7 @@ ${c}` : c; header: !0, align: a.align[e] }); - for (let e of i) a.rows.push(Oc(e, a.header.length).map((e, t) => ({ + for (let e of i) a.rows.push(jc(e, a.header.length).map((e, t) => ({ text: e, tokens: this.lexer.inline(e), header: !1, @@ -3805,7 +3824,7 @@ ${c}` : c; let e = t[1].trim(); return { type: "heading", - raw: kc(t[0], "\n"), + raw: Mc(t[0], "\n"), depth: t[2].charAt(0) === "=" ? 1 : 2, text: e, tokens: this.lexer.inline(e) @@ -3858,10 +3877,10 @@ ${c}` : c; let e = t[2].trim(); if (!this.options.pedantic && this.rules.other.startAngleBracket.test(e)) { if (!this.rules.other.endAngleBracket.test(e)) return; - let t = kc(e.slice(0, -1), "\\"); + let t = Mc(e.slice(0, -1), "\\"); if ((e.length - t.length) % 2 == 0) return; } else { - let e = jc(t[2], "()"); + let e = Pc(t[2], "()"); if (e === -2) return; if (e > -1) { let n = (t[0].indexOf("!") === 0 ? 5 : 4) + t[1].length + e; @@ -3873,7 +3892,7 @@ ${c}` : c; let e = this.rules.other.pedanticHrefTitle.exec(n); e && (n = e[1], r = e[3]); } else r = t[3] ? t[3].slice(1, -1) : ""; - return n = n.trim(), this.rules.other.startAngleBracket.test(n) && (n = this.options.pedantic && !this.rules.other.endAngleBracket.test(e) ? n.slice(1) : n.slice(1, -1)), Nc(t, { + return n = n.trim(), this.rules.other.startAngleBracket.test(n) && (n = this.options.pedantic && !this.rules.other.endAngleBracket.test(e) ? n.slice(1) : n.slice(1, -1)), Ic(t, { href: n && n.replace(this.rules.inline.anyPunctuation, "$1"), title: r && r.replace(this.rules.inline.anyPunctuation, "$1") }, t[0], this.lexer, this.rules); @@ -3891,7 +3910,7 @@ ${c}` : c; text: e }; } - return Nc(n, e, n[0], this.lexer, this.rules); + return Ic(n, e, n[0], this.lexer, this.rules); } } emStrong(e, t, n = "") { @@ -4023,29 +4042,29 @@ ${c}` : c; }; } } -}, Ic = class e { +}, zc = class e { tokens; options; state; inlineQueue; tokenizer; constructor(e) { - this.tokens = [], this.tokens.links = Object.create(null), this.options = e || ms, this.options.tokenizer = this.options.tokenizer || new Fc(), this.tokenizer = this.options.tokenizer, this.tokenizer.options = this.options, this.tokenizer.lexer = this, this.inlineQueue = [], this.state = { + this.tokens = [], this.tokens.links = Object.create(null), this.options = e || _s, this.options.tokenizer = this.options.tokenizer || new Rc(), this.tokenizer = this.options.tokenizer, this.tokenizer.options = this.options, this.tokenizer.lexer = this, this.inlineQueue = [], this.state = { inLink: !1, inRawBlock: !1, top: !0 }; let t = { other: Q, - block: Sc.normal, - inline: Cc.normal + block: Tc.normal, + inline: Ec.normal }; - this.options.pedantic ? (t.block = Sc.pedantic, t.inline = Cc.pedantic) : this.options.gfm && (t.block = Sc.gfm, this.options.breaks ? t.inline = Cc.breaks : t.inline = Cc.gfm), this.tokenizer.rules = t; + this.options.pedantic ? (t.block = Tc.pedantic, t.inline = Ec.pedantic) : this.options.gfm && (t.block = Tc.gfm, this.options.breaks ? t.inline = Ec.breaks : t.inline = Ec.gfm), this.tokenizer.rules = t; } static get rules() { return { - block: Sc, - inline: Cc + block: Tc, + inline: Ec }; } static lex(t, n) { @@ -4245,18 +4264,18 @@ ${c}` : c; if (this.options.silent) console.error(t); else throw Error(t); } -}, Lc = class { +}, Bc = class { options; parser; constructor(e) { - this.options = e || ms; + this.options = e || _s; } space(e) { return ""; } code({ text: e, lang: t, escaped: n }) { let r = (t || "").match(Q.notSpaceStart)?.[0], i = e.replace(Q.endingNewline, "") + "\n"; - return r ? "
    " + (n ? i : Ec(i, !0)) + "
    \n" : "
    " + (n ? i : Ec(i, !0)) + "
    \n"; + return r ? "
    " + (n ? i : kc(i, !0)) + "
    \n" : "
    " + (n ? i : kc(i, !0)) + "
    \n"; } blockquote({ tokens: e }) { return `
    @@ -4326,7 +4345,7 @@ ${e} return `${this.parser.parseInline(e)}`; } codespan({ text: e }) { - return `${Ec(e, !0)}`; + return `${kc(e, !0)}`; } br(e) { return "
    "; @@ -4335,24 +4354,24 @@ ${e} return `${this.parser.parseInline(e)}`; } link({ href: e, title: t, tokens: n }) { - let r = this.parser.parseInline(n), i = Dc(e); + let r = this.parser.parseInline(n), i = Ac(e); if (i === null) return r; e = i; let a = "
    ", a; + return t && (a += " title=\"" + kc(t) + "\""), a += ">" + r + "", a; } image({ href: e, title: t, text: n, tokens: r }) { r && (n = this.parser.parseInline(r, this.parser.textRenderer)); - let i = Dc(e); - if (i === null) return Ec(n); + let i = Ac(e); + if (i === null) return kc(n); e = i; - let a = `${Ec(n)} checkbox({ raw: e }) { return e; } -}, zc = class e { +}, Hc = class e { options; renderer; textRenderer; constructor(e) { - this.options = e || ms, this.options.renderer = this.options.renderer || new Lc(), this.renderer = this.options.renderer, this.renderer.options = this.options, this.renderer.parser = this, this.textRenderer = new Rc(); + this.options = e || _s, this.options.renderer = this.options.renderer || new Bc(), this.renderer = this.options.renderer, this.renderer.options = this.options, this.renderer.parser = this, this.textRenderer = new Vc(); } static parse(t, n) { return new e(n).parse(t); @@ -4534,11 +4553,11 @@ ${e} } return n; } -}, Bc = class { +}, Uc = class { options; block; constructor(e) { - this.options = e || ms; + this.options = e || _s; } static passThroughHooks = new Set([ "preprocess", @@ -4564,22 +4583,22 @@ ${e} return e; } provideLexer(e = this.block) { - return e ? Ic.lex : Ic.lexInline; + return e ? zc.lex : zc.lexInline; } provideParser(e = this.block) { - return e ? zc.parse : zc.parseInline; + return e ? Hc.parse : Hc.parseInline; } -}, Vc = class { - defaults = ps(); +}, Wc = class { + defaults = gs(); options = this.setOptions; parse = this.parseMarkdown(!0); parseInline = this.parseMarkdown(!1); - Parser = zc; - Renderer = Lc; - TextRenderer = Rc; - Lexer = Ic; - Tokenizer = Fc; - Hooks = Bc; + Parser = Hc; + Renderer = Bc; + TextRenderer = Vc; + Lexer = zc; + Tokenizer = Rc; + Hooks = Uc; constructor(...e) { this.use(...e); } @@ -4630,7 +4649,7 @@ ${e} } "childTokens" in e && e.childTokens && (t.childTokens[e.name] = e.childTokens); }), n.extensions = t), e.renderer) { - let t = this.defaults.renderer || new Lc(this.defaults); + let t = this.defaults.renderer || new Bc(this.defaults); for (let n in e.renderer) { if (!(n in t)) throw Error(`renderer '${n}' does not exist`); if (["options", "parser"].includes(n)) continue; @@ -4643,7 +4662,7 @@ ${e} n.renderer = t; } if (e.tokenizer) { - let t = this.defaults.tokenizer || new Fc(this.defaults); + let t = this.defaults.tokenizer || new Rc(this.defaults); for (let n in e.tokenizer) { if (!(n in t)) throw Error(`tokenizer '${n}' does not exist`); if ([ @@ -4660,13 +4679,13 @@ ${e} n.tokenizer = t; } if (e.hooks) { - let t = this.defaults.hooks || new Bc(); + let t = this.defaults.hooks || new Uc(); for (let n in e.hooks) { if (!(n in t)) throw Error(`hook '${n}' does not exist`); if (["options", "block"].includes(n)) continue; let r = n, i = e.hooks[r], a = t[r]; - Bc.passThroughHooks.has(n) ? t[r] = (e) => { - if (this.defaults.async && Bc.passThroughHooksRespectAsync.has(n)) return (async () => { + Uc.passThroughHooks.has(n) ? t[r] = (e) => { + if (this.defaults.async && Uc.passThroughHooksRespectAsync.has(n)) return (async () => { let n = await i.call(t, e); return a.call(t, n); })(); @@ -4703,10 +4722,10 @@ ${e} }, this; } lexer(e, t) { - return Ic.lex(e, t ?? this.defaults); + return zc.lex(e, t ?? this.defaults); } parser(e, t) { - return zc.parse(e, t ?? this.defaults); + return Hc.parse(e, t ?? this.defaults); } parseMarkdown(e) { return (t, n) => { @@ -4718,16 +4737,16 @@ ${e} if (typeof t > "u" || t === null) return a(/* @__PURE__ */ Error("marked(): input parameter is undefined or null")); if (typeof t != "string") return a(/* @__PURE__ */ Error("marked(): input parameter is of type " + Object.prototype.toString.call(t) + ", string expected")); if (i.hooks && (i.hooks.options = i, i.hooks.block = e), i.async) return (async () => { - let n = i.hooks ? await i.hooks.preprocess(t) : t, r = await (i.hooks ? await i.hooks.provideLexer(e) : e ? Ic.lex : Ic.lexInline)(n, i), a = i.hooks ? await i.hooks.processAllTokens(r) : r; + let n = i.hooks ? await i.hooks.preprocess(t) : t, r = await (i.hooks ? await i.hooks.provideLexer(e) : e ? zc.lex : zc.lexInline)(n, i), a = i.hooks ? await i.hooks.processAllTokens(r) : r; i.walkTokens && await Promise.all(this.walkTokens(a, i.walkTokens)); - let o = await (i.hooks ? await i.hooks.provideParser(e) : e ? zc.parse : zc.parseInline)(a, i); + let o = await (i.hooks ? await i.hooks.provideParser(e) : e ? Hc.parse : Hc.parseInline)(a, i); return i.hooks ? await i.hooks.postprocess(o) : o; })().catch(a); try { i.hooks && (t = i.hooks.preprocess(t)); - let n = (i.hooks ? i.hooks.provideLexer(e) : e ? Ic.lex : Ic.lexInline)(t, i); + let n = (i.hooks ? i.hooks.provideLexer(e) : e ? zc.lex : zc.lexInline)(t, i); i.hooks && (n = i.hooks.processAllTokens(n)), i.walkTokens && this.walkTokens(n, i.walkTokens); - let r = (i.hooks ? i.hooks.provideParser(e) : e ? zc.parse : zc.parseInline)(n, i); + let r = (i.hooks ? i.hooks.provideParser(e) : e ? Hc.parse : Hc.parseInline)(n, i); return i.hooks && (r = i.hooks.postprocess(r)), r; } catch (e) { return a(e); @@ -4737,27 +4756,27 @@ ${e} onError(e, t) { return (n) => { if (n.message += "\nPlease report this to https://github.com/markedjs/marked.", e) { - let e = "

    An error occurred:

    " + Ec(n.message + "", !0) + "
    "; + let e = "

    An error occurred:

    " + kc(n.message + "", !0) + "
    "; return t ? Promise.resolve(e) : e; } if (t) return Promise.reject(n); throw n; }; } -}, Hc = new Vc(); +}, Gc = new Wc(); function $(e, t) { - return Hc.parse(e, t); + return Gc.parse(e, t); } $.options = $.setOptions = function(e) { - return Hc.setOptions(e), $.defaults = Hc.defaults, hs($.defaults), $; -}, $.getDefaults = ps, $.defaults = ms, $.use = function(...e) { - return Hc.use(...e), $.defaults = Hc.defaults, hs($.defaults), $; + return Gc.setOptions(e), $.defaults = Gc.defaults, vs($.defaults), $; +}, $.getDefaults = gs, $.defaults = _s, $.use = function(...e) { + return Gc.use(...e), $.defaults = Gc.defaults, vs($.defaults), $; }, $.walkTokens = function(e, t) { - return Hc.walkTokens(e, t); -}, $.parseInline = Hc.parseInline, $.Parser = zc, $.parser = zc.parse, $.Renderer = Lc, $.TextRenderer = Rc, $.Lexer = Ic, $.lexer = Ic.lex, $.Tokenizer = Fc, $.Hooks = Bc, $.parse = $, $.options, $.setOptions, $.use, $.walkTokens, $.parseInline, zc.parse, Ic.lex; + return Gc.walkTokens(e, t); +}, $.parseInline = Gc.parseInline, $.Parser = Hc, $.parser = Hc.parse, $.Renderer = Bc, $.TextRenderer = Vc, $.Lexer = zc, $.lexer = zc.lex, $.Tokenizer = Rc, $.Hooks = Uc, $.parse = $, $.options, $.setOptions, $.use, $.walkTokens, $.parseInline, Hc.parse, zc.lex; //#endregion //#region packages/sdk-vue/src/markdown.ts -var Uc = new Set(/* @__PURE__ */ "h1.h2.h3.h4.h5.h6.p.ul.ol.li.strong.em.b.i.code.pre.a.img.br.hr.blockquote.table.thead.tbody.tfoot.tr.th.td.dl.dt.dd.details.summary.sup.sub.del.ins.s.mark.abbr.cite.q.figure.figcaption.caption.span.div.section.article.aside.header.footer.nav.main".split(".")), Wc = new Set([ +var Kc = new Set(/* @__PURE__ */ "h1.h2.h3.h4.h5.h6.p.ul.ol.li.strong.em.b.i.code.pre.a.img.br.hr.blockquote.table.thead.tbody.tfoot.tr.th.td.dl.dt.dd.details.summary.sup.sub.del.ins.s.mark.abbr.cite.q.figure.figcaption.caption.span.div.section.article.aside.header.footer.nav.main".split(".")), qc = new Set([ "class", "id", "title", @@ -4770,7 +4789,7 @@ var Uc = new Set(/* @__PURE__ */ "h1.h2.h3.h4.h5.h6.p.ul.ol.li.strong.em.b.i.cod "aria-controls", "role", "data-lang" -]), Gc = { +]), Jc = { a: new Set([ "href", "rel", @@ -4789,29 +4808,29 @@ var Uc = new Set(/* @__PURE__ */ "h1.h2.h3.h4.h5.h6.p.ul.ol.li.strong.em.b.i.cod "scope" ]), td: new Set(["colspan", "rowspan"]) -}, Kc = /^\s*(?:javascript|vbscript|data)\s*:/i; -function qc(e) { - return !Kc.test(e); +}, Yc = /^\s*(?:javascript|vbscript|data)\s*:/i; +function Xc(e) { + return !Yc.test(e); } -function Jc(e) { +function Zc(e) { return e.replace(/&/g, "&").replace(/"/g, """).replace(//g, ">"); } -function Yc(e, t) { +function Qc(e, t) { if (!t.trim()) return ""; let n = [], r = /\s+([a-zA-Z][a-zA-Z0-9_:-]*)(?:\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s"'`=>]+)))?/g, i, a = !1, o = []; for (; (i = r.exec(t)) !== null;) { let t = (i[1] ?? "").toLowerCase(), n = i[2] ?? i[3] ?? i[4] ?? ""; if (t.startsWith("on")) continue; - let r = Gc[e]; - (Wc.has(t) || r && r.has(t)) && ((t === "href" || t === "src") && !qc(n) || (t === "rel" && (a = !0), o.push({ + let r = Jc[e]; + (qc.has(t) || r && r.has(t)) && ((t === "href" || t === "src") && !Xc(n) || (t === "rel" && (a = !0), o.push({ name: t, value: n }))); } - for (let { name: e, value: t } of o) n.push(" " + e + "=\"" + Jc(t) + "\""); + for (let { name: e, value: t } of o) n.push(" " + e + "=\"" + Zc(t) + "\""); return e === "a" && !a && n.push(" rel=\"noopener noreferrer\""), n.join(""); } -var Xc = [ +var $c = [ "script", "style", "iframe", @@ -4824,7 +4843,7 @@ var Xc = [ "textarea", "svg", "math" -], Zc = new Set([ +], el = new Set([ "input", "button", "meta", @@ -4832,9 +4851,9 @@ var Xc = [ "base", "applet" ]); -function Qc(e) { +function tl(e) { let t = e; - for (let e of Xc) { + for (let e of $c) { let n = RegExp("<" + e + "(\\s[^>]*)?>([\\s\\S]*?)<\\/" + e + ">", "gi"); t = t.replace(n, ""); let r = RegExp("<" + e + "(\\s[^>]*)?>", "gi"); @@ -4844,30 +4863,30 @@ function Qc(e) { } return t = t.replace(/<(\/?)([a-zA-Z][a-zA-Z0-9-]*)(\s[^>]*)?(\/?)>/g, (e, t, n, r, i) => { let a = n.toLowerCase(); - if (Zc.has(a) || !Uc.has(a)) return ""; - let o = Yc(a, r ?? ""), s = i ? " /" : ""; + if (el.has(a) || !Kc.has(a)) return ""; + let o = Qc(a, r ?? ""), s = i ? " /" : ""; return "<" + t + a + o + s + ">"; }), t; } -function $c(e, t) { +function nl(e, t) { let n = encodeURIComponent(t); return e.split(/(]*>[\s\S]*?<\/code>)/).map((e, t) => t % 2 == 1 ? e : e.replace(/(^|[^\w&])#(\d+)\b/g, (e, t, r) => t + "#" + r + "")).join(""); } -function el(e, t = {}) { +function rl(e, t = {}) { if (!e) return ""; - let n = Qc(new Vc().parse(e, { async: !1 })); - return t.workspaceId && (n = $c(n, t.workspaceId)), n; + let n = tl(new Wc().parse(e, { async: !1 })); + return t.workspaceId && (n = nl(n, t.workspaceId)), n; } //#endregion //#region packages/sdk-vue/src/parse-query.ts -function tl(e, t) { +function il(e, t) { let n = {}, r = /* @__PURE__ */ new Set(), i = [], a = new Set(t); if (!e || !e.trim()) return { text: "", filters: n, unknown: [] }; - let o = nl(e); + let o = al(e); for (let e of o) { if (e.kind === "plain") { i.push(e.text); @@ -4881,13 +4900,13 @@ function tl(e, t) { unknown: Array.from(r) }; } -function nl(e) { +function al(e) { let t = [], n = e.length, r = 0; for (; r < n;) { - for (; r < n && rl(e.charCodeAt(r));) r += 1; + for (; r < n && ol(e.charCodeAt(r));) r += 1; if (r >= n) break; let i = r, a = -1; - for (; r < n && !rl(e.charCodeAt(r));) { + for (; r < n && !ol(e.charCodeAt(r));) { if (e.charCodeAt(r) === 58 && a === -1 && (a = r, r + 1 < n && e.charCodeAt(r + 1) === 34)) { for (r += 2; r < n && e.charCodeAt(r) !== 34;) r += 1; r < n && (r += 1); @@ -4898,7 +4917,7 @@ function nl(e) { let o = e.slice(i, r); if (a > i) { let n = e.slice(i, a); - if (il(n)) { + if (sl(n)) { let i = n.toLowerCase(), o = a + 1, s = e.slice(o, r); s.startsWith("\"") && s.endsWith("\"") && s.length >= 2 && (s = s.slice(1, -1)), t.push({ kind: "kv", @@ -4915,39 +4934,39 @@ function nl(e) { } return t; } -function rl(e) { +function ol(e) { return e === 32 || e === 9 || e === 10 || e === 13; } -function il(e) { - if (e.length === 0 || !al(e.charCodeAt(0))) return !1; +function sl(e) { + if (e.length === 0 || !cl(e.charCodeAt(0))) return !1; for (let t = 1; t < e.length; t += 1) { let n = e.charCodeAt(t); - if (!al(n) && !ol(n) && n !== 95 && n !== 45) return !1; + if (!cl(n) && !ll(n) && n !== 95 && n !== 45) return !1; } return !0; } -function al(e) { +function cl(e) { return e >= 65 && e <= 90 || e >= 97 && e <= 122; } -function ol(e) { +function ll(e) { return e >= 48 && e <= 57; } //#endregion //#region packages/sdk-vue/src/classify-principal.ts -var sl = { +var ul = { kind: "unknown", label: "unknown", glyph: "·", tone: "neutral" }; -function cl(e) { - if (!e) return sl; +function dl(e) { + if (!e) return ul; let [t = "", ...n] = e.replace(/^comtrya:\/\//, "").split("/"), r = n.join("/") || e; switch (t) { case "user": return { kind: "human", label: r, - glyph: ll(r), + glyph: fl(r), tone: "human" }; case "agent": return { @@ -4977,21 +4996,18 @@ function cl(e) { default: return { kind: "unknown", label: r, - glyph: ll(r) || "·", + glyph: fl(r) || "·", tone: "neutral" }; } } -function ll(e) { +function fl(e) { return e.slice(0, 1).toUpperCase(); } -function ul(e) { - return cl(e).label; -} //#endregion //#region packages/sdk-vue/src/index.ts -function dl(e) { - fl(e.tagName, e.component); +function pl(e) { + ml(e.tagName, e.component); let t = /* @__PURE__ */ $a(e.component, { shadowRoot: e.shadowRoot ?? !1 }); for (let [n, r] of Object.entries(e.propertyAliases ?? {})) Object.defineProperty(t.prototype, n, { configurable: !0, @@ -4999,45 +5015,46 @@ function dl(e) { return this[r]; }, set(e) { - this[r] = e, typeof e == "string" && this.setAttribute(ml(r), e); + this[r] = e, typeof e == "string" && this.setAttribute(gl(r), e); } }); return typeof customElements < "u" && !customElements.get(e.tagName) && customElements.define(e.tagName, t), t; } -function fl(e, t) { +function ml(e, t) { if (typeof document > "u") return; - let n = pl(t); + let n = hl(t); if (n.length === 0) return; let r = `comtrya-widget-styles:${e}`; if (document.head.querySelector(`style[data-comtrya-widget-styles="${r}"]`)) return; let i = document.createElement("style"); i.dataset.comtryaWidgetStyles = r, i.textContent = n.join("\n"), document.head.append(i); } -function pl(e) { +function hl(e) { if (!e || typeof e != "object") return []; let t = e.styles; return Array.isArray(t) ? t.filter((e) => typeof e == "string") : []; } -function ml(e) { +function gl(e) { return e.replace(/[A-Z]/g, (e) => `-${e.toLowerCase()}`); } -var hl = "ext_pull_requests", gl = "pulls"; -function _l(e, t) { +var _l = "ext_pull_requests", vl = "pulls"; +function yl(e, t) { return t ? `comtrya://workspace/${e}/repository/${t}` : `comtrya://workspace/${e}`; } -function vl(e, t) { +function bl(e, t) { if (e.ok) return e.value; throw Error(`${t}: ${e.error.message}`); } -function yl(e) { +function xl(e) { switch ((typeof e == "string" ? e : e && typeof e == "object" && typeof e.tag == "string" ? e.tag : "").toLowerCase()) { case "draft": return "DRAFT"; + case "review": return "REVIEW"; case "merged": return "MERGED"; case "closed": return "CLOSED"; default: return "READY"; } } -function bl(e) { +function Sl(e) { return { id: e.id, repository: e.repository, @@ -5045,7 +5062,7 @@ function bl(e) { number: e.number, title: e.title, bodyMarkdown: e.bodyMarkdown ?? "", - state: yl(e.state), + state: xl(e.state), authorRef: e.authorRef, headRef: e.headRef, baseRef: e.baseRef, @@ -5057,74 +5074,114 @@ function bl(e) { closedByRef: e.closedByRef ?? null }; } -async function xl(e) { - return vl(await Do(hl, gl, "list-pulls", { - repository: _l(e.workspaceId, e.repositoryId), +async function Cl(e) { + return bl(await ko(_l, vl, "list-pulls", { + repository: yl(e.workspaceId, e.repositoryId), limit: e.limit ?? 256 - }), "list-pulls").map(bl); + }), "list-pulls").map(Sl); } -async function Sl(e) { - let t = vl(await Do(hl, gl, "get-pull", e), "get-pull"); - return t ? bl(t) : null; +function wl(e) { + return { + pullRequest: Sl(e.pullRequest), + terminal: !!e.terminal, + blocked: !!e.blocked, + waiting: !!e.waiting, + checkBlocked: !!e.checkBlocked, + checkWaiting: !!e.checkWaiting, + reviewBlocked: !!e.reviewBlocked, + reviewWaiting: !!e.reviewWaiting, + checkSummary: e.checkSummary ?? null, + reviewSummary: e.reviewSummary + }; } -async function Cl(e, t) { - return bl(vl(await Do(hl, gl, "merge-pull", { +async function Tl(e) { + let t = bl(await ko(_l, vl, "merge-readiness-board", { + repository: yl(e.workspaceId, e.repositoryId), + checkSummaries: e.checkSummaries ?? [], + requiredApprovals: e.requiredApprovals ?? 1, + limit: e.limit ?? 256 + }), "merge-readiness-board"); + return { + repository: t.repository, + total: t.total, + columns: t.columns.map((e) => ({ + key: e.key, + label: e.label, + count: e.count, + cards: e.cards.map(wl) + })) + }; +} +async function El(e) { + let t = bl(await ko(_l, vl, "get-pull", e), "get-pull"); + return t ? Sl(t) : null; +} +async function Dl(e, t) { + return Sl(bl(await ko(_l, vl, "merge-pull", { id: e, mergedByRef: t ?? null }), "merge-pull")); } -async function wl(e, t) { - return bl(vl(await Do(hl, gl, "close-pull", { +async function Ol(e, t) { + return Sl(bl(await ko(_l, vl, "close-pull", { id: e, closedByRef: t ?? null }), "close-pull")); } -function Tl(e) { +function kl(e) { switch ((typeof e == "string" ? e : e && typeof e == "object" && typeof e.tag == "string" ? e.tag : "").toLowerCase()) { case "closed": return "CLOSED"; case "reopened": return "REOPENED"; default: return "OPEN"; } } -async function El(e) { +async function Al(e) { if (!e) return []; - let t = `comtrya://pull-request/${e}`, n = (await Mo().query("query LinkedIssues($from: ResourceURN!, $kind: ResourceURN) {\n relations.outgoing(from: $from, kind: $kind) { id kind from to source target }\n }", { + let t = `comtrya://pull-request/${e}`, n = (await Po().query("query LinkedIssues($from: ResourceURN!, $kind: ResourceURN) {\n relations.outgoing(from: $from, kind: $kind) { id kind from to source target }\n }", { from: t, kind: "comtrya://rel/com.comtrya.pulls/closes" })).relations?.outgoing ?? [], r = Array.from(new Set(n.map((e) => e.to ?? e.target ?? "").filter((e) => e.startsWith("comtrya://issue/")))); - return (await Promise.all(r.map(Dl))).filter((e) => e !== null); + return (await Promise.all(r.map(jl))).filter((e) => e !== null); } -async function Dl(e) { - let t = await Do("ext_issues", "issues", "by-ref-issue", e); +async function jl(e) { + let t = await ko("ext_issues", "issues", "by-ref-issue", e); if (!t.ok) return null; let n = t.value; if (!n || typeof n != "object") return null; - let r = typeof n.projectName == "string" && n.projectName.trim().length > 0 ? n.projectName.trim() : null, i = typeof n.repository == "string" ? n.repository : null, a = typeof n.workspace == "string" ? n.workspace : null, o = Ol(i ?? a); + let r = typeof n.projectName == "string" && n.projectName.trim().length > 0 ? n.projectName.trim() : null, i = typeof n.repository == "string" ? n.repository : null, a = typeof n.workspace == "string" ? n.workspace : null, o = Ml(i ?? a); return { id: typeof n.id == "string" ? n.id : "", number: typeof n.number == "number" ? n.number : null, title: typeof n.title == "string" ? n.title : "(untitled)", - state: Tl(n.state), + state: kl(n.state), uri: e, projectName: r, workspaceId: o }; } -function Ol(e) { +function Ml(e) { if (!e) return null; let t = e.match(/^comtrya:\/\/workspace\/([^/]+)/); return t ? t[1] ?? null : null; } //#endregion //#region ../extensions/first-party/ext_pull_requests/ui/src/types.ts -var kl = "pulls"; -function Al() { - return Po(kl, "/"); +var Nl = "pulls"; +function Pl() { + return us() ?? ""; } -function jl(e) { - return Po(kl, `/${e.id}`); +function Fl(e) { + return Ll(e) ?? Io("pulls", "/"); } -function Ml(e) { +function Il(e, t) { + let n = Ll(t); + return n ? `${n}/${encodeURIComponent(e.id)}` : Io(Nl, `/${e.id}`); +} +function Ll(e) { + let t = e?.split("/").filter(Boolean) ?? []; + return t.length === 0 ? null : `/r/${t.map(encodeURIComponent).join("/")}/pulls`; +} +function Rl(e) { switch (e) { case "READY": return { label: "open", @@ -5134,6 +5191,10 @@ function Ml(e) { label: "draft", className: "pr-state-draft" }; + case "REVIEW": return { + label: "review", + className: "pr-state-review" + }; case "MERGED": return { label: "merged", className: "pr-state-merged" @@ -5148,7 +5209,7 @@ function Ml(e) { }; } } -function Nl(e) { +function zl(e) { if (!e) return ""; let t = Date.parse(e); if (Number.isNaN(t)) return e; @@ -5157,8 +5218,8 @@ function Nl(e) { } //#endregion //#region ../extensions/first-party/ext_pull_requests/ui/src/pr-commands.ts -var Pl = /* @__PURE__ */ new Map(); -function Fl(e) { +var Bl = /* @__PURE__ */ new Map(); +function Vl(e) { return [ e.id, e.number, @@ -5166,38 +5227,38 @@ function Fl(e) { e.state ].join("|"); } -function Il(e) { +function Hl(e) { let t = []; - return t.push(as({ + return t.push(ss({ id: `ext_pull_requests.open.${e.id}`, title: `Open PR #${e.number} — ${e.title}`, category: "Pull requests", extensionId: "ext_pull_requests", run: () => { - window.location.href = jl(e); + window.location.href = Il(e); } - })), (e.state === "READY" || e.state === "DRAFT") && t.push(as({ + })), (e.state === "READY" || e.state === "DRAFT") && t.push(ss({ id: `ext_pull_requests.merge.${e.id}`, title: `Merge PR #${e.number} — ${e.title}`, category: "Pull requests", extensionId: "ext_pull_requests", run: async () => { - await Cl(e.id); + await Dl(e.id); } - })), e.state !== "CLOSED" && e.state !== "MERGED" && t.push(as({ + })), e.state !== "CLOSED" && e.state !== "MERGED" && t.push(ss({ id: `ext_pull_requests.close.${e.id}`, title: `Close PR #${e.number} — ${e.title}`, category: "Pull requests", extensionId: "ext_pull_requests", run: async () => { - await wl(e.id); + await Ol(e.id); } })), () => t.forEach((e) => e()); } -async function Ll(e) { +async function Ul(e) { let t; try { - t = await xl({ workspaceId: e }); + t = await Cl({ workspaceId: e }); } catch (e) { console.warn("[ext_pull_requests] palette sync failed:", e); return; @@ -5205,27 +5266,27 @@ async function Ll(e) { let n = /* @__PURE__ */ new Set(); for (let e of t) { n.add(e.id); - let t = Fl(e), r = Pl.get(e.id); - r && r.signature === t || (r?.unregister(), Pl.set(e.id, { + let t = Vl(e), r = Bl.get(e.id); + r && r.signature === t || (r?.unregister(), Bl.set(e.id, { signature: t, - unregister: Il(e) + unregister: Hl(e) })); } - for (let [e, t] of Pl) n.has(e) || (t.unregister(), Pl.delete(e)); + for (let [e, t] of Bl) n.has(e) || (t.unregister(), Bl.delete(e)); } -function Rl() { +function Wl() { let e = [], t = !1; - return cs().then((n) => { + return ds().then((n) => { if (!t) { - Ll(n); + Ul(n); for (let t of [ "dev.comtrya.pull-request.created", "dev.comtrya.pull-request.merged", "dev.comtrya.pull-request.closed" - ]) e.push(Fo({ + ]) e.push(Lo({ type: t, onEvent: () => { - Ll(n); + Ul(n); }, onError: () => {} })); @@ -5233,13 +5294,13 @@ function Rl() { }), () => { t = !0; for (let t of e) t(); - for (let e of Pl.values()) e.unregister(); - Pl.clear(); + for (let e of Bl.values()) e.unregister(); + Bl.clear(); }; } //#endregion //#region ../extensions/first-party/ext_pull_requests/ui/src/CustomElementHost.vue?vue&type=script&setup=true&lang.ts -var zl = /* @__PURE__ */ zn({ +var Gl = /* @__PURE__ */ Vn({ __name: "CustomElementHost", props: { tag: { type: String }, @@ -5253,8 +5314,8 @@ var zl = /* @__PURE__ */ zn({ } }, setup(e) { - let t = e, n = /* @__PURE__ */ L(null), r = null; - er(i), B(() => [ + let t = e, n = /* @__PURE__ */ I(null), r = null; + nr(i), Nn(() => [ t.tag, t.attributes, t.properties @@ -5274,12 +5335,12 @@ var zl = /* @__PURE__ */ zn({ class: "custom-element-host" }, null, 512)); } -}), Bl = ".custom-element-host[data-v-cf896d02]{display:contents}", Vl = (e, t) => { +}), Kl = ".custom-element-host[data-v-cf896d02]{display:contents}", ql = (e, t) => { let n = e.__vccOpts || e; for (let [e, r] of t) n[e] = r; return n; -}, Hl = /* @__PURE__ */ Vl(zl, [["styles", [Bl]], ["__scopeId", "data-v-cf896d02"]]), Ul = /^diff --git a\/(.+?) b\/(.+)$/, Wl = /^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@(.*)$/; -function Gl(e) { +}, Jl = /* @__PURE__ */ ql(Gl, [["styles", [Kl]], ["__scopeId", "data-v-cf896d02"]]), Yl = /^diff --git a\/(.+?) b\/(.+)$/, Xl = /^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@(.*)$/; +function Zl(e) { if (!e) return []; let t = [], n = e.split("\n"), r = null, i = null, a = 0, o = 0, s = () => { r && i && r.hunks.push(i), i = null; @@ -5287,7 +5348,7 @@ function Gl(e) { s(), r && t.push(r), r = null; }; for (let e of n) { - let t = e.match(Ul); + let t = e.match(Yl); if (t) { c(); let [, e, n] = t; @@ -5296,7 +5357,7 @@ function Gl(e) { newPath: n ?? "", displayPath: n || e || "", status: "modified", - language: ql(n || e || ""), + language: $l(n || e || ""), hunks: [], additions: 0, deletions: 0, @@ -5322,7 +5383,7 @@ function Gl(e) { continue; } if (e.startsWith("index ") || e.startsWith("---") || e.startsWith("+++")) continue; - let n = e.match(Wl); + let n = e.match(Xl); if (n) { s(); let t = Number(n[1] ?? 0), r = Number(n[2] ?? 1), c = Number(n[3] ?? 0); @@ -5360,7 +5421,7 @@ function Gl(e) { } return c(), t; } -var Kl = { +var Ql = { rs: "rust", ts: "typescript", tsx: "tsx", @@ -5378,11 +5439,11 @@ var Kl = { css: "css", html: "html" }; -function ql(e) { +function $l(e) { let t = e.lastIndexOf("."); - return t < 0 ? "plain" : Kl[e.slice(t + 1).toLowerCase()] ?? "plain"; + return t < 0 ? "plain" : Ql[e.slice(t + 1).toLowerCase()] ?? "plain"; } -function Jl(e) { +function eu(e) { let t = 0, n = 0; for (let r of e) t += r.additions, n += r.deletions; return { @@ -5393,44 +5454,44 @@ function Jl(e) { } //#endregion //#region ../extensions/first-party/ext_pull_requests/ui/src/diff-styles.ts -var Yl = "comtrya-diff-view-styles", Xl = "\n.diff-view {\n display: grid;\n gap: 14px;\n font-family: var(--sans, system-ui);\n}\n\n.diff-summary {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n flex-wrap: wrap;\n gap: 12px;\n border-bottom: 1.5px solid var(--ink, #111);\n padding-bottom: 8px;\n}\n\n.diff-summary h2 {\n margin: 0;\n font-family: var(--display, system-ui);\n font-size: 18px;\n}\n\n.diff-totals {\n display: inline-flex;\n flex-wrap: wrap;\n gap: 10px 14px;\n align-items: baseline;\n font-family: var(--mono, monospace);\n font-size: 12px;\n color: var(--ink-faint, #68645c);\n}\n\n.diff-totals .adds { color: var(--accent-teal, #087f6f); }\n.diff-totals .dels { color: var(--accent-err, #c9341c); }\n.diff-totals .hint { color: var(--ink-fainter, #918b80); }\n\n.diff-totals .hint kbd {\n border: 1px solid currentColor;\n padding: 0 4px;\n font-family: var(--mono, monospace);\n font-size: 10px;\n}\n\n.diff-view .muted {\n font-family: var(--mono, monospace);\n font-size: 12px;\n color: var(--ink-faint, #68645c);\n}\n\n.diff-view .muted.error { color: var(--accent-err, #c9341c); }\n\n.diff-files {\n list-style: none;\n margin: 0;\n padding: 0;\n display: grid;\n gap: 14px;\n}\n\n.diff-file {\n border: 1.5px solid var(--ink, #111);\n background: var(--paper, #fffdf8);\n}\n\n.diff-file.focused {\n box-shadow: -3px 0 0 0 var(--accent-orange, #e34a20);\n}\n\n.diff-file-head {\n display: grid;\n grid-template-columns: 14px auto minmax(0, 1fr) auto auto;\n gap: 10px;\n align-items: center;\n padding: 8px 10px;\n border-bottom: 1px solid var(--rule-light, #d8d1c4);\n cursor: pointer;\n background: var(--paper-tint, #f2efe7);\n}\n\n.diff-file-head:hover,\n.diff-file-head:focus-visible {\n background: color-mix(in srgb, var(--paper-tint, #f2efe7) 80%, var(--ink, #111));\n outline: none;\n}\n\n.diff-file-head .caret {\n font-family: var(--mono, monospace);\n font-size: 11px;\n color: var(--ink-faint, #68645c);\n}\n\n.file-status {\n font-family: var(--mono, monospace);\n font-size: 10px;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n padding: 1px 6px;\n border: 1px solid currentColor;\n}\n\n.status-added { color: var(--accent-teal, #087f6f); }\n.status-deleted { color: var(--accent-err, #c9341c); }\n.status-modified { color: var(--accent-blue, #1d55a6); }\n.status-renamed { color: var(--accent-yellow, #c89300); }\n\n.file-path {\n font-family: var(--mono, monospace);\n font-size: 12px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.file-rename {\n font-family: var(--mono, monospace);\n font-size: 11px;\n color: var(--ink-faint, #68645c);\n}\n\n.file-counts {\n display: inline-flex;\n gap: 8px;\n font-family: var(--mono, monospace);\n font-size: 11px;\n}\n\n.file-counts .adds { color: var(--accent-teal, #087f6f); }\n.file-counts .dels { color: var(--accent-err, #c9341c); }\n\n.diff-file-body { display: grid; gap: 0; }\n\n.diff-hunk { border-top: 1px solid var(--rule-light, #d8d1c4); }\n.diff-hunk:first-child { border-top: 0; }\n\n.diff-hunk-head {\n background: var(--paper-tint, #f2efe7);\n padding: 4px 10px;\n font-family: var(--mono, monospace);\n font-size: 11px;\n color: var(--ink-faint, #68645c);\n}\n\n.diff-hunk table {\n width: 100%;\n border-collapse: collapse;\n font-family: var(--mono, monospace);\n font-size: 12px;\n line-height: 1.45;\n}\n\n.diff-line.line-add {\n background: color-mix(in srgb, var(--accent-teal, #087f6f) 10%, var(--paper, #fffdf8));\n}\n\n.diff-line.line-del {\n background: color-mix(in srgb, var(--accent-err, #c9341c) 10%, var(--paper, #fffdf8));\n}\n\n.diff-line.line-meta { color: var(--ink-fainter, #918b80); }\n\n.diff-line td {\n padding: 0;\n vertical-align: top;\n white-space: pre-wrap;\n word-break: break-word;\n}\n\n.diff-line .ln {\n width: 48px;\n padding: 0 8px;\n color: var(--ink-fainter, #918b80);\n text-align: right;\n user-select: none;\n background: color-mix(in srgb, var(--paper-tint, #f2efe7) 60%, var(--paper, #fffdf8));\n border-right: 1px solid var(--rule-light, #d8d1c4);\n font-variant-numeric: tabular-nums;\n}\n\n.diff-line.line-add .ln.new,\n.diff-line.line-del .ln.old {\n color: var(--ink-soft, #2c2b28);\n}\n\n.diff-line .marker {\n width: 18px;\n padding: 0 4px;\n text-align: center;\n color: var(--ink-faint, #68645c);\n user-select: none;\n}\n\n.diff-line.line-add .marker { color: var(--accent-teal, #087f6f); }\n.diff-line.line-del .marker { color: var(--accent-err, #c9341c); }\n.diff-line .content { padding: 0 8px; }\n"; -function Zl() { - if (typeof document > "u" || document.getElementById(Yl)) return; +var tu = "comtrya-diff-view-styles", nu = "\n.diff-view {\n display: grid;\n gap: 14px;\n font-family: var(--sans, system-ui);\n}\n\n.diff-summary {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n flex-wrap: wrap;\n gap: 12px;\n border-bottom: 1.5px solid var(--ink, #111);\n padding-bottom: 8px;\n}\n\n.diff-summary h2 {\n margin: 0;\n font-family: var(--display, system-ui);\n font-size: 18px;\n}\n\n.diff-totals {\n display: inline-flex;\n flex-wrap: wrap;\n gap: 10px 14px;\n align-items: baseline;\n font-family: var(--mono, monospace);\n font-size: 12px;\n color: var(--ink-faint, #68645c);\n}\n\n.diff-totals .adds { color: var(--accent-teal, #087f6f); }\n.diff-totals .dels { color: var(--accent-err, #c9341c); }\n.diff-totals .hint { color: var(--ink-fainter, #918b80); }\n\n.diff-totals .hint kbd {\n border: 1px solid currentColor;\n padding: 0 4px;\n font-family: var(--mono, monospace);\n font-size: 10px;\n}\n\n.diff-view .muted {\n font-family: var(--mono, monospace);\n font-size: 12px;\n color: var(--ink-faint, #68645c);\n}\n\n.diff-view .muted.error { color: var(--accent-err, #c9341c); }\n\n.diff-files {\n list-style: none;\n margin: 0;\n padding: 0;\n display: grid;\n gap: 14px;\n}\n\n.diff-file {\n border: 1.5px solid var(--ink, #111);\n background: var(--paper, #fffdf8);\n}\n\n.diff-file.focused {\n box-shadow: -3px 0 0 0 var(--accent-orange, #e34a20);\n}\n\n.diff-file-head {\n display: grid;\n grid-template-columns: 14px auto minmax(0, 1fr) auto auto;\n gap: 10px;\n align-items: center;\n padding: 8px 10px;\n border-bottom: 1px solid var(--rule-light, #d8d1c4);\n cursor: pointer;\n background: var(--paper-tint, #f2efe7);\n}\n\n.diff-file-head:hover,\n.diff-file-head:focus-visible {\n background: color-mix(in srgb, var(--paper-tint, #f2efe7) 80%, var(--ink, #111));\n outline: none;\n}\n\n.diff-file-head .caret {\n font-family: var(--mono, monospace);\n font-size: 11px;\n color: var(--ink-faint, #68645c);\n}\n\n.file-status {\n font-family: var(--mono, monospace);\n font-size: 10px;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n padding: 1px 6px;\n border: 1px solid currentColor;\n}\n\n.status-added { color: var(--accent-teal, #087f6f); }\n.status-deleted { color: var(--accent-err, #c9341c); }\n.status-modified { color: var(--accent-blue, #1d55a6); }\n.status-renamed { color: var(--accent-yellow, #c89300); }\n\n.file-path {\n font-family: var(--mono, monospace);\n font-size: 12px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.file-rename {\n font-family: var(--mono, monospace);\n font-size: 11px;\n color: var(--ink-faint, #68645c);\n}\n\n.file-counts {\n display: inline-flex;\n gap: 8px;\n font-family: var(--mono, monospace);\n font-size: 11px;\n}\n\n.file-counts .adds { color: var(--accent-teal, #087f6f); }\n.file-counts .dels { color: var(--accent-err, #c9341c); }\n\n.diff-file-body { display: grid; gap: 0; }\n\n.diff-hunk { border-top: 1px solid var(--rule-light, #d8d1c4); }\n.diff-hunk:first-child { border-top: 0; }\n\n.diff-hunk-head {\n background: var(--paper-tint, #f2efe7);\n padding: 4px 10px;\n font-family: var(--mono, monospace);\n font-size: 11px;\n color: var(--ink-faint, #68645c);\n}\n\n.diff-hunk table {\n width: 100%;\n border-collapse: collapse;\n font-family: var(--mono, monospace);\n font-size: 12px;\n line-height: 1.45;\n}\n\n.diff-line.line-add {\n background: color-mix(in srgb, var(--accent-teal, #087f6f) 10%, var(--paper, #fffdf8));\n}\n\n.diff-line.line-del {\n background: color-mix(in srgb, var(--accent-err, #c9341c) 10%, var(--paper, #fffdf8));\n}\n\n.diff-line.line-meta { color: var(--ink-fainter, #918b80); }\n\n.diff-line td {\n padding: 0;\n vertical-align: top;\n white-space: pre-wrap;\n word-break: break-word;\n}\n\n.diff-line .ln {\n width: 48px;\n padding: 0 8px;\n color: var(--ink-fainter, #918b80);\n text-align: right;\n user-select: none;\n background: color-mix(in srgb, var(--paper-tint, #f2efe7) 60%, var(--paper, #fffdf8));\n border-right: 1px solid var(--rule-light, #d8d1c4);\n font-variant-numeric: tabular-nums;\n}\n\n.diff-line.line-add .ln.new,\n.diff-line.line-del .ln.old {\n color: var(--ink-soft, #2c2b28);\n}\n\n.diff-line .marker {\n width: 18px;\n padding: 0 4px;\n text-align: center;\n color: var(--ink-faint, #68645c);\n user-select: none;\n}\n\n.diff-line.line-add .marker { color: var(--accent-teal, #087f6f); }\n.diff-line.line-del .marker { color: var(--accent-err, #c9341c); }\n.diff-line .content { padding: 0 8px; }\n"; +function ru() { + if (typeof document > "u" || document.getElementById(tu)) return; let e = document.createElement("style"); - e.id = Yl, e.textContent = Xl, document.head.appendChild(e); + e.id = tu, e.textContent = nu, document.head.appendChild(e); } //#endregion //#region ../extensions/first-party/ext_pull_requests/ui/src/DiffView.vue?vue&type=script&setup=true&lang.ts -var Ql = { +var iu = { class: "diff-view", "data-smoke": "pulls-diff-view" -}, $l = { class: "diff-summary" }, eu = { class: "diff-totals" }, tu = { class: "adds" }, nu = { class: "dels" }, ru = { +}, au = { class: "diff-summary" }, ou = { class: "diff-totals" }, su = { class: "adds" }, cu = { class: "dels" }, lu = { key: 0, class: "muted" -}, iu = { +}, uu = { key: 1, class: "muted error" -}, au = { +}, du = { key: 2, class: "muted" -}, ou = { +}, fu = { key: 3, class: "diff-files" -}, su = ["data-diff-file-index"], cu = [ +}, pu = ["data-diff-file-index"], mu = [ "aria-expanded", "onClick", "onKeydown", "onFocus" -], lu = { class: "caret" }, uu = { class: "file-path" }, du = { +], hu = { class: "caret" }, gu = { class: "file-path" }, _u = { key: 0, class: "file-rename" -}, fu = { class: "file-counts" }, pu = { class: "adds" }, mu = { class: "dels" }, hu = { +}, vu = { class: "file-counts" }, yu = { class: "adds" }, bu = { class: "dels" }, xu = { key: 0, class: "diff-file-body" -}, gu = { +}, Su = { key: 0, class: "muted" -}, _u = { class: "diff-hunk-head" }, vu = { class: "ln old" }, yu = { class: "ln new" }, bu = { class: "marker" }, xu = { class: "content" }, Su = /* @__PURE__ */ zn({ +}, Cu = { class: "diff-hunk-head" }, wu = { class: "ln old" }, Tu = { class: "ln new" }, Eu = { class: "marker" }, Du = { class: "content" }, Ou = /* @__PURE__ */ Vn({ __name: "DiffView", props: { patch: { type: String }, @@ -5438,11 +5499,11 @@ var Ql = { error: { type: [String, null] } }, setup(e) { - Zl(); - let t = e, n = /* @__PURE__ */ L({}), r = /* @__PURE__ */ L(0), i = X(() => Gl(t.patch)), a = X(() => Jl(i.value)); - B(i, (e) => { + ru(); + let t = e, n = /* @__PURE__ */ I({}), r = /* @__PURE__ */ I(0), i = X(() => Zl(t.patch)), a = X(() => eu(i.value)); + Nn(i, (e) => { r.value >= e.length && (r.value = Math.max(0, e.length - 1)); - }), fs({ + }), hs({ "]": (e) => { i.value.length !== 0 && (e.preventDefault(), l(Math.min(r.value + 1, i.value.length - 1))); }, @@ -5483,10 +5544,10 @@ var Ql = { block: "start" }); } - return (t, n) => (W(), G("section", Ql, [K("header", $l, [n[1] ||= K("h2", null, "Files changed", -1), K("div", eu, [ - K("span", null, [q(j(a.value.files) + " file", 1), a.value.files === 1 ? J("", !0) : (W(), G(U, { key: 0 }, [q("s")], 64))]), - K("span", tu, "+" + j(a.value.additions), 1), - K("span", nu, "-" + j(a.value.deletions), 1), + return (t, n) => (W(), G("section", iu, [K("header", au, [n[1] ||= K("h2", null, "Files changed", -1), K("div", ou, [ + K("span", null, [q(A(a.value.files) + " file", 1), a.value.files === 1 ? J("", !0) : (W(), G(H, { key: 0 }, [q("s")], 64))]), + K("span", su, "+" + A(a.value.additions), 1), + K("span", cu, "-" + A(a.value.deletions), 1), n[0] ||= K("span", { class: "hint" }, [ K("kbd", null, "n"), q("/"), @@ -5495,9 +5556,9 @@ var Ql = { K("kbd", null, "space"), q(" collapse ") ], -1) - ])]), e.loading ? (W(), G("p", ru, "Loading diff…")) : e.error ? (W(), G("p", iu, j(e.error), 1)) : i.value.length === 0 ? (W(), G("p", au, " No diff to show. Push commits to head and base refs to populate this view. ")) : (W(), G("ol", ou, [(W(!0), G(U, null, ur(i.value, (e, t) => (W(), G("li", { + ])]), e.loading ? (W(), G("p", lu, "Loading diff…")) : e.error ? (W(), G("p", uu, A(e.error), 1)) : i.value.length === 0 ? (W(), G("p", du, " No diff to show. Push commits to head and base refs to populate this view. ")) : (W(), G("ol", fu, [(W(!0), G(H, null, z(i.value, (e, t) => (W(), G("li", { key: e.displayPath + t, - class: A(["diff-file", { focused: t === r.value }]), + class: k(["diff-file", { focused: t === r.value }]), "data-diff-file-index": t }, [K("header", { class: "diff-file-head", @@ -5508,99 +5569,102 @@ var Ql = { onKeydown: po(uo((t) => o(e.displayPath), ["prevent"]), ["enter"]), onFocus: (e) => r.value = t }, [ - K("span", lu, j(s(e.displayPath) ? "▸" : "▾"), 1), - K("span", { class: A(["file-status", `status-${e.status}`]) }, j(c(e)), 3), - K("code", uu, j(e.displayPath), 1), - e.status === "renamed" && e.oldPath !== e.newPath ? (W(), G("span", du, [n[2] ||= q(" from ", -1), K("code", null, j(e.oldPath), 1)])) : J("", !0), - K("span", fu, [K("span", pu, "+" + j(e.additions), 1), K("span", mu, "-" + j(e.deletions), 1)]) - ], 40, cu), s(e.displayPath) ? J("", !0) : (W(), G("div", hu, [e.binary ? (W(), G("p", gu, "Binary file — no preview.")) : (W(!0), G(U, { key: 1 }, ur(e.hunks, (e, t) => (W(), G("section", { + K("span", hu, A(s(e.displayPath) ? "▸" : "▾"), 1), + K("span", { class: k(["file-status", `status-${e.status}`]) }, A(c(e)), 3), + K("code", gu, A(e.displayPath), 1), + e.status === "renamed" && e.oldPath !== e.newPath ? (W(), G("span", _u, [n[2] ||= q(" from ", -1), K("code", null, A(e.oldPath), 1)])) : J("", !0), + K("span", vu, [K("span", yu, "+" + A(e.additions), 1), K("span", bu, "-" + A(e.deletions), 1)]) + ], 40, mu), s(e.displayPath) ? J("", !0) : (W(), G("div", xu, [e.binary ? (W(), G("p", Su, "Binary file — no preview.")) : (W(!0), G(H, { key: 1 }, z(e.hunks, (e, t) => (W(), G("section", { key: t, class: "diff-hunk" - }, [K("header", _u, [K("code", null, j(e.header.replace(/^@@ /, "").replace(/ @@$/, "")), 1)]), K("table", null, [K("tbody", null, [(W(!0), G(U, null, ur(e.lines, (e, t) => (W(), G("tr", { + }, [K("header", Cu, [K("code", null, A(e.header.replace(/^@@ /, "").replace(/ @@$/, "")), 1)]), K("table", null, [K("tbody", null, [(W(!0), G(H, null, z(e.lines, (e, t) => (W(), G("tr", { key: t, - class: A(["diff-line", `line-${e.kind}`]) + class: k(["diff-line", `line-${e.kind}`]) }, [ - K("td", vu, j(e.oldNumber ?? ""), 1), - K("td", yu, j(e.newNumber ?? ""), 1), - K("td", bu, [e.kind === "add" ? (W(), G(U, { key: 0 }, [q("+")], 64)) : e.kind === "del" ? (W(), G(U, { key: 1 }, [q("-")], 64)) : e.kind === "meta" ? (W(), G(U, { key: 2 }, [q("\\")], 64)) : (W(), G(U, { key: 3 }, [], 64))]), - K("td", xu, j(e.text), 1) - ], 2))), 128))])])]))), 128))]))], 10, su))), 128))]))])); + K("td", wu, A(e.oldNumber ?? ""), 1), + K("td", Tu, A(e.newNumber ?? ""), 1), + K("td", Eu, [e.kind === "add" ? (W(), G(H, { key: 0 }, [q("+")], 64)) : e.kind === "del" ? (W(), G(H, { key: 1 }, [q("-")], 64)) : e.kind === "meta" ? (W(), G(H, { key: 2 }, [q("\\")], 64)) : (W(), G(H, { key: 3 }, [], 64))]), + K("td", Du, A(e.text), 1) + ], 2))), 128))])])]))), 128))]))], 10, pu))), 128))]))])); } -}), Cu = { +}), ku = { class: "pulls-detail", "data-smoke": "pulls-detail" -}, wu = { +}, Au = { key: 0, class: "pulls-empty" -}, Tu = { +}, ju = { key: 1, class: "pulls-error", role: "alert" -}, Eu = { +}, Mu = { key: 2, class: "pulls-empty" -}, Du = ["href"], Ou = { class: "pulls-detail-head" }, ku = { class: "pulls-detail-title" }, Au = ["href"], ju = { class: "pulls-detail-number" }, Mu = { +}, Nu = ["href"], Pu = { class: "pulls-detail-head" }, Fu = { class: "pulls-detail-title" }, Iu = { class: "pulls-detail-number" }, Lu = { class: "pulls-chip-row", "aria-label": "Pull request metadata" -}, Nu = { class: "pull-chip tone-branch" }, Pu = ["title"], Fu = ["data-author-kind", "title"], Iu = { class: "chip-glyph" }, Lu = { +}, Ru = { class: "pull-chip tone-branch" }, zu = ["title"], Bu = ["data-author-kind", "title"], Vu = { class: "chip-glyph" }, Hu = { key: 0, class: "pull-chip tone-time tone-merged" -}, Ru = { +}, Uu = { key: 1, class: "pull-chip tone-time tone-closed" -}, zu = { +}, Wu = { key: 2, class: "pull-chip tone-time" -}, Bu = { class: "pulls-detail-actions" }, Vu = ["disabled"], Hu = ["disabled"], Uu = { +}, Gu = { class: "pulls-detail-actions" }, Ku = ["disabled"], qu = ["disabled"], Ju = { key: 0, class: "pulls-action-message" -}, Wu = { +}, Yu = { key: 0, class: "pulls-detail-body" -}, Gu = ["innerHTML"], Ku = { +}, Xu = ["innerHTML"], Zu = { key: 1, class: "pulls-detail-body muted" -}, qu = { +}, Qu = { key: 2, class: "pulls-routed", "data-smoke": "pulls-routed", "aria-label": "CUE project routing" -}, Ju = { class: "muted" }, Yu = { class: "pulls-routed-list" }, Xu = ["href", "title"], Zu = { +}, $u = { class: "muted" }, ed = { class: "pulls-routed-list" }, td = ["href", "title"], nd = { key: 0, class: "pulls-routed-owners" -}, Qu = ["data-author-kind", "title"], $u = { class: "chip-glyph" }, ed = { +}, rd = ["data-author-kind", "title"], id = { class: "chip-glyph" }, ad = { key: 1, class: "pulls-routed-owners muted" -}, td = { +}, od = { key: 3, class: "pulls-linked-issues", "data-smoke": "pulls-linked-issues" -}, nd = { class: "muted" }, rd = { +}, sd = { class: "muted" }, cd = { key: 0, role: "listbox", "aria-label": "Linked issues" -}, id = ["aria-selected", "onMouseenter"], ad = ["href"], od = { class: "issue-num" }, sd = { class: "issue-title" }, cd = ["href", "title"], ld = { +}, ld = ["aria-selected", "onMouseenter"], ud = ["href"], dd = { class: "issue-num" }, fd = { class: "issue-title" }, pd = ["href", "title"], md = { key: 1, class: "pulls-linked-foot" -}, ud = { +}, hd = { key: 0, class: "pulls-detail-discussion-count" -}, dd = /* @__PURE__ */ Vl(/* @__PURE__ */ zn({ +}, gd = /* @__PURE__ */ ql(/* @__PURE__ */ Vn({ __name: "PullsDetail", - props: { routeParams: { type: null } }, + props: { + routeParams: { type: null }, + repositoryPath: { type: [String, null] } + }, setup(e) { - let t = e, n = X(() => t.routeParams?.params?.pullId ?? ""), r = /* @__PURE__ */ L(null), i = /* @__PURE__ */ L("idle"), a = /* @__PURE__ */ L(null), o = /* @__PURE__ */ L("idle"), s = /* @__PURE__ */ L(null), c = /* @__PURE__ */ L(""), l = /* @__PURE__ */ L(""), u = /* @__PURE__ */ L("idle"), d = /* @__PURE__ */ L(null), f = /* @__PURE__ */ L([]), p = /* @__PURE__ */ L("idle"), m = /* @__PURE__ */ L(-1), h = /* @__PURE__ */ L([]); - function g(e) { + let t = e, n = X(() => t.routeParams?.params?.pullId ?? ""), r = X(() => Fl(t.repositoryPath)), i = /* @__PURE__ */ I(null), a = /* @__PURE__ */ I("idle"), o = /* @__PURE__ */ I(null), s = /* @__PURE__ */ I("idle"), c = /* @__PURE__ */ I(null), l = /* @__PURE__ */ I(""), u = /* @__PURE__ */ I(""), d = /* @__PURE__ */ I("idle"), f = /* @__PURE__ */ I(null), p = /* @__PURE__ */ I([]), m = /* @__PURE__ */ I("idle"), h = /* @__PURE__ */ I(-1), g = /* @__PURE__ */ I([]); + function _(e) { let t = (e ?? "").replace(/^\.\//, "").replace(/\/+$/g, ""); return t === "." ? "" : t; } - let _ = X(() => { - if (h.value.length === 0 || !c.value) return []; - let e = h.value.map((e) => ({ + let v = X(() => { + if (g.value.length === 0 || !l.value) return []; + let e = g.value.map((e) => ({ name: e.name ?? "", - root: g(e.root) + root: _(e.root) })).filter((e) => e.name).sort((e, t) => t.root.length - e.root.length), t = /* @__PURE__ */ new Set(); - for (let n of Gl(c.value)) { + for (let n of Zl(l.value)) { let r = n.displayPath.replace(/^\/+/, ""); for (let n of e) if (n.root === "" || r === n.root || r.startsWith(`${n.root}/`)) { t.add(n.name); @@ -5608,91 +5672,94 @@ var Ql = { } } return Array.from(t).sort(); - }), v = X(() => { + }), y = X(() => { let e = /* @__PURE__ */ new Set(); - for (let t of f.value) t.projectName && e.add(t.projectName); + for (let t of p.value) t.projectName && e.add(t.projectName); return Array.from(e).sort(); - }), y = X(() => { - let e = new Set([..._.value, ...v.value]); + }), b = X(() => { + let e = new Set([...v.value, ...y.value]); return Array.from(e).sort().map((e) => ({ name: e, - owners: (h.value.find((t) => t.name === e)?.owners ?? []).map((e) => e?.ref).filter((e) => typeof e == "string" && e.length > 0) + owners: (g.value.find((t) => t.name === e)?.owners ?? []).map((e) => e?.ref).filter((e) => typeof e == "string" && e.length > 0) })); - }), b = cl, x = X(() => Ml(r.value?.state)), S = X(() => r.value && (r.value.state === "READY" || r.value.state === "DRAFT")), C = X(() => r.value && r.value.state !== "CLOSED" && r.value.state !== "MERGED"), w = X(() => r.value?.bodyMarkdown ? el(r.value.bodyMarkdown, { workspaceId: defaultWorkspaceId() }) : ""), ee = X(() => r.value ? `comtrya://pull-request/${r.value.id}` : ""), T = /* @__PURE__ */ L(null); - function te(e) { + }), x = dl, S = X(() => Rl(i.value?.state)), C = X(() => i.value && (i.value.state === "READY" || i.value.state === "DRAFT")), w = X(() => i.value && i.value.state !== "CLOSED" && i.value.state !== "MERGED"), ee = X(() => i.value?.bodyMarkdown ? rl(i.value.bodyMarkdown, { workspaceId: Pl() }) : ""), te = X(() => i.value ? `comtrya://pull-request/${i.value.id}` : ""), ne = /* @__PURE__ */ I(null); + function T(e) { let t = e.detail; - t && typeof t.count == "number" && (T.value = t.count); + t && typeof t.count == "number" && (ne.value = t.count); } - let E = []; - er(() => { - ne(), ae(), D(); + let re = []; + nr(() => { + ie(), se(), ae(); for (let e of [ "dev.comtrya.issues.opened", "dev.comtrya.issues.closed", "dev.comtrya.issues.reopened" - ]) E.push(Fo({ + ]) re.push(Lo({ type: e, - onEvent: () => void D(), + onEvent: () => void ae(), onError: () => {} })); - }), ir(() => { - for (let e of E) e(); - E.length = 0; - }), B(n, () => void D()), fs({ + }), or(() => { + for (let e of re) e(); + re.length = 0; + }), Nn(n, () => void ae()), hs({ m: (e) => { - S.value && (e.preventDefault(), oe()); + C.value && (e.preventDefault(), ue()); }, x: (e) => { - C.value && (e.preventDefault(), se()); + w.value && (e.preventDefault(), de()); }, j: (e) => { - if (f.value.length === 0) return; + if (p.value.length === 0) return; e.preventDefault(); - let t = m.value + 1; - m.value = t >= f.value.length ? 0 : t; + let t = h.value + 1; + h.value = t >= p.value.length ? 0 : t; }, k: (e) => { - if (f.value.length === 0) return; + if (p.value.length === 0) return; e.preventDefault(); - let t = m.value - 1; - m.value = t < 0 ? f.value.length - 1 : t; + let t = h.value - 1; + h.value = t < 0 ? p.value.length - 1 : t; }, Enter: (e) => { - if (m.value < 0) return; - let t = f.value[m.value]; - t && (e.preventDefault(), window.location.href = re(t)); + if (h.value < 0) return; + let t = p.value[h.value]; + t && (e.preventDefault(), window.location.href = D(t)); }, Escape: (e) => { - document.querySelector(".shortcuts-backdrop, .palette-backdrop") || (e.preventDefault(), window.location.href = Al()); + document.querySelector(".shortcuts-backdrop, .palette-backdrop") || E(e); } - }), B(n, () => void ne()); - async function ne() { + }), Nn(n, () => void ie()); + function E(e) { + e.preventDefault(), window.location.href = r.value; + } + async function ie() { if (!n.value) { - i.value = "error", a.value = "Missing pull id"; + a.value = "error", o.value = "Missing pull id"; return; } - i.value = "loading", a.value = null; + a.value = "loading", o.value = null; try { - r.value = await Sl(n.value), i.value = r.value ? "ready" : "empty"; + i.value = await El(n.value), a.value = i.value ? "ready" : "empty"; } catch (e) { - i.value = "error", a.value = e instanceof Error ? e.message : String(e); + a.value = "error", o.value = e instanceof Error ? e.message : String(e); } } - async function D() { + async function ae() { if (n.value) { - p.value = "loading"; + m.value = "loading"; try { - f.value = await El(n.value), p.value = "ready"; + p.value = await Al(n.value), m.value = "ready"; } catch { - f.value = [], p.value = "error"; + p.value = [], m.value = "error"; } - m.value = -1; + h.value = -1; } } - function re(e) { + function D(e) { return e.workspaceId && e.number !== null ? `/x/issues/${e.workspaceId}/${e.number}` : "/x/issues/"; } - function ie(e) { + function oe(e) { return `/x/issues/?project=${encodeURIComponent(e)}`; } function O(e) { @@ -5701,158 +5768,166 @@ var Ql = { default: return "issue-state-open"; } } - async function ae() { - u.value = "loading", d.value = null; + async function se() { + d.value = "loading", f.value = null; try { - let e = k(); + let e = ce(); if (e.length === 0) { - c.value = "", l.value = "", h.value = [], u.value = "ready"; + l.value = "", u.value = "", g.value = [], d.value = "ready"; return; } - let t = await Mo().query("query PullProjects($segments: [String!]!) {\n workspace { repositoryByPath(segments: $segments) { comtryaConfig } }\n }", { segments: e }); - c.value = "", l.value = "", h.value = t.workspace?.repositoryByPath?.comtryaConfig?.projects ?? [], u.value = "ready"; + let t = await Po().query("query PullProjects($segments: [String!]!) {\n workspace { repositoryByPath(segments: $segments) { comtryaConfig } }\n }", { segments: e }); + l.value = "", u.value = "", g.value = t.workspace?.repositoryByPath?.comtryaConfig?.projects ?? [], d.value = "ready"; } catch (e) { - u.value = "error", d.value = e instanceof Error ? e.message : String(e); + d.value = "error", f.value = e instanceof Error ? e.message : String(e); } } - function k() { + function ce() { + let e = t.repositoryPath?.split("/").filter(Boolean) ?? []; + return e.length > 0 ? e : le(); + } + function le() { if (typeof window > "u") return []; let e = window.location.pathname; if (!e.startsWith("/r/")) return []; - let t = e.slice(3), n = t.indexOf("/p/"); + let t = e.slice(3), n = t.search(/\/(?:pulls|issues|checks|epics|p)\//); return (n >= 0 ? t.slice(0, n) : t).split("/").filter(Boolean).map(decodeURIComponent); } - async function oe() { - if (!(!r.value || !S.value)) { - o.value = "merging", s.value = null; + async function ue() { + if (!(!i.value || !C.value)) { + s.value = "merging", c.value = null; try { - r.value = await Cl(r.value.id), s.value = `Merged pull #${r.value.number}`; + i.value = await Dl(i.value.id), c.value = `Merged pull #${i.value.number}`; } catch (e) { - s.value = e instanceof Error ? e.message : String(e); + c.value = e instanceof Error ? e.message : String(e); } finally { - o.value = "idle"; + s.value = "idle"; } } } - async function se() { - if (!(!r.value || !C.value)) { - o.value = "closing", s.value = null; + async function de() { + if (!(!i.value || !w.value)) { + s.value = "closing", c.value = null; try { - r.value = await wl(r.value.id), s.value = `Closed pull #${r.value.number}`; + i.value = await Ol(i.value.id), c.value = `Closed pull #${i.value.number}`; } catch (e) { - s.value = e instanceof Error ? e.message : String(e); + c.value = e instanceof Error ? e.message : String(e); } finally { - o.value = "idle"; + s.value = "idle"; } } } - return (e, t) => (W(), G("article", Cu, [i.value === "loading" ? (W(), G("p", wu, "Loading pull request…")) : i.value === "error" ? (W(), G("p", Tu, j(a.value), 1)) : i.value === "empty" || !r.value ? (W(), G("p", Eu, [ + return (e, t) => (W(), G("article", ku, [a.value === "loading" ? (W(), G("p", Au, "Loading pull request…")) : a.value === "error" ? (W(), G("p", ju, A(o.value), 1)) : a.value === "empty" || !i.value ? (W(), G("p", Mu, [ t[0] ||= q(" No pull request found for ", -1), - K("code", null, j(n.value), 1), + K("code", null, A(n.value), 1), t[1] ||= q(". ", -1), - K("a", { href: R(Al)() }, "← back to queue", 8, Du) - ])) : (W(), G(U, { key: 3 }, [ - K("header", Ou, [K("div", ku, [ - K("a", { - href: R(Al)(), + K("a", { + href: r.value, + onClick: E + }, "← Pull requests", 8, Nu) + ])) : (W(), G(H, { key: 3 }, [ + K("header", Pu, [K("div", Fu, [ + K("button", { + type: "button", class: "back", - "aria-label": "Back to pull request queue" - }, "←", 8, Au), - K("span", ju, "#" + j(r.value.number), 1), - K("h1", null, j(r.value.title), 1) - ]), K("div", Mu, [ - K("span", { class: A([ + "aria-label": "Back to pull requests", + onClick: E + }, "← Pull requests"), + K("span", Iu, "#" + A(i.value.number), 1), + K("h1", null, A(i.value.title), 1) + ]), K("div", Lu, [ + K("span", { class: k([ "pull-chip", "tone-state", - x.value.className - ]) }, j(x.value.label), 3), - K("span", Nu, [ - K("code", null, j(r.value.headRef), 1), + S.value.className + ]) }, A(S.value.label), 3), + K("span", Ru, [ + K("code", null, A(i.value.headRef), 1), t[2] ||= K("span", { class: "branch-arrow", "aria-hidden": "true" }, "→", -1), - K("code", null, j(r.value.baseRef), 1) + K("code", null, A(i.value.baseRef), 1) ]), - (W(!0), G(U, null, ur(_.value, (e) => (W(), G("span", { + (W(!0), G(H, null, z(v.value, (e) => (W(), G("span", { key: `project-${e}`, class: "pull-chip tone-project", title: `Touches files inside the ${e} Project's root` - }, [t[3] ||= K("span", { class: "chip-glyph" }, "◇", -1), q(j(e), 1)], 8, Pu))), 128)), + }, [t[3] ||= K("span", { class: "chip-glyph" }, "◇", -1), q(A(e), 1)], 8, zu))), 128)), K("span", { class: "pull-chip tone-author", - "data-author-kind": R(cl)(r.value.authorRef).kind, - title: `Opened by ${r.value.authorRef}` - }, [K("span", Iu, j(R(cl)(r.value.authorRef).glyph), 1), q(" by " + j(R(cl)(r.value.authorRef).label), 1)], 8, Fu), - r.value.mergedAt ? (W(), G("span", Lu, " merged " + j(R(Nl)(r.value.mergedAt)), 1)) : r.value.closedAt ? (W(), G("span", Ru, " closed " + j(R(Nl)(r.value.closedAt)), 1)) : J("", !0), - r.value.createdAt ? (W(), G("span", zu, " opened " + j(R(Nl)(r.value.createdAt)), 1)) : J("", !0) + "data-author-kind": L(dl)(i.value.authorRef).kind, + title: `Opened by ${i.value.authorRef}` + }, [K("span", Vu, A(L(dl)(i.value.authorRef).glyph), 1), q(" by " + A(L(dl)(i.value.authorRef).label), 1)], 8, Bu), + i.value.mergedAt ? (W(), G("span", Hu, " merged " + A(L(zl)(i.value.mergedAt)), 1)) : i.value.closedAt ? (W(), G("span", Uu, " closed " + A(L(zl)(i.value.closedAt)), 1)) : J("", !0), + i.value.createdAt ? (W(), G("span", Wu, " opened " + A(L(zl)(i.value.createdAt)), 1)) : J("", !0) ])]), - K("section", Bu, [ + K("section", Gu, [ K("button", { type: "button", class: "pulls-action primary", - disabled: !S.value || o.value !== "idle", - onClick: oe - }, [q(j(o.value === "merging" ? "Merging…" : "Merge") + " ", 1), t[4] ||= K("kbd", null, "m", -1)], 8, Vu), + disabled: !C.value || s.value !== "idle", + onClick: ue + }, [q(A(s.value === "merging" ? "Merging…" : "Merge") + " ", 1), t[4] ||= K("kbd", null, "m", -1)], 8, Ku), K("button", { type: "button", class: "pulls-action", - disabled: !C.value || o.value !== "idle", - onClick: se - }, [q(j(o.value === "closing" ? "Closing…" : "Close") + " ", 1), t[5] ||= K("kbd", null, "x", -1)], 8, Hu), - s.value ? (W(), G("span", Uu, j(s.value), 1)) : J("", !0) + disabled: !w.value || s.value !== "idle", + onClick: de + }, [q(A(s.value === "closing" ? "Closing…" : "Close") + " ", 1), t[5] ||= K("kbd", null, "x", -1)], 8, qu), + c.value ? (W(), G("span", Ju, A(c.value), 1)) : J("", !0) ]), - w.value ? (W(), G("section", Wu, [t[6] ||= K("h2", null, "Description", -1), K("div", { + ee.value ? (W(), G("section", Yu, [t[6] ||= K("h2", null, "Description", -1), K("div", { class: "pulls-detail-body-prose", - innerHTML: w.value - }, null, 8, Gu)])) : (W(), G("section", Ku, [...t[7] ||= [K("h2", null, "Description", -1), K("p", null, "No description provided.", -1)]])), - y.value.length > 0 ? (W(), G("section", qu, [ - K("header", null, [t[8] ||= K("h2", null, "Routed to", -1), K("span", Ju, [q(j(y.value.length) + " project", 1), y.value.length === 1 ? J("", !0) : (W(), G(U, { key: 0 }, [q("s")], 64))])]), - K("ul", Yu, [(W(!0), G(U, null, ur(y.value, (e) => (W(), G("li", { + innerHTML: ee.value + }, null, 8, Xu)])) : (W(), G("section", Zu, [...t[7] ||= [K("h2", null, "Description", -1), K("p", null, "No description provided.", -1)]])), + b.value.length > 0 ? (W(), G("section", Qu, [ + K("header", null, [t[8] ||= K("h2", null, "Routed to", -1), K("span", $u, [q(A(b.value.length) + " project", 1), b.value.length === 1 ? J("", !0) : (W(), G(H, { key: 0 }, [q("s")], 64))])]), + K("ul", ed, [(W(!0), G(H, null, z(b.value, (e) => (W(), G("li", { key: e.name, class: "pulls-routed-project" }, [K("a", { href: `/x/issues/?project=${encodeURIComponent(e.name)}`, class: "pulls-routed-name", title: `Filter issues to project ${e.name}` - }, "◇ " + j(e.name), 9, Xu), e.owners.length > 0 ? (W(), G("ul", Zu, [(W(!0), G(U, null, ur(e.owners, (e) => (W(), G("li", { + }, "◇ " + A(e.name), 9, td), e.owners.length > 0 ? (W(), G("ul", nd, [(W(!0), G(H, null, z(e.owners, (e) => (W(), G("li", { key: e, class: "pulls-routed-owner", - "data-author-kind": R(b)(e).kind, + "data-author-kind": L(x)(e).kind, title: e - }, [K("span", $u, j(R(b)(e).glyph), 1), q(" " + j(R(b)(e).label), 1)], 8, Qu))), 128))])) : (W(), G("span", ed, " no owners declared "))]))), 128))]), + }, [K("span", id, A(L(x)(e).glyph), 1), q(" " + A(L(x)(e).label), 1)], 8, rd))), 128))])) : (W(), G("span", ad, " no owners declared "))]))), 128))]), t[9] ||= K("p", { class: "pulls-routed-source" }, [ q(" From paths the diff touched · issues this PR closes · "), K("code", null, "package comtrya"), q(" owners ") ], -1) ])) : J("", !0), - p.value !== "idle" || f.value.length > 0 ? (W(), G("section", td, [ - K("header", null, [t[10] ||= K("h2", null, "Closes", -1), K("span", nd, [p.value === "loading" ? (W(), G(U, { key: 0 }, [q("resolving…")], 64)) : f.value.length === 0 ? (W(), G(U, { key: 1 }, [q(" no linked issues ")], 64)) : (W(), G(U, { key: 2 }, [ - q(j(f.value.length) + " issue", 1), - f.value.length === 1 ? J("", !0) : (W(), G(U, { key: 0 }, [q("s")], 64)), - r.value.state === "MERGED" ? (W(), G(U, { key: 1 }, [q(" — auto-closed on merge")], 64)) : (W(), G(U, { key: 2 }, [q(" — will close on merge")], 64)) + m.value !== "idle" || p.value.length > 0 ? (W(), G("section", od, [ + K("header", null, [t[10] ||= K("h2", null, "Closes", -1), K("span", sd, [m.value === "loading" ? (W(), G(H, { key: 0 }, [q("resolving…")], 64)) : p.value.length === 0 ? (W(), G(H, { key: 1 }, [q(" no linked issues ")], 64)) : (W(), G(H, { key: 2 }, [ + q(A(p.value.length) + " issue", 1), + p.value.length === 1 ? J("", !0) : (W(), G(H, { key: 0 }, [q("s")], 64)), + i.value.state === "MERGED" ? (W(), G(H, { key: 1 }, [q(" — auto-closed on merge")], 64)) : (W(), G(H, { key: 2 }, [q(" — will close on merge")], 64)) ], 64))])]), - f.value.length > 0 ? (W(), G("ul", rd, [(W(!0), G(U, null, ur(f.value, (e, t) => (W(), G("li", { + p.value.length > 0 ? (W(), G("ul", cd, [(W(!0), G(H, null, z(p.value, (e, t) => (W(), G("li", { key: e.uri, - class: A({ focused: t === m.value }), - "aria-selected": t === m.value, + class: k({ focused: t === h.value }), + "aria-selected": t === h.value, role: "option", - onMouseenter: (e) => m.value = t + onMouseenter: (e) => h.value = t }, [ K("a", { - href: re(e), + href: D(e), class: "issue-link" - }, [K("span", od, [e.number === null ? (W(), G(U, { key: 1 }, [q("issue")], 64)) : (W(), G(U, { key: 0 }, [q("#" + j(e.number), 1)], 64))]), K("span", sd, j(e.title), 1)], 8, ad), + }, [K("span", dd, [e.number === null ? (W(), G(H, { key: 1 }, [q("issue")], 64)) : (W(), G(H, { key: 0 }, [q("#" + A(e.number), 1)], 64))]), K("span", fd, A(e.title), 1)], 8, ud), e.projectName ? (W(), G("a", { key: 0, class: "issue-project", - href: ie(e.projectName), + href: oe(e.projectName), title: `Filter to project ${e.projectName}` - }, "◇ " + j(e.projectName), 9, cd)) : J("", !0), - K("span", { class: A(["issue-state", O(e.state)]) }, j(e.state.toLowerCase()), 3) - ], 42, id))), 128))])) : J("", !0), - f.value.length > 0 ? (W(), G("footer", ld, [...t[11] ||= [ + }, "◇ " + A(e.projectName), 9, pd)) : J("", !0), + K("span", { class: k(["issue-state", O(e.state)]) }, A(e.state.toLowerCase()), 3) + ], 42, ld))), 128))])) : J("", !0), + p.value.length > 0 ? (W(), G("footer", md, [...t[11] ||= [ K("kbd", null, "j", -1), q(), K("kbd", null, "k", -1), @@ -5864,16 +5939,16 @@ var Ql = { K("section", { class: "pulls-detail-discussion", "data-smoke": "pulls-detail-discussion", - onCommentThreadUpdate: te - }, [K("header", null, [K("h2", null, [t[12] ||= q(" Discussion", -1), T.value === null ? J("", !0) : (W(), G("span", ud, " (" + j(T.value) + ")", 1))])]), Ii(Hl, { + onCommentThreadUpdate: T + }, [K("header", null, [K("h2", null, [t[12] ||= q(" Discussion", -1), ne.value === null ? J("", !0) : (W(), G("span", hd, " (" + A(ne.value) + ")", 1))])]), Ii(Jl, { tag: "comtrya-comment-thread", - attributes: { target: ee.value }, - properties: { target: ee.value } + attributes: { target: te.value }, + properties: { target: te.value } }, null, 8, ["attributes", "properties"])], 32), - Ii(Su, { - patch: c.value, - loading: u.value === "loading", - error: d.value + Ii(Ou, { + patch: l.value, + loading: d.value === "loading", + error: f.value }, null, 8, [ "patch", "loading", @@ -5881,94 +5956,241 @@ var Ql = { ]) ], 64))])); } -}), [["styles", [".pulls-detail[data-v-236e0de4]{font-family:var(--font-sans,system-ui);gap:22px;display:grid}.pulls-detail-head[data-v-236e0de4]{border-bottom:.5px solid var(--fg,#fffffff0);gap:12px;padding-bottom:16px;display:grid}.pulls-detail-title[data-v-236e0de4]{flex-wrap:wrap;align-items:baseline;gap:12px;display:flex}.pulls-detail-title h1[data-v-236e0de4]{font-family:var(--font-serif,system-ui);flex:320px;margin:0;font-size:28px;line-height:1.1}.back[data-v-236e0de4]{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);font-size:16px;text-decoration:none}.back[data-v-236e0de4]:hover{color:var(--fg,#fffffff0)}.pulls-detail-number[data-v-236e0de4]{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);font-size:14px}.pulls-chip-row[data-v-236e0de4]{flex-wrap:wrap;align-items:center;gap:6px;margin:4px 0 0;display:flex}.pull-chip[data-v-236e0de4]{border:.5px solid var(--line,#ffffff12);font-family:var(--font-mono,monospace);color:var(--fg-2,#ffffffbd);align-items:center;gap:5px;padding:2px 8px;font-size:11px;line-height:16px;display:inline-flex}.pull-chip .chip-glyph[data-v-236e0de4]{place-items:center;width:13px;height:13px;font-size:10px;font-weight:700;display:inline-grid}.pull-chip.tone-state[data-v-236e0de4]{text-transform:lowercase;letter-spacing:.02em;border-color:currentColor}.pull-chip.tone-state.pr-state-ready[data-v-236e0de4]{color:var(--accent-teal,#087f6f)}.pull-chip.tone-state.pr-state-draft[data-v-236e0de4]{color:var(--fg-3,#ffffff85)}.pull-chip.tone-state.pr-state-merged[data-v-236e0de4]{color:var(--accent-blue,#1d55a6)}.pull-chip.tone-state.pr-state-closed[data-v-236e0de4]{color:var(--accent-err,#c9341c)}.pull-chip.tone-project[data-v-236e0de4]{color:var(--accent-blue,#1d55a6);cursor:help;border-color:currentColor}.pull-chip.tone-branch[data-v-236e0de4]{gap:4px}.pull-chip.tone-branch code[data-v-236e0de4]{font-family:var(--font-mono,monospace);color:var(--fg-2,#ffffffbd);font-size:11px}.pull-chip.tone-branch .branch-arrow[data-v-236e0de4]{color:var(--fg-4,#ffffff57);padding:0 2px}.pull-chip.tone-author[data-v-236e0de4]{color:var(--fg-2,#ffffffbd)}.pull-chip.tone-author[data-author-kind=agent][data-v-236e0de4]{color:#6b3fa0}.pull-chip.tone-author[data-author-kind=credential][data-v-236e0de4]{color:var(--accent-yellow,#c89300)}.pull-chip.tone-author[data-author-kind=bot][data-v-236e0de4]{color:var(--accent-blue,#1d55a6)}.pull-chip.tone-author[data-author-kind=team][data-v-236e0de4]{color:var(--accent-teal,#087f6f)}.pull-chip.tone-time[data-v-236e0de4]{color:var(--fg-3,#ffffff85);border-style:none;padding-left:2px}.pull-chip.tone-time.tone-merged[data-v-236e0de4]{color:var(--accent-blue,#1d55a6)}.pull-chip.tone-time.tone-closed[data-v-236e0de4]{color:var(--accent-err,#c9341c)}.pulls-detail-actions[data-v-236e0de4]{flex-wrap:wrap;align-items:center;gap:10px;display:flex}.pulls-action[data-v-236e0de4]{border:.5px solid var(--fg,#fffffff0);background:var(--bg,#0a0b0e);color:var(--fg,#fffffff0);font-family:var(--font-serif,system-ui);cursor:pointer;align-items:center;gap:8px;padding:8px 14px;font-weight:600;display:inline-flex}.pulls-action.primary[data-v-236e0de4]{background:var(--fg,#fffffff0);color:var(--bg,#0a0b0e)}.pulls-action[disabled][data-v-236e0de4]{opacity:.5;cursor:not-allowed}.pulls-action kbd[data-v-236e0de4]{font-family:var(--font-mono,monospace);opacity:.6;border:.5px solid;padding:0 4px;font-size:10px}.pulls-action-message[data-v-236e0de4]{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);font-size:12px}.pulls-detail-body h2[data-v-236e0de4]{font-family:var(--font-serif,system-ui);margin:0 0 8px;font-size:16px}.pulls-detail-body-prose[data-v-236e0de4]{color:var(--fg,#fffffff0);font-size:14px;line-height:1.6}.pulls-detail-body-prose h1[data-v-236e0de4],.pulls-detail-body-prose h2[data-v-236e0de4],.pulls-detail-body-prose h3[data-v-236e0de4],.pulls-detail-body-prose h4[data-v-236e0de4],.pulls-detail-body-prose h5[data-v-236e0de4],.pulls-detail-body-prose h6[data-v-236e0de4]{font-family:var(--font-serif,system-ui);margin:1.1em 0 .4em;font-weight:600;line-height:1.25}.pulls-detail-body-prose h1[data-v-236e0de4]{font-size:20px}.pulls-detail-body-prose h2[data-v-236e0de4]{font-size:17px}.pulls-detail-body-prose h3[data-v-236e0de4],.pulls-detail-body-prose h4[data-v-236e0de4]{font-size:15px}.pulls-detail-body-prose p[data-v-236e0de4]{margin:.55em 0}.pulls-detail-body-prose ul[data-v-236e0de4],.pulls-detail-body-prose ol[data-v-236e0de4]{margin:.4em 0 .6em;padding-left:22px}.pulls-detail-body-prose li[data-v-236e0de4]{margin:.15em 0}.pulls-detail-body-prose code[data-v-236e0de4]{font-family:var(--font-mono,monospace);background:var(--bg-2,#0e1014);border-radius:2px;padding:1px 5px;font-size:.88em}.pulls-detail-body-prose pre[data-v-236e0de4]{font-family:var(--font-mono,monospace);background:var(--bg-2,#0e1014);border:.5px solid var(--line,#ffffff12);white-space:pre;word-break:normal;margin:.7em 0;padding:12px 14px;font-size:12.5px;line-height:1.55;overflow-x:auto}.pulls-detail-body-prose pre code[data-v-236e0de4]{font-size:inherit;background:0 0;padding:0}.pulls-detail-body-prose a[data-v-236e0de4]{color:var(--accent-teal,#087f6f);text-underline-offset:2px;text-decoration:underline}.pulls-detail-body-prose strong[data-v-236e0de4]{font-weight:600}.pulls-detail-body-prose em[data-v-236e0de4]{font-style:italic}.pulls-detail-body.muted p[data-v-236e0de4]{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);font-size:12px}.pulls-routed[data-v-236e0de4]{border:.5px solid var(--line,#ffffff12);background:var(--bg-2,#0e1014);gap:10px;padding:12px 14px;display:grid}.pulls-routed>header[data-v-236e0de4]{border-bottom:.5px solid var(--line,#ffffff12);justify-content:space-between;align-items:baseline;gap:12px;padding-bottom:6px;display:flex}.pulls-routed>header h2[data-v-236e0de4]{font-family:var(--font-serif,system-ui);margin:0;font-size:16px}.pulls-routed>header .muted[data-v-236e0de4]{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);font-size:11px}.pulls-routed-list[data-v-236e0de4]{gap:10px;margin:0;padding:0;list-style:none;display:grid}.pulls-routed-project[data-v-236e0de4]{border:.5px solid var(--line,#ffffff12);background:var(--bg,#0a0b0e);gap:6px;padding:8px 10px;display:grid}.pulls-routed-name[data-v-236e0de4]{font-family:var(--font-mono,monospace);color:var(--accent-blue,#1d55a6);letter-spacing:.02em;font-size:12px;text-decoration:none}.pulls-routed-name[data-v-236e0de4]:hover{text-underline-offset:2px;text-decoration:underline}.pulls-routed-owners[data-v-236e0de4]{flex-wrap:wrap;gap:6px;margin:0;padding:0;list-style:none;display:flex}.pulls-routed-owners.muted[data-v-236e0de4]{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);font-size:11px;font-style:italic}.pulls-routed-owner[data-v-236e0de4]{color:var(--fg,#fffffff0);font-family:var(--font-mono,monospace);letter-spacing:.02em;border:.5px solid;align-items:center;gap:5px;padding:2px 8px;font-size:11px;display:inline-flex}.pulls-routed-owner .chip-glyph[data-v-236e0de4]{font-family:var(--font-serif,system-ui);font-size:12px;line-height:1}.pulls-routed-owner[data-author-kind=team][data-v-236e0de4]{color:var(--accent-teal,#087f6f)}.pulls-routed-owner[data-author-kind=human][data-v-236e0de4]{color:var(--fg,#fffffff0)}.pulls-routed-owner[data-author-kind=agent][data-v-236e0de4]{color:#6b3fa0}.pulls-routed-owner[data-author-kind=bot][data-v-236e0de4]{color:var(--accent-blue,#1d55a6)}.pulls-routed-owner[data-author-kind=credential][data-v-236e0de4]{color:var(--accent-yellow,#c89300)}.pulls-routed-source[data-v-236e0de4]{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);margin:0;font-size:11px}.pulls-routed-source code[data-v-236e0de4]{font-family:var(--font-mono,monospace);background:var(--bg-2,#0e1014);color:var(--fg-2,#ffffffbd);padding:0 4px;font-size:11px}.pulls-linked-issues[data-v-236e0de4]{gap:8px;display:grid}.pulls-linked-issues header[data-v-236e0de4]{border-bottom:.5px solid var(--fg,#fffffff0);justify-content:space-between;align-items:baseline;gap:12px;padding-bottom:4px;display:flex}.pulls-linked-issues h2[data-v-236e0de4]{font-family:var(--font-serif,system-ui);margin:0;font-size:18px}.pulls-detail-discussion[data-v-236e0de4]{gap:8px;display:grid}.pulls-detail-discussion>header[data-v-236e0de4]{border-bottom:.5px solid var(--fg,#fffffff0);justify-content:space-between;align-items:baseline;gap:12px;padding-bottom:4px;display:flex}.pulls-detail-discussion>header h2[data-v-236e0de4]{font-family:var(--font-serif,system-ui);margin:0;font-size:18px}.pulls-detail-discussion-count[data-v-236e0de4]{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);font-size:13px;font-weight:400}.pulls-linked-issues .muted[data-v-236e0de4]{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);font-size:12px}.pulls-linked-issues ul[data-v-236e0de4]{margin:0;padding:0;list-style:none;display:grid}.pulls-linked-issues li[data-v-236e0de4]{border-bottom:.5px solid var(--line,#ffffff12);grid-template-columns:auto minmax(0,1fr) auto auto;align-items:baseline;gap:12px;padding:8px 10px;display:grid;position:relative}.pulls-linked-issues li[data-v-236e0de4]:last-child{border-bottom:0}.pulls-linked-issues li.focused[data-v-236e0de4]{box-shadow:inset 3px 0 0 var(--fg,#fffffff0);background:var(--bg-2,#0e1014)}.pulls-linked-issues li .issue-link[data-v-236e0de4]{color:inherit;text-decoration:none;display:contents}.pulls-linked-issues .issue-project[data-v-236e0de4]{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);border:.5px solid var(--line,#ffffff12);letter-spacing:.02em;white-space:nowrap;padding:1px 7px;font-size:11px;text-decoration:none}.pulls-linked-issues .issue-project[data-v-236e0de4]:hover{color:var(--fg,#fffffff0);border-color:var(--fg,#fffffff0)}.pulls-linked-foot[data-v-236e0de4]{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);letter-spacing:.04em;margin-top:6px;font-size:11px}.pulls-linked-foot kbd[data-v-236e0de4]{font-family:var(--font-mono,monospace);border:.5px solid var(--line,#ffffff12);margin:0 1px;padding:0 4px;font-size:10px}.pulls-linked-issues .issue-num[data-v-236e0de4]{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);font-variant-numeric:tabular-nums;font-size:12px}.pulls-linked-issues .issue-title[data-v-236e0de4]{font-family:var(--font-serif,system-ui);text-overflow:ellipsis;white-space:nowrap;font-weight:500;overflow:hidden}.pulls-linked-issues .issue-state[data-v-236e0de4]{font-family:var(--font-mono,monospace);letter-spacing:.04em;text-transform:uppercase;border:.5px solid;padding:0 5px;font-size:10px}.pulls-linked-issues .issue-state-open[data-v-236e0de4]{color:var(--accent-teal,#087f6f)}.pulls-linked-issues .issue-state-closed[data-v-236e0de4]{color:var(--accent-blue,#1d55a6)}.pulls-empty[data-v-236e0de4],.pulls-error[data-v-236e0de4]{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);font-size:13px}.pulls-error[data-v-236e0de4]{color:var(--accent-err,#c9341c)}"]], ["__scopeId", "data-v-236e0de4"]]), fd = { +}), [["styles", [".pulls-detail[data-v-fef353a9]{font-family:var(--font-sans,system-ui);gap:22px;display:grid}.pulls-detail-head[data-v-fef353a9]{border-bottom:.5px solid var(--fg,#fffffff0);gap:12px;padding-bottom:16px;display:grid}.pulls-detail-title[data-v-fef353a9]{flex-wrap:wrap;align-items:baseline;gap:12px;display:flex}.pulls-detail-title h1[data-v-fef353a9]{font-family:var(--font-serif,system-ui);flex:320px;margin:0;font-size:28px;line-height:1.1}.back[data-v-fef353a9]{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);cursor:pointer;background:0 0;border:0;padding:0;font-size:16px;text-decoration:none}.back[data-v-fef353a9]:hover{color:var(--fg,#fffffff0)}.pulls-detail-number[data-v-fef353a9]{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);font-size:14px}.pulls-chip-row[data-v-fef353a9]{flex-wrap:wrap;align-items:center;gap:6px;margin:4px 0 0;display:flex}.pull-chip[data-v-fef353a9]{border:.5px solid var(--line,#ffffff12);font-family:var(--font-mono,monospace);color:var(--fg-2,#ffffffbd);align-items:center;gap:5px;padding:2px 8px;font-size:11px;line-height:16px;display:inline-flex}.pull-chip .chip-glyph[data-v-fef353a9]{place-items:center;width:13px;height:13px;font-size:10px;font-weight:700;display:inline-grid}.pull-chip.tone-state[data-v-fef353a9]{text-transform:lowercase;letter-spacing:0;border-color:currentColor}.pull-chip.tone-state.pr-state-ready[data-v-fef353a9]{color:var(--accent-teal,#087f6f)}.pull-chip.tone-state.pr-state-draft[data-v-fef353a9]{color:var(--fg-3,#ffffff85)}.pull-chip.tone-state.pr-state-review[data-v-fef353a9],.pull-chip.tone-state.pr-state-merged[data-v-fef353a9]{color:var(--accent-blue,#1d55a6)}.pull-chip.tone-state.pr-state-closed[data-v-fef353a9]{color:var(--accent-err,#c9341c)}.pull-chip.tone-project[data-v-fef353a9]{color:var(--accent-blue,#1d55a6);cursor:help;border-color:currentColor}.pull-chip.tone-branch[data-v-fef353a9]{gap:4px}.pull-chip.tone-branch code[data-v-fef353a9]{font-family:var(--font-mono,monospace);color:var(--fg-2,#ffffffbd);font-size:11px}.pull-chip.tone-branch .branch-arrow[data-v-fef353a9]{color:var(--fg-4,#ffffff57);padding:0 2px}.pull-chip.tone-author[data-v-fef353a9]{color:var(--fg-2,#ffffffbd)}.pull-chip.tone-author[data-author-kind=agent][data-v-fef353a9]{color:#6b3fa0}.pull-chip.tone-author[data-author-kind=credential][data-v-fef353a9]{color:var(--accent-yellow,#c89300)}.pull-chip.tone-author[data-author-kind=bot][data-v-fef353a9]{color:var(--accent-blue,#1d55a6)}.pull-chip.tone-author[data-author-kind=team][data-v-fef353a9]{color:var(--accent-teal,#087f6f)}.pull-chip.tone-time[data-v-fef353a9]{color:var(--fg-3,#ffffff85);border-style:none;padding-left:2px}.pull-chip.tone-time.tone-merged[data-v-fef353a9]{color:var(--accent-blue,#1d55a6)}.pull-chip.tone-time.tone-closed[data-v-fef353a9]{color:var(--accent-err,#c9341c)}.pulls-detail-actions[data-v-fef353a9]{flex-wrap:wrap;align-items:center;gap:10px;display:flex}.pulls-action[data-v-fef353a9]{border:.5px solid var(--fg,#fffffff0);background:var(--bg,#0a0b0e);color:var(--fg,#fffffff0);font-family:var(--font-serif,system-ui);cursor:pointer;align-items:center;gap:8px;padding:8px 14px;font-weight:600;display:inline-flex}.pulls-action.primary[data-v-fef353a9]{background:var(--fg,#fffffff0);color:var(--bg,#0a0b0e)}.pulls-action[disabled][data-v-fef353a9]{opacity:.5;cursor:not-allowed}.pulls-action kbd[data-v-fef353a9]{font-family:var(--font-mono,monospace);opacity:.6;border:.5px solid;padding:0 4px;font-size:10px}.pulls-action-message[data-v-fef353a9]{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);font-size:12px}.pulls-detail-body h2[data-v-fef353a9]{font-family:var(--font-serif,system-ui);margin:0 0 8px;font-size:16px}.pulls-detail-body-prose[data-v-fef353a9]{color:var(--fg,#fffffff0);font-size:14px;line-height:1.6}.pulls-detail-body-prose h1[data-v-fef353a9],.pulls-detail-body-prose h2[data-v-fef353a9],.pulls-detail-body-prose h3[data-v-fef353a9],.pulls-detail-body-prose h4[data-v-fef353a9],.pulls-detail-body-prose h5[data-v-fef353a9],.pulls-detail-body-prose h6[data-v-fef353a9]{font-family:var(--font-serif,system-ui);margin:1.1em 0 .4em;font-weight:600;line-height:1.25}.pulls-detail-body-prose h1[data-v-fef353a9]{font-size:20px}.pulls-detail-body-prose h2[data-v-fef353a9]{font-size:17px}.pulls-detail-body-prose h3[data-v-fef353a9],.pulls-detail-body-prose h4[data-v-fef353a9]{font-size:15px}.pulls-detail-body-prose p[data-v-fef353a9]{margin:.55em 0}.pulls-detail-body-prose ul[data-v-fef353a9],.pulls-detail-body-prose ol[data-v-fef353a9]{margin:.4em 0 .6em;padding-left:22px}.pulls-detail-body-prose li[data-v-fef353a9]{margin:.15em 0}.pulls-detail-body-prose code[data-v-fef353a9]{font-family:var(--font-mono,monospace);background:var(--bg-2,#0e1014);border-radius:2px;padding:1px 5px;font-size:.88em}.pulls-detail-body-prose pre[data-v-fef353a9]{font-family:var(--font-mono,monospace);background:var(--bg-2,#0e1014);border:.5px solid var(--line,#ffffff12);white-space:pre;word-break:normal;margin:.7em 0;padding:12px 14px;font-size:12.5px;line-height:1.55;overflow-x:auto}.pulls-detail-body-prose pre code[data-v-fef353a9]{font-size:inherit;background:0 0;padding:0}.pulls-detail-body-prose a[data-v-fef353a9]{color:var(--accent-teal,#087f6f);text-underline-offset:2px;text-decoration:underline}.pulls-detail-body-prose strong[data-v-fef353a9]{font-weight:600}.pulls-detail-body-prose em[data-v-fef353a9]{font-style:italic}.pulls-detail-body.muted p[data-v-fef353a9]{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);font-size:12px}.pulls-routed[data-v-fef353a9]{border:.5px solid var(--line,#ffffff12);background:var(--bg-2,#0e1014);gap:10px;padding:12px 14px;display:grid}.pulls-routed>header[data-v-fef353a9]{border-bottom:.5px solid var(--line,#ffffff12);justify-content:space-between;align-items:baseline;gap:12px;padding-bottom:6px;display:flex}.pulls-routed>header h2[data-v-fef353a9]{font-family:var(--font-serif,system-ui);margin:0;font-size:16px}.pulls-routed>header .muted[data-v-fef353a9]{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);font-size:11px}.pulls-routed-list[data-v-fef353a9]{gap:10px;margin:0;padding:0;list-style:none;display:grid}.pulls-routed-project[data-v-fef353a9]{border:.5px solid var(--line,#ffffff12);background:var(--bg,#0a0b0e);gap:6px;padding:8px 10px;display:grid}.pulls-routed-name[data-v-fef353a9]{font-family:var(--font-mono,monospace);color:var(--accent-blue,#1d55a6);letter-spacing:.02em;font-size:12px;text-decoration:none}.pulls-routed-name[data-v-fef353a9]:hover{text-underline-offset:2px;text-decoration:underline}.pulls-routed-owners[data-v-fef353a9]{flex-wrap:wrap;gap:6px;margin:0;padding:0;list-style:none;display:flex}.pulls-routed-owners.muted[data-v-fef353a9]{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);font-size:11px;font-style:italic}.pulls-routed-owner[data-v-fef353a9]{color:var(--fg,#fffffff0);font-family:var(--font-mono,monospace);letter-spacing:.02em;border:.5px solid;align-items:center;gap:5px;padding:2px 8px;font-size:11px;display:inline-flex}.pulls-routed-owner .chip-glyph[data-v-fef353a9]{font-family:var(--font-serif,system-ui);font-size:12px;line-height:1}.pulls-routed-owner[data-author-kind=team][data-v-fef353a9]{color:var(--accent-teal,#087f6f)}.pulls-routed-owner[data-author-kind=human][data-v-fef353a9]{color:var(--fg,#fffffff0)}.pulls-routed-owner[data-author-kind=agent][data-v-fef353a9]{color:#6b3fa0}.pulls-routed-owner[data-author-kind=bot][data-v-fef353a9]{color:var(--accent-blue,#1d55a6)}.pulls-routed-owner[data-author-kind=credential][data-v-fef353a9]{color:var(--accent-yellow,#c89300)}.pulls-routed-source[data-v-fef353a9]{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);margin:0;font-size:11px}.pulls-routed-source code[data-v-fef353a9]{font-family:var(--font-mono,monospace);background:var(--bg-2,#0e1014);color:var(--fg-2,#ffffffbd);padding:0 4px;font-size:11px}.pulls-linked-issues[data-v-fef353a9]{gap:8px;display:grid}.pulls-linked-issues header[data-v-fef353a9]{border-bottom:.5px solid var(--fg,#fffffff0);justify-content:space-between;align-items:baseline;gap:12px;padding-bottom:4px;display:flex}.pulls-linked-issues h2[data-v-fef353a9]{font-family:var(--font-serif,system-ui);margin:0;font-size:18px}.pulls-detail-discussion[data-v-fef353a9]{gap:8px;display:grid}.pulls-detail-discussion>header[data-v-fef353a9]{border-bottom:.5px solid var(--fg,#fffffff0);justify-content:space-between;align-items:baseline;gap:12px;padding-bottom:4px;display:flex}.pulls-detail-discussion>header h2[data-v-fef353a9]{font-family:var(--font-serif,system-ui);margin:0;font-size:18px}.pulls-detail-discussion-count[data-v-fef353a9]{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);font-size:13px;font-weight:400}.pulls-linked-issues .muted[data-v-fef353a9]{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);font-size:12px}.pulls-linked-issues ul[data-v-fef353a9]{margin:0;padding:0;list-style:none;display:grid}.pulls-linked-issues li[data-v-fef353a9]{border-bottom:.5px solid var(--line,#ffffff12);grid-template-columns:auto minmax(0,1fr) auto auto;align-items:baseline;gap:12px;padding:8px 10px;display:grid;position:relative}.pulls-linked-issues li[data-v-fef353a9]:last-child{border-bottom:0}.pulls-linked-issues li.focused[data-v-fef353a9]{box-shadow:inset 3px 0 0 var(--fg,#fffffff0);background:var(--bg-2,#0e1014)}.pulls-linked-issues li .issue-link[data-v-fef353a9]{color:inherit;text-decoration:none;display:contents}.pulls-linked-issues .issue-project[data-v-fef353a9]{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);border:.5px solid var(--line,#ffffff12);letter-spacing:.02em;white-space:nowrap;padding:1px 7px;font-size:11px;text-decoration:none}.pulls-linked-issues .issue-project[data-v-fef353a9]:hover{color:var(--fg,#fffffff0);border-color:var(--fg,#fffffff0)}.pulls-linked-foot[data-v-fef353a9]{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);letter-spacing:.04em;margin-top:6px;font-size:11px}.pulls-linked-foot kbd[data-v-fef353a9]{font-family:var(--font-mono,monospace);border:.5px solid var(--line,#ffffff12);margin:0 1px;padding:0 4px;font-size:10px}.pulls-linked-issues .issue-num[data-v-fef353a9]{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);font-variant-numeric:tabular-nums;font-size:12px}.pulls-linked-issues .issue-title[data-v-fef353a9]{font-family:var(--font-serif,system-ui);text-overflow:ellipsis;white-space:nowrap;font-weight:500;overflow:hidden}.pulls-linked-issues .issue-state[data-v-fef353a9]{font-family:var(--font-mono,monospace);letter-spacing:.04em;text-transform:uppercase;border:.5px solid;padding:0 5px;font-size:10px}.pulls-linked-issues .issue-state-open[data-v-fef353a9]{color:var(--accent-teal,#087f6f)}.pulls-linked-issues .issue-state-closed[data-v-fef353a9]{color:var(--accent-blue,#1d55a6)}.pulls-empty[data-v-fef353a9],.pulls-error[data-v-fef353a9]{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);font-size:13px}.pulls-error[data-v-fef353a9]{color:var(--accent-err,#c9341c)}"]], ["__scopeId", "data-v-fef353a9"]]), _d = { class: "pulls-overview", "data-smoke": "pulls-overview" -}, pd = ["href"], md = { +}, vd = { class: "heading" }, yd = { key: 0, - class: "muted" -}, hd = { + class: "total" +}, bd = ["href"], xd = { + key: 0, + class: "readiness-summary", + "data-smoke": "pulls-readiness-summary", + "aria-label": "Pull request readiness summary" +}, Sd = { class: "summary-value" }, Cd = { class: "summary-label" }, wd = { key: 1, class: "muted" -}, gd = { +}, Td = { key: 2, class: "muted" -}, _d = { key: 3 }, vd = ["href"], yd = { class: "num" }, bd = { class: "title" }, xd = { class: "age" }, Sd = /* @__PURE__ */ Vl(/* @__PURE__ */ zn({ +}, Ed = { + key: 3, + class: "muted" +}, Dd = { + key: 4, + class: "muted" +}, Od = { key: 5 }, kd = ["href"], Ad = { class: "row-main" }, jd = { class: "num" }, Md = { class: "title" }, Nd = { class: "row-meta" }, Pd = ["title"], Fd = { class: "age" }, Id = /* @__PURE__ */ ql(/* @__PURE__ */ Vn({ __name: "PullsOverview", props: { host: { type: Object }, workspaceId: { type: String }, - repositoryId: { type: [String, null] } + repositoryId: { type: [String, null] }, + repositoryPath: { type: [String, null] } }, setup(e) { - let t = e, n = /* @__PURE__ */ L([]), r = /* @__PURE__ */ L("idle"), i = X(() => t.workspaceId ?? t.host?.workspaceId ?? defaultWorkspaceId()), a = X(() => t.repositoryId ?? t.host?.repositoryId ?? null), o = X(() => n.value.filter((e) => e.state === "READY" || e.state === "DRAFT").sort((e, t) => { - let n = Date.parse(e.updatedAt ?? e.createdAt ?? "") || 0; - return (Date.parse(t.updatedAt ?? t.createdAt ?? "") || 0) - n; - }).slice(0, 5)), s = X(() => n.value.filter((e) => e.state === "READY").length); - er(() => void c()), B(() => [i.value, a.value], () => void c()); - async function c() { - r.value = "loading"; + let t = e, n = [ + "draft", + "blocked-review", + "blocked-checks", + "needs-review", + "waiting-checks", + "ready" + ], r = [ + "blocked-review", + "blocked-checks", + "needs-review", + "waiting-checks", + "ready", + "draft" + ], i = /* @__PURE__ */ I(null), a = /* @__PURE__ */ I("idle"), o = X(() => t.workspaceId ?? t.host?.workspaceId ?? Pl()), s = X(() => t.repositoryId ?? t.host?.repositoryId ?? null), c = X(() => t.repositoryPath ?? t.host?.repositoryPath ?? null), l = X(() => { + let e = /* @__PURE__ */ new Map(); + for (let t of i.value?.columns ?? []) e.set(t.key, t); + return e; + }), u = X(() => n.reduce((e, t) => e + p(t), 0)), d = X(() => [ + { + label: "blocked", + value: p("blocked-review") + p("blocked-checks"), + tone: "blocked" + }, + { + label: "review", + value: p("needs-review") + p("blocked-review"), + tone: "review" + }, + { + label: "checks", + value: p("waiting-checks") + p("blocked-checks"), + tone: "checks" + }, + { + label: "ready", + value: p("ready"), + tone: "ready" + }, + { + label: "draft", + value: p("draft"), + tone: "draft" + } + ]), f = X(() => { + let e = []; + for (let t of r) { + let n = l.value.get(t); + if (n) for (let r of n.cards) e.push({ + card: r, + laneKey: t, + laneLabel: n.label + }); + } + return e.slice(0, 5); + }); + nr(() => void g()), Nn(() => [o.value, s.value], () => void g()); + function p(e) { + return l.value.get(e)?.count ?? 0; + } + function m() { + return Fl(c.value); + } + function h(e) { + return Il(e, c.value); + } + async function g() { + a.value = "loading"; try { - n.value = await xl({ - workspaceId: i.value, - repositoryId: a.value, - limit: 32 - }), r.value = n.value.length > 0 ? "ready" : "empty"; + let e = await Tl({ + workspaceId: o.value, + repositoryId: s.value, + requiredApprovals: 1, + limit: 64 + }); + i.value = e, a.value = e.total > 0 ? "ready" : "empty"; } catch { - r.value = "error", n.value = []; + a.value = "error", i.value = null; } } - return (e, t) => (W(), G("section", fd, [K("header", null, [t[0] ||= K("h3", null, "Pull requests", -1), K("a", { href: R(Al)() }, j(s.value) + " open", 9, pd)]), r.value === "loading" ? (W(), G("p", md, "Loading…")) : r.value === "error" ? (W(), G("p", hd, "Could not load pulls.")) : o.value.length === 0 ? (W(), G("p", gd, "No open pull requests.")) : (W(), G("ul", _d, [(W(!0), G(U, null, ur(o.value, (e) => (W(), G("li", { key: e.id }, [K("a", { href: R(jl)(e) }, [ - K("span", yd, "#" + j(e.number), 1), - K("span", bd, j(e.title), 1), - K("span", { class: A(["state", R(Ml)(e.state).className]) }, j(R(Ml)(e.state).label), 3), - K("span", xd, j(R(Nl)(e.updatedAt ?? e.createdAt)), 1) - ], 8, vd)]))), 128))]))])); + return (e, t) => (W(), G("section", _d, [ + K("header", null, [K("div", vd, [t[0] ||= K("h3", null, "Pull requests", -1), i.value ? (W(), G("span", yd, A(i.value.total) + " total", 1)) : J("", !0)]), K("a", { href: m() }, A(u.value) + " active", 9, bd)]), + a.value === "ready" ? (W(), G("div", xd, [(W(!0), G(H, null, z(d.value, (e) => (W(), G("div", { + key: e.label, + class: k(["summary-item", `tone-${e.tone}`]) + }, [K("span", Sd, A(e.value), 1), K("span", Cd, A(e.label), 1)], 2))), 128))])) : J("", !0), + a.value === "loading" ? (W(), G("p", wd, "Loading...")) : a.value === "error" ? (W(), G("p", Td, "Could not load pulls.")) : a.value === "empty" ? (W(), G("p", Ed, "No pull requests.")) : f.value.length === 0 ? (W(), G("p", Dd, "No active pull requests.")) : (W(), G("ul", Od, [(W(!0), G(H, null, z(f.value, (e) => (W(), G("li", { + key: e.card.pullRequest.id, + "data-smoke": "pulls-readiness-row" + }, [K("a", { href: h(e.card.pullRequest) }, [K("span", Ad, [ + K("span", jd, "#" + A(e.card.pullRequest.number), 1), + K("span", Md, A(e.card.pullRequest.title), 1), + K("span", { class: k(["lane", `lane-${e.laneKey}`]) }, A(e.laneLabel), 3) + ]), K("span", Nd, [K("span", { + class: "branch", + title: `${e.card.pullRequest.headRef} -> ${e.card.pullRequest.baseRef}` + }, [ + q(A(e.card.pullRequest.headRef) + " ", 1), + t[1] ||= K("span", null, "->", -1), + q(" " + A(e.card.pullRequest.baseRef), 1) + ], 8, Pd), K("span", Fd, A(L(zl)(e.card.pullRequest.updatedAt ?? e.card.pullRequest.createdAt)), 1)])], 8, kd)]))), 128))])) + ])); } -}), [["styles", [".pulls-overview[data-v-9d1d3dcb]{gap:8px;display:grid}.pulls-overview header[data-v-9d1d3dcb]{justify-content:space-between;align-items:baseline;display:flex}.pulls-overview h3[data-v-9d1d3dcb]{font-family:var(--font-serif,system-ui);margin:0;font-size:14px}.pulls-overview header a[data-v-9d1d3dcb],.muted[data-v-9d1d3dcb]{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);font-size:12px;text-decoration:none}.pulls-overview ul[data-v-9d1d3dcb]{gap:4px;margin:0;padding:0;list-style:none;display:grid}.pulls-overview li a[data-v-9d1d3dcb]{color:inherit;border-bottom:.5px solid var(--line,#ffffff12);grid-template-columns:auto minmax(0,1fr) auto auto;align-items:baseline;gap:8px;padding:6px 0;text-decoration:none;display:grid}.pulls-overview li:last-child a[data-v-9d1d3dcb]{border-bottom:0}.num[data-v-9d1d3dcb]{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);font-size:11px}.title[data-v-9d1d3dcb]{text-overflow:ellipsis;white-space:nowrap;font-weight:500;overflow:hidden}.state[data-v-9d1d3dcb]{font-family:var(--font-mono,monospace);letter-spacing:.04em;text-transform:uppercase;border:.5px solid;padding:0 4px;font-size:10px}.state.pr-state-ready[data-v-9d1d3dcb]{color:var(--accent-teal,#087f6f)}.state.pr-state-draft[data-v-9d1d3dcb]{color:var(--fg-3,#ffffff85)}.state.pr-state-merged[data-v-9d1d3dcb]{color:var(--accent-blue,#1d55a6)}.state.pr-state-closed[data-v-9d1d3dcb]{color:var(--accent-err,#c9341c)}.age[data-v-9d1d3dcb]{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);font-size:11px}"]], ["__scopeId", "data-v-9d1d3dcb"]]), Cd = { +}), [["styles", [".pulls-overview[data-v-a4e5c322]{gap:10px;display:grid}.pulls-overview header[data-v-a4e5c322]{justify-content:space-between;align-items:flex-start;gap:12px;display:flex}.heading[data-v-a4e5c322]{gap:2px;min-width:0;display:grid}.pulls-overview h3[data-v-a4e5c322]{font-family:var(--font-serif,system-ui);margin:0;font-size:14px}.pulls-overview header a[data-v-a4e5c322],.total[data-v-a4e5c322],.muted[data-v-a4e5c322]{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);font-size:12px;text-decoration:none}.pulls-overview header a[data-v-a4e5c322]{white-space:nowrap}.readiness-summary[data-v-a4e5c322]{grid-template-columns:repeat(auto-fit,minmax(52px,1fr));gap:4px;display:grid}.summary-item[data-v-a4e5c322]{border:.5px solid var(--line,#ffffff12);background:var(--bg-2,#0e1014);border-radius:6px;gap:2px;min-width:0;padding:6px;display:grid}.summary-value[data-v-a4e5c322]{font-family:var(--font-mono,monospace);font-size:14px;font-weight:700;line-height:1}.summary-label[data-v-a4e5c322]{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-family:var(--font-mono,monospace);text-transform:uppercase;letter-spacing:0;color:var(--fg-3,#ffffff85);font-size:10px;line-height:1.1;overflow:hidden}.summary-item.tone-blocked .summary-value[data-v-a4e5c322]{color:var(--accent-err,#c9341c)}.summary-item.tone-review .summary-value[data-v-a4e5c322]{color:var(--accent-blue,#1d55a6)}.summary-item.tone-checks .summary-value[data-v-a4e5c322]{color:var(--accent-warn,#a05f00)}.summary-item.tone-ready .summary-value[data-v-a4e5c322]{color:var(--accent-teal,#087f6f)}.summary-item.tone-draft .summary-value[data-v-a4e5c322]{color:var(--fg-3,#ffffff85)}.pulls-overview ul[data-v-a4e5c322]{gap:4px;margin:0;padding:0;list-style:none;display:grid}.pulls-overview li a[data-v-a4e5c322]{color:inherit;border-bottom:.5px solid var(--line,#ffffff12);gap:4px;padding:8px 0;text-decoration:none;display:grid}.pulls-overview li:last-child a[data-v-a4e5c322]{border-bottom:0}.row-main[data-v-a4e5c322]{grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:7px;min-width:0;display:grid}.row-meta[data-v-a4e5c322]{justify-content:space-between;align-items:center;gap:8px;min-width:0;display:flex}.num[data-v-a4e5c322]{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);font-size:11px}.title[data-v-a4e5c322]{text-overflow:ellipsis;white-space:nowrap;font-weight:500;overflow:hidden}.lane[data-v-a4e5c322]{text-overflow:ellipsis;white-space:nowrap;max-width:96px;font-family:var(--font-mono,monospace);letter-spacing:0;text-transform:uppercase;border:.5px solid;padding:0 4px;font-size:10px;overflow:hidden}.lane-ready[data-v-a4e5c322]{color:var(--accent-teal,#087f6f)}.lane-draft[data-v-a4e5c322]{color:var(--fg-3,#ffffff85)}.lane-needs-review[data-v-a4e5c322],.lane-blocked-review[data-v-a4e5c322]{color:var(--accent-blue,#1d55a6)}.lane-waiting-checks[data-v-a4e5c322]{color:var(--accent-warn,#a05f00)}.lane-blocked-checks[data-v-a4e5c322]{color:var(--accent-err,#c9341c)}.branch[data-v-a4e5c322],.age[data-v-a4e5c322]{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);font-size:11px}.branch[data-v-a4e5c322]{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.branch span[data-v-a4e5c322]{color:var(--fg-4,#ffffff57);padding:0 3px}.age[data-v-a4e5c322]{flex:none}"]], ["__scopeId", "data-v-a4e5c322"]]), Ld = [ + "draft", + "blocked-review", + "blocked-checks", + "needs-review", + "waiting-checks", + "ready", + "merged", + "closed" +]; +function Rd(e, t) { + return `${e} ${t}${e === 1 ? "" : "s"}`; +} +function zd(e) { + switch (e) { + case "blocked-review": return "blocked"; + case "blocked-checks": return "blocked"; + case "needs-review": return "review"; + case "waiting-checks": return "checks"; + case "ready": return "ready"; + case "merged": + case "closed": return "terminal"; + default: return "draft"; + } +} +function Bd(e) { + if (!e) return "checks unknown"; + let t = e.requiredFailing + e.requiredMissing; + return t > 0 ? `${Rd(t, "required check")} blocking` : e.pending > 0 ? `${Rd(e.pending, "check")} pending` : e.optionalFailing > 0 ? `${Rd(e.optionalFailing, "optional check")} failing` : e.total === 0 ? "no checks" : `${e.passing}/${e.total} checks passing`; +} +function Vd(e) { + return e.changeRequestCount > 0 ? `${Rd(e.changeRequestCount, "change request")}` : e.requiredApprovals > e.approvalCount ? `${e.approvalCount}/${e.requiredApprovals} approvals` : e.approvalCount > 0 ? `${Rd(e.approvalCount, "approval")}` : e.commentCount > 0 ? `${Rd(e.commentCount, "comment")}` : "no reviews"; +} +function Hd(e, t, n) { + let r = Bd(e.checkSummary), i = Vd(e.reviewSummary); + return { + laneKey: t, + laneLabel: n, + tone: zd(t), + checkLabel: r, + reviewLabel: i, + title: `${n}: ${r}; ${i}` + }; +} +//#endregion +//#region ../extensions/first-party/ext_pull_requests/ui/src/PullsQueue.vue?vue&type=script&setup=true&lang.ts +var Ud = { class: "pulls-queue", "data-smoke": "pulls-queue" -}, wd = { class: "pulls-queue-head" }, Td = { class: "pulls-queue-controls" }, Ed = { +}, Wd = { class: "pulls-queue-head" }, Gd = { class: "pulls-queue-controls" }, Kd = { class: "pulls-filter-row", role: "tablist", - "aria-label": "Filter pulls by state" -}, Dd = ["aria-selected", "onClick"], Od = { class: "count" }, kd = { class: "pulls-search" }, Ad = { + "aria-label": "Filter pull requests by state" +}, qd = ["aria-selected", "onClick"], Jd = { class: "count" }, Yd = { class: "pulls-search" }, Xd = { key: 0, class: "pulls-query-chips", "data-smoke": "pulls-query-chips", "aria-label": "Parsed search filters" -}, jd = ["title"], Md = { +}, Zd = ["title"], Qd = { key: 1, class: "pulls-author-filter", "data-smoke": "pulls-author-filter" -}, Nd = ["data-author-kind", "title"], Pd = { class: "author-glyph" }, Fd = { +}, $d = ["data-author-kind", "title"], ef = { class: "author-glyph" }, tf = { key: 0, - class: "pulls-empty" -}, Id = { + class: "pulls-readiness-board", + "data-smoke": "pulls-merge-readiness-board", + "aria-label": "Merge readiness lanes" +}, nf = { class: "pulls-readiness-lanes" }, rf = { key: 1, - class: "pulls-error", + class: "pulls-readiness-error", role: "alert" -}, Ld = { +}, af = { key: 2, class: "pulls-empty" -}, Rd = { +}, of = { key: 3, - class: "pulls-empty" -}, zd = { + class: "pulls-error", + role: "alert" +}, sf = { key: 4, + class: "pulls-empty" +}, cf = { + key: 5, + class: "pulls-empty" +}, lf = { + key: 6, class: "pulls-list", role: "listbox", - "aria-label": "Pull request queue" -}, Bd = ["aria-selected", "onMouseenter"], Vd = ["href"], Hd = { class: "pulls-row-number" }, Ud = { class: "pulls-row-body" }, Wd = { class: "pulls-row-title" }, Gd = { class: "pulls-row-meta" }, Kd = { class: "pulls-branch" }, qd = [ + "aria-label": "Pull requests" +}, uf = ["aria-selected", "onMouseenter"], df = ["href"], ff = { class: "pulls-row-number" }, pf = { class: "pulls-row-body" }, mf = { class: "pulls-row-title" }, hf = { class: "pulls-row-meta" }, gf = ["title"], _f = ["title"], vf = ["title"], yf = { class: "pulls-branch" }, bf = [ "data-author-kind", "title", "onClick" -], Jd = { class: "author-glyph" }, Yd = { class: "author-label" }, Xd = { class: "pulls-row-age" }, Zd = /* @__PURE__ */ Vl(/* @__PURE__ */ zn({ +], xf = { class: "author-glyph" }, Sf = { class: "author-label" }, Cf = { class: "pulls-row-age" }, wf = /* @__PURE__ */ ql(/* @__PURE__ */ Vn({ __name: "PullsQueue", props: { host: { type: Object }, workspaceId: { type: String }, - repositoryId: { type: [String, null] } + repositoryId: { type: [String, null] }, + repositoryPath: { type: [String, null] } }, setup(e) { let t = e, n = [ @@ -5982,6 +6204,11 @@ var Ql = { label: "Draft", key: "d" }, + { + id: "REVIEW", + label: "Review", + key: "r" + }, { id: "MERGED", label: "Merged", @@ -5997,34 +6224,38 @@ var Ql = { label: "All", key: "a" } - ], r = /* @__PURE__ */ L("OPEN"), i = /* @__PURE__ */ L(""), a = /* @__PURE__ */ L(""), o = /* @__PURE__ */ L([]), s = /* @__PURE__ */ L("idle"), c = /* @__PURE__ */ L(null), l = /* @__PURE__ */ L(0), u = X(() => t.workspaceId ?? t.host?.workspaceId ?? defaultWorkspaceId()), d = X(() => t.repositoryId ?? t.host?.repositoryId ?? null), f = (e, t) => t === "ALL" ? !0 : t === "OPEN" ? e.state === "READY" : e.state === t, p = ["is", "author"], m = { + ], r = /* @__PURE__ */ I("OPEN"), i = /* @__PURE__ */ I(""), a = /* @__PURE__ */ I(""), o = /* @__PURE__ */ I([]), s = /* @__PURE__ */ I(null), c = /* @__PURE__ */ I("idle"), l = /* @__PURE__ */ I(null), u = /* @__PURE__ */ I("idle"), d = /* @__PURE__ */ I(null), f = /* @__PURE__ */ I(0), p = X(() => t.workspaceId ?? t.host?.workspaceId ?? Pl()), m = X(() => t.repositoryId ?? t.host?.repositoryId ?? null), h = X(() => t.repositoryPath ?? t.host?.repositoryPath ?? null), g = (e, t) => t === "ALL" ? !0 : t === "OPEN" ? e.state !== "MERGED" && e.state !== "CLOSED" : e.state === t, _ = ["is", "author"], v = { open: "OPEN", draft: "DRAFT", + review: "REVIEW", + reviews: "REVIEW", + "in-review": "REVIEW", + in_review: "REVIEW", merged: "MERGED", closed: "CLOSED", all: "ALL" - }, h = X(() => tl(i.value, p)), g = X(() => { - let e = h.value.filters.is ?? []; + }, y = X(() => il(i.value, _)), b = X(() => { + let e = y.value.filters.is ?? []; for (let t of e) { - let e = m[t.toLowerCase()]; + let e = v[t.toLowerCase()]; if (e) return e; } return r.value; - }), _ = X(() => { - let e = h.value.filters.author ?? []; + }), x = X(() => { + let e = y.value.filters.author ?? []; for (let t of e) if (t.startsWith("comtrya://")) return t; return a.value; - }), v = X(() => { - let e = h.value.text.trim().toLowerCase(), t = _.value, n = g.value; - return o.value.filter((e) => f(e, n)).filter((e) => t ? e.authorRef === t : !0).filter((t) => { + }), S = X(() => { + let e = y.value.text.trim().toLowerCase(), t = x.value, n = b.value; + return o.value.filter((e) => g(e, n)).filter((e) => t ? e.authorRef === t : !0).filter((t) => { if (!e) return !0; - let n = cl(t.authorRef); + let n = dl(t.authorRef); return `${t.number} ${t.title} ${t.headRef} ${t.baseRef} ${n.label} ${n.kind}`.toLowerCase().includes(e); }); - }), y = X(() => { + }), C = X(() => { let e = []; - for (let t of h.value.filters.is ?? []) { - let n = m[t.toLowerCase()]; + for (let t of y.value.filters.is ?? []) { + let n = v[t.toLowerCase()]; e.push({ key: "is", value: t, @@ -6032,8 +6263,8 @@ var Ql = { tone: "is" }); } - for (let t of h.value.filters.author ?? []) { - let n = cl(t); + for (let t of y.value.filters.author ?? []) { + let n = dl(t); e.push({ key: "author", value: t, @@ -6041,7 +6272,7 @@ var Ql = { tone: "author" }); } - for (let t of h.value.unknown) e.push({ + for (let t of y.value.unknown) e.push({ key: t, value: "", label: `unknown · ${t}:`, @@ -6049,39 +6280,58 @@ var Ql = { }); return e; }); - function b(e) { + function w(e) { a.value === e ? a.value = "" : a.value = e; } - function x() { + function ee() { a.value = ""; } - let S = X(() => { + let te = X(() => { let e = { OPEN: 0, DRAFT: 0, + REVIEW: 0, MERGED: 0, CLOSED: 0, ALL: o.value.length }; - for (let t of o.value) t.state === "READY" && (e.OPEN += 1), t.state === "DRAFT" && (e.DRAFT += 1), t.state === "MERGED" && (e.MERGED += 1), t.state === "CLOSED" && (e.CLOSED += 1); + for (let t of o.value) t.state !== "MERGED" && t.state !== "CLOSED" && (e.OPEN += 1), t.state === "DRAFT" && (e.DRAFT += 1), t.state === "REVIEW" && (e.REVIEW += 1), t.state === "MERGED" && (e.MERGED += 1), t.state === "CLOSED" && (e.CLOSED += 1); return e; - }), C = new Set([ + }), ne = X(() => { + let e = s.value?.columns ?? []; + return Ld.map((t) => e.find((e) => e.key === t)).filter((e) => !!e); + }), T = X(() => { + let e = /* @__PURE__ */ new Map(); + for (let t of ne.value) for (let n of t.cards) e.set(n.pullRequest.id, { + card: n, + view: Hd(n, t.key, t.label) + }); + return e; + }), re = X(() => S.value.map((e) => ({ + pull: e, + readiness: T.value.get(e.id)?.view ?? null + }))); + function E(e) { + return zd(e); + } + let ie = new Set([ "OPEN", "DRAFT", + "REVIEW", "MERGED", "CLOSED", "ALL" ]); - function w() { + function ae() { if (typeof window > "u") return; let e = new URLSearchParams(window.location.search), t = (e.get("state") ?? "").toUpperCase(); - C.has(t) && (r.value = t); + ie.has(t) && (r.value = t); let n = e.get("q"); n !== null && (i.value = n); let o = e.get("author") ?? ""; a.value = o.startsWith("comtrya://") ? o : ""; } - function ee() { + function D() { if (typeof window > "u") return; let e = new URLSearchParams(window.location.search); r.value === "OPEN" ? e.delete("state") : e.set("state", r.value); @@ -6090,40 +6340,40 @@ var Ql = { let n = e.toString(), o = `${window.location.pathname}${n ? `?${n}` : ""}${window.location.hash}`; o !== `${window.location.pathname}${window.location.search}${window.location.hash}` && window.history.replaceState(window.history.state, "", o); } - let T = !1; - function te() { - T = !0, w(), pn(() => { - T = !1; + let oe = !1; + function O() { + oe = !0, ae(), mn(() => { + oe = !1; }); } - er(() => { - T = !0, w(), T = !1, ne(), window.addEventListener("popstate", te); - }), ir(() => { - window.removeEventListener("popstate", te); - }), B(() => [u.value, d.value], () => void ne()), B(v, () => { - l.value >= v.value.length && (l.value = Math.max(0, v.value.length - 1)); - }), B([ + nr(() => { + oe = !0, ae(), oe = !1, le(), window.addEventListener("popstate", O); + }), or(() => { + window.removeEventListener("popstate", O); + }), Nn(() => [p.value, m.value], () => void le()), Nn(S, () => { + f.value >= S.value.length && (f.value = Math.max(0, S.value.length - 1)); + }), Nn([ r, i, a ], () => { - T || ee(); - }), fs({ + oe || D(); + }), hs({ j: (e) => { - e.preventDefault(), l.value = Math.min(l.value + 1, Math.max(0, v.value.length - 1)); + e.preventDefault(), f.value = Math.min(f.value + 1, Math.max(0, S.value.length - 1)); }, ArrowDown: (e) => { - e.preventDefault(), l.value = Math.min(l.value + 1, Math.max(0, v.value.length - 1)); + e.preventDefault(), f.value = Math.min(f.value + 1, Math.max(0, S.value.length - 1)); }, k: (e) => { - e.preventDefault(), l.value = Math.max(l.value - 1, 0); + e.preventDefault(), f.value = Math.max(f.value - 1, 0); }, ArrowUp: (e) => { - e.preventDefault(), l.value = Math.max(l.value - 1, 0); + e.preventDefault(), f.value = Math.max(f.value - 1, 0); }, Enter: (e) => { - let t = v.value[l.value]; - t && (e.preventDefault(), window.location.href = jl(t)); + let t = S.value[f.value]; + t && (e.preventDefault(), window.location.href = ce(t)); }, "/": (e) => { e.preventDefault(), document.querySelector("[data-pulls-search]")?.focus(); @@ -6132,184 +6382,177 @@ var Ql = { t.preventDefault(), r.value = e.id; }])) }); - function E(e) { + function se(e) { i.value &&= (e.preventDefault(), ""); } - async function ne() { - s.value = "loading", c.value = null; + function ce(e) { + return Il(e, h.value); + } + async function le() { + u.value = "loading", c.value = "loading", d.value = null, l.value = null; try { - o.value = (await xl({ - workspaceId: u.value, - repositoryId: d.value + o.value = (await Cl({ + workspaceId: p.value, + repositoryId: m.value })).sort((e, t) => { let n = Date.parse(e.updatedAt ?? e.createdAt ?? "") || 0; return (Date.parse(t.updatedAt ?? t.createdAt ?? "") || 0) - n; - }), s.value = o.value.length > 0 ? "ready" : "empty"; + }), u.value = o.value.length > 0 ? "ready" : "empty", await ue(); } catch (e) { - o.value = [], s.value = "error", c.value = e instanceof Error ? e.message : String(e); + o.value = [], s.value = null, u.value = "error", d.value = e instanceof Error ? e.message : String(e), c.value = "idle"; } } - return (e, t) => (W(), G("section", Cd, [ - K("header", wd, [ + async function ue() { + c.value = "loading", l.value = null; + try { + let e = await Tl({ + workspaceId: p.value, + repositoryId: m.value, + requiredApprovals: 1, + limit: 256 + }); + s.value = e, c.value = e.total > 0 ? "ready" : "empty"; + } catch (e) { + s.value = null, c.value = "error", l.value = e instanceof Error ? e.message : String(e); + } + } + return (e, t) => (W(), G("section", Ud, [ + K("header", Wd, [ t[4] ||= K("h2", null, "Pull requests", -1), - K("div", Td, [K("div", Ed, [(W(), G(U, null, ur(n, (e) => K("button", { + K("div", Gd, [K("div", Kd, [(W(), G(H, null, z(n, (e) => K("button", { key: e.id, type: "button", role: "tab", "aria-selected": r.value === e.id, - class: A(["pulls-filter", { active: r.value === e.id }]), + class: k(["pulls-filter", { active: r.value === e.id }]), onClick: (t) => r.value = e.id }, [ - K("span", null, j(e.label), 1), - K("span", Od, j(S.value[e.id]), 1), - K("kbd", null, j(e.key), 1) - ], 10, Dd)), 64))]), K("label", kd, [En(K("input", { + K("span", null, A(e.label), 1), + K("span", Jd, A(te.value[e.id]), 1), + K("kbd", null, A(e.key), 1) + ], 10, qd)), 64))]), K("label", Yd, [Dn(K("input", { "data-pulls-search": "", "onUpdate:modelValue": t[0] ||= (e) => i.value = e, type: "search", - placeholder: "Filter — try is:open · author: · text", + placeholder: "Search pull requests", autocomplete: "off", - onKeydown: po(E, ["esc"]) + onKeydown: po(se, ["esc"]) }, null, 544), [[so, i.value]]), t[1] ||= K("kbd", null, "/", -1)])]), - y.value.length > 0 ? (W(), G("div", Ad, [(W(!0), G(U, null, ur(y.value, (e) => (W(), G("span", { + C.value.length > 0 ? (W(), G("div", Xd, [(W(!0), G(H, null, z(C.value, (e) => (W(), G("span", { key: `${e.key}:${e.value || "unknown"}`, - class: A(["query-chip", `tone-${e.tone}`]), + class: k(["query-chip", `tone-${e.tone}`]), title: e.tone === "unknown" ? `Unknown filter key: ${e.key}` : e.value - }, j(e.label), 11, jd))), 128)), t[2] ||= K("span", { class: "query-chips-hint" }, [ + }, A(e.label), 11, Zd))), 128)), t[2] ||= K("span", { class: "query-chips-hint" }, [ q(" syntax: "), K("code", null, "is:open"), - q(" · "), + q(" | "), K("code", null, "is:draft"), - q(" · "), + q(" | "), + K("code", null, "is:review"), + q(" | "), K("code", null, "author:") ], -1)])) : J("", !0), - a.value ? (W(), G("div", Md, [ + a.value ? (W(), G("div", Qd, [ t[3] ||= K("span", { class: "prefix" }, "authored by", -1), K("span", { class: "active-chip", - "data-author-kind": R(cl)(a.value).kind, + "data-author-kind": L(dl)(a.value).kind, title: a.value - }, [K("span", Pd, j(R(cl)(a.value).glyph), 1), q(" " + j(R(cl)(a.value).label), 1)], 8, Nd), + }, [K("span", ef, A(L(dl)(a.value).glyph), 1), q(" " + A(L(dl)(a.value).label), 1)], 8, $d), K("button", { type: "button", class: "clear", - onClick: x, + onClick: ee, "aria-label": "Clear author filter" }, "clear ✕") ])) : J("", !0) ]), - s.value === "loading" ? (W(), G("p", Fd, "Loading pull requests…")) : s.value === "error" ? (W(), G("p", Id, j(c.value), 1)) : o.value.length === 0 ? (W(), G("p", Ld, [...t[5] ||= [ + c.value === "ready" && ne.value.length > 0 ? (W(), G("section", tf, [K("header", null, [K("div", null, [t[5] ||= K("h3", null, "Merge readiness", -1), K("span", null, A(s.value?.total ?? 0) + " tracked", 1)]), K("button", { + type: "button", + onClick: ue + }, "Refresh")]), K("div", nf, [(W(!0), G(H, null, z(ne.value, (e) => (W(), G("div", { + key: e.key, + class: k(["pulls-readiness-lane", `tone-${E(e.key)}`]) + }, [K("span", null, A(e.label), 1), K("strong", null, A(e.count), 1)], 2))), 128))])])) : c.value === "error" && u.value !== "error" ? (W(), G("p", rf, " Could not load merge readiness: " + A(l.value), 1)) : J("", !0), + u.value === "loading" ? (W(), G("p", af, "Loading pull requests…")) : u.value === "error" ? (W(), G("p", of, A(d.value), 1)) : o.value.length === 0 ? (W(), G("p", sf, [...t[6] ||= [ q(" No pull requests yet. Push a branch and open one through the ", -1), K("code", null, "create-pull", -1), q(" op or the SDK. ", -1) - ]])) : v.value.length === 0 ? (W(), G("p", Rd, " No pull requests match the current filter. ")) : (W(), G("ol", zd, [(W(!0), G(U, null, ur(v.value, (e, n) => (W(), G("li", { + ]])) : S.value.length === 0 ? (W(), G("p", cf, " No pull requests match the current filter. ")) : (W(), G("ol", lf, [(W(!0), G(H, null, z(re.value, ({ pull: e, readiness: n }, r) => (W(), G("li", { key: e.id, - class: A(["pulls-row", { focused: n === l.value }]), + class: k(["pulls-row", { focused: r === f.value }]), role: "option", - "aria-selected": n === l.value, - onMouseenter: (e) => l.value = n + "aria-selected": r === f.value, + onMouseenter: (e) => f.value = r }, [K("a", { - href: R(jl)(e), + href: ce(e), class: "pulls-row-link" }, [ - K("span", Hd, "#" + j(e.number), 1), - K("span", Ud, [K("span", Wd, j(e.title), 1), K("span", Gd, [ - K("span", { class: A(["pulls-state", R(Ml)(e.state).className]) }, j(R(Ml)(e.state).label), 3), - K("code", Kd, [ - q(j(e.headRef) + " ", 1), - t[6] ||= K("span", null, "→", -1), - q(" " + j(e.baseRef), 1) + K("span", ff, "#" + A(e.number), 1), + K("span", pf, [K("span", mf, A(e.title), 1), K("span", hf, [ + K("span", { class: k(["pulls-state", L(Rl)(e.state).className]) }, A(L(Rl)(e.state).label), 3), + n ? (W(), G("span", { + key: 0, + class: k(["pulls-readiness-chip", `tone-${n.tone}`]), + "data-smoke": "pulls-readiness-chip", + title: n.title + }, A(n.laneLabel), 11, gf)) : J("", !0), + n ? (W(), G("span", { + key: 1, + class: "pulls-readiness-metric", + title: n.checkLabel + }, A(n.checkLabel), 9, _f)) : J("", !0), + n ? (W(), G("span", { + key: 2, + class: "pulls-readiness-metric", + title: n.reviewLabel + }, A(n.reviewLabel), 9, vf)) : J("", !0), + K("code", yf, [ + q(A(e.headRef) + " ", 1), + t[7] ||= K("span", null, "→", -1), + q(" " + A(e.baseRef), 1) ]), K("button", { type: "button", - class: A(["pulls-author", { active: a.value === e.authorRef }]), - "data-author-kind": R(cl)(e.authorRef).kind, + class: k(["pulls-author", { active: a.value === e.authorRef }]), + "data-author-kind": L(dl)(e.authorRef).kind, title: `${e.authorRef}\nClick to filter by this author`, - onClick: uo((t) => b(e.authorRef), ["prevent", "stop"]) - }, [K("span", Jd, j(R(cl)(e.authorRef).glyph), 1), K("span", Yd, j(R(cl)(e.authorRef).label), 1)], 10, qd) + onClick: uo((t) => w(e.authorRef), ["prevent", "stop"]) + }, [K("span", xf, A(L(dl)(e.authorRef).glyph), 1), K("span", Sf, A(L(dl)(e.authorRef).label), 1)], 10, bf) ])]), - K("span", Xd, j(R(Nl)(e.updatedAt ?? e.createdAt)), 1) - ], 8, Vd)], 42, Bd))), 128))])), - t[7] ||= Bi("
    j k navigate · open · / search · o open d draft m merged c closed a all
    ", 1) + K("span", Cf, A(L(zl)(e.updatedAt ?? e.createdAt)), 1) + ], 8, df)], 42, uf))), 128))])), + t[8] ||= Bi("
    j k navigate · open · / search · o open d draft r review m merged c closed a all
    ", 1) ])); } -}), [["styles", [".pulls-queue[data-v-d04acd2b]{font-family:var(--font-sans,system-ui);color:var(--fg,#fffffff0);gap:16px;display:grid}.pulls-queue-head[data-v-d04acd2b]{gap:12px;display:grid}.pulls-queue-head h2[data-v-d04acd2b]{font-family:var(--font-serif,system-ui);margin:0;font-size:22px;line-height:1}.pulls-queue-controls[data-v-d04acd2b]{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px;display:flex}.pulls-filter-row[data-v-d04acd2b]{border:.5px solid var(--fg,#fffffff0);flex-wrap:wrap;gap:4px;display:inline-flex}.pulls-filter[data-v-d04acd2b]{color:inherit;cursor:pointer;font-family:var(--font-mono,monospace);background:0 0;border:0;align-items:center;gap:6px;padding:6px 10px;font-size:12px;display:inline-flex}.pulls-filter[data-v-d04acd2b]:not(:last-child){border-right:.5px solid var(--line,#ffffff12)}.pulls-filter.active[data-v-d04acd2b]{background:var(--fg,#fffffff0);color:var(--bg,#0a0b0e)}.pulls-filter .count[data-v-d04acd2b]{color:var(--fg-3,#ffffff85);font-variant-numeric:tabular-nums}.pulls-filter.active .count[data-v-d04acd2b]{color:var(--bg-2,#0e1014)}.pulls-filter kbd[data-v-d04acd2b]{font-family:var(--font-mono,monospace);opacity:.6;border:.5px solid;padding:0 4px;font-size:10px}.pulls-search[data-v-d04acd2b]{border:.5px solid var(--fg,#fffffff0);flex:240px;align-items:center;gap:8px;min-width:240px;max-width:420px;padding:4px 10px;display:inline-flex}.pulls-search input[data-v-d04acd2b]{color:inherit;font:inherit;background:0 0;border:0;outline:none;flex:1;min-width:0}.pulls-search kbd[data-v-d04acd2b]{border:.5px solid var(--fg,#fffffff0);font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);padding:0 4px;font-size:10px}.pulls-list[data-v-d04acd2b]{border-top:.5px solid var(--fg,#fffffff0);margin:0;padding:0;list-style:none;display:grid}.pulls-row[data-v-d04acd2b]{border-bottom:.5px solid var(--line,#ffffff12)}.pulls-row.focused[data-v-d04acd2b]{background:var(--bg-2,#0e1014)}.pulls-row-link[data-v-d04acd2b]{color:inherit;grid-template-columns:56px 1fr auto;align-items:baseline;gap:14px;padding:12px 12px 12px 6px;text-decoration:none;display:grid}.pulls-row-link[data-v-d04acd2b]:hover{background:var(--bg-2,#0e1014);text-decoration:none}.pulls-row-number[data-v-d04acd2b]{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);text-align:right;font-variant-numeric:tabular-nums;font-size:12px}.pulls-row-body[data-v-d04acd2b]{gap:4px;min-width:0;display:grid}.pulls-row-title[data-v-d04acd2b]{font-family:var(--font-serif,system-ui);text-overflow:ellipsis;white-space:nowrap;font-size:16px;font-weight:600;overflow:hidden}.pulls-row-meta[data-v-d04acd2b]{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);flex-wrap:wrap;align-items:baseline;gap:10px;font-size:12px;display:flex}.pulls-state[data-v-d04acd2b]{letter-spacing:.04em;text-transform:uppercase;border:.5px solid;padding:0 6px;font-size:11px}.pulls-state.pr-state-ready[data-v-d04acd2b]{color:var(--accent-teal,#087f6f)}.pulls-state.pr-state-draft[data-v-d04acd2b]{color:var(--fg-3,#ffffff85)}.pulls-state.pr-state-merged[data-v-d04acd2b]{color:var(--accent-blue,#1d55a6)}.pulls-state.pr-state-closed[data-v-d04acd2b]{color:var(--accent-err,#c9341c)}.pulls-branch[data-v-d04acd2b]{font-family:var(--font-mono,monospace);color:var(--fg-2,#ffffffbd);font-size:12px}.pulls-branch span[data-v-d04acd2b]{color:var(--fg-4,#ffffff57);padding:0 4px}.pulls-author[data-v-d04acd2b]{color:inherit;font:inherit;font-family:var(--font-mono,monospace);cursor:pointer;background:0 0;border:1px dashed #0000;align-items:center;gap:5px;padding:0 5px;font-size:12px;display:inline-flex}.pulls-author[data-v-d04acd2b]:hover{background:var(--bg-2,#0e1014);border-color:currentColor}.pulls-author.active[data-v-d04acd2b]{background:var(--fg,#fffffff0);color:var(--bg,#0a0b0e);border-color:var(--fg,#fffffff0);border-style:solid}.pulls-author.active .author-glyph[data-v-d04acd2b],.pulls-author.active .author-label[data-v-d04acd2b]{color:inherit}.pulls-query-chips[data-v-d04acd2b]{font-family:var(--font-mono,monospace);flex-wrap:wrap;align-items:center;gap:6px;margin-top:8px;font-size:11px;display:flex}.pulls-query-chips .query-chip[data-v-d04acd2b]{letter-spacing:.02em;white-space:nowrap;border:.5px solid;align-items:center;padding:1px 7px;display:inline-flex}.pulls-query-chips .query-chip.tone-is[data-v-d04acd2b]{color:var(--accent-teal,#087f6f)}.pulls-query-chips .query-chip.tone-author[data-v-d04acd2b]{color:var(--fg,#fffffff0)}.pulls-query-chips .query-chip.tone-unknown[data-v-d04acd2b]{color:var(--accent-warn,#c89300);border-style:dashed}.pulls-query-chips .query-chips-hint[data-v-d04acd2b]{color:var(--fg-3,#ffffff85);letter-spacing:0;margin-left:4px}.pulls-query-chips .query-chips-hint code[data-v-d04acd2b]{font-family:var(--font-mono,monospace);background:var(--bg-2,#0e1014);color:var(--fg-2,#ffffffbd);padding:0 4px;font-size:11px}.pulls-author-filter[data-v-d04acd2b]{border:.5px solid var(--line,#ffffff12);background:var(--bg-2,#0e1014);font-family:var(--font-mono,monospace);align-items:center;gap:8px;margin-top:8px;padding:6px 10px;font-size:11px;display:inline-flex}.pulls-author-filter .prefix[data-v-d04acd2b]{color:var(--fg-3,#ffffff85);letter-spacing:.04em;text-transform:lowercase}.pulls-author-filter .active-chip[data-v-d04acd2b]{color:var(--fg,#fffffff0);border:.5px solid;align-items:center;gap:4px;padding:0 5px;display:inline-flex}.pulls-author-filter .active-chip[data-author-kind=agent][data-v-d04acd2b]{color:#6b3fa0}.pulls-author-filter .active-chip[data-author-kind=credential][data-v-d04acd2b]{color:var(--accent-yellow,#c89300)}.pulls-author-filter .active-chip[data-author-kind=bot][data-v-d04acd2b]{color:var(--accent-blue,#1d55a6)}.pulls-author-filter .active-chip[data-author-kind=team][data-v-d04acd2b]{color:var(--accent-teal,#087f6f)}.pulls-author-filter .author-glyph[data-v-d04acd2b]{place-items:center;width:12px;height:12px;font-size:9px;font-weight:700;display:inline-grid}.pulls-author-filter .clear[data-v-d04acd2b]{color:var(--fg-3,#ffffff85);font-family:var(--font-mono,monospace);cursor:pointer;background:0 0;border:0;margin-left:auto;padding:0 2px;font-size:10.5px}.pulls-author-filter .clear[data-v-d04acd2b]:hover{color:var(--fg,#fffffff0)}.pulls-author .author-glyph[data-v-d04acd2b]{width:14px;height:14px;color:var(--fg-3,#ffffff85);border:.5px solid;place-items:center;font-size:10px;font-weight:700;display:inline-grid}.pulls-author[data-author-kind=agent] .author-glyph[data-v-d04acd2b],.pulls-author[data-author-kind=agent] .author-label[data-v-d04acd2b],.pulls-author[data-author-kind=agent] .author-badge[data-v-d04acd2b]{color:#6b3fa0}.pulls-author[data-author-kind=credential] .author-glyph[data-v-d04acd2b],.pulls-author[data-author-kind=credential] .author-label[data-v-d04acd2b],.pulls-author[data-author-kind=credential] .author-badge[data-v-d04acd2b]{color:var(--accent-yellow,#c89300)}.pulls-author[data-author-kind=bot] .author-glyph[data-v-d04acd2b],.pulls-author[data-author-kind=bot] .author-label[data-v-d04acd2b],.pulls-author[data-author-kind=bot] .author-badge[data-v-d04acd2b]{color:var(--accent-blue,#1d55a6)}.pulls-author .author-badge[data-v-d04acd2b]{letter-spacing:.04em;text-transform:uppercase;border:.5px solid;padding:0 4px;font-size:10px}.pulls-row-age[data-v-d04acd2b]{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);white-space:nowrap;font-size:12px}.pulls-empty[data-v-d04acd2b],.pulls-error[data-v-d04acd2b]{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);border-top:.5px solid var(--line,#ffffff12);padding:18px 0;font-size:13px}.pulls-error[data-v-d04acd2b]{color:var(--accent-err,#c9341c)}.pulls-queue-foot[data-v-d04acd2b]{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);font-size:11px}.pulls-queue-foot kbd[data-v-d04acd2b]{font-family:var(--font-mono,monospace);border:.5px solid;padding:0 4px;font-size:10px}"]], ["__scopeId", "data-v-d04acd2b"]]), Qd = { - class: "pulls-your-work", - "data-smoke": "pulls-your-work" -}, $d = ["href"], ef = { - key: 0, - class: "muted" -}, tf = { - key: 1, - class: "muted" -}, nf = { - key: 2, - class: "muted" -}, rf = { key: 3 }, af = ["href"], of = { class: "num" }, sf = { class: "title" }, cf = { class: "meta" }, lf = /* @__PURE__ */ Vl(/* @__PURE__ */ zn({ - __name: "PullsYourWork", - props: { - host: { type: Object }, - workspaceId: { type: String }, - viewerRef: { type: [String, null] } - }, - setup(e) { - let t = e, n = /* @__PURE__ */ L([]), r = /* @__PURE__ */ L("idle"), i = X(() => t.workspaceId ?? t.host?.workspaceId ?? defaultWorkspaceId()), a = X(() => t.viewerRef ?? t.host?.viewerRef ?? null), o = X(() => a.value ? n.value.filter((e) => e.authorRef === a.value).filter((e) => e.state === "READY" || e.state === "DRAFT").slice(0, 5) : n.value.filter((e) => e.state === "READY" || e.state === "DRAFT").slice(0, 5)); - er(() => void s()), B(() => [i.value], () => void s()); - async function s() { - r.value = "loading"; - try { - n.value = await xl({ - workspaceId: i.value, - limit: 64 - }), r.value = n.value.length > 0 ? "ready" : "empty"; - } catch { - r.value = "error", n.value = []; - } - } - return (e, t) => (W(), G("section", Qd, [K("header", null, [t[0] ||= K("h3", null, "Your pull requests", -1), K("a", { href: R(Al)() }, "queue", 8, $d)]), r.value === "loading" ? (W(), G("p", ef, "Loading…")) : r.value === "error" ? (W(), G("p", tf, "Could not load pulls.")) : o.value.length === 0 ? (W(), G("p", nf, " Nothing here yet. Open a pull request to see it in this rail. ")) : (W(), G("ul", rf, [(W(!0), G(U, null, ur(o.value, (e) => (W(), G("li", { key: e.id }, [K("a", { href: R(jl)(e) }, [ - K("span", of, "#" + j(e.number), 1), - K("span", sf, j(e.title), 1), - K("span", { class: A(["state", R(Ml)(e.state).className]) }, j(R(Ml)(e.state).label), 3), - K("span", cf, j(R(ul)(e.authorRef)) + " · " + j(R(Nl)(e.updatedAt ?? e.createdAt)), 1) - ], 8, af)]))), 128))]))])); - } -}), [["styles", [".pulls-your-work[data-v-9649d84e]{gap:8px;display:grid}.pulls-your-work header[data-v-9649d84e]{justify-content:space-between;align-items:baseline;display:flex}.pulls-your-work h3[data-v-9649d84e]{font-family:var(--font-serif,system-ui);margin:0;font-size:14px}.pulls-your-work header a[data-v-9649d84e],.muted[data-v-9649d84e]{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);font-size:12px;text-decoration:none}.pulls-your-work ul[data-v-9649d84e]{margin:0;padding:0;list-style:none;display:grid}.pulls-your-work li a[data-v-9649d84e]{color:inherit;border-bottom:.5px solid var(--line,#ffffff12);grid-template-columns:auto minmax(0,1fr) auto;align-items:baseline;gap:8px;padding:8px 0;text-decoration:none;display:grid}.pulls-your-work li:last-child a[data-v-9649d84e]{border-bottom:0}.num[data-v-9649d84e]{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);font-size:11px}.title[data-v-9649d84e]{text-overflow:ellipsis;white-space:nowrap;grid-row:1;overflow:hidden}.state[data-v-9649d84e]{font-family:var(--font-mono,monospace);letter-spacing:.04em;text-transform:uppercase;border:.5px solid;padding:0 4px;font-size:10px}.state.pr-state-ready[data-v-9649d84e]{color:var(--accent-teal,#087f6f)}.state.pr-state-draft[data-v-9649d84e]{color:var(--fg-3,#ffffff85)}.state.pr-state-merged[data-v-9649d84e]{color:var(--accent-blue,#1d55a6)}.state.pr-state-closed[data-v-9649d84e]{color:var(--accent-err,#c9341c)}.meta[data-v-9649d84e]{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);grid-column:1/-1;font-size:11px}"]], ["__scopeId", "data-v-9649d84e"]]), uf = "ext_pull_requests", df = "comtrya-pulls-queue", ff = "comtrya-pulls-detail", pf = "comtrya-pulls-your-work", mf = "comtrya-pulls-overview"; -dl({ - tagName: df, - component: Zd -}), dl({ - tagName: ff, - component: dd -}), dl({ - tagName: pf, - component: lf -}), dl({ - tagName: mf, - component: Sd +}), [["styles", [".pulls-queue[data-v-679bd329]{font-family:var(--font-sans,system-ui);color:var(--fg,#fffffff0);gap:16px;display:grid}.pulls-queue-head[data-v-679bd329]{gap:12px;display:grid}.pulls-queue-head h2[data-v-679bd329]{font-family:var(--font-serif,system-ui);margin:0;font-size:22px;line-height:1}.pulls-queue-controls[data-v-679bd329]{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px;display:flex}.pulls-filter-row[data-v-679bd329]{border:.5px solid var(--fg,#fffffff0);flex-wrap:wrap;gap:4px;display:inline-flex}.pulls-filter[data-v-679bd329]{color:inherit;cursor:pointer;font-family:var(--font-mono,monospace);background:0 0;border:0;align-items:center;gap:6px;padding:6px 10px;font-size:12px;display:inline-flex}.pulls-filter[data-v-679bd329]:not(:last-child){border-right:.5px solid var(--line,#ffffff12)}.pulls-filter.active[data-v-679bd329]{background:var(--fg,#fffffff0);color:var(--bg,#0a0b0e)}.pulls-filter .count[data-v-679bd329]{color:var(--fg-3,#ffffff85);font-variant-numeric:tabular-nums}.pulls-filter.active .count[data-v-679bd329]{color:var(--bg-2,#0e1014)}.pulls-filter kbd[data-v-679bd329]{font-family:var(--font-mono,monospace);opacity:.6;border:.5px solid;padding:0 4px;font-size:10px}.pulls-search[data-v-679bd329]{border:.5px solid var(--fg,#fffffff0);flex:240px;align-items:center;gap:8px;min-width:240px;max-width:420px;padding:4px 10px;display:inline-flex}.pulls-search input[data-v-679bd329]{color:inherit;font:inherit;background:0 0;border:0;outline:none;flex:1;min-width:0}.pulls-search kbd[data-v-679bd329]{border:.5px solid var(--fg,#fffffff0);font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);padding:0 4px;font-size:10px}.pulls-list[data-v-679bd329]{border-top:.5px solid var(--fg,#fffffff0);margin:0;padding:0;list-style:none;display:grid}.pulls-readiness-board[data-v-679bd329]{border:.5px solid var(--line,#ffffff12);background:var(--bg-2,#0e1014);gap:10px;padding:12px;display:grid}.pulls-readiness-board header[data-v-679bd329]{justify-content:space-between;align-items:flex-start;gap:12px;display:flex}.pulls-readiness-board h3[data-v-679bd329]{font-family:var(--font-serif,system-ui);margin:0;font-size:16px;line-height:1.1}.pulls-readiness-board header span[data-v-679bd329],.pulls-readiness-board header button[data-v-679bd329],.pulls-readiness-error[data-v-679bd329]{font-family:var(--font-mono,monospace);font-size:11px}.pulls-readiness-board header span[data-v-679bd329]{color:var(--fg-3,#ffffff85)}.pulls-readiness-board header button[data-v-679bd329]{color:var(--fg-3,#ffffff85);cursor:pointer;background:0 0;border:.5px solid;padding:3px 8px}.pulls-readiness-board header button[data-v-679bd329]:hover{color:var(--fg,#fffffff0)}.pulls-readiness-lanes[data-v-679bd329]{grid-template-columns:repeat(auto-fit,minmax(124px,1fr));gap:6px;display:grid}.pulls-readiness-lane[data-v-679bd329]{min-width:0;color:var(--fg-3,#ffffff85);font-family:var(--font-mono,monospace);border:.5px solid;justify-content:space-between;align-items:baseline;gap:8px;padding:7px 8px;font-size:11px;display:flex}.pulls-readiness-lane span[data-v-679bd329]{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.pulls-readiness-lane strong[data-v-679bd329]{font-variant-numeric:tabular-nums;flex:none}.pulls-readiness-lane.tone-blocked[data-v-679bd329],.pulls-readiness-chip.tone-blocked[data-v-679bd329]{color:var(--accent-err,#c9341c)}.pulls-readiness-lane.tone-review[data-v-679bd329],.pulls-readiness-chip.tone-review[data-v-679bd329]{color:var(--accent-blue,#1d55a6)}.pulls-readiness-lane.tone-checks[data-v-679bd329],.pulls-readiness-chip.tone-checks[data-v-679bd329]{color:var(--accent-yellow,#c89300)}.pulls-readiness-lane.tone-ready[data-v-679bd329],.pulls-readiness-chip.tone-ready[data-v-679bd329]{color:var(--accent-teal,#087f6f)}.pulls-readiness-lane.tone-terminal[data-v-679bd329],.pulls-readiness-chip.tone-terminal[data-v-679bd329]{color:var(--fg-3,#ffffff85)}.pulls-readiness-lane.tone-draft[data-v-679bd329],.pulls-readiness-chip.tone-draft[data-v-679bd329]{color:var(--fg-4,#ffffff57)}.pulls-readiness-error[data-v-679bd329]{color:var(--accent-err,#c9341c);margin:0}.pulls-row[data-v-679bd329]{border-bottom:.5px solid var(--line,#ffffff12)}.pulls-row.focused[data-v-679bd329]{background:var(--bg-2,#0e1014)}.pulls-row-link[data-v-679bd329]{color:inherit;grid-template-columns:56px 1fr auto;align-items:baseline;gap:14px;padding:12px 12px 12px 6px;text-decoration:none;display:grid}.pulls-row-link[data-v-679bd329]:hover{background:var(--bg-2,#0e1014);text-decoration:none}.pulls-row-number[data-v-679bd329]{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);text-align:right;font-variant-numeric:tabular-nums;font-size:12px}.pulls-row-body[data-v-679bd329]{gap:4px;min-width:0;display:grid}.pulls-row-title[data-v-679bd329]{font-family:var(--font-serif,system-ui);text-overflow:ellipsis;white-space:nowrap;font-size:16px;font-weight:600;overflow:hidden}.pulls-row-meta[data-v-679bd329]{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);flex-wrap:wrap;align-items:baseline;gap:10px;font-size:12px;display:flex}.pulls-state[data-v-679bd329]{letter-spacing:0;text-transform:uppercase;border:.5px solid;padding:0 6px;font-size:11px}.pulls-state.pr-state-ready[data-v-679bd329]{color:var(--accent-teal,#087f6f)}.pulls-state.pr-state-draft[data-v-679bd329]{color:var(--fg-3,#ffffff85)}.pulls-state.pr-state-review[data-v-679bd329],.pulls-state.pr-state-merged[data-v-679bd329]{color:var(--accent-blue,#1d55a6)}.pulls-state.pr-state-closed[data-v-679bd329]{color:var(--accent-err,#c9341c)}.pulls-readiness-chip[data-v-679bd329],.pulls-readiness-metric[data-v-679bd329]{text-overflow:ellipsis;white-space:nowrap;align-items:center;min-width:0;max-width:220px;display:inline-flex;overflow:hidden}.pulls-readiness-chip[data-v-679bd329]{text-transform:lowercase;border:.5px solid;padding:0 6px;font-size:11px}.pulls-readiness-metric[data-v-679bd329]{color:var(--fg-4,#ffffff57)}.pulls-branch[data-v-679bd329]{font-family:var(--font-mono,monospace);color:var(--fg-2,#ffffffbd);font-size:12px}.pulls-branch span[data-v-679bd329]{color:var(--fg-4,#ffffff57);padding:0 4px}.pulls-author[data-v-679bd329]{color:inherit;font:inherit;font-family:var(--font-mono,monospace);cursor:pointer;background:0 0;border:1px dashed #0000;align-items:center;gap:5px;padding:0 5px;font-size:12px;display:inline-flex}.pulls-author[data-v-679bd329]:hover{background:var(--bg-2,#0e1014);border-color:currentColor}.pulls-author.active[data-v-679bd329]{background:var(--fg,#fffffff0);color:var(--bg,#0a0b0e);border-color:var(--fg,#fffffff0);border-style:solid}.pulls-author.active .author-glyph[data-v-679bd329],.pulls-author.active .author-label[data-v-679bd329]{color:inherit}.pulls-query-chips[data-v-679bd329]{font-family:var(--font-mono,monospace);flex-wrap:wrap;align-items:center;gap:6px;margin-top:8px;font-size:11px;display:flex}.pulls-query-chips .query-chip[data-v-679bd329]{letter-spacing:.02em;white-space:nowrap;border:.5px solid;align-items:center;padding:1px 7px;display:inline-flex}.pulls-query-chips .query-chip.tone-is[data-v-679bd329]{color:var(--accent-teal,#087f6f)}.pulls-query-chips .query-chip.tone-author[data-v-679bd329]{color:var(--fg,#fffffff0)}.pulls-query-chips .query-chip.tone-unknown[data-v-679bd329]{color:var(--accent-warn,#c89300);border-style:dashed}.pulls-query-chips .query-chips-hint[data-v-679bd329]{color:var(--fg-3,#ffffff85);letter-spacing:0;margin-left:4px}.pulls-query-chips .query-chips-hint code[data-v-679bd329]{font-family:var(--font-mono,monospace);background:var(--bg-2,#0e1014);color:var(--fg-2,#ffffffbd);padding:0 4px;font-size:11px}.pulls-author-filter[data-v-679bd329]{border:.5px solid var(--line,#ffffff12);background:var(--bg-2,#0e1014);font-family:var(--font-mono,monospace);align-items:center;gap:8px;margin-top:8px;padding:6px 10px;font-size:11px;display:inline-flex}.pulls-author-filter .prefix[data-v-679bd329]{color:var(--fg-3,#ffffff85);letter-spacing:.04em;text-transform:lowercase}.pulls-author-filter .active-chip[data-v-679bd329]{color:var(--fg,#fffffff0);border:.5px solid;align-items:center;gap:4px;padding:0 5px;display:inline-flex}.pulls-author-filter .active-chip[data-author-kind=agent][data-v-679bd329]{color:#6b3fa0}.pulls-author-filter .active-chip[data-author-kind=credential][data-v-679bd329]{color:var(--accent-yellow,#c89300)}.pulls-author-filter .active-chip[data-author-kind=bot][data-v-679bd329]{color:var(--accent-blue,#1d55a6)}.pulls-author-filter .active-chip[data-author-kind=team][data-v-679bd329]{color:var(--accent-teal,#087f6f)}.pulls-author-filter .author-glyph[data-v-679bd329]{place-items:center;width:12px;height:12px;font-size:9px;font-weight:700;display:inline-grid}.pulls-author-filter .clear[data-v-679bd329]{color:var(--fg-3,#ffffff85);font-family:var(--font-mono,monospace);cursor:pointer;background:0 0;border:0;margin-left:auto;padding:0 2px;font-size:10.5px}.pulls-author-filter .clear[data-v-679bd329]:hover{color:var(--fg,#fffffff0)}.pulls-author .author-glyph[data-v-679bd329]{width:14px;height:14px;color:var(--fg-3,#ffffff85);border:.5px solid;place-items:center;font-size:10px;font-weight:700;display:inline-grid}.pulls-author[data-author-kind=agent] .author-glyph[data-v-679bd329],.pulls-author[data-author-kind=agent] .author-label[data-v-679bd329],.pulls-author[data-author-kind=agent] .author-badge[data-v-679bd329]{color:#6b3fa0}.pulls-author[data-author-kind=credential] .author-glyph[data-v-679bd329],.pulls-author[data-author-kind=credential] .author-label[data-v-679bd329],.pulls-author[data-author-kind=credential] .author-badge[data-v-679bd329]{color:var(--accent-yellow,#c89300)}.pulls-author[data-author-kind=bot] .author-glyph[data-v-679bd329],.pulls-author[data-author-kind=bot] .author-label[data-v-679bd329],.pulls-author[data-author-kind=bot] .author-badge[data-v-679bd329]{color:var(--accent-blue,#1d55a6)}.pulls-author .author-badge[data-v-679bd329]{letter-spacing:.04em;text-transform:uppercase;border:.5px solid;padding:0 4px;font-size:10px}.pulls-row-age[data-v-679bd329]{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);white-space:nowrap;font-size:12px}.pulls-empty[data-v-679bd329],.pulls-error[data-v-679bd329]{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);border-top:.5px solid var(--line,#ffffff12);padding:18px 0;font-size:13px}.pulls-error[data-v-679bd329]{color:var(--accent-err,#c9341c)}.pulls-queue-foot[data-v-679bd329]{font-family:var(--font-mono,monospace);color:var(--fg-3,#ffffff85);font-size:11px}.pulls-queue-foot kbd[data-v-679bd329]{font-family:var(--font-mono,monospace);border:.5px solid;padding:0 4px;font-size:10px}@media (max-width:720px){.pulls-row-link[data-v-679bd329]{grid-template-columns:44px minmax(0,1fr)}.pulls-row-age[data-v-679bd329]{grid-column:2}.pulls-readiness-board header[data-v-679bd329]{flex-direction:column;align-items:stretch}.pulls-readiness-lanes[data-v-679bd329]{grid-template-columns:minmax(0,1fr)}}"]], ["__scopeId", "data-v-679bd329"]]), Tf = "ext_pull_requests", Ef = "comtrya-pulls-queue", Df = "comtrya-pulls-detail", Of = "comtrya-pulls-overview"; +pl({ + tagName: Ef, + component: wf +}), pl({ + tagName: Df, + component: gd +}), pl({ + tagName: Of, + component: Id }); -var hf = { - id: uf, +var kf = { + id: Tf, setup(e) { e.registerWidget({ - id: "pulls-your-work", - element: pf, - defaultSlot: "home.your-work", - defaultPriority: 100, - requiredPermission: "pull-requests.read" - }), e.registerWidget({ id: "pulls-overview", - element: mf, + element: Of, defaultSlot: "repository.sidebar", defaultPriority: 100, requiredPermission: "pull-requests.read" }), e.registerRoute("/", { - element: df, + element: Ef, requiredPermission: "pull-requests.read" }), e.registerRoute("/:pullId", { - element: ff, + element: Df, requiredPermission: "pull-requests.read" - }), Rl(); + }), Wl(); } }; //#endregion -export { hf as default }; +export { kf as default }; diff --git a/extensions/first-party/ext_pull_requests/component/src/lib.rs b/extensions/first-party/ext_pull_requests/component/src/lib.rs index a273d4b2..92565ed6 100644 --- a/extensions/first-party/ext_pull_requests/component/src/lib.rs +++ b/extensions/first-party/ext_pull_requests/component/src/lib.rs @@ -11,19 +11,37 @@ use bindings::comtrya::platform::storage; use bindings::comtrya::platform::time; use bindings::comtrya::platform::types::{Error, ErrorCode, Event}; use bindings::exports::comtrya::ext_pull_requests::pulls::{ - ClosePullInput, CreatePullInput, Guest as PullsGuest, MergePullInput, PrState, PullRequest, + ChangeStatePullInput, ClosePullInput, CreatePullInput, Guest as PullsGuest, + ListPullReviewsInput, ListReviewRequestsInput, MergePullInput, PrState, PullAuthorBoard, + PullAuthorBoardInput, PullAuthorCard, PullAuthorColumn, PullBaseBranchBoard, + PullBaseBranchBoardInput, PullBaseBranchCard, PullBaseBranchColumn, PullHeadBranchBoard, + PullHeadBranchBoardInput, PullHeadBranchCard, PullHeadBranchColumn, PullMergeCheckSummary, + PullMergeReadinessBoard, PullMergeReadinessBoardInput, PullMergeReadinessCard, + PullMergeReadinessColumn, PullMergeReviewSummary, PullRequest, PullReview, PullReviewBoard, + PullReviewBoardInput, PullReviewCard, PullReviewColumn, PullReviewDecision, + PullReviewDecisionBoard, PullReviewDecisionBoardInput, PullReviewDecisionCard, + PullReviewDecisionColumn, PullReviewRequest, PullReviewRequestBoard, + PullReviewRequestBoardInput, PullReviewRequestCard, PullReviewRequestColumn, PullReviewerQueue, + PullReviewerQueueCard, PullReviewerQueueColumn, PullReviewerQueueInput, RequestReviewInput, + SubmitReviewInput, }; use bindings::exports::comtrya::platform::reactor::{ Guest as ReactorGuest, MutationCall, Reaction, }; +use std::collections::BTreeMap; + use serde::{Deserialize, Serialize}; const COLLECTION: &str = "pull_requests"; +const REVIEW_COLLECTION: &str = "pull_request_reviews"; +const REVIEW_REQUEST_COLLECTION: &str = "pull_review_requests"; // Renamed from "_meta" (was shared with ext_issues, causing a // collection_owners BTreeMap last-write-wins collision — see #153). const COUNTER_COLLECTION: &str = "ext_pull_requests_meta"; const PULL_MERGED_EVENT: &str = "dev.comtrya.pull-request.merged"; +const PULL_REVIEWED_EVENT: &str = "dev.comtrya.pull-request.reviewed"; +const PULL_REVIEW_REQUESTED_EVENT: &str = "dev.comtrya.pull-request.review-requested"; const CLOSES_RELATION: &str = "comtrya://rel/com.comtrya.pulls/closes"; const ISSUE_REF_PREFIX: &str = "comtrya://issue/"; const CLOSE_ISSUE_MUTATION: &str = "ext_issues/issues.close-issue"; @@ -102,11 +120,179 @@ impl StoredPullRequest { } } +#[derive(Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +struct StoredPullReview { + id: String, + pull_id: String, + pull_request_ref: String, + repository: String, + reviewer_ref: String, + decision: String, + body_markdown: String, + created_at: String, +} + +impl StoredPullReview { + fn to_wit(&self) -> PullReview { + PullReview { + id: self.id.clone(), + pull_id: self.pull_id.clone(), + pull_request_ref: self.pull_request_ref.clone(), + repository: self.repository.clone(), + reviewer_ref: self.reviewer_ref.clone(), + decision: review_decision_from_str(&self.decision), + body_markdown: self.body_markdown.clone(), + created_at: self.created_at.clone(), + } + } +} + +#[derive(Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +struct StoredPullReviewRequest { + id: String, + pull_id: String, + pull_request_ref: String, + repository: String, + reviewer_ref: String, + requested_by_ref: String, + requested_at: String, +} + +impl StoredPullReviewRequest { + fn to_wit(&self, completed_review: Option) -> PullReviewRequest { + PullReviewRequest { + id: self.id.clone(), + pull_id: self.pull_id.clone(), + pull_request_ref: self.pull_request_ref.clone(), + repository: self.repository.clone(), + reviewer_ref: self.reviewer_ref.clone(), + requested_by_ref: self.requested_by_ref.clone(), + requested_at: self.requested_at.clone(), + completed_review, + } + } +} + struct RepositoryScope { workspace_id: Option, repository_id: Option, } +enum ReviewLane { + Draft, + Ready, + Review, + Merged, + Closed, +} + +enum MergeReadinessLane { + Draft, + ReviewBlocked, + CheckBlocked, + ReviewWaiting, + CheckWaiting, + Ready, + Merged, + Closed, +} + +enum ReviewDecisionLane { + Awaiting, + Commented, + Approved, + ChangesRequested, + Merged, + Closed, +} + +enum ReviewRequestLane { + NeedsReview, + Reviewed, + Unrequested, + Merged, + Closed, +} + +enum ReviewerQueueLane { + NeedsReview, + Reviewed, + Merged, + Closed, +} + +#[derive(Default)] +struct ReviewStats { + latest_review: Option, + approval_count: u32, + change_request_count: u32, + comment_count: u32, +} + +#[derive(Default)] +struct ActiveReviewStats { + latest_review: Option, + latest_by_reviewer: BTreeMap, +} + +struct MergeReadinessFlags { + check_blocked: bool, + check_waiting: bool, + review_blocked: bool, + review_waiting: bool, +} + +fn is_newer_review(candidate: &PullReview, current: Option<&PullReview>) -> bool { + current.is_none_or(|latest| { + (latest.created_at.as_str(), latest.id.as_str()) + <= (candidate.created_at.as_str(), candidate.id.as_str()) + }) +} + +impl ActiveReviewStats { + fn record(&mut self, review: PullReview) { + if is_newer_review(&review, self.latest_review.as_ref()) { + self.latest_review = Some(review.clone()); + } + let reviewer = review.reviewer_ref.clone(); + let is_newer_for_reviewer = + is_newer_review(&review, self.latest_by_reviewer.get(&reviewer)); + if is_newer_for_reviewer { + self.latest_by_reviewer.insert(reviewer, review); + } + } + + fn summary(&self, required_approvals: u32) -> PullMergeReviewSummary { + let mut approval_count = 0u32; + let mut change_request_count = 0u32; + let mut comment_count = 0u32; + + for review in self.latest_by_reviewer.values() { + match review.decision { + PullReviewDecision::Approve => { + approval_count = approval_count.saturating_add(1); + } + PullReviewDecision::RequestChanges => { + change_request_count = change_request_count.saturating_add(1); + } + PullReviewDecision::Comment => { + comment_count = comment_count.saturating_add(1); + } + } + } + + PullMergeReviewSummary { + required_approvals, + approval_count, + change_request_count, + comment_count, + latest_review: self.latest_review.clone(), + } + } +} + fn err(code: ErrorCode, message: impl Into) -> Error { Error { code, @@ -115,6 +301,53 @@ fn err(code: ErrorCode, message: impl Into) -> Error { } } +fn review_decision_to_str(decision: PullReviewDecision) -> &'static str { + match decision { + PullReviewDecision::Comment => "COMMENT", + PullReviewDecision::Approve => "APPROVE", + PullReviewDecision::RequestChanges => "REQUEST_CHANGES", + } +} + +fn review_decision_from_str(decision: &str) -> PullReviewDecision { + match decision { + "APPROVE" => PullReviewDecision::Approve, + "REQUEST_CHANGES" => PullReviewDecision::RequestChanges, + _ => PullReviewDecision::Comment, + } +} + +fn validate_review_body(decision: PullReviewDecision, body: &str) -> Result<(), Error> { + if body.len() > MAX_BODY_LEN { + return Err(err( + ErrorCode::BadInput, + format!("review body must be at most {MAX_BODY_LEN} bytes"), + )); + } + if matches!( + decision, + PullReviewDecision::Comment | PullReviewDecision::RequestChanges + ) && body.trim().is_empty() + { + return Err(err( + ErrorCode::BadInput, + "comment and request-changes reviews require a body", + )); + } + Ok(()) +} + +fn validate_reviewer_ref(reviewer_ref: &str) -> Result<(), Error> { + let reviewer_ref = reviewer_ref.trim(); + if reviewer_ref.is_empty() || !reviewer_ref.starts_with("comtrya://") { + return Err(err( + ErrorCode::BadInput, + "reviewerRef must be a non-empty comtrya:// URI", + )); + } + Ok(()) +} + fn state_to_str(state: PrState) -> &'static str { match state { PrState::Draft => "DRAFT", @@ -135,6 +368,494 @@ fn state_from_str(state: &str) -> PrState { } } +fn validate_state_transition(current: &str, requested: PrState) -> Result<&'static str, Error> { + let requested = state_to_str(requested); + if current == requested { + return Ok(requested); + } + match (current, requested) { + ("DRAFT" | "READY" | "REVIEW", "DRAFT" | "READY" | "REVIEW") => Ok(requested), + ("MERGED", _) | ("CLOSED", _) => Err(err( + ErrorCode::Conflict, + format!("cannot change state of a terminal {current} pull request"), + )), + (_, "MERGED" | "CLOSED") => Err(err( + ErrorCode::BadInput, + "use merge-pull or close-pull for terminal pull request states", + )), + _ => Err(err( + ErrorCode::Conflict, + format!("cannot change pull request state from {current} to {requested}"), + )), + } +} + +fn review_lane(pull: &PullRequest) -> ReviewLane { + match pull.state { + PrState::Draft => ReviewLane::Draft, + PrState::Ready => ReviewLane::Ready, + PrState::Review => ReviewLane::Review, + PrState::Merged => ReviewLane::Merged, + PrState::Closed => ReviewLane::Closed, + } +} + +fn review_column(key: &str, label: &str, cards: Vec) -> PullReviewColumn { + PullReviewColumn { + key: key.to_string(), + label: label.to_string(), + count: cards.len() as u32, + cards, + } +} + +fn review_columns(cards: Vec) -> Vec { + let mut drafts = Vec::new(); + let mut ready = Vec::new(); + let mut review = Vec::new(); + let mut merged = Vec::new(); + let mut closed = Vec::new(); + + for card in cards { + match review_lane(&card.pull_request) { + ReviewLane::Draft => drafts.push(card), + ReviewLane::Ready => ready.push(card), + ReviewLane::Review => review.push(card), + ReviewLane::Merged => merged.push(card), + ReviewLane::Closed => closed.push(card), + } + } + + vec![ + review_column("draft", "Draft", drafts), + review_column("ready", "Ready", ready), + review_column("review", "In review", review), + review_column("merged", "Merged", merged), + review_column("closed", "Closed", closed), + ] +} + +fn author_column_label(author_ref: &str) -> String { + author_ref + .strip_prefix("comtrya://user/") + .or_else(|| author_ref.strip_prefix("comtrya://org/")) + .or_else(|| author_ref.strip_prefix("comtrya://team/")) + .unwrap_or(author_ref) + .to_string() +} + +fn stable_column_slug(value: &str) -> String { + let mut slug = String::new(); + let mut previous_dash = false; + for character in value.strip_prefix("comtrya://").unwrap_or(value).chars() { + if character.is_ascii_alphanumeric() { + slug.push(character.to_ascii_lowercase()); + previous_dash = false; + } else if !slug.is_empty() && !previous_dash { + slug.push('-'); + previous_dash = true; + } + } + if slug.ends_with('-') { + slug.pop(); + } + if slug.is_empty() { + "unknown".to_string() + } else { + slug + } +} + +fn author_column( + key: &str, + label: &str, + author_ref: Option, + cards: Vec, +) -> PullAuthorColumn { + PullAuthorColumn { + key: key.to_string(), + label: label.to_string(), + author_ref, + count: cards.len() as u32, + cards, + } +} + +fn author_columns(cards: Vec) -> Vec { + let mut by_author = BTreeMap::>::new(); + let mut merged = Vec::new(); + let mut closed = Vec::new(); + + for card in cards { + match card.pull_request.state { + PrState::Merged => merged.push(card), + PrState::Closed => closed.push(card), + _ => by_author + .entry(card.pull_request.author_ref.clone()) + .or_default() + .push(card), + } + } + + let mut columns = by_author + .into_iter() + .map(|(author_ref, cards)| { + let key = format!("author-{}", stable_column_slug(&author_ref)); + let label = author_column_label(&author_ref); + author_column(&key, &label, Some(author_ref), cards) + }) + .collect::>(); + columns.push(author_column("merged", "Merged", None, merged)); + columns.push(author_column("closed", "Closed", None, closed)); + columns +} + +fn base_branch_column( + key: &str, + label: &str, + base_ref: Option, + cards: Vec, +) -> PullBaseBranchColumn { + PullBaseBranchColumn { + key: key.to_string(), + label: label.to_string(), + base_ref, + count: cards.len() as u32, + cards, + } +} + +fn base_branch_columns(cards: Vec) -> Vec { + let mut by_base_ref = BTreeMap::>::new(); + let mut merged = Vec::new(); + let mut closed = Vec::new(); + + for card in cards { + match card.pull_request.state { + PrState::Merged => merged.push(card), + PrState::Closed => closed.push(card), + _ => by_base_ref + .entry(card.pull_request.base_ref.clone()) + .or_default() + .push(card), + } + } + + let mut columns = by_base_ref + .into_iter() + .map(|(base_ref, cards)| { + let key = format!("base-{}", stable_column_slug(&base_ref)); + base_branch_column(&key, &base_ref, Some(base_ref.clone()), cards) + }) + .collect::>(); + columns.push(base_branch_column("merged", "Merged", None, merged)); + columns.push(base_branch_column("closed", "Closed", None, closed)); + columns +} + +fn head_branch_column( + key: &str, + label: &str, + head_ref: Option, + cards: Vec, +) -> PullHeadBranchColumn { + PullHeadBranchColumn { + key: key.to_string(), + label: label.to_string(), + head_ref, + count: cards.len() as u32, + cards, + } +} + +fn head_branch_columns(cards: Vec) -> Vec { + let mut by_head_ref = BTreeMap::>::new(); + let mut merged = Vec::new(); + let mut closed = Vec::new(); + + for card in cards { + match card.pull_request.state { + PrState::Merged => merged.push(card), + PrState::Closed => closed.push(card), + _ => by_head_ref + .entry(card.pull_request.head_ref.clone()) + .or_default() + .push(card), + } + } + + let mut columns = by_head_ref + .into_iter() + .map(|(head_ref, cards)| { + let key = format!("head-{}", stable_column_slug(&head_ref)); + head_branch_column(&key, &head_ref, Some(head_ref.clone()), cards) + }) + .collect::>(); + columns.push(head_branch_column("merged", "Merged", None, merged)); + columns.push(head_branch_column("closed", "Closed", None, closed)); + columns +} + +fn merge_readiness_flags( + pull: &PullRequest, + summary: Option<&PullMergeCheckSummary>, + review_summary: &PullMergeReviewSummary, +) -> MergeReadinessFlags { + if matches!( + pull.state, + PrState::Draft | PrState::Merged | PrState::Closed + ) { + return MergeReadinessFlags { + check_blocked: false, + check_waiting: false, + review_blocked: false, + review_waiting: false, + }; + } + let check_blocked = + summary.is_some_and(|summary| summary.required_missing > 0 || summary.required_failing > 0); + let check_waiting = !check_blocked + && match summary { + Some(summary) => summary.pending > 0, + None => true, + }; + let review_blocked = review_summary.change_request_count > 0; + let review_waiting = + !review_blocked && review_summary.approval_count < review_summary.required_approvals; + MergeReadinessFlags { + check_blocked, + check_waiting, + review_blocked, + review_waiting, + } +} + +fn merge_readiness_lane(card: &PullMergeReadinessCard) -> MergeReadinessLane { + match card.pull_request.state { + PrState::Draft => MergeReadinessLane::Draft, + PrState::Merged => MergeReadinessLane::Merged, + PrState::Closed => MergeReadinessLane::Closed, + _ if card.review_blocked => MergeReadinessLane::ReviewBlocked, + _ if card.check_blocked => MergeReadinessLane::CheckBlocked, + _ if card.review_waiting => MergeReadinessLane::ReviewWaiting, + _ if card.check_waiting => MergeReadinessLane::CheckWaiting, + _ => MergeReadinessLane::Ready, + } +} + +fn merge_readiness_column( + key: &str, + label: &str, + cards: Vec, +) -> PullMergeReadinessColumn { + PullMergeReadinessColumn { + key: key.to_string(), + label: label.to_string(), + count: cards.len() as u32, + cards, + } +} + +fn merge_readiness_columns(cards: Vec) -> Vec { + let mut drafts = Vec::new(); + let mut review_blocked = Vec::new(); + let mut check_blocked = Vec::new(); + let mut review_waiting = Vec::new(); + let mut check_waiting = Vec::new(); + let mut ready = Vec::new(); + let mut merged = Vec::new(); + let mut closed = Vec::new(); + + for card in cards { + match merge_readiness_lane(&card) { + MergeReadinessLane::Draft => drafts.push(card), + MergeReadinessLane::ReviewBlocked => review_blocked.push(card), + MergeReadinessLane::CheckBlocked => check_blocked.push(card), + MergeReadinessLane::ReviewWaiting => review_waiting.push(card), + MergeReadinessLane::CheckWaiting => check_waiting.push(card), + MergeReadinessLane::Ready => ready.push(card), + MergeReadinessLane::Merged => merged.push(card), + MergeReadinessLane::Closed => closed.push(card), + } + } + + vec![ + merge_readiness_column("draft", "Draft", drafts), + merge_readiness_column("blocked-review", "Blocked by review", review_blocked), + merge_readiness_column("blocked-checks", "Blocked by checks", check_blocked), + merge_readiness_column("needs-review", "Needs review", review_waiting), + merge_readiness_column("waiting-checks", "Checks running", check_waiting), + merge_readiness_column("ready", "Ready to merge", ready), + merge_readiness_column("merged", "Merged", merged), + merge_readiness_column("closed", "Closed", closed), + ] +} + +fn review_decision_lane(card: &PullReviewDecisionCard) -> ReviewDecisionLane { + match card.pull_request.state { + PrState::Merged => ReviewDecisionLane::Merged, + PrState::Closed => ReviewDecisionLane::Closed, + _ => match card.latest_review.as_ref().map(|review| review.decision) { + Some(PullReviewDecision::Approve) => ReviewDecisionLane::Approved, + Some(PullReviewDecision::RequestChanges) => ReviewDecisionLane::ChangesRequested, + Some(PullReviewDecision::Comment) => ReviewDecisionLane::Commented, + None => ReviewDecisionLane::Awaiting, + }, + } +} + +fn review_decision_column( + key: &str, + label: &str, + cards: Vec, +) -> PullReviewDecisionColumn { + PullReviewDecisionColumn { + key: key.to_string(), + label: label.to_string(), + count: cards.len() as u32, + cards, + } +} + +fn review_decision_columns(cards: Vec) -> Vec { + let mut awaiting = Vec::new(); + let mut commented = Vec::new(); + let mut approved = Vec::new(); + let mut changes_requested = Vec::new(); + let mut merged = Vec::new(); + let mut closed = Vec::new(); + + for card in cards { + match review_decision_lane(&card) { + ReviewDecisionLane::Awaiting => awaiting.push(card), + ReviewDecisionLane::Commented => commented.push(card), + ReviewDecisionLane::Approved => approved.push(card), + ReviewDecisionLane::ChangesRequested => changes_requested.push(card), + ReviewDecisionLane::Merged => merged.push(card), + ReviewDecisionLane::Closed => closed.push(card), + } + } + + vec![ + review_decision_column("awaiting-review", "Awaiting review", awaiting), + review_decision_column("commented", "Review comments", commented), + review_decision_column("approved", "Approved", approved), + review_decision_column("changes-requested", "Changes requested", changes_requested), + review_decision_column("merged", "Merged", merged), + review_decision_column("closed", "Closed", closed), + ] +} + +fn review_after_request(request: &StoredPullReviewRequest, review: &PullReview) -> bool { + review.pull_id == request.pull_id + && review.reviewer_ref == request.reviewer_ref + && review.created_at.as_str() >= request.requested_at.as_str() +} + +fn completed_review_for_request( + request: &StoredPullReviewRequest, + reviews_by_pull_reviewer: &BTreeMap<(String, String), PullReview>, +) -> Option { + reviews_by_pull_reviewer + .get(&(request.pull_id.clone(), request.reviewer_ref.clone())) + .filter(|review| review_after_request(request, review)) + .cloned() +} + +fn review_request_lane(card: &PullReviewRequestCard) -> ReviewRequestLane { + match card.pull_request.state { + PrState::Merged => ReviewRequestLane::Merged, + PrState::Closed => ReviewRequestLane::Closed, + _ if card.requested_reviewer_refs.is_empty() => ReviewRequestLane::Unrequested, + _ if card.missing_reviewer_refs.is_empty() => ReviewRequestLane::Reviewed, + _ => ReviewRequestLane::NeedsReview, + } +} + +fn review_request_column( + key: &str, + label: &str, + cards: Vec, +) -> PullReviewRequestColumn { + PullReviewRequestColumn { + key: key.to_string(), + label: label.to_string(), + count: cards.len() as u32, + cards, + } +} + +fn review_request_columns(cards: Vec) -> Vec { + let mut needs_review = Vec::new(); + let mut reviewed = Vec::new(); + let mut unrequested = Vec::new(); + let mut merged = Vec::new(); + let mut closed = Vec::new(); + + for card in cards { + match review_request_lane(&card) { + ReviewRequestLane::NeedsReview => needs_review.push(card), + ReviewRequestLane::Reviewed => reviewed.push(card), + ReviewRequestLane::Unrequested => unrequested.push(card), + ReviewRequestLane::Merged => merged.push(card), + ReviewRequestLane::Closed => closed.push(card), + } + } + + vec![ + review_request_column("needs-review", "Needs review", needs_review), + review_request_column("reviewed", "Reviewed", reviewed), + review_request_column("unrequested", "Unrequested", unrequested), + review_request_column("merged", "Merged", merged), + review_request_column("closed", "Closed", closed), + ] +} + +fn reviewer_queue_lane(card: &PullReviewerQueueCard) -> ReviewerQueueLane { + match card.pull_request.state { + PrState::Merged => ReviewerQueueLane::Merged, + PrState::Closed => ReviewerQueueLane::Closed, + _ if card.review_request.completed_review.is_some() => ReviewerQueueLane::Reviewed, + _ => ReviewerQueueLane::NeedsReview, + } +} + +fn reviewer_queue_column( + key: &str, + label: &str, + cards: Vec, +) -> PullReviewerQueueColumn { + PullReviewerQueueColumn { + key: key.to_string(), + label: label.to_string(), + count: cards.len() as u32, + cards, + } +} + +fn reviewer_queue_columns(cards: Vec) -> Vec { + let mut needs_review = Vec::new(); + let mut reviewed = Vec::new(); + let mut merged = Vec::new(); + let mut closed = Vec::new(); + + for card in cards { + match reviewer_queue_lane(&card) { + ReviewerQueueLane::NeedsReview => needs_review.push(card), + ReviewerQueueLane::Reviewed => reviewed.push(card), + ReviewerQueueLane::Merged => merged.push(card), + ReviewerQueueLane::Closed => closed.push(card), + } + } + + vec![ + reviewer_queue_column("needs-review", "Needs review", needs_review), + reviewer_queue_column("reviewed", "Reviewed", reviewed), + reviewer_queue_column("merged", "Merged", merged), + reviewer_queue_column("closed", "Closed", closed), + ] +} + fn repository_scope(repository: &str) -> RepositoryScope { let Some(rest) = repository.strip_prefix("comtrya://") else { return RepositoryScope { @@ -229,6 +950,24 @@ fn decode(id: &str, bytes: &[u8]) -> Result { }) } +fn decode_review(id: &str, bytes: &[u8]) -> Result { + serde_json::from_slice(bytes).map_err(|error| { + err( + ErrorCode::Internal, + format!("parse pull review {id}: {error}"), + ) + }) +} + +fn decode_review_request(id: &str, bytes: &[u8]) -> Result { + serde_json::from_slice(bytes).map_err(|error| { + err( + ErrorCode::Internal, + format!("parse pull review request {id}: {error}"), + ) + }) +} + fn read_stored(id: &str) -> Result, Error> { let Some(snap) = storage::get(COLLECTION, id)? else { return Ok(None); @@ -236,6 +975,48 @@ fn read_stored(id: &str) -> Result, Error> { Ok(Some(decode(id, &snap.data)?)) } +fn scan_pull_reviews( + mut visit: impl FnMut(StoredPullReview) -> Result, +) -> Result<(), Error> { + let mut after = None; + loop { + let page = storage::list_all(REVIEW_COLLECTION, 1024, after.as_ref())?; + for bytes in page.docs { + let Ok(stored) = decode_review("", &bytes) else { + continue; + }; + if visit(stored)? { + return Ok(()); + } + } + match page.next_page { + Some(next) => after = Some(next), + None => return Ok(()), + } + } +} + +fn scan_pull_review_requests( + mut visit: impl FnMut(StoredPullReviewRequest) -> Result, +) -> Result<(), Error> { + let mut after = None; + loop { + let page = storage::list_all(REVIEW_REQUEST_COLLECTION, 1024, after.as_ref())?; + for bytes in page.docs { + let Ok(stored) = decode_review_request("", &bytes) else { + continue; + }; + if visit(stored)? { + return Ok(()); + } + } + match page.next_page { + Some(next) => after = Some(next), + None => return Ok(()), + } + } +} + fn scan_pull_requests( mut visit: impl FnMut(StoredPullRequest) -> Result, ) -> Result<(), Error> { @@ -428,13 +1209,61 @@ fn commit_update(id: &str, stored: &StoredPullRequest, version: &str) -> Result< storage::update_commit(COLLECTION, id, version, &bytes) } -fn emit(event_type: &str, payload: &impl Serialize, source_uri: &str) -> Result<(), Error> { - let bytes = serde_json::to_vec(payload) - .map_err(|error| err(ErrorCode::Internal, format!("serialise event: {error}")))?; - let _ = events::append(event_type, &bytes, Some(source_uri))?; - Ok(()) -} - +fn persist_review(review: &StoredPullReview) -> Result<(), Error> { + let bytes = serde_json::to_vec(review).map_err(|error| { + err( + ErrorCode::Internal, + format!("serialise pull review: {error}"), + ) + })?; + storage::create( + REVIEW_COLLECTION, + &review.id, + &bytes, + &storage::DocumentMetadata { + resource_uri: pull_review_uri(&review.id), + resource_refs: vec![ + pull_review_uri(&review.id), + review.pull_request_ref.clone(), + review.repository.clone(), + review.reviewer_ref.clone(), + ], + }, + ) +} + +fn persist_review_request(request: &StoredPullReviewRequest) -> Result<(), Error> { + let bytes = serde_json::to_vec(request).map_err(|error| { + err( + ErrorCode::Internal, + format!("serialise pull review request: {error}"), + ) + })?; + let request_ref = pull_review_request_uri(&request.id); + storage::create( + REVIEW_REQUEST_COLLECTION, + &request.id, + &bytes, + &storage::DocumentMetadata { + resource_uri: request_ref.clone(), + resource_refs: vec![ + request_ref, + request.pull_request_ref.clone(), + request.repository.clone(), + request.reviewer_ref.clone(), + request.requested_by_ref.clone(), + ], + }, + ) +} + +fn emit(event_type: &str, payload: &impl Serialize, source_uri: &str) -> Result<(), Error> { + let bytes = serde_json::to_vec(payload) + .map_err(|error| err(ErrorCode::Internal, format!("serialise event: {error}")))?; + let _ = events::append(event_type, &bytes, Some(source_uri))?; + Ok(()) +} + #[derive(Serialize)] #[serde(rename_all = "camelCase")] struct PullEventPayload<'a> { @@ -451,6 +1280,24 @@ struct PullEventPayload<'a> { closed_by_ref: Option<&'a str>, } +#[derive(Serialize)] +#[serde(rename_all = "camelCase")] +struct PullReviewEventPayload<'a> { + pull_request_ref: &'a str, + review_ref: &'a str, + reviewer_ref: &'a str, + decision: &'a str, +} + +#[derive(Serialize)] +#[serde(rename_all = "camelCase")] +struct PullReviewRequestedEventPayload<'a> { + pull_request_ref: &'a str, + review_request_ref: &'a str, + reviewer_ref: &'a str, + requested_by_ref: &'a str, +} + #[derive(Deserialize)] #[serde(rename_all = "camelCase")] struct PullMergedEventPayload { @@ -477,6 +1324,14 @@ fn pull_request_uri(id: &str) -> String { format!("comtrya://pull-request/{id}") } +fn pull_review_uri(id: &str) -> String { + format!("comtrya://pull-review/{id}") +} + +fn pull_review_request_uri(id: &str) -> String { + format!("comtrya://pull-review-request/{id}") +} + impl PullsGuest for Component { fn create_pull(input: CreatePullInput) -> Result { let repository = input.repository.trim(); @@ -626,12 +1481,192 @@ impl PullsGuest for Component { Ok(stored.to_wit()) } + fn change_state_pull(input: ChangeStatePullInput) -> Result { + let snap = storage::update_begin(COLLECTION, &input.id)?; + let mut stored = decode(&input.id, &snap.data)?; + let next = validate_state_transition(&stored.state, input.state)?; + if stored.state != next { + stored.state = next.to_string(); + stored.updated_at = time::now_iso(); + commit_update(&input.id, &stored, &snap.version)?; + } + Ok(stored.to_wit()) + } + + fn submit_review(input: SubmitReviewInput) -> Result { + validate_review_body(input.decision, &input.body_markdown)?; + let Some(pull) = read_stored(&input.pull_id)? else { + return Err(err( + ErrorCode::NotFound, + format!("pull request {} does not exist", input.pull_id), + )); + }; + if matches!(pull.state.as_str(), "MERGED" | "CLOSED") { + return Err(err( + ErrorCode::Conflict, + "cannot review a terminal pull request", + )); + } + let reviewer_ref = match input.reviewer_ref { + Some(reviewer_ref) => reviewer_ref, + None => identity::current_principal()?, + }; + let id = ids::mint("pull-review")?; + let pull_request_ref = pull_request_uri(&pull.id); + let decision = review_decision_to_str(input.decision).to_string(); + let review = StoredPullReview { + id: id.clone(), + pull_id: pull.id, + pull_request_ref, + repository: pull.repository, + reviewer_ref, + decision, + body_markdown: input.body_markdown, + created_at: time::now_iso(), + }; + persist_review(&review)?; + let review_ref = pull_review_uri(&review.id); + emit( + PULL_REVIEWED_EVENT, + &PullReviewEventPayload { + pull_request_ref: &review.pull_request_ref, + review_ref: &review_ref, + reviewer_ref: &review.reviewer_ref, + decision: &review.decision, + }, + &review.pull_request_ref, + )?; + Ok(review.to_wit()) + } + + fn list_pull_reviews(input: ListPullReviewsInput) -> Result, Error> { + if read_stored(&input.pull_id)?.is_none() { + return Err(err( + ErrorCode::NotFound, + format!("pull request {} does not exist", input.pull_id), + )); + } + let limit = input.limit.min(1024) as usize; + if limit == 0 { + return Ok(Vec::new()); + } + let mut reviews = Vec::new(); + scan_pull_reviews(|stored| { + if stored.pull_id == input.pull_id { + reviews.push(stored.to_wit()); + if reviews.len() >= limit { + return Ok(true); + } + } + Ok(false) + })?; + Ok(reviews) + } + + fn request_review(input: RequestReviewInput) -> Result { + validate_reviewer_ref(&input.reviewer_ref)?; + let Some(pull) = read_stored(&input.pull_id)? else { + return Err(err( + ErrorCode::NotFound, + format!("pull request {} does not exist", input.pull_id), + )); + }; + if matches!(pull.state.as_str(), "MERGED" | "CLOSED") { + return Err(err( + ErrorCode::Conflict, + "cannot request review for a terminal pull request", + )); + } + + let mut existing = None; + scan_pull_review_requests(|stored| { + if stored.pull_id == input.pull_id && stored.reviewer_ref == input.reviewer_ref { + existing = Some(stored); + return Ok(true); + } + Ok(false) + })?; + if let Some(existing) = existing { + return Ok(existing.to_wit(None)); + } + + let requested_by_ref = match input.requested_by_ref { + Some(requested_by_ref) => requested_by_ref, + None => identity::current_principal()?, + }; + let id = ids::mint("pull-review-request")?; + let request = StoredPullReviewRequest { + id: id.clone(), + pull_id: pull.id, + pull_request_ref: pull_request_uri(&input.pull_id), + repository: pull.repository, + reviewer_ref: input.reviewer_ref, + requested_by_ref, + requested_at: time::now_iso(), + }; + persist_review_request(&request)?; + let review_request_ref = pull_review_request_uri(&request.id); + emit( + PULL_REVIEW_REQUESTED_EVENT, + &PullReviewRequestedEventPayload { + pull_request_ref: &request.pull_request_ref, + review_request_ref: &review_request_ref, + reviewer_ref: &request.reviewer_ref, + requested_by_ref: &request.requested_by_ref, + }, + &request.pull_request_ref, + )?; + Ok(request.to_wit(None)) + } + + fn list_review_requests( + input: ListReviewRequestsInput, + ) -> Result, Error> { + if read_stored(&input.pull_id)?.is_none() { + return Err(err( + ErrorCode::NotFound, + format!("pull request {} does not exist", input.pull_id), + )); + } + let limit = input.limit.min(1024) as usize; + if limit == 0 { + return Ok(Vec::new()); + } + + let mut reviews_by_pull_reviewer = BTreeMap::<(String, String), PullReview>::new(); + scan_pull_reviews(|stored| { + let review = stored.to_wit(); + let key = (review.pull_id.clone(), review.reviewer_ref.clone()); + if is_newer_review(&review, reviews_by_pull_reviewer.get(&key)) { + reviews_by_pull_reviewer.insert(key, review); + } + Ok(false) + })?; + + let mut requests = Vec::new(); + scan_pull_review_requests(|stored| { + if stored.pull_id == input.pull_id { + let completed_review = + completed_review_for_request(&stored, &reviews_by_pull_reviewer); + requests.push(stored.to_wit(completed_review)); + if requests.len() >= limit { + return Ok(true); + } + } + Ok(false) + })?; + Ok(requests) + } + fn get_pull(id: String) -> Result, Error> { Ok(read_stored(&id)?.map(|stored| stored.to_wit())) } fn list_pulls(repository: String, limit: u32) -> Result, Error> { let limit = limit.min(1024) as usize; + if limit == 0 { + return Ok(Vec::new()); + } let mut out = Vec::new(); scan_pull_requests(|stored| { if repository_matches(&stored, &repository) { @@ -644,6 +1679,408 @@ impl PullsGuest for Component { })?; Ok(out) } + + fn review_board(input: PullReviewBoardInput) -> Result { + let limit = input.limit.min(1024) as usize; + let mut cards = Vec::new(); + if limit > 0 { + scan_pull_requests(|stored| { + if repository_matches(&stored, &input.repository) { + let pull_request = stored.to_wit(); + let terminal = matches!(pull_request.state, PrState::Merged | PrState::Closed); + cards.push(PullReviewCard { + pull_request, + terminal, + }); + if cards.len() >= limit { + return Ok(true); + } + } + Ok(false) + })?; + } + let total = cards.len() as u32; + Ok(PullReviewBoard { + repository: input.repository, + total, + columns: review_columns(cards), + }) + } + + fn author_board(input: PullAuthorBoardInput) -> Result { + let limit = input.limit.min(1024) as usize; + let mut cards = Vec::new(); + if limit > 0 { + scan_pull_requests(|stored| { + if repository_matches(&stored, &input.repository) { + let pull_request = stored.to_wit(); + let terminal = matches!(pull_request.state, PrState::Merged | PrState::Closed); + cards.push(PullAuthorCard { + pull_request, + terminal, + }); + if cards.len() >= limit { + return Ok(true); + } + } + Ok(false) + })?; + } + let total = cards.len() as u32; + Ok(PullAuthorBoard { + repository: input.repository, + total, + columns: author_columns(cards), + }) + } + + fn base_branch_board( + input: PullBaseBranchBoardInput, + ) -> Result { + let limit = input.limit.min(1024) as usize; + let mut cards = Vec::new(); + if limit > 0 { + scan_pull_requests(|stored| { + if repository_matches(&stored, &input.repository) { + let pull_request = stored.to_wit(); + let terminal = matches!(pull_request.state, PrState::Merged | PrState::Closed); + cards.push(PullBaseBranchCard { + pull_request, + terminal, + }); + if cards.len() >= limit { + return Ok(true); + } + } + Ok(false) + })?; + } + let total = cards.len() as u32; + Ok(PullBaseBranchBoard { + repository: input.repository, + total, + columns: base_branch_columns(cards), + }) + } + + fn head_branch_board( + input: PullHeadBranchBoardInput, + ) -> Result { + let limit = input.limit.min(1024) as usize; + let mut cards = Vec::new(); + if limit > 0 { + scan_pull_requests(|stored| { + if repository_matches(&stored, &input.repository) { + let pull_request = stored.to_wit(); + let terminal = matches!(pull_request.state, PrState::Merged | PrState::Closed); + cards.push(PullHeadBranchCard { + pull_request, + terminal, + }); + if cards.len() >= limit { + return Ok(true); + } + } + Ok(false) + })?; + } + let total = cards.len() as u32; + Ok(PullHeadBranchBoard { + repository: input.repository, + total, + columns: head_branch_columns(cards), + }) + } + + fn merge_readiness_board( + input: PullMergeReadinessBoardInput, + ) -> Result { + let limit = input.limit.min(1024) as usize; + let mut summaries_by_pull = input + .check_summaries + .into_iter() + .map(|summary| (summary.pull_id.clone(), summary)) + .collect::>(); + let mut reviews_by_pull = BTreeMap::::new(); + if limit > 0 { + scan_pull_reviews(|stored| { + let review = stored.to_wit(); + reviews_by_pull + .entry(review.pull_id.clone()) + .or_default() + .record(review); + Ok(false) + })?; + } + let mut cards = Vec::new(); + if limit > 0 { + scan_pull_requests(|stored| { + if repository_matches(&stored, &input.repository) { + let pull_request = stored.to_wit(); + let check_summary = summaries_by_pull.remove(&pull_request.id); + let review_summary = reviews_by_pull + .remove(&pull_request.id) + .unwrap_or_default() + .summary(input.required_approvals); + let flags = merge_readiness_flags( + &pull_request, + check_summary.as_ref(), + &review_summary, + ); + let blocked = flags.check_blocked || flags.review_blocked; + let waiting = flags.check_waiting || flags.review_waiting; + let terminal = matches!(pull_request.state, PrState::Merged | PrState::Closed); + cards.push(PullMergeReadinessCard { + pull_request, + terminal, + blocked, + waiting, + check_blocked: flags.check_blocked, + check_waiting: flags.check_waiting, + review_blocked: flags.review_blocked, + review_waiting: flags.review_waiting, + check_summary, + review_summary, + }); + if cards.len() >= limit { + return Ok(true); + } + } + Ok(false) + })?; + } + let total = cards.len() as u32; + Ok(PullMergeReadinessBoard { + repository: input.repository, + total, + columns: merge_readiness_columns(cards), + }) + } + + fn review_decision_board( + input: PullReviewDecisionBoardInput, + ) -> Result { + let mut reviews_by_pull = BTreeMap::::new(); + scan_pull_reviews(|stored| { + if stored.repository == input.repository { + let review = stored.to_wit(); + let stats = reviews_by_pull.entry(review.pull_id.clone()).or_default(); + match review.decision { + PullReviewDecision::Approve => { + stats.approval_count = stats.approval_count.saturating_add(1); + } + PullReviewDecision::RequestChanges => { + stats.change_request_count = stats.change_request_count.saturating_add(1); + } + PullReviewDecision::Comment => { + stats.comment_count = stats.comment_count.saturating_add(1); + } + } + if is_newer_review(&review, stats.latest_review.as_ref()) { + stats.latest_review = Some(review); + } + } + Ok(false) + })?; + + let limit = input.limit.min(1024) as usize; + let mut cards = Vec::new(); + if limit > 0 { + scan_pull_requests(|stored| { + if repository_matches(&stored, &input.repository) { + let pull_request = stored.to_wit(); + let stats = reviews_by_pull.remove(&pull_request.id).unwrap_or_default(); + let terminal = matches!(pull_request.state, PrState::Merged | PrState::Closed); + cards.push(PullReviewDecisionCard { + pull_request, + latest_review: stats.latest_review, + approval_count: stats.approval_count, + change_request_count: stats.change_request_count, + comment_count: stats.comment_count, + terminal, + }); + if cards.len() >= limit { + return Ok(true); + } + } + Ok(false) + })?; + } + let total = cards.len() as u32; + Ok(PullReviewDecisionBoard { + repository: input.repository, + total, + columns: review_decision_columns(cards), + }) + } + + fn review_request_board( + input: PullReviewRequestBoardInput, + ) -> Result { + let mut reviews_by_pull = BTreeMap::::new(); + let mut reviews_by_pull_reviewer = BTreeMap::<(String, String), PullReview>::new(); + scan_pull_reviews(|stored| { + if stored.repository == input.repository { + let review = stored.to_wit(); + let stats = reviews_by_pull.entry(review.pull_id.clone()).or_default(); + if is_newer_review(&review, stats.latest_review.as_ref()) { + stats.latest_review = Some(review.clone()); + } + let key = (review.pull_id.clone(), review.reviewer_ref.clone()); + if is_newer_review(&review, reviews_by_pull_reviewer.get(&key)) { + reviews_by_pull_reviewer.insert(key, review); + } + } + Ok(false) + })?; + + let mut requests_by_pull = BTreeMap::>::new(); + scan_pull_review_requests(|stored| { + if stored.repository == input.repository { + requests_by_pull + .entry(stored.pull_id.clone()) + .or_default() + .push(stored); + } + Ok(false) + })?; + + let limit = input.limit.min(1024) as usize; + let mut cards = Vec::new(); + if limit > 0 { + scan_pull_requests(|stored| { + if repository_matches(&stored, &input.repository) { + let pull_request = stored.to_wit(); + let mut requests = requests_by_pull + .remove(&pull_request.id) + .unwrap_or_default(); + requests.sort_by(|left, right| { + left.requested_at + .cmp(&right.requested_at) + .then_with(|| left.id.cmp(&right.id)) + }); + + let mut requested_reviewer_refs = Vec::new(); + let mut completed_reviewer_refs = Vec::new(); + let mut missing_reviewer_refs = Vec::new(); + for request in requests { + requested_reviewer_refs.push(request.reviewer_ref.clone()); + if completed_review_for_request(&request, &reviews_by_pull_reviewer) + .is_some() + { + completed_reviewer_refs.push(request.reviewer_ref); + } else { + missing_reviewer_refs.push(request.reviewer_ref); + } + } + + let latest_review = reviews_by_pull + .remove(&pull_request.id) + .and_then(|stats| stats.latest_review); + let terminal = matches!(pull_request.state, PrState::Merged | PrState::Closed); + cards.push(PullReviewRequestCard { + pull_request, + requested_reviewer_refs, + completed_reviewer_refs, + missing_reviewer_refs, + latest_review, + terminal, + }); + if cards.len() >= limit { + return Ok(true); + } + } + Ok(false) + })?; + } + + let total = cards.len() as u32; + Ok(PullReviewRequestBoard { + repository: input.repository, + total, + columns: review_request_columns(cards), + }) + } + + fn reviewer_queue(input: PullReviewerQueueInput) -> Result { + let reviewer_ref = match input.reviewer_ref { + Some(reviewer_ref) => { + validate_reviewer_ref(&reviewer_ref)?; + reviewer_ref + } + None => identity::current_principal()?, + }; + + let mut pulls_by_id = BTreeMap::::new(); + scan_pull_requests(|stored| { + if repository_matches(&stored, &input.repository) { + let pull_request = stored.to_wit(); + pulls_by_id.insert(pull_request.id.clone(), pull_request); + } + Ok(false) + })?; + + let mut reviews_by_pull = BTreeMap::::new(); + let mut reviews_by_pull_reviewer = BTreeMap::<(String, String), PullReview>::new(); + scan_pull_reviews(|stored| { + if stored.repository == input.repository { + let review = stored.to_wit(); + let stats = reviews_by_pull.entry(review.pull_id.clone()).or_default(); + if is_newer_review(&review, stats.latest_review.as_ref()) { + stats.latest_review = Some(review.clone()); + } + let key = (review.pull_id.clone(), review.reviewer_ref.clone()); + if is_newer_review(&review, reviews_by_pull_reviewer.get(&key)) { + reviews_by_pull_reviewer.insert(key, review); + } + } + Ok(false) + })?; + + let limit = input.limit.min(1024) as usize; + let mut requests = Vec::new(); + if limit > 0 { + scan_pull_review_requests(|stored| { + if stored.repository == input.repository && stored.reviewer_ref == reviewer_ref { + requests.push(stored); + } + Ok(false) + })?; + requests.sort_by(|left, right| { + right + .requested_at + .cmp(&left.requested_at) + .then_with(|| right.id.cmp(&left.id)) + }); + } + + let mut cards = Vec::new(); + for request in requests.into_iter().take(limit) { + let Some(pull_request) = pulls_by_id.get(&request.pull_id).cloned() else { + continue; + }; + let latest_review = reviews_by_pull + .get(&pull_request.id) + .and_then(|stats| stats.latest_review.clone()); + let completed_review = + completed_review_for_request(&request, &reviews_by_pull_reviewer); + let terminal = matches!(pull_request.state, PrState::Merged | PrState::Closed); + cards.push(PullReviewerQueueCard { + pull_request, + review_request: request.to_wit(completed_review), + latest_review, + terminal, + }); + } + + let total = cards.len() as u32; + Ok(PullReviewerQueue { + repository: input.repository, + reviewer_ref, + total, + columns: reviewer_queue_columns(cards), + }) + } } impl ReactorGuest for Component { @@ -717,7 +2154,18 @@ bindings::export!(Component with_types_in bindings); #[cfg(test)] mod tests { - use super::{PrState, state_from_str, state_to_str}; + use super::{ + author_columns, base_branch_columns, completed_review_for_request, merge_readiness_columns, + merge_readiness_flags, + review_columns, review_decision_columns, review_request_columns, reviewer_queue_columns, + state_from_str, state_to_str, validate_review_body, validate_reviewer_ref, + validate_state_transition, ActiveReviewStats, ErrorCode, PrState, PullMergeCheckSummary, + PullMergeReadinessCard, PullMergeReviewSummary, PullRequest, PullReview, PullReviewCard, + PullAuthorCard, PullBaseBranchCard, PullReviewDecision, PullReviewDecisionCard, + PullReviewRequestCard, PullReviewerQueueCard, StoredPullReviewRequest, + }; + + use std::collections::BTreeMap; /// #6 P0-6 regression: REVIEW round-trips losslessly through the /// component's state_to_str/state_from_str pair. Guards against @@ -747,4 +2195,808 @@ mod tests { assert_eq!(state_to_str(state_from_str(s)), s); } } + + fn pull_with_state(id: &str, state: PrState) -> PullRequest { + PullRequest { + id: id.to_string(), + repository: "comtrya://workspace/ws/repository/repo".to_string(), + workspace: Some("comtrya://workspace/ws".to_string()), + number: 1, + title: id.to_string(), + body_markdown: String::new(), + state, + author_ref: "comtrya://user/rawkode".to_string(), + head_ref: "feature/x".to_string(), + base_ref: "main".to_string(), + created_at: "2026-06-20T00:00:00Z".to_string(), + updated_at: "2026-06-20T00:00:00Z".to_string(), + merged_at: None, + merged_by_ref: None, + closed_at: None, + closed_by_ref: None, + } + } + + #[test] + fn review_columns_group_cards_by_pr_state() { + let columns = review_columns(vec![ + PullReviewCard { + pull_request: pull_with_state("draft", PrState::Draft), + terminal: false, + }, + PullReviewCard { + pull_request: pull_with_state("ready", PrState::Ready), + terminal: false, + }, + PullReviewCard { + pull_request: pull_with_state("review", PrState::Review), + terminal: false, + }, + PullReviewCard { + pull_request: pull_with_state("merged", PrState::Merged), + terminal: true, + }, + PullReviewCard { + pull_request: pull_with_state("closed", PrState::Closed), + terminal: true, + }, + ]); + + let keys: Vec<_> = columns.iter().map(|column| column.key.as_str()).collect(); + assert_eq!(keys, ["draft", "ready", "review", "merged", "closed"]); + assert_eq!(columns.iter().map(|column| column.count).sum::(), 5); + assert_eq!(columns[0].cards[0].pull_request.id, "draft"); + assert_eq!(columns[1].cards[0].pull_request.id, "ready"); + assert_eq!(columns[2].cards[0].pull_request.id, "review"); + assert_eq!(columns[3].cards[0].pull_request.id, "merged"); + assert!(columns[3].cards[0].terminal); + assert_eq!(columns[4].cards[0].pull_request.id, "closed"); + assert!(columns[4].cards[0].terminal); + } + + fn pull_authored_by(id: &str, state: PrState, author_ref: &str) -> PullRequest { + PullRequest { + author_ref: author_ref.to_string(), + ..pull_with_state(id, state) + } + } + + #[test] + fn author_columns_group_active_prs_by_author_and_terminal_state() { + let columns = author_columns(vec![ + PullAuthorCard { + pull_request: pull_authored_by("team-ready", PrState::Ready, "comtrya://team/platform"), + terminal: false, + }, + PullAuthorCard { + pull_request: pull_authored_by("rawkode-draft", PrState::Draft, "comtrya://user/rawkode"), + terminal: false, + }, + PullAuthorCard { + pull_request: pull_authored_by("rawkode-review", PrState::Review, "comtrya://user/rawkode"), + terminal: false, + }, + PullAuthorCard { + pull_request: pull_authored_by("merged", PrState::Merged, "comtrya://user/rawkode"), + terminal: true, + }, + PullAuthorCard { + pull_request: pull_authored_by("closed", PrState::Closed, "comtrya://team/platform"), + terminal: true, + }, + ]); + + let keys: Vec<_> = columns.iter().map(|column| column.key.as_str()).collect(); + assert_eq!( + keys, + [ + "author-team-platform", + "author-user-rawkode", + "merged", + "closed" + ] + ); + assert_eq!(columns.iter().map(|column| column.count).sum::(), 5); + assert_eq!(columns[0].label, "platform"); + assert_eq!( + columns[0].author_ref.as_deref(), + Some("comtrya://team/platform") + ); + assert_eq!(columns[0].cards[0].pull_request.id, "team-ready"); + assert_eq!(columns[1].label, "rawkode"); + assert_eq!(columns[1].cards.len(), 2); + assert_eq!(columns[2].cards[0].pull_request.id, "merged"); + assert!(columns[2].cards[0].terminal); + assert_eq!(columns[3].cards[0].pull_request.id, "closed"); + assert!(columns[3].cards[0].terminal); + } + + fn pull_targeting_base(id: &str, state: PrState, base_ref: &str) -> PullRequest { + PullRequest { + base_ref: base_ref.to_string(), + ..pull_with_state(id, state) + } + } + + #[test] + fn base_branch_columns_group_active_prs_by_base_ref_and_terminal_state() { + let columns = base_branch_columns(vec![ + PullBaseBranchCard { + pull_request: pull_targeting_base("main-ready", PrState::Ready, "main"), + terminal: false, + }, + PullBaseBranchCard { + pull_request: pull_targeting_base("release-draft", PrState::Draft, "release/2026.06"), + terminal: false, + }, + PullBaseBranchCard { + pull_request: pull_targeting_base("release-review", PrState::Review, "release/2026.06"), + terminal: false, + }, + PullBaseBranchCard { + pull_request: pull_targeting_base("merged", PrState::Merged, "main"), + terminal: true, + }, + PullBaseBranchCard { + pull_request: pull_targeting_base("closed", PrState::Closed, "release/2026.06"), + terminal: true, + }, + ]); + + let keys: Vec<_> = columns.iter().map(|column| column.key.as_str()).collect(); + assert_eq!(keys, ["base-main", "base-release-2026-06", "merged", "closed"]); + assert_eq!(columns.iter().map(|column| column.count).sum::(), 5); + assert_eq!(columns[0].base_ref.as_deref(), Some("main")); + assert_eq!(columns[0].cards[0].pull_request.id, "main-ready"); + assert_eq!(columns[1].label, "release/2026.06"); + assert_eq!(columns[1].cards.len(), 2); + assert_eq!(columns[2].cards[0].pull_request.id, "merged"); + assert!(columns[2].cards[0].terminal); + assert_eq!(columns[3].cards[0].pull_request.id, "closed"); + assert!(columns[3].cards[0].terminal); + } + + fn pull_from_head(id: &str, state: PrState, head_ref: &str) -> PullRequest { + PullRequest { + head_ref: head_ref.to_string(), + ..pull_with_state(id, state) + } + } + + #[test] + fn head_branch_columns_group_active_prs_by_head_ref_and_terminal_state() { + let columns = head_branch_columns(vec![ + PullHeadBranchCard { + pull_request: pull_from_head("feature-ready", PrState::Ready, "feature/search"), + terminal: false, + }, + PullHeadBranchCard { + pull_request: pull_from_head("stack-draft", PrState::Draft, "stack/forge-shell"), + terminal: false, + }, + PullHeadBranchCard { + pull_request: pull_from_head("stack-review", PrState::Review, "stack/forge-shell"), + terminal: false, + }, + PullHeadBranchCard { + pull_request: pull_from_head("merged", PrState::Merged, "feature/search"), + terminal: true, + }, + PullHeadBranchCard { + pull_request: pull_from_head("closed", PrState::Closed, "stack/forge-shell"), + terminal: true, + }, + ]); + + let keys: Vec<_> = columns.iter().map(|column| column.key.as_str()).collect(); + assert_eq!( + keys, + ["head-feature-search", "head-stack-forge-shell", "merged", "closed"] + ); + assert_eq!(columns.iter().map(|column| column.count).sum::(), 5); + assert_eq!(columns[0].head_ref.as_deref(), Some("feature/search")); + assert_eq!(columns[0].cards[0].pull_request.id, "feature-ready"); + assert_eq!(columns[1].label, "stack/forge-shell"); + assert_eq!(columns[1].cards.len(), 2); + assert_eq!(columns[2].cards[0].pull_request.id, "merged"); + assert!(columns[2].cards[0].terminal); + assert_eq!(columns[3].cards[0].pull_request.id, "closed"); + assert!(columns[3].cards[0].terminal); + } + + fn summary_for(pull_id: &str) -> PullMergeCheckSummary { + PullMergeCheckSummary { + pull_id: pull_id.to_string(), + required_missing: 0, + required_failing: 0, + pending: 0, + optional_failing: 0, + passing: 3, + total: 3, + } + } + + fn review_summary( + required_approvals: u32, + approval_count: u32, + change_request_count: u32, + ) -> PullMergeReviewSummary { + PullMergeReviewSummary { + required_approvals, + approval_count, + change_request_count, + comment_count: 0, + latest_review: None, + } + } + + fn readiness_card( + pull_request: PullRequest, + terminal: bool, + check_blocked: bool, + check_waiting: bool, + review_blocked: bool, + review_waiting: bool, + check_summary: Option, + review_summary: PullMergeReviewSummary, + ) -> PullMergeReadinessCard { + PullMergeReadinessCard { + pull_request, + terminal, + blocked: check_blocked || review_blocked, + waiting: check_waiting || review_waiting, + check_blocked, + check_waiting, + review_blocked, + review_waiting, + check_summary, + review_summary, + } + } + + #[test] + fn merge_readiness_columns_group_by_checks_and_terminal_state() { + let blocked_summary = PullMergeCheckSummary { + required_missing: 1, + ..summary_for("blocked") + }; + let waiting_summary = PullMergeCheckSummary { + pending: 1, + ..summary_for("waiting") + }; + let ready_summary = summary_for("ready"); + + let blocked_pull = pull_with_state("blocked", PrState::Review); + let waiting_pull = pull_with_state("waiting", PrState::Ready); + let ready_pull = pull_with_state("ready", PrState::Review); + let draft_pull = pull_with_state("draft", PrState::Draft); + let merged_pull = pull_with_state("merged", PrState::Merged); + let closed_pull = pull_with_state("closed", PrState::Closed); + let open_review_summary = review_summary(0, 0, 0); + + let flags = + merge_readiness_flags(&blocked_pull, Some(&blocked_summary), &open_review_summary); + assert!(flags.check_blocked); + assert!(!flags.check_waiting); + assert!(!flags.review_blocked); + assert!(!flags.review_waiting); + let flags = + merge_readiness_flags(&waiting_pull, Some(&waiting_summary), &open_review_summary); + assert!(!flags.check_blocked); + assert!(flags.check_waiting); + let flags = merge_readiness_flags(&ready_pull, Some(&ready_summary), &open_review_summary); + assert!(!flags.check_blocked); + assert!(!flags.check_waiting); + let flags = merge_readiness_flags(&ready_pull, None, &open_review_summary); + assert!(!flags.check_blocked); + assert!(flags.check_waiting); + + let needs_review = review_summary(1, 0, 0); + let flags = merge_readiness_flags(&ready_pull, Some(&ready_summary), &needs_review); + assert!(!flags.review_blocked); + assert!(flags.review_waiting); + + let changes_requested = review_summary(1, 1, 1); + let flags = merge_readiness_flags(&ready_pull, Some(&ready_summary), &changes_requested); + assert!(flags.review_blocked); + assert!(!flags.review_waiting); + + let columns = merge_readiness_columns(vec![ + readiness_card( + draft_pull, + false, + false, + false, + false, + false, + None, + review_summary(1, 0, 0), + ), + readiness_card( + pull_with_state("review-blocked", PrState::Review), + false, + false, + false, + true, + false, + Some(summary_for("review-blocked")), + review_summary(1, 1, 1), + ), + readiness_card( + blocked_pull, + false, + true, + false, + false, + false, + Some(blocked_summary), + review_summary(0, 0, 0), + ), + readiness_card( + pull_with_state("needs-review", PrState::Review), + false, + false, + false, + false, + true, + Some(summary_for("needs-review")), + review_summary(1, 0, 0), + ), + readiness_card( + waiting_pull, + false, + false, + true, + false, + false, + Some(waiting_summary), + review_summary(0, 0, 0), + ), + readiness_card( + ready_pull, + false, + false, + false, + false, + false, + Some(ready_summary), + review_summary(1, 1, 0), + ), + readiness_card( + merged_pull, + true, + false, + false, + false, + false, + None, + review_summary(1, 0, 0), + ), + readiness_card( + closed_pull, + true, + false, + false, + false, + false, + None, + review_summary(1, 0, 0), + ), + ]); + + let keys: Vec<_> = columns.iter().map(|column| column.key.as_str()).collect(); + assert_eq!( + keys, + [ + "draft", + "blocked-review", + "blocked-checks", + "needs-review", + "waiting-checks", + "ready", + "merged", + "closed" + ] + ); + assert_eq!(columns.iter().map(|column| column.count).sum::(), 8); + assert_eq!(columns[0].cards[0].pull_request.id, "draft"); + assert_eq!(columns[1].cards[0].pull_request.id, "review-blocked"); + assert_eq!(columns[2].cards[0].pull_request.id, "blocked"); + assert_eq!(columns[3].cards[0].pull_request.id, "needs-review"); + assert_eq!(columns[4].cards[0].pull_request.id, "waiting"); + assert_eq!(columns[5].cards[0].pull_request.id, "ready"); + assert_eq!(columns[6].cards[0].pull_request.id, "merged"); + assert!(columns[6].cards[0].terminal); + assert_eq!(columns[7].cards[0].pull_request.id, "closed"); + assert!(columns[7].cards[0].terminal); + } + + fn pull_review(id: &str, pull_id: &str, decision: PullReviewDecision) -> PullReview { + PullReview { + id: id.to_string(), + pull_id: pull_id.to_string(), + pull_request_ref: format!("comtrya://pull-request/{pull_id}"), + repository: "comtrya://workspace/ws/repository/repo".to_string(), + reviewer_ref: "comtrya://user/reviewer".to_string(), + decision, + body_markdown: "review body".to_string(), + created_at: format!("2026-06-20T00:00:0{}Z", id.len()), + } + } + + fn pull_review_by(id: &str, pull_id: &str, reviewer_ref: &str, created_at: &str) -> PullReview { + PullReview { + id: id.to_string(), + pull_id: pull_id.to_string(), + pull_request_ref: format!("comtrya://pull-request/{pull_id}"), + repository: "comtrya://workspace/ws/repository/repo".to_string(), + reviewer_ref: reviewer_ref.to_string(), + decision: PullReviewDecision::Approve, + body_markdown: "review body".to_string(), + created_at: created_at.to_string(), + } + } + + fn review_request(id: &str, pull_id: &str, reviewer_ref: &str) -> StoredPullReviewRequest { + StoredPullReviewRequest { + id: id.to_string(), + pull_id: pull_id.to_string(), + pull_request_ref: format!("comtrya://pull-request/{pull_id}"), + repository: "comtrya://workspace/ws/repository/repo".to_string(), + reviewer_ref: reviewer_ref.to_string(), + requested_by_ref: "comtrya://user/author".to_string(), + requested_at: "2026-06-20T00:00:02Z".to_string(), + } + } + + #[test] + fn completed_review_for_request_requires_same_reviewer_after_request() { + let request = review_request("request", "pull", "comtrya://user/reviewer"); + let mut reviews = BTreeMap::new(); + reviews.insert( + ("pull".to_string(), "comtrya://user/reviewer".to_string()), + pull_review_by( + "old", + "pull", + "comtrya://user/reviewer", + "2026-06-20T00:00:01Z", + ), + ); + assert!(completed_review_for_request(&request, &reviews).is_none()); + + reviews.insert( + ("pull".to_string(), "comtrya://user/other".to_string()), + pull_review_by( + "other", + "pull", + "comtrya://user/other", + "2026-06-20T00:00:03Z", + ), + ); + assert!(completed_review_for_request(&request, &reviews).is_none()); + + reviews.insert( + ("pull".to_string(), "comtrya://user/reviewer".to_string()), + pull_review_by( + "new", + "pull", + "comtrya://user/reviewer", + "2026-06-20T00:00:03Z", + ), + ); + assert_eq!( + completed_review_for_request(&request, &reviews) + .as_ref() + .map(|review| review.id.as_str()), + Some("new") + ); + } + + #[test] + fn review_request_columns_group_by_missing_reviewers_and_terminal_state() { + let columns = review_request_columns(vec![ + PullReviewRequestCard { + pull_request: pull_with_state("needs", PrState::Review), + requested_reviewer_refs: vec!["comtrya://user/reviewer".to_string()], + completed_reviewer_refs: Vec::new(), + missing_reviewer_refs: vec!["comtrya://user/reviewer".to_string()], + latest_review: None, + terminal: false, + }, + PullReviewRequestCard { + pull_request: pull_with_state("reviewed", PrState::Review), + requested_reviewer_refs: vec!["comtrya://user/reviewer".to_string()], + completed_reviewer_refs: vec!["comtrya://user/reviewer".to_string()], + missing_reviewer_refs: Vec::new(), + latest_review: Some(pull_review( + "reviewed", + "reviewed", + PullReviewDecision::Approve, + )), + terminal: false, + }, + PullReviewRequestCard { + pull_request: pull_with_state("unrequested", PrState::Ready), + requested_reviewer_refs: Vec::new(), + completed_reviewer_refs: Vec::new(), + missing_reviewer_refs: Vec::new(), + latest_review: None, + terminal: false, + }, + PullReviewRequestCard { + pull_request: pull_with_state("merged", PrState::Merged), + requested_reviewer_refs: Vec::new(), + completed_reviewer_refs: Vec::new(), + missing_reviewer_refs: Vec::new(), + latest_review: None, + terminal: true, + }, + PullReviewRequestCard { + pull_request: pull_with_state("closed", PrState::Closed), + requested_reviewer_refs: Vec::new(), + completed_reviewer_refs: Vec::new(), + missing_reviewer_refs: Vec::new(), + latest_review: None, + terminal: true, + }, + ]); + + let keys: Vec<_> = columns.iter().map(|column| column.key.as_str()).collect(); + assert_eq!( + keys, + [ + "needs-review", + "reviewed", + "unrequested", + "merged", + "closed" + ] + ); + assert_eq!(columns.iter().map(|column| column.count).sum::(), 5); + assert_eq!(columns[0].cards[0].pull_request.id, "needs"); + assert_eq!(columns[1].cards[0].pull_request.id, "reviewed"); + assert_eq!(columns[2].cards[0].pull_request.id, "unrequested"); + assert_eq!(columns[3].cards[0].pull_request.id, "merged"); + assert!(columns[3].cards[0].terminal); + assert_eq!(columns[4].cards[0].pull_request.id, "closed"); + assert!(columns[4].cards[0].terminal); + } + + #[test] + fn reviewer_queue_columns_group_by_completion_and_terminal_state() { + let pending_request = review_request("pending-request", "needs", "comtrya://user/reviewer"); + let reviewed_request = + review_request("reviewed-request", "reviewed", "comtrya://user/reviewer"); + let reviewed = pull_review_by( + "reviewed", + "reviewed", + "comtrya://user/reviewer", + "2026-06-20T00:00:03Z", + ); + let merged_request = review_request("merged-request", "merged", "comtrya://user/reviewer"); + let closed_request = review_request("closed-request", "closed", "comtrya://user/reviewer"); + + let columns = reviewer_queue_columns(vec![ + PullReviewerQueueCard { + pull_request: pull_with_state("needs", PrState::Review), + review_request: pending_request.to_wit(None), + latest_review: None, + terminal: false, + }, + PullReviewerQueueCard { + pull_request: pull_with_state("reviewed", PrState::Review), + review_request: reviewed_request.to_wit(Some(reviewed.clone())), + latest_review: Some(reviewed), + terminal: false, + }, + PullReviewerQueueCard { + pull_request: pull_with_state("merged", PrState::Merged), + review_request: merged_request.to_wit(None), + latest_review: None, + terminal: true, + }, + PullReviewerQueueCard { + pull_request: pull_with_state("closed", PrState::Closed), + review_request: closed_request.to_wit(None), + latest_review: None, + terminal: true, + }, + ]); + + let keys: Vec<_> = columns.iter().map(|column| column.key.as_str()).collect(); + assert_eq!(keys, ["needs-review", "reviewed", "merged", "closed"]); + assert_eq!(columns.iter().map(|column| column.count).sum::(), 4); + assert_eq!(columns[0].cards[0].pull_request.id, "needs"); + assert_eq!(columns[1].cards[0].pull_request.id, "reviewed"); + assert!(columns[1].cards[0] + .review_request + .completed_review + .is_some()); + assert_eq!(columns[2].cards[0].pull_request.id, "merged"); + assert!(columns[2].cards[0].terminal); + assert_eq!(columns[3].cards[0].pull_request.id, "closed"); + assert!(columns[3].cards[0].terminal); + } + + #[test] + fn active_review_stats_use_each_reviewers_latest_decision() { + let mut stats = ActiveReviewStats::default(); + stats.record(pull_review( + "a", + "reviewed", + PullReviewDecision::RequestChanges, + )); + stats.record(pull_review( + "later", + "reviewed", + PullReviewDecision::Approve, + )); + + let summary = stats.summary(1); + + assert_eq!(summary.approval_count, 1); + assert_eq!(summary.change_request_count, 0); + assert!(matches!( + summary.latest_review.as_ref().map(|review| review.decision), + Some(PullReviewDecision::Approve) + )); + } + + #[test] + fn review_decision_columns_group_by_latest_review_and_terminal_state() { + let awaiting = PullReviewDecisionCard { + pull_request: pull_with_state("awaiting", PrState::Review), + latest_review: None, + approval_count: 0, + change_request_count: 0, + comment_count: 0, + terminal: false, + }; + let commented = PullReviewDecisionCard { + pull_request: pull_with_state("commented", PrState::Review), + latest_review: Some(pull_review( + "comment", + "commented", + PullReviewDecision::Comment, + )), + approval_count: 0, + change_request_count: 0, + comment_count: 1, + terminal: false, + }; + let approved = PullReviewDecisionCard { + pull_request: pull_with_state("approved", PrState::Review), + latest_review: Some(pull_review( + "approve", + "approved", + PullReviewDecision::Approve, + )), + approval_count: 1, + change_request_count: 0, + comment_count: 0, + terminal: false, + }; + let changes_requested = PullReviewDecisionCard { + pull_request: pull_with_state("changes", PrState::Review), + latest_review: Some(pull_review( + "changes", + "changes", + PullReviewDecision::RequestChanges, + )), + approval_count: 0, + change_request_count: 1, + comment_count: 0, + terminal: false, + }; + let merged = PullReviewDecisionCard { + pull_request: pull_with_state("merged", PrState::Merged), + latest_review: None, + approval_count: 0, + change_request_count: 0, + comment_count: 0, + terminal: true, + }; + let closed = PullReviewDecisionCard { + pull_request: pull_with_state("closed", PrState::Closed), + latest_review: None, + approval_count: 0, + change_request_count: 0, + comment_count: 0, + terminal: true, + }; + + let columns = review_decision_columns(vec![ + awaiting, + commented, + approved, + changes_requested, + merged, + closed, + ]); + + let keys: Vec<_> = columns.iter().map(|column| column.key.as_str()).collect(); + assert_eq!( + keys, + [ + "awaiting-review", + "commented", + "approved", + "changes-requested", + "merged", + "closed" + ] + ); + assert_eq!(columns.iter().map(|column| column.count).sum::(), 6); + assert_eq!(columns[0].cards[0].pull_request.id, "awaiting"); + assert_eq!(columns[1].cards[0].pull_request.id, "commented"); + assert_eq!(columns[2].cards[0].pull_request.id, "approved"); + assert_eq!(columns[3].cards[0].pull_request.id, "changes"); + assert_eq!(columns[4].cards[0].pull_request.id, "merged"); + assert!(columns[4].cards[0].terminal); + assert_eq!(columns[5].cards[0].pull_request.id, "closed"); + assert!(columns[5].cards[0].terminal); + } + + #[test] + fn validate_review_body_requires_body_for_comments_and_change_requests() { + assert!(validate_review_body(PullReviewDecision::Approve, "").is_ok()); + let comment = validate_review_body(PullReviewDecision::Comment, "") + .expect_err("comment reviews need text"); + assert!(matches!(comment.code, ErrorCode::BadInput)); + let request_changes = validate_review_body(PullReviewDecision::RequestChanges, "") + .expect_err("request-changes reviews need text"); + assert!(matches!(request_changes.code, ErrorCode::BadInput)); + } + + #[test] + fn validate_reviewer_ref_requires_comtrya_uri() { + assert!(validate_reviewer_ref("comtrya://user/reviewer").is_ok()); + + let empty = validate_reviewer_ref("").expect_err("empty reviewer ref is invalid"); + assert!(matches!(empty.code, ErrorCode::BadInput)); + + let external = validate_reviewer_ref("https://example.com/user/reviewer") + .expect_err("external ref is invalid"); + assert!(matches!(external.code, ErrorCode::BadInput)); + } + + #[test] + fn state_transition_allows_review_flow_and_blocks_terminal_states() { + assert_eq!( + validate_state_transition("DRAFT", PrState::Ready).expect("draft to ready"), + "READY" + ); + assert_eq!( + validate_state_transition("READY", PrState::Review).expect("ready to review"), + "REVIEW" + ); + assert_eq!( + validate_state_transition("REVIEW", PrState::Ready).expect("review to ready"), + "READY" + ); + assert_eq!( + validate_state_transition("READY", PrState::Draft).expect("ready to draft"), + "DRAFT" + ); + assert_eq!( + validate_state_transition("REVIEW", PrState::Draft).expect("review to draft"), + "DRAFT" + ); + assert_eq!( + validate_state_transition("DRAFT", PrState::Review).expect("draft to review"), + "REVIEW" + ); + assert_eq!( + validate_state_transition("REVIEW", PrState::Review).expect("idempotent"), + "REVIEW" + ); + + let terminal = validate_state_transition("MERGED", PrState::Ready) + .expect_err("terminal states cannot reopen through change-state-pull"); + assert!(matches!(terminal.code, ErrorCode::Conflict)); + + let merge = validate_state_transition("REVIEW", PrState::Merged) + .expect_err("merge remains a dedicated operation"); + assert!(matches!(merge.code, ErrorCode::BadInput)); + } } diff --git a/extensions/first-party/ext_pull_requests/dist/ext_pull_requests.wasm b/extensions/first-party/ext_pull_requests/dist/ext_pull_requests.wasm index 1a81351d..65d92698 100644 Binary files a/extensions/first-party/ext_pull_requests/dist/ext_pull_requests.wasm and b/extensions/first-party/ext_pull_requests/dist/ext_pull_requests.wasm differ diff --git a/extensions/first-party/ext_pull_requests/manifest.json b/extensions/first-party/ext_pull_requests/manifest.json index fcf5ab77..1b1e3e08 100644 --- a/extensions/first-party/ext_pull_requests/manifest.json +++ b/extensions/first-party/ext_pull_requests/manifest.json @@ -24,6 +24,8 @@ ], "resourceKinds": [ { "name": "pull-request", "prefix": "pul", "scope": "repository" }, + { "name": "pull-review", "prefix": "prr", "scope": "repository" }, + { "name": "pull-review-request", "prefix": "prq", "scope": "repository" }, { "name": "pull-counter", "prefix": "puc", "scope": "repository" } ], "collections": [ @@ -35,6 +37,24 @@ { "name": "by_repository_number", "fields": ["repositoryId", "number"], "unique": true } ] }, + { + "name": "pull_request_reviews", + "ownerExtension": "ext_pull_requests", + "indexes": [ + { "name": "by_pull_created", "fields": ["pullId", "createdAt"], "unique": false }, + { "name": "by_repository_created", "fields": ["repository", "createdAt"], "unique": false }, + { "name": "by_reviewer_created", "fields": ["reviewerRef", "createdAt"], "unique": false } + ] + }, + { + "name": "pull_review_requests", + "ownerExtension": "ext_pull_requests", + "indexes": [ + { "name": "by_pull_reviewer", "fields": ["pullId", "reviewerRef"], "unique": true }, + { "name": "by_repository_requested", "fields": ["repository", "requestedAt"], "unique": false }, + { "name": "by_reviewer_requested", "fields": ["reviewerRef", "requestedAt"], "unique": false } + ] + }, { "name": "ext_pull_requests_meta", "ownerExtension": "ext_pull_requests", @@ -64,7 +84,9 @@ "allowedEmits": [ "dev.comtrya.pull-request.created", "dev.comtrya.pull-request.merged", - "dev.comtrya.pull-request.closed" + "dev.comtrya.pull-request.closed", + "dev.comtrya.pull-request.reviewed", + "dev.comtrya.pull-request.review-requested" ], "allowedEventReads": [], "requiresExtensionPoints": [ @@ -72,7 +94,15 @@ ], "dispatchRoutes": [ { "op": "pulls.create-pull", "scope": "repository", "derive": { "strategy": "payloadField", "field": "repository" } }, - { "op": "pulls.list-pulls", "scope": "repository", "derive": { "strategy": "payloadField", "field": "repository" } } + { "op": "pulls.list-pulls", "scope": "repository", "derive": { "strategy": "payloadField", "field": "repository" } }, + { "op": "pulls.review-board", "scope": "repository", "derive": { "strategy": "payloadField", "field": "repository" } }, + { "op": "pulls.merge-readiness-board", "scope": "repository", "derive": { "strategy": "payloadField", "field": "repository" } }, + { "op": "pulls.author-board", "scope": "repository", "derive": { "strategy": "payloadField", "field": "repository" } }, + { "op": "pulls.base-branch-board", "scope": "repository", "derive": { "strategy": "payloadField", "field": "repository" } }, + { "op": "pulls.head-branch-board", "scope": "repository", "derive": { "strategy": "payloadField", "field": "repository" } }, + { "op": "pulls.review-decision-board", "scope": "repository", "derive": { "strategy": "payloadField", "field": "repository" } }, + { "op": "pulls.review-request-board", "scope": "repository", "derive": { "strategy": "payloadField", "field": "repository" } }, + { "op": "pulls.reviewer-queue", "scope": "repository", "derive": { "strategy": "payloadField", "field": "repository" } } ], "reactor": { "scope": "repository", diff --git a/extensions/first-party/ext_pull_requests/ui/manifest.json b/extensions/first-party/ext_pull_requests/ui/manifest.json index 2ea5b121..6bddcfbe 100644 --- a/extensions/first-party/ext_pull_requests/ui/manifest.json +++ b/extensions/first-party/ext_pull_requests/ui/manifest.json @@ -5,8 +5,8 @@ "version": "0.1.0", "publisher": "comtrya-dev", "assets": { - "entry": "/_extensions/ext_pull_requests/assets/index.js", - "entryIntegrity": "sha256-f1682b73883cad5dcc5e4902061e68437e67eb0acd419f8b5c486c50462dce01", + "entry": "/ui-ext/6578745f70756c6c5f7265717565737473/files/index.js", + "entryIntegrity": "sha256-6cf2823de11b378c7686ca7605a53829910a4501e80a06a07e9a69ac621d9045", "styles": [] }, "permissions": [ diff --git a/extensions/first-party/ext_pull_requests/ui/src/PullsDetail.vue b/extensions/first-party/ext_pull_requests/ui/src/PullsDetail.vue index 0cc42804..b3867fd2 100644 --- a/extensions/first-party/ext_pull_requests/ui/src/PullsDetail.vue +++ b/extensions/first-party/ext_pull_requests/ui/src/PullsDetail.vue @@ -14,6 +14,7 @@ import DiffView from "./DiffView.vue"; import { parseUnifiedDiff } from "./diff"; import { classifyAuthor, + defaultWorkspaceId, pullsIndexHref, relativeTime, stateTone, @@ -24,9 +25,11 @@ import { const props = defineProps<{ routeParams?: ExtensionRouteParams; + repositoryPath?: string | null; }>(); const pullId = computed(() => props.routeParams?.params?.pullId ?? ""); +const pullsBackHref = computed(() => pullsIndexHref(props.repositoryPath)); const pull = ref(null); const loadState = ref("idle"); const error = ref(null); @@ -165,7 +168,7 @@ const canClose = computed( () => pull.value && pull.value.state !== "CLOSED" && pull.value.state !== "MERGED", ); // Hardcoded default workspace matches the rest of ext_pull_requests -// (PullsQueue, PullsOverview, PullsYourWork); swap to a real +// (PullsQueue, PullsOverview); swap to a real // resolver when the multi-workspace surface lands. const renderedBody = computed(() => pull.value?.bodyMarkdown @@ -267,13 +270,17 @@ useShortcuts({ Escape: (event) => { // Defer to overlays (palette / shortcuts overlay) when one is open. if (document.querySelector(".shortcuts-backdrop, .palette-backdrop")) return; - event.preventDefault(); - window.location.href = pullsIndexHref(); + navigateToPulls(event); }, }); watch(pullId, () => void load()); +function navigateToPulls(event: Event): void { + event.preventDefault(); + window.location.href = pullsBackHref.value; +} + async function load(): Promise { if (!pullId.value) { loadState.value = "error"; @@ -330,7 +337,7 @@ async function loadDiff(): Promise { diffState.value = "loading"; diffError.value = null; try { - const segments = repositorySegmentsFromLocation(); + const segments = repositorySegmentsFromContext(); if (segments.length === 0) { diffPatch.value = ""; diffPath.value = ""; @@ -360,13 +367,19 @@ async function loadDiff(): Promise { } } +function repositorySegmentsFromContext(): string[] { + const fromHost = props.repositoryPath?.split("/").filter(Boolean) ?? []; + if (fromHost.length > 0) return fromHost; + return repositorySegmentsFromLocation(); +} + function repositorySegmentsFromLocation(): string[] { if (typeof window === "undefined") return []; const path = window.location.pathname; if (!path.startsWith("/r/")) return []; const rest = path.slice("/r/".length); - const projectIdx = rest.indexOf("/p/"); - const repoPath = projectIdx >= 0 ? rest.slice(0, projectIdx) : rest; + const workbenchIdx = rest.search(/\/(?:pulls|issues|checks|epics|p)\//); + const repoPath = workbenchIdx >= 0 ? rest.slice(0, workbenchIdx) : rest; return repoPath.split("/").filter(Boolean).map(decodeURIComponent); } @@ -406,13 +419,18 @@ async function onClose(): Promise {

    No pull request found for {{ pullId }}. - ← back to queue + ← Pull requests