@tacuchi/agent-workflow-cli 23.0.0 → 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 (105) 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/database-mcp-server.js +168 -0
  5. package/dist/application/database-mcp-server.js.map +1 -0
  6. package/dist/application/database-mcp-stdio.js +137 -0
  7. package/dist/application/database-mcp-stdio.js.map +1 -0
  8. package/dist/application/database-tool-catalog.js +226 -0
  9. package/dist/application/database-tool-catalog.js.map +1 -0
  10. package/dist/application/dsn-reader-service.js +1 -1
  11. package/dist/application/lock-service.js +96 -31
  12. package/dist/application/lock-service.js.map +1 -1
  13. package/dist/application/logging/log-events.js +19 -3
  14. package/dist/application/logging/log-events.js.map +1 -1
  15. package/dist/application/logging/logger.js +2 -2
  16. package/dist/application/logging/logger.js.map +1 -1
  17. package/dist/application/mcp-connections-service.js +115 -41
  18. package/dist/application/mcp-connections-service.js.map +1 -1
  19. package/dist/application/mcp-doctor-service.js +98 -54
  20. package/dist/application/mcp-doctor-service.js.map +1 -1
  21. package/dist/application/mcp-entry-classification.js +60 -0
  22. package/dist/application/mcp-entry-classification.js.map +1 -0
  23. package/dist/application/mcp-host-reader.js +102 -86
  24. package/dist/application/mcp-host-reader.js.map +1 -1
  25. package/dist/application/mcp-host-receipt-service.js +399 -0
  26. package/dist/application/mcp-host-receipt-service.js.map +1 -0
  27. package/dist/application/mcp-host-receipt-store.js +122 -0
  28. package/dist/application/mcp-host-receipt-store.js.map +1 -0
  29. package/dist/application/mcp-host-receipts.js +28 -0
  30. package/dist/application/mcp-host-receipts.js.map +1 -0
  31. package/dist/application/mcp-host-writer.js +209 -38
  32. package/dist/application/mcp-host-writer.js.map +1 -1
  33. package/dist/application/mcp-launch-probe-service.js +142 -0
  34. package/dist/application/mcp-launch-probe-service.js.map +1 -0
  35. package/dist/application/mcp-migration-service.js +351 -0
  36. package/dist/application/mcp-migration-service.js.map +1 -0
  37. package/dist/application/mcp-native-host-check-service.js +154 -0
  38. package/dist/application/mcp-native-host-check-service.js.map +1 -0
  39. package/dist/application/mcp-receipt-registration-service.js +105 -0
  40. package/dist/application/mcp-receipt-registration-service.js.map +1 -0
  41. package/dist/application/mcp-receipt-removal-service.js +62 -0
  42. package/dist/application/mcp-receipt-removal-service.js.map +1 -0
  43. package/dist/application/mcp-remove-service.js +83 -24
  44. package/dist/application/mcp-remove-service.js.map +1 -1
  45. package/dist/application/mcp-scope-common.js +1 -1
  46. package/dist/application/mcp-scope-common.js.map +1 -1
  47. package/dist/application/mcp-setup-service.js +59 -24
  48. package/dist/application/mcp-setup-service.js.map +1 -1
  49. package/dist/application/mcp-stdio-probe.js +526 -0
  50. package/dist/application/mcp-stdio-probe.js.map +1 -0
  51. package/dist/application/mcp-test-connection-service.js +23 -50
  52. package/dist/application/mcp-test-connection-service.js.map +1 -1
  53. package/dist/application/self/host-states.js.map +1 -1
  54. package/dist/application/self/install-skill.js +4 -34
  55. package/dist/application/self/install-skill.js.map +1 -1
  56. package/dist/application/self/mcp-config.js +369 -59
  57. package/dist/application/self/mcp-config.js.map +1 -1
  58. package/dist/application/self/mcp-via-state.js +9 -6
  59. package/dist/application/self/mcp-via-state.js.map +1 -1
  60. package/dist/application/self/uninstall-skill.js +3 -18
  61. package/dist/application/self/uninstall-skill.js.map +1 -1
  62. package/dist/application/self/uninstall.js +4 -23
  63. package/dist/application/self/uninstall.js.map +1 -1
  64. package/dist/application/workspace-init-service.js +4 -6
  65. package/dist/application/workspace-init-service.js.map +1 -1
  66. package/dist/cli/commands/index.js +2 -0
  67. package/dist/cli/commands/index.js.map +1 -1
  68. package/dist/cli/commands/mcp.js +642 -55
  69. package/dist/cli/commands/mcp.js.map +1 -1
  70. package/dist/cli/commands/tool.js +141 -0
  71. package/dist/cli/commands/tool.js.map +1 -0
  72. package/dist/cli/help-groups.js +1 -1
  73. package/dist/cli/help-groups.js.map +1 -1
  74. package/dist/cli/main.js +189 -57
  75. package/dist/cli/main.js.map +1 -1
  76. package/dist/cli/parser.js +5 -1
  77. package/dist/cli/parser.js.map +1 -1
  78. package/dist/cli/registry.js.map +1 -1
  79. package/dist/cli/render.js +15 -2
  80. package/dist/cli/render.js.map +1 -1
  81. package/dist/cli/tui/components/host-admin-section.js +2 -46
  82. package/dist/cli/tui/components/host-admin-section.js.map +1 -1
  83. package/dist/cli/tui/tabs/mcp-tab-helpers.js +71 -0
  84. package/dist/cli/tui/tabs/mcp-tab-helpers.js.map +1 -1
  85. package/dist/cli/tui/tabs/mcp-tab.js +101 -42
  86. package/dist/cli/tui/tabs/mcp-tab.js.map +1 -1
  87. package/dist/domain/database-tools.js +445 -0
  88. package/dist/domain/database-tools.js.map +1 -0
  89. package/dist/domain/flow/authority.js +4 -0
  90. package/dist/domain/flow/authority.js.map +1 -1
  91. package/dist/domain/mcp-entry.js +131 -17
  92. package/dist/domain/mcp-entry.js.map +1 -1
  93. package/dist/domain/postgres-object-search.js +320 -0
  94. package/dist/domain/postgres-object-search.js.map +1 -0
  95. package/dist/domain/redaction.js +47 -0
  96. package/dist/domain/redaction.js.map +1 -0
  97. package/dist/domain/workline-mcp-entry.js +6 -9
  98. package/dist/domain/workline-mcp-entry.js.map +1 -1
  99. package/dist/ports/postgres-tools.js +10 -0
  100. package/dist/ports/postgres-tools.js.map +1 -0
  101. package/package.json +5 -1
  102. package/dist/application/mcp-dbhub-launcher.js +0 -216
  103. package/dist/application/mcp-dbhub-launcher.js.map +0 -1
  104. package/dist/application/self/mcp-offer.js +0 -96
  105. package/dist/application/self/mcp-offer.js.map +0 -1
@@ -0,0 +1,399 @@
1
+ import { isAbsolute } from "node:path";
2
+ import { normalizeMcpInstance, validateMcpInstance } from "../domain/mcp-entry.js";
3
+ import { redactSensitiveText } from "../domain/redaction.js";
4
+ import { canonicalJson, semanticDigest } from "./semantic-operation/protocol.js";
5
+ /**
6
+ * Durable, secret-free evidence about a host MCP registration.
7
+ *
8
+ * This module deliberately owns receipt semantics only. Persistence is behind
9
+ * {@link McpHostReceiptStore}, so callers such as setup, migration and the
10
+ * stdio server do not each invent their own partial state or file protocol.
11
+ */
12
+ export const MCP_HOST_RECEIPT_SCHEMA_VERSION = 1;
13
+ const MCP_HOSTS = ["claude", "codex", "warp", "gemini", "opencode", "crush", "kimi"];
14
+ /** Error text intentionally never quotes a descriptor, DSN, SQL, or user input. */
15
+ export class McpHostReceiptError extends Error {
16
+ code;
17
+ constructor(code, message) {
18
+ super(message);
19
+ this.code = code;
20
+ this.name = "McpHostReceiptError";
21
+ }
22
+ }
23
+ /**
24
+ * Deep receipt module used by setup/migration and by the MCP server lifecycle.
25
+ * A registration always revokes prior host-load proof and makes reload explicit.
26
+ */
27
+ export class McpHostReceiptService {
28
+ store;
29
+ constructor(store) {
30
+ this.store = store;
31
+ }
32
+ async list() {
33
+ return await this.store.read();
34
+ }
35
+ async find(identity) {
36
+ const key = normalizeIdentity(identity);
37
+ return (await this.store.read()).find((receipt) => sameIdentity(receipt, key));
38
+ }
39
+ async register(input) {
40
+ const identity = normalizeIdentity(input);
41
+ const descriptorDigest = digestMcpReceiptDescriptor(input.descriptor);
42
+ const worklineVersion = requireVersion(input.worklineVersion);
43
+ const registeredAt = requireInstant(input.registeredAt ?? new Date().toISOString());
44
+ const receipt = {
45
+ schema_version: MCP_HOST_RECEIPT_SCHEMA_VERSION,
46
+ ...identity,
47
+ workline_version: worklineVersion,
48
+ descriptor_digest: descriptorDigest,
49
+ registered_at: registeredAt,
50
+ reload_required: true,
51
+ };
52
+ return await this.store.update((receipts) => ({
53
+ receipts: replaceReceipt(receipts, receipt),
54
+ result: receipt,
55
+ }));
56
+ }
57
+ /** Remove receipt evidence only after the matching host descriptor is gone. */
58
+ async remove(identityInput) {
59
+ const identity = normalizeIdentity(identityInput);
60
+ return await this.store.update((receipts) => {
61
+ const remaining = receipts.filter((receipt) => !sameIdentity(receipt, identity));
62
+ return { receipts: remaining, result: remaining.length !== receipts.length };
63
+ });
64
+ }
65
+ /**
66
+ * Record a real host lifecycle notification. A local probe cannot call this
67
+ * truthfully: it must know the exact currently persisted descriptor digest.
68
+ */
69
+ async observeHostLoad(input) {
70
+ const identity = normalizeIdentity(input);
71
+ const descriptorDigest = requireDigest(input.descriptorDigest);
72
+ const observedAt = requireInstant(input.observedAt ?? new Date().toISOString());
73
+ return await this.store.update((receipts) => {
74
+ const current = findReceipt(receipts, identity);
75
+ if (current === undefined) {
76
+ throw new McpHostReceiptError("MCP_RECEIPT_NOT_FOUND", "No existe un recibo MCP para la conexión y host indicados.");
77
+ }
78
+ if (current.descriptor_digest !== descriptorDigest) {
79
+ throw new McpHostReceiptError("MCP_RECEIPT_DESCRIPTOR_STALE", "El servidor corresponde a un descriptor MCP anterior; recargá el host antes de confirmarlo.");
80
+ }
81
+ const next = {
82
+ ...current,
83
+ reload_required: false,
84
+ last_host_load_observed: { observed_at: observedAt, descriptor_digest: descriptorDigest },
85
+ };
86
+ return { receipts: replaceReceipt(receipts, next), result: next };
87
+ });
88
+ }
89
+ /** Keep launchability separately from host loading, including its exact failing phase. */
90
+ async recordLaunchProbe(input) {
91
+ const identity = normalizeIdentity(input);
92
+ const observedAt = requireInstant(input.observedAt ?? new Date().toISOString());
93
+ const phase = requireProbePhase(input.phase);
94
+ const outcome = requireProbeOutcome(input.outcome);
95
+ const expectedDescriptorDigest = input.descriptorDigest === undefined ? undefined : requireDigest(input.descriptorDigest);
96
+ return await this.store.update((receipts) => {
97
+ const current = findReceipt(receipts, identity);
98
+ if (current === undefined) {
99
+ throw new McpHostReceiptError("MCP_RECEIPT_NOT_FOUND", "No existe un recibo MCP para la conexión y host indicados.");
100
+ }
101
+ if (expectedDescriptorDigest !== undefined &&
102
+ current.descriptor_digest !== expectedDescriptorDigest) {
103
+ throw new McpHostReceiptError("MCP_RECEIPT_DESCRIPTOR_STALE", "El descriptor MCP cambió durante el probe; la evidencia no se registró.");
104
+ }
105
+ const next = {
106
+ ...current,
107
+ last_launch_probe: { observed_at: observedAt, outcome, phase },
108
+ };
109
+ return { receipts: replaceReceipt(receipts, next), result: next };
110
+ });
111
+ }
112
+ /**
113
+ * Record only a failed native inspection. A passing inspection deliberately
114
+ * clears stale failure evidence, while the descriptor digest fences races
115
+ * with a later host-config write.
116
+ */
117
+ async recordNativeHostCheck(input) {
118
+ const identity = normalizeIdentity(input);
119
+ const descriptorDigest = requireDigest(input.descriptorDigest);
120
+ const outcome = requireNativeCheckOutcome(input.outcome);
121
+ const code = nativeCheckFailureCodeFor(outcome, input.code);
122
+ const observedAt = requireInstant(input.observedAt ?? new Date().toISOString());
123
+ return await this.store.update((receipts) => {
124
+ const current = findReceipt(receipts, identity);
125
+ if (current === undefined) {
126
+ throw new McpHostReceiptError("MCP_RECEIPT_NOT_FOUND", "No existe un recibo MCP para la conexión y host indicados.");
127
+ }
128
+ if (current.descriptor_digest !== descriptorDigest) {
129
+ throw new McpHostReceiptError("MCP_RECEIPT_DESCRIPTOR_STALE", "El descriptor MCP cambió durante la verificación nativa; la evidencia no se registró.");
130
+ }
131
+ const next = code === undefined
132
+ ? withoutNativeCheckFailure(current)
133
+ : { ...current, last_native_check_failure: { observed_at: observedAt, code } };
134
+ return { receipts: replaceReceipt(receipts, next), result: next };
135
+ });
136
+ }
137
+ }
138
+ /**
139
+ * The digest deliberately covers only the persisted, non-secret launch shape.
140
+ * Rejecting credential-shaped values before hashing prevents a receipt from
141
+ * becoming a stable fingerprint of a DSN that should never have been there.
142
+ */
143
+ export function digestMcpReceiptDescriptor(descriptor) {
144
+ if (typeof descriptor.command !== "string" || !isAbsolute(descriptor.command)) {
145
+ throw new McpHostReceiptError("MCP_RECEIPT_INVALID", "El descriptor MCP debe declarar una ruta absoluta al ejecutable de Node.");
146
+ }
147
+ if (!Array.isArray(descriptor.args) || descriptor.args.length === 0) {
148
+ throw new McpHostReceiptError("MCP_RECEIPT_INVALID", "El descriptor MCP debe declarar el entrypoint absoluto y sus argumentos.");
149
+ }
150
+ if (!isAbsolute(descriptor.args[0] ?? "")) {
151
+ throw new McpHostReceiptError("MCP_RECEIPT_INVALID", "El descriptor MCP debe declarar una ruta absoluta al entrypoint.");
152
+ }
153
+ assertSecretFree(descriptor.command);
154
+ for (const arg of descriptor.args) {
155
+ if (typeof arg !== "string") {
156
+ throw new McpHostReceiptError("MCP_RECEIPT_INVALID", "El descriptor MCP contiene un argumento inválido.");
157
+ }
158
+ assertSecretFree(arg);
159
+ if (isSecretFlag(arg)) {
160
+ throw new McpHostReceiptError("MCP_RECEIPT_SECRET_REJECTED", "El recibo MCP rechazó un argumento que podría transportar una credencial.");
161
+ }
162
+ }
163
+ return `sha256:${semanticDigest({ command: descriptor.command, args: [...descriptor.args] })}`;
164
+ }
165
+ /** Parses persisted state fail-closed, without echoing a potentially secret file. */
166
+ export function parseMcpHostReceiptBook(raw) {
167
+ let value;
168
+ try {
169
+ value = JSON.parse(raw);
170
+ }
171
+ catch {
172
+ throw new McpHostReceiptError("MCP_RECEIPT_MALFORMED", "El libro de recibos MCP no contiene JSON válido.");
173
+ }
174
+ if (!isRecord(value) ||
175
+ value.schema_version !== MCP_HOST_RECEIPT_SCHEMA_VERSION ||
176
+ !Array.isArray(value.receipts)) {
177
+ throw new McpHostReceiptError("MCP_RECEIPT_MALFORMED", "El libro de recibos MCP tiene una versión o forma no reconocida.");
178
+ }
179
+ const receipts = value.receipts.map(parseReceipt);
180
+ const keys = new Set();
181
+ for (const receipt of receipts) {
182
+ const key = receiptKey(receipt);
183
+ if (keys.has(key)) {
184
+ throw new McpHostReceiptError("MCP_RECEIPT_MALFORMED", "El libro de recibos MCP contiene identidades duplicadas.");
185
+ }
186
+ keys.add(key);
187
+ }
188
+ return { schema_version: MCP_HOST_RECEIPT_SCHEMA_VERSION, receipts: sortReceipts(receipts) };
189
+ }
190
+ /** Stable, newline-terminated bytes for atomic stores and readback comparison. */
191
+ export function serializeMcpHostReceiptBook(receipts) {
192
+ const book = {
193
+ schema_version: MCP_HOST_RECEIPT_SCHEMA_VERSION,
194
+ receipts: sortReceipts(receipts),
195
+ };
196
+ // canonicalJson makes the digest/readback comparison deterministic across hosts.
197
+ return `${canonicalJson(book)}\n`;
198
+ }
199
+ export function emptyMcpHostReceiptBook() {
200
+ return { schema_version: MCP_HOST_RECEIPT_SCHEMA_VERSION, receipts: [] };
201
+ }
202
+ function parseReceipt(value) {
203
+ if (!isRecord(value) || value.schema_version !== MCP_HOST_RECEIPT_SCHEMA_VERSION) {
204
+ throw new McpHostReceiptError("MCP_RECEIPT_MALFORMED", "Un recibo MCP tiene una forma no reconocida.");
205
+ }
206
+ const identity = normalizeIdentity({
207
+ host: value.host,
208
+ scope: value.scope,
209
+ connection: value.connection,
210
+ });
211
+ const worklineVersion = requireVersion(value.workline_version);
212
+ const descriptorDigest = requireDigest(value.descriptor_digest);
213
+ const registeredAt = requireInstant(value.registered_at);
214
+ if (typeof value.reload_required !== "boolean") {
215
+ throw new McpHostReceiptError("MCP_RECEIPT_MALFORMED", "Un recibo MCP no declara reload_required.");
216
+ }
217
+ const base = {
218
+ schema_version: MCP_HOST_RECEIPT_SCHEMA_VERSION,
219
+ ...identity,
220
+ workline_version: worklineVersion,
221
+ descriptor_digest: descriptorDigest,
222
+ registered_at: registeredAt,
223
+ reload_required: value.reload_required,
224
+ };
225
+ const observed = value.last_host_load_observed;
226
+ const probe = value.last_launch_probe;
227
+ const nativeFailure = value.last_native_check_failure;
228
+ const parsedObservation = observed === undefined ? undefined : parseHostLoadObservation(observed);
229
+ if (!value.reload_required && parsedObservation === undefined) {
230
+ throw new McpHostReceiptError("MCP_RECEIPT_MALFORMED", "Un recibo MCP cargado no tiene una observación de host que lo respalde.");
231
+ }
232
+ if (!value.reload_required && parsedObservation?.descriptor_digest !== descriptorDigest) {
233
+ throw new McpHostReceiptError("MCP_RECEIPT_MALFORMED", "La observación de carga MCP no corresponde al descriptor vigente.");
234
+ }
235
+ return {
236
+ ...base,
237
+ ...(parsedObservation === undefined ? {} : { last_host_load_observed: parsedObservation }),
238
+ ...(probe === undefined ? {} : { last_launch_probe: parseLaunchProbe(probe) }),
239
+ ...(nativeFailure === undefined
240
+ ? {}
241
+ : { last_native_check_failure: parseNativeHostCheckFailure(nativeFailure) }),
242
+ };
243
+ }
244
+ function parseHostLoadObservation(value) {
245
+ if (!isRecord(value)) {
246
+ throw new McpHostReceiptError("MCP_RECEIPT_MALFORMED", "La observación de carga MCP es inválida.");
247
+ }
248
+ return {
249
+ observed_at: requireInstant(value.observed_at),
250
+ descriptor_digest: requireDigest(value.descriptor_digest),
251
+ };
252
+ }
253
+ function parseLaunchProbe(value) {
254
+ if (!isRecord(value) || (value.outcome !== "passed" && value.outcome !== "failed")) {
255
+ throw new McpHostReceiptError("MCP_RECEIPT_MALFORMED", "El probe MCP registrado es inválido.");
256
+ }
257
+ return {
258
+ observed_at: requireInstant(value.observed_at),
259
+ outcome: value.outcome,
260
+ phase: requireProbePhase(value.phase),
261
+ };
262
+ }
263
+ function parseNativeHostCheckFailure(value) {
264
+ if (!isRecord(value)) {
265
+ throw new McpHostReceiptError("MCP_RECEIPT_MALFORMED", "La evidencia nativa MCP registrada es inválida.");
266
+ }
267
+ try {
268
+ return {
269
+ observed_at: requireInstant(value.observed_at),
270
+ code: requireNativeCheckFailureCode(value.code),
271
+ };
272
+ }
273
+ catch (error) {
274
+ if (error instanceof McpHostReceiptError) {
275
+ throw new McpHostReceiptError("MCP_RECEIPT_MALFORMED", "La evidencia nativa MCP es inválida.");
276
+ }
277
+ throw error;
278
+ }
279
+ }
280
+ function normalizeIdentity(input) {
281
+ if (!MCP_HOSTS.includes(input.host)) {
282
+ throw new McpHostReceiptError("MCP_RECEIPT_INVALID", "El host MCP indicado no es compatible.");
283
+ }
284
+ if (input.scope !== "workspace" && input.scope !== "global") {
285
+ throw new McpHostReceiptError("MCP_RECEIPT_INVALID", "El scope del recibo MCP es inválido.");
286
+ }
287
+ if (typeof input.connection !== "string") {
288
+ throw new McpHostReceiptError("MCP_RECEIPT_INVALID", "La conexión MCP es inválida.");
289
+ }
290
+ const connection = validateMcpInstance(input.connection);
291
+ if (!connection.ok) {
292
+ throw new McpHostReceiptError("MCP_RECEIPT_INVALID", "La conexión MCP es inválida.");
293
+ }
294
+ return {
295
+ host: input.host,
296
+ scope: input.scope,
297
+ connection: normalizeMcpInstance(connection.value),
298
+ };
299
+ }
300
+ function replaceReceipt(receipts, replacement) {
301
+ return sortReceipts([
302
+ ...receipts.filter((receipt) => !sameIdentity(receipt, replacement)),
303
+ replacement,
304
+ ]);
305
+ }
306
+ function withoutNativeCheckFailure(receipt) {
307
+ const { last_native_check_failure: _discarded, ...remaining } = receipt;
308
+ return remaining;
309
+ }
310
+ function findReceipt(receipts, identity) {
311
+ return receipts.find((receipt) => sameIdentity(receipt, identity));
312
+ }
313
+ function sameIdentity(left, right) {
314
+ return (left.host === right.host && left.scope === right.scope && left.connection === right.connection);
315
+ }
316
+ function sortReceipts(receipts) {
317
+ return [...receipts].sort((left, right) => compareCodeUnits(receiptKey(left), receiptKey(right)));
318
+ }
319
+ function receiptKey(receipt) {
320
+ return `${receipt.scope}\u0000${receipt.host}\u0000${receipt.connection}`;
321
+ }
322
+ function requireVersion(value) {
323
+ if (typeof value !== "string" || value.trim().length === 0 || value.length > 128) {
324
+ throw new McpHostReceiptError("MCP_RECEIPT_INVALID", "La versión Workline del recibo MCP es inválida.");
325
+ }
326
+ assertSecretFree(value);
327
+ return value.trim();
328
+ }
329
+ function requireDigest(value) {
330
+ if (typeof value !== "string" || !/^sha256:[a-f0-9]{64}$/.test(value)) {
331
+ throw new McpHostReceiptError("MCP_RECEIPT_INVALID", "El digest del descriptor MCP es inválido.");
332
+ }
333
+ return value;
334
+ }
335
+ function requireInstant(value) {
336
+ if (typeof value !== "string" ||
337
+ value.length > 64 ||
338
+ Number.isNaN(Date.parse(value)) ||
339
+ new Date(value).toISOString() !== value) {
340
+ throw new McpHostReceiptError("MCP_RECEIPT_INVALID", "La marca temporal del recibo MCP es inválida.");
341
+ }
342
+ return value;
343
+ }
344
+ function requireProbePhase(value) {
345
+ if (value !== "spawn" &&
346
+ value !== "initialize" &&
347
+ value !== "initialized" &&
348
+ value !== "tools/list" &&
349
+ value !== "tools/call") {
350
+ throw new McpHostReceiptError("MCP_RECEIPT_INVALID", "La fase del probe MCP es inválida.");
351
+ }
352
+ return value;
353
+ }
354
+ function requireProbeOutcome(value) {
355
+ if (value !== "passed" && value !== "failed") {
356
+ throw new McpHostReceiptError("MCP_RECEIPT_INVALID", "El resultado del probe MCP es inválido.");
357
+ }
358
+ return value;
359
+ }
360
+ function requireNativeCheckOutcome(value) {
361
+ if (value !== "passed" && value !== "failed") {
362
+ throw new McpHostReceiptError("MCP_RECEIPT_INVALID", "El resultado de la verificación nativa MCP es inválido.");
363
+ }
364
+ return value;
365
+ }
366
+ function nativeCheckFailureCodeFor(outcome, value) {
367
+ if (outcome === "passed") {
368
+ if (value !== undefined) {
369
+ throw new McpHostReceiptError("MCP_RECEIPT_INVALID", "Una verificación nativa MCP aprobada no puede declarar un fallo.");
370
+ }
371
+ return undefined;
372
+ }
373
+ return requireNativeCheckFailureCode(value);
374
+ }
375
+ function requireNativeCheckFailureCode(value) {
376
+ if (value !== "HOST_BINARY_MISSING" &&
377
+ value !== "HOST_NATIVE_CHECK_FAILED" &&
378
+ value !== "HOST_ENTRY_NOT_VISIBLE") {
379
+ throw new McpHostReceiptError("MCP_RECEIPT_INVALID", "El código de la verificación nativa MCP es inválido.");
380
+ }
381
+ return value;
382
+ }
383
+ function assertSecretFree(value) {
384
+ // A receipt never needs a connection URI or an assignment carrying credentials.
385
+ if (redactSensitiveText(value) !== value ||
386
+ /(?:^|[?&;\s-])(?:password|passwd|secret|token|api[-_]?key|dsn|pgpassword|pgpassfile)\s*=/i.test(value)) {
387
+ throw new McpHostReceiptError("MCP_RECEIPT_SECRET_REJECTED", "El recibo MCP rechazó material que podría contener una credencial.");
388
+ }
389
+ }
390
+ function isSecretFlag(value) {
391
+ return /^--?(?:token|secret|password|passwd|pwd|api[-_]?key|key|auth|dsn|database[-_]?url|pgpassword|pgpassfile)(?:=|$)/i.test(value);
392
+ }
393
+ function isRecord(value) {
394
+ return value !== null && typeof value === "object" && !Array.isArray(value);
395
+ }
396
+ function compareCodeUnits(left, right) {
397
+ return left < right ? -1 : left > right ? 1 : 0;
398
+ }
399
+ //# sourceMappingURL=mcp-host-receipt-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-host-receipt-service.js","sourceRoot":"","sources":["../../src/application/mcp-host-receipt-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,122 @@
1
+ import { chmod, mkdir, open, readFile, rename, unlink } from "node:fs/promises";
2
+ import { dirname, join } from "node:path";
3
+ import { McpHostReceiptError, emptyMcpHostReceiptBook, parseMcpHostReceiptBook, serializeMcpHostReceiptBook, } from "./mcp-host-receipt-service.js";
4
+ /**
5
+ * File adapter for {@link McpHostReceiptStore}.
6
+ *
7
+ * A `<file>.lock` is acquired with O_EXCL, so concurrent processes fail closed
8
+ * rather than losing an observation between read and replace. The actual book
9
+ * is written beside its destination and atomically renamed, then read back.
10
+ */
11
+ export class NodeMcpHostReceiptStore {
12
+ file;
13
+ constructor(file) {
14
+ this.file = file;
15
+ }
16
+ async read() {
17
+ return (await this.readBook()).receipts;
18
+ }
19
+ async update(transaction) {
20
+ const lock = await this.acquireLock();
21
+ try {
22
+ const current = await this.readBook();
23
+ const next = transaction(current.receipts);
24
+ const payload = serializeMcpHostReceiptBook(next.receipts);
25
+ await this.writeAtomically(payload);
26
+ const readback = await this.readBook();
27
+ if (serializeMcpHostReceiptBook(readback.receipts) !== payload) {
28
+ throw new McpHostReceiptError("MCP_RECEIPT_MALFORMED", "La comprobación posterior de escritura del recibo MCP no coincide.");
29
+ }
30
+ return next.result;
31
+ }
32
+ finally {
33
+ try {
34
+ await lock.close();
35
+ }
36
+ catch {
37
+ // The lock is still unlinked below; a close failure must not strand it.
38
+ }
39
+ finally {
40
+ try {
41
+ await unlink(this.lockFile());
42
+ }
43
+ catch {
44
+ // The operation already has its outcome; lock cleanup is best effort.
45
+ }
46
+ }
47
+ }
48
+ }
49
+ async readBook() {
50
+ try {
51
+ return parseMcpHostReceiptBook(await readFile(this.file, "utf8"));
52
+ }
53
+ catch (err) {
54
+ if (err.code === "ENOENT")
55
+ return emptyMcpHostReceiptBook();
56
+ throw err;
57
+ }
58
+ }
59
+ async acquireLock() {
60
+ await mkdir(dirname(this.file), { recursive: true });
61
+ try {
62
+ return await open(this.lockFile(), "wx", 0o600);
63
+ }
64
+ catch (err) {
65
+ if (err.code === "EEXIST") {
66
+ throw new McpHostReceiptError("MCP_RECEIPT_BUSY", "Otro proceso está actualizando los recibos MCP; reintentá la operación.");
67
+ }
68
+ throw err;
69
+ }
70
+ }
71
+ async writeAtomically(payload) {
72
+ const staged = await this.reserveAtomicTempFile();
73
+ try {
74
+ await staged.handle.writeFile(payload, "utf8");
75
+ try {
76
+ await chmod(staged.path, 0o600);
77
+ }
78
+ catch {
79
+ // Some filesystems do not expose POSIX modes. The contents remain secret-free.
80
+ }
81
+ await staged.handle.close();
82
+ await rename(staged.path, this.file);
83
+ }
84
+ catch (err) {
85
+ try {
86
+ await staged.handle.close();
87
+ }
88
+ catch {
89
+ // The handle may have already been closed before a failed rename.
90
+ }
91
+ try {
92
+ await unlink(staged.path);
93
+ }
94
+ catch {
95
+ // Only this process can reach a reserved temporary path.
96
+ }
97
+ throw err;
98
+ }
99
+ }
100
+ async reserveAtomicTempFile() {
101
+ for (let attempt = 1; attempt <= 64; attempt += 1) {
102
+ const temporary = `${this.file}.${process.pid}.${attempt}.tmp`;
103
+ try {
104
+ return { path: temporary, handle: await open(temporary, "wx", 0o600) };
105
+ }
106
+ catch (err) {
107
+ if (err.code === "EEXIST")
108
+ continue;
109
+ throw err;
110
+ }
111
+ }
112
+ throw new McpHostReceiptError("MCP_RECEIPT_BUSY", "No se pudo reservar un archivo temporal seguro para los recibos MCP; reintentá la operación.");
113
+ }
114
+ lockFile() {
115
+ return `${this.file}.lock`;
116
+ }
117
+ }
118
+ /** The single user-scoped receipt book covers both workspace and global host entries. */
119
+ export function mcpHostReceiptFile(paths) {
120
+ return join(paths.userDevDir(), "mcp-host-receipts.json");
121
+ }
122
+ //# sourceMappingURL=mcp-host-receipt-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-host-receipt-store.js","sourceRoot":"","sources":["../../src/application/mcp-host-receipt-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { readPackageVersion } from "../runtime/version.js";
2
+ import { McpHostReceiptService, } from "./mcp-host-receipt-service.js";
3
+ import { NodeMcpHostReceiptStore, mcpHostReceiptFile } from "./mcp-host-receipt-store.js";
4
+ /** Creates the one namespaced, user-scoped receipt book used by MCP adapters. */
5
+ export function openMcpHostReceiptService(paths) {
6
+ return new McpHostReceiptService(new NodeMcpHostReceiptStore(mcpHostReceiptFile(paths)));
7
+ }
8
+ /**
9
+ * Registers a receipt only after a host config write has succeeded. The entry
10
+ * is intentionally projected to command/args: env is neither persisted nor
11
+ * hashed, so a DSN can never reach a receipt.
12
+ */
13
+ export async function registerPersistedMcpDescriptor(paths, input) {
14
+ return await openMcpHostReceiptService(paths).register({
15
+ host: input.host,
16
+ scope: input.scope,
17
+ connection: input.connection,
18
+ worklineVersion: readPackageVersion(),
19
+ descriptor: { command: input.entry.command, args: input.entry.args },
20
+ });
21
+ }
22
+ export async function removePersistedMcpReceipt(paths, identity) {
23
+ const service = openMcpHostReceiptService(paths);
24
+ if ((await service.find(identity)) === undefined)
25
+ return false;
26
+ return await service.remove(identity);
27
+ }
28
+ //# sourceMappingURL=mcp-host-receipts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-host-receipts.js","sourceRoot":"","sources":["../../src/application/mcp-host-receipts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAEL,qBAAqB,GAEtB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAG1F,iFAAiF;AACjF,MAAM,UAAU,yBAAyB,CAAC,KAAmB;IAC3D,OAAO,IAAI,qBAAqB,CAAC,IAAI,uBAAuB,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC3F,CAAC;AASD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,KAAmB,EACnB,KAAqC;IAErC,OAAO,MAAM,yBAAyB,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC;QACrD,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,eAAe,EAAE,kBAAkB,EAAE;QACrC,UAAU,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE;KACrE,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,KAAmB,EACnB,QAAuE;IAEvE,MAAM,OAAO,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAC;IACjD,IAAI,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAC/D,OAAO,MAAM,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AACxC,CAAC"}