@chatcode/chatcode-cli 3.0.4-rc.7 → 3.0.5-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.i18n.yaml +6 -6
- package/README.md +10 -4
- package/README.zh.md +10 -4
- package/lib/bin.js +23 -9
- package/lib/{command-errors-Ca64Lgba.js → command-errors-CsRCh0gk.js} +12 -12
- package/lib/{command-trees-CVc4Xu_z.js → command-trees-CD_43rxX.js} +2 -2
- package/lib/{component-identity-6aEut5Yt.js → component-identity-DGA2-TeB.js} +3 -3
- package/lib/{dump-config-ZzrfvtnX.js → dump-config-D8kXfdTs.js} +1 -1
- package/lib/dump-config-DuCc-QB7.js +2 -0
- package/lib/{dump-config-schema-BlO-eZ-J.js → dump-config-schema-CtZbroi6.js} +2 -2
- package/lib/{extension-events-C7MUpqVE.js → extension-events-D0BjYRqT.js} +21 -21
- package/lib/{host-access-CLbyAGT5.js → host-access-DLJjuR07.js} +1 -1
- package/lib/{keymap-82JwLLHe.js → keymap-C4cs2IBN.js} +2 -2
- package/lib/{plugin-BlQlWIR5.js → plugin-CGtTByud.js} +801 -456
- package/lib/{plugin-BZdazFXS.js → plugin-CYw-MBRn.js} +1 -1
- package/lib/{profile-boot-B0aEEQIR.js → profile-boot-CffsubnV.js} +7 -7
- package/lib/profile-boot.js +1 -1
- package/lib/{scenes-BNS0ZFyQ.js → scenes-CbAGK5Uy.js} +3 -3
- package/lib/{settings-sections-CXH24cu5.js → settings-sections-DYKDa04e.js} +3 -3
- package/lib/{statusBarSettings-BAMzn8fX.js → statusBarSettings-T1m8xad4.js} +3 -3
- package/lib/{themes-DXUIvP7m.js → themes-BY2ui1Dv.js} +12 -12
- package/lib/tui-compat-command-trees.js +1 -1
- package/lib/tui-compat-extensions.js +3 -3
- package/lib/tui-compat-plugin-host.js +5 -5
- package/lib/tui-compat-scenes.js +1 -1
- package/lib/tui-compat-settings-sections.js +1 -1
- package/lib/tui-compat-working-activity.js +1 -1
- package/lib/tui-compat-workspaces.js +1 -1
- package/lib/tui-compat.js +7 -7
- package/lib/types/bin.d.ts +9 -0
- package/lib/types/tui-compat.d.ts +1 -1
- package/lib/types/web-instance-process.d.ts +20 -0
- package/lib/{web-instance-DbP7IHPv.js → web-instance-D_Ppi2Zo.js} +176 -14
- package/lib/{web-instance-B0jec7cq.js → web-instance-amvCJWnq.js} +1 -1
- package/lib/{workspaces-CUJXNU5W.js → workspaces-D5VKbESy.js} +2 -2
- package/package.json +28 -29
- package/runtime/manifest.json +2 -2
- package/runtime/node_modules/@deepseek-ai/dsh-agent-default-model/lib/index.js +7 -3
- package/runtime/node_modules/@deepseek-ai/dsh-api-session-controller/lib/client.js +11 -3
- package/runtime/node_modules/@deepseek-ai/dsh-api-session-controller/lib/types/client/contract/snapshot.d.ts +1 -0
- package/runtime/node_modules/@deepseek-ai/dsh-api-session-controller/lib/types/client/sessions/assistant-stream.d.ts +2 -0
- package/runtime/node_modules/@deepseek-ai/dsh-api-session-controller/lib/types/client/sessions/assistant-stream.js +4 -0
- package/runtime/node_modules/@deepseek-ai/dsh-api-session-controller/lib/types/client/sessions/session.js +10 -3
- package/runtime/node_modules/@deepseek-ai/dsh-app-boot/lib/index.js +32 -11
- package/runtime/node_modules/@deepseek-ai/dsh-atomic-write/lib/index.js +62 -11
- package/runtime/node_modules/@deepseek-ai/dsh-atomic-write/lib/types/darwin-lock.d.ts +7 -0
- package/runtime/node_modules/@deepseek-ai/dsh-atomic-write/lib/types/index.d.ts +7 -2
- package/runtime/node_modules/@deepseek-ai/dsh-atomic-write/lib/types/linux-lock.d.ts +1 -1
- package/runtime/node_modules/@deepseek-ai/dsh-client-locale/lib/client.js +7 -7
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-agent-preset/lib/client.js +62 -62
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-approval/lib/client.js +10 -10
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-attachment/lib/client.js +49 -49
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-chat/lib/client.js +204 -204
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-commands/lib/client.js +16 -16
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-conversation/lib/client.js +159 -157
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-conversation/lib/types/client/service.d.ts +4 -2
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-cordis/lib/client.js +74 -74
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-deliverables/lib/client.js +129 -123
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-deliverables/lib/index.js +19 -14
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-deliverables/lib/types/changes.d.ts +2 -2
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-deliverables/lib/types/client/Deliverables.d.ts +1 -2
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-deliverables/lib/types/client/locales.d.ts +2 -1
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-deliverables/lib/types/client/present-open.d.ts +1 -1
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-deliverables/package.json +2 -4
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-directory-picker-browse/lib/client.js +39 -39
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-goal/lib/client.js +16 -16
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-input-trigger/lib/client.js +23 -23
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-jobs/lib/client.js +37 -37
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-layout/lib/client.js +9 -9
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-message-feedback/lib/client.js +12 -12
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-model-selection/lib/client.js +119 -32
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-model-selection/lib/types/client/catalog.d.ts +13 -0
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-model-selection/lib/types/client/directory.d.ts +2 -0
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-model-selection/lib/types/client/effort-preferences.d.ts +20 -0
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-model-selection/lib/types/client/slots.d.ts +2 -1
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-open-in-app/lib/client.js +8 -8
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-permission-presets/lib/client.js +18 -18
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-plan/lib/client.js +22 -22
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-plugin-manager/lib/client.js +128 -128
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-schedule/lib/client.js +182 -182
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-settings-account/lib/client.js +130 -130
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-settings-general/lib/client.js +50 -50
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-settings-models/lib/client.js +88 -88
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-settings-plugin-inventory/lib/client.js +36 -36
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-settings-plugins/lib/client.js +13 -13
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-settings-subagent/lib/client.js +27 -27
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-shortcuts/lib/client.js +42 -42
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-sidebar/lib/client.js +44 -46
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-sidebar-browser/lib/client.js +25 -25
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-sidebar-documentpreview/lib/client.excel.js +9 -9
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-sidebar-documentpreview/lib/client.js +70 -70
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-sidebar-documentpreview/lib/client.pdf.js +9 -9
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-sidebar-files/lib/client.js +18 -18
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-sidebar-right/lib/client.js +26 -26
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-sidebar-terminal/lib/client.js +16 -16
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-sidebar-terminal/lib/client.terminal.js +11 -11
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-skill/lib/client.js +20 -20
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-subagent/lib/client.js +37 -37
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-theme/lib/client.js +27 -27
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-tool/lib/client.js +95 -95
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-trajectory/lib/client.js +197 -197
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-user-questions/lib/client.js +49 -49
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-workflow-run/lib/client.js +24 -24
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-workspace/lib/client.js +656 -152
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-workspace/lib/types/client/ArchivedSessions.d.ts +9 -2
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-workspace/lib/types/client/locales.d.ts +46 -0
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-workspace/lib/types/client/session-actions/DeleteSession.d.ts +9 -10
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-workspace/lib/types/client/session-actions/deletion.d.ts +57 -0
- package/runtime/node_modules/@deepseek-ai/dsh-client-ui-workspace/package.json +2 -0
- package/runtime/node_modules/@deepseek-ai/dsh-experimental-client-ui-agent-team/lib/client.js +32 -32
- package/runtime/node_modules/@deepseek-ai/dsh-experimental-client-ui-voice-input/lib/client.js +24 -24
- package/runtime/node_modules/@deepseek-ai/dsh-llm-deepseek/lib/index.js +899 -453
- package/runtime/node_modules/@deepseek-ai/dsh-llm-deepseek/lib/types/adapter.d.ts +4 -20
- package/runtime/node_modules/@deepseek-ai/dsh-llm-deepseek/lib/types/chat-completions/adapter.d.ts +8 -0
- package/runtime/node_modules/@deepseek-ai/dsh-llm-deepseek/lib/types/chat-completions/serialize.d.ts +10 -0
- package/runtime/node_modules/@deepseek-ai/dsh-llm-deepseek/lib/types/chat-completions/sse.d.ts +24 -0
- package/runtime/node_modules/@deepseek-ai/dsh-llm-deepseek/lib/types/chat-completions/translate.d.ts +37 -0
- package/runtime/node_modules/@deepseek-ai/dsh-llm-deepseek/lib/types/chat-completions/types.d.ts +159 -0
- package/runtime/node_modules/@deepseek-ai/dsh-llm-deepseek/lib/types/file-store.d.ts +3 -0
- package/runtime/node_modules/@deepseek-ai/dsh-llm-deepseek/lib/types/files-api.d.ts +4 -0
- package/runtime/node_modules/@deepseek-ai/dsh-llm-deepseek/lib/types/index.d.ts +1 -0
- package/runtime/node_modules/@deepseek-ai/dsh-llm-deepseek/lib/types/protocol-adapter.d.ts +41 -0
- package/runtime/node_modules/@deepseek-ai/dsh-llm-deepseek/lib/types/protocol.d.ts +35 -0
- package/runtime/node_modules/@deepseek-ai/dsh-llm-deepseek/lib/types/transport.d.ts +2 -1
- package/runtime/node_modules/@deepseek-ai/dsh-llm-deepseek/lib/types/types.d.ts +2 -2
- package/runtime/node_modules/@deepseek-ai/dsh-mcp-client/lib/index.js +5 -4
- package/runtime/node_modules/@deepseek-ai/dsh-session-log-export/lib/client.js +4 -4
- package/runtime/node_modules/@deepseek-ai/dsh-session-log-export/lib/index.js +1 -1
- package/runtime/node_modules/@deepseek-ai/dsh-session-persistence-jsonl/lib/index.js +2 -2
- package/runtime/node_modules/@deepseek-ai/dsh-tool-cordis/lib/types/api-catalog.js +12 -10
- package/runtime/node_modules/@deepseek-ai/dsh-workspace-changes/lib/index.js +208 -39
- package/runtime/node_modules/@deepseek-ai/dsh-workspace-changes/lib/types/archive.d.ts +47 -0
- package/runtime/node_modules/@deepseek-ai/dsh-workspace-changes/lib/types/archive.js +129 -0
- package/runtime/node_modules/@deepseek-ai/dsh-workspace-changes/lib/types/index.d.ts +2 -0
- package/runtime/node_modules/@deepseek-ai/dsh-workspace-changes/lib/types/index.js +31 -8
- package/runtime/node_modules/@deepseek-ai/dsh-workspace-changes/lib/types/recorder.d.ts +7 -2
- package/runtime/node_modules/@deepseek-ai/dsh-workspace-changes/lib/types/recorder.js +35 -19
- package/runtime/node_modules/@deepseek-ai/dsh-workspace-changes/lib/types/types.d.ts +11 -10
- package/runtime/node_modules/@deepseek-ai/dsh-workspace-changes/package.json +1 -0
- package/scripts/link-embedded-runtime.mjs +1 -1
- package/lib/dump-config-CDixiJNt.js +0 -2
- package/lib/{home-migration-BjDmRwBB.js → home-migration-lRjtl2fP.js} +1 -1
- package/lib/{startup-diagnostics-C_hRCp-q.js → startup-diagnostics-4mLHYTFc.js} +1 -1
package/README.i18n.yaml
CHANGED
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
# After editing either side, bring the other along and re-record with:
|
|
4
4
|
# pnpm run verify-translation-pairing --write apps/cli/README.md
|
|
5
5
|
/chatcode-chatcode-cli:
|
|
6
|
-
en:
|
|
7
|
-
zh:
|
|
6
|
+
en: a39e0c3fa4d68552
|
|
7
|
+
zh: 3de7226b6db049d0
|
|
8
8
|
/chatcode-chatcode-cli/entry-modes:
|
|
9
|
-
en:
|
|
10
|
-
zh:
|
|
9
|
+
en: 39dc966502577d60
|
|
10
|
+
zh: 22617a0ccf5b7c40
|
|
11
11
|
/chatcode-chatcode-cli/app-arguments:
|
|
12
12
|
en: 57439d3d02b1c963
|
|
13
13
|
zh: 5f86d52b4790a834
|
|
@@ -18,5 +18,5 @@
|
|
|
18
18
|
en: 3a40ddc44e55f79c
|
|
19
19
|
zh: 8d3949132e1ef93c
|
|
20
20
|
/chatcode-chatcode-cli/development:
|
|
21
|
-
en:
|
|
22
|
-
zh:
|
|
21
|
+
en: 93159e4c162ccd4a
|
|
22
|
+
zh: d01f7900ae14ba47
|
package/README.md
CHANGED
|
@@ -4,10 +4,12 @@ English | [中文](README.zh.md)
|
|
|
4
4
|
|
|
5
5
|
`chatcode-cli` is the formal launcher and `cco` is its short form; both commands share one parser and start the TUI/CLI profile when invoked without arguments. Profiles are ordered stacks of plugin-bundle patch layers under the user's own overrides. SDK and ACP are profiles, not separate public bins. The Python runtime wheel packages the same launcher; the SDK defaults to `sdk`, and the minimal example selects `sdk-minimal`. [`src/args.ts`](src/args.ts) owns the command grammar, and [`src/bin.ts`](src/bin.ts) loads only the selected runner. Invalid commands, options from another mode, and fatal configuration or boot failures exit nonzero.
|
|
6
6
|
|
|
7
|
-
The bundled TUI supports Harness live-Config settings directly: `/settings`, `/statusline`, `/keybindings`, and provider configuration use the active profile settings service, with live display changes preserving the current session. Builds use the adjacent `
|
|
7
|
+
The bundled TUI supports Harness live-Config settings directly: `/settings`, `/statusline`, `/keybindings`, and provider configuration use the active profile settings service, with live display changes preserving the current session. Builds use the adjacent `cco-tui` repository; published CLI packages carry its compiled frontend, standard libraries and private JavaScript dependencies in the embedded runtime.
|
|
8
8
|
|
|
9
9
|
## Entry modes
|
|
10
10
|
|
|
11
|
+
Every launcher invocation replaces `CHATCODE_CLI_LAUNCH_ID` and `CHATCODE_CLI_LAUNCH_TIME` in the process environment before capturing the immutable launch snapshot. The shared ChatCode Host plugin uses these values and `CHATCODE_CLI_PRODUCT_VERSION` to report successful authenticated `cco` and `cco web` startups independently of conversation Sessions. Child launchers receive fresh startup identities; configuration reloads retain the current identity. Set `reporting.launch.enabled: false` on the ChatCode configuration row to disable startup reporting.
|
|
12
|
+
|
|
11
13
|
| Command | Purpose |
|
|
12
14
|
|---|---|
|
|
13
15
|
| `chatcode-cli` / `cco` | Start the default TUI/CLI profile. |
|
|
@@ -26,7 +28,7 @@ The bundled TUI supports Harness live-Config settings directly: `/settings`, `/s
|
|
|
26
28
|
|
|
27
29
|
The invoking directory is the default workspace root. The `web`, `headless`, `sdk`, `sdk-minimal`, and `acp` profiles auto-initialize on first use from shipped templates. Create another profile at an unused, non-shipped name with `--from-default-profile`, or initialize a base-backed profile through `chatcode-cli plugin`. The `desktop` name is reserved for the Electron-owned profile, so the CLI rejects boot, config-dump, and plugin-management requests for it.
|
|
28
30
|
|
|
29
|
-
`cco web` and `pnpm cco web` default to `on`. The first launch opens its token-authenticated URL after readiness. Subsequent launches in the same ChatCode CLI home verify and reopen the existing instance using its current authenticated URL, print that URL again, and exit without binding a second port. `off` waits for the registered instance's port to close; it never kills an unrelated listener by port or PID. A private registration lives under `$CHATCODE_CLI_HOME/web/instance.json`;
|
|
31
|
+
`cco web` and `pnpm cco web` default to `on`. The first launch opens its token-authenticated URL after readiness. Subsequent launches in the same ChatCode CLI home verify and reopen the existing instance using its current authenticated URL, print that URL again, and exit without binding a second port. `off` waits for the registered instance's port to close; it never kills an unrelated listener by port or PID. A private registration lives under `$CHATCODE_CLI_HOME/web/instance.json`; Windows, macOS, and Linux automatically recover confirmed exits and reused PIDs without manual file removal. A running or unverified owner remains protected. Explicit `--port 0` remains an isolated random-port launch. `--no-open` and SSH browser suppression remain supported; changing a running instance's flags or overlays requires stopping it first. The URL carries access permission and stays valid only for that server process: do not share it.
|
|
30
32
|
|
|
31
33
|
## App arguments
|
|
32
34
|
|
|
@@ -92,11 +94,15 @@ The [CLI behavior reference](reference/README.md) owns exact layer precedence, f
|
|
|
92
94
|
|
|
93
95
|
## Development
|
|
94
96
|
|
|
97
|
+
Web registrations retain native process creation identities: Windows uses `GetProcessTimes` and a zero-time process-handle wait; macOS uses `proc_pidinfo` creation microseconds and zombie state; Linux uses `/proc` boot ID, start ticks, and zombie state. Linux legacy timing uses `sysconf(_SC_CLK_TCK)`. For a legacy registration without identity, a still-present PID is treated as reused only if its process started more than two seconds after every registration-file timestamp. Denied inspection, unavailable creation timing, and ambiguous timestamps keep the registration protected. [Native owner tests](tests/web-instance-process.native.spec.ts) and [built lifecycle tests](tests/web-instance.expected.e2e.ts) run on all three platforms and cover forced exit, PID reuse, and automatic restart.
|
|
98
|
+
|
|
95
99
|
Production runs require built package and frontend artifacts. From the repository root, run `pnpm run build` separately, then use `pnpm cco <args...>` to run the TypeScript entry and forward every argument; the [source-execution reference](reference/README.md#source-execution) owns the module-resolution contract.
|
|
96
100
|
|
|
97
|
-
|
|
101
|
+
`pnpm plugins:local` links sibling plugins and comments out only the npm patches in the `chatcode-plugin-patches` block of `pnpm-workspace.yaml`. `pnpm plugins:registry` restores those patch declarations. Patch files and unrelated patches stay unchanged, and pnpm still rejects other unused patches. An installation failure restores the previous source and patch configuration.
|
|
102
|
+
|
|
103
|
+
Run `pnpm exec vitest run apps/cli/tests/chatcode-rate-limit.spec.ts apps/cli/tests/permission-bypass.spec.ts` from the repository root to check retry and launch-permission behavior. The retry tests mount the installed `@chatcode/cco-llm-chatcode-config` plugin through its public package entry and use fixture responses for catalog and model HTTP requests.
|
|
98
104
|
|
|
99
|
-
The TUI bridge validates its declared live fields with the launcher's schema runtime, including volatile metadata emitted by older TUI schema versions. This keeps settings editable without replacing the running session. The launcher also normalizes the pinned sidebar's legacy schema before activation, preserving its package identity and browser module while live edits update running values.
|
|
105
|
+
The TUI bridge validates its declared live fields with the launcher's schema runtime, including volatile metadata emitted by older TUI schema versions. It retains transform callbacks and their closures so saved `pageMargin` presets and custom `NxM` values remain valid at startup and during live edits. This keeps settings editable without replacing the running session. The launcher also normalizes the pinned sidebar's legacy schema before activation, preserving its package identity and browser module while live edits update running values.
|
|
100
106
|
|
|
101
107
|
The published CLI directly pins every Harness runtime package referenced by the base/Web bundles and every required peer of its bundled ChatCode plugins. Keep those entries on the same Harness release when publishing: npm's global installer does not preserve pnpm workspace peer unification, and otherwise may hoist an older ABI beside the current runtime.
|
|
102
108
|
|
package/README.zh.md
CHANGED
|
@@ -4,10 +4,12 @@
|
|
|
4
4
|
|
|
5
5
|
`chatcode-cli` 是正式启动命令,`cco` 是其简写;两者共用同一解析器,且无参数时都启动 TUI/CLI profile。profile 由多个插件组合包 patch 层按顺序叠加而成,其上再应用用户自己的覆盖配置。SDK 与 ACP(Agent Client Protocol)都是 profile,而不是独立的公开可执行命令。Python 运行时 wheel 包中也包含同一个启动器;SDK 默认使用 `sdk`,极简示例选择 `sdk-minimal`。[`src/args.ts`](src/args.ts) 负责命令语法,[`src/bin.ts`](src/bin.ts) 只加载选中的运行器。无效命令、来自其他模式的选项,以及致命的配置或启动错误都会以非零状态退出。
|
|
6
6
|
|
|
7
|
-
随附的 TUI 直接支持 Harness 动态配置设置:`/settings`、`/statusline`、`/keybindings` 及供应商配置使用当前 profile 的设置服务,显示偏好即时更新且保留当前会话。构建使用相邻的 `
|
|
7
|
+
随附的 TUI 直接支持 Harness 动态配置设置:`/settings`、`/statusline`、`/keybindings` 及供应商配置使用当前 profile 的设置服务,显示偏好即时更新且保留当前会话。构建使用相邻的 `cco-tui` 仓库;发布的 CLI 包在嵌入 runtime 中包含其编译前端、标准库和独立的 JavaScript 依赖。
|
|
8
8
|
|
|
9
9
|
## 入口模式
|
|
10
10
|
|
|
11
|
+
每次启动器调用都会在捕获不可变启动快照前,替换进程环境中的 `CHATCODE_CLI_LAUNCH_ID` 和 `CHATCODE_CLI_LAUNCH_TIME`。共享 ChatCode Host 插件使用这两个值与 `CHATCODE_CLI_PRODUCT_VERSION` 上报成功启动且账号有效的 `cco` 和 `cco web`,独立于聊天 Session。子启动器获得新的启动标识,配置热重载保留当前标识。在 ChatCode 配置行设置 `reporting.launch.enabled: false` 可关闭启动上报。
|
|
12
|
+
|
|
11
13
|
| 命令 | 用途 |
|
|
12
14
|
|---|---|
|
|
13
15
|
| `chatcode-cli` / `cco` | 启动默认 TUI/CLI profile。 |
|
|
@@ -26,7 +28,7 @@
|
|
|
26
28
|
|
|
27
29
|
运行命令时所在的目录将作为默认 workspace 根目录。`web`、`headless`、`sdk`、`sdk-minimal` 和 `acp` profile 在首次使用时会从随附模板自动初始化。使用 `--from-default-profile` 可以基于这些模板之一,在尚未使用的非内置名称处创建其他 profile;通过 `chatcode-cli plugin` 则可以初始化一个以 base 为基础的 profile。`desktop` 名称保留给 Electron 持有的 profile,因此 CLI(命令行界面)会拒绝针对它的启动、配置 dump 和插件管理请求。
|
|
28
30
|
|
|
29
|
-
`cco web` 和 `pnpm cco web` 默认为 `on`。首次启动在服务就绪后打开带认证 token 的 URL;同一 ChatCode CLI 用户目录中的后续启动会验证已有实例,获取并再次打印其当前有效认证链接,打开网页后退出,不绑定第二个端口。`off` 等待登记实例的端口关闭,不会按端口或 PID 杀死无关服务。私有登记位于 `$CHATCODE_CLI_HOME/web/instance.json
|
|
31
|
+
`cco web` 和 `pnpm cco web` 默认为 `on`。首次启动在服务就绪后打开带认证 token 的 URL;同一 ChatCode CLI 用户目录中的后续启动会验证已有实例,获取并再次打印其当前有效认证链接,打开网页后退出,不绑定第二个端口。`off` 等待登记实例的端口关闭,不会按端口或 PID 杀死无关服务。私有登记位于 `$CHATCODE_CLI_HOME/web/instance.json`:Windows、macOS 和 Linux 均会自动恢复已确认退出或 PID 被复用的实例,无需手动删文件。仍在运行或无法确认身份的所有者继续受到保护。显式 `--port 0` 仍是隔离的随机端口启动。保留 `--no-open` 与 SSH 下不自动打开浏览器的行为;修改运行实例的参数或覆盖层需先关闭。链接包含访问权限,仅在对应服务进程存活期间有效,请勿分享。
|
|
30
32
|
|
|
31
33
|
## 应用参数
|
|
32
34
|
|
|
@@ -92,11 +94,15 @@ TUI 等待共用默认模型服务就绪后才创建首个会话。ChatCode 模
|
|
|
92
94
|
|
|
93
95
|
## 开发
|
|
94
96
|
|
|
97
|
+
Web 登记会保存原生进程创建身份:Windows 使用 `GetProcessTimes` 和零等待的进程句柄检查;macOS 使用 `proc_pidinfo` 返回的创建微秒时间与僵尸状态;Linux 使用 `/proc` 的开机标识、启动时钟计数与僵尸状态。Linux 旧登记的时间换算采用 `sysconf(_SC_CLK_TCK)`。对于缺少创建身份的旧版登记,仅在仍存在的 PID 所属进程的启动时间比登记文件的所有时间戳均晚两秒以上时,才判定为 PID 复用。检查被拒绝、创建时间不可用或时间戳含糊时继续保护登记。[原生所有者测试](tests/web-instance-process.native.spec.ts)和[构建后生命周期测试](tests/web-instance.expected.e2e.ts)在三个平台运行,覆盖强制退出、PID 复用和自动重启。
|
|
98
|
+
|
|
95
99
|
生产运行需要已构建的包与前端产物。请在仓库根目录单独运行 `pnpm run build`,然后使用 `pnpm cco <args...>` 运行 TypeScript 入口并转发所有参数;模块解析约定以[源码执行参考](reference/README.zh.md#source-execution)为准。
|
|
96
100
|
|
|
97
|
-
|
|
101
|
+
`pnpm plugins:local` 链接兄弟仓库插件,并仅注释 `pnpm-workspace.yaml` 中 `chatcode-plugin-patches` 区块内的 npm 补丁。`pnpm plugins:registry` 恢复这些补丁声明。补丁文件及其他补丁保持不变,pnpm 仍会拒绝其他未使用的补丁。安装失败时恢复原有来源和补丁配置。
|
|
102
|
+
|
|
103
|
+
在仓库根目录运行 `pnpm exec vitest run apps/cli/tests/chatcode-rate-limit.spec.ts apps/cli/tests/permission-bypass.spec.ts`,检查重试与启动权限行为。重试测试通过公开包入口挂载已安装的 `@chatcode/cco-llm-chatcode-config` 插件,并为目录与模型 HTTP 请求提供 fixture 响应。
|
|
98
104
|
|
|
99
|
-
TUI 适配层使用启动器自身的 schema 运行时校验其声明的动态配置字段,包括旧版 TUI schema 输出的 volatile
|
|
105
|
+
TUI 适配层使用启动器自身的 schema 运行时校验其声明的动态配置字段,包括旧版 TUI schema 输出的 volatile 元数据。它保留转换回调及其闭包,使已保存的 `pageMargin` 预设和自定义 `NxM` 值在启动及实时编辑时均可正常校验,从而保持设置可编辑且不替换正在运行的会话。启动器也在激活前规范化固定版本侧边栏的旧 schema,保留其包标识与浏览器模块,使实时编辑更新运行中的值。
|
|
100
106
|
|
|
101
107
|
发布版 CLI 会直接固定 base/Web 组合包实际引用的所有 Harness 运行时包,以及随附 ChatCode 插件的全部必需 peer。发布时必须让这些依赖保持在同一个 Harness 版本:npm 全局安装不会保留 pnpm workspace 对 peer 的统一解析,否则可能把旧 ABI 提升到顶层并与当前运行时混用。
|
|
102
108
|
|
package/lib/bin.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { i as synchronizeLegacyHomeEnvironment, r as resolveChatCodeCliHome } from "./chatcode-home-B93iESZd.js";
|
|
3
|
-
import { n as startStartupPhase, t as reportStartupFailure } from "./startup-diagnostics-
|
|
3
|
+
import { n as startStartupPhase, t as reportStartupFailure } from "./startup-diagnostics-4mLHYTFc.js";
|
|
4
4
|
import { readFileSync } from "node:fs";
|
|
5
|
+
import { randomUUID } from "node:crypto";
|
|
5
6
|
import { fileURLToPath } from "node:url";
|
|
6
7
|
import { StartupError, loadLayeredEnv } from "@deepseek-ai/dsh-app-boot";
|
|
7
8
|
import { Command, CommanderError, InvalidArgumentError } from "commander";
|
|
@@ -222,6 +223,10 @@ function parseChatCodeCliArgs(argv, version) {
|
|
|
222
223
|
/* v8 ignore file -- built-bin acceptance exercises this self-executing dispatch. */
|
|
223
224
|
/** Process environment key used to hand the main package version to child/profile runtimes. */
|
|
224
225
|
const CHATCODE_CLI_PRODUCT_VERSION_ENV = "CHATCODE_CLI_PRODUCT_VERSION";
|
|
226
|
+
/** Process-layer startup identity; a new launcher replaces inherited values. */
|
|
227
|
+
const CHATCODE_CLI_LAUNCH_ID_ENV = "CHATCODE_CLI_LAUNCH_ID";
|
|
228
|
+
/** ISO timestamp captured before profile loading or interactive login. */
|
|
229
|
+
const CHATCODE_CLI_LAUNCH_TIME_ENV = "CHATCODE_CLI_LAUNCH_TIME";
|
|
225
230
|
function readVersion() {
|
|
226
231
|
const manifest = JSON.parse(readFileSync(fileURLToPath(new URL("../package.json", import.meta.url)), "utf8"));
|
|
227
232
|
return typeof manifest.version === "string" ? manifest.version : "0.0.0";
|
|
@@ -237,6 +242,14 @@ function initializeProductVersionEnvironment(version, environment = process.env)
|
|
|
237
242
|
environment[CHATCODE_CLI_PRODUCT_VERSION_ENV] = version;
|
|
238
243
|
}
|
|
239
244
|
/**
|
|
245
|
+
* Replace inherited startup identity before the launcher captures its environment snapshot.
|
|
246
|
+
* @param environment - Process-layer environment receiving the fresh UUID and original ISO timestamp.
|
|
247
|
+
*/
|
|
248
|
+
function initializeLaunchIdentityEnvironment(environment = process.env) {
|
|
249
|
+
environment[CHATCODE_CLI_LAUNCH_ID_ENV] = randomUUID();
|
|
250
|
+
environment[CHATCODE_CLI_LAUNCH_TIME_ENV] = (/* @__PURE__ */ new Date()).toISOString();
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
240
253
|
* Run the public ChatCode CLI command-line interface.
|
|
241
254
|
* @returns a promise that settles when the selected command mode finishes.
|
|
242
255
|
*/
|
|
@@ -244,13 +257,14 @@ async function runCli() {
|
|
|
244
257
|
initializeProcessIdentity();
|
|
245
258
|
const version = readVersion();
|
|
246
259
|
initializeProductVersionEnvironment(version);
|
|
260
|
+
initializeLaunchIdentityEnvironment();
|
|
247
261
|
const invocation = parseChatCodeCliArgs(process.argv.slice(2), version);
|
|
248
262
|
switch (invocation.mode) {
|
|
249
263
|
case "profile": {
|
|
250
264
|
const finishLegacyProbe = startStartupPhase("legacy-home-probe");
|
|
251
265
|
const legacyHome = process.env.DSH_HOME?.trim();
|
|
252
266
|
if (!isLegacyPrintInvocation(invocation) && (process.env.CHATCODE_CLI_HOME?.trim() || legacyHome === void 0 || legacyHome === "")) {
|
|
253
|
-
const { hasLegacyHomeData, resolveHomeMigrationRoots } = await import("./home-migration-
|
|
267
|
+
const { hasLegacyHomeData, resolveHomeMigrationRoots } = await import("./home-migration-lRjtl2fP.js");
|
|
254
268
|
if (await hasLegacyHomeData(resolveHomeMigrationRoots())) process.stderr.write("ChatCode CLI detected legacy user data. Preview the non-destructive migration with \"chatcode-cli migrate --dry-run\"; nothing is migrated automatically.\n");
|
|
255
269
|
}
|
|
256
270
|
finishLegacyProbe();
|
|
@@ -272,7 +286,7 @@ async function runCli() {
|
|
|
272
286
|
});
|
|
273
287
|
};
|
|
274
288
|
if (invocation.profile === "web") {
|
|
275
|
-
const { runManagedWeb } = await import("./web-instance-
|
|
289
|
+
const { runManagedWeb } = await import("./web-instance-amvCJWnq.js");
|
|
276
290
|
const { launchedThroughSsh } = await import("@deepseek-ai/dsh-launch-environment");
|
|
277
291
|
await runManagedWeb({
|
|
278
292
|
home: resolveChatCodeCliHome(),
|
|
@@ -293,7 +307,7 @@ async function runCli() {
|
|
|
293
307
|
});
|
|
294
308
|
} else await start(void 0, invocation.args);
|
|
295
309
|
} catch (error) {
|
|
296
|
-
const { WebUsageError } = await import("./web-instance-
|
|
310
|
+
const { WebUsageError } = await import("./web-instance-amvCJWnq.js");
|
|
297
311
|
if (error instanceof WebUsageError) {
|
|
298
312
|
process.exitCode = error.exitCode;
|
|
299
313
|
break;
|
|
@@ -309,7 +323,7 @@ async function runCli() {
|
|
|
309
323
|
break;
|
|
310
324
|
}
|
|
311
325
|
case "migrate": {
|
|
312
|
-
const { applyHomeMigration, formatHomeMigrationPlan, planHomeMigration, resolveHomeMigrationRoots } = await import("./home-migration-
|
|
326
|
+
const { applyHomeMigration, formatHomeMigrationPlan, planHomeMigration, resolveHomeMigrationRoots } = await import("./home-migration-lRjtl2fP.js");
|
|
313
327
|
const roots = resolveHomeMigrationRoots();
|
|
314
328
|
const migrations = [[roots.source, roots.destination], [roots.tuiSource, roots.tuiDestination]];
|
|
315
329
|
if (!invocation.apply) {
|
|
@@ -327,17 +341,17 @@ async function runCli() {
|
|
|
327
341
|
break;
|
|
328
342
|
}
|
|
329
343
|
case "plugin": {
|
|
330
|
-
const { runPlugin } = await import("./plugin-
|
|
344
|
+
const { runPlugin } = await import("./plugin-CYw-MBRn.js");
|
|
331
345
|
process.exit(await runPlugin(invocation.profile, invocation.args));
|
|
332
346
|
break;
|
|
333
347
|
}
|
|
334
348
|
case "dump-config": {
|
|
335
|
-
const { runDumpConfig } = await import("./dump-config-
|
|
349
|
+
const { runDumpConfig } = await import("./dump-config-DuCc-QB7.js");
|
|
336
350
|
runDumpConfig(invocation.profile, invocation.defaultOnly, invocation.patches, invocation.fromDefaultProfile);
|
|
337
351
|
break;
|
|
338
352
|
}
|
|
339
353
|
case "dump-config-schema": {
|
|
340
|
-
const { runDumpConfigSchema } = await import("./dump-config-schema-
|
|
354
|
+
const { runDumpConfigSchema } = await import("./dump-config-schema-CtZbroi6.js");
|
|
341
355
|
await runDumpConfigSchema(invocation.profile, invocation.patches, invocation.fromDefaultProfile);
|
|
342
356
|
break;
|
|
343
357
|
}
|
|
@@ -346,4 +360,4 @@ async function runCli() {
|
|
|
346
360
|
}
|
|
347
361
|
if (import.meta.main) await runCli();
|
|
348
362
|
//#endregion
|
|
349
|
-
export { CHATCODE_CLI_PRODUCT_VERSION_ENV, initializeProcessIdentity, initializeProductVersionEnvironment, runCli };
|
|
363
|
+
export { CHATCODE_CLI_LAUNCH_ID_ENV, CHATCODE_CLI_LAUNCH_TIME_ENV, CHATCODE_CLI_PRODUCT_VERSION_ENV, initializeLaunchIdentityEnvironment, initializeProcessIdentity, initializeProductVersionEnvironment, runCli };
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { a as compositionRoot, i as bindCallerEffect, o as concreteService, r as assertCallerContext, t as activationContext } from "./host-access-
|
|
2
|
-
import { a as declaresPermission, d as normalizePermissionScope, i as declaresObserverScope, m as scopeCovers, n as componentIdentityOf, o as requireComponentIdentity, p as rawScopeCovers, s as requiresContract, u as INTERCEPT_PERMISSIONS } from "./component-identity-
|
|
3
|
-
import { B as createAdmissionCatalog, G as validateSetInput, H as validateDeleteOutput, K as validateSetOutput, L as TUI_DECISION_EVENT_NAMES, M as loadSpecData, N as registryEntries, P as verifyContractProfiles, S as DATA_DIR, U as validateGetInput, V as validateDeleteInput, W as validateGetOutput, X as defineProtocolDeclaration, Y as projectManifest, j as digestFile, p as cleanScalarText, q as validateMessageEvent, x as readGrantStore } from "./extension-events-
|
|
1
|
+
import { a as compositionRoot, i as bindCallerEffect, o as concreteService, r as assertCallerContext, t as activationContext } from "./host-access-DLJjuR07.js";
|
|
2
|
+
import { a as declaresPermission, d as normalizePermissionScope, i as declaresObserverScope, m as scopeCovers, n as componentIdentityOf, o as requireComponentIdentity, p as rawScopeCovers, s as requiresContract, u as INTERCEPT_PERMISSIONS } from "./component-identity-DGA2-TeB.js";
|
|
3
|
+
import { B as createAdmissionCatalog, G as validateSetInput, H as validateDeleteOutput, K as validateSetOutput, L as TUI_DECISION_EVENT_NAMES, M as loadSpecData, N as registryEntries, P as verifyContractProfiles, S as DATA_DIR, U as validateGetInput, V as validateDeleteInput, W as validateGetOutput, X as defineProtocolDeclaration, Y as projectManifest, j as digestFile, p as cleanScalarText, q as validateMessageEvent, x as readGrantStore } from "./extension-events-D0BjYRqT.js";
|
|
4
4
|
import { appendFileSync, mkdirSync, readFileSync } from "node:fs";
|
|
5
5
|
import { fileURLToPath } from "node:url";
|
|
6
6
|
import { dirname, join } from "node:path";
|
|
7
7
|
import { Service } from "@deepseek-ai/cordis";
|
|
8
8
|
import { withFileLock, writeFileAtomic } from "@deepseek-ai/dsh-atomic-write";
|
|
9
|
-
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.
|
|
9
|
+
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.22_08ea48c8555976e562c6368d51cb542b/node_modules/@chatcode/cco-tui/lib/types/plugin-spec/validate.js
|
|
10
10
|
/** Semantic validation layered on the official manifest parser/projection. */
|
|
11
11
|
const coordinateKey$1 = (coordinate) => `${coordinate.apiVersion}#${coordinate.kind}`;
|
|
12
12
|
const groupOf = (apiVersion) => apiVersion.split("/")[0] ?? "";
|
|
@@ -124,7 +124,7 @@ function validateHost(index, host) {
|
|
|
124
124
|
}
|
|
125
125
|
}
|
|
126
126
|
//#endregion
|
|
127
|
-
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.
|
|
127
|
+
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.22_08ea48c8555976e562c6368d51cb542b/node_modules/@chatcode/cco-tui/lib/types/plugin-spec/negotiate.js
|
|
128
128
|
/** Five-state admission decision using dsh-std projection and ProtocolCatalog. */
|
|
129
129
|
const coordinateKey = (ref) => `${ref.apiVersion}#${ref.kind}`;
|
|
130
130
|
function negotiate(index, manifest, host, grants = []) {
|
|
@@ -197,7 +197,7 @@ function negotiate(index, manifest, host, grants = []) {
|
|
|
197
197
|
} : { decision: "compatible" };
|
|
198
198
|
}
|
|
199
199
|
//#endregion
|
|
200
|
-
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.
|
|
200
|
+
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.22_08ea48c8555976e562c6368d51cb542b/node_modules/@chatcode/cco-tui/lib/types/plugin-spec/schema-check.js
|
|
201
201
|
/**
|
|
202
202
|
* 零依赖 JSON Schema 校验器——上游 `conformance/tests/run.js` 的 check()
|
|
203
203
|
* 的保真 TS 移植。刻意只实现 vendored schemas 用到的子集:本地 $ref、
|
|
@@ -301,7 +301,7 @@ function check(value, schema, rootSchema = schema, where = "$") {
|
|
|
301
301
|
}
|
|
302
302
|
}
|
|
303
303
|
//#endregion
|
|
304
|
-
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.
|
|
304
|
+
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.22_08ea48c8555976e562c6368d51cb542b/node_modules/@chatcode/cco-tui/lib/types/dsh-adapter/host-descriptor.js
|
|
305
305
|
/** Build the current ChatCode CLI TUI Host Descriptor from the pinned admission profile. */
|
|
306
306
|
const HOST_SUPPORTED_CONTRACTS = Object.freeze([
|
|
307
307
|
{
|
|
@@ -453,7 +453,7 @@ function buildHostDescriptor(options) {
|
|
|
453
453
|
});
|
|
454
454
|
}
|
|
455
455
|
//#endregion
|
|
456
|
-
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.
|
|
456
|
+
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.22_08ea48c8555976e562c6368d51cb542b/node_modules/@chatcode/cco-tui/lib/types/dsh-adapter/effect-ledger.js
|
|
457
457
|
/**
|
|
458
458
|
* Effect ledger (C-060): an append-only JSONL journal of plugin-visible
|
|
459
459
|
* effects at `~/.chatcode-cli/tui/effect-ledger.jsonl`, mounted by the
|
|
@@ -645,7 +645,7 @@ function resumeSequence(file) {
|
|
|
645
645
|
return max + 1;
|
|
646
646
|
}
|
|
647
647
|
//#endregion
|
|
648
|
-
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.
|
|
648
|
+
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.22_08ea48c8555976e562c6368d51cb542b/node_modules/@chatcode/cco-tui/lib/types/dsh-adapter/plugin-storage.js
|
|
649
649
|
/**
|
|
650
650
|
* storage.local contract surface (C-040, `storage.dsh/v1alpha1#LocalStorage`):
|
|
651
651
|
* per-plugin private persistence, mounted by the dsh-tui-plugin-host row as
|
|
@@ -986,7 +986,7 @@ var TuiPluginStorageRuntime = class extends Service {
|
|
|
986
986
|
}
|
|
987
987
|
};
|
|
988
988
|
//#endregion
|
|
989
|
-
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.
|
|
989
|
+
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.22_08ea48c8555976e562c6368d51cb542b/node_modules/@chatcode/cco-tui/lib/types/dsh-adapter/message-observer.js
|
|
990
990
|
/**
|
|
991
991
|
* messages.observe contract surface (C-042,
|
|
992
992
|
* `messages.dsh/v1alpha1#MessageObserver`): the host event broker, mounted
|
|
@@ -1494,7 +1494,7 @@ function observerStateFor(runtime) {
|
|
|
1494
1494
|
return state;
|
|
1495
1495
|
}
|
|
1496
1496
|
//#endregion
|
|
1497
|
-
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.
|
|
1497
|
+
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.22_08ea48c8555976e562c6368d51cb542b/node_modules/@chatcode/cco-tui/lib/types/dsh-adapter/command-attribution.js
|
|
1498
1498
|
/**
|
|
1499
1499
|
* Command ownership attribution — the data source for the C-041 invoke
|
|
1500
1500
|
* checkpoint's per-owner grant decision.
|
|
@@ -1572,7 +1572,7 @@ function commandOwner(ctx, definition) {
|
|
|
1572
1572
|
return ownerMaps.get(key)?.get(handler);
|
|
1573
1573
|
}
|
|
1574
1574
|
//#endregion
|
|
1575
|
-
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.
|
|
1575
|
+
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.22_08ea48c8555976e562c6368d51cb542b/node_modules/@chatcode/cco-tui/lib/types/dsh-adapter/command-errors.js
|
|
1576
1576
|
/**
|
|
1577
1577
|
* commands contract error-code alignment (C-041,
|
|
1578
1578
|
* `commands.dsh/v1alpha1#Command`): the official `dsh-commands` runtime
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { a as compositionRoot, i as bindCallerEffect, n as activationFiber, o as concreteService, s as requirePluginCaller } from "./host-access-
|
|
1
|
+
import { a as compositionRoot, i as bindCallerEffect, n as activationFiber, o as concreteService, s as requirePluginCaller } from "./host-access-DLJjuR07.js";
|
|
2
2
|
import { Service } from "@deepseek-ai/cordis";
|
|
3
|
-
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.
|
|
3
|
+
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.22_08ea48c8555976e562c6368d51cb542b/node_modules/@chatcode/cco-tui/lib/types/dsh-adapter/command-trees.js
|
|
4
4
|
/** Provider-neutral subcommand completion registry for terminal front doors. */
|
|
5
5
|
const name = "dsh-tui-command-trees";
|
|
6
6
|
/** Small host-only registry; command execution remains owned by dsh-commands. */
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { i as bindCallerEffect, n as activationFiber } from "./host-access-
|
|
1
|
+
import { i as bindCallerEffect, n as activationFiber } from "./host-access-DLJjuR07.js";
|
|
2
2
|
import { randomUUID } from "node:crypto";
|
|
3
|
-
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.
|
|
3
|
+
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.22_08ea48c8555976e562c6368d51cb542b/node_modules/@chatcode/cco-tui/lib/types/plugin-spec/permission-scope.js
|
|
4
4
|
/** Permission scope normalization shared by admission and runtime checks. */
|
|
5
5
|
const STORAGE_PERMISSIONS = new Set(["storage.local.read", "storage.local.write"]);
|
|
6
6
|
const INTERCEPT_PERMISSIONS = new Set([
|
|
@@ -76,7 +76,7 @@ function rawScopeCovers(permission, declared, actual, componentId) {
|
|
|
76
76
|
return normalizedDeclared !== void 0 && normalizedActual !== void 0 && permissionScopeCovers(permission, normalizedDeclared, normalizedActual);
|
|
77
77
|
}
|
|
78
78
|
//#endregion
|
|
79
|
-
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.
|
|
79
|
+
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.22_08ea48c8555976e562c6368d51cb542b/node_modules/@chatcode/cco-tui/lib/types/dsh-adapter/component-identity.js
|
|
80
80
|
/** Verified Component identity bound to one Cordis activation owner. */
|
|
81
81
|
var ComponentIdentityError = class extends Error {
|
|
82
82
|
code;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { c as homePatchPath, i as PROFILE_ROOT_FILENAME, o as chatCodeProfilePatchLayers, p as prepareProfile } from "./profile-boot-
|
|
1
|
+
import { c as homePatchPath, i as PROFILE_ROOT_FILENAME, o as chatCodeProfilePatchLayers, p as prepareProfile } from "./profile-boot-CffsubnV.js";
|
|
2
2
|
import { existsSync } from "node:fs";
|
|
3
3
|
import { loadOptionalPatches, loadOverlayPatches, renderConfigDump, resolveHomePatchConfigs } from "@deepseek-ai/dsh-app-boot";
|
|
4
4
|
import { join } from "node:path";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { p as prepareProfile, r as INSTALL_ANCHOR } from "./profile-boot-
|
|
2
|
-
import { t as collectConfigDumpLayers } from "./dump-config-
|
|
1
|
+
import { p as prepareProfile, r as INSTALL_ANCHOR } from "./profile-boot-CffsubnV.js";
|
|
2
|
+
import { t as collectConfigDumpLayers } from "./dump-config-D8kXfdTs.js";
|
|
3
3
|
import { generateConfigSchema } from "@deepseek-ai/dsh-app-boot";
|
|
4
4
|
//#region lib/types/dump-config-schema.js
|
|
5
5
|
/**
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { i as __toESM, t as __commonJSMin } from "./rolldown-runtime-2rV9d50f.js";
|
|
2
|
-
import { a as compositionRoot, i as bindCallerEffect } from "./host-access-
|
|
3
|
-
import { c as requiresDecisionEvents, d as normalizePermissionScope, f as permissionScopeCovers, l as INTERCEPT_EVENT_SCOPE_BY_PERMISSION, n as componentIdentityOf } from "./component-identity-
|
|
2
|
+
import { a as compositionRoot, i as bindCallerEffect } from "./host-access-DLJjuR07.js";
|
|
3
|
+
import { c as requiresDecisionEvents, d as normalizePermissionScope, f as permissionScopeCovers, l as INTERCEPT_EVENT_SCOPE_BY_PERMISSION, n as componentIdentityOf } from "./component-identity-DGA2-TeB.js";
|
|
4
4
|
import { existsSync, readFileSync } from "node:fs";
|
|
5
|
+
import { createHash } from "node:crypto";
|
|
5
6
|
import { fileURLToPath } from "node:url";
|
|
6
7
|
import { homedir } from "node:os";
|
|
7
8
|
import { dirname, join, resolve } from "node:path";
|
|
8
|
-
|
|
9
|
-
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.21_08ea48c8555976e562c6368d51cb542b/node_modules/@chatcode/cco-tui/node_modules/@dsh-std/core/lib/index.js
|
|
9
|
+
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.22_08ea48c8555976e562c6368d51cb542b/node_modules/@chatcode/cco-tui/node_modules/@dsh-std/core/lib/index.js
|
|
10
10
|
function protocolKey(reference) {
|
|
11
11
|
return `${reference.apiVersion}\0${reference.kind}`;
|
|
12
12
|
}
|
|
@@ -408,7 +408,7 @@ function comparePrerelease(left, right) {
|
|
|
408
408
|
return 0;
|
|
409
409
|
}
|
|
410
410
|
//#endregion
|
|
411
|
-
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.
|
|
411
|
+
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.22_08ea48c8555976e562c6368d51cb542b/node_modules/@chatcode/cco-tui/node_modules/@dsh-std/manifest/lib/index.js
|
|
412
412
|
const COMPONENT_API_VERSION = "manifest.dsh/internal/v1alpha1";
|
|
413
413
|
const COMMUNITY_PERMISSION_API_VERSION = "community.dsh/v1alpha1";
|
|
414
414
|
const COMMUNITY_PERMISSION_KIND = "Permission";
|
|
@@ -1012,7 +1012,7 @@ function canonical(value) {
|
|
|
1012
1012
|
return JSON.stringify(value) ?? "null";
|
|
1013
1013
|
}
|
|
1014
1014
|
//#endregion
|
|
1015
|
-
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.
|
|
1015
|
+
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.22_08ea48c8555976e562c6368d51cb542b/node_modules/@chatcode/cco-tui/node_modules/@dsh-std/connection/lib/resolve-3X6ausgz.js
|
|
1016
1016
|
/** Reusable RPC-shaped protocol definition. Domain packages opt into these semantics explicitly. */
|
|
1017
1017
|
function defineCapabilityProtocol(options) {
|
|
1018
1018
|
const definition = {
|
|
@@ -1068,7 +1068,7 @@ function isConnectionPolicy(value) {
|
|
|
1068
1068
|
return typeof value === "object" && value !== null && typeof value.endpointByParticipant === "object" && value.endpointByParticipant !== null;
|
|
1069
1069
|
}
|
|
1070
1070
|
//#endregion
|
|
1071
|
-
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.
|
|
1071
|
+
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.22_08ea48c8555976e562c6368d51cb542b/node_modules/@chatcode/cco-tui/node_modules/@dsh-std/presentation/lib/callback.js
|
|
1072
1072
|
const EXTERNAL_REDIRECT_KIND = "ExternalRedirect";
|
|
1073
1073
|
const emptySpec$3 = (value) => {
|
|
1074
1074
|
if (value !== void 0) throw new TypeError("ExternalRedirect does not accept spec in v1alpha1");
|
|
@@ -1084,7 +1084,7 @@ Object.freeze({
|
|
|
1084
1084
|
kind: EXTERNAL_REDIRECT_KIND
|
|
1085
1085
|
});
|
|
1086
1086
|
//#endregion
|
|
1087
|
-
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.
|
|
1087
|
+
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.22_08ea48c8555976e562c6368d51cb542b/node_modules/@chatcode/cco-tui/node_modules/@dsh-std/presentation/lib/index.js
|
|
1088
1088
|
const API_VERSION$3 = "presentation.dsh/v1alpha1";
|
|
1089
1089
|
const OPEN_EXTERNAL_KIND = "OpenExternal";
|
|
1090
1090
|
const COPY_TEXT_KIND = "CopyText";
|
|
@@ -1261,7 +1261,7 @@ function deepFreeze(value) {
|
|
|
1261
1261
|
return value;
|
|
1262
1262
|
}
|
|
1263
1263
|
//#endregion
|
|
1264
|
-
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.
|
|
1264
|
+
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.22_08ea48c8555976e562c6368d51cb542b/node_modules/@chatcode/cco-tui/node_modules/@dsh-std/command/lib/index.js
|
|
1265
1265
|
const API_VERSION$2 = "commands.dsh/v1alpha1";
|
|
1266
1266
|
const KIND$2 = "Command";
|
|
1267
1267
|
const RUNTIME_KIND = "CommandRuntime";
|
|
@@ -1455,7 +1455,7 @@ function exact(value, allowed, label) {
|
|
|
1455
1455
|
if (unknown.length > 0) throw new TypeError(`${label} contains unknown field ${JSON.stringify(unknown[0])}`);
|
|
1456
1456
|
}
|
|
1457
1457
|
//#endregion
|
|
1458
|
-
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.
|
|
1458
|
+
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.22_08ea48c8555976e562c6368d51cb542b/node_modules/@chatcode/cco-tui/node_modules/@dsh-std/messages/lib/index.js
|
|
1459
1459
|
const API_VERSION$1 = "messages.dsh/v1alpha1";
|
|
1460
1460
|
const KIND$1 = "MessageObserver";
|
|
1461
1461
|
const EVENT_TYPE = "messages.observe";
|
|
@@ -1588,7 +1588,7 @@ function record(value) {
|
|
|
1588
1588
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
1589
1589
|
}
|
|
1590
1590
|
//#endregion
|
|
1591
|
-
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.
|
|
1591
|
+
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.22_08ea48c8555976e562c6368d51cb542b/node_modules/@chatcode/cco-tui/node_modules/@dsh-std/storage/lib/index.js
|
|
1592
1592
|
const API_VERSION = "storage.dsh/v1alpha1";
|
|
1593
1593
|
const KIND = "LocalStorage";
|
|
1594
1594
|
const protocol = Object.freeze({
|
|
@@ -1687,7 +1687,7 @@ function key(value, label) {
|
|
|
1687
1687
|
if (typeof value !== "string" || value.length === 0) throw new TypeError(`${label} must be a non-empty string`);
|
|
1688
1688
|
}
|
|
1689
1689
|
//#endregion
|
|
1690
|
-
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.
|
|
1690
|
+
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.22_08ea48c8555976e562c6368d51cb542b/node_modules/@chatcode/cco-tui/dsh-ecosystem-spec/protocols/tui-channel.js
|
|
1691
1691
|
const TUI_CHANNEL = Object.freeze({
|
|
1692
1692
|
apiVersion: "tui.dsh/v1alpha1",
|
|
1693
1693
|
kind: "Channel"
|
|
@@ -1759,7 +1759,7 @@ function nonEmpty(value, label) {
|
|
|
1759
1759
|
if (typeof value !== "string" || value.trim() === "") throw new TypeError(`${label} must be a non-empty string`);
|
|
1760
1760
|
}
|
|
1761
1761
|
//#endregion
|
|
1762
|
-
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.
|
|
1762
|
+
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.22_08ea48c8555976e562c6368d51cb542b/node_modules/@chatcode/cco-tui/lib/types/plugin-spec/tui-extension.js
|
|
1763
1763
|
/** ChatCode CLI TUI private protocol registration on the shared dsh-std catalog. */
|
|
1764
1764
|
const TUI_EXTENSION_API_VERSION = "tui.dsh/v1alpha1";
|
|
1765
1765
|
const DECISION_EVENTS_COORDINATE = Object.freeze({
|
|
@@ -1828,7 +1828,7 @@ function createAdmissionCatalog() {
|
|
|
1828
1828
|
};
|
|
1829
1829
|
}
|
|
1830
1830
|
//#endregion
|
|
1831
|
-
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.
|
|
1831
|
+
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.22_08ea48c8555976e562c6368d51cb542b/node_modules/@chatcode/cco-tui/lib/types/plugin-spec/registry.js
|
|
1832
1832
|
/** Load and verify the pinned ChatCode CLI TUI admission profile. */
|
|
1833
1833
|
const REGISTRY_FILE = join("registry", "registry-0.15.json");
|
|
1834
1834
|
const EXPECTED_PROFILE_VERSION = "tui-admission/0.15";
|
|
@@ -2043,7 +2043,7 @@ function verifyContractProfiles(data) {
|
|
|
2043
2043
|
return failures;
|
|
2044
2044
|
}
|
|
2045
2045
|
//#endregion
|
|
2046
|
-
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.
|
|
2046
|
+
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.22_08ea48c8555976e562c6368d51cb542b/node_modules/@chatcode/cco-tui/lib/types/utils/paths.js
|
|
2047
2047
|
const CHATCODE_CLI_HOME_ENV = "CHATCODE_CLI_HOME";
|
|
2048
2048
|
const LEGACY_DSH_HOME_ENV = "DSH_HOME";
|
|
2049
2049
|
const CHATCODE_CLI_TUI_ENV_PREFIX = "CHATCODE_CLI_TUI_";
|
|
@@ -2145,7 +2145,7 @@ function detectLegacyEnv(env = process.env) {
|
|
|
2145
2145
|
return Object.keys(RENAMED_ENV).filter((name) => env[name] !== void 0);
|
|
2146
2146
|
}
|
|
2147
2147
|
//#endregion
|
|
2148
|
-
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.
|
|
2148
|
+
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.22_08ea48c8555976e562c6368d51cb542b/node_modules/@chatcode/cco-tui/lib/types/dsh-adapter/grants.js
|
|
2149
2149
|
/** Live, scoped plugin grant evaluation. */
|
|
2150
2150
|
const EXTENSION_GRANTS_FILE = "extension-grants.json";
|
|
2151
2151
|
function parseRule(value) {
|
|
@@ -3020,7 +3020,7 @@ function stripAnsi(string) {
|
|
|
3020
3020
|
return string.replace(regex, "");
|
|
3021
3021
|
}
|
|
3022
3022
|
//#endregion
|
|
3023
|
-
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.
|
|
3023
|
+
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.22_08ea48c8555976e562c6368d51cb542b/node_modules/@chatcode/cco-tui/lib/types/utils/intl.js
|
|
3024
3024
|
let graphemeSegmenter;
|
|
3025
3025
|
/**
|
|
3026
3026
|
* Memoized `Intl.Segmenter` with grapheme granularity, used by the ported Ink
|
|
@@ -3031,7 +3031,7 @@ function getGraphemeSegmenter() {
|
|
|
3031
3031
|
return graphemeSegmenter ??= new Intl.Segmenter("en", { granularity: "grapheme" });
|
|
3032
3032
|
}
|
|
3033
3033
|
//#endregion
|
|
3034
|
-
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.
|
|
3034
|
+
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.22_08ea48c8555976e562c6368d51cb542b/node_modules/@chatcode/cco-tui/lib/types/ink/stringWidth.js
|
|
3035
3035
|
const EMOJI_REGEX = (0, import_emoji_regex.default)();
|
|
3036
3036
|
/**
|
|
3037
3037
|
* Fallback JavaScript implementation of stringWidth when Bun.stringWidth is not available.
|
|
@@ -3253,7 +3253,7 @@ const BUN_STRING_WIDTH_OPTS = { ambiguousIsNarrow: true };
|
|
|
3253
3253
|
*/
|
|
3254
3254
|
const stringWidth = bunStringWidth ? (str) => bunStringWidth(str, BUN_STRING_WIDTH_OPTS) : stringWidthJavaScript;
|
|
3255
3255
|
//#endregion
|
|
3256
|
-
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.
|
|
3256
|
+
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.22_08ea48c8555976e562c6368d51cb542b/node_modules/@chatcode/cco-tui/lib/types/dsh-adapter/sanitize.js
|
|
3257
3257
|
/**
|
|
3258
3258
|
* The render-path sanitization contract for plugin-supplied text — the
|
|
3259
3259
|
* single implementation behind every managed-UI seam (dialogs, status line,
|
|
@@ -3312,7 +3312,7 @@ function flattenInline(value) {
|
|
|
3312
3312
|
return value.replace(/[\x00-\x1f\x7f-\x9f]/g, " ");
|
|
3313
3313
|
}
|
|
3314
3314
|
//#endregion
|
|
3315
|
-
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.
|
|
3315
|
+
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.22_08ea48c8555976e562c6368d51cb542b/node_modules/@chatcode/cco-tui/lib/types/dsh-adapter/decision-guard.js
|
|
3316
3316
|
/**
|
|
3317
3317
|
* RFC 0005 D-7 enforcement: subscribing to an intercept-class (decision)
|
|
3318
3318
|
* event requires an explicit host-side grant — default deny.
|
|
@@ -3564,7 +3564,7 @@ function installDecisionGuard(ctx, grants) {
|
|
|
3564
3564
|
});
|
|
3565
3565
|
}
|
|
3566
3566
|
//#endregion
|
|
3567
|
-
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.
|
|
3567
|
+
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.22_08ea48c8555976e562c6368d51cb542b/node_modules/@chatcode/cco-tui/lib/types/dsh-adapter/extension-events.js
|
|
3568
3568
|
/**
|
|
3569
3569
|
* Decision-point events the TUI fires on the cordis bus so plugins can
|
|
3570
3570
|
* intercept, cancel, or customize interactive flows — the `session_before_*`
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Context, Fiber } from "@deepseek-ai/cordis";
|
|
2
2
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
3
|
-
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.
|
|
3
|
+
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.22_08ea48c8555976e562c6368d51cb542b/node_modules/@chatcode/cco-tui/lib/types/dsh-adapter/host-access.js
|
|
4
4
|
/**
|
|
5
5
|
* Recover the concrete Cordis service for host-only adapters.
|
|
6
6
|
*
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.
|
|
1
|
+
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.22_08ea48c8555976e562c6368d51cb542b/node_modules/@chatcode/cco-tui/lib/types/utils/modifiers.js
|
|
2
2
|
/**
|
|
3
3
|
* Cross-platform modifier-key helpers. Windows/Linux muscle memory uses
|
|
4
4
|
* Ctrl+<key>; on macOS the same action maps to Cmd+<key>. Terminals deliver
|
|
@@ -39,7 +39,7 @@ function isPlainReturnInput(input, key) {
|
|
|
39
39
|
return /^[\r\n]+$/u.test(input) && !key.ctrl && !key.meta && !key.shift && !key.super;
|
|
40
40
|
}
|
|
41
41
|
//#endregion
|
|
42
|
-
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.
|
|
42
|
+
//#region ../../node_modules/.pnpm/@chatcode+cco-tui@0.10.0-rc.22_08ea48c8555976e562c6368d51cb542b/node_modules/@chatcode/cco-tui/lib/types/utils/keymap.js
|
|
43
43
|
/**
|
|
44
44
|
* Built-in keyboard-shortcut keymap: the shared combo grammar, the action
|
|
45
45
|
* registry, and the live override cache behind `/settings` customization.
|