@cuongtran001/kanna 1.2.0 → 1.3.1

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 (196) hide show
  1. package/dist/client/assets/{arc-BLk1CZKB.js → arc-DXtN3EWJ.js} +1 -1
  2. package/dist/client/assets/{architectureDiagram-3BPJPVTR-B01ZQYte.js → architectureDiagram-3BPJPVTR-CIGqW1z-.js} +1 -1
  3. package/dist/client/assets/{blockDiagram-GPEHLZMM-diL6a3cq.js → blockDiagram-GPEHLZMM-BafNS_H6.js} +1 -1
  4. package/dist/client/assets/{c4Diagram-AAUBKEIU-BY1verL8.js → c4Diagram-AAUBKEIU-YdAgRSis.js} +1 -1
  5. package/dist/client/assets/channel-BEYTrUAm.js +1 -0
  6. package/dist/client/assets/{chunk-2J33WTMH-psdZuajw.js → chunk-2J33WTMH-eiP5y5G-.js} +1 -1
  7. package/dist/client/assets/{chunk-4BX2VUAB-CrwQVBc5.js → chunk-4BX2VUAB-CvLGzPMF.js} +1 -1
  8. package/dist/client/assets/{chunk-55IACEB6-9-aj4jKO.js → chunk-55IACEB6-Y-S9Fb8A.js} +1 -1
  9. package/dist/client/assets/{chunk-727SXJPM-1FNK9_nB.js → chunk-727SXJPM-6sJH1RI9.js} +1 -1
  10. package/dist/client/assets/{chunk-AQP2D5EJ-DFhvd_Ek.js → chunk-AQP2D5EJ-hV1r_IXO.js} +1 -1
  11. package/dist/client/assets/{chunk-FMBD7UC4-B7MLrDa7.js → chunk-FMBD7UC4-CC3L28S5.js} +1 -1
  12. package/dist/client/assets/{chunk-ND2GUHAM-D4Df05QE.js → chunk-ND2GUHAM-BZ3czhdH.js} +1 -1
  13. package/dist/client/assets/{chunk-QZHKN3VN-Iq17Dznm.js → chunk-QZHKN3VN-Bjyd6Yr-.js} +1 -1
  14. package/dist/client/assets/classDiagram-4FO5ZUOK-CvnF5Ud6.js +1 -0
  15. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-CvnF5Ud6.js +1 -0
  16. package/dist/client/assets/{cose-bilkent-S5V4N54A-BmaZhtXy.js → cose-bilkent-S5V4N54A-CfxdDghE.js} +1 -1
  17. package/dist/client/assets/{dagre-BM42HDAG-BCmpfnfP.js → dagre-BM42HDAG-B8CddsbB.js} +1 -1
  18. package/dist/client/assets/{diagram-2AECGRRQ-BIEcKowS.js → diagram-2AECGRRQ-F0yS0fVB.js} +1 -1
  19. package/dist/client/assets/{diagram-5GNKFQAL-CRBABBfv.js → diagram-5GNKFQAL-cW0i0qlh.js} +1 -1
  20. package/dist/client/assets/{diagram-KO2AKTUF-BRxUk16N.js → diagram-KO2AKTUF-BzAKMeJT.js} +1 -1
  21. package/dist/client/assets/{diagram-LMA3HP47-DPBs4xl1.js → diagram-LMA3HP47-qdC4XqIl.js} +1 -1
  22. package/dist/client/assets/{diagram-OG6HWLK6-BE9rgVv8.js → diagram-OG6HWLK6-CGcpi6Dh.js} +1 -1
  23. package/dist/client/assets/{erDiagram-TEJ5UH35-D3vgA1xJ.js → erDiagram-TEJ5UH35-CxNTDicM.js} +1 -1
  24. package/dist/client/assets/{flowDiagram-I6XJVG4X-Cgu-8XXC.js → flowDiagram-I6XJVG4X-qkGa5TqY.js} +1 -1
  25. package/dist/client/assets/{ganttDiagram-6RSMTGT7-CgjXVyTR.js → ganttDiagram-6RSMTGT7-D9mVPoQi.js} +1 -1
  26. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-zD5D8B-i.js → gitGraphDiagram-PVQCEYII-DA0grAXe.js} +1 -1
  27. package/dist/client/assets/{index-DBTdhMbJ.js → index-BqUY1Bm4.js} +1 -1
  28. package/dist/client/assets/index-CLsOWXff.css +32 -0
  29. package/dist/client/assets/{index-zQLLeAfl.js → index-TU1k6ov6.js} +253 -243
  30. package/dist/client/assets/{infoDiagram-5YYISTIA-BaFHqT4u.js → infoDiagram-5YYISTIA-CGljtLs3.js} +1 -1
  31. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-2yAC1br2.js → ishikawaDiagram-YF4QCWOH-CtC0xrmG.js} +1 -1
  32. package/dist/client/assets/{journeyDiagram-JHISSGLW-DacQ-ND5.js → journeyDiagram-JHISSGLW-URLnVZeN.js} +1 -1
  33. package/dist/client/assets/{kanban-definition-UN3LZRKU-Qlbwm3z4.js → kanban-definition-UN3LZRKU-C2Q6aqQh.js} +1 -1
  34. package/dist/client/assets/{linear-DeafqpgO.js → linear-ByKHtsIx.js} +1 -1
  35. package/dist/client/assets/{mermaid.core-KYiCPJDj.js → mermaid.core-Dl_f2KLc.js} +4 -4
  36. package/dist/client/assets/{mindmap-definition-RKZ34NQL-B1V-T6d3.js → mindmap-definition-RKZ34NQL-CaJ9IDLI.js} +1 -1
  37. package/dist/client/assets/{pieDiagram-4H26LBE5-DOF9OFRu.js → pieDiagram-4H26LBE5-mmYaf2Oa.js} +1 -1
  38. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-lH1mB7ko.js → quadrantDiagram-W4KKPZXB-B_PO6OCC.js} +1 -1
  39. package/dist/client/assets/{requirementDiagram-4Y6WPE33-BaTsJ_sS.js → requirementDiagram-4Y6WPE33-M4huwJt1.js} +1 -1
  40. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-Pfxib5iI.js → sankeyDiagram-5OEKKPKP-B0hb1sWh.js} +1 -1
  41. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-BQMEKkBC.js → sequenceDiagram-3UESZ5HK-BAqSptnA.js} +1 -1
  42. package/dist/client/assets/{stateDiagram-AJRCARHV-CuldNnzp.js → stateDiagram-AJRCARHV-DTNkvPi5.js} +1 -1
  43. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-CVN3oGTF.js +1 -0
  44. package/dist/client/assets/{timeline-definition-PNZ67QCA-DP7u0YAg.js → timeline-definition-PNZ67QCA-MgAjHz8Q.js} +1 -1
  45. package/dist/client/assets/{vennDiagram-CIIHVFJN-QlrjpNeQ.js → vennDiagram-CIIHVFJN-DmKoO51W.js} +1 -1
  46. package/dist/client/assets/{wardley-L42UT6IY-BqdJ_sAM.js → wardley-L42UT6IY-CWcyHnYs.js} +1 -1
  47. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-Wi3kaQ5X.js → wardleyDiagram-YWT4CUSO-BGIGmFP9.js} +1 -1
  48. package/dist/client/assets/{xychartDiagram-2RQKCTM6-D-KXMyCG.js → xychartDiagram-2RQKCTM6-D20YIvEl.js} +1 -1
  49. package/dist/client/index.html +2 -2
  50. package/package.json +1 -1
  51. package/src/server/agent-coordinator-types.ts +158 -0
  52. package/src/server/agent-coordinator.ts +919 -0
  53. package/src/server/agent-deps-builders.ts +425 -0
  54. package/src/server/agent.oauth-rotation.test.ts +101 -0
  55. package/src/server/agent.test.ts +24 -8
  56. package/src/server/agent.ts +35 -4963
  57. package/src/server/auto-continue/read-model.test.ts +2 -2
  58. package/src/server/auto-continue/read-model.ts +4 -1
  59. package/src/server/claude-autocontinue-commands.test.ts +494 -0
  60. package/src/server/claude-autocontinue-commands.ts +256 -0
  61. package/src/server/claude-cancel-handler.test.ts +472 -0
  62. package/src/server/claude-cancel-handler.ts +241 -0
  63. package/src/server/claude-chat-management.test.ts +395 -0
  64. package/src/server/claude-chat-management.ts +251 -0
  65. package/src/server/claude-harness-stream.test.ts +273 -0
  66. package/src/server/claude-harness-stream.ts +158 -0
  67. package/src/server/claude-loop-orch-commands.test.ts +579 -0
  68. package/src/server/claude-loop-orch-commands.ts +466 -0
  69. package/src/server/claude-message-normalizer.test.ts +213 -0
  70. package/src/server/claude-message-normalizer.ts +436 -0
  71. package/src/server/claude-prompt-helpers.test.ts +248 -0
  72. package/src/server/claude-prompt-helpers.ts +139 -0
  73. package/src/server/claude-sdk-queue.test.ts +169 -0
  74. package/src/server/claude-sdk-queue.ts +82 -0
  75. package/src/server/claude-send-command.test.ts +414 -0
  76. package/src/server/claude-send-command.ts +420 -0
  77. package/src/server/claude-session-config-helpers.test.ts +279 -0
  78. package/src/server/claude-session-config-helpers.ts +151 -0
  79. package/src/server/claude-session-config.test.ts +250 -0
  80. package/src/server/claude-session-config.ts +159 -0
  81. package/src/server/claude-session-error-handler.test.ts +498 -0
  82. package/src/server/claude-session-error-handler.ts +361 -0
  83. package/src/server/claude-session-lifecycle.test.ts +669 -0
  84. package/src/server/claude-session-lifecycle.ts +283 -0
  85. package/src/server/claude-session-rebuild.test.ts +224 -0
  86. package/src/server/claude-session-rebuild.ts +101 -0
  87. package/src/server/claude-session-runner.test.ts +523 -0
  88. package/src/server/claude-session-runner.ts +521 -0
  89. package/src/server/claude-session-spawner.test.ts +401 -0
  90. package/src/server/claude-session-spawner.ts +401 -0
  91. package/src/server/claude-session-start.test.ts +205 -0
  92. package/src/server/claude-session-start.ts +277 -0
  93. package/src/server/claude-session-state-queries.test.ts +344 -0
  94. package/src/server/claude-session-state-queries.ts +160 -0
  95. package/src/server/claude-session-state.ts +104 -0
  96. package/src/server/claude-slash-commands.test.ts +277 -0
  97. package/src/server/claude-slash-commands.ts +234 -0
  98. package/src/server/claude-spawn-helpers.test.ts +221 -0
  99. package/src/server/claude-spawn-helpers.ts +179 -0
  100. package/src/server/claude-steer-log.test.ts +243 -0
  101. package/src/server/claude-steer-log.ts +58 -0
  102. package/src/server/claude-subagent-tool-response.test.ts +213 -0
  103. package/src/server/claude-subagent-tool-response.ts +165 -0
  104. package/src/server/claude-subagent-wiring.test.ts +263 -0
  105. package/src/server/claude-subagent-wiring.ts +324 -0
  106. package/src/server/claude-tool-respond.test.ts +321 -0
  107. package/src/server/claude-tool-respond.ts +142 -0
  108. package/src/server/claude-turn-runner.test.ts +310 -0
  109. package/src/server/claude-turn-runner.ts +228 -0
  110. package/src/server/claude-turn-starter.test.ts +266 -0
  111. package/src/server/claude-turn-starter.ts +566 -0
  112. package/src/server/claude-usage-math.test.ts +169 -0
  113. package/src/server/claude-usage-math.ts +132 -0
  114. package/src/server/diff-store-branch-ops.adapter.test.ts +332 -0
  115. package/src/server/diff-store-branch-ops.adapter.ts +602 -0
  116. package/src/server/diff-store-commit-ops.adapter.test.ts +358 -0
  117. package/src/server/diff-store-commit-ops.adapter.ts +258 -0
  118. package/src/server/diff-store-errors.ts +85 -0
  119. package/src/server/diff-store-file-ops.adapter.ts +212 -0
  120. package/src/server/diff-store-git-branch.adapter.ts +686 -0
  121. package/src/server/diff-store-io.adapter.ts +27 -0
  122. package/src/server/diff-store-parse.test.ts +212 -0
  123. package/src/server/diff-store-parse.ts +122 -0
  124. package/src/server/diff-store-state.ts +82 -0
  125. package/src/server/diff-store.ts +76 -1854
  126. package/src/server/event-store-apply.test.ts +280 -0
  127. package/src/server/event-store-apply.ts +132 -0
  128. package/src/server/event-store-chat-lifecycle.test.ts +408 -0
  129. package/src/server/event-store-chat-lifecycle.ts +441 -0
  130. package/src/server/event-store-entity-write.ts +356 -0
  131. package/src/server/event-store-helpers.test.ts +230 -0
  132. package/src/server/event-store-helpers.ts +235 -0
  133. package/src/server/event-store-init.ts +276 -0
  134. package/src/server/event-store-messages.adapter.test.ts +365 -0
  135. package/src/server/event-store-messages.adapter.ts +213 -0
  136. package/src/server/event-store-orch-subscription.ts +124 -0
  137. package/src/server/event-store-orch.test.ts +462 -0
  138. package/src/server/event-store-orch.ts +312 -0
  139. package/src/server/event-store-peripheral-events.adapter.test.ts +254 -0
  140. package/src/server/event-store-peripheral-events.adapter.ts +105 -0
  141. package/src/server/event-store-snapshot.test.ts +597 -0
  142. package/src/server/event-store-snapshot.ts +658 -0
  143. package/src/server/event-store-subagent.test.ts +408 -0
  144. package/src/server/event-store-subagent.ts +198 -0
  145. package/src/server/event-store-tool-requests.test.ts +210 -0
  146. package/src/server/event-store-tool-requests.ts +131 -0
  147. package/src/server/event-store-transcript-write.adapter.ts +285 -0
  148. package/src/server/event-store-write-ops.test.ts +554 -0
  149. package/src/server/event-store-write-ops.ts +529 -0
  150. package/src/server/event-store.test.ts +35 -0
  151. package/src/server/event-store.ts +251 -2284
  152. package/src/server/events.ts +3 -0
  153. package/src/server/harness-types.ts +15 -1
  154. package/src/server/oauth-errors.ts +19 -0
  155. package/src/server/read-models.ts +26 -1
  156. package/src/server/subagent-orchestrator.ts +3 -0
  157. package/src/server/ws-router-agent-ctrl.test.ts +187 -0
  158. package/src/server/ws-router-agent-ctrl.ts +137 -0
  159. package/src/server/ws-router-broadcast.ts +488 -0
  160. package/src/server/ws-router-chat.test.ts +461 -0
  161. package/src/server/ws-router-chat.ts +279 -0
  162. package/src/server/ws-router-defaults.test.ts +283 -0
  163. package/src/server/ws-router-defaults.ts +434 -0
  164. package/src/server/ws-router-diff.test.ts +167 -0
  165. package/src/server/ws-router-diff.ts +250 -0
  166. package/src/server/ws-router-envelope.ts +329 -0
  167. package/src/server/ws-router-misc.test.ts +422 -0
  168. package/src/server/ws-router-misc.ts +265 -0
  169. package/src/server/ws-router-orch.test.ts +190 -0
  170. package/src/server/ws-router-orch.ts +93 -0
  171. package/src/server/ws-router-project.test.ts +403 -0
  172. package/src/server/ws-router-project.ts +256 -0
  173. package/src/server/ws-router-push.test.ts +193 -0
  174. package/src/server/ws-router-push.ts +120 -0
  175. package/src/server/ws-router-settings.test.ts +173 -0
  176. package/src/server/ws-router-settings.ts +416 -0
  177. package/src/server/ws-router-skills.test.ts +194 -0
  178. package/src/server/ws-router-skills.ts +204 -0
  179. package/src/server/ws-router-utils.ts +224 -0
  180. package/src/server/ws-router.ts +339 -2254
  181. package/src/shared/app-settings-types.ts +365 -0
  182. package/src/shared/core-types.ts +27 -0
  183. package/src/shared/git-diff-types.ts +165 -0
  184. package/src/shared/loop-progress.test.ts +106 -0
  185. package/src/shared/loop-progress.ts +88 -0
  186. package/src/shared/mcp-types.ts +105 -0
  187. package/src/shared/provider-model-types.ts +437 -0
  188. package/src/shared/subagent-types.ts +198 -0
  189. package/src/shared/tool-call-types.ts +314 -0
  190. package/src/shared/transcript-types.ts +270 -0
  191. package/src/shared/types.ts +27 -1668
  192. package/dist/client/assets/channel-BMkhjiLI.js +0 -1
  193. package/dist/client/assets/classDiagram-4FO5ZUOK-C5Kg1XOD.js +0 -1
  194. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-C5Kg1XOD.js +0 -1
  195. package/dist/client/assets/index-H6C-f2Vp.css +0 -32
  196. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-Ca2U11af.js +0 -1
@@ -0,0 +1,198 @@
1
+ // Subagent domain types: definitions, runtime snapshots, loop progress.
2
+ // Extracted from types.ts to keep the barrel lean.
3
+ // All external consumers importing from "../shared/types" continue to work unchanged.
4
+
5
+ import type { AgentProvider } from "./core-types"
6
+ import type { ClaudeModelOptions, CodexModelOptions } from "./provider-model-types"
7
+ import type { TranscriptEntry } from "./transcript-types"
8
+
9
+ export type SubagentContextScope = "previous-assistant-reply" | "full-transcript"
10
+
11
+ export type SubagentTriggerMode = "auto" | "manual"
12
+
13
+ export interface SubagentRestriction {
14
+ workingDir?: string
15
+ allowedPaths?: string[]
16
+ }
17
+
18
+ export interface Subagent {
19
+ id: string
20
+ name: string
21
+ description?: string
22
+ provider: AgentProvider
23
+ model: string
24
+ modelOptions: ClaudeModelOptions | CodexModelOptions
25
+ systemPrompt: string
26
+ contextScope: SubagentContextScope
27
+ triggerMode: SubagentTriggerMode
28
+ workingDir?: string
29
+ allowedPaths?: string[]
30
+ // Per-subagent agentic-turn bound — the analog of Claude Code's agent
31
+ // frontmatter `maxTurns`. Unset = unbounded (Claude Code's default).
32
+ // Claude-SDK runs pass it natively to query() (graceful stop, output kept);
33
+ // PTY/Codex runs get a host-side tool-call-count backstop (hard abort).
34
+ maxTurns?: number
35
+ createdAt: number
36
+ updatedAt: number
37
+ }
38
+
39
+ export interface SubagentInput {
40
+ name: string
41
+ description?: string
42
+ provider: AgentProvider
43
+ model: string
44
+ modelOptions: ClaudeModelOptions | CodexModelOptions
45
+ systemPrompt: string
46
+ contextScope: SubagentContextScope
47
+ triggerMode?: SubagentTriggerMode
48
+ workingDir?: string
49
+ allowedPaths?: string[]
50
+ maxTurns?: number
51
+ }
52
+
53
+ export interface SubagentPatch {
54
+ name?: string
55
+ description?: string | null
56
+ provider?: AgentProvider
57
+ model?: string
58
+ modelOptions?: Partial<ClaudeModelOptions> | Partial<CodexModelOptions>
59
+ systemPrompt?: string
60
+ contextScope?: SubagentContextScope
61
+ triggerMode?: SubagentTriggerMode
62
+ workingDir?: string | null
63
+ allowedPaths?: string[] | null
64
+ maxTurns?: number | null
65
+ }
66
+
67
+ export type SubagentValidationErrorCode =
68
+ | "EMPTY_NAME"
69
+ | "INVALID_CHAR"
70
+ | "RESERVED_NAME"
71
+ | "DUPLICATE_NAME"
72
+ | "TOO_LONG"
73
+ | "NOT_FOUND"
74
+ | "RESTRICTION_NOT_SUPPORTED"
75
+ | "INVALID_PATH"
76
+ | "PATH_ESCAPE"
77
+ | "EMPTY_ALLOWED_PATHS"
78
+
79
+ export interface SubagentValidationError {
80
+ code: SubagentValidationErrorCode
81
+ message: string
82
+ }
83
+
84
+ export type SubagentErrorCode =
85
+ | "AUTH_REQUIRED"
86
+ | "UNKNOWN_SUBAGENT"
87
+ | "MANUAL_ONLY"
88
+ | "LOOP_DETECTED"
89
+ | "DEPTH_EXCEEDED"
90
+ | "TIMEOUT"
91
+ | "MAX_TURNS"
92
+ | "PROVIDER_ERROR"
93
+ | "INTERRUPTED"
94
+ | "USER_CANCELLED"
95
+ | "CAP_EXCEEDED"
96
+ | "NO_LIVE_SESSION"
97
+
98
+ export type SubagentRunStatus = "running" | "completed" | "failed" | "cancelled"
99
+
100
+ export interface ProviderUsage {
101
+ inputTokens?: number
102
+ outputTokens?: number
103
+ cachedInputTokens?: number
104
+ costUsd?: number
105
+ }
106
+
107
+ export interface SubagentPendingTool {
108
+ toolUseId: string
109
+ toolKind: "ask_user_question" | "exit_plan_mode"
110
+ input: Record<string, unknown>
111
+ requestedAt: number
112
+ }
113
+
114
+ export interface SubagentRunSnapshot {
115
+ runId: string
116
+ chatId: string
117
+ subagentId: string | null
118
+ subagentName: string
119
+ /**
120
+ * Short human label for this run, derived from the first line of the spawn
121
+ * prompt (e.g. "Migrate useKannaState.ts"). Null for runs started before this
122
+ * field existed or by error paths that never carried a prompt. Drives the
123
+ * Loop Progress panel rows so each round reads as the chunk it worked on
124
+ * rather than an opaque run id.
125
+ */
126
+ label: string | null
127
+ provider: AgentProvider
128
+ model: string
129
+ status: SubagentRunStatus
130
+ parentUserMessageId: string
131
+ parentRunId: string | null
132
+ depth: number
133
+ startedAt: number
134
+ finishedAt: number | null
135
+ finalText: string | null
136
+ error: { code: SubagentErrorCode; message: string } | null
137
+ usage: ProviderUsage | null
138
+ /**
139
+ * Every TranscriptEntry the subagent produced, in arrival order. Includes
140
+ * tool_call, tool_result, system_init, account_info, result. assistant_text
141
+ * entries also live here in addition to being concatenated into finalText
142
+ * via subagent_message_delta — clients should prefer entries[] for rich
143
+ * rendering, finalText only as a quick text-only summary.
144
+ */
145
+ entries: TranscriptEntry[]
146
+ /**
147
+ * Set while the subagent is awaiting a user response to an
148
+ * interactive tool call (AskUserQuestion / ExitPlanMode). Null
149
+ * otherwise. The orchestrator's wall-clock timeout is paused while
150
+ * this is non-null.
151
+ */
152
+ pendingTool: SubagentPendingTool | null
153
+ }
154
+
155
+ export type LoopRowStatus = "pending" | "running" | "done" | "failed"
156
+
157
+ export interface LoopRow {
158
+ runId: string
159
+ label: string
160
+ status: LoopRowStatus
161
+ startedAt: number
162
+ finishedAt: number | null
163
+ }
164
+
165
+ export interface LoopRateLimitInfo {
166
+ /** The live auto-continue schedule id, so the panel's Resume action can accept it. */
167
+ scheduleId: string
168
+ /** epoch ms the usage limit resets (and the resume is/would be scheduled for) */
169
+ resetAt: number
170
+ tz: string
171
+ /**
172
+ * true → an auto-continue is already scheduled to fire at `resetAt`
173
+ * (the loop resumes on its own).
174
+ * false → the resume is only proposed and waits on the user
175
+ * (auto-resume setting off) — render a "Resume" action.
176
+ */
177
+ scheduled: boolean
178
+ }
179
+
180
+ export interface LoopProgressSnapshot {
181
+ chatId: string
182
+ /** Whether a loop is currently armed for this chat. */
183
+ armed: boolean
184
+ /** Latest first — most recent delegation at the top, mirroring PROGRESS.md. */
185
+ rows: LoopRow[]
186
+ /** Non-null while the loop is paused on a Claude usage limit. */
187
+ rateLimit: LoopRateLimitInfo | null
188
+ }
189
+
190
+ // Type guards
191
+
192
+ export function isSubagentContextScope(value: string): value is SubagentContextScope {
193
+ return value === "previous-assistant-reply" || value === "full-transcript"
194
+ }
195
+
196
+ export function isSubagentTriggerMode(value: string): value is SubagentTriggerMode {
197
+ return value === "auto" || value === "manual"
198
+ }
@@ -0,0 +1,314 @@
1
+ /**
2
+ * Tool call shapes (raw + hydrated) — extracted from shared/types.ts.
3
+ * Completely self-contained: no imports from types.ts.
4
+ * Imported via the re-export barrel in types.ts; all external consumers
5
+ * continue to import from "../shared/types" unchanged.
6
+ */
7
+
8
+ // ---------------------------------------------------------------------------
9
+ // AskUserQuestion / TodoWrite payload primitives
10
+ // ---------------------------------------------------------------------------
11
+
12
+ export interface AskUserQuestionOption {
13
+ label: string
14
+ description?: string
15
+ }
16
+
17
+ export interface AskUserQuestionItem {
18
+ id?: string
19
+ question: string
20
+ header?: string
21
+ options?: AskUserQuestionOption[]
22
+ multiSelect?: boolean
23
+ }
24
+
25
+ export type AskUserQuestionAnswerMap = Record<string, string[]>
26
+
27
+ export interface TodoItem {
28
+ content: string
29
+ status: "pending" | "in_progress" | "completed"
30
+ activeForm: string
31
+ }
32
+
33
+ // ---------------------------------------------------------------------------
34
+ // Raw tool call shapes
35
+ // ---------------------------------------------------------------------------
36
+
37
+ interface ToolCallBase<TKind extends string, TInput> {
38
+ kind: "tool"
39
+ toolKind: TKind
40
+ toolName: string
41
+ toolId: string
42
+ input: TInput
43
+ rawInput?: Record<string, unknown>
44
+ }
45
+
46
+ export interface AskUserQuestionToolCall
47
+ extends ToolCallBase<"ask_user_question", { questions: AskUserQuestionItem[] }> { }
48
+
49
+ export interface ExitPlanModeToolCall
50
+ extends ToolCallBase<"exit_plan_mode", { plan?: string; summary?: string }> { }
51
+
52
+ export interface TodoWriteToolCall
53
+ extends ToolCallBase<"todo_write", { todos: TodoItem[] }> { }
54
+
55
+ export interface SkillToolCall
56
+ extends ToolCallBase<"skill", { skill: string }> { }
57
+
58
+ export interface GlobToolCall
59
+ extends ToolCallBase<"glob", { pattern: string }> { }
60
+
61
+ export interface GrepToolCall
62
+ extends ToolCallBase<"grep", { pattern: string; outputMode?: string }> { }
63
+
64
+ export interface BashToolCall
65
+ extends ToolCallBase<"bash", { command: string; description?: string; timeoutMs?: number; runInBackground?: boolean }> { }
66
+
67
+ export interface WebSearchToolCall
68
+ extends ToolCallBase<"web_search", { query: string }> { }
69
+
70
+ export interface ReadFileToolCall
71
+ extends ToolCallBase<"read_file", { filePath: string }> { }
72
+
73
+ export interface WriteFileToolCall
74
+ extends ToolCallBase<"write_file", { filePath: string; content: string }> { }
75
+
76
+ export interface EditFileToolCall
77
+ extends ToolCallBase<"edit_file", { filePath: string; oldString: string; newString: string }> { }
78
+
79
+ export interface DeleteFileToolCall
80
+ extends ToolCallBase<"delete_file", { filePath: string; content: string }> { }
81
+
82
+ export interface SubagentTaskToolCall
83
+ extends ToolCallBase<"subagent_task", { subagentType?: string }> { }
84
+
85
+ export interface McpGenericToolCall
86
+ extends ToolCallBase<"mcp_generic", { server: string; tool: string; payload: Record<string, unknown> }> { }
87
+
88
+ export interface OfferDownloadToolCall
89
+ extends ToolCallBase<"offer_download", { path: string; label?: string }> { }
90
+
91
+ export interface OfferDownloadToolResult {
92
+ contentUrl: string
93
+ relativePath: string
94
+ fileName: string
95
+ displayName: string
96
+ size: number
97
+ mimeType?: string
98
+ }
99
+
100
+ export interface PreviewFileToolCall
101
+ extends ToolCallBase<"preview_file", { path: string; label?: string }> { }
102
+
103
+ export interface PreviewFileToolResult {
104
+ contentUrl: string
105
+ relativePath: string
106
+ fileName: string
107
+ displayName: string
108
+ size: number
109
+ mimeType: string
110
+ }
111
+
112
+ export type ImageGenerationStatus = "in_progress" | "completed" | "failed"
113
+
114
+ export interface ImageGenerationToolCall
115
+ extends ToolCallBase<"image_generation", { revisedPrompt: string | null; status: ImageGenerationStatus }> { }
116
+
117
+ export interface ImageGenerationToolResult {
118
+ contentUrl: string
119
+ relativePath: string
120
+ fileName: string
121
+ }
122
+
123
+ export interface UnknownToolCall
124
+ extends ToolCallBase<"unknown_tool", { payload: Record<string, unknown> }> { }
125
+
126
+ export interface WorkflowToolCall
127
+ extends ToolCallBase<"workflow", { name?: string; description?: string; scriptPath?: string }> { }
128
+
129
+ export type NormalizedToolCall =
130
+ | AskUserQuestionToolCall
131
+ | ExitPlanModeToolCall
132
+ | TodoWriteToolCall
133
+ | SkillToolCall
134
+ | GlobToolCall
135
+ | GrepToolCall
136
+ | BashToolCall
137
+ | WebSearchToolCall
138
+ | ReadFileToolCall
139
+ | WriteFileToolCall
140
+ | EditFileToolCall
141
+ | DeleteFileToolCall
142
+ | SubagentTaskToolCall
143
+ | McpGenericToolCall
144
+ | OfferDownloadToolCall
145
+ | PreviewFileToolCall
146
+ | ImageGenerationToolCall
147
+ | WorkflowToolCall
148
+ | UnknownToolCall
149
+
150
+ // ---------------------------------------------------------------------------
151
+ // Hydrated tool call shapes
152
+ // ---------------------------------------------------------------------------
153
+
154
+ export interface HydratedToolCallBase<TKind extends string, TInput, TResult> {
155
+ id: string
156
+ messageId?: string
157
+ hidden?: boolean
158
+ kind: "tool"
159
+ toolKind: TKind
160
+ toolName: string
161
+ toolId: string
162
+ input: TInput
163
+ result?: TResult
164
+ rawResult?: string | Record<string, unknown> | readonly unknown[] | null
165
+ isError?: boolean
166
+ /**
167
+ * Set when the underlying tool_result entry was persisted to disk
168
+ * via the subagent payload cap. Mirrored from
169
+ * ToolResultEntry.persisted during hydration.
170
+ */
171
+ persisted?: {
172
+ filePath: string
173
+ originalSize: number
174
+ isJson: boolean
175
+ truncated: true
176
+ }
177
+ timestamp: string
178
+ }
179
+
180
+ export interface AskUserQuestionToolResult {
181
+ answers: AskUserQuestionAnswerMap
182
+ discarded?: boolean
183
+ }
184
+
185
+ export interface ExitPlanModeToolResult {
186
+ confirmed?: boolean
187
+ clearContext?: boolean
188
+ message?: string
189
+ discarded?: boolean
190
+ }
191
+
192
+ export type HydratedAskUserQuestionToolCall =
193
+ HydratedToolCallBase<"ask_user_question", AskUserQuestionToolCall["input"], AskUserQuestionToolResult>
194
+
195
+ export type HydratedExitPlanModeToolCall =
196
+ HydratedToolCallBase<"exit_plan_mode", ExitPlanModeToolCall["input"], ExitPlanModeToolResult>
197
+
198
+ export type HydratedTodoWriteToolCall =
199
+ HydratedToolCallBase<"todo_write", TodoWriteToolCall["input"], unknown>
200
+
201
+ export type HydratedSkillToolCall =
202
+ HydratedToolCallBase<"skill", SkillToolCall["input"], unknown>
203
+
204
+ export type HydratedGlobToolCall =
205
+ HydratedToolCallBase<"glob", GlobToolCall["input"], unknown>
206
+
207
+ export type HydratedGrepToolCall =
208
+ HydratedToolCallBase<"grep", GrepToolCall["input"], unknown>
209
+
210
+ export type HydratedBashToolCall =
211
+ HydratedToolCallBase<"bash", BashToolCall["input"], unknown>
212
+
213
+ export type HydratedWebSearchToolCall =
214
+ HydratedToolCallBase<"web_search", WebSearchToolCall["input"], unknown>
215
+
216
+ export interface ReadFileTextBlock {
217
+ type: "text"
218
+ text: string
219
+ }
220
+
221
+ export interface ReadFileImageBlock {
222
+ type: "image"
223
+ data: string
224
+ mimeType?: string
225
+ }
226
+
227
+ export interface ReadFileToolResult {
228
+ content: string
229
+ blocks?: Array<ReadFileTextBlock | ReadFileImageBlock>
230
+ }
231
+
232
+ export type HydratedReadFileToolCall =
233
+ HydratedToolCallBase<"read_file", ReadFileToolCall["input"], ReadFileToolResult | string>
234
+
235
+ export type HydratedWriteFileToolCall =
236
+ HydratedToolCallBase<"write_file", WriteFileToolCall["input"], unknown>
237
+
238
+ export type HydratedEditFileToolCall =
239
+ HydratedToolCallBase<"edit_file", EditFileToolCall["input"], unknown>
240
+
241
+ export type HydratedDeleteFileToolCall =
242
+ HydratedToolCallBase<"delete_file", DeleteFileToolCall["input"], unknown>
243
+
244
+ export interface SubagentToolStats {
245
+ readCount?: number
246
+ searchCount?: number
247
+ bashCount?: number
248
+ editFileCount?: number
249
+ linesAdded?: number
250
+ linesRemoved?: number
251
+ otherToolCount?: number
252
+ }
253
+
254
+ // Parsed from the `Agent`/`Task` tool_result's top-level `toolUseResult`
255
+ // sidecar (camelCase, written by claude-code into the transcript JSONL and
256
+ // preserved on the tool_result entry's debugRaw). All fields optional — the
257
+ // SDK driver / older transcripts / in-flight calls may omit it entirely.
258
+ export interface SubagentTaskResult {
259
+ agentId?: string
260
+ agentType?: string
261
+ status?: string
262
+ totalTokens?: number
263
+ totalDurationMs?: number
264
+ totalToolUseCount?: number
265
+ toolStats?: SubagentToolStats
266
+ content?: string
267
+ }
268
+
269
+ export type HydratedSubagentTaskToolCall =
270
+ HydratedToolCallBase<"subagent_task", SubagentTaskToolCall["input"], SubagentTaskResult>
271
+
272
+ export type HydratedMcpGenericToolCall =
273
+ HydratedToolCallBase<"mcp_generic", McpGenericToolCall["input"], unknown>
274
+
275
+ export type HydratedOfferDownloadToolCall =
276
+ HydratedToolCallBase<"offer_download", OfferDownloadToolCall["input"], OfferDownloadToolResult>
277
+
278
+ export type HydratedPreviewFileToolCall =
279
+ HydratedToolCallBase<"preview_file", PreviewFileToolCall["input"], PreviewFileToolResult>
280
+
281
+ export type HydratedImageGenerationToolCall =
282
+ HydratedToolCallBase<"image_generation", ImageGenerationToolCall["input"], ImageGenerationToolResult>
283
+
284
+ export interface WorkflowToolResult {
285
+ taskId?: string
286
+ text: string
287
+ }
288
+
289
+ export type HydratedWorkflowToolCall =
290
+ HydratedToolCallBase<"workflow", WorkflowToolCall["input"], WorkflowToolResult>
291
+
292
+ export type HydratedUnknownToolCall =
293
+ HydratedToolCallBase<"unknown_tool", UnknownToolCall["input"], unknown>
294
+
295
+ export type HydratedToolCall =
296
+ | HydratedAskUserQuestionToolCall
297
+ | HydratedExitPlanModeToolCall
298
+ | HydratedTodoWriteToolCall
299
+ | HydratedSkillToolCall
300
+ | HydratedGlobToolCall
301
+ | HydratedGrepToolCall
302
+ | HydratedBashToolCall
303
+ | HydratedWebSearchToolCall
304
+ | HydratedReadFileToolCall
305
+ | HydratedWriteFileToolCall
306
+ | HydratedEditFileToolCall
307
+ | HydratedDeleteFileToolCall
308
+ | HydratedSubagentTaskToolCall
309
+ | HydratedMcpGenericToolCall
310
+ | HydratedOfferDownloadToolCall
311
+ | HydratedPreviewFileToolCall
312
+ | HydratedImageGenerationToolCall
313
+ | HydratedWorkflowToolCall
314
+ | HydratedUnknownToolCall