@kaitranntt/ccs 8.8.1-dev.9 → 8.9.0-dev.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (267) hide show
  1. package/README.md +1 -0
  2. package/dist/auth/auth-commands.js +3 -3
  3. package/dist/auth/auth-commands.js.map +1 -1
  4. package/dist/auth/resume-lane-diagnostics.d.ts +9 -0
  5. package/dist/auth/resume-lane-diagnostics.d.ts.map +1 -1
  6. package/dist/auth/resume-lane-diagnostics.js +105 -1
  7. package/dist/auth/resume-lane-diagnostics.js.map +1 -1
  8. package/dist/auth/resume-lane-warning.d.ts +9 -1
  9. package/dist/auth/resume-lane-warning.d.ts.map +1 -1
  10. package/dist/auth/resume-lane-warning.js +72 -5
  11. package/dist/auth/resume-lane-warning.js.map +1 -1
  12. package/dist/ccs.d.ts +1 -1
  13. package/dist/ccs.d.ts.map +1 -1
  14. package/dist/ccs.js +5 -1
  15. package/dist/ccs.js.map +1 -1
  16. package/dist/cliproxy/auth/oauth-cli-args.d.ts +11 -0
  17. package/dist/cliproxy/auth/oauth-cli-args.d.ts.map +1 -0
  18. package/dist/cliproxy/auth/oauth-cli-args.js +53 -0
  19. package/dist/cliproxy/auth/oauth-cli-args.js.map +1 -0
  20. package/dist/cliproxy/auth/oauth-cli-capabilities.d.ts +11 -0
  21. package/dist/cliproxy/auth/oauth-cli-capabilities.d.ts.map +1 -0
  22. package/dist/cliproxy/auth/oauth-cli-capabilities.js +101 -0
  23. package/dist/cliproxy/auth/oauth-cli-capabilities.js.map +1 -0
  24. package/dist/cliproxy/auth/oauth-handler.d.ts +0 -6
  25. package/dist/cliproxy/auth/oauth-handler.d.ts.map +1 -1
  26. package/dist/cliproxy/auth/oauth-handler.js +70 -43
  27. package/dist/cliproxy/auth/oauth-handler.js.map +1 -1
  28. package/dist/cliproxy/auth/test-fixtures/gemini-backend-guidance-child.scenario.d.ts +2 -0
  29. package/dist/cliproxy/auth/test-fixtures/gemini-backend-guidance-child.scenario.d.ts.map +1 -0
  30. package/dist/cliproxy/auth/test-fixtures/gemini-backend-guidance-child.scenario.js +207 -0
  31. package/dist/cliproxy/auth/test-fixtures/gemini-backend-guidance-child.scenario.js.map +1 -0
  32. package/dist/cliproxy/binary-manager.d.ts +1 -0
  33. package/dist/cliproxy/binary-manager.d.ts.map +1 -1
  34. package/dist/cliproxy/binary-manager.js +1 -1
  35. package/dist/cliproxy/binary-manager.js.map +1 -1
  36. package/dist/cliproxy/config/env-builder.d.ts +5 -0
  37. package/dist/cliproxy/config/env-builder.d.ts.map +1 -1
  38. package/dist/cliproxy/config/env-builder.js +24 -1
  39. package/dist/cliproxy/config/env-builder.js.map +1 -1
  40. package/dist/cliproxy/config/generator.d.ts +2 -1
  41. package/dist/cliproxy/config/generator.d.ts.map +1 -1
  42. package/dist/cliproxy/config/generator.js +59 -9
  43. package/dist/cliproxy/config/generator.js.map +1 -1
  44. package/dist/cliproxy/config/oauth-model-alias-config.d.ts +6 -0
  45. package/dist/cliproxy/config/oauth-model-alias-config.d.ts.map +1 -0
  46. package/dist/cliproxy/config/oauth-model-alias-config.js +136 -0
  47. package/dist/cliproxy/config/oauth-model-alias-config.js.map +1 -0
  48. package/dist/cliproxy/config/payload-rule-config.d.ts +6 -0
  49. package/dist/cliproxy/config/payload-rule-config.d.ts.map +1 -0
  50. package/dist/cliproxy/config/payload-rule-config.js +137 -0
  51. package/dist/cliproxy/config/payload-rule-config.js.map +1 -0
  52. package/dist/cliproxy/executor/claude-launcher.d.ts +3 -0
  53. package/dist/cliproxy/executor/claude-launcher.d.ts.map +1 -1
  54. package/dist/cliproxy/executor/claude-launcher.js +7 -3
  55. package/dist/cliproxy/executor/claude-launcher.js.map +1 -1
  56. package/dist/cliproxy/executor/env-resolver.d.ts +2 -0
  57. package/dist/cliproxy/executor/env-resolver.d.ts.map +1 -1
  58. package/dist/cliproxy/executor/env-resolver.js +6 -4
  59. package/dist/cliproxy/executor/env-resolver.js.map +1 -1
  60. package/dist/cliproxy/executor/index.d.ts.map +1 -1
  61. package/dist/cliproxy/executor/index.js +7 -5
  62. package/dist/cliproxy/executor/index.js.map +1 -1
  63. package/dist/cliproxy/model-catalog.d.ts +2 -0
  64. package/dist/cliproxy/model-catalog.d.ts.map +1 -1
  65. package/dist/cliproxy/model-catalog.js +50 -0
  66. package/dist/cliproxy/model-catalog.js.map +1 -1
  67. package/dist/cliproxy/quota/quota-fetcher-claude.d.ts.map +1 -1
  68. package/dist/cliproxy/quota/quota-fetcher-claude.js +11 -1
  69. package/dist/cliproxy/quota/quota-fetcher-claude.js.map +1 -1
  70. package/dist/cliproxy/services/catalog-cache.d.ts.map +1 -1
  71. package/dist/cliproxy/services/catalog-cache.js +6 -0
  72. package/dist/cliproxy/services/catalog-cache.js.map +1 -1
  73. package/dist/cliproxy/types/config-types.d.ts +3 -0
  74. package/dist/cliproxy/types/config-types.d.ts.map +1 -1
  75. package/dist/codex-auth/shell-detect.d.ts +2 -0
  76. package/dist/codex-auth/shell-detect.d.ts.map +1 -1
  77. package/dist/codex-auth/shell-detect.js +15 -1
  78. package/dist/codex-auth/shell-detect.js.map +1 -1
  79. package/dist/commands/bar/bar-process-control.d.ts +43 -0
  80. package/dist/commands/bar/bar-process-control.d.ts.map +1 -0
  81. package/dist/commands/bar/bar-process-control.js +255 -0
  82. package/dist/commands/bar/bar-process-control.js.map +1 -0
  83. package/dist/commands/bar/bar-server-probe.d.ts +5 -2
  84. package/dist/commands/bar/bar-server-probe.d.ts.map +1 -1
  85. package/dist/commands/bar/bar-server-probe.js +38 -12
  86. package/dist/commands/bar/bar-server-probe.js.map +1 -1
  87. package/dist/commands/bar/help-subcommand.d.ts.map +1 -1
  88. package/dist/commands/bar/help-subcommand.js +2 -0
  89. package/dist/commands/bar/help-subcommand.js.map +1 -1
  90. package/dist/commands/bar/index.d.ts.map +1 -1
  91. package/dist/commands/bar/index.js +13 -3
  92. package/dist/commands/bar/index.js.map +1 -1
  93. package/dist/commands/bar/launch-descriptor.d.ts +2 -0
  94. package/dist/commands/bar/launch-descriptor.d.ts.map +1 -1
  95. package/dist/commands/bar/launch-descriptor.js +6 -1
  96. package/dist/commands/bar/launch-descriptor.js.map +1 -1
  97. package/dist/commands/bar/launch-subcommand.d.ts +18 -1
  98. package/dist/commands/bar/launch-subcommand.d.ts.map +1 -1
  99. package/dist/commands/bar/launch-subcommand.js +149 -45
  100. package/dist/commands/bar/launch-subcommand.js.map +1 -1
  101. package/dist/commands/bar/port-arg.d.ts +16 -0
  102. package/dist/commands/bar/port-arg.d.ts.map +1 -0
  103. package/dist/commands/bar/port-arg.js +41 -0
  104. package/dist/commands/bar/port-arg.js.map +1 -0
  105. package/dist/commands/bar/serve-subcommand.d.ts +5 -0
  106. package/dist/commands/bar/serve-subcommand.d.ts.map +1 -1
  107. package/dist/commands/bar/serve-subcommand.js +47 -29
  108. package/dist/commands/bar/serve-subcommand.js.map +1 -1
  109. package/dist/commands/bar/status-subcommand.d.ts.map +1 -1
  110. package/dist/commands/bar/status-subcommand.js +11 -2
  111. package/dist/commands/bar/status-subcommand.js.map +1 -1
  112. package/dist/commands/bar/stop-subcommand.d.ts +5 -0
  113. package/dist/commands/bar/stop-subcommand.d.ts.map +1 -1
  114. package/dist/commands/bar/stop-subcommand.js +71 -27
  115. package/dist/commands/bar/stop-subcommand.js.map +1 -1
  116. package/dist/commands/cliproxy/catalog-subcommand.d.ts.map +1 -1
  117. package/dist/commands/cliproxy/catalog-subcommand.js +2 -0
  118. package/dist/commands/cliproxy/catalog-subcommand.js.map +1 -1
  119. package/dist/commands/cliproxy/quota-subcommand/sections/claude.d.ts.map +1 -1
  120. package/dist/commands/cliproxy/quota-subcommand/sections/claude.js +2 -1
  121. package/dist/commands/cliproxy/quota-subcommand/sections/claude.js.map +1 -1
  122. package/dist/config/schemas/auth.d.ts +2 -2
  123. package/dist/config/schemas/auth.d.ts.map +1 -1
  124. package/dist/config/schemas/cliproxy.d.ts +43 -0
  125. package/dist/config/schemas/cliproxy.d.ts.map +1 -1
  126. package/dist/config/schemas/cliproxy.js.map +1 -1
  127. package/dist/config/schemas/index.d.ts +1 -1
  128. package/dist/config/schemas/index.d.ts.map +1 -1
  129. package/dist/config/schemas/index.js.map +1 -1
  130. package/dist/config/schemas/version.d.ts +2 -1
  131. package/dist/config/schemas/version.d.ts.map +1 -1
  132. package/dist/config/schemas/version.js +2 -1
  133. package/dist/config/schemas/version.js.map +1 -1
  134. package/dist/copilot/copilot-executor.d.ts +3 -1
  135. package/dist/copilot/copilot-executor.d.ts.map +1 -1
  136. package/dist/copilot/copilot-executor.js +11 -7
  137. package/dist/copilot/copilot-executor.js.map +1 -1
  138. package/dist/cursor/cursor-profile-executor.d.ts +3 -1
  139. package/dist/cursor/cursor-profile-executor.d.ts.map +1 -1
  140. package/dist/cursor/cursor-profile-executor.js +8 -4
  141. package/dist/cursor/cursor-profile-executor.js.map +1 -1
  142. package/dist/delegation/headless-executor.d.ts.map +1 -1
  143. package/dist/delegation/headless-executor.js +4 -3
  144. package/dist/delegation/headless-executor.js.map +1 -1
  145. package/dist/dispatcher/flows/copilot-flow.d.ts.map +1 -1
  146. package/dist/dispatcher/flows/copilot-flow.js +3 -2
  147. package/dist/dispatcher/flows/copilot-flow.js.map +1 -1
  148. package/dist/dispatcher/flows/cursor-flow.d.ts.map +1 -1
  149. package/dist/dispatcher/flows/cursor-flow.js +3 -2
  150. package/dist/dispatcher/flows/cursor-flow.js.map +1 -1
  151. package/dist/dispatcher/flows/settings-flow.d.ts.map +1 -1
  152. package/dist/dispatcher/flows/settings-flow.js +12 -10
  153. package/dist/dispatcher/flows/settings-flow.js.map +1 -1
  154. package/dist/management/instance-directory.d.ts +19 -0
  155. package/dist/management/instance-directory.d.ts.map +1 -1
  156. package/dist/management/instance-directory.js +130 -7
  157. package/dist/management/instance-directory.js.map +1 -1
  158. package/dist/management/instance-manager.d.ts +2 -5
  159. package/dist/management/instance-manager.d.ts.map +1 -1
  160. package/dist/management/instance-manager.js +26 -27
  161. package/dist/management/instance-manager.js.map +1 -1
  162. package/dist/management/shared-manager/canonical-first-file-claims.d.ts +6 -0
  163. package/dist/management/shared-manager/canonical-first-file-claims.d.ts.map +1 -0
  164. package/dist/management/shared-manager/canonical-first-file-claims.js +143 -0
  165. package/dist/management/shared-manager/canonical-first-file-claims.js.map +1 -0
  166. package/dist/management/shared-manager/canonical-first-file-reconciler.d.ts +15 -0
  167. package/dist/management/shared-manager/canonical-first-file-reconciler.d.ts.map +1 -0
  168. package/dist/management/shared-manager/canonical-first-file-reconciler.js +131 -0
  169. package/dist/management/shared-manager/canonical-first-file-reconciler.js.map +1 -0
  170. package/dist/management/shared-manager/diverged-file-adopter.d.ts +5 -0
  171. package/dist/management/shared-manager/diverged-file-adopter.d.ts.map +1 -0
  172. package/dist/management/shared-manager/diverged-file-adopter.js +361 -0
  173. package/dist/management/shared-manager/diverged-file-adopter.js.map +1 -0
  174. package/dist/management/shared-manager/fs-helpers.d.ts +9 -0
  175. package/dist/management/shared-manager/fs-helpers.d.ts.map +1 -1
  176. package/dist/management/shared-manager/fs-helpers.js +9 -0
  177. package/dist/management/shared-manager/fs-helpers.js.map +1 -1
  178. package/dist/management/shared-manager/plugin-layout-internals.d.ts +1 -1
  179. package/dist/management/shared-manager/plugin-layout-internals.d.ts.map +1 -1
  180. package/dist/management/shared-manager/plugin-layout-internals.js +54 -8
  181. package/dist/management/shared-manager/plugin-layout-internals.js.map +1 -1
  182. package/dist/management/shared-manager/shared-dir-linker.d.ts +1 -1
  183. package/dist/management/shared-manager/shared-dir-linker.d.ts.map +1 -1
  184. package/dist/management/shared-manager/shared-dir-linker.js +147 -75
  185. package/dist/management/shared-manager/shared-dir-linker.js.map +1 -1
  186. package/dist/management/shared-manager/types.d.ts +12 -1
  187. package/dist/management/shared-manager/types.d.ts.map +1 -1
  188. package/dist/management/shared-manager/types.js +12 -1
  189. package/dist/management/shared-manager/types.js.map +1 -1
  190. package/dist/proxy/proxy-daemon-entry.js +10 -2
  191. package/dist/proxy/proxy-daemon-entry.js.map +1 -1
  192. package/dist/proxy/server/messages-route.d.ts +2 -2
  193. package/dist/proxy/server/messages-route.d.ts.map +1 -1
  194. package/dist/proxy/server/messages-route.js +33 -24
  195. package/dist/proxy/server/messages-route.js.map +1 -1
  196. package/dist/proxy/server/proxy-server.d.ts +1 -0
  197. package/dist/proxy/server/proxy-server.d.ts.map +1 -1
  198. package/dist/proxy/server/proxy-server.js +57 -5
  199. package/dist/proxy/server/proxy-server.js.map +1 -1
  200. package/dist/proxy/server/upstream-transport.d.ts +14 -0
  201. package/dist/proxy/server/upstream-transport.d.ts.map +1 -0
  202. package/dist/proxy/server/upstream-transport.js +72 -0
  203. package/dist/proxy/server/upstream-transport.js.map +1 -0
  204. package/dist/proxy/transformers/request-transformer.d.ts.map +1 -1
  205. package/dist/proxy/transformers/request-transformer.js +43 -1
  206. package/dist/proxy/transformers/request-transformer.js.map +1 -1
  207. package/dist/services/logging/log-redaction.d.ts.map +1 -1
  208. package/dist/services/logging/log-redaction.js +4 -1
  209. package/dist/services/logging/log-redaction.js.map +1 -1
  210. package/dist/services/logging/log-types.d.ts +1 -0
  211. package/dist/services/logging/log-types.d.ts.map +1 -1
  212. package/dist/services/logging/log-types.js.map +1 -1
  213. package/dist/types/config.d.ts +2 -2
  214. package/dist/types/config.d.ts.map +1 -1
  215. package/dist/utils/fetch-proxy-setup.d.ts.map +1 -1
  216. package/dist/utils/fetch-proxy-setup.js +10 -6
  217. package/dist/utils/fetch-proxy-setup.js.map +1 -1
  218. package/dist/utils/websearch/claude-tool-args.d.ts +1 -1
  219. package/dist/utils/websearch/claude-tool-args.d.ts.map +1 -1
  220. package/dist/utils/websearch/claude-tool-args.js +3 -2
  221. package/dist/utils/websearch/claude-tool-args.js.map +1 -1
  222. package/dist/utils/websearch/hook-config.d.ts +2 -1
  223. package/dist/utils/websearch/hook-config.d.ts.map +1 -1
  224. package/dist/utils/websearch/hook-config.js +1 -2
  225. package/dist/utils/websearch/hook-config.js.map +1 -1
  226. package/dist/utils/websearch/hook-env.d.ts +2 -1
  227. package/dist/utils/websearch/hook-env.d.ts.map +1 -1
  228. package/dist/utils/websearch/hook-env.js +1 -2
  229. package/dist/utils/websearch/hook-env.js.map +1 -1
  230. package/dist/utils/websearch/hook-installer.d.ts +2 -1
  231. package/dist/utils/websearch/hook-installer.d.ts.map +1 -1
  232. package/dist/utils/websearch/hook-installer.js +1 -2
  233. package/dist/utils/websearch/hook-installer.js.map +1 -1
  234. package/dist/utils/websearch/index.d.ts +2 -0
  235. package/dist/utils/websearch/index.d.ts.map +1 -1
  236. package/dist/utils/websearch/index.js +3 -1
  237. package/dist/utils/websearch/index.js.map +1 -1
  238. package/dist/utils/websearch/launch-state.d.ts +9 -0
  239. package/dist/utils/websearch/launch-state.d.ts.map +1 -0
  240. package/dist/utils/websearch/launch-state.js +15 -0
  241. package/dist/utils/websearch/launch-state.js.map +1 -0
  242. package/dist/utils/websearch/mcp-installer.d.ts +6 -5
  243. package/dist/utils/websearch/mcp-installer.d.ts.map +1 -1
  244. package/dist/utils/websearch/mcp-installer.js +10 -15
  245. package/dist/utils/websearch/mcp-installer.js.map +1 -1
  246. package/dist/utils/websearch/status.d.ts +4 -3
  247. package/dist/utils/websearch/status.d.ts.map +1 -1
  248. package/dist/utils/websearch/status.js +7 -10
  249. package/dist/utils/websearch/status.js.map +1 -1
  250. package/dist/utils/websearch-manager.d.ts +2 -0
  251. package/dist/utils/websearch-manager.d.ts.map +1 -1
  252. package/dist/utils/websearch-manager.js +3 -1
  253. package/dist/utils/websearch-manager.js.map +1 -1
  254. package/dist/web-server/routes/bar-routes.d.ts.map +1 -1
  255. package/dist/web-server/routes/bar-routes.js +15 -10
  256. package/dist/web-server/routes/bar-routes.js.map +1 -1
  257. package/dist/web-server/usage/claude-native-credentials.d.ts +23 -2
  258. package/dist/web-server/usage/claude-native-credentials.d.ts.map +1 -1
  259. package/dist/web-server/usage/claude-native-credentials.js +78 -14
  260. package/dist/web-server/usage/claude-native-credentials.js.map +1 -1
  261. package/dist/web-server/usage/native-quota-collector.d.ts +10 -9
  262. package/dist/web-server/usage/native-quota-collector.d.ts.map +1 -1
  263. package/dist/web-server/usage/native-quota-collector.js +113 -42
  264. package/dist/web-server/usage/native-quota-collector.js.map +1 -1
  265. package/package.json +2 -1
  266. package/scripts/ci-parity-gate.sh +1 -0
  267. package/scripts/run-test-bucket.js +1 -0
@@ -23,13 +23,141 @@ var __importStar = (this && this.__importStar) || function (mod) {
23
23
  return result;
24
24
  };
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.listAccountInstancePaths = exports.listAccountInstanceNames = exports.isAccountInstanceName = void 0;
26
+ exports.listAccountInstancePaths = exports.listAccountInstanceNames = exports.assertAccountInstanceIdentity = exports.captureSafeAccountInstanceIdentity = exports.assertSafeAccountInstancePath = exports.ensureSafeAccountInstancesDirectory = exports.isSafeAccountInstancePath = exports.normalizeAccountInstanceName = exports.isAccountInstanceName = void 0;
27
27
  const fs = __importStar(require("fs"));
28
28
  const path = __importStar(require("path"));
29
29
  function isAccountInstanceName(name) {
30
30
  return !name.startsWith('.');
31
31
  }
32
32
  exports.isAccountInstanceName = isAccountInstanceName;
33
+ function normalizeAccountInstanceName(name) {
34
+ return name.replace(/[^a-zA-Z0-9_-]/g, '-').toLowerCase();
35
+ }
36
+ exports.normalizeAccountInstanceName = normalizeAccountInstanceName;
37
+ function unsafeInstancePath(targetPath) {
38
+ throw Object.assign(new TypeError(`Unsafe account instance path: ${targetPath}`), {
39
+ code: 'EINVAL',
40
+ });
41
+ }
42
+ function readDirectoryIdentity(directoryPath) {
43
+ const stats = fs.lstatSync(directoryPath);
44
+ if (stats.isSymbolicLink() || !stats.isDirectory())
45
+ unsafeInstancePath(directoryPath);
46
+ return {
47
+ device: stats.dev,
48
+ inode: stats.ino,
49
+ realPath: fs.realpathSync.native(directoryPath),
50
+ };
51
+ }
52
+ function identitiesMatch(left, right) {
53
+ return (left.device === right.device && left.inode === right.inode && left.realPath === right.realPath);
54
+ }
55
+ function createDirectoryUnderStableParent(directoryPath) {
56
+ const parentPath = path.dirname(directoryPath);
57
+ const parentBefore = readDirectoryIdentity(parentPath);
58
+ try {
59
+ fs.mkdirSync(directoryPath, { mode: 0o700 });
60
+ readDirectoryIdentity(directoryPath);
61
+ }
62
+ catch (error) {
63
+ if (error.code !== 'EEXIST')
64
+ throw error;
65
+ }
66
+ let parentAfter;
67
+ try {
68
+ parentAfter = readDirectoryIdentity(parentPath);
69
+ }
70
+ catch {
71
+ unsafeInstancePath(parentPath);
72
+ }
73
+ if (!identitiesMatch(parentBefore, parentAfter)) {
74
+ unsafeInstancePath(parentPath);
75
+ }
76
+ readDirectoryIdentity(directoryPath);
77
+ }
78
+ function isPathWithinDirectory(candidatePath, directoryPath) {
79
+ const relative = path.relative(directoryPath, candidatePath);
80
+ return relative.length > 0 && relative !== '..' && !relative.startsWith(`..${path.sep}`);
81
+ }
82
+ /** Reject symlink roots/entries and require the real instance path to stay under the real root. */
83
+ function isSafeAccountInstancePath(instancesDir, instancePath) {
84
+ try {
85
+ const rootStats = fs.lstatSync(instancesDir);
86
+ if (rootStats.isSymbolicLink() || !rootStats.isDirectory())
87
+ return false;
88
+ const instanceStats = fs.lstatSync(instancePath);
89
+ if (instanceStats.isSymbolicLink() || !instanceStats.isDirectory())
90
+ return false;
91
+ const realRoot = fs.realpathSync.native(instancesDir);
92
+ const realInstance = fs.realpathSync.native(instancePath);
93
+ return isPathWithinDirectory(realInstance, realRoot);
94
+ }
95
+ catch {
96
+ return false;
97
+ }
98
+ }
99
+ exports.isSafeAccountInstancePath = isSafeAccountInstancePath;
100
+ /** Create a missing managed instances root without traversing symlink parents. */
101
+ function ensureSafeAccountInstancesDirectory(instancesDir) {
102
+ const missingPaths = [];
103
+ let currentPath = instancesDir;
104
+ while (true) {
105
+ try {
106
+ const stats = fs.lstatSync(currentPath);
107
+ if (stats.isSymbolicLink() || !stats.isDirectory())
108
+ unsafeInstancePath(currentPath);
109
+ break;
110
+ }
111
+ catch (error) {
112
+ if (error.code !== 'ENOENT')
113
+ throw error;
114
+ missingPaths.push(currentPath);
115
+ const parentPath = path.dirname(currentPath);
116
+ if (parentPath === currentPath)
117
+ unsafeInstancePath(instancesDir);
118
+ currentPath = parentPath;
119
+ }
120
+ }
121
+ for (const directoryPath of missingPaths.reverse()) {
122
+ createDirectoryUnderStableParent(directoryPath);
123
+ }
124
+ const rootStats = fs.lstatSync(instancesDir);
125
+ if (rootStats.isSymbolicLink() || !rootStats.isDirectory())
126
+ unsafeInstancePath(instancesDir);
127
+ }
128
+ exports.ensureSafeAccountInstancesDirectory = ensureSafeAccountInstancesDirectory;
129
+ function assertSafeAccountInstancePath(instancesDir, instancePath) {
130
+ if (!isSafeAccountInstancePath(instancesDir, instancePath))
131
+ unsafeInstancePath(instancePath);
132
+ }
133
+ exports.assertSafeAccountInstancePath = assertSafeAccountInstancePath;
134
+ /**
135
+ * Capture the validated directory identity used by later mutation guards.
136
+ * This is defense-in-depth for static and ordinary concurrent replacement,
137
+ * not a hostile same-UID race boundary; that would require dirfd/openat-style APIs.
138
+ */
139
+ function captureSafeAccountInstanceIdentity(instancesDir, instancePath) {
140
+ assertSafeAccountInstancePath(instancesDir, instancePath);
141
+ const identity = readDirectoryIdentity(instancePath);
142
+ assertAccountInstanceIdentity(instancesDir, instancePath, identity);
143
+ return identity;
144
+ }
145
+ exports.captureSafeAccountInstanceIdentity = captureSafeAccountInstanceIdentity;
146
+ /** Require the lexical instance path to still name the validated directory. */
147
+ function assertAccountInstanceIdentity(instancesDir, instancePath, expectedIdentity) {
148
+ if (!isSafeAccountInstancePath(instancesDir, instancePath))
149
+ unsafeInstancePath(instancePath);
150
+ let currentIdentity;
151
+ try {
152
+ currentIdentity = readDirectoryIdentity(instancePath);
153
+ }
154
+ catch {
155
+ unsafeInstancePath(instancePath);
156
+ }
157
+ if (!identitiesMatch(expectedIdentity, currentIdentity))
158
+ unsafeInstancePath(instancePath);
159
+ }
160
+ exports.assertAccountInstanceIdentity = assertAccountInstanceIdentity;
33
161
  function listAccountInstanceNames(instancesDir) {
34
162
  if (!fs.existsSync(instancesDir)) {
35
163
  return [];
@@ -38,12 +166,7 @@ function listAccountInstanceNames(instancesDir) {
38
166
  if (!isAccountInstanceName(name)) {
39
167
  return false;
40
168
  }
41
- try {
42
- return fs.statSync(path.join(instancesDir, name)).isDirectory();
43
- }
44
- catch {
45
- return false;
46
- }
169
+ return isSafeAccountInstancePath(instancesDir, path.join(instancesDir, name));
47
170
  });
48
171
  }
49
172
  exports.listAccountInstanceNames = listAccountInstanceNames;
@@ -1 +1 @@
1
- {"version":3,"file":"instance-directory.js","sourceRoot":"","sources":["../../src/management/instance-directory.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,2CAA6B;AAE7B,SAAgB,qBAAqB,CAAC,IAAY;IAChD,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AAC/B,CAAC;AAFD,sDAEC;AAED,SAAgB,wBAAwB,CAAC,YAAoB;IAC3D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,EAAE,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QAClD,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC;YACjC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC;YACH,OAAO,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAClE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAhBD,4DAgBC;AAED,SAAgB,wBAAwB,CAAC,YAAoB;IAC3D,OAAO,wBAAwB,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC;AAC7F,CAAC;AAFD,4DAEC"}
1
+ {"version":3,"file":"instance-directory.js","sourceRoot":"","sources":["../../src/management/instance-directory.ts"],"names":[],"mappings":"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"}
@@ -8,7 +8,7 @@
8
8
  import type { AccountContextPolicy } from '../auth/account-context';
9
9
  /** Options for instance creation */
10
10
  export interface InstanceOptions {
11
- /** Skip shared symlinks (commands, skills, agents, settings.json) */
11
+ /** Skip shared symlinks (commands, skills, agents, settings.json, CLAUDE.md) */
12
12
  bare?: boolean;
13
13
  }
14
14
  /**
@@ -53,10 +53,7 @@ declare class InstanceManager {
53
53
  * Selectively copies only mcpServers key (not OAuth sessions or caches).
54
54
  */
55
55
  syncMcpServers(instancePath: string): boolean;
56
- /**
57
- * Sanitize profile name for filesystem
58
- */
59
- private sanitizeName;
56
+ private getInstanceStats;
60
57
  }
61
58
  export { InstanceManager };
62
59
  export default InstanceManager;
@@ -1 +1 @@
1
- {"version":3,"file":"instance-manager.d.ts","sourceRoot":"","sources":["../../src/management/instance-manager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAUpE,oCAAoC;AACpC,MAAM,WAAW,eAAe;IAC9B,qEAAqE;IACrE,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,cAAM,eAAe;IACnB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAyB;IACzD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAyB;;IAS1D;;OAEG;IACG,cAAc,CAClB,WAAW,EAAE,MAAM,EACnB,aAAa,GAAE,oBAA6D,EAC5E,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,MAAM,CAAC;IAwClB;;OAEG;IACH,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAK5C;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAmC1B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAuBxB;;OAEG;IACG,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBxD;;OAEG;IACH,aAAa,IAAI,MAAM,EAAE;IAIzB;;OAEG;IACH,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAKzC;;;OAGG;IACH,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO;IA+D7C;;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;AAOH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAgBpE,oCAAoC;AACpC,MAAM,WAAW,eAAe;IAC9B,gFAAgF;IAChF,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,cAAM,eAAe;IACnB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAyB;IACzD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAyB;;IAS1D;;OAEG;IACG,cAAc,CAClB,WAAW,EAAE,MAAM,EACnB,aAAa,GAAE,oBAA6D,EAC5E,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,MAAM,CAAC;IAkDlB;;OAEG;IACH,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAK5C;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAmB1B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAuBxB;;OAEG;IACG,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBxD;;OAEG;IACH,aAAa,IAAI,MAAM,EAAE;IAIzB;;OAEG;IACH,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAKzC;;;OAGG;IACH,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO;IA+D7C,OAAO,CAAC,gBAAgB;CAQzB;AAED,OAAO,EAAE,eAAe,EAAE,CAAC;AAC3B,eAAe,eAAe,CAAC"}
@@ -42,6 +42,7 @@ const account_context_1 = require("../auth/account-context");
42
42
  const config_manager_1 = require("../utils/config-manager");
43
43
  const logging_1 = require("../services/logging");
44
44
  const config_loader_facade_1 = require("../config/config-loader-facade");
45
+ const error_types_1 = require("../errors/error-types");
45
46
  const instance_directory_1 = require("./instance-directory");
46
47
  const logger = (0, logging_1.createLogger)('management:instance-manager');
47
48
  const MANAGED_MCP_SERVER_NAMES = new Set(['ccs-websearch', 'ccs-image-analysis', 'ccs-browser']);
@@ -60,16 +61,26 @@ class InstanceManager {
60
61
  */
61
62
  async ensureInstance(profileName, contextPolicy = { mode: account_context_1.DEFAULT_ACCOUNT_CONTEXT_MODE }, options = {}) {
62
63
  const instancePath = this.getInstancePath(profileName);
64
+ const initialInstanceStats = this.getInstanceStats(instancePath);
65
+ if (initialInstanceStats) {
66
+ (0, instance_directory_1.assertSafeAccountInstancePath)(this.instancesDir, instancePath);
67
+ }
68
+ else {
69
+ (0, instance_directory_1.ensureSafeAccountInstancesDirectory)(this.instancesDir);
70
+ }
63
71
  // Serialize context sync operations per profile across processes.
64
72
  await this.contextSyncLock.withLock(profileName, async () => {
65
73
  // Lazy initialization
66
- if (!fs.existsSync(instancePath)) {
74
+ if (!this.getInstanceStats(instancePath)) {
75
+ (0, instance_directory_1.ensureSafeAccountInstancesDirectory)(this.instancesDir);
67
76
  logger.stage('route', 'instance.init', 'Initializing new profile instance', {
68
77
  profile: profileName,
69
78
  bare: options.bare === true,
70
79
  });
71
80
  this.initializeInstance(profileName, instancePath, options);
72
81
  }
82
+ // Re-check after locking/creation before any operation can mutate the instance.
83
+ (0, instance_directory_1.assertSafeAccountInstancePath)(this.instancesDir, instancePath);
73
84
  // Validate structure (auto-fix missing dirs)
74
85
  this.validateInstance(instancePath);
75
86
  // Apply context policy (isolated by default, optional shared group).
@@ -94,7 +105,7 @@ class InstanceManager {
94
105
  * Get instance path for profile
95
106
  */
96
107
  getInstancePath(profileName) {
97
- const safeName = this.sanitizeName(profileName);
108
+ const safeName = (0, instance_directory_1.normalizeAccountInstanceName)(profileName);
98
109
  return path.join(this.instancesDir, safeName);
99
110
  }
100
111
  /**
@@ -103,27 +114,12 @@ class InstanceManager {
103
114
  initializeInstance(profileName, instancePath, _options = {}) {
104
115
  try {
105
116
  // Create base directory
106
- fs.mkdirSync(instancePath, { recursive: true, mode: 0o700 });
107
- // Create Claude-expected subdirectories (profile-specific only)
108
- const subdirs = [
109
- 'session-env',
110
- 'todos',
111
- 'logs',
112
- 'file-history',
113
- 'shell-snapshots',
114
- 'debug',
115
- '.anthropic',
116
- ];
117
- subdirs.forEach((dir) => {
118
- const dirPath = path.join(instancePath, dir);
119
- if (!fs.existsSync(dirPath)) {
120
- fs.mkdirSync(dirPath, { recursive: true, mode: 0o700 });
121
- }
122
- });
123
- // Shared links are created during ensureInstance() under the plugin layout lock.
117
+ fs.mkdirSync(instancePath, { mode: 0o700 });
118
+ // Expected subdirectories and shared links are created only after the
119
+ // caller validates that this new root stayed inside the managed parent.
124
120
  }
125
121
  catch (error) {
126
- throw new Error(`Failed to initialize instance for ${profileName}: ${error.message}`);
122
+ throw new error_types_1.ProfileError(`Failed to initialize instance for ${profileName}: ${error.message}`, profileName);
127
123
  }
128
124
  }
129
125
  /**
@@ -241,12 +237,15 @@ class InstanceManager {
241
237
  return false;
242
238
  }
243
239
  }
244
- /**
245
- * Sanitize profile name for filesystem
246
- */
247
- sanitizeName(name) {
248
- // Replace unsafe characters with dash
249
- return name.replace(/[^a-zA-Z0-9_-]/g, '-').toLowerCase();
240
+ getInstanceStats(instancePath) {
241
+ try {
242
+ return fs.lstatSync(instancePath);
243
+ }
244
+ catch (error) {
245
+ if (error.code === 'ENOENT')
246
+ return null;
247
+ throw error;
248
+ }
250
249
  }
251
250
  }
252
251
  exports.InstanceManager = InstanceManager;
@@ -1 +1 @@
1
- {"version":3,"file":"instance-manager.js","sourceRoot":"","sources":["../../src/management/instance-manager.ts"],"names":[],"mappings":"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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,6 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="node" />
3
+ export declare function readRegularFileContent(filePath: string): Buffer | null;
4
+ export declare function recoverInterruptedClaims(filePath: string): void;
5
+ export declare function claimCanonicalFirstCopy(filePath: string, canonicalContent: Buffer | null, reason: string): boolean;
6
+ //# sourceMappingURL=canonical-first-file-claims.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonical-first-file-claims.d.ts","sourceRoot":"","sources":["../../../src/management/shared-manager/canonical-first-file-claims.ts"],"names":[],"mappings":";;AAQA,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGtE;AAmED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAa/D;AAED,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,EAChB,gBAAgB,EAAE,MAAM,GAAG,IAAI,EAC/B,MAAM,EAAE,MAAM,GACb,OAAO,CAyBT"}
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.claimCanonicalFirstCopy = exports.recoverInterruptedClaims = exports.readRegularFileContent = void 0;
27
+ const fs = __importStar(require("fs"));
28
+ const path = __importStar(require("path"));
29
+ const ui_1 = require("../../utils/ui");
30
+ const fs_helpers_1 = require("./fs-helpers");
31
+ let claimSequence = 0;
32
+ function readRegularFileContent(filePath) {
33
+ const stats = (0, fs_helpers_1.getLstatSync)(filePath);
34
+ return stats?.isFile() ? fs.readFileSync(filePath) : null;
35
+ }
36
+ exports.readRegularFileContent = readRegularFileContent;
37
+ function preserveClaim(filePath, claimPath, reason) {
38
+ const basePath = `${filePath}.ccs-shared-conflict`;
39
+ let sequence = 0;
40
+ while (true) {
41
+ const recoveryPath = sequence === 0 ? basePath : `${basePath}-${sequence}`;
42
+ try {
43
+ fs.linkSync(claimPath, recoveryPath);
44
+ try {
45
+ fs.unlinkSync(claimPath);
46
+ }
47
+ catch {
48
+ // Both names preserve the same inode, so leaving the claim is safe.
49
+ }
50
+ console.log((0, ui_1.warn)(`${reason}; preserved content at ${recoveryPath}`));
51
+ return recoveryPath;
52
+ }
53
+ catch (err) {
54
+ const code = err.code;
55
+ if (code === 'EEXIST') {
56
+ sequence++;
57
+ continue;
58
+ }
59
+ try {
60
+ fs.copyFileSync(claimPath, recoveryPath, fs.constants.COPYFILE_EXCL);
61
+ fs.chmodSync(recoveryPath, fs.statSync(claimPath).mode & 0o777);
62
+ fs.unlinkSync(claimPath);
63
+ console.log((0, ui_1.warn)(`${reason}; copied content to ${recoveryPath} (${code ?? 'link failed'})`));
64
+ return recoveryPath;
65
+ }
66
+ catch (copyError) {
67
+ if (copyError.code === 'EEXIST') {
68
+ sequence++;
69
+ continue;
70
+ }
71
+ if (!(0, fs_helpers_1.getLstatSync)(filePath)) {
72
+ try {
73
+ fs.renameSync(claimPath, filePath);
74
+ }
75
+ catch {
76
+ // The claim remains the only recoverable copy if restoration loses a race.
77
+ }
78
+ }
79
+ console.log((0, ui_1.warn)(`${reason}; unable to publish recovery, restored original when possible`));
80
+ throw err;
81
+ }
82
+ }
83
+ }
84
+ }
85
+ function interruptedClaimPaths(filePath) {
86
+ const directory = path.dirname(filePath);
87
+ const prefix = `${path.basename(filePath)}.ccs-shared-claim-`;
88
+ try {
89
+ return fs
90
+ .readdirSync(directory)
91
+ .filter((entry) => entry.startsWith(prefix))
92
+ .map((entry) => path.join(directory, entry))
93
+ .filter((entryPath) => fs.lstatSync(entryPath).isFile())
94
+ .sort();
95
+ }
96
+ catch (err) {
97
+ if (err.code === 'ENOENT')
98
+ return [];
99
+ throw err;
100
+ }
101
+ }
102
+ function recoverInterruptedClaims(filePath) {
103
+ const claims = interruptedClaimPaths(filePath);
104
+ if (claims.length === 0)
105
+ return;
106
+ if (claims.length === 1 && !(0, fs_helpers_1.getLstatSync)(filePath)) {
107
+ fs.renameSync(claims[0], filePath);
108
+ console.log((0, ui_1.warn)(`Recovered interrupted shared-file claim at ${filePath}`));
109
+ return;
110
+ }
111
+ for (const claimPath of claims) {
112
+ preserveClaim(filePath, claimPath, `Quarantined interrupted shared-file claim for ${filePath}`);
113
+ }
114
+ }
115
+ exports.recoverInterruptedClaims = recoverInterruptedClaims;
116
+ function claimCanonicalFirstCopy(filePath, canonicalContent, reason) {
117
+ const initialStats = (0, fs_helpers_1.getLstatSync)(filePath);
118
+ if (!initialStats?.isFile())
119
+ return false;
120
+ const claimPath = `${filePath}.ccs-shared-claim-${process.pid}-${Date.now()}-${claimSequence++}`;
121
+ fs.renameSync(filePath, claimPath);
122
+ if ((0, fs_helpers_1.getLstatSync)(filePath)) {
123
+ preserveClaim(filePath, claimPath, `Concurrent replacement detected at ${filePath}`);
124
+ throw Object.assign(new TypeError(`Concurrent replacement detected at ${filePath}`), {
125
+ code: 'EEXIST',
126
+ });
127
+ }
128
+ const claimedContent = fs.readFileSync(claimPath);
129
+ if (canonicalContent?.equals(claimedContent)) {
130
+ fs.unlinkSync(claimPath);
131
+ }
132
+ else {
133
+ preserveClaim(filePath, claimPath, reason);
134
+ }
135
+ if ((0, fs_helpers_1.getLstatSync)(filePath)) {
136
+ throw Object.assign(new TypeError(`Path reappeared during reconciliation: ${filePath}`), {
137
+ code: 'EEXIST',
138
+ });
139
+ }
140
+ return true;
141
+ }
142
+ exports.claimCanonicalFirstCopy = claimCanonicalFirstCopy;
143
+ //# sourceMappingURL=canonical-first-file-claims.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonical-first-file-claims.js","sourceRoot":"","sources":["../../../src/management/shared-manager/canonical-first-file-claims.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ interface CanonicalFirstRoots {
2
+ claudeDir: string;
3
+ sharedDir: string;
4
+ instancesDir: string;
5
+ }
6
+ /**
7
+ * Reconcile a canonical-first shared file before any seed or symlink mutation.
8
+ * Existing canonical content always wins. With no canonical, one unique byte
9
+ * variant is adopted; conflicting variants are all quarantined for recovery.
10
+ */
11
+ export declare function reconcileCanonicalFirstFile(roots: CanonicalFirstRoots, fileName: string): void;
12
+ /** Preserve a later divergent copy without allowing it to replace canonical content. */
13
+ export declare function preserveCanonicalFirstDivergence(divergedPath: string, canonicalPath: string): boolean;
14
+ export {};
15
+ //# sourceMappingURL=canonical-first-file-reconciler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonical-first-file-reconciler.d.ts","sourceRoot":"","sources":["../../../src/management/shared-manager/canonical-first-file-reconciler.ts"],"names":[],"mappings":"AAmBA,UAAU,mBAAmB;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AA6CD;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAiD9F;AAED,wFAAwF;AACxF,wBAAgB,gCAAgC,CAC9C,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,GACpB,OAAO,CAaT"}
@@ -0,0 +1,131 @@
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
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.preserveCanonicalFirstDivergence = exports.reconcileCanonicalFirstFile = void 0;
30
+ const fs = __importStar(require("fs"));
31
+ const path = __importStar(require("path"));
32
+ const ui_1 = require("../../utils/ui");
33
+ const profile_registry_1 = __importDefault(require("../../auth/profile-registry"));
34
+ const shared_resource_policy_1 = require("../../auth/shared-resource-policy");
35
+ const instance_directory_1 = require("../instance-directory");
36
+ const diverged_file_adopter_1 = require("./diverged-file-adopter");
37
+ const fs_helpers_1 = require("./fs-helpers");
38
+ const canonical_first_file_claims_1 = require("./canonical-first-file-claims");
39
+ function candidatePaths(roots, fileName) {
40
+ const profiles = new profile_registry_1.default().getAllProfilesMerged();
41
+ const profilesByInstanceName = new Map();
42
+ for (const [profileName, profile] of Object.entries(profiles)) {
43
+ const instanceName = (0, instance_directory_1.normalizeAccountInstanceName)(profileName);
44
+ const matches = profilesByInstanceName.get(instanceName) ?? [];
45
+ matches.push(profile);
46
+ profilesByInstanceName.set(instanceName, matches);
47
+ }
48
+ return [
49
+ path.join(roots.sharedDir, fileName),
50
+ ...(0, instance_directory_1.listAccountInstancePaths)(roots.instancesDir)
51
+ .filter((instancePath) => {
52
+ const instanceName = (0, instance_directory_1.normalizeAccountInstanceName)(path.basename(instancePath));
53
+ const matches = profilesByInstanceName.get(instanceName) ?? [];
54
+ if (matches.length > 1)
55
+ return false;
56
+ return matches.length === 0 || !(0, shared_resource_policy_1.isProfileLocalSharedResourceMode)(matches[0]);
57
+ })
58
+ .map((instancePath) => path.join(instancePath, fileName)),
59
+ ];
60
+ }
61
+ function reconcileCandidatesAgainstCanonical(canonicalPath, candidates) {
62
+ let canonicalContent = null;
63
+ try {
64
+ canonicalContent = fs.readFileSync(canonicalPath);
65
+ }
66
+ catch {
67
+ // A present but unreadable or dangling canonical path still owns precedence.
68
+ }
69
+ for (const candidatePath of candidates) {
70
+ (0, canonical_first_file_claims_1.claimCanonicalFirstCopy)(candidatePath, canonicalContent, `Canonical ${path.basename(canonicalPath)} wins over divergent copy at ${candidatePath}`);
71
+ }
72
+ }
73
+ /**
74
+ * Reconcile a canonical-first shared file before any seed or symlink mutation.
75
+ * Existing canonical content always wins. With no canonical, one unique byte
76
+ * variant is adopted; conflicting variants are all quarantined for recovery.
77
+ */
78
+ function reconcileCanonicalFirstFile(roots, fileName) {
79
+ const canonicalPath = path.join(roots.claudeDir, fileName);
80
+ const candidates = candidatePaths(roots, fileName);
81
+ for (const candidatePath of candidates) {
82
+ if (candidatePath !== path.join(roots.sharedDir, fileName)) {
83
+ const instancePath = path.dirname(candidatePath);
84
+ if (!(0, instance_directory_1.isSafeAccountInstancePath)(roots.instancesDir, instancePath))
85
+ continue;
86
+ }
87
+ (0, canonical_first_file_claims_1.recoverInterruptedClaims)(candidatePath);
88
+ }
89
+ if ((0, fs_helpers_1.getLstatSync)(canonicalPath)) {
90
+ reconcileCandidatesAgainstCanonical(canonicalPath, candidates);
91
+ return;
92
+ }
93
+ const variants = [];
94
+ for (const candidatePath of candidates) {
95
+ const content = (0, canonical_first_file_claims_1.readRegularFileContent)(candidatePath);
96
+ if (content)
97
+ variants.push({ path: candidatePath, content });
98
+ }
99
+ if (variants.length === 0)
100
+ return;
101
+ const uniqueContents = [];
102
+ for (const variant of variants) {
103
+ if (!uniqueContents.some((content) => content.equals(variant.content))) {
104
+ uniqueContents.push(variant.content);
105
+ }
106
+ }
107
+ if (uniqueContents.length === 1) {
108
+ (0, diverged_file_adopter_1.adoptDivergedFileContent)(variants[0].path, canonicalPath);
109
+ reconcileCandidatesAgainstCanonical(canonicalPath, candidates);
110
+ console.log((0, ui_1.info)(`Adopted the only existing ${fileName} variant as canonical content`));
111
+ return;
112
+ }
113
+ for (const variant of variants) {
114
+ (0, canonical_first_file_claims_1.claimCanonicalFirstCopy)(variant.path, null, `Conflicting ${fileName} variants found while no canonical file exists`);
115
+ }
116
+ console.log((0, ui_1.warn)(`No ${fileName} variant was selected; recover one of the .ccs-shared-conflict files explicitly`));
117
+ }
118
+ exports.reconcileCanonicalFirstFile = reconcileCanonicalFirstFile;
119
+ /** Preserve a later divergent copy without allowing it to replace canonical content. */
120
+ function preserveCanonicalFirstDivergence(divergedPath, canonicalPath) {
121
+ let canonicalContent = null;
122
+ try {
123
+ canonicalContent = fs.readFileSync(canonicalPath);
124
+ }
125
+ catch {
126
+ // Preserve the divergence when canonical cannot be compared safely.
127
+ }
128
+ return (0, canonical_first_file_claims_1.claimCanonicalFirstCopy)(divergedPath, canonicalContent, `Canonical ${path.basename(canonicalPath)} wins over divergent copy at ${divergedPath}`);
129
+ }
130
+ exports.preserveCanonicalFirstDivergence = preserveCanonicalFirstDivergence;
131
+ //# sourceMappingURL=canonical-first-file-reconciler.js.map