mixdog 0.9.2 → 0.9.4

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 (417) hide show
  1. package/package.json +8 -3
  2. package/scripts/anthropic-maxtokens-test.mjs +119 -0
  3. package/scripts/bench/lead-review-tasks-r3.json +20 -0
  4. package/scripts/bench/lead-review-tasks.json +20 -0
  5. package/scripts/bench/r4-mixed-tasks.json +20 -0
  6. package/scripts/bench/review-tasks.json +20 -0
  7. package/scripts/bench/round-codex.json +114 -0
  8. package/scripts/bench/round-mixdog-lead-r3.json +269 -0
  9. package/scripts/bench/round-mixdog-lead.json +269 -0
  10. package/scripts/bench/round-mixdog.json +126 -0
  11. package/scripts/bench/round-r10-bigsample.json +679 -0
  12. package/scripts/bench/round-r11-codexalign.json +257 -0
  13. package/scripts/bench/round-r4-codex.json +114 -0
  14. package/scripts/bench/round-r4-mixed.json +225 -0
  15. package/scripts/bench/round-r5-gpt-lead.json +259 -0
  16. package/scripts/bench/round-r6-codex.json +114 -0
  17. package/scripts/bench/round-r6-solo.json +257 -0
  18. package/scripts/bench/round-r7-full.json +254 -0
  19. package/scripts/bench/round-r8-fulldefault.json +255 -0
  20. package/scripts/bench-run.mjs +215 -29
  21. package/scripts/build-tui.mjs +13 -1
  22. package/scripts/explore-bench.mjs +124 -0
  23. package/scripts/freevar-smoke.mjs +95 -0
  24. package/scripts/hook-bus-test.mjs +191 -0
  25. package/scripts/internal-comms-bench.mjs +1 -0
  26. package/scripts/internal-comms-smoke.mjs +10 -9
  27. package/scripts/mouse-probe.mjs +45 -0
  28. package/scripts/output-style-bench.mjs +13 -6
  29. package/scripts/output-style-smoke.mjs +4 -4
  30. package/scripts/path-suffix-test.mjs +57 -0
  31. package/scripts/provider-toolcall-test.mjs +7 -3
  32. package/scripts/recall-bench.mjs +207 -0
  33. package/scripts/recall-usecase-cases.json +18 -0
  34. package/scripts/recall-usecase-probe.json +6 -0
  35. package/scripts/session-bench.mjs +152 -6
  36. package/scripts/tool-smoke.mjs +30 -67
  37. package/scripts/tui-render-smoke.mjs +90 -0
  38. package/scripts/webhook-smoke.mjs +208 -0
  39. package/src/agents/debugger/AGENT.md +5 -2
  40. package/src/agents/heavy-worker/AGENT.md +21 -11
  41. package/src/agents/maintainer/AGENT.md +4 -0
  42. package/src/agents/reviewer/AGENT.md +3 -2
  43. package/src/agents/worker/AGENT.md +21 -11
  44. package/src/lib/rules-builder.cjs +4 -0
  45. package/src/mixdog-session-runtime.mjs +933 -3731
  46. package/src/output-styles/default.md +34 -9
  47. package/src/output-styles/{oneline.md → extreme-minimal.md} +5 -4
  48. package/src/output-styles/minimal.md +4 -1
  49. package/src/output-styles/simple.md +22 -7
  50. package/src/repl.mjs +5 -5
  51. package/src/rules/agent/00-common.md +2 -0
  52. package/src/rules/agent/30-explorer.md +8 -11
  53. package/src/rules/lead/lead-brief.md +12 -0
  54. package/src/rules/lead/lead-tool.md +2 -9
  55. package/src/rules/shared/01-tool.md +11 -5
  56. package/src/runtime/agent/orchestrator/agent-runtime/agent-loop-policy.mjs +25 -0
  57. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +100 -23
  58. package/src/runtime/agent/orchestrator/agent-runtime/session-builder.mjs +6 -15
  59. package/src/runtime/agent/orchestrator/agent-trace-format.mjs +362 -0
  60. package/src/runtime/agent/orchestrator/agent-trace-io.mjs +410 -0
  61. package/src/runtime/agent/orchestrator/agent-trace.mjs +16 -735
  62. package/src/runtime/agent/orchestrator/config.mjs +69 -2
  63. package/src/runtime/agent/orchestrator/context/collect.mjs +51 -0
  64. package/src/runtime/agent/orchestrator/mcp/client.mjs +6 -2
  65. package/src/runtime/agent/orchestrator/providers/anthropic-effort.mjs +63 -21
  66. package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens.mjs +93 -0
  67. package/src/runtime/agent/orchestrator/providers/anthropic-model-resolve.mjs +209 -0
  68. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +489 -0
  69. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +97 -1343
  70. package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +607 -0
  71. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +78 -10
  72. package/src/runtime/agent/orchestrator/providers/api-usage.mjs +1 -13
  73. package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +81 -0
  74. package/src/runtime/agent/orchestrator/providers/gemini-cache.mjs +248 -0
  75. package/src/runtime/agent/orchestrator/providers/gemini-schema.mjs +303 -0
  76. package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +505 -0
  77. package/src/runtime/agent/orchestrator/providers/gemini.mjs +44 -1014
  78. package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +18 -4
  79. package/src/runtime/agent/orchestrator/providers/lib/usage-primitives.mjs +32 -0
  80. package/src/runtime/agent/orchestrator/providers/model-catalog.mjs +86 -11
  81. package/src/runtime/agent/orchestrator/providers/model-list-sanitize.mjs +348 -0
  82. package/src/runtime/agent/orchestrator/providers/oauth-usage.mjs +54 -20
  83. package/src/runtime/agent/orchestrator/providers/openai-codex-model.mjs +108 -0
  84. package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +19 -12
  85. package/src/runtime/agent/orchestrator/providers/openai-compat-trace.mjs +58 -0
  86. package/src/runtime/agent/orchestrator/providers/openai-compat-wire.mjs +368 -0
  87. package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +760 -0
  88. package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +41 -1142
  89. package/src/runtime/agent/orchestrator/providers/openai-oauth-http-sse.mjs +732 -0
  90. package/src/runtime/agent/orchestrator/providers/openai-oauth-login.mjs +193 -0
  91. package/src/runtime/agent/orchestrator/providers/openai-oauth-ws.mjs +303 -2119
  92. package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +140 -995
  93. package/src/runtime/agent/orchestrator/providers/openai-ws-delta.mjs +227 -0
  94. package/src/runtime/agent/orchestrator/providers/openai-ws-events.mjs +67 -0
  95. package/src/runtime/agent/orchestrator/providers/openai-ws-pool.mjs +436 -0
  96. package/src/runtime/agent/orchestrator/providers/openai-ws-stream.mjs +1105 -0
  97. package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +2 -1
  98. package/src/runtime/agent/orchestrator/providers/opencode-go-usage.mjs +38 -12
  99. package/src/runtime/agent/orchestrator/providers/retry-classifier.mjs +7 -8
  100. package/src/runtime/agent/orchestrator/session/compact/budget.mjs +288 -0
  101. package/src/runtime/agent/orchestrator/session/compact/constants.mjs +85 -0
  102. package/src/runtime/agent/orchestrator/session/compact/engine.mjs +749 -0
  103. package/src/runtime/agent/orchestrator/session/compact/messages.mjs +82 -0
  104. package/src/runtime/agent/orchestrator/session/compact/summary-schema.mjs +315 -0
  105. package/src/runtime/agent/orchestrator/session/compact/summary.mjs +643 -0
  106. package/src/runtime/agent/orchestrator/session/compact/text-utils.mjs +326 -0
  107. package/src/runtime/agent/orchestrator/session/compact.mjs +40 -2282
  108. package/src/runtime/agent/orchestrator/session/loop/compact-debug.mjs +28 -0
  109. package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +274 -0
  110. package/src/runtime/agent/orchestrator/session/loop/completion-guards.mjs +61 -0
  111. package/src/runtime/agent/orchestrator/session/loop/context-overflow.mjs +38 -0
  112. package/src/runtime/agent/orchestrator/session/loop/env.mjs +14 -0
  113. package/src/runtime/agent/orchestrator/session/loop/hidden-agents.mjs +21 -0
  114. package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +47 -0
  115. package/src/runtime/agent/orchestrator/session/loop/recall-fasttrack.mjs +182 -0
  116. package/src/runtime/agent/orchestrator/session/loop/steering-ladder.mjs +173 -0
  117. package/src/runtime/agent/orchestrator/session/loop/steering.mjs +63 -0
  118. package/src/runtime/agent/orchestrator/session/loop/stored-tool-args.mjs +100 -0
  119. package/src/runtime/agent/orchestrator/session/loop/termination.mjs +58 -0
  120. package/src/runtime/agent/orchestrator/session/loop/tool-classify.mjs +52 -0
  121. package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +239 -0
  122. package/src/runtime/agent/orchestrator/session/loop/tool-helpers.mjs +218 -0
  123. package/src/runtime/agent/orchestrator/session/loop/transcript-repair.mjs +101 -0
  124. package/src/runtime/agent/orchestrator/session/loop/usage.mjs +35 -0
  125. package/src/runtime/agent/orchestrator/session/loop.mjs +409 -1304
  126. package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +471 -0
  127. package/src/runtime/agent/orchestrator/session/manager/context-meta.mjs +230 -0
  128. package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +235 -0
  129. package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +149 -0
  130. package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +155 -0
  131. package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +406 -0
  132. package/src/runtime/agent/orchestrator/session/manager/status-telemetry.mjs +80 -0
  133. package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +303 -0
  134. package/src/runtime/agent/orchestrator/session/manager/usage-metrics.mjs +210 -0
  135. package/src/runtime/agent/orchestrator/session/manager.mjs +226 -2114
  136. package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +189 -0
  137. package/src/runtime/agent/orchestrator/session/store.mjs +74 -179
  138. package/src/runtime/agent/orchestrator/stall-policy.mjs +3 -3
  139. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +70 -20
  140. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +22 -2
  141. package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +33 -42
  142. package/src/runtime/agent/orchestrator/tools/builtin/external-tool-adapters.mjs +241 -0
  143. package/src/runtime/agent/orchestrator/tools/builtin/fuzzy-match.mjs +1 -1
  144. package/src/runtime/agent/orchestrator/tools/builtin/list-tool.mjs +40 -0
  145. package/src/runtime/agent/orchestrator/tools/builtin/path-diagnostics.mjs +42 -2
  146. package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +1 -1
  147. package/src/runtime/agent/orchestrator/tools/builtin/read-single-tool.mjs +11 -4
  148. package/src/runtime/agent/orchestrator/tools/builtin/rg-runner.mjs +29 -0
  149. package/src/runtime/agent/orchestrator/tools/builtin/search-builders.mjs +8 -0
  150. package/src/runtime/agent/orchestrator/tools/builtin/search-path-diagnostics.mjs +126 -0
  151. package/src/runtime/agent/orchestrator/tools/builtin/search-tool.mjs +81 -87
  152. package/src/runtime/agent/orchestrator/tools/builtin/shell-job-paths.mjs +161 -0
  153. package/src/runtime/agent/orchestrator/tools/builtin/shell-job-process.mjs +108 -0
  154. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +78 -304
  155. package/src/runtime/agent/orchestrator/tools/builtin.mjs +11 -6
  156. package/src/runtime/agent/orchestrator/tools/code-graph/build.mjs +303 -0
  157. package/src/runtime/agent/orchestrator/tools/code-graph/constants.mjs +43 -0
  158. package/src/runtime/agent/orchestrator/tools/code-graph/disk-cache.mjs +382 -0
  159. package/src/runtime/agent/orchestrator/tools/code-graph/dispatch.mjs +551 -0
  160. package/src/runtime/agent/orchestrator/tools/code-graph/graph-binary.mjs +295 -0
  161. package/src/runtime/agent/orchestrator/tools/code-graph/graph-model.mjs +158 -0
  162. package/src/runtime/agent/orchestrator/tools/code-graph/keyword-match.mjs +82 -0
  163. package/src/runtime/agent/orchestrator/tools/code-graph/lang-predicates.mjs +128 -0
  164. package/src/runtime/agent/orchestrator/tools/code-graph/memory-cache.mjs +66 -0
  165. package/src/runtime/agent/orchestrator/tools/code-graph/project-root.mjs +44 -0
  166. package/src/runtime/agent/orchestrator/tools/code-graph/search.mjs +1080 -0
  167. package/src/runtime/agent/orchestrator/tools/code-graph/source-access.mjs +81 -0
  168. package/src/runtime/agent/orchestrator/tools/code-graph/span.mjs +19 -0
  169. package/src/runtime/agent/orchestrator/tools/code-graph/symbol-index.mjs +280 -0
  170. package/src/runtime/agent/orchestrator/tools/code-graph/text-columns.mjs +45 -0
  171. package/src/runtime/agent/orchestrator/tools/code-graph/text-mask.mjs +347 -0
  172. package/src/runtime/agent/orchestrator/tools/code-graph-tool-defs.mjs +6 -6
  173. package/src/runtime/agent/orchestrator/tools/code-graph.mjs +36 -4277
  174. package/src/runtime/agent/orchestrator/tools/graph-binary-fetcher.mjs +6 -3
  175. package/src/runtime/agent/orchestrator/tools/patch/constants.mjs +9 -0
  176. package/src/runtime/agent/orchestrator/tools/patch/dispatch.mjs +171 -0
  177. package/src/runtime/agent/orchestrator/tools/patch/matcher.mjs +471 -0
  178. package/src/runtime/agent/orchestrator/tools/patch/native-server.mjs +436 -0
  179. package/src/runtime/agent/orchestrator/tools/patch/orchestrator.mjs +342 -0
  180. package/src/runtime/agent/orchestrator/tools/patch/parsing.mjs +359 -0
  181. package/src/runtime/agent/orchestrator/tools/patch/paths.mjs +340 -0
  182. package/src/runtime/agent/orchestrator/tools/patch/v4a-convert.mjs +643 -0
  183. package/src/runtime/agent/orchestrator/tools/patch.mjs +36 -2959
  184. package/src/runtime/agent/orchestrator/tools/progress-message.mjs +1 -23
  185. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +10 -74
  186. package/src/runtime/agent/orchestrator/tools/shell-powershell.mjs +77 -0
  187. package/src/runtime/agent/orchestrator/tools/shell-snapshot.mjs +2 -4
  188. package/src/runtime/agent/orchestrator/tools/shell-state.mjs +154 -0
  189. package/src/runtime/channels/backends/discord-access.mjs +32 -0
  190. package/src/runtime/channels/backends/discord-attachments.mjs +65 -0
  191. package/src/runtime/channels/backends/discord-gateway.mjs +233 -0
  192. package/src/runtime/channels/backends/discord.mjs +12 -292
  193. package/src/runtime/channels/index.mjs +241 -894
  194. package/src/runtime/channels/lib/backend-dispatch.mjs +44 -0
  195. package/src/runtime/channels/lib/boot-profile.mjs +23 -0
  196. package/src/runtime/channels/lib/crash-log.mjs +106 -0
  197. package/src/runtime/channels/lib/event-pipeline.mjs +18 -1
  198. package/src/runtime/channels/lib/event-queue.mjs +63 -4
  199. package/src/runtime/channels/lib/inbound-routing.mjs +111 -0
  200. package/src/runtime/channels/lib/index-drop-trace.mjs +72 -0
  201. package/src/runtime/channels/lib/output-forwarder.mjs +9 -1
  202. package/src/runtime/channels/lib/owner-heartbeat.mjs +75 -0
  203. package/src/runtime/channels/lib/parent-bridge.mjs +88 -0
  204. package/src/runtime/channels/lib/runtime-paths.mjs +14 -4
  205. package/src/runtime/channels/lib/session-discovery.mjs +56 -4
  206. package/src/runtime/channels/lib/telegram-format.mjs +19 -22
  207. package/src/runtime/channels/lib/tool-dispatch.mjs +158 -0
  208. package/src/runtime/channels/lib/tool-format.mjs +1 -1
  209. package/src/runtime/channels/lib/transcript-discovery.mjs +4 -4
  210. package/src/runtime/channels/lib/voice-runtime-fetcher.mjs +6 -3
  211. package/src/runtime/channels/lib/voice-transcription.mjs +179 -0
  212. package/src/runtime/channels/lib/webhook/deliveries.mjs +312 -0
  213. package/src/runtime/channels/lib/webhook/log.mjs +42 -0
  214. package/src/runtime/channels/lib/webhook/ngrok.mjs +181 -0
  215. package/src/runtime/channels/lib/webhook/signature.mjs +60 -0
  216. package/src/runtime/channels/lib/webhook.mjs +36 -570
  217. package/src/runtime/channels/lib/whisper-language.mjs +42 -0
  218. package/src/runtime/channels/tool-defs.mjs +11 -130
  219. package/src/runtime/memory/index.mjs +258 -2050
  220. package/src/runtime/memory/lib/core-memory-store.mjs +351 -1
  221. package/src/runtime/memory/lib/cycle-llm-adapters.mjs +58 -0
  222. package/src/runtime/memory/lib/cycle-scheduler.mjs +497 -0
  223. package/src/runtime/memory/lib/cycle-signatures.mjs +34 -0
  224. package/src/runtime/memory/lib/embedding-warmup.mjs +58 -0
  225. package/src/runtime/memory/lib/http-wire.mjs +57 -0
  226. package/src/runtime/memory/lib/memory-config-flags.mjs +91 -0
  227. package/src/runtime/memory/lib/memory-cycle.mjs +1 -1
  228. package/src/runtime/memory/lib/memory-cycle2-gate.mjs +515 -0
  229. package/src/runtime/memory/lib/memory-cycle2-mutations.mjs +324 -0
  230. package/src/runtime/memory/lib/memory-cycle2-shared.mjs +18 -0
  231. package/src/runtime/memory/lib/memory-cycle2.mjs +72 -837
  232. package/src/runtime/memory/lib/memory-embed.mjs +149 -0
  233. package/src/runtime/memory/lib/memory-process-lock.mjs +162 -0
  234. package/src/runtime/memory/lib/memory-recall-scope-filter.mjs +24 -0
  235. package/src/runtime/memory/lib/memory-recall-store.mjs +22 -2
  236. package/src/runtime/memory/lib/memory-retrievers.mjs +8 -0
  237. package/src/runtime/memory/lib/memory.mjs +20 -0
  238. package/src/runtime/memory/lib/pg/supervisor.mjs +1 -1
  239. package/src/runtime/memory/lib/promotion-fingerprint.mjs +50 -0
  240. package/src/runtime/memory/lib/query-handlers.mjs +780 -0
  241. package/src/runtime/memory/lib/recall-format.mjs +238 -0
  242. package/src/runtime/memory/lib/runtime-fetcher.mjs +8 -3
  243. package/src/runtime/memory/lib/transcript-ingest.mjs +425 -0
  244. package/src/runtime/memory/tool-defs.mjs +6 -14
  245. package/src/runtime/search/lib/http-fetch.mjs +274 -0
  246. package/src/runtime/search/lib/ssrf-guard.mjs +333 -0
  247. package/src/runtime/search/lib/web-tools.mjs +24 -602
  248. package/src/runtime/shared/abort-controller.mjs +1 -1
  249. package/src/runtime/shared/atomic-file.mjs +26 -1
  250. package/src/runtime/shared/background-tasks.mjs +2 -3
  251. package/src/runtime/shared/buffered-appender.mjs +149 -0
  252. package/src/runtime/shared/launcher-control.mjs +2 -2
  253. package/src/runtime/shared/task-notification-envelope.mjs +98 -0
  254. package/src/runtime/shared/tool-execution-contract.mjs +2 -2
  255. package/src/runtime/shared/tool-primitives.mjs +308 -0
  256. package/src/runtime/shared/tool-result-summary.mjs +515 -0
  257. package/src/runtime/shared/tool-surface.mjs +80 -898
  258. package/src/runtime/shared/transcript-writer.mjs +52 -2
  259. package/src/runtime/shared/update-checker.mjs +7 -4
  260. package/src/session-runtime/config-helpers.mjs +291 -0
  261. package/src/session-runtime/config-lifecycle.mjs +232 -0
  262. package/src/session-runtime/cwd-plugins.mjs +226 -0
  263. package/src/session-runtime/effort.mjs +128 -0
  264. package/src/session-runtime/fs-utils.mjs +10 -0
  265. package/src/session-runtime/mcp-glue.mjs +177 -0
  266. package/src/session-runtime/model-capabilities.mjs +130 -0
  267. package/src/session-runtime/model-recency.mjs +111 -0
  268. package/src/session-runtime/native-search.mjs +247 -0
  269. package/src/session-runtime/output-styles.mjs +126 -0
  270. package/src/session-runtime/plugin-mcp.mjs +114 -0
  271. package/src/session-runtime/prewarm.mjs +142 -0
  272. package/src/session-runtime/provider-models.mjs +278 -0
  273. package/src/session-runtime/provider-usage.mjs +120 -0
  274. package/src/session-runtime/quick-model-rows.mjs +170 -0
  275. package/src/session-runtime/quick-search-models.mjs +46 -0
  276. package/src/session-runtime/session-hooks.mjs +93 -0
  277. package/src/session-runtime/session-text.mjs +100 -0
  278. package/src/session-runtime/settings-api.mjs +319 -0
  279. package/src/session-runtime/statusline-route.mjs +35 -0
  280. package/src/session-runtime/tool-catalog.mjs +720 -0
  281. package/src/session-runtime/tool-defs.mjs +84 -0
  282. package/src/session-runtime/warmup-schedulers.mjs +201 -0
  283. package/src/session-runtime/workflow.mjs +358 -0
  284. package/src/standalone/agent-tool/helpers.mjs +237 -0
  285. package/src/standalone/agent-tool/notify.mjs +107 -0
  286. package/src/standalone/agent-tool/provider-init.mjs +143 -0
  287. package/src/standalone/agent-tool/render.mjs +152 -0
  288. package/src/standalone/agent-tool/tool-def.mjs +55 -0
  289. package/src/standalone/agent-tool.mjs +155 -677
  290. package/src/standalone/channel-worker.mjs +7 -9
  291. package/src/standalone/explore-tool.mjs +40 -12
  292. package/src/standalone/hook-bus/config.mjs +207 -0
  293. package/src/standalone/hook-bus/constants.mjs +90 -0
  294. package/src/standalone/hook-bus/handlers.mjs +481 -0
  295. package/src/standalone/hook-bus/payload.mjs +31 -0
  296. package/src/standalone/hook-bus/rules.mjs +77 -0
  297. package/src/standalone/hook-bus.mjs +110 -746
  298. package/src/standalone/memory-runtime-proxy.mjs +7 -0
  299. package/src/standalone/opencode-go-login.mjs +125 -0
  300. package/src/standalone/provider-admin.mjs +15 -19
  301. package/src/standalone/usage-dashboard.mjs +3 -1
  302. package/src/tui/App.jsx +1163 -7571
  303. package/src/tui/app/app-format.mjs +206 -0
  304. package/src/tui/app/channel-pickers.mjs +510 -0
  305. package/src/tui/app/clipboard.mjs +67 -0
  306. package/src/tui/app/core-memory-picker.mjs +210 -0
  307. package/src/tui/app/extension-pickers.mjs +506 -0
  308. package/src/tui/app/input-parsers.mjs +193 -0
  309. package/src/tui/app/maintenance-pickers.mjs +324 -0
  310. package/src/tui/app/model-options.mjs +330 -0
  311. package/src/tui/app/model-picker.mjs +365 -0
  312. package/src/tui/app/onboarding-steps.mjs +400 -0
  313. package/src/tui/app/project-picker.mjs +247 -0
  314. package/src/tui/app/provider-setup-picker.mjs +580 -0
  315. package/src/tui/app/resume-picker.mjs +55 -0
  316. package/src/tui/app/route-pickers.mjs +419 -0
  317. package/src/tui/app/settings-picker.mjs +490 -0
  318. package/src/tui/app/slash-commands.mjs +101 -0
  319. package/src/tui/app/slash-dispatch.mjs +427 -0
  320. package/src/tui/app/text-layout.mjs +46 -0
  321. package/src/tui/app/theme-effort-pickers.mjs +154 -0
  322. package/src/tui/app/transcript-window.mjs +671 -0
  323. package/src/tui/app/use-mouse-input.mjs +460 -0
  324. package/src/tui/app/use-prompt-handlers.mjs +310 -0
  325. package/src/tui/app/use-transcript-scroll.mjs +510 -0
  326. package/src/tui/app/use-transcript-window.mjs +589 -0
  327. package/src/tui/components/ConfirmBar.jsx +1 -1
  328. package/src/tui/components/Picker.jsx +32 -4
  329. package/src/tui/components/PromptInput.jsx +259 -80
  330. package/src/tui/components/SlashCommandPalette.jsx +8 -1
  331. package/src/tui/components/StatusLine.jsx +63 -12
  332. package/src/tui/components/TextEntryPanel.jsx +11 -0
  333. package/src/tui/components/ToolExecution.jsx +56 -588
  334. package/src/tui/components/TranscriptItem.jsx +105 -0
  335. package/src/tui/components/UsagePanel.jsx +18 -4
  336. package/src/tui/components/prompt-input/edit-helpers.mjs +72 -0
  337. package/src/tui/components/prompt-input/voice-indicator.mjs +39 -0
  338. package/src/tui/components/tool-execution/ResultBody.jsx +56 -0
  339. package/src/tui/components/tool-execution/surface-detail.mjs +405 -0
  340. package/src/tui/components/tool-execution/text-format.mjs +161 -0
  341. package/src/tui/components/tool-output-format.mjs +2 -2
  342. package/src/tui/display-width.mjs +20 -3
  343. package/src/tui/dist/index.mjs +18034 -17188
  344. package/src/tui/engine/agent-envelope.mjs +296 -0
  345. package/src/tui/engine/agent-job-feed.mjs +133 -0
  346. package/src/tui/engine/boot-profile.mjs +21 -0
  347. package/src/tui/engine/labels.mjs +67 -0
  348. package/src/tui/engine/notice-text.mjs +112 -0
  349. package/src/tui/engine/notification-plan.mjs +76 -0
  350. package/src/tui/engine/queue-helpers.mjs +161 -0
  351. package/src/tui/engine/render-timing.mjs +17 -0
  352. package/src/tui/engine/session-stats.mjs +46 -0
  353. package/src/tui/engine/tool-approval.mjs +94 -0
  354. package/src/tui/engine/tool-call-fields.mjs +23 -0
  355. package/src/tui/engine/tool-card-results.mjs +234 -0
  356. package/src/tui/engine/tool-result-status.mjs +135 -0
  357. package/src/tui/engine/tool-result-text.mjs +126 -0
  358. package/src/tui/engine.mjs +405 -1385
  359. package/src/tui/figures.mjs +5 -0
  360. package/src/tui/index.jsx +105 -0
  361. package/src/tui/input-editing.mjs +60 -10
  362. package/src/tui/keyboard-protocol.mjs +2 -2
  363. package/src/tui/lib/voice-recorder.mjs +35 -19
  364. package/src/tui/markdown/format-token.mjs +11 -9
  365. package/src/tui/paste-attachments.mjs +38 -0
  366. package/src/tui/statusline-ansi-bridge.mjs +11 -3
  367. package/src/tui/theme.mjs +6 -0
  368. package/src/tui/themes/base.mjs +2 -2
  369. package/src/tui/themes/kanagawa.mjs +4 -4
  370. package/src/tui/themes/teal.mjs +4 -5
  371. package/src/tui/themes/utils.mjs +1 -1
  372. package/src/ui/statusline-agents.mjs +213 -0
  373. package/src/ui/statusline-format.mjs +146 -0
  374. package/src/ui/statusline-segments.mjs +148 -0
  375. package/src/ui/statusline.mjs +77 -462
  376. package/src/ui/tool-card.mjs +0 -1
  377. package/src/vendor/statusline/bin/statusline-route.mjs +15 -2
  378. package/src/workflows/default/WORKFLOW.md +16 -9
  379. package/src/workflows/sequential/WORKFLOW.md +16 -11
  380. package/src/workflows/solo/WORKFLOW.md +5 -1
  381. package/vendor/ink/build/display-width.js +19 -3
  382. package/vendor/ink/build/ink.js +103 -6
  383. package/vendor/ink/build/log-update.js +17 -3
  384. package/vendor/ink/build/wrap-text.js +125 -0
  385. package/scripts/_test-folder-dialog.mjs +0 -30
  386. package/scripts/fix-brief-fn.mjs +0 -35
  387. package/scripts/fix-format-tool-surface.mjs +0 -24
  388. package/scripts/fix-tool-exec-visible.mjs +0 -42
  389. package/scripts/patch-agent-brief.mjs +0 -48
  390. package/scripts/patch-app.mjs +0 -21
  391. package/scripts/patch-app2.mjs +0 -18
  392. package/scripts/patch-dist-brief.mjs +0 -96
  393. package/scripts/patch-tool-exec.mjs +0 -70
  394. package/src/examples/schedules/SCHEDULE.example.md +0 -32
  395. package/src/examples/webhooks/WEBHOOK.example.md +0 -40
  396. package/src/runtime/agent/orchestrator/session/manager.reactive-persist.test.mjs +0 -107
  397. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.test.mjs +0 -143
  398. package/src/runtime/agent/orchestrator/tools/builtin/diagnostics-tool.mjs +0 -285
  399. package/src/runtime/agent/orchestrator/tools/builtin/open-config-tool.mjs +0 -26
  400. package/src/runtime/shared/channel-notification-routing.test.mjs +0 -45
  401. package/src/runtime/shared/tool-execution-contract.test.mjs +0 -183
  402. package/src/standalone/agent-task-status.test.mjs +0 -76
  403. package/src/tui/components/tool-output-format.test.mjs +0 -399
  404. package/src/tui/display-width.test.mjs +0 -35
  405. package/src/tui/engine-runtime-notification.test.mjs +0 -115
  406. package/src/tui/engine-tool-result-text.test.mjs +0 -75
  407. package/src/tui/markdown/format-token.test.mjs +0 -354
  408. package/src/tui/markdown/render-ansi.test.mjs +0 -108
  409. package/src/tui/markdown/stream-fence.test.mjs +0 -26
  410. package/src/tui/markdown/streaming-markdown.test.mjs +0 -70
  411. package/src/tui/prompt-history-store.test.mjs +0 -52
  412. package/src/tui/statusline-ansi-bridge.test.mjs +0 -159
  413. package/src/tui/transcript-tool-failures.test.mjs +0 -111
  414. package/src/ui/markdown.test.mjs +0 -70
  415. package/src/ui/statusline-context-label.test.mjs +0 -15
  416. package/src/vendor/statusline/bin/statusline-lib.mjs +0 -186
  417. package/src/vendor/statusline/bin/statusline-route.test.mjs +0 -80
@@ -1,48 +0,0 @@
1
- import fs from "node:fs";
2
- const p = "src/runtime/shared/tool-surface.mjs";
3
- let s = fs.readFileSync(p, "utf8");
4
- if (s.includes("summarizeAgentSurfaceBrief")) { console.log("skip"); process.exit(0); }
5
- const insert = `/** Collapsed agent/worker surface card: one-line brief under the header (30-40 chars). */
6
- export const AGENT_SURFACE_BRIEF_MAX = 40;
7
-
8
- export function summarizeAgentSurfaceBrief(name, args, resultText, { isError = false, isResponse = false } = {}) {
9
- const a = parseToolArgs(args);
10
- const action = String(a?.type || a?.action || "").toLowerCase();
11
- const text = String(resultText ?? "").trim();
12
-
13
- if (isResponse && text) {
14
- const fromResult = summarizeToolResult(name, args, text, isError);
15
- if (fromResult) return truncateSingleLine(stripInlineMarkdown(fromResult), AGENT_SURFACE_BRIEF_MAX);
16
- const line = firstAgentResultLine(text);
17
- if (line) return truncateSingleLine(stripInlineMarkdown(line), AGENT_SURFACE_BRIEF_MAX);
18
- }
19
-
20
- const outbound = firstText(a?.prompt, a?.message);
21
- if (outbound && (action === "spawn" || action === "send" || !action)) {
22
- return truncateSingleLine(outbound, AGENT_SURFACE_BRIEF_MAX);
23
- }
24
-
25
- if ((action === "spawn" || action === "send") && text && !isResponse) {
26
- const fromResult = summarizeToolResult(name, args, text, isError);
27
- if (fromResult) return truncateSingleLine(stripInlineMarkdown(fromResult), AGENT_SURFACE_BRIEF_MAX);
28
- }
29
-
30
- return "";
31
- }
32
-
33
- `;
34
- const needle = `export function formatToolSurface(name, args, opts = {}) {
35
- const parsed = parseToolArgs(args);
36
- return {
37
- label: displayToolName(name, parsed),
38
- summary: summarizeToolArgs(name, parsed, opts),
39
- normalizedName: normalizeToolName(name),
40
- args: parsed,
41
- };
42
- }
43
-
44
- function pluralize`;
45
- if (!s.includes(needle)) throw new Error("needle not found");
46
- s = s.replace(needle, insert + "function pluralize");
47
- fs.writeFileSync(p, s);
48
- console.log("tool-surface ok");
@@ -1,21 +0,0 @@
1
- import fs from "node:fs";
2
- const p = "src/tui/App.jsx";
3
- let s = fs.readFileSync(p, "utf8");
4
- const old = ` // EVERY agent card is a single header row whether pending or completed —
5
- // ToolExecution drops the ⎿ body for all of them AND the pending-delay
6
- // placeholder reserves only 1 row for agent surfaces — so reserve
7
- // exactly 1 row regardless of pending/hasResult. Otherwise the estimate
8
- // (2) and the real render (1) diverge and the viewport jumps.
9
- if (isSkillSurface || isAgentSurface) return 1;`;
10
- const neu = ` // Skill loads are a single header row; agent cards are header + brief.
11
- if (isSkillSurface) return 1;
12
- if (isAgentSurface) return 2;`;
13
- if (s.includes(old)) {
14
- s = s.replace(old, neu);
15
- fs.writeFileSync(p, s);
16
- console.log("App ok");
17
- } else if (s.includes("if (isAgentSurface) return 2")) {
18
- console.log("App already");
19
- } else {
20
- throw new Error("App block not found");
21
- }
@@ -1,18 +0,0 @@
1
- import fs from "node:fs";
2
- const p = "src/tui/App.jsx";
3
- let s = fs.readFileSync(p, "utf8");
4
- const old = ` if (isSkillSurface || isAgentSurface) return 1;`;
5
- const neu = ` if (isSkillSurface) return 1;
6
- if (isAgentSurface) return 2;`;
7
- if (s.includes(old) && !s.includes("if (isAgentSurface) return 2")) {
8
- s = s.replace(old, neu);
9
- const commentOld = ` // EVERY agent card is a single header row whether pending or completed —
10
- // ToolExecution drops the ⎿ body for all of them AND the pending-delay
11
- // placeholder reserves only 1 row for agent surfaces — so reserve
12
- // exactly 1 row regardless of pending/hasResult. Otherwise the estimate
13
- // (2) and the real render (1) diverge and the viewport jumps.`;
14
- const commentNeu = ` // Skill loads are a single header row; agent cards are header + brief.`;
15
- s = s.replace(commentOld, commentNeu);
16
- fs.writeFileSync(p, s);
17
- console.log("App ok");
18
- } else { console.log("App skip or done"); }
@@ -1,96 +0,0 @@
1
- import fs from "node:fs";
2
- const p = "src/tui/dist/index.mjs";
3
- let s = fs.readFileSync(p, "utf8");
4
-
5
- const helpers = `const AGENT_SURFACE_BRIEF_MAX = 40;
6
- function truncateAgentSurfaceBrief(value, max = AGENT_SURFACE_BRIEF_MAX) {
7
- const text = String(value ?? "").replace(/\\s+/g, " ").trim();
8
- if (!text) return "";
9
- if (text.length <= max) return text;
10
- return \`\${text.slice(0, Math.max(1, max - 1))}…\`;
11
- }
12
- function summarizeAgentSurfaceBrief(name, args, resultText, { isError = false, isResponse = false } = {}) {
13
- const a = parseToolArgs(args);
14
- const action = String(a?.type || a?.action || "").toLowerCase();
15
- const text = String(resultText ?? "").trim();
16
-
17
- if (isResponse && text) {
18
- const fromResult = summarizeToolResult(name, args, text, isError);
19
- if (fromResult) return truncateAgentSurfaceBrief(stripInlineMarkdown(fromResult));
20
- const line = firstAgentResultLine(text);
21
- if (line) return truncateAgentSurfaceBrief(stripInlineMarkdown(line));
22
- }
23
-
24
- const outbound = firstText(a?.prompt, a?.message);
25
- if (outbound && (action === "spawn" || action === "send" || !action)) {
26
- return truncateAgentSurfaceBrief(outbound);
27
- }
28
-
29
- if ((action === "spawn" || action === "send") && text && !isResponse) {
30
- const fromResult = summarizeToolResult(name, args, text, isError);
31
- if (fromResult) return truncateAgentSurfaceBrief(stripInlineMarkdown(fromResult));
32
- }
33
-
34
- return "";
35
- }
36
-
37
- `;
38
-
39
- if (!s.includes("function summarizeAgentSurfaceBrief")) {
40
- const needle = `function formatToolSurface(name, args, opts = {}) {
41
- const parsed = parseToolArgs(args);
42
- return {
43
- label: displayToolName(name, parsed),
44
- summary: summarizeToolArgs(name, parsed, opts),
45
- normalizedName: normalizeToolName(name),
46
- args: parsed
47
- };
48
- }
49
- function pluralize`;
50
- if (!s.includes(needle)) throw new Error("formatToolSurface needle missing");
51
- s = s.replace(needle, `function formatToolSurface(name, args, opts = {}) {
52
- const parsed = parseToolArgs(args);
53
- return {
54
- label: displayToolName(name, parsed),
55
- summary: summarizeToolArgs(name, parsed, opts),
56
- normalizedName: normalizeToolName(name),
57
- args: parsed
58
- };
59
- }
60
- ` + helpers + `function pluralize`);
61
- }
62
-
63
- const oldVisible = ` const isAgentSurfaceCard = isAgentTool(normalizedName);
64
- const visibleDetailLines = (isAgentSurfaceCard || isSkillSurface) && !showRawResult ? [] : detailLines;`;
65
- const newVisible = ` const isAgentSurfaceCard = isAgentTool(normalizedName);
66
- const agentSurfaceBriefRaw = isAgentSurfaceCard && !showRawResult
67
- ? summarizeAgentSurfaceBrief(name, parsedArgs, displayedResultText || "", { isError, isResponse: isAgentResponse })
68
- : "";
69
- const agentSurfaceBrief = agentSurfaceBriefRaw
70
- ? truncateToWidth(agentSurfaceBriefRaw, Math.min(AGENT_SURFACE_BRIEF_MAX, maxResultChars))
71
- : "";
72
- let visibleDetailLines = detailLines;
73
- if (isSkillSurface && !showRawResult) {
74
- visibleDetailLines = [];
75
- } else if (isAgentSurfaceCard && !showRawResult) {
76
- const agentDetailFallback = collapsedDetail
77
- || (pending ? (pendingDetailPlaceholder || "Running") : "Finished");
78
- const agentDetailLine = agentSurfaceBrief
79
- || truncateToWidth(String(agentDetailFallback), Math.min(AGENT_SURFACE_BRIEF_MAX, maxResultChars));
80
- visibleDetailLines = [agentDetailLine];
81
- }`;
82
- if (s.includes(oldVisible)) s = s.replace(oldVisible, newVisible);
83
- else if (!s.includes("agentSurfaceBriefRaw")) throw new Error("visibleDetailLines block missing");
84
-
85
- s = s.replace(
86
- "const placeholderSingleRow = !aggregate && (SKILL_SURFACE_NAMES.has(placeholderNormalizedName) || isAgentTool(placeholderNormalizedName));",
87
- "const placeholderSingleRow = !aggregate && SKILL_SURFACE_NAMES.has(placeholderNormalizedName);"
88
- );
89
-
90
- s = s.replace(
91
- " if (isSkillSurface || isAgentSurface) return 1;",
92
- " if (isSkillSurface) return 1;\n if (isAgentSurface) return 2;"
93
- );
94
-
95
- fs.writeFileSync(p, s);
96
- console.log("dist patched");
@@ -1,70 +0,0 @@
1
- import fs from "node:fs";
2
- const p = "src/tui/components/ToolExecution.jsx";
3
- let s = fs.readFileSync(p, "utf8");
4
- if (!s.includes("summarizeAgentSurfaceBrief,")) {
5
- s = s.replace(
6
- " displayModelName,\n} from '../../runtime/shared/tool-surface.mjs';",
7
- " displayModelName,\n summarizeAgentSurfaceBrief,\n AGENT_SURFACE_BRIEF_MAX,\n} from '../../runtime/shared/tool-surface.mjs';",
8
- );
9
- }
10
- s = s.replace(
11
- ` // Skill surfaces AND agent surfaces both collapse to a single header row in
12
- // estimateTranscriptItemRows (agent cards drop their ⎿ body entirely), so
13
- // the pending-delay placeholder must reserve exactly 1 row for them too —
14
- // otherwise the card paints 2 blank rows for ~1s then snaps to 1 ("튐").
15
- const placeholderSingleRow = !aggregate
16
- && (SKILL_SURFACE_NAMES.has(placeholderNormalizedName) || isAgentTool(placeholderNormalizedName));`,
17
- ` // Skill surfaces collapse to a single header row; agent surfaces reserve
18
- // header + one brief detail row (see estimateTranscriptItemRows).
19
- const placeholderSingleRow = !aggregate && SKILL_SURFACE_NAMES.has(placeholderNormalizedName);`,
20
- );
21
- const oldBlock = ` // Every agent card is a single header row when collapsed: spawn/send/response/
22
- // status/list/cancel/close/cleanup all fold their context into the header
23
- // label, so the ⎿ detail body (response summary, "agents: N …" worker list,
24
- // status metadata) is dropped unless the user expands with ctrl+o.
25
- const isAgentSurfaceCard = isAgentTool(normalizedName);
26
- // Skill loads carry the skill name in the header already
27
- // ("Loaded 1 skill (name)"); the collapsed detail row just repeats it, so
28
- // drop it and keep the card a single line. Expanding (ctrl+o) still shows the
29
- // full skill body via the raw-result path.
30
- // Agent responses now identify the responder in the header itself
31
- // ("Heavy Worker (Opus 4.8)"); the collapsed body just echoed the response
32
- // summary ("All green. Done."), so drop it and keep the card a single line.
33
- // ctrl+o expand (showRawResult) still surfaces the full response body.
34
- // Suppression is COLLAPSED-ONLY: agent/skill cards hide their ⎿ body when
35
- // collapsed, but once the user expands (showRawResult) the raw body — the
36
- // response, the "agents: N …" worker list, the status metadata — must render.
37
- const visibleDetailLines = ((isAgentSurfaceCard || isSkillSurface) && !showRawResult)
38
- ? []
39
- : detailLines;`;
40
- const newBlock = ` const isAgentSurfaceCard = isAgentTool(normalizedName);
41
- const agentSurfaceBriefRaw = isAgentSurfaceCard && !showRawResult
42
- ? summarizeAgentSurfaceBrief(name, parsedArgs, displayedResultText || '', { isError, isResponse: isAgentResponse })
43
- : '';
44
- const agentSurfaceBrief = agentSurfaceBriefRaw
45
- ? truncateToWidth(agentSurfaceBriefRaw, Math.min(AGENT_SURFACE_BRIEF_MAX, maxResultChars))
46
- : '';
47
- // Skill loads carry the skill name in the header already
48
- // ("Loaded 1 skill (name)"); the collapsed detail row just repeats it, so
49
- // drop it and keep the card a single line. Expanding (ctrl+o) still shows the
50
- // full skill body via the raw-result path.
51
- // Agent spawn/send/response cards show a tight brief under the ⎿ gutter when
52
- // collapsed; ctrl+o expand still surfaces the full body.
53
- let visibleDetailLines = detailLines;
54
- if (isSkillSurface && !showRawResult) {
55
- visibleDetailLines = [];
56
- } else if (isAgentSurfaceCard && !showRawResult) {
57
- if (agentSurfaceBrief) {
58
- visibleDetailLines = [agentSurfaceBrief];
59
- } else if (pending) {
60
- visibleDetailLines = [pendingDetailPlaceholder || 'Running'];
61
- } else {
62
- visibleDetailLines = [];
63
- }
64
- }`;
65
- if (!s.includes("agentSurfaceBriefRaw")) {
66
- if (!s.includes(oldBlock)) throw new Error("ToolExecution block not found");
67
- s = s.replace(oldBlock, newBlock);
68
- }
69
- fs.writeFileSync(p, s);
70
- console.log("ToolExecution ok");
@@ -1,32 +0,0 @@
1
- ---
2
- time: 0 9 * * *
3
- timezone: Asia/Seoul
4
- days: weekday
5
- channel: main
6
- model: gpt-5
7
- enabled: true
8
- ---
9
-
10
- # Schedule instructions (prompt body)
11
-
12
- This whole markdown body is the prompt the scheduler runs when the cron fires.
13
- Everything above the second `---` is frontmatter metadata; everything below is
14
- the instructions.
15
-
16
- Frontmatter keys:
17
-
18
- - `time` — required. 5- or 6-field cron expression (e.g. `0 9 * * *`).
19
- - `timezone` — optional IANA tz (e.g. `Asia/Seoul`); host-local when omitted.
20
- - `days` — optional; omit for `daily`. Allowed values: `weekday`, `weekend`, or
21
- a comma list of day abbreviations (`mon,tue,wed,thu,fri,sat,sun`). Written
22
- only when not `daily`.
23
- - `channel` — optional channel label. WITH a channel the run dispatches to that
24
- channel (non-interactive) and REQUIRES `model`; WITHOUT it the run injects
25
- into the current session (interactive).
26
- - `model` — required when `channel` is set; the preset id used for dispatch.
27
- - `enabled` — optional; written `false` to disable. Missing/anything-else means
28
- enabled. The reader casts this string to a boolean.
29
-
30
- Storage layout: `<data>/schedules/<name>/SCHEDULE.md` — one file per schedule.
31
- This `.example.md` is documentation only; the readers match `SCHEDULE.md`
32
- exactly, so this file is never loaded as a real schedule.
@@ -1,40 +0,0 @@
1
- ---
2
- parser: github
3
- channel: main
4
- model: gpt-5
5
- role: webhook-handler
6
- enabled: true
7
- ---
8
-
9
- # Webhook instructions (prompt body)
10
-
11
- This markdown body is the handler prompt. On each verified delivery the webhook
12
- payload is fenced as untrusted data and appended after these instructions.
13
- Everything above the second `---` is frontmatter metadata; everything below is
14
- the instructions.
15
-
16
- Frontmatter keys:
17
-
18
- - `parser` — required. One of `github`, `generic`, `stripe`, `sentry`. Selects
19
- the signature header + verification scheme.
20
- - `channel` — optional channel label. WITH a channel the delivery is dispatched
21
- as a delegate (REQUIRES `model` + `role`) and reported to that channel;
22
- WITHOUT it the payload is enqueued into the current session (interactive).
23
- - `model` — required when `channel` is set; the preset id used for delegate
24
- dispatch.
25
- - `role` — user-workflow role for delegate mode; defaults to `webhook-handler`.
26
- - `enabled` — optional; written `false` to disable (delivery rejected with 404).
27
- Missing/anything-else means enabled. The reader casts this string to a boolean.
28
-
29
- Secret storage: the HMAC secret is NOT a frontmatter key. It lives in a side
30
- file `<data>/webhooks/<name>/secret` (plaintext, one line), autogenerated
31
- (24 random bytes hex) when omitted at save time. Keeping it out of the lossy
32
- `key: value` frontmatter lets an arbitrary user secret (quotes/colons/newlines)
33
- round-trip losslessly and prevents enable/disable rewrites from corrupting it.
34
- The admin list API never exposes the value — only `secretSet: true/false`.
35
-
36
- Storage layout: `<data>/webhooks/<name>/WEBHOOK.md` — one file per endpoint.
37
- `secret` and `deliveries.jsonl` live alongside it and are managed separately.
38
- This
39
- `.example.md` is documentation only; the readers match `WEBHOOK.md` exactly, so
40
- this file is never loaded as a real endpoint.
@@ -1,107 +0,0 @@
1
- import assert from 'node:assert/strict';
2
- import test from 'node:test';
3
-
4
- import {
5
- _applyCompactFailurePersistToSession,
6
- _sessionMessagesAdvancedBeyondCompactedOutgoing,
7
- } from './manager.mjs';
8
-
9
- const compacted = [
10
- { role: 'user', content: 'summary turn' },
11
- { role: 'user', content: 'current task' },
12
- ];
13
-
14
- test('sessionMessagesAdvancedBeyondCompactedOutgoing: true for compacted prefix plus final assistant', () => {
15
- const current = [
16
- ...compacted,
17
- { role: 'assistant', content: 'done' },
18
- ];
19
- assert.equal(_sessionMessagesAdvancedBeyondCompactedOutgoing(current, compacted), true);
20
- });
21
-
22
- test('sessionMessagesAdvancedBeyondCompactedOutgoing: true for compacted prefix plus empty-final assistant', () => {
23
- const current = [
24
- ...compacted,
25
- { role: 'assistant', content: '', emptyFinal: true },
26
- ];
27
- assert.equal(_sessionMessagesAdvancedBeyondCompactedOutgoing(current, compacted), true);
28
- });
29
-
30
- test('sessionMessagesAdvancedBeyondCompactedOutgoing: false when transcript has not advanced', () => {
31
- assert.equal(_sessionMessagesAdvancedBeyondCompactedOutgoing(compacted, compacted), false);
32
- });
33
-
34
- test('sessionMessagesAdvancedBeyondCompactedOutgoing: false when extra message is not a final assistant', () => {
35
- const current = [
36
- ...compacted,
37
- { role: 'user', content: 'steering follow-up' },
38
- ];
39
- assert.equal(_sessionMessagesAdvancedBeyondCompactedOutgoing(current, compacted), false);
40
- });
41
-
42
- test('sessionMessagesAdvancedBeyondCompactedOutgoing: false when prefix diverges from compacted outgoing', () => {
43
- const current = [
44
- { role: 'user', content: 'different summary' },
45
- { role: 'user', content: 'current task' },
46
- { role: 'assistant', content: 'done' },
47
- ];
48
- assert.equal(_sessionMessagesAdvancedBeyondCompactedOutgoing(current, compacted), false);
49
- });
50
-
51
- test('applyCompactFailurePersistToSession: preserves providerState when transcript already advanced', () => {
52
- const priorSanitized = [
53
- ...compacted,
54
- { role: 'assistant', content: 'done' },
55
- ];
56
- const session = {
57
- messages: priorSanitized,
58
- providerState: { continuation: 'fresh' },
59
- compaction: { lastStage: 'compacting' },
60
- };
61
- const applied = _applyCompactFailurePersistToSession(session, {
62
- priorSanitized,
63
- sanitized: compacted,
64
- messagesAdvanced: true,
65
- error: new Error('ask failed'),
66
- });
67
- assert.equal(applied, true);
68
- assert.deepEqual(session.messages, priorSanitized);
69
- assert.deepEqual(session.providerState, { continuation: 'fresh' });
70
- assert.equal(session.compaction.lastStage, 'failed');
71
- });
72
-
73
- test('applyCompactFailurePersistToSession: clears providerState when replacing messages with compacted outgoing', () => {
74
- const priorSanitized = [
75
- { role: 'user', content: 'old long history' },
76
- ];
77
- const session = {
78
- messages: priorSanitized,
79
- providerState: { stale: true },
80
- compaction: { lastStage: 'compacting' },
81
- };
82
- const applied = _applyCompactFailurePersistToSession(session, {
83
- priorSanitized,
84
- sanitized: compacted,
85
- messagesAdvanced: false,
86
- error: { code: 'AGENT_CONTEXT_OVERFLOW' },
87
- });
88
- assert.equal(applied, true);
89
- assert.deepEqual(session.messages, compacted);
90
- assert.equal(session.providerState, undefined);
91
- assert.equal(session.compaction.lastStage, 'overflow_failed');
92
- });
93
-
94
- test('applyCompactFailurePersistToSession: no-op when messages unchanged and not advanced', () => {
95
- const session = {
96
- messages: compacted,
97
- providerState: { keep: true },
98
- };
99
- const applied = _applyCompactFailurePersistToSession(session, {
100
- priorSanitized: compacted,
101
- sanitized: compacted,
102
- messagesAdvanced: false,
103
- });
104
- assert.equal(applied, false);
105
- assert.deepEqual(session.providerState, { keep: true });
106
- });
107
-
@@ -1,143 +0,0 @@
1
- import { test } from 'node:test';
2
- import assert from 'node:assert/strict';
3
- import { validateBuiltinArgs } from './arg-guard.mjs';
4
-
5
- test('read: numeric-string offset/limit coerce losslessly', () => {
6
- const a = { path: 'x.js', offset: '850', limit: '850.0' };
7
- assert.equal(validateBuiltinArgs('read', a), null);
8
- assert.equal(a.offset, 850);
9
- assert.equal(a.limit, 850);
10
- });
11
-
12
- test('read: non-integer numeric string still rejected', () => {
13
- const a = { path: 'x.js', offset: '3.5' };
14
- assert.match(validateBuiltinArgs('read', a), /must be a finite integer/);
15
- });
16
-
17
- test('read: non-numeric string still rejected', () => {
18
- const a = { path: 'x.js', offset: 'soon' };
19
- assert.match(validateBuiltinArgs('read', a), /must be a finite integer/);
20
- });
21
-
22
- test('read: top-level line/context convert to offset/limit', () => {
23
- const a = { path: 'x.js', line: 100, context: 10 };
24
- assert.equal(validateBuiltinArgs('read', a), null);
25
- assert.equal(a.offset, 89);
26
- assert.equal(a.limit, 21);
27
- assert.equal('line' in a, false);
28
- assert.equal('context' in a, false);
29
- });
30
-
31
- test('read: line without context defaults to a single-line window', () => {
32
- const a = { path: 'x.js', line: 1 };
33
- assert.equal(validateBuiltinArgs('read', a), null);
34
- assert.equal(a.offset, 0);
35
- assert.equal(a.limit, 1);
36
- });
37
-
38
- test('read: explicit offset/limit wins over line/context (dropped)', () => {
39
- const a = { path: 'x.js', line: 100, context: 10, offset: 5, limit: 20 };
40
- assert.equal(validateBuiltinArgs('read', a), null);
41
- assert.equal(a.offset, 5);
42
- assert.equal(a.limit, 20);
43
- assert.equal('line' in a, false);
44
- assert.equal('context' in a, false);
45
- });
46
-
47
- test('read: path[] entry object line/context converts the same way', () => {
48
- const a = { path: [{ path: 'x.js', line: 50, context: 5 }] };
49
- assert.equal(validateBuiltinArgs('read', a), null);
50
- assert.equal(a.path[0].offset, 44);
51
- assert.equal(a.path[0].limit, 11);
52
- });
53
-
54
- test('read: path[] entry negative numeric-string offset is rejected after coercion', () => {
55
- const a = { path: [{ path: 'x.js', offset: '-5' }] };
56
- const err = validateBuiltinArgs('read', a);
57
- assert.match(err, /path\[0\]\.offset/);
58
- assert.match(err, />= 0/);
59
- });
60
-
61
- test('read: path[] entry negative numeric-string limit is rejected after coercion', () => {
62
- const a = { path: [{ path: 'x.js', limit: '-1' }] };
63
- const err = validateBuiltinArgs('read', a);
64
- assert.match(err, /path\[0\]\.limit/);
65
- assert.match(err, />= 0/);
66
- });
67
-
68
- test('read: path[] entry valid numeric-string offset/limit still coerces and passes', () => {
69
- const a = { path: [{ path: 'x.js', offset: '10', limit: '5' }] };
70
- assert.equal(validateBuiltinArgs('read', a), null);
71
- assert.equal(a.path[0].offset, 10);
72
- assert.equal(a.path[0].limit, 5);
73
- });
74
-
75
- test('read: JSON object string path is accepted as a single-entry batch', () => {
76
- const a = { path: '{"path":"x.js","offset":10,"limit":5}' };
77
- assert.equal(validateBuiltinArgs('read', a), null);
78
- assert.equal(Array.isArray(a.path), true);
79
- assert.equal(a.path[0].path, 'x.js');
80
- assert.equal(a.path[0].offset, 10);
81
- });
82
-
83
- test('shell: win32 drive path with no shell set defaults to powershell', (t) => {
84
- if (process.platform !== 'win32') { t.skip('win32 only'); return; }
85
- const a = { command: 'dir C:\\Project\\mixdog' };
86
- assert.equal(validateBuiltinArgs('shell', a), null);
87
- assert.equal(a.shell, 'powershell');
88
- });
89
-
90
- test('glob: missing pattern with a path defaults pattern to "*"', () => {
91
- const a = { path: 'src' };
92
- assert.equal(validateBuiltinArgs('glob', a), null);
93
- assert.equal(a.pattern, '*');
94
- });
95
-
96
- test('glob: path carrying glob magic is left for the path-magic fallback, not overridden', () => {
97
- const a = { path: 'src/**/*.mjs' };
98
- assert.equal(validateBuiltinArgs('glob', a), null);
99
- assert.equal('pattern' in a, false);
100
- assert.equal(a.path, 'src/**/*.mjs');
101
- });
102
-
103
- test('glob: missing pattern and path is still an error surface (guard passes through)', () => {
104
- const a = {};
105
- assert.equal(validateBuiltinArgs('glob', a), null);
106
- assert.equal('pattern' in a, false);
107
- });
108
-
109
- test('grep: output_mode with newline-concatenated debris truncates to valid enum', () => {
110
- const a = { pattern: 'foo', output_mode: 'content_with_context\ntrue' };
111
- assert.equal(validateBuiltinArgs('grep', a), null);
112
- assert.equal(a.output_mode, 'content_with_context');
113
- });
114
-
115
- test('grep: trailing literal \\n artifact stripped from pattern', () => {
116
- const a = { pattern: 'foo bar\\n' };
117
- assert.equal(validateBuiltinArgs('grep', a), null);
118
- assert.equal(a.pattern, 'foo bar');
119
- });
120
-
121
- test('grep: trailing concatenation artifact ">\\n" stripped from pattern', () => {
122
- const a = { pattern: 'foo bar">\n' };
123
- assert.equal(validateBuiltinArgs('grep', a), null);
124
- assert.equal(a.pattern, 'foo bar');
125
- });
126
-
127
- test('grep: mid-pattern \\n is left untouched', () => {
128
- const a = { pattern: 'foo\\nbar' };
129
- assert.equal(validateBuiltinArgs('grep', a), null);
130
- assert.equal(a.pattern, 'foo\\nbar');
131
- });
132
-
133
- test('grep: bare trailing ">" with no newline artifact survives untouched', () => {
134
- const a = { pattern: 'class="active">' };
135
- assert.equal(validateBuiltinArgs('grep', a), null);
136
- assert.equal(a.pattern, 'class="active">');
137
- });
138
-
139
- test('grep: numeric-string -C context coerces losslessly', () => {
140
- const a = { pattern: 'foo', '-C': '5' };
141
- assert.equal(validateBuiltinArgs('grep', a), null);
142
- assert.equal(a['-C'], 5);
143
- });