@intutic/sync-daemon 2.1.0 → 2.3.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 (288) hide show
  1. package/README.md +1 -1
  2. package/dist/agentReporter.d.ts +24 -11
  3. package/dist/agentReporter.d.ts.map +1 -1
  4. package/dist/agentReporter.js +20 -13
  5. package/dist/agentReporter.js.map +1 -1
  6. package/dist/configReader.d.ts +45 -25
  7. package/dist/configReader.d.ts.map +1 -1
  8. package/dist/configReader.js +70 -46
  9. package/dist/configReader.js.map +1 -1
  10. package/dist/configWriter.d.ts +32 -45
  11. package/dist/configWriter.d.ts.map +1 -1
  12. package/dist/configWriter.js +52 -686
  13. package/dist/configWriter.js.map +1 -1
  14. package/dist/disconnect/harnesses.d.ts +29 -0
  15. package/dist/disconnect/harnesses.d.ts.map +1 -0
  16. package/dist/disconnect/harnesses.js +805 -0
  17. package/dist/disconnect/harnesses.js.map +1 -0
  18. package/dist/disconnect/index.d.ts +25 -0
  19. package/dist/disconnect/index.d.ts.map +1 -0
  20. package/dist/disconnect/index.js +92 -0
  21. package/dist/disconnect/index.js.map +1 -0
  22. package/dist/disconnect/mcp.d.ts +81 -0
  23. package/dist/disconnect/mcp.d.ts.map +1 -0
  24. package/dist/disconnect/mcp.js +354 -0
  25. package/dist/disconnect/mcp.js.map +1 -0
  26. package/dist/disconnect/originals.d.ts +88 -0
  27. package/dist/disconnect/originals.d.ts.map +1 -0
  28. package/dist/disconnect/originals.js +257 -0
  29. package/dist/disconnect/originals.js.map +1 -0
  30. package/dist/disconnect/plan.d.ts +175 -0
  31. package/dist/disconnect/plan.d.ts.map +1 -0
  32. package/dist/disconnect/plan.js +580 -0
  33. package/dist/disconnect/plan.js.map +1 -0
  34. package/dist/disconnect/recognise.d.ts +43 -0
  35. package/dist/disconnect/recognise.d.ts.map +1 -0
  36. package/dist/disconnect/recognise.js +108 -0
  37. package/dist/disconnect/recognise.js.map +1 -0
  38. package/dist/disconnect/tomlLines.d.ts +39 -0
  39. package/dist/disconnect/tomlLines.d.ts.map +1 -0
  40. package/dist/disconnect/tomlLines.js +105 -0
  41. package/dist/disconnect/tomlLines.js.map +1 -0
  42. package/dist/harness/aiderConfigMerger.d.ts +29 -8
  43. package/dist/harness/aiderConfigMerger.d.ts.map +1 -1
  44. package/dist/harness/aiderConfigMerger.js +63 -12
  45. package/dist/harness/aiderConfigMerger.js.map +1 -1
  46. package/dist/harness/antigravityCliHooks.d.ts +61 -0
  47. package/dist/harness/antigravityCliHooks.d.ts.map +1 -0
  48. package/dist/harness/antigravityCliHooks.js +207 -0
  49. package/dist/harness/antigravityCliHooks.js.map +1 -0
  50. package/dist/harness/antigravityHooks.d.ts +12 -2
  51. package/dist/harness/antigravityHooks.d.ts.map +1 -1
  52. package/dist/harness/antigravityHooks.js +38 -16
  53. package/dist/harness/antigravityHooks.js.map +1 -1
  54. package/dist/harness/antigravityProducts.d.ts +40 -0
  55. package/dist/harness/antigravityProducts.d.ts.map +1 -0
  56. package/dist/harness/antigravityProducts.js +109 -0
  57. package/dist/harness/antigravityProducts.js.map +1 -0
  58. package/dist/harness/claudeAgentsMd.d.ts +29 -0
  59. package/dist/harness/claudeAgentsMd.d.ts.map +1 -0
  60. package/dist/harness/claudeAgentsMd.js +80 -0
  61. package/dist/harness/claudeAgentsMd.js.map +1 -0
  62. package/dist/harness/claudeCodeHooks.d.ts +6 -6
  63. package/dist/harness/claudeCodeHooks.d.ts.map +1 -1
  64. package/dist/harness/claudeCodeHooks.js +115 -28
  65. package/dist/harness/claudeCodeHooks.js.map +1 -1
  66. package/dist/harness/claudeProjectApproval.d.ts +53 -0
  67. package/dist/harness/claudeProjectApproval.d.ts.map +1 -0
  68. package/dist/harness/claudeProjectApproval.js +159 -0
  69. package/dist/harness/claudeProjectApproval.js.map +1 -0
  70. package/dist/harness/clineHooks.d.ts +0 -1
  71. package/dist/harness/clineHooks.d.ts.map +1 -1
  72. package/dist/harness/clineHooks.js +13 -4
  73. package/dist/harness/clineHooks.js.map +1 -1
  74. package/dist/harness/codexConfigMerger.d.ts.map +1 -1
  75. package/dist/harness/codexConfigMerger.js +4 -0
  76. package/dist/harness/codexConfigMerger.js.map +1 -1
  77. package/dist/harness/codexHooks.d.ts +2 -0
  78. package/dist/harness/codexHooks.d.ts.map +1 -1
  79. package/dist/harness/codexHooks.js +15 -4
  80. package/dist/harness/codexHooks.js.map +1 -1
  81. package/dist/harness/continueConfigMerger.d.ts.map +1 -1
  82. package/dist/harness/continueConfigMerger.js +4 -0
  83. package/dist/harness/continueConfigMerger.js.map +1 -1
  84. package/dist/harness/cursorHooks.d.ts +5 -2
  85. package/dist/harness/cursorHooks.d.ts.map +1 -1
  86. package/dist/harness/cursorHooks.js +12 -3
  87. package/dist/harness/cursorHooks.js.map +1 -1
  88. package/dist/harness/dshHooks.d.ts +5 -5
  89. package/dist/harness/dshHooks.d.ts.map +1 -1
  90. package/dist/harness/dshHooks.js +12 -5
  91. package/dist/harness/dshHooks.js.map +1 -1
  92. package/dist/harness/gateArtifacts.d.ts +35 -0
  93. package/dist/harness/gateArtifacts.d.ts.map +1 -0
  94. package/dist/harness/gateArtifacts.js +88 -0
  95. package/dist/harness/gateArtifacts.js.map +1 -0
  96. package/dist/harness/gateBody.d.ts +195 -69
  97. package/dist/harness/gateBody.d.ts.map +1 -1
  98. package/dist/harness/gateBody.js +847 -182
  99. package/dist/harness/gateBody.js.map +1 -1
  100. package/dist/harness/gateSightings.d.ts +47 -0
  101. package/dist/harness/gateSightings.d.ts.map +1 -0
  102. package/dist/harness/gateSightings.js +159 -0
  103. package/dist/harness/gateSightings.js.map +1 -0
  104. package/dist/harness/githubCopilotHooks.d.ts.map +1 -1
  105. package/dist/harness/githubCopilotHooks.js +11 -10
  106. package/dist/harness/githubCopilotHooks.js.map +1 -1
  107. package/dist/harness/gooseHardener.d.ts +0 -1
  108. package/dist/harness/gooseHardener.d.ts.map +1 -1
  109. package/dist/harness/gooseHardener.js +1 -1
  110. package/dist/harness/gooseHardener.js.map +1 -1
  111. package/dist/harness/gooseHooks.d.ts +29 -1
  112. package/dist/harness/gooseHooks.d.ts.map +1 -1
  113. package/dist/harness/gooseHooks.js +107 -69
  114. package/dist/harness/gooseHooks.js.map +1 -1
  115. package/dist/harness/grokHooks.d.ts +2 -2
  116. package/dist/harness/grokHooks.d.ts.map +1 -1
  117. package/dist/harness/grokHooks.js +20 -18
  118. package/dist/harness/grokHooks.js.map +1 -1
  119. package/dist/harness/hermesHooks.d.ts +18 -8
  120. package/dist/harness/hermesHooks.d.ts.map +1 -1
  121. package/dist/harness/hermesHooks.js +55 -19
  122. package/dist/harness/hermesHooks.js.map +1 -1
  123. package/dist/harness/holdRedaction.d.ts +4 -1
  124. package/dist/harness/holdRedaction.d.ts.map +1 -1
  125. package/dist/harness/holdRedaction.js +32 -8
  126. package/dist/harness/holdRedaction.js.map +1 -1
  127. package/dist/harness/jetbrainsXmlConfig.d.ts +20 -0
  128. package/dist/harness/jetbrainsXmlConfig.d.ts.map +1 -1
  129. package/dist/harness/jetbrainsXmlConfig.js +39 -18
  130. package/dist/harness/jetbrainsXmlConfig.js.map +1 -1
  131. package/dist/harness/mcpAutoWrite.d.ts +62 -25
  132. package/dist/harness/mcpAutoWrite.d.ts.map +1 -1
  133. package/dist/harness/mcpAutoWrite.js +406 -95
  134. package/dist/harness/mcpAutoWrite.js.map +1 -1
  135. package/dist/harness/museHooks.d.ts +3 -3
  136. package/dist/harness/museHooks.d.ts.map +1 -1
  137. package/dist/harness/museHooks.js +15 -7
  138. package/dist/harness/museHooks.js.map +1 -1
  139. package/dist/harness/n8nHooks.d.ts +0 -1
  140. package/dist/harness/n8nHooks.d.ts.map +1 -1
  141. package/dist/harness/n8nHooks.js +4 -1
  142. package/dist/harness/n8nHooks.js.map +1 -1
  143. package/dist/harness/openCodeHooks.d.ts +2 -2
  144. package/dist/harness/openCodeHooks.d.ts.map +1 -1
  145. package/dist/harness/openCodeHooks.js +9 -8
  146. package/dist/harness/openCodeHooks.js.map +1 -1
  147. package/dist/harness/openWebuiHooks.d.ts +0 -1
  148. package/dist/harness/openWebuiHooks.d.ts.map +1 -1
  149. package/dist/harness/openWebuiHooks.js +11 -3
  150. package/dist/harness/openWebuiHooks.js.map +1 -1
  151. package/dist/harness/openclawHooks.d.ts +75 -18
  152. package/dist/harness/openclawHooks.d.ts.map +1 -1
  153. package/dist/harness/openclawHooks.js +214 -160
  154. package/dist/harness/openclawHooks.js.map +1 -1
  155. package/dist/harness/openhandsHooks.d.ts +37 -11
  156. package/dist/harness/openhandsHooks.d.ts.map +1 -1
  157. package/dist/harness/openhandsHooks.js +148 -97
  158. package/dist/harness/openhandsHooks.js.map +1 -1
  159. package/dist/harness/piHooks.d.ts +52 -17
  160. package/dist/harness/piHooks.d.ts.map +1 -1
  161. package/dist/harness/piHooks.js +177 -163
  162. package/dist/harness/piHooks.js.map +1 -1
  163. package/dist/harness/protectedPaths.d.ts +107 -25
  164. package/dist/harness/protectedPaths.d.ts.map +1 -1
  165. package/dist/harness/protectedPaths.js +342 -48
  166. package/dist/harness/protectedPaths.js.map +1 -1
  167. package/dist/harness/rulesSection.d.ts +62 -0
  168. package/dist/harness/rulesSection.d.ts.map +1 -0
  169. package/dist/harness/rulesSection.js +145 -0
  170. package/dist/harness/rulesSection.js.map +1 -0
  171. package/dist/harness/windsurfHooks.d.ts +18 -3
  172. package/dist/harness/windsurfHooks.d.ts.map +1 -1
  173. package/dist/harness/windsurfHooks.js +41 -8
  174. package/dist/harness/windsurfHooks.js.map +1 -1
  175. package/dist/harness/windsurfJetBrainsProxy.d.ts +1 -1
  176. package/dist/harness/windsurfJetBrainsProxy.d.ts.map +1 -1
  177. package/dist/harness/windsurfJetBrainsProxy.js +5 -1
  178. package/dist/harness/windsurfJetBrainsProxy.js.map +1 -1
  179. package/dist/index.d.ts +21 -20
  180. package/dist/index.d.ts.map +1 -1
  181. package/dist/index.js +19 -19
  182. package/dist/index.js.map +1 -1
  183. package/dist/inventory.d.ts +53 -0
  184. package/dist/inventory.d.ts.map +1 -0
  185. package/dist/inventory.js +133 -0
  186. package/dist/inventory.js.map +1 -0
  187. package/dist/lib/complianceProbes.d.ts +2 -1
  188. package/dist/lib/complianceProbes.d.ts.map +1 -1
  189. package/dist/lib/complianceProbes.js +1 -1
  190. package/dist/lib/complianceProbes.js.map +1 -1
  191. package/dist/lib/decisionsDigest.d.ts +35 -17
  192. package/dist/lib/decisionsDigest.d.ts.map +1 -1
  193. package/dist/lib/decisionsDigest.js +106 -47
  194. package/dist/lib/decisionsDigest.js.map +1 -1
  195. package/dist/lib/egressPolicy.d.ts +2 -2
  196. package/dist/lib/egressPolicy.js +2 -2
  197. package/dist/lib/mcpRegistryPy.d.ts +11 -0
  198. package/dist/lib/mcpRegistryPy.d.ts.map +1 -0
  199. package/dist/lib/mcpRegistryPy.js +173 -0
  200. package/dist/lib/mcpRegistryPy.js.map +1 -0
  201. package/dist/lib/phrasesPy.d.ts +11 -0
  202. package/dist/lib/phrasesPy.d.ts.map +1 -0
  203. package/dist/lib/phrasesPy.js +351 -0
  204. package/dist/lib/phrasesPy.js.map +1 -0
  205. package/dist/lib/policySnapshot.d.ts +63 -9
  206. package/dist/lib/policySnapshot.d.ts.map +1 -1
  207. package/dist/lib/policySnapshot.js +269 -45
  208. package/dist/lib/policySnapshot.js.map +1 -1
  209. package/dist/lib/processPoller.d.ts.map +1 -1
  210. package/dist/lib/processPoller.js +9 -2
  211. package/dist/lib/processPoller.js.map +1 -1
  212. package/dist/lib/regexLinearity.d.ts +43 -0
  213. package/dist/lib/regexLinearity.d.ts.map +1 -0
  214. package/dist/lib/regexLinearity.js +275 -0
  215. package/dist/lib/regexLinearity.js.map +1 -0
  216. package/dist/lib/runtimeEnv.d.ts +1 -3
  217. package/dist/lib/runtimeEnv.d.ts.map +1 -1
  218. package/dist/lib/runtimeEnv.js +0 -2
  219. package/dist/lib/runtimeEnv.js.map +1 -1
  220. package/dist/lib/sequencePy.d.ts +10 -0
  221. package/dist/lib/sequencePy.d.ts.map +1 -0
  222. package/dist/lib/sequencePy.js +102 -0
  223. package/dist/lib/sequencePy.js.map +1 -0
  224. package/dist/sessionReporter.d.ts +18 -12
  225. package/dist/sessionReporter.d.ts.map +1 -1
  226. package/dist/sessionReporter.js +37 -24
  227. package/dist/sessionReporter.js.map +1 -1
  228. package/dist/skillWriter.d.ts +23 -5
  229. package/dist/skillWriter.d.ts.map +1 -1
  230. package/dist/skillWriter.js +159 -16
  231. package/dist/skillWriter.js.map +1 -1
  232. package/dist/syncCycle.d.ts +142 -0
  233. package/dist/syncCycle.d.ts.map +1 -0
  234. package/dist/syncCycle.js +327 -0
  235. package/dist/syncCycle.js.map +1 -0
  236. package/dist/trajectoryMonitor.d.ts +2 -4
  237. package/dist/trajectoryMonitor.d.ts.map +1 -1
  238. package/dist/trajectoryMonitor.js +2 -5
  239. package/dist/trajectoryMonitor.js.map +1 -1
  240. package/dist/watcher/driftWatcher.d.ts +0 -1
  241. package/dist/watcher/driftWatcher.d.ts.map +1 -1
  242. package/dist/watcher/driftWatcher.js +1 -2
  243. package/dist/watcher/driftWatcher.js.map +1 -1
  244. package/dist/watcher/settingsGuard.d.ts +36 -7
  245. package/dist/watcher/settingsGuard.d.ts.map +1 -1
  246. package/dist/watcher/settingsGuard.js +397 -60
  247. package/dist/watcher/settingsGuard.js.map +1 -1
  248. package/dist/watcher/vscodeHookSettings.d.ts +30 -0
  249. package/dist/watcher/vscodeHookSettings.d.ts.map +1 -0
  250. package/dist/watcher/vscodeHookSettings.js +170 -0
  251. package/dist/watcher/vscodeHookSettings.js.map +1 -0
  252. package/dist/wsClient.d.ts +0 -1
  253. package/dist/wsClient.d.ts.map +1 -1
  254. package/dist/wsClient.js +0 -1
  255. package/dist/wsClient.js.map +1 -1
  256. package/package.json +5 -5
  257. package/dist/harness/claudeDesktopHooks.d.ts +0 -30
  258. package/dist/harness/claudeDesktopHooks.d.ts.map +0 -1
  259. package/dist/harness/claudeDesktopHooks.js +0 -254
  260. package/dist/harness/claudeDesktopHooks.js.map +0 -1
  261. package/dist/harness/continueHooks.d.ts +0 -63
  262. package/dist/harness/continueHooks.d.ts.map +0 -1
  263. package/dist/harness/continueHooks.js +0 -247
  264. package/dist/harness/continueHooks.js.map +0 -1
  265. package/dist/harness/gateKind.d.ts +0 -164
  266. package/dist/harness/gateKind.d.ts.map +0 -1
  267. package/dist/harness/gateKind.js +0 -144
  268. package/dist/harness/gateKind.js.map +0 -1
  269. package/dist/harness/rooCodeHooks.d.ts +0 -31
  270. package/dist/harness/rooCodeHooks.d.ts.map +0 -1
  271. package/dist/harness/rooCodeHooks.js +0 -286
  272. package/dist/harness/rooCodeHooks.js.map +0 -1
  273. package/dist/hashReporter.d.ts +0 -33
  274. package/dist/hashReporter.d.ts.map +0 -1
  275. package/dist/hashReporter.js +0 -69
  276. package/dist/hashReporter.js.map +0 -1
  277. package/dist/integrityStore.d.ts +0 -35
  278. package/dist/integrityStore.d.ts.map +0 -1
  279. package/dist/integrityStore.js +0 -71
  280. package/dist/integrityStore.js.map +0 -1
  281. package/dist/lib/gitWorktrees.d.ts +0 -140
  282. package/dist/lib/gitWorktrees.d.ts.map +0 -1
  283. package/dist/lib/gitWorktrees.js +0 -191
  284. package/dist/lib/gitWorktrees.js.map +0 -1
  285. package/dist/syncLoop.d.ts +0 -172
  286. package/dist/syncLoop.d.ts.map +0 -1
  287. package/dist/syncLoop.js +0 -878
  288. package/dist/syncLoop.js.map +0 -1
@@ -0,0 +1,354 @@
1
+ /**
2
+ * mcp.ts — undoes the MCP wrapping `mcpAutoWrite.ts` does in every harness.
3
+ *
4
+ * Three kinds of entry are Intutic's, and only these are touched:
5
+ *
6
+ * - a wrapped server (`__intutic_wrapped: true`), put back as it was: from
7
+ * `__intutic_original`, which holds the whole pre-wrap entry, or, for a
8
+ * stdio server wrapped before that was recorded, from the wrapped entry
9
+ * itself, whose argv carries the original command after `--`;
10
+ * - the `intutic` server added beside them, recognised by its command (node
11
+ * running the governance proxy);
12
+ * - a Claude Code local-scope copy of a project server
13
+ * (`__intutic_shadow_of: 'project'`), deleted, which hands the name back to
14
+ * `.mcp.json`.
15
+ *
16
+ * OpenCode's schema has no room for markers, so its wrapped entries are
17
+ * recognised by command shape and rebuilt from the argv; when the file's
18
+ * original was kept, an entry rebuilt that way is swapped for the original
19
+ * entry, which also carries the keys the wrap did not keep.
20
+ *
21
+ * @module
22
+ */
23
+ import { isDeepStrictEqual } from 'node:util';
24
+ import { isMap } from 'yaml';
25
+ import { PROXY_BIN_PATTERN } from '../harness/mcpAutoWrite.js';
26
+ import { isObject, pruneEmpty } from './plan.js';
27
+ /** The env keys a wrap adds; everything else in a wrapped entry's env was the server's. */
28
+ const WRAP_ENV_KEYS = ['INTUTIC_WORKSPACE_ID', 'INTUTIC_REMOTE_HEADERS'];
29
+ function stripWrapEnv(env) {
30
+ if (!isObject(env))
31
+ return undefined;
32
+ const rest = { ...env };
33
+ for (const key of WRAP_ENV_KEYS)
34
+ delete rest[key];
35
+ return Object.keys(rest).length > 0 ? rest : undefined;
36
+ }
37
+ function stringArray(v) {
38
+ return Array.isArray(v) && v.every((a) => typeof a === 'string') ? v : null;
39
+ }
40
+ /** The pre-wrap shape read back from a wrapped proxy argv (everything after the proxy binary). */
41
+ function fromProxyArgv(argv, env) {
42
+ const sep = argv.indexOf('--');
43
+ if (sep >= 0) {
44
+ const [command, ...args] = argv.slice(sep + 1);
45
+ if (command === undefined)
46
+ return null;
47
+ const out = { command, args };
48
+ const kept = stripWrapEnv(env);
49
+ if (kept)
50
+ out.env = kept;
51
+ return out;
52
+ }
53
+ const urlAt = argv.indexOf('--remote-url');
54
+ if (urlAt >= 0 && typeof argv[urlAt + 1] === 'string') {
55
+ const out = { url: argv[urlAt + 1] };
56
+ const transport = argv[argv.indexOf('--remote-transport') + 1];
57
+ if (transport === 'sse')
58
+ out.type = 'sse';
59
+ if (isObject(env) && typeof env.INTUTIC_REMOTE_HEADERS === 'string') {
60
+ try {
61
+ out.headers = JSON.parse(env.INTUTIC_REMOTE_HEADERS);
62
+ }
63
+ catch {
64
+ // Unreadable headers stay out rather than being guessed at.
65
+ }
66
+ }
67
+ const kept = stripWrapEnv(env);
68
+ if (kept)
69
+ out.env = kept;
70
+ return out;
71
+ }
72
+ return null;
73
+ }
74
+ /** Whether a recorded original still describes what the wrapped entry runs. */
75
+ function originalMatches(original, derived) {
76
+ if (derived === null)
77
+ return true;
78
+ if (typeof derived.command === 'string') {
79
+ return original.command === derived.command && isDeepStrictEqual(original.args ?? [], derived.args);
80
+ }
81
+ return original.url === derived.url;
82
+ }
83
+ /**
84
+ * What a wrapped entry was, or `undefined` when `entry` is not one Intutic
85
+ * wrapped. A recorded original wins unless the user has since changed the
86
+ * command or url inside the wrap, in which case the wrap's own argv is the
87
+ * truth.
88
+ */
89
+ export function unwrapEntry(entry) {
90
+ if (!isObject(entry) || entry.__intutic_wrapped !== true)
91
+ return undefined;
92
+ const argv = stringArray(entry.args);
93
+ const derived = argv && argv.length > 0 && PROXY_BIN_PATTERN.test(argv[0]) ? fromProxyArgv(argv.slice(1), entry.env) : null;
94
+ const original = entry.__intutic_original;
95
+ if (isObject(original) && (typeof original.command === 'string' || typeof original.url === 'string') && originalMatches(original, derived)) {
96
+ return structuredClone(original);
97
+ }
98
+ return derived ?? undefined;
99
+ }
100
+ /** The `intutic` server mcpAutoWrite adds: node running the governance proxy. */
101
+ export function isIntuticServer(entry) {
102
+ if (!isObject(entry))
103
+ return false;
104
+ if (entry.command === 'node') {
105
+ const argv = stringArray(entry.args);
106
+ return argv !== null && argv.length > 0 && PROXY_BIN_PATTERN.test(argv[0]);
107
+ }
108
+ const argv = stringArray(entry.command);
109
+ return argv !== null && argv[0] === 'node' && typeof argv[1] === 'string' && PROXY_BIN_PATTERN.test(argv[1]) && !argv.includes('--server-name');
110
+ }
111
+ /**
112
+ * Unwraps every Intutic entry in one name → entry map, in place. Returns
113
+ * whether anything changed.
114
+ */
115
+ export function unwrapServerMap(map) {
116
+ let changed = false;
117
+ for (const [name, entry] of Object.entries(map)) {
118
+ if (isObject(entry) && entry.__intutic_shadow_of === 'project') {
119
+ delete map[name];
120
+ changed = true;
121
+ }
122
+ else if (name === 'intutic' && isIntuticServer(entry)) {
123
+ delete map[name];
124
+ changed = true;
125
+ }
126
+ else {
127
+ const original = unwrapEntry(entry);
128
+ if (original !== undefined) {
129
+ map[name] = original;
130
+ changed = true;
131
+ }
132
+ }
133
+ }
134
+ return changed;
135
+ }
136
+ /**
137
+ * Unwraps the map at `path` of `doc`, removing it when it is left empty and
138
+ * the original did not have it.
139
+ */
140
+ export function unwrapServersAt(doc, path, original) {
141
+ let parent = doc;
142
+ for (const k of path.slice(0, -1))
143
+ parent = isObject(parent) ? parent[k] : undefined;
144
+ const map = isObject(parent) ? parent[path[path.length - 1]] : undefined;
145
+ if (!isObject(map) || !unwrapServerMap(map))
146
+ return false;
147
+ pruneEmpty(doc, path, original);
148
+ return true;
149
+ }
150
+ /**
151
+ * `~/.claude.json`: the user-scope map and every project's local-scope map.
152
+ * Empty maps stay: Claude Code keeps `mcpServers: {}` in its own entries.
153
+ */
154
+ export function unwrapClaudeState(doc) {
155
+ let changed = false;
156
+ if (isObject(doc.mcpServers))
157
+ changed = unwrapServerMap(doc.mcpServers) || changed;
158
+ if (isObject(doc.projects)) {
159
+ for (const project of Object.values(doc.projects)) {
160
+ if (isObject(project) && isObject(project.mcpServers))
161
+ changed = unwrapServerMap(project.mcpServers) || changed;
162
+ }
163
+ }
164
+ return changed;
165
+ }
166
+ /** Continue's `~/.continue/config.json`, whose `mcpServers` is an array of `{ name, ... }`. */
167
+ export function unwrapContinueServers(doc, original) {
168
+ if (!Array.isArray(doc.mcpServers))
169
+ return false;
170
+ let changed = false;
171
+ const next = [];
172
+ for (const entry of doc.mcpServers) {
173
+ if (!isObject(entry)) {
174
+ next.push(entry);
175
+ continue;
176
+ }
177
+ const { name, ...rest } = entry;
178
+ if (name === 'intutic' && isIntuticServer(rest)) {
179
+ changed = true;
180
+ continue;
181
+ }
182
+ const unwrapped = unwrapEntry(rest);
183
+ if (unwrapped === undefined) {
184
+ next.push(entry);
185
+ }
186
+ else {
187
+ next.push({ name, ...unwrapped });
188
+ changed = true;
189
+ }
190
+ }
191
+ if (!changed)
192
+ return false;
193
+ doc.mcpServers = next;
194
+ pruneEmpty(doc, ['mcpServers'], original);
195
+ return true;
196
+ }
197
+ /** Goose's `config.yaml` `mcp:` block, edited through the YAML document so comments survive. */
198
+ export function unwrapGooseServers(doc, original) {
199
+ if (!isMap(doc.get('mcp')))
200
+ return false;
201
+ const servers = doc.toJS().mcp ?? {};
202
+ let changed = false;
203
+ for (const [name, entry] of Object.entries(servers)) {
204
+ if (name === 'intutic' && isIntuticServer(entry)) {
205
+ doc.deleteIn(['mcp', name]);
206
+ changed = true;
207
+ continue;
208
+ }
209
+ const unwrapped = unwrapEntry(entry);
210
+ if (unwrapped !== undefined) {
211
+ doc.setIn(['mcp', name], unwrapped);
212
+ changed = true;
213
+ }
214
+ }
215
+ const after = doc.get('mcp');
216
+ const originalHadMcp = original !== null && isObject(original.toJS()) && original.toJS().mcp !== undefined;
217
+ if (changed && isMap(after) && after.items.length === 0 && !originalHadMcp)
218
+ doc.delete('mcp');
219
+ return changed;
220
+ }
221
+ // ─── OpenCode ────────────────────────────────────────────────────────────────
222
+ /** An OpenCode entry rebuilt from a wrapped one's argv; undefined when it is not a wrapped one. */
223
+ export function unwrapOpenCodeEntry(entry) {
224
+ if (!isObject(entry))
225
+ return undefined;
226
+ const argv = stringArray(entry.command);
227
+ if (!argv || argv[0] !== 'node' || typeof argv[1] !== 'string' || !PROXY_BIN_PATTERN.test(argv[1]) || !argv.includes('--server-name')) {
228
+ return undefined;
229
+ }
230
+ const derived = fromProxyArgv(argv.slice(2), entry.environment);
231
+ if (derived === null)
232
+ return undefined;
233
+ const rest = { ...entry };
234
+ delete rest.type;
235
+ delete rest.command;
236
+ delete rest.environment;
237
+ if (typeof derived.command === 'string') {
238
+ return {
239
+ type: 'local',
240
+ command: [derived.command, ...(derived.args ?? [])],
241
+ ...(derived.env ? { environment: derived.env } : {}),
242
+ ...rest,
243
+ };
244
+ }
245
+ return {
246
+ type: 'remote',
247
+ url: derived.url,
248
+ ...(derived.headers ? { headers: derived.headers } : {}),
249
+ ...rest,
250
+ };
251
+ }
252
+ /** Whether a rebuilt OpenCode entry and an original one name the same server. */
253
+ function sameOpenCodeServer(a, b) {
254
+ return a.type === b.type && isDeepStrictEqual(a.command, b.command) && a.url === b.url;
255
+ }
256
+ /**
257
+ * OpenCode's `opencode.json` `mcp` block. A rebuilt entry is swapped for the
258
+ * original file's entry of the same name when both name the same server.
259
+ */
260
+ export function unwrapOpenCodeServers(doc, original) {
261
+ const mcp = doc.mcp;
262
+ if (!isObject(mcp))
263
+ return false;
264
+ const originalMcp = original && isObject(original.mcp) ? original.mcp : {};
265
+ let changed = false;
266
+ for (const [name, entry] of Object.entries(mcp)) {
267
+ if (name === 'intutic' && isIntuticServer(entry)) {
268
+ delete mcp[name];
269
+ changed = true;
270
+ continue;
271
+ }
272
+ const rebuilt = unwrapOpenCodeEntry(entry);
273
+ if (rebuilt === undefined)
274
+ continue;
275
+ const was = originalMcp[name];
276
+ mcp[name] = isObject(was) && sameOpenCodeServer(rebuilt, was) ? structuredClone(was) : rebuilt;
277
+ changed = true;
278
+ }
279
+ if (changed)
280
+ pruneEmpty(doc, ['mcp'], original);
281
+ return changed;
282
+ }
283
+ export const geminiRemoteShape = (url, transport) => (transport === 'sse' ? { url, type: 'sse' } : { url });
284
+ export const antigravityRemoteShape = (url) => ({ serverUrl: url });
285
+ /**
286
+ * A Gemini CLI or Antigravity entry rebuilt from a wrapped one, which carries
287
+ * no marker (mcpAutoWrite.ts's `isProxyFronted`); undefined when it is not a
288
+ * wrapped one. The keys the wrap kept (`cwd`, `trust`, `includeTools`, …) stay.
289
+ */
290
+ export function unwrapUnmarkedEntry(entry, remoteShape) {
291
+ if (!isObject(entry) || entry.command !== 'node')
292
+ return undefined;
293
+ const argv = stringArray(entry.args);
294
+ if (!argv || argv.length === 0 || !PROXY_BIN_PATTERN.test(argv[0]) || !argv.includes('--server-name'))
295
+ return undefined;
296
+ const derived = fromProxyArgv(argv.slice(1), entry.env);
297
+ if (derived === null)
298
+ return undefined;
299
+ const rest = { ...entry };
300
+ delete rest.command;
301
+ delete rest.args;
302
+ delete rest.env;
303
+ if (typeof derived.command === 'string') {
304
+ return { command: derived.command, args: derived.args, ...(derived.env ? { env: derived.env } : {}), ...rest };
305
+ }
306
+ return {
307
+ ...remoteShape(derived.url, derived.type === 'sse' ? 'sse' : 'http'),
308
+ ...(derived.headers ? { headers: derived.headers } : {}),
309
+ ...(derived.env ? { env: derived.env } : {}),
310
+ ...rest,
311
+ };
312
+ }
313
+ /** Whether two entries run the same server: the same command line, or the same URL. */
314
+ function sameServer(a, b) {
315
+ if (typeof a.command === 'string')
316
+ return a.command === b.command && isDeepStrictEqual(a.args ?? [], b.args ?? []);
317
+ const url = (e) => e.url ?? e.httpUrl ?? e.serverUrl;
318
+ return url(a) !== undefined && url(a) === url(b);
319
+ }
320
+ /**
321
+ * The `mcpServers` map at `path` of a Gemini CLI or Antigravity file. A
322
+ * rebuilt entry is swapped for the original file's entry of the same name
323
+ * when both run the same server, which also brings back what the rebuild
324
+ * cannot know (Gemini CLI's `httpUrl` spelling, a `type: "http"`).
325
+ */
326
+ export function unwrapUnmarkedServersAt(doc, path, original, remoteShape) {
327
+ let map = doc;
328
+ let was = original;
329
+ for (const k of path) {
330
+ map = isObject(map) ? map[k] : undefined;
331
+ was = isObject(was) ? was[k] : undefined;
332
+ }
333
+ if (!isObject(map))
334
+ return false;
335
+ const originals = isObject(was) ? was : {};
336
+ let changed = false;
337
+ for (const [name, entry] of Object.entries(map)) {
338
+ if (name === 'intutic' && isIntuticServer(entry)) {
339
+ delete map[name];
340
+ changed = true;
341
+ continue;
342
+ }
343
+ const rebuilt = unwrapUnmarkedEntry(entry, remoteShape);
344
+ if (rebuilt === undefined)
345
+ continue;
346
+ const before = originals[name];
347
+ map[name] = isObject(before) && sameServer(rebuilt, before) ? structuredClone(before) : rebuilt;
348
+ changed = true;
349
+ }
350
+ if (changed)
351
+ pruneEmpty(doc, path, original);
352
+ return changed;
353
+ }
354
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/disconnect/mcp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * originals.ts — what a file looked like before Intutic first wrote to it.
3
+ *
4
+ * `intutic disconnect` puts every file `intutic connect` touched back the way
5
+ * it was. For an entry Intutic adds to a file the user owns (a hook
6
+ * registration, a wrapped MCP server) the entry itself says it is Intutic's.
7
+ * But some writes replace what was there: a rules file (`CLAUDE.md`,
8
+ * `AGENTS.md`, ...) is written whole, a proxy base URL overwrites the user's
9
+ * own, a deny list is replaced. Those can only be undone if the original was
10
+ * kept, so every such writer calls {@link keepOriginal} before it writes, and
11
+ * {@link noteWritten} after a write of a file it owns whole.
12
+ *
13
+ * One record per file, under `<root>/.intutic/originals/`, where `<root>` is
14
+ * the workspace for files inside it and the home directory for the rest:
15
+ *
16
+ * - `existed: false` — Intutic created the file (and `createdDirs`, the
17
+ * directories it had to make for it); disconnect deletes them.
18
+ * - `existed: true` — the bytes as they were, in a copy next to the record.
19
+ * - `writtenSha256` — what Intutic last wrote to a file it owns whole. A file
20
+ * that no longer matches was edited since, and disconnect leaves it alone
21
+ * rather than throw the edit away.
22
+ *
23
+ * Only the first record for a path is kept (created with O_EXCL, so two
24
+ * writers racing on one file cannot both claim it): the original is the file
25
+ * before Intutic's FIRST write, not before its latest one. A record per file,
26
+ * rather than one index, is what lets the MCP writers, which run in parallel,
27
+ * record without a lock.
28
+ *
29
+ * Best-effort by design: a failure to record must never stop the write it
30
+ * precedes. The cost is that disconnect then treats the file as one written
31
+ * by an earlier version, which kept no record.
32
+ *
33
+ * @module
34
+ */
35
+ export interface OriginalRecord {
36
+ /** Absolute path of the file this record is for. */
37
+ path: string;
38
+ /** Whether the file existed before Intutic first wrote it. */
39
+ existed: boolean;
40
+ /** Its permission bits then, so a restore keeps them. */
41
+ mode?: number;
42
+ /** Directories Intutic created to hold the file, outermost first. */
43
+ createdDirs?: string[];
44
+ /** SHA-256 of what Intutic last wrote, for files it owns whole. */
45
+ writtenSha256?: string;
46
+ /** Writer-specific detail disconnect needs, e.g. the deny rules Intutic added. */
47
+ meta?: Record<string, unknown>;
48
+ recordedAt: string;
49
+ }
50
+ export declare function sha256(content: string | Buffer): string;
51
+ /** The directory whose `.intutic/originals` holds `filePath`'s record. */
52
+ export declare function ledgerRootFor(filePath: string, workspaceRoot: string): string;
53
+ export declare function ledgerDir(root: string): string;
54
+ /**
55
+ * Keeps `filePath` as it is now, unless an earlier call already did. Call it
56
+ * immediately before Intutic's write.
57
+ */
58
+ export declare function keepOriginal(filePath: string, workspaceRoot: string): Promise<void>;
59
+ /**
60
+ * Notes what Intutic just wrote to a file it owns whole, so disconnect can
61
+ * tell a later edit apart; `meta` is merged into the record's.
62
+ */
63
+ export declare function noteWritten(filePath: string, workspaceRoot: string, content: string | Buffer | null, meta?: Record<string, unknown>): Promise<void>;
64
+ /**
65
+ * Writes a file Intutic owns whole, keeping the original first and noting
66
+ * what was written: the write every rules file, generated hook file and
67
+ * plugin goes through.
68
+ */
69
+ export declare function writeOwnedFile(filePath: string, workspaceRoot: string, content: string, mode?: number): Promise<void>;
70
+ /** The record for `filePath`, with the saved bytes when the file existed. */
71
+ export declare function readOriginal(filePath: string, workspaceRoot: string): Promise<(OriginalRecord & {
72
+ content?: Buffer;
73
+ }) | null>;
74
+ /** Forgets `filePath` once disconnect has dealt with it. */
75
+ export declare function forgetOriginal(filePath: string, workspaceRoot: string): Promise<void>;
76
+ /** Every file recorded under `root`. */
77
+ export declare function recordedFiles(root: string): Promise<OriginalRecord[]>;
78
+ /** Removes `root`'s ledger directory once it holds no record, and `.intutic/` if that leaves it empty. */
79
+ export declare function pruneLedger(root: string): Promise<void>;
80
+ /**
81
+ * Remembers a proxy URL connect wrote into harness configs. Disconnect uses
82
+ * the list to recognise a base-URL setting as Intutic's when no original was
83
+ * kept for it.
84
+ */
85
+ export declare function noteProxyUrl(url: string): Promise<void>;
86
+ export declare function knownProxyUrls(): Promise<string[]>;
87
+ export declare function forgetProxyUrls(): Promise<void>;
88
+ //# sourceMappingURL=originals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"originals.d.ts","sourceRoot":"","sources":["../../src/disconnect/originals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAOH,MAAM,WAAW,cAAc;IAC7B,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAA;IACZ,8DAA8D;IAC9D,OAAO,EAAE,OAAO,CAAA;IAChB,yDAAyD;IACzD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,qEAAqE;IACrE,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB,mEAAmE;IACnE,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,kFAAkF;IAClF,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9B,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAEvD;AAED,0EAA0E;AAC1E,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAG7E;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AAuCD;;;GAGG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgCzF;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,EAC/B,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,OAAO,CAAC,IAAI,CAAC,CAef;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ3H;AAED,6EAA6E;AAC7E,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,CAAC,cAAc,GAAG;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,IAAI,CAAC,CAWzD;AAED,4DAA4D;AAC5D,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAI3F;AAED,wCAAwC;AACxC,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAa3E;AAED,0GAA0G;AAC1G,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAW7D;AAQD;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAW7D;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAOxD;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAErD"}