@tacuchi/agent-workflow-cli 23.0.0 → 25.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 (164) hide show
  1. package/README.md +37 -1
  2. package/dist/adapters/postgres-readonly-tools.js +277 -0
  3. package/dist/adapters/postgres-readonly-tools.js.map +1 -0
  4. package/dist/application/checkpoint/markdown.js +85 -5
  5. package/dist/application/checkpoint/markdown.js.map +1 -1
  6. package/dist/application/checkpoint-service.js +7 -6
  7. package/dist/application/checkpoint-service.js.map +1 -1
  8. package/dist/application/checkpoint-write-service.js +270 -16
  9. package/dist/application/checkpoint-write-service.js.map +1 -1
  10. package/dist/application/database-mcp-server.js +168 -0
  11. package/dist/application/database-mcp-server.js.map +1 -0
  12. package/dist/application/database-mcp-stdio.js +137 -0
  13. package/dist/application/database-mcp-stdio.js.map +1 -0
  14. package/dist/application/database-tool-catalog.js +226 -0
  15. package/dist/application/database-tool-catalog.js.map +1 -0
  16. package/dist/application/dsn-reader-service.js +1 -1
  17. package/dist/application/flow/advance.js +60 -10
  18. package/dist/application/flow/advance.js.map +1 -1
  19. package/dist/application/flow/internal-actions.js +1 -1
  20. package/dist/application/flow/internal-actions.js.map +1 -1
  21. package/dist/application/flow/submit.js +256 -9
  22. package/dist/application/flow/submit.js.map +1 -1
  23. package/dist/application/lifecycle-target.js +16 -19
  24. package/dist/application/lifecycle-target.js.map +1 -1
  25. package/dist/application/lock-service.js +96 -31
  26. package/dist/application/lock-service.js.map +1 -1
  27. package/dist/application/logging/log-events.js +19 -3
  28. package/dist/application/logging/log-events.js.map +1 -1
  29. package/dist/application/logging/logger.js +2 -2
  30. package/dist/application/logging/logger.js.map +1 -1
  31. package/dist/application/markdown.js +6 -2
  32. package/dist/application/markdown.js.map +1 -1
  33. package/dist/application/mcp-connections-service.js +115 -41
  34. package/dist/application/mcp-connections-service.js.map +1 -1
  35. package/dist/application/mcp-doctor-service.js +98 -54
  36. package/dist/application/mcp-doctor-service.js.map +1 -1
  37. package/dist/application/mcp-entry-classification.js +60 -0
  38. package/dist/application/mcp-entry-classification.js.map +1 -0
  39. package/dist/application/mcp-host-reader.js +102 -86
  40. package/dist/application/mcp-host-reader.js.map +1 -1
  41. package/dist/application/mcp-host-receipt-service.js +399 -0
  42. package/dist/application/mcp-host-receipt-service.js.map +1 -0
  43. package/dist/application/mcp-host-receipt-store.js +122 -0
  44. package/dist/application/mcp-host-receipt-store.js.map +1 -0
  45. package/dist/application/mcp-host-receipts.js +28 -0
  46. package/dist/application/mcp-host-receipts.js.map +1 -0
  47. package/dist/application/mcp-host-writer.js +209 -38
  48. package/dist/application/mcp-host-writer.js.map +1 -1
  49. package/dist/application/mcp-launch-probe-service.js +142 -0
  50. package/dist/application/mcp-launch-probe-service.js.map +1 -0
  51. package/dist/application/mcp-migration-service.js +351 -0
  52. package/dist/application/mcp-migration-service.js.map +1 -0
  53. package/dist/application/mcp-native-host-check-service.js +154 -0
  54. package/dist/application/mcp-native-host-check-service.js.map +1 -0
  55. package/dist/application/mcp-receipt-registration-service.js +105 -0
  56. package/dist/application/mcp-receipt-registration-service.js.map +1 -0
  57. package/dist/application/mcp-receipt-removal-service.js +62 -0
  58. package/dist/application/mcp-receipt-removal-service.js.map +1 -0
  59. package/dist/application/mcp-remove-service.js +83 -24
  60. package/dist/application/mcp-remove-service.js.map +1 -1
  61. package/dist/application/mcp-scope-common.js +1 -1
  62. package/dist/application/mcp-scope-common.js.map +1 -1
  63. package/dist/application/mcp-setup-service.js +59 -24
  64. package/dist/application/mcp-setup-service.js.map +1 -1
  65. package/dist/application/mcp-stdio-probe.js +526 -0
  66. package/dist/application/mcp-stdio-probe.js.map +1 -0
  67. package/dist/application/mcp-test-connection-service.js +23 -50
  68. package/dist/application/mcp-test-connection-service.js.map +1 -1
  69. package/dist/application/parsers/spec-functional.js +220 -0
  70. package/dist/application/parsers/spec-functional.js.map +1 -0
  71. package/dist/application/parsers/spec-relation.js +142 -5
  72. package/dist/application/parsers/spec-relation.js.map +1 -1
  73. package/dist/application/paths-service.js +13 -0
  74. package/dist/application/paths-service.js.map +1 -1
  75. package/dist/application/plan-exec-decision-service.js +57 -4
  76. package/dist/application/plan-exec-decision-service.js.map +1 -1
  77. package/dist/application/reseal-service.js +300 -0
  78. package/dist/application/reseal-service.js.map +1 -0
  79. package/dist/application/self/host-states.js.map +1 -1
  80. package/dist/application/self/install-skill.js +4 -34
  81. package/dist/application/self/install-skill.js.map +1 -1
  82. package/dist/application/self/mcp-config.js +369 -59
  83. package/dist/application/self/mcp-config.js.map +1 -1
  84. package/dist/application/self/mcp-via-state.js +9 -6
  85. package/dist/application/self/mcp-via-state.js.map +1 -1
  86. package/dist/application/self/uninstall-skill.js +3 -18
  87. package/dist/application/self/uninstall-skill.js.map +1 -1
  88. package/dist/application/self/uninstall.js +4 -23
  89. package/dist/application/self/uninstall.js.map +1 -1
  90. package/dist/application/workline-index-service.js +64 -6
  91. package/dist/application/workline-index-service.js.map +1 -1
  92. package/dist/application/workspace-init-service.js +4 -6
  93. package/dist/application/workspace-init-service.js.map +1 -1
  94. package/dist/cli/commands/checkpoint-write.js +24 -22
  95. package/dist/cli/commands/checkpoint-write.js.map +1 -1
  96. package/dist/cli/commands/index.js +7 -0
  97. package/dist/cli/commands/index.js.map +1 -1
  98. package/dist/cli/commands/mcp.js +642 -55
  99. package/dist/cli/commands/mcp.js.map +1 -1
  100. package/dist/cli/commands/reseal.js +140 -0
  101. package/dist/cli/commands/reseal.js.map +1 -0
  102. package/dist/cli/commands/status.js +5 -1
  103. package/dist/cli/commands/status.js.map +1 -1
  104. package/dist/cli/commands/tool.js +141 -0
  105. package/dist/cli/commands/tool.js.map +1 -0
  106. package/dist/cli/help-groups.js +7 -1
  107. package/dist/cli/help-groups.js.map +1 -1
  108. package/dist/cli/main.js +189 -57
  109. package/dist/cli/main.js.map +1 -1
  110. package/dist/cli/parser.js +5 -1
  111. package/dist/cli/parser.js.map +1 -1
  112. package/dist/cli/registry.js.map +1 -1
  113. package/dist/cli/render.js +15 -2
  114. package/dist/cli/render.js.map +1 -1
  115. package/dist/cli/tui/components/host-admin-section.js +2 -46
  116. package/dist/cli/tui/components/host-admin-section.js.map +1 -1
  117. package/dist/cli/tui/tabs/mcp-tab-helpers.js +71 -0
  118. package/dist/cli/tui/tabs/mcp-tab-helpers.js.map +1 -1
  119. package/dist/cli/tui/tabs/mcp-tab.js +101 -42
  120. package/dist/cli/tui/tabs/mcp-tab.js.map +1 -1
  121. package/dist/domain/database-tools.js +445 -0
  122. package/dist/domain/database-tools.js.map +1 -0
  123. package/dist/domain/effective-contract.js +10 -2
  124. package/dist/domain/effective-contract.js.map +1 -1
  125. package/dist/domain/flow/answer.js +4 -0
  126. package/dist/domain/flow/answer.js.map +1 -1
  127. package/dist/domain/flow/authority.js +103 -14
  128. package/dist/domain/flow/authority.js.map +1 -1
  129. package/dist/domain/flow/directive.js +2 -0
  130. package/dist/domain/flow/directive.js.map +1 -1
  131. package/dist/domain/flow/run-state.js +42 -0
  132. package/dist/domain/flow/run-state.js.map +1 -1
  133. package/dist/domain/lineage.js +38 -11
  134. package/dist/domain/lineage.js.map +1 -1
  135. package/dist/domain/mcp-entry.js +131 -17
  136. package/dist/domain/mcp-entry.js.map +1 -1
  137. package/dist/domain/postgres-object-search.js +320 -0
  138. package/dist/domain/postgres-object-search.js.map +1 -0
  139. package/dist/domain/redaction.js +47 -0
  140. package/dist/domain/redaction.js.map +1 -0
  141. package/dist/domain/workline-mcp-entry.js +6 -9
  142. package/dist/domain/workline-mcp-entry.js.map +1 -1
  143. package/dist/ports/postgres-tools.js +10 -0
  144. package/dist/ports/postgres-tools.js.map +1 -0
  145. package/package.json +5 -1
  146. package/skills/w/commands/plan-exec.md +1 -1
  147. package/skills/w/commands/spec-new.md +6 -5
  148. package/skills/w/context/MANIFEST.json +1 -1
  149. package/skills/w/harness/HARNESS.md +1 -1
  150. package/skills/w/hooks/README.md +13 -9
  151. package/skills/w/hooks/hooks.template.json +2 -2
  152. package/skills/w/loops/CHASSIS.md +1 -1
  153. package/skills/w/loops/plan-exec-loop/LOOP.md +7 -5
  154. package/skills/w/loops/plan-new-loop/LOOP.md +46 -41
  155. package/skills/w/loops/plan-refine-loop/LOOP.md +4 -4
  156. package/skills/w/loops/quick-loop/LOOP.md +12 -13
  157. package/skills/w/loops/spec-refine-loop/LOOP.md +7 -3
  158. package/skills/w/modules/COMPACTION.md +1 -1
  159. package/skills/w/modules/PLAN-INPUT.md +3 -3
  160. package/skills/w/modules/PROMPT-CONTINUITY.md +1 -1
  161. package/dist/application/mcp-dbhub-launcher.js +0 -216
  162. package/dist/application/mcp-dbhub-launcher.js.map +0 -1
  163. package/dist/application/self/mcp-offer.js +0 -96
  164. package/dist/application/self/mcp-offer.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-launch-probe-service.js","sourceRoot":"","sources":["../../src/application/mcp-launch-probe-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,351 @@
1
+ import { buildMcpEntry, knownLegacyMcpInstanceAliases, } from "../domain/mcp-entry.js";
2
+ import { classifyMcpEntry } from "./mcp-entry-classification.js";
3
+ import { readMcpEntry } from "./mcp-host-reader.js";
4
+ import { removeMcpEntry, writeMcpEntry } from "./mcp-host-writer.js";
5
+ import { buildGlobalRefusal, resolveScopeDir, } from "./mcp-scope-common.js";
6
+ export function runMcpMigration(env, input) {
7
+ if (input.scope === "global" && input.apply === true && input.globalApproval === undefined) {
8
+ return buildGlobalRefusal([...input.hosts]);
9
+ }
10
+ const scopeDir = resolveScopeDir(env, input);
11
+ const items = input.hosts.flatMap((host) => input.connections.map((connection) => migrateConnection(host, connection, scopeDir, input)));
12
+ return {
13
+ scope: input.scope,
14
+ scope_dir: scopeDir,
15
+ preview: !input.apply,
16
+ items,
17
+ summary: {
18
+ current: items.filter((item) => item.state === "current").length,
19
+ "known-legacy": items.filter((item) => item.state === "known-legacy").length,
20
+ foreign: items.filter((item) => item.state === "foreign").length,
21
+ missing: items.filter((item) => item.state === "missing").length,
22
+ malformed: items.filter((item) => item.state === "malformed").length,
23
+ },
24
+ };
25
+ }
26
+ function migrateConnection(host, connection, scopeDir, input) {
27
+ const current = currentEntry(host, connection, input);
28
+ const snapshot = readCurrentSnapshot(host, scopeDir, current, input.scope);
29
+ if (snapshot === undefined)
30
+ return unreadableMigrationItem(host, connection, scopeDir);
31
+ const classification = classifyMcpEntry(host, snapshot, current, connection);
32
+ const retirements = inspectLegacyRetirements(host, connection, scopeDir, input);
33
+ const state = classification.state;
34
+ const requestedAction = actionForMigration(state, retirements);
35
+ const shouldApply = input.apply === true && isMutationAction(requestedAction);
36
+ const applied = shouldApply
37
+ ? applyMigration(host, connection, current, classification, retirements, scopeDir, input.scope)
38
+ : undefined;
39
+ const action = applied?.error === undefined ? requestedAction : "failed";
40
+ return migrationItem({
41
+ host,
42
+ connection,
43
+ current,
44
+ snapshotTarget: snapshot.target,
45
+ classification,
46
+ requestedAction,
47
+ action,
48
+ retirements: applied?.retirements ?? retirementPreview(retirements),
49
+ ...(applied === undefined ? {} : { applied }),
50
+ });
51
+ }
52
+ function currentEntry(host, connection, input) {
53
+ return buildMcpEntry(connection.name, connection.dsnVar, {
54
+ host,
55
+ scope: input.scope,
56
+ ...(input.namespace === undefined ? {} : { namespace: input.namespace }),
57
+ });
58
+ }
59
+ function readCurrentSnapshot(host, scopeDir, entry, scope) {
60
+ try {
61
+ return readMcpEntry(host, scopeDir, entry.name, scope);
62
+ }
63
+ catch {
64
+ return undefined;
65
+ }
66
+ }
67
+ function unreadableMigrationItem(host, connection, scopeDir) {
68
+ return {
69
+ host,
70
+ instance: connection.name,
71
+ target: scopeDir,
72
+ state: "malformed",
73
+ action: "failed",
74
+ error: {
75
+ code: "MCP_MIGRATION_WRITE_FAILED",
76
+ message: "No se pudo leer la configuración MCP para migrarla.",
77
+ },
78
+ };
79
+ }
80
+ function inspectLegacyRetirements(host, connection, scopeDir, input) {
81
+ if (host !== "claude")
82
+ return [];
83
+ return knownLegacyMcpInstanceAliases(connection.name)
84
+ .map((alias) => {
85
+ const aliasConnection = { ...connection, name: alias };
86
+ const entry = currentEntry(host, aliasConnection, input);
87
+ const snapshot = readCurrentSnapshot(host, scopeDir, entry, input.scope);
88
+ if (snapshot === undefined) {
89
+ return {
90
+ connection: aliasConnection,
91
+ entry,
92
+ target: scopeDir,
93
+ classification: { state: "malformed" },
94
+ };
95
+ }
96
+ const classified = classifyMcpEntry(host, snapshot, entry, aliasConnection);
97
+ // A new Workline descriptor under cert/prod is still an owned historic
98
+ // name. It must be retired before qtc-cert/qtc-prod is presented as done.
99
+ const classification = classified.state === "current"
100
+ ? { state: "known-legacy", legacy: entry }
101
+ : classified;
102
+ return { connection: aliasConnection, entry, target: snapshot.target, classification };
103
+ })
104
+ .filter((candidate) => candidate.classification.state !== "missing");
105
+ }
106
+ function actionForMigration(state, retirements) {
107
+ if (retirements.some((retirement) => retirement.classification.state !== "known-legacy")) {
108
+ return "blocked";
109
+ }
110
+ const currentAction = actionFor(state);
111
+ if (currentAction === "blocked")
112
+ return "blocked";
113
+ return retirements.length > 0 ? "replace-known-legacy" : currentAction;
114
+ }
115
+ function isMutationAction(action) {
116
+ return action === "install" || action === "replace-known-legacy";
117
+ }
118
+ function applyMigration(host, connection, current, classification, candidates, scopeDir, scope) {
119
+ // Establish the replacement before retiring any historic alias. A failed
120
+ // write or readback therefore leaves every legacy server intact instead of
121
+ // turning an unsuccessful migration into an availability outage.
122
+ const currentWrite = writeCurrentMigration(host, connection, current, classification, scopeDir, scope, false, retirementPreview(candidates));
123
+ if (currentWrite.error !== undefined) {
124
+ return {
125
+ ...currentWrite,
126
+ retirements: deferredRetirements(candidates, "No se retiró la entrada legacy porque el descriptor qtc no pudo confirmarse."),
127
+ };
128
+ }
129
+ // The current descriptor is durable and reread at this point. Alias
130
+ // retirement is deliberately best-effort after that coverage boundary: a
131
+ // concurrent/failed removal leaves qtc-* usable and reports recovery work
132
+ // instead of removing the only working server.
133
+ const retired = retireKnownAliases(host, candidates, scopeDir, scope);
134
+ if (retired.error !== undefined) {
135
+ return {
136
+ ...currentWrite,
137
+ configurationChanged: currentWrite.configurationChanged || retired.configurationChanged,
138
+ retirements: retired.retirements,
139
+ error: `El descriptor qtc quedó instalado, pero ${retired.error}`,
140
+ };
141
+ }
142
+ const retirements = verifyRetiredAliases(host, candidates, retired.retirements, scopeDir, scope);
143
+ if (retirements.error === undefined) {
144
+ return {
145
+ ...currentWrite,
146
+ configurationChanged: currentWrite.configurationChanged || retired.configurationChanged,
147
+ retirements: retirements.value,
148
+ };
149
+ }
150
+ return {
151
+ ...currentWrite,
152
+ configurationChanged: currentWrite.configurationChanged || retired.configurationChanged,
153
+ retirements: retirements.value,
154
+ error: `El descriptor qtc quedó instalado, pero ${retirements.error}`,
155
+ };
156
+ }
157
+ function verifyRetiredAliases(host, candidates, retirements, scopeDir, scope) {
158
+ const verified = [...retirements];
159
+ for (let index = 0; index < candidates.length; index += 1) {
160
+ const candidate = candidates[index];
161
+ const retirement = verified[index];
162
+ if (candidate === undefined || retirement === undefined)
163
+ continue;
164
+ const state = readBackState(host, scopeDir, candidate.entry, candidate.connection, scope);
165
+ if (state === "missing")
166
+ continue;
167
+ const error = "La entrada legacy reapareció durante la migración; no se debe recargar el host.";
168
+ verified[index] = {
169
+ ...retirement,
170
+ action: "failed",
171
+ readback_state: state,
172
+ error: { code: "MCP_MIGRATION_WRITE_FAILED", message: error },
173
+ };
174
+ return { value: verified, error };
175
+ }
176
+ return { value: verified };
177
+ }
178
+ function retireKnownAliases(host, candidates, scopeDir, scope) {
179
+ const retirements = retirementPreview(candidates);
180
+ let configurationChanged = false;
181
+ for (let index = 0; index < candidates.length; index += 1) {
182
+ const candidate = candidates[index];
183
+ if (candidate === undefined)
184
+ continue;
185
+ const result = retireAlias(host, candidate, scopeDir, scope);
186
+ retirements[index] = result.retirement;
187
+ configurationChanged ||= result.configurationChanged;
188
+ if (result.error !== undefined) {
189
+ for (let deferred = index + 1; deferred < candidates.length; deferred += 1) {
190
+ const pending = candidates[deferred];
191
+ if (pending === undefined)
192
+ continue;
193
+ retirements[deferred] = deferredRetirement(pending, "No se retiró la entrada legacy porque una retirada anterior falló.");
194
+ }
195
+ return { configurationChanged, retirements, error: result.error };
196
+ }
197
+ }
198
+ return { configurationChanged, retirements };
199
+ }
200
+ function retireAlias(host, candidate, scopeDir, scope) {
201
+ try {
202
+ const write = removeMcpEntry(host, candidate.entry, { scopeDir, kind: scope }, ...(candidate.classification.legacy === undefined
203
+ ? []
204
+ : [{ replaceLegacy: candidate.classification.legacy }]));
205
+ const readbackState = readBackState(host, scopeDir, candidate.entry, candidate.connection, scope);
206
+ const configurationChanged = write.action === "removed";
207
+ const complete = (write.action === "removed" || write.action === "skipped-idempotent") &&
208
+ write.partial === undefined &&
209
+ readbackState === "missing";
210
+ const retirement = retirementItem(candidate, {
211
+ action: complete ? "retire-known-legacy" : "failed",
212
+ write,
213
+ readbackState,
214
+ ...(complete
215
+ ? {}
216
+ : {
217
+ error: write.partial?.message ??
218
+ "No se pudo retirar la entrada legacy después de confirmar la conexión qtc.",
219
+ }),
220
+ });
221
+ const error = complete ? undefined : retirement.error?.message;
222
+ return {
223
+ retirement,
224
+ configurationChanged,
225
+ ...(error === undefined ? {} : { error }),
226
+ };
227
+ }
228
+ catch {
229
+ const retirement = retirementItem(candidate, {
230
+ action: "failed",
231
+ error: "No se pudo retirar la entrada legacy después de confirmar la conexión qtc.",
232
+ });
233
+ return {
234
+ retirement,
235
+ configurationChanged: false,
236
+ error: "No se pudo retirar la entrada legacy después de confirmar la conexión qtc.",
237
+ };
238
+ }
239
+ }
240
+ function writeCurrentMigration(host, connection, current, classification, scopeDir, scope, configurationChanged, retirements) {
241
+ try {
242
+ const write = writeMcpEntry(host, current, { scopeDir, kind: scope }, ...(classification.legacy === undefined ? [] : [{ replaceLegacy: classification.legacy }]));
243
+ const readbackState = readBackState(host, scopeDir, current, connection, scope);
244
+ const complete = (write.action === "written" || write.action === "skipped-idempotent") &&
245
+ write.partial === undefined &&
246
+ readbackState === "current";
247
+ return {
248
+ write,
249
+ readbackState,
250
+ configurationChanged: configurationChanged || write.action === "written",
251
+ retirements,
252
+ ...(complete
253
+ ? {}
254
+ : {
255
+ error: write.partial?.message ??
256
+ (write.action === "conflict"
257
+ ? "La entrada MCP cambió durante la migración; no se sobrescribió la configuración ajena."
258
+ : "No se pudo escribir o releer la configuración MCP; no se aplicaron más cambios para esta entrada."),
259
+ }),
260
+ };
261
+ }
262
+ catch {
263
+ return {
264
+ configurationChanged,
265
+ retirements,
266
+ error: "No se pudo escribir o releer la configuración MCP; no se aplicaron más cambios para esta entrada.",
267
+ };
268
+ }
269
+ }
270
+ function retirementPreview(candidates) {
271
+ return candidates.map((candidate) => retirementItem(candidate, {
272
+ action: candidate.classification.state === "known-legacy" ? "retire-known-legacy" : "blocked",
273
+ }));
274
+ }
275
+ function deferredRetirements(candidates, error) {
276
+ return candidates.map((candidate) => deferredRetirement(candidate, error));
277
+ }
278
+ function deferredRetirement(candidate, error) {
279
+ return retirementItem(candidate, { action: "blocked", error });
280
+ }
281
+ function retirementItem(candidate, result) {
282
+ return {
283
+ instance: candidate.connection.name,
284
+ target: candidate.target,
285
+ state: candidate.classification.state,
286
+ action: result.action,
287
+ ...(candidate.classification.legacy === undefined
288
+ ? {}
289
+ : { from: redactDescriptor(candidate.classification.legacy) }),
290
+ ...(result.write === undefined ? {} : { write: result.write }),
291
+ ...(result.readbackState === undefined ? {} : { readback_state: result.readbackState }),
292
+ ...(result.error === undefined
293
+ ? {}
294
+ : { error: { code: "MCP_MIGRATION_WRITE_FAILED", message: result.error } }),
295
+ };
296
+ }
297
+ function migrationItem(input) {
298
+ const error = input.applied?.error;
299
+ return {
300
+ host: input.host,
301
+ instance: input.connection.name,
302
+ target: input.snapshotTarget,
303
+ state: input.classification.state,
304
+ action: input.action,
305
+ ...(input.applied?.write === undefined ? {} : { write: input.applied.write }),
306
+ ...(input.applied?.readbackState === undefined
307
+ ? {}
308
+ : { readback_state: input.applied.readbackState }),
309
+ ...(input.applied?.configurationChanged ? { configuration_changed: true } : {}),
310
+ ...(input.classification.legacy === undefined
311
+ ? {}
312
+ : { from: redactDescriptor(input.classification.legacy) }),
313
+ ...(isMutationAction(input.requestedAction) ? { to: redactDescriptor(input.current) } : {}),
314
+ ...(input.retirements.length === 0 ? {} : { retirements: input.retirements }),
315
+ ...(error === undefined
316
+ ? {}
317
+ : { error: { code: "MCP_MIGRATION_WRITE_FAILED", message: error } }),
318
+ };
319
+ }
320
+ function readBackState(host, scopeDir, current, connection, scope) {
321
+ try {
322
+ return classifyMcpEntry(host, readMcpEntry(host, scopeDir, current.name, scope), current, connection).state;
323
+ }
324
+ catch {
325
+ return "malformed";
326
+ }
327
+ }
328
+ function actionFor(state) {
329
+ switch (state) {
330
+ case "missing":
331
+ return "install";
332
+ case "known-legacy":
333
+ return "replace-known-legacy";
334
+ case "foreign":
335
+ case "malformed":
336
+ return "blocked";
337
+ case "current":
338
+ return "none";
339
+ }
340
+ }
341
+ function redactDescriptor(entry) {
342
+ return {
343
+ command: entry.command,
344
+ args: [...entry.args],
345
+ env: Object.fromEntries(Object.keys(entry.env)
346
+ .sort()
347
+ .map((key) => [key, "<redacted>"])),
348
+ ...(entry.optional ? { optional: true } : {}),
349
+ };
350
+ }
351
+ //# sourceMappingURL=mcp-migration-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-migration-service.js","sourceRoot":"","sources":["../../src/application/mcp-migration-service.ts"],"names":[],"mappings":"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"}
@@ -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