codekin 0.5.4 → 0.6.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 (88) hide show
  1. package/README.md +1 -0
  2. package/dist/assets/index-BvKzbtKg.css +1 -0
  3. package/dist/assets/index-D59Xr9pK.js +182 -0
  4. package/dist/index.html +2 -2
  5. package/package.json +1 -1
  6. package/server/dist/approval-manager.js +2 -3
  7. package/server/dist/approval-manager.js.map +1 -1
  8. package/server/dist/claude-process.d.ts +17 -5
  9. package/server/dist/claude-process.js +56 -66
  10. package/server/dist/claude-process.js.map +1 -1
  11. package/server/dist/coding-process.d.ts +83 -0
  12. package/server/dist/coding-process.js +32 -0
  13. package/server/dist/coding-process.js.map +1 -0
  14. package/server/dist/commit-event-handler.js +1 -0
  15. package/server/dist/commit-event-handler.js.map +1 -1
  16. package/server/dist/config.js +2 -1
  17. package/server/dist/config.js.map +1 -1
  18. package/server/dist/docs-routes.js +22 -1
  19. package/server/dist/docs-routes.js.map +1 -1
  20. package/server/dist/native-permissions.js +3 -2
  21. package/server/dist/native-permissions.js.map +1 -1
  22. package/server/dist/opencode-process.d.ts +104 -0
  23. package/server/dist/opencode-process.js +657 -0
  24. package/server/dist/opencode-process.js.map +1 -0
  25. package/server/dist/orchestrator-children.d.ts +9 -0
  26. package/server/dist/orchestrator-children.js +50 -7
  27. package/server/dist/orchestrator-children.js.map +1 -1
  28. package/server/dist/orchestrator-manager.js +17 -0
  29. package/server/dist/orchestrator-manager.js.map +1 -1
  30. package/server/dist/orchestrator-reports.d.ts +0 -4
  31. package/server/dist/orchestrator-reports.js +6 -12
  32. package/server/dist/orchestrator-reports.js.map +1 -1
  33. package/server/dist/orchestrator-routes.js +8 -1
  34. package/server/dist/orchestrator-routes.js.map +1 -1
  35. package/server/dist/prompt-router.d.ts +95 -0
  36. package/server/dist/prompt-router.js +589 -0
  37. package/server/dist/prompt-router.js.map +1 -0
  38. package/server/dist/session-lifecycle.d.ts +73 -0
  39. package/server/dist/session-lifecycle.js +408 -0
  40. package/server/dist/session-lifecycle.js.map +1 -0
  41. package/server/dist/session-manager.d.ts +42 -60
  42. package/server/dist/session-manager.js +310 -835
  43. package/server/dist/session-manager.js.map +1 -1
  44. package/server/dist/session-persistence.d.ts +1 -0
  45. package/server/dist/session-persistence.js +24 -4
  46. package/server/dist/session-persistence.js.map +1 -1
  47. package/server/dist/session-routes.js +15 -1
  48. package/server/dist/session-routes.js.map +1 -1
  49. package/server/dist/stepflow-handler.d.ts +2 -2
  50. package/server/dist/stepflow-handler.js +4 -4
  51. package/server/dist/stepflow-handler.js.map +1 -1
  52. package/server/dist/tool-labels.d.ts +8 -0
  53. package/server/dist/tool-labels.js +51 -0
  54. package/server/dist/tool-labels.js.map +1 -0
  55. package/server/dist/tsconfig.tsbuildinfo +1 -1
  56. package/server/dist/types.d.ts +27 -8
  57. package/server/dist/types.js +4 -1
  58. package/server/dist/types.js.map +1 -1
  59. package/server/dist/webhook-dedup.d.ts +11 -0
  60. package/server/dist/webhook-dedup.js +23 -0
  61. package/server/dist/webhook-dedup.js.map +1 -1
  62. package/server/dist/webhook-handler.d.ts +20 -4
  63. package/server/dist/webhook-handler.js +256 -20
  64. package/server/dist/webhook-handler.js.map +1 -1
  65. package/server/dist/webhook-pr-cache.d.ts +57 -0
  66. package/server/dist/webhook-pr-cache.js +95 -0
  67. package/server/dist/webhook-pr-cache.js.map +1 -0
  68. package/server/dist/webhook-pr-github.d.ts +68 -0
  69. package/server/dist/webhook-pr-github.js +202 -0
  70. package/server/dist/webhook-pr-github.js.map +1 -0
  71. package/server/dist/webhook-pr-prompt.d.ts +27 -0
  72. package/server/dist/webhook-pr-prompt.js +251 -0
  73. package/server/dist/webhook-pr-prompt.js.map +1 -0
  74. package/server/dist/webhook-types.d.ts +70 -1
  75. package/server/dist/webhook-workspace.js +20 -1
  76. package/server/dist/webhook-workspace.js.map +1 -1
  77. package/server/dist/workflow-config.d.ts +2 -0
  78. package/server/dist/workflow-config.js.map +1 -1
  79. package/server/dist/workflow-loader.js +3 -0
  80. package/server/dist/workflow-loader.js.map +1 -1
  81. package/server/dist/workflow-routes.js +6 -2
  82. package/server/dist/workflow-routes.js.map +1 -1
  83. package/server/dist/ws-message-handler.js +24 -4
  84. package/server/dist/ws-message-handler.js.map +1 -1
  85. package/server/dist/ws-server.js +10 -2
  86. package/server/dist/ws-server.js.map +1 -1
  87. package/dist/assets/index-COGLICp9.js +0 -178
  88. package/dist/assets/index-CjEQkT2b.css +0 -1
@@ -0,0 +1,589 @@
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
+ // Agent child sessions with no browser client: fast-deny tools not in
237
+ // allowedTools rather than hanging 5 minutes on a prompt nobody will see.
238
+ if (session.clients.size === 0 && session.source === 'agent') {
239
+ console.log(`[tool-approval] fast-deny headless agent (tool not in allowedTools): ${toolName}`);
240
+ return Promise.resolve({ allow: false, always: false });
241
+ }
242
+ console.log(`[tool-approval] requesting approval: session=${sessionId} tool=${toolName} clients=${session.clients.size}`);
243
+ // ExitPlanMode: route through PlanManager state machine for plan-specific
244
+ // approval UI. The hook blocks until we resolve the promise.
245
+ if (toolName === 'ExitPlanMode') {
246
+ return this.handleExitPlanModeApproval(session, sessionId);
247
+ }
248
+ // Prevent double-gating: if a control_request already created a pending
249
+ // entry for this tool, auto-approve the control_request and let the hook
250
+ // take over as the sole approval gate.
251
+ for (const [reqId, pending] of session.pendingControlRequests) {
252
+ if (pending.toolName === toolName) {
253
+ console.log(`[tool-approval] auto-approving control_request for ${toolName} (PreToolUse hook taking over)`);
254
+ session.claudeProcess?.sendControlResponse(reqId, 'allow');
255
+ session.pendingControlRequests.delete(reqId);
256
+ this.deps.broadcast(session, { type: 'prompt_dismiss', requestId: reqId });
257
+ break;
258
+ }
259
+ }
260
+ // AskUserQuestion: show a question prompt and collect the answer text,
261
+ // rather than a permission prompt with Allow/Deny buttons.
262
+ const isQuestion = toolName === 'AskUserQuestion';
263
+ return new Promise((resolve) => {
264
+ // Holder lets wrappedResolve reference the timeout before it's assigned
265
+ const timer = { id: null };
266
+ const wrappedResolve = (result) => {
267
+ if (timer.id)
268
+ clearTimeout(timer.id);
269
+ resolve(result);
270
+ };
271
+ const approvalRequestId = randomUUID();
272
+ // Timeout to prevent leaked promises if client disconnects after prompt is sent
273
+ timer.id = setTimeout(() => {
274
+ if (session.pendingToolApprovals.has(approvalRequestId)) {
275
+ console.log(`[tool-approval] timed out for ${toolName}`);
276
+ session.pendingToolApprovals.delete(approvalRequestId);
277
+ // Dismiss the stale prompt in all clients so they don't inject
278
+ // "allow"/"deny" as plain text after the timeout
279
+ this.deps.broadcast(session, { type: 'prompt_dismiss', requestId: approvalRequestId });
280
+ resolve({ allow: false, always: false });
281
+ }
282
+ }, 300_000); // 5 min for all approval types
283
+ let promptMsg;
284
+ if (isQuestion) {
285
+ // AskUserQuestion: extract structured questions from toolInput.questions
286
+ const rawQuestions = toolInput.questions;
287
+ const structuredQuestions = Array.isArray(rawQuestions)
288
+ ? rawQuestions.map(q => ({
289
+ question: q.question,
290
+ header: q.header,
291
+ multiSelect: q.multiSelect ?? false,
292
+ options: (q.options || []).map((opt) => ({
293
+ label: opt.label,
294
+ value: opt.value ?? opt.label,
295
+ description: opt.description,
296
+ })),
297
+ }))
298
+ : undefined;
299
+ const firstQ = structuredQuestions?.[0];
300
+ promptMsg = {
301
+ type: 'prompt',
302
+ promptType: 'question',
303
+ question: firstQ?.question || 'Answer the question',
304
+ options: firstQ?.options || [],
305
+ multiSelect: firstQ?.multiSelect,
306
+ toolName,
307
+ toolInput,
308
+ requestId: approvalRequestId,
309
+ ...(structuredQuestions ? { questions: structuredQuestions } : {}),
310
+ };
311
+ }
312
+ else {
313
+ const question = this.summarizeToolPermission(toolName, toolInput);
314
+ const approvePattern = this.deps.approvalManager.derivePattern(toolName, toolInput);
315
+ const neverAutoApprove = ApprovalManager.NEVER_AUTO_APPROVE_TOOLS.has(toolName);
316
+ const options = [
317
+ { label: 'Allow', value: 'allow' },
318
+ ...(!neverAutoApprove ? [{ label: 'Always Allow', value: 'always_allow' }] : []),
319
+ { label: 'Deny', value: 'deny' },
320
+ ];
321
+ promptMsg = {
322
+ type: 'prompt',
323
+ promptType: 'permission',
324
+ question,
325
+ options,
326
+ toolName,
327
+ toolInput,
328
+ requestId: approvalRequestId,
329
+ ...(approvePattern ? { approvePattern } : {}),
330
+ };
331
+ }
332
+ session.pendingToolApprovals.set(approvalRequestId, { resolve: wrappedResolve, toolName, toolInput, requestId: approvalRequestId, promptMsg });
333
+ if (session.clients.size > 0) {
334
+ this.deps.broadcast(session, promptMsg);
335
+ }
336
+ else {
337
+ // No clients connected — DON'T auto-deny. Instead, wait for a client
338
+ // to join this session (the prompt will be re-broadcast in join()).
339
+ console.log(`[tool-approval] no clients connected, waiting for client to join (timeout 300s): ${toolName}`);
340
+ this.deps.globalBroadcast({
341
+ ...promptMsg,
342
+ sessionId,
343
+ sessionName: session.name,
344
+ });
345
+ }
346
+ // Notify prompt listeners (orchestrator, child monitor, etc.)
347
+ for (const listener of this.deps.promptListeners) {
348
+ try {
349
+ listener(sessionId, isQuestion ? 'question' : 'permission', toolName, approvalRequestId);
350
+ }
351
+ catch { /* listener error */ }
352
+ }
353
+ });
354
+ }
355
+ // ---------------------------------------------------------------------------
356
+ // Internal helpers
357
+ // ---------------------------------------------------------------------------
358
+ /** Decode the allow/deny/always/pattern intent from a prompt response value. */
359
+ decodeApprovalValue(value) {
360
+ const first = Array.isArray(value) ? value[0] : value;
361
+ return {
362
+ isDeny: first === 'deny',
363
+ isAlwaysAllow: first === 'always_allow',
364
+ isApprovePattern: first === 'approve_pattern',
365
+ };
366
+ }
367
+ /** Resolve a pending PreToolUse hook approval and update auto-approval registries. */
368
+ resolveToolApproval(session, approval, value) {
369
+ // AskUserQuestion: the value IS the user's answer, not a permission decision
370
+ if (approval.toolName === 'AskUserQuestion') {
371
+ const answer = Array.isArray(value) ? value.join(', ') : value;
372
+ console.log(`[tool-approval] resolving AskUserQuestion: answer=${answer.slice(0, 100)}`);
373
+ approval.resolve({ allow: true, always: false, answer });
374
+ session.pendingToolApprovals.delete(approval.requestId);
375
+ this.deps.broadcast(session, { type: 'prompt_dismiss', requestId: approval.requestId });
376
+ return;
377
+ }
378
+ // ExitPlanMode: route through PlanManager for state tracking.
379
+ if (approval.toolName === 'ExitPlanMode') {
380
+ const first = Array.isArray(value) ? value[0] : value;
381
+ const isDeny = first === 'deny';
382
+ if (isDeny) {
383
+ const feedback = Array.isArray(value) && value.length > 1 ? value[1] : undefined;
384
+ const reason = session.planManager.deny(approval.requestId, feedback);
385
+ console.log(`[plan-approval] denied: ${reason}`);
386
+ approval.resolve({ allow: false, always: false, answer: reason || undefined });
387
+ }
388
+ else {
389
+ session.planManager.approve(approval.requestId);
390
+ console.log(`[plan-approval] approved`);
391
+ approval.resolve({ allow: true, always: false });
392
+ }
393
+ session.pendingToolApprovals.delete(approval.requestId);
394
+ this.deps.broadcast(session, { type: 'prompt_dismiss', requestId: approval.requestId });
395
+ return;
396
+ }
397
+ const { isDeny, isAlwaysAllow, isApprovePattern } = this.decodeApprovalValue(value);
398
+ if (isAlwaysAllow && !isDeny) {
399
+ this.deps.approvalManager.saveAlwaysAllow(session.groupDir ?? session.workingDir, approval.toolName, approval.toolInput);
400
+ }
401
+ if (isApprovePattern && !isDeny) {
402
+ this.deps.approvalManager.savePatternApproval(session.groupDir ?? session.workingDir, approval.toolName, approval.toolInput);
403
+ }
404
+ console.log(`[tool-approval] resolving: allow=${!isDeny} always=${isAlwaysAllow} pattern=${isApprovePattern} tool=${approval.toolName}`);
405
+ approval.resolve({ allow: !isDeny, always: isAlwaysAllow || isApprovePattern });
406
+ session.pendingToolApprovals.delete(approval.requestId);
407
+ this.deps.broadcast(session, { type: 'prompt_dismiss', requestId: approval.requestId });
408
+ }
409
+ /**
410
+ * Handle ExitPlanMode approval through PlanManager.
411
+ */
412
+ handleExitPlanModeApproval(session, sessionId) {
413
+ const reviewId = session.planManager.onExitPlanModeRequested();
414
+ if (!reviewId) {
415
+ console.log(`[plan-approval] ExitPlanMode but PlanManager not in planning state, allowing`);
416
+ return Promise.resolve({ allow: true, always: false });
417
+ }
418
+ return new Promise((resolve) => {
419
+ const timer = { id: null };
420
+ const wrappedResolve = (result) => {
421
+ if (timer.id)
422
+ clearTimeout(timer.id);
423
+ resolve(result);
424
+ };
425
+ // Timeout: auto-deny after 5 minutes to prevent leaked promises
426
+ timer.id = setTimeout(() => {
427
+ if (session.pendingToolApprovals.has(reviewId)) {
428
+ console.log(`[plan-approval] timed out, auto-denying`);
429
+ session.pendingToolApprovals.delete(reviewId);
430
+ session.planManager.deny(reviewId);
431
+ this.deps.broadcast(session, { type: 'prompt_dismiss', requestId: reviewId });
432
+ resolve({ allow: false, always: false });
433
+ }
434
+ }, 300_000);
435
+ const promptMsg = {
436
+ type: 'prompt',
437
+ promptType: 'permission',
438
+ question: 'Approve plan and start implementation?',
439
+ options: [
440
+ { label: 'Approve', value: 'allow' },
441
+ { label: 'Reject', value: 'deny' },
442
+ ],
443
+ toolName: 'ExitPlanMode',
444
+ requestId: reviewId,
445
+ };
446
+ session.pendingToolApprovals.set(reviewId, {
447
+ resolve: wrappedResolve,
448
+ toolName: 'ExitPlanMode',
449
+ toolInput: {},
450
+ requestId: reviewId,
451
+ promptMsg,
452
+ });
453
+ this.deps.broadcast(session, promptMsg);
454
+ if (session.clients.size === 0) {
455
+ this.deps.globalBroadcast({ ...promptMsg, sessionId, sessionName: session.name });
456
+ }
457
+ for (const listener of this.deps.promptListeners) {
458
+ try {
459
+ listener(sessionId, 'permission', 'ExitPlanMode', reviewId);
460
+ }
461
+ catch { /* listener error */ }
462
+ }
463
+ });
464
+ }
465
+ /**
466
+ * Send an AskUserQuestion control response, mapping the user's answer(s) into
467
+ * the structured answers map the tool expects.
468
+ */
469
+ handleAskUserQuestion(session, pending, value) {
470
+ const questions = pending.toolInput?.questions;
471
+ const updatedInput = { ...pending.toolInput };
472
+ let answers = {};
473
+ if (typeof value === 'string') {
474
+ // Try parsing as JSON answers map (multi-question flow)
475
+ try {
476
+ const parsed = JSON.parse(value);
477
+ if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
478
+ answers = parsed;
479
+ }
480
+ else if (Array.isArray(questions) && questions.length > 0) {
481
+ answers[questions[0].question] = value;
482
+ }
483
+ }
484
+ catch {
485
+ // Plain string answer — map to first question
486
+ if (Array.isArray(questions) && questions.length > 0) {
487
+ answers[questions[0].question] = value;
488
+ }
489
+ }
490
+ }
491
+ else if (Array.isArray(value) && Array.isArray(questions) && questions.length > 0) {
492
+ // Array of answers — map to first question (multi-select single question)
493
+ answers[questions[0].question] = value.join(', ');
494
+ }
495
+ updatedInput.answers = answers;
496
+ session.claudeProcess.sendControlResponse(pending.requestId, 'allow', updatedInput);
497
+ }
498
+ /** Send a permission control response (allow/always_allow/approve_pattern/deny). */
499
+ sendControlResponseForRequest(session, pending, value) {
500
+ const { isDeny, isAlwaysAllow, isApprovePattern } = this.decodeApprovalValue(value);
501
+ if (isAlwaysAllow) {
502
+ this.deps.approvalManager.saveAlwaysAllow(session.groupDir ?? session.workingDir, pending.toolName, pending.toolInput);
503
+ }
504
+ if (isApprovePattern) {
505
+ this.deps.approvalManager.savePatternApproval(session.groupDir ?? session.workingDir, pending.toolName, pending.toolInput);
506
+ }
507
+ const behavior = isDeny ? 'deny' : 'allow';
508
+ session.claudeProcess.sendControlResponse(pending.requestId, behavior);
509
+ }
510
+ /**
511
+ * Check if a tool invocation can be auto-approved without prompting the user.
512
+ * Returns 'registry' if matched by auto-approval rules, 'session' if matched
513
+ * by the session's allowedTools list, 'headless' if the session has no clients
514
+ * and is a non-interactive source, or 'prompt' if the user needs to decide.
515
+ */
516
+ /** Tools that are controlled by permission mode rather than per-tool approval. */
517
+ static FILE_TOOLS = new Set(['Read', 'Write', 'Edit', 'Glob', 'Grep', 'NotebookEdit']);
518
+ /** Permission modes that auto-approve file-editing tools. */
519
+ static EDIT_MODES = new Set(['acceptEdits', 'bypassPermissions', 'dangerouslySkipPermissions']);
520
+ resolveAutoApproval(session, toolName, toolInput) {
521
+ // File tools are governed by permission mode, not per-tool approval.
522
+ // The PreToolUse hook intercepts them before Claude's native permission
523
+ // logic runs, so we must enforce permission mode here.
524
+ if (PromptRouter.FILE_TOOLS.has(toolName) && PromptRouter.EDIT_MODES.has(session.permissionMode ?? '')) {
525
+ return 'permissionMode';
526
+ }
527
+ if (this.deps.approvalManager.checkAutoApproval(session.groupDir ?? session.workingDir, toolName, toolInput)) {
528
+ return 'registry';
529
+ }
530
+ if (session.allowedTools && this.matchesAllowedTools(session.allowedTools, toolName, toolInput)) {
531
+ return 'session';
532
+ }
533
+ // Agent child sessions: only auto-approve tools in their allowedTools list,
534
+ // never blanket headless. This ensures AGENT_CHILD_ALLOWED_TOOLS is the
535
+ // actual permission boundary, not just a hint for when a browser is open.
536
+ if (session.clients.size === 0 && session.source === 'agent') {
537
+ return 'prompt';
538
+ }
539
+ if (session.clients.size === 0 && (session.source === 'webhook' || session.source === 'workflow' || session.source === 'stepflow' || session.source === 'orchestrator')) {
540
+ return 'headless';
541
+ }
542
+ return 'prompt';
543
+ }
544
+ /**
545
+ * Check if a tool invocation matches any of the session's allowedTools patterns.
546
+ * Patterns follow Claude CLI format: 'ToolName' or 'ToolName(prefix:*)'.
547
+ */
548
+ matchesAllowedTools(allowedTools, toolName, toolInput) {
549
+ for (const pattern of allowedTools) {
550
+ // Simple tool name match: 'WebFetch', 'Read', etc.
551
+ if (pattern === toolName)
552
+ return true;
553
+ // Parameterized match: 'Bash(curl:*)' → toolName=Bash, command starts with 'curl'
554
+ const match = pattern.match(/^(\w+)\(([^:]+):\*\)$/);
555
+ if (match) {
556
+ const [, patternTool, prefix] = match;
557
+ if (patternTool !== toolName)
558
+ continue;
559
+ // For Bash, check command prefix
560
+ if (toolName === 'Bash') {
561
+ const cmd = String(toolInput.command || '').trimStart();
562
+ if (cmd === prefix || cmd.startsWith(prefix + ' '))
563
+ return true;
564
+ }
565
+ }
566
+ }
567
+ return false;
568
+ }
569
+ /** Build a human-readable prompt string for a tool permission dialog. */
570
+ summarizeToolPermission(toolName, toolInput) {
571
+ switch (toolName) {
572
+ case 'Bash': {
573
+ const cmd = String(toolInput.command || '');
574
+ const firstLine = cmd.split('\n')[0];
575
+ const display = firstLine.length < cmd.length ? `${firstLine}...` : cmd;
576
+ return `Allow Bash? \`$ ${display}\``;
577
+ }
578
+ case 'Task':
579
+ return `Allow Task? ${String(toolInput.description || toolName)}`;
580
+ case 'Read': {
581
+ const filePath = String(toolInput.file_path || '');
582
+ return `Allow Read? \`${filePath}\``;
583
+ }
584
+ default:
585
+ return `Allow ${toolName}?`;
586
+ }
587
+ }
588
+ }
589
+ //# 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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"}