@kaitranntt/ccs 8.8.1 → 8.9.0-dev.2
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.md +6 -4
- package/dist/api/services/profile-lifecycle-validation.d.ts.map +1 -1
- package/dist/api/services/profile-lifecycle-validation.js +3 -8
- package/dist/api/services/profile-lifecycle-validation.js.map +1 -1
- package/dist/auth/auth-commands.js +3 -3
- package/dist/auth/auth-commands.js.map +1 -1
- package/dist/auth/resume-lane-diagnostics.d.ts +9 -0
- package/dist/auth/resume-lane-diagnostics.d.ts.map +1 -1
- package/dist/auth/resume-lane-diagnostics.js +105 -1
- package/dist/auth/resume-lane-diagnostics.js.map +1 -1
- package/dist/auth/resume-lane-warning.d.ts +9 -1
- package/dist/auth/resume-lane-warning.d.ts.map +1 -1
- package/dist/auth/resume-lane-warning.js +72 -5
- package/dist/auth/resume-lane-warning.js.map +1 -1
- package/dist/ccs.d.ts +1 -1
- package/dist/ccs.d.ts.map +1 -1
- package/dist/ccs.js +5 -1
- package/dist/ccs.js.map +1 -1
- package/dist/cliproxy/accounts/registry.d.ts.map +1 -1
- package/dist/cliproxy/accounts/registry.js +14 -16
- package/dist/cliproxy/accounts/registry.js.map +1 -1
- package/dist/cliproxy/ai-providers/model-id-normalizer.d.ts +1 -1
- package/dist/cliproxy/ai-providers/model-id-normalizer.d.ts.map +1 -1
- package/dist/cliproxy/auth/oauth-cli-args.d.ts +11 -0
- package/dist/cliproxy/auth/oauth-cli-args.d.ts.map +1 -0
- package/dist/cliproxy/auth/oauth-cli-args.js +53 -0
- package/dist/cliproxy/auth/oauth-cli-args.js.map +1 -0
- package/dist/cliproxy/auth/oauth-cli-capabilities.d.ts +11 -0
- package/dist/cliproxy/auth/oauth-cli-capabilities.d.ts.map +1 -0
- package/dist/cliproxy/auth/oauth-cli-capabilities.js +101 -0
- package/dist/cliproxy/auth/oauth-cli-capabilities.js.map +1 -0
- package/dist/cliproxy/auth/oauth-handler.d.ts +0 -6
- package/dist/cliproxy/auth/oauth-handler.d.ts.map +1 -1
- package/dist/cliproxy/auth/oauth-handler.js +70 -43
- package/dist/cliproxy/auth/oauth-handler.js.map +1 -1
- package/dist/cliproxy/auth/test-fixtures/gemini-backend-guidance-child.scenario.d.ts +2 -0
- package/dist/cliproxy/auth/test-fixtures/gemini-backend-guidance-child.scenario.d.ts.map +1 -0
- package/dist/cliproxy/auth/test-fixtures/gemini-backend-guidance-child.scenario.js +207 -0
- package/dist/cliproxy/auth/test-fixtures/gemini-backend-guidance-child.scenario.js.map +1 -0
- package/dist/cliproxy/binary-manager.d.ts +1 -0
- package/dist/cliproxy/binary-manager.d.ts.map +1 -1
- package/dist/cliproxy/binary-manager.js +1 -1
- package/dist/cliproxy/binary-manager.js.map +1 -1
- package/dist/cliproxy/config/env-builder.d.ts +5 -0
- package/dist/cliproxy/config/env-builder.d.ts.map +1 -1
- package/dist/cliproxy/config/env-builder.js +24 -1
- package/dist/cliproxy/config/env-builder.js.map +1 -1
- package/dist/cliproxy/config/generator.d.ts +2 -1
- package/dist/cliproxy/config/generator.d.ts.map +1 -1
- package/dist/cliproxy/config/generator.js +81 -11
- package/dist/cliproxy/config/generator.js.map +1 -1
- package/dist/cliproxy/config/oauth-model-alias-config.d.ts +6 -0
- package/dist/cliproxy/config/oauth-model-alias-config.d.ts.map +1 -0
- package/dist/cliproxy/config/oauth-model-alias-config.js +136 -0
- package/dist/cliproxy/config/oauth-model-alias-config.js.map +1 -0
- package/dist/cliproxy/config/payload-rule-config.d.ts +6 -0
- package/dist/cliproxy/config/payload-rule-config.d.ts.map +1 -0
- package/dist/cliproxy/config/payload-rule-config.js +137 -0
- package/dist/cliproxy/config/payload-rule-config.js.map +1 -0
- package/dist/cliproxy/executor/claude-launcher.d.ts +3 -0
- package/dist/cliproxy/executor/claude-launcher.d.ts.map +1 -1
- package/dist/cliproxy/executor/claude-launcher.js +7 -3
- package/dist/cliproxy/executor/claude-launcher.js.map +1 -1
- package/dist/cliproxy/executor/env-resolver.d.ts +2 -0
- package/dist/cliproxy/executor/env-resolver.d.ts.map +1 -1
- package/dist/cliproxy/executor/env-resolver.js +6 -4
- package/dist/cliproxy/executor/env-resolver.js.map +1 -1
- package/dist/cliproxy/executor/index.d.ts.map +1 -1
- package/dist/cliproxy/executor/index.js +7 -5
- package/dist/cliproxy/executor/index.js.map +1 -1
- package/dist/cliproxy/model-catalog.d.ts +2 -0
- package/dist/cliproxy/model-catalog.d.ts.map +1 -1
- package/dist/cliproxy/model-catalog.js +67 -0
- package/dist/cliproxy/model-catalog.js.map +1 -1
- package/dist/cliproxy/quota/quota-fetcher-claude.d.ts.map +1 -1
- package/dist/cliproxy/quota/quota-fetcher-claude.js +11 -1
- package/dist/cliproxy/quota/quota-fetcher-claude.js.map +1 -1
- package/dist/cliproxy/routing/retry-settings.d.ts +18 -0
- package/dist/cliproxy/routing/retry-settings.d.ts.map +1 -0
- package/dist/cliproxy/routing/retry-settings.js +185 -0
- package/dist/cliproxy/routing/retry-settings.js.map +1 -0
- package/dist/cliproxy/routing/routing-strategy-http.d.ts +3 -0
- package/dist/cliproxy/routing/routing-strategy-http.d.ts.map +1 -1
- package/dist/cliproxy/routing/routing-strategy-http.js +13 -3
- package/dist/cliproxy/routing/routing-strategy-http.js.map +1 -1
- package/dist/cliproxy/services/catalog-cache.d.ts.map +1 -1
- package/dist/cliproxy/services/catalog-cache.js +6 -0
- package/dist/cliproxy/services/catalog-cache.js.map +1 -1
- package/dist/cliproxy/session-tracker.d.ts.map +1 -1
- package/dist/cliproxy/session-tracker.js +4 -18
- package/dist/cliproxy/session-tracker.js.map +1 -1
- package/dist/cliproxy/types/config-types.d.ts +3 -0
- package/dist/cliproxy/types/config-types.d.ts.map +1 -1
- package/dist/codex-auth/shell-detect.d.ts +2 -0
- package/dist/codex-auth/shell-detect.d.ts.map +1 -1
- package/dist/codex-auth/shell-detect.js +15 -1
- package/dist/codex-auth/shell-detect.js.map +1 -1
- package/dist/commands/bar/bar-process-control.d.ts +43 -0
- package/dist/commands/bar/bar-process-control.d.ts.map +1 -0
- package/dist/commands/bar/bar-process-control.js +255 -0
- package/dist/commands/bar/bar-process-control.js.map +1 -0
- package/dist/commands/bar/bar-server-probe.d.ts +5 -2
- package/dist/commands/bar/bar-server-probe.d.ts.map +1 -1
- package/dist/commands/bar/bar-server-probe.js +38 -12
- package/dist/commands/bar/bar-server-probe.js.map +1 -1
- package/dist/commands/bar/help-subcommand.d.ts.map +1 -1
- package/dist/commands/bar/help-subcommand.js +2 -0
- package/dist/commands/bar/help-subcommand.js.map +1 -1
- package/dist/commands/bar/index.d.ts.map +1 -1
- package/dist/commands/bar/index.js +13 -3
- package/dist/commands/bar/index.js.map +1 -1
- package/dist/commands/bar/launch-descriptor.d.ts +2 -0
- package/dist/commands/bar/launch-descriptor.d.ts.map +1 -1
- package/dist/commands/bar/launch-descriptor.js +6 -1
- package/dist/commands/bar/launch-descriptor.js.map +1 -1
- package/dist/commands/bar/launch-subcommand.d.ts +18 -1
- package/dist/commands/bar/launch-subcommand.d.ts.map +1 -1
- package/dist/commands/bar/launch-subcommand.js +149 -45
- package/dist/commands/bar/launch-subcommand.js.map +1 -1
- package/dist/commands/bar/port-arg.d.ts +16 -0
- package/dist/commands/bar/port-arg.d.ts.map +1 -0
- package/dist/commands/bar/port-arg.js +41 -0
- package/dist/commands/bar/port-arg.js.map +1 -0
- package/dist/commands/bar/serve-subcommand.d.ts +5 -0
- package/dist/commands/bar/serve-subcommand.d.ts.map +1 -1
- package/dist/commands/bar/serve-subcommand.js +47 -29
- package/dist/commands/bar/serve-subcommand.js.map +1 -1
- package/dist/commands/bar/status-subcommand.d.ts.map +1 -1
- package/dist/commands/bar/status-subcommand.js +11 -2
- package/dist/commands/bar/status-subcommand.js.map +1 -1
- package/dist/commands/bar/stop-subcommand.d.ts +5 -0
- package/dist/commands/bar/stop-subcommand.d.ts.map +1 -1
- package/dist/commands/bar/stop-subcommand.js +71 -27
- package/dist/commands/bar/stop-subcommand.js.map +1 -1
- package/dist/commands/cliproxy/catalog-subcommand.d.ts.map +1 -1
- package/dist/commands/cliproxy/catalog-subcommand.js +2 -0
- package/dist/commands/cliproxy/catalog-subcommand.js.map +1 -1
- package/dist/commands/cliproxy/quota-subcommand/sections/claude.d.ts.map +1 -1
- package/dist/commands/cliproxy/quota-subcommand/sections/claude.js +2 -1
- package/dist/commands/cliproxy/quota-subcommand/sections/claude.js.map +1 -1
- package/dist/commands/setup-command.js +1 -1
- package/dist/commands/setup-command.js.map +1 -1
- package/dist/commands/version-command.js +1 -1
- package/dist/commands/version-command.js.map +1 -1
- package/dist/config/schemas/auth.d.ts +2 -2
- package/dist/config/schemas/auth.d.ts.map +1 -1
- package/dist/config/schemas/cliproxy.d.ts +66 -0
- package/dist/config/schemas/cliproxy.d.ts.map +1 -1
- package/dist/config/schemas/cliproxy.js +13 -1
- package/dist/config/schemas/cliproxy.js.map +1 -1
- package/dist/config/schemas/index.d.ts +1 -1
- package/dist/config/schemas/index.d.ts.map +1 -1
- package/dist/config/schemas/index.js.map +1 -1
- package/dist/config/schemas/version.d.ts +2 -1
- package/dist/config/schemas/version.d.ts.map +1 -1
- package/dist/config/schemas/version.js +2 -1
- package/dist/config/schemas/version.js.map +1 -1
- package/dist/copilot/copilot-executor.d.ts +3 -1
- package/dist/copilot/copilot-executor.d.ts.map +1 -1
- package/dist/copilot/copilot-executor.js +11 -7
- package/dist/copilot/copilot-executor.js.map +1 -1
- package/dist/cursor/cursor-profile-executor.d.ts +3 -1
- package/dist/cursor/cursor-profile-executor.d.ts.map +1 -1
- package/dist/cursor/cursor-profile-executor.js +8 -4
- package/dist/cursor/cursor-profile-executor.js.map +1 -1
- package/dist/delegation/headless-executor.d.ts.map +1 -1
- package/dist/delegation/headless-executor.js +4 -3
- package/dist/delegation/headless-executor.js.map +1 -1
- package/dist/dispatcher/flows/copilot-flow.d.ts.map +1 -1
- package/dist/dispatcher/flows/copilot-flow.js +3 -2
- package/dist/dispatcher/flows/copilot-flow.js.map +1 -1
- package/dist/dispatcher/flows/cursor-flow.d.ts.map +1 -1
- package/dist/dispatcher/flows/cursor-flow.js +3 -2
- package/dist/dispatcher/flows/cursor-flow.js.map +1 -1
- package/dist/dispatcher/flows/settings-flow.d.ts.map +1 -1
- package/dist/dispatcher/flows/settings-flow.js +12 -10
- package/dist/dispatcher/flows/settings-flow.js.map +1 -1
- package/dist/management/instance-directory.d.ts +19 -0
- package/dist/management/instance-directory.d.ts.map +1 -1
- package/dist/management/instance-directory.js +130 -7
- package/dist/management/instance-directory.js.map +1 -1
- package/dist/management/instance-manager.d.ts +2 -5
- package/dist/management/instance-manager.d.ts.map +1 -1
- package/dist/management/instance-manager.js +26 -27
- package/dist/management/instance-manager.js.map +1 -1
- package/dist/management/shared-manager/canonical-first-file-claims.d.ts +6 -0
- package/dist/management/shared-manager/canonical-first-file-claims.d.ts.map +1 -0
- package/dist/management/shared-manager/canonical-first-file-claims.js +143 -0
- package/dist/management/shared-manager/canonical-first-file-claims.js.map +1 -0
- package/dist/management/shared-manager/canonical-first-file-reconciler.d.ts +15 -0
- package/dist/management/shared-manager/canonical-first-file-reconciler.d.ts.map +1 -0
- package/dist/management/shared-manager/canonical-first-file-reconciler.js +131 -0
- package/dist/management/shared-manager/canonical-first-file-reconciler.js.map +1 -0
- package/dist/management/shared-manager/diverged-file-adopter.d.ts +5 -0
- package/dist/management/shared-manager/diverged-file-adopter.d.ts.map +1 -0
- package/dist/management/shared-manager/diverged-file-adopter.js +361 -0
- package/dist/management/shared-manager/diverged-file-adopter.js.map +1 -0
- package/dist/management/shared-manager/fs-helpers.d.ts +9 -0
- package/dist/management/shared-manager/fs-helpers.d.ts.map +1 -1
- package/dist/management/shared-manager/fs-helpers.js +9 -0
- package/dist/management/shared-manager/fs-helpers.js.map +1 -1
- package/dist/management/shared-manager/plugin-layout-internals.d.ts +1 -1
- package/dist/management/shared-manager/plugin-layout-internals.d.ts.map +1 -1
- package/dist/management/shared-manager/plugin-layout-internals.js +54 -8
- package/dist/management/shared-manager/plugin-layout-internals.js.map +1 -1
- package/dist/management/shared-manager/shared-dir-linker.d.ts +1 -1
- package/dist/management/shared-manager/shared-dir-linker.d.ts.map +1 -1
- package/dist/management/shared-manager/shared-dir-linker.js +147 -75
- package/dist/management/shared-manager/shared-dir-linker.js.map +1 -1
- package/dist/management/shared-manager/types.d.ts +12 -1
- package/dist/management/shared-manager/types.d.ts.map +1 -1
- package/dist/management/shared-manager/types.js +12 -1
- package/dist/management/shared-manager/types.js.map +1 -1
- package/dist/proxy/proxy-daemon-entry.js +10 -2
- package/dist/proxy/proxy-daemon-entry.js.map +1 -1
- package/dist/proxy/server/messages-route.d.ts +2 -2
- package/dist/proxy/server/messages-route.d.ts.map +1 -1
- package/dist/proxy/server/messages-route.js +33 -24
- package/dist/proxy/server/messages-route.js.map +1 -1
- package/dist/proxy/server/proxy-server.d.ts +1 -0
- package/dist/proxy/server/proxy-server.d.ts.map +1 -1
- package/dist/proxy/server/proxy-server.js +57 -5
- package/dist/proxy/server/proxy-server.js.map +1 -1
- package/dist/proxy/server/upstream-transport.d.ts +14 -0
- package/dist/proxy/server/upstream-transport.d.ts.map +1 -0
- package/dist/proxy/server/upstream-transport.js +72 -0
- package/dist/proxy/server/upstream-transport.js.map +1 -0
- package/dist/proxy/transformers/request-transformer.d.ts.map +1 -1
- package/dist/proxy/transformers/request-transformer.js +43 -1
- package/dist/proxy/transformers/request-transformer.js.map +1 -1
- package/dist/services/logging/log-redaction.d.ts.map +1 -1
- package/dist/services/logging/log-redaction.js +4 -1
- package/dist/services/logging/log-redaction.js.map +1 -1
- package/dist/services/logging/log-types.d.ts +1 -0
- package/dist/services/logging/log-types.d.ts.map +1 -1
- package/dist/services/logging/log-types.js.map +1 -1
- package/dist/shared/extended-context-utils.d.ts +1 -1
- package/dist/shared/extended-context-utils.d.ts.map +1 -1
- package/dist/shared/extended-context-utils.js +1 -0
- package/dist/shared/extended-context-utils.js.map +1 -1
- package/dist/types/config.d.ts +2 -2
- package/dist/types/config.d.ts.map +1 -1
- package/dist/ui/assets/{Trans-DTklOPAl.js → Trans-dQ5QXCeL.js} +1 -1
- package/dist/ui/assets/{accounts-Cvmw1zaL.js → accounts-DMMNI7g4.js} +1 -1
- package/dist/ui/assets/{alert-dialog-xN1Vxm4Q.js → alert-dialog-BIWuuEiP.js} +1 -1
- package/dist/ui/assets/{api-UjGDV1dn.js → api-BKTghVxS.js} +1 -1
- package/dist/ui/assets/{auth-section-exE9zovq.js → auth-section-BKDcPs0P.js} +1 -1
- package/dist/ui/assets/{backups-section-CANdqpNT.js → backups-section-DB1N4X1P.js} +1 -1
- package/dist/ui/assets/{channels-C8d6AgLN.js → channels-dhk_rRcA.js} +1 -1
- package/dist/ui/assets/{checkbox-B71vxZdD.js → checkbox-h1pwW_6m.js} +1 -1
- package/dist/ui/assets/{claude-extension-COD7m8Iq.js → claude-extension-WLOGl6eK.js} +1 -1
- package/dist/ui/assets/cliproxy-CE_mZIGU.js +4 -0
- package/dist/ui/assets/{cliproxy-ai-providers-C79GuQ92.js → cliproxy-ai-providers-DVkAmHVF.js} +5 -5
- package/dist/ui/assets/{cliproxy-control-panel-B6_hOtz6.js → cliproxy-control-panel-D25OT5u5.js} +1 -1
- package/dist/ui/assets/{codex-3mlgCMGk.js → codex-Bqc25al7.js} +1 -1
- package/dist/ui/assets/{confirm-dialog-CHnCNFFP.js → confirm-dialog-BnAIV9ZB.js} +1 -1
- package/dist/ui/assets/{copilot-CfmS6yON.js → copilot-BdjZjuRs.js} +2 -2
- package/dist/ui/assets/{cursor-tzPHgV8J.js → cursor-DTbIQ-d7.js} +1 -1
- package/dist/ui/assets/{droid-Bc8LlbJa.js → droid-DAjrpAjP.js} +1 -1
- package/dist/ui/assets/{globalenv-section-DTYeLBoB.js → globalenv-section-BzirfKtN.js} +1 -1
- package/dist/ui/assets/{health-9Xyzeiyx.js → health-CDCop1Et.js} +1 -1
- package/dist/ui/assets/index-B4yjQknk.js +56 -0
- package/dist/ui/assets/{index-B0M7QB1o.js → index-BF4hYrQf.js} +1 -1
- package/dist/ui/assets/{index-DuD3QaMG.js → index-BhGdNER3.js} +1 -1
- package/dist/ui/assets/{index-CEx6YJb5.js → index-DMGiMF5C.js} +1 -1
- package/dist/ui/assets/{index-Bz1gMXk1.js → index-Dkee4NQG.js} +1 -1
- package/dist/ui/assets/{index-DoHAX6LH.js → index-bC8F80OC.js} +1 -1
- package/dist/ui/assets/{index-Bjg11-rW.js → index-vdkPayvk.js} +1 -1
- package/dist/ui/assets/{logs-CrjUtfDp.js → logs-Bb1BaiFq.js} +1 -1
- package/dist/ui/assets/{masked-input-BAtRbixr.js → masked-input-DxWhb6sQ.js} +1 -1
- package/dist/ui/assets/proxy-status-widget-Dj_46CdP.js +1 -0
- package/dist/ui/assets/{raw-json-settings-editor-panel-CvJCywnk.js → raw-json-settings-editor-panel-BeZJbsnO.js} +1 -1
- package/dist/ui/assets/{searchable-select-Bn50_-2s.js → searchable-select-CcXdAHJm.js} +1 -1
- package/dist/ui/assets/{separator-DY36bzud.js → separator-O1g2RdCE.js} +1 -1
- package/dist/ui/assets/{shared-BynjOvKs.js → shared-Ct6UqE0N.js} +1 -1
- package/dist/ui/assets/{table-DdcK8yYq.js → table-D4ZJKsoh.js} +1 -1
- package/dist/ui/assets/{updates-D27A1hQG.js → updates-jnNBispr.js} +1 -1
- package/dist/ui/assets/{use-accounts-CRxt0j07.js → use-accounts-DXwh5f2t.js} +1 -1
- package/dist/ui/index.html +2 -2
- package/dist/utils/fetch-proxy-setup.d.ts.map +1 -1
- package/dist/utils/fetch-proxy-setup.js +10 -6
- package/dist/utils/fetch-proxy-setup.js.map +1 -1
- package/dist/utils/shell-executor.d.ts +1 -1
- package/dist/utils/shell-executor.d.ts.map +1 -1
- package/dist/utils/shell-executor.js +5 -8
- package/dist/utils/shell-executor.js.map +1 -1
- package/dist/utils/sync-lock-retry.d.ts +9 -0
- package/dist/utils/sync-lock-retry.d.ts.map +1 -0
- package/dist/utils/sync-lock-retry.js +107 -0
- package/dist/utils/sync-lock-retry.js.map +1 -0
- package/dist/utils/websearch/claude-tool-args.d.ts +1 -1
- package/dist/utils/websearch/claude-tool-args.d.ts.map +1 -1
- package/dist/utils/websearch/claude-tool-args.js +3 -2
- package/dist/utils/websearch/claude-tool-args.js.map +1 -1
- package/dist/utils/websearch/hook-config.d.ts +2 -1
- package/dist/utils/websearch/hook-config.d.ts.map +1 -1
- package/dist/utils/websearch/hook-config.js +1 -2
- package/dist/utils/websearch/hook-config.js.map +1 -1
- package/dist/utils/websearch/hook-env.d.ts +2 -1
- package/dist/utils/websearch/hook-env.d.ts.map +1 -1
- package/dist/utils/websearch/hook-env.js +1 -2
- package/dist/utils/websearch/hook-env.js.map +1 -1
- package/dist/utils/websearch/hook-installer.d.ts +2 -1
- package/dist/utils/websearch/hook-installer.d.ts.map +1 -1
- package/dist/utils/websearch/hook-installer.js +1 -2
- package/dist/utils/websearch/hook-installer.js.map +1 -1
- package/dist/utils/websearch/index.d.ts +2 -0
- package/dist/utils/websearch/index.d.ts.map +1 -1
- package/dist/utils/websearch/index.js +3 -1
- package/dist/utils/websearch/index.js.map +1 -1
- package/dist/utils/websearch/launch-state.d.ts +9 -0
- package/dist/utils/websearch/launch-state.d.ts.map +1 -0
- package/dist/utils/websearch/launch-state.js +15 -0
- package/dist/utils/websearch/launch-state.js.map +1 -0
- package/dist/utils/websearch/mcp-installer.d.ts +6 -5
- package/dist/utils/websearch/mcp-installer.d.ts.map +1 -1
- package/dist/utils/websearch/mcp-installer.js +10 -15
- package/dist/utils/websearch/mcp-installer.js.map +1 -1
- package/dist/utils/websearch/status.d.ts +4 -3
- package/dist/utils/websearch/status.d.ts.map +1 -1
- package/dist/utils/websearch/status.js +7 -10
- package/dist/utils/websearch/status.js.map +1 -1
- package/dist/utils/websearch-manager.d.ts +2 -0
- package/dist/utils/websearch-manager.d.ts.map +1 -1
- package/dist/utils/websearch-manager.js +3 -1
- package/dist/utils/websearch-manager.js.map +1 -1
- package/dist/web-server/model-pricing.d.ts.map +1 -1
- package/dist/web-server/model-pricing.js +22 -0
- package/dist/web-server/model-pricing.js.map +1 -1
- package/dist/web-server/routes/bar-routes.d.ts.map +1 -1
- package/dist/web-server/routes/bar-routes.js +15 -10
- package/dist/web-server/routes/bar-routes.js.map +1 -1
- package/dist/web-server/routes/cliproxy-routing-routes.d.ts.map +1 -1
- package/dist/web-server/routes/cliproxy-routing-routes.js +28 -0
- package/dist/web-server/routes/cliproxy-routing-routes.js.map +1 -1
- package/dist/web-server/routes/settings-routes.d.ts.map +1 -1
- package/dist/web-server/routes/settings-routes.js +1 -0
- package/dist/web-server/routes/settings-routes.js.map +1 -1
- package/dist/web-server/usage/claude-native-credentials.d.ts +23 -2
- package/dist/web-server/usage/claude-native-credentials.d.ts.map +1 -1
- package/dist/web-server/usage/claude-native-credentials.js +78 -14
- package/dist/web-server/usage/claude-native-credentials.js.map +1 -1
- package/dist/web-server/usage/native-quota-collector.d.ts +10 -9
- package/dist/web-server/usage/native-quota-collector.d.ts.map +1 -1
- package/dist/web-server/usage/native-quota-collector.js +113 -42
- package/dist/web-server/usage/native-quota-collector.js.map +1 -1
- package/lib/ccs +1 -1
- package/lib/ccs.ps1 +1 -1
- package/package.json +3 -2
- package/scripts/ci-parity-gate.sh +4 -30
- package/scripts/completion/ccs.bash +1 -1
- package/scripts/completion/ccs.fish +1 -1
- package/scripts/completion/ccs.ps1 +1 -1
- package/scripts/completion/ccs.zsh +1 -1
- package/scripts/hardening-inventory.js +37 -4
- package/scripts/maintainability-metrics.js +2 -8
- package/scripts/run-test-bucket.js +1 -0
- package/scripts/runtime-source-classifier.js +12 -0
- package/dist/ui/assets/cliproxy-CXDOPGj3.js +0 -4
- package/dist/ui/assets/index-EnTQAKOi.js +0 -56
- package/dist/ui/assets/proxy-status-widget-D87qCiqo.js +0 -1
|
@@ -1,4 +1,23 @@
|
|
|
1
1
|
export declare function isAccountInstanceName(name: string): boolean;
|
|
2
|
+
export declare function normalizeAccountInstanceName(name: string): string;
|
|
3
|
+
export interface DirectoryIdentity {
|
|
4
|
+
device: number;
|
|
5
|
+
inode: number;
|
|
6
|
+
realPath: string;
|
|
7
|
+
}
|
|
8
|
+
/** Reject symlink roots/entries and require the real instance path to stay under the real root. */
|
|
9
|
+
export declare function isSafeAccountInstancePath(instancesDir: string, instancePath: string): boolean;
|
|
10
|
+
/** Create a missing managed instances root without traversing symlink parents. */
|
|
11
|
+
export declare function ensureSafeAccountInstancesDirectory(instancesDir: string): void;
|
|
12
|
+
export declare function assertSafeAccountInstancePath(instancesDir: string, instancePath: string): void;
|
|
13
|
+
/**
|
|
14
|
+
* Capture the validated directory identity used by later mutation guards.
|
|
15
|
+
* This is defense-in-depth for static and ordinary concurrent replacement,
|
|
16
|
+
* not a hostile same-UID race boundary; that would require dirfd/openat-style APIs.
|
|
17
|
+
*/
|
|
18
|
+
export declare function captureSafeAccountInstanceIdentity(instancesDir: string, instancePath: string): DirectoryIdentity;
|
|
19
|
+
/** Require the lexical instance path to still name the validated directory. */
|
|
20
|
+
export declare function assertAccountInstanceIdentity(instancesDir: string, instancePath: string, expectedIdentity: DirectoryIdentity): void;
|
|
2
21
|
export declare function listAccountInstanceNames(instancesDir: string): string[];
|
|
3
22
|
export declare function listAccountInstancePaths(instancesDir: string): string[];
|
|
4
23
|
//# sourceMappingURL=instance-directory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instance-directory.d.ts","sourceRoot":"","sources":["../../src/management/instance-directory.ts"],"names":[],"mappings":"AAGA,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE3D;AAED,wBAAgB,wBAAwB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"instance-directory.d.ts","sourceRoot":"","sources":["../../src/management/instance-directory.ts"],"names":[],"mappings":"AAGA,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE3D;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjE;AAQD,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAgDD,mGAAmG;AACnG,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAc7F;AAED,kFAAkF;AAClF,wBAAgB,mCAAmC,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAwB9E;AAED,wBAAgB,6BAA6B,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,CAE9F;AAED;;;;GAIG;AACH,wBAAgB,kCAAkC,CAChD,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,GACnB,iBAAiB,CAKnB;AAED,+EAA+E;AAC/E,wBAAgB,6BAA6B,CAC3C,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,gBAAgB,EAAE,iBAAiB,GAClC,IAAI,CAWN;AAED,wBAAgB,wBAAwB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,CAYvE;AAED,wBAAgB,wBAAwB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,CAEvE"}
|
|
@@ -23,13 +23,141 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
23
23
|
return result;
|
|
24
24
|
};
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.listAccountInstancePaths = exports.listAccountInstanceNames = exports.isAccountInstanceName = void 0;
|
|
26
|
+
exports.listAccountInstancePaths = exports.listAccountInstanceNames = exports.assertAccountInstanceIdentity = exports.captureSafeAccountInstanceIdentity = exports.assertSafeAccountInstancePath = exports.ensureSafeAccountInstancesDirectory = exports.isSafeAccountInstancePath = exports.normalizeAccountInstanceName = exports.isAccountInstanceName = void 0;
|
|
27
27
|
const fs = __importStar(require("fs"));
|
|
28
28
|
const path = __importStar(require("path"));
|
|
29
29
|
function isAccountInstanceName(name) {
|
|
30
30
|
return !name.startsWith('.');
|
|
31
31
|
}
|
|
32
32
|
exports.isAccountInstanceName = isAccountInstanceName;
|
|
33
|
+
function normalizeAccountInstanceName(name) {
|
|
34
|
+
return name.replace(/[^a-zA-Z0-9_-]/g, '-').toLowerCase();
|
|
35
|
+
}
|
|
36
|
+
exports.normalizeAccountInstanceName = normalizeAccountInstanceName;
|
|
37
|
+
function unsafeInstancePath(targetPath) {
|
|
38
|
+
throw Object.assign(new TypeError(`Unsafe account instance path: ${targetPath}`), {
|
|
39
|
+
code: 'EINVAL',
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
function readDirectoryIdentity(directoryPath) {
|
|
43
|
+
const stats = fs.lstatSync(directoryPath);
|
|
44
|
+
if (stats.isSymbolicLink() || !stats.isDirectory())
|
|
45
|
+
unsafeInstancePath(directoryPath);
|
|
46
|
+
return {
|
|
47
|
+
device: stats.dev,
|
|
48
|
+
inode: stats.ino,
|
|
49
|
+
realPath: fs.realpathSync.native(directoryPath),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
function identitiesMatch(left, right) {
|
|
53
|
+
return (left.device === right.device && left.inode === right.inode && left.realPath === right.realPath);
|
|
54
|
+
}
|
|
55
|
+
function createDirectoryUnderStableParent(directoryPath) {
|
|
56
|
+
const parentPath = path.dirname(directoryPath);
|
|
57
|
+
const parentBefore = readDirectoryIdentity(parentPath);
|
|
58
|
+
try {
|
|
59
|
+
fs.mkdirSync(directoryPath, { mode: 0o700 });
|
|
60
|
+
readDirectoryIdentity(directoryPath);
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
if (error.code !== 'EEXIST')
|
|
64
|
+
throw error;
|
|
65
|
+
}
|
|
66
|
+
let parentAfter;
|
|
67
|
+
try {
|
|
68
|
+
parentAfter = readDirectoryIdentity(parentPath);
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
unsafeInstancePath(parentPath);
|
|
72
|
+
}
|
|
73
|
+
if (!identitiesMatch(parentBefore, parentAfter)) {
|
|
74
|
+
unsafeInstancePath(parentPath);
|
|
75
|
+
}
|
|
76
|
+
readDirectoryIdentity(directoryPath);
|
|
77
|
+
}
|
|
78
|
+
function isPathWithinDirectory(candidatePath, directoryPath) {
|
|
79
|
+
const relative = path.relative(directoryPath, candidatePath);
|
|
80
|
+
return relative.length > 0 && relative !== '..' && !relative.startsWith(`..${path.sep}`);
|
|
81
|
+
}
|
|
82
|
+
/** Reject symlink roots/entries and require the real instance path to stay under the real root. */
|
|
83
|
+
function isSafeAccountInstancePath(instancesDir, instancePath) {
|
|
84
|
+
try {
|
|
85
|
+
const rootStats = fs.lstatSync(instancesDir);
|
|
86
|
+
if (rootStats.isSymbolicLink() || !rootStats.isDirectory())
|
|
87
|
+
return false;
|
|
88
|
+
const instanceStats = fs.lstatSync(instancePath);
|
|
89
|
+
if (instanceStats.isSymbolicLink() || !instanceStats.isDirectory())
|
|
90
|
+
return false;
|
|
91
|
+
const realRoot = fs.realpathSync.native(instancesDir);
|
|
92
|
+
const realInstance = fs.realpathSync.native(instancePath);
|
|
93
|
+
return isPathWithinDirectory(realInstance, realRoot);
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
exports.isSafeAccountInstancePath = isSafeAccountInstancePath;
|
|
100
|
+
/** Create a missing managed instances root without traversing symlink parents. */
|
|
101
|
+
function ensureSafeAccountInstancesDirectory(instancesDir) {
|
|
102
|
+
const missingPaths = [];
|
|
103
|
+
let currentPath = instancesDir;
|
|
104
|
+
while (true) {
|
|
105
|
+
try {
|
|
106
|
+
const stats = fs.lstatSync(currentPath);
|
|
107
|
+
if (stats.isSymbolicLink() || !stats.isDirectory())
|
|
108
|
+
unsafeInstancePath(currentPath);
|
|
109
|
+
break;
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
if (error.code !== 'ENOENT')
|
|
113
|
+
throw error;
|
|
114
|
+
missingPaths.push(currentPath);
|
|
115
|
+
const parentPath = path.dirname(currentPath);
|
|
116
|
+
if (parentPath === currentPath)
|
|
117
|
+
unsafeInstancePath(instancesDir);
|
|
118
|
+
currentPath = parentPath;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
for (const directoryPath of missingPaths.reverse()) {
|
|
122
|
+
createDirectoryUnderStableParent(directoryPath);
|
|
123
|
+
}
|
|
124
|
+
const rootStats = fs.lstatSync(instancesDir);
|
|
125
|
+
if (rootStats.isSymbolicLink() || !rootStats.isDirectory())
|
|
126
|
+
unsafeInstancePath(instancesDir);
|
|
127
|
+
}
|
|
128
|
+
exports.ensureSafeAccountInstancesDirectory = ensureSafeAccountInstancesDirectory;
|
|
129
|
+
function assertSafeAccountInstancePath(instancesDir, instancePath) {
|
|
130
|
+
if (!isSafeAccountInstancePath(instancesDir, instancePath))
|
|
131
|
+
unsafeInstancePath(instancePath);
|
|
132
|
+
}
|
|
133
|
+
exports.assertSafeAccountInstancePath = assertSafeAccountInstancePath;
|
|
134
|
+
/**
|
|
135
|
+
* Capture the validated directory identity used by later mutation guards.
|
|
136
|
+
* This is defense-in-depth for static and ordinary concurrent replacement,
|
|
137
|
+
* not a hostile same-UID race boundary; that would require dirfd/openat-style APIs.
|
|
138
|
+
*/
|
|
139
|
+
function captureSafeAccountInstanceIdentity(instancesDir, instancePath) {
|
|
140
|
+
assertSafeAccountInstancePath(instancesDir, instancePath);
|
|
141
|
+
const identity = readDirectoryIdentity(instancePath);
|
|
142
|
+
assertAccountInstanceIdentity(instancesDir, instancePath, identity);
|
|
143
|
+
return identity;
|
|
144
|
+
}
|
|
145
|
+
exports.captureSafeAccountInstanceIdentity = captureSafeAccountInstanceIdentity;
|
|
146
|
+
/** Require the lexical instance path to still name the validated directory. */
|
|
147
|
+
function assertAccountInstanceIdentity(instancesDir, instancePath, expectedIdentity) {
|
|
148
|
+
if (!isSafeAccountInstancePath(instancesDir, instancePath))
|
|
149
|
+
unsafeInstancePath(instancePath);
|
|
150
|
+
let currentIdentity;
|
|
151
|
+
try {
|
|
152
|
+
currentIdentity = readDirectoryIdentity(instancePath);
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
unsafeInstancePath(instancePath);
|
|
156
|
+
}
|
|
157
|
+
if (!identitiesMatch(expectedIdentity, currentIdentity))
|
|
158
|
+
unsafeInstancePath(instancePath);
|
|
159
|
+
}
|
|
160
|
+
exports.assertAccountInstanceIdentity = assertAccountInstanceIdentity;
|
|
33
161
|
function listAccountInstanceNames(instancesDir) {
|
|
34
162
|
if (!fs.existsSync(instancesDir)) {
|
|
35
163
|
return [];
|
|
@@ -38,12 +166,7 @@ function listAccountInstanceNames(instancesDir) {
|
|
|
38
166
|
if (!isAccountInstanceName(name)) {
|
|
39
167
|
return false;
|
|
40
168
|
}
|
|
41
|
-
|
|
42
|
-
return fs.statSync(path.join(instancesDir, name)).isDirectory();
|
|
43
|
-
}
|
|
44
|
-
catch {
|
|
45
|
-
return false;
|
|
46
|
-
}
|
|
169
|
+
return isSafeAccountInstancePath(instancesDir, path.join(instancesDir, name));
|
|
47
170
|
});
|
|
48
171
|
}
|
|
49
172
|
exports.listAccountInstanceNames = listAccountInstanceNames;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instance-directory.js","sourceRoot":"","sources":["../../src/management/instance-directory.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,2CAA6B;AAE7B,SAAgB,qBAAqB,CAAC,IAAY;IAChD,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AAC/B,CAAC;AAFD,sDAEC;AAED,SAAgB,
|
|
1
|
+
{"version":3,"file":"instance-directory.js","sourceRoot":"","sources":["../../src/management/instance-directory.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
import type { AccountContextPolicy } from '../auth/account-context';
|
|
9
9
|
/** Options for instance creation */
|
|
10
10
|
export interface InstanceOptions {
|
|
11
|
-
/** Skip shared symlinks (commands, skills, agents, settings.json) */
|
|
11
|
+
/** Skip shared symlinks (commands, skills, agents, settings.json, CLAUDE.md) */
|
|
12
12
|
bare?: boolean;
|
|
13
13
|
}
|
|
14
14
|
/**
|
|
@@ -53,10 +53,7 @@ declare class InstanceManager {
|
|
|
53
53
|
* Selectively copies only mcpServers key (not OAuth sessions or caches).
|
|
54
54
|
*/
|
|
55
55
|
syncMcpServers(instancePath: string): boolean;
|
|
56
|
-
|
|
57
|
-
* Sanitize profile name for filesystem
|
|
58
|
-
*/
|
|
59
|
-
private sanitizeName;
|
|
56
|
+
private getInstanceStats;
|
|
60
57
|
}
|
|
61
58
|
export { InstanceManager };
|
|
62
59
|
export default InstanceManager;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instance-manager.d.ts","sourceRoot":"","sources":["../../src/management/instance-manager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"instance-manager.d.ts","sourceRoot":"","sources":["../../src/management/instance-manager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAgBpE,oCAAoC;AACpC,MAAM,WAAW,eAAe;IAC9B,gFAAgF;IAChF,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,cAAM,eAAe;IACnB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAyB;IACzD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAyB;;IAS1D;;OAEG;IACG,cAAc,CAClB,WAAW,EAAE,MAAM,EACnB,aAAa,GAAE,oBAA6D,EAC5E,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,MAAM,CAAC;IAkDlB;;OAEG;IACH,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAK5C;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAmB1B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAuBxB;;OAEG;IACG,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBxD;;OAEG;IACH,aAAa,IAAI,MAAM,EAAE;IAIzB;;OAEG;IACH,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAKzC;;;OAGG;IACH,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO;IA+D7C,OAAO,CAAC,gBAAgB;CAQzB;AAED,OAAO,EAAE,eAAe,EAAE,CAAC;AAC3B,eAAe,eAAe,CAAC"}
|
|
@@ -42,6 +42,7 @@ const account_context_1 = require("../auth/account-context");
|
|
|
42
42
|
const config_manager_1 = require("../utils/config-manager");
|
|
43
43
|
const logging_1 = require("../services/logging");
|
|
44
44
|
const config_loader_facade_1 = require("../config/config-loader-facade");
|
|
45
|
+
const error_types_1 = require("../errors/error-types");
|
|
45
46
|
const instance_directory_1 = require("./instance-directory");
|
|
46
47
|
const logger = (0, logging_1.createLogger)('management:instance-manager');
|
|
47
48
|
const MANAGED_MCP_SERVER_NAMES = new Set(['ccs-websearch', 'ccs-image-analysis', 'ccs-browser']);
|
|
@@ -60,16 +61,26 @@ class InstanceManager {
|
|
|
60
61
|
*/
|
|
61
62
|
async ensureInstance(profileName, contextPolicy = { mode: account_context_1.DEFAULT_ACCOUNT_CONTEXT_MODE }, options = {}) {
|
|
62
63
|
const instancePath = this.getInstancePath(profileName);
|
|
64
|
+
const initialInstanceStats = this.getInstanceStats(instancePath);
|
|
65
|
+
if (initialInstanceStats) {
|
|
66
|
+
(0, instance_directory_1.assertSafeAccountInstancePath)(this.instancesDir, instancePath);
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
(0, instance_directory_1.ensureSafeAccountInstancesDirectory)(this.instancesDir);
|
|
70
|
+
}
|
|
63
71
|
// Serialize context sync operations per profile across processes.
|
|
64
72
|
await this.contextSyncLock.withLock(profileName, async () => {
|
|
65
73
|
// Lazy initialization
|
|
66
|
-
if (!
|
|
74
|
+
if (!this.getInstanceStats(instancePath)) {
|
|
75
|
+
(0, instance_directory_1.ensureSafeAccountInstancesDirectory)(this.instancesDir);
|
|
67
76
|
logger.stage('route', 'instance.init', 'Initializing new profile instance', {
|
|
68
77
|
profile: profileName,
|
|
69
78
|
bare: options.bare === true,
|
|
70
79
|
});
|
|
71
80
|
this.initializeInstance(profileName, instancePath, options);
|
|
72
81
|
}
|
|
82
|
+
// Re-check after locking/creation before any operation can mutate the instance.
|
|
83
|
+
(0, instance_directory_1.assertSafeAccountInstancePath)(this.instancesDir, instancePath);
|
|
73
84
|
// Validate structure (auto-fix missing dirs)
|
|
74
85
|
this.validateInstance(instancePath);
|
|
75
86
|
// Apply context policy (isolated by default, optional shared group).
|
|
@@ -94,7 +105,7 @@ class InstanceManager {
|
|
|
94
105
|
* Get instance path for profile
|
|
95
106
|
*/
|
|
96
107
|
getInstancePath(profileName) {
|
|
97
|
-
const safeName =
|
|
108
|
+
const safeName = (0, instance_directory_1.normalizeAccountInstanceName)(profileName);
|
|
98
109
|
return path.join(this.instancesDir, safeName);
|
|
99
110
|
}
|
|
100
111
|
/**
|
|
@@ -103,27 +114,12 @@ class InstanceManager {
|
|
|
103
114
|
initializeInstance(profileName, instancePath, _options = {}) {
|
|
104
115
|
try {
|
|
105
116
|
// Create base directory
|
|
106
|
-
fs.mkdirSync(instancePath, {
|
|
107
|
-
//
|
|
108
|
-
|
|
109
|
-
'session-env',
|
|
110
|
-
'todos',
|
|
111
|
-
'logs',
|
|
112
|
-
'file-history',
|
|
113
|
-
'shell-snapshots',
|
|
114
|
-
'debug',
|
|
115
|
-
'.anthropic',
|
|
116
|
-
];
|
|
117
|
-
subdirs.forEach((dir) => {
|
|
118
|
-
const dirPath = path.join(instancePath, dir);
|
|
119
|
-
if (!fs.existsSync(dirPath)) {
|
|
120
|
-
fs.mkdirSync(dirPath, { recursive: true, mode: 0o700 });
|
|
121
|
-
}
|
|
122
|
-
});
|
|
123
|
-
// Shared links are created during ensureInstance() under the plugin layout lock.
|
|
117
|
+
fs.mkdirSync(instancePath, { mode: 0o700 });
|
|
118
|
+
// Expected subdirectories and shared links are created only after the
|
|
119
|
+
// caller validates that this new root stayed inside the managed parent.
|
|
124
120
|
}
|
|
125
121
|
catch (error) {
|
|
126
|
-
throw new
|
|
122
|
+
throw new error_types_1.ProfileError(`Failed to initialize instance for ${profileName}: ${error.message}`, profileName);
|
|
127
123
|
}
|
|
128
124
|
}
|
|
129
125
|
/**
|
|
@@ -241,12 +237,15 @@ class InstanceManager {
|
|
|
241
237
|
return false;
|
|
242
238
|
}
|
|
243
239
|
}
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
240
|
+
getInstanceStats(instancePath) {
|
|
241
|
+
try {
|
|
242
|
+
return fs.lstatSync(instancePath);
|
|
243
|
+
}
|
|
244
|
+
catch (error) {
|
|
245
|
+
if (error.code === 'ENOENT')
|
|
246
|
+
return null;
|
|
247
|
+
throw error;
|
|
248
|
+
}
|
|
250
249
|
}
|
|
251
250
|
}
|
|
252
251
|
exports.InstanceManager = InstanceManager;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instance-manager.js","sourceRoot":"","sources":["../../src/management/instance-manager.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,uCAAyB;AACzB,2CAA6B;AAC7B,sEAA6C;AAC7C,4FAAiE;AACjE,6DAAuE;AAEvE,4DAAqD;AACrD,iDAAmD;AACnD,yEAA2D;AAC3D,
|
|
1
|
+
{"version":3,"file":"instance-manager.js","sourceRoot":"","sources":["../../src/management/instance-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
/// <reference types="node" />
|
|
3
|
+
export declare function readRegularFileContent(filePath: string): Buffer | null;
|
|
4
|
+
export declare function recoverInterruptedClaims(filePath: string): void;
|
|
5
|
+
export declare function claimCanonicalFirstCopy(filePath: string, canonicalContent: Buffer | null, reason: string): boolean;
|
|
6
|
+
//# sourceMappingURL=canonical-first-file-claims.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canonical-first-file-claims.d.ts","sourceRoot":"","sources":["../../../src/management/shared-manager/canonical-first-file-claims.ts"],"names":[],"mappings":";;AAQA,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGtE;AAmED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAa/D;AAED,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,EAChB,gBAAgB,EAAE,MAAM,GAAG,IAAI,EAC/B,MAAM,EAAE,MAAM,GACb,OAAO,CAyBT"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.claimCanonicalFirstCopy = exports.recoverInterruptedClaims = exports.readRegularFileContent = void 0;
|
|
27
|
+
const fs = __importStar(require("fs"));
|
|
28
|
+
const path = __importStar(require("path"));
|
|
29
|
+
const ui_1 = require("../../utils/ui");
|
|
30
|
+
const fs_helpers_1 = require("./fs-helpers");
|
|
31
|
+
let claimSequence = 0;
|
|
32
|
+
function readRegularFileContent(filePath) {
|
|
33
|
+
const stats = (0, fs_helpers_1.getLstatSync)(filePath);
|
|
34
|
+
return stats?.isFile() ? fs.readFileSync(filePath) : null;
|
|
35
|
+
}
|
|
36
|
+
exports.readRegularFileContent = readRegularFileContent;
|
|
37
|
+
function preserveClaim(filePath, claimPath, reason) {
|
|
38
|
+
const basePath = `${filePath}.ccs-shared-conflict`;
|
|
39
|
+
let sequence = 0;
|
|
40
|
+
while (true) {
|
|
41
|
+
const recoveryPath = sequence === 0 ? basePath : `${basePath}-${sequence}`;
|
|
42
|
+
try {
|
|
43
|
+
fs.linkSync(claimPath, recoveryPath);
|
|
44
|
+
try {
|
|
45
|
+
fs.unlinkSync(claimPath);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
// Both names preserve the same inode, so leaving the claim is safe.
|
|
49
|
+
}
|
|
50
|
+
console.log((0, ui_1.warn)(`${reason}; preserved content at ${recoveryPath}`));
|
|
51
|
+
return recoveryPath;
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
const code = err.code;
|
|
55
|
+
if (code === 'EEXIST') {
|
|
56
|
+
sequence++;
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
try {
|
|
60
|
+
fs.copyFileSync(claimPath, recoveryPath, fs.constants.COPYFILE_EXCL);
|
|
61
|
+
fs.chmodSync(recoveryPath, fs.statSync(claimPath).mode & 0o777);
|
|
62
|
+
fs.unlinkSync(claimPath);
|
|
63
|
+
console.log((0, ui_1.warn)(`${reason}; copied content to ${recoveryPath} (${code ?? 'link failed'})`));
|
|
64
|
+
return recoveryPath;
|
|
65
|
+
}
|
|
66
|
+
catch (copyError) {
|
|
67
|
+
if (copyError.code === 'EEXIST') {
|
|
68
|
+
sequence++;
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
if (!(0, fs_helpers_1.getLstatSync)(filePath)) {
|
|
72
|
+
try {
|
|
73
|
+
fs.renameSync(claimPath, filePath);
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
// The claim remains the only recoverable copy if restoration loses a race.
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
console.log((0, ui_1.warn)(`${reason}; unable to publish recovery, restored original when possible`));
|
|
80
|
+
throw err;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
function interruptedClaimPaths(filePath) {
|
|
86
|
+
const directory = path.dirname(filePath);
|
|
87
|
+
const prefix = `${path.basename(filePath)}.ccs-shared-claim-`;
|
|
88
|
+
try {
|
|
89
|
+
return fs
|
|
90
|
+
.readdirSync(directory)
|
|
91
|
+
.filter((entry) => entry.startsWith(prefix))
|
|
92
|
+
.map((entry) => path.join(directory, entry))
|
|
93
|
+
.filter((entryPath) => fs.lstatSync(entryPath).isFile())
|
|
94
|
+
.sort();
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
if (err.code === 'ENOENT')
|
|
98
|
+
return [];
|
|
99
|
+
throw err;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
function recoverInterruptedClaims(filePath) {
|
|
103
|
+
const claims = interruptedClaimPaths(filePath);
|
|
104
|
+
if (claims.length === 0)
|
|
105
|
+
return;
|
|
106
|
+
if (claims.length === 1 && !(0, fs_helpers_1.getLstatSync)(filePath)) {
|
|
107
|
+
fs.renameSync(claims[0], filePath);
|
|
108
|
+
console.log((0, ui_1.warn)(`Recovered interrupted shared-file claim at ${filePath}`));
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
for (const claimPath of claims) {
|
|
112
|
+
preserveClaim(filePath, claimPath, `Quarantined interrupted shared-file claim for ${filePath}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
exports.recoverInterruptedClaims = recoverInterruptedClaims;
|
|
116
|
+
function claimCanonicalFirstCopy(filePath, canonicalContent, reason) {
|
|
117
|
+
const initialStats = (0, fs_helpers_1.getLstatSync)(filePath);
|
|
118
|
+
if (!initialStats?.isFile())
|
|
119
|
+
return false;
|
|
120
|
+
const claimPath = `${filePath}.ccs-shared-claim-${process.pid}-${Date.now()}-${claimSequence++}`;
|
|
121
|
+
fs.renameSync(filePath, claimPath);
|
|
122
|
+
if ((0, fs_helpers_1.getLstatSync)(filePath)) {
|
|
123
|
+
preserveClaim(filePath, claimPath, `Concurrent replacement detected at ${filePath}`);
|
|
124
|
+
throw Object.assign(new TypeError(`Concurrent replacement detected at ${filePath}`), {
|
|
125
|
+
code: 'EEXIST',
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
const claimedContent = fs.readFileSync(claimPath);
|
|
129
|
+
if (canonicalContent?.equals(claimedContent)) {
|
|
130
|
+
fs.unlinkSync(claimPath);
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
preserveClaim(filePath, claimPath, reason);
|
|
134
|
+
}
|
|
135
|
+
if ((0, fs_helpers_1.getLstatSync)(filePath)) {
|
|
136
|
+
throw Object.assign(new TypeError(`Path reappeared during reconciliation: ${filePath}`), {
|
|
137
|
+
code: 'EEXIST',
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
return true;
|
|
141
|
+
}
|
|
142
|
+
exports.claimCanonicalFirstCopy = claimCanonicalFirstCopy;
|
|
143
|
+
//# sourceMappingURL=canonical-first-file-claims.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canonical-first-file-claims.js","sourceRoot":"","sources":["../../../src/management/shared-manager/canonical-first-file-claims.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
interface CanonicalFirstRoots {
|
|
2
|
+
claudeDir: string;
|
|
3
|
+
sharedDir: string;
|
|
4
|
+
instancesDir: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Reconcile a canonical-first shared file before any seed or symlink mutation.
|
|
8
|
+
* Existing canonical content always wins. With no canonical, one unique byte
|
|
9
|
+
* variant is adopted; conflicting variants are all quarantined for recovery.
|
|
10
|
+
*/
|
|
11
|
+
export declare function reconcileCanonicalFirstFile(roots: CanonicalFirstRoots, fileName: string): void;
|
|
12
|
+
/** Preserve a later divergent copy without allowing it to replace canonical content. */
|
|
13
|
+
export declare function preserveCanonicalFirstDivergence(divergedPath: string, canonicalPath: string): boolean;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=canonical-first-file-reconciler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canonical-first-file-reconciler.d.ts","sourceRoot":"","sources":["../../../src/management/shared-manager/canonical-first-file-reconciler.ts"],"names":[],"mappings":"AAmBA,UAAU,mBAAmB;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AA6CD;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAiD9F;AAED,wFAAwF;AACxF,wBAAgB,gCAAgC,CAC9C,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,GACpB,OAAO,CAaT"}
|