@sentropic/h2a-cli 0.1.1 → 0.1.7

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 (67) hide show
  1. package/dist/bin.js +30 -2
  2. package/dist/bin.js.map +1 -1
  3. package/dist/cli-contract.d.ts +62 -0
  4. package/dist/cli-contract.d.ts.map +1 -0
  5. package/dist/cli-contract.js +239 -0
  6. package/dist/cli-contract.js.map +1 -0
  7. package/dist/cli.d.ts +51 -0
  8. package/dist/cli.d.ts.map +1 -1
  9. package/dist/cli.js +711 -2
  10. package/dist/cli.js.map +1 -1
  11. package/dist/hosts/claude.d.ts +11 -6
  12. package/dist/hosts/claude.d.ts.map +1 -1
  13. package/dist/hosts/claude.js +40 -1
  14. package/dist/hosts/claude.js.map +1 -1
  15. package/dist/hosts/codex.d.ts +64 -6
  16. package/dist/hosts/codex.d.ts.map +1 -1
  17. package/dist/hosts/codex.js +39 -1
  18. package/dist/hosts/codex.js.map +1 -1
  19. package/dist/hosts/gemini.d.ts +8 -6
  20. package/dist/hosts/gemini.d.ts.map +1 -1
  21. package/dist/hosts/gemini.js +9 -1
  22. package/dist/hosts/gemini.js.map +1 -1
  23. package/dist/index.d.ts +8 -34
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +5 -2
  26. package/dist/index.js.map +1 -1
  27. package/dist/runtime/local-files/index.d.ts +5 -0
  28. package/dist/runtime/local-files/index.d.ts.map +1 -0
  29. package/dist/runtime/local-files/index.js +5 -0
  30. package/dist/runtime/local-files/index.js.map +1 -0
  31. package/dist/runtime/local-files/locks.d.ts +43 -0
  32. package/dist/runtime/local-files/locks.d.ts.map +1 -0
  33. package/dist/runtime/local-files/locks.js +197 -0
  34. package/dist/runtime/local-files/locks.js.map +1 -0
  35. package/dist/runtime/local-files/paths.d.ts +18 -0
  36. package/dist/runtime/local-files/paths.d.ts.map +1 -0
  37. package/dist/runtime/local-files/paths.js +28 -0
  38. package/dist/runtime/local-files/paths.js.map +1 -0
  39. package/dist/runtime/local-files/schema.d.ts +47 -0
  40. package/dist/runtime/local-files/schema.d.ts.map +1 -0
  41. package/dist/runtime/local-files/schema.js +77 -0
  42. package/dist/runtime/local-files/schema.js.map +1 -0
  43. package/dist/runtime/local-files/store.d.ts +44 -0
  44. package/dist/runtime/local-files/store.d.ts.map +1 -0
  45. package/dist/runtime/local-files/store.js +407 -0
  46. package/dist/runtime/local-files/store.js.map +1 -0
  47. package/dist/runtime/mcp/handlers.d.ts +62 -0
  48. package/dist/runtime/mcp/handlers.d.ts.map +1 -0
  49. package/dist/runtime/mcp/handlers.js +261 -0
  50. package/dist/runtime/mcp/handlers.js.map +1 -0
  51. package/dist/runtime/mcp/index.d.ts +5 -0
  52. package/dist/runtime/mcp/index.d.ts.map +1 -0
  53. package/dist/runtime/mcp/index.js +5 -0
  54. package/dist/runtime/mcp/index.js.map +1 -0
  55. package/dist/runtime/mcp/server.d.ts +26 -0
  56. package/dist/runtime/mcp/server.d.ts.map +1 -0
  57. package/dist/runtime/mcp/server.js +45 -0
  58. package/dist/runtime/mcp/server.js.map +1 -0
  59. package/dist/runtime/mcp/stdio.d.ts +21 -0
  60. package/dist/runtime/mcp/stdio.d.ts.map +1 -0
  61. package/dist/runtime/mcp/stdio.js +103 -0
  62. package/dist/runtime/mcp/stdio.js.map +1 -0
  63. package/dist/runtime/mcp/tools.d.ts +19 -0
  64. package/dist/runtime/mcp/tools.d.ts.map +1 -0
  65. package/dist/runtime/mcp/tools.js +175 -0
  66. package/dist/runtime/mcp/tools.js.map +1 -0
  67. package/package.json +3 -3
@@ -0,0 +1,261 @@
1
+ import { computeHash, signCanonical } from "@sentropic/h2a";
2
+ const ESCALATION_CHANNELS = new Set(["advise", "decide", "alert"]);
3
+ function safeError(reason) {
4
+ if (reason instanceof Error)
5
+ return { error: reason.message };
6
+ return { error: String(reason) };
7
+ }
8
+ function nowIso() {
9
+ return new Date().toISOString();
10
+ }
11
+ export function handleRegisterInstance(store, args) {
12
+ if (!args || typeof args.registration !== "object" || args.registration === null) {
13
+ return { error: "h2a_register_instance: missing 'registration' object" };
14
+ }
15
+ try {
16
+ store.registerInstance(args.registration);
17
+ return { ok: true, instance: args.registration.id };
18
+ }
19
+ catch (err) {
20
+ return safeError(err);
21
+ }
22
+ }
23
+ export function handleDiscoverInstances(store, args) {
24
+ try {
25
+ let instances = store.listInstances();
26
+ if (args?.role) {
27
+ const wanted = args.role;
28
+ instances = instances.filter((reg) => reg.roles.includes(wanted));
29
+ }
30
+ if (args?.scope) {
31
+ const wanted = args.scope;
32
+ instances = instances.filter((reg) => reg.scopes.includes(wanted));
33
+ }
34
+ return { instances };
35
+ }
36
+ catch (err) {
37
+ return safeError(err);
38
+ }
39
+ }
40
+ export function handleInbox(store, args) {
41
+ if (!args || typeof args.instance !== "string" || args.instance.length === 0) {
42
+ return { error: "h2a_inbox: missing 'instance'" };
43
+ }
44
+ try {
45
+ switch (args.action) {
46
+ case "read":
47
+ return { envelopes: store.readInbox(args.instance) };
48
+ case "put": {
49
+ if (!args.envelope)
50
+ return { error: "h2a_inbox put: missing 'envelope'" };
51
+ store.putInboxMessage(args.instance, args.envelope);
52
+ return { ok: true, envelopeId: args.envelope.id };
53
+ }
54
+ case "pop": {
55
+ if (typeof args.envelopeId !== "string" || args.envelopeId.length === 0) {
56
+ return { error: "h2a_inbox pop: missing 'envelopeId'" };
57
+ }
58
+ const envelope = store.popInboxMessage(args.instance, args.envelopeId);
59
+ if (!envelope) {
60
+ return { error: `h2a_inbox pop: no envelope ${args.envelopeId} for ${args.instance}` };
61
+ }
62
+ return { envelope };
63
+ }
64
+ default:
65
+ return {
66
+ error: `h2a_inbox: unknown action '${String(args.action)}', expected read|put|pop`
67
+ };
68
+ }
69
+ }
70
+ catch (err) {
71
+ return safeError(err);
72
+ }
73
+ }
74
+ export function handleAppendJournal(store, args) {
75
+ if (!args || typeof args.negotiationId !== "string" || args.negotiationId.length === 0) {
76
+ return { error: "h2a_append_journal: missing 'negotiationId'" };
77
+ }
78
+ if (!args.payload || typeof args.payload !== "object") {
79
+ return { error: "h2a_append_journal: missing 'payload'" };
80
+ }
81
+ try {
82
+ const entry = store.appendNegotiationEvent(args.negotiationId, args.payload);
83
+ return { entry };
84
+ }
85
+ catch (err) {
86
+ return safeError(err);
87
+ }
88
+ }
89
+ export function handleOpenNegotiation(store, args) {
90
+ if (!args || typeof args.record !== "object" || args.record === null) {
91
+ return { error: "h2a_open_negotiation: missing 'record' object" };
92
+ }
93
+ try {
94
+ const persisted = store.openNegotiation(args.record);
95
+ return { record: persisted };
96
+ }
97
+ catch (err) {
98
+ return safeError(err);
99
+ }
100
+ }
101
+ /**
102
+ * Resolve causation/correlation for an MCP-driven journal append, mirroring
103
+ * the CLI semantics (DEC-033): explicit args always win, otherwise inherit
104
+ * from the previous journal entry — `causationId` defaults to the previous
105
+ * entry's `id`, `correlationId` is propagated as-is.
106
+ */
107
+ function resolveChain(store, negotiationId, explicit) {
108
+ const entries = store.readNegotiationJournal(negotiationId);
109
+ const previous = entries[entries.length - 1];
110
+ const out = {};
111
+ if (explicit.causationId) {
112
+ out.causationId = explicit.causationId;
113
+ }
114
+ else if (previous) {
115
+ out.causationId = previous.id;
116
+ }
117
+ if (explicit.correlationId) {
118
+ out.correlationId = explicit.correlationId;
119
+ }
120
+ else if (previous && previous.correlationId !== undefined) {
121
+ out.correlationId = previous.correlationId;
122
+ }
123
+ return out;
124
+ }
125
+ function handleOfferLike(store, toolName, args) {
126
+ if (!args || typeof args.negotiationId !== "string" || args.negotiationId.length === 0) {
127
+ return { error: `${toolName}: missing 'negotiationId'` };
128
+ }
129
+ if (typeof args.instance !== "string" || args.instance.length === 0) {
130
+ return { error: `${toolName}: missing 'instance'` };
131
+ }
132
+ if (args.artifact === undefined) {
133
+ return { error: `${toolName}: missing 'artifact'` };
134
+ }
135
+ const record = store.readNegotiation(args.negotiationId);
136
+ if (!record) {
137
+ return { error: `${toolName}: negotiation ${args.negotiationId} not found` };
138
+ }
139
+ const type = toolName === "h2a_offer" ? "propose" : "counter";
140
+ const chain = resolveChain(store, args.negotiationId, {
141
+ causationId: args.causationId,
142
+ correlationId: args.correlationId
143
+ });
144
+ const payload = {
145
+ id: args.eventId ?? `evt-${type}-${Date.now().toString(36)}`,
146
+ type,
147
+ actor: { instance: args.instance, role: "CONDUCTOR", scope: record.scope },
148
+ body: { artifact: args.artifact },
149
+ createdAt: nowIso(),
150
+ ...chain
151
+ };
152
+ try {
153
+ const entry = store.appendNegotiationEvent(args.negotiationId, payload);
154
+ return { entry };
155
+ }
156
+ catch (err) {
157
+ return safeError(err);
158
+ }
159
+ }
160
+ export function handleOffer(store, args) {
161
+ return handleOfferLike(store, "h2a_offer", args);
162
+ }
163
+ export function handleCounteroffer(store, args) {
164
+ return handleOfferLike(store, "h2a_counteroffer", args);
165
+ }
166
+ export function handleSign(store, args) {
167
+ if (!args || typeof args.negotiationId !== "string" || args.negotiationId.length === 0) {
168
+ return { error: "h2a_sign: missing 'negotiationId'" };
169
+ }
170
+ if (typeof args.instance !== "string" || args.instance.length === 0) {
171
+ return { error: "h2a_sign: missing 'instance'" };
172
+ }
173
+ if (args.artifact === undefined) {
174
+ return { error: "h2a_sign: missing 'artifact'" };
175
+ }
176
+ if (typeof args.privateKeyPem !== "string" || args.privateKeyPem.length === 0) {
177
+ return { error: "h2a_sign: missing 'privateKeyPem'" };
178
+ }
179
+ const record = store.readNegotiation(args.negotiationId);
180
+ if (!record) {
181
+ return { error: `h2a_sign: negotiation ${args.negotiationId} not found` };
182
+ }
183
+ try {
184
+ const artifactHash = computeHash(args.artifact);
185
+ const signature = signCanonical({ artifactHash }, { by: args.instance, privateKeyPem: args.privateKeyPem });
186
+ const chain = resolveChain(store, args.negotiationId, {
187
+ causationId: args.causationId,
188
+ correlationId: args.correlationId
189
+ });
190
+ const payload = {
191
+ id: args.eventId ?? `evt-sign-${Date.now().toString(36)}`,
192
+ type: "event",
193
+ actor: { instance: args.instance, role: "CONDUCTOR", scope: record.scope },
194
+ body: { kind: "signature", artifactHash, signature },
195
+ createdAt: nowIso(),
196
+ ...chain
197
+ };
198
+ const entry = store.appendNegotiationEvent(args.negotiationId, payload);
199
+ return { entry };
200
+ }
201
+ catch (err) {
202
+ return safeError(err);
203
+ }
204
+ }
205
+ export function handleStabilize(store, args) {
206
+ if (!args || typeof args.negotiationId !== "string" || args.negotiationId.length === 0) {
207
+ return { error: "h2a_stabilize: missing 'negotiationId'" };
208
+ }
209
+ try {
210
+ const result = store.stabilizeNegotiation(args.negotiationId, { eventId: args.eventId });
211
+ return {
212
+ record: result.record,
213
+ artifactHash: result.artifactHash,
214
+ signers: result.signers,
215
+ artifactPath: result.artifactPath,
216
+ finalEvent: { id: result.finalEvent.id, sequence: result.finalEvent.sequence }
217
+ };
218
+ }
219
+ catch (err) {
220
+ return safeError(err);
221
+ }
222
+ }
223
+ export function handleEscalate(store, args) {
224
+ if (!args || typeof args.negotiationId !== "string" || args.negotiationId.length === 0) {
225
+ return { error: "h2a_escalate: missing 'negotiationId'" };
226
+ }
227
+ if (typeof args.instance !== "string" || args.instance.length === 0) {
228
+ return { error: "h2a_escalate: missing 'instance'" };
229
+ }
230
+ if (typeof args.channel !== "string" || !ESCALATION_CHANNELS.has(args.channel)) {
231
+ return { error: "h2a_escalate: channel must be advise|decide|alert" };
232
+ }
233
+ const record = store.readNegotiation(args.negotiationId);
234
+ if (!record) {
235
+ return { error: `h2a_escalate: negotiation ${args.negotiationId} not found` };
236
+ }
237
+ const channel = args.channel;
238
+ const chain = resolveChain(store, args.negotiationId, {
239
+ causationId: args.causationId,
240
+ correlationId: args.correlationId
241
+ });
242
+ const payload = {
243
+ id: `evt-escalate-${Date.now().toString(36)}`,
244
+ type: "escalate",
245
+ actor: { instance: args.instance, role: "MANDATAIRE", scope: record.scope },
246
+ body: { kind: "escalation", channel, payload: args.payload ?? null },
247
+ createdAt: nowIso(),
248
+ ...chain
249
+ };
250
+ try {
251
+ const entry = store.appendNegotiationEvent(args.negotiationId, payload);
252
+ return { entry };
253
+ }
254
+ catch (err) {
255
+ return safeError(err);
256
+ }
257
+ }
258
+ export function notImplemented(toolName) {
259
+ return { error: `${toolName}: not implemented in this slice` };
260
+ }
261
+ //# sourceMappingURL=handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../../src/runtime/mcp/handlers.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,aAAa,EAMd,MAAM,gBAAgB,CAAC;AAYxB,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;AAEnE,SAAS,SAAS,CAAC,MAAe;IAChC,IAAI,MAAM,YAAY,KAAK;QAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;IAC9D,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;AACnC,CAAC;AAED,SAAS,MAAM;IACb,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,KAAiB,EACjB,IAAyD;IAEzD,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ,IAAI,IAAI,CAAC,YAAY,KAAK,IAAI,EAAE,CAAC;QACjF,OAAO,EAAE,KAAK,EAAE,sDAAsD,EAAE,CAAC;IAC3E,CAAC;IACD,IAAI,CAAC;QACH,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC1C,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC;IACtD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,KAAiB,EACjB,IAAoD;IAEpD,IAAI,CAAC;QACH,IAAI,SAAS,GAAG,KAAK,CAAC,aAAa,EAAE,CAAC;QACtC,IAAI,IAAI,EAAE,IAAI,EAAE,CAAC;YACf,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC;YACzB,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QACpE,CAAC;QACD,IAAI,IAAI,EAAE,KAAK,EAAE,CAAC;YAChB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC;YAC1B,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QACrE,CAAC;QACD,OAAO,EAAE,SAAS,EAAE,CAAC;IACvB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,KAAiB,EACjB,IAOa;IAEb,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7E,OAAO,EAAE,KAAK,EAAE,+BAA+B,EAAE,CAAC;IACpD,CAAC;IACD,IAAI,CAAC;QACH,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;YACpB,KAAK,MAAM;gBACT,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACvD,KAAK,KAAK,CAAC,CAAC,CAAC;gBACX,IAAI,CAAC,IAAI,CAAC,QAAQ;oBAAE,OAAO,EAAE,KAAK,EAAE,mCAAmC,EAAE,CAAC;gBAC1E,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACpD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACpD,CAAC;YACD,KAAK,KAAK,CAAC,CAAC,CAAC;gBACX,IAAI,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACxE,OAAO,EAAE,KAAK,EAAE,qCAAqC,EAAE,CAAC;gBAC1D,CAAC;gBACD,MAAM,QAAQ,GAAG,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;gBACvE,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,OAAO,EAAE,KAAK,EAAE,8BAA8B,IAAI,CAAC,UAAU,QAAQ,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;gBACzF,CAAC;gBACD,OAAO,EAAE,QAAQ,EAAE,CAAC;YACtB,CAAC;YACD;gBACE,OAAO;oBACL,KAAK,EAAE,8BAA8B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,0BAA0B;iBACnF,CAAC;QACN,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,KAAiB,EACjB,IAAkF;IAElF,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,aAAa,KAAK,QAAQ,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvF,OAAO,EAAE,KAAK,EAAE,6CAA6C,EAAE,CAAC;IAClE,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACtD,OAAO,EAAE,KAAK,EAAE,uCAAuC,EAAE,CAAC;IAC5D,CAAC;IACD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,KAAK,CAAC,sBAAsB,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7E,OAAO,EAAE,KAAK,EAAE,CAAC;IACnB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,KAAiB,EACjB,IAAmD;IAEnD,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QACrE,OAAO,EAAE,KAAK,EAAE,+CAA+C,EAAE,CAAC;IACpE,CAAC;IACD,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC/B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;AACH,CAAC;AAWD;;;;;GAKG;AACH,SAAS,YAAY,CACnB,KAAiB,EACjB,aAAqB,EACrB,QAA0D;IAE1D,MAAM,OAAO,GAAG,KAAK,CAAC,sBAAsB,CAAC,aAAa,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAE9B,CAAC;IACd,MAAM,GAAG,GAAqD,EAAE,CAAC;IACjE,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;QACzB,GAAG,CAAC,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC;IACzC,CAAC;SAAM,IAAI,QAAQ,EAAE,CAAC;QACpB,GAAG,CAAC,WAAW,GAAG,QAAQ,CAAC,EAAE,CAAC;IAChC,CAAC;IACD,IAAI,QAAQ,CAAC,aAAa,EAAE,CAAC;QAC3B,GAAG,CAAC,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC;IAC7C,CAAC;SAAM,IAAI,QAAQ,IAAI,QAAQ,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;QAC5D,GAAG,CAAC,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC;IAC7C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,eAAe,CACtB,KAAiB,EACjB,QAA0C,EAC1C,IAA+B;IAE/B,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,aAAa,KAAK,QAAQ,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvF,OAAO,EAAE,KAAK,EAAE,GAAG,QAAQ,2BAA2B,EAAE,CAAC;IAC3D,CAAC;IACD,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpE,OAAO,EAAE,KAAK,EAAE,GAAG,QAAQ,sBAAsB,EAAE,CAAC;IACtD,CAAC;IACD,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,EAAE,KAAK,EAAE,GAAG,QAAQ,sBAAsB,EAAE,CAAC;IACtD,CAAC;IACD,MAAM,MAAM,GAAG,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACzD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,KAAK,EAAE,GAAG,QAAQ,iBAAiB,IAAI,CAAC,aAAa,YAAY,EAAE,CAAC;IAC/E,CAAC;IACD,MAAM,IAAI,GAAG,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9D,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE;QACpD,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,aAAa,EAAE,IAAI,CAAC,aAAa;KAClC,CAAC,CAAC;IACH,MAAM,OAAO,GAA6C;QACxD,EAAE,EAAE,IAAI,CAAC,OAAO,IAAI,OAAO,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;QAC5D,IAAI;QACJ,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE;QAC1E,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;QACjC,SAAS,EAAE,MAAM,EAAE;QACnB,GAAG,KAAK;KACT,CAAC;IACF,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,KAAK,CAAC,sBAAsB,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QACxE,OAAO,EAAE,KAAK,EAAE,CAAC;IACnB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,KAAiB,EACjB,IAA+B;IAE/B,OAAO,eAAe,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,KAAiB,EACjB,IAA+B;IAE/B,OAAO,eAAe,CAAC,KAAK,EAAE,kBAAkB,EAAE,IAAI,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,UAAU,CACxB,KAAiB,EACjB,IAUa;IAEb,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,aAAa,KAAK,QAAQ,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvF,OAAO,EAAE,KAAK,EAAE,mCAAmC,EAAE,CAAC;IACxD,CAAC;IACD,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpE,OAAO,EAAE,KAAK,EAAE,8BAA8B,EAAE,CAAC;IACnD,CAAC;IACD,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,EAAE,KAAK,EAAE,8BAA8B,EAAE,CAAC;IACnD,CAAC;IACD,IAAI,OAAO,IAAI,CAAC,aAAa,KAAK,QAAQ,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9E,OAAO,EAAE,KAAK,EAAE,mCAAmC,EAAE,CAAC;IACxD,CAAC;IACD,MAAM,MAAM,GAAG,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACzD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,KAAK,EAAE,yBAAyB,IAAI,CAAC,aAAa,YAAY,EAAE,CAAC;IAC5E,CAAC;IACD,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,SAAS,GAAG,aAAa,CAC7B,EAAE,YAAY,EAAE,EAChB,EAAE,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,CACzD,CAAC;QACF,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE;YACpD,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,aAAa,EAAE,IAAI,CAAC,aAAa;SAClC,CAAC,CAAC;QACH,MAAM,OAAO,GAIR;YACH,EAAE,EAAE,IAAI,CAAC,OAAO,IAAI,YAAY,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;YACzD,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE;YAC1E,IAAI,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE;YACpD,SAAS,EAAE,MAAM,EAAE;YACnB,GAAG,KAAK;SACT,CAAC;QACF,MAAM,KAAK,GAAG,KAAK,CAAC,sBAAsB,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QACxE,OAAO,EAAE,KAAK,EAAE,CAAC;IACnB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,KAAiB,EACjB,IAA8D;IAE9D,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,aAAa,KAAK,QAAQ,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvF,OAAO,EAAE,KAAK,EAAE,wCAAwC,EAAE,CAAC;IAC7D,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,KAAK,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QACzF,OAAO;YACL,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,UAAU,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE;SAC/E,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,KAAiB,EACjB,IASa;IAEb,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,aAAa,KAAK,QAAQ,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvF,OAAO,EAAE,KAAK,EAAE,uCAAuC,EAAE,CAAC;IAC5D,CAAC;IACD,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpE,OAAO,EAAE,KAAK,EAAE,kCAAkC,EAAE,CAAC;IACvD,CAAC;IACD,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/E,OAAO,EAAE,KAAK,EAAE,mDAAmD,EAAE,CAAC;IACxE,CAAC;IACD,MAAM,MAAM,GAAG,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACzD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,KAAK,EAAE,6BAA6B,IAAI,CAAC,aAAa,YAAY,EAAE,CAAC;IAChF,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAwC,CAAC;IAC9D,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE;QACpD,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,aAAa,EAAE,IAAI,CAAC,aAAa;KAClC,CAAC,CAAC;IACH,MAAM,OAAO,GAIR;QACH,EAAE,EAAE,gBAAgB,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;QAC7C,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE;QAC3E,IAAI,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI,EAAE;QACpE,SAAS,EAAE,MAAM,EAAE;QACnB,GAAG,KAAK;KACT,CAAC;IACF,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,KAAK,CAAC,sBAAsB,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QACxE,OAAO,EAAE,KAAK,EAAE,CAAC;IACnB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,OAAO,EAAE,KAAK,EAAE,GAAG,QAAQ,iCAAiC,EAAE,CAAC;AACjE,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { createMcpServer, type CreateMcpServerOptions, type McpServer } from "./server.js";
2
+ export { H2A_CLI_MCP_TOOL_DESCRIPTORS, type McpToolDescriptor, type McpToolName } from "./tools.js";
3
+ export { type McpErrorResult, type McpToolResult } from "./handlers.js";
4
+ export { runMcpStdio, type RunMcpStdioOptions } from "./stdio.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/runtime/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,KAAK,sBAAsB,EAC3B,KAAK,SAAS,EACf,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,4BAA4B,EAC5B,KAAK,iBAAiB,EACtB,KAAK,WAAW,EACjB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,WAAW,EAAE,KAAK,kBAAkB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { createMcpServer } from "./server.js";
2
+ export { H2A_CLI_MCP_TOOL_DESCRIPTORS } from "./tools.js";
3
+ export {} from "./handlers.js";
4
+ export { runMcpStdio } from "./stdio.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/runtime/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EAGhB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,4BAA4B,EAG7B,MAAM,YAAY,CAAC;AAEpB,OAAO,EAGN,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,WAAW,EAA2B,MAAM,YAAY,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { type LocalStore } from "../local-files/store.js";
2
+ import { type McpErrorResult, type McpToolResult } from "./handlers.js";
3
+ import { type McpToolDescriptor } from "./tools.js";
4
+ export interface CreateMcpServerOptions {
5
+ /** Filesystem root for the backing local-files store. */
6
+ root: string;
7
+ /**
8
+ * Optional pre-built store. If omitted, the server creates one with
9
+ * `createLocalStore({ root })`. Useful for tests that want to share state
10
+ * with the CLI.
11
+ */
12
+ store?: LocalStore;
13
+ }
14
+ export interface McpServer {
15
+ listTools(): McpToolDescriptor[];
16
+ callTool(name: string, args: Record<string, unknown> | undefined): McpToolResult | McpErrorResult;
17
+ }
18
+ /**
19
+ * Build an in-process MCP server backed by the local-files runtime.
20
+ *
21
+ * This is intentionally NOT a JSON-RPC / stdio transport. It exposes a
22
+ * minimal `{ listTools, callTool }` surface so the same dispatch can be
23
+ * unit-tested today and wrapped in a real MCP transport in a later slice.
24
+ */
25
+ export declare function createMcpServer(options: CreateMcpServerOptions): McpServer;
26
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/runtime/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAE5E,OAAO,EAWL,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,eAAe,CAAC;AACvB,OAAO,EAEL,KAAK,iBAAiB,EAEvB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,sBAAsB;IACrC,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,KAAK,CAAC,EAAE,UAAU,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,SAAS,IAAI,iBAAiB,EAAE,CAAC;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,aAAa,GAAG,cAAc,CAAC;CACnG;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,SAAS,CAsC1E"}
@@ -0,0 +1,45 @@
1
+ import { createLocalStore } from "../local-files/store.js";
2
+ import { handleAppendJournal, handleCounteroffer, handleDiscoverInstances, handleEscalate, handleInbox, handleOffer, handleOpenNegotiation, handleRegisterInstance, handleSign, handleStabilize } from "./handlers.js";
3
+ import { H2A_CLI_MCP_TOOL_DESCRIPTORS } from "./tools.js";
4
+ /**
5
+ * Build an in-process MCP server backed by the local-files runtime.
6
+ *
7
+ * This is intentionally NOT a JSON-RPC / stdio transport. It exposes a
8
+ * minimal `{ listTools, callTool }` surface so the same dispatch can be
9
+ * unit-tested today and wrapped in a real MCP transport in a later slice.
10
+ */
11
+ export function createMcpServer(options) {
12
+ const store = options.store ?? createLocalStore({ root: options.root });
13
+ function callTool(name, args) {
14
+ const toolName = name;
15
+ switch (toolName) {
16
+ case "h2a_register_instance":
17
+ return handleRegisterInstance(store, args);
18
+ case "h2a_discover_instances":
19
+ return handleDiscoverInstances(store, args);
20
+ case "h2a_inbox":
21
+ return handleInbox(store, args);
22
+ case "h2a_append_journal":
23
+ return handleAppendJournal(store, args);
24
+ case "h2a_open_negotiation":
25
+ return handleOpenNegotiation(store, args);
26
+ case "h2a_offer":
27
+ return handleOffer(store, args);
28
+ case "h2a_counteroffer":
29
+ return handleCounteroffer(store, args);
30
+ case "h2a_sign":
31
+ return handleSign(store, args);
32
+ case "h2a_stabilize":
33
+ return handleStabilize(store, args);
34
+ case "h2a_escalate":
35
+ return handleEscalate(store, args);
36
+ default:
37
+ return { error: `unknown tool: ${name}` };
38
+ }
39
+ }
40
+ return {
41
+ listTools: () => H2A_CLI_MCP_TOOL_DESCRIPTORS.slice(),
42
+ callTool
43
+ };
44
+ }
45
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/runtime/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAmB,MAAM,yBAAyB,CAAC;AAE5E,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,uBAAuB,EACvB,cAAc,EACd,WAAW,EACX,WAAW,EACX,qBAAqB,EACrB,sBAAsB,EACtB,UAAU,EACV,eAAe,EAGhB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,4BAA4B,EAG7B,MAAM,YAAY,CAAC;AAkBpB;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,OAA+B;IAC7D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,gBAAgB,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAExE,SAAS,QAAQ,CACf,IAAY,EACZ,IAAyC;QAEzC,MAAM,QAAQ,GAAG,IAAmB,CAAC;QACrC,QAAQ,QAAQ,EAAE,CAAC;YACjB,KAAK,uBAAuB;gBAC1B,OAAO,sBAAsB,CAAC,KAAK,EAAE,IAAa,CAAC,CAAC;YACtD,KAAK,wBAAwB;gBAC3B,OAAO,uBAAuB,CAAC,KAAK,EAAE,IAAa,CAAC,CAAC;YACvD,KAAK,WAAW;gBACd,OAAO,WAAW,CAAC,KAAK,EAAE,IAAa,CAAC,CAAC;YAC3C,KAAK,oBAAoB;gBACvB,OAAO,mBAAmB,CAAC,KAAK,EAAE,IAAa,CAAC,CAAC;YACnD,KAAK,sBAAsB;gBACzB,OAAO,qBAAqB,CAAC,KAAK,EAAE,IAAa,CAAC,CAAC;YACrD,KAAK,WAAW;gBACd,OAAO,WAAW,CAAC,KAAK,EAAE,IAAa,CAAC,CAAC;YAC3C,KAAK,kBAAkB;gBACrB,OAAO,kBAAkB,CAAC,KAAK,EAAE,IAAa,CAAC,CAAC;YAClD,KAAK,UAAU;gBACb,OAAO,UAAU,CAAC,KAAK,EAAE,IAAa,CAAC,CAAC;YAC1C,KAAK,eAAe;gBAClB,OAAO,eAAe,CAAC,KAAK,EAAE,IAAa,CAAC,CAAC;YAC/C,KAAK,cAAc;gBACjB,OAAO,cAAc,CAAC,KAAK,EAAE,IAAa,CAAC,CAAC;YAC9C;gBACE,OAAO,EAAE,KAAK,EAAE,iBAAiB,IAAI,EAAE,EAAE,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,OAAO;QACL,SAAS,EAAE,GAAG,EAAE,CAAC,4BAA4B,CAAC,KAAK,EAAE;QACrD,QAAQ;KACT,CAAC;AACJ,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { Readable, Writable } from "node:stream";
2
+ export interface RunMcpStdioOptions {
3
+ /** Filesystem root for the local-files store. */
4
+ root: string;
5
+ /** Readable stream of newline-delimited JSON-RPC requests. */
6
+ stdin: Readable;
7
+ /** Writable stream for newline-delimited JSON-RPC responses. */
8
+ stdout: Writable;
9
+ /** Writable stream for diagnostics (never used for protocol traffic). */
10
+ stderr: Writable;
11
+ }
12
+ /**
13
+ * Run the MCP server over a JSON-RPC 2.0 newline-delimited stdio transport.
14
+ *
15
+ * Reads requests from `stdin`, writes responses to `stdout` (one per line),
16
+ * uses `stderr` for diagnostics only. Resolves once `stdin` reaches EOF.
17
+ * A malformed line or a tool-dispatch throw never crashes the loop: each
18
+ * is reported as a structured JSON-RPC error response.
19
+ */
20
+ export declare function runMcpStdio(options: RunMcpStdioOptions): Promise<void>;
21
+ //# sourceMappingURL=stdio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdio.d.ts","sourceRoot":"","sources":["../../../src/runtime/mcp/stdio.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AA8BtD,MAAM,WAAW,kBAAkB;IACjC,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,8DAA8D;IAC9D,KAAK,EAAE,QAAQ,CAAC;IAChB,gEAAgE;IAChE,MAAM,EAAE,QAAQ,CAAC;IACjB,yEAAyE;IACzE,MAAM,EAAE,QAAQ,CAAC;CAClB;AAmED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyDtE"}
@@ -0,0 +1,103 @@
1
+ import { createInterface } from "node:readline";
2
+ import { createMcpServer } from "./server.js";
3
+ const PROTOCOL_VERSION = "2025-06-18";
4
+ const SERVER_NAME = "@sentropic/h2a-cli";
5
+ const SERVER_VERSION = "0.1.1";
6
+ function writeResponse(stdout, response) {
7
+ stdout.write(`${JSON.stringify(response)}\n`);
8
+ }
9
+ function errorResponse(id, code, message, data) {
10
+ const error = { code, message };
11
+ if (data !== undefined)
12
+ error.data = data;
13
+ return { jsonrpc: "2.0", id, error };
14
+ }
15
+ function successResponse(id, result) {
16
+ return { jsonrpc: "2.0", id, result };
17
+ }
18
+ function handleMethod(server, method, params) {
19
+ if (method === "initialize") {
20
+ return {
21
+ protocolVersion: PROTOCOL_VERSION,
22
+ serverInfo: { name: SERVER_NAME, version: SERVER_VERSION },
23
+ capabilities: { tools: {} }
24
+ };
25
+ }
26
+ if (method === "tools/list") {
27
+ return { tools: server.listTools() };
28
+ }
29
+ if (method === "tools/call") {
30
+ const p = (params ?? {});
31
+ const name = typeof p.name === "string" ? p.name : "";
32
+ const args = p.arguments && typeof p.arguments === "object"
33
+ ? p.arguments
34
+ : {};
35
+ const result = server.callTool(name, args);
36
+ const isError = Boolean(result && typeof result === "object" && "error" in result);
37
+ return {
38
+ content: [{ type: "text", text: JSON.stringify(result) }],
39
+ isError
40
+ };
41
+ }
42
+ // Sentinel: the caller will map this to JSON-RPC -32601.
43
+ throw new MethodNotFoundError(method);
44
+ }
45
+ class MethodNotFoundError extends Error {
46
+ method;
47
+ constructor(method) {
48
+ super(`Method not found: ${method}`);
49
+ this.method = method;
50
+ this.name = "MethodNotFoundError";
51
+ }
52
+ }
53
+ /**
54
+ * Run the MCP server over a JSON-RPC 2.0 newline-delimited stdio transport.
55
+ *
56
+ * Reads requests from `stdin`, writes responses to `stdout` (one per line),
57
+ * uses `stderr` for diagnostics only. Resolves once `stdin` reaches EOF.
58
+ * A malformed line or a tool-dispatch throw never crashes the loop: each
59
+ * is reported as a structured JSON-RPC error response.
60
+ */
61
+ export function runMcpStdio(options) {
62
+ const { root, stdin, stdout, stderr } = options;
63
+ const server = createMcpServer({ root });
64
+ const rl = createInterface({ input: stdin, crlfDelay: Infinity });
65
+ stdin.ref?.();
66
+ stdin.resume();
67
+ return new Promise((resolve, reject) => {
68
+ rl.on("line", (line) => {
69
+ const trimmed = line.trim();
70
+ if (trimmed.length === 0)
71
+ return;
72
+ let request;
73
+ try {
74
+ request = JSON.parse(trimmed);
75
+ }
76
+ catch (err) {
77
+ const message = err instanceof Error ? err.message : String(err);
78
+ writeResponse(stdout, errorResponse(null, -32700, "Parse error", message));
79
+ return;
80
+ }
81
+ if (request.jsonrpc !== "2.0" || typeof request.method !== "string") {
82
+ writeResponse(stdout, errorResponse(request.id ?? null, -32600, "Invalid Request"));
83
+ return;
84
+ }
85
+ try {
86
+ const result = handleMethod(server, request.method, request.params);
87
+ writeResponse(stdout, successResponse(request.id ?? null, result));
88
+ }
89
+ catch (err) {
90
+ if (err instanceof MethodNotFoundError) {
91
+ writeResponse(stdout, errorResponse(request.id ?? null, -32601, `Method not found: ${err.method}`));
92
+ return;
93
+ }
94
+ const message = err instanceof Error ? err.message : String(err);
95
+ stderr.write(`h2a mcp-serve: internal error: ${message}\n`);
96
+ writeResponse(stdout, errorResponse(request.id ?? null, -32603, `Internal error: ${message}`));
97
+ }
98
+ });
99
+ rl.on("close", () => resolve());
100
+ rl.on("error", (err) => reject(err));
101
+ });
102
+ }
103
+ //# sourceMappingURL=stdio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdio.js","sourceRoot":"","sources":["../../../src/runtime/mcp/stdio.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { H2A_CLI_MCP_TOOL_NAMES } from "../../mcp.js";
2
+ export type McpToolName = (typeof H2A_CLI_MCP_TOOL_NAMES)[number];
3
+ export interface McpToolDescriptor {
4
+ name: McpToolName;
5
+ description: string;
6
+ inputSchema: {
7
+ type: "object";
8
+ properties: Record<string, unknown>;
9
+ required?: string[];
10
+ additionalProperties?: boolean;
11
+ };
12
+ }
13
+ /**
14
+ * Canonical tool descriptors for the in-process MCP server. Schemas are
15
+ * intentionally permissive — wire-level validation lives in the store /
16
+ * @sentropic/h2a invariants, not in the MCP shim.
17
+ */
18
+ export declare const H2A_CLI_MCP_TOOL_DESCRIPTORS: McpToolDescriptor[];
19
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/runtime/mcp/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAEtD,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC;AAElE,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,WAAW,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACpC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,oBAAoB,CAAC,EAAE,OAAO,CAAC;KAChC,CAAC;CACH;AAED;;;;GAIG;AACH,eAAO,MAAM,4BAA4B,EAAE,iBAAiB,EAmL3D,CAAC"}