@autonav/core 1.6.0 → 1.7.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 (257) hide show
  1. package/README.md +2 -2
  2. package/dist/adapter/index.d.ts +3 -3
  3. package/dist/adapter/index.d.ts.map +1 -1
  4. package/dist/adapter/index.js +3 -3
  5. package/dist/adapter/index.js.map +1 -1
  6. package/dist/adapter/navigator-adapter.d.ts +196 -0
  7. package/dist/adapter/navigator-adapter.d.ts.map +1 -0
  8. package/dist/adapter/navigator-adapter.js +579 -0
  9. package/dist/adapter/navigator-adapter.js.map +1 -0
  10. package/dist/cli/autonav.d.ts +2 -6
  11. package/dist/cli/autonav.d.ts.map +1 -1
  12. package/dist/cli/autonav.js +32 -53
  13. package/dist/cli/autonav.js.map +1 -1
  14. package/dist/cli/nav-chat.d.ts +2 -1
  15. package/dist/cli/nav-chat.d.ts.map +1 -1
  16. package/dist/cli/nav-chat.js +32 -3
  17. package/dist/cli/nav-chat.js.map +1 -1
  18. package/dist/cli/nav-init.d.ts +2 -1
  19. package/dist/cli/nav-init.d.ts.map +1 -1
  20. package/dist/cli/nav-init.js +12 -4
  21. package/dist/cli/nav-init.js.map +1 -1
  22. package/dist/cli/nav-install.d.ts +2 -1
  23. package/dist/cli/nav-install.d.ts.map +1 -1
  24. package/dist/cli/nav-install.js +4 -2
  25. package/dist/cli/nav-install.js.map +1 -1
  26. package/dist/cli/nav-memento.d.ts +3 -2
  27. package/dist/cli/nav-memento.d.ts.map +1 -1
  28. package/dist/cli/nav-memento.js +12 -6
  29. package/dist/cli/nav-memento.js.map +1 -1
  30. package/dist/cli/nav-mend.d.ts +2 -1
  31. package/dist/cli/nav-mend.d.ts.map +1 -1
  32. package/dist/cli/nav-mend.js +4 -1
  33. package/dist/cli/nav-mend.js.map +1 -1
  34. package/dist/cli/nav-migrate.d.ts +2 -1
  35. package/dist/cli/nav-migrate.d.ts.map +1 -1
  36. package/dist/cli/nav-migrate.js +2 -6
  37. package/dist/cli/nav-migrate.js.map +1 -1
  38. package/dist/cli/nav-query.d.ts +2 -1
  39. package/dist/cli/nav-query.d.ts.map +1 -1
  40. package/dist/cli/nav-query.js +12 -6
  41. package/dist/cli/nav-query.js.map +1 -1
  42. package/dist/cli/nav-standup.d.ts +18 -0
  43. package/dist/cli/nav-standup.d.ts.map +1 -0
  44. package/dist/cli/nav-standup.js +151 -0
  45. package/dist/cli/nav-standup.js.map +1 -0
  46. package/dist/cli/nav-uninstall.d.ts +2 -1
  47. package/dist/cli/nav-uninstall.d.ts.map +1 -1
  48. package/dist/cli/nav-uninstall.js +4 -2
  49. package/dist/cli/nav-uninstall.js.map +1 -1
  50. package/dist/cli/nav-update.d.ts +2 -1
  51. package/dist/cli/nav-update.d.ts.map +1 -1
  52. package/dist/cli/nav-update.js +11 -6
  53. package/dist/cli/nav-update.js.map +1 -1
  54. package/dist/conversation/App.d.ts +9 -2
  55. package/dist/conversation/App.d.ts.map +1 -1
  56. package/dist/conversation/App.js +304 -111
  57. package/dist/conversation/App.js.map +1 -1
  58. package/dist/conversation/index.d.ts +5 -0
  59. package/dist/conversation/index.d.ts.map +1 -1
  60. package/dist/conversation/index.js +17 -2
  61. package/dist/conversation/index.js.map +1 -1
  62. package/dist/harness/chibi-harness.d.ts +36 -0
  63. package/dist/harness/chibi-harness.d.ts.map +1 -0
  64. package/dist/harness/chibi-harness.js +383 -0
  65. package/dist/harness/chibi-harness.js.map +1 -0
  66. package/dist/harness/chibi-plugins/get_plugin_config +64 -0
  67. package/dist/harness/chibi-plugins/query_navigator +114 -0
  68. package/dist/harness/chibi-plugins/submit_answer +38 -0
  69. package/dist/harness/chibi-plugins/update_plugin_config +91 -0
  70. package/dist/harness/claude-code-harness.d.ts +24 -0
  71. package/dist/harness/claude-code-harness.d.ts.map +1 -0
  72. package/dist/harness/claude-code-harness.js +242 -0
  73. package/dist/harness/claude-code-harness.js.map +1 -0
  74. package/dist/harness/ephemeral-home.d.ts +34 -0
  75. package/dist/harness/ephemeral-home.d.ts.map +1 -0
  76. package/dist/harness/ephemeral-home.js +56 -0
  77. package/dist/harness/ephemeral-home.js.map +1 -0
  78. package/dist/harness/factory.d.ts +47 -0
  79. package/dist/harness/factory.d.ts.map +1 -0
  80. package/dist/harness/factory.js +84 -0
  81. package/dist/harness/factory.js.map +1 -0
  82. package/dist/harness/helpers.d.ts +58 -0
  83. package/dist/harness/helpers.d.ts.map +1 -0
  84. package/dist/harness/helpers.js +78 -0
  85. package/dist/harness/helpers.js.map +1 -0
  86. package/dist/harness/index.d.ts +14 -0
  87. package/dist/harness/index.d.ts.map +1 -0
  88. package/dist/harness/index.js +13 -0
  89. package/dist/harness/index.js.map +1 -0
  90. package/dist/harness/opencode-harness.d.ts +79 -0
  91. package/dist/harness/opencode-harness.d.ts.map +1 -0
  92. package/dist/harness/opencode-harness.js +537 -0
  93. package/dist/harness/opencode-harness.js.map +1 -0
  94. package/dist/harness/opencode-tools/get_plugin_config.ts +72 -0
  95. package/dist/harness/opencode-tools/query_navigator.ts +126 -0
  96. package/dist/harness/opencode-tools/submit_answer.ts +40 -0
  97. package/dist/harness/opencode-tools/update_plugin_config.ts +105 -0
  98. package/dist/harness/sandbox.d.ts +59 -0
  99. package/dist/harness/sandbox.d.ts.map +1 -0
  100. package/dist/harness/sandbox.js +152 -0
  101. package/dist/harness/sandbox.js.map +1 -0
  102. package/dist/harness/tool-server.d.ts +50 -0
  103. package/dist/harness/tool-server.d.ts.map +1 -0
  104. package/dist/harness/tool-server.js +27 -0
  105. package/dist/harness/tool-server.js.map +1 -0
  106. package/dist/harness/types.d.ts +168 -0
  107. package/dist/harness/types.d.ts.map +1 -0
  108. package/dist/harness/types.js +12 -0
  109. package/dist/harness/types.js.map +1 -0
  110. package/dist/index.d.ts +3 -2
  111. package/dist/index.d.ts.map +1 -1
  112. package/dist/index.js +4 -2
  113. package/dist/index.js.map +1 -1
  114. package/dist/interview/App.d.ts +4 -2
  115. package/dist/interview/App.d.ts.map +1 -1
  116. package/dist/interview/App.js +36 -56
  117. package/dist/interview/App.js.map +1 -1
  118. package/dist/interview/index.d.ts +3 -0
  119. package/dist/interview/index.d.ts.map +1 -1
  120. package/dist/interview/index.js +1 -0
  121. package/dist/interview/index.js.map +1 -1
  122. package/dist/interview/prompts.d.ts +3 -1
  123. package/dist/interview/prompts.d.ts.map +1 -1
  124. package/dist/interview/prompts.js +5 -1
  125. package/dist/interview/prompts.js.map +1 -1
  126. package/dist/interview/ui/ChatBanner.d.ts +17 -0
  127. package/dist/interview/ui/ChatBanner.d.ts.map +1 -0
  128. package/dist/interview/ui/ChatBanner.js +30 -0
  129. package/dist/interview/ui/ChatBanner.js.map +1 -0
  130. package/dist/interview/ui/ChatInput.d.ts +36 -0
  131. package/dist/interview/ui/ChatInput.d.ts.map +1 -0
  132. package/dist/interview/ui/ChatInput.js +304 -0
  133. package/dist/interview/ui/ChatInput.js.map +1 -0
  134. package/dist/interview/ui/MarkdownText.d.ts +13 -0
  135. package/dist/interview/ui/MarkdownText.d.ts.map +1 -0
  136. package/dist/interview/ui/MarkdownText.js +107 -0
  137. package/dist/interview/ui/MarkdownText.js.map +1 -0
  138. package/dist/interview/ui/index.d.ts +3 -0
  139. package/dist/interview/ui/index.d.ts.map +1 -1
  140. package/dist/interview/ui/index.js +3 -0
  141. package/dist/interview/ui/index.js.map +1 -1
  142. package/dist/memento/implementer-agent.d.ts +31 -0
  143. package/dist/memento/implementer-agent.d.ts.map +1 -0
  144. package/dist/memento/implementer-agent.js +95 -0
  145. package/dist/memento/implementer-agent.js.map +1 -0
  146. package/dist/memento/index.d.ts +6 -5
  147. package/dist/memento/index.d.ts.map +1 -1
  148. package/dist/memento/index.js +7 -5
  149. package/dist/memento/index.js.map +1 -1
  150. package/dist/memento/loop.d.ts +6 -5
  151. package/dist/memento/loop.d.ts.map +1 -1
  152. package/dist/memento/loop.js +872 -180
  153. package/dist/memento/loop.js.map +1 -1
  154. package/dist/memento/matrix-animation.d.ts +26 -0
  155. package/dist/memento/matrix-animation.d.ts.map +1 -1
  156. package/dist/memento/matrix-animation.js +93 -18
  157. package/dist/memento/matrix-animation.js.map +1 -1
  158. package/dist/memento/nav-protocol.d.ts +2 -2
  159. package/dist/memento/nav-protocol.d.ts.map +1 -1
  160. package/dist/memento/nav-protocol.js +39 -43
  161. package/dist/memento/nav-protocol.js.map +1 -1
  162. package/dist/memento/prompts.d.ts +21 -8
  163. package/dist/memento/prompts.d.ts.map +1 -1
  164. package/dist/memento/prompts.js +79 -39
  165. package/dist/memento/prompts.js.map +1 -1
  166. package/dist/memento/rate-limit.d.ts +85 -0
  167. package/dist/memento/rate-limit.d.ts.map +1 -0
  168. package/dist/memento/rate-limit.js +221 -0
  169. package/dist/memento/rate-limit.js.map +1 -0
  170. package/dist/memento/types.d.ts +6 -6
  171. package/dist/memento/types.d.ts.map +1 -1
  172. package/dist/memento/types.js +3 -3
  173. package/dist/memento/worker-agent.d.ts +4 -1
  174. package/dist/memento/worker-agent.d.ts.map +1 -1
  175. package/dist/memento/worker-agent.js +38 -54
  176. package/dist/memento/worker-agent.js.map +1 -1
  177. package/dist/registry.d.ts +35 -0
  178. package/dist/registry.d.ts.map +1 -0
  179. package/dist/registry.js +87 -0
  180. package/dist/registry.js.map +1 -0
  181. package/dist/repo-analyzer/index.d.ts +2 -1
  182. package/dist/repo-analyzer/index.d.ts.map +1 -1
  183. package/dist/repo-analyzer/index.js +6 -17
  184. package/dist/repo-analyzer/index.js.map +1 -1
  185. package/dist/skill-generator/index.d.ts +142 -0
  186. package/dist/skill-generator/index.d.ts.map +1 -0
  187. package/dist/skill-generator/index.js +510 -0
  188. package/dist/skill-generator/index.js.map +1 -0
  189. package/dist/standup/config.d.ts +19 -0
  190. package/dist/standup/config.d.ts.map +1 -0
  191. package/dist/standup/config.js +42 -0
  192. package/dist/standup/config.js.map +1 -0
  193. package/dist/standup/index.d.ts +24 -0
  194. package/dist/standup/index.d.ts.map +1 -0
  195. package/dist/standup/index.js +29 -0
  196. package/dist/standup/index.js.map +1 -0
  197. package/dist/standup/loop.d.ts +36 -0
  198. package/dist/standup/loop.d.ts.map +1 -0
  199. package/dist/standup/loop.js +508 -0
  200. package/dist/standup/loop.js.map +1 -0
  201. package/dist/standup/prompts.d.ts +62 -0
  202. package/dist/standup/prompts.d.ts.map +1 -0
  203. package/dist/standup/prompts.js +211 -0
  204. package/dist/standup/prompts.js.map +1 -0
  205. package/dist/standup/standup-protocol.d.ts +33 -0
  206. package/dist/standup/standup-protocol.d.ts.map +1 -0
  207. package/dist/standup/standup-protocol.js +189 -0
  208. package/dist/standup/standup-protocol.js.map +1 -0
  209. package/dist/standup/types.d.ts +185 -0
  210. package/dist/standup/types.d.ts.map +1 -0
  211. package/dist/standup/types.js +67 -0
  212. package/dist/standup/types.js.map +1 -0
  213. package/dist/templates/.gitignore.template +26 -0
  214. package/dist/templates/CLAUDE-pack.md.template +114 -0
  215. package/dist/templates/CLAUDE.md.template +153 -0
  216. package/dist/templates/README.md.template +174 -0
  217. package/dist/templates/config-pack.json.template +16 -0
  218. package/dist/templates/config.json.template +11 -0
  219. package/dist/templates/index.d.ts +22 -0
  220. package/dist/templates/index.d.ts.map +1 -0
  221. package/dist/templates/index.js +32 -0
  222. package/dist/templates/index.js.map +1 -0
  223. package/dist/templates/plugins.json.template +33 -0
  224. package/dist/templates/system-configuration.md.template +70 -0
  225. package/dist/tools/cross-nav.d.ts +21 -0
  226. package/dist/tools/cross-nav.d.ts.map +1 -0
  227. package/dist/tools/cross-nav.js +93 -0
  228. package/dist/tools/cross-nav.js.map +1 -0
  229. package/dist/tools/index.d.ts +1 -0
  230. package/dist/tools/index.d.ts.map +1 -1
  231. package/dist/tools/index.js +1 -0
  232. package/dist/tools/index.js.map +1 -1
  233. package/dist/tools/related-navs-config.d.ts +15 -0
  234. package/dist/tools/related-navs-config.d.ts.map +1 -0
  235. package/dist/tools/related-navs-config.js +132 -0
  236. package/dist/tools/related-navs-config.js.map +1 -0
  237. package/dist/tools/related-navs.d.ts +23 -0
  238. package/dist/tools/related-navs.d.ts.map +1 -0
  239. package/dist/tools/related-navs.js +107 -0
  240. package/dist/tools/related-navs.js.map +1 -0
  241. package/dist/tools/response.d.ts +3 -2
  242. package/dist/tools/response.d.ts.map +1 -1
  243. package/dist/tools/response.js +7 -11
  244. package/dist/tools/response.js.map +1 -1
  245. package/dist/tools/self-config.d.ts +2 -1
  246. package/dist/tools/self-config.d.ts.map +1 -1
  247. package/dist/tools/self-config.js +5 -9
  248. package/dist/tools/self-config.js.map +1 -1
  249. package/package.json +4 -1
  250. package/dist/memento/state.d.ts +0 -56
  251. package/dist/memento/state.d.ts.map +0 -1
  252. package/dist/memento/state.js +0 -156
  253. package/dist/memento/state.js.map +0 -1
  254. package/dist/migrations/versions/v1.4.0-rfc2119-skills.d.ts +0 -18
  255. package/dist/migrations/versions/v1.4.0-rfc2119-skills.d.ts.map +0 -1
  256. package/dist/migrations/versions/v1.4.0-rfc2119-skills.js +0 -207
  257. package/dist/migrations/versions/v1.4.0-rfc2119-skills.js.map +0 -1
@@ -0,0 +1,91 @@
1
+ #!/bin/bash
2
+ # update_plugin_config chibi plugin
3
+ #
4
+ # Reads plugins.json, merges updates into a plugin's config section,
5
+ # and writes back. Requires AUTONAV_PLUGINS_PATH and jq.
6
+
7
+ set -euo pipefail
8
+
9
+ if [[ "${1:-}" == "--schema" ]]; then
10
+ printf '%s\n' '{' \
11
+ ' "name": "update_plugin_config",' \
12
+ ' "description": "Update your own plugin configuration. Use this to schedule check-ins, change notification settings, enable/disable plugins, update channel preferences, or modify any plugin behavior.",' \
13
+ ' "parameters": {' \
14
+ ' "type": "object",' \
15
+ ' "properties": {' \
16
+ ' "plugin": {' \
17
+ ' "type": "string",' \
18
+ ' "enum": ["slack", "signal", "github", "email"],' \
19
+ ' "description": "The plugin to configure"' \
20
+ ' },' \
21
+ ' "updates": {' \
22
+ ' "type": "object",' \
23
+ ' "description": "Config key-value pairs to merge into the plugin'\''s config section"' \
24
+ ' },' \
25
+ ' "reason": {' \
26
+ ' "type": "string",' \
27
+ ' "description": "Brief explanation of why you'\''re making this change"' \
28
+ ' }' \
29
+ ' },' \
30
+ ' "required": ["plugin", "updates", "reason"]' \
31
+ ' }' \
32
+ '}'
33
+ exit 0
34
+ fi
35
+
36
+ # jq is required for this plugin (merge logic)
37
+ if ! command -v jq &>/dev/null; then
38
+ echo '{"success": false, "error": "jq is required for update_plugin_config but was not found on PATH."}'
39
+ exit 0
40
+ fi
41
+
42
+ # Read JSON args from stdin
43
+ input=$(cat)
44
+ plugin=$(echo "$input" | jq -r '.plugin // empty')
45
+ updates=$(echo "$input" | jq '.updates // empty')
46
+ reason=$(echo "$input" | jq -r '.reason // empty')
47
+
48
+ if [[ -z "$plugin" || "$updates" == "empty" || "$updates" == "" || -z "$reason" ]]; then
49
+ echo '{"success": false, "error": "Missing required fields: plugin, updates, and reason"}'
50
+ exit 0
51
+ fi
52
+
53
+ # Validate plugin name
54
+ case "$plugin" in
55
+ slack|signal|github|email) ;;
56
+ *)
57
+ jq -n --arg p "$plugin" \
58
+ '{"success": false, "error": ("Unknown plugin: " + $p + ". Valid: slack, signal, github, email")}'
59
+ exit 0
60
+ ;;
61
+ esac
62
+
63
+ # Check env var
64
+ config_path="${AUTONAV_PLUGINS_PATH:-}"
65
+ if [[ -z "$config_path" ]]; then
66
+ echo '{"success": false, "error": "AUTONAV_PLUGINS_PATH not set. Plugin configuration unavailable."}'
67
+ exit 0
68
+ fi
69
+
70
+ if [[ ! -f "$config_path" ]]; then
71
+ echo '{"success": false, "error": "Plugin configuration file not found."}'
72
+ exit 0
73
+ fi
74
+
75
+ # Read current config
76
+ current=$(cat "$config_path")
77
+
78
+ # Merge updates into the plugin's config section
79
+ # If the plugin section doesn't exist, create it with enabled: false
80
+ updated=$(echo "$current" | jq --arg p "$plugin" --argjson u "$updates" '
81
+ if .[$p] == null then
82
+ .[$p] = {"enabled": false, "config": {}}
83
+ else . end
84
+ | .[$p].config = (.[$p].config // {} | . * $u)
85
+ ')
86
+
87
+ # Write back
88
+ echo "$updated" > "$config_path"
89
+
90
+ jq -n --arg p "$plugin" --arg r "$reason" --argjson u "$updates" \
91
+ '{"success": true, "plugin": $p, "message": ("Updated " + $p + " config: " + $r), "changes": $u}'
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Claude Code SDK Harness
3
+ *
4
+ * Adapts the Claude Agent SDK into the universal Harness interface.
5
+ * This is a near-passthrough — most AgentConfig fields map directly
6
+ * to SDK options. The main job is flattening SDK messages into AgentEvent.
7
+ */
8
+ import type { Harness, HarnessSession, AgentConfig } from "./types.js";
9
+ import type { ToolDefinition } from "./tool-server.js";
10
+ /**
11
+ * Claude Code SDK Harness
12
+ *
13
+ * Creates HarnessSessions that delegate to the Claude Agent SDK's query() function.
14
+ * This is the default harness — it's a thin adapter since AgentConfig maps almost
15
+ * directly to SDK options.
16
+ */
17
+ export declare class ClaudeCodeHarness implements Harness {
18
+ readonly displayName = "Claude";
19
+ run(config: AgentConfig, prompt: string): HarnessSession;
20
+ createToolServer(name: string, tools: ToolDefinition[]): {
21
+ server: unknown;
22
+ };
23
+ }
24
+ //# sourceMappingURL=claude-code-harness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code-harness.d.ts","sourceRoot":"","sources":["../../src/harness/claude-code-harness.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,WAAW,EAAc,MAAM,YAAY,CAAC;AACnF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAyNvD;;;;;;GAMG;AACH,qBAAa,iBAAkB,YAAW,OAAO;IAC/C,QAAQ,CAAC,WAAW,YAAY;IAEhC,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,GAAG,cAAc;IAIxD,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG;QAAE,MAAM,EAAE,OAAO,CAAA;KAAE;CAW7E"}
@@ -0,0 +1,242 @@
1
+ /**
2
+ * Claude Code SDK Harness
3
+ *
4
+ * Adapts the Claude Agent SDK into the universal Harness interface.
5
+ * This is a near-passthrough — most AgentConfig fields map directly
6
+ * to SDK options. The main job is flattening SDK messages into AgentEvent.
7
+ */
8
+ import { query, tool, createSdkMcpServer } from "@anthropic-ai/claude-agent-sdk";
9
+ /**
10
+ * Flatten an SDK message into zero or more AgentEvents.
11
+ *
12
+ * SDK messages are rich and nested. We extract the parts that matter
13
+ * for harness consumers (text, tool_use, tool_result, errors, result).
14
+ */
15
+ function flattenMessage(message) {
16
+ const events = [];
17
+ if (message.type === "assistant") {
18
+ // Check for rate limit error on the message
19
+ if (message.error === "rate_limit") {
20
+ events.push({
21
+ type: "error",
22
+ message: "Rate limit reached",
23
+ retryable: true,
24
+ });
25
+ }
26
+ // Extract content blocks
27
+ for (const block of message.message.content) {
28
+ if (block.type === "text") {
29
+ events.push({ type: "text", text: block.text });
30
+ }
31
+ else if (block.type === "tool_use") {
32
+ events.push({
33
+ type: "tool_use",
34
+ name: block.name,
35
+ id: block.id,
36
+ input: block.input || {},
37
+ });
38
+ }
39
+ }
40
+ }
41
+ else if (message.type === "user") {
42
+ // Extract tool results from user messages
43
+ const msg = message;
44
+ if (msg.tool_use_result !== undefined) {
45
+ const result = msg.tool_use_result;
46
+ // Simple text result
47
+ if (typeof result === "string") {
48
+ events.push({
49
+ type: "tool_result",
50
+ toolUseId: "",
51
+ content: result,
52
+ isError: /^(Error:|error:)/i.test(result),
53
+ });
54
+ }
55
+ else if (result && typeof result === "object") {
56
+ const r = result;
57
+ events.push({
58
+ type: "tool_result",
59
+ toolUseId: "",
60
+ content: typeof r.content === "string" ? r.content : JSON.stringify(r),
61
+ isError: r.isError === true,
62
+ });
63
+ }
64
+ }
65
+ }
66
+ else if (message.type === "result") {
67
+ const resultMsg = message;
68
+ if (resultMsg.subtype === "success") {
69
+ events.push({
70
+ type: "result",
71
+ success: true,
72
+ text: resultMsg.result,
73
+ usage: {
74
+ inputTokens: resultMsg.usage.input_tokens,
75
+ outputTokens: resultMsg.usage.output_tokens,
76
+ },
77
+ costUsd: resultMsg.total_cost_usd,
78
+ durationMs: resultMsg.duration_ms,
79
+ durationApiMs: resultMsg.duration_api_ms,
80
+ numTurns: resultMsg.num_turns,
81
+ sessionId: resultMsg.session_id,
82
+ });
83
+ }
84
+ else {
85
+ const errors = "errors" in resultMsg ? resultMsg.errors : [];
86
+ events.push({
87
+ type: "result",
88
+ success: false,
89
+ text: errors.join("; "),
90
+ usage: {
91
+ inputTokens: resultMsg.usage.input_tokens,
92
+ outputTokens: resultMsg.usage.output_tokens,
93
+ },
94
+ costUsd: resultMsg.total_cost_usd,
95
+ durationMs: resultMsg.duration_ms,
96
+ durationApiMs: resultMsg.duration_api_ms,
97
+ numTurns: resultMsg.num_turns,
98
+ sessionId: resultMsg.session_id,
99
+ });
100
+ }
101
+ }
102
+ return events;
103
+ }
104
+ /**
105
+ * Map AgentConfig to Claude Code SDK Options
106
+ */
107
+ function configToSdkOptions(config) {
108
+ const options = {};
109
+ if (config.model)
110
+ options.model = config.model;
111
+ if (config.systemPrompt)
112
+ options.systemPrompt = config.systemPrompt;
113
+ if (config.cwd)
114
+ options.cwd = config.cwd;
115
+ if (config.additionalDirectories)
116
+ options.additionalDirectories = config.additionalDirectories;
117
+ if (config.maxTurns !== undefined)
118
+ options.maxTurns = config.maxTurns;
119
+ if (config.maxBudgetUsd !== undefined)
120
+ options.maxBudgetUsd = config.maxBudgetUsd;
121
+ if (config.allowedTools)
122
+ options.allowedTools = config.allowedTools;
123
+ if (config.disallowedTools)
124
+ options.disallowedTools = config.disallowedTools;
125
+ if (config.mcpServers)
126
+ options.mcpServers = config.mcpServers;
127
+ if (config.permissionMode)
128
+ options.permissionMode = config.permissionMode;
129
+ if (config.stderr)
130
+ options.stderr = config.stderr;
131
+ // Translate AgentConfig.sandbox to SDK SandboxSettings.
132
+ // ChibiHarness translates to nono; ClaudeCodeHarness translates to SDK sandbox.
133
+ // The SDK sandbox uses Seatbelt (macOS) / bubblewrap (Linux) and restricts
134
+ // writes to cwd by default. When AgentConfig.sandbox is not set (e.g., memento
135
+ // default), no sandbox options are passed — YOLO mode.
136
+ if (config.sandbox) {
137
+ options.sandbox = {
138
+ enabled: true,
139
+ autoAllowBashIfSandboxed: true,
140
+ allowUnsandboxedCommands: false,
141
+ };
142
+ }
143
+ return options;
144
+ }
145
+ /**
146
+ * Claude Code SDK harness session.
147
+ *
148
+ * For initial prompt: iterates over the SDK Query's async generator.
149
+ * For multi-turn (send): builds conversation context from prior messages
150
+ * and starts a new query with accumulated history.
151
+ */
152
+ class ClaudeCodeSession {
153
+ config;
154
+ queryInstance;
155
+ conversationHistory = [];
156
+ closed = false;
157
+ constructor(config, initialPrompt) {
158
+ this.config = { ...config };
159
+ this.conversationHistory.push(`User: ${initialPrompt}`);
160
+ this.queryInstance = query({
161
+ prompt: initialPrompt,
162
+ options: configToSdkOptions(this.config),
163
+ });
164
+ }
165
+ async *[Symbol.asyncIterator]() {
166
+ let lastAssistantText = "";
167
+ for await (const message of this.queryInstance) {
168
+ const events = flattenMessage(message);
169
+ for (const event of events) {
170
+ if (event.type === "text") {
171
+ lastAssistantText = event.text;
172
+ }
173
+ yield event;
174
+ }
175
+ }
176
+ // Record assistant response for multi-turn context
177
+ if (lastAssistantText) {
178
+ this.conversationHistory.push(`Assistant: ${lastAssistantText}`);
179
+ }
180
+ }
181
+ send(prompt) {
182
+ if (this.closed) {
183
+ throw new Error("Session is closed");
184
+ }
185
+ this.conversationHistory.push(`User: ${prompt}`);
186
+ // Build the full conversation as a single prompt
187
+ // (same pattern as App.tsx conversation history)
188
+ const fullPrompt = this.conversationHistory.join("\n\n");
189
+ this.queryInstance = query({
190
+ prompt: fullPrompt,
191
+ options: configToSdkOptions(this.config),
192
+ });
193
+ // Return a new async iterable that tracks the response
194
+ const session = this;
195
+ return {
196
+ async *[Symbol.asyncIterator]() {
197
+ let lastText = "";
198
+ for await (const message of session.queryInstance) {
199
+ const events = flattenMessage(message);
200
+ for (const event of events) {
201
+ if (event.type === "text") {
202
+ lastText = event.text;
203
+ }
204
+ yield event;
205
+ }
206
+ }
207
+ if (lastText) {
208
+ session.conversationHistory.push(`Assistant: ${lastText}`);
209
+ }
210
+ },
211
+ };
212
+ }
213
+ updateConfig(config) {
214
+ Object.assign(this.config, config);
215
+ }
216
+ async close() {
217
+ this.closed = true;
218
+ }
219
+ }
220
+ /**
221
+ * Claude Code SDK Harness
222
+ *
223
+ * Creates HarnessSessions that delegate to the Claude Agent SDK's query() function.
224
+ * This is the default harness — it's a thin adapter since AgentConfig maps almost
225
+ * directly to SDK options.
226
+ */
227
+ export class ClaudeCodeHarness {
228
+ displayName = "Claude";
229
+ run(config, prompt) {
230
+ return new ClaudeCodeSession(config, prompt);
231
+ }
232
+ createToolServer(name, tools) {
233
+ const sdkTools = tools.map((td) => tool(td.name, td.description, td.inputSchema, td.handler));
234
+ const server = createSdkMcpServer({
235
+ name,
236
+ version: "1.0.0",
237
+ tools: sdkTools,
238
+ });
239
+ return { server };
240
+ }
241
+ }
242
+ //# sourceMappingURL=claude-code-harness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code-harness.js","sourceRoot":"","sources":["../../src/harness/claude-code-harness.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Ephemeral Home
3
+ *
4
+ * Creates temporary home directories for harness sessions. Each harness
5
+ * (chibi, opencode, etc.) can use this to inject custom plugins/tools
6
+ * into the agent's environment without polluting global config.
7
+ *
8
+ * Base location priority:
9
+ * 1. AUTONAV_<HARNESS>_HOME env var (e.g. AUTONAV_CHIBI_HOME)
10
+ * 2. os.tmpdir()
11
+ */
12
+ export interface EphemeralHomeOptions {
13
+ /** Harness name used for dir prefix and env var lookup (e.g. "chibi", "opencode") */
14
+ harness: string;
15
+ /** Callback to populate the home directory after creation */
16
+ setup: (homePath: string) => void;
17
+ }
18
+ export interface EphemeralHome {
19
+ /** Absolute path to the ephemeral home directory */
20
+ homePath: string;
21
+ /** Remove the ephemeral home directory and all contents */
22
+ cleanup: () => void;
23
+ }
24
+ /**
25
+ * Create an ephemeral home directory for a harness session.
26
+ *
27
+ * The directory is created under:
28
+ * - $AUTONAV_<HARNESS>_HOME if set (e.g. AUTONAV_CHIBI_HOME=/tmp/my-chibi)
29
+ * - os.tmpdir() otherwise
30
+ *
31
+ * Directory name: `autonav-<harness>-<uuid>/`
32
+ */
33
+ export declare function createEphemeralHome(opts: EphemeralHomeOptions): EphemeralHome;
34
+ //# sourceMappingURL=ephemeral-home.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ephemeral-home.d.ts","sourceRoot":"","sources":["../../src/harness/ephemeral-home.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH,MAAM,WAAW,oBAAoB;IACnC,qFAAqF;IACrF,OAAO,EAAE,MAAM,CAAC;IAChB,6DAA6D;IAC7D,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED,MAAM,WAAW,aAAa;IAC5B,oDAAoD;IACpD,QAAQ,EAAE,MAAM,CAAC;IACjB,2DAA2D;IAC3D,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,oBAAoB,GAAG,aAAa,CA8B7E"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Ephemeral Home
3
+ *
4
+ * Creates temporary home directories for harness sessions. Each harness
5
+ * (chibi, opencode, etc.) can use this to inject custom plugins/tools
6
+ * into the agent's environment without polluting global config.
7
+ *
8
+ * Base location priority:
9
+ * 1. AUTONAV_<HARNESS>_HOME env var (e.g. AUTONAV_CHIBI_HOME)
10
+ * 2. os.tmpdir()
11
+ */
12
+ import * as fs from "node:fs";
13
+ import * as os from "node:os";
14
+ import * as path from "node:path";
15
+ import * as crypto from "node:crypto";
16
+ /**
17
+ * Create an ephemeral home directory for a harness session.
18
+ *
19
+ * The directory is created under:
20
+ * - $AUTONAV_<HARNESS>_HOME if set (e.g. AUTONAV_CHIBI_HOME=/tmp/my-chibi)
21
+ * - os.tmpdir() otherwise
22
+ *
23
+ * Directory name: `autonav-<harness>-<uuid>/`
24
+ */
25
+ export function createEphemeralHome(opts) {
26
+ const envKey = `AUTONAV_${opts.harness.toUpperCase()}_HOME`;
27
+ const base = process.env[envKey] || os.tmpdir();
28
+ const dirName = `autonav-${opts.harness}-${crypto.randomUUID().slice(0, 8)}`;
29
+ const homePath = path.join(base, dirName);
30
+ fs.mkdirSync(homePath, { recursive: true });
31
+ try {
32
+ opts.setup(homePath);
33
+ }
34
+ catch (err) {
35
+ // Clean up on setup failure
36
+ try {
37
+ fs.rmSync(homePath, { recursive: true, force: true });
38
+ }
39
+ catch {
40
+ // Best-effort cleanup
41
+ }
42
+ throw err;
43
+ }
44
+ return {
45
+ homePath,
46
+ cleanup: () => {
47
+ try {
48
+ fs.rmSync(homePath, { recursive: true, force: true });
49
+ }
50
+ catch {
51
+ // Best-effort cleanup
52
+ }
53
+ },
54
+ };
55
+ }
56
+ //# sourceMappingURL=ephemeral-home.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ephemeral-home.js","sourceRoot":"","sources":["../../src/harness/ephemeral-home.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AAgBtC;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAA0B;IAC5D,MAAM,MAAM,GAAG,WAAW,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC;IAC5D,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC;IAChD,MAAM,OAAO,GAAG,WAAW,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IAC7E,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAE1C,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE5C,IAAI,CAAC;QACH,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACvB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,4BAA4B;QAC5B,IAAI,CAAC;YACH,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,CAAC;QAAC,MAAM,CAAC;YACP,sBAAsB;QACxB,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;IAED,OAAO;QACL,QAAQ;QACR,OAAO,EAAE,GAAG,EAAE;YACZ,IAAI,CAAC;gBACH,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACxD,CAAC;YAAC,MAAM,CAAC;gBACP,sBAAsB;YACxB,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Harness Factory
3
+ *
4
+ * Resolves and creates the appropriate harness based on configuration.
5
+ *
6
+ * Resolution priority:
7
+ * 1. Explicit type parameter
8
+ * 2. CLI flag: --harness chibi
9
+ * 3. Env var: AUTONAV_HARNESS=chibi
10
+ * 4. Navigator config.json: harness.type
11
+ * 5. Default: claude-code
12
+ */
13
+ import type { Harness, HarnessType } from "./types.js";
14
+ /**
15
+ * Resolve harness type from available sources.
16
+ *
17
+ * @param explicit - Explicit type (from CLI flag or direct call)
18
+ * @param navigatorConfig - Navigator config object (may have harness.type)
19
+ * @returns Resolved harness type
20
+ */
21
+ export declare function resolveHarnessType(explicit?: string, navigatorConfig?: {
22
+ harness?: {
23
+ type?: string;
24
+ };
25
+ }): HarnessType;
26
+ /**
27
+ * Create a harness instance for the given type.
28
+ *
29
+ * @param type - Harness type to create
30
+ * @returns Harness instance
31
+ */
32
+ export declare function createHarness(type: HarnessType): Promise<Harness>;
33
+ /**
34
+ * Resolve harness type and create instance in one call.
35
+ *
36
+ * This is the main entry point for harness creation.
37
+ *
38
+ * @param explicit - Explicit type (from CLI --harness flag)
39
+ * @param navigatorConfig - Navigator config object
40
+ * @returns Ready-to-use Harness instance
41
+ */
42
+ export declare function resolveAndCreateHarness(explicit?: string, navigatorConfig?: {
43
+ harness?: {
44
+ type?: string;
45
+ };
46
+ }): Promise<Harness>;
47
+ //# sourceMappingURL=factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/harness/factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGvD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,CAAC,EAAE,MAAM,EACjB,eAAe,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAChD,WAAW,CAmBb;AAeD;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAmBvE;AAED;;;;;;;;GAQG;AACH,wBAAsB,uBAAuB,CAC3C,QAAQ,CAAC,EAAE,MAAM,EACjB,eAAe,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAChD,OAAO,CAAC,OAAO,CAAC,CAGlB"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Harness Factory
3
+ *
4
+ * Resolves and creates the appropriate harness based on configuration.
5
+ *
6
+ * Resolution priority:
7
+ * 1. Explicit type parameter
8
+ * 2. CLI flag: --harness chibi
9
+ * 3. Env var: AUTONAV_HARNESS=chibi
10
+ * 4. Navigator config.json: harness.type
11
+ * 5. Default: claude-code
12
+ */
13
+ import { ClaudeCodeHarness } from "./claude-code-harness.js";
14
+ /**
15
+ * Resolve harness type from available sources.
16
+ *
17
+ * @param explicit - Explicit type (from CLI flag or direct call)
18
+ * @param navigatorConfig - Navigator config object (may have harness.type)
19
+ * @returns Resolved harness type
20
+ */
21
+ export function resolveHarnessType(explicit, navigatorConfig) {
22
+ // 1. Explicit parameter (from CLI --harness flag)
23
+ if (explicit) {
24
+ return validateHarnessType(explicit);
25
+ }
26
+ // 2. Environment variable
27
+ const envType = process.env.AUTONAV_HARNESS;
28
+ if (envType) {
29
+ return validateHarnessType(envType);
30
+ }
31
+ // 3. Navigator config
32
+ if (navigatorConfig?.harness?.type) {
33
+ return validateHarnessType(navigatorConfig.harness.type);
34
+ }
35
+ // 4. Default
36
+ return "claude-code";
37
+ }
38
+ /**
39
+ * Validate a string is a valid HarnessType
40
+ */
41
+ function validateHarnessType(value) {
42
+ const valid = ["claude-code", "chibi", "opencode"];
43
+ if (!valid.includes(value)) {
44
+ throw new Error(`Invalid harness type: "${value}". Valid types: ${valid.join(", ")}`);
45
+ }
46
+ return value;
47
+ }
48
+ /**
49
+ * Create a harness instance for the given type.
50
+ *
51
+ * @param type - Harness type to create
52
+ * @returns Harness instance
53
+ */
54
+ export async function createHarness(type) {
55
+ switch (type) {
56
+ case "claude-code":
57
+ return new ClaudeCodeHarness();
58
+ case "chibi": {
59
+ // Dynamic import to avoid loading chibi dependencies when not needed
60
+ const { ChibiHarness } = await import("./chibi-harness.js");
61
+ return new ChibiHarness();
62
+ }
63
+ case "opencode": {
64
+ const { OpenCodeHarness } = await import("./opencode-harness.js");
65
+ return new OpenCodeHarness();
66
+ }
67
+ default:
68
+ throw new Error(`Unknown harness type: ${type}`);
69
+ }
70
+ }
71
+ /**
72
+ * Resolve harness type and create instance in one call.
73
+ *
74
+ * This is the main entry point for harness creation.
75
+ *
76
+ * @param explicit - Explicit type (from CLI --harness flag)
77
+ * @param navigatorConfig - Navigator config object
78
+ * @returns Ready-to-use Harness instance
79
+ */
80
+ export async function resolveAndCreateHarness(explicit, navigatorConfig) {
81
+ const type = resolveHarnessType(explicit, navigatorConfig);
82
+ return createHarness(type);
83
+ }
84
+ //# sourceMappingURL=factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/harness/factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAChC,QAAiB,EACjB,eAAiD;IAEjD,kDAAkD;IAClD,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC;IAED,0BAA0B;IAC1B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IAC5C,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAED,sBAAsB;IACtB,IAAI,eAAe,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACnC,OAAO,mBAAmB,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,CAAC;IAED,aAAa;IACb,OAAO,aAAa,CAAC;AACvB,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,KAAa;IACxC,MAAM,KAAK,GAAkB,CAAC,aAAa,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IAClE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAoB,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CACb,0BAA0B,KAAK,mBAAmB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACrE,CAAC;IACJ,CAAC;IACD,OAAO,KAAoB,CAAC;AAC9B,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAiB;IACnD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,aAAa;YAChB,OAAO,IAAI,iBAAiB,EAAE,CAAC;QAEjC,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,qEAAqE;YACrE,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;YAC5D,OAAO,IAAI,YAAY,EAAE,CAAC;QAC5B,CAAC;QAED,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;YAClE,OAAO,IAAI,eAAe,EAAE,CAAC;QAC/B,CAAC;QAED;YACE,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,EAAE,CAAC,CAAC;IACrD,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,QAAiB,EACjB,eAAiD;IAEjD,MAAM,IAAI,GAAG,kBAAkB,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;IAC3D,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Harness Helpers
3
+ *
4
+ * Utility functions for consuming AgentEvent streams.
5
+ * These are the most common patterns across all harness consumers.
6
+ */
7
+ import type { AgentEvent } from "./types.js";
8
+ /**
9
+ * Collect all text from an agent event stream into a single string.
10
+ *
11
+ * Useful for simple queries where you just need the final answer text.
12
+ */
13
+ export declare function collectText(events: AsyncIterable<AgentEvent>): Promise<string>;
14
+ /**
15
+ * Result from collecting a complete agent run.
16
+ */
17
+ export interface CollectedResult {
18
+ /** Whether the run succeeded */
19
+ success: boolean;
20
+ /** Final text output */
21
+ text: string;
22
+ /** Token usage */
23
+ usage?: {
24
+ inputTokens: number;
25
+ outputTokens: number;
26
+ };
27
+ /** Cost in USD */
28
+ costUsd?: number;
29
+ /** Duration in ms */
30
+ durationMs?: number;
31
+ /** All text events (in order) */
32
+ textEvents: string[];
33
+ /** All tool use events */
34
+ toolUseEvents: Array<{
35
+ name: string;
36
+ id: string;
37
+ input: Record<string, unknown>;
38
+ }>;
39
+ /** All tool result events */
40
+ toolResultEvents: Array<{
41
+ toolUseId: string;
42
+ content: string;
43
+ isError?: boolean;
44
+ }>;
45
+ /** All error events */
46
+ errorEvents: Array<{
47
+ message: string;
48
+ retryable?: boolean;
49
+ }>;
50
+ }
51
+ /**
52
+ * Collect the full result from an agent event stream.
53
+ *
54
+ * Accumulates all events into a structured result. Useful when you need
55
+ * to inspect tool usage, track errors, or access usage metrics.
56
+ */
57
+ export declare function collectResult(events: AsyncIterable<AgentEvent>): Promise<CollectedResult>;
58
+ //# sourceMappingURL=helpers.d.ts.map