mcacp 0.1.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 (49) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +195 -0
  3. package/dist/acp/agent-requests.d.ts +19 -0
  4. package/dist/acp/agent-requests.js +166 -0
  5. package/dist/acp/agent-requests.js.map +1 -0
  6. package/dist/acp/lifecycle.d.ts +50 -0
  7. package/dist/acp/lifecycle.js +127 -0
  8. package/dist/acp/lifecycle.js.map +1 -0
  9. package/dist/acp/status.d.ts +31 -0
  10. package/dist/acp/status.js +72 -0
  11. package/dist/acp/status.js.map +1 -0
  12. package/dist/acp/transport.d.ts +34 -0
  13. package/dist/acp/transport.js +175 -0
  14. package/dist/acp/transport.js.map +1 -0
  15. package/dist/config/index.d.ts +27 -0
  16. package/dist/config/index.js +162 -0
  17. package/dist/config/index.js.map +1 -0
  18. package/dist/index.d.ts +2 -0
  19. package/dist/index.js +11 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/permissions/index.d.ts +16 -0
  22. package/dist/permissions/index.js +70 -0
  23. package/dist/permissions/index.js.map +1 -0
  24. package/dist/registry/index.d.ts +52 -0
  25. package/dist/registry/index.js +240 -0
  26. package/dist/registry/index.js.map +1 -0
  27. package/dist/server/index.d.ts +5 -0
  28. package/dist/server/index.js +271 -0
  29. package/dist/server/index.js.map +1 -0
  30. package/dist/sessions/index.d.ts +91 -0
  31. package/dist/sessions/index.js +151 -0
  32. package/dist/sessions/index.js.map +1 -0
  33. package/dist/sessions/prompt.d.ts +78 -0
  34. package/dist/sessions/prompt.js +361 -0
  35. package/dist/sessions/prompt.js.map +1 -0
  36. package/dist/types/acp.d.ts +343 -0
  37. package/dist/types/acp.js +17 -0
  38. package/dist/types/acp.js.map +1 -0
  39. package/dist/types/config.d.ts +135 -0
  40. package/dist/types/config.js +43 -0
  41. package/dist/types/config.js.map +1 -0
  42. package/dist/types/index.d.ts +3 -0
  43. package/dist/types/index.js +4 -0
  44. package/dist/types/index.js.map +1 -0
  45. package/dist/types/tools.d.ts +619 -0
  46. package/dist/types/tools.js +441 -0
  47. package/dist/types/tools.js.map +1 -0
  48. package/docs/configuration.md +164 -0
  49. package/package.json +58 -0
@@ -0,0 +1,361 @@
1
+ export class PromptHandler {
2
+ lifecycle;
3
+ sessions;
4
+ permissions;
5
+ config;
6
+ dispatchers = new Map();
7
+ globalWaiter = null;
8
+ constructor(lifecycle, sessions, permissions, config) {
9
+ this.lifecycle = lifecycle;
10
+ this.sessions = sessions;
11
+ this.permissions = permissions;
12
+ this.config = config;
13
+ }
14
+ /**
15
+ * Send a prompt to an ACP session. Returns immediately after dispatching.
16
+ * The session enters "prompted" state; use prompt_events or prompt to consume events.
17
+ */
18
+ promptStart(sessionId, promptContent) {
19
+ const session = this.sessions.getSession(sessionId);
20
+ if (session.promptState === 'prompted') {
21
+ throw new Error(`Session "${sessionId}" already has an active prompt`);
22
+ }
23
+ const handle = this.lifecycle.getAgent(session.agentId);
24
+ const blocks = typeof promptContent === 'string'
25
+ ? [{ type: 'text', text: promptContent }]
26
+ : promptContent;
27
+ session.promptState = 'prompted';
28
+ session.eventQueue = [];
29
+ this.resetChunkBuffer(session);
30
+ // Register this session in the agent's dispatch table
31
+ this.ensureDispatcher(handle, sessionId, session);
32
+ // Fire the prompt — don't await. Completion/error becomes an event.
33
+ handle.transport.request('session/prompt', {
34
+ sessionId, prompt: blocks,
35
+ }).then((result) => {
36
+ const r = result;
37
+ this.sessions.touchSession(sessionId);
38
+ this.flushChunkBuffer(session);
39
+ this.pushEvent(session, { type: 'complete', stopReason: r.stopReason });
40
+ session.promptState = 'idle';
41
+ this.unregisterSession(handle, sessionId);
42
+ }).catch((err) => {
43
+ this.flushChunkBuffer(session);
44
+ this.pushEvent(session, { type: 'error', message: err?.message ?? String(err) });
45
+ session.promptState = 'idle';
46
+ this.unregisterSession(handle, sessionId);
47
+ });
48
+ return { status: 'prompted' };
49
+ }
50
+ /**
51
+ * Non-blocking poll. Returns all queued events (may be empty).
52
+ */
53
+ promptEvents(sessionId) {
54
+ const session = this.sessions.getSession(sessionId);
55
+ const events = session.eventQueue.splice(0);
56
+ return { events };
57
+ }
58
+ /**
59
+ * Blocking wait. Returns when at least one event is available.
60
+ * If the queue already has events, returns immediately.
61
+ */
62
+ prompt(sessionId) {
63
+ const session = this.sessions.getSession(sessionId);
64
+ if (session.eventQueue.length > 0) {
65
+ return Promise.resolve({ events: session.eventQueue.splice(0) });
66
+ }
67
+ return new Promise((resolve) => {
68
+ session.waiters.push((events) => resolve({ events }));
69
+ });
70
+ }
71
+ /**
72
+ * Grant a pending operator permission. The agent resumes and new events
73
+ * continue flowing into the queue.
74
+ */
75
+ grantPermission(sessionId, toolCallId, optionId) {
76
+ const session = this.sessions.getSession(sessionId);
77
+ if (!session.pendingPermission)
78
+ throw new Error(`No pending permission for session "${sessionId}"`);
79
+ if (session.pendingPermission.toolCallId !== toolCallId) {
80
+ throw new Error(`Pending permission is for "${session.pendingPermission.toolCallId}", not "${toolCallId}"`);
81
+ }
82
+ session.pendingPermission.resolve({ selected: { optionId } });
83
+ session.pendingPermission = null;
84
+ }
85
+ cancel(sessionId) {
86
+ const session = this.sessions.getSession(sessionId);
87
+ const handle = this.lifecycle.getAgent(session.agentId);
88
+ handle.transport.notify('session/cancel', { sessionId });
89
+ }
90
+ async setMode(sessionId, modeId) {
91
+ const session = this.sessions.getSession(sessionId);
92
+ const handle = this.lifecycle.getAgent(session.agentId);
93
+ await handle.transport.request('session/set_mode', { sessionId, modeId });
94
+ }
95
+ // ---- Global event stream ----
96
+ /**
97
+ * Block until any prompted session produces events. Returns events stamped
98
+ * with sessionId and agentId. Supports optional Nagle-style coalescing.
99
+ */
100
+ events(timeoutMs, nagleMs = 0) {
101
+ // Drain all prompted sessions
102
+ const allEvents = [];
103
+ for (const dispatch of this.dispatchers.values()) {
104
+ for (const session of dispatch.sessions.values()) {
105
+ allEvents.push(...session.eventQueue.splice(0));
106
+ }
107
+ }
108
+ if (allEvents.length > 0)
109
+ return Promise.resolve({ events: allEvents });
110
+ // No prompted sessions? Return empty immediately.
111
+ let any = false;
112
+ for (const d of this.dispatchers.values()) {
113
+ if (d.sessions.size > 0) {
114
+ any = true;
115
+ break;
116
+ }
117
+ }
118
+ if (!any)
119
+ return Promise.resolve({ events: [] });
120
+ // Evict previous global waiter
121
+ if (this.globalWaiter)
122
+ this.flushGlobalWaiter();
123
+ return new Promise((resolve) => {
124
+ const wrappedResolve = (events) => {
125
+ if (timer)
126
+ clearTimeout(timer);
127
+ resolve({ events });
128
+ };
129
+ const timer = timeoutMs != null
130
+ ? setTimeout(() => {
131
+ if (this.globalWaiter?.resolve === wrappedResolve)
132
+ this.flushGlobalWaiter();
133
+ }, timeoutMs)
134
+ : null;
135
+ this.globalWaiter = { resolve: wrappedResolve, collected: [], nagleTimer: null, nagleMs };
136
+ });
137
+ }
138
+ /**
139
+ * Cleanup hook: if no prompted sessions remain, resolve the global waiter
140
+ * with whatever events have been collected.
141
+ */
142
+ onSessionRemoved() {
143
+ if (!this.globalWaiter)
144
+ return;
145
+ for (const d of this.dispatchers.values()) {
146
+ if (d.sessions.size > 0)
147
+ return;
148
+ }
149
+ this.flushGlobalWaiter();
150
+ }
151
+ notifyGlobalWaiter(event) {
152
+ if (!this.globalWaiter)
153
+ return;
154
+ this.globalWaiter.collected.push(event);
155
+ if (this.globalWaiter.nagleMs <= 0) {
156
+ this.flushGlobalWaiter();
157
+ return;
158
+ }
159
+ // Nagle: reset timer on each event, flush after nagleMs of quiet
160
+ if (this.globalWaiter.nagleTimer)
161
+ clearTimeout(this.globalWaiter.nagleTimer);
162
+ this.globalWaiter.nagleTimer = setTimeout(() => this.flushGlobalWaiter(), this.globalWaiter.nagleMs);
163
+ }
164
+ flushGlobalWaiter() {
165
+ if (!this.globalWaiter)
166
+ return;
167
+ const { resolve, collected, nagleTimer } = this.globalWaiter;
168
+ this.globalWaiter = null;
169
+ if (nagleTimer)
170
+ clearTimeout(nagleTimer);
171
+ resolve(collected);
172
+ }
173
+ // ---- Dispatcher management ----
174
+ /**
175
+ * Ensure the agent has a central dispatch handler installed, and register
176
+ * the session in its dispatch table.
177
+ */
178
+ ensureDispatcher(handle, sessionId, session) {
179
+ let dispatch = this.dispatchers.get(handle.agentId);
180
+ if (!dispatch) {
181
+ // First prompted session on this agent — install central handlers
182
+ const prevNotificationHandler = handle.transport['onNotification'] ?? null;
183
+ const prevRequestHandler = handle.transport['onIncomingRequest'] ?? null;
184
+ dispatch = { sessions: new Map(), prevNotificationHandler, prevRequestHandler };
185
+ this.dispatchers.set(handle.agentId, dispatch);
186
+ const d = dispatch; // stable reference for closures
187
+ handle.transport.setNotificationHandler((method, params) => {
188
+ if (method === 'session/update') {
189
+ const notif = params;
190
+ const target = d.sessions.get(notif.sessionId);
191
+ if (target) {
192
+ this.pushEventConsolidated(target, { type: 'update', update: notif.update });
193
+ this.updateAgentStatus(handle, notif.update);
194
+ return;
195
+ }
196
+ }
197
+ if (d.prevNotificationHandler)
198
+ d.prevNotificationHandler(method, params);
199
+ });
200
+ handle.transport.setRequestHandler(async (method, params, id) => {
201
+ if (method === 'session/request_permission') {
202
+ const permParams = params;
203
+ const target = d.sessions.get(permParams.sessionId);
204
+ if (target) {
205
+ if (target.permissionPolicy === 'operator') {
206
+ return this.handleOperatorPermission(target, permParams);
207
+ }
208
+ return this.permissions.handle(target, handle, permParams, []);
209
+ }
210
+ }
211
+ if (d.prevRequestHandler) {
212
+ return d.prevRequestHandler(method, params, id);
213
+ }
214
+ throw new Error(`Unhandled agent request during prompt: ${method}`);
215
+ });
216
+ }
217
+ dispatch.sessions.set(sessionId, session);
218
+ }
219
+ /**
220
+ * Remove a session from the dispatch table. If no sessions remain,
221
+ * restore the original handlers and tear down the dispatcher.
222
+ */
223
+ unregisterSession(handle, sessionId) {
224
+ const dispatch = this.dispatchers.get(handle.agentId);
225
+ if (!dispatch)
226
+ return;
227
+ dispatch.sessions.delete(sessionId);
228
+ if (dispatch.sessions.size === 0) {
229
+ if (dispatch.prevNotificationHandler) {
230
+ handle.transport.setNotificationHandler(dispatch.prevNotificationHandler);
231
+ }
232
+ if (dispatch.prevRequestHandler) {
233
+ handle.transport.setRequestHandler(dispatch.prevRequestHandler);
234
+ }
235
+ this.dispatchers.delete(handle.agentId);
236
+ }
237
+ }
238
+ // ---- Internal helpers ----
239
+ /**
240
+ * Nagle-style consolidation: buffer text chunk events and flush as batches.
241
+ * Non-chunk events flush any pending buffer first, then push immediately.
242
+ */
243
+ pushEventConsolidated(session, event) {
244
+ if (event.type !== 'update') {
245
+ // Non-update events (permission_request, complete, error) — flush and push
246
+ this.flushChunkBuffer(session);
247
+ this.pushEvent(session, event);
248
+ return;
249
+ }
250
+ const update = event.update;
251
+ if (!('sessionUpdate' in update)) {
252
+ this.flushChunkBuffer(session);
253
+ this.pushEvent(session, event);
254
+ return;
255
+ }
256
+ const updateType = update.sessionUpdate;
257
+ const isChunk = updateType === 'agent_message_chunk' || updateType === 'agent_thought_chunk';
258
+ if (!isChunk || this.config.promptConsolidateMs === 0) {
259
+ // Non-chunk update or consolidation disabled — flush and push
260
+ this.flushChunkBuffer(session);
261
+ this.pushEvent(session, event);
262
+ return;
263
+ }
264
+ // Extract text from the content block
265
+ const text = update.content.type === 'text' ? update.content.text : '';
266
+ if (!text) {
267
+ // Non-text content block (image, etc.) — can't consolidate, flush and push
268
+ this.flushChunkBuffer(session);
269
+ this.pushEvent(session, event);
270
+ return;
271
+ }
272
+ // If buffer has a different update type, flush first
273
+ if (session.chunkBuffer && session.chunkBuffer.updateType !== updateType) {
274
+ this.flushChunkBuffer(session);
275
+ }
276
+ // Append to buffer
277
+ if (!session.chunkBuffer) {
278
+ session.chunkBuffer = { text: '', updateType };
279
+ }
280
+ session.chunkBuffer.text += text;
281
+ // Flush if text contains a newline
282
+ if (session.chunkBuffer.text.includes('\n')) {
283
+ this.flushChunkBuffer(session);
284
+ return;
285
+ }
286
+ // Set/reset the Nagle timer
287
+ if (session.chunkTimer)
288
+ clearTimeout(session.chunkTimer);
289
+ session.chunkTimer = setTimeout(() => {
290
+ this.flushChunkBuffer(session);
291
+ }, this.config.promptConsolidateMs);
292
+ }
293
+ /** Flush the accumulated chunk buffer as a single consolidated update event. */
294
+ flushChunkBuffer(session) {
295
+ if (session.chunkTimer) {
296
+ clearTimeout(session.chunkTimer);
297
+ session.chunkTimer = null;
298
+ }
299
+ if (!session.chunkBuffer)
300
+ return;
301
+ const { text, updateType } = session.chunkBuffer;
302
+ session.chunkBuffer = null;
303
+ this.pushEvent(session, {
304
+ type: 'update',
305
+ update: {
306
+ sessionUpdate: updateType,
307
+ content: { type: 'text', text },
308
+ },
309
+ });
310
+ }
311
+ /** Reset chunk buffer state (called at prompt start). */
312
+ resetChunkBuffer(session) {
313
+ if (session.chunkTimer)
314
+ clearTimeout(session.chunkTimer);
315
+ session.chunkTimer = null;
316
+ session.chunkBuffer = null;
317
+ }
318
+ pushEvent(session, bare) {
319
+ const event = { ...bare, sessionId: session.sessionId, agentId: session.agentId };
320
+ session.eventQueue.push(event);
321
+ // Per-session waiter
322
+ if (session.waiters.length > 0) {
323
+ const waiter = session.waiters.shift();
324
+ waiter(session.eventQueue.splice(0));
325
+ }
326
+ // Global waiter
327
+ this.notifyGlobalWaiter(event);
328
+ }
329
+ handleOperatorPermission(session, params) {
330
+ this.pushEvent(session, {
331
+ type: 'permission_request',
332
+ toolCallId: params.toolCall.toolCallId,
333
+ title: params.toolCall.title,
334
+ options: params.options.map(o => ({ optionId: o.optionId, name: o.name, kind: o.kind })),
335
+ });
336
+ return new Promise((resolve) => {
337
+ session.pendingPermission = {
338
+ toolCallId: params.toolCall.toolCallId,
339
+ title: params.toolCall.title,
340
+ options: params.options.map(o => ({ optionId: o.optionId, name: o.name, kind: o.kind })),
341
+ resolve,
342
+ };
343
+ });
344
+ }
345
+ updateAgentStatus(handle, update) {
346
+ if (!('sessionUpdate' in update))
347
+ return;
348
+ if (update.sessionUpdate === 'tool_call') {
349
+ handle.status = { text: `Tool: ${update.title}`, updatedAt: Date.now() };
350
+ }
351
+ else if (update.sessionUpdate === 'agent_message_chunk') {
352
+ handle.status = { text: 'Responding...', updatedAt: Date.now() };
353
+ }
354
+ else if (update.sessionUpdate === 'plan') {
355
+ const active = update.entries.find(e => e.status === 'in_progress');
356
+ if (active)
357
+ handle.status = { text: `Plan: ${active.content}`, updatedAt: Date.now() };
358
+ }
359
+ }
360
+ }
361
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/sessions/prompt.ts"],"names":[],"mappings":"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"}