codekin 0.5.3 → 0.5.5

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 (48) hide show
  1. package/README.md +2 -1
  2. package/dist/assets/{index-84JYN21S.js → index-BFkKlY3O.js} +46 -42
  3. package/dist/assets/index-CjEQkT2b.css +1 -0
  4. package/dist/index.html +2 -2
  5. package/package.json +1 -1
  6. package/server/dist/approval-manager.js +1 -1
  7. package/server/dist/approval-manager.js.map +1 -1
  8. package/server/dist/auth-routes.js +31 -1
  9. package/server/dist/auth-routes.js.map +1 -1
  10. package/server/dist/claude-process.d.ts +26 -0
  11. package/server/dist/claude-process.js +111 -18
  12. package/server/dist/claude-process.js.map +1 -1
  13. package/server/dist/config.d.ts +8 -0
  14. package/server/dist/config.js +19 -1
  15. package/server/dist/config.js.map +1 -1
  16. package/server/dist/native-permissions.js +1 -1
  17. package/server/dist/native-permissions.js.map +1 -1
  18. package/server/dist/orchestrator-children.js +22 -6
  19. package/server/dist/orchestrator-children.js.map +1 -1
  20. package/server/dist/orchestrator-reports.d.ts +0 -4
  21. package/server/dist/orchestrator-reports.js +6 -12
  22. package/server/dist/orchestrator-reports.js.map +1 -1
  23. package/server/dist/prompt-router.d.ts +95 -0
  24. package/server/dist/prompt-router.js +577 -0
  25. package/server/dist/prompt-router.js.map +1 -0
  26. package/server/dist/session-lifecycle.d.ts +73 -0
  27. package/server/dist/session-lifecycle.js +387 -0
  28. package/server/dist/session-lifecycle.js.map +1 -0
  29. package/server/dist/session-manager.d.ts +33 -60
  30. package/server/dist/session-manager.js +239 -785
  31. package/server/dist/session-manager.js.map +1 -1
  32. package/server/dist/session-naming.js +2 -1
  33. package/server/dist/session-naming.js.map +1 -1
  34. package/server/dist/session-persistence.js +21 -3
  35. package/server/dist/session-persistence.js.map +1 -1
  36. package/server/dist/session-routes.js +18 -0
  37. package/server/dist/session-routes.js.map +1 -1
  38. package/server/dist/tsconfig.tsbuildinfo +1 -1
  39. package/server/dist/types.d.ts +4 -0
  40. package/server/dist/upload-routes.js +3 -1
  41. package/server/dist/upload-routes.js.map +1 -1
  42. package/server/dist/webhook-handler.js +2 -1
  43. package/server/dist/webhook-handler.js.map +1 -1
  44. package/server/dist/ws-message-handler.js +19 -0
  45. package/server/dist/ws-message-handler.js.map +1 -1
  46. package/server/dist/ws-server.js +39 -9
  47. package/server/dist/ws-server.js.map +1 -1
  48. package/dist/assets/index-C0Iuc3iT.css +0 -1
@@ -0,0 +1,577 @@
1
+ /**
2
+ * Prompt routing and tool approval logic extracted from SessionManager.
3
+ *
4
+ * Handles:
5
+ * - Tool approval requests (PreToolUse hook path)
6
+ * - Control request handling (abort/interrupt/auth via control_request path)
7
+ * - Pending prompt tracking (pendingToolApprovals, pendingControlRequests)
8
+ * - Auto-approval resolution (registry, session allowedTools, headless)
9
+ * - Prompt UI message construction and broadcast
10
+ */
11
+ import { randomUUID } from 'crypto';
12
+ import { ApprovalManager } from './approval-manager.js';
13
+ export class PromptRouter {
14
+ deps;
15
+ constructor(deps) {
16
+ this.deps = deps;
17
+ }
18
+ // ---------------------------------------------------------------------------
19
+ // Pending prompts query
20
+ // ---------------------------------------------------------------------------
21
+ /** Get all sessions that have pending prompts (waiting for approval or answer). */
22
+ getPendingPrompts() {
23
+ const results = [];
24
+ for (const session of this.deps.allSessions()) {
25
+ const prompts = [];
26
+ for (const [reqId, pending] of session.pendingToolApprovals) {
27
+ prompts.push({
28
+ requestId: reqId,
29
+ promptType: pending.toolName === 'AskUserQuestion' ? 'question' : 'permission',
30
+ toolName: pending.toolName,
31
+ toolInput: pending.toolInput,
32
+ });
33
+ }
34
+ for (const [reqId, pending] of session.pendingControlRequests) {
35
+ prompts.push({
36
+ requestId: reqId,
37
+ promptType: pending.toolName === 'AskUserQuestion' ? 'question' : 'permission',
38
+ toolName: pending.toolName,
39
+ toolInput: pending.toolInput,
40
+ });
41
+ }
42
+ if (prompts.length > 0) {
43
+ results.push({ sessionId: session.id, sessionName: session.name, source: session.source, prompts });
44
+ }
45
+ }
46
+ return results;
47
+ }
48
+ // ---------------------------------------------------------------------------
49
+ // Event handlers (wired by SessionManager in wireClaudeEvents)
50
+ // ---------------------------------------------------------------------------
51
+ /** Handle a Claude process 'prompt' event. */
52
+ onPromptEvent(session, promptType, question, options, multiSelect, toolName, toolInput, requestId, questions) {
53
+ const promptMsg = {
54
+ type: 'prompt',
55
+ promptType,
56
+ question,
57
+ options,
58
+ multiSelect,
59
+ toolName,
60
+ toolInput,
61
+ requestId,
62
+ ...(questions ? { questions } : {}),
63
+ };
64
+ if (requestId) {
65
+ session.pendingControlRequests.set(requestId, { requestId, toolName: 'AskUserQuestion', toolInput: toolInput || {}, promptMsg });
66
+ }
67
+ this.deps.broadcast(session, promptMsg);
68
+ // Notify prompt listeners (orchestrator, child monitor, etc.)
69
+ for (const listener of this.deps.promptListeners) {
70
+ try {
71
+ listener(session.id, promptType, toolName, requestId);
72
+ }
73
+ catch { /* listener error */ }
74
+ }
75
+ }
76
+ /** Handle a Claude process 'control_request' event. */
77
+ onControlRequestEvent(cp, session, sessionId, requestId, toolName, toolInput) {
78
+ if (typeof requestId !== 'string' || !/^[\w-]{1,64}$/.test(requestId)) {
79
+ console.warn(`[control_request] Rejected invalid requestId: ${JSON.stringify(requestId)}`);
80
+ return;
81
+ }
82
+ console.log(`[control_request] session=${sessionId} tool=${toolName} requestId=${requestId}`);
83
+ if (this.resolveAutoApproval(session, toolName, toolInput) !== 'prompt') {
84
+ console.log(`[control_request] auto-approved: ${toolName}`);
85
+ cp.sendControlResponse(requestId, 'allow');
86
+ return;
87
+ }
88
+ // Prevent double-gating: if a PreToolUse hook is already handling approval
89
+ // for this tool, auto-approve the control_request to avoid duplicate entries.
90
+ for (const pending of session.pendingToolApprovals.values()) {
91
+ if (pending.toolName === toolName) {
92
+ console.log(`[control_request] auto-approving ${toolName} (PreToolUse hook already handling approval)`);
93
+ cp.sendControlResponse(requestId, 'allow');
94
+ return;
95
+ }
96
+ }
97
+ const question = this.summarizeToolPermission(toolName, toolInput);
98
+ const neverAutoApprove = ApprovalManager.NEVER_AUTO_APPROVE_TOOLS.has(toolName);
99
+ const options = [
100
+ { label: 'Allow', value: 'allow' },
101
+ ...(!neverAutoApprove ? [{ label: 'Always Allow', value: 'always_allow' }] : []),
102
+ { label: 'Deny', value: 'deny' },
103
+ ];
104
+ const promptMsg = {
105
+ type: 'prompt',
106
+ promptType: 'permission',
107
+ question,
108
+ options,
109
+ toolName,
110
+ toolInput,
111
+ requestId,
112
+ };
113
+ session.pendingControlRequests.set(requestId, { requestId, toolName, toolInput, promptMsg });
114
+ if (session.clients.size > 0) {
115
+ this.deps.broadcast(session, promptMsg);
116
+ }
117
+ else {
118
+ console.log(`[control_request] no clients connected, waiting for client to join: ${toolName}`);
119
+ this.deps.globalBroadcast({
120
+ ...promptMsg,
121
+ sessionId,
122
+ sessionName: session.name,
123
+ });
124
+ }
125
+ // Notify prompt listeners (orchestrator, child monitor, etc.)
126
+ for (const listener of this.deps.promptListeners) {
127
+ try {
128
+ listener(sessionId, 'permission', toolName, requestId);
129
+ }
130
+ catch { /* listener error */ }
131
+ }
132
+ }
133
+ // ---------------------------------------------------------------------------
134
+ // Prompt response routing
135
+ // ---------------------------------------------------------------------------
136
+ /**
137
+ * Route a user's prompt response to the correct handler: pending tool approval
138
+ * (from PermissionRequest hook), pending control request (from control_request
139
+ * fallback path), or plain message fallback.
140
+ */
141
+ sendPromptResponse(sessionId, value, requestId) {
142
+ const session = this.deps.getSession(sessionId);
143
+ if (!session)
144
+ return;
145
+ session._lastActivityAt = Date.now();
146
+ // Check for pending tool approval from PreToolUse hook
147
+ if (!requestId) {
148
+ const totalPending = session.pendingToolApprovals.size + session.pendingControlRequests.size;
149
+ if (totalPending === 1) {
150
+ // Exactly one pending prompt — safe to infer the target
151
+ const soleApproval = session.pendingToolApprovals.size === 1
152
+ ? session.pendingToolApprovals.values().next().value
153
+ : undefined;
154
+ if (soleApproval) {
155
+ console.warn(`[prompt_response] no requestId, routing to sole pending tool approval: ${soleApproval.toolName}`);
156
+ this.resolveToolApproval(session, soleApproval, value);
157
+ return;
158
+ }
159
+ const soleControl = session.pendingControlRequests.size === 1
160
+ ? session.pendingControlRequests.values().next().value
161
+ : undefined;
162
+ if (soleControl) {
163
+ console.warn(`[prompt_response] no requestId, routing to sole pending control request: ${soleControl.toolName}`);
164
+ requestId = soleControl.requestId;
165
+ }
166
+ }
167
+ else if (totalPending > 1) {
168
+ console.warn(`[prompt_response] no requestId with ${totalPending} pending prompts — rejecting to prevent misrouted response`);
169
+ this.deps.broadcast(session, {
170
+ type: 'system_message',
171
+ subtype: 'error',
172
+ text: 'Prompt response could not be routed: multiple prompts pending. Please refresh and try again.',
173
+ });
174
+ return;
175
+ }
176
+ else {
177
+ console.warn(`[prompt_response] no requestId, no pending prompts — forwarding as user message`);
178
+ }
179
+ }
180
+ const approval = requestId ? session.pendingToolApprovals.get(requestId) : undefined;
181
+ if (approval) {
182
+ this.resolveToolApproval(session, approval, value);
183
+ return;
184
+ }
185
+ if (!session.claudeProcess?.isAlive())
186
+ return;
187
+ // Find matching pending control request
188
+ const pending = requestId ? session.pendingControlRequests.get(requestId) : undefined;
189
+ if (pending) {
190
+ session.pendingControlRequests.delete(pending.requestId);
191
+ // Dismiss prompt on all other clients viewing this session
192
+ this.deps.broadcast(session, { type: 'prompt_dismiss', requestId: pending.requestId });
193
+ if (pending.toolName === 'AskUserQuestion') {
194
+ this.handleAskUserQuestion(session, pending, value);
195
+ }
196
+ else {
197
+ this.sendControlResponseForRequest(session, pending, value);
198
+ }
199
+ }
200
+ else {
201
+ // Fallback: no pending control request, send as plain user message
202
+ const answer = Array.isArray(value) ? value.join(', ') : value;
203
+ session.claudeProcess.sendMessage(answer);
204
+ }
205
+ }
206
+ // ---------------------------------------------------------------------------
207
+ // Tool approval (PreToolUse hook path)
208
+ // ---------------------------------------------------------------------------
209
+ /**
210
+ * Called by the PermissionRequest hook HTTP endpoint. Sends a prompt to clients
211
+ * and returns a Promise that resolves when the user approves/denies.
212
+ */
213
+ requestToolApproval(sessionId, toolName, toolInput) {
214
+ const session = this.deps.getSession(sessionId);
215
+ if (!session) {
216
+ console.log(`[tool-approval] session not found: ${sessionId}`);
217
+ return Promise.resolve({ allow: false, always: false });
218
+ }
219
+ const autoResult = this.resolveAutoApproval(session, toolName, toolInput);
220
+ if (autoResult === 'permissionMode') {
221
+ console.log(`[tool-approval] auto-approved (permissionMode=${session.permissionMode}): ${toolName}`);
222
+ return Promise.resolve({ allow: true, always: false });
223
+ }
224
+ if (autoResult === 'registry') {
225
+ console.log(`[tool-approval] auto-approved (registry): ${toolName}`);
226
+ return Promise.resolve({ allow: true, always: true });
227
+ }
228
+ if (autoResult === 'session') {
229
+ console.log(`[tool-approval] auto-approved (session allowedTools): ${toolName}`);
230
+ return Promise.resolve({ allow: true, always: false });
231
+ }
232
+ if (autoResult === 'headless') {
233
+ console.log(`[tool-approval] auto-approved (headless ${session.source}): ${toolName}`);
234
+ return Promise.resolve({ allow: true, always: false });
235
+ }
236
+ console.log(`[tool-approval] requesting approval: session=${sessionId} tool=${toolName} clients=${session.clients.size}`);
237
+ // ExitPlanMode: route through PlanManager state machine for plan-specific
238
+ // approval UI. The hook blocks until we resolve the promise.
239
+ if (toolName === 'ExitPlanMode') {
240
+ return this.handleExitPlanModeApproval(session, sessionId);
241
+ }
242
+ // Prevent double-gating: if a control_request already created a pending
243
+ // entry for this tool, auto-approve the control_request and let the hook
244
+ // take over as the sole approval gate.
245
+ for (const [reqId, pending] of session.pendingControlRequests) {
246
+ if (pending.toolName === toolName) {
247
+ console.log(`[tool-approval] auto-approving control_request for ${toolName} (PreToolUse hook taking over)`);
248
+ session.claudeProcess?.sendControlResponse(reqId, 'allow');
249
+ session.pendingControlRequests.delete(reqId);
250
+ this.deps.broadcast(session, { type: 'prompt_dismiss', requestId: reqId });
251
+ break;
252
+ }
253
+ }
254
+ // AskUserQuestion: show a question prompt and collect the answer text,
255
+ // rather than a permission prompt with Allow/Deny buttons.
256
+ const isQuestion = toolName === 'AskUserQuestion';
257
+ return new Promise((resolve) => {
258
+ // Holder lets wrappedResolve reference the timeout before it's assigned
259
+ const timer = { id: null };
260
+ const wrappedResolve = (result) => {
261
+ if (timer.id)
262
+ clearTimeout(timer.id);
263
+ resolve(result);
264
+ };
265
+ const approvalRequestId = randomUUID();
266
+ // Timeout to prevent leaked promises if client disconnects after prompt is sent
267
+ timer.id = setTimeout(() => {
268
+ if (session.pendingToolApprovals.has(approvalRequestId)) {
269
+ console.log(`[tool-approval] timed out for ${toolName}`);
270
+ session.pendingToolApprovals.delete(approvalRequestId);
271
+ // Dismiss the stale prompt in all clients so they don't inject
272
+ // "allow"/"deny" as plain text after the timeout
273
+ this.deps.broadcast(session, { type: 'prompt_dismiss', requestId: approvalRequestId });
274
+ resolve({ allow: false, always: false });
275
+ }
276
+ }, 300_000); // 5 min for all approval types
277
+ let promptMsg;
278
+ if (isQuestion) {
279
+ // AskUserQuestion: extract structured questions from toolInput.questions
280
+ const rawQuestions = toolInput.questions;
281
+ const structuredQuestions = Array.isArray(rawQuestions)
282
+ ? rawQuestions.map(q => ({
283
+ question: q.question,
284
+ header: q.header,
285
+ multiSelect: q.multiSelect ?? false,
286
+ options: (q.options || []).map((opt) => ({
287
+ label: opt.label,
288
+ value: opt.value ?? opt.label,
289
+ description: opt.description,
290
+ })),
291
+ }))
292
+ : undefined;
293
+ const firstQ = structuredQuestions?.[0];
294
+ promptMsg = {
295
+ type: 'prompt',
296
+ promptType: 'question',
297
+ question: firstQ?.question || 'Answer the question',
298
+ options: firstQ?.options || [],
299
+ multiSelect: firstQ?.multiSelect,
300
+ toolName,
301
+ toolInput,
302
+ requestId: approvalRequestId,
303
+ ...(structuredQuestions ? { questions: structuredQuestions } : {}),
304
+ };
305
+ }
306
+ else {
307
+ const question = this.summarizeToolPermission(toolName, toolInput);
308
+ const approvePattern = this.deps.approvalManager.derivePattern(toolName, toolInput);
309
+ const neverAutoApprove = ApprovalManager.NEVER_AUTO_APPROVE_TOOLS.has(toolName);
310
+ const options = [
311
+ { label: 'Allow', value: 'allow' },
312
+ ...(!neverAutoApprove ? [{ label: 'Always Allow', value: 'always_allow' }] : []),
313
+ { label: 'Deny', value: 'deny' },
314
+ ];
315
+ promptMsg = {
316
+ type: 'prompt',
317
+ promptType: 'permission',
318
+ question,
319
+ options,
320
+ toolName,
321
+ toolInput,
322
+ requestId: approvalRequestId,
323
+ ...(approvePattern ? { approvePattern } : {}),
324
+ };
325
+ }
326
+ session.pendingToolApprovals.set(approvalRequestId, { resolve: wrappedResolve, toolName, toolInput, requestId: approvalRequestId, promptMsg });
327
+ if (session.clients.size > 0) {
328
+ this.deps.broadcast(session, promptMsg);
329
+ }
330
+ else {
331
+ // No clients connected — DON'T auto-deny. Instead, wait for a client
332
+ // to join this session (the prompt will be re-broadcast in join()).
333
+ console.log(`[tool-approval] no clients connected, waiting for client to join (timeout 300s): ${toolName}`);
334
+ this.deps.globalBroadcast({
335
+ ...promptMsg,
336
+ sessionId,
337
+ sessionName: session.name,
338
+ });
339
+ }
340
+ // Notify prompt listeners (orchestrator, child monitor, etc.)
341
+ for (const listener of this.deps.promptListeners) {
342
+ try {
343
+ listener(sessionId, isQuestion ? 'question' : 'permission', toolName, approvalRequestId);
344
+ }
345
+ catch { /* listener error */ }
346
+ }
347
+ });
348
+ }
349
+ // ---------------------------------------------------------------------------
350
+ // Internal helpers
351
+ // ---------------------------------------------------------------------------
352
+ /** Decode the allow/deny/always/pattern intent from a prompt response value. */
353
+ decodeApprovalValue(value) {
354
+ const first = Array.isArray(value) ? value[0] : value;
355
+ return {
356
+ isDeny: first === 'deny',
357
+ isAlwaysAllow: first === 'always_allow',
358
+ isApprovePattern: first === 'approve_pattern',
359
+ };
360
+ }
361
+ /** Resolve a pending PreToolUse hook approval and update auto-approval registries. */
362
+ resolveToolApproval(session, approval, value) {
363
+ // AskUserQuestion: the value IS the user's answer, not a permission decision
364
+ if (approval.toolName === 'AskUserQuestion') {
365
+ const answer = Array.isArray(value) ? value.join(', ') : value;
366
+ console.log(`[tool-approval] resolving AskUserQuestion: answer=${answer.slice(0, 100)}`);
367
+ approval.resolve({ allow: true, always: false, answer });
368
+ session.pendingToolApprovals.delete(approval.requestId);
369
+ this.deps.broadcast(session, { type: 'prompt_dismiss', requestId: approval.requestId });
370
+ return;
371
+ }
372
+ // ExitPlanMode: route through PlanManager for state tracking.
373
+ if (approval.toolName === 'ExitPlanMode') {
374
+ const first = Array.isArray(value) ? value[0] : value;
375
+ const isDeny = first === 'deny';
376
+ if (isDeny) {
377
+ const feedback = Array.isArray(value) && value.length > 1 ? value[1] : undefined;
378
+ const reason = session.planManager.deny(approval.requestId, feedback);
379
+ console.log(`[plan-approval] denied: ${reason}`);
380
+ approval.resolve({ allow: false, always: false, answer: reason || undefined });
381
+ }
382
+ else {
383
+ session.planManager.approve(approval.requestId);
384
+ console.log(`[plan-approval] approved`);
385
+ approval.resolve({ allow: true, always: false });
386
+ }
387
+ session.pendingToolApprovals.delete(approval.requestId);
388
+ this.deps.broadcast(session, { type: 'prompt_dismiss', requestId: approval.requestId });
389
+ return;
390
+ }
391
+ const { isDeny, isAlwaysAllow, isApprovePattern } = this.decodeApprovalValue(value);
392
+ if (isAlwaysAllow && !isDeny) {
393
+ this.deps.approvalManager.saveAlwaysAllow(session.groupDir ?? session.workingDir, approval.toolName, approval.toolInput);
394
+ }
395
+ if (isApprovePattern && !isDeny) {
396
+ this.deps.approvalManager.savePatternApproval(session.groupDir ?? session.workingDir, approval.toolName, approval.toolInput);
397
+ }
398
+ console.log(`[tool-approval] resolving: allow=${!isDeny} always=${isAlwaysAllow} pattern=${isApprovePattern} tool=${approval.toolName}`);
399
+ approval.resolve({ allow: !isDeny, always: isAlwaysAllow || isApprovePattern });
400
+ session.pendingToolApprovals.delete(approval.requestId);
401
+ this.deps.broadcast(session, { type: 'prompt_dismiss', requestId: approval.requestId });
402
+ }
403
+ /**
404
+ * Handle ExitPlanMode approval through PlanManager.
405
+ */
406
+ handleExitPlanModeApproval(session, sessionId) {
407
+ const reviewId = session.planManager.onExitPlanModeRequested();
408
+ if (!reviewId) {
409
+ console.log(`[plan-approval] ExitPlanMode but PlanManager not in planning state, allowing`);
410
+ return Promise.resolve({ allow: true, always: false });
411
+ }
412
+ return new Promise((resolve) => {
413
+ const timer = { id: null };
414
+ const wrappedResolve = (result) => {
415
+ if (timer.id)
416
+ clearTimeout(timer.id);
417
+ resolve(result);
418
+ };
419
+ // Timeout: auto-deny after 5 minutes to prevent leaked promises
420
+ timer.id = setTimeout(() => {
421
+ if (session.pendingToolApprovals.has(reviewId)) {
422
+ console.log(`[plan-approval] timed out, auto-denying`);
423
+ session.pendingToolApprovals.delete(reviewId);
424
+ session.planManager.deny(reviewId);
425
+ this.deps.broadcast(session, { type: 'prompt_dismiss', requestId: reviewId });
426
+ resolve({ allow: false, always: false });
427
+ }
428
+ }, 300_000);
429
+ const promptMsg = {
430
+ type: 'prompt',
431
+ promptType: 'permission',
432
+ question: 'Approve plan and start implementation?',
433
+ options: [
434
+ { label: 'Approve', value: 'allow' },
435
+ { label: 'Reject', value: 'deny' },
436
+ ],
437
+ toolName: 'ExitPlanMode',
438
+ requestId: reviewId,
439
+ };
440
+ session.pendingToolApprovals.set(reviewId, {
441
+ resolve: wrappedResolve,
442
+ toolName: 'ExitPlanMode',
443
+ toolInput: {},
444
+ requestId: reviewId,
445
+ promptMsg,
446
+ });
447
+ this.deps.broadcast(session, promptMsg);
448
+ if (session.clients.size === 0) {
449
+ this.deps.globalBroadcast({ ...promptMsg, sessionId, sessionName: session.name });
450
+ }
451
+ for (const listener of this.deps.promptListeners) {
452
+ try {
453
+ listener(sessionId, 'permission', 'ExitPlanMode', reviewId);
454
+ }
455
+ catch { /* listener error */ }
456
+ }
457
+ });
458
+ }
459
+ /**
460
+ * Send an AskUserQuestion control response, mapping the user's answer(s) into
461
+ * the structured answers map the tool expects.
462
+ */
463
+ handleAskUserQuestion(session, pending, value) {
464
+ const questions = pending.toolInput?.questions;
465
+ const updatedInput = { ...pending.toolInput };
466
+ let answers = {};
467
+ if (typeof value === 'string') {
468
+ // Try parsing as JSON answers map (multi-question flow)
469
+ try {
470
+ const parsed = JSON.parse(value);
471
+ if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
472
+ answers = parsed;
473
+ }
474
+ else if (Array.isArray(questions) && questions.length > 0) {
475
+ answers[questions[0].question] = value;
476
+ }
477
+ }
478
+ catch {
479
+ // Plain string answer — map to first question
480
+ if (Array.isArray(questions) && questions.length > 0) {
481
+ answers[questions[0].question] = value;
482
+ }
483
+ }
484
+ }
485
+ else if (Array.isArray(value) && Array.isArray(questions) && questions.length > 0) {
486
+ // Array of answers — map to first question (multi-select single question)
487
+ answers[questions[0].question] = value.join(', ');
488
+ }
489
+ updatedInput.answers = answers;
490
+ session.claudeProcess.sendControlResponse(pending.requestId, 'allow', updatedInput);
491
+ }
492
+ /** Send a permission control response (allow/always_allow/approve_pattern/deny). */
493
+ sendControlResponseForRequest(session, pending, value) {
494
+ const { isDeny, isAlwaysAllow, isApprovePattern } = this.decodeApprovalValue(value);
495
+ if (isAlwaysAllow) {
496
+ this.deps.approvalManager.saveAlwaysAllow(session.groupDir ?? session.workingDir, pending.toolName, pending.toolInput);
497
+ }
498
+ if (isApprovePattern) {
499
+ this.deps.approvalManager.savePatternApproval(session.groupDir ?? session.workingDir, pending.toolName, pending.toolInput);
500
+ }
501
+ const behavior = isDeny ? 'deny' : 'allow';
502
+ session.claudeProcess.sendControlResponse(pending.requestId, behavior);
503
+ }
504
+ /**
505
+ * Check if a tool invocation can be auto-approved without prompting the user.
506
+ * Returns 'registry' if matched by auto-approval rules, 'session' if matched
507
+ * by the session's allowedTools list, 'headless' if the session has no clients
508
+ * and is a non-interactive source, or 'prompt' if the user needs to decide.
509
+ */
510
+ /** Tools that are controlled by permission mode rather than per-tool approval. */
511
+ static FILE_TOOLS = new Set(['Read', 'Write', 'Edit', 'Glob', 'Grep', 'NotebookEdit']);
512
+ /** Permission modes that auto-approve file-editing tools. */
513
+ static EDIT_MODES = new Set(['acceptEdits', 'bypassPermissions', 'dangerouslySkipPermissions']);
514
+ resolveAutoApproval(session, toolName, toolInput) {
515
+ // File tools are governed by permission mode, not per-tool approval.
516
+ // The PreToolUse hook intercepts them before Claude's native permission
517
+ // logic runs, so we must enforce permission mode here.
518
+ if (PromptRouter.FILE_TOOLS.has(toolName) && PromptRouter.EDIT_MODES.has(session.permissionMode ?? '')) {
519
+ return 'permissionMode';
520
+ }
521
+ if (this.deps.approvalManager.checkAutoApproval(session.groupDir ?? session.workingDir, toolName, toolInput)) {
522
+ return 'registry';
523
+ }
524
+ if (session.allowedTools && this.matchesAllowedTools(session.allowedTools, toolName, toolInput)) {
525
+ return 'session';
526
+ }
527
+ if (session.clients.size === 0 && (session.source === 'webhook' || session.source === 'workflow' || session.source === 'stepflow' || session.source === 'orchestrator')) {
528
+ return 'headless';
529
+ }
530
+ return 'prompt';
531
+ }
532
+ /**
533
+ * Check if a tool invocation matches any of the session's allowedTools patterns.
534
+ * Patterns follow Claude CLI format: 'ToolName' or 'ToolName(prefix:*)'.
535
+ */
536
+ matchesAllowedTools(allowedTools, toolName, toolInput) {
537
+ for (const pattern of allowedTools) {
538
+ // Simple tool name match: 'WebFetch', 'Read', etc.
539
+ if (pattern === toolName)
540
+ return true;
541
+ // Parameterized match: 'Bash(curl:*)' → toolName=Bash, command starts with 'curl'
542
+ const match = pattern.match(/^(\w+)\(([^:]+):\*\)$/);
543
+ if (match) {
544
+ const [, patternTool, prefix] = match;
545
+ if (patternTool !== toolName)
546
+ continue;
547
+ // For Bash, check command prefix
548
+ if (toolName === 'Bash') {
549
+ const cmd = String(toolInput.command || '').trimStart();
550
+ if (cmd === prefix || cmd.startsWith(prefix + ' '))
551
+ return true;
552
+ }
553
+ }
554
+ }
555
+ return false;
556
+ }
557
+ /** Build a human-readable prompt string for a tool permission dialog. */
558
+ summarizeToolPermission(toolName, toolInput) {
559
+ switch (toolName) {
560
+ case 'Bash': {
561
+ const cmd = String(toolInput.command || '');
562
+ const firstLine = cmd.split('\n')[0];
563
+ const display = firstLine.length < cmd.length ? `${firstLine}...` : cmd;
564
+ return `Allow Bash? \`$ ${display}\``;
565
+ }
566
+ case 'Task':
567
+ return `Allow Task? ${String(toolInput.description || toolName)}`;
568
+ case 'Read': {
569
+ const filePath = String(toolInput.file_path || '');
570
+ return `Allow Read? \`${filePath}\``;
571
+ }
572
+ default:
573
+ return `Allow ${toolName}?`;
574
+ }
575
+ }
576
+ }
577
+ //# sourceMappingURL=prompt-router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-router.js","sourceRoot":"","sources":["../prompt-router.ts"],"names":[],"mappings":"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"}