indusagi-coding-agent 0.2.3 → 0.2.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 (260) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/LICENSE +661 -0
  3. package/README.md +95 -1
  4. package/dist/entry.js +3205 -1585
  5. package/dist/guardrails.js +47 -515
  6. package/dist/index.js +3232 -1671
  7. package/package.json +8 -7
  8. package/dist/types/addons/addons.test.d.ts +0 -21
  9. package/dist/types/addons/contract.d.ts +0 -640
  10. package/dist/types/addons/dispatch/event-dispatcher.d.ts +0 -140
  11. package/dist/types/addons/dispatch/index.d.ts +0 -23
  12. package/dist/types/addons/dispatch/tool-interceptor.d.ts +0 -128
  13. package/dist/types/addons/host.d.ts +0 -246
  14. package/dist/types/addons/index.d.ts +0 -51
  15. package/dist/types/addons/manifest.d.ts +0 -56
  16. package/dist/types/addons/sandbox.d.ts +0 -103
  17. package/dist/types/addons/surface.d.ts +0 -42
  18. package/dist/types/boot/auth-vault.d.ts +0 -29
  19. package/dist/types/boot/boot.d.ts +0 -26
  20. package/dist/types/boot/boot.test.d.ts +0 -15
  21. package/dist/types/boot/contract.d.ts +0 -236
  22. package/dist/types/boot/index.d.ts +0 -20
  23. package/dist/types/boot/invocation.d.ts +0 -40
  24. package/dist/types/boot/invocation.test.d.ts +0 -8
  25. package/dist/types/boot/runners/addon-wiring.d.ts +0 -103
  26. package/dist/types/boot/runners/addon-wiring.test.d.ts +0 -19
  27. package/dist/types/boot/runners/checkpoint.d.ts +0 -133
  28. package/dist/types/boot/runners/checkpoint.test.d.ts +0 -12
  29. package/dist/types/boot/runners/delegate-runner.d.ts +0 -89
  30. package/dist/types/boot/runners/delegate-runner.test.d.ts +0 -13
  31. package/dist/types/boot/runners/index.d.ts +0 -13
  32. package/dist/types/boot/runners/link-runner.d.ts +0 -20
  33. package/dist/types/boot/runners/memdir.d.ts +0 -103
  34. package/dist/types/boot/runners/memdir.test.d.ts +0 -12
  35. package/dist/types/boot/runners/oneshot-runner.d.ts +0 -19
  36. package/dist/types/boot/runners/read-state.d.ts +0 -82
  37. package/dist/types/boot/runners/read-state.test.d.ts +0 -10
  38. package/dist/types/boot/runners/registry.d.ts +0 -30
  39. package/dist/types/boot/runners/repl-runner.d.ts +0 -19
  40. package/dist/types/boot/runners/session-persist.test.d.ts +0 -10
  41. package/dist/types/boot/runners/session.d.ts +0 -65
  42. package/dist/types/boot/runners/session.test.d.ts +0 -10
  43. package/dist/types/boot/stages.d.ts +0 -92
  44. package/dist/types/boot/upgrade/apply.d.ts +0 -45
  45. package/dist/types/boot/upgrade/index.d.ts +0 -13
  46. package/dist/types/boot/upgrade/upgrades.d.ts +0 -126
  47. package/dist/types/briefing/briefing.test.d.ts +0 -15
  48. package/dist/types/briefing/compose.d.ts +0 -37
  49. package/dist/types/briefing/context-docs.d.ts +0 -38
  50. package/dist/types/briefing/context-docs.test.d.ts +0 -18
  51. package/dist/types/briefing/contract.d.ts +0 -686
  52. package/dist/types/briefing/index.d.ts +0 -29
  53. package/dist/types/briefing/macros.d.ts +0 -206
  54. package/dist/types/briefing/skills.d.ts +0 -67
  55. package/dist/types/capability-deck/bridge-ledger/index.d.ts +0 -25
  56. package/dist/types/capability-deck/bridge-ledger/key.d.ts +0 -65
  57. package/dist/types/capability-deck/bridge-ledger/ledger.d.ts +0 -129
  58. package/dist/types/capability-deck/bridge-ledger/network.d.ts +0 -115
  59. package/dist/types/capability-deck/builtin-bridge.d.ts +0 -114
  60. package/dist/types/capability-deck/capability-deck.test.d.ts +0 -18
  61. package/dist/types/capability-deck/cards/bg-process-card.d.ts +0 -99
  62. package/dist/types/capability-deck/cards/index.d.ts +0 -37
  63. package/dist/types/capability-deck/cards/memory-card.d.ts +0 -68
  64. package/dist/types/capability-deck/cards/plan-file.d.ts +0 -56
  65. package/dist/types/capability-deck/cards/plan-tools.d.ts +0 -97
  66. package/dist/types/capability-deck/cards/plan-tools.test.d.ts +0 -9
  67. package/dist/types/capability-deck/cards/saas-card.d.ts +0 -78
  68. package/dist/types/capability-deck/cards/task-card.d.ts +0 -106
  69. package/dist/types/capability-deck/cards/todo-card.d.ts +0 -78
  70. package/dist/types/capability-deck/cards/workflow-card.d.ts +0 -55
  71. package/dist/types/capability-deck/cards/workflow-card.test.d.ts +0 -12
  72. package/dist/types/capability-deck/checkpoint.int.test.d.ts +0 -25
  73. package/dist/types/capability-deck/contract.d.ts +0 -317
  74. package/dist/types/capability-deck/index.d.ts +0 -46
  75. package/dist/types/capability-deck/manifest.d.ts +0 -60
  76. package/dist/types/capability-deck/provision.d.ts +0 -76
  77. package/dist/types/capability-deck/read-edit-gate.int.test.d.ts +0 -21
  78. package/dist/types/channels/channels.test.d.ts +0 -15
  79. package/dist/types/channels/contract.d.ts +0 -489
  80. package/dist/types/channels/framer.d.ts +0 -49
  81. package/dist/types/channels/index.d.ts +0 -24
  82. package/dist/types/channels/link/dialog.d.ts +0 -138
  83. package/dist/types/channels/link/driver.d.ts +0 -81
  84. package/dist/types/channels/link/index.d.ts +0 -13
  85. package/dist/types/channels/link/server.d.ts +0 -70
  86. package/dist/types/channels/oneshot.d.ts +0 -37
  87. package/dist/types/channels/ops.d.ts +0 -89
  88. package/dist/types/channels/session-ops.d.ts +0 -80
  89. package/dist/types/conductor/bash-guard.d.ts +0 -106
  90. package/dist/types/conductor/bash-guard.test.d.ts +0 -17
  91. package/dist/types/conductor/catalog/catalog.d.ts +0 -87
  92. package/dist/types/conductor/catalog/index.d.ts +0 -14
  93. package/dist/types/conductor/catalog/matcher.d.ts +0 -47
  94. package/dist/types/conductor/conductor.d.ts +0 -189
  95. package/dist/types/conductor/conductor.test.d.ts +0 -10
  96. package/dist/types/conductor/contract.d.ts +0 -774
  97. package/dist/types/conductor/diagnostics.d.ts +0 -183
  98. package/dist/types/conductor/diagnostics.test.d.ts +0 -10
  99. package/dist/types/conductor/index.d.ts +0 -26
  100. package/dist/types/conductor/permission-gate.integration.test.d.ts +0 -22
  101. package/dist/types/conductor/permission-wiring.test.d.ts +0 -14
  102. package/dist/types/conductor/permissions.d.ts +0 -217
  103. package/dist/types/conductor/permissions.test.d.ts +0 -12
  104. package/dist/types/conductor/plan-mode.integration.test.d.ts +0 -23
  105. package/dist/types/conductor/post-edit-diagnostics.test.d.ts +0 -13
  106. package/dist/types/conductor/signal-hub/hub.d.ts +0 -83
  107. package/dist/types/conductor/signal-hub/index.d.ts +0 -19
  108. package/dist/types/conductor/signal-hub/translate.d.ts +0 -77
  109. package/dist/types/conductor/skill-parse/index.d.ts +0 -10
  110. package/dist/types/conductor/skill-parse/parse.d.ts +0 -67
  111. package/dist/types/conductor/submit.test.d.ts +0 -28
  112. package/dist/types/conductor/transcript-store/index.d.ts +0 -16
  113. package/dist/types/conductor/transcript-store/serialize.d.ts +0 -106
  114. package/dist/types/conductor/transcript-store/serialize.test.d.ts +0 -10
  115. package/dist/types/conductor/transcript-store/store.d.ts +0 -188
  116. package/dist/types/console/components/AgentsView.d.ts +0 -41
  117. package/dist/types/console/components/BackgroundAgents.d.ts +0 -63
  118. package/dist/types/console/components/BackgroundAgents.test.d.ts +0 -8
  119. package/dist/types/console/components/Banner.d.ts +0 -110
  120. package/dist/types/console/components/Composer.d.ts +0 -37
  121. package/dist/types/console/components/StatusBar.d.ts +0 -42
  122. package/dist/types/console/components/TerminalConsole.d.ts +0 -32
  123. package/dist/types/console/components/WorkingIndicator.d.ts +0 -44
  124. package/dist/types/console/components/WorkingIndicator.test.d.ts +0 -9
  125. package/dist/types/console/components/banner-sweep.d.ts +0 -55
  126. package/dist/types/console/components/banner.test.d.ts +0 -9
  127. package/dist/types/console/components/welcome.d.ts +0 -115
  128. package/dist/types/console/components/welcome.test.d.ts +0 -9
  129. package/dist/types/console/console.test.d.ts +0 -19
  130. package/dist/types/console/contract.d.ts +0 -598
  131. package/dist/types/console/index.d.ts +0 -34
  132. package/dist/types/console/input/complete.d.ts +0 -120
  133. package/dist/types/console/input/dir-reader.d.ts +0 -28
  134. package/dist/types/console/input/index.d.ts +0 -24
  135. package/dist/types/console/input/input.test.d.ts +0 -14
  136. package/dist/types/console/input/keymap.d.ts +0 -193
  137. package/dist/types/console/input/paste.d.ts +0 -131
  138. package/dist/types/console/mount.d.ts +0 -53
  139. package/dist/types/console/overlays/approval-queue.d.ts +0 -71
  140. package/dist/types/console/overlays/approval.d.ts +0 -104
  141. package/dist/types/console/overlays/approval.test.d.ts +0 -17
  142. package/dist/types/console/overlays/auth.d.ts +0 -31
  143. package/dist/types/console/overlays/boards.d.ts +0 -55
  144. package/dist/types/console/overlays/host.d.ts +0 -45
  145. package/dist/types/console/overlays/index.d.ts +0 -15
  146. package/dist/types/console/overlays/pickers.d.ts +0 -37
  147. package/dist/types/console/overlays/sessions.d.ts +0 -29
  148. package/dist/types/console/reducer.d.ts +0 -51
  149. package/dist/types/console/slash/builtins.d.ts +0 -33
  150. package/dist/types/console/slash/commands/dynamic.d.ts +0 -57
  151. package/dist/types/console/slash/commands/dynamic.test.d.ts +0 -9
  152. package/dist/types/console/slash/commands/integrations.d.ts +0 -28
  153. package/dist/types/console/slash/commands/integrations.test.d.ts +0 -18
  154. package/dist/types/console/slash/commands/shared.d.ts +0 -72
  155. package/dist/types/console/slash/commands/transcript.d.ts +0 -24
  156. package/dist/types/console/slash/commands/transcript.test.d.ts +0 -10
  157. package/dist/types/console/slash/commands/workbench.d.ts +0 -21
  158. package/dist/types/console/slash/commands/workbench.test.d.ts +0 -10
  159. package/dist/types/console/slash/index.d.ts +0 -34
  160. package/dist/types/console/slash/registry.d.ts +0 -90
  161. package/dist/types/console/slash/resolve.d.ts +0 -109
  162. package/dist/types/console/slash/slash.test.d.ts +0 -18
  163. package/dist/types/console/startup.d.ts +0 -119
  164. package/dist/types/console/theme/adapter.d.ts +0 -79
  165. package/dist/types/console/theme/index.d.ts +0 -18
  166. package/dist/types/console/theme/palette.d.ts +0 -77
  167. package/dist/types/console/theme/resolve.d.ts +0 -45
  168. package/dist/types/console/theme/theme.test.d.ts +0 -16
  169. package/dist/types/console/theme/tokens.d.ts +0 -62
  170. package/dist/types/entry.d.ts +0 -17
  171. package/dist/types/guardrails.d.ts +0 -33
  172. package/dist/types/index.d.ts +0 -24
  173. package/dist/types/insight/channel.d.ts +0 -45
  174. package/dist/types/insight/contract.d.ts +0 -411
  175. package/dist/types/insight/index.d.ts +0 -26
  176. package/dist/types/insight/insight.test.d.ts +0 -17
  177. package/dist/types/insight/recorder.d.ts +0 -63
  178. package/dist/types/insight/redaction.d.ts +0 -44
  179. package/dist/types/insight/replay.d.ts +0 -77
  180. package/dist/types/insight/sampling.d.ts +0 -84
  181. package/dist/types/insight/serialize.d.ts +0 -54
  182. package/dist/types/insight/sinks/console.d.ts +0 -36
  183. package/dist/types/insight/sinks/file.d.ts +0 -37
  184. package/dist/types/insight/sinks/index.d.ts +0 -16
  185. package/dist/types/insight/sinks/stream.d.ts +0 -53
  186. package/dist/types/kit/clipboard-image.d.ts +0 -40
  187. package/dist/types/kit/external-editor.d.ts +0 -35
  188. package/dist/types/kit/image.d.ts +0 -102
  189. package/dist/types/kit/index.d.ts +0 -29
  190. package/dist/types/kit/kit.test.d.ts +0 -13
  191. package/dist/types/kit/shell.d.ts +0 -50
  192. package/dist/types/kit/tool-fetch.d.ts +0 -165
  193. package/dist/types/launch/catalog.d.ts +0 -51
  194. package/dist/types/launch/contract.d.ts +0 -387
  195. package/dist/types/launch/credentials.d.ts +0 -112
  196. package/dist/types/launch/index.d.ts +0 -28
  197. package/dist/types/launch/invocation/attachments.d.ts +0 -72
  198. package/dist/types/launch/invocation/flags.d.ts +0 -59
  199. package/dist/types/launch/invocation/index.d.ts +0 -23
  200. package/dist/types/launch/invocation/read.d.ts +0 -52
  201. package/dist/types/launch/invocation/usage.d.ts +0 -25
  202. package/dist/types/launch/launch.test.d.ts +0 -20
  203. package/dist/types/launch/oauth.d.ts +0 -101
  204. package/dist/types/launch/packages.d.ts +0 -75
  205. package/dist/types/launch/packages.test.d.ts +0 -15
  206. package/dist/types/launch/pickers.d.ts +0 -97
  207. package/dist/types/runtime-bridge/bridges/_drive.d.ts +0 -74
  208. package/dist/types/runtime-bridge/bridges/builtins.d.ts +0 -77
  209. package/dist/types/runtime-bridge/bridges/claude-cli.d.ts +0 -37
  210. package/dist/types/runtime-bridge/bridges/codex-cli.d.ts +0 -27
  211. package/dist/types/runtime-bridge/bridges/index.d.ts +0 -15
  212. package/dist/types/runtime-bridge/bridges/indusagi-cli.d.ts +0 -36
  213. package/dist/types/runtime-bridge/broker.d.ts +0 -182
  214. package/dist/types/runtime-bridge/contract.d.ts +0 -436
  215. package/dist/types/runtime-bridge/index.d.ts +0 -21
  216. package/dist/types/runtime-bridge/runtime-bridge.test.d.ts +0 -17
  217. package/dist/types/runtime-bridge/sink.d.ts +0 -59
  218. package/dist/types/sessions/contract.d.ts +0 -79
  219. package/dist/types/sessions/index.d.ts +0 -11
  220. package/dist/types/sessions/library.d.ts +0 -95
  221. package/dist/types/sessions/sessions.test.d.ts +0 -11
  222. package/dist/types/settings/contract.d.ts +0 -175
  223. package/dist/types/settings/index.d.ts +0 -13
  224. package/dist/types/settings/manager.d.ts +0 -109
  225. package/dist/types/settings/settings.test.d.ts +0 -16
  226. package/dist/types/transcript-export/index.d.ts +0 -20
  227. package/dist/types/transcript-export/publish.d.ts +0 -81
  228. package/dist/types/transcript-export/sgr.d.ts +0 -90
  229. package/dist/types/transcript-export/template.d.ts +0 -64
  230. package/dist/types/transcript-export/theme-bridge.d.ts +0 -99
  231. package/dist/types/transcript-export/transcript-export.test.d.ts +0 -16
  232. package/dist/types/window-budget/budget/estimate.d.ts +0 -47
  233. package/dist/types/window-budget/budget/gate.d.ts +0 -37
  234. package/dist/types/window-budget/budget/index.d.ts +0 -14
  235. package/dist/types/window-budget/budget/slice.d.ts +0 -38
  236. package/dist/types/window-budget/condenser.d.ts +0 -73
  237. package/dist/types/window-budget/contract.d.ts +0 -182
  238. package/dist/types/window-budget/index.d.ts +0 -17
  239. package/dist/types/window-budget/microcompact.d.ts +0 -68
  240. package/dist/types/window-budget/microcompact.test.d.ts +0 -16
  241. package/dist/types/window-budget/rehydrate.d.ts +0 -56
  242. package/dist/types/window-budget/summarize/condense.d.ts +0 -70
  243. package/dist/types/window-budget/summarize/index.d.ts +0 -12
  244. package/dist/types/window-budget/summarize/prompt.d.ts +0 -56
  245. package/dist/types/window-budget/window-budget.test.d.ts +0 -18
  246. package/dist/types/workflow-engine/agent-runner.d.ts +0 -105
  247. package/dist/types/workflow-engine/agent-runner.test.d.ts +0 -8
  248. package/dist/types/workflow-engine/display.d.ts +0 -148
  249. package/dist/types/workflow-engine/display.test.d.ts +0 -1
  250. package/dist/types/workflow-engine/engine.d.ts +0 -183
  251. package/dist/types/workflow-engine/engine.test.d.ts +0 -1
  252. package/dist/types/workflow-engine/index.d.ts +0 -21
  253. package/dist/types/workflow-engine/parse.d.ts +0 -64
  254. package/dist/types/workflow-engine/parse.test.d.ts +0 -1
  255. package/dist/types/workflow-engine/structured-output.d.ts +0 -51
  256. package/dist/types/workflow-engine/structured-output.test.d.ts +0 -1
  257. package/dist/types/workspace/brand.d.ts +0 -26
  258. package/dist/types/workspace/index.d.ts +0 -11
  259. package/dist/types/workspace/locator.d.ts +0 -50
  260. package/dist/types/workspace/runtime-detect.d.ts +0 -56
@@ -1,77 +0,0 @@
1
- /**
2
- * translateAgentEvent — the framework-event → {@link SessionSignal} projector.
3
- *
4
- * The framework `Agent` emits a fine-grained {@link AgentEvent} stream for its
5
- * own loop (lifecycle, per-turn, per-message, per-tool). The conductor does not
6
- * leak that union to consumers; it projects each framework event down to zero or
7
- * more *product-level* {@link SessionSignal}s, which then flow through the
8
- * {@link SignalHub}. This module is that projection — and nothing else: it is a
9
- * pure, side-effect-free function over a single event.
10
- *
11
- * Why a table, not a `switch`:
12
- * - The mapping is keyed on the framework event's `type` discriminant, so it is
13
- * expressed as a {@link TranslatorTable} — one entry per `AgentEventType`.
14
- * The table type is `{ [K in AgentEventType]: (ev) => SessionSignal[] }`, so
15
- * adding a framework event variant is a compile error until a rule exists for
16
- * it. Exhaustiveness is enforced by the type system, not by a `default` arm.
17
- * - Each rule receives the precisely-narrowed event member (via
18
- * {@link ExtractAgentEvent}) and returns the signals it produces.
19
- *
20
- * Mapping rules (framework `type` → product signals):
21
- * - `agent_start` / `turn_start` / `message_start` / `agent_end`
22
- * → `[]` (loop bookkeeping; not product-visible)
23
- * - `message_end` → one `prompt` { text } for a *user* message
24
- * (the turn is now committed), one `fault` for
25
- * an errored *assistant* message, else `[]`
26
- * - `tool_execution_start` → one `tool_start` { id, name }
27
- * - `tool_execution_update` → one `tool_update` { id, name, details } — the
28
- * running tool's partial-result detail (e.g. the
29
- * live `◆ Workflow` snapshot) re-projected so the
30
- * console can update the transcript in place
31
- * - `tool_execution_end` → one `tool_end` { id, ok: !isError }
32
- * - `turn_end` → one `turn_end` { usage }
33
- * - `message_update` → delegated to the inner streaming dispatch on
34
- * `assistantMessageEvent.type`:
35
- * · `text_delta` → one `text` { delta }
36
- * · `thinking_delta` → one `thinking` { delta }
37
- * · `error` → one `fault` { model fault }
38
- * · everything else → `[]`
39
- *
40
- * Faults: a streaming `error` sub-event becomes a typed `model` fault. The
41
- * conductor layers its own `aborted` / `tool` / `persistence` / `overflow`
42
- * faults elsewhere; the translator only mints the one fault the framework
43
- * stream actually carries.
44
- */
45
- import type { AgentEvent, AgentEventType, ExtractAgentEvent } from "indusagi/agent";
46
- import { type SessionSignal } from "../contract";
47
- /** A rule mapping one narrowed framework event member to product signals. */
48
- type TranslatorRule<TType extends AgentEventType> = (event: ExtractAgentEvent<TType>) => SessionSignal[];
49
- /**
50
- * The dispatch table: exactly one rule per framework {@link AgentEventType}.
51
- *
52
- * Declaring it as a full mapped type means the compiler rejects the module until
53
- * every framework event variant has a rule — the exhaustiveness guarantee.
54
- */
55
- type TranslatorTable = {
56
- [K in AgentEventType]: TranslatorRule<K>;
57
- };
58
- /**
59
- * The frozen mapping from each framework event variant to product signals.
60
- *
61
- * Exported for testing/inspection; production code calls
62
- * {@link translateAgentEvent}, which is the table applied.
63
- */
64
- export declare const TRANSLATOR_TABLE: TranslatorTable;
65
- /**
66
- * Translate a single framework {@link AgentEvent} into the product-level
67
- * {@link SessionSignal}s it produces (zero, one, or — for future fan-out — many).
68
- *
69
- * Pure and total: every framework event variant has a rule (enforced by
70
- * {@link TranslatorTable}), so this never throws on a known event and returns
71
- * `[]` for events that carry no product meaning.
72
- *
73
- * @param event a framework agent loop event
74
- * @returns the ordered product signals derived from it
75
- */
76
- export declare function translateAgentEvent(event: AgentEvent): SessionSignal[];
77
- export {};
@@ -1,10 +0,0 @@
1
- /**
2
- * Skill-parse subsystem — public barrel.
3
- *
4
- * Re-exports the re-derived skill-invocation block parser: the attribute-scanning
5
- * {@link parseSkillInvocation} hand parser and its structured {@link SkillInvocation}
6
- * result. Consumers (the conductor's submit path) import from
7
- * `src/conductor/skill-parse` rather than reaching into `parse`.
8
- */
9
- export { parseSkillInvocation } from "./parse";
10
- export type { SkillInvocation } from "./parse";
@@ -1,67 +0,0 @@
1
- /**
2
- * Skill-invocation block parser — an attribute-scanning hand parser.
3
- *
4
- * The coding agent lets a turn carry a *skill invocation*: an XML-ish opener tag
5
- * that names a capability card to run, optionally locates its on-disk file, and
6
- * wraps a trailing user message (the body) the skill should act on. The shape is
7
- * the framework Agent-Skills convention:
8
- *
9
- * ```
10
- * <skill name="commit-helper" location="/abs/path/SKILL.md">
11
- * please tidy the staged diff and write a message
12
- * </skill>
13
- * ```
14
- *
15
- * This module re-derives that parse from the *format spec*, deliberately NOT as
16
- * one monolithic capture regex. It is a small hand-written scanner: it walks the
17
- * input, finds the opener, scans `key=value` attributes one at a time (handling
18
- * single- or double-quoted and bare values, with `&amp;`/`&lt;`/`&gt;`/`&quot;`/
19
- * `&#39;` entity decoding), then captures the body up to the matching close tag.
20
- * Reading attributes incrementally — rather than matching the whole block in a
21
- * single pattern — is what makes this an independent implementation and lets the
22
- * parser keep *every* attribute the author wrote, not just a fixed `name`/
23
- * `location` pair.
24
- *
25
- * Block grammar (informal):
26
- * block := WS? '<' TAG WS attrs? WS? '>' body '</' TAG WS? '>'
27
- * TAG := 'skill' (case-insensitive)
28
- * attrs := (attr WS?)*
29
- * attr := key ('=' value)?
30
- * key := [A-Za-z_][A-Za-z0-9_:.-]*
31
- * value := '"' ... '"' | '\'' ... '\'' | bare (bare stops at WS / '>')
32
- * body := any text, captured verbatim up to the close tag
33
- *
34
- * A valid block must (a) be the leading content of the text (only leading
35
- * whitespace may precede the opener), (b) name the `skill` tag, (c) carry a
36
- * non-empty `name` attribute, and (d) be closed by `</skill>`. Anything else
37
- * yields `null`, signalling "this turn is ordinary text, not a skill call".
38
- */
39
- /**
40
- * The structured result of a successful parse.
41
- *
42
- * - `name` — the value of the required `name` attribute (the skill to run).
43
- * - `args` — every attribute the opener carried, keyed by (lower-cased) name,
44
- * including `name` itself and any `location`/custom keys. A bare attribute
45
- * with no `=value` maps to the empty string.
46
- * - `body` — the verbatim text between the opener and the `</skill>` close,
47
- * with a single leading and trailing newline trimmed (the common case where
48
- * the opener/closer sit on their own lines) but inner whitespace preserved.
49
- */
50
- export interface SkillInvocation {
51
- readonly name: string;
52
- readonly args: Record<string, string>;
53
- readonly body: string;
54
- }
55
- /**
56
- * Parse a skill-invocation block out of `text`.
57
- *
58
- * Walks the string by hand: skips leading whitespace, confirms a `<skill …>`
59
- * opener, scans each attribute into an `args` record, captures the body up to the
60
- * matching `</skill>`, and decodes entities. Returns the structured invocation,
61
- * or `null` when the text is not a well-formed leading skill block (ordinary
62
- * turns simply parse to `null`).
63
- *
64
- * @param text the raw turn text that may begin with a skill block
65
- * @returns the parsed `{ name, args, body }`, or `null` if not a skill block
66
- */
67
- export declare function parseSkillInvocation(text: string): SkillInvocation | null;
@@ -1,28 +0,0 @@
1
- /**
2
- * Phase 2 conductor — submit()/resume() BEHAVIORAL tests.
3
- *
4
- * These exercise the live turn loop of {@link createSessionConductor} end-to-end,
5
- * but with zero network and zero disk. Everything heavy is injected:
6
- *
7
- * - a scripted fake {@link AgentLike} whose `prompt()` drives a pre-recorded
8
- * sequence of framework {@link AgentEvent}s through the conductor's stored
9
- * subscriber and mutates its own `state.messages` (so `#persistTail` has a
10
- * tail to commit);
11
- * - an in-memory {@link TranscriptStore} (default {@link memoryBackend}, no disk);
12
- * - a fresh {@link SignalHub};
13
- * - a {@link ModelMatcher} over a {@link ModelCatalog} built from a stub
14
- * {@link CatalogSource} so `options.modelId` resolves;
15
- * - `deps.sleep` stubbed to a no-op so retry backoff never actually waits.
16
- *
17
- * The four behaviors covered (per the Phase 2 plan):
18
- * 1. multi-turn tool loop — ordered text/tool_start/tool_end/turn_end signals,
19
- * settled `idle` state with accumulated usage, persisted transcript nodes.
20
- * 2. fault + retry — transient streaming error auto-retries then settles;
21
- * a hard model fault lands `faulted` with a typed {@link ConductorFault} and a
22
- * `{ kind: "fault" }` signal.
23
- * 3. branch / resume — a second conductor over the same store resumes the
24
- * session and reconstructs the persisted branch (head/leaf).
25
- * 4. compaction — autoCompact + a tiny compactAt + a scripted condense
26
- * fn fire a `{ kind: "compacted" }` signal and invoke condense.
27
- */
28
- export {};
@@ -1,16 +0,0 @@
1
- /**
2
- * transcript-store — the conductor's persistent, branchable transcript.
3
- *
4
- * Two cooperating pieces:
5
- * - {@link TranscriptStore} — the append-only node tree bound to one session:
6
- * `append`, `branchAt`, `pathTo`, `load`, with a pluggable storage backend.
7
- * - the serialization bridge (re-exported below) — encode/decode the
8
- * `indus/transcript@1` NDJSON line shape and project a branch down to the
9
- * framework `AgentMessage[]` / LLM `Message[]`.
10
- *
11
- * Consumers (the conductor's submit/resume path) import the store and the
12
- * serialization helpers from `src/conductor/transcript-store` rather than reaching
13
- * into the individual modules.
14
- */
15
- export { TranscriptStore, memoryBackend, fsBackend, replay, type TranscriptBackend, type TranscriptState, type TranscriptClock, type TranscriptStoreOptions, } from "./store";
16
- export { roleForMessage, encodeEntry, encodeHead, parseSessionText, branchToMessages, branchToLlmMessages, importLegacyFile, importLegacyText, resolveLegacyMessages, type ParsedSessionFile, } from "./serialize";
@@ -1,106 +0,0 @@
1
- /**
2
- * Transcript serialization — the bridge between the conductor's on-disk
3
- * {@link TranscriptEntry} vocabulary and the framework's {@link AgentMessage}
4
- * shapes.
5
- *
6
- * Two distinct directions live here, and the split is deliberate:
7
- *
8
- * 1. **Conductor ⇄ conductor** — encoding a {@link TranscriptEntry} to/from a
9
- * single NDJSON line in the `indus/transcript@1` format. This is the
10
- * conductor's *own* envelope (`schema`/`id`/`prev`/`role`/`message`/`at`/
11
- * `meta`). The store owns these field names; they are our own, not any
12
- * framework-internal session schema.
13
- *
14
- * 2. **Conductor ⇄ framework** — projecting a transcript branch down to the
15
- * `AgentMessage[]` the agent loop consumes, and (for migration) lifting a
16
- * legacy framework session file *up* into transcript entries. Here we
17
- * **delegate the actual message serialization to the framework**: the
18
- * framework's published loader/context helpers know how to parse and resolve
19
- * the legacy on-disk schema, and we keep those internal schema literals
20
- * inside the framework package rather than re-declaring them in the app.
21
- *
22
- * The role discriminant on a {@link TranscriptEntry} is the conductor's own —
23
- * `role` here labels the *node*, not the LLM message. We derive it from the
24
- * carried {@link AgentMessage}'s `role` field so a round-trip is faithful, but
25
- * the transcript can also hold conductor-only nodes (`condense`, `note`) that the
26
- * framework message union has no direct counterpart for.
27
- */
28
- import type { AgentMessage } from "indusagi/agent";
29
- import type { Message } from "indusagi/ai";
30
- import type { SessionHead, TranscriptEntry, TranscriptRole } from "../contract";
31
- /**
32
- * Derive the conductor's node {@link TranscriptRole} from a framework
33
- * {@link AgentMessage}.
34
- *
35
- * The framework message union uses `role` values (`user`/`assistant`/`toolResult`
36
- * plus the custom app messages). We fold those onto the transcript's own role
37
- * vocabulary. Anything we don't recognize (custom/notification-style messages)
38
- * is filed as a `note` node so it persists without claiming an LLM turn role.
39
- */
40
- export declare function roleForMessage(message: AgentMessage): TranscriptRole;
41
- /** Encode one {@link TranscriptEntry} to its NDJSON entry line (no newline). */
42
- export declare function encodeEntry(entry: TranscriptEntry): string;
43
- /** Encode the {@link SessionHead} to its NDJSON head line (no newline). */
44
- export declare function encodeHead(head: SessionHead): string;
45
- /** The result of parsing a whole session file: its head plus its entries. */
46
- export interface ParsedSessionFile {
47
- readonly head: SessionHead | null;
48
- readonly entries: TranscriptEntry[];
49
- }
50
- /**
51
- * Parse the raw text of a conductor session file into a head + entries.
52
- *
53
- * Tolerant by design: blank lines are skipped, malformed lines are dropped, and
54
- * lines whose `schema` does not match `indus/transcript@1` are ignored. The last
55
- * head line wins (a file should carry exactly one, written first and rewritten on
56
- * branch). Entries keep file order.
57
- */
58
- export declare function parseSessionText(sessionId: string, text: string): ParsedSessionFile;
59
- /**
60
- * Project a resolved transcript branch down to the framework `AgentMessage[]`
61
- * the agent loop consumes.
62
- *
63
- * The branch is the root→leaf node list (the store's reducer produces it). We
64
- * pull the carried `content` payloads and hand them straight to the agent; they
65
- * are already framework messages. Conductor-only nodes whose payload is not a
66
- * real message would be filtered by the framework's own `convertToLlm` at call
67
- * time, so we keep them here and let the loop's converter decide.
68
- */
69
- export declare function branchToMessages(branch: readonly TranscriptEntry[]): AgentMessage[];
70
- /**
71
- * Convert a transcript branch to *LLM-ready* `Message[]`, delegating entirely to
72
- * the framework's {@link convertToLlm}.
73
- *
74
- * This is the one place that must understand how each `AgentMessage` variant
75
- * (including the framework's custom `bashExecution`/`branchSummary`/… messages)
76
- * collapses into a plain LLM message — and that knowledge stays in the framework.
77
- * The conductor never re-implements it.
78
- */
79
- export declare function branchToLlmMessages(branch: readonly TranscriptEntry[]): Message[];
80
- /**
81
- * Lift a *legacy framework session file* into conductor {@link TranscriptEntry}
82
- * nodes, for one-way migration/import.
83
- *
84
- * The legacy file is the framework's own internal JSONL format. We do **not**
85
- * parse its schema ourselves — we call the framework's published loader (or its
86
- * in-memory text parser), then map only the message-bearing entries onto our
87
- * envelope. Every framework-internal schema literal stays behind that call.
88
- *
89
- * Non-message bookkeeping entries (model/thinking changes, labels, raw
90
- * compaction markers) are dropped from the imported transcript: their effect is
91
- * already folded into the resolved messages we keep, and the conductor tracks
92
- * model/thinking in its own state rather than as transcript nodes.
93
- */
94
- export declare function importLegacyFile(filePath: string): TranscriptEntry[];
95
- /** As {@link importLegacyFile}, but from already-loaded text (testing/import). */
96
- export declare function importLegacyText(text: string): TranscriptEntry[];
97
- /**
98
- * Resolve a legacy framework file straight to the `AgentMessage[]` of its active
99
- * branch, delegating to the framework's {@link buildSessionContext}.
100
- *
101
- * Useful when the goal is to *seed* a fresh conductor session from a legacy one
102
- * without reproducing its tree: the framework walks its own parent links and
103
- * applies its own compaction/branch-summary resolution, and we receive a flat
104
- * message list to re-append as new transcript nodes.
105
- */
106
- export declare function resolveLegacyMessages(filePath: string): AgentMessage[];
@@ -1,10 +0,0 @@
1
- /**
2
- * Transcript serialization — head usage round-trip.
3
- *
4
- * Focused coverage for the cost-cmd durability seam: the head line now carries
5
- * the session's cumulative {@link Usage}, and {@link encodeHead} →
6
- * {@link parseSessionText} must round-trip it faithfully so resume can restore the
7
- * running token/cost total instead of seeding zero. Heads without usage (legacy
8
- * files, fresh sessions) must still parse cleanly with `usage` absent.
9
- */
10
- export {};
@@ -1,188 +0,0 @@
1
- /**
2
- * TranscriptStore — the conductor's persistent, branchable transcript.
3
- *
4
- * Replaces pi's `SessionManager`, but with the conductor's own vocabulary and a
5
- * deliberately different internal model. The transcript is an append-only **tree**
6
- * of {@link TranscriptEntry} nodes: every node names its `parent`, a single
7
- * {@link SessionHead} tracks the active `leaf`, and the active conversation is the
8
- * `parent`-chain walked from that leaf back to a root.
9
- *
10
- * Design stance (an independent persistence model):
11
- * - **Reducer-friendly.** The on-disk form is a flat NDJSON log; the in-memory
12
- * view is rebuilt by a pure {@link replay} reducer over that log. State is a
13
- * value derived from the log, never mutated in place behind the scenes.
14
- * - **Fresh envelope.** Lines carry the `indus/transcript@1` schema with our own
15
- * field names (`prev`, `at`, `kind`), delegated to {@link module:serialize} —
16
- * not any framework-internal session-manager schema.
17
- * - **Branch = move the head.** {@link branchAt} repoints the leaf at an earlier
18
- * node; the next {@link append} becomes that node's child, forking a new path
19
- * without rewriting history.
20
- * - **`pathTo` is the read primitive.** {@link pathTo} resolves the root→leaf
21
- * branch (the message list the agent replays); the conductor's `resume` calls
22
- * it to rehydrate.
23
- *
24
- * The store is storage-pluggable: a {@link TranscriptBackend} abstracts where bytes
25
- * live, so tests inject an in-memory backend and the conductor binds a filesystem
26
- * one. Construction is synchronous and empty; {@link load} hydrates from a backend.
27
- */
28
- import type { AgentMessage, SessionHead, TranscriptEntry, TranscriptRole } from "../contract";
29
- import { TRANSCRIPT_SCHEMA } from "../contract";
30
- import type { Usage } from "indusagi/ai";
31
- /**
32
- * Where a transcript's NDJSON log lives. The store appends lines and, on branch,
33
- * rewrites the whole file; a backend supplies those three primitives plus a way
34
- * to resolve a session id to its location. All methods may be async.
35
- *
36
- * The default {@link fsBackend} maps a session id to `<dir>/<sessionId>.ndjson`;
37
- * tests pass an in-memory backend so no disk is touched.
38
- */
39
- export interface TranscriptBackend {
40
- /** Absolute location (path/key) a session id persists to. */
41
- locate(sessionId: string): string;
42
- /** Read the full NDJSON text for a session, or `null` if absent. */
43
- read(sessionId: string): Promise<string | null>;
44
- /** Append one already-encoded NDJSON line (no trailing newline) to a session. */
45
- append(sessionId: string, line: string): Promise<void>;
46
- /** Replace the whole NDJSON text for a session (used after a branch). */
47
- rewrite(sessionId: string, text: string): Promise<void>;
48
- }
49
- /** An in-memory backend — the default when no persistence is wired. */
50
- export declare function memoryBackend(): TranscriptBackend;
51
- /**
52
- * A filesystem backend rooted at `dir`. Lazily imports `node:fs`/`node:path` so
53
- * the module stays usable in non-Node test contexts that pass {@link memoryBackend}.
54
- */
55
- export declare function fsBackend(dir: string): TranscriptBackend;
56
- /**
57
- * The immutable derived state of a transcript: the node table keyed by id, plus
58
- * the current head. A pure value produced by {@link replay}; the store holds one
59
- * and swaps it wholesale on each mutation rather than mutating fields.
60
- */
61
- export interface TranscriptState {
62
- /** Every node, keyed by id, in insertion order. */
63
- readonly nodes: ReadonlyMap<string, TranscriptEntry>;
64
- /** The active head (session id + current leaf). */
65
- readonly head: SessionHead;
66
- }
67
- /** A clock + id seam so tests get deterministic ids/timestamps. */
68
- export interface TranscriptClock {
69
- /** Mint a fresh, sortable node id. */
70
- readonly id: () => string;
71
- /** The current instant as an ISO-8601 string. */
72
- readonly now: () => string;
73
- }
74
- /**
75
- * Rebuild a {@link TranscriptState} from an ordered entry list and a leaf.
76
- *
77
- * Pure and total: the same inputs always yield the same state. The reducer just
78
- * indexes the entries by id (later ids overwrite earlier — append-only logs never
79
- * collide, but a rewrite stays idempotent) and pins the head. Replacing pi's
80
- * mutate-in-place index with an explicit reducer is the divergence.
81
- */
82
- export declare function replay(sessionId: string, entries: readonly TranscriptEntry[], leaf: string | null): TranscriptState;
83
- /** Tuning seams for a {@link TranscriptStore}. All optional. */
84
- export interface TranscriptStoreOptions {
85
- /** Where bytes live; defaults to {@link memoryBackend}. */
86
- readonly backend?: TranscriptBackend;
87
- /** Id/timestamp source; defaults to ULID + wall clock. */
88
- readonly clock?: TranscriptClock;
89
- }
90
- /**
91
- * An append-only, branchable transcript bound to one session id.
92
- *
93
- * Construct (empty), then either {@link append} fresh nodes or {@link load} a
94
- * persisted session. Every mutation appends to the backend and swaps the derived
95
- * {@link TranscriptState}. Reads (`pathTo`, `messages`, `head`) are O(branch
96
- * depth) walks over the in-memory node table.
97
- */
98
- export declare class TranscriptStore {
99
- #private;
100
- constructor(sessionId: string, options?: TranscriptStoreOptions);
101
- /** The session id this store is bound to. */
102
- get sessionId(): string;
103
- /** The current head (session id + active leaf). */
104
- get head(): SessionHead;
105
- /**
106
- * The cumulative session usage last persisted onto the head, or `undefined`
107
- * when none has been written (a fresh session, or a legacy file without a
108
- * usage-bearing head). `resume` reads this to restore the running token/cost
109
- * total instead of seeding zero.
110
- */
111
- get usage(): Usage | undefined;
112
- /** Number of nodes currently in the transcript. */
113
- get size(): number;
114
- /** Backend location this session persists to (for diagnostics/UI). */
115
- locate(sessionId?: string): string;
116
- /** Look up a single node by id. */
117
- get(id: string): TranscriptEntry | undefined;
118
- /**
119
- * Append a framework {@link AgentMessage} as a child of the current leaf and
120
- * advance the head onto it. The node role is derived from the message (or
121
- * overridden via `role`). Persists the new line, then returns the new node.
122
- *
123
- * This is the conductor's per-message write: one call per produced message in
124
- * a settled turn.
125
- */
126
- append(content: AgentMessage, role?: TranscriptRole, meta?: Readonly<Record<string, unknown>>): Promise<TranscriptEntry>;
127
- /**
128
- * Persist the session's cumulative usage onto the head and rewrite the backing
129
- * file so the running token/cost total survives a reload. Distinct from
130
- * {@link append}, which only appends an entry line and never rewrites the head:
131
- * usage durability MUST flow through here so the re-emitted head line carries
132
- * the latest tally. Leaves the node tree and active leaf untouched.
133
- *
134
- * @param usage the cumulative usage to pin on the head
135
- */
136
- persistUsage(usage: Usage): Promise<void>;
137
- /**
138
- * Repoint the head at an earlier node, forking a branch. The next {@link append}
139
- * becomes a child of `id`; existing nodes are untouched. Rewrites the head line.
140
- *
141
- * @throws if `id` is not a known node.
142
- */
143
- branchAt(id: string): Promise<void>;
144
- /**
145
- * Reset the head to before any node; the next {@link append} starts a new root.
146
- * Used when re-editing the very first turn.
147
- */
148
- reset(): Promise<void>;
149
- /**
150
- * Abandon the current conversation and begin a fresh, empty session under a new
151
- * id. All nodes are dropped and the leaf is reset to null, so {@link messages}
152
- * is empty and the next {@link append} starts a new root; subsequent writes
153
- * persist to the new session's backing file (the old one is left intact on
154
- * disk). This is the `/clear` (new-session) primitive — distinct from
155
- * {@link reset}, which keeps the nodes and id and only rewinds the head.
156
- */
157
- startNewSession(sessionId: string): void;
158
- /**
159
- * Resolve the active branch: the root→leaf node list reached by walking
160
- * `parent` links up from `leaf` (or from `from` when given), reversed to
161
- * chronological order.
162
- *
163
- * This is the conductor's read primitive — `resume` rehydrates the agent from
164
- * `pathTo()`, and the turn loop projects it to messages via {@link messages}.
165
- * Returns `[]` for an empty transcript or a dangling leaf.
166
- */
167
- pathTo(from?: string): TranscriptEntry[];
168
- /** The active branch projected to the framework {@link AgentMessage} list. */
169
- messages(from?: string): AgentMessage[];
170
- /**
171
- * Hydrate this store from a persisted session, replacing its current state.
172
- *
173
- * Reads the backend, parses it with {@link parseSessionText}, and rebuilds state
174
- * via the {@link replay} reducer. If the file carried no head line, the head is
175
- * pinned to the deepest leaf reachable from the entries. Returns `true` when a
176
- * session was found and loaded, `false` when the backend had nothing.
177
- */
178
- load(sessionId?: string): Promise<boolean>;
179
- /**
180
- * Open a persisted session by id, returning a hydrated store (or `null` if the
181
- * backend has no such session). The static counterpart to {@link load}.
182
- */
183
- static open(sessionId: string, options?: TranscriptStoreOptions): Promise<TranscriptStore | null>;
184
- /** A point-in-time copy of the derived state (for inspection/testing). */
185
- state(): TranscriptState;
186
- }
187
- /** Re-export the schema literal for callers building stores directly. */
188
- export { TRANSCRIPT_SCHEMA };
@@ -1,41 +0,0 @@
1
- /**
2
- * AgentsView — the drill-in sub-agent view, styled to the "IndusCode Saffron ·
3
- * Subagent View" design.
4
- *
5
- * Opened from the main screen (← on an empty prompt while sub-agents are
6
- * running), this replaces the transcript with a focused, navigable view of the
7
- * delegated sub-agents: ↑/↓ moves the selection through `main` + each sub-agent,
8
- * and the panel above the picker live-previews the selected sub-agent's activity
9
- * stream — its reasoning and the tools it is using, just like the main screen —
10
- * with a running clock and token count. Selecting `main` and pressing Enter (or
11
- * Esc) returns to the main session.
12
- *
13
- * It is fed entirely by props the surface already holds: the derived
14
- * {@link AgentRun}s plus the per-sub-agent live activity / token maps captured
15
- * from the task tool's streamed progress. Its own {@link useInput} owns the
16
- * keyboard while it is mounted (the surface gates its main handler off).
17
- */
18
- import { type InkThemeAdapter } from "indusagi/react-ink";
19
- import type { AgentRun } from "./BackgroundAgents";
20
- import type { ActivityLine } from "../../capability-deck/cards/task-card";
21
- /** What the {@link AgentsView} renders. */
22
- export interface AgentsViewProps {
23
- /** The framework adapter that turns token roles into terminal colours. */
24
- readonly theme: InkThemeAdapter;
25
- /** The delegated sub-agent runs (from `deriveAgentRuns`). */
26
- readonly runs: readonly AgentRun[];
27
- /** Live activity streams per run id (from the task tool's progress). */
28
- readonly activity: Readonly<Record<string, readonly ActivityLine[]>>;
29
- /** Live token spend per run id. */
30
- readonly tokens: Readonly<Record<string, number>>;
31
- /** Current epoch ms, for the run clock. Defaults to `Date.now()`. */
32
- readonly now?: number;
33
- /** Return to the main session. */
34
- readonly onExit: () => void;
35
- }
36
- /**
37
- * Render the drill-in agents view.
38
- *
39
- * @param props the theme, runs, live activity/token maps, and the exit callback
40
- */
41
- export declare function AgentsView({ theme, runs, activity, tokens, now, onExit }: AgentsViewProps): JSX.Element;
@@ -1,63 +0,0 @@
1
- /**
2
- * BackgroundAgents — the live sub-agent panel pinned below the input, styled to
3
- * the "IndusCode Saffron · Background Agents" design.
4
- *
5
- * When the primary agent delegates with the `task` tool, each sub-agent run is
6
- * surfaced here as a compact status row (a spinner/● dot, the agent profile name
7
- * in saffron, the objective in dim, and a running clock / done / failed status)
8
- * under a `● main` header — so a user watching several agents work sees them all
9
- * at a glance in the main screen instead of scrolling the transcript. The panel
10
- * shows only while at least one run is in flight and hides once they all settle
11
- * (their final reports remain inline in the transcript).
12
- *
13
- * The run list is derived purely from the conversation by {@link deriveAgentRuns}
14
- * (the `task` tool calls in the assistant messages, matched against their
15
- * `toolResult` messages for status), so the panel needs no extra session state —
16
- * it is a projection of `conductor.messages()`.
17
- */
18
- import { type InkThemeAdapter } from "indusagi/react-ink";
19
- import type { AgentMessage } from "indusagi/agent";
20
- /** The live status of one delegated sub-agent. */
21
- export type AgentRunStatus = "running" | "done" | "error";
22
- /** One delegated sub-agent run, projected from the conversation. */
23
- export interface AgentRun {
24
- /** The `task` tool-call id correlating the call with its result. */
25
- readonly id: string;
26
- /** The agent profile name (the `agent` arg), or "subagent" when unnamed. */
27
- readonly name: string;
28
- /** The delegated objective (the `objective` arg), shown as the description. */
29
- readonly objective: string;
30
- /** Whether the run is in flight, finished, or errored. */
31
- readonly status: AgentRunStatus;
32
- /** Epoch ms the delegating assistant message was stamped (for the run clock). */
33
- readonly startedAt: number;
34
- }
35
- /**
36
- * Derive the delegated sub-agent runs from the conversation.
37
- *
38
- * Walks the messages once: every `task` tool call in an assistant message
39
- * becomes a run (named by its `agent` arg, described by its `objective`), and a
40
- * later `toolResult` with the matching id resolves its status to done/error.
41
- * Runs with no result yet are "running". Pure and order-stable — the same
42
- * messages always yield the same list, oldest first.
43
- *
44
- * @param messages the live conversation (`conductor.messages()`)
45
- */
46
- export declare function deriveAgentRuns(messages: readonly AgentMessage[]): AgentRun[];
47
- /** What the {@link BackgroundAgents} renders. */
48
- export interface BackgroundAgentsProps {
49
- /** The framework adapter that turns token roles into terminal colours. */
50
- readonly theme: InkThemeAdapter;
51
- /** The derived sub-agent runs (from {@link deriveAgentRuns}). */
52
- readonly runs: readonly AgentRun[];
53
- /** Live token spend per run, keyed by run id (the task tool-call id). */
54
- readonly tokens?: Readonly<Record<string, number>>;
55
- /** Current epoch ms, for the run clock. Defaults to `Date.now()`. */
56
- readonly now?: number;
57
- }
58
- /**
59
- * Render the background-agents panel, or nothing when no run is in flight.
60
- *
61
- * @param props the theme, the derived runs, and the current time
62
- */
63
- export declare function BackgroundAgents({ theme, runs, tokens, now }: BackgroundAgentsProps): JSX.Element | null;
@@ -1,8 +0,0 @@
1
- /**
2
- * BackgroundAgents — pure derivation tests.
3
- *
4
- * Exercises {@link deriveAgentRuns} against hand-built conversations (no Ink):
5
- * `task` tool calls become runs, matched `toolResult` messages resolve their
6
- * status, non-task calls are ignored, and unnamed agents fall back to a label.
7
- */
8
- export {};