@agent-loom/loom 1.0.1 → 1.0.3

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 (145) hide show
  1. package/README.md +69 -0
  2. package/dist/acp/client.d.ts +182 -0
  3. package/dist/acp/client.d.ts.map +1 -0
  4. package/dist/acp/client.js +432 -0
  5. package/dist/acp/client.js.map +1 -0
  6. package/dist/acp/index.d.ts +5 -0
  7. package/dist/acp/index.d.ts.map +1 -0
  8. package/dist/acp/index.js +3 -0
  9. package/dist/acp/index.js.map +1 -0
  10. package/dist/acp/run.d.ts +41 -0
  11. package/dist/acp/run.d.ts.map +1 -0
  12. package/dist/acp/run.js +32 -0
  13. package/dist/acp/run.js.map +1 -0
  14. package/dist/apply.d.ts +17 -6
  15. package/dist/apply.d.ts.map +1 -1
  16. package/dist/apply.js +85 -47
  17. package/dist/apply.js.map +1 -1
  18. package/dist/chat/chat.d.ts +108 -0
  19. package/dist/chat/chat.d.ts.map +1 -0
  20. package/dist/chat/chat.js +221 -0
  21. package/dist/chat/chat.js.map +1 -0
  22. package/dist/chat/discovery.d.ts +30 -0
  23. package/dist/chat/discovery.d.ts.map +1 -0
  24. package/dist/chat/discovery.js +68 -0
  25. package/dist/chat/discovery.js.map +1 -0
  26. package/dist/chat/frontmatter.d.ts +12 -0
  27. package/dist/chat/frontmatter.d.ts.map +1 -0
  28. package/dist/chat/frontmatter.js +11 -0
  29. package/dist/chat/frontmatter.js.map +1 -0
  30. package/dist/chat/index.d.ts +16 -0
  31. package/dist/chat/index.d.ts.map +1 -0
  32. package/dist/chat/index.js +11 -0
  33. package/dist/chat/index.js.map +1 -0
  34. package/dist/chat/registry.d.ts +73 -0
  35. package/dist/chat/registry.d.ts.map +1 -0
  36. package/dist/chat/registry.js +118 -0
  37. package/dist/chat/registry.js.map +1 -0
  38. package/dist/chat/resolve-agent.d.ts +39 -0
  39. package/dist/chat/resolve-agent.d.ts.map +1 -0
  40. package/dist/chat/resolve-agent.js +36 -0
  41. package/dist/chat/resolve-agent.js.map +1 -0
  42. package/dist/chat/suggest.d.ts +20 -0
  43. package/dist/chat/suggest.d.ts.map +1 -0
  44. package/dist/chat/suggest.js +55 -0
  45. package/dist/chat/suggest.js.map +1 -0
  46. package/dist/cli.js +628 -75
  47. package/dist/cli.js.map +1 -1
  48. package/dist/clone.d.ts +21 -3
  49. package/dist/clone.d.ts.map +1 -1
  50. package/dist/clone.js +240 -12
  51. package/dist/clone.js.map +1 -1
  52. package/dist/copilot/mcp.d.ts +48 -0
  53. package/dist/copilot/mcp.d.ts.map +1 -0
  54. package/dist/copilot/mcp.js +146 -0
  55. package/dist/copilot/mcp.js.map +1 -0
  56. package/dist/copilot/resolve.d.ts +33 -0
  57. package/dist/copilot/resolve.d.ts.map +1 -0
  58. package/dist/copilot/resolve.js +96 -0
  59. package/dist/copilot/resolve.js.map +1 -0
  60. package/dist/copilot/spawn.d.ts +51 -0
  61. package/dist/copilot/spawn.d.ts.map +1 -0
  62. package/dist/copilot/spawn.js +132 -0
  63. package/dist/copilot/spawn.js.map +1 -0
  64. package/dist/index.d.ts +19 -0
  65. package/dist/index.d.ts.map +1 -0
  66. package/dist/index.js +15 -0
  67. package/dist/index.js.map +1 -0
  68. package/dist/launch/index.d.ts +10 -0
  69. package/dist/launch/index.d.ts.map +1 -0
  70. package/dist/launch/index.js +9 -0
  71. package/dist/launch/index.js.map +1 -0
  72. package/dist/launch/stage.d.ts +62 -0
  73. package/dist/launch/stage.d.ts.map +1 -0
  74. package/dist/launch/stage.js +108 -0
  75. package/dist/launch/stage.js.map +1 -0
  76. package/dist/manifest.d.ts +165 -18
  77. package/dist/manifest.d.ts.map +1 -1
  78. package/dist/manifest.js +980 -225
  79. package/dist/manifest.js.map +1 -1
  80. package/dist/renderers/claude.d.ts +5 -0
  81. package/dist/renderers/claude.d.ts.map +1 -1
  82. package/dist/renderers/claude.js +17 -3
  83. package/dist/renderers/claude.js.map +1 -1
  84. package/dist/renderers/copilot.d.ts +1 -1
  85. package/dist/renderers/copilot.d.ts.map +1 -1
  86. package/dist/renderers/copilot.js +205 -22
  87. package/dist/renderers/copilot.js.map +1 -1
  88. package/dist/repo-clone.js +17 -11
  89. package/dist/repo-clone.js.map +1 -1
  90. package/dist/resolve-template.d.ts +12 -4
  91. package/dist/resolve-template.d.ts.map +1 -1
  92. package/dist/resolve-template.js +39 -8
  93. package/dist/resolve-template.js.map +1 -1
  94. package/dist/run/index.d.ts +4 -0
  95. package/dist/run/index.d.ts.map +1 -0
  96. package/dist/run/index.js +2 -0
  97. package/dist/run/index.js.map +1 -0
  98. package/dist/run/run.d.ts +143 -0
  99. package/dist/run/run.d.ts.map +1 -0
  100. package/dist/run/run.js +406 -0
  101. package/dist/run/run.js.map +1 -0
  102. package/dist/search-registry.d.ts +10 -3
  103. package/dist/search-registry.d.ts.map +1 -1
  104. package/dist/search-registry.js +16 -16
  105. package/dist/search-registry.js.map +1 -1
  106. package/dist/sessions/index.d.ts +16 -0
  107. package/dist/sessions/index.d.ts.map +1 -0
  108. package/dist/sessions/index.js +15 -0
  109. package/dist/sessions/index.js.map +1 -0
  110. package/dist/sessions/store.d.ts +56 -0
  111. package/dist/sessions/store.d.ts.map +1 -0
  112. package/dist/sessions/store.js +220 -0
  113. package/dist/sessions/store.js.map +1 -0
  114. package/dist/sessions/types.d.ts +62 -0
  115. package/dist/sessions/types.d.ts.map +1 -0
  116. package/dist/sessions/types.js +5 -0
  117. package/dist/sessions/types.js.map +1 -0
  118. package/dist/skill-fetcher.d.ts.map +1 -1
  119. package/dist/skill-fetcher.js +5 -6
  120. package/dist/skill-fetcher.js.map +1 -1
  121. package/dist/types.d.ts +123 -41
  122. package/dist/types.d.ts.map +1 -1
  123. package/dist/types.js +12 -0
  124. package/dist/types.js.map +1 -1
  125. package/dist/util/binary-cache.d.ts +53 -0
  126. package/dist/util/binary-cache.d.ts.map +1 -0
  127. package/dist/util/binary-cache.js +211 -0
  128. package/dist/util/binary-cache.js.map +1 -0
  129. package/dist/util/frontmatter.d.ts +53 -0
  130. package/dist/util/frontmatter.d.ts.map +1 -0
  131. package/dist/util/frontmatter.js +85 -0
  132. package/dist/util/frontmatter.js.map +1 -0
  133. package/dist/util/loom-home.d.ts +19 -0
  134. package/dist/util/loom-home.d.ts.map +1 -0
  135. package/dist/util/loom-home.js +37 -0
  136. package/dist/util/loom-home.js.map +1 -0
  137. package/dist/util/workspace-folder.d.ts +29 -0
  138. package/dist/util/workspace-folder.d.ts.map +1 -0
  139. package/dist/util/workspace-folder.js +43 -0
  140. package/dist/util/workspace-folder.js.map +1 -0
  141. package/dist/validate.d.ts +7 -1
  142. package/dist/validate.d.ts.map +1 -1
  143. package/dist/validate.js +90 -17
  144. package/dist/validate.js.map +1 -1
  145. package/package.json +31 -2
@@ -0,0 +1,432 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { Writable, Readable } from 'node:stream';
3
+ import { readFile, writeFile } from 'node:fs/promises';
4
+ import { ClientSideConnection, ndJsonStream, } from '@agentclientprotocol/sdk';
5
+ /** Thrown when the child CLI exits or errors while a protocol call is in flight. */
6
+ export class AcpConnectionClosedError extends Error {
7
+ constructor(message) {
8
+ super(message);
9
+ this.name = 'AcpConnectionClosedError';
10
+ }
11
+ }
12
+ /** Thrown when a protocol call exceeds its `timeoutMs` budget. */
13
+ export class AcpTimeoutError extends Error {
14
+ constructor(message) {
15
+ super(message);
16
+ this.name = 'AcpTimeoutError';
17
+ }
18
+ }
19
+ // ============================================================================
20
+ // ACP Client -- manages a single `<cli> --acp` child process over stdio
21
+ // ============================================================================
22
+ /**
23
+ * Drives an Agent Client Protocol (ACP) compatible CLI (e.g. `copilot --acp`)
24
+ * over stdio. Owns the child process, the JSON-RPC connection, and per-session
25
+ * state. One `AcpClient` instance = one child process; create multiple clients
26
+ * to run multiple CLIs in parallel.
27
+ *
28
+ * **Security posture (interim):** the client currently advertises
29
+ * `fs.readTextFile` / `fs.writeTextFile` capabilities unconditionally and
30
+ * auto-allows every `requestPermission`. This is safe for the trusted
31
+ * consumers shipping today (in-tree CLIs and the smoke script) but will not
32
+ * generalise. A pluggable `AcpClientOptions.policy` surface is being designed
33
+ * in serverless-paas-balam/loom#64 and will replace these defaults once the
34
+ * first external consumer lands.
35
+ *
36
+ * Typical flow:
37
+ * const client = new AcpClient('copilot', { agentId: 'my-agent' });
38
+ * await client.connect();
39
+ * const session = await client.newSession('my-agent', cwd, mcpServers);
40
+ * const unsubscribe = client.onSessionUpdate(session.sessionId, (u) => {
41
+ * if (u.type === 'message') process.stdout.write(u.text);
42
+ * });
43
+ * await client.prompt(session.sessionId, 'Investigate X');
44
+ * unsubscribe();
45
+ * client.dispose();
46
+ */
47
+ export class AcpClient {
48
+ process = null;
49
+ connection = null;
50
+ sessions = new Map();
51
+ /** Per-session subscribers for full session update events. */
52
+ updateSubscribers = new Map();
53
+ /**
54
+ * Tracks in-flight protocol calls (`connect`, `newSession`, `loadSession`,
55
+ * `prompt`) so we can reject them if the child process exits or errors
56
+ * before they complete. Without this, any caller awaiting the promise
57
+ * hangs forever on crash.
58
+ */
59
+ inFlight = new Set();
60
+ _isClosed = false;
61
+ cliBin;
62
+ opts;
63
+ /**
64
+ * @param cliBin Path or command name of the ACP-capable CLI (e.g. `copilot`).
65
+ * @param opts Constructor options. For back-compat a bare string in the
66
+ * second position is treated as `additionalMcpConfigPath`.
67
+ */
68
+ constructor(cliBin, opts) {
69
+ this.cliBin = cliBin;
70
+ this.opts = typeof opts === 'string' ? { additionalMcpConfigPath: opts } : (opts ?? {});
71
+ }
72
+ get isClosed() {
73
+ return this._isClosed;
74
+ }
75
+ /**
76
+ * Spawn the CLI with `--acp`, wire up the ACP JSON-RPC stream, and complete
77
+ * protocol initialization. Must be called before any session operation.
78
+ * Throws if the client has already connected or been disposed -- one
79
+ * `AcpClient` instance owns exactly one child process for its lifetime.
80
+ */
81
+ async connect() {
82
+ if (this._isClosed) {
83
+ throw new AcpConnectionClosedError('AcpClient has been disposed; create a new instance');
84
+ }
85
+ if (this.process || this.connection) {
86
+ throw new Error('AcpClient.connect() already called; create a separate AcpClient instance per child process');
87
+ }
88
+ const args = ['--acp'];
89
+ if (this.opts.additionalMcpConfigPath) {
90
+ args.push('--additional-mcp-config', '@' + this.opts.additionalMcpConfigPath);
91
+ }
92
+ if (this.opts.agentId) {
93
+ args.push('--agent', this.opts.agentId);
94
+ }
95
+ this.process = spawn(this.cliBin, args, {
96
+ stdio: ['pipe', 'pipe', 'pipe'],
97
+ env: process.env,
98
+ });
99
+ this.process.stderr?.on('data', (d) => {
100
+ if (process.env.LOOM_ACP_DEBUG) {
101
+ process.stderr.write('[acp] ' + d.toString());
102
+ }
103
+ });
104
+ this.process.on('exit', (code, signal) => {
105
+ this.handleProcessEnd('CLI exited before protocol call completed (code=' + code + ', signal=' + signal + ')');
106
+ });
107
+ this.process.on('error', (err) => {
108
+ this.handleProcessEnd('CLI process error: ' + err.message);
109
+ });
110
+ const output = Writable.toWeb(this.process.stdin);
111
+ const input = Readable.toWeb(this.process.stdout);
112
+ const stream = ndJsonStream(output, input);
113
+ this.connection = new ClientSideConnection((_agent) => this.createClient(), stream);
114
+ // Attach both fulfillment and rejection handlers synchronously in a
115
+ // single `.then(onF, onR)` call so Node doesn't emit
116
+ // PromiseRejectionHandledWarning when `closed` rejects before we've
117
+ // awaited anything (e.g. when the CLI binary is missing).
118
+ this.connection.closed.then(() => this.handleProcessEnd('ACP connection closed'), (err) => this.handleProcessEnd('ACP connection closed: ' + (err instanceof Error ? err.message : String(err))));
119
+ await this.withInFlight(this.connection.initialize({
120
+ protocolVersion: 1,
121
+ clientCapabilities: {
122
+ fs: {
123
+ readTextFile: true,
124
+ writeTextFile: true,
125
+ },
126
+ },
127
+ }), 'initialize');
128
+ }
129
+ /** Create a new session rooted at `cwd` with the given MCP servers. */
130
+ async newSession(agentId, cwd, mcpServers) {
131
+ if (!this.connection || this._isClosed)
132
+ throw new AcpConnectionClosedError('ACP connection not available');
133
+ const result = await this.withInFlight(this.connection.newSession({
134
+ cwd,
135
+ mcpServers: mcpServers.map(mapMcpServer),
136
+ }), 'newSession');
137
+ const session = {
138
+ sessionId: result.sessionId,
139
+ agentId,
140
+ response: '',
141
+ activity: 'Session created',
142
+ plan: [],
143
+ toolCalls: new Map(),
144
+ done: false,
145
+ stopReason: null,
146
+ startTime: Date.now(),
147
+ };
148
+ this.sessions.set(result.sessionId, session);
149
+ return session;
150
+ }
151
+ /**
152
+ * Resume an existing CLI session by ID. Requires `loadSession` capability.
153
+ * Throws on failure -- callers should fall back to `newSession()`.
154
+ */
155
+ async loadSession(sessionId, agentId, cwd, mcpServers) {
156
+ if (!this.connection || this._isClosed)
157
+ throw new AcpConnectionClosedError('ACP connection not available');
158
+ await this.withInFlight(this.connection.loadSession({
159
+ sessionId,
160
+ cwd,
161
+ mcpServers: mcpServers.map(mapMcpServer),
162
+ }), 'loadSession');
163
+ const session = {
164
+ sessionId,
165
+ agentId,
166
+ response: '',
167
+ activity: 'Session resumed',
168
+ plan: [],
169
+ toolCalls: new Map(),
170
+ done: false,
171
+ stopReason: null,
172
+ startTime: Date.now(),
173
+ };
174
+ this.sessions.set(sessionId, session);
175
+ return session;
176
+ }
177
+ /**
178
+ * Send a prompt to an existing session and block until the turn completes.
179
+ * Live deltas arrive via `onSessionUpdate` subscribers during the await.
180
+ * Rejects with `AcpConnectionClosedError` if the child exits mid-turn.
181
+ */
182
+ async prompt(sessionId, text) {
183
+ if (!this.connection || this._isClosed)
184
+ throw new AcpConnectionClosedError('ACP connection not available');
185
+ const session = this.sessions.get(sessionId);
186
+ if (!session)
187
+ throw new Error('Unknown session: ' + sessionId);
188
+ session.response = '';
189
+ session.activity = 'Thinking...';
190
+ session.done = false;
191
+ session.stopReason = null;
192
+ session.startTime = Date.now();
193
+ const result = await this.withInFlight(this.connection.prompt({
194
+ sessionId,
195
+ prompt: [{ type: 'text', text }],
196
+ }), 'prompt');
197
+ session.done = true;
198
+ session.stopReason = result.stopReason;
199
+ return session;
200
+ }
201
+ /** Cancel an in-flight prompt on the given session. Safe if already closed. */
202
+ async cancelSession(sessionId) {
203
+ if (!this.connection || this._isClosed)
204
+ return;
205
+ await this.connection.cancel({ sessionId });
206
+ }
207
+ getSession(sessionId) {
208
+ return this.sessions.get(sessionId);
209
+ }
210
+ /**
211
+ * Subscribe to all session updates (message/thought chunks, tool calls,
212
+ * plans) for one session. Consumers filter by `event.type`.
213
+ */
214
+ onSessionUpdate(sessionId, cb) {
215
+ let subs = this.updateSubscribers.get(sessionId);
216
+ if (!subs) {
217
+ subs = new Set();
218
+ this.updateSubscribers.set(sessionId, subs);
219
+ }
220
+ subs.add(cb);
221
+ return () => {
222
+ const s = this.updateSubscribers.get(sessionId);
223
+ if (!s)
224
+ return;
225
+ s.delete(cb);
226
+ if (s.size === 0)
227
+ this.updateSubscribers.delete(sessionId);
228
+ };
229
+ }
230
+ /** Kill the child process and release all state. Idempotent. */
231
+ dispose() {
232
+ const proc = this.process;
233
+ this.process = null;
234
+ if (proc && proc.exitCode === null && proc.signalCode === null && !proc.killed) {
235
+ proc.kill();
236
+ }
237
+ this.handleProcessEnd('AcpClient disposed');
238
+ this.sessions.clear();
239
+ this.updateSubscribers.clear();
240
+ }
241
+ // ========================================================================
242
+ // Internals
243
+ // ========================================================================
244
+ /**
245
+ * Wrap a protocol promise so that if the child process ends before it
246
+ * settles, the returned promise rejects instead of hanging. When
247
+ * `opts.timeoutMs` is set, also rejects with `AcpTimeoutError` after the
248
+ * configured budget.
249
+ */
250
+ withInFlight(p, label) {
251
+ return new Promise((resolve, reject) => {
252
+ let timer;
253
+ let settled = false;
254
+ const cleanup = () => {
255
+ if (timer) {
256
+ clearTimeout(timer);
257
+ timer = undefined;
258
+ }
259
+ this.inFlight.delete(rejectOnEnd);
260
+ };
261
+ const settle = (fn, value) => {
262
+ if (settled)
263
+ return;
264
+ settled = true;
265
+ cleanup();
266
+ fn(value);
267
+ };
268
+ const settleErr = (err) => {
269
+ if (settled)
270
+ return;
271
+ settled = true;
272
+ cleanup();
273
+ reject(err);
274
+ };
275
+ const rejectOnEnd = (err) => settleErr(err);
276
+ this.inFlight.add(rejectOnEnd);
277
+ const timeoutMs = this.opts.timeoutMs;
278
+ if (timeoutMs && timeoutMs > 0) {
279
+ timer = setTimeout(() => {
280
+ settleErr(new AcpTimeoutError('ACP ' + (label ?? 'protocol call') + ' exceeded ' + timeoutMs + 'ms budget'));
281
+ }, timeoutMs);
282
+ }
283
+ p.then((v) => settle(resolve, v), (err) => settleErr(err));
284
+ });
285
+ }
286
+ /** Invoked on child exit, process error, or ACP stream close. Idempotent. */
287
+ handleProcessEnd(reason) {
288
+ this._isClosed = true;
289
+ this.connection = null;
290
+ // Null out process reference so a later dispose() doesn't kill an
291
+ // already-exited child (no-op, but keeps state honest).
292
+ this.process = null;
293
+ if (this.inFlight.size === 0)
294
+ return;
295
+ const err = new AcpConnectionClosedError(reason);
296
+ const pending = Array.from(this.inFlight);
297
+ this.inFlight.clear();
298
+ for (const reject of pending) {
299
+ try {
300
+ reject(err);
301
+ }
302
+ catch { /* swallow */ }
303
+ }
304
+ }
305
+ emit(sessionId, event) {
306
+ const subs = this.updateSubscribers.get(sessionId);
307
+ if (!subs)
308
+ return;
309
+ for (const cb of subs) {
310
+ try {
311
+ cb(event);
312
+ }
313
+ catch { /* subscriber errors must not break ACP loop */ }
314
+ }
315
+ }
316
+ // ========================================================================
317
+ // Client-side handler -- callbacks the agent invokes on us
318
+ // ========================================================================
319
+ createClient() {
320
+ const client = {
321
+ requestPermission: async (params) => {
322
+ // The schema types `options` as a broad union; narrow to the
323
+ // two fields we care about for selection logic.
324
+ const options = params.options;
325
+ if (options.length === 0) {
326
+ // Protocol allows zero options; cancelling is the only valid
327
+ // response since we have nothing to select.
328
+ return { outcome: { outcome: 'cancelled' } };
329
+ }
330
+ const allowOption = options.find(o => o.kind === 'allow_once')
331
+ || options[0];
332
+ return {
333
+ outcome: {
334
+ outcome: 'selected',
335
+ optionId: allowOption.optionId,
336
+ },
337
+ };
338
+ },
339
+ sessionUpdate: async (params) => {
340
+ const session = this.sessions.get(params.sessionId);
341
+ if (!session)
342
+ return;
343
+ // Narrow the open-ended schema type to the variants we care
344
+ // about. Unknown variants are silently ignored (matches prior
345
+ // behaviour before the `satisfies Client` refactor).
346
+ const update = params.update;
347
+ switch (update.sessionUpdate) {
348
+ case 'agent_message_chunk':
349
+ if (update.content.type === 'text' && typeof update.content.text === 'string') {
350
+ const text = update.content.text;
351
+ session.response += text;
352
+ if (text)
353
+ this.emit(params.sessionId, { type: 'message', text });
354
+ }
355
+ break;
356
+ case 'agent_thought_chunk':
357
+ if (update.content.type === 'text' && typeof update.content.text === 'string') {
358
+ const text = update.content.text;
359
+ if (text.length > 5)
360
+ session.activity = text.slice(0, 80);
361
+ this.emit(params.sessionId, { type: 'thought', text });
362
+ }
363
+ break;
364
+ case 'tool_call':
365
+ session.activity = 'Calling ' + (update.title || 'tool') + '...';
366
+ session.toolCalls.set(update.toolCallId, {
367
+ title: update.title,
368
+ status: update.status || 'pending',
369
+ });
370
+ this.emit(params.sessionId, {
371
+ type: 'tool_call',
372
+ toolCallId: update.toolCallId,
373
+ title: update.title,
374
+ status: update.status || 'pending',
375
+ });
376
+ break;
377
+ case 'tool_call_update': {
378
+ const tc = session.toolCalls.get(update.toolCallId);
379
+ if (tc) {
380
+ tc.status = update.status || tc.status;
381
+ if (update.status === 'completed')
382
+ session.activity = tc.title + ' done';
383
+ else if (update.status === 'in_progress')
384
+ session.activity = tc.title + '...';
385
+ }
386
+ this.emit(params.sessionId, {
387
+ type: 'tool_update',
388
+ toolCallId: update.toolCallId,
389
+ status: update.status || tc?.status || 'unknown',
390
+ title: tc?.title,
391
+ });
392
+ break;
393
+ }
394
+ case 'plan':
395
+ session.plan = update.entries;
396
+ const current = update.entries.find(e => e.status === 'in_progress');
397
+ if (current)
398
+ session.activity = current.content.slice(0, 80);
399
+ this.emit(params.sessionId, { type: 'plan', entries: update.entries });
400
+ break;
401
+ }
402
+ },
403
+ readTextFile: async (params) => {
404
+ const content = await readFile(params.path, 'utf-8');
405
+ return { content };
406
+ },
407
+ writeTextFile: async (params) => {
408
+ await writeFile(params.path, params.content, 'utf-8');
409
+ return {};
410
+ },
411
+ };
412
+ return client;
413
+ }
414
+ }
415
+ function mapMcpServer(s) {
416
+ if (s.type === 'http') {
417
+ if (!s.url || s.url.length === 0) {
418
+ throw new Error(`Invalid MCP server config "${s.name}": http servers require a non-empty url`);
419
+ }
420
+ return { type: 'http', name: s.name, url: s.url, headers: [] };
421
+ }
422
+ if (!s.command || s.command.length === 0) {
423
+ throw new Error(`Invalid MCP server config "${s.name}": stdio servers require a non-empty command`);
424
+ }
425
+ return {
426
+ name: s.name,
427
+ command: s.command,
428
+ args: s.args || [],
429
+ env: s.env || [],
430
+ };
431
+ }
432
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/acp/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { AcpClient, AcpConnectionClosedError, AcpTimeoutError } from './client.js';
2
+ export type { SpecialistSession, AcpMcpServerConfig, SessionUpdateEvent, AcpClientOptions } from './client.js';
3
+ export { runAgent } from './run.js';
4
+ export type { RunAgentOptions, RunAgentResult } from './run.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/acp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnF,YAAY,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/G,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { AcpClient, AcpConnectionClosedError, AcpTimeoutError } from './client.js';
2
+ export { runAgent } from './run.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/acp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnF,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,41 @@
1
+ import { AcpMcpServerConfig, SessionUpdateEvent } from './client.js';
2
+ export interface RunAgentOptions {
3
+ /** ACP-capable CLI binary (e.g. `'copilot'`). */
4
+ cliBin: string;
5
+ /** Agent id passed to the CLI via `--agent <id>` and tracked on the session. */
6
+ agentId: string;
7
+ /** Prompt text to send for the single turn. */
8
+ prompt: string;
9
+ /** Working directory for the session. Defaults to `process.cwd()`. */
10
+ cwd?: string;
11
+ /** MCP servers to expose to the session. Defaults to `[]`. */
12
+ mcpServers?: AcpMcpServerConfig[];
13
+ /** Optional MCP config file path passed via `--additional-mcp-config @<path>`. */
14
+ additionalMcpConfigPath?: string;
15
+ /**
16
+ * Optional subscriber for live session updates during the turn. Receives
17
+ * every event type; consumers filter by `event.type`.
18
+ */
19
+ onUpdate?: (event: SessionUpdateEvent) => void;
20
+ /**
21
+ * Per-protocol-call timeout in milliseconds. Forwarded to the underlying
22
+ * `AcpClient`. When any of `connect`, `newSession`, or `prompt` exceeds
23
+ * the budget the returned promise rejects with `AcpTimeoutError` and the
24
+ * child process is disposed. `undefined` or `0` disables the timeout.
25
+ */
26
+ timeoutMs?: number;
27
+ }
28
+ export interface RunAgentResult {
29
+ sessionId: string;
30
+ response: string;
31
+ stopReason: string | null;
32
+ }
33
+ /**
34
+ * One-shot helper: spawn the CLI, create a fresh session, send one prompt,
35
+ * collect the full response, and dispose. Always disposes the client --
36
+ * including on failure -- so the child process never leaks.
37
+ *
38
+ * For long-lived or multi-turn interactions use `AcpClient` directly.
39
+ */
40
+ export declare function runAgent(options: RunAgentOptions): Promise<RunAgentResult>;
41
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/acp/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEhF,MAAM,WAAW,eAAe;IAC5B,iDAAiD;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,gFAAgF;IAChF,OAAO,EAAE,MAAM,CAAC;IAChB,+CAA+C;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,8DAA8D;IAC9D,UAAU,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAClC,kFAAkF;IAClF,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC/C;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED;;;;;;GAMG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAyBhF"}
@@ -0,0 +1,32 @@
1
+ import { AcpClient } from './client.js';
2
+ /**
3
+ * One-shot helper: spawn the CLI, create a fresh session, send one prompt,
4
+ * collect the full response, and dispose. Always disposes the client --
5
+ * including on failure -- so the child process never leaks.
6
+ *
7
+ * For long-lived or multi-turn interactions use `AcpClient` directly.
8
+ */
9
+ export async function runAgent(options) {
10
+ const client = new AcpClient(options.cliBin, {
11
+ agentId: options.agentId,
12
+ additionalMcpConfigPath: options.additionalMcpConfigPath,
13
+ timeoutMs: options.timeoutMs,
14
+ });
15
+ try {
16
+ await client.connect();
17
+ const session = await client.newSession(options.agentId, options.cwd ?? process.cwd(), options.mcpServers ?? []);
18
+ if (options.onUpdate) {
19
+ client.onSessionUpdate(session.sessionId, options.onUpdate);
20
+ }
21
+ const result = await client.prompt(session.sessionId, options.prompt);
22
+ return {
23
+ sessionId: result.sessionId,
24
+ response: result.response,
25
+ stopReason: result.stopReason,
26
+ };
27
+ }
28
+ finally {
29
+ client.dispose();
30
+ }
31
+ }
32
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/acp/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA0C,MAAM,aAAa,CAAC;AAmChF;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAwB;IACnD,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE;QACzC,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,uBAAuB,EAAE,OAAO,CAAC,uBAAuB;QACxD,SAAS,EAAE,OAAO,CAAC,SAAS;KAC/B,CAAC,CAAC;IACH,IAAI,CAAC;QACD,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,CACnC,OAAO,CAAC,OAAO,EACf,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,EAC5B,OAAO,CAAC,UAAU,IAAI,EAAE,CAC3B,CAAC;QACF,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACnB,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAChE,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACtE,OAAO;YACH,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,UAAU,EAAE,MAAM,CAAC,UAAU;SAChC,CAAC;IACN,CAAC;YAAS,CAAC;QACP,MAAM,CAAC,OAAO,EAAE,CAAC;IACrB,CAAC;AACL,CAAC"}
package/dist/apply.d.ts CHANGED
@@ -1,5 +1,12 @@
1
1
  /**
2
- * Apply resolves a template from a registry and renders it to a target workspace.
2
+ * Apply -- resolves a template from a registry and renders it to a target workspace.
3
+ *
4
+ * Per U6 the manifest pipeline is monolithic: parseManifest +
5
+ * resolveManifest + skillFetcher + workspace-folder expansion run
6
+ * inline here. The legacy ManifestAdapter dispatcher and dobby/loom
7
+ * adapters are gone -- parseManifest natively probes for both
8
+ * manifest.yaml and dobby.yaml and normalizes flat-layout dobby-style
9
+ * input into the canonical contents:-wrapped shape.
3
10
  */
4
11
  import { type SkillFetcher } from './skill-fetcher.js';
5
12
  import { type CloneRepoResult } from './repo-clone.js';
@@ -23,6 +30,8 @@ export interface ApplyOptions {
23
30
  linkFn?: (target: string, linkPath: string) => Promise<void>;
24
31
  /** Select specific agents (comma-separated IDs). If undefined, all agents used. */
25
32
  agents?: string[];
33
+ /** Progress callback for user-facing status messages */
34
+ onProgress?: (message: string) => void;
26
35
  }
27
36
  export interface ApplyResult {
28
37
  target: TargetType;
@@ -46,11 +55,13 @@ export interface ApplyResult {
46
55
  * Apply a template to a workspace directory.
47
56
  *
48
57
  * Steps:
49
- * 1. Parse manifest.yaml from templateDir
50
- * 2. Resolve all $ref / file references
51
- * 3. Fetch registry skills if a skillFetcher is provided
52
- * 4. Render output files using the appropriate renderer
53
- * 5. Return list of registry skills that need external install (if not fetched)
58
+ * 1. Parse the manifest from templateDir (probes manifest.yaml then dobby.yaml).
59
+ * 2. Resolve all $ref / file / discover references.
60
+ * 3. Filter agents (when --agent was passed).
61
+ * 4. Fetch registry skills if a skillFetcher is provided.
62
+ * 5. Expand ${workspaceFolder:X} placeholders in MCP args/cwd.
63
+ * 6. Render output files using the appropriate renderer.
64
+ * 7. Return list of registry skills that need external install (if not fetched).
54
65
  */
55
66
  export declare function applyTemplate(options: ApplyOptions): Promise<ApplyResult>;
56
67
  //# sourceMappingURL=apply.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../src/apply.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,EAAyB,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAA6C,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClG,OAAO,KAAK,EAAE,UAAU,EAAmC,MAAM,YAAY,CAAC;AAE9E,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,UAAU,CAAC;IACnB,mEAAmE;IACnE,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,oFAAoF;IACpF,UAAU,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;IACrC,4GAA4G;IAC5G,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,sDAAsD;IACtD,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,gEAAgE;IAChE,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACnE,qEAAqE;IACrE,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,mFAAmF;IACnF,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,OAAO,CAAC;IACxB,6FAA6F;IAC7F,cAAc,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzD,kDAAkD;IAClD,eAAe,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxE,+DAA+D;IAC/D,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC;AAED;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CA2F/E"}
1
+ {"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../src/apply.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,EAAE,KAAK,YAAY,EAAyB,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAsB,KAAK,eAAe,EAAiB,MAAM,iBAAiB,CAAC;AAG1F,OAAO,KAAK,EAAE,UAAU,EAAe,MAAM,YAAY,CAAC;AAE1D,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,UAAU,CAAC;IACnB,mEAAmE;IACnE,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,oFAAoF;IACpF,UAAU,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;IACrC,4GAA4G;IAC5G,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,sDAAsD;IACtD,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,gEAAgE;IAChE,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACnE,qEAAqE;IACrE,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,mFAAmF;IACnF,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,wDAAwD;IACxD,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,OAAO,CAAC;IACxB,6FAA6F;IAC7F,cAAc,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzD,kDAAkD;IAClD,eAAe,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxE,+DAA+D;IAC/D,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CA2H/E"}