@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.
Files changed (255) hide show
  1. package/README.md +107 -4
  2. package/config/base-iflow.settings.json +4 -4
  3. package/dist/api/services/index.d.ts +2 -2
  4. package/dist/api/services/index.d.ts.map +1 -1
  5. package/dist/api/services/index.js +2 -1
  6. package/dist/api/services/index.js.map +1 -1
  7. package/dist/api/services/profile-reader.d.ts.map +1 -1
  8. package/dist/api/services/profile-reader.js +13 -0
  9. package/dist/api/services/profile-reader.js.map +1 -1
  10. package/dist/api/services/profile-types.d.ts +9 -0
  11. package/dist/api/services/profile-types.d.ts.map +1 -1
  12. package/dist/api/services/profile-writer.d.ts +8 -2
  13. package/dist/api/services/profile-writer.d.ts.map +1 -1
  14. package/dist/api/services/profile-writer.js +83 -8
  15. package/dist/api/services/profile-writer.js.map +1 -1
  16. package/dist/auth/account-context.d.ts +11 -0
  17. package/dist/auth/account-context.d.ts.map +1 -1
  18. package/dist/auth/account-context.js +42 -8
  19. package/dist/auth/account-context.js.map +1 -1
  20. package/dist/auth/auth-commands.d.ts.map +1 -1
  21. package/dist/auth/auth-commands.js +9 -0
  22. package/dist/auth/auth-commands.js.map +1 -1
  23. package/dist/auth/commands/create-command-env.d.ts +3 -0
  24. package/dist/auth/commands/create-command-env.d.ts.map +1 -0
  25. package/dist/auth/commands/create-command-env.js +55 -0
  26. package/dist/auth/commands/create-command-env.js.map +1 -0
  27. package/dist/auth/commands/create-command.d.ts.map +1 -1
  28. package/dist/auth/commands/create-command.js +136 -30
  29. package/dist/auth/commands/create-command.js.map +1 -1
  30. package/dist/auth/commands/list-command.d.ts.map +1 -1
  31. package/dist/auth/commands/list-command.js +5 -1
  32. package/dist/auth/commands/list-command.js.map +1 -1
  33. package/dist/auth/commands/show-command.d.ts.map +1 -1
  34. package/dist/auth/commands/show-command.js +1 -0
  35. package/dist/auth/commands/show-command.js.map +1 -1
  36. package/dist/auth/commands/types.d.ts +3 -0
  37. package/dist/auth/commands/types.d.ts.map +1 -1
  38. package/dist/auth/commands/types.js +24 -0
  39. package/dist/auth/commands/types.js.map +1 -1
  40. package/dist/auth/profile-detector.d.ts.map +1 -1
  41. package/dist/auth/profile-detector.js +8 -0
  42. package/dist/auth/profile-detector.js.map +1 -1
  43. package/dist/auth/profile-registry.d.ts +2 -0
  44. package/dist/auth/profile-registry.d.ts.map +1 -1
  45. package/dist/auth/profile-registry.js +45 -7
  46. package/dist/auth/profile-registry.js.map +1 -1
  47. package/dist/ccs.js +154 -4
  48. package/dist/ccs.js.map +1 -1
  49. package/dist/cliproxy/account-safety.d.ts.map +1 -1
  50. package/dist/cliproxy/account-safety.js +4 -0
  51. package/dist/cliproxy/account-safety.js.map +1 -1
  52. package/dist/cliproxy/antigravity-responsibility.d.ts +36 -0
  53. package/dist/cliproxy/antigravity-responsibility.d.ts.map +1 -0
  54. package/dist/cliproxy/antigravity-responsibility.js +171 -0
  55. package/dist/cliproxy/antigravity-responsibility.js.map +1 -0
  56. package/dist/cliproxy/auth/auth-types.d.ts +2 -0
  57. package/dist/cliproxy/auth/auth-types.d.ts.map +1 -1
  58. package/dist/cliproxy/auth/oauth-handler.d.ts.map +1 -1
  59. package/dist/cliproxy/auth/oauth-handler.js +18 -0
  60. package/dist/cliproxy/auth/oauth-handler.js.map +1 -1
  61. package/dist/cliproxy/config/env-builder.d.ts.map +1 -1
  62. package/dist/cliproxy/config/env-builder.js +57 -0
  63. package/dist/cliproxy/config/env-builder.js.map +1 -1
  64. package/dist/cliproxy/config/generator.d.ts +2 -1
  65. package/dist/cliproxy/config/generator.d.ts.map +1 -1
  66. package/dist/cliproxy/config/generator.js +18 -8
  67. package/dist/cliproxy/config/generator.js.map +1 -1
  68. package/dist/cliproxy/executor/index.d.ts.map +1 -1
  69. package/dist/cliproxy/executor/index.js +30 -0
  70. package/dist/cliproxy/executor/index.js.map +1 -1
  71. package/dist/cliproxy/services/variant-config-adapter.d.ts +4 -35
  72. package/dist/cliproxy/services/variant-config-adapter.d.ts.map +1 -1
  73. package/dist/cliproxy/services/variant-config-adapter.js +11 -34
  74. package/dist/cliproxy/services/variant-config-adapter.js.map +1 -1
  75. package/dist/cliproxy/services/variant-service.d.ts +5 -1
  76. package/dist/cliproxy/services/variant-service.d.ts.map +1 -1
  77. package/dist/cliproxy/services/variant-service.js +19 -9
  78. package/dist/cliproxy/services/variant-service.js.map +1 -1
  79. package/dist/cliproxy/sync/profile-mapper.d.ts.map +1 -1
  80. package/dist/cliproxy/sync/profile-mapper.js +14 -2
  81. package/dist/cliproxy/sync/profile-mapper.js.map +1 -1
  82. package/dist/commands/api-command.d.ts +2 -0
  83. package/dist/commands/api-command.d.ts.map +1 -1
  84. package/dist/commands/api-command.js +45 -10
  85. package/dist/commands/api-command.js.map +1 -1
  86. package/dist/commands/cliproxy/auth-subcommand.d.ts.map +1 -1
  87. package/dist/commands/cliproxy/auth-subcommand.js +5 -2
  88. package/dist/commands/cliproxy/auth-subcommand.js.map +1 -1
  89. package/dist/commands/cliproxy/help-subcommand.d.ts.map +1 -1
  90. package/dist/commands/cliproxy/help-subcommand.js +1 -0
  91. package/dist/commands/cliproxy/help-subcommand.js.map +1 -1
  92. package/dist/commands/cliproxy/variant-subcommand.d.ts +15 -0
  93. package/dist/commands/cliproxy/variant-subcommand.d.ts.map +1 -1
  94. package/dist/commands/cliproxy/variant-subcommand.js +144 -15
  95. package/dist/commands/cliproxy/variant-subcommand.js.map +1 -1
  96. package/dist/commands/help-command.d.ts.map +1 -1
  97. package/dist/commands/help-command.js +34 -2
  98. package/dist/commands/help-command.js.map +1 -1
  99. package/dist/config/migration-manager.d.ts.map +1 -1
  100. package/dist/config/migration-manager.js +19 -0
  101. package/dist/config/migration-manager.js.map +1 -1
  102. package/dist/config/unified-config-loader.d.ts +11 -1
  103. package/dist/config/unified-config-loader.d.ts.map +1 -1
  104. package/dist/config/unified-config-loader.js +127 -59
  105. package/dist/config/unified-config-loader.js.map +1 -1
  106. package/dist/config/unified-config-types.d.ts +16 -0
  107. package/dist/config/unified-config-types.d.ts.map +1 -1
  108. package/dist/config/unified-config-types.js +8 -1
  109. package/dist/config/unified-config-types.js.map +1 -1
  110. package/dist/management/instance-manager.d.ts +1 -0
  111. package/dist/management/instance-manager.d.ts.map +1 -1
  112. package/dist/management/instance-manager.js +14 -8
  113. package/dist/management/instance-manager.js.map +1 -1
  114. package/dist/management/profile-context-sync-lock.d.ts +14 -0
  115. package/dist/management/profile-context-sync-lock.d.ts.map +1 -0
  116. package/dist/management/profile-context-sync-lock.js +174 -0
  117. package/dist/management/profile-context-sync-lock.js.map +1 -0
  118. package/dist/management/shared-manager.d.ts +18 -0
  119. package/dist/management/shared-manager.d.ts.map +1 -1
  120. package/dist/management/shared-manager.js +145 -6
  121. package/dist/management/shared-manager.js.map +1 -1
  122. package/dist/targets/droid-adapter.d.ts +2 -4
  123. package/dist/targets/droid-adapter.d.ts.map +1 -1
  124. package/dist/targets/droid-adapter.js +20 -10
  125. package/dist/targets/droid-adapter.js.map +1 -1
  126. package/dist/targets/droid-command-router.d.ts +26 -0
  127. package/dist/targets/droid-command-router.d.ts.map +1 -0
  128. package/dist/targets/droid-command-router.js +240 -0
  129. package/dist/targets/droid-command-router.js.map +1 -0
  130. package/dist/targets/droid-config-manager.d.ts +9 -1
  131. package/dist/targets/droid-config-manager.d.ts.map +1 -1
  132. package/dist/targets/droid-config-manager.js +134 -6
  133. package/dist/targets/droid-config-manager.js.map +1 -1
  134. package/dist/targets/droid-provider.d.ts +40 -0
  135. package/dist/targets/droid-provider.d.ts.map +1 -0
  136. package/dist/targets/droid-provider.js +140 -0
  137. package/dist/targets/droid-provider.js.map +1 -0
  138. package/dist/targets/droid-reasoning-runtime.d.ts +14 -0
  139. package/dist/targets/droid-reasoning-runtime.d.ts.map +1 -0
  140. package/dist/targets/droid-reasoning-runtime.js +42 -0
  141. package/dist/targets/droid-reasoning-runtime.js.map +1 -0
  142. package/dist/targets/index.d.ts +2 -0
  143. package/dist/targets/index.d.ts.map +1 -1
  144. package/dist/targets/index.js +4 -1
  145. package/dist/targets/index.js.map +1 -1
  146. package/dist/targets/target-adapter.d.ts +6 -0
  147. package/dist/targets/target-adapter.d.ts.map +1 -1
  148. package/dist/targets/target-resolver.d.ts.map +1 -1
  149. package/dist/targets/target-resolver.js +6 -3
  150. package/dist/targets/target-resolver.js.map +1 -1
  151. package/dist/types/config.d.ts +7 -0
  152. package/dist/types/config.d.ts.map +1 -1
  153. package/dist/types/config.js.map +1 -1
  154. package/dist/ui/assets/accounts-y2u0CVK8.js +1 -0
  155. package/dist/ui/assets/{alert-dialog-YcmZPFim.js → alert-dialog-CetY4Iww.js} +1 -1
  156. package/dist/ui/assets/api-5q1FT1uL.js +1 -0
  157. package/dist/ui/assets/auth-section-CaQeee-F.js +1 -0
  158. package/dist/ui/assets/{backups-section-DmAsqMfq.js → backups-section-hF88BjYJ.js} +1 -1
  159. package/dist/ui/assets/{checkbox-Cfg9kbJX.js → checkbox-Dhm5Fzkb.js} +1 -1
  160. package/dist/ui/assets/cliproxy-BeYNWmY_.js +3 -0
  161. package/dist/ui/assets/cliproxy-control-panel-CJELeI80.js +1 -0
  162. package/dist/ui/assets/{confirm-dialog-CRcV2Yc4.js → confirm-dialog-Dn3SrwNV.js} +1 -1
  163. package/dist/ui/assets/{copilot-EarFqUyJ.js → copilot-vwT-4_V4.js} +2 -2
  164. package/dist/ui/assets/{cursor-Dbe4Wtw2.js → cursor-CN3lIX63.js} +1 -1
  165. package/dist/ui/assets/droid-DBP2yCY7.js +2 -0
  166. package/dist/ui/assets/{form-utils-C-pVd1--.js → form-utils-Cn_Uld6y.js} +1 -1
  167. package/dist/ui/assets/globalenv-section-DNKAJasL.js +1 -0
  168. package/dist/ui/assets/{health-Cvr359ff.js → health-C7tNiLzc.js} +1 -1
  169. package/dist/ui/assets/icons-DrewC9c3.js +1 -0
  170. package/dist/ui/assets/index-C8-ef-r7.js +1 -0
  171. package/dist/ui/assets/{index-Cp8K9_TQ.js → index-MGh88HoC.js} +1 -1
  172. package/dist/ui/assets/{index-DTDftvd-.js → index-QBUSDLTx.js} +1 -1
  173. package/dist/ui/assets/index-k-HuyjpO.js +47 -0
  174. package/dist/ui/assets/index-s-oTl3hW.css +1 -0
  175. package/dist/ui/assets/{index-CLBNUja8.js → index-uYnNU6Ut.js} +1 -1
  176. package/dist/ui/assets/proxy-status-widget-CIm5vKY7.js +1 -0
  177. package/dist/ui/assets/{radix-ui-DKgfU5rd.js → radix-ui-C1Gpgz6I.js} +1 -1
  178. package/dist/ui/assets/{separator-CdOKc0gJ.js → separator-BLVyAGAm.js} +1 -1
  179. package/dist/ui/assets/shared-CHH09ZNi.js +8 -0
  180. package/dist/ui/assets/{switch-B2ALi24E.js → switch-CwLyB4JK.js} +1 -1
  181. package/dist/ui/assets/{tanstack-5ndrQy-j.js → tanstack-DDJIhNJd.js} +1 -1
  182. package/dist/ui/assets/updates-VlxL3aum.js +1 -0
  183. package/dist/ui/index.html +6 -6
  184. package/dist/web-server/model-pricing.d.ts.map +1 -1
  185. package/dist/web-server/model-pricing.js +114 -22
  186. package/dist/web-server/model-pricing.js.map +1 -1
  187. package/dist/web-server/routes/account-route-helpers.d.ts +20 -0
  188. package/dist/web-server/routes/account-route-helpers.d.ts.map +1 -0
  189. package/dist/web-server/routes/account-route-helpers.js +34 -0
  190. package/dist/web-server/routes/account-route-helpers.js.map +1 -0
  191. package/dist/web-server/routes/account-routes.d.ts.map +1 -1
  192. package/dist/web-server/routes/account-routes.js +160 -27
  193. package/dist/web-server/routes/account-routes.js.map +1 -1
  194. package/dist/web-server/routes/cliproxy-auth-routes.d.ts.map +1 -1
  195. package/dist/web-server/routes/cliproxy-auth-routes.js +58 -24
  196. package/dist/web-server/routes/cliproxy-auth-routes.js.map +1 -1
  197. package/dist/web-server/routes/config-routes.d.ts.map +1 -1
  198. package/dist/web-server/routes/config-routes.js +73 -0
  199. package/dist/web-server/routes/config-routes.js.map +1 -1
  200. package/dist/web-server/routes/droid-routes.d.ts +3 -0
  201. package/dist/web-server/routes/droid-routes.d.ts.map +1 -0
  202. package/dist/web-server/routes/droid-routes.js +61 -0
  203. package/dist/web-server/routes/droid-routes.js.map +1 -0
  204. package/dist/web-server/routes/index.d.ts.map +1 -1
  205. package/dist/web-server/routes/index.js +3 -0
  206. package/dist/web-server/routes/index.js.map +1 -1
  207. package/dist/web-server/routes/profile-routes.d.ts +2 -0
  208. package/dist/web-server/routes/profile-routes.d.ts.map +1 -1
  209. package/dist/web-server/routes/profile-routes.js +86 -6
  210. package/dist/web-server/routes/profile-routes.js.map +1 -1
  211. package/dist/web-server/routes/route-helpers.d.ts +2 -1
  212. package/dist/web-server/routes/route-helpers.d.ts.map +1 -1
  213. package/dist/web-server/routes/route-helpers.js +20 -1
  214. package/dist/web-server/routes/route-helpers.js.map +1 -1
  215. package/dist/web-server/routes/settings-routes.d.ts.map +1 -1
  216. package/dist/web-server/routes/settings-routes.js +110 -12
  217. package/dist/web-server/routes/settings-routes.js.map +1 -1
  218. package/dist/web-server/routes/variant-routes.d.ts +2 -0
  219. package/dist/web-server/routes/variant-routes.d.ts.map +1 -1
  220. package/dist/web-server/routes/variant-routes.js +50 -6
  221. package/dist/web-server/routes/variant-routes.js.map +1 -1
  222. package/dist/web-server/services/compatible-cli-docs-registry.d.ts +23 -0
  223. package/dist/web-server/services/compatible-cli-docs-registry.d.ts.map +1 -0
  224. package/dist/web-server/services/compatible-cli-docs-registry.js +81 -0
  225. package/dist/web-server/services/compatible-cli-docs-registry.js.map +1 -0
  226. package/dist/web-server/services/compatible-cli-json-file-service.d.ts +41 -0
  227. package/dist/web-server/services/compatible-cli-json-file-service.d.ts.map +1 -0
  228. package/dist/web-server/services/compatible-cli-json-file-service.js +205 -0
  229. package/dist/web-server/services/compatible-cli-json-file-service.js.map +1 -0
  230. package/dist/web-server/services/compatible-cli-types.d.ts +82 -0
  231. package/dist/web-server/services/compatible-cli-types.d.ts.map +1 -0
  232. package/dist/web-server/services/compatible-cli-types.js +3 -0
  233. package/dist/web-server/services/compatible-cli-types.js.map +1 -0
  234. package/dist/web-server/services/droid-dashboard-service.d.ts +29 -0
  235. package/dist/web-server/services/droid-dashboard-service.d.ts.map +1 -0
  236. package/dist/web-server/services/droid-dashboard-service.js +238 -0
  237. package/dist/web-server/services/droid-dashboard-service.js.map +1 -0
  238. package/dist/web-server/shared-routes.d.ts.map +1 -1
  239. package/dist/web-server/shared-routes.js +350 -52
  240. package/dist/web-server/shared-routes.js.map +1 -1
  241. package/lib/hooks/websearch-transformer.cjs +78 -52
  242. package/package.json +4 -2
  243. package/scripts/maintainability-check.js +163 -0
  244. package/dist/ui/assets/accounts-DIqClJ7z.js +0 -1
  245. package/dist/ui/assets/api-BWyCgbMh.js +0 -1
  246. package/dist/ui/assets/auth-section-Amm4rwiS.js +0 -1
  247. package/dist/ui/assets/cliproxy-B-q7RjS2.js +0 -3
  248. package/dist/ui/assets/cliproxy-control-panel-BliRTkbb.js +0 -1
  249. package/dist/ui/assets/globalenv-section-CBp73q9k.js +0 -1
  250. package/dist/ui/assets/icons-DGASzt3M.js +0 -1
  251. package/dist/ui/assets/index-8n-yIlea.js +0 -47
  252. package/dist/ui/assets/index-B5aulDs4.js +0 -1
  253. package/dist/ui/assets/index-BBCDm6dS.css +0 -1
  254. package/dist/ui/assets/proxy-status-widget-C0G0aOCW.js +0 -1
  255. 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":"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"}
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;AAKH,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;;IAO9C;;OAEG;IACG,cAAc,CAClB,WAAW,EAAE,MAAM,EACnB,aAAa,GAAE,oBAA6D,GAC3E,OAAO,CAAC,MAAM,CAAC;IAiBlB;;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"}
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
- // Lazy initialization
56
- if (!fs.existsSync(instancePath)) {
57
- this.initializeInstance(profileName, instancePath);
58
- }
59
- // Validate structure (auto-fix missing dirs)
60
- this.validateInstance(instancePath);
61
- // Apply context policy (isolated by default, optional shared group).
62
- await this.sharedManager.syncProjectContext(instancePath, contextPolicy);
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":"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"}
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;;IAiB3C;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA8B7B;;;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;IA0F3F;;;;;;;;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;YACW,yBAAyB;IAmBvC;;;OAGG;YACW,6BAA6B;IA4C3C;;OAEG;YACW,aAAa;IAc3B;;;OAGG;YACW,gCAAgC;IA0C9C;;OAEG;YACW,iBAAiB;IAiB/B;;OAEG;YACW,mBAAmB;YAiBnB,UAAU;YASV,eAAe;YAIf,QAAQ;IAWtB;;OAEG;IACH,OAAO,CAAC,qBAAqB;CAuB9B;AAED,eAAe,aAAa,CAAC"}
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
- if (resolvedTarget.startsWith(sharedDir) || resolvedTarget === linkPath) {
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 = path.resolve(path.join(this.sharedDir, 'memory'));
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
- if (!path.resolve(memoryTarget).startsWith(sharedMemoryRoot)) {
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(memoryTarget)) {
654
- await this.mergeDirectoryWithConflictCopies(memoryTarget, memoryPath, instanceName);
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);