@tacuchi/agent-workflow-cli 22.4.2 → 24.0.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 (295) hide show
  1. package/README.md +39 -3
  2. package/dist/adapters/git-cli.js +59 -17
  3. package/dist/adapters/git-cli.js.map +1 -1
  4. package/dist/adapters/node-file-system.js +55 -1
  5. package/dist/adapters/node-file-system.js.map +1 -1
  6. package/dist/adapters/postgres-readonly-tools.js +277 -0
  7. package/dist/adapters/postgres-readonly-tools.js.map +1 -0
  8. package/dist/application/artifacts-service.js +2 -2
  9. package/dist/application/artifacts-service.js.map +1 -1
  10. package/dist/application/capability/dispatcher.js +2 -2
  11. package/dist/application/capability/dispatcher.js.map +1 -1
  12. package/dist/application/capability/installed-inventory.js +2 -2
  13. package/dist/application/capability/installed-inventory.js.map +1 -1
  14. package/dist/application/capability/readiness.js +1 -1
  15. package/dist/application/capability/readiness.js.map +1 -1
  16. package/dist/application/check-branch-service.js +2 -2
  17. package/dist/application/check-branch-service.js.map +1 -1
  18. package/dist/application/checkpoint/files-touched.js +271 -0
  19. package/dist/application/checkpoint/files-touched.js.map +1 -0
  20. package/dist/application/checkpoint/markdown.js +61 -8
  21. package/dist/application/checkpoint/markdown.js.map +1 -1
  22. package/dist/application/checkpoint/state-reader.js +8 -2
  23. package/dist/application/checkpoint/state-reader.js.map +1 -1
  24. package/dist/application/checkpoint-write-service.js +16 -5
  25. package/dist/application/checkpoint-write-service.js.map +1 -1
  26. package/dist/application/claims-ledger.js +330 -0
  27. package/dist/application/claims-ledger.js.map +1 -0
  28. package/dist/application/claims-recovery.js +338 -0
  29. package/dist/application/claims-recovery.js.map +1 -0
  30. package/dist/application/database-mcp-server.js +168 -0
  31. package/dist/application/database-mcp-server.js.map +1 -0
  32. package/dist/application/database-mcp-stdio.js +137 -0
  33. package/dist/application/database-mcp-stdio.js.map +1 -0
  34. package/dist/application/database-tool-catalog.js +226 -0
  35. package/dist/application/database-tool-catalog.js.map +1 -0
  36. package/dist/application/dev-only-services.js +154 -44
  37. package/dist/application/dev-only-services.js.map +1 -1
  38. package/dist/application/dsn-reader-service.js +1 -1
  39. package/dist/application/elicitation-server.js +382 -0
  40. package/dist/application/elicitation-server.js.map +1 -0
  41. package/dist/application/elicitation-stdio.js +48 -0
  42. package/dist/application/elicitation-stdio.js.map +1 -0
  43. package/dist/application/flow/advance.js +86 -5
  44. package/dist/application/flow/advance.js.map +1 -1
  45. package/dist/application/flow/checkout-observation.js +152 -0
  46. package/dist/application/flow/checkout-observation.js.map +1 -0
  47. package/dist/application/flow/flow-service.js +72 -13
  48. package/dist/application/flow/flow-service.js.map +1 -1
  49. package/dist/application/flow/internal-actions.js +460 -1
  50. package/dist/application/flow/internal-actions.js.map +1 -1
  51. package/dist/application/flow/internal-drive.js +22 -9
  52. package/dist/application/flow/internal-drive.js.map +1 -1
  53. package/dist/application/flow/prove.js +205 -0
  54. package/dist/application/flow/prove.js.map +1 -0
  55. package/dist/application/flow/run-journey.js +15 -0
  56. package/dist/application/flow/run-journey.js.map +1 -0
  57. package/dist/application/flow/run-projection.js +15 -3
  58. package/dist/application/flow/run-projection.js.map +1 -1
  59. package/dist/application/flow/run-state-service.js +19 -4
  60. package/dist/application/flow/run-state-service.js.map +1 -1
  61. package/dist/application/flow/submit.js +250 -72
  62. package/dist/application/flow/submit.js.map +1 -1
  63. package/dist/application/generate-launch-service.js +4 -4
  64. package/dist/application/generate-launch-service.js.map +1 -1
  65. package/dist/application/git-flow-service.js +9 -0
  66. package/dist/application/git-flow-service.js.map +1 -1
  67. package/dist/application/local-proposal.js +9 -0
  68. package/dist/application/local-proposal.js.map +1 -1
  69. package/dist/application/lock-service.js +96 -28
  70. package/dist/application/lock-service.js.map +1 -1
  71. package/dist/application/logging/log-events.js +19 -3
  72. package/dist/application/logging/log-events.js.map +1 -1
  73. package/dist/application/logging/logger.js +2 -2
  74. package/dist/application/logging/logger.js.map +1 -1
  75. package/dist/application/mcp-connections-service.js +115 -41
  76. package/dist/application/mcp-connections-service.js.map +1 -1
  77. package/dist/application/mcp-doctor-service.js +98 -54
  78. package/dist/application/mcp-doctor-service.js.map +1 -1
  79. package/dist/application/mcp-entry-classification.js +60 -0
  80. package/dist/application/mcp-entry-classification.js.map +1 -0
  81. package/dist/application/mcp-host-reader.js +114 -81
  82. package/dist/application/mcp-host-reader.js.map +1 -1
  83. package/dist/application/mcp-host-receipt-service.js +399 -0
  84. package/dist/application/mcp-host-receipt-service.js.map +1 -0
  85. package/dist/application/mcp-host-receipt-store.js +122 -0
  86. package/dist/application/mcp-host-receipt-store.js.map +1 -0
  87. package/dist/application/mcp-host-receipts.js +28 -0
  88. package/dist/application/mcp-host-receipts.js.map +1 -0
  89. package/dist/application/mcp-host-writer.js +321 -126
  90. package/dist/application/mcp-host-writer.js.map +1 -1
  91. package/dist/application/mcp-launch-probe-service.js +142 -0
  92. package/dist/application/mcp-launch-probe-service.js.map +1 -0
  93. package/dist/application/mcp-migration-service.js +351 -0
  94. package/dist/application/mcp-migration-service.js.map +1 -0
  95. package/dist/application/mcp-native-host-check-service.js +154 -0
  96. package/dist/application/mcp-native-host-check-service.js.map +1 -0
  97. package/dist/application/mcp-receipt-registration-service.js +105 -0
  98. package/dist/application/mcp-receipt-registration-service.js.map +1 -0
  99. package/dist/application/mcp-receipt-removal-service.js +62 -0
  100. package/dist/application/mcp-receipt-removal-service.js.map +1 -0
  101. package/dist/application/mcp-remove-service.js +84 -21
  102. package/dist/application/mcp-remove-service.js.map +1 -1
  103. package/dist/application/mcp-scope-common.js +2 -4
  104. package/dist/application/mcp-scope-common.js.map +1 -1
  105. package/dist/application/mcp-setup-service.js +60 -21
  106. package/dist/application/mcp-setup-service.js.map +1 -1
  107. package/dist/application/mcp-stdio-probe.js +526 -0
  108. package/dist/application/mcp-stdio-probe.js.map +1 -0
  109. package/dist/application/mcp-test-connection-service.js +23 -50
  110. package/dist/application/mcp-test-connection-service.js.map +1 -1
  111. package/dist/application/merge-state-service.js +10 -16
  112. package/dist/application/merge-state-service.js.map +1 -1
  113. package/dist/application/multiroot/claude.js +34 -15
  114. package/dist/application/multiroot/claude.js.map +1 -1
  115. package/dist/application/multiroot/codex.js +9 -5
  116. package/dist/application/multiroot/codex.js.map +1 -1
  117. package/dist/application/multiroot-service.js +20 -11
  118. package/dist/application/multiroot-service.js.map +1 -1
  119. package/dist/application/parsers/project-block.js +25 -2
  120. package/dist/application/parsers/project-block.js.map +1 -1
  121. package/dist/application/paths-service.js +30 -31
  122. package/dist/application/paths-service.js.map +1 -1
  123. package/dist/application/plan-exec-batch-service.js +549 -0
  124. package/dist/application/plan-exec-batch-service.js.map +1 -0
  125. package/dist/application/plan-exec-decision-service.js +273 -0
  126. package/dist/application/plan-exec-decision-service.js.map +1 -0
  127. package/dist/application/project-md-service.js +2 -2
  128. package/dist/application/project-md-service.js.map +1 -1
  129. package/dist/application/project-md-upsert-service.js +4 -4
  130. package/dist/application/project-md-upsert-service.js.map +1 -1
  131. package/dist/application/project-tab-data.js +12 -7
  132. package/dist/application/project-tab-data.js.map +1 -1
  133. package/dist/application/release-data-service.js +2 -2
  134. package/dist/application/release-data-service.js.map +1 -1
  135. package/dist/application/resume-service.js +32 -11
  136. package/dist/application/resume-service.js.map +1 -1
  137. package/dist/application/retirement/apply.js +84 -0
  138. package/dist/application/retirement/apply.js.map +1 -1
  139. package/dist/application/retirement/attribution.js +31 -1
  140. package/dist/application/retirement/attribution.js.map +1 -1
  141. package/dist/application/retirement/graph.js +19 -1
  142. package/dist/application/retirement/graph.js.map +1 -1
  143. package/dist/application/retirement/journal.js +11 -0
  144. package/dist/application/retirement/journal.js.map +1 -1
  145. package/dist/application/retirement/prepare.js +89 -3
  146. package/dist/application/retirement/prepare.js.map +1 -1
  147. package/dist/application/retirement/preview.js +16 -0
  148. package/dist/application/retirement/preview.js.map +1 -1
  149. package/dist/application/retirement/resolve.js +65 -0
  150. package/dist/application/retirement/resolve.js.map +1 -1
  151. package/dist/application/self/host-states.js +2 -0
  152. package/dist/application/self/host-states.js.map +1 -1
  153. package/dist/application/self/install-skill.js +21 -17
  154. package/dist/application/self/install-skill.js.map +1 -1
  155. package/dist/application/self/mcp-config.js +392 -84
  156. package/dist/application/self/mcp-config.js.map +1 -1
  157. package/dist/application/self/mcp-via-state.js +62 -0
  158. package/dist/application/self/mcp-via-state.js.map +1 -0
  159. package/dist/application/self/uninstall.js +15 -5
  160. package/dist/application/self/uninstall.js.map +1 -1
  161. package/dist/application/session-close-service.js +24 -1
  162. package/dist/application/session-close-service.js.map +1 -1
  163. package/dist/application/session-create-service.js +7 -0
  164. package/dist/application/session-create-service.js.map +1 -1
  165. package/dist/application/session-resume-service.js +2 -2
  166. package/dist/application/session-resume-service.js.map +1 -1
  167. package/dist/application/sessions-service.js +2 -4
  168. package/dist/application/sessions-service.js.map +1 -1
  169. package/dist/application/skills-resolver-service.js +4 -4
  170. package/dist/application/skills-resolver-service.js.map +1 -1
  171. package/dist/application/source-boundary-policy.js +18 -7
  172. package/dist/application/source-boundary-policy.js.map +1 -1
  173. package/dist/application/source-remove-service.js +12 -1
  174. package/dist/application/source-remove-service.js.map +1 -1
  175. package/dist/application/sources-service.js +2 -2
  176. package/dist/application/sources-service.js.map +1 -1
  177. package/dist/application/status-service.js +4 -0
  178. package/dist/application/status-service.js.map +1 -1
  179. package/dist/application/visibility-doctor-service.js +1 -1
  180. package/dist/application/visibility-doctor-service.js.map +1 -1
  181. package/dist/application/workline-index-service.js +182 -27
  182. package/dist/application/workline-index-service.js.map +1 -1
  183. package/dist/application/workspace-init-service.js +89 -271
  184. package/dist/application/workspace-init-service.js.map +1 -1
  185. package/dist/application/workspace-materialization-service.js +300 -0
  186. package/dist/application/workspace-materialization-service.js.map +1 -0
  187. package/dist/application/worktree-service.js +32 -3
  188. package/dist/application/worktree-service.js.map +1 -1
  189. package/dist/cli/commands/capability.js +4 -7
  190. package/dist/cli/commands/capability.js.map +1 -1
  191. package/dist/cli/commands/claims.js +72 -0
  192. package/dist/cli/commands/claims.js.map +1 -0
  193. package/dist/cli/commands/dev-only.js +73 -25
  194. package/dist/cli/commands/dev-only.js.map +1 -1
  195. package/dist/cli/commands/flow.js +145 -42
  196. package/dist/cli/commands/flow.js.map +1 -1
  197. package/dist/cli/commands/index.js +4 -0
  198. package/dist/cli/commands/index.js.map +1 -1
  199. package/dist/cli/commands/mcp.js +752 -76
  200. package/dist/cli/commands/mcp.js.map +1 -1
  201. package/dist/cli/commands/multiroot.js +40 -7
  202. package/dist/cli/commands/multiroot.js.map +1 -1
  203. package/dist/cli/commands/resume.js +9 -3
  204. package/dist/cli/commands/resume.js.map +1 -1
  205. package/dist/cli/commands/retirement.js +9 -0
  206. package/dist/cli/commands/retirement.js.map +1 -1
  207. package/dist/cli/commands/session-create.js +1 -1
  208. package/dist/cli/commands/session-create.js.map +1 -1
  209. package/dist/cli/commands/skills.js +1 -1
  210. package/dist/cli/commands/skills.js.map +1 -1
  211. package/dist/cli/commands/status.js +72 -24
  212. package/dist/cli/commands/status.js.map +1 -1
  213. package/dist/cli/commands/tool.js +141 -0
  214. package/dist/cli/commands/tool.js.map +1 -0
  215. package/dist/cli/commands/workspace-init.js +5 -5
  216. package/dist/cli/commands/workspace-init.js.map +1 -1
  217. package/dist/cli/help-groups.js +6 -1
  218. package/dist/cli/help-groups.js.map +1 -1
  219. package/dist/cli/main.js +272 -67
  220. package/dist/cli/main.js.map +1 -1
  221. package/dist/cli/parser.js +8 -1
  222. package/dist/cli/parser.js.map +1 -1
  223. package/dist/cli/registry.js.map +1 -1
  224. package/dist/cli/render.js +15 -2
  225. package/dist/cli/render.js.map +1 -1
  226. package/dist/cli/tui/app.js +3 -2
  227. package/dist/cli/tui/app.js.map +1 -1
  228. package/dist/cli/tui/components/workspace-init-form.js +7 -7
  229. package/dist/cli/tui/components/workspace-init-form.js.map +1 -1
  230. package/dist/cli/tui/data/workflow-content.js +2 -2
  231. package/dist/cli/tui/data/workflow-content.js.map +1 -1
  232. package/dist/cli/tui/tabs/config-tab.js +4 -3
  233. package/dist/cli/tui/tabs/config-tab.js.map +1 -1
  234. package/dist/cli/tui/tabs/mcp-tab-helpers.js +72 -1
  235. package/dist/cli/tui/tabs/mcp-tab-helpers.js.map +1 -1
  236. package/dist/cli/tui/tabs/mcp-tab.js +101 -42
  237. package/dist/cli/tui/tabs/mcp-tab.js.map +1 -1
  238. package/dist/cli/tui/tabs/project-tab.js +18 -21
  239. package/dist/cli/tui/tabs/project-tab.js.map +1 -1
  240. package/dist/cli/tui/workspace-root.js +13 -0
  241. package/dist/cli/tui/workspace-root.js.map +1 -0
  242. package/dist/domain/capability/protocol.js +2 -2
  243. package/dist/domain/capability/protocol.js.map +1 -1
  244. package/dist/domain/database-tools.js +445 -0
  245. package/dist/domain/database-tools.js.map +1 -0
  246. package/dist/domain/degradation-notice.js +60 -0
  247. package/dist/domain/degradation-notice.js.map +1 -0
  248. package/dist/domain/elicitation.js +152 -0
  249. package/dist/domain/elicitation.js.map +1 -0
  250. package/dist/domain/flow/answer.js +173 -42
  251. package/dist/domain/flow/answer.js.map +1 -1
  252. package/dist/domain/flow/authority.js +184 -127
  253. package/dist/domain/flow/authority.js.map +1 -1
  254. package/dist/domain/flow/directive.js +47 -1
  255. package/dist/domain/flow/directive.js.map +1 -1
  256. package/dist/domain/flow/rules.js +7 -4
  257. package/dist/domain/flow/rules.js.map +1 -1
  258. package/dist/domain/flow/run-state.js +636 -31
  259. package/dist/domain/flow/run-state.js.map +1 -1
  260. package/dist/domain/harnesses.js +16 -0
  261. package/dist/domain/harnesses.js.map +1 -1
  262. package/dist/domain/mcp-entry.js +164 -28
  263. package/dist/domain/mcp-entry.js.map +1 -1
  264. package/dist/domain/postgres-object-search.js +320 -0
  265. package/dist/domain/postgres-object-search.js.map +1 -0
  266. package/dist/domain/redaction.js +47 -0
  267. package/dist/domain/redaction.js.map +1 -0
  268. package/dist/domain/retirement/proposal.js +1 -0
  269. package/dist/domain/retirement/proposal.js.map +1 -1
  270. package/dist/domain/structured-choice-stamp.js +32 -4
  271. package/dist/domain/structured-choice-stamp.js.map +1 -1
  272. package/dist/domain/workline-mcp-entry.js +34 -0
  273. package/dist/domain/workline-mcp-entry.js.map +1 -0
  274. package/dist/ports/postgres-tools.js +10 -0
  275. package/dist/ports/postgres-tools.js.map +1 -0
  276. package/dist/runtime/namespace-resolver.js +104 -18
  277. package/dist/runtime/namespace-resolver.js.map +1 -1
  278. package/package.json +5 -1
  279. package/skills/w/README.md +2 -2
  280. package/skills/w/SKILL.md +9 -10
  281. package/skills/w/artifacts/README.md +1 -1
  282. package/skills/w/commands/README.md +3 -3
  283. package/skills/w/commands/persist.md +3 -1
  284. package/skills/w/commands/resume.md +1 -1
  285. package/skills/w/commands/spec-new.md +2 -2
  286. package/skills/w/commands/status.md +1 -1
  287. package/skills/w/commands/workspace-init.md +9 -10
  288. package/skills/w/context/MANIFEST.json +1 -4
  289. package/skills/w/harness/HARNESS.md +1 -1
  290. package/skills/w/loops/quick-loop/LOOP.md +1 -1
  291. package/skills/w/modules/PROMPT-CONTINUITY.md +1 -1
  292. package/skills/w/modules/WORKSPACE-SCAFFOLD.md +17 -20
  293. package/skills/w/schemas/capability-descriptor.schema.json +1 -1
  294. package/dist/application/mcp-dbhub-launcher.js +0 -216
  295. package/dist/application/mcp-dbhub-launcher.js.map +0 -1
@@ -0,0 +1,154 @@
1
+ import { spawnSync as nodeSpawnSync } from "node:child_process";
2
+ import { classifyMcpEntry } from "./mcp-entry-classification.js";
3
+ import { readMcpEntry } from "./mcp-host-reader.js";
4
+ import { digestMcpReceiptDescriptor, } from "./mcp-host-receipt-service.js";
5
+ import { openMcpHostReceiptService } from "./mcp-host-receipts.js";
6
+ const NATIVE_HOSTS = ["claude", "codex"];
7
+ const NATIVE_CHECK_TIMEOUT_MS = 10_000;
8
+ /**
9
+ * Verify that the two hosts with documented native inspection commands can
10
+ * see the configured entry. Their output is deliberately never retained: it
11
+ * could contain host-local diagnostics unrelated to Workline.
12
+ */
13
+ export async function checkNativeMcpHosts(targets, deps = {}) {
14
+ const checks = [];
15
+ const errors = [];
16
+ const seen = new Set();
17
+ for (const target of targets) {
18
+ if (!isNativeHost(target.host))
19
+ continue;
20
+ const key = `${target.host}:${target.instance}`;
21
+ if (seen.has(key))
22
+ continue;
23
+ seen.add(key);
24
+ const check = checkNativeMcpHost(target.host, target.instance, deps);
25
+ checks.push(check);
26
+ if (check.outcome === "passed")
27
+ continue;
28
+ errors.push({
29
+ host: target.host,
30
+ instance: target.instance,
31
+ target: target.target,
32
+ message: nativeCheckMessage(check.code),
33
+ });
34
+ }
35
+ return { checks, errors };
36
+ }
37
+ /**
38
+ * Best-effort persistence for native inspection failures. It rereads the exact
39
+ * descriptor and fences the update with its digest, so a stale check can never
40
+ * mark a replacement host configuration as failed. Passing checks clear only
41
+ * prior native-failure evidence; they do not claim host load or launchability.
42
+ */
43
+ export async function recordNativeMcpHostChecks(input) {
44
+ const receipts = openMcpHostReceiptService(input.paths);
45
+ const targets = firstTargetsByIdentity(input.targets);
46
+ for (const check of input.checks) {
47
+ const target = targets.get(nativeCheckKey(check.host, check.instance));
48
+ if (target === undefined)
49
+ continue;
50
+ await recordNativeMcpHostCheck(receipts, input.scopeDir, input.scope, target, check);
51
+ }
52
+ }
53
+ function firstTargetsByIdentity(targets) {
54
+ const byIdentity = new Map();
55
+ for (const target of targets) {
56
+ const key = nativeCheckKey(target.host, target.instance);
57
+ if (!byIdentity.has(key))
58
+ byIdentity.set(key, target);
59
+ }
60
+ return byIdentity;
61
+ }
62
+ function nativeCheckKey(host, instance) {
63
+ return `${host}:${instance}`;
64
+ }
65
+ async function recordNativeMcpHostCheck(receipts, scopeDir, scope, target, check) {
66
+ try {
67
+ const snapshot = readMcpEntry(target.host, scopeDir, target.instance, scope);
68
+ if (!isCurrentNativeCheckDescriptor(target, snapshot))
69
+ return;
70
+ const descriptorDigest = digestMcpReceiptDescriptor({
71
+ command: snapshot.command,
72
+ args: snapshot.args,
73
+ });
74
+ const identity = { host: target.host, scope, connection: target.instance };
75
+ const receipt = await receipts.find(identity);
76
+ if (receipt?.descriptor_digest !== descriptorDigest)
77
+ return;
78
+ await receipts.recordNativeHostCheck({
79
+ ...identity,
80
+ descriptorDigest,
81
+ outcome: check.outcome,
82
+ ...(check.code === undefined ? {} : { code: check.code }),
83
+ });
84
+ }
85
+ catch {
86
+ // Config/probe output stays truthful if a receipt update races or fails.
87
+ // Native output and descriptor material must never enter an error report.
88
+ }
89
+ }
90
+ function isCurrentNativeCheckDescriptor(target, snapshot) {
91
+ if (target.entry === undefined || snapshot.command === undefined || snapshot.args === undefined) {
92
+ return false;
93
+ }
94
+ return (classifyMcpEntry(target.host, snapshot, target.entry, {
95
+ name: target.instance,
96
+ dsnVar: "",
97
+ }).state === "current");
98
+ }
99
+ function checkNativeMcpHost(host, instance, deps) {
100
+ const spawnSync = deps.spawnSync ?? defaultSpawnSync;
101
+ let result;
102
+ try {
103
+ result = spawnSync(host, ["mcp", "list"], {
104
+ env: deps.environment ?? process.env,
105
+ encoding: "buffer",
106
+ shell: false,
107
+ stdio: ["ignore", "pipe", "pipe"],
108
+ timeout: NATIVE_CHECK_TIMEOUT_MS,
109
+ windowsHide: true,
110
+ });
111
+ }
112
+ catch {
113
+ return { host, instance, outcome: "failed", code: "HOST_NATIVE_CHECK_FAILED" };
114
+ }
115
+ if (readErrorCode(result.error) === "ENOENT") {
116
+ return { host, instance, outcome: "failed", code: "HOST_BINARY_MISSING" };
117
+ }
118
+ if (result.error !== undefined || result.status !== 0) {
119
+ return { host, instance, outcome: "failed", code: "HOST_NATIVE_CHECK_FAILED" };
120
+ }
121
+ const stdout = result.stdout?.toString("utf8") ?? "";
122
+ return hasDelimitedInstance(stdout, instance)
123
+ ? { host, instance, outcome: "passed" }
124
+ : { host, instance, outcome: "failed", code: "HOST_ENTRY_NOT_VISIBLE" };
125
+ }
126
+ function hasDelimitedInstance(output, instance) {
127
+ // Native CLIs do not share a machine-readable list format. Fail closed on
128
+ // the server-name token itself: qtc-cert-old must not prove qtc-cert loaded.
129
+ const escaped = instance.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
130
+ return new RegExp(`(?:^|[\\s|,:=\\[\\]"'])${escaped}(?=$|[\\s|,:=\\[\\]"'])`, "m").test(output);
131
+ }
132
+ function defaultSpawnSync(command, args, options) {
133
+ return nodeSpawnSync(command, args, options);
134
+ }
135
+ function isNativeHost(host) {
136
+ return NATIVE_HOSTS.includes(host);
137
+ }
138
+ function readErrorCode(error) {
139
+ if (error === null || typeof error !== "object")
140
+ return undefined;
141
+ const code = error.code;
142
+ return typeof code === "string" ? code : undefined;
143
+ }
144
+ function nativeCheckMessage(code) {
145
+ switch (code) {
146
+ case "HOST_BINARY_MISSING":
147
+ return "No se encontró el binario nativo del host para verificar su configuración MCP.";
148
+ case "HOST_ENTRY_NOT_VISIBLE":
149
+ return "El comando nativo del host no mostró la entrada MCP recién configurada.";
150
+ default:
151
+ return "El comando nativo del host no pudo verificar la configuración MCP.";
152
+ }
153
+ }
154
+ //# sourceMappingURL=mcp-native-host-check-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-native-host-check-service.js","sourceRoot":"","sources":["../../src/application/mcp-native-host-check-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,105 @@
1
+ import { buildMcpEntry } from "../domain/mcp-entry.js";
2
+ import { readPackageVersion } from "../runtime/version.js";
3
+ import { classifyMcpEntry } from "./mcp-entry-classification.js";
4
+ import { readMcpEntry } from "./mcp-host-reader.js";
5
+ import { digestMcpReceiptDescriptor } from "./mcp-host-receipt-service.js";
6
+ import { openMcpHostReceiptService } from "./mcp-host-receipts.js";
7
+ /**
8
+ * Projects successful host config mutations into revocable, secret-free
9
+ * receipts. Previews and idempotent writes deliberately leave prior state
10
+ * untouched: neither is evidence of a new descriptor needing reload.
11
+ */
12
+ export async function registerMcpSetupReceipts(paths, input, result) {
13
+ const buckets = { registered: [], probeTargets: [], errors: [] };
14
+ // Workspace descriptors intentionally remain PATH-dependent and portable.
15
+ // The receipt contract is reliable user-scope/TUI evidence only, avoiding a
16
+ // user-global receipt identity being shared by separate workspaces.
17
+ if (result.dry_run || input.scope !== "global")
18
+ return buckets;
19
+ const receipts = openMcpHostReceiptService(paths);
20
+ const worklineVersion = readPackageVersion();
21
+ for (const write of [...result.applied, ...result.skipped]) {
22
+ await registerSetupWrite(receipts, input, result, write, worklineVersion, buckets);
23
+ }
24
+ return buckets;
25
+ }
26
+ async function registerSetupWrite(receipts, input, result, write, worklineVersion, buckets) {
27
+ if (!isEligibleReceiptWrite(write))
28
+ return;
29
+ const connection = input.connections.find((candidate) => candidate.name === write.name);
30
+ if (connection === undefined)
31
+ return;
32
+ try {
33
+ const persisted = readPersistedReceiptDescriptor(input, result, write, connection);
34
+ if (persisted === undefined)
35
+ return addReceiptReadbackError(buckets, write, connection.name);
36
+ const existing = await receipts.find({
37
+ host: write.host,
38
+ scope: input.scope,
39
+ connection: connection.name,
40
+ });
41
+ if (shouldKeepExistingReceipt(write.action, existing, persisted.descriptor))
42
+ return;
43
+ const receipt = await receipts.register({
44
+ host: write.host,
45
+ scope: input.scope,
46
+ connection: connection.name,
47
+ worklineVersion,
48
+ descriptor: persisted.descriptor,
49
+ });
50
+ buckets.registered.push({
51
+ host: write.host,
52
+ instance: connection.name,
53
+ descriptor_digest: receipt.descriptor_digest,
54
+ reload_required: true,
55
+ });
56
+ buckets.probeTargets.push({
57
+ host: write.host,
58
+ instance: connection.name,
59
+ target: write.target,
60
+ entry: persisted.entry,
61
+ });
62
+ }
63
+ catch {
64
+ buckets.errors.push({
65
+ host: write.host,
66
+ instance: connection.name,
67
+ target: write.target,
68
+ message: "No se pudo registrar el recibo MCP; la configuración requiere revisión manual.",
69
+ });
70
+ }
71
+ }
72
+ function isEligibleReceiptWrite(write) {
73
+ return ((write.action === "written" || write.action === "skipped-idempotent") &&
74
+ write.partial === undefined);
75
+ }
76
+ function readPersistedReceiptDescriptor(input, result, write, connection) {
77
+ const entry = entryFor(input, write.host, connection.name, connection.dsnVar);
78
+ const snapshot = readMcpEntry(write.host, result.scope_dir, entry.name, input.scope);
79
+ if (classifyMcpEntry(write.host, snapshot, entry, connection).state !== "current" ||
80
+ snapshot.command === undefined ||
81
+ snapshot.args === undefined) {
82
+ return undefined;
83
+ }
84
+ return { entry, descriptor: { command: snapshot.command, args: snapshot.args } };
85
+ }
86
+ function addReceiptReadbackError(buckets, write, instance) {
87
+ buckets.errors.push({
88
+ host: write.host,
89
+ instance,
90
+ target: write.target,
91
+ message: "La entrada MCP cambió antes de registrar el recibo; no se registró evidencia ni se debe recargar el host.",
92
+ });
93
+ }
94
+ function shouldKeepExistingReceipt(action, existing, descriptor) {
95
+ return (action === "skipped-idempotent" &&
96
+ existing?.descriptor_digest === digestMcpReceiptDescriptor(descriptor));
97
+ }
98
+ function entryFor(input, host, name, dsnVar) {
99
+ return buildMcpEntry(name, dsnVar, {
100
+ host,
101
+ scope: input.scope,
102
+ ...(input.namespace === undefined ? {} : { namespace: input.namespace }),
103
+ });
104
+ }
105
+ //# sourceMappingURL=mcp-receipt-registration-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-receipt-registration-service.js","sourceRoot":"","sources":["../../src/application/mcp-receipt-registration-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ import { buildMcpEntry } from "../domain/mcp-entry.js";
2
+ import { classifyMcpEntry } from "./mcp-entry-classification.js";
3
+ import { readMcpEntry } from "./mcp-host-reader.js";
4
+ import { removePersistedMcpReceipt } from "./mcp-host-receipts.js";
5
+ /** Keeps descriptor retirement symmetric with registration without touching previews. */
6
+ export async function removeMcpRemoveReceipts(paths, input, result) {
7
+ if (result.dry_run || input.scope !== "global")
8
+ return [];
9
+ const errors = [];
10
+ for (const write of [...result.removed, ...result.skipped]) {
11
+ await removeReceiptForWrite(paths, input, result, write, errors);
12
+ }
13
+ return errors;
14
+ }
15
+ async function removeReceiptForWrite(paths, input, result, write, errors) {
16
+ if (!isEligibleReceiptRemoval(write))
17
+ return;
18
+ const connection = input.connections.find((candidate) => candidate.name === write.name);
19
+ if (connection === undefined)
20
+ return;
21
+ try {
22
+ if (!isRemovedDescriptor(input, result, write, connection)) {
23
+ addReappearedDescriptorError(errors, write, connection.name);
24
+ return;
25
+ }
26
+ await removePersistedMcpReceipt(paths, {
27
+ host: write.host,
28
+ scope: input.scope,
29
+ connection: connection.name,
30
+ });
31
+ }
32
+ catch {
33
+ errors.push({
34
+ host: write.host,
35
+ instance: connection.name,
36
+ target: write.target,
37
+ message: "La entrada MCP se retiró, pero no se pudo retirar su recibo operativo.",
38
+ });
39
+ }
40
+ }
41
+ function isEligibleReceiptRemoval(write) {
42
+ return ((write.action === "removed" || write.action === "skipped-idempotent") &&
43
+ write.partial === undefined);
44
+ }
45
+ function isRemovedDescriptor(input, result, write, connection) {
46
+ const entry = buildMcpEntry(connection.name, connection.dsnVar, {
47
+ host: write.host,
48
+ scope: input.scope,
49
+ ...(input.namespace === undefined ? {} : { namespace: input.namespace }),
50
+ });
51
+ const snapshot = readMcpEntry(write.host, result.scope_dir, entry.name, input.scope);
52
+ return classifyMcpEntry(write.host, snapshot, entry, connection).state === "missing";
53
+ }
54
+ function addReappearedDescriptorError(errors, write, instance) {
55
+ errors.push({
56
+ host: write.host,
57
+ instance,
58
+ target: write.target,
59
+ message: "La entrada MCP reapareció antes de retirar el recibo; se conserva la evidencia operativa.",
60
+ });
61
+ }
62
+ //# sourceMappingURL=mcp-receipt-removal-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-receipt-removal-service.js","sourceRoot":"","sources":["../../src/application/mcp-receipt-removal-service.ts"],"names":[],"mappings":"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"}
@@ -1,42 +1,105 @@
1
1
  import { buildMcpEntry, } from "../domain/mcp-entry.js";
2
+ import { classifyMcpEntry } from "./mcp-entry-classification.js";
3
+ import { readMcpEntry } from "./mcp-host-reader.js";
2
4
  import { removeMcpEntry } from "./mcp-host-writer.js";
3
5
  import { buildGlobalRefusal, resolveScopeDir, toErrorRecord, } from "./mcp-scope-common.js";
4
6
  export function runMcpRemove(env, input) {
5
- if (input.scope === "global" && !input.force && !input.dryRun) {
7
+ if (input.scope === "global" && input.globalApproval === undefined && !input.dryRun) {
6
8
  return buildGlobalRefusal(input.hosts);
7
9
  }
8
10
  const scopeDir = resolveScopeDir(env, input);
9
11
  const opts = {
10
12
  dryRun: input.dryRun ?? false,
11
- force: input.force ?? false,
12
13
  };
13
- const removed = [];
14
- const skipped = [];
15
- const errors = [];
14
+ const buckets = { removed: [], skipped: [], conflicts: [], errors: [] };
16
15
  for (const host of input.hosts) {
17
16
  for (const connection of input.connections) {
18
- const entry = buildMcpEntry(connection.name, connection.dsnVar);
19
- try {
20
- const result = removeMcpEntry(host, entry, { scopeDir, kind: input.scope }, opts);
21
- if (result.action === "skipped-idempotent") {
22
- skipped.push(result);
23
- }
24
- else {
25
- removed.push(result);
26
- }
27
- }
28
- catch (err) {
29
- errors.push(toErrorRecord(host, connection.name, scopeDir, err));
30
- }
17
+ removeEntry(host, connection, input, scopeDir, opts, buckets);
31
18
  }
32
19
  }
20
+ const reloadRequired = reloadRequirements(buckets.removed, input.connections);
33
21
  return {
34
22
  scope: input.scope,
35
23
  scope_dir: scopeDir,
36
24
  dry_run: Boolean(input.dryRun),
37
- removed,
38
- skipped,
39
- errors,
25
+ ...buckets,
26
+ ...(reloadRequired.length === 0 ? {} : { reload_required: reloadRequired }),
40
27
  };
41
28
  }
29
+ function removeEntry(host, connection, input, scopeDir, opts, buckets) {
30
+ const entry = removeEntryDescriptor(host, connection, input);
31
+ try {
32
+ const result = removeMcpEntry(host, entry, { scopeDir, kind: input.scope }, removalOptions(host, entry, connection, scopeDir, input.scope, opts));
33
+ addRemoveWrite(result, buckets);
34
+ reportRemovePartial(result, host, connection, buckets.errors);
35
+ }
36
+ catch (err) {
37
+ buckets.errors.push(toErrorRecord(host, connection.name, scopeDir, err));
38
+ }
39
+ }
40
+ /**
41
+ * Retiring a published descriptor is safe only after its full stored shape was
42
+ * classified as Workline-owned. The writer repeats the exact comparison when
43
+ * it writes, so an external change between this read and the mutation remains
44
+ * a conflict instead of becoming an overwrite.
45
+ */
46
+ function removalOptions(host, entry, connection, scopeDir, scope, opts) {
47
+ const snapshot = readMcpEntry(host, scopeDir, entry.name, scope);
48
+ const classification = classifyMcpEntry(host, snapshot, entry, connection);
49
+ if (classification.state !== "known-legacy" || classification.legacy === undefined)
50
+ return opts;
51
+ return { ...opts, replaceLegacy: classification.legacy };
52
+ }
53
+ function removeEntryDescriptor(host, connection, input) {
54
+ return buildMcpEntry(connection.name, connection.dsnVar, {
55
+ host,
56
+ scope: input.scope,
57
+ ...(input.namespace === undefined ? {} : { namespace: input.namespace }),
58
+ });
59
+ }
60
+ function addRemoveWrite(result, buckets) {
61
+ if (result.action === "conflict")
62
+ buckets.conflicts.push(result);
63
+ else if (result.action === "skipped-idempotent")
64
+ buckets.skipped.push(result);
65
+ else
66
+ buckets.removed.push(result);
67
+ }
68
+ function reportRemovePartial(result, host, connection, errors) {
69
+ if (result.partial === undefined)
70
+ return;
71
+ errors.push({
72
+ host,
73
+ instance: connection.name,
74
+ target: result.partial.target,
75
+ message: result.partial.message,
76
+ });
77
+ }
78
+ function reloadRequirements(writes, connections) {
79
+ return writes.flatMap((write) => {
80
+ if (write.action !== "removed" || write.partial !== undefined)
81
+ return [];
82
+ const connection = connections.find((candidate) => candidate.name === write.name);
83
+ if (connection === undefined)
84
+ return [];
85
+ return [
86
+ {
87
+ host: write.host,
88
+ instance: connection.name,
89
+ reload_required: true,
90
+ next_step: reloadInstruction(write.host),
91
+ },
92
+ ];
93
+ });
94
+ }
95
+ function reloadInstruction(host) {
96
+ switch (host) {
97
+ case "claude":
98
+ return "Abrí /mcp y elegí Reconnect, o iniciá una sesión nueva.";
99
+ case "codex":
100
+ return "Abrí /mcp y elegí Restart.";
101
+ default:
102
+ return "Recargá o reiniciá el host para retirar la tool de la sesión actual.";
103
+ }
104
+ }
42
105
  //# sourceMappingURL=mcp-remove-service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-remove-service.js","sourceRoot":"","sources":["../../src/application/mcp-remove-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,aAAa,GACd,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAGL,kBAAkB,EAClB,eAAe,EACf,aAAa,GACd,MAAM,uBAAuB,CAAC;AAoB/B,MAAM,UAAU,YAAY,CAC1B,GAAY,EACZ,KAAqB;IAErB,IAAI,KAAK,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAC9D,OAAO,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAiB;QACzB,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,KAAK;QAC7B,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,KAAK;KAC5B,CAAC;IAEF,MAAM,OAAO,GAAqB,EAAE,CAAC;IACrC,MAAM,OAAO,GAAqB,EAAE,CAAC;IACrC,MAAM,MAAM,GAAqB,EAAE,CAAC;IAEpC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/B,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YAC3C,MAAM,KAAK,GAAa,aAAa,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;YAC1E,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC;gBAClF,IAAI,MAAM,CAAC,MAAM,KAAK,oBAAoB,EAAE,CAAC;oBAC3C,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACvB,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACvB,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,SAAS,EAAE,QAAQ;QACnB,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;QAC9B,OAAO;QACP,OAAO;QACP,MAAM;KACP,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"mcp-remove-service.js","sourceRoot":"","sources":["../../src/application/mcp-remove-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,aAAa,GACd,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAIL,kBAAkB,EAClB,eAAe,EACf,aAAa,GACd,MAAM,uBAAuB,CAAC;AAyC/B,MAAM,UAAU,YAAY,CAC1B,GAAY,EACZ,KAAqB;IAErB,IAAI,KAAK,CAAC,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,cAAc,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QACpF,OAAO,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAiB;QACzB,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,KAAK;KAC9B,CAAC;IAEF,MAAM,OAAO,GAAkB,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAEvF,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/B,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YAC3C,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED,MAAM,cAAc,GAAG,kBAAkB,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;IAE9E,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,SAAS,EAAE,QAAQ;QACnB,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;QAC9B,GAAG,OAAO;QACV,GAAG,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,cAAc,EAAE,CAAC;KAC5E,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAClB,IAAa,EACb,UAA4B,EAC5B,KAAqB,EACrB,QAAgB,EAChB,IAAkB,EAClB,OAAsB;IAEtB,MAAM,KAAK,GAAG,qBAAqB,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;IAC7D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,cAAc,CAC3B,IAAI,EACJ,KAAK,EACL,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,EAC/B,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CACrE,CAAC;QACF,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChC,mBAAmB,CAAC,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAChE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;IAC3E,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,cAAc,CACrB,IAAa,EACb,KAAe,EACf,UAA4B,EAC5B,QAAgB,EAChB,KAA8B,EAC9B,IAAkB;IAElB,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACjE,MAAM,cAAc,GAAG,gBAAgB,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IAC3E,IAAI,cAAc,CAAC,KAAK,KAAK,cAAc,IAAI,cAAc,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAChG,OAAO,EAAE,GAAG,IAAI,EAAE,aAAa,EAAE,cAAc,CAAC,MAAM,EAAE,CAAC;AAC3D,CAAC;AAED,SAAS,qBAAqB,CAC5B,IAAa,EACb,UAA4B,EAC5B,KAAqB;IAErB,OAAO,aAAa,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,MAAM,EAAE;QACvD,IAAI;QACJ,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,GAAG,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC;KACzE,CAAC,CAAC;AACL,CAAC;AAED,SAAS,cAAc,CAAC,MAAsB,EAAE,OAAsB;IACpE,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU;QAAE,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SAC5D,IAAI,MAAM,CAAC,MAAM,KAAK,oBAAoB;QAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;;QACzE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,mBAAmB,CAC1B,MAAsB,EACtB,IAAa,EACb,UAA4B,EAC5B,MAAwB;IAExB,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS;QAAE,OAAO;IACzC,MAAM,CAAC,IAAI,CAAC;QACV,IAAI;QACJ,QAAQ,EAAE,UAAU,CAAC,IAAI;QACzB,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM;QAC7B,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO;KAChC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,kBAAkB,CACzB,MAAiC,EACjC,WAAwC;IAExC,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QAC9B,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS;YAAE,OAAO,EAAE,CAAC;QACzE,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC;QAClF,IAAI,UAAU,KAAK,SAAS;YAAE,OAAO,EAAE,CAAC;QACxC,OAAO;YACL;gBACE,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,QAAQ,EAAE,UAAU,CAAC,IAAI;gBACzB,eAAe,EAAE,IAAa;gBAC9B,SAAS,EAAE,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC;aACzC;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAa;IACtC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,QAAQ;YACX,OAAO,yDAAyD,CAAC;QACnE,KAAK,OAAO;YACV,OAAO,4BAA4B,CAAC;QACtC;YACE,OAAO,sEAAsE,CAAC;IAClF,CAAC;AACH,CAAC"}
@@ -6,9 +6,7 @@ export function resolveScopeDir(env, input) {
6
6
  // inject a sandbox home instead of writing the developer's real configs.
7
7
  if (input.scope === "global")
8
8
  return env.homeDir();
9
- if (input.workspace)
10
- return resolve(input.workspace);
11
- return resolve(env.cwd());
9
+ return resolve(input.workspace);
12
10
  }
13
11
  export function buildGlobalHint(hosts) {
14
12
  const paths = HARNESSES.filter((h) => hosts.includes(h.mcpHostId))
@@ -31,7 +29,7 @@ export function toErrorRecord(host, instance, scopeDir, err) {
31
29
  host,
32
30
  instance,
33
31
  target: err.target,
34
- message: `${err.message}${err.cause ? ` (${err.cause})` : ""}`,
32
+ message: err.message,
35
33
  };
36
34
  }
37
35
  return { host, instance, target: scopeDir, message: err.message };
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-scope-common.js","sourceRoot":"","sources":["../../src/application/mcp-scope-common.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAG5E,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAqBtD,MAAM,UAAU,eAAe,CAAC,GAAY,EAAE,KAAoB;IAChE,yEAAyE;IACzE,yEAAyE;IACzE,IAAI,KAAK,CAAC,KAAK,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC,OAAO,EAAE,CAAC;IACnD,IAAI,KAAK,CAAC,SAAS;QAAE,OAAO,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACrD,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAgB;IAC9C,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAoB,CAAC,CAAC;SAC1E,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC;SACtC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,6BAA6B,CAAC;IAClF,OAAO,SAAS,KAAK,wFAAwF,CAAC;AAChH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAgB;IACjD,OAAO;QACL,EAAE,EAAE,KAAK;QACT,KAAK,EAAE,uBAAuB;QAC9B,IAAI,EAAE,eAAe,CAAC,KAAK,CAAC;QAC5B,QAAQ,EAAE,CAAC;KACZ,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,IAAa,EACb,QAAqB,EACrB,QAAgB,EAChB,GAAY;IAEZ,IAAI,GAAG,YAAY,cAAc,EAAE,CAAC;QAClC,OAAO;YACL,IAAI;YACJ,QAAQ;YACR,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,OAAO,EAAE,GAAG,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;SAC/D,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC;AAC/E,CAAC"}
1
+ {"version":3,"file":"mcp-scope-common.js","sourceRoot":"","sources":["../../src/application/mcp-scope-common.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAG5E,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AA0BtD,MAAM,UAAU,eAAe,CAAC,GAAY,EAAE,KAAoB;IAChE,yEAAyE;IACzE,yEAAyE;IACzE,IAAI,KAAK,CAAC,KAAK,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC,OAAO,EAAE,CAAC;IACnD,OAAO,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAgB;IAC9C,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAoB,CAAC,CAAC;SAC1E,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC;SACtC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,6BAA6B,CAAC;IAClF,OAAO,SAAS,KAAK,wFAAwF,CAAC;AAChH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAgB;IACjD,OAAO;QACL,EAAE,EAAE,KAAK;QACT,KAAK,EAAE,uBAAuB;QAC9B,IAAI,EAAE,eAAe,CAAC,KAAK,CAAC;QAC5B,QAAQ,EAAE,CAAC;KACZ,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,IAAa,EACb,QAAqB,EACrB,QAAgB,EAChB,GAAY;IAEZ,IAAI,GAAG,YAAY,cAAc,EAAE,CAAC;QAClC,OAAO;YACL,IAAI;YACJ,QAAQ;YACR,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,OAAO,EAAE,GAAG,CAAC,OAAO;SACrB,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC;AAC/E,CAAC"}
@@ -1,42 +1,81 @@
1
1
  import { buildMcpEntry, } from "../domain/mcp-entry.js";
2
+ import { classifyMcpEntry } from "./mcp-entry-classification.js";
3
+ import { readMcpEntry } from "./mcp-host-reader.js";
2
4
  import { writeMcpEntry } from "./mcp-host-writer.js";
3
5
  import { buildGlobalRefusal, resolveScopeDir, toErrorRecord, } from "./mcp-scope-common.js";
4
6
  export function runMcpSetup(env, input) {
5
- if (input.scope === "global" && !input.force && !input.dryRun) {
7
+ if (input.scope === "global" && input.globalApproval === undefined && !input.dryRun) {
6
8
  return buildGlobalRefusal(input.hosts);
7
9
  }
8
10
  const scopeDir = resolveScopeDir(env, input);
9
11
  const opts = {
10
12
  dryRun: input.dryRun ?? false,
11
- force: input.force ?? false,
12
13
  };
13
- const applied = [];
14
- const skipped = [];
15
- const errors = [];
14
+ const buckets = { applied: [], skipped: [], conflicts: [], errors: [] };
16
15
  for (const host of input.hosts) {
17
16
  for (const connection of input.connections) {
18
- const entry = buildMcpEntry(connection.name, connection.dsnVar);
19
- try {
20
- const result = writeMcpEntry(host, entry, { scopeDir, kind: input.scope }, opts);
21
- if (result.action === "skipped-idempotent") {
22
- skipped.push(result);
23
- }
24
- else {
25
- applied.push(result);
26
- }
27
- }
28
- catch (err) {
29
- errors.push(toErrorRecord(host, connection.name, scopeDir, err));
30
- }
17
+ applySetupEntry(host, connection, input, scopeDir, opts, buckets);
31
18
  }
32
19
  }
33
20
  return {
34
21
  scope: input.scope,
35
22
  scope_dir: scopeDir,
36
23
  dry_run: Boolean(input.dryRun),
37
- applied,
38
- skipped,
39
- errors,
24
+ ...buckets,
40
25
  };
41
26
  }
27
+ function applySetupEntry(host, connection, input, scopeDir, opts, buckets) {
28
+ const entry = setupEntry(host, connection, input);
29
+ try {
30
+ const result = writeMcpEntry(host, entry, { scopeDir, kind: input.scope }, opts);
31
+ addSetupWrite(result, buckets);
32
+ reportSetupWriteIssue(result, host, connection, entry, scopeDir, input.scope, buckets.errors);
33
+ }
34
+ catch (err) {
35
+ buckets.errors.push(toErrorRecord(host, connection.name, scopeDir, err));
36
+ }
37
+ }
38
+ function setupEntry(host, connection, input) {
39
+ return buildMcpEntry(connection.name, connection.dsnVar, {
40
+ host,
41
+ scope: input.scope,
42
+ ...(input.namespace === undefined ? {} : { namespace: input.namespace }),
43
+ });
44
+ }
45
+ function addSetupWrite(result, buckets) {
46
+ if (result.action === "conflict")
47
+ buckets.conflicts.push(result);
48
+ else if (result.action === "skipped-idempotent")
49
+ buckets.skipped.push(result);
50
+ else
51
+ buckets.applied.push(result);
52
+ }
53
+ function reportSetupWriteIssue(result, host, connection, entry, scopeDir, scope, errors) {
54
+ if (result.partial !== undefined) {
55
+ errors.push({
56
+ host,
57
+ instance: connection.name,
58
+ target: result.partial.target,
59
+ message: result.partial.message,
60
+ });
61
+ return;
62
+ }
63
+ if (result.action !== "written" || readBackMatches(host, entry, scopeDir, scope, connection))
64
+ return;
65
+ errors.push({
66
+ host,
67
+ instance: connection.name,
68
+ target: result.target,
69
+ message: "La entrada MCP escrita no coincidió al leerla de vuelta; no recargues el host.",
70
+ });
71
+ }
72
+ function readBackMatches(host, entry, scopeDir, scope, connection) {
73
+ try {
74
+ const snapshot = readMcpEntry(host, scopeDir, entry.name, scope);
75
+ return classifyMcpEntry(host, snapshot, entry, connection).state === "current";
76
+ }
77
+ catch {
78
+ return false;
79
+ }
80
+ }
42
81
  //# sourceMappingURL=mcp-setup-service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-setup-service.js","sourceRoot":"","sources":["../../src/application/mcp-setup-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,aAAa,GACd,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAGL,kBAAkB,EAClB,eAAe,EACf,aAAa,GACd,MAAM,uBAAuB,CAAC;AAoB/B,MAAM,UAAU,WAAW,CAAC,GAAY,EAAE,KAAoB;IAC5D,IAAI,KAAK,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAC9D,OAAO,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAiB;QACzB,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,KAAK;QAC7B,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,KAAK;KAC5B,CAAC;IAEF,MAAM,OAAO,GAAqB,EAAE,CAAC;IACrC,MAAM,OAAO,GAAqB,EAAE,CAAC;IACrC,MAAM,MAAM,GAAqB,EAAE,CAAC;IAEpC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/B,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YAC3C,MAAM,KAAK,GAAa,aAAa,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;YAC1E,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC;gBACjF,IAAI,MAAM,CAAC,MAAM,KAAK,oBAAoB,EAAE,CAAC;oBAC3C,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACvB,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACvB,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,SAAS,EAAE,QAAQ;QACnB,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;QAC9B,OAAO;QACP,OAAO;QACP,MAAM;KACP,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"mcp-setup-service.js","sourceRoot":"","sources":["../../src/application/mcp-setup-service.ts"],"names":[],"mappings":"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"}