@kaitranntt/ccs 8.8.1 → 8.9.0-dev.10
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 +9 -7
- 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/install-lifecycle-lock.d.ts +2 -0
- package/dist/cliproxy/binary/install-lifecycle-lock.d.ts.map +1 -0
- package/dist/cliproxy/binary/install-lifecycle-lock.js +63 -0
- package/dist/cliproxy/binary/install-lifecycle-lock.js.map +1 -0
- package/dist/cliproxy/binary/installer.d.ts +13 -1
- package/dist/cliproxy/binary/installer.d.ts.map +1 -1
- package/dist/cliproxy/binary/installer.js +81 -42
- package/dist/cliproxy/binary/installer.js.map +1 -1
- package/dist/cliproxy/binary/lifecycle.d.ts +6 -1
- package/dist/cliproxy/binary/lifecycle.d.ts.map +1 -1
- package/dist/cliproxy/binary/lifecycle.js +13 -10
- package/dist/cliproxy/binary/lifecycle.js.map +1 -1
- package/dist/cliproxy/binary-manager.d.ts +3 -0
- package/dist/cliproxy/binary-manager.d.ts.map +1 -1
- package/dist/cliproxy/binary-manager.js +32 -30
- 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/extended-context-config.d.ts.map +1 -1
- package/dist/cliproxy/config/extended-context-config.js +38 -1
- package/dist/cliproxy/config/extended-context-config.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/executor/launch-settings.d.ts.map +1 -1
- package/dist/cliproxy/executor/launch-settings.js +9 -2
- package/dist/cliproxy/executor/launch-settings.js.map +1 -1
- package/dist/cliproxy/model-catalog.d.ts +8 -0
- package/dist/cliproxy/model-catalog.d.ts.map +1 -1
- package/dist/cliproxy/model-catalog.js +109 -2
- 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/binary-service.d.ts.map +1 -1
- package/dist/cliproxy/services/binary-service.js +24 -20
- package/dist/cliproxy/services/binary-service.js.map +1 -1
- package/dist/cliproxy/services/catalog-cache.d.ts.map +1 -1
- package/dist/cliproxy/services/catalog-cache.js +8 -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/binary-types.d.ts +1 -0
- package/dist/cliproxy/types/binary-types.d.ts.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/format-helpers.js +1 -1
- package/dist/commands/cliproxy/quota-subcommand/handlers.js +1 -1
- package/dist/commands/cliproxy/quota-subcommand/handlers.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 +3 -2
- package/dist/commands/cliproxy/quota-subcommand/sections/claude.js.map +1 -1
- package/dist/commands/cliproxy/quota-subcommand/sections/codex.js +1 -1
- package/dist/commands/cliproxy/quota-subcommand/sections/codex.js.map +1 -1
- package/dist/commands/cliproxy/quota-subcommand/sections/gemini-cli.js +1 -1
- package/dist/commands/cliproxy/quota-subcommand/sections/gemini-cli.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/delegation-handler.d.ts.map +1 -1
- package/dist/delegation/delegation-handler.js +12 -2
- package/dist/delegation/delegation-handler.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 +391 -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 +18 -2
- package/dist/shared/extended-context-utils.d.ts.map +1 -1
- package/dist/shared/extended-context-utils.js +38 -3
- package/dist/shared/extended-context-utils.js.map +1 -1
- package/dist/shared/provider-preset-catalog.d.ts +2 -1
- package/dist/shared/provider-preset-catalog.d.ts.map +1 -1
- package/dist/shared/provider-preset-catalog.js +18 -1
- package/dist/shared/provider-preset-catalog.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-Dv0FgbfN.js} +1 -1
- package/dist/ui/assets/{accounts-Cvmw1zaL.js → accounts-DD4gJm5G.js} +1 -1
- package/dist/ui/assets/{alert-dialog-xN1Vxm4Q.js → alert-dialog-CfsyUL5i.js} +1 -1
- package/dist/ui/assets/{api-UjGDV1dn.js → api-Rml_6r1f.js} +1 -1
- package/dist/ui/assets/{auth-section-exE9zovq.js → auth-section-ud23YOqo.js} +1 -1
- package/dist/ui/assets/{backups-section-CANdqpNT.js → backups-section-BvojIR_s.js} +1 -1
- package/dist/ui/assets/{channels-C8d6AgLN.js → channels-C6JAnQ-P.js} +1 -1
- package/dist/ui/assets/{checkbox-B71vxZdD.js → checkbox-e4TE1vtU.js} +1 -1
- package/dist/ui/assets/{claude-extension-COD7m8Iq.js → claude-extension-Crqbbisi.js} +1 -1
- package/dist/ui/assets/cliproxy-CTzg_fbJ.js +4 -0
- package/dist/ui/assets/{cliproxy-ai-providers-C79GuQ92.js → cliproxy-ai-providers-DRfGjeni.js} +5 -5
- package/dist/ui/assets/{cliproxy-control-panel-B6_hOtz6.js → cliproxy-control-panel-C0TgmqD6.js} +1 -1
- package/dist/ui/assets/{codex-3mlgCMGk.js → codex-CGFN2_Yz.js} +1 -1
- package/dist/ui/assets/{confirm-dialog-CHnCNFFP.js → confirm-dialog-CWYwcPu7.js} +1 -1
- package/dist/ui/assets/{copilot-CfmS6yON.js → copilot-CDo33AQ9.js} +2 -2
- package/dist/ui/assets/{cursor-tzPHgV8J.js → cursor-nVJdycFe.js} +1 -1
- package/dist/ui/assets/{droid-Bc8LlbJa.js → droid-C1mg2O8N.js} +1 -1
- package/dist/ui/assets/{globalenv-section-DTYeLBoB.js → globalenv-section-D0iUrk5Z.js} +1 -1
- package/dist/ui/assets/{health-9Xyzeiyx.js → health-CIcj1Jxy.js} +1 -1
- package/dist/ui/assets/{index-B0M7QB1o.js → index-AosRBwPp.js} +1 -1
- package/dist/ui/assets/{index-DoHAX6LH.js → index-BCqgbLRB.js} +1 -1
- package/dist/ui/assets/{index-CEx6YJb5.js → index-BxcCMHzL.js} +1 -1
- package/dist/ui/assets/{index-Bz1gMXk1.js → index-DZbSKKhp.js} +1 -1
- package/dist/ui/assets/{index-DuD3QaMG.js → index-DvvpgsgL.js} +1 -1
- package/dist/ui/assets/index-DwlqXVPF.js +56 -0
- package/dist/ui/assets/{index-Bjg11-rW.js → index-W-L7VU-4.js} +1 -1
- package/dist/ui/assets/{logs-CrjUtfDp.js → logs-CLIARnH2.js} +1 -1
- package/dist/ui/assets/{masked-input-BAtRbixr.js → masked-input-BRcjJtU3.js} +1 -1
- package/dist/ui/assets/proxy-status-widget-CBBs3HmJ.js +1 -0
- package/dist/ui/assets/{raw-json-settings-editor-panel-CvJCywnk.js → raw-json-settings-editor-panel-DhDm8jkK.js} +1 -1
- package/dist/ui/assets/{searchable-select-Bn50_-2s.js → searchable-select-DW5e6ct1.js} +1 -1
- package/dist/ui/assets/{separator-DY36bzud.js → separator-D-2blr1t.js} +1 -1
- package/dist/ui/assets/{shared-BynjOvKs.js → shared-BIRVeSaP.js} +1 -1
- package/dist/ui/assets/{table-DdcK8yYq.js → table-CEyFyU_X.js} +1 -1
- package/dist/ui/assets/{updates-D27A1hQG.js → updates-Dcpm3clh.js} +1 -1
- package/dist/ui/assets/{use-accounts-CRxt0j07.js → use-accounts-Cjb9-mnK.js} +1 -1
- package/dist/ui/icons/orcarouter.svg +1 -0
- 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/hooks/image-analysis-backend-resolver.d.ts.map +1 -1
- package/dist/utils/hooks/image-analysis-backend-resolver.js +6 -0
- package/dist/utils/hooks/image-analysis-backend-resolver.js.map +1 -1
- package/dist/utils/hooks/image-analysis-runtime-status.d.ts.map +1 -1
- package/dist/utils/hooks/image-analysis-runtime-status.js +8 -3
- package/dist/utils/hooks/image-analysis-runtime-status.js.map +1 -1
- package/dist/utils/package-manager-detector.d.ts.map +1 -1
- package/dist/utils/package-manager-detector.js +6 -2
- package/dist/utils/package-manager-detector.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/agy.d.ts +3 -1
- package/dist/utils/websearch/agy.d.ts.map +1 -1
- package/dist/utils/websearch/agy.js +33 -23
- package/dist/utils/websearch/agy.js.map +1 -1
- 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/gemini-cli.d.ts +3 -1
- package/dist/utils/websearch/gemini-cli.d.ts.map +1 -1
- package/dist/utils/websearch/gemini-cli.js +33 -23
- package/dist/utils/websearch/gemini-cli.js.map +1 -1
- package/dist/utils/websearch/grok-cli.d.ts +3 -1
- package/dist/utils/websearch/grok-cli.d.ts.map +1 -1
- package/dist/utils/websearch/grok-cli.js +33 -23
- package/dist/utils/websearch/grok-cli.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/opencode-cli.d.ts +3 -1
- package/dist/utils/websearch/opencode-cli.d.ts.map +1 -1
- package/dist/utils/websearch/opencode-cli.js +33 -23
- package/dist/utils/websearch/opencode-cli.js.map +1 -1
- package/dist/utils/websearch/status.d.ts +7 -3
- package/dist/utils/websearch/status.d.ts.map +1 -1
- package/dist/utils/websearch/status.js +50 -31
- 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 +43 -10
- 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/services/cliproxy-dashboard-install-service.d.ts +5 -0
- package/dist/web-server/services/cliproxy-dashboard-install-service.d.ts.map +1 -1
- package/dist/web-server/services/cliproxy-dashboard-install-service.js +53 -36
- package/dist/web-server/services/cliproxy-dashboard-install-service.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 +6 -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/dev-release.sh +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
|
@@ -0,0 +1,391 @@
|
|
|
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.adoptDivergedFileContent = exports.recoverOrphanedCanonicalClaim = exports.assertAdoptionPathAbsent = 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 adoptionClaimSequence = 0;
|
|
32
|
+
function resolveLexicalSymlinkChain(targetPath) {
|
|
33
|
+
let currentPath = path.resolve(targetPath);
|
|
34
|
+
const visited = new Set();
|
|
35
|
+
while (true) {
|
|
36
|
+
if (visited.has(currentPath)) {
|
|
37
|
+
throw Object.assign(new TypeError(`Symlink loop while resolving ${targetPath}`), {
|
|
38
|
+
code: 'ELOOP',
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
visited.add(currentPath);
|
|
42
|
+
const stats = (0, fs_helpers_1.getLstatSync)(currentPath);
|
|
43
|
+
if (!stats?.isSymbolicLink())
|
|
44
|
+
return currentPath;
|
|
45
|
+
currentPath = path.resolve(path.dirname(currentPath), fs.readlinkSync(currentPath));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function assertAdoptionPathAbsent(managedPath, adoption) {
|
|
49
|
+
if (adoption === 'claimed' && (0, fs_helpers_1.getLstatSync)(managedPath)) {
|
|
50
|
+
throw Object.assign(new TypeError(`Path reappeared during reconciliation: ${managedPath}`), {
|
|
51
|
+
code: 'EEXIST',
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
exports.assertAdoptionPathAbsent = assertAdoptionPathAbsent;
|
|
56
|
+
function recoverOrphanedCanonicalClaim(canonicalPath) {
|
|
57
|
+
const writePath = resolveLexicalSymlinkChain(canonicalPath);
|
|
58
|
+
const directory = path.dirname(writePath);
|
|
59
|
+
const prefix = `${path.basename(writePath)}.ccs-canonical-claim-`;
|
|
60
|
+
let candidates;
|
|
61
|
+
try {
|
|
62
|
+
candidates = fs
|
|
63
|
+
.readdirSync(directory)
|
|
64
|
+
.filter((entry) => entry.startsWith(prefix))
|
|
65
|
+
.map((entry) => path.join(directory, entry))
|
|
66
|
+
.filter((entryPath) => fs.lstatSync(entryPath).isFile())
|
|
67
|
+
.sort((left, right) => fs.statSync(right).mtimeMs - fs.statSync(left).mtimeMs);
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
if (err.code === 'ENOENT')
|
|
71
|
+
return false;
|
|
72
|
+
throw err;
|
|
73
|
+
}
|
|
74
|
+
const claimPath = candidates[0];
|
|
75
|
+
if (!claimPath)
|
|
76
|
+
return false;
|
|
77
|
+
let recovered = false;
|
|
78
|
+
if (!(0, fs_helpers_1.getLstatSync)(writePath)) {
|
|
79
|
+
fs.linkSync(claimPath, writePath);
|
|
80
|
+
fs.unlinkSync(claimPath);
|
|
81
|
+
candidates.shift();
|
|
82
|
+
recovered = true;
|
|
83
|
+
console.log((0, ui_1.warn)(`Recovered interrupted canonical adoption at ${canonicalPath}`));
|
|
84
|
+
}
|
|
85
|
+
for (const leftoverClaim of candidates) {
|
|
86
|
+
const recoveryBase = `${writePath}.ccs-canonical-recovery`;
|
|
87
|
+
let sequence = 0;
|
|
88
|
+
while (true) {
|
|
89
|
+
const recoveryPath = sequence === 0 ? recoveryBase : `${recoveryBase}-${sequence}`;
|
|
90
|
+
try {
|
|
91
|
+
fs.linkSync(leftoverClaim, recoveryPath);
|
|
92
|
+
fs.unlinkSync(leftoverClaim);
|
|
93
|
+
console.log((0, ui_1.warn)(`Quarantined interrupted canonical claim at ${recoveryPath}`));
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
if (err.code !== 'EEXIST')
|
|
98
|
+
throw err;
|
|
99
|
+
sequence++;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return recovered;
|
|
104
|
+
}
|
|
105
|
+
exports.recoverOrphanedCanonicalClaim = recoverOrphanedCanonicalClaim;
|
|
106
|
+
function preserveClaim(claimPath, divergedPath, reason) {
|
|
107
|
+
const recoveryBase = `${divergedPath}.ccs-adopt-recovery`;
|
|
108
|
+
let sequence = 0;
|
|
109
|
+
while (true) {
|
|
110
|
+
const recoveryPath = sequence === 0 ? recoveryBase : `${recoveryBase}-${sequence}`;
|
|
111
|
+
try {
|
|
112
|
+
// link() is an atomic no-replace operation, so concurrent CCS
|
|
113
|
+
// processes cannot overwrite each other's recovery artifacts.
|
|
114
|
+
fs.linkSync(claimPath, recoveryPath);
|
|
115
|
+
try {
|
|
116
|
+
fs.unlinkSync(claimPath);
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
// Both names preserve the same bytes; leaving the claim is safe.
|
|
120
|
+
}
|
|
121
|
+
console.log((0, ui_1.warn)(`${reason}; preserved content at ${recoveryPath}`));
|
|
122
|
+
return recoveryPath;
|
|
123
|
+
}
|
|
124
|
+
catch (err) {
|
|
125
|
+
const code = err.code;
|
|
126
|
+
if (code === 'EEXIST') {
|
|
127
|
+
sequence++;
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
console.log((0, ui_1.warn)(`${reason}; content remains at ${claimPath}${code ? ` (${code})` : ''}`));
|
|
131
|
+
return claimPath;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
function validateManagedJson(filePath, content) {
|
|
136
|
+
if (path.extname(filePath).toLowerCase() !== '.json') {
|
|
137
|
+
return true;
|
|
138
|
+
}
|
|
139
|
+
try {
|
|
140
|
+
const parsed = JSON.parse(content.toString('utf8'));
|
|
141
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
if (path.basename(filePath) === 'installed_plugins.json') {
|
|
145
|
+
const registry = parsed;
|
|
146
|
+
return (typeof registry.plugins === 'object' &&
|
|
147
|
+
registry.plugins !== null &&
|
|
148
|
+
!Array.isArray(registry.plugins));
|
|
149
|
+
}
|
|
150
|
+
return true;
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
function canonicalIdentityOf(stats) {
|
|
157
|
+
return { ino: stats.ino, mtimeMs: stats.mtimeMs, size: stats.size };
|
|
158
|
+
}
|
|
159
|
+
function canonicalIdentityMatches(expected, current) {
|
|
160
|
+
if (!expected || !current)
|
|
161
|
+
return expected === current;
|
|
162
|
+
return (expected.ino === current.ino &&
|
|
163
|
+
expected.mtimeMs === current.mtimeMs &&
|
|
164
|
+
expected.size === current.size);
|
|
165
|
+
}
|
|
166
|
+
function tempWritePath(targetPath) {
|
|
167
|
+
return `${targetPath}.ccs-write-${process.pid}-${Date.now()}-${adoptionClaimSequence++}`;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Write content into a fresh temp file and make it durable, so whatever
|
|
171
|
+
* publishes it under its final name publishes complete bytes.
|
|
172
|
+
*/
|
|
173
|
+
function writeDurableTempFile(tempPath, content, mode) {
|
|
174
|
+
let descriptor = null;
|
|
175
|
+
try {
|
|
176
|
+
descriptor = fs.openSync(tempPath, 'wx', mode);
|
|
177
|
+
fs.fchmodSync(descriptor, mode);
|
|
178
|
+
fs.writeFileSync(descriptor, content);
|
|
179
|
+
fs.fsyncSync(descriptor);
|
|
180
|
+
}
|
|
181
|
+
finally {
|
|
182
|
+
if (descriptor !== null) {
|
|
183
|
+
fs.closeSync(descriptor);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
function discardTempFile(tempPath) {
|
|
188
|
+
try {
|
|
189
|
+
fs.unlinkSync(tempPath);
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
// The temp file may not have been created or may already have been renamed.
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Create a file only if the path is free, writing the content atomically.
|
|
197
|
+
*
|
|
198
|
+
* link() is an atomic no-replace operation, so concurrent CCS processes
|
|
199
|
+
* cannot overwrite each other's sidecar artifacts.
|
|
200
|
+
*/
|
|
201
|
+
function createFileNoReplace(targetPath, content, mode) {
|
|
202
|
+
const tempPath = tempWritePath(targetPath);
|
|
203
|
+
try {
|
|
204
|
+
writeDurableTempFile(tempPath, content, mode);
|
|
205
|
+
fs.linkSync(tempPath, targetPath);
|
|
206
|
+
fs.unlinkSync(tempPath);
|
|
207
|
+
}
|
|
208
|
+
catch (err) {
|
|
209
|
+
discardTempFile(tempPath);
|
|
210
|
+
throw err;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Publish a sidecar next to a managed file, never replacing an existing one.
|
|
215
|
+
* Numbered suffixes keep every concurrent writer's artifact recoverable.
|
|
216
|
+
*/
|
|
217
|
+
function publishSidecarNoReplace(basePath, content, mode) {
|
|
218
|
+
let sequence = 0;
|
|
219
|
+
while (true) {
|
|
220
|
+
const sidecarPath = sequence === 0 ? basePath : `${basePath}-${sequence}`;
|
|
221
|
+
try {
|
|
222
|
+
createFileNoReplace(sidecarPath, content, mode);
|
|
223
|
+
return sidecarPath;
|
|
224
|
+
}
|
|
225
|
+
catch (err) {
|
|
226
|
+
if (err.code !== 'EEXIST')
|
|
227
|
+
throw err;
|
|
228
|
+
sequence++;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Publish adopted content onto the canonical path by replacement.
|
|
234
|
+
*
|
|
235
|
+
* The canonical path is never emptied: a fully written temp file is renamed
|
|
236
|
+
* over it, so no window exists in which Claude Code or a second `ccs` can
|
|
237
|
+
* observe the path as missing and seed an empty placeholder there.
|
|
238
|
+
*
|
|
239
|
+
* A compare-and-swap guard runs as late as possible - after the temp file is
|
|
240
|
+
* durable, immediately before the rename. When the canonical inode changed
|
|
241
|
+
* since it was read, publication is refused rather than clobbering a writer
|
|
242
|
+
* that got there first; the adopted bytes stay in the sidecars the caller
|
|
243
|
+
* published. A pure chmod is not a content change, so the mode the inode
|
|
244
|
+
* carries at publication time wins.
|
|
245
|
+
*
|
|
246
|
+
* The guard is read-then-act, not atomic: POSIX offers no compare-and-swap
|
|
247
|
+
* rename, so a writer landing between the check and the rename is still
|
|
248
|
+
* overwritten. That is a narrowing, not a guarantee - the window shrinks from
|
|
249
|
+
* the ~100 ms the old claim-and-republish path left open to two adjacent
|
|
250
|
+
* syscalls, and the pre-image sidecar the caller published keeps even that
|
|
251
|
+
* outcome recoverable. Do not build stricter guarantees on top of it.
|
|
252
|
+
*/
|
|
253
|
+
function publishCanonicalContent(writePath, content, mode, expected) {
|
|
254
|
+
const tempPath = tempWritePath(writePath);
|
|
255
|
+
try {
|
|
256
|
+
writeDurableTempFile(tempPath, content, mode);
|
|
257
|
+
const currentStats = (0, fs_helpers_1.getLstatSync)(writePath);
|
|
258
|
+
const current = currentStats?.isFile() ? canonicalIdentityOf(currentStats) : null;
|
|
259
|
+
if (!canonicalIdentityMatches(expected, current)) {
|
|
260
|
+
// EEXIST is this file's marker for "a race was detected", the same code
|
|
261
|
+
// the reappeared-path and concurrent-replacement guards raise. It does
|
|
262
|
+
// not mean a no-replace link() or open('wx') hit an existing path.
|
|
263
|
+
throw Object.assign(new TypeError(`Canonical file changed during adoption: ${writePath}`), {
|
|
264
|
+
code: 'EEXIST',
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
const publishMode = currentStats ? currentStats.mode & 0o777 : mode;
|
|
268
|
+
if (publishMode !== mode) {
|
|
269
|
+
fs.chmodSync(tempPath, publishMode);
|
|
270
|
+
}
|
|
271
|
+
fs.renameSync(tempPath, writePath);
|
|
272
|
+
}
|
|
273
|
+
catch (err) {
|
|
274
|
+
discardTempFile(tempPath);
|
|
275
|
+
throw err;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
function getCanonicalFile(canonicalPath) {
|
|
279
|
+
const canonicalLstat = (0, fs_helpers_1.getLstatSync)(canonicalPath);
|
|
280
|
+
if (!canonicalLstat) {
|
|
281
|
+
return { content: null, identity: null, mode: 0o600, mtimeMs: null, writePath: canonicalPath };
|
|
282
|
+
}
|
|
283
|
+
let writePath = canonicalPath;
|
|
284
|
+
if (canonicalLstat.isSymbolicLink()) {
|
|
285
|
+
writePath = fs.realpathSync.native(canonicalPath);
|
|
286
|
+
}
|
|
287
|
+
const canonicalStats = fs.statSync(canonicalPath);
|
|
288
|
+
if (!canonicalStats.isFile()) {
|
|
289
|
+
throw Object.assign(new TypeError(`Canonical path is not a regular file: ${canonicalPath}`), {
|
|
290
|
+
code: 'EINVAL',
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
// The identity describes the inode as of the stat above, taken before the
|
|
294
|
+
// content read: a write landing in between leaves us holding newer bytes
|
|
295
|
+
// than the identity describes, and publication fails closed.
|
|
296
|
+
return {
|
|
297
|
+
content: fs.readFileSync(writePath),
|
|
298
|
+
identity: canonicalIdentityOf(canonicalStats),
|
|
299
|
+
mode: canonicalStats.mode & 0o777,
|
|
300
|
+
mtimeMs: canonicalStats.mtimeMs,
|
|
301
|
+
writePath,
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
function adoptDivergedFileContent(divergedPath, canonicalPath) {
|
|
305
|
+
const initialStats = (0, fs_helpers_1.getLstatSync)(divergedPath);
|
|
306
|
+
if (!initialStats?.isFile()) {
|
|
307
|
+
return 'not-claimed';
|
|
308
|
+
}
|
|
309
|
+
const claimPath = `${divergedPath}.ccs-adopt-claim-${process.pid}-${Date.now()}-${adoptionClaimSequence++}`;
|
|
310
|
+
try {
|
|
311
|
+
fs.renameSync(divergedPath, claimPath);
|
|
312
|
+
}
|
|
313
|
+
catch (err) {
|
|
314
|
+
const code = err.code;
|
|
315
|
+
console.log((0, ui_1.warn)(`Unable to claim diverged ${divergedPath}; preserving original${code ? ` (${code})` : ''}`));
|
|
316
|
+
throw err;
|
|
317
|
+
}
|
|
318
|
+
let divergencePreserved = false;
|
|
319
|
+
try {
|
|
320
|
+
const claimedStats = fs.lstatSync(claimPath);
|
|
321
|
+
if (!claimedStats.isFile()) {
|
|
322
|
+
preserveClaim(claimPath, divergedPath, `Refusing non-regular divergence at ${divergedPath}`);
|
|
323
|
+
divergencePreserved = true;
|
|
324
|
+
throw Object.assign(new TypeError(`Refusing non-regular divergence at ${divergedPath}`), {
|
|
325
|
+
code: 'EINVAL',
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
if ((0, fs_helpers_1.getLstatSync)(divergedPath)) {
|
|
329
|
+
preserveClaim(claimPath, divergedPath, `Concurrent replacement detected at ${divergedPath}`);
|
|
330
|
+
divergencePreserved = true;
|
|
331
|
+
throw Object.assign(new TypeError(`Concurrent replacement detected at ${divergedPath}`), {
|
|
332
|
+
code: 'EEXIST',
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
const diverged = fs.readFileSync(claimPath);
|
|
336
|
+
if (!validateManagedJson(divergedPath, diverged)) {
|
|
337
|
+
preserveClaim(claimPath, divergedPath, `Refusing malformed managed JSON at ${divergedPath}`);
|
|
338
|
+
return 'claimed';
|
|
339
|
+
}
|
|
340
|
+
const canonical = getCanonicalFile(canonicalPath);
|
|
341
|
+
if (canonical.content) {
|
|
342
|
+
if (diverged.equals(canonical.content)) {
|
|
343
|
+
fs.unlinkSync(claimPath);
|
|
344
|
+
return 'claimed';
|
|
345
|
+
}
|
|
346
|
+
if (claimedStats.mtimeMs <= (canonical.mtimeMs ?? 0)) {
|
|
347
|
+
preserveClaim(claimPath, divergedPath, `Refusing stale or ambiguously-timed divergence at ${divergedPath}`);
|
|
348
|
+
return 'claimed';
|
|
349
|
+
}
|
|
350
|
+
// Publish the pre-image before the canonical file is replaced, so an
|
|
351
|
+
// interruption mid-publication still leaves the old content recoverable.
|
|
352
|
+
publishSidecarNoReplace(`${canonicalPath}.bak-ccs-adopt`, canonical.content, canonical.mode);
|
|
353
|
+
}
|
|
354
|
+
publishSidecarNoReplace(`${divergedPath}.ccs-adopted-recovery`, diverged, claimedStats.mode & 0o777);
|
|
355
|
+
publishCanonicalContent(canonical.writePath, diverged, canonical.mode, canonical.identity);
|
|
356
|
+
if (!fs.readFileSync(canonicalPath).equals(diverged)) {
|
|
357
|
+
throw Object.assign(new TypeError(`Canonical adoption postcondition failed: ${canonicalPath}`), {
|
|
358
|
+
code: 'EAGAIN',
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
if ((0, fs_helpers_1.getLstatSync)(divergedPath)) {
|
|
362
|
+
preserveClaim(claimPath, divergedPath, `Concurrent replacement detected at ${divergedPath}`);
|
|
363
|
+
divergencePreserved = true;
|
|
364
|
+
throw Object.assign(new TypeError(`Concurrent replacement detected at ${divergedPath}`), {
|
|
365
|
+
code: 'EEXIST',
|
|
366
|
+
});
|
|
367
|
+
}
|
|
368
|
+
fs.unlinkSync(claimPath);
|
|
369
|
+
console.log((0, ui_1.info)(`Adopted diverged ${path.basename(divergedPath)} content into ${canonicalPath}`));
|
|
370
|
+
return 'claimed';
|
|
371
|
+
}
|
|
372
|
+
catch (err) {
|
|
373
|
+
if (divergencePreserved) {
|
|
374
|
+
throw err;
|
|
375
|
+
}
|
|
376
|
+
if (!(0, fs_helpers_1.getLstatSync)(divergedPath)) {
|
|
377
|
+
try {
|
|
378
|
+
fs.renameSync(claimPath, divergedPath);
|
|
379
|
+
}
|
|
380
|
+
catch {
|
|
381
|
+
preserveClaim(claimPath, divergedPath, `Unable to restore diverged ${divergedPath}`);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
else {
|
|
385
|
+
preserveClaim(claimPath, divergedPath, `Unable to restore diverged ${divergedPath}`);
|
|
386
|
+
}
|
|
387
|
+
throw err;
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
exports.adoptDivergedFileContent = adoptDivergedFileContent;
|
|
391
|
+
//# sourceMappingURL=diverged-file-adopter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diverged-file-adopter.js","sourceRoot":"","sources":["../../../src/management/shared-manager/diverged-file-adopter.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,15 @@
|
|
|
11
11
|
/// <reference types="node" />
|
|
12
12
|
import * as fs from 'fs';
|
|
13
13
|
import type { SharedItem } from './types';
|
|
14
|
+
/**
|
|
15
|
+
* Claude Code saves managed files (settings.json, plugins/installed_plugins.json)
|
|
16
|
+
* with an atomic write (temp file + rename), which replaces a managed symlink
|
|
17
|
+
* with a regular file holding the user's latest changes — see #57 and #1681.
|
|
18
|
+
* When reconciliation finds such a diverged regular file, adopt its content
|
|
19
|
+
* into the canonical ~/.claude file before re-creating the symlink, instead
|
|
20
|
+
* of discarding the user's changes. The previous canonical content is kept
|
|
21
|
+
* in a `.bak-ccs-adopt` backup alongside it.
|
|
22
|
+
*/
|
|
14
23
|
/**
|
|
15
24
|
* Return canonical realpath for a path. Falls back to the lexical resolve
|
|
16
25
|
* when realpath fails (e.g. path does not exist).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fs-helpers.d.ts","sourceRoot":"","sources":["../../../src/management/shared-manager/fs-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"fs-helpers.d.ts","sourceRoot":"","sources":["../../../src/management/shared-manager/fs-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAGzB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C;;;;;;;;GAQG;AACH;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAM/D;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAWtF;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAQjF;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,MAAM,CAAC,GAAG,IAAI,CAyBzF;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAsBrE;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAY5E;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOrE;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEvE;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC,CAS3E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,EAAE,CAAC,KAAK,GAAG,IAAI,CAShE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAetF;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,kBAAkB,EAAE,MAAM,EAC1B,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,CAAC,CAYjB"}
|
|
@@ -36,6 +36,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
36
36
|
exports.getConflictCopyPath = exports.fileContentsEqual = exports.getLstatSync = exports.getLstat = exports.ensureDirectory = exports.pathExists = exports.moveDirectory = exports.copyDirectoryFallback = exports.removeExistingPath = exports.symlinkPointsTo = exports.isPathWithinDirectory = exports.resolveCanonicalPath = void 0;
|
|
37
37
|
const fs = __importStar(require("fs"));
|
|
38
38
|
const path = __importStar(require("path"));
|
|
39
|
+
/**
|
|
40
|
+
* Claude Code saves managed files (settings.json, plugins/installed_plugins.json)
|
|
41
|
+
* with an atomic write (temp file + rename), which replaces a managed symlink
|
|
42
|
+
* with a regular file holding the user's latest changes — see #57 and #1681.
|
|
43
|
+
* When reconciliation finds such a diverged regular file, adopt its content
|
|
44
|
+
* into the canonical ~/.claude file before re-creating the symlink, instead
|
|
45
|
+
* of discarding the user's changes. The previous canonical content is kept
|
|
46
|
+
* in a `.bak-ccs-adopt` backup alongside it.
|
|
47
|
+
*/
|
|
39
48
|
/**
|
|
40
49
|
* Return canonical realpath for a path. Falls back to the lexical resolve
|
|
41
50
|
* when realpath fails (e.g. path does not exist).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fs-helpers.js","sourceRoot":"","sources":["../../../src/management/shared-manager/fs-helpers.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,uCAAyB;AACzB,2CAA6B;
|
|
1
|
+
{"version":3,"file":"fs-helpers.js","sourceRoot":"","sources":["../../../src/management/shared-manager/fs-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,7 +25,7 @@ export declare function ensureSharedPluginLayoutDefaults(claudeDir: string): voi
|
|
|
25
25
|
* Link shared plugins directory entries into an instance, creating the
|
|
26
26
|
* instance plugins directory first if needed.
|
|
27
27
|
*/
|
|
28
|
-
export declare function linkInstancePlugins(roots: PluginLayoutRoots, instancePath: string): void;
|
|
28
|
+
export declare function linkInstancePlugins(roots: PluginLayoutRoots, instancePath: string, assertInstanceIdentity?: () => void): void;
|
|
29
29
|
/**
|
|
30
30
|
* Build the list of plugin entries to link from the shared plugins dir.
|
|
31
31
|
* Always includes the default SHARED_PLUGIN_ENTRIES; adds any additional
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-layout-internals.d.ts","sourceRoot":"","sources":["../../../src/management/shared-manager/plugin-layout-internals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"plugin-layout-internals.d.ts","sourceRoot":"","sources":["../../../src/management/shared-manager/plugin-layout-internals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAiBH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAOxE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,mBAAmB,CAAC;AAcpD;;;;GAIG;AACH,wBAAgB,gCAAgC,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAyBxE;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,iBAAiB,EACxB,YAAY,EAAE,MAAM,EACpB,sBAAsB,CAAC,EAAE,MAAM,IAAI,GAClC,IAAI,CAsFN;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,EAAE,CAyCxE;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,CAgD9F"}
|
|
@@ -38,9 +38,19 @@ exports.detachManagedPluginLayout = exports.getSharedPluginLinkItems = exports.l
|
|
|
38
38
|
const fs = __importStar(require("fs"));
|
|
39
39
|
const path = __importStar(require("path"));
|
|
40
40
|
const ui_1 = require("../../utils/ui");
|
|
41
|
+
const diverged_file_adopter_1 = require("./diverged-file-adopter");
|
|
41
42
|
const fs_helpers_1 = require("./fs-helpers");
|
|
42
43
|
const plugin_metadata_normalizer_1 = require("./plugin-metadata-normalizer");
|
|
43
44
|
const types_1 = require("./types");
|
|
45
|
+
function runGuardedInstanceMutation(assertInstanceIdentity, operation) {
|
|
46
|
+
assertInstanceIdentity?.();
|
|
47
|
+
try {
|
|
48
|
+
return operation();
|
|
49
|
+
}
|
|
50
|
+
finally {
|
|
51
|
+
assertInstanceIdentity?.();
|
|
52
|
+
}
|
|
53
|
+
}
|
|
44
54
|
/**
|
|
45
55
|
* Ensure the plugin layout default directories (cache, marketplaces) and
|
|
46
56
|
* registry files (installed_plugins.json, known_marketplaces.json) exist
|
|
@@ -51,6 +61,9 @@ function ensureSharedPluginLayoutDefaults(claudeDir) {
|
|
|
51
61
|
fs.mkdirSync(pluginsDir, { recursive: true, mode: 0o700 });
|
|
52
62
|
for (const entry of types_1.SHARED_PLUGIN_ENTRIES) {
|
|
53
63
|
const entryPath = path.join(pluginsDir, entry.name);
|
|
64
|
+
if (entry.type === 'file') {
|
|
65
|
+
(0, diverged_file_adopter_1.recoverOrphanedCanonicalClaim)(entryPath);
|
|
66
|
+
}
|
|
54
67
|
if (fs.existsSync(entryPath)) {
|
|
55
68
|
continue;
|
|
56
69
|
}
|
|
@@ -70,7 +83,7 @@ exports.ensureSharedPluginLayoutDefaults = ensureSharedPluginLayoutDefaults;
|
|
|
70
83
|
* Link shared plugins directory entries into an instance, creating the
|
|
71
84
|
* instance plugins directory first if needed.
|
|
72
85
|
*/
|
|
73
|
-
function linkInstancePlugins(roots, instancePath) {
|
|
86
|
+
function linkInstancePlugins(roots, instancePath, assertInstanceIdentity) {
|
|
74
87
|
const linkPath = path.join(instancePath, 'plugins');
|
|
75
88
|
const targetPath = path.join(roots.sharedDir, 'plugins');
|
|
76
89
|
let linkStats = null;
|
|
@@ -82,27 +95,52 @@ function linkInstancePlugins(roots, instancePath) {
|
|
|
82
95
|
throw err;
|
|
83
96
|
}
|
|
84
97
|
}
|
|
98
|
+
assertInstanceIdentity?.();
|
|
85
99
|
if (linkStats?.isSymbolicLink() || (linkStats && !linkStats.isDirectory())) {
|
|
86
|
-
|
|
100
|
+
const existingType = linkStats.isDirectory() ? 'directory' : 'file';
|
|
101
|
+
runGuardedInstanceMutation(assertInstanceIdentity, () => (0, fs_helpers_1.removeExistingPath)(linkPath, existingType));
|
|
87
102
|
}
|
|
88
103
|
if (!linkStats || !linkStats.isDirectory()) {
|
|
89
|
-
fs.mkdirSync(linkPath, { recursive: true, mode: 0o700 });
|
|
104
|
+
runGuardedInstanceMutation(assertInstanceIdentity, () => fs.mkdirSync(linkPath, { recursive: true, mode: 0o700 }));
|
|
90
105
|
}
|
|
91
|
-
|
|
106
|
+
const linkItems = getSharedPluginLinkItems(roots.sharedDir);
|
|
107
|
+
assertInstanceIdentity?.();
|
|
108
|
+
for (const item of linkItems) {
|
|
92
109
|
const targetEntryPath = path.join(targetPath, item.name);
|
|
93
110
|
const linkEntryPath = path.join(linkPath, item.name);
|
|
94
|
-
|
|
111
|
+
let adoption = 'not-claimed';
|
|
112
|
+
if (item.type === 'file') {
|
|
113
|
+
adoption = runGuardedInstanceMutation(assertInstanceIdentity, () => (0, diverged_file_adopter_1.adoptDivergedFileContent)(linkEntryPath, path.join(roots.claudeDir, 'plugins', item.name)));
|
|
114
|
+
if (adoption === 'not-claimed') {
|
|
115
|
+
runGuardedInstanceMutation(assertInstanceIdentity, () => (0, fs_helpers_1.removeExistingPath)(linkEntryPath, item.type));
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
runGuardedInstanceMutation(assertInstanceIdentity, () => (0, fs_helpers_1.removeExistingPath)(linkEntryPath, item.type));
|
|
120
|
+
}
|
|
121
|
+
(0, diverged_file_adopter_1.assertAdoptionPathAbsent)(linkEntryPath, adoption);
|
|
122
|
+
if ((0, fs_helpers_1.getLstatSync)(linkEntryPath)) {
|
|
123
|
+
console.log((0, ui_1.warn)(`Skipping plugins/${item.name}: path reappeared during reconciliation`));
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
assertInstanceIdentity?.();
|
|
95
127
|
try {
|
|
96
128
|
const symlinkType = item.type === 'directory' ? 'dir' : 'file';
|
|
97
129
|
fs.symlinkSync(targetEntryPath, linkEntryPath, symlinkType);
|
|
98
130
|
}
|
|
99
131
|
catch (_err) {
|
|
132
|
+
assertInstanceIdentity?.();
|
|
133
|
+
(0, diverged_file_adopter_1.assertAdoptionPathAbsent)(linkEntryPath, adoption);
|
|
134
|
+
if ((0, fs_helpers_1.getLstatSync)(linkEntryPath)) {
|
|
135
|
+
console.log((0, ui_1.warn)(`Skipping plugins/${item.name}: path reappeared during reconciliation`));
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
100
138
|
if (process.platform === 'win32') {
|
|
101
139
|
if (item.type === 'directory') {
|
|
102
|
-
(0, fs_helpers_1.copyDirectoryFallback)(targetEntryPath, linkEntryPath);
|
|
140
|
+
runGuardedInstanceMutation(assertInstanceIdentity, () => (0, fs_helpers_1.copyDirectoryFallback)(targetEntryPath, linkEntryPath));
|
|
103
141
|
}
|
|
104
142
|
else {
|
|
105
|
-
fs.copyFileSync(targetEntryPath, linkEntryPath);
|
|
143
|
+
runGuardedInstanceMutation(assertInstanceIdentity, () => fs.copyFileSync(targetEntryPath, linkEntryPath, fs.constants.COPYFILE_EXCL));
|
|
106
144
|
}
|
|
107
145
|
console.log((0, ui_1.warn)(`Symlink failed for plugins/${item.name}, copied instead (enable Developer Mode)`));
|
|
108
146
|
}
|
|
@@ -110,6 +148,7 @@ function linkInstancePlugins(roots, instancePath) {
|
|
|
110
148
|
throw _err;
|
|
111
149
|
}
|
|
112
150
|
}
|
|
151
|
+
assertInstanceIdentity?.();
|
|
113
152
|
}
|
|
114
153
|
}
|
|
115
154
|
exports.linkInstancePlugins = linkInstancePlugins;
|
|
@@ -122,7 +161,14 @@ function getSharedPluginLinkItems(sharedDir) {
|
|
|
122
161
|
const sharedPluginsPath = path.join(sharedDir, 'plugins');
|
|
123
162
|
const items = new Map(types_1.SHARED_PLUGIN_ENTRIES.map((entry) => [entry.name, { ...entry }]));
|
|
124
163
|
for (const entry of fs.readdirSync(sharedPluginsPath, { withFileTypes: true })) {
|
|
125
|
-
if (items.has(entry.name) ||
|
|
164
|
+
if (items.has(entry.name) ||
|
|
165
|
+
types_1.INSTANCE_LOCAL_PLUGIN_METADATA_FILES.has(entry.name) ||
|
|
166
|
+
entry.name.includes('.bak-ccs-adopt') ||
|
|
167
|
+
entry.name.includes('.ccs-adopt-') ||
|
|
168
|
+
entry.name.includes('.ccs-adopted-recovery') ||
|
|
169
|
+
entry.name.includes('.ccs-canonical-claim-') ||
|
|
170
|
+
entry.name.includes('.ccs-canonical-recovery') ||
|
|
171
|
+
entry.name.includes('.ccs-write-')) {
|
|
126
172
|
continue;
|
|
127
173
|
}
|
|
128
174
|
const entryPath = path.join(sharedPluginsPath, entry.name);
|