@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.
- package/README.md +2 -2
- package/dist/adapter/index.d.ts +3 -3
- package/dist/adapter/index.d.ts.map +1 -1
- package/dist/adapter/index.js +3 -3
- package/dist/adapter/index.js.map +1 -1
- package/dist/adapter/navigator-adapter.d.ts +196 -0
- package/dist/adapter/navigator-adapter.d.ts.map +1 -0
- package/dist/adapter/navigator-adapter.js +579 -0
- package/dist/adapter/navigator-adapter.js.map +1 -0
- package/dist/cli/autonav.d.ts +2 -6
- package/dist/cli/autonav.d.ts.map +1 -1
- package/dist/cli/autonav.js +32 -53
- package/dist/cli/autonav.js.map +1 -1
- package/dist/cli/nav-chat.d.ts +2 -1
- package/dist/cli/nav-chat.d.ts.map +1 -1
- package/dist/cli/nav-chat.js +32 -3
- package/dist/cli/nav-chat.js.map +1 -1
- package/dist/cli/nav-init.d.ts +2 -1
- package/dist/cli/nav-init.d.ts.map +1 -1
- package/dist/cli/nav-init.js +12 -4
- package/dist/cli/nav-init.js.map +1 -1
- package/dist/cli/nav-install.d.ts +2 -1
- package/dist/cli/nav-install.d.ts.map +1 -1
- package/dist/cli/nav-install.js +4 -2
- package/dist/cli/nav-install.js.map +1 -1
- package/dist/cli/nav-memento.d.ts +3 -2
- package/dist/cli/nav-memento.d.ts.map +1 -1
- package/dist/cli/nav-memento.js +12 -6
- package/dist/cli/nav-memento.js.map +1 -1
- package/dist/cli/nav-mend.d.ts +2 -1
- package/dist/cli/nav-mend.d.ts.map +1 -1
- package/dist/cli/nav-mend.js +4 -1
- package/dist/cli/nav-mend.js.map +1 -1
- package/dist/cli/nav-migrate.d.ts +2 -1
- package/dist/cli/nav-migrate.d.ts.map +1 -1
- package/dist/cli/nav-migrate.js +2 -6
- package/dist/cli/nav-migrate.js.map +1 -1
- package/dist/cli/nav-query.d.ts +2 -1
- package/dist/cli/nav-query.d.ts.map +1 -1
- package/dist/cli/nav-query.js +12 -6
- package/dist/cli/nav-query.js.map +1 -1
- package/dist/cli/nav-standup.d.ts +18 -0
- package/dist/cli/nav-standup.d.ts.map +1 -0
- package/dist/cli/nav-standup.js +151 -0
- package/dist/cli/nav-standup.js.map +1 -0
- package/dist/cli/nav-uninstall.d.ts +2 -1
- package/dist/cli/nav-uninstall.d.ts.map +1 -1
- package/dist/cli/nav-uninstall.js +4 -2
- package/dist/cli/nav-uninstall.js.map +1 -1
- package/dist/cli/nav-update.d.ts +2 -1
- package/dist/cli/nav-update.d.ts.map +1 -1
- package/dist/cli/nav-update.js +11 -6
- package/dist/cli/nav-update.js.map +1 -1
- package/dist/conversation/App.d.ts +9 -2
- package/dist/conversation/App.d.ts.map +1 -1
- package/dist/conversation/App.js +304 -111
- package/dist/conversation/App.js.map +1 -1
- package/dist/conversation/index.d.ts +5 -0
- package/dist/conversation/index.d.ts.map +1 -1
- package/dist/conversation/index.js +17 -2
- package/dist/conversation/index.js.map +1 -1
- package/dist/harness/chibi-harness.d.ts +36 -0
- package/dist/harness/chibi-harness.d.ts.map +1 -0
- package/dist/harness/chibi-harness.js +383 -0
- package/dist/harness/chibi-harness.js.map +1 -0
- package/dist/harness/chibi-plugins/get_plugin_config +64 -0
- package/dist/harness/chibi-plugins/query_navigator +114 -0
- package/dist/harness/chibi-plugins/submit_answer +38 -0
- package/dist/harness/chibi-plugins/update_plugin_config +91 -0
- package/dist/harness/claude-code-harness.d.ts +24 -0
- package/dist/harness/claude-code-harness.d.ts.map +1 -0
- package/dist/harness/claude-code-harness.js +242 -0
- package/dist/harness/claude-code-harness.js.map +1 -0
- package/dist/harness/ephemeral-home.d.ts +34 -0
- package/dist/harness/ephemeral-home.d.ts.map +1 -0
- package/dist/harness/ephemeral-home.js +56 -0
- package/dist/harness/ephemeral-home.js.map +1 -0
- package/dist/harness/factory.d.ts +47 -0
- package/dist/harness/factory.d.ts.map +1 -0
- package/dist/harness/factory.js +84 -0
- package/dist/harness/factory.js.map +1 -0
- package/dist/harness/helpers.d.ts +58 -0
- package/dist/harness/helpers.d.ts.map +1 -0
- package/dist/harness/helpers.js +78 -0
- package/dist/harness/helpers.js.map +1 -0
- package/dist/harness/index.d.ts +14 -0
- package/dist/harness/index.d.ts.map +1 -0
- package/dist/harness/index.js +13 -0
- package/dist/harness/index.js.map +1 -0
- package/dist/harness/opencode-harness.d.ts +79 -0
- package/dist/harness/opencode-harness.d.ts.map +1 -0
- package/dist/harness/opencode-harness.js +537 -0
- package/dist/harness/opencode-harness.js.map +1 -0
- package/dist/harness/opencode-tools/get_plugin_config.ts +72 -0
- package/dist/harness/opencode-tools/query_navigator.ts +126 -0
- package/dist/harness/opencode-tools/submit_answer.ts +40 -0
- package/dist/harness/opencode-tools/update_plugin_config.ts +105 -0
- package/dist/harness/sandbox.d.ts +59 -0
- package/dist/harness/sandbox.d.ts.map +1 -0
- package/dist/harness/sandbox.js +152 -0
- package/dist/harness/sandbox.js.map +1 -0
- package/dist/harness/tool-server.d.ts +50 -0
- package/dist/harness/tool-server.d.ts.map +1 -0
- package/dist/harness/tool-server.js +27 -0
- package/dist/harness/tool-server.js.map +1 -0
- package/dist/harness/types.d.ts +168 -0
- package/dist/harness/types.d.ts.map +1 -0
- package/dist/harness/types.js +12 -0
- package/dist/harness/types.js.map +1 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/interview/App.d.ts +4 -2
- package/dist/interview/App.d.ts.map +1 -1
- package/dist/interview/App.js +36 -56
- package/dist/interview/App.js.map +1 -1
- package/dist/interview/index.d.ts +3 -0
- package/dist/interview/index.d.ts.map +1 -1
- package/dist/interview/index.js +1 -0
- package/dist/interview/index.js.map +1 -1
- package/dist/interview/prompts.d.ts +3 -1
- package/dist/interview/prompts.d.ts.map +1 -1
- package/dist/interview/prompts.js +5 -1
- package/dist/interview/prompts.js.map +1 -1
- package/dist/interview/ui/ChatBanner.d.ts +17 -0
- package/dist/interview/ui/ChatBanner.d.ts.map +1 -0
- package/dist/interview/ui/ChatBanner.js +30 -0
- package/dist/interview/ui/ChatBanner.js.map +1 -0
- package/dist/interview/ui/ChatInput.d.ts +36 -0
- package/dist/interview/ui/ChatInput.d.ts.map +1 -0
- package/dist/interview/ui/ChatInput.js +304 -0
- package/dist/interview/ui/ChatInput.js.map +1 -0
- package/dist/interview/ui/MarkdownText.d.ts +13 -0
- package/dist/interview/ui/MarkdownText.d.ts.map +1 -0
- package/dist/interview/ui/MarkdownText.js +107 -0
- package/dist/interview/ui/MarkdownText.js.map +1 -0
- package/dist/interview/ui/index.d.ts +3 -0
- package/dist/interview/ui/index.d.ts.map +1 -1
- package/dist/interview/ui/index.js +3 -0
- package/dist/interview/ui/index.js.map +1 -1
- package/dist/memento/implementer-agent.d.ts +31 -0
- package/dist/memento/implementer-agent.d.ts.map +1 -0
- package/dist/memento/implementer-agent.js +95 -0
- package/dist/memento/implementer-agent.js.map +1 -0
- package/dist/memento/index.d.ts +6 -5
- package/dist/memento/index.d.ts.map +1 -1
- package/dist/memento/index.js +7 -5
- package/dist/memento/index.js.map +1 -1
- package/dist/memento/loop.d.ts +6 -5
- package/dist/memento/loop.d.ts.map +1 -1
- package/dist/memento/loop.js +872 -180
- package/dist/memento/loop.js.map +1 -1
- package/dist/memento/matrix-animation.d.ts +26 -0
- package/dist/memento/matrix-animation.d.ts.map +1 -1
- package/dist/memento/matrix-animation.js +93 -18
- package/dist/memento/matrix-animation.js.map +1 -1
- package/dist/memento/nav-protocol.d.ts +2 -2
- package/dist/memento/nav-protocol.d.ts.map +1 -1
- package/dist/memento/nav-protocol.js +39 -43
- package/dist/memento/nav-protocol.js.map +1 -1
- package/dist/memento/prompts.d.ts +21 -8
- package/dist/memento/prompts.d.ts.map +1 -1
- package/dist/memento/prompts.js +79 -39
- package/dist/memento/prompts.js.map +1 -1
- package/dist/memento/rate-limit.d.ts +85 -0
- package/dist/memento/rate-limit.d.ts.map +1 -0
- package/dist/memento/rate-limit.js +221 -0
- package/dist/memento/rate-limit.js.map +1 -0
- package/dist/memento/types.d.ts +6 -6
- package/dist/memento/types.d.ts.map +1 -1
- package/dist/memento/types.js +3 -3
- package/dist/memento/worker-agent.d.ts +4 -1
- package/dist/memento/worker-agent.d.ts.map +1 -1
- package/dist/memento/worker-agent.js +38 -54
- package/dist/memento/worker-agent.js.map +1 -1
- package/dist/registry.d.ts +35 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +87 -0
- package/dist/registry.js.map +1 -0
- package/dist/repo-analyzer/index.d.ts +2 -1
- package/dist/repo-analyzer/index.d.ts.map +1 -1
- package/dist/repo-analyzer/index.js +6 -17
- package/dist/repo-analyzer/index.js.map +1 -1
- package/dist/skill-generator/index.d.ts +142 -0
- package/dist/skill-generator/index.d.ts.map +1 -0
- package/dist/skill-generator/index.js +510 -0
- package/dist/skill-generator/index.js.map +1 -0
- package/dist/standup/config.d.ts +19 -0
- package/dist/standup/config.d.ts.map +1 -0
- package/dist/standup/config.js +42 -0
- package/dist/standup/config.js.map +1 -0
- package/dist/standup/index.d.ts +24 -0
- package/dist/standup/index.d.ts.map +1 -0
- package/dist/standup/index.js +29 -0
- package/dist/standup/index.js.map +1 -0
- package/dist/standup/loop.d.ts +36 -0
- package/dist/standup/loop.d.ts.map +1 -0
- package/dist/standup/loop.js +508 -0
- package/dist/standup/loop.js.map +1 -0
- package/dist/standup/prompts.d.ts +62 -0
- package/dist/standup/prompts.d.ts.map +1 -0
- package/dist/standup/prompts.js +211 -0
- package/dist/standup/prompts.js.map +1 -0
- package/dist/standup/standup-protocol.d.ts +33 -0
- package/dist/standup/standup-protocol.d.ts.map +1 -0
- package/dist/standup/standup-protocol.js +189 -0
- package/dist/standup/standup-protocol.js.map +1 -0
- package/dist/standup/types.d.ts +185 -0
- package/dist/standup/types.d.ts.map +1 -0
- package/dist/standup/types.js +67 -0
- package/dist/standup/types.js.map +1 -0
- package/dist/templates/.gitignore.template +26 -0
- package/dist/templates/CLAUDE-pack.md.template +114 -0
- package/dist/templates/CLAUDE.md.template +153 -0
- package/dist/templates/README.md.template +174 -0
- package/dist/templates/config-pack.json.template +16 -0
- package/dist/templates/config.json.template +11 -0
- package/dist/templates/index.d.ts +22 -0
- package/dist/templates/index.d.ts.map +1 -0
- package/dist/templates/index.js +32 -0
- package/dist/templates/index.js.map +1 -0
- package/dist/templates/plugins.json.template +33 -0
- package/dist/templates/system-configuration.md.template +70 -0
- package/dist/tools/cross-nav.d.ts +21 -0
- package/dist/tools/cross-nav.d.ts.map +1 -0
- package/dist/tools/cross-nav.js +93 -0
- package/dist/tools/cross-nav.js.map +1 -0
- package/dist/tools/index.d.ts +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +1 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/related-navs-config.d.ts +15 -0
- package/dist/tools/related-navs-config.d.ts.map +1 -0
- package/dist/tools/related-navs-config.js +132 -0
- package/dist/tools/related-navs-config.js.map +1 -0
- package/dist/tools/related-navs.d.ts +23 -0
- package/dist/tools/related-navs.d.ts.map +1 -0
- package/dist/tools/related-navs.js +107 -0
- package/dist/tools/related-navs.js.map +1 -0
- package/dist/tools/response.d.ts +3 -2
- package/dist/tools/response.d.ts.map +1 -1
- package/dist/tools/response.js +7 -11
- package/dist/tools/response.js.map +1 -1
- package/dist/tools/self-config.d.ts +2 -1
- package/dist/tools/self-config.d.ts.map +1 -1
- package/dist/tools/self-config.js +5 -9
- package/dist/tools/self-config.js.map +1 -1
- package/package.json +4 -1
- package/dist/memento/state.d.ts +0 -56
- package/dist/memento/state.d.ts.map +0 -1
- package/dist/memento/state.js +0 -156
- package/dist/memento/state.js.map +0 -1
- package/dist/migrations/versions/v1.4.0-rfc2119-skills.d.ts +0 -18
- package/dist/migrations/versions/v1.4.0-rfc2119-skills.d.ts.map +0 -1
- package/dist/migrations/versions/v1.4.0-rfc2119-skills.js +0 -207
- 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
|