@autonav/core 1.6.0 → 1.8.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 (247) 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/{claude-adapter.d.ts → navigator-adapter.d.ts} +18 -11
  7. package/dist/adapter/navigator-adapter.d.ts.map +1 -0
  8. package/dist/adapter/{claude-adapter.js → navigator-adapter.js} +165 -127
  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 +35 -4
  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 +11 -2
  55. package/dist/conversation/App.d.ts.map +1 -1
  56. package/dist/conversation/App.js +305 -112
  57. package/dist/conversation/App.js.map +1 -1
  58. package/dist/conversation/index.d.ts +7 -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/conversation/prompts.d.ts +1 -1
  63. package/dist/conversation/prompts.d.ts.map +1 -1
  64. package/dist/conversation/prompts.js +42 -1
  65. package/dist/conversation/prompts.js.map +1 -1
  66. package/dist/harness/chibi-harness.d.ts +36 -0
  67. package/dist/harness/chibi-harness.d.ts.map +1 -0
  68. package/dist/harness/chibi-harness.js +383 -0
  69. package/dist/harness/chibi-harness.js.map +1 -0
  70. package/dist/harness/chibi-plugins/get_plugin_config +64 -0
  71. package/dist/harness/chibi-plugins/query_navigator +114 -0
  72. package/dist/harness/chibi-plugins/submit_answer +38 -0
  73. package/dist/harness/chibi-plugins/update_plugin_config +91 -0
  74. package/dist/harness/claude-code-harness.d.ts +24 -0
  75. package/dist/harness/claude-code-harness.d.ts.map +1 -0
  76. package/dist/harness/claude-code-harness.js +242 -0
  77. package/dist/harness/claude-code-harness.js.map +1 -0
  78. package/dist/harness/ephemeral-home.d.ts +34 -0
  79. package/dist/harness/ephemeral-home.d.ts.map +1 -0
  80. package/dist/harness/ephemeral-home.js +56 -0
  81. package/dist/harness/ephemeral-home.js.map +1 -0
  82. package/dist/harness/factory.d.ts +47 -0
  83. package/dist/harness/factory.d.ts.map +1 -0
  84. package/dist/harness/factory.js +84 -0
  85. package/dist/harness/factory.js.map +1 -0
  86. package/dist/harness/helpers.d.ts +58 -0
  87. package/dist/harness/helpers.d.ts.map +1 -0
  88. package/dist/harness/helpers.js +78 -0
  89. package/dist/harness/helpers.js.map +1 -0
  90. package/dist/harness/index.d.ts +14 -0
  91. package/dist/harness/index.d.ts.map +1 -0
  92. package/dist/harness/index.js +13 -0
  93. package/dist/harness/index.js.map +1 -0
  94. package/dist/harness/opencode-harness.d.ts +79 -0
  95. package/dist/harness/opencode-harness.d.ts.map +1 -0
  96. package/dist/harness/opencode-harness.js +537 -0
  97. package/dist/harness/opencode-harness.js.map +1 -0
  98. package/dist/harness/opencode-tools/get_plugin_config.ts +72 -0
  99. package/dist/harness/opencode-tools/query_navigator.ts +126 -0
  100. package/dist/harness/opencode-tools/submit_answer.ts +40 -0
  101. package/dist/harness/opencode-tools/update_plugin_config.ts +105 -0
  102. package/dist/harness/sandbox.d.ts +59 -0
  103. package/dist/harness/sandbox.d.ts.map +1 -0
  104. package/dist/harness/sandbox.js +152 -0
  105. package/dist/harness/sandbox.js.map +1 -0
  106. package/dist/harness/tool-server.d.ts +50 -0
  107. package/dist/harness/tool-server.d.ts.map +1 -0
  108. package/dist/harness/tool-server.js +27 -0
  109. package/dist/harness/tool-server.js.map +1 -0
  110. package/dist/harness/types.d.ts +168 -0
  111. package/dist/harness/types.d.ts.map +1 -0
  112. package/dist/harness/types.js +12 -0
  113. package/dist/harness/types.js.map +1 -0
  114. package/dist/index.d.ts +3 -2
  115. package/dist/index.d.ts.map +1 -1
  116. package/dist/index.js +4 -2
  117. package/dist/index.js.map +1 -1
  118. package/dist/interview/App.d.ts +4 -2
  119. package/dist/interview/App.d.ts.map +1 -1
  120. package/dist/interview/App.js +36 -56
  121. package/dist/interview/App.js.map +1 -1
  122. package/dist/interview/index.d.ts +3 -0
  123. package/dist/interview/index.d.ts.map +1 -1
  124. package/dist/interview/index.js +1 -0
  125. package/dist/interview/index.js.map +1 -1
  126. package/dist/interview/prompts.d.ts +3 -1
  127. package/dist/interview/prompts.d.ts.map +1 -1
  128. package/dist/interview/prompts.js +14 -1
  129. package/dist/interview/prompts.js.map +1 -1
  130. package/dist/interview/ui/ChatBanner.d.ts +17 -0
  131. package/dist/interview/ui/ChatBanner.d.ts.map +1 -0
  132. package/dist/interview/ui/ChatBanner.js +30 -0
  133. package/dist/interview/ui/ChatBanner.js.map +1 -0
  134. package/dist/interview/ui/ChatInput.d.ts +36 -0
  135. package/dist/interview/ui/ChatInput.d.ts.map +1 -0
  136. package/dist/interview/ui/ChatInput.js +304 -0
  137. package/dist/interview/ui/ChatInput.js.map +1 -0
  138. package/dist/interview/ui/MarkdownText.d.ts +13 -0
  139. package/dist/interview/ui/MarkdownText.d.ts.map +1 -0
  140. package/dist/interview/ui/MarkdownText.js +107 -0
  141. package/dist/interview/ui/MarkdownText.js.map +1 -0
  142. package/dist/interview/ui/index.d.ts +3 -0
  143. package/dist/interview/ui/index.d.ts.map +1 -1
  144. package/dist/interview/ui/index.js +3 -0
  145. package/dist/interview/ui/index.js.map +1 -1
  146. package/dist/memento/implementer-agent.d.ts +31 -0
  147. package/dist/memento/implementer-agent.d.ts.map +1 -0
  148. package/dist/memento/implementer-agent.js +95 -0
  149. package/dist/memento/implementer-agent.js.map +1 -0
  150. package/dist/memento/index.d.ts +6 -5
  151. package/dist/memento/index.d.ts.map +1 -1
  152. package/dist/memento/index.js +7 -5
  153. package/dist/memento/index.js.map +1 -1
  154. package/dist/memento/loop.d.ts +6 -5
  155. package/dist/memento/loop.d.ts.map +1 -1
  156. package/dist/memento/loop.js +872 -180
  157. package/dist/memento/loop.js.map +1 -1
  158. package/dist/memento/matrix-animation.d.ts +26 -0
  159. package/dist/memento/matrix-animation.d.ts.map +1 -1
  160. package/dist/memento/matrix-animation.js +93 -18
  161. package/dist/memento/matrix-animation.js.map +1 -1
  162. package/dist/memento/nav-protocol.d.ts +2 -2
  163. package/dist/memento/nav-protocol.d.ts.map +1 -1
  164. package/dist/memento/nav-protocol.js +39 -43
  165. package/dist/memento/nav-protocol.js.map +1 -1
  166. package/dist/memento/prompts.d.ts +21 -8
  167. package/dist/memento/prompts.d.ts.map +1 -1
  168. package/dist/memento/prompts.js +79 -39
  169. package/dist/memento/prompts.js.map +1 -1
  170. package/dist/memento/rate-limit.d.ts +85 -0
  171. package/dist/memento/rate-limit.d.ts.map +1 -0
  172. package/dist/memento/rate-limit.js +221 -0
  173. package/dist/memento/rate-limit.js.map +1 -0
  174. package/dist/memento/types.d.ts +6 -6
  175. package/dist/memento/types.d.ts.map +1 -1
  176. package/dist/memento/types.js +3 -3
  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/standup/config.d.ts +19 -0
  186. package/dist/standup/config.d.ts.map +1 -0
  187. package/dist/standup/config.js +42 -0
  188. package/dist/standup/config.js.map +1 -0
  189. package/dist/standup/index.d.ts +24 -0
  190. package/dist/standup/index.d.ts.map +1 -0
  191. package/dist/standup/index.js +29 -0
  192. package/dist/standup/index.js.map +1 -0
  193. package/dist/standup/loop.d.ts +36 -0
  194. package/dist/standup/loop.d.ts.map +1 -0
  195. package/dist/standup/loop.js +508 -0
  196. package/dist/standup/loop.js.map +1 -0
  197. package/dist/standup/prompts.d.ts +62 -0
  198. package/dist/standup/prompts.d.ts.map +1 -0
  199. package/dist/standup/prompts.js +211 -0
  200. package/dist/standup/prompts.js.map +1 -0
  201. package/dist/standup/standup-protocol.d.ts +33 -0
  202. package/dist/standup/standup-protocol.d.ts.map +1 -0
  203. package/dist/standup/standup-protocol.js +189 -0
  204. package/dist/standup/standup-protocol.js.map +1 -0
  205. package/dist/standup/types.d.ts +185 -0
  206. package/dist/standup/types.d.ts.map +1 -0
  207. package/dist/standup/types.js +67 -0
  208. package/dist/standup/types.js.map +1 -0
  209. package/dist/tools/cross-nav.d.ts +21 -0
  210. package/dist/tools/cross-nav.d.ts.map +1 -0
  211. package/dist/tools/cross-nav.js +93 -0
  212. package/dist/tools/cross-nav.js.map +1 -0
  213. package/dist/tools/index.d.ts +1 -0
  214. package/dist/tools/index.d.ts.map +1 -1
  215. package/dist/tools/index.js +1 -0
  216. package/dist/tools/index.js.map +1 -1
  217. package/dist/tools/related-navs-config.d.ts +15 -0
  218. package/dist/tools/related-navs-config.d.ts.map +1 -0
  219. package/dist/tools/related-navs-config.js +132 -0
  220. package/dist/tools/related-navs-config.js.map +1 -0
  221. package/dist/tools/related-navs.d.ts +23 -0
  222. package/dist/tools/related-navs.d.ts.map +1 -0
  223. package/dist/tools/related-navs.js +107 -0
  224. package/dist/tools/related-navs.js.map +1 -0
  225. package/dist/tools/response.d.ts +3 -2
  226. package/dist/tools/response.d.ts.map +1 -1
  227. package/dist/tools/response.js +7 -11
  228. package/dist/tools/response.js.map +1 -1
  229. package/dist/tools/self-config.d.ts +2 -1
  230. package/dist/tools/self-config.d.ts.map +1 -1
  231. package/dist/tools/self-config.js +5 -9
  232. package/dist/tools/self-config.js.map +1 -1
  233. package/package.json +7 -4
  234. package/dist/adapter/claude-adapter.d.ts.map +0 -1
  235. package/dist/adapter/claude-adapter.js.map +0 -1
  236. package/dist/memento/state.d.ts +0 -56
  237. package/dist/memento/state.d.ts.map +0 -1
  238. package/dist/memento/state.js +0 -156
  239. package/dist/memento/state.js.map +0 -1
  240. package/dist/memento/worker-agent.d.ts +0 -30
  241. package/dist/memento/worker-agent.d.ts.map +0 -1
  242. package/dist/memento/worker-agent.js +0 -109
  243. package/dist/memento/worker-agent.js.map +0 -1
  244. package/dist/migrations/versions/v1.4.0-rfc2119-skills.d.ts +0 -18
  245. package/dist/migrations/versions/v1.4.0-rfc2119-skills.d.ts.map +0 -1
  246. package/dist/migrations/versions/v1.4.0-rfc2119-skills.js +0 -207
  247. package/dist/migrations/versions/v1.4.0-rfc2119-skills.js.map +0 -1
@@ -0,0 +1,114 @@
1
+ #!/bin/bash
2
+ # query_navigator chibi plugin
3
+ #
4
+ # Queries another navigator by running chibi-json directly with the
5
+ # target's system prompt in a separate context. Chibi is naturally
6
+ # plural — one instance can be many navigators at once, each in its
7
+ # own context with no knowledge of the others.
8
+ #
9
+ # Flow: set_system_prompt → send_prompt → extract last assistant message → destroy_context
10
+ # Cycle detection via AUTONAV_QUERY_DEPTH env var (max 3).
11
+
12
+ set -euo pipefail
13
+
14
+ if [[ "${1:-}" == "--schema" ]]; then
15
+ printf '%s\n' '{' \
16
+ ' "name": "query_navigator",' \
17
+ ' "description": "Ask another navigator a question. Use this when you need information from a different navigator'\''s knowledge base. The target navigator will search its own knowledge and return an answer.",' \
18
+ ' "parameters": {' \
19
+ ' "type": "object",' \
20
+ ' "properties": {' \
21
+ ' "navigator": { "type": "string", "description": "Path to the target navigator directory (relative to cwd or absolute)" },' \
22
+ ' "question": { "type": "string", "description": "The question to ask the target navigator" }' \
23
+ ' },' \
24
+ ' "required": ["navigator", "question"]' \
25
+ ' }' \
26
+ '}'
27
+ exit 0
28
+ fi
29
+
30
+ # Read JSON args from stdin
31
+ input=$(cat)
32
+ navigator=$(echo "$input" | jq -r '.navigator // empty')
33
+ question=$(echo "$input" | jq -r '.question // empty')
34
+
35
+ if [[ -z "$navigator" || -z "$question" ]]; then
36
+ echo '{"success": false, "error": "Missing required fields: navigator and question"}'
37
+ exit 0
38
+ fi
39
+
40
+ # Cycle detection
41
+ depth="${AUTONAV_QUERY_DEPTH:-0}"
42
+ if [[ "$depth" -ge 3 ]]; then
43
+ echo '{"success": false, "error": "Query depth limit reached (max 3). Cannot query another navigator from this depth."}'
44
+ exit 0
45
+ fi
46
+ export AUTONAV_QUERY_DEPTH=$(( depth + 1 ))
47
+
48
+ # Validate navigator directory
49
+ if [[ ! -d "$navigator" ]]; then
50
+ jq -n --arg p "$navigator" '{"success": false, "error": ("Navigator directory not found: " + $p)}'
51
+ exit 0
52
+ fi
53
+
54
+ config_file="$navigator/config.json"
55
+ if [[ ! -f "$config_file" ]]; then
56
+ echo '{"success": false, "error": "Navigator config.json not found."}'
57
+ exit 0
58
+ fi
59
+
60
+ nav_name=$(jq -r '.name // "unknown"' "$config_file")
61
+ instructions_path=$(jq -r '.instructionsPath // "CLAUDE.md"' "$config_file")
62
+
63
+ prompt_file="$navigator/$instructions_path"
64
+ if [[ ! -f "$prompt_file" ]]; then
65
+ jq -n --arg f "$instructions_path" '{"success": false, "error": ("Navigator instructions file not found: " + $f)}'
66
+ exit 0
67
+ fi
68
+
69
+ system_prompt=$(cat "$prompt_file")
70
+
71
+ # Unique context for this sub-query (PID + random for collision avoidance)
72
+ ctx="autonav-xnav-$$-$(head -c 4 /dev/urandom | xxd -p)"
73
+
74
+ cleanup() {
75
+ # Destroy sub-query context (best-effort)
76
+ jq -n --arg ctx "$ctx" \
77
+ '{command: {destroy_context: {name: $ctx}}, context: $ctx}' \
78
+ | chibi-json 2>/dev/null || true
79
+ }
80
+ trap cleanup EXIT
81
+
82
+ # 1. Set system prompt on the sub-query context
83
+ jq -n \
84
+ --arg prompt "$system_prompt" \
85
+ --arg ctx "$ctx" \
86
+ --arg root "$navigator" \
87
+ '{command: {set_system_prompt: {prompt: $prompt}}, context: $ctx, project_root: $root}' \
88
+ | chibi-json 2>/dev/null || true
89
+
90
+ # 2. Send the question, capture JSONL output
91
+ response_jsonl=$(
92
+ jq -n \
93
+ --arg prompt "$question" \
94
+ --arg ctx "$ctx" \
95
+ --arg root "$navigator" \
96
+ '{command: {send_prompt: {prompt: $prompt}}, context: $ctx, project_root: $root}' \
97
+ | chibi-json 2>/dev/null
98
+ ) || true
99
+
100
+ # 3. Extract the last assistant message from JSONL
101
+ response=""
102
+ if [[ -n "$response_jsonl" ]]; then
103
+ response=$(echo "$response_jsonl" \
104
+ | jq -rs '[.[] | select(.entry_type == "message" and .from != "user") | .content] | last // ""')
105
+ fi
106
+
107
+ # 4. Return structured result (cleanup runs via trap)
108
+ if [[ -n "$response" && "$response" != "null" && "$response" != '""' ]]; then
109
+ jq -n --arg nav "$nav_name" --arg resp "$response" \
110
+ '{"success": true, "navigator": $nav, "response": $resp}'
111
+ else
112
+ jq -n --arg nav "$nav_name" \
113
+ '{"success": false, "navigator": $nav, "error": "Navigator returned empty response."}'
114
+ fi
@@ -0,0 +1,38 @@
1
+ #!/bin/bash
2
+ # submit_answer chibi plugin
3
+ #
4
+ # Provides the submit_answer tool to chibi so the LLM can call it with
5
+ # structured args. The adapter captures the tool_call event from JSONL
6
+ # output — this script just needs to exist and declare the schema.
7
+
8
+ if [[ "$1" == "--schema" ]]; then
9
+ printf '%s\n' '{' \
10
+ ' "name": "submit_answer",' \
11
+ ' "description": "Submit your final answer. You MUST use this tool to provide your response with proper source citations.",' \
12
+ ' "parameters": {' \
13
+ ' "type": "object",' \
14
+ ' "properties": {' \
15
+ ' "answer": { "type": "string", "description": "Your complete answer grounded in the knowledge base." },' \
16
+ ' "sources": {' \
17
+ ' "type": "array",' \
18
+ ' "items": {' \
19
+ ' "type": "object",' \
20
+ ' "properties": {' \
21
+ ' "file": { "type": "string" },' \
22
+ ' "section": { "type": "string" },' \
23
+ ' "relevance": { "type": "string" }' \
24
+ ' },' \
25
+ ' "required": ["file", "section", "relevance"]' \
26
+ ' }' \
27
+ ' },' \
28
+ ' "confidence": { "type": "number", "minimum": 0, "maximum": 1, "description": "Confidence score from 0.0 (no confidence) to 1.0 (fully confident). 0.9+ = high, 0.45-0.89 = medium, below 0.45 = low." },' \
29
+ ' "confidenceReason": { "type": "string" },' \
30
+ ' "outOfDomain": { "type": "boolean" }' \
31
+ ' },' \
32
+ ' "required": ["answer", "sources", "confidence", "confidenceReason", "outOfDomain"]' \
33
+ ' }' \
34
+ '}'
35
+ exit 0
36
+ fi
37
+
38
+ echo "Answer submitted successfully."
@@ -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