@kaitranntt/ccs 7.50.0 → 7.51.0
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 +107 -4
- package/config/base-iflow.settings.json +4 -4
- package/dist/api/services/index.d.ts +2 -2
- package/dist/api/services/index.d.ts.map +1 -1
- package/dist/api/services/index.js +2 -1
- package/dist/api/services/index.js.map +1 -1
- package/dist/api/services/profile-reader.d.ts.map +1 -1
- package/dist/api/services/profile-reader.js +13 -0
- package/dist/api/services/profile-reader.js.map +1 -1
- package/dist/api/services/profile-types.d.ts +9 -0
- package/dist/api/services/profile-types.d.ts.map +1 -1
- package/dist/api/services/profile-writer.d.ts +8 -2
- package/dist/api/services/profile-writer.d.ts.map +1 -1
- package/dist/api/services/profile-writer.js +83 -8
- package/dist/api/services/profile-writer.js.map +1 -1
- package/dist/auth/account-context.d.ts +11 -0
- package/dist/auth/account-context.d.ts.map +1 -1
- package/dist/auth/account-context.js +42 -8
- package/dist/auth/account-context.js.map +1 -1
- package/dist/auth/auth-commands.d.ts.map +1 -1
- package/dist/auth/auth-commands.js +9 -0
- package/dist/auth/auth-commands.js.map +1 -1
- package/dist/auth/commands/create-command-env.d.ts +3 -0
- package/dist/auth/commands/create-command-env.d.ts.map +1 -0
- package/dist/auth/commands/create-command-env.js +55 -0
- package/dist/auth/commands/create-command-env.js.map +1 -0
- package/dist/auth/commands/create-command.d.ts.map +1 -1
- package/dist/auth/commands/create-command.js +136 -30
- package/dist/auth/commands/create-command.js.map +1 -1
- package/dist/auth/commands/list-command.d.ts.map +1 -1
- package/dist/auth/commands/list-command.js +5 -1
- package/dist/auth/commands/list-command.js.map +1 -1
- package/dist/auth/commands/show-command.d.ts.map +1 -1
- package/dist/auth/commands/show-command.js +1 -0
- package/dist/auth/commands/show-command.js.map +1 -1
- package/dist/auth/commands/types.d.ts +3 -0
- package/dist/auth/commands/types.d.ts.map +1 -1
- package/dist/auth/commands/types.js +24 -0
- package/dist/auth/commands/types.js.map +1 -1
- package/dist/auth/profile-detector.d.ts.map +1 -1
- package/dist/auth/profile-detector.js +8 -0
- package/dist/auth/profile-detector.js.map +1 -1
- package/dist/auth/profile-registry.d.ts +2 -0
- package/dist/auth/profile-registry.d.ts.map +1 -1
- package/dist/auth/profile-registry.js +45 -7
- package/dist/auth/profile-registry.js.map +1 -1
- package/dist/ccs.js +154 -4
- package/dist/ccs.js.map +1 -1
- package/dist/cliproxy/account-safety.d.ts.map +1 -1
- package/dist/cliproxy/account-safety.js +4 -0
- package/dist/cliproxy/account-safety.js.map +1 -1
- package/dist/cliproxy/antigravity-responsibility.d.ts +36 -0
- package/dist/cliproxy/antigravity-responsibility.d.ts.map +1 -0
- package/dist/cliproxy/antigravity-responsibility.js +171 -0
- package/dist/cliproxy/antigravity-responsibility.js.map +1 -0
- package/dist/cliproxy/auth/auth-types.d.ts +2 -0
- package/dist/cliproxy/auth/auth-types.d.ts.map +1 -1
- package/dist/cliproxy/auth/oauth-handler.d.ts.map +1 -1
- package/dist/cliproxy/auth/oauth-handler.js +18 -0
- package/dist/cliproxy/auth/oauth-handler.js.map +1 -1
- package/dist/cliproxy/config/env-builder.d.ts.map +1 -1
- package/dist/cliproxy/config/env-builder.js +57 -0
- 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 +18 -8
- package/dist/cliproxy/config/generator.js.map +1 -1
- package/dist/cliproxy/executor/index.d.ts.map +1 -1
- package/dist/cliproxy/executor/index.js +30 -0
- package/dist/cliproxy/executor/index.js.map +1 -1
- package/dist/cliproxy/services/variant-config-adapter.d.ts +4 -35
- package/dist/cliproxy/services/variant-config-adapter.d.ts.map +1 -1
- package/dist/cliproxy/services/variant-config-adapter.js +11 -34
- package/dist/cliproxy/services/variant-config-adapter.js.map +1 -1
- package/dist/cliproxy/services/variant-service.d.ts +5 -1
- package/dist/cliproxy/services/variant-service.d.ts.map +1 -1
- package/dist/cliproxy/services/variant-service.js +19 -9
- package/dist/cliproxy/services/variant-service.js.map +1 -1
- package/dist/cliproxy/sync/profile-mapper.d.ts.map +1 -1
- package/dist/cliproxy/sync/profile-mapper.js +14 -2
- package/dist/cliproxy/sync/profile-mapper.js.map +1 -1
- package/dist/commands/api-command.d.ts +2 -0
- package/dist/commands/api-command.d.ts.map +1 -1
- package/dist/commands/api-command.js +45 -10
- package/dist/commands/api-command.js.map +1 -1
- package/dist/commands/cliproxy/auth-subcommand.d.ts.map +1 -1
- package/dist/commands/cliproxy/auth-subcommand.js +5 -2
- package/dist/commands/cliproxy/auth-subcommand.js.map +1 -1
- package/dist/commands/cliproxy/help-subcommand.d.ts.map +1 -1
- package/dist/commands/cliproxy/help-subcommand.js +1 -0
- package/dist/commands/cliproxy/help-subcommand.js.map +1 -1
- package/dist/commands/cliproxy/variant-subcommand.d.ts +15 -0
- package/dist/commands/cliproxy/variant-subcommand.d.ts.map +1 -1
- package/dist/commands/cliproxy/variant-subcommand.js +144 -15
- package/dist/commands/cliproxy/variant-subcommand.js.map +1 -1
- package/dist/commands/help-command.d.ts.map +1 -1
- package/dist/commands/help-command.js +34 -2
- package/dist/commands/help-command.js.map +1 -1
- package/dist/config/migration-manager.d.ts.map +1 -1
- package/dist/config/migration-manager.js +19 -0
- package/dist/config/migration-manager.js.map +1 -1
- package/dist/config/unified-config-loader.d.ts +11 -1
- package/dist/config/unified-config-loader.d.ts.map +1 -1
- package/dist/config/unified-config-loader.js +127 -59
- package/dist/config/unified-config-loader.js.map +1 -1
- package/dist/config/unified-config-types.d.ts +16 -0
- package/dist/config/unified-config-types.d.ts.map +1 -1
- package/dist/config/unified-config-types.js +8 -1
- package/dist/config/unified-config-types.js.map +1 -1
- package/dist/management/instance-manager.d.ts +1 -0
- package/dist/management/instance-manager.d.ts.map +1 -1
- package/dist/management/instance-manager.js +14 -8
- package/dist/management/instance-manager.js.map +1 -1
- package/dist/management/profile-context-sync-lock.d.ts +14 -0
- package/dist/management/profile-context-sync-lock.d.ts.map +1 -0
- package/dist/management/profile-context-sync-lock.js +174 -0
- package/dist/management/profile-context-sync-lock.js.map +1 -0
- package/dist/management/shared-manager.d.ts +18 -0
- package/dist/management/shared-manager.d.ts.map +1 -1
- package/dist/management/shared-manager.js +145 -6
- package/dist/management/shared-manager.js.map +1 -1
- package/dist/targets/droid-adapter.d.ts +2 -4
- package/dist/targets/droid-adapter.d.ts.map +1 -1
- package/dist/targets/droid-adapter.js +20 -10
- package/dist/targets/droid-adapter.js.map +1 -1
- package/dist/targets/droid-command-router.d.ts +26 -0
- package/dist/targets/droid-command-router.d.ts.map +1 -0
- package/dist/targets/droid-command-router.js +240 -0
- package/dist/targets/droid-command-router.js.map +1 -0
- package/dist/targets/droid-config-manager.d.ts +9 -1
- package/dist/targets/droid-config-manager.d.ts.map +1 -1
- package/dist/targets/droid-config-manager.js +134 -6
- package/dist/targets/droid-config-manager.js.map +1 -1
- package/dist/targets/droid-provider.d.ts +40 -0
- package/dist/targets/droid-provider.d.ts.map +1 -0
- package/dist/targets/droid-provider.js +140 -0
- package/dist/targets/droid-provider.js.map +1 -0
- package/dist/targets/droid-reasoning-runtime.d.ts +14 -0
- package/dist/targets/droid-reasoning-runtime.d.ts.map +1 -0
- package/dist/targets/droid-reasoning-runtime.js +42 -0
- package/dist/targets/droid-reasoning-runtime.js.map +1 -0
- package/dist/targets/index.d.ts +2 -0
- package/dist/targets/index.d.ts.map +1 -1
- package/dist/targets/index.js +4 -1
- package/dist/targets/index.js.map +1 -1
- package/dist/targets/target-adapter.d.ts +6 -0
- package/dist/targets/target-adapter.d.ts.map +1 -1
- package/dist/targets/target-resolver.d.ts.map +1 -1
- package/dist/targets/target-resolver.js +6 -3
- package/dist/targets/target-resolver.js.map +1 -1
- package/dist/types/config.d.ts +7 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js.map +1 -1
- package/dist/ui/assets/accounts-y2u0CVK8.js +1 -0
- package/dist/ui/assets/{alert-dialog-YcmZPFim.js → alert-dialog-CetY4Iww.js} +1 -1
- package/dist/ui/assets/api-5q1FT1uL.js +1 -0
- package/dist/ui/assets/auth-section-CaQeee-F.js +1 -0
- package/dist/ui/assets/{backups-section-DmAsqMfq.js → backups-section-hF88BjYJ.js} +1 -1
- package/dist/ui/assets/{checkbox-Cfg9kbJX.js → checkbox-Dhm5Fzkb.js} +1 -1
- package/dist/ui/assets/cliproxy-BeYNWmY_.js +3 -0
- package/dist/ui/assets/cliproxy-control-panel-CJELeI80.js +1 -0
- package/dist/ui/assets/{confirm-dialog-CRcV2Yc4.js → confirm-dialog-Dn3SrwNV.js} +1 -1
- package/dist/ui/assets/{copilot-EarFqUyJ.js → copilot-vwT-4_V4.js} +2 -2
- package/dist/ui/assets/{cursor-Dbe4Wtw2.js → cursor-CN3lIX63.js} +1 -1
- package/dist/ui/assets/droid-DBP2yCY7.js +2 -0
- package/dist/ui/assets/{form-utils-C-pVd1--.js → form-utils-Cn_Uld6y.js} +1 -1
- package/dist/ui/assets/globalenv-section-DNKAJasL.js +1 -0
- package/dist/ui/assets/{health-Cvr359ff.js → health-C7tNiLzc.js} +1 -1
- package/dist/ui/assets/icons-DrewC9c3.js +1 -0
- package/dist/ui/assets/index-C8-ef-r7.js +1 -0
- package/dist/ui/assets/{index-Cp8K9_TQ.js → index-MGh88HoC.js} +1 -1
- package/dist/ui/assets/{index-DTDftvd-.js → index-QBUSDLTx.js} +1 -1
- package/dist/ui/assets/index-k-HuyjpO.js +47 -0
- package/dist/ui/assets/index-s-oTl3hW.css +1 -0
- package/dist/ui/assets/{index-CLBNUja8.js → index-uYnNU6Ut.js} +1 -1
- package/dist/ui/assets/proxy-status-widget-CIm5vKY7.js +1 -0
- package/dist/ui/assets/{radix-ui-DKgfU5rd.js → radix-ui-C1Gpgz6I.js} +1 -1
- package/dist/ui/assets/{separator-CdOKc0gJ.js → separator-BLVyAGAm.js} +1 -1
- package/dist/ui/assets/shared-CHH09ZNi.js +8 -0
- package/dist/ui/assets/{switch-B2ALi24E.js → switch-CwLyB4JK.js} +1 -1
- package/dist/ui/assets/{tanstack-5ndrQy-j.js → tanstack-DDJIhNJd.js} +1 -1
- package/dist/ui/assets/updates-VlxL3aum.js +1 -0
- package/dist/ui/index.html +6 -6
- package/dist/web-server/model-pricing.d.ts.map +1 -1
- package/dist/web-server/model-pricing.js +114 -22
- package/dist/web-server/model-pricing.js.map +1 -1
- package/dist/web-server/routes/account-route-helpers.d.ts +20 -0
- package/dist/web-server/routes/account-route-helpers.d.ts.map +1 -0
- package/dist/web-server/routes/account-route-helpers.js +34 -0
- package/dist/web-server/routes/account-route-helpers.js.map +1 -0
- package/dist/web-server/routes/account-routes.d.ts.map +1 -1
- package/dist/web-server/routes/account-routes.js +160 -27
- package/dist/web-server/routes/account-routes.js.map +1 -1
- package/dist/web-server/routes/cliproxy-auth-routes.d.ts.map +1 -1
- package/dist/web-server/routes/cliproxy-auth-routes.js +58 -24
- package/dist/web-server/routes/cliproxy-auth-routes.js.map +1 -1
- package/dist/web-server/routes/config-routes.d.ts.map +1 -1
- package/dist/web-server/routes/config-routes.js +73 -0
- package/dist/web-server/routes/config-routes.js.map +1 -1
- package/dist/web-server/routes/droid-routes.d.ts +3 -0
- package/dist/web-server/routes/droid-routes.d.ts.map +1 -0
- package/dist/web-server/routes/droid-routes.js +61 -0
- package/dist/web-server/routes/droid-routes.js.map +1 -0
- package/dist/web-server/routes/index.d.ts.map +1 -1
- package/dist/web-server/routes/index.js +3 -0
- package/dist/web-server/routes/index.js.map +1 -1
- package/dist/web-server/routes/profile-routes.d.ts +2 -0
- package/dist/web-server/routes/profile-routes.d.ts.map +1 -1
- package/dist/web-server/routes/profile-routes.js +86 -6
- package/dist/web-server/routes/profile-routes.js.map +1 -1
- package/dist/web-server/routes/route-helpers.d.ts +2 -1
- package/dist/web-server/routes/route-helpers.d.ts.map +1 -1
- package/dist/web-server/routes/route-helpers.js +20 -1
- package/dist/web-server/routes/route-helpers.js.map +1 -1
- package/dist/web-server/routes/settings-routes.d.ts.map +1 -1
- package/dist/web-server/routes/settings-routes.js +110 -12
- package/dist/web-server/routes/settings-routes.js.map +1 -1
- package/dist/web-server/routes/variant-routes.d.ts +2 -0
- package/dist/web-server/routes/variant-routes.d.ts.map +1 -1
- package/dist/web-server/routes/variant-routes.js +50 -6
- package/dist/web-server/routes/variant-routes.js.map +1 -1
- package/dist/web-server/services/compatible-cli-docs-registry.d.ts +23 -0
- package/dist/web-server/services/compatible-cli-docs-registry.d.ts.map +1 -0
- package/dist/web-server/services/compatible-cli-docs-registry.js +81 -0
- package/dist/web-server/services/compatible-cli-docs-registry.js.map +1 -0
- package/dist/web-server/services/compatible-cli-json-file-service.d.ts +41 -0
- package/dist/web-server/services/compatible-cli-json-file-service.d.ts.map +1 -0
- package/dist/web-server/services/compatible-cli-json-file-service.js +205 -0
- package/dist/web-server/services/compatible-cli-json-file-service.js.map +1 -0
- package/dist/web-server/services/compatible-cli-types.d.ts +82 -0
- package/dist/web-server/services/compatible-cli-types.d.ts.map +1 -0
- package/dist/web-server/services/compatible-cli-types.js +3 -0
- package/dist/web-server/services/compatible-cli-types.js.map +1 -0
- package/dist/web-server/services/droid-dashboard-service.d.ts +29 -0
- package/dist/web-server/services/droid-dashboard-service.d.ts.map +1 -0
- package/dist/web-server/services/droid-dashboard-service.js +238 -0
- package/dist/web-server/services/droid-dashboard-service.js.map +1 -0
- package/dist/web-server/shared-routes.d.ts.map +1 -1
- package/dist/web-server/shared-routes.js +350 -52
- package/dist/web-server/shared-routes.js.map +1 -1
- package/lib/hooks/websearch-transformer.cjs +78 -52
- package/package.json +4 -2
- package/scripts/maintainability-check.js +163 -0
- package/dist/ui/assets/accounts-DIqClJ7z.js +0 -1
- package/dist/ui/assets/api-BWyCgbMh.js +0 -1
- package/dist/ui/assets/auth-section-Amm4rwiS.js +0 -1
- package/dist/ui/assets/cliproxy-B-q7RjS2.js +0 -3
- package/dist/ui/assets/cliproxy-control-panel-BliRTkbb.js +0 -1
- package/dist/ui/assets/globalenv-section-CBp73q9k.js +0 -1
- package/dist/ui/assets/icons-DGASzt3M.js +0 -1
- package/dist/ui/assets/index-8n-yIlea.js +0 -47
- package/dist/ui/assets/index-B5aulDs4.js +0 -1
- package/dist/ui/assets/index-BBCDm6dS.css +0 -1
- package/dist/ui/assets/proxy-status-widget-C0G0aOCW.js +0 -1
- package/dist/ui/assets/shared-zsUXmES2.js +0 -1
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* Into a single config.yaml structure.
|
|
11
11
|
*/
|
|
12
12
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
-
exports.isUnifiedConfig = exports.createEmptyUnifiedConfig = exports.DEFAULT_CLIPROXY_SERVER_CONFIG = exports.DEFAULT_CURSOR_CONFIG = exports.DEFAULT_COPILOT_CONFIG = exports.DEFAULT_IMAGE_ANALYSIS_CONFIG = exports.DEFAULT_DASHBOARD_AUTH_CONFIG = exports.DEFAULT_THINKING_CONFIG = exports.DEFAULT_THINKING_TIER_DEFAULTS = exports.DEFAULT_QUOTA_MANAGEMENT_CONFIG = exports.DEFAULT_RUNTIME_MONITOR_CONFIG = exports.DEFAULT_MANUAL_QUOTA_CONFIG = exports.DEFAULT_AUTO_QUOTA_CONFIG = exports.DEFAULT_GLOBAL_ENV = exports.CLIPROXY_SUPPORTED_PROVIDERS = exports.UNIFIED_CONFIG_VERSION = void 0;
|
|
13
|
+
exports.isUnifiedConfig = exports.createEmptyUnifiedConfig = exports.DEFAULT_CLIPROXY_SERVER_CONFIG = exports.DEFAULT_CURSOR_CONFIG = exports.DEFAULT_COPILOT_CONFIG = exports.DEFAULT_IMAGE_ANALYSIS_CONFIG = exports.DEFAULT_DASHBOARD_AUTH_CONFIG = exports.DEFAULT_THINKING_CONFIG = exports.DEFAULT_THINKING_TIER_DEFAULTS = exports.DEFAULT_QUOTA_MANAGEMENT_CONFIG = exports.DEFAULT_RUNTIME_MONITOR_CONFIG = exports.DEFAULT_MANUAL_QUOTA_CONFIG = exports.DEFAULT_AUTO_QUOTA_CONFIG = exports.DEFAULT_GLOBAL_ENV = exports.DEFAULT_CLIPROXY_SAFETY_CONFIG = exports.CLIPROXY_SUPPORTED_PROVIDERS = exports.UNIFIED_CONFIG_VERSION = void 0;
|
|
14
14
|
const provider_capabilities_1 = require("../cliproxy/provider-capabilities");
|
|
15
15
|
/**
|
|
16
16
|
* Unified config version.
|
|
@@ -28,6 +28,12 @@ exports.UNIFIED_CONFIG_VERSION = 8;
|
|
|
28
28
|
* Derived from CLIPROXY_PROVIDER_IDS — single source of truth in provider-capabilities.ts.
|
|
29
29
|
*/
|
|
30
30
|
exports.CLIPROXY_SUPPORTED_PROVIDERS = provider_capabilities_1.CLIPROXY_PROVIDER_IDS;
|
|
31
|
+
/**
|
|
32
|
+
* Default CLIProxy safety configuration.
|
|
33
|
+
*/
|
|
34
|
+
exports.DEFAULT_CLIPROXY_SAFETY_CONFIG = {
|
|
35
|
+
antigravity_ack_bypass: false,
|
|
36
|
+
};
|
|
31
37
|
/**
|
|
32
38
|
* Default global env vars for third-party profiles.
|
|
33
39
|
* These disable Claude Code telemetry/reporting since we're using proxy.
|
|
@@ -185,6 +191,7 @@ function createEmptyUnifiedConfig() {
|
|
|
185
191
|
enabled: false,
|
|
186
192
|
request_log: false,
|
|
187
193
|
},
|
|
194
|
+
safety: { ...exports.DEFAULT_CLIPROXY_SAFETY_CONFIG },
|
|
188
195
|
auto_sync: true,
|
|
189
196
|
},
|
|
190
197
|
preferences: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unified-config-types.js","sourceRoot":"","sources":["../../src/config/unified-config-types.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;AAIH,6EAA0E;AAE1E;;;;;;;;;GASG;AACU,QAAA,sBAAsB,GAAG,CAAC,CAAC;AAExC;;;GAGG;AACU,QAAA,4BAA4B,GAAG,6CAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"unified-config-types.js","sourceRoot":"","sources":["../../src/config/unified-config-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,6 +12,7 @@ import { AccountContextPolicy } from '../auth/account-context';
|
|
|
12
12
|
declare class InstanceManager {
|
|
13
13
|
private readonly instancesDir;
|
|
14
14
|
private readonly sharedManager;
|
|
15
|
+
private readonly contextSyncLock;
|
|
15
16
|
constructor();
|
|
16
17
|
/**
|
|
17
18
|
* Ensure instance exists for profile (lazy init only)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instance-manager.d.ts","sourceRoot":"","sources":["../../src/management/instance-manager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"instance-manager.d.ts","sourceRoot":"","sources":["../../src/management/instance-manager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,EAAE,oBAAoB,EAAgC,MAAM,yBAAyB,CAAC;AAG7F;;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;;IAQzD;;OAEG;IACG,cAAc,CAClB,WAAW,EAAE,MAAM,EACnB,aAAa,GAAE,oBAA6D,GAC3E,OAAO,CAAC,MAAM,CAAC;IAqBlB;;OAEG;IACH,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAK5C;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAmC1B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAuBxB;;OAEG;IACH,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAWzC;;OAEG;IACH,aAAa,IAAI,MAAM,EAAE;IAWzB;;OAEG;IACH,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAKzC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAMzB;;OAEG;IAsBH;;OAEG;IACH,OAAO,CAAC,YAAY;CAIrB;AAED,OAAO,EAAE,eAAe,EAAE,CAAC;AAC3B,eAAe,eAAe,CAAC"}
|
|
@@ -37,6 +37,7 @@ exports.InstanceManager = void 0;
|
|
|
37
37
|
const fs = __importStar(require("fs"));
|
|
38
38
|
const path = __importStar(require("path"));
|
|
39
39
|
const shared_manager_1 = __importDefault(require("./shared-manager"));
|
|
40
|
+
const profile_context_sync_lock_1 = __importDefault(require("./profile-context-sync-lock"));
|
|
40
41
|
const account_context_1 = require("../auth/account-context");
|
|
41
42
|
const config_manager_1 = require("../utils/config-manager");
|
|
42
43
|
/**
|
|
@@ -46,20 +47,25 @@ class InstanceManager {
|
|
|
46
47
|
constructor() {
|
|
47
48
|
this.instancesDir = path.join((0, config_manager_1.getCcsDir)(), 'instances');
|
|
48
49
|
this.sharedManager = new shared_manager_1.default();
|
|
50
|
+
this.contextSyncLock = new profile_context_sync_lock_1.default(this.instancesDir);
|
|
49
51
|
}
|
|
50
52
|
/**
|
|
51
53
|
* Ensure instance exists for profile (lazy init only)
|
|
52
54
|
*/
|
|
53
55
|
async ensureInstance(profileName, contextPolicy = { mode: account_context_1.DEFAULT_ACCOUNT_CONTEXT_MODE }) {
|
|
54
56
|
const instancePath = this.getInstancePath(profileName);
|
|
55
|
-
//
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
57
|
+
// Serialize context sync operations per profile across processes.
|
|
58
|
+
await this.contextSyncLock.withLock(profileName, async () => {
|
|
59
|
+
// Lazy initialization
|
|
60
|
+
if (!fs.existsSync(instancePath)) {
|
|
61
|
+
this.initializeInstance(profileName, instancePath);
|
|
62
|
+
}
|
|
63
|
+
// Validate structure (auto-fix missing dirs)
|
|
64
|
+
this.validateInstance(instancePath);
|
|
65
|
+
// Apply context policy (isolated by default, optional shared group).
|
|
66
|
+
await this.sharedManager.syncProjectContext(instancePath, contextPolicy);
|
|
67
|
+
await this.sharedManager.syncAdvancedContinuityArtifacts(instancePath, contextPolicy);
|
|
68
|
+
});
|
|
63
69
|
return instancePath;
|
|
64
70
|
}
|
|
65
71
|
/**
|
|
@@ -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,6DAA6F;AAC7F,4DAAoD;AAEpD;;GAEG;AACH,MAAM,eAAe;
|
|
1
|
+
{"version":3,"file":"instance-manager.js","sourceRoot":"","sources":["../../src/management/instance-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
declare class ProfileContextSyncLock {
|
|
2
|
+
private readonly locksDir;
|
|
3
|
+
constructor(instancesDir: string);
|
|
4
|
+
private sanitizeName;
|
|
5
|
+
private getLockPath;
|
|
6
|
+
private isProcessAlive;
|
|
7
|
+
private parseContextSyncLock;
|
|
8
|
+
private readContextSyncLockSnapshot;
|
|
9
|
+
private tryRemoveLockIfUnchanged;
|
|
10
|
+
private tryRemoveDeadOwnerLock;
|
|
11
|
+
withLock<T>(profileName: string, callback: () => Promise<T>): Promise<T>;
|
|
12
|
+
}
|
|
13
|
+
export default ProfileContextSyncLock;
|
|
14
|
+
//# sourceMappingURL=profile-context-sync-lock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-context-sync-lock.d.ts","sourceRoot":"","sources":["../../src/management/profile-context-sync-lock.ts"],"names":[],"mappings":"AAgBA,cAAM,sBAAsB;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEtB,YAAY,EAAE,MAAM;IAIhC,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,cAAc;IAgBtB,OAAO,CAAC,oBAAoB;IAuB5B,OAAO,CAAC,2BAA2B;IAenC,OAAO,CAAC,wBAAwB;IAahC,OAAO,CAAC,sBAAsB;IAQxB,QAAQ,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAkE/E;AAED,eAAe,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,174 @@
|
|
|
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
|
+
const fs = __importStar(require("fs"));
|
|
27
|
+
const path = __importStar(require("path"));
|
|
28
|
+
const crypto_1 = require("crypto");
|
|
29
|
+
class ProfileContextSyncLock {
|
|
30
|
+
constructor(instancesDir) {
|
|
31
|
+
this.locksDir = path.join(instancesDir, '.locks');
|
|
32
|
+
}
|
|
33
|
+
sanitizeName(name) {
|
|
34
|
+
return name.replace(/[^a-zA-Z0-9_-]/g, '-').toLowerCase();
|
|
35
|
+
}
|
|
36
|
+
getLockPath(profileName) {
|
|
37
|
+
const safeName = this.sanitizeName(profileName);
|
|
38
|
+
const profileHash = (0, crypto_1.createHash)('sha1').update(profileName).digest('hex').slice(0, 8);
|
|
39
|
+
return path.join(this.locksDir, `${safeName}-${profileHash}.lock`);
|
|
40
|
+
}
|
|
41
|
+
isProcessAlive(pid) {
|
|
42
|
+
if (!Number.isInteger(pid) || pid <= 0) {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
try {
|
|
46
|
+
process.kill(pid, 0);
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
if (error.code === 'EPERM') {
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
parseContextSyncLock(raw) {
|
|
57
|
+
const trimmed = raw.trim();
|
|
58
|
+
if (trimmed.length === 0) {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
try {
|
|
62
|
+
const parsed = JSON.parse(trimmed);
|
|
63
|
+
if (typeof parsed.pid === 'number' && Number.isInteger(parsed.pid) && parsed.pid > 0) {
|
|
64
|
+
const nonce = typeof parsed.nonce === 'string' && parsed.nonce.length > 0 ? parsed.nonce : undefined;
|
|
65
|
+
return { pid: parsed.pid, nonce };
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
const legacyPid = Number.parseInt(trimmed, 10);
|
|
70
|
+
if (Number.isInteger(legacyPid) && legacyPid > 0) {
|
|
71
|
+
return { pid: legacyPid };
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
readContextSyncLockSnapshot(lockPath) {
|
|
77
|
+
try {
|
|
78
|
+
const raw = fs.readFileSync(lockPath, 'utf8');
|
|
79
|
+
return {
|
|
80
|
+
raw,
|
|
81
|
+
owner: this.parseContextSyncLock(raw),
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
if (error.code === 'ENOENT') {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
tryRemoveLockIfUnchanged(lockPath, expectedRaw) {
|
|
92
|
+
try {
|
|
93
|
+
const currentRaw = fs.readFileSync(lockPath, 'utf8');
|
|
94
|
+
if (currentRaw !== expectedRaw) {
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
fs.unlinkSync(lockPath);
|
|
98
|
+
return true;
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
tryRemoveDeadOwnerLock(lockPath, snapshot) {
|
|
105
|
+
if (!snapshot.owner || this.isProcessAlive(snapshot.owner.pid)) {
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
return this.tryRemoveLockIfUnchanged(lockPath, snapshot.raw);
|
|
109
|
+
}
|
|
110
|
+
async withLock(profileName, callback) {
|
|
111
|
+
const lockPath = this.getLockPath(profileName);
|
|
112
|
+
const retryDelayMs = 50;
|
|
113
|
+
const staleLockMs = 30000;
|
|
114
|
+
const timeoutMs = staleLockMs + 5000;
|
|
115
|
+
const start = Date.now();
|
|
116
|
+
const ownerPayload = {
|
|
117
|
+
version: 1,
|
|
118
|
+
pid: process.pid,
|
|
119
|
+
nonce: (0, crypto_1.createHash)('sha1')
|
|
120
|
+
.update(`${process.pid}:${Date.now()}:${Math.random()}`)
|
|
121
|
+
.digest('hex')
|
|
122
|
+
.slice(0, 16),
|
|
123
|
+
acquiredAtMs: Date.now(),
|
|
124
|
+
};
|
|
125
|
+
const ownerPayloadRaw = JSON.stringify(ownerPayload);
|
|
126
|
+
fs.mkdirSync(this.locksDir, { recursive: true, mode: 0o700 });
|
|
127
|
+
while (true) {
|
|
128
|
+
try {
|
|
129
|
+
const fd = fs.openSync(lockPath, 'wx', 0o600);
|
|
130
|
+
fs.writeFileSync(fd, ownerPayloadRaw, 'utf8');
|
|
131
|
+
fs.closeSync(fd);
|
|
132
|
+
break;
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
const err = error;
|
|
136
|
+
if (err.code !== 'EEXIST') {
|
|
137
|
+
throw error;
|
|
138
|
+
}
|
|
139
|
+
const lockSnapshot = this.readContextSyncLockSnapshot(lockPath);
|
|
140
|
+
if (lockSnapshot) {
|
|
141
|
+
if (this.tryRemoveDeadOwnerLock(lockPath, lockSnapshot)) {
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
// For malformed lock payloads, fall back to age-based stale cleanup.
|
|
145
|
+
if (!lockSnapshot.owner) {
|
|
146
|
+
try {
|
|
147
|
+
const lockStats = fs.statSync(lockPath);
|
|
148
|
+
if (Date.now() - lockStats.mtimeMs > staleLockMs) {
|
|
149
|
+
if (this.tryRemoveLockIfUnchanged(lockPath, lockSnapshot.raw)) {
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
// Best-effort stale lock cleanup.
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
if (Date.now() - start > timeoutMs) {
|
|
160
|
+
throw new Error(`Timed out waiting for profile context lock: ${profileName}`);
|
|
161
|
+
}
|
|
162
|
+
await new Promise((resolve) => setTimeout(resolve, retryDelayMs));
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
try {
|
|
166
|
+
return await callback();
|
|
167
|
+
}
|
|
168
|
+
finally {
|
|
169
|
+
this.tryRemoveLockIfUnchanged(lockPath, ownerPayloadRaw);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
exports.default = ProfileContextSyncLock;
|
|
174
|
+
//# sourceMappingURL=profile-context-sync-lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-context-sync-lock.js","sourceRoot":"","sources":["../../src/management/profile-context-sync-lock.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,7 @@ declare class SharedManager {
|
|
|
15
15
|
private readonly claudeDir;
|
|
16
16
|
private readonly instancesDir;
|
|
17
17
|
private readonly sharedItems;
|
|
18
|
+
private readonly advancedContinuityItems;
|
|
18
19
|
constructor();
|
|
19
20
|
/**
|
|
20
21
|
* Detect circular symlink before creation
|
|
@@ -36,6 +37,13 @@ declare class SharedManager {
|
|
|
36
37
|
* - shared: profile ./projects becomes symlink to shared context group root.
|
|
37
38
|
*/
|
|
38
39
|
syncProjectContext(instancePath: string, policy: AccountContextPolicy): Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* Sync advanced continuity artifacts for shared deeper mode.
|
|
42
|
+
*
|
|
43
|
+
* - shared + deeper: artifacts are linked per context group.
|
|
44
|
+
* - shared + standard / isolated: artifacts stay local to instance.
|
|
45
|
+
*/
|
|
46
|
+
syncAdvancedContinuityArtifacts(instancePath: string, policy: AccountContextPolicy): Promise<void>;
|
|
39
47
|
/**
|
|
40
48
|
* Ensure all project memory directories for an instance are shared.
|
|
41
49
|
*
|
|
@@ -77,6 +85,14 @@ declare class SharedManager {
|
|
|
77
85
|
* Resolve symlink target to absolute path.
|
|
78
86
|
*/
|
|
79
87
|
private resolveSymlinkTargetPath;
|
|
88
|
+
/**
|
|
89
|
+
* Guard project merge operations to known CCS-managed roots only.
|
|
90
|
+
*/
|
|
91
|
+
private isSafeProjectsMergeSource;
|
|
92
|
+
/**
|
|
93
|
+
* Guard advanced continuity merge operations to known CCS-managed roots only.
|
|
94
|
+
*/
|
|
95
|
+
private isSafeContinuityMergeSource;
|
|
80
96
|
/**
|
|
81
97
|
* Link directory with Windows fallback to recursive copy.
|
|
82
98
|
*/
|
|
@@ -103,6 +119,8 @@ declare class SharedManager {
|
|
|
103
119
|
* Build a non-destructive conflict copy path.
|
|
104
120
|
*/
|
|
105
121
|
private getConflictCopyPath;
|
|
122
|
+
private resolveCanonicalPath;
|
|
123
|
+
private isPathWithinDirectory;
|
|
106
124
|
private pathExists;
|
|
107
125
|
private ensureDirectory;
|
|
108
126
|
private getLstat;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared-manager.d.ts","sourceRoot":"","sources":["../../src/management/shared-manager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,EAAE,oBAAoB,EAAiC,MAAM,yBAAyB,CAAC;AAQ9F;;GAEG;AACH,cAAM,aAAa;IACjB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAe;;
|
|
1
|
+
{"version":3,"file":"shared-manager.d.ts","sourceRoot":"","sources":["../../src/management/shared-manager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,EAAE,oBAAoB,EAAiC,MAAM,yBAAyB,CAAC;AAQ9F;;GAEG;AACH,cAAM,aAAa;IACjB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAe;IAC3C,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAKtC;;IAiBF;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAoC7B;;;OAGG;IACH,uBAAuB,IAAI,IAAI;IA8E/B;;OAEG;IACH,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAyCjD;;;;;OAKG;IACG,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAoG3F;;;;;OAKG;IACG,+BAA+B,CACnC,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,IAAI,CAAC;IAsHhB;;;;;;;;OAQG;IACG,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmF9D;;;;;;OAMG;IACH,4BAA4B,IAAI,IAAI;IA4BpC;;;OAGG;IACH,eAAe,IAAI,IAAI;IAoGvB;;;OAGG;IACH,uBAAuB,IAAI,IAAI;IA4E/B;;;OAGG;YACW,uBAAuB;IAkCrC;;OAEG;YACW,eAAe;IAgB7B;;OAEG;YACW,wBAAwB;IAStC;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAejC;;OAEG;IACH,OAAO,CAAC,2BAA2B;IA6BnC;;OAEG;YACW,yBAAyB;IAmBvC;;;OAGG;YACW,6BAA6B;IAiD3C;;OAEG;YACW,aAAa;IAc3B;;;OAGG;YACW,gCAAgC;IA0C9C;;OAEG;YACW,iBAAiB;IAiB/B;;OAEG;YACW,mBAAmB;IAiBjC,OAAO,CAAC,oBAAoB;IAQ5B,OAAO,CAAC,qBAAqB;YAaf,UAAU;YASV,eAAe;YAIf,QAAQ;IAWtB;;OAEG;IACH,OAAO,CAAC,qBAAqB;CAuB9B;AAED,eAAe,aAAa,CAAC"}
|
|
@@ -41,6 +41,12 @@ const config_manager_1 = require("../utils/config-manager");
|
|
|
41
41
|
*/
|
|
42
42
|
class SharedManager {
|
|
43
43
|
constructor() {
|
|
44
|
+
this.advancedContinuityItems = [
|
|
45
|
+
'session-env',
|
|
46
|
+
'file-history',
|
|
47
|
+
'shell-snapshots',
|
|
48
|
+
'todos',
|
|
49
|
+
];
|
|
44
50
|
this.homeDir = os.homedir();
|
|
45
51
|
const ccsDir = (0, config_manager_1.getCcsDir)();
|
|
46
52
|
this.sharedDir = path.join(ccsDir, 'shared');
|
|
@@ -71,8 +77,11 @@ class SharedManager {
|
|
|
71
77
|
const targetLink = fs.readlinkSync(target);
|
|
72
78
|
const resolvedTarget = path.resolve(path.dirname(target), targetLink);
|
|
73
79
|
// Check if target points back to our shared dir or link path
|
|
74
|
-
const sharedDir = path.join((0, config_manager_1.getCcsDir)(), 'shared');
|
|
75
|
-
|
|
80
|
+
const sharedDir = this.resolveCanonicalPath(path.join((0, config_manager_1.getCcsDir)(), 'shared'));
|
|
81
|
+
const canonicalResolvedTarget = this.resolveCanonicalPath(resolvedTarget);
|
|
82
|
+
const canonicalLinkPath = this.resolveCanonicalPath(linkPath);
|
|
83
|
+
if (this.isPathWithinDirectory(canonicalResolvedTarget, sharedDir) ||
|
|
84
|
+
canonicalResolvedTarget === canonicalLinkPath) {
|
|
76
85
|
console.log((0, ui_1.warn)(`Circular symlink detected: ${target} → ${resolvedTarget}`));
|
|
77
86
|
return true;
|
|
78
87
|
}
|
|
@@ -229,9 +238,13 @@ class SharedManager {
|
|
|
229
238
|
const currentTarget = await this.resolveSymlinkTargetPath(projectsPath);
|
|
230
239
|
if (currentTarget &&
|
|
231
240
|
path.resolve(currentTarget) !== path.resolve(sharedProjectsPath) &&
|
|
241
|
+
this.isSafeProjectsMergeSource(currentTarget, instanceName) &&
|
|
232
242
|
(await this.pathExists(currentTarget))) {
|
|
233
243
|
await this.mergeDirectoryWithConflictCopies(currentTarget, sharedProjectsPath, instanceName);
|
|
234
244
|
}
|
|
245
|
+
else if (currentTarget && !this.isSafeProjectsMergeSource(currentTarget, instanceName)) {
|
|
246
|
+
console.log((0, ui_1.warn)(`Skipping unsafe project merge source outside CCS roots: ${currentTarget}`));
|
|
247
|
+
}
|
|
235
248
|
await fs.promises.unlink(projectsPath);
|
|
236
249
|
await this.linkDirectoryWithFallback(sharedProjectsPath, projectsPath);
|
|
237
250
|
return;
|
|
@@ -262,14 +275,96 @@ class SharedManager {
|
|
|
262
275
|
await this.ensureDirectory(projectsPath);
|
|
263
276
|
if (currentTarget &&
|
|
264
277
|
path.resolve(currentTarget) !== path.resolve(projectsPath) &&
|
|
278
|
+
this.isSafeProjectsMergeSource(currentTarget, instanceName) &&
|
|
265
279
|
(await this.pathExists(currentTarget))) {
|
|
266
280
|
await this.mergeDirectoryWithConflictCopies(currentTarget, projectsPath, instanceName);
|
|
267
281
|
}
|
|
282
|
+
else if (currentTarget && !this.isSafeProjectsMergeSource(currentTarget, instanceName)) {
|
|
283
|
+
console.log((0, ui_1.warn)(`Skipping unsafe project merge source outside CCS roots: ${currentTarget}`));
|
|
284
|
+
}
|
|
268
285
|
return;
|
|
269
286
|
}
|
|
270
287
|
await fs.promises.rm(projectsPath, { force: true });
|
|
271
288
|
await this.ensureDirectory(projectsPath);
|
|
272
289
|
}
|
|
290
|
+
/**
|
|
291
|
+
* Sync advanced continuity artifacts for shared deeper mode.
|
|
292
|
+
*
|
|
293
|
+
* - shared + deeper: artifacts are linked per context group.
|
|
294
|
+
* - shared + standard / isolated: artifacts stay local to instance.
|
|
295
|
+
*/
|
|
296
|
+
async syncAdvancedContinuityArtifacts(instancePath, policy) {
|
|
297
|
+
const instanceName = path.basename(instancePath);
|
|
298
|
+
const useSharedContinuity = policy.mode === 'shared' && policy.continuityMode === 'deeper';
|
|
299
|
+
const contextGroup = policy.group || account_context_1.DEFAULT_ACCOUNT_CONTEXT_GROUP;
|
|
300
|
+
for (const artifactName of this.advancedContinuityItems) {
|
|
301
|
+
const instanceArtifactPath = path.join(instancePath, artifactName);
|
|
302
|
+
if (useSharedContinuity) {
|
|
303
|
+
const sharedArtifactPath = path.join(this.sharedDir, 'context-groups', contextGroup, 'continuity', artifactName);
|
|
304
|
+
await this.ensureDirectory(sharedArtifactPath);
|
|
305
|
+
await this.ensureDirectory(path.dirname(instanceArtifactPath));
|
|
306
|
+
const currentStats = await this.getLstat(instanceArtifactPath);
|
|
307
|
+
if (!currentStats) {
|
|
308
|
+
await this.linkDirectoryWithFallback(sharedArtifactPath, instanceArtifactPath);
|
|
309
|
+
continue;
|
|
310
|
+
}
|
|
311
|
+
if (currentStats.isSymbolicLink()) {
|
|
312
|
+
if (await this.isSymlinkTarget(instanceArtifactPath, sharedArtifactPath)) {
|
|
313
|
+
continue;
|
|
314
|
+
}
|
|
315
|
+
const currentTarget = await this.resolveSymlinkTargetPath(instanceArtifactPath);
|
|
316
|
+
if (currentTarget &&
|
|
317
|
+
path.resolve(currentTarget) !== path.resolve(sharedArtifactPath) &&
|
|
318
|
+
this.isSafeContinuityMergeSource(currentTarget, instanceName, artifactName) &&
|
|
319
|
+
(await this.pathExists(currentTarget))) {
|
|
320
|
+
await this.mergeDirectoryWithConflictCopies(currentTarget, sharedArtifactPath, instanceName);
|
|
321
|
+
}
|
|
322
|
+
else if (currentTarget &&
|
|
323
|
+
!this.isSafeContinuityMergeSource(currentTarget, instanceName, artifactName)) {
|
|
324
|
+
console.log((0, ui_1.warn)(`Skipping unsafe ${artifactName} merge source outside CCS roots: ${currentTarget}`));
|
|
325
|
+
}
|
|
326
|
+
await fs.promises.unlink(instanceArtifactPath);
|
|
327
|
+
await this.linkDirectoryWithFallback(sharedArtifactPath, instanceArtifactPath);
|
|
328
|
+
continue;
|
|
329
|
+
}
|
|
330
|
+
if (currentStats.isDirectory()) {
|
|
331
|
+
await this.mergeDirectoryWithConflictCopies(instanceArtifactPath, sharedArtifactPath, instanceName);
|
|
332
|
+
await fs.promises.rm(instanceArtifactPath, { recursive: true, force: true });
|
|
333
|
+
await this.linkDirectoryWithFallback(sharedArtifactPath, instanceArtifactPath);
|
|
334
|
+
continue;
|
|
335
|
+
}
|
|
336
|
+
await fs.promises.rm(instanceArtifactPath, { force: true });
|
|
337
|
+
await this.linkDirectoryWithFallback(sharedArtifactPath, instanceArtifactPath);
|
|
338
|
+
continue;
|
|
339
|
+
}
|
|
340
|
+
const currentStats = await this.getLstat(instanceArtifactPath);
|
|
341
|
+
if (!currentStats) {
|
|
342
|
+
await this.ensureDirectory(instanceArtifactPath);
|
|
343
|
+
continue;
|
|
344
|
+
}
|
|
345
|
+
if (currentStats.isDirectory()) {
|
|
346
|
+
continue;
|
|
347
|
+
}
|
|
348
|
+
if (currentStats.isSymbolicLink()) {
|
|
349
|
+
const currentTarget = await this.resolveSymlinkTargetPath(instanceArtifactPath);
|
|
350
|
+
await fs.promises.unlink(instanceArtifactPath);
|
|
351
|
+
await this.ensureDirectory(instanceArtifactPath);
|
|
352
|
+
if (currentTarget &&
|
|
353
|
+
path.resolve(currentTarget) !== path.resolve(instanceArtifactPath) &&
|
|
354
|
+
this.isSafeContinuityMergeSource(currentTarget, instanceName, artifactName) &&
|
|
355
|
+
(await this.pathExists(currentTarget))) {
|
|
356
|
+
await this.mergeDirectoryWithConflictCopies(currentTarget, instanceArtifactPath, instanceName);
|
|
357
|
+
}
|
|
358
|
+
else if (currentTarget &&
|
|
359
|
+
!this.isSafeContinuityMergeSource(currentTarget, instanceName, artifactName)) {
|
|
360
|
+
console.log((0, ui_1.warn)(`Skipping unsafe ${artifactName} merge source outside CCS roots: ${currentTarget}`));
|
|
361
|
+
}
|
|
362
|
+
continue;
|
|
363
|
+
}
|
|
364
|
+
await fs.promises.rm(instanceArtifactPath, { force: true });
|
|
365
|
+
await this.ensureDirectory(instanceArtifactPath);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
273
368
|
/**
|
|
274
369
|
* Ensure all project memory directories for an instance are shared.
|
|
275
370
|
*
|
|
@@ -600,6 +695,31 @@ class SharedManager {
|
|
|
600
695
|
return null;
|
|
601
696
|
}
|
|
602
697
|
}
|
|
698
|
+
/**
|
|
699
|
+
* Guard project merge operations to known CCS-managed roots only.
|
|
700
|
+
*/
|
|
701
|
+
isSafeProjectsMergeSource(sourcePath, instanceName) {
|
|
702
|
+
const resolvedSource = this.resolveCanonicalPath(sourcePath);
|
|
703
|
+
const sharedContextRoot = this.resolveCanonicalPath(path.join(this.sharedDir, 'context-groups'));
|
|
704
|
+
const instanceProjectsRoot = this.resolveCanonicalPath(path.join(this.instancesDir, instanceName, 'projects'));
|
|
705
|
+
return (this.isPathWithinDirectory(resolvedSource, sharedContextRoot) ||
|
|
706
|
+
this.isPathWithinDirectory(resolvedSource, instanceProjectsRoot));
|
|
707
|
+
}
|
|
708
|
+
/**
|
|
709
|
+
* Guard advanced continuity merge operations to known CCS-managed roots only.
|
|
710
|
+
*/
|
|
711
|
+
isSafeContinuityMergeSource(sourcePath, instanceName, artifactName) {
|
|
712
|
+
const resolvedSource = this.resolveCanonicalPath(sourcePath);
|
|
713
|
+
const sharedContextRoot = this.resolveCanonicalPath(path.join(this.sharedDir, 'context-groups'));
|
|
714
|
+
const instanceArtifactRoot = this.resolveCanonicalPath(path.join(this.instancesDir, instanceName, artifactName));
|
|
715
|
+
const normalizedSource = process.platform === 'win32' ? resolvedSource.toLowerCase() : resolvedSource;
|
|
716
|
+
const continuitySegment = process.platform === 'win32'
|
|
717
|
+
? `${path.sep}continuity${path.sep}`.toLowerCase()
|
|
718
|
+
: `${path.sep}continuity${path.sep}`;
|
|
719
|
+
const withinSharedContinuity = this.isPathWithinDirectory(resolvedSource, sharedContextRoot) &&
|
|
720
|
+
normalizedSource.includes(continuitySegment);
|
|
721
|
+
return (withinSharedContinuity || this.isPathWithinDirectory(resolvedSource, instanceArtifactRoot));
|
|
722
|
+
}
|
|
603
723
|
/**
|
|
604
724
|
* Link directory with Windows fallback to recursive copy.
|
|
605
725
|
*/
|
|
@@ -623,7 +743,7 @@ class SharedManager {
|
|
|
623
743
|
* This preserves data while restoring true profile isolation.
|
|
624
744
|
*/
|
|
625
745
|
async detachLegacySharedMemoryLinks(projectsPath, instanceName) {
|
|
626
|
-
const sharedMemoryRoot =
|
|
746
|
+
const sharedMemoryRoot = this.resolveCanonicalPath(path.join(this.sharedDir, 'memory'));
|
|
627
747
|
let projectEntries = [];
|
|
628
748
|
try {
|
|
629
749
|
projectEntries = await fs.promises.readdir(projectsPath, { withFileTypes: true });
|
|
@@ -645,13 +765,14 @@ class SharedManager {
|
|
|
645
765
|
if (!memoryTarget) {
|
|
646
766
|
continue;
|
|
647
767
|
}
|
|
648
|
-
|
|
768
|
+
const canonicalMemoryTarget = this.resolveCanonicalPath(memoryTarget);
|
|
769
|
+
if (!this.isPathWithinDirectory(canonicalMemoryTarget, sharedMemoryRoot)) {
|
|
649
770
|
continue;
|
|
650
771
|
}
|
|
651
772
|
await fs.promises.unlink(memoryPath);
|
|
652
773
|
await this.ensureDirectory(memoryPath);
|
|
653
|
-
if (await this.pathExists(
|
|
654
|
-
await this.mergeDirectoryWithConflictCopies(
|
|
774
|
+
if (await this.pathExists(canonicalMemoryTarget)) {
|
|
775
|
+
await this.mergeDirectoryWithConflictCopies(canonicalMemoryTarget, memoryPath, instanceName);
|
|
655
776
|
}
|
|
656
777
|
}
|
|
657
778
|
}
|
|
@@ -734,6 +855,24 @@ class SharedManager {
|
|
|
734
855
|
}
|
|
735
856
|
return candidate;
|
|
736
857
|
}
|
|
858
|
+
resolveCanonicalPath(targetPath) {
|
|
859
|
+
try {
|
|
860
|
+
return fs.realpathSync.native(targetPath);
|
|
861
|
+
}
|
|
862
|
+
catch {
|
|
863
|
+
return path.resolve(targetPath);
|
|
864
|
+
}
|
|
865
|
+
}
|
|
866
|
+
isPathWithinDirectory(candidatePath, rootPath) {
|
|
867
|
+
const normalizeForCompare = (inputPath) => {
|
|
868
|
+
const resolved = path.resolve(inputPath);
|
|
869
|
+
return process.platform === 'win32' ? resolved.toLowerCase() : resolved;
|
|
870
|
+
};
|
|
871
|
+
const normalizedCandidate = normalizeForCompare(candidatePath);
|
|
872
|
+
const normalizedRoot = normalizeForCompare(rootPath);
|
|
873
|
+
const relative = path.relative(normalizedRoot, normalizedCandidate);
|
|
874
|
+
return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));
|
|
875
|
+
}
|
|
737
876
|
async pathExists(targetPath) {
|
|
738
877
|
try {
|
|
739
878
|
await fs.promises.access(targetPath);
|