From 758dd87bd59a369e52960927548a05eaf211ecae Mon Sep 17 00:00:00 2001 From: Alexander Ivanov Date: Thu, 13 Aug 2026 15:40:33 +0300 Subject: [PATCH] Enforce English policy for new text --- README.md | 6 +- .../0001-shared-core-two-delivery-targets.md | 182 ++--- docs/english-policy.md | 28 + .../english-policy-enforcement/.openspec.yaml | 2 + .../english-policy-enforcement/README.md | 3 + .../english-policy-enforcement/design.md | 30 + .../english-policy-enforcement/proposal.md | 21 + .../specs/quality-gates/spec.md | 26 + .../english-policy-enforcement/tasks.md | 17 + package-lock.json | 6 +- package.json | 6 +- packages/core/README.md | 83 +-- packages/core/package.json | 2 +- packages/server/README.md | 55 +- packages/server/package.json | 2 +- packages/webui/README.md | 83 +-- packages/webui/package.json | 2 +- scripts/check-english.mjs | 114 ++++ scripts/check-english.test.mjs | 49 ++ scripts/english-policy-baseline.json | 637 ++++++++++++++++++ 20 files changed, 1093 insertions(+), 261 deletions(-) create mode 100644 docs/english-policy.md create mode 100644 openspec/changes/english-policy-enforcement/.openspec.yaml create mode 100644 openspec/changes/english-policy-enforcement/README.md create mode 100644 openspec/changes/english-policy-enforcement/design.md create mode 100644 openspec/changes/english-policy-enforcement/proposal.md create mode 100644 openspec/changes/english-policy-enforcement/specs/quality-gates/spec.md create mode 100644 openspec/changes/english-policy-enforcement/tasks.md create mode 100644 scripts/check-english.mjs create mode 100644 scripts/check-english.test.mjs create mode 100644 scripts/english-policy-baseline.json diff --git a/README.md b/README.md index 024e40da..c82d6049 100644 --- a/README.md +++ b/README.md @@ -105,10 +105,10 @@ release artifact. Current release versions are: | Package | Version | Release role | | --- | ---: | --- | -| `@openspec-ui/core` | 0.11.0 | Shared behavior and persistence contract | +| `@openspec-ui/core` | 0.11.1 | Shared behavior and persistence contract | | `openspec-ui-vscode` | 0.4.3 | VS Code delivery | -| `@openspec-ui/server` | 1.2.2 | Standalone server delivery | -| `@openspec-ui/webui` | 1.2.1 | Shared browser UI | +| `@openspec-ui/server` | 1.2.3 | Standalone server delivery | +| `@openspec-ui/webui` | 1.2.2 | Shared browser UI | ## Delivery Capability Matrix diff --git a/docs/adr/0001-shared-core-two-delivery-targets.md b/docs/adr/0001-shared-core-two-delivery-targets.md index 4d689e7f..3490c055 100644 --- a/docs/adr/0001-shared-core-two-delivery-targets.md +++ b/docs/adr/0001-shared-core-two-delivery-targets.md @@ -1,116 +1,66 @@ -# 0001: общий core/webui-монорепозиторий, два способа поставки - -Статус: Принято — 2026-08-03 - -## Контекст - -Инструмент должен существовать в двух формах: standalone (браузер + -локальный сервер) и расширение VS Code — по прямому требованию заказчика. -Обе формы решают одну и ту же задачу (визуализация Changes/Archive/Specs/ -Tasks, запуск CLI-агентов) над одними и теми же данными (`openspec/`, git, -CLI-агенты) — писать логику дважды означало бы гарантированное расхождение -поведения между формами со временем. - -Решение обсуждалось в два прохода: первый — с автором этого ADR (Claude, -архитектурный набросок), второй — независимая рецензия внешнего эксперта, -скорректировавшая часть решений (см. "Отклонённые альтернативы" ниже — -изначальная рекомендация по режиму запуска extension была пересмотрена по -итогам рецензии). - -## Решение - -**1. Монорепозиторий с явным разделением слоёв**: `packages/core` (вся -бизнес-логика — execution engine, openspec-парсер, git-обёртка, -security-модель, derived change-state machine), `packages/webui` (общие -React-компоненты, транспорт-агностичные), `packages/server` (тонкий REST/WS -слой над `core`, только для standalone), `packages/extension` (VS Code -расширение). `server` и `extension` не должны содержать бизнес-логику — -только адаптацию `core` к своему транспорту/host API. Единственный источник -правды по поведению (какая задача что делает, как считается статус change'а) -— `core`; при расхождении между тем, что видит standalone и что видит -extension, это баг в `core` или в тонком адаптере, никогда не "у каждого -своя логика". - -**2. Extension: прямой импорт `core` + message bridge — основной режим, -локальный сервер — опциональный.** Extension host уже Node-процесс — может -импортировать `core` напрямую, без HTTP. Webview получает данные через -`postMessage`/`acquireVsCodeApi`, а не через `fetch` к localhost. Локальный -REST/WS сервер (тот же пакет `server`, что использует standalone) остаётся -доступен как опциональный режим — для сценариев, где полностью совпадающий -UX между Webview и standalone важнее, чем отсутствие lifecycle-сложности -localhost-порта (см. "Отклонённые альтернативы"). - -**3. Унифицированный протокол команд/событий, определённый только в -`core`.** Команды: `plan`, `implement`, `review`, `status`, `cancel`. -События (поток, не единичный ответ): `started`, `stdout`, `stderr`, -`progress`, `completed`, `failed`, `cancelled`. И REST/WS-адаптер -(`server`), и message-bridge-адаптер (`extension`) — тонкие сериализаторы -этого протокола под свой транспорт, не отдельные реализации логики запуска -агента. - -**4. Security-модель для оркестрации CLI-агентов — обязательная часть -`core`, не опция:** -- Содержимое файлов репозитория (`proposal.md`/`design.md`/issue-описания - и т.п.) — ДАННЫЕ, передаваемые агенту как контекст, никогда не источник - исполняемых инструкций для самого UI/execution engine (защита от prompt - injection через change, пришедший из чужого PR/архива/шаринга). -- cwd каждого запуска агента жёстко ограничен воркспейсом пользователя, без - возможности выйти за его пределы. -- Allowlist разрешённых команд/аргументов на CLI-агента, не произвольная - командная строка. -- Аудит-лог каждого запуска: что запущено, с каким cwd, какой diff получен - на выходе. - -**5. Derived state machine для статуса change (draft/in-progress/ -implemented/archived) — вычисляется в ОДНОМ месте (`core`), не хранится -как явное поле.** Сам OpenSpec CLI такого поля не имеет (`.openspec.yaml` -содержит только `schema`/`created`) — статус эвристический, выводится из -факта расположения (`openspec/changes/` vs `openspec/changes/archive/`) и -состояния `tasks.md` (доля отмеченных `[x]`). Эвристика специфицируется -явно в `execution-core` (см. `openspec/changes/execution-core/design.md`), -не оставляется на усмотрение реализации в `server`/`extension`. - -**6. Максимум VS Code API вместо своего UI**, где нативный аналог есть: -diff-editor вместо своего diff-viewer, `TreeDataProvider` вместо своего -дерева, встроенный Git extension API вместо своего git UI, Tasks/Terminal -API вместо своей панели "Execution", `contributes.configuration` вместо -своего экрана настроек, Chat Participant API (`vscode.chat. -createChatParticipant`) как альтернативный/дополнительный интерфейс к -AI-панели — тот же механизм, на котором работает сам Copilot Chat. - -## Отклонённые альтернативы - -- **Extension всегда поднимает тот же локальный сервер, что standalone - (единственный транспорт для `webui` — REST/WS всегда)**: первоначальная - рекомендация, чтобы `webui` не знал о двух транспортах. Отклонено по - итогам рецензии — цена НЕ в поддержке двух тонких транспорт-адаптеров - (это несколько методов интерфейса), а в реальной lifecycle-сложности - localhost-порта в extension: динамический выбор порта, коллизии между - несколькими одновременно открытыми окнами VS Code, cleanup процесса при - закрытии окна. Эта сложность возникала бы в САМОМ ЧАСТОМ сценарии - использования (просто открыть VS Code), а не только в редком. Решение: - message bridge как основной путь, сервер — опциональный режим для - случаев, где полная идентичность UX важнее. -- **Одна реализация исполнения агента в каждом из `server`/`extension` - отдельно** (без единого протокола в `core`): отклонено сразу — гарантирует - расхождение поведения потоковой передачи/ошибок между Webview и - standalone, именно риск, который поднят в рецензии. -- **Хранить статус change явным полем в `.openspec.yaml`**: отклонено — - требовало бы форкать/патчить сам формат OpenSpec, а не работать поверх - него; эвристика в `core` даёт то же самое без модификации чужого - формата. - -## Последствия - -- `core` становится единственным местом, где чинится любой баг поведения — - это обязывает держать его строго свободным от зависимостей на HTTP/VS - Code API (см. "Критерии качества" в будущем `.github`/`CLAUDE.md` этого - репозитория, по аналогии с `docsai-api`'s hexagonal architecture в - соседнем проекте DocsAI). -- `webui` обязан абстрагировать транспорт (интерфейс `Transport` с двумя - реализациями — `FetchTransport`/`MessageBridgeTransport`), что чуть - увеличивает его сложность против "просто fetch везде", но устраняет - дублирование компонентов между standalone и Webview. -- Security-модель CLI-агентов — не post-hoc доработка, а часть первого - change'а (`execution-core`) — если это отложить, риск получить рабочий - прототип, который небезопасно показывать кому-либо кроме автора. +# 0001: Shared Core Monorepo with Two Delivery Targets + +Status: Accepted + +Date: 2026-08-03 + +## Context + +OpenSpec UI must ship as both a standalone browser application with a local +server and a VS Code extension. Both targets visualize the same OpenSpec and Git +data and execute the same workflows. Duplicating behavior would cause the two +deliveries to diverge over time. + +The delivery model was reviewed independently after the initial architecture +proposal. That review changed the extension transport recommendation while +preserving a shared behavioral core. + +## Decision + +1. **Use a layered monorepo.** `packages/core` owns all business behavior, + including execution, OpenSpec and Git integration, security, persistence, + and derived change state. `packages/webui` owns transport-neutral React + components. `packages/server` and `packages/extension` are thin host adapters. +2. **Use direct core imports and a message bridge as the extension default.** + The extension host already runs Node.js and does not need HTTP for normal + operation. An optional local server remains available when standalone UI + parity is more important than localhost lifecycle simplicity. +3. **Define the command and event protocol only in core.** Commands are `plan`, + `implement`, `review`, `status`, and `cancel`. Events are `started`, `stdout`, + `stderr`, `progress`, `completed`, `failed`, and `cancelled`. Host adapters + serialize this protocol; they do not reimplement execution. +4. **Keep the agent security model in core.** Repository file content is data, + never executable UI instructions. Every run is restricted to the workspace, + commands and arguments are allowlisted, and executions are audited. +5. **Derive change state in core.** Draft, in-progress, implemented, and archived + states are inferred from location and `tasks.md`; they are not stored in a + custom OpenSpec field. +6. **Prefer native VS Code UI.** The extension uses native diff, tree, Git, + terminal/task, configuration, and Chat APIs where they fit the workflow. + +## Rejected Alternatives + +### Always run the standalone server inside the extension + +Rejected because dynamic ports, window collisions, authentication, and process +cleanup would burden the most common extension workflow. The message bridge is +the default; the local server remains optional. + +### Implement agent execution independently in each host + +Rejected because streaming, cancellation, errors, and security behavior would +diverge. Both hosts must adapt the same core protocol. + +### Store change state in `.openspec.yaml` + +Rejected because it would extend an external format. A documented core heuristic +provides status without forking OpenSpec. + +## Consequences + +- Behavioral defects are fixed in core, which remains independent of HTTP and + VS Code APIs. +- Web UI components depend on a transport interface with fetch and message-bridge + implementations. +- Host UX may differ, but shared behavior and protocol contracts remain testable. +- Security is part of the initial execution architecture rather than a later add-on. diff --git a/docs/english-policy.md b/docs/english-policy.md new file mode 100644 index 00000000..94ba41f5 --- /dev/null +++ b/docs/english-policy.md @@ -0,0 +1,28 @@ +# English Policy Maintenance + +Repository-authored comments, descriptions, and Markdown must be English. +`npm run lint:english` enforces this policy over files returned by +`git ls-files`. + +## Legacy Baseline + +`scripts/english-policy-baseline.json` records reviewed legacy lines as a +combination of repository path and normalized-content SHA-256. It is migration +debt, not a general allowlist. Moving or editing a baseline line causes the +check to fail. + +Cleanup changes should be package-scoped: + +1. Translate or remove legacy text without changing runtime behavior. +2. Run package tests and typecheck. +3. Regenerate the baseline with + `node scripts/check-english.mjs --write-baseline`. +4. Review the baseline reduction and run `npm run lint:english`. + +New baseline entries are not accepted. The target is an empty baseline, reached +through independently reviewable package and historical-document cleanup changes. + +Intentional internationalization fixture lines may use the inline +`english-policy-allow` marker. The marker must be on the same line as the fixture. +Captured external data may be exempted only by an exact path in the scanner and +requires an OpenSpec-reviewed change. \ No newline at end of file diff --git a/openspec/changes/english-policy-enforcement/.openspec.yaml b/openspec/changes/english-policy-enforcement/.openspec.yaml new file mode 100644 index 00000000..0907676c --- /dev/null +++ b/openspec/changes/english-policy-enforcement/.openspec.yaml @@ -0,0 +1,2 @@ +schema: spec-driven +created: 2026-08-08 \ No newline at end of file diff --git a/openspec/changes/english-policy-enforcement/README.md b/openspec/changes/english-policy-enforcement/README.md new file mode 100644 index 00000000..ce44815f --- /dev/null +++ b/openspec/changes/english-policy-enforcement/README.md @@ -0,0 +1,3 @@ +# English Policy Enforcement + +This change translates legacy repository-authored text and prevents new policy regressions. \ No newline at end of file diff --git a/openspec/changes/english-policy-enforcement/design.md b/openspec/changes/english-policy-enforcement/design.md new file mode 100644 index 00000000..1dbee5ff --- /dev/null +++ b/openspec/changes/english-policy-enforcement/design.md @@ -0,0 +1,30 @@ +## Context + +Editor search exclusions and ignored generated directories make filesystem glob +scans unreliable for policy enforcement. The policy applies to committed source, +not build output or dependencies. + +## Decisions + +- Enumerate files with `git ls-files` so the scanner checks exactly committed content. +- Scan tracked Markdown, TypeScript, JavaScript, JSON, and YAML for Cyrillic code points. +- Ignore generated and third-party paths even if accidentally present locally. +- Allow a violation only when the same line contains `english-policy-allow`. +- Allow an existing legacy line only when its path and normalized content hash + match the reviewed baseline. Moving or editing it makes it a new violation. +- Exempt the captured `openspec-fixtures/show.json` file because it preserves real + CLI output and its repository prose is data, not authored documentation. +- Print file, line, and a bounded preview for every violation. +- Run the scanner from the root `lint` script before workspace ESLint. + +## Trade-offs + +- Cyrillic detection enforces the repository's current practical language boundary, + not natural-language identification for every writing system. +- Intentional Cyrillic fixtures require a visible per-line marker. +- The temporary baseline is explicit debt; package-scoped changes remove entries + as comments and fixtures are translated. + +## Architecture + +This enforces existing repository policy and does not change runtime architecture. \ No newline at end of file diff --git a/openspec/changes/english-policy-enforcement/proposal.md b/openspec/changes/english-policy-enforcement/proposal.md new file mode 100644 index 00000000..02942207 --- /dev/null +++ b/openspec/changes/english-policy-enforcement/proposal.md @@ -0,0 +1,21 @@ +## Why + +Repository policy requires English in comments, descriptions, and Markdown, +but legacy Russian text remains across architecture docs, package docs, source +comments, and tests. CI does not currently enforce the policy. + +## What Changes + +- Translate policy-critical architecture and package documentation to English. +- Record remaining legacy violations as exact path and line-content hashes. +- Reject new or modified unapproved text in the normal lint gate. +- Keep intentional internationalization fixtures behind explicit inline markers. +- Exempt only the captured real CLI JSON fixture whose source content is data. +- Reduce the baseline to zero through separate package-scoped cleanup changes. + +## Impact + +- New repository-authored text becomes English-only immediately. +- Existing source cleanup becomes measurable and can proceed without risky bulk rewrites. +- Root tooling gains a dependency-free policy check. +- Package versions receive documentation-only patch bumps where package docs change. \ No newline at end of file diff --git a/openspec/changes/english-policy-enforcement/specs/quality-gates/spec.md b/openspec/changes/english-policy-enforcement/specs/quality-gates/spec.md new file mode 100644 index 00000000..cb567098 --- /dev/null +++ b/openspec/changes/english-policy-enforcement/specs/quality-gates/spec.md @@ -0,0 +1,26 @@ +## ADDED Requirements + +### Requirement: New repository-authored text follows the English policy +The system SHALL fail the normal lint gate when a tracked authored file contains +new or modified unapproved Cyrillic text. + +#### Scenario: Tracked source contains Cyrillic text +- **WHEN** a tracked Markdown, source, JSON, or YAML file contains Cyrillic text +- **AND** its path and normalized content do not match the reviewed legacy baseline +- **THEN** the lint gate fails with file and line diagnostics + +#### Scenario: Reviewed legacy line remains unchanged +- **WHEN** a tracked line matches its reviewed baseline path and content hash +- **THEN** the scanner reports no new policy violation + +#### Scenario: Intentional internationalization fixture is marked +- **WHEN** a fixture line contains Cyrillic text and an explicit policy marker +- **THEN** the scanner accepts that line + +#### Scenario: Real CLI output fixture contains repository prose as data +- **WHEN** the scanner encounters the explicitly exempt captured CLI JSON fixture +- **THEN** it leaves the fixture byte-for-byte unchanged + +#### Scenario: Generated files exist locally +- **WHEN** ignored build, dependency, or editor-test output contains Cyrillic text +- **THEN** the tracked-file scanner does not inspect that output \ No newline at end of file diff --git a/openspec/changes/english-policy-enforcement/tasks.md b/openspec/changes/english-policy-enforcement/tasks.md new file mode 100644 index 00000000..3ab0d5d0 --- /dev/null +++ b/openspec/changes/english-policy-enforcement/tasks.md @@ -0,0 +1,17 @@ +## 1. Policy Scanner + +- [x] 1.1 Add a dependency-free tracked-file Cyrillic scanner with bounded diagnostics and a hashed legacy baseline. +- [x] 1.2 Add scanner tests for new violations, markers, exclusions, baseline matching, and tracked-file filtering. +- [x] 1.3 Run the scanner from the root lint/verify gate. + +## 2. Repository Cleanup + +- [x] 2.1 Translate ADR 0001 and package READMEs. +- [x] 2.2 Record remaining reviewed source, historical-note, and fixture debt in the hashed baseline. +- [x] 2.3 Document the package-scoped path to a zero baseline. + +## 3. Verification + +- [x] 3.1 Bump affected package patch versions and update release documentation. +- [x] 3.2 Run the English scanner, workspace verify/build, and strict OpenSpec validation. +- [x] 3.3 Confirm the scanner rejects an injected unmarked violation in a temporary tracked fixture. \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 671748f6..80b2c757 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10773,7 +10773,7 @@ }, "packages/core": { "name": "@openspec-ui/core", - "version": "0.11.0", + "version": "0.11.1", "dependencies": { "cross-spawn": "^7.0.6", "simple-git": "^3.27.0" @@ -11240,7 +11240,7 @@ }, "packages/server": { "name": "@openspec-ui/server", - "version": "1.2.2", + "version": "1.2.3", "dependencies": { "@openspec-ui/core": "*", "ws": "^8.21.0" @@ -11688,7 +11688,7 @@ }, "packages/webui": { "name": "@openspec-ui/webui", - "version": "1.2.1", + "version": "1.2.2", "dependencies": { "@openspec-ui/core": "*", "diff": "^9.0.0", diff --git a/package.json b/package.json index 7048d61d..4201fac8 100644 --- a/package.json +++ b/package.json @@ -19,8 +19,10 @@ "build": "npm run build --workspaces --if-present", "verify": "npm run typecheck && npm run lint && npm run test", "typecheck": "npm run typecheck --workspaces --if-present", - "lint": "npm run lint --workspaces --if-present", - "test": "npm run test --workspaces --if-present" + "lint": "npm run lint:english && npm run lint --workspaces --if-present", + "lint:english": "node scripts/check-english.mjs", + "test": "npm run test:english && npm run test --workspaces --if-present", + "test:english": "node --test scripts/check-english.test.mjs" }, "devDependencies": { "typescript": "^5.5.0", diff --git a/packages/core/README.md b/packages/core/README.md index 18ac6c6c..0f52e913 100644 --- a/packages/core/README.md +++ b/packages/core/README.md @@ -1,51 +1,36 @@ # @openspec-ui/core -Execution engine, протокол команд/событий, security-модель, openspec/git- -обёртки, derived change-state. Единственный источник правды по поведению — -не зависит от HTTP-фреймворков или `vscode` API (юнит-тестируется в -изоляции). - -Реализовано по `openspec/changes/execution-core/tasks.md` — см. корневой -`openspec/README.md` за порядком работы. Спецификация поведения — -`openspec/changes/execution-core/specs/execution-core/spec.md`. - -## Модули - -- `protocol.ts` — `Command`/`Event` discriminated unions: единственное - место, где определён протокол `plan`/`implement`/`review`/`status`/ - `cancel` и поток событий `started`/`stdout`/`stderr`/`progress`/ - `completed`/`failed`/`cancelled`. -- `agent-runner.ts` — `AgentRunner`/`AgentAdapter`: security-проверки - (allowlist, cwd-sandbox) и аудит-лог выполняются здесь, inline, до того, - как управление передаётся конкретному адаптеру. -- `security.ts` — `checkAllowlist`, `checkCwdSandbox`, `prepareAgentContext` - (граница "содержимое файла — данные, не инструкция"), `AuditLog`. -- `agents/` — адаптеры: `claude.ts`, `copilot.ts`, `codex.ts`, `gemini.ts` - (дочерний процесс через `agents/shared.ts`) и `local-llm.ts` (HTTP, - OpenAI-совместимый API — SGLang/vLLM). -- `change-state.ts` — `deriveChangeState` (чистая функция от расположения - директории change'а + содержимого `tasks.md`) и `readChangeState` - (обёртка с чтением файла). -- `openspec.ts` — обёртка над `openspec ... --json` (list/show/validate). -- `git.ts` — обёртка над `simple-git` (status/diff/commit/branch — только - то, что нужно UI). - -## Allowlist по умолчанию - -`security.ts` не содержит захардкоженного allowlist — конфигурация -(`AllowlistConfig`) передаётся вызывающей стороной (`server`/`extension`) -на уровне воркспейса. Агент, отсутствующий в конфиге, не разрешён ни для -одной команды (restrictive default, см. design.md). - -## Эвристика derived change-state - -- `archived` — директория change'а лежит под сегментом пути `archive` - (`openspec/changes/archive/...`), независимо от состояния `tasks.md`. -- `draft` — `tasks.md` отсутствует, не содержит пунктов чеклиста, или ни - один пункт не отмечен `[x]`. -- `in-progress` — отмечена часть пунктов. -- `implemented` — отмечены все пункты. - -Статус не хранится как явное поле — только вычисляется по требованию. Это -эвристика, не более точная, чем позволяет структура OpenSpec (см. риски в -`design.md`). +The host-neutral source of truth for OpenSpec UI behavior. This package owns the +command/event protocol, agent execution and security, OpenSpec and Git wrappers, +change state, checkpoints, scheduling, persistence, and recovery. It has no HTTP +framework or VS Code API dependency. + +Implementation governance lives in `openspec/README.md`; the original capability +is specified under `openspec/changes/execution-core/`. + +## Modules + +- `protocol.ts`: command and event discriminated unions. +- `agent-runner.ts`: runner and adapter boundaries with inline security and audit checks. +- `security.ts`: allowlist, workspace sandbox, context boundary, and audit log. +- `agents/`: Claude, Copilot, Codex, Gemini, and OpenAI-compatible local adapters. +- `change-state.ts`: derived draft, in-progress, implemented, and archived state. +- `openspec.ts`: validated wrappers for structured OpenSpec CLI commands. +- `git.ts`: the Git operations required by the workbench. +- `checkpoint.ts`: capture, finalize, serialize, and conflict-safe rollback. +- `process-scheduler.ts`: mutation scheduling and process lifecycle. +- `workbench-run-journal.ts`: versioned, atomic persistent run state. + +## Security Defaults + +Core does not hardcode an agent allowlist. Hosts provide `AllowlistConfig` for +the active workspace. An absent agent or command is denied by default. + +## Derived Change State + +- `archived`: the change directory is under an `archive` path segment. +- `draft`: `tasks.md` is absent, has no checklist items, or has no completed items. +- `in-progress`: some checklist items are complete. +- `implemented`: all checklist items are complete. + +State is computed on demand and is not written into the OpenSpec format. diff --git a/packages/core/package.json b/packages/core/package.json index de2e1805..263d643f 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,7 +1,7 @@ { "name": "@openspec-ui/core", "private": true, - "version": "0.11.0", + "version": "0.11.1", "type": "module", "main": "src/index.ts", "exports": { diff --git a/packages/server/README.md b/packages/server/README.md index e0fc4a96..8393cdff 100644 --- a/packages/server/README.md +++ b/packages/server/README.md @@ -1,50 +1,37 @@ # @openspec-ui/server -Тонкий REST/WS слой над `@openspec-ui/core` — не содержит бизнес-логики, -только сериализация протокола команд/событий под HTTP/WebSocket и отдача -браузерного шелла `@openspec-ui/webui`. Bind по умолчанию на `127.0.0.1`. +A thin authenticated REST/WebSocket adapter over `@openspec-ui/core`. It serves +the standalone `@openspec-ui/webui` shell and binds to `127.0.0.1` by default. +Business logic, execution security, recovery, and change state remain in core. -Используется standalone-инструментом (`openspec/changes/standalone-app/`) -и опционально VS Code extension'ом (`openspec/changes/vscode-extension/`, -режим локального сервера). +The standalone capability is governed under `openspec/changes/standalone-app/`. +The VS Code extension may also launch this server as an optional transport mode. -Реализовано по `openspec/changes/standalone-app/tasks.md`. Живой smoke-тест -и найденные баги — `openspec/changes/standalone-app/smoke-test-notes.md`. +## Transport -## Проводной протокол +- `POST /api/status`: synchronous `{ events: Event[] }` response for status. +- `POST /api/command-json`: direct structured OpenSpec commands. +- `GET /api/ws`: bidirectional command/event streaming. +- `POST /api/change-editor/*`: conflict-aware Change Editor operations. +- `POST /api/processes/*`: persistent process review, rollback, and cleanup. +- `GET /` and `GET /app.js`: built standalone browser shell. -- `POST /api/status` — REST, синхронный ответ `{ events: Event[] }` (команда - `status` обычно быстрая, WS ради неё избыточен). -- `GET /api/ws` (WebSocket) — команда отправляется и её события приходят по - одному и тому же соединению; используется для `plan`/`implement`/ - `review`/`cancel`. -- `GET /` и `GET /app.js` — браузерный шелл (`packages/webui/src/standalone-entry.tsx`, - собранный `scripts/build-client.mjs` в `dist/app.js`). - -Ни одна из этих ручек не содержит логики исполнения агента, allowlist/cwd- -проверок или вычисления статуса change'а — всё это делегируется -`@openspec-ui/core` (`buildDefaultAgentRunners`/`buildDefaultAllowlist` — -готовая сборка реестра `AgentRunner`, переиспользуемая и `server`, и -`extension`, не изобретаемая заново в каждом хосте). +Every API request requires the ephemeral startup token. REST clients send +`X-OpenSpec-UI-Token`; WebSocket clients use the +`openspec-ui-token.` subprotocol. -## Запуск +## Run ```bash -npm run build # собирает браузерный бандл в dist/app.js -npm run start -- # по умолчанию: cwd процесса, порт 4317 +npm run build +npm run start -- ``` -Optional (explicit opt-in): allow commands to use `cwd` outside startup -`workspaceRoot`. +The default port is `4317`. To intentionally permit API requests outside the +startup workspace, use the explicit opt-in flag: ```bash npm run start -- --allow-external-cwd ``` -Use this only when you intentionally work across multiple folders/repositories. - -Open the authenticated URL printed by the server. Its fragment contains an -ephemeral token, for example -`http://127.0.0.1:/#token=`. REST clients must send the -token in `X-OpenSpec-UI-Token`; WebSocket clients must send it through the -`openspec-ui-token.` subprotocol. +Open the tokenized URL printed by the server after startup. diff --git a/packages/server/package.json b/packages/server/package.json index cecc43f0..87d45867 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,7 +1,7 @@ { "name": "@openspec-ui/server", "private": true, - "version": "1.2.2", + "version": "1.2.3", "type": "module", "main": "src/index.ts", "dependencies": { diff --git a/packages/webui/README.md b/packages/webui/README.md index d1f1a556..e547ea99 100644 --- a/packages/webui/README.md +++ b/packages/webui/README.md @@ -1,53 +1,34 @@ # @openspec-ui/webui -Транспорт-агностичные React-компоненты (Changes/Archive/Specs/Tasks/AI- -панель) — переиспользуются и в standalone (браузер), и в VS Code extension -(Webview). Взаимодействие с `@openspec-ui/core` только через интерфейс -`Transport` (`FetchTransport`/`MessageBridgeTransport`) — см. -`openspec/changes/shared-ui/design.md`. - -Markdown-редактирование и diff делегируются хосту, где это возможно (не -реализуются здесь для VS Code-контекста) — см. тот же design.md, -"Decisions". - -Реализовано по `openspec/changes/shared-ui/tasks.md`. - -## Модули - -- `transport/` — `Transport` интерфейс, `FetchTransport`, `MessageBridgeTransport` - (VS Code `postMessage`). `transport/contract.test.ts` проверяет, что оба дают - одинаковый поток событий для одного сценария. - `FetchTransport`'s проводной протокол (v0.2.0+, согласован с - `openspec/changes/standalone-app/design.md`): `status` — REST - (`POST /api/status`, синхронный ответ со списком событий; команда быстрая, - WS ради нее избыточен), `plan`/`implement`/`review`/`cancel` — одно - WebSocket-соединение (`/api/ws`) на команду и её события. `FetchTransportOptions` - теперь принимает `webSocketCtor` вместо `eventSourceCtor` (breaking для кода - вне этого репозитория — на момент этого изменения таких потребителей не было). -- `components/ChangesList`, `ArchiveList`, `ChangeDiff`, `ChangeRelations` — - Changes/Archive. Статус берётся из уже вычисленного `ChangeSummary.state` - (`@openspec-ui/core`'s derived state), компоненты его не пересчитывают. -- `components/SpecsTree`, `RequirementView`, `SpecsSearch` — Specs. Рендер - read-only (`markdown.ts` — минимальный inline-рендер `**bold**`/`` `code` ``, - не полноценный markdown). Редактирование делегируется хосту. -- `components/TasksChecklist` — чек-лист + прогресс; запуск отдельной задачи - — через callback `onRunTask`, хост подключает его к активному `Transport`. -- `components/AgentPicker`, `AiPanel` — единственные компоненты, которым - `Transport` нужен напрямую (send/subscribe команд `plan`/`implement`/ - `review`/`cancel` и поток событий). Список агентов — `AGENT_REGISTRY` из - `@openspec-ui/core`, не собственный список. - -## Презентационная граница - -Компоненты Changes/Archive/Specs/Tasks — презентационные: принимают уже -полученные данные через props (кто и как их получает — REST в standalone, -прямой импорт `@openspec-ui/core` в extension — решает хост, не `webui`). -Единственное исключение — `AiPanel`, которому нужен `Transport` напрямую, -поскольку исполнение команды неотделимо от потока её событий. - -## Протокол: выбор агента - -`Command.agentId` (опциональное поле, добавлено в `@openspec-ui/core@0.3.0`) -— то, как `AiPanel` сообщает хосту, какой зарегистрированный `AgentAdapter` -должен выполнить команду. Без этого поля выбор агента в UI не имел бы -эффекта на фактическое исполнение. +Transport-neutral React components shared by the standalone browser application +and the VS Code Webview. Components communicate through `Transport`, implemented +by `FetchTransport` and `MessageBridgeTransport`; host-specific business behavior +remains outside this package. + +The shared UI capability is governed under `openspec/changes/shared-ui/`. + +## Modules + +- `transport/`: transport contract, fetch/WebSocket delivery, and VS Code message bridge. +- `components/ChangesList`, `ArchiveList`, `ChangeDiff`, and `ChangeRelations`: + change and archive presentation using core-derived state. +- `components/SpecsTree`, `RequirementView`, and `SpecsSearch`: read-only spec views. +- `components/TasksChecklist`: task progress and host-provided task execution callback. +- `components/AgentPicker` and `AiPanel`: command execution and event streaming. +- `ProcessesView`: persisted process details, rollback, and retention controls. + +## Presentation Boundary + +Changes, archive, specs, and tasks components receive prepared data through +props. The host decides whether data came from REST or a direct core import. +`AiPanel` directly requires `Transport` because command execution is inherently +an event stream. + +## Agent Selection + +`Command.agentId` tells the host which registered core adapter should execute a +command. The UI reads available agents from the shared core registry rather than +maintaining a separate list. + +Markdown editing and diff presentation are delegated to native host facilities +where available, especially in VS Code. diff --git a/packages/webui/package.json b/packages/webui/package.json index b8421be7..00e67c41 100644 --- a/packages/webui/package.json +++ b/packages/webui/package.json @@ -1,7 +1,7 @@ { "name": "@openspec-ui/webui", "private": true, - "version": "1.2.1", + "version": "1.2.2", "type": "module", "main": "src/index.ts", "dependencies": { diff --git a/scripts/check-english.mjs b/scripts/check-english.mjs new file mode 100644 index 00000000..ad6cc3cf --- /dev/null +++ b/scripts/check-english.mjs @@ -0,0 +1,114 @@ +import { spawnSync } from "node:child_process"; +import { createHash } from "node:crypto"; +import { readFile, writeFile } from "node:fs/promises"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; + +const CYRILLIC_PATTERN = /[\u0400-\u04ff]/u; +const ALLOW_MARKER = "english-policy-allow"; +const SCANNED_EXTENSIONS = new Set([".md", ".ts", ".tsx", ".js", ".mjs", ".cjs", ".json", ".yaml", ".yml"]); +const EXCLUDED_PREFIXES = ["node_modules/", "dist/", ".git/", ".vscode-test/", "playwright-report/", "test-results/"]; +const EXEMPT_PATHS = new Set(["packages/core/src/openspec-fixtures/show.json"]); +const BASELINE_PATH = "scripts/english-policy-baseline.json"; + +function normalizedLine(line) { + return line.trim().replace(/\s+/gu, " "); +} + +function baselineKey(filePath, line) { + const hash = createHash("sha256").update(normalizedLine(line)).digest("hex"); + return `${filePath}|${hash}`; +} + +export function scanText(filePath, source, baseline = new Set()) { + const violations = []; + for (const [index, line] of source.split(/\r?\n/u).entries()) { + if (!CYRILLIC_PATTERN.test(line) + || line.includes(ALLOW_MARKER) + || baseline.has(baselineKey(filePath, line))) continue; + const normalized = normalizedLine(line); + violations.push({ + filePath, + line: index + 1, + preview: normalized.length <= 160 ? normalized : `${normalized.slice(0, 157)}...`, + }); + } + return violations; +} + +function trackedFiles(root) { + const result = spawnSync("git", ["ls-files", "-z"], { + cwd: root, + encoding: "utf8", + windowsHide: true, + }); + if (result.status !== 0) { + throw new Error(`git ls-files failed: ${result.stderr.trim() || "unknown error"}`); + } + return result.stdout.split("\0").filter(Boolean); +} + +async function readBaseline(root) { + try { + const entries = JSON.parse(await readFile(path.join(root, BASELINE_PATH), "utf8")); + return new Set(entries); + } catch (error) { + if (error instanceof SyntaxError) throw new Error(`Invalid English policy baseline: ${BASELINE_PATH}`, { cause: error }); + if (error && typeof error === "object" && "code" in error && error.code === "ENOENT") return new Set(); + throw error; + } +} + +export async function scanTrackedFiles(root, baseline) { + const allowed = baseline ?? await readBaseline(root); + const violations = []; + for (const relativePath of trackedFiles(root)) { + const normalizedPath = relativePath.replaceAll("\\", "/"); + if (EXEMPT_PATHS.has(normalizedPath) + || EXCLUDED_PREFIXES.some((prefix) => normalizedPath.startsWith(prefix)) + || !SCANNED_EXTENSIONS.has(path.extname(normalizedPath).toLowerCase())) continue; + const source = await readFile(path.join(root, relativePath), "utf8"); + violations.push(...scanText(normalizedPath, source, allowed)); + } + return violations; +} + +async function writeBaseline(root) { + const entries = new Set(); + for (const relativePath of trackedFiles(root)) { + const normalizedPath = relativePath.replaceAll("\\", "/"); + if (EXEMPT_PATHS.has(normalizedPath) + || EXCLUDED_PREFIXES.some((prefix) => normalizedPath.startsWith(prefix)) + || !SCANNED_EXTENSIONS.has(path.extname(normalizedPath).toLowerCase())) continue; + const source = await readFile(path.join(root, relativePath), "utf8"); + for (const line of source.split(/\r?\n/u)) { + if (CYRILLIC_PATTERN.test(line) && !line.includes(ALLOW_MARKER)) { + entries.add(baselineKey(normalizedPath, line)); + } + } + } + await writeFile(path.join(root, BASELINE_PATH), `${JSON.stringify([...entries].sort(), null, 2)}\n`, "utf8"); + console.log(`Wrote ${entries.size} reviewed legacy entries to ${BASELINE_PATH}.`); +} + +async function main() { + const root = process.cwd(); + if (process.argv.includes("--write-baseline")) { + await writeBaseline(root); + return; + } + const violations = await scanTrackedFiles(root); + if (violations.length === 0) { + console.log("English policy check passed."); + return; + } + for (const violation of violations) { + console.error(`${violation.filePath}:${violation.line}: ${violation.preview}`); + } + console.error(`English policy check failed with ${violations.length} violation(s).`); + process.exitCode = 1; +} + +if (process.argv[1] && path.resolve(process.argv[1]) === fileURLToPath(import.meta.url)) { + await main(); +} \ No newline at end of file diff --git a/scripts/check-english.test.mjs b/scripts/check-english.test.mjs new file mode 100644 index 00000000..91612a5f --- /dev/null +++ b/scripts/check-english.test.mjs @@ -0,0 +1,49 @@ +import assert from "node:assert/strict"; +import { execFileSync } from "node:child_process"; +import { createHash } from "node:crypto"; +import { mkdtemp, mkdir, rm, writeFile } from "node:fs/promises"; +import os from "node:os"; +import path from "node:path"; +import test from "node:test"; +import { scanText, scanTrackedFiles } from "./check-english.mjs"; + +test("scanText reports Cyrillic with bounded line diagnostics", () => { + const source = `// ${"Нарушение"} ${"x".repeat(200)}`; // english-policy-allow: intentional scanner fixture + const [violation] = scanText("source.ts", source); + assert.equal(violation?.line, 1); + assert.ok((violation?.preview.length ?? 0) <= 160); +}); + +test("scanText accepts an explicitly marked fixture line", () => { + const source = "const sample = 'Пример'; // english-policy-allow"; // english-policy-allow: intentional scanner fixture + assert.deepEqual(scanText("fixture.ts", source), []); +}); + +test("scanText accepts an exact legacy hash but rejects edited legacy text", () => { + const source = "// Старый комментарий"; // english-policy-allow: intentional scanner fixture + const violation = scanText("legacy.ts", source)[0]; + assert.ok(violation); + const hash = createHash("sha256").update(source.trim()).digest("hex"); + const baseline = new Set([`legacy.ts|${hash}`]); + assert.deepEqual(scanText("legacy.ts", source, baseline), []); + assert.equal(scanText("legacy.ts", `${source} изменен`, baseline).length, 1); // english-policy-allow: intentional scanner fixture +}); + +test("scanTrackedFiles scans tracked authored files only", async () => { + const root = await mkdtemp(path.join(os.tmpdir(), "openspec-english-policy-")); + try { + execFileSync("git", ["init"], { cwd: root, stdio: "ignore" }); + await mkdir(path.join(root, "dist"), { recursive: true }); + await writeFile(path.join(root, "clean.md"), "# English\n", "utf8"); + await writeFile(path.join(root, "violation.ts"), "// Нарушение\n", "utf8"); // english-policy-allow: intentional scanner fixture + await writeFile(path.join(root, "untracked.md"), "# Нарушение\n", "utf8"); // english-policy-allow: intentional scanner fixture + await writeFile(path.join(root, "dist", "generated.ts"), "// Нарушение\n", "utf8"); // english-policy-allow: intentional scanner fixture + execFileSync("git", ["add", "clean.md", "violation.ts", "dist/generated.ts"], { cwd: root, stdio: "ignore" }); + + const violations = await scanTrackedFiles(root); + + assert.deepEqual(violations.map((violation) => violation.filePath), ["violation.ts"]); + } finally { + await rm(root, { recursive: true, force: true }); + } +}); \ No newline at end of file diff --git a/scripts/english-policy-baseline.json b/scripts/english-policy-baseline.json new file mode 100644 index 00000000..bcca6b33 --- /dev/null +++ b/scripts/english-policy-baseline.json @@ -0,0 +1,637 @@ +[ + "eslint.config.js|056646122e1e2ced5728aa3f2e81edb4ea8c3c061f27cee8eeaa1d6229443400", + "eslint.config.js|bee24f7b69b9fe174c3ad1b9e712447465b3645bf1028c3bc80d9d6477adca68", + "openspec/changes/standalone-app/smoke-test-notes.md|08e768a7c7828cc817186deb19c54d295c001db77e677049779ce6db1adc8cce", + "openspec/changes/standalone-app/smoke-test-notes.md|0934a977c4067fb846facc614e45e86a27abb2d32c1f47b9c222d42d004975a2", + "openspec/changes/standalone-app/smoke-test-notes.md|0ae448ac8f219fa02f8b5b7419ced6f37740fcde4e8d84e2427fa3d6903c76e9", + "openspec/changes/standalone-app/smoke-test-notes.md|0e5d69d2dfd771ec238a06e99ee576dbd2812770cd9c161ddf90137e29833e36", + "openspec/changes/standalone-app/smoke-test-notes.md|154e09830cd62f82ec0775116e93cc1a807bd5ee8fc51f15daa617bb48cc90af", + "openspec/changes/standalone-app/smoke-test-notes.md|192912373f0c3c4adbe42ef9aa882395290efd025405c9393031206b7cbce59f", + "openspec/changes/standalone-app/smoke-test-notes.md|1b0d6e4ac83ab49dc44b1b130a10e7520d0438b3aeadfddf0fd459cb00c1b4ab", + "openspec/changes/standalone-app/smoke-test-notes.md|1b1037b7b53456c874f76398adb4e3ca67886a4bffb8178e054ff91c0d803501", + "openspec/changes/standalone-app/smoke-test-notes.md|1b56a944afbbcff77d1951f94640ba628050d4b5c3129471f79a868e451134b0", + "openspec/changes/standalone-app/smoke-test-notes.md|1ba88011a6bf038709d1a910cd3f831e12846b4db76b161c924a438e6387d741", + "openspec/changes/standalone-app/smoke-test-notes.md|2216e87012f0d2bcf1cb3d03be07af56bf594d704d04ee7a63869a3f3a4be8fb", + "openspec/changes/standalone-app/smoke-test-notes.md|22299e8284a443dfefcdbd7909316668b24036a7944738ca68c184b4271bfa82", + "openspec/changes/standalone-app/smoke-test-notes.md|233f0c69b006e11a19587554c3f8347d92871133adfff7b343b24eb7b6b277b7", + "openspec/changes/standalone-app/smoke-test-notes.md|2885f86c346ab019d14c6d31ba659b72390844400bc9de80af42146fecb4ed86", + "openspec/changes/standalone-app/smoke-test-notes.md|28cef5dc2db740b51a39b5f8dcfc80bad0d349e47b0e5e768caa19c2a777ed5a", + "openspec/changes/standalone-app/smoke-test-notes.md|29ee96be20beb2583a1bc74b98e826b82b035ccf814910df78562fbd56e8f2eb", + "openspec/changes/standalone-app/smoke-test-notes.md|2a4ed30bb70b1901bfc5cdafa7990e421c315eb575753a3e5b51919a6add5923", + "openspec/changes/standalone-app/smoke-test-notes.md|2c75cbf9d555150e2e1264302d25b1108f3130fa3f16059b1d8deaaa4082acdc", + "openspec/changes/standalone-app/smoke-test-notes.md|2ebb6af5d1d755ad2c1b27cc66e9a769dc77521c76be8ce0396a92fc60bc4bac", + "openspec/changes/standalone-app/smoke-test-notes.md|35dfa3935d02a3ac1dacbf434d48c9175a4e3504be3af6af7a819a2300dcdd45", + "openspec/changes/standalone-app/smoke-test-notes.md|3869ab3faaedcb73be2be7a6740471aeeff5acaab869705926ee15893c5058c8", + "openspec/changes/standalone-app/smoke-test-notes.md|391e3e9e53cf12479bcceafa2126d3b879ba5cbbed8fa84a4060f764c26d7c37", + "openspec/changes/standalone-app/smoke-test-notes.md|3b96c91633a48e27ee87f70b1527536e49161ef857101ac70b36f3b218c3a884", + "openspec/changes/standalone-app/smoke-test-notes.md|448fce93a8f2a5ebc657145b6a7445970ddd7d9d4eda2c762cca482882872086", + "openspec/changes/standalone-app/smoke-test-notes.md|46fd0ee476c375bbb36f362ad6467f7c88a8e0ed21a2e1873a1f8e83f0e71dcf", + "openspec/changes/standalone-app/smoke-test-notes.md|477758ca0dc8c4054a726f58a121048fc457d2395d7ae039c1c772333f981bf4", + "openspec/changes/standalone-app/smoke-test-notes.md|514187e39c65d95ba6f0c77c0631a2a146ce86e26d3cd1c726c0b496ef028f11", + "openspec/changes/standalone-app/smoke-test-notes.md|564b567986036e9bcfcf961e1fbf6435551f8574d41faa2f9f39e9e021ab25f5", + "openspec/changes/standalone-app/smoke-test-notes.md|56654533c18011fdc894c881c127adfb04451f8c243d682a92968ecf698f647a", + "openspec/changes/standalone-app/smoke-test-notes.md|5a7b26c3fb4a61042b5bc5404dc35d74b6f1f756e329eed032fda13b16a5fb59", + "openspec/changes/standalone-app/smoke-test-notes.md|5d90d8c7f95307f312d6d008c7b4d9f56dafb087903a9b9ebd68d2fdb36c2760", + "openspec/changes/standalone-app/smoke-test-notes.md|69b582f4c8e51c4100025b7b045e592197a1ff6d5fc73a30696178ee5524014c", + "openspec/changes/standalone-app/smoke-test-notes.md|6ecdd9443d500ba500d94f0cfd2adbc2e10bb2e8ba300dbc2cab721c21d26b71", + "openspec/changes/standalone-app/smoke-test-notes.md|6ee6dab6b1d2588a3ba5fc4f42f7388f26a8634cebfd458da9e17591846ae0c8", + "openspec/changes/standalone-app/smoke-test-notes.md|720bc6f0e2ab19bca334e0dba575d1108eb8d84c7c6453a1626757b6e82ce782", + "openspec/changes/standalone-app/smoke-test-notes.md|78082cc3fbf08b7fc2bb22b7bfe7d6af811a7cf6619054d8b0d88efdc27c2569", + "openspec/changes/standalone-app/smoke-test-notes.md|7ace76415031021d9cd4e8df38d8fef6ac539a7453bd6e8694830bbb5fe0d86a", + "openspec/changes/standalone-app/smoke-test-notes.md|7c68c7d78729fa41c20c0fd13f6ab6ec7b052a2031c0f5da397e49f4e2053e9c", + "openspec/changes/standalone-app/smoke-test-notes.md|7d3b242a6f62ea0c76224c99ed2c2f7eeb2c5025ab3cf5466e7bf5d4b58c743f", + "openspec/changes/standalone-app/smoke-test-notes.md|7d5a56a0e5b5c7d710434543a63458bf0ea3dc4281f9825474b92eda29df7f22", + "openspec/changes/standalone-app/smoke-test-notes.md|7f309f6c81fec590d3636f40d578f2247f20c49d3649e3fb5ba54ef8ee516cfc", + "openspec/changes/standalone-app/smoke-test-notes.md|82bf311ca9a25d6023b8b94cdf9077b1ff21c7582e709159d5f35516bc68e034", + "openspec/changes/standalone-app/smoke-test-notes.md|859e36a31a8b7463f0c958cd13bab028704d75a5fd426110f03939ea6ec7ff12", + "openspec/changes/standalone-app/smoke-test-notes.md|876176c297c1dbdff9cc620f8238d554fa400290478294cf9ef3a7b80d9139dc", + "openspec/changes/standalone-app/smoke-test-notes.md|8af3090de22ed8bae46f66204e8dbb24313027dcd71c9dbf2e1b962fcf856459", + "openspec/changes/standalone-app/smoke-test-notes.md|907f141ec8dcfe40e183c49477ee0e46056c19dac13d465fa4888b5031540d4c", + "openspec/changes/standalone-app/smoke-test-notes.md|955469ccbe9c29a7e35db4fe8b28b894d1bd5e5eced60dd4682bb9b2ed723f92", + "openspec/changes/standalone-app/smoke-test-notes.md|9713495da2185bff5bdb0ed4172475effeca9fec9b87a1e8a90e11dd27d3e13e", + "openspec/changes/standalone-app/smoke-test-notes.md|9a3bc711d471caf6db25756ac445b6d927ce860f3c9dc3c04452d3f21973f628", + "openspec/changes/standalone-app/smoke-test-notes.md|9a69a3954bff0c808738218d33e4aeb784a4ee96ff7e677a15394865843b1a92", + "openspec/changes/standalone-app/smoke-test-notes.md|9c7ee68744f763584793589ad9084771c2f0f9c5299b97206ab10c9f67d8bd59", + "openspec/changes/standalone-app/smoke-test-notes.md|9cbd574cf3d840daa8428694a227a4c59f209d17a03c2fe360715b190d0225c4", + "openspec/changes/standalone-app/smoke-test-notes.md|9d466d2015b302d24349036927b4af4c97a4e187a5ccf6583c2591f85da0a6c1", + "openspec/changes/standalone-app/smoke-test-notes.md|9fc10c02dfe5e9e3cc5555735a25f58e63aecc6655ea28424df2580b4ae72b97", + "openspec/changes/standalone-app/smoke-test-notes.md|a8ac3d5631d10c96649b996beb0a9067b8bdb260d8c83a97fab8e6920482cd32", + "openspec/changes/standalone-app/smoke-test-notes.md|a8cbd60dd363d101c2e3d6d90fd077dead2e9064bc13e02ab1700ee2f6c80338", + "openspec/changes/standalone-app/smoke-test-notes.md|afe8780f6bf326dc7d825adbec0515e65a061a202baa9f86185e7657a66b40cc", + "openspec/changes/standalone-app/smoke-test-notes.md|bf468eed0cf53247ccef8fcf66e8970999c790a18951f5df92ce615a1943143d", + "openspec/changes/standalone-app/smoke-test-notes.md|c157a8cb42a69a4d9f58da1b9169f61cddaa5aac1e267797c635817b993514f4", + "openspec/changes/standalone-app/smoke-test-notes.md|c4711727841dfaf29df3ae484d80cef92a438c45bbf4e90ceedd9b083ba96261", + "openspec/changes/standalone-app/smoke-test-notes.md|c78db0aafa8f882139600c2a364bf9137c9c9cee60291ad12ebfd25d4538928f", + "openspec/changes/standalone-app/smoke-test-notes.md|cadde06a88049695c9c12a48a9bf2292385a57ba3a38899a27567621180d1d7a", + "openspec/changes/standalone-app/smoke-test-notes.md|cc40606d3d919dea8d4c167b88803f29a000c72ac86e6cc4fd7972e8bb0e764f", + "openspec/changes/standalone-app/smoke-test-notes.md|cf99a7f9a1c2cd2def29512942b06ff2f629c91c5d4c407997ec0d36efeabeca", + "openspec/changes/standalone-app/smoke-test-notes.md|d216dc4e91907ef0fd1022f647518d9c6cd9adb0981bb01df8c1b88639707534", + "openspec/changes/standalone-app/smoke-test-notes.md|d95a812f4aacd7c3cb73707e453e31297347dc2caaab134489e8934d908025a1", + "openspec/changes/standalone-app/smoke-test-notes.md|dddc48a7bc43338720adb04fea5f0eb8d50364da9fadc78e93a9299465f19121", + "openspec/changes/standalone-app/smoke-test-notes.md|de3e03b60f67b8ba1939d5eefd6c19f467b6ea02799dfca20f4b83e2f5276afe", + "openspec/changes/standalone-app/smoke-test-notes.md|e19c737d2c0339f92cd3ddf98836f46024e3c0e77dedac95c67893b2efb3d4ae", + "openspec/changes/standalone-app/smoke-test-notes.md|e5beb2926b56f7eb0f16cb1643c00cc6bc7d148700edc5b7f770630c3f9fdfd4", + "openspec/changes/standalone-app/smoke-test-notes.md|eac79e882b74c2dd362d6d4f80524b7c09c7d99ab9d9abc528a0bc1961a65e57", + "openspec/changes/standalone-app/smoke-test-notes.md|ee0ae9a85d87618f8a5e4f54e720b497cc694936ddc50b4c887285e24152fc62", + "openspec/changes/standalone-app/smoke-test-notes.md|f45297fe02cca2ca48d5dee162f798e73122b952892b07f3c43a737e409ef9b1", + "openspec/changes/standalone-app/smoke-test-notes.md|fb3a91350461d3d3b6c3aa23e295936129a33c8b20a296c35a734df1c0bb65ac", + "openspec/changes/standalone-app/smoke-test-notes.md|fc9ee3b856c6490779a72e4864f77513850bb145707c602b82ecafbca3fc2a41", + "openspec/changes/vscode-extension/TEST-NOTES.md|005a75e6715825bcded3863ced4b600d1290785b0b6a9fbf4eb72c6422a8583f", + "openspec/changes/vscode-extension/TEST-NOTES.md|03d94dfa37a7abca0e9a9fccaee7e96705b5f203d58d1d6b8ccd5fabaf1c9abb", + "openspec/changes/vscode-extension/TEST-NOTES.md|0ad4fce0a7e6237abe6dce8601a7deaeb42b410e377c89c11b783f6bd4c23fa5", + "openspec/changes/vscode-extension/TEST-NOTES.md|0e609112686c93e64a8f28e445fbc235f20ba3fe80307b6379b9eb837a20a26c", + "openspec/changes/vscode-extension/TEST-NOTES.md|1286e2d934d062f0d5d58f9ef9c3a8ab8b9cd5e4dfba25fa767535dd442262e3", + "openspec/changes/vscode-extension/TEST-NOTES.md|17cb0af3aa56f16a72bf2fa4699160c661d780489c6384dd5cf7632b83b0682d", + "openspec/changes/vscode-extension/TEST-NOTES.md|190ad68db826f6f7fca714bc1dcac82198ef54233516d7a60caaff2017d077fd", + "openspec/changes/vscode-extension/TEST-NOTES.md|1d131c8d209d28086e8acab26e41dfae4a59d584a3301049267e923ecaf1ac11", + "openspec/changes/vscode-extension/TEST-NOTES.md|28a1a3f58059d48996c3b2c56b3913d57c332a9972ee57f414d4e227b8397c6f", + "openspec/changes/vscode-extension/TEST-NOTES.md|2acb4b5afcddcb6552f0b253615181d9cf4389833363f7a11a71e12607063488", + "openspec/changes/vscode-extension/TEST-NOTES.md|2c7fd37feb7df25728ad1f5f518181ba486db30f8a9f2e6386268c563345d080", + "openspec/changes/vscode-extension/TEST-NOTES.md|2ed953c561da82c78ddee7d335cb837ff95fef94de8392265f0542d83eb033db", + "openspec/changes/vscode-extension/TEST-NOTES.md|3fb9311254a2198ced56870cfe45ff778477ed0fd9d9dd9989b8d47e4a461097", + "openspec/changes/vscode-extension/TEST-NOTES.md|4443487a29edeee4b6d95b8a7a68b5c03fd81045d72761f4ea20a6f83258779b", + "openspec/changes/vscode-extension/TEST-NOTES.md|460475093412b3fa4532a9277692ae4c8155921a4ca8d7582999fc0fd4f4660b", + "openspec/changes/vscode-extension/TEST-NOTES.md|4d519aeaae7a48813e9ee5a69267fac7c1667aeee3b12cde570a55e941ac6ae6", + "openspec/changes/vscode-extension/TEST-NOTES.md|5005b25a47244d2698d12b34c169c51bf19fda1bc5889a0f4c43afbf5d9ba3c1", + "openspec/changes/vscode-extension/TEST-NOTES.md|529335d5270849dbce88e573405d85cdd54d6df4cf941a32ef97e6229b1a2669", + "openspec/changes/vscode-extension/TEST-NOTES.md|52a30f7afef20b744ce7d67a25340a36142153fd3359f8a0adf9117c0e17cf00", + "openspec/changes/vscode-extension/TEST-NOTES.md|5330a20a7c04fb69b27fd17ae7f07f0461ef519078ab273984ed74fb07da1398", + "openspec/changes/vscode-extension/TEST-NOTES.md|57b22347627dc407ab64f9daa9e2d467629daacee7ab2ce198cddd1d703ff29d", + "openspec/changes/vscode-extension/TEST-NOTES.md|58e325524406a96559d78479939ba5fcd2a3a8b3c5fb37767a218687db7df5b6", + "openspec/changes/vscode-extension/TEST-NOTES.md|5a0bf8ddc4e2e20de281d3149d9fe5f68277d75ec6cf1cf7599d21d6b4fc5755", + "openspec/changes/vscode-extension/TEST-NOTES.md|5b650a6f5137d708df52ac26955648457d71c2cabcc3a14b07fb6b19a5c11568", + "openspec/changes/vscode-extension/TEST-NOTES.md|5d79e69c29f889db5a17c2364e39c8f447722c424c22a313d1221c9047fdbdde", + "openspec/changes/vscode-extension/TEST-NOTES.md|5f62d80531f665ece3771881f1f87c1bdcdc60909968cee8a580a1b62fe4b404", + "openspec/changes/vscode-extension/TEST-NOTES.md|62098cbdb8a04ffd65831dec9fbdd12d0f22db57f64e54d29bb4b832b9b9539c", + "openspec/changes/vscode-extension/TEST-NOTES.md|6d880b97970ca26c7dca874fddcf27cf1a57f7fd442afc79f723edeefdad52c7", + "openspec/changes/vscode-extension/TEST-NOTES.md|70f5fc2005804c4685c90ff9a1711f387d724bacd3f9d2efc16ecb09b0c06bac", + "openspec/changes/vscode-extension/TEST-NOTES.md|7325f7ea7c92704850b185ab2e03e0f6b156d433956ea4aa1426d29b749a2a65", + "openspec/changes/vscode-extension/TEST-NOTES.md|7dbeea6c6386e28eff0a261a09a0d49460263f3f9490f2d78dd47181383dfbf2", + "openspec/changes/vscode-extension/TEST-NOTES.md|825a88dfbcdb49ad7efcbb4a6eb2379d60365dca6b36ddeff40f9a597de0ce1c", + "openspec/changes/vscode-extension/TEST-NOTES.md|83d7b0c60f2508b2e424b8c8f7ba9c7e04c25bcc208fda8b283ab5a0ac5f94c8", + "openspec/changes/vscode-extension/TEST-NOTES.md|859e36a31a8b7463f0c958cd13bab028704d75a5fd426110f03939ea6ec7ff12", + "openspec/changes/vscode-extension/TEST-NOTES.md|86eb4dfaa6de41b1994e724e751ecb9ced5abbe33137330ba60234c147a5e143", + "openspec/changes/vscode-extension/TEST-NOTES.md|8e527c389590490db1a74588ef0cce515459c84672d4d3834f8f40a2c4674a12", + "openspec/changes/vscode-extension/TEST-NOTES.md|8ea3ec762fed6853dcc828d4210d1fa843e7b2ef8942cb6b338634477ad7755e", + "openspec/changes/vscode-extension/TEST-NOTES.md|9713495da2185bff5bdb0ed4172475effeca9fec9b87a1e8a90e11dd27d3e13e", + "openspec/changes/vscode-extension/TEST-NOTES.md|9732c77aeb82f5adfd5131c63beed1ae4a5566d1c9c4014165e8dce18048ceb8", + "openspec/changes/vscode-extension/TEST-NOTES.md|97466115ebd8a3b324e44cf0baab8c66d98d1b49e1e20360b526096698bb9fab", + "openspec/changes/vscode-extension/TEST-NOTES.md|988d872fd490c45fa733b18acd16ab0b5256f34443ff9cc942e1eee0e3db1d23", + "openspec/changes/vscode-extension/TEST-NOTES.md|9f562e346e052763fe3c3eb15b8e1c893fe2f4c44af7d8bcbebae905632f5334", + "openspec/changes/vscode-extension/TEST-NOTES.md|a7a8c0f5b46a91f710352bc7bd7354c79c8ef8917756864ed154a47fcbe5f161", + "openspec/changes/vscode-extension/TEST-NOTES.md|abadfbe23d5116c9c084015b8f86a7c57d86cf95d929f23bbe6a0e85a43e806b", + "openspec/changes/vscode-extension/TEST-NOTES.md|ae6f8ceabdab27fa45e4077864a98c1aa655a6ac543a087d7fc04e62472b665e", + "openspec/changes/vscode-extension/TEST-NOTES.md|b01d53c44281cfa0aa56f571b68e1b48b192c4fd18bf0799610cbbaca89edd8c", + "openspec/changes/vscode-extension/TEST-NOTES.md|b60494041e91db5f6b12c9ad5a059b7252e15337360b9117b620ce327b58662f", + "openspec/changes/vscode-extension/TEST-NOTES.md|b67243559d5e7d99ef90160a4caa71452a2aaeb34c8b030372616534644fbd23", + "openspec/changes/vscode-extension/TEST-NOTES.md|b6bdc8e0d2526e108e335205f920c65ffa3531545da4fe95d318cf58b433dfaa", + "openspec/changes/vscode-extension/TEST-NOTES.md|b81069aad8806d9626d094d5368e11f422ad8e8a5ccf547fa1bd6643bd941e52", + "openspec/changes/vscode-extension/TEST-NOTES.md|bbd11a80dfb0b498bc9e895a2b1bf93bd978fc35d24a4b10d6a647acd64e17e0", + "openspec/changes/vscode-extension/TEST-NOTES.md|c672bc4bfbb549f40942509cbcd06e1180edc74e5552f328e5a598e9ca7d2954", + "openspec/changes/vscode-extension/TEST-NOTES.md|dd335c5fe4f9052e2ee8e5e8851db74e4e98c37afea35e68bcac0f7143422215", + "openspec/changes/vscode-extension/TEST-NOTES.md|e2d6bc228bab038a289503ecaa5122579b52804905a41a49eab9b09230a0218b", + "openspec/changes/vscode-extension/TEST-NOTES.md|e5beb2926b56f7eb0f16cb1643c00cc6bc7d148700edc5b7f770630c3f9fdfd4", + "openspec/changes/vscode-extension/TEST-NOTES.md|e712d19cafac0dd93ca0dd695b386dcb90b76ccf17ba85e9fc0a9625521a3690", + "openspec/changes/vscode-extension/TEST-NOTES.md|e7736869fcd8f02c83b5c1f7a193ab3e2eb87551fc999d1afeec972413190efa", + "openspec/changes/vscode-extension/TEST-NOTES.md|ea4488b8314e399c19ebf0a73c4c1073a717c608cb6625bf467415b507642383", + "openspec/changes/vscode-extension/TEST-NOTES.md|f330e3c504c99c712553feb42f94e3d080f8a6e61602abf781cbc54f056a688a", + "openspec/changes/vscode-extension/TEST-NOTES.md|f71a043b245e930ff1ea0e2b9dcb635fbd75d83ea27a1d7ff14de74162af9c7e", + "openspec/changes/vscode-extension/TEST-NOTES.md|fb5a9225743cfdb83df3c3157ac10ad9f709646e010349b034d7d3c03172d6d1", + "openspec/changes/vscode-extension/TEST-NOTES.md|fe86849004149b133a0a7ae5311625e4c9b46e7c516dacbe39a01e25e54fc32f", + "packages/core/src/agent-runner.test.ts|132772c6c1987ef83f1f680cfc3d260817fc4b85a11a28cbc8f8f8e924884592", + "packages/core/src/agent-runner.test.ts|21d051efd73fae20e6836175221f1bc653c071a382af0d3752ed03e02e8accdd", + "packages/core/src/agent-runner.test.ts|61e37a53eaa4486223cf9588554835f2e51d4818d5f390cc9600d312308b27ba", + "packages/core/src/agent-runner.test.ts|68bb03085d36cedc0f1224cac9d2681378e6f94d3f55e458796995025d3259b6", + "packages/core/src/agent-runner.test.ts|72f9507c83899095a276d3735ac1d0270d87c7ba840a72e49916a759b85fb625", + "packages/core/src/agent-runner.test.ts|9249a07cfccacaffffc8164b953b2633c0d136f88fe13f5daf81a5ead9a7d25f", + "packages/core/src/agent-runner.test.ts|97a2f63c9d1b236864419820e8d09c45242eb942e0a24ceb0e6c4547f44a2358", + "packages/core/src/agent-runner.test.ts|ae5aaa4744f38675feae2abe90ac768b070dfcb82361383816a9066833c61d3d", + "packages/core/src/agent-runner.test.ts|d5048edaea9f6a5902b4f855ccb07ce2d1dcaa3c3d22c531189e1158dace394a", + "packages/core/src/agent-runner.test.ts|f8ed16f4676d14d592cad4daab34b29aaf3d92fcdd9eebdd3729d75fa7697902", + "packages/core/src/agent-runner.ts|0f56f3d70b2d7bfd6c6705bb05ac4df7b86e5a0aca8c8ca9420f028e59eb0399", + "packages/core/src/agent-runner.ts|32772c1732df5c38549dd0aa25ca2d783845739ce3656c546d9eb710f4b72788", + "packages/core/src/agent-runner.ts|3eba2472f852efd2f104e27ba3fb961d6ab6c23f1d8982fadf4cfe2685b9bc13", + "packages/core/src/agent-runner.ts|41300a222ebc1a986847e2c4660b6d826c7ec09543707d0f4942feb2af7ceab6", + "packages/core/src/agent-runner.ts|5ed0152bfc2c3da53c3e3ebdfbef30db9afff3cb64c9a95822e3707a534b2965", + "packages/core/src/agent-runner.ts|61a0ebe241685857a498a70fc50c3830425bb216ebee69804ecddee5ff24e7f1", + "packages/core/src/agent-runner.ts|655933948c1b3b6b71b41e012aeee331712a80e7ed493ba6cc0ddedd2c334130", + "packages/core/src/agent-runner.ts|6d37ab18828957d418e2e806be061accb680c2c55b5dea14acddcf649e01fa3b", + "packages/core/src/agent-runner.ts|8ccb6554a791200e66565fcd9922f4212ae9b1995ba3885fe595047a092c6d04", + "packages/core/src/agent-runner.ts|a3b5e4b79a1632529176978874198b1fc8d7b48bb3672d74fc49ca491a55f45b", + "packages/core/src/agent-runner.ts|b8b996ad68c47dce77bd8740cde948ad515e4bdc5027c9eb3a2f7ef0ef58f8b1", + "packages/core/src/agent-runner.ts|ba67a30b6f3e6dd08953548084607a99bf49bfcbfdaf0940f6fa49dde5d9e578", + "packages/core/src/agent-runner.ts|d2e6f92875e65ee497293c64028c3c89452e60b583223218413bb7325e6a066f", + "packages/core/src/agent-runner.ts|db09c2844e72f54e51b3bfaa26c77bfef4d6c724b028a10a377ad2e22540196d", + "packages/core/src/agent-runner.ts|ef8f099656491fef664bd701d20aaf2e660747d53f8ea3836bff9bd30a53f4b1", + "packages/core/src/agents/claude.ts|07e496e0a4d10c1aa1eeaac998e44729a3eaa1064b39b8132644333daa947194", + "packages/core/src/agents/claude.ts|34857b8b7271a5a6696d6997f6950602e7a36f7fe5c95af5722fdc3002d2c6a8", + "packages/core/src/agents/claude.ts|3b86a53e68644b8cbfedcd538a82d942887a0c1a5d4b7bf0b1d51869b7e581af", + "packages/core/src/agents/claude.ts|3bd1c32a72cbdd595adecf801be8e9eaf82caf52ffd65665a9810ce12e1371de", + "packages/core/src/agents/claude.ts|d4a5c9b4605514ab964bf42d019e9302a7e3a129954539215d0d9ce4ab5e7b66", + "packages/core/src/agents/codex.ts|848238309ecb5364a466872920eaf7293005bac952e5b3912c0bbadd4d796512", + "packages/core/src/agents/codex.ts|c177c08a7edb475ac9758c1e0a644b8e5960cf67c2b63a6c3eb3eaec47b3c349", + "packages/core/src/agents/codex.ts|d42bf69f49216b01eb9d7748cd76e22b90465c6405c92ad44e8d7c703b6fc88a", + "packages/core/src/agents/copilot.ts|0d7e311b048e9cfb99e7d12bd1fb24ed8b5aa9187949d67a9314ffa9dac48bc3", + "packages/core/src/agents/copilot.ts|173691c26a7050d100ad37d34154e08e93a209671e0cdf5029fdac3915233625", + "packages/core/src/agents/copilot.ts|2071c5e65b31bd2782c05b82f585d91f45d4906fdbe22bf691209a9d06fe3000", + "packages/core/src/agents/copilot.ts|4313cbf7982fa2e8fee8f9d2431a0ee6d4e7ccae5bc1b38f6a9c2d6706690ffa", + "packages/core/src/agents/copilot.ts|6ed55c22dc8e0b989ffbacea7f24e1bbf4463925702c37699d108fefa87e481f", + "packages/core/src/agents/copilot.ts|7b507e24f91e15c1274c135c0429a0ab55d39138af82ce69fea1623e797885b1", + "packages/core/src/agents/copilot.ts|9ae4fff5b2cbc176ee2b689acb0f63cf764f8957b6ef0f63e71116a702fe4fb7", + "packages/core/src/agents/copilot.ts|b543d631cdb5eb9d658c69b108704853c9665d82375c66f070d422e1d10bb6c9", + "packages/core/src/agents/copilot.ts|ba67eb379639b40a9dace7cd0c318f5f061b02e9e472f6f755bfaf280579df0d", + "packages/core/src/agents/copilot.ts|c1db8afaead380f3cb0cb21c4dde385a2ce37c7a1502f43b3e76d8edc4cffc79", + "packages/core/src/agents/copilot.ts|e530df7512488cfff6b08b2d19e54ac99a2a4150ea2159c7e26b33919693c8c5", + "packages/core/src/agents/copilot.ts|f6d7859ac0afeb243e5451c40062be9304bb986dca747c1966a3d29c5494fc37", + "packages/core/src/agents/copilot.ts|fbae0e12b314208ed5593cfc273f364e7e689ef8aaf539a943e8053cdbafc4a2", + "packages/core/src/agents/gemini.ts|109180f450b4fe79e0a38b810a6d6069958086f63f88d1a60bfb1f67aa6a918d", + "packages/core/src/agents/gemini.ts|941d35ba2c722b7bb2dfc381adb56c7b3829a5610c09d2351d4ab40f351dccd5", + "packages/core/src/agents/gemini.ts|c3ef173572da777d5fc305dd301be61b83e64615eb69d00ad507644aedc9f38a", + "packages/core/src/agents/local-llm.ts|1ae3cd2021797a0639d1067ab3d4544c43fdf19349bff3ddf5774fd1671520f4", + "packages/core/src/agents/local-llm.ts|3355efe6175d6b493d9848321c20bde1d17c2c5fedda1e91d27c5efcd0199c38", + "packages/core/src/agents/local-llm.ts|5ef3afcf85d6860e6ff7f3f5a7b5d2e80c959a1c945eb156000ef86c8a535a35", + "packages/core/src/agents/local-llm.ts|8384d21140e9bf742980f14d3e768ff06172ed2c27494210a88d54f3c086aabc", + "packages/core/src/agents/local-llm.ts|ad98102a5cabb555cdd6889065a5f92e9282172178ef6506e81024aba0e49488", + "packages/core/src/agents/local-llm.ts|adbc48ad2f994c1431d0713c89d37fdc6e0606cb8f9303ef1cb122e1c2552503", + "packages/core/src/agents/local-llm.ts|c22cc1ad53834ef2472579b4be5cfc0408c098b1e850fff2352e91ba12522511", + "packages/core/src/agents/local-llm.ts|c8ba7aaac0082ea60f6a6976e4c7d0344f3517d1a0722e3ffec97c16636e2218", + "packages/core/src/agents/registry.ts|147eb57a9b3c18161e0a1adeb3b3f9d8dd4490659a651e84198fff13a22a1d86", + "packages/core/src/agents/registry.ts|243c613bbf17081c4067e36063c8eaee3e280dbad412dd38968c32113fde700e", + "packages/core/src/agents/registry.ts|348dd33fc1eb61403bccea3a34c3633139deed4537ed6e7787129eb23ee13689", + "packages/core/src/agents/registry.ts|ce39600d6ee247f97cbf524274088eb8cc158c2e9d0763c787aafb09e2d13fa5", + "packages/core/src/agents/registry.ts|f21b9647d7c8d0627c4ddc54776767791d772e3dee384299d112699bb1f0bb41", + "packages/core/src/agents/shared.test.ts|1c8f3a315e957cb68c255a3810f4289dc84da20a5cf6a5b17ca5d18f79ccc661", + "packages/core/src/agents/shared.ts|023ff013fa3130b0086e0c37d2b52dd75a1048066cb5774e5983d5b65fabfc77", + "packages/core/src/agents/shared.ts|05aade8d679c194c7fa5a32671b684d1eadf17b2e20d1c5314a87e270a4fd728", + "packages/core/src/agents/shared.ts|17647817c4538b9b0bb19f66e6525aeb76de4e38a5d609d21acdca807a0c2acb", + "packages/core/src/agents/shared.ts|18eaf25f2acc40cc5bbf8b7074b45884a5a42bd9295db93b4a765ec9f1045e59", + "packages/core/src/agents/shared.ts|1cb821f8c8f8e3cfddebda5ae05b170e0e37a93c7ccb5e194b128c7e8ea8ddef", + "packages/core/src/agents/shared.ts|2a186c74642de3dfa1261c1b43ee96669db1f9d654f7414e1271c8aa8c899c3c", + "packages/core/src/agents/shared.ts|2aa3387c700205d3eaec8d0fbad0a5dbc31ae3a4ad58b037a2a89ddcffc76d00", + "packages/core/src/agents/shared.ts|2bca093f90a410da8b09d6bd5915fa916621011446e974e940add706552beb08", + "packages/core/src/agents/shared.ts|37ad37db23cc9f884355813f545d133fa31bdb1e136e3660af273ddc0844efe6", + "packages/core/src/agents/shared.ts|3b702a44c29ecc69eec1a26a7470fea891c55be16a68942bc1464523e2c88713", + "packages/core/src/agents/shared.ts|3efc697bb8ca64f9dab5633ce0f51a9bf6846fca925a6ee19c4742007a1a0000", + "packages/core/src/agents/shared.ts|457c7f901b7a745103019b820adc7bcb4d53d770800ac33dd1c574282afe0e99", + "packages/core/src/agents/shared.ts|459633016d38c8c4e5b5c2329937e29c2ceaed0360eb5d3aadcd8dc259821b42", + "packages/core/src/agents/shared.ts|47325c044eac07870487f9aa58e5a9911eb54a382efdef96b78658d75911c898", + "packages/core/src/agents/shared.ts|4b11d1c1fa3c9201887ae00e0122ee5e014bb163927373f4a5500759c21d5471", + "packages/core/src/agents/shared.ts|53ad06dea227425846243441c2ebdb9b8ec9971bb2c0c505729c6a66f211dcc4", + "packages/core/src/agents/shared.ts|59713cce5e5a6192a660ec8d0e2a6e460770202c547be756d36eb4b582c18ac3", + "packages/core/src/agents/shared.ts|727a6907626435a13a73dd11b06c9c35884a6ddd15f3de4e0398307498fda592", + "packages/core/src/agents/shared.ts|8add05c265854c716296140ff511cd724d034b269b7ddb8c5fc763dac6df72c7", + "packages/core/src/agents/shared.ts|939d513718e39d4428eeda76f01c23d3f0f7ff36dd8c25f8c6c9c70974406824", + "packages/core/src/agents/shared.ts|9adf9271e08822da7c17f4950886c4f1dd42b1aac5db13445ff16ef11ef257f6", + "packages/core/src/agents/shared.ts|a1268b278cf72a32d40a7343353dd7a1af6c94e33da1a82d018b1901f6c3672f", + "packages/core/src/agents/shared.ts|a14a49999f71326670f58efe599f6d4078f9812355af32a2d467d4cc9067f1d9", + "packages/core/src/agents/shared.ts|b404a0ef5c10e82911e9f7ab4d7cdbdb64215f44147aa6efa6517bfecdf29efb", + "packages/core/src/agents/shared.ts|be1e1387f347171ad07840612d106d9931d3368cb6e23e76423df8f05b8d08bd", + "packages/core/src/agents/shared.ts|d0aef9570e266a8409ac0c2e144155521a76e70fa35a230af1d300850f86959c", + "packages/core/src/agents/shared.ts|daa649a73fa37b585b90ffcf545efdeccec0ba520af35586b5ac560dd7bbc96f", + "packages/core/src/agents/shared.ts|e23e9e8cbdd01732abcf5f9ab45def2f8b76912596d939ef3f90a45092dc6a38", + "packages/core/src/agents/shared.ts|e74a4259ad0afa8b59044814bbf55df1d6c2eff199d90681ac994d128b79acc8", + "packages/core/src/agents/shared.ts|e8b8c2b39b1588a201daae4eb2006f69c0f17c814f2b691db87b7146840ce9c9", + "packages/core/src/agents/shared.ts|e8c560648bf614745b478d9eedaa9a3dc4021a104d94c85ca2b0d5e35565824b", + "packages/core/src/agents/shared.ts|f35311bee91de8467dfd6921da45ab7e0f7ed64f8b402947e2addaf432c5fcfa", + "packages/core/src/browser.ts|2e3b7f6cfe87cddc4e2a62fb9989dc8271650ad89d2a5ac14adb53064a5a11c4", + "packages/core/src/browser.ts|6d74c9f1dfb0dccb46b0afcfc7eaa1389a1ac330b11191c8eb568ad243015b69", + "packages/core/src/browser.ts|9cc06558309d9e72fe9e3867baf022f88ad3f45dc2ff9ea3cff328cdffb39b36", + "packages/core/src/browser.ts|a8aa521ce8f1c1f9dc137a2f32d6d8324344f86896ed55166f46b0d23c8b5e49", + "packages/core/src/browser.ts|adcf937be71347bbd04551939c862a295581a9d84915799e848d84fdba089af4", + "packages/core/src/browser.ts|bfa00a209799bc78e8caf0c95fecee8dbae998247b9446fa0ca516560d53826b", + "packages/core/src/browser.ts|c03415556583173facad45a72ba05e326a8e070e299732a47de648520f269cde", + "packages/core/src/change-state.test.ts|0578b720e52bb54fa3c35d6dab77bdf8ac0f406fbd0ccf1feb0f857096f71f2b", + "packages/core/src/change-state.test.ts|348b64b6574dee306e82a8d28c5e47519e5c4c83ec8120a3f375eaaf8f3cf0b5", + "packages/core/src/change-state.test.ts|34972c94cb8e491f6272396941ab31e3269d5334ff8b470f0e1ab0f6ee4f5386", + "packages/core/src/change-state.test.ts|4345cb431832ce804b2f6525c0c192a4b194e4ec0c5ba15893ffc2a90a9ed007", + "packages/core/src/change-state.test.ts|60f8d65d88119cabe601f437546f61ab349855ae56a9f40a03f4d4694f87be40", + "packages/core/src/change-state.test.ts|6119dc8073c108e6a0a26c6bb2c52caab7b7eddd3ebce11d81d9b8bc08d40738", + "packages/core/src/change-state.test.ts|66bbe09dedf59f9cc346af5a4d922963f898499c30a7602666bf2f980676c819", + "packages/core/src/change-state.test.ts|67009eb04da32107ecb8e5c0f3c723bea429f9990c524ce94f65699ba8525341", + "packages/core/src/change-state.test.ts|71b130196b696cc283971c5eb2f6ea248a400d70bbf7fe777a035fc58633b92c", + "packages/core/src/change-state.test.ts|7a6d423134a50a34fceffd47ae5d362da510f2b70cb5a58e27b159875a22edf2", + "packages/core/src/change-state.test.ts|7aa835fac3de182a11178bb55ea5ea7c25431a5df3f038a84be529e66955a3dd", + "packages/core/src/change-state.test.ts|7c326df0634cddb7107a7c4f9c67281990d2bfd6a21cd658006653bd9ac052d5", + "packages/core/src/change-state.test.ts|8e479aa1a998d72a5626c94682463901be345f161d6e4a2a40bdb2474459a68f", + "packages/core/src/change-state.test.ts|8fedfb4778e88751c601f9ecf2435b1ff897fdd690df45202b8068eb80c6ef5a", + "packages/core/src/change-state.test.ts|91c0bae35bd45a6bf520dfe204d1652360453b4e80ab4519bea843c56418ec49", + "packages/core/src/change-state.test.ts|cb2df81c04ced46f82161b312d5ed31acad28cd37a65de5b86889ed1f7ef8a5a", + "packages/core/src/change-state.test.ts|d69c1edffe0d0d61c41b6c2885259e4613154b98567ff78eba876105ef26e319", + "packages/core/src/change-state.test.ts|deb8e434b394a80448d1cb9a0bd2d5c83ebbb3b8a98a7866abfc27713470aa58", + "packages/core/src/change-state.test.ts|ebcc88dbbca81983e55767bf1d8e0805ad106339cc3b169aa251f23e2a10f21d", + "packages/core/src/change-state.ts|1ab792b28faec23875a48d34c56334d694a317c43487f310437ed7642c5b6c8f", + "packages/core/src/change-state.ts|1af20d92f5d8fba317f68c193e6821ac486e4b185127d5bad0637d82caaa64bf", + "packages/core/src/change-state.ts|2804ade6421583ed26cb156c8aa7a397368ef2c78e41c080f71c45be63d265c4", + "packages/core/src/change-state.ts|3a0ef727be9fe7e401775598576b19d38c41b96c29ddbfc154dcf0589b0730c7", + "packages/core/src/change-state.ts|475295614afe0e98580a0e138c8e968b85700210fc5106880ba3dfa53b4bff2d", + "packages/core/src/change-state.ts|495246c69137f3d0e71d2795dc2fbb36359493fa6918fbc51c360846c2b5ae14", + "packages/core/src/change-state.ts|62d099e602fd17f081ecc86a8c49d7aa6066a31114829b840a2cb6b1cb8b4c55", + "packages/core/src/change-state.ts|85303e5b094a69e84ce81419ff4b986ea77f15393ec158286ca55fe15f34692c", + "packages/core/src/change-state.ts|94a41a5153688ae1df56f546c99121deb25005fb121591197d23710878c97994", + "packages/core/src/change-state.ts|96dd85ba1b4286d44204c377582666a98b6ff5470569db8969e52c5be20434c5", + "packages/core/src/change-state.ts|b5a49c635f79d4cca4288eb06b699fc7bb00549c899dceeb6bba6ece3edb8fc1", + "packages/core/src/change-state.ts|ba7a262f6bd251e659d701b51cad24a5b277816c9195350ee925ac423347ed6a", + "packages/core/src/change-state.ts|c422e76204a687b8762b3e5e89f87e2f8d66a89ab4afc50a218c8df80e1d405c", + "packages/core/src/change-state.ts|ca9170990284a1bc4ce4639fa64f5456de6d34e878c2b97476c637700b8dcf33", + "packages/core/src/change-state.ts|cd2b69df5a8e9c0297d9057749340be554f43b500675b62106d4c685d30a0764", + "packages/core/src/change-state.ts|deb1faf038ad82cd5347191b0f564137f8168ad373755b902150af97ef3091dc", + "packages/core/src/change-state.ts|f1d8470e3c2ddbaf45b366a44aec17554b03a0c5c321242f73e92f8e27af6685", + "packages/core/src/change-state.ts|f28ca84445aa382561273f6383a704dae72efacd13eb2b6b96039c3a36b00e47", + "packages/core/src/default-runners.ts|06ac708346c37cd8c84f5ff4cce66f78650938f3f47e834b955f756ec35dccb9", + "packages/core/src/default-runners.ts|2fc4a5d41307ef6131214234637b4706fb3637848aa28270a2b3a862dd2a5b70", + "packages/core/src/default-runners.ts|3af54ead4a9bea84bab6cc70407f1d5c33c965c429e3142dcb62f6fbc99f5454", + "packages/core/src/default-runners.ts|46e5bf70e6f530b78093c0ad5c04cc4e32296a1958bb5765ad6dc77af9741ffa", + "packages/core/src/default-runners.ts|49245a618ff2f28c1be0660db84abf0ad0210eb6bff9fae01b29aa5bdd6a3ba5", + "packages/core/src/default-runners.ts|5e26c602dc8f6e4ac6e4a2e48903569ee620053be86dd0bbcee78bc5fdb00d26", + "packages/core/src/default-runners.ts|87490fa36672321d1caa55242556902c07fbea97fbb449eef616969b43cf75f1", + "packages/core/src/default-runners.ts|a3fe02ecda7dfd416ded9b82213849e7cece19ee8fa99c6b09a191613014183c", + "packages/core/src/default-runners.ts|a5aa2d837d1d1b412b725ba2b7c797f7d354b7c12c1f2847028ef71cc01beb1b", + "packages/core/src/default-runners.ts|ae8664402d5675e1bf0a039b2aa8a0025d75031d4a502fa1d2a764c8dd53aa7a", + "packages/core/src/git.ts|4b7d79973818553522a3e80f9d3b66c06a4ccbabdbcdd54e39e3a2e7ed13f19b", + "packages/core/src/git.ts|65722d0da539a29db746dbb72e8d11f0eee098f2237bad259914a396b4437240", + "packages/core/src/index.ts|59013762ea16208bee23ec2b945ec92b119338945aff75fb3e1783eb80b0f57b", + "packages/core/src/index.ts|5defd5975e95daa00b43baee514a0ec47a6785dedf117b6de229eeb7c5c5a5a9", + "packages/core/src/index.ts|ebe5455971400742eea1cd674ce7357c8284566a1ca1fc8c38368c15188e9993", + "packages/core/src/openspec.test.ts|1333e1581e37df0c07a7d8ce2881876104ff9315b0009e8c5a34ab7d88fa918c", + "packages/core/src/openspec.test.ts|276efc41523920cc15b0e4e604077299a7f1e51aa161bb212a0ad05be233dff0", + "packages/core/src/openspec.test.ts|4e05be087eb236cae4f97901e3a481bff450e4f2aa3986c88cf9ab77c835163e", + "packages/core/src/openspec.test.ts|85d0d459726886f8f3055ba4dc83677dd26d026667c2d1874f72b5bf08f91110", + "packages/core/src/openspec.test.ts|abb6abcacdd78d979beef67b6f32e422b10890fc4b2e2e040d5385640d8a9957", + "packages/core/src/openspec.ts|0921e0427af11f5d91d56bca397d1861775f62cc038316b7413ad369fc3ce6fe", + "packages/core/src/openspec.ts|092b08e90cd846f300d4ba9897dc22b7865737262c1ac5ed2b08f9fca8f263df", + "packages/core/src/openspec.ts|0cff2e0fac5b2e8d6d31f8d3c870bd5e9d05cbcaeb42f3f007764b1489b11908", + "packages/core/src/openspec.ts|1fd62c40fa994f040954045837ce91ab0a1e767afca62c125c7afbd072aef096", + "packages/core/src/openspec.ts|20844b98bde72c69d85c5c64651417f586b58baee92861eed7b06f403161e58d", + "packages/core/src/openspec.ts|37b5928fb902cb51a34005a45c4e08a7ed7f14334eac48a03448001de5388ff4", + "packages/core/src/openspec.ts|578b82ae24e16869323bf09dd927adbc4dd0f8078151116827c2a4d8048640e2", + "packages/core/src/openspec.ts|5f03c251261a455af73aa3b1a6777b9904b983d6ea9cef7d573485ce2c3d5d79", + "packages/core/src/openspec.ts|6a8109ad6dca9339323b0b3e129299953c995c73328d048a5110e2fa296a32aa", + "packages/core/src/openspec.ts|cf64fa1c573ad007398841b66fa0a01af5a185570229f804c2d09a3e7c7a2ed0", + "packages/core/src/openspec.ts|e96cc90612a45deefefc3f4ddd3bafd0d305030007bc128912cb4eab6a9d4247", + "packages/core/src/openspec.ts|f62f45e30c5c775d1a4cdfe152e0d49983948bad433bf7980ce6c95fa136f990", + "packages/core/src/openspec.ts|fcfa822da003fe3ad80dc79189533659ad92b90e81e546a2449fad386969ec2b", + "packages/core/src/protocol.ts|077cce056afb986933595b49d49ac271aa3d7b018589f1b2f66706f5d66568ac", + "packages/core/src/protocol.ts|21724a9239dd9d8456f4d1003080c041c8801ca5cd3fa4e9a9eace3a56d85d67", + "packages/core/src/protocol.ts|29d5446cb3a9fc9e7b49bb9a621d7ecd927e42f1afe49a386dc7f0c4d6ca3399", + "packages/core/src/protocol.ts|2e7a24aef11dfa351dfb80b0fbbf9d2b815c67f455f9ec1cd3cbb21d20937ece", + "packages/core/src/protocol.ts|47bf84eec747286fbc5b0f7a3ff87f76cb29b9016d449a98c4e23b0e2181daf7", + "packages/core/src/protocol.ts|4c46d05c283c63509514364a3719d31e04e8220027bbb9355a9e31280b277bff", + "packages/core/src/protocol.ts|646e3e49640ccd4a23d91db3fecc4aa1e924ed59536960d80d1ae2032cf42f97", + "packages/core/src/protocol.ts|64e1a95d41f9a395887f5d2a47d1543a2e1ffa258700064a5f923c7acb5cf314", + "packages/core/src/protocol.ts|66955a730567a0083994828c9777856dba30e13edcce1b7fd6c6e2d94a09d018", + "packages/core/src/protocol.ts|6c1d3531d2acf2883b06e3f53ab6a4d6b47470bec2108c3fa6dd7c7c4e32765b", + "packages/core/src/protocol.ts|7a4a97524b5425e42366767691798357103fd1b77401784938bbc9df63d0f677", + "packages/core/src/protocol.ts|7afdfe0574be5c45e2d336ceecd89ea5b8e6091ea813b48aecc057f9dbcffcc2", + "packages/core/src/protocol.ts|890558707b2c173791118589f65db392c6ed5516225d74849ddaad10516338ba", + "packages/core/src/protocol.ts|93265c2ba0926b3cd75f74e98cf2aec738d3c90572b3a57478a0924bb278efb6", + "packages/core/src/protocol.ts|9c509b8979cbba1760091a20e42a8feeaa38421297eb529194b267ed31a9ac95", + "packages/core/src/protocol.ts|ab08128e3cde2afe9fcc35ef6b6355bb07b7afc4fd6ef861e426088d09b45b3e", + "packages/core/src/protocol.ts|b4f3d5545ded3382049d99807990119913a2f2b1dae6cc3be51f8bc6352e6ee3", + "packages/core/src/protocol.ts|b834bee396bb1b74f274c729d5c2656ab198de4afb157f76edcfdb9346281158", + "packages/core/src/protocol.ts|c389fa34e5a736f7a843940b9cea41bb25f95b503aaf0b1e83165825731d8c49", + "packages/core/src/protocol.ts|d6a6a2bda31dd1b7e497393b3d94f9d0cd2534a87ad43a5611861a78c9e3f994", + "packages/core/src/protocol.ts|f2fa298f8952efb04a7041fbbaa42baabb993d0b3b833b2c8f672f603c413598", + "packages/core/src/protocol.ts|f9777adea4def6e3839f440883b1abc08fe0d375e3b14b857cfb999ce1f6a289", + "packages/core/src/protocol.ts|ff461c7d3087e45ef4771b9a7a6c7c2db5971e9b9861269b7982b2e0ff75ec6d", + "packages/core/src/security.test.ts|24008a05b420990efcf3f5c5cba8433459de956bceeb898779afe97ee6a8b4ca", + "packages/core/src/security.test.ts|3eb55b0979a8084c5908465abd61de5b9a2dd64faaa337a79f834e9e71808bd9", + "packages/core/src/security.test.ts|58366a263da896e2a747d0a1592c4cbb521e0088add19790f1e09b475e0d3db1", + "packages/core/src/security.test.ts|5aa830c64483d5a21054037c1ebee07b2f7f8d8859b9ce954ce6839d0732547d", + "packages/core/src/security.test.ts|79db82d816f2a1174c840613483607327e1c537d7f57713d867c42641dfc2e29", + "packages/core/src/security.test.ts|efc34b195067975b56b20d48a1b6959d117cd21aa2d565a57aa0cb6975fe3654", + "packages/core/src/security.test.ts|fa3247985cf1d655d1a409b4a9ba7699631bc78424f8489450d4c8c079afcb9d", + "packages/core/src/security.ts|04919a1df60dcf3cd31bfb6df8a2bf0c5b7c1f1fcfe83d1c6739b0624359d5cc", + "packages/core/src/security.ts|0dcd72d380a6c6c5ee8c54cc04a6913b2991c609fbf1bc9e28c9eac811544f54", + "packages/core/src/security.ts|21f9b81d6d7891fd1a686dbd1700a134992fb86278f29137877e9409d7eafc92", + "packages/core/src/security.ts|26d65c1c82ebc73836aad14722a71ee03b9b1a2a764a404e68f645dc8b56c297", + "packages/core/src/security.ts|2747443e2ad3e1030f082295e41ca3316315d2e1882f6cce194fee82be562c4f", + "packages/core/src/security.ts|2c03e6016fd3dc7afb337fbfec46a3d5f73417fdbc53d6ce45511d45d63af0ab", + "packages/core/src/security.ts|31694ecfa3b4b64e6bb8da85e1cfce05c3f893dc84390e591517bb0b5298c7f7", + "packages/core/src/security.ts|31d5308cc04c4dadedf9ffd3328c74d413ccdfff9291944ab0c522cd12f77b30", + "packages/core/src/security.ts|37631991773ddf31205637c2a254d6dffdcd3e65b9b70e9c7c486e54bb43ba57", + "packages/core/src/security.ts|4583422336305214bc8f458e5d075d3a74c6a1a5cbb7e9a2111eea13cf5827ef", + "packages/core/src/security.ts|4b6d5b677f81fc5c820214f71b2af81ed144c66e119d585152109c085a011c29", + "packages/core/src/security.ts|4d32359c44971700dd4846bfbfdced0317a097f362c6ff004265aaf1800f9c9a", + "packages/core/src/security.ts|4ddd6953b0eb1862ff7f587741a0747bb894225d8fc7beee5831d8b6bf54c196", + "packages/core/src/security.ts|5aa684e8df6676029c2463adc54b3c45b97b0e57da6c029356721ba38134c83d", + "packages/core/src/security.ts|6cfe22f6a555d69b12dd60cd0bb03bc7142c2fe065a2ede1d764cf3cb5ae154c", + "packages/core/src/security.ts|708466eeec1d9c5f2048b594d71f18433b3ea2c4b1481021c729985d086164df", + "packages/core/src/security.ts|87d42d076a1934bfc28b0e080004ac6800eadfebcc0ca3763f13d49a015b82c6", + "packages/core/src/security.ts|8e28fe4899d896aa860b75f166f0a70d7f920c4a9977d109c0a4cf0f9b92db3d", + "packages/core/src/security.ts|8f56c472e6eb58df37e42896b8c8d981b948d37cd67f2081c66204fb3d6a7ca6", + "packages/core/src/security.ts|90dc1eb95150606efd3a206451ba3b491a4e222fdf4d1543f1b3f44949a55d6c", + "packages/core/src/security.ts|94543d0e417cb6cd3ed250ad7914298a0e8260720b9abdd09a252fbb697941d5", + "packages/core/src/security.ts|96c3426195229923d46301aae141bc75a9dde18491dfaff83f1869f1a822f430", + "packages/core/src/security.ts|9ae09e6bd9490da4ab2dc81a26d1c977a4e1f7176ea16441ff7aa997dbd7d2f5", + "packages/core/src/security.ts|a08b626ca9c40104c8741827968a17cf215316524b19c2872f6d49e4b1a3330c", + "packages/core/src/security.ts|a1de1e13904c648a044124ad75426a50d7b9cb1932574c7b92dd83bc09b0153d", + "packages/core/src/security.ts|a6f19c998c5a407b5e43ed3f01cdd870d568c62f5db9b4af72c6e767d862d646", + "packages/core/src/security.ts|ac21b1ceae63bb0d9cf3d44a66e77fbe006da2e8b5232ad4ef978559973248ac", + "packages/core/src/security.ts|ae91fbbee18b2e7e073c6d603218159bdad49be05eb88611a37c0f7ec81e389c", + "packages/core/src/security.ts|b6a915cc5a53511ee966ecb48b43853899a56e15773d716623b69ea16adbc021", + "packages/core/src/security.ts|c07dcc1b1b4bcd867824af4f8454670a4e0c5cb0ac41555572bb69cf60d8b57f", + "packages/core/src/security.ts|c0a520d710979ecde683ca76d731db827fff74bd2b3c11a156a8f3003d0ef52f", + "packages/core/src/security.ts|c817c03a8331f1fed4d8a4b30cf41f35fe33a5f26cfb6228c64fd29dfc3abc97", + "packages/core/src/security.ts|c9a40c5217053b397cf2c0b93ff6ebb4ede8cb31bf43be18fa2ce4221ba2047f", + "packages/core/src/security.ts|d16edb5332868f0aac229b0e05501fb8b49574959d25e020b42833372395093d", + "packages/core/src/security.ts|d93119d8b966162944455601e2894b0ee216fa1ef3368f29ec91ba66e1d84b24", + "packages/core/src/security.ts|dbb8cd788f719b5c90401e82f1a4f064befb3dfe3c7293f5bf938a77ff7359a7", + "packages/core/src/security.ts|dc5706b33bf6df797025c5f348001cff1abf7e0f0064847f30cddd943cbff047", + "packages/core/src/security.ts|e15063472cee00df7f348f86168c1af67c958d0f909d6fcfd5dff68081e1ab5a", + "packages/core/src/security.ts|e21ad61944332c2a08d8717a5fec8dede8b8d4848684ca3f500f6b92344abbb9", + "packages/extension/scripts/build-options.mjs|1903576f81fe5869a998407da6e8af5ebb247b01143ab4681fdfde5aaa3362fd", + "packages/extension/scripts/build-options.mjs|2adca73e41944b1cf42c2dfe32c3d55a345af736c74ac49531a19cb7ab07b218", + "packages/extension/scripts/build-options.mjs|4c4ce780082cfb37c131e3664a59a26623e25f166ab29c38595359990ec45ebd", + "packages/extension/scripts/build-options.mjs|6bfb9e4976006d71da56dbc941d614129e4fa495e6245b3eac07c1bd48259f52", + "packages/extension/scripts/build-options.mjs|6edc272a117d3410625fc8a8c63d9809a6fd669163b3d4730a62ebaf34df663f", + "packages/extension/scripts/build-options.mjs|a354339504bf847afea8e222b6a130b0817b77d01137ebbeae96c5ace3eccca3", + "packages/extension/scripts/build-options.mjs|ae6f9989202f24d123edfb1891b2287eb0f4b77cccaf4e7c240d6e54894a5631", + "packages/extension/scripts/build-options.mjs|b437920dd28376d599f903b6a8578208ede448bc3743f4276199c4342ca759c4", + "packages/extension/scripts/build-options.mjs|cb40b294aebc6778b25ef3169812e4d593480a0b2322076a69b69e5c3c0cc938", + "packages/extension/scripts/build-options.mjs|cfb5f1878a9e7f41ee866274948f815bea70845291ae15e41259883f81cacf7f", + "packages/extension/scripts/build-options.mjs|dbf06fd61392096ff44002089d704d87918a3d84415a2e7dfc3ed3ceb5b5cd97", + "packages/extension/scripts/build-options.mjs|e1c10ed9e868033d7069b0b454ea579e0f158db7a8c06839509706e279e03cdd", + "packages/extension/src/commands.ts|35ae566db0916b7979f0cd1a1bfb493b9c53e73390b889bd0f39812f5507ca2f", + "packages/extension/src/commands.ts|d439fea17e89d8238fb1f893757c98b34bb85704f3a5fb09903c75b7f5eddfde", + "packages/extension/src/config.ts|5675e366ffe19b3e5ac029d99d8cdb3e7b234787625ff2c1f3366bc381f35d48", + "packages/extension/src/config.ts|e64537f09a23d7898f5a838a01edc5a6eeddf1d6528356e8d170abbcac67e8d8", + "packages/extension/src/config.ts|fc3632536a609fad9bacb50d76d30fb9a8db98d56eb974e49c43b8d3c4853dec", + "packages/extension/src/extension.ts|304ae929c9278c5f543d65b4d459b3f346151b006545fe1a9b8bba076324265b", + "packages/extension/src/extension.ts|7982a25beb081b11342463f863b06310db2a347bf1d45c9b583156eeb66c31a1", + "packages/extension/src/extension.ts|9563be157566fa26b5827d38c7b20c814e10c99feaddf9a7f75c74569c7b135e", + "packages/extension/src/extension.ts|a5f76148bad3f62aea3bae1119d830ac58c7825e401ec12980ff5499cd72adbc", + "packages/extension/src/extension.ts|f21b48192a4d75d9e8d66f13be365d228c6576f43ded5001d6f5a72ec218331b", + "packages/extension/src/native/diff.ts|1cd71f8b4b2c8b7acf4c42d7ea170254c7f17216d0c591b0a99e94aad19d9d3a", + "packages/extension/src/native/diff.ts|280f88d7fa05cd41aa3f8fa2ca81337bcad536ffbfcf4ef051311c7820493504", + "packages/extension/src/native/diff.ts|ace6de97e120ac670aded6264db935dbffd2e1196d5088d2b0e51abd4f717b1d", + "packages/extension/src/native/diff.ts|e15625f21c773854fbfd16c555dde0a68003415782f5b7a344db6b9091bca808", + "packages/extension/src/native/git.ts|2468b3ae2930faf51d4c88af975c13c81009d2d5a3b5a4481f1f51509ecb195a", + "packages/extension/src/native/git.ts|50a922d8af3b149ecd8962687d5d0b3d422b02956ee5214dc79d1cedb50e03fe", + "packages/extension/src/native/git.ts|b372776a6d034c0b55d3bddced8ef327665bee46dd1f94f56e51889429401b1c", + "packages/extension/src/native/open-doc.ts|338b029f32657b3b70f8ad5c138c7d42836b7109283a8d9e91bc619c9476325f", + "packages/extension/src/native/open-doc.ts|df0aa706677ccb0773ef500d1914dfdd45aeb6e73332e7edd90008cc850eb7ab", + "packages/extension/src/run-controller.ts|8878bf8adfe717a4ffbfa83cb3a8d77f94ba6feab4a1818fc08cd491b9357c1e", + "packages/extension/src/run-controller.ts|af3f03fe1e5869c95a5da4f456a96f903cce18151e6c2f72a76b4426e989a4d0", + "packages/extension/src/run-controller.ts|afafac6288c48999e745d7c08da9f9af25ae7c748dfcda496380bdaf8b96bbd6", + "packages/extension/src/run-controller.ts|ca96dd4baeac77283871e5f823dd168838bd7b3c6b50dc3aafb674eb83e2f47a", + "packages/extension/src/run-controller.ts|e9231f918c5d2cc3a01cb78c5a085800a10162109f2e51b54b77cdda35e77313", + "packages/extension/src/run-controller.ts|f51198d35b2f5a72e24a5a13e2c1fe509feefe55d850e0624bd463811c5ade0d", + "packages/extension/src/test-utils/vscode-mock.ts|4437c82806b48832fc00cccb21bd09019e8a19cf6c61c586cab875dfeef2b9c5", + "packages/extension/src/test-utils/vscode-mock.ts|696750d0b87d0cc228b6d08bd970361b4ebbc07c494c3385f9a3133dfad3accf", + "packages/extension/src/test-utils/vscode-mock.ts|7d986fa733c0d970c49f4dec6b46a8ab9e521a78d9f2354fcd8b949c58d83820", + "packages/extension/src/test/run.mjs|30ff677d7c72b3723ed3576d6f584ecaf93623c0aaaabd0dea175ecda6443bbd", + "packages/extension/src/test/run.mjs|7645a110f8ac03edb9048885862f3d7bc0cb87d69f1bdbb353c6c767d406404c", + "packages/extension/src/test/run.mjs|7788674ea2fce9e0e31d4762f7ed8f838511200c11bc20fea2d99b993f37e82f", + "packages/extension/src/test/run.mjs|f057aacf04f789875dcf3d607f00b30f019e54ed2e7a3c393146b850533bf22f", + "packages/extension/src/test/run.mjs|f574e821bd468e41ef10ae81f6a725bec55b6cd8735e64b043a79cbcd9612b5b", + "packages/extension/src/test/suite/extension.test.ts|b2d3d10e714a7b15d0515191988639691b42f7a111cb94cca03a7a830ff96d2a", + "packages/extension/src/test/suite/extension.test.ts|e2f5680105bdce119b18c1b34c98fe68ff4c8483de926ca578a06e8c89d846a6", + "packages/extension/src/test/suite/index.ts|a46853985a6ac3f41a1cd4d6d5d7839e0e7afef6994d5a4ad0211e58e7111764", + "packages/extension/src/test/suite/index.ts|daf63766803d18531ac77ace97a10b5395a9303e4fbeae565c1ebbec77580414", + "packages/extension/src/test/suite/index.ts|f7aaa8250576048b88803b834c3f2082557c4268bd8c44048cfc65c0334cf50d", + "packages/extension/src/webview/ai-panel.ts|4a6494bb7111a03d7fc4b6835eeae27ca183f18e288d629100d0a22460635451", + "packages/extension/src/webview/ai-panel.ts|6663f228de0db367f2616ed9b78c13c845b5ec9c0f43430221fb5aa150383dba", + "packages/extension/src/webview/ai-panel.ts|9b72fb2eec794f56c534d37f3ce1175a127b6e1a1bcedd81ef1c6dde9eac47d6", + "packages/extension/src/webview/ai-panel.ts|a76b4a7dab3d260276749fa15eea4c9e5848d006624fe464b74a0cea1fdf5c21", + "packages/extension/src/webview/ai-panel.ts|aa7120b71d71201dae60a9c9b401778391fe8956adc5d51a13a81f08fa3a92ce", + "packages/extension/src/webview/ai-panel.ts|d6bf2c6f70f748ab80f1ac7e098d19b9c5342e712c94ec578fc99d19d0ebab73", + "packages/extension/src/webview/ai-panel.ts|ef954f73e8185e4c4788e27583d50ee74da1e092bd10fa3c5a8159f6a9338119", + "packages/extension/src/webview/ai-panel.ts|f0e09a5ac67e4d2b770c9169883d00955dcf3df9e202aa5cb235733a01a6ace7", + "packages/extension/vitest.config.ts|0fb0c5c014bf44e43a428f9e8e415cb2b6d84235f8d9189ba67ccc0f3dc09bd6", + "packages/extension/vitest.config.ts|1d5c526170a32302401bc9ad1e66d7a5dbd4de963970deb0d912db2cebe898eb", + "packages/extension/vitest.config.ts|6009029bbafdef7702a1f354aad638c11c8e00a6b0972fde7881e76aaeb20578", + "packages/extension/vitest.config.ts|c22191906777177efb4ca292f4efb7411d1fad2df738da10aa81c4abe0d774a7", + "packages/server/scripts/build-client.mjs|38606002cd7a7815f55ba670c172c8db27df1e6042324fdaf2d6275406b8a7e1", + "packages/server/scripts/build-client.mjs|57b092a623dcdcaa3a58387492b2eab1e4dd6fcd3b025b85d84dd5d66983f240", + "packages/server/scripts/build-client.mjs|59d1d56ad05aded3925e53241ee4c00fb56626884f8294a462a72a2692ad102d", + "packages/server/scripts/build-client.mjs|dab2f6f75e048d213baee0d4e3502b4d2ee8effedf68b6cafe608e4c90e2a03a", + "packages/server/scripts/client-build-options.mjs|50fb152418a8f500f89eab1080ae6ab56cd15b6a499a7c96bea6f2f0f4abf44d", + "packages/server/scripts/client-build-options.mjs|5bb5b6cd69beb52611b1d8ef9651905904a45f8edcd72cda2104d01521c49e65", + "packages/server/scripts/client-build-options.mjs|97eaa4c1f91ba2ec018cdd53a767177c37bf13ed41ea342c2bdb2ad0cb09c71c", + "packages/server/scripts/client-build-options.mjs|d313df113807d4d7a748409fc452cf9c1a872f32ba31f49b3dd9eedccd4e01ab", + "packages/server/src/cli.ts|57fa508cdad237854540ec485496141efdbf8a99d25938e1e580ca70bf196c09", + "packages/server/src/cli.ts|a7917255c73ca9b6789197e37a4ed07a45669523c7f121aceece08c82a51ecb5", + "packages/server/src/index.ts|348ca4b83f01785aecdced6e80b942e34eb672d4a7909a41d06068bec38121d2", + "packages/server/src/index.ts|b2aee367f0d251d798bb4306e0c1c28c3d4975951c7afa270743ae6d91c0859b", + "packages/server/src/rest.ts|5f2d81f723a5dbcd0b8e054a2a75f8eda964aa8a1b8e2db9b16ca2642dda8271", + "packages/server/src/rest.ts|b7d98262c63d1a68361a5bcb2233e906ed8ec178b54a63cbf60ad39240ce7944", + "packages/server/src/rest.ts|c48da33495e6b9aaccc07cf931da6a4edbad8ac5eabbb3af33a6f145cc616d3c", + "packages/server/src/rest.ts|ec3636c9b6cd71d2adbce005dc19e12c7b1a919f6993562cad9c904a7a44c3d5", + "packages/server/src/server.test.ts|0443b4be9da850dda5b7ca8c02432654229a8117f05926f5fde46e8ba629a0cc", + "packages/server/src/server.test.ts|0d489707392c60879abcfaaa015671c94d949a56a0f6ecd87032f61c59c91a7f", + "packages/server/src/server.test.ts|17a2849f2df32129ff5f9dd5fbdae25b1b603637fafd5e8ed6c124a929b915c4", + "packages/server/src/server.test.ts|1a3075d2a563c5ee9a30f50c747ec3bae1d8b3a66807febf4456e82cdee99124", + "packages/server/src/server.test.ts|597c7e902ad5346030cab7675251694f39532f6df77e238fd1cc159c4e821e4a", + "packages/server/src/server.test.ts|9dfddc7451f34cd2e034c75225a141644effc997c5c8a72a4d3fd973d88c71a0", + "packages/server/src/server.ts|159803a8431acd7b289111ffc3e026c1c8369862d2e312aa4ee442ad6ff5c93f", + "packages/server/src/server.ts|1cd98243019a0e22ad7dd9a97ebda299f0dc8b205add2884e71e26ddacaba59e", + "packages/server/src/server.ts|3a867128bc240ff0101b2f90b1517c7229967f9b397c97e3ab859cd4c0afa145", + "packages/server/src/server.ts|7fefc60bb8126dbaa428eaf8f2a1cd9502ed31df84223b73f50166ae2b9cada0", + "packages/server/src/server.ts|b6db37966573e7aebf10dec025467b7bdaef25dfc318cf4e62a544c479b72adf", + "packages/server/src/server.ts|efa322dc5db2f5221e2df22f6e25517000f8a5f1a71ba5827d8566eb10a3979e", + "packages/server/src/server.ts|f09c504f8201c7ec581af9d8f8f5cb7b381e7f560175a2e44cf08ca4609632c1", + "packages/server/src/static.test.ts|178a2699bf0e9f7a8e69e662afc378585e8f18060acc3bec5a837484db25b97d", + "packages/server/src/static.test.ts|41fd8e5247aae944e93bc34a7dcbe9eb500296bd4cfee9e9cc92fa3f15c4f235", + "packages/server/src/static.test.ts|5888528958e4301b8a923d2b5799be032c3eb941af880b2fed9aec7918e86246", + "packages/server/src/static.test.ts|cfe1c69bf4d2093bc11592e557c1c526275f7cb143acfbe7ba0d9fb72e81b802", + "packages/server/src/static.ts|02743cce0ad6112aeff7e47b212b59325b3f722050ca85fa9b837f457ff519a2", + "packages/server/src/static.ts|152e17a8fde7266d7fa89e733b8e8f07b45ea53d33634aa1678a9381b5f33942", + "packages/server/src/static.ts|21283db58ca497b7dc6e47187ebb9dfcceeed7f3a822af4107201db3ea72f18e", + "packages/server/src/static.ts|3ae6d25edd2481041d25e03f8d00acebfa80898dfff66f9971095f317acbc932", + "packages/server/src/static.ts|3d213d5f39d04fb07560a7f2054547f737e265c94e7503bfc6ec21eda9f95f83", + "packages/server/src/static.ts|63d312886d0c8d9479276db579d45786fa3fa47278b1e86d2cebc79b0c6874fa", + "packages/server/src/static.ts|6b9e646c7c16574253cd93ae85e1ef14447378c453792a87d0045eea36110791", + "packages/server/src/static.ts|731484ad4fbdfa9d1552a9ae59c299eb21a856757f30dd60e3c42fb7cfabf313", + "packages/server/src/static.ts|7359dc47da2855471651fd4afd04a624e2b3c7da6063819e7a4646361ab76b6c", + "packages/server/src/static.ts|7a2ce1b19d14effac73a83355bfafa615d3214a8e9e5708b9d7344a6b66c4464", + "packages/server/src/static.ts|816b816a8c92e509bd30d33a571025d1e32eeed3ad1da6685ecb629586fd2f3d", + "packages/server/src/static.ts|83aec0e44ef20968b9d80dc5784b762f1fe940024b254556bdb33f5c9326b090", + "packages/server/src/static.ts|97c69dbd949f1958dfcdd38548cf13ad9dc63bef3f75f8c7f250d2e88465eed2", + "packages/server/src/static.ts|9f47e933011077d06b6bb519fab07b8d57c1bf833c299ef0f036642cdeb5fe9a", + "packages/server/src/static.ts|c72ddbf769501a420e7c5fd91299aeca63949953f318bd1e68eb3f0fa6119698", + "packages/server/src/static.ts|cf20b68fa1c35e00d1d6286d8a15aef97c3871342cb218b28a63ff214e7cac8f", + "packages/server/src/static.ts|e610015983b8d5519909104766d279ce229ab8d2cb7c0dc9fc1b72f4a0c6a42f", + "packages/server/src/static.ts|f5bb9ce71e4d6bcbd23c9807dfa3e7090deb93cf8dd4ba259e06024a25dc5e5b", + "packages/server/src/websocket.ts|0108c4d6153aba8460756f46125664d5894ca9f1b0a6dc99c7bf9ec610a96712", + "packages/server/src/websocket.ts|63f171c18aa163bc62734e7cdae0611aeb3b3ca5f4734cbaa235638f9580c591", + "packages/server/src/websocket.ts|b24a14447b141bc88c9ea4f9593997666444f3a7503d539cb9a104faf0741c49", + "packages/server/src/wire.ts|19038cfe13241f430d9655859ab432eab03433d285dd3a8e147bfe02d25a789a", + "packages/server/src/wire.ts|5dcf1d55660ad9355fab1c817d138637362422fe832ae21b1803d1db3b6b645d", + "packages/server/src/wire.ts|dc661d7d2086134803db0b172f5f339c5b85a259fcf152ffc0a5c0690407f6a9", + "packages/server/src/wire.ts|fbdfdeb4c614ce85266f24446f3a089cd55f8ac6be9017eda89aebea3271b211", + "packages/webui/src/components/AiPanel.tsx|16f5f4811f2b8e5f0be815ae8596a7f08ba51a6f1354b10e74b71de31e7e3d34", + "packages/webui/src/components/AiPanel.tsx|3ace307d7fd2bdaadeb35786f4aab87e8ffaf27c08148afc51c59d5ea9907187", + "packages/webui/src/components/AiPanel.tsx|4f0c5a1cefb352fdb0426dfbc4ce04fcb559460c825345269e076ca4b8b97575", + "packages/webui/src/components/AiPanel.tsx|5e7e8dde9e3e5c3457ec65eeeadb6099e1d7f47e8ee74d36ea6af109ee1eef04", + "packages/webui/src/components/AiPanel.tsx|abeed77d41dbf06ef698a270e89e73833e8b3a1978795bec2a474ce02e6fbd56", + "packages/webui/src/components/AiPanel.tsx|c8e7179f2ff9851aa8250766988affe44e990be20c5e33757c1941ea5ae79b11", + "packages/webui/src/components/AiPanel.tsx|e8448597c0c7682b6b9def9110742f0c7e0d86efc5aa5c51671342ef9b82ba1f", + "packages/webui/src/components/ArchiveList.tsx|2163d94297169647e31a8babacd0b16d0cf7b86724c076457a3e251f26df2791", + "packages/webui/src/components/ArchiveList.tsx|6d8a89fe1ac0208c7a0b5a113766ef71b472b31be4d91d24426877eeae77b406", + "packages/webui/src/components/ArchiveList.tsx|85f9519a7fbb0fbb17ea60808d46f8fca1485c8c97b662d57979864323177a16", + "packages/webui/src/components/ArchiveList.tsx|d5baa8af21b2c866dea8f8969a9c1bc8bdea6fa0cbdb87a6b4f8e190eec79bdb", + "packages/webui/src/components/ChangeDiff.tsx|11694d1fc575f1ead7ec410b0aff0fd2afe8b945e230f31e2f0bdcde680e8b2d", + "packages/webui/src/components/ChangeDiff.tsx|538be44fae26a0307b4dc1a91ff625150c3c0ddf9eefd6dc56395190fa600aaa", + "packages/webui/src/components/ChangeDiff.tsx|922303fb81f39ebca9e0a5bcf429e03aed2a8cdc8b9de4506c44152110cd27d7", + "packages/webui/src/components/ChangeDiff.tsx|ac9021a3361097b5ed352f3f99cf2c44348156946697f849ad158cd22e930e46", + "packages/webui/src/components/ChangeRelations.test.tsx|38e9bb79d84edf56f39d0d61d7b53eb9e2876eedc37a6b0ec393fc449f471c68", + "packages/webui/src/components/ChangeRelations.test.tsx|cdfa164118c19e110700cea106dd0876489bef7cb9e817e9c3a7869f42a68a6d", + "packages/webui/src/components/ChangeRelations.tsx|6c39a201f141c1814fe259f80085463d6117d82e9f35d9812aafbe9e2b6a7037", + "packages/webui/src/components/ChangeRelations.tsx|8c245c61ed536bc6d62c0023f7a8d2f20c6738de3011e596aa9ea036adb163ad", + "packages/webui/src/components/ChangeRelations.tsx|9b93bc11cf6773808168193cbaa6bde3d572c73a02413d3317145974d24753f3", + "packages/webui/src/components/ChangeRelations.tsx|e24204acf9cbb818aa6b3c22bc668087419994529372516ee9dc68ab4832bab1", + "packages/webui/src/components/ChangeRelations.tsx|f2bc0c29a75fe488e147d74fcc8f9954b3b40247a03321d31a45b7d16182961d", + "packages/webui/src/components/ChangesList.tsx|47bf783a279c54f3cd80a56f54a67a76197abcb01755bf1cd973211577fa9b9b", + "packages/webui/src/components/ChangesList.tsx|de51ee23974713e4f156212aec6e96b10981039fb15d9e0cf92c940a85406f20", + "packages/webui/src/components/ChangesList.tsx|f1902be668ab4f094c8f96e4c318d48b7e00240e7c8e1aee1b4ea4c4b3514043", + "packages/webui/src/components/RequirementView.test.tsx|30f134465c923316abb647e8dda6596b7c061d74009495860ddb7274541c7824", + "packages/webui/src/components/RequirementView.test.tsx|5791a2ad6681acc608092f61b052e39f2942f4926328e4899a0005e0a4ec9197", + "packages/webui/src/components/RequirementView.test.tsx|7cdf8845aaff0f654ea3594ab6856b538daeb12d5cbe068b0331b3190b55cd24", + "packages/webui/src/components/RequirementView.test.tsx|d4bbf81232b25b87e60f86f6285fde0889aa836bb95757dc7b57498b5fb007e4", + "packages/webui/src/components/RequirementView.tsx|03ab9a0652f079c2b3967e6813faa22e4f6e996039446c42102c6271fef6774f", + "packages/webui/src/components/RequirementView.tsx|10f3cd0d960e892a31b45226a53ebab605cdb9432674018d8b7a7a3aa04277e5", + "packages/webui/src/components/RequirementView.tsx|1a3595c03da8eea21e871291abfcf1b5d3e05c5b923d789e41c2d2240f6db2a5", + "packages/webui/src/components/RequirementView.tsx|8ecb7cce932c4e797626fa3af6f390aa4f8b17ace8b4f7ce0c621db7bb64908f", + "packages/webui/src/components/RequirementView.tsx|cf1f3558d00948a3ff34a9a541ffb88b438a43db5b4e1d2d452d7274d3592251", + "packages/webui/src/components/RequirementView.tsx|f0301d95bed43c30be938372a0396298ec8834b8bc4aef72ba78bb59f6e1da12", + "packages/webui/src/components/SpecsSearch.test.tsx|018ca099730190b4cef079635d5b442bf9268706d6f9049fc9ca72e8d36b4705", + "packages/webui/src/components/SpecsSearch.test.tsx|06b0631f883f399a9915f385721955e7fab7b5b5ecc1bf22d2b7c0170b32c6f2", + "packages/webui/src/components/SpecsSearch.test.tsx|507d8f35e74bd7b2886156ba0ffbf3f63725440263cbf6d1ad92018c355927ce", + "packages/webui/src/components/SpecsSearch.test.tsx|82073f4fa01691da1f452706271636c49599edfe0afd08d293f318c91782a30b", + "packages/webui/src/components/SpecsSearch.test.tsx|db77123e7f597553ecc5280cbc5e0bd5e8001d52af2f0d634e5bd03401d13875", + "packages/webui/src/components/SpecsSearch.test.tsx|f3b5c21cc5acb600a58d30b95e9607a5ceedbe86c8176555e71cc46f425d0676", + "packages/webui/src/components/SpecsSearch.tsx|dca93d4a7b0e9a1e7974caab0caf3991c989df2efc71edf50370931c376d5361", + "packages/webui/src/components/SpecsTree.test.tsx|06b0631f883f399a9915f385721955e7fab7b5b5ecc1bf22d2b7c0170b32c6f2", + "packages/webui/src/components/SpecsTree.test.tsx|5e22a0bbe164642d0e8e2525c08f12921695c91a9a6ced76a74303735fff0b6a", + "packages/webui/src/components/SpecsTree.test.tsx|63ebcae048df5d54380e475c437b11b931bc9954d5cdda59801af52b2339d99b", + "packages/webui/src/components/SpecsTree.tsx|5c045790d42a1817b7854fb17950838db472a8bbea44d4ff6362b16058308b75", + "packages/webui/src/components/SpecsTree.tsx|b2751a28b86cb91d849a9cb3e8b41c8efd58603a20487eb6658e43496b790f9f", + "packages/webui/src/components/TasksChecklist.tsx|05bda9a30c009df3ff56e9698ac86953f246e39a0e8116c6802409c1a5522711", + "packages/webui/src/components/TasksChecklist.tsx|383e3c5e419d325207dbbaec4ba864b16c7c3d7d57a77efc344eed7d1d11ab2d", + "packages/webui/src/components/TasksChecklist.tsx|6e0e64e0db3f82bd72a6259b12bc39571db91a287263116b6aa4df12c6ef5d2b", + "packages/webui/src/components/TasksChecklist.tsx|8ca9bce917593037fe38293aa3967f09e3a971a52f8924411255b740f37935ef", + "packages/webui/src/components/TasksChecklist.tsx|b31bfe3ac2461f067bb9713819bb1ab20fb81bac914d80d5ecc918722c8f3b5a", + "packages/webui/src/components/TasksChecklist.tsx|ee24d30d8dbf62c55be1421dd7fb509bf1fb084b8f306d97709e08f9abe42148", + "packages/webui/src/components/TasksChecklist.tsx|f0f7b14346aec4f0fcd634b78642fb6dde881bf020acf87d8c6f86a0fa1f60e5", + "packages/webui/src/extension-entry.tsx|023dc0b3fbf6817607ad9e13c5cf451fa64745ddc9500649148ce880cba8def3", + "packages/webui/src/extension-entry.tsx|026d66c7546bca2085f23b2868823e7c946c5dec39e5ce8520fd0ee43a265cd9", + "packages/webui/src/extension-entry.tsx|4c8c4076d50ac8274c1d2408de29572c1bd76593989accf859178d08c8e78767", + "packages/webui/src/extension-entry.tsx|c74690bb643995b934afa89001bb375e577848c888b53b46cc330a93626febf5", + "packages/webui/src/extension-entry.tsx|ec70634dafeb084432c698cbd724162bdfe645f605b030d87d0558fd867811d8", + "packages/webui/src/extension-entry.tsx|fb715330f25b31201e28483b325a73adad1edbd078bad7ddbf97b85d5e37829a", + "packages/webui/src/index.ts|423ce2ebc813d4255850fba993f57932da24615b155d711e9215f9ff78f85e12", + "packages/webui/src/index.ts|4409f6120adcffdca54737521ecb581c1ab9bab648ff70f0d12c809965ca81b4", + "packages/webui/src/index.ts|76efdd81440903a0951e98a1bf4e9954fd43f8b72833617e7952821cb29494b5", + "packages/webui/src/markdown.test.tsx|0b3d1c7fbf4f17dc3583a9565e8a2b555fa2cd4ec7aa36b44a9dd16a9d31dc81", + "packages/webui/src/markdown.test.tsx|184c503651c9f2346ad471487a35c346fc70b64c587d38d285036735ed1dc72c", + "packages/webui/src/markdown.test.tsx|a8680cd9543928fdc8e7afc4169dece536603b475ff414d81afa9268a6196742", + "packages/webui/src/markdown.test.tsx|ef2094052849fb42c895bc16f563720592d1c2b2790393980a2e0795a2dad4ed", + "packages/webui/src/markdown.tsx|0f60b336c8ab51dbf3ebcdd6d14eb4d2edccf9de8325b044d62f602c2ef516f9", + "packages/webui/src/markdown.tsx|33a67e9b54063c125e85f01513639a929798c2f4507ea8c3ce93a49d52a3bc18", + "packages/webui/src/markdown.tsx|b6ad36811b022b96183b508b8dfe5b6256afc972ca24f50316f0021fd2b0094b", + "packages/webui/src/markdown.tsx|cbae7d791ac1f16d2e6592f708c69f63cbe6dc3b0720b332e1b0add0ae4563d5", + "packages/webui/src/standalone-entry.tsx|21f31b30070f875a6e0a37417b1fb6224c4f483c353832ed6d4adf52392701f9", + "packages/webui/src/standalone-entry.tsx|540a79bd313a6f71d421689b90cc19b13acf9989e288e20fae031b277cd809a9", + "packages/webui/src/standalone-entry.tsx|83568b38dbe5ce6dd82cb7b4c07af35563a1f6d86e8a8b00e9273878446dd75a", + "packages/webui/src/standalone-entry.tsx|d37a3c9f627897aac5ae3d8eb39b1d5be7945727d56847c7468e5667c4d13776", + "packages/webui/src/standalone-entry.tsx|f70d3d2da3fa61e9c99926105b423e7916c09f81ae03337d97a245cd645b229a", + "packages/webui/src/transport/contract.test.ts|182301ff0eb4bc46677279b209142d3fefecd01030fa033f379f5b9e06ae015a", + "packages/webui/src/transport/contract.test.ts|29993888776af19791e5793a9fa3c4f24eb1565aaf13309049a9a7ebc6cc5741", + "packages/webui/src/transport/contract.test.ts|2abe3ad0cdb8a51ceb7c0db4ef624f431dabf47ded2553a83252a67a00d7cb28", + "packages/webui/src/transport/contract.test.ts|2b17dc2f7ce6f2c0b715b27fc5f91c0aef7ce23d90e43e5a2806c2c69d567cc1", + "packages/webui/src/transport/contract.test.ts|5fdf7e1def6daed1c14fcaaae1f311af801bcbb0e2feeb97fbc371cf67c99016", + "packages/webui/src/transport/contract.test.ts|60cff644c9bd7f59e4b2204dc57ed4eef0fc7518c8548c0566d9474107aba459", + "packages/webui/src/transport/contract.test.ts|62ff826a4de0c41732abfc925d63786758d21ac0e1995cd6f1f40123542034d1", + "packages/webui/src/transport/contract.test.ts|63768ef3212bd9c82fe0432fe13ac05e34f539a15dc17afbcbfedc79df0c9a30", + "packages/webui/src/transport/contract.test.ts|69029fea0815fd8de5a4d73e5f773ca9c76c564446b05f0f2d43e74ceb30985e", + "packages/webui/src/transport/contract.test.ts|913c393067a94defd0559c2e8e27299cefb4c1c0f9762d80b86f1fddd6354e6a", + "packages/webui/src/transport/contract.test.ts|9ccd98dfb859de3171ffffb94cf08fceb3eddaa79a3740a61bee443bd1dc5954", + "packages/webui/src/transport/contract.test.ts|d82c098d223aafd8b68a29e094c6094e3590d0a020b0f235b50eea803778f7f6", + "packages/webui/src/transport/contract.test.ts|febf7f992c172c3897e5defc7695b8292c96fd727993e4fc4086e145c5b1fbb4", + "packages/webui/src/transport/fetch-transport.test.ts|0a14e938dbbbb6ef56b1ab693e8d6035cd66af930208a19c6b738a79beaaa7ee", + "packages/webui/src/transport/fetch-transport.test.ts|19e0cd0c0813a9572d176ca66c237f7775af675e313921d4384e843d909f42a2", + "packages/webui/src/transport/fetch-transport.ts|0e9c1ef864e8d0b3189b105b961e068488f6adb99bdf5c78f0983cd581310622", + "packages/webui/src/transport/fetch-transport.ts|0f740034444ac85aae6ff9196d861757e0498e32350af07770b6f919e33019bf", + "packages/webui/src/transport/fetch-transport.ts|1f8581f0c8b81f7ca01a1ebc9d24d0ab5cc848b0f2c01121bb33e2cdb5539a37", + "packages/webui/src/transport/fetch-transport.ts|20382a28c782934dbfd2945dafd9220cc49205140ae167d521ac1f295714e8a6", + "packages/webui/src/transport/fetch-transport.ts|2c3ef58e4a2b1353a69199965182d42273b644730cd22adce71982b31ffc7ee9", + "packages/webui/src/transport/fetch-transport.ts|2f6d3da427eaa41f6c71811341ad0d5b52092df9259618977e78e7ce7fbd77fb", + "packages/webui/src/transport/fetch-transport.ts|3be4c0c514016d4f14ef286b9d946eb2d3910c98b96d4082a82dd07ff5698c25", + "packages/webui/src/transport/fetch-transport.ts|4412f5aa8bd29e995bbae3876911b49317d6ea4a4b49c8d9eeced3b6b1658a36", + "packages/webui/src/transport/fetch-transport.ts|4fb9c70ff011cfb413e191900f5203c74b5f9aa2ac34a0303980840f4f690d28", + "packages/webui/src/transport/fetch-transport.ts|54f55a5b3fbeb84567f48f584655eb3b43dcfd2d74ac2255a99acec4164acfb3", + "packages/webui/src/transport/fetch-transport.ts|730169ef6e7656bca0cd2ed9683d7c1ef47da37c59fb785bc28f6c4890afd8dc", + "packages/webui/src/transport/fetch-transport.ts|7e7ef809ce47461cc26e60e85645213225503347bf8d6d723cf50083ac82f071", + "packages/webui/src/transport/fetch-transport.ts|9f6aa9e0ae6213f44b38f412cf19415c9e57b536918222478e91cc182c45b116", + "packages/webui/src/transport/fetch-transport.ts|c9240e268321c812fafcc26c50df2b8aa09d20ec53a7a1d63c95aa9856d212a0", + "packages/webui/src/transport/fetch-transport.ts|d4f89083efb689206d74be9cc8e670074b134f89178bb16aaf5e6047010e9288", + "packages/webui/src/transport/fetch-transport.ts|ead52fe798e21955e53d2180c3a77b23859e486d45cf460ce468552c35debfe8", + "packages/webui/src/transport/message-bridge-transport.ts|0b1d90fefe0a625a69bd9c26e770288eaa3deb5a0c55b187355b3ed5380bacfd", + "packages/webui/src/transport/message-bridge-transport.ts|143f11ac6fd6fffdbf1287578476c876e2bdb7d008005c6fd90d3a0a5e3b348f", + "packages/webui/src/transport/message-bridge-transport.ts|28355072c3cb64c0c717a84dc72597b65b1ab2372af50435856e9ec0648b13b6", + "packages/webui/src/transport/message-bridge-transport.ts|66735de67c49a63473ddfd2b1a5be013a92fd4ac1c380cb356284cd1b3485af0", + "packages/webui/src/transport/message-bridge-transport.ts|7027b99303734a2103ca320418848a9af81fc9715333fcff4cc1089d77d5050c", + "packages/webui/src/transport/message-bridge-transport.ts|afb18e42012685d2fea5002a38827a0995a564237e3f76f4d96de3b1ef754653", + "packages/webui/src/transport/message-bridge-transport.ts|d0d9d6bbff77d74f0e355b7d3237292ab8a8f7a70219d697d4f5291cb4abc5fc", + "packages/webui/src/transport/message-bridge-transport.ts|d2902d482e2086a72cb7eb4d998081cebe03febae32eb6c4f50f0aac3ff21880", + "packages/webui/src/transport/message-bridge-transport.ts|e3ef4080e855bb2ed1fdcc5305d7bb1a929c59845e3af77db0e68f7efd7034a2", + "packages/webui/src/transport/message-bridge-transport.ts|e4d03bb19c62bccd17cd453471ca4abd107813ef9d2eaf043e998eef115266cc", + "packages/webui/src/transport/message-bridge-transport.ts|ea7a309efcd44261136e198aa287b693f8fc2601a1b2f58f2a4de4a7441fa4c5", + "packages/webui/src/transport/types.ts|1f3e7a8ed1f2477baf0f0095b8a0b1bc5c3d7c50610103b42722c4db7a8348d9", + "packages/webui/src/transport/types.ts|4b86c270aa46cb8322316c1dbe4fdb94e05f5d9fdfe6ab5e47338f198bf7ef44", + "packages/webui/src/transport/types.ts|4cda772a38f33a16a2dd16c7a6c477504d698ef411019cb42db87b4e63506d53", + "packages/webui/src/transport/types.ts|56e4bad7084d6206549084fa42c70f173ad48319079bd67d02ba1bb8219bc5fe", + "packages/webui/src/transport/types.ts|8ece774f0c3e0cfecd92e424b6219d86743359a6db290cb74cd3ba7c4673e8c1", + "packages/webui/src/transport/types.ts|9e0d97aaf76864c6f854e65db7dfbd92ff2a27cb23e9cf941dac1ba6d514fa57", + "packages/webui/src/transport/types.ts|a2cdfd30277ea7498eafed30c90514b807e6b2d140e2d7258bb3952bace6f55e", + "packages/webui/src/transport/types.ts|c4127ed998d779964771ade09f8eddc9b9d903d8163598dd6a44624ec3d37496", + "packages/webui/src/transport/types.ts|e4f7f4643a9527a19ee656b33128c5423e830cde6cf9649f1cdad391ca346f48", + "packages/webui/src/transport/types.ts|fb812f1e40e756ad2c71d4fb7ad5852ad0a9f12fa13b8edd39f6f23ec9b037a5", + "packages/webui/src/types.ts|07967ac2391e12b5876cc09e5a11fd26e26d99d80cb87e08bf49dc8928072dfd", + "packages/webui/src/types.ts|128579e50cc47449dd17bdcdad6bccd0c6bc58ea3491036c4ef567677492a493", + "packages/webui/src/types.ts|7858fafd58dcc46b2e0401ae9bdc7401caac7cd78f4dbef240d3b85221e05463", + "packages/webui/src/types.ts|87d4548131459466de40f95d5d3393baeeee38125b79b953ebe912116ac9527a", + "packages/webui/src/types.ts|8e016781217df33d15e18e370ca0954960d3d24e5a7242e773c8254a04ed1e47", + "packages/webui/src/types.ts|b919bc11a1d46c19fcb6a40e233fdfd4db45c616ecae6178159a951cfd1c462b", + "packages/webui/src/types.ts|d467e23257c37a75f88863b7e74557c467f127b6d0b93acb648498f0e6f847e4" +]