@bastani/atomic 0.9.28-alpha.1 → 0.9.28-alpha.3

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 (332) hide show
  1. package/CHANGELOG.md +60 -0
  2. package/dist/builtin/intercom/package.json +1 -1
  3. package/dist/builtin/mcp/native-client-licenses/NOTICE +2 -0
  4. package/dist/builtin/mcp/package.json +1 -1
  5. package/dist/builtin/subagents/package.json +1 -1
  6. package/dist/builtin/web-access/package.json +1 -1
  7. package/dist/builtin/workflows/CHANGELOG.md +34 -0
  8. package/dist/builtin/workflows/builtin/{chunk-wz8v67bn.js → chunk-aqv8ny38.js} +257 -259
  9. package/dist/builtin/workflows/builtin/{chunk-f61w0hpm.js → chunk-br4ac9a3.js} +1 -1
  10. package/dist/builtin/workflows/builtin/{chunk-tecnpe8j.js → chunk-p3xmajmj.js} +438 -39
  11. package/dist/builtin/workflows/builtin/chunk-p6jagvyf.js +8 -0
  12. package/dist/builtin/workflows/builtin/goal.js +2 -2
  13. package/dist/builtin/workflows/builtin/index.js +4 -4
  14. package/dist/builtin/workflows/builtin/ralph.js +2 -2
  15. package/dist/builtin/workflows/package.json +1 -1
  16. package/dist/builtin/workflows/src/authoring.d.ts +14 -0
  17. package/dist/builtin/workflows/src/extension/index.bundle.mjs +111102 -110218
  18. package/dist/builtin/workflows/src/index.js +42284 -41141
  19. package/dist/builtin/workflows/src/shared/authoring-contract-stage.d.ts +16 -11
  20. package/dist/builtin/workflows/src/shared/authoring-contract-ui.d.ts +16 -1
  21. package/dist/cli/args.d.ts.map +1 -1
  22. package/dist/cli/args.js +8 -1
  23. package/dist/cli/args.js.map +1 -1
  24. package/dist/cli/credential-print.d.ts +1 -1
  25. package/dist/cli/credential-print.d.ts.map +1 -1
  26. package/dist/cli/credential-print.js +2 -56
  27. package/dist/cli/credential-print.js.map +1 -1
  28. package/dist/config.d.ts +2 -1
  29. package/dist/config.d.ts.map +1 -1
  30. package/dist/config.js +4 -2
  31. package/dist/config.js.map +1 -1
  32. package/dist/core/agent-session-accessors.d.ts.map +1 -1
  33. package/dist/core/agent-session-accessors.js +6 -1
  34. package/dist/core/agent-session-accessors.js.map +1 -1
  35. package/dist/core/agent-session-compaction.d.ts.map +1 -1
  36. package/dist/core/agent-session-compaction.js +20 -3
  37. package/dist/core/agent-session-compaction.js.map +1 -1
  38. package/dist/core/agent-session-events.d.ts.map +1 -1
  39. package/dist/core/agent-session-events.js +2 -1
  40. package/dist/core/agent-session-events.js.map +1 -1
  41. package/dist/core/agent-session-extension-bindings.d.ts +6 -0
  42. package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
  43. package/dist/core/agent-session-extension-bindings.js +90 -9
  44. package/dist/core/agent-session-extension-bindings.js.map +1 -1
  45. package/dist/core/agent-session-methods.d.ts +3 -1
  46. package/dist/core/agent-session-methods.d.ts.map +1 -1
  47. package/dist/core/agent-session-methods.js.map +1 -1
  48. package/dist/core/agent-session-prompt.d.ts.map +1 -1
  49. package/dist/core/agent-session-prompt.js +14 -1
  50. package/dist/core/agent-session-prompt.js.map +1 -1
  51. package/dist/core/agent-session-tool-registry.d.ts.map +1 -1
  52. package/dist/core/agent-session-tool-registry.js +1 -0
  53. package/dist/core/agent-session-tool-registry.js.map +1 -1
  54. package/dist/core/agent-session-types.d.ts +2 -0
  55. package/dist/core/agent-session-types.d.ts.map +1 -1
  56. package/dist/core/agent-session-types.js.map +1 -1
  57. package/dist/core/agent-session.d.ts +1 -0
  58. package/dist/core/agent-session.d.ts.map +1 -1
  59. package/dist/core/agent-session.js +6 -1
  60. package/dist/core/agent-session.js.map +1 -1
  61. package/dist/core/bash-executor.d.ts.map +1 -1
  62. package/dist/core/bash-executor.js +22 -4
  63. package/dist/core/bash-executor.js.map +1 -1
  64. package/dist/core/child-session-options.d.ts.map +1 -1
  65. package/dist/core/child-session-options.js +17 -2
  66. package/dist/core/child-session-options.js.map +1 -1
  67. package/dist/core/compaction/classifier-compaction.d.ts +13 -0
  68. package/dist/core/compaction/classifier-compaction.d.ts.map +1 -0
  69. package/dist/core/compaction/classifier-compaction.js +110 -0
  70. package/dist/core/compaction/classifier-compaction.js.map +1 -0
  71. package/dist/core/compaction/compaction-boundary.d.ts.map +1 -1
  72. package/dist/core/compaction/compaction-boundary.js +2 -6
  73. package/dist/core/compaction/compaction-boundary.js.map +1 -1
  74. package/dist/core/compaction/compaction-runner.d.ts +16 -1
  75. package/dist/core/compaction/compaction-runner.d.ts.map +1 -1
  76. package/dist/core/compaction/compaction-runner.js +97 -12
  77. package/dist/core/compaction/compaction-runner.js.map +1 -1
  78. package/dist/core/compaction/compaction-types.d.ts +18 -1
  79. package/dist/core/compaction/compaction-types.d.ts.map +1 -1
  80. package/dist/core/compaction/compaction-types.js +1 -1
  81. package/dist/core/compaction/compaction-types.js.map +1 -1
  82. package/dist/core/compaction/fallback-planner.d.ts +1 -0
  83. package/dist/core/compaction/fallback-planner.d.ts.map +1 -1
  84. package/dist/core/compaction/fallback-planner.js +2 -0
  85. package/dist/core/compaction/fallback-planner.js.map +1 -1
  86. package/dist/core/compaction/index.d.ts +3 -0
  87. package/dist/core/compaction/index.d.ts.map +1 -1
  88. package/dist/core/compaction/index.js +3 -0
  89. package/dist/core/compaction/index.js.map +1 -1
  90. package/dist/core/compaction/model-resolver.d.ts +16 -0
  91. package/dist/core/compaction/model-resolver.d.ts.map +1 -0
  92. package/dist/core/compaction/model-resolver.js +18 -0
  93. package/dist/core/compaction/model-resolver.js.map +1 -0
  94. package/dist/core/compaction/morph-compaction.d.ts +14 -0
  95. package/dist/core/compaction/morph-compaction.d.ts.map +1 -0
  96. package/dist/core/compaction/morph-compaction.js +99 -0
  97. package/dist/core/compaction/morph-compaction.js.map +1 -0
  98. package/dist/core/compaction/pi-summary-fallback.d.ts +34 -0
  99. package/dist/core/compaction/pi-summary-fallback.d.ts.map +1 -0
  100. package/dist/core/compaction/pi-summary-fallback.js +357 -0
  101. package/dist/core/compaction/pi-summary-fallback.js.map +1 -0
  102. package/dist/core/compaction/planner-outcome.d.ts +10 -6
  103. package/dist/core/compaction/planner-outcome.d.ts.map +1 -1
  104. package/dist/core/compaction/planner-outcome.js +11 -4
  105. package/dist/core/compaction/planner-outcome.js.map +1 -1
  106. package/dist/core/compaction/range-planner-diagnostics.d.ts +3 -1
  107. package/dist/core/compaction/range-planner-diagnostics.d.ts.map +1 -1
  108. package/dist/core/compaction/range-planner-diagnostics.js +11 -0
  109. package/dist/core/compaction/range-planner-diagnostics.js.map +1 -1
  110. package/dist/core/compaction/range-planner.d.ts +3 -3
  111. package/dist/core/compaction/range-planner.d.ts.map +1 -1
  112. package/dist/core/compaction/range-planner.js +59 -28
  113. package/dist/core/compaction/range-planner.js.map +1 -1
  114. package/dist/core/compaction/region-trimming.d.ts.map +1 -1
  115. package/dist/core/compaction/region-trimming.js +7 -0
  116. package/dist/core/compaction/region-trimming.js.map +1 -1
  117. package/dist/core/compaction/structured-compaction-input.d.ts +19 -0
  118. package/dist/core/compaction/structured-compaction-input.d.ts.map +1 -0
  119. package/dist/core/compaction/structured-compaction-input.js +70 -0
  120. package/dist/core/compaction/structured-compaction-input.js.map +1 -0
  121. package/dist/core/compaction/transcript-serialization.d.ts +1 -0
  122. package/dist/core/compaction/transcript-serialization.d.ts.map +1 -1
  123. package/dist/core/compaction/transcript-serialization.js +26 -0
  124. package/dist/core/compaction/transcript-serialization.js.map +1 -1
  125. package/dist/core/extensions/api-types.d.ts +2 -2
  126. package/dist/core/extensions/api-types.d.ts.map +1 -1
  127. package/dist/core/extensions/api-types.js.map +1 -1
  128. package/dist/core/extensions/context-types.d.ts +1 -0
  129. package/dist/core/extensions/context-types.d.ts.map +1 -1
  130. package/dist/core/extensions/context-types.js.map +1 -1
  131. package/dist/core/extensions/loader-api.js.map +1 -1
  132. package/dist/core/extensions/loader-virtual-modules.d.ts +3 -4
  133. package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
  134. package/dist/core/extensions/loader-virtual-modules.js +14 -9
  135. package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
  136. package/dist/core/extensions/runner-context.d.ts +10 -4
  137. package/dist/core/extensions/runner-context.d.ts.map +1 -1
  138. package/dist/core/extensions/runner-context.js +47 -3
  139. package/dist/core/extensions/runner-context.js.map +1 -1
  140. package/dist/core/extensions/runner.d.ts +10 -3
  141. package/dist/core/extensions/runner.d.ts.map +1 -1
  142. package/dist/core/extensions/runner.js +31 -7
  143. package/dist/core/extensions/runner.js.map +1 -1
  144. package/dist/core/extensions/tool-events.d.ts +1 -1
  145. package/dist/core/extensions/tool-events.js.map +1 -1
  146. package/dist/core/extensions/ts-source-specifiers.d.ts +18 -0
  147. package/dist/core/extensions/ts-source-specifiers.d.ts.map +1 -0
  148. package/dist/core/extensions/ts-source-specifiers.js +142 -0
  149. package/dist/core/extensions/ts-source-specifiers.js.map +1 -0
  150. package/dist/core/extensions/workflow-events.d.ts +49 -0
  151. package/dist/core/extensions/workflow-events.d.ts.map +1 -1
  152. package/dist/core/extensions/workflow-events.js.map +1 -1
  153. package/dist/core/extensions/workflow-run-control-hub.d.ts +16 -4
  154. package/dist/core/extensions/workflow-run-control-hub.d.ts.map +1 -1
  155. package/dist/core/extensions/workflow-run-control-hub.js +72 -1
  156. package/dist/core/extensions/workflow-run-control-hub.js.map +1 -1
  157. package/dist/core/extensions/workflow-run-control.d.ts +11 -3
  158. package/dist/core/extensions/workflow-run-control.d.ts.map +1 -1
  159. package/dist/core/extensions/workflow-run-control.js.map +1 -1
  160. package/dist/core/messages.d.ts +1 -0
  161. package/dist/core/messages.d.ts.map +1 -1
  162. package/dist/core/messages.js +5 -1
  163. package/dist/core/messages.js.map +1 -1
  164. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  165. package/dist/core/remote-catalog-provider.js +3 -0
  166. package/dist/core/remote-catalog-provider.js.map +1 -1
  167. package/dist/core/sdk-exports.d.ts +2 -2
  168. package/dist/core/sdk-exports.js.map +1 -1
  169. package/dist/core/sdk-types.d.ts +3 -0
  170. package/dist/core/sdk-types.d.ts.map +1 -1
  171. package/dist/core/sdk-types.js.map +1 -1
  172. package/dist/core/sdk.d.ts.map +1 -1
  173. package/dist/core/sdk.js +17 -8
  174. package/dist/core/sdk.js.map +1 -1
  175. package/dist/core/session-manager-history.d.ts.map +1 -1
  176. package/dist/core/session-manager-history.js +4 -2
  177. package/dist/core/session-manager-history.js.map +1 -1
  178. package/dist/core/settings-manager-basic-accessors.d.ts +2 -0
  179. package/dist/core/settings-manager-basic-accessors.d.ts.map +1 -1
  180. package/dist/core/settings-manager-basic-accessors.js +29 -0
  181. package/dist/core/settings-manager-basic-accessors.js.map +1 -1
  182. package/dist/core/settings-manager-core.js.map +1 -1
  183. package/dist/core/settings-merge.d.ts +3 -0
  184. package/dist/core/settings-merge.d.ts.map +1 -1
  185. package/dist/core/settings-merge.js +18 -4
  186. package/dist/core/settings-merge.js.map +1 -1
  187. package/dist/core/settings-storage.js.map +1 -1
  188. package/dist/core/settings-types.d.ts +1 -0
  189. package/dist/core/settings-types.d.ts.map +1 -1
  190. package/dist/core/settings-types.js.map +1 -1
  191. package/dist/core/transcript.d.ts +58 -0
  192. package/dist/core/transcript.d.ts.map +1 -0
  193. package/dist/core/transcript.js +185 -0
  194. package/dist/core/transcript.js.map +1 -0
  195. package/dist/extensions/codemode/execute.d.ts.map +1 -1
  196. package/dist/extensions/codemode/execute.js +14 -1
  197. package/dist/extensions/codemode/execute.js.map +1 -1
  198. package/dist/extensions/codemode/tool.js +2 -2
  199. package/dist/extensions/codemode/tool.js.map +1 -1
  200. package/dist/extensions/herdr/index.d.ts.map +1 -1
  201. package/dist/extensions/herdr/index.js +15 -10
  202. package/dist/extensions/herdr/index.js.map +1 -1
  203. package/dist/extensions/herdr/pane-owner.d.ts +6 -2
  204. package/dist/extensions/herdr/pane-owner.d.ts.map +1 -1
  205. package/dist/extensions/herdr/pane-owner.js +19 -4
  206. package/dist/extensions/herdr/pane-owner.js.map +1 -1
  207. package/dist/extensions/llama/provider.d.ts.map +1 -1
  208. package/dist/extensions/llama/provider.js +19 -8
  209. package/dist/extensions/llama/provider.js.map +1 -1
  210. package/dist/extensions/mcp/cli.js +18 -24
  211. package/dist/extensions/mcp/cli.js.map +1 -1
  212. package/dist/extensions/mcp/client/auth-provider.d.ts +4 -0
  213. package/dist/extensions/mcp/client/auth-provider.d.ts.map +1 -1
  214. package/dist/extensions/mcp/client/auth-provider.js.map +1 -1
  215. package/dist/extensions/mcp/client/oauth/discovery.d.ts +3 -0
  216. package/dist/extensions/mcp/client/oauth/discovery.d.ts.map +1 -1
  217. package/dist/extensions/mcp/client/oauth/discovery.js +8 -5
  218. package/dist/extensions/mcp/client/oauth/discovery.js.map +1 -1
  219. package/dist/extensions/mcp/client/oauth/flow.d.ts +4 -0
  220. package/dist/extensions/mcp/client/oauth/flow.d.ts.map +1 -1
  221. package/dist/extensions/mcp/client/oauth/flow.js +12 -2
  222. package/dist/extensions/mcp/client/oauth/flow.js.map +1 -1
  223. package/dist/extensions/mcp/client/transports/streamable-http.d.ts +3 -0
  224. package/dist/extensions/mcp/client/transports/streamable-http.d.ts.map +1 -1
  225. package/dist/extensions/mcp/client/transports/streamable-http.js +17 -14
  226. package/dist/extensions/mcp/client/transports/streamable-http.js.map +1 -1
  227. package/dist/extensions/mcp/index.d.ts.map +1 -1
  228. package/dist/extensions/mcp/index.js +150 -72
  229. package/dist/extensions/mcp/index.js.map +1 -1
  230. package/dist/extensions/mcp/oauth.d.ts +5 -3
  231. package/dist/extensions/mcp/oauth.d.ts.map +1 -1
  232. package/dist/extensions/mcp/oauth.js +36 -10
  233. package/dist/extensions/mcp/oauth.js.map +1 -1
  234. package/dist/extensions/mcp/ui.d.ts +3 -3
  235. package/dist/extensions/mcp/ui.d.ts.map +1 -1
  236. package/dist/extensions/mcp/ui.js +10 -2
  237. package/dist/extensions/mcp/ui.js.map +1 -1
  238. package/dist/index.d.ts +3 -1
  239. package/dist/index.d.ts.map +1 -1
  240. package/dist/index.js +2 -0
  241. package/dist/index.js.map +1 -1
  242. package/dist/main-deferred-startup.d.ts +1 -0
  243. package/dist/main-deferred-startup.d.ts.map +1 -1
  244. package/dist/main-deferred-startup.js +9 -21
  245. package/dist/main-deferred-startup.js.map +1 -1
  246. package/dist/main.d.ts.map +1 -1
  247. package/dist/main.js +8 -6
  248. package/dist/main.js.map +1 -1
  249. package/dist/modes/interactive/components/compaction-boundary-message.d.ts +2 -0
  250. package/dist/modes/interactive/components/compaction-boundary-message.d.ts.map +1 -1
  251. package/dist/modes/interactive/components/compaction-boundary-message.js +15 -3
  252. package/dist/modes/interactive/components/compaction-boundary-message.js.map +1 -1
  253. package/dist/modes/interactive/components/settings-selector-items.d.ts.map +1 -1
  254. package/dist/modes/interactive/components/settings-selector-items.js +43 -0
  255. package/dist/modes/interactive/components/settings-selector-items.js.map +1 -1
  256. package/dist/modes/interactive/components/settings-selector-types.d.ts +6 -0
  257. package/dist/modes/interactive/components/settings-selector-types.d.ts.map +1 -1
  258. package/dist/modes/interactive/components/settings-selector-types.js.map +1 -1
  259. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  260. package/dist/modes/interactive/interactive-input-handling.d.ts.map +1 -1
  261. package/dist/modes/interactive/interactive-input-handling.js +1 -47
  262. package/dist/modes/interactive/interactive-input-handling.js.map +1 -1
  263. package/dist/modes/interactive/interactive-mode-base.d.ts +0 -1
  264. package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
  265. package/dist/modes/interactive/interactive-mode-base.js +0 -1
  266. package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
  267. package/dist/modes/interactive/interactive-mode-surface.d.ts +0 -1
  268. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
  269. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
  270. package/dist/modes/interactive/interactive-prompt-restore.d.ts.map +1 -1
  271. package/dist/modes/interactive/interactive-prompt-restore.js +0 -5
  272. package/dist/modes/interactive/interactive-prompt-restore.js.map +1 -1
  273. package/dist/modes/interactive/interactive-prompt-turn.js +6 -4
  274. package/dist/modes/interactive/interactive-prompt-turn.js.map +1 -1
  275. package/dist/modes/interactive/interactive-render-chat.js +13 -6
  276. package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
  277. package/dist/modes/interactive/interactive-selectors.js +8 -0
  278. package/dist/modes/interactive/interactive-selectors.js.map +1 -1
  279. package/dist/modes/interactive/interactive-session-runtime.js +2 -0
  280. package/dist/modes/interactive/interactive-session-runtime.js.map +1 -1
  281. package/dist/modes/interactive/interactive-startup.js +1 -1
  282. package/dist/modes/interactive/interactive-startup.js.map +1 -1
  283. package/dist/modes/rpc/rpc-client-process.d.ts +7 -0
  284. package/dist/modes/rpc/rpc-client-process.d.ts.map +1 -1
  285. package/dist/modes/rpc/rpc-client-process.js +20 -3
  286. package/dist/modes/rpc/rpc-client-process.js.map +1 -1
  287. package/dist/modes/rpc/rpc-command-timeouts.d.ts.map +1 -1
  288. package/dist/modes/rpc/rpc-command-timeouts.js +1 -0
  289. package/dist/modes/rpc/rpc-command-timeouts.js.map +1 -1
  290. package/dist/utils/ansi.d.ts +8 -0
  291. package/dist/utils/ansi.d.ts.map +1 -1
  292. package/dist/utils/ansi.js +29 -10
  293. package/dist/utils/ansi.js.map +1 -1
  294. package/dist/utils/clipboard.d.ts.map +1 -1
  295. package/dist/utils/clipboard.js +13 -3
  296. package/dist/utils/clipboard.js.map +1 -1
  297. package/dist/utils/credential-redaction.d.ts +2 -0
  298. package/dist/utils/credential-redaction.d.ts.map +1 -0
  299. package/dist/utils/credential-redaction.js +20 -0
  300. package/dist/utils/credential-redaction.js.map +1 -0
  301. package/dist/utils/image-resize-core.d.ts +8 -0
  302. package/dist/utils/image-resize-core.d.ts.map +1 -1
  303. package/dist/utils/image-resize-core.js +1 -0
  304. package/dist/utils/image-resize-core.js.map +1 -1
  305. package/dist/utils/image-resize-worker.js +3 -2
  306. package/dist/utils/image-resize-worker.js.map +1 -1
  307. package/dist/utils/image-resize.d.ts +2 -2
  308. package/dist/utils/image-resize.d.ts.map +1 -1
  309. package/dist/utils/image-resize.js +7 -10
  310. package/dist/utils/image-resize.js.map +1 -1
  311. package/docs/codemode.md +21 -1
  312. package/docs/compaction/reference.md +10 -4
  313. package/docs/compaction.md +40 -8
  314. package/docs/docs.json +1 -0
  315. package/docs/extensions/api-reference.md +4 -0
  316. package/docs/extensions/events.md +2 -2
  317. package/docs/llama-cpp.md +9 -2
  318. package/docs/mcp-servers.md +3 -3
  319. package/docs/models.md +10 -0
  320. package/docs/providers.md +39 -5
  321. package/docs/reference/cli.md +2 -2
  322. package/docs/sdk/reference.md +19 -4
  323. package/docs/sdk/web-server.md +325 -0
  324. package/docs/sdk.md +83 -1
  325. package/docs/security.md +1 -1
  326. package/docs/settings.md +2 -2
  327. package/docs/tools.md +1 -1
  328. package/docs/workflows/api-reference.md +71 -3
  329. package/docs/workflows/builtins.md +4 -0
  330. package/docs/workflows/operations.md +13 -5
  331. package/npm-shrinkwrap.json +32 -32
  332. package/package.json +3 -3
@@ -33,7 +33,7 @@ const INTRO = `Run JavaScript that composes tool calls in a fresh QuickJS worker
33
33
  Top-level await and return work. Use tools.name(args), or tools["raw-name"](args). Tool names normalize to JavaScript identifiers.
34
34
  No Node, filesystem, network, timers, modules or credentials are available directly. Calls go through session validation and permission hooks. They have real side effects and are not undone after script failure.
35
35
  Tools with output schemas resolve to structuredContent; others resolve to text. Failed or blocked calls throw. Scripts have a 256 MB memory limit.
36
- Globals: ALL_TOOLS, text(value), image(base64DataUrlOrImageContent), exit(), console.log(...), store(key, value), load(key), searchTools(query, {limit?, namespace?}), describeTool(name), describeNamespace(name).
36
+ Globals: ALL_TOOLS, text(value), image(base64DataUrlOrImageContent), exit(), console.log(...), store(key, value), load(key), await searchTools(query, {limit?, namespace?}), await describeTool(name), await describeNamespace(name).
37
37
  image() also saves each image to a temp file and the result names its path before the image.
38
38
  Successful scripts persist store writes on the current session branch; failed scripts discard writes. Unawaited calls are cancelled when the script ends.
39
39
  Optional first line: // @options: {"max_output_tokens": 1000, "timeout_ms": 60000}. Output defaults to 10000 tokens; there is no default deadline.`;
@@ -75,7 +75,7 @@ export function createCodemodeDescription(tools, options = {}) {
75
75
  });
76
76
  const sections = [
77
77
  INTRO,
78
- "Some nested tools may be omitted, including deferred tools. They remain available through tools and ALL_TOOLS. Use await searchTools(query), describeTool(name), or describeNamespace(name) to discover them.",
78
+ "Some nested tools may be omitted, including deferred tools. They remain available through tools and ALL_TOOLS. Use await searchTools(query), await describeTool(name), or await describeNamespace(name) to discover them.",
79
79
  ];
80
80
  if (options.models)
81
81
  sections.push(`Model API: \`models\` lists and runs classifier and image models with the session's credentials. Read ${CODEMODE_DOCS_PATH} before using it.`);
@@ -1 +1 @@
1
- {"version":3,"file":"tool.js","sourceRoot":"","sources":["../../../src/extensions/codemode/tool.ts"],"names":[],"mappings":"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","sourcesContent":["import { join } from \"node:path\";\nimport type { AgentTool } from \"@earendil-works/pi-agent-core\";\nimport type { CodemodeJsonSchema, CodemodeTool } from \"@earendil-works/pi-codemode\";\nimport {\n\tmcpStructuredContentSchema,\n\trenderToolOutputType,\n\trenderToolSample,\n\ttoCodemodeIdentifier,\n} from \"@earendil-works/pi-codemode/declarations\";\nimport { CODEMODE_SOURCE_GRAMMAR } from \"@earendil-works/pi-codemode/source\";\nimport { type Static, Type } from \"typebox\";\nimport { getDocsPath } from \"../../config.js\";\nimport type { ToolDefinition, ToolInfo, ToolLoadout, ToolNamespace } from \"../../core/extensions/types.ts\";\nimport type { ModelRegistry } from \"../../core/model-registry.ts\";\nimport type { CodemodeMode } from \"../../core/settings-manager.ts\";\nimport { wrapToolDefinition } from \"../../core/tools/tool-definition-wrapper.ts\";\nimport { codemodeRenderers } from \"./renderer.js\";\n\nexport const CODEMODE_TOOL_NAME = \"codemode\";\nexport const CODEMODE_DOCS_PATH = join(getDocsPath(), \"codemode.md\");\nexport const CODEMODE_STORE_ENTRY_TYPE = \"codemode-store\";\nexport const DEFAULT_CODEMODE_INLINE_BUDGET = 3000;\nexport interface CodemodeStoreEntryData {\n\tset: Record<string, unknown>;\n\tdelete: string[];\n}\nexport type CodemodeModelRuntime = Pick<\n\tModelRegistry,\n\t\"getModelsOfType\" | \"getAvailableOfType\" | \"getModelOfType\" | \"classify\" | \"generateImages\"\n>;\nexport interface CodemodeToolOptions {\n\tgetToolNamespace?: (name: string) => ToolNamespace | undefined;\n\t/** Prompt guidelines shown with tool declarations in describeTool() and ALL_TOOLS. */\n\tgetToolGuidelines?: () => ReadonlyMap<string, readonly string[]>;\n\tmodels?: boolean;\n\tappendEntry?: (type: string, data: CodemodeStoreEntryData) => void;\n\tgetMode?: () => CodemodeMode;\n\tgetInlineBudget?: () => number | undefined;\n}\nexport const codemodeSchema = Type.Object({\n\tcode: Type.String({\n\t\tdescription:\n\t\t\t'Raw JavaScript source with top-level await and return. Optional first line // @options: {\"max_output_tokens\": 1000, \"timeout_ms\": 60000}',\n\t}),\n});\nexport type CodemodeToolInput = Static<typeof codemodeSchema>;\nexport function isCodemodeTool(tool: Pick<ToolInfo, \"name\" | \"parameters\">): boolean {\n\treturn tool.name === CODEMODE_TOOL_NAME && tool.parameters === codemodeSchema;\n}\nexport interface CodemodeNestedCall {\n\tid: string;\n\tname: string;\n\targs: string;\n\tstatus: \"running\" | \"ok\" | \"error\" | \"cancelled\";\n\tdurationMs?: number;\n\terror?: string;\n\tcost?: number;\n}\nexport interface CodemodeToolDetails {\n\tcalls: CodemodeNestedCall[];\n\tfullOutputPath?: string;\n}\nexport function toCodemodeDeclaration(\n\ttool: AgentTool,\n\tguidelines: readonly string[] = [],\n): Omit<CodemodeTool, \"execute\"> {\n\tconst bullets = guidelines.flatMap((guideline) => (guideline.trim() ? [`- ${guideline.trim()}`] : []));\n\treturn {\n\t\tname: tool.name,\n\t\tdescription: bullets.length > 0 ? `${tool.description.trim()}\\n\\n${bullets.join(\"\\n\")}` : tool.description,\n\t\tinputSchema: tool.parameters as CodemodeJsonSchema,\n\t\toutputSchema: (tool.outputSchema as CodemodeJsonSchema | undefined) ?? { type: \"string\" },\n\t};\n}\nexport function getCodemodeCallableTools(tools: readonly AgentTool[]): AgentTool[] {\n\treturn tools.filter((tool) => tool.name !== CODEMODE_TOOL_NAME);\n}\nexport interface CodemodeDescriptionOptions {\n\tmodels?: boolean;\n\tnamespaces?: ReadonlyMap<string, ToolNamespace>;\n\tdeferred?: ReadonlySet<string>;\n\tguidelines?: ReadonlyMap<string, readonly string[]>;\n\tinlineBudget?: number;\n}\nconst INTRO = `Run JavaScript that composes tool calls in a fresh QuickJS worker sandbox.\nTop-level await and return work. Use tools.name(args), or tools[\"raw-name\"](args). Tool names normalize to JavaScript identifiers.\nNo Node, filesystem, network, timers, modules or credentials are available directly. Calls go through session validation and permission hooks. They have real side effects and are not undone after script failure.\nTools with output schemas resolve to structuredContent; others resolve to text. Failed or blocked calls throw. Scripts have a 256 MB memory limit.\nGlobals: ALL_TOOLS, text(value), image(base64DataUrlOrImageContent), exit(), console.log(...), store(key, value), load(key), searchTools(query, {limit?, namespace?}), describeTool(name), describeNamespace(name).\nimage() also saves each image to a temp file and the result names its path before the image.\nSuccessful scripts persist store writes on the current session branch; failed scripts discard writes. Unawaited calls are cancelled when the script ends.\nOptional first line: // @options: {\"max_output_tokens\": 1000, \"timeout_ms\": 60000}. Output defaults to 10000 tokens; there is no default deadline.`;\n\nexport function createCodemodeDescription(\n\ttools: readonly AgentTool[],\n\toptions: CodemodeDescriptionOptions = {},\n): string {\n\tconst groups = new Map<\n\t\tstring,\n\t\t{ namespace?: ToolNamespace; entries: { name: string; section: string; cost: number }[] }\n\t>();\n\tfor (const tool of getCodemodeCallableTools(tools)) {\n\t\tif (options.deferred?.has(tool.name)) continue;\n\t\tconst namespace = options.namespaces?.get(tool.name);\n\t\tconst key = namespace?.name ?? \"\";\n\t\tlet group = groups.get(key);\n\t\tif (!group) {\n\t\t\tgroup = { namespace, entries: [] };\n\t\t\tgroups.set(key, group);\n\t\t}\n\t\tconst id = toCodemodeIdentifier(tool.name);\n\t\tconst section = `### \\`${id}\\`${id === tool.name ? \"\" : ` (\\`${tool.name}\\`)`}\\n${renderToolSample(toCodemodeDeclaration(tool, options.guidelines?.get(tool.name))).trim()}`;\n\t\tgroup.entries.push({\n\t\t\tname: tool.name,\n\t\t\tsection,\n\t\t\tcost: Math.ceil(section.length / 4),\n\t\t});\n\t}\n\tconst ordered = [...groups.values()].sort((a, b) =>\n\t\ta.namespace === undefined ? -1 : b.namespace === undefined ? 1 : a.namespace.name.localeCompare(b.namespace.name),\n\t);\n\tconst shown = new Set<string>();\n\tlet remaining = options.inlineBudget ?? Number.POSITIVE_INFINITY;\n\tlet queues = ordered\n\t\t.map((group) => [...group.entries].sort((a, b) => a.cost - b.cost))\n\t\t.filter((queue) => queue.length);\n\twhile (queues.length)\n\t\tqueues = queues.filter((queue) => {\n\t\t\tconst next = queue[0];\n\t\t\tif (next.cost > remaining) return false;\n\t\t\tremaining -= next.cost;\n\t\t\tshown.add(next.name);\n\t\t\tqueue.shift();\n\t\t\treturn queue.length > 0;\n\t\t});\n\tconst sections = [\n\t\tINTRO,\n\t\t\"Some nested tools may be omitted, including deferred tools. They remain available through tools and ALL_TOOLS. Use await searchTools(query), describeTool(name), or describeNamespace(name) to discover them.\",\n\t];\n\tif (options.models)\n\t\tsections.push(\n\t\t\t`Model API: \\`models\\` lists and runs classifier and image models with the session's credentials. Read ${CODEMODE_DOCS_PATH} before using it.`,\n\t\t);\n\tif (ordered.length === 0) return sections.join(\"\\n\\n\");\n\tsections.push(\"Nested tools:\");\n\tfor (const group of ordered) {\n\t\tif (group.namespace) {\n\t\t\tconst visible = group.entries.filter((entry) => shown.has(entry.name));\n\t\t\tconst listing =\n\t\t\t\tvisible.length === group.entries.length\n\t\t\t\t\t? \"\"\n\t\t\t\t\t: visible.length === 0\n\t\t\t\t\t\t? \" (tools not listed)\"\n\t\t\t\t\t\t: \" (some tools not listed)\";\n\t\t\tconst description = group.namespace.description?.trim();\n\t\t\tsections.push(`## ${group.namespace.name}${listing}${description ? `\\n${description}` : \"\"}`);\n\t\t}\n\t\tfor (const entry of group.entries) if (shown.has(entry.name)) sections.push(entry.section);\n\t}\n\treturn sections.join(\"\\n\\n\");\n}\nfunction describeOutput(schema: CodemodeJsonSchema | undefined): string {\n\tconst type = renderToolOutputType(schema);\n\tif (type === \"string\") return \"a string\";\n\tconst object = typeof schema === \"object\" ? schema : undefined;\n\tconst properties = object?.properties;\n\tif (\n\t\tobject?.type === \"object\" &&\n\t\ttypeof properties === \"object\" &&\n\t\tproperties !== null &&\n\t\tmcpStructuredContentSchema(schema) === undefined\n\t) {\n\t\tconst required = new Set(Array.isArray(object.required) ? object.required : []);\n\t\tconst fields = Object.keys(properties).map((name) => (required.has(name) ? name : `${name}?`));\n\t\treturn `\\`{ ${fields.join(\", \")} }\\``;\n\t}\n\treturn `\\`${type.replace(/\\s+/g, \" \")}\\``;\n}\nfunction describeScriptCall(tool: AgentTool): string {\n\treturn `${tool.description.trim()}\\n\\nCodemode: \\`tools.${toCodemodeIdentifier(tool.name)}(args)\\` resolves to ${describeOutput(toCodemodeDeclaration(tool).outputSchema)}.`;\n}\nfunction prepareLoadout(loadout: ToolLoadout, options: CodemodeToolOptions) {\n\tconst only = options.getMode?.() === \"only\";\n\tconst callable = getCodemodeCallableTools(loadout.callable);\n\tconst descriptions: Record<string, string> = {};\n\tif (!only)\n\t\tfor (const tool of loadout.declared)\n\t\t\tif (callable.some((candidate) => candidate.name === tool.name))\n\t\t\t\tdescriptions[tool.name] = describeScriptCall(tool);\n\tconst listed = only ? callable : callable.filter((tool) => loadout.getExposure(tool.name) !== \"direct\");\n\tconst namespaces = new Map(\n\t\tlisted.flatMap((tool) => {\n\t\t\tconst namespace = loadout.getNamespace(tool.name);\n\t\t\treturn namespace ? [[tool.name, namespace] as const] : [];\n\t\t}),\n\t);\n\tconst guidelines = new Map(listed.map((tool) => [tool.name, loadout.getPromptGuidelines(tool.name)] as const));\n\tdescriptions[CODEMODE_TOOL_NAME] = createCodemodeDescription(listed, {\n\t\tmodels: options.models,\n\t\tnamespaces,\n\t\tguidelines,\n\t\tdeferred: new Set(\n\t\t\tlisted.filter((tool) => loadout.getExposure(tool.name) === \"deferred\").map((tool) => tool.name),\n\t\t),\n\t\tinlineBudget: options.getInlineBudget?.() ?? DEFAULT_CODEMODE_INLINE_BUDGET,\n\t});\n\treturn {\n\t\tdescriptions,\n\t\thiddenDeclarations: only\n\t\t\t? callable.filter((tool) => loadout.getExposure(tool.name) === \"direct\").map((tool) => tool.name)\n\t\t\t: [],\n\t};\n}\nexport function createCodemodeToolDefinition(\n\toptions: CodemodeToolOptions = {},\n): ToolDefinition<typeof codemodeSchema, CodemodeToolDetails> {\n\treturn {\n\t\tname: CODEMODE_TOOL_NAME,\n\t\tlabel: CODEMODE_TOOL_NAME,\n\t\tdescription: createCodemodeDescription([], options),\n\t\tparameters: codemodeSchema,\n\t\texposure: \"model-only\",\n\t\tconcurrency: \"exclusive\",\n\t\tdefaultActive: false,\n\t\tpromptSnippet: \"Run JavaScript that calls other tools, filters results, or batches independent calls\",\n\t\tprepareLoadout: (loadout) => prepareLoadout(loadout, options),\n\t\tconstrainedSampling: { type: \"grammar\", variants: { openai_lark: CODEMODE_SOURCE_GRAMMAR } },\n\t\texecute: async (id, input, signal, update, ctx) =>\n\t\t\t(await import(\"./execute.js\")).executeCodemode(id, input, signal, update, ctx, options),\n\t\t...codemodeRenderers,\n\t};\n}\nexport function createCodemodeTool(\n\ttools: readonly AgentTool[] = [],\n\toptions: CodemodeToolOptions = {},\n): AgentTool<typeof codemodeSchema> {\n\treturn {\n\t\t...wrapToolDefinition(createCodemodeToolDefinition(options)),\n\t\tdescription: createCodemodeDescription(tools, options),\n\t};\n}\n"]}
1
+ {"version":3,"file":"tool.js","sourceRoot":"","sources":["../../../src/extensions/codemode/tool.ts"],"names":[],"mappings":"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","sourcesContent":["import { join } from \"node:path\";\nimport type { AgentTool } from \"@earendil-works/pi-agent-core\";\nimport type { CodemodeJsonSchema, CodemodeTool } from \"@earendil-works/pi-codemode\";\nimport {\n\tmcpStructuredContentSchema,\n\trenderToolOutputType,\n\trenderToolSample,\n\ttoCodemodeIdentifier,\n} from \"@earendil-works/pi-codemode/declarations\";\nimport { CODEMODE_SOURCE_GRAMMAR } from \"@earendil-works/pi-codemode/source\";\nimport { type Static, Type } from \"typebox\";\nimport { getDocsPath } from \"../../config.js\";\nimport type { ToolDefinition, ToolInfo, ToolLoadout, ToolNamespace } from \"../../core/extensions/types.ts\";\nimport type { ModelRegistry } from \"../../core/model-registry.ts\";\nimport type { CodemodeMode } from \"../../core/settings-manager.ts\";\nimport { wrapToolDefinition } from \"../../core/tools/tool-definition-wrapper.ts\";\nimport { codemodeRenderers } from \"./renderer.js\";\n\nexport const CODEMODE_TOOL_NAME = \"codemode\";\nexport const CODEMODE_DOCS_PATH = join(getDocsPath(), \"codemode.md\");\nexport const CODEMODE_STORE_ENTRY_TYPE = \"codemode-store\";\nexport const DEFAULT_CODEMODE_INLINE_BUDGET = 3000;\nexport interface CodemodeStoreEntryData {\n\tset: Record<string, unknown>;\n\tdelete: string[];\n}\nexport type CodemodeModelRuntime = Pick<\n\tModelRegistry,\n\t\"getModelsOfType\" | \"getAvailableOfType\" | \"getModelOfType\" | \"classify\" | \"generateImages\"\n>;\nexport interface CodemodeToolOptions {\n\tgetToolNamespace?: (name: string) => ToolNamespace | undefined;\n\t/** Prompt guidelines shown with tool declarations in describeTool() and ALL_TOOLS. */\n\tgetToolGuidelines?: () => ReadonlyMap<string, readonly string[]>;\n\tmodels?: boolean;\n\tappendEntry?: (type: string, data: CodemodeStoreEntryData) => void;\n\tgetMode?: () => CodemodeMode;\n\tgetInlineBudget?: () => number | undefined;\n}\nexport const codemodeSchema = Type.Object({\n\tcode: Type.String({\n\t\tdescription:\n\t\t\t'Raw JavaScript source with top-level await and return. Optional first line // @options: {\"max_output_tokens\": 1000, \"timeout_ms\": 60000}',\n\t}),\n});\nexport type CodemodeToolInput = Static<typeof codemodeSchema>;\nexport function isCodemodeTool(tool: Pick<ToolInfo, \"name\" | \"parameters\">): boolean {\n\treturn tool.name === CODEMODE_TOOL_NAME && tool.parameters === codemodeSchema;\n}\nexport interface CodemodeNestedCall {\n\tid: string;\n\tname: string;\n\targs: string;\n\tstatus: \"running\" | \"ok\" | \"error\" | \"cancelled\";\n\tdurationMs?: number;\n\terror?: string;\n\tcost?: number;\n}\nexport interface CodemodeToolDetails {\n\tcalls: CodemodeNestedCall[];\n\tfullOutputPath?: string;\n}\nexport function toCodemodeDeclaration(\n\ttool: AgentTool,\n\tguidelines: readonly string[] = [],\n): Omit<CodemodeTool, \"execute\"> {\n\tconst bullets = guidelines.flatMap((guideline) => (guideline.trim() ? [`- ${guideline.trim()}`] : []));\n\treturn {\n\t\tname: tool.name,\n\t\tdescription: bullets.length > 0 ? `${tool.description.trim()}\\n\\n${bullets.join(\"\\n\")}` : tool.description,\n\t\tinputSchema: tool.parameters as CodemodeJsonSchema,\n\t\toutputSchema: (tool.outputSchema as CodemodeJsonSchema | undefined) ?? { type: \"string\" },\n\t};\n}\nexport function getCodemodeCallableTools(tools: readonly AgentTool[]): AgentTool[] {\n\treturn tools.filter((tool) => tool.name !== CODEMODE_TOOL_NAME);\n}\nexport interface CodemodeDescriptionOptions {\n\tmodels?: boolean;\n\tnamespaces?: ReadonlyMap<string, ToolNamespace>;\n\tdeferred?: ReadonlySet<string>;\n\tguidelines?: ReadonlyMap<string, readonly string[]>;\n\tinlineBudget?: number;\n}\nconst INTRO = `Run JavaScript that composes tool calls in a fresh QuickJS worker sandbox.\nTop-level await and return work. Use tools.name(args), or tools[\"raw-name\"](args). Tool names normalize to JavaScript identifiers.\nNo Node, filesystem, network, timers, modules or credentials are available directly. Calls go through session validation and permission hooks. They have real side effects and are not undone after script failure.\nTools with output schemas resolve to structuredContent; others resolve to text. Failed or blocked calls throw. Scripts have a 256 MB memory limit.\nGlobals: ALL_TOOLS, text(value), image(base64DataUrlOrImageContent), exit(), console.log(...), store(key, value), load(key), await searchTools(query, {limit?, namespace?}), await describeTool(name), await describeNamespace(name).\nimage() also saves each image to a temp file and the result names its path before the image.\nSuccessful scripts persist store writes on the current session branch; failed scripts discard writes. Unawaited calls are cancelled when the script ends.\nOptional first line: // @options: {\"max_output_tokens\": 1000, \"timeout_ms\": 60000}. Output defaults to 10000 tokens; there is no default deadline.`;\n\nexport function createCodemodeDescription(\n\ttools: readonly AgentTool[],\n\toptions: CodemodeDescriptionOptions = {},\n): string {\n\tconst groups = new Map<\n\t\tstring,\n\t\t{ namespace?: ToolNamespace; entries: { name: string; section: string; cost: number }[] }\n\t>();\n\tfor (const tool of getCodemodeCallableTools(tools)) {\n\t\tif (options.deferred?.has(tool.name)) continue;\n\t\tconst namespace = options.namespaces?.get(tool.name);\n\t\tconst key = namespace?.name ?? \"\";\n\t\tlet group = groups.get(key);\n\t\tif (!group) {\n\t\t\tgroup = { namespace, entries: [] };\n\t\t\tgroups.set(key, group);\n\t\t}\n\t\tconst id = toCodemodeIdentifier(tool.name);\n\t\tconst section = `### \\`${id}\\`${id === tool.name ? \"\" : ` (\\`${tool.name}\\`)`}\\n${renderToolSample(toCodemodeDeclaration(tool, options.guidelines?.get(tool.name))).trim()}`;\n\t\tgroup.entries.push({\n\t\t\tname: tool.name,\n\t\t\tsection,\n\t\t\tcost: Math.ceil(section.length / 4),\n\t\t});\n\t}\n\tconst ordered = [...groups.values()].sort((a, b) =>\n\t\ta.namespace === undefined ? -1 : b.namespace === undefined ? 1 : a.namespace.name.localeCompare(b.namespace.name),\n\t);\n\tconst shown = new Set<string>();\n\tlet remaining = options.inlineBudget ?? Number.POSITIVE_INFINITY;\n\tlet queues = ordered\n\t\t.map((group) => [...group.entries].sort((a, b) => a.cost - b.cost))\n\t\t.filter((queue) => queue.length);\n\twhile (queues.length)\n\t\tqueues = queues.filter((queue) => {\n\t\t\tconst next = queue[0];\n\t\t\tif (next.cost > remaining) return false;\n\t\t\tremaining -= next.cost;\n\t\t\tshown.add(next.name);\n\t\t\tqueue.shift();\n\t\t\treturn queue.length > 0;\n\t\t});\n\tconst sections = [\n\t\tINTRO,\n\t\t\"Some nested tools may be omitted, including deferred tools. They remain available through tools and ALL_TOOLS. Use await searchTools(query), await describeTool(name), or await describeNamespace(name) to discover them.\",\n\t];\n\tif (options.models)\n\t\tsections.push(\n\t\t\t`Model API: \\`models\\` lists and runs classifier and image models with the session's credentials. Read ${CODEMODE_DOCS_PATH} before using it.`,\n\t\t);\n\tif (ordered.length === 0) return sections.join(\"\\n\\n\");\n\tsections.push(\"Nested tools:\");\n\tfor (const group of ordered) {\n\t\tif (group.namespace) {\n\t\t\tconst visible = group.entries.filter((entry) => shown.has(entry.name));\n\t\t\tconst listing =\n\t\t\t\tvisible.length === group.entries.length\n\t\t\t\t\t? \"\"\n\t\t\t\t\t: visible.length === 0\n\t\t\t\t\t\t? \" (tools not listed)\"\n\t\t\t\t\t\t: \" (some tools not listed)\";\n\t\t\tconst description = group.namespace.description?.trim();\n\t\t\tsections.push(`## ${group.namespace.name}${listing}${description ? `\\n${description}` : \"\"}`);\n\t\t}\n\t\tfor (const entry of group.entries) if (shown.has(entry.name)) sections.push(entry.section);\n\t}\n\treturn sections.join(\"\\n\\n\");\n}\nfunction describeOutput(schema: CodemodeJsonSchema | undefined): string {\n\tconst type = renderToolOutputType(schema);\n\tif (type === \"string\") return \"a string\";\n\tconst object = typeof schema === \"object\" ? schema : undefined;\n\tconst properties = object?.properties;\n\tif (\n\t\tobject?.type === \"object\" &&\n\t\ttypeof properties === \"object\" &&\n\t\tproperties !== null &&\n\t\tmcpStructuredContentSchema(schema) === undefined\n\t) {\n\t\tconst required = new Set(Array.isArray(object.required) ? object.required : []);\n\t\tconst fields = Object.keys(properties).map((name) => (required.has(name) ? name : `${name}?`));\n\t\treturn `\\`{ ${fields.join(\", \")} }\\``;\n\t}\n\treturn `\\`${type.replace(/\\s+/g, \" \")}\\``;\n}\nfunction describeScriptCall(tool: AgentTool): string {\n\treturn `${tool.description.trim()}\\n\\nCodemode: \\`tools.${toCodemodeIdentifier(tool.name)}(args)\\` resolves to ${describeOutput(toCodemodeDeclaration(tool).outputSchema)}.`;\n}\nfunction prepareLoadout(loadout: ToolLoadout, options: CodemodeToolOptions) {\n\tconst only = options.getMode?.() === \"only\";\n\tconst callable = getCodemodeCallableTools(loadout.callable);\n\tconst descriptions: Record<string, string> = {};\n\tif (!only)\n\t\tfor (const tool of loadout.declared)\n\t\t\tif (callable.some((candidate) => candidate.name === tool.name))\n\t\t\t\tdescriptions[tool.name] = describeScriptCall(tool);\n\tconst listed = only ? callable : callable.filter((tool) => loadout.getExposure(tool.name) !== \"direct\");\n\tconst namespaces = new Map(\n\t\tlisted.flatMap((tool) => {\n\t\t\tconst namespace = loadout.getNamespace(tool.name);\n\t\t\treturn namespace ? [[tool.name, namespace] as const] : [];\n\t\t}),\n\t);\n\tconst guidelines = new Map(listed.map((tool) => [tool.name, loadout.getPromptGuidelines(tool.name)] as const));\n\tdescriptions[CODEMODE_TOOL_NAME] = createCodemodeDescription(listed, {\n\t\tmodels: options.models,\n\t\tnamespaces,\n\t\tguidelines,\n\t\tdeferred: new Set(\n\t\t\tlisted.filter((tool) => loadout.getExposure(tool.name) === \"deferred\").map((tool) => tool.name),\n\t\t),\n\t\tinlineBudget: options.getInlineBudget?.() ?? DEFAULT_CODEMODE_INLINE_BUDGET,\n\t});\n\treturn {\n\t\tdescriptions,\n\t\thiddenDeclarations: only\n\t\t\t? callable.filter((tool) => loadout.getExposure(tool.name) === \"direct\").map((tool) => tool.name)\n\t\t\t: [],\n\t};\n}\nexport function createCodemodeToolDefinition(\n\toptions: CodemodeToolOptions = {},\n): ToolDefinition<typeof codemodeSchema, CodemodeToolDetails> {\n\treturn {\n\t\tname: CODEMODE_TOOL_NAME,\n\t\tlabel: CODEMODE_TOOL_NAME,\n\t\tdescription: createCodemodeDescription([], options),\n\t\tparameters: codemodeSchema,\n\t\texposure: \"model-only\",\n\t\tconcurrency: \"exclusive\",\n\t\tdefaultActive: false,\n\t\tpromptSnippet: \"Run JavaScript that calls other tools, filters results, or batches independent calls\",\n\t\tprepareLoadout: (loadout) => prepareLoadout(loadout, options),\n\t\tconstrainedSampling: { type: \"grammar\", variants: { openai_lark: CODEMODE_SOURCE_GRAMMAR } },\n\t\texecute: async (id, input, signal, update, ctx) =>\n\t\t\t(await import(\"./execute.js\")).executeCodemode(id, input, signal, update, ctx, options),\n\t\t...codemodeRenderers,\n\t};\n}\nexport function createCodemodeTool(\n\ttools: readonly AgentTool[] = [],\n\toptions: CodemodeToolOptions = {},\n): AgentTool<typeof codemodeSchema> {\n\treturn {\n\t\t...wrapToolDefinition(createCodemodeToolDefinition(options)),\n\t\tdescription: createCodemodeDescription(tools, options),\n\t};\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/extensions/herdr/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAMvG,OAAO,EAGN,KAAK,oBAAoB,EAIzB,MAAM,iBAAiB,CAAC;AAGzB,MAAM,WAAW,qBAAsB,SAAQ,oBAAoB;IAClE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,OAAO,CAAC;CAC7C;AAOD,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,qBAA0B,GAAG,gBAAgB,CAoL1F;AAED,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAE7D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/extensions/herdr/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAMvG,OAAO,EAGN,KAAK,oBAAoB,EAIzB,MAAM,iBAAiB,CAAC;AAGzB,MAAM,WAAW,qBAAsB,SAAQ,oBAAoB;IAClE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,OAAO,CAAC;CAC7C;AAOD,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,qBAA0B,GAAG,gBAAgB,CAsL1F;AAED,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAE7D"}
@@ -26,14 +26,14 @@ export function createHerdrExtension(options = {}) {
26
26
  let availability = "unavailable";
27
27
  const roots = new Map();
28
28
  const acknowledgedBlocks = new Map();
29
+ const sameSummary = (left, right) => left.state === right.state &&
30
+ left.reason === right.reason &&
31
+ left.actionableBlockCount === right.actionableBlockCount &&
32
+ left.activeExecutionCount === right.activeExecutionCount &&
33
+ left.needsAttention === right.needsAttention;
29
34
  const updateRoot = (root) => {
30
35
  const acknowledged = acknowledgedBlocks.get(root.rootRunId);
31
- if (acknowledged &&
32
- (root.state !== acknowledged.state ||
33
- root.reason !== acknowledged.reason ||
34
- root.actionableBlockCount !== acknowledged.actionableBlockCount ||
35
- root.activeExecutionCount !== acknowledged.activeExecutionCount ||
36
- root.needsAttention !== acknowledged.needsAttention))
36
+ if (acknowledged && !sameSummary(root, acknowledged))
37
37
  acknowledgedBlocks.delete(root.rootRunId);
38
38
  roots.set(root.rootRunId, root);
39
39
  };
@@ -50,7 +50,7 @@ export function createHerdrExtension(options = {}) {
50
50
  console.error(`[Herdr] ${value.kind}${value.owner ? `: deferring to ${value.owner}` : ""}`);
51
51
  };
52
52
  const tasksRunning = () => taskStore?.tasks.some((task) => task.execution.kind !== "settled") ?? false;
53
- const report = () => {
53
+ const report = (skipUnchanged = false) => {
54
54
  if (!owner)
55
55
  return;
56
56
  const activity = deriveSessionActivity({
@@ -61,7 +61,7 @@ export function createHerdrExtension(options = {}) {
61
61
  availability,
62
62
  });
63
63
  if (activity)
64
- reportPaneActivity(owner, activity);
64
+ reportPaneActivity(owner, activity, skipUnchanged);
65
65
  };
66
66
  const start = async (ctx) => {
67
67
  const runner = getExtensionContextOwner(ctx);
@@ -126,13 +126,18 @@ export function createHerdrExtension(options = {}) {
126
126
  acknowledgedBlocks.delete(id);
127
127
  }
128
128
  }
129
- else if (frame.kind === "changed")
129
+ else if (frame.kind === "changed") {
130
+ const previous = roots.get(frame.root.rootRunId);
130
131
  updateRoot(frame.root);
132
+ // Graph-only changes do not alter the pane state; skip the redundant report.
133
+ if (previous && sameSummary(previous, frame.root))
134
+ return;
135
+ }
131
136
  else {
132
137
  roots.delete(frame.rootRunId);
133
138
  acknowledgedBlocks.delete(frame.rootRunId);
134
139
  }
135
- report();
140
+ report(frame.kind === "snapshot");
136
141
  });
137
142
  };
138
143
  pi.on("session_start", (_event, ctx) => publishExtensionContextEffect(ctx, () => start(ctx)));
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extensions/herdr/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { getExtensionContextOwner, publishExtensionContextEffect } from \"../../core/extensions/runner-context.ts\";\nimport type { ExtensionAPI, ExtensionContext, ExtensionFactory } from \"../../core/extensions/types.ts\";\nimport type { WorkflowRootActivity } from \"../../core/extensions/workflow-events.js\";\nimport { SettingsManager } from \"../../core/settings-manager.ts\";\nimport { OwnerTaskStore } from \"../../core/tasks/owner-store.js\";\nimport { deriveSessionActivity } from \"./activity.js\";\nimport { captureHerdrEnvironment } from \"./environment.js\";\nimport {\n\tclaimPaneReporting,\n\ttype PaneOwner,\n\ttype PaneReportingOptions,\n\treleasePaneReporting,\n\treportPaneActivity,\n\tretirePaneReporting,\n} from \"./pane-owner.js\";\nimport type { HerdrDiagnostic } from \"./transport.js\";\n\nexport interface HerdrExtensionOptions extends PaneReportingOptions {\n\tenv?: NodeJS.ProcessEnv;\n\tenabled?: (ctx: ExtensionContext) => boolean;\n}\n\nfunction enabled(ctx: ExtensionContext): boolean {\n\tconst settings = SettingsManager.create(ctx.cwd, undefined, { projectTrusted: ctx.isProjectTrusted() });\n\treturn (settings.getProjectSettings().herdr?.enabled ?? settings.getGlobalSettings().herdr?.enabled) !== false;\n}\n\nexport function createHerdrExtension(options: HerdrExtensionOptions = {}): ExtensionFactory {\n\treturn (pi) => {\n\t\tif (!captureHerdrEnvironment(options.env ?? process.env)) return;\n\t\tlet owner: PaneOwner | undefined;\n\t\t// Supplied loaders can share closures across sessions and overlapping reload runners.\n\t\tlet boundSessionManager: ExtensionContext[\"sessionManager\"] | undefined;\n\t\tlet boundRunner: object | undefined;\n\t\tconst retiredRunners = new WeakSet<object>();\n\t\tconst ownsBinding = (ctx: ExtensionContext) =>\n\t\t\tboundSessionManager !== undefined && getExtensionContextOwner(ctx) === boundRunner;\n\t\tlet lease: { dispose(): void } | undefined;\n\t\tlet taskStore: OwnerTaskStore | undefined;\n\t\tlet unsubscribeTasks: (() => void) | undefined;\n\t\tlet agentRunning = false;\n\t\tlet openPromptCount = 0;\n\t\tlet availability: \"ready\" | \"unavailable\" | \"recovering\" = \"unavailable\";\n\t\tconst roots = new Map<string, WorkflowRootActivity>();\n\t\tconst acknowledgedBlocks = new Map<string, WorkflowRootActivity>();\n\t\tconst updateRoot = (root: WorkflowRootActivity) => {\n\t\t\tconst acknowledged = acknowledgedBlocks.get(root.rootRunId);\n\t\t\tif (\n\t\t\t\tacknowledged &&\n\t\t\t\t(root.state !== acknowledged.state ||\n\t\t\t\t\troot.reason !== acknowledged.reason ||\n\t\t\t\t\troot.actionableBlockCount !== acknowledged.actionableBlockCount ||\n\t\t\t\t\troot.activeExecutionCount !== acknowledged.activeExecutionCount ||\n\t\t\t\t\troot.needsAttention !== acknowledged.needsAttention)\n\t\t\t)\n\t\t\t\tacknowledgedBlocks.delete(root.rootRunId);\n\t\t\troots.set(root.rootRunId, root);\n\t\t};\n\t\tconst seenDiagnostics = new Set<string>();\n\t\tlet generation = 0;\n\t\tconst diagnostic = (value: HerdrDiagnostic) => {\n\t\t\tconst key = `${value.kind}:${value.owner ?? \"\"}`;\n\t\t\tif (seenDiagnostics.has(key)) return;\n\t\t\tseenDiagnostics.add(key);\n\t\t\tif (options.diagnostic) options.diagnostic(value);\n\t\t\telse console.error(`[Herdr] ${value.kind}${value.owner ? `: deferring to ${value.owner}` : \"\"}`);\n\t\t};\n\t\tconst tasksRunning = () => taskStore?.tasks.some((task) => task.execution.kind !== \"settled\") ?? false;\n\t\tconst report = () => {\n\t\t\tif (!owner) return;\n\t\t\tconst activity = deriveSessionActivity({\n\t\t\t\tagentRunning,\n\t\t\t\ttasksRunning: tasksRunning(),\n\t\t\t\topenPromptCount,\n\t\t\t\troots: [...roots.values()].filter((root) => !acknowledgedBlocks.has(root.rootRunId)),\n\t\t\t\tavailability,\n\t\t\t});\n\t\t\tif (activity) reportPaneActivity(owner, activity);\n\t\t};\n\t\tconst start = async (ctx: ExtensionContext) => {\n\t\t\tconst runner = getExtensionContextOwner(ctx);\n\t\t\tif (retiredRunners.has(runner)) return;\n\t\t\tif (boundSessionManager && ctx.sessionManager !== boundSessionManager) return;\n\t\t\tconst environment = captureHerdrEnvironment(options.env ?? process.env);\n\t\t\tif (!environment || ctx.mode !== \"tui\" || !ctx.hasUI || ctx.subagentPolicy || ctx.orchestrationContext) return;\n\t\t\tif (!(options.enabled ?? enabled)(ctx)) return;\n\t\t\tif (boundRunner && boundRunner !== runner) retiredRunners.add(boundRunner);\n\t\t\tboundRunner = runner;\n\t\t\tboundSessionManager = ctx.sessionManager;\n\t\t\tconst current = ++generation;\n\t\t\tlease?.dispose();\n\t\t\tlease = undefined;\n\t\t\tunsubscribeTasks?.();\n\t\t\ttaskStore?.dispose();\n\t\t\tunsubscribeTasks = undefined;\n\t\t\ttaskStore = undefined;\n\t\t\topenPromptCount = 0;\n\t\t\troots.clear();\n\t\t\tacknowledgedBlocks.clear();\n\t\t\tavailability = \"unavailable\";\n\t\t\tconst claimed = await claimPaneReporting(\n\t\t\t\tenvironment,\n\t\t\t\t{ id: ctx.sessionManager.getSessionId(), path: ctx.sessionManager.getSessionFile() },\n\t\t\t\t{ ...options, diagnostic },\n\t\t\t);\n\t\t\tif (current !== generation) {\n\t\t\t\tawait releasePaneReporting(claimed);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\towner = claimed;\n\t\t\tagentRunning = !ctx.isIdle();\n\t\t\tconst taskHost = ctx.getAgentTaskHost?.();\n\t\t\tif (taskHost) {\n\t\t\t\tconst { supervisor, owner: taskOwner } = taskHost.ownerBinding;\n\t\t\t\ttaskStore = new OwnerTaskStore(supervisor, taskOwner);\n\t\t\t\ttaskStore.connect();\n\t\t\t\tlet running = tasksRunning();\n\t\t\t\tunsubscribeTasks = taskStore.subscribe(() => {\n\t\t\t\t\tif (current !== generation) return;\n\t\t\t\t\tconst next = tasksRunning();\n\t\t\t\t\tif (next === running) return;\n\t\t\t\t\trunning = next;\n\t\t\t\t\treport();\n\t\t\t\t});\n\t\t\t}\n\t\t\tlease = ctx.observeWorkflowActivity((frame) => {\n\t\t\t\tif (current !== generation) return;\n\t\t\t\tif (frame.kind === \"snapshot\") {\n\t\t\t\t\tavailability = frame.availability;\n\t\t\t\t\troots.clear();\n\t\t\t\t\tif (frame.availability === \"ready\") {\n\t\t\t\t\t\tfor (const root of frame.roots) updateRoot(root);\n\t\t\t\t\t\tfor (const id of acknowledgedBlocks.keys()) if (!roots.has(id)) acknowledgedBlocks.delete(id);\n\t\t\t\t\t}\n\t\t\t\t} else if (frame.kind === \"changed\") updateRoot(frame.root);\n\t\t\t\telse {\n\t\t\t\t\troots.delete(frame.rootRunId);\n\t\t\t\t\tacknowledgedBlocks.delete(frame.rootRunId);\n\t\t\t\t}\n\t\t\t\treport();\n\t\t\t});\n\t\t};\n\t\tpi.on(\"session_start\", (_event, ctx) => publishExtensionContextEffect(ctx, () => start(ctx)));\n\t\tpi.on(\"input\", (event, ctx) => {\n\t\t\tif (!ownsBinding(ctx) || event.source !== \"interactive\") return;\n\t\t\tlet changed = false;\n\t\t\tfor (const root of roots.values()) {\n\t\t\t\tif (root.state === \"blocked\" && !acknowledgedBlocks.has(root.rootRunId)) {\n\t\t\t\t\tacknowledgedBlocks.set(root.rootRunId, { ...root });\n\t\t\t\t\tchanged = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (changed) report();\n\t\t});\n\t\tpi.on(\"workflow_lifecycle\", (event, ctx) => {\n\t\t\tif (!ownsBinding(ctx) || event.delivery !== \"live\") return;\n\t\t\tconst target = event.target;\n\t\t\tconst newBlock =\n\t\t\t\ttarget.kind === \"prompt\"\n\t\t\t\t\t? target.status === \"opened\"\n\t\t\t\t\t: (target.kind === \"run\" || target.kind === \"stage\") &&\n\t\t\t\t\t\t(target.status === \"blocked\" || target.status === \"awaiting_input\") &&\n\t\t\t\t\t\ttarget.previousStatus !== target.status;\n\t\t\tif (newBlock && acknowledgedBlocks.delete(event.rootRunId)) report();\n\t\t});\n\t\tpi.on(\"agent_start\", (_event, ctx) => {\n\t\t\tif (!ownsBinding(ctx)) return;\n\t\t\tagentRunning = true;\n\t\t\treport();\n\t\t});\n\t\tpi.on(\"agent_settled\", (_event, ctx) => {\n\t\t\tif (!ownsBinding(ctx)) return;\n\t\t\tagentRunning = false;\n\t\t\treport();\n\t\t});\n\t\tpi.on(\"ui_prompt_start\", (_event, ctx) => {\n\t\t\tif (!ownsBinding(ctx)) return;\n\t\t\topenPromptCount++;\n\t\t\treport();\n\t\t});\n\t\tpi.on(\"ui_prompt_end\", (_event, ctx) => {\n\t\t\tif (!ownsBinding(ctx)) return;\n\t\t\topenPromptCount = Math.max(0, openPromptCount - 1);\n\t\t\treport();\n\t\t});\n\t\tpi.on(\"session_shutdown\", async (event, ctx) => {\n\t\t\tif (!ownsBinding(ctx)) return;\n\t\t\t// A non-quit stop may restart this runner, unless a successor supersedes it first.\n\t\t\tif (event.reason === \"quit\") retiredRunners.add(boundRunner!);\n\t\t\tgeneration++;\n\t\t\tlease?.dispose();\n\t\t\tlease = undefined;\n\t\t\tunsubscribeTasks?.();\n\t\t\ttaskStore?.dispose();\n\t\t\tunsubscribeTasks = undefined;\n\t\t\ttaskStore = undefined;\n\t\t\tconst previous = owner;\n\t\t\towner = undefined;\n\t\t\t// Clear before awaiting transport: a successor can bind while retirement drains,\n\t\t\t// and this shutdown's completion must never clear that newer binding.\n\t\t\tboundSessionManager = undefined;\n\t\t\tif (previous) {\n\t\t\t\tif (event.reason === \"quit\") await releasePaneReporting(previous);\n\t\t\t\telse await retirePaneReporting(previous);\n\t\t\t}\n\t\t});\n\t};\n}\n\nexport default function herdrExtension(pi: ExtensionAPI): void {\n\tcreateHerdrExtension()(pi);\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extensions/herdr/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { getExtensionContextOwner, publishExtensionContextEffect } from \"../../core/extensions/runner-context.ts\";\nimport type { ExtensionAPI, ExtensionContext, ExtensionFactory } from \"../../core/extensions/types.ts\";\nimport type { WorkflowRootActivity } from \"../../core/extensions/workflow-events.js\";\nimport { SettingsManager } from \"../../core/settings-manager.ts\";\nimport { OwnerTaskStore } from \"../../core/tasks/owner-store.js\";\nimport { deriveSessionActivity } from \"./activity.js\";\nimport { captureHerdrEnvironment } from \"./environment.js\";\nimport {\n\tclaimPaneReporting,\n\ttype PaneOwner,\n\ttype PaneReportingOptions,\n\treleasePaneReporting,\n\treportPaneActivity,\n\tretirePaneReporting,\n} from \"./pane-owner.js\";\nimport type { HerdrDiagnostic } from \"./transport.js\";\n\nexport interface HerdrExtensionOptions extends PaneReportingOptions {\n\tenv?: NodeJS.ProcessEnv;\n\tenabled?: (ctx: ExtensionContext) => boolean;\n}\n\nfunction enabled(ctx: ExtensionContext): boolean {\n\tconst settings = SettingsManager.create(ctx.cwd, undefined, { projectTrusted: ctx.isProjectTrusted() });\n\treturn (settings.getProjectSettings().herdr?.enabled ?? settings.getGlobalSettings().herdr?.enabled) !== false;\n}\n\nexport function createHerdrExtension(options: HerdrExtensionOptions = {}): ExtensionFactory {\n\treturn (pi) => {\n\t\tif (!captureHerdrEnvironment(options.env ?? process.env)) return;\n\t\tlet owner: PaneOwner | undefined;\n\t\t// Supplied loaders can share closures across sessions and overlapping reload runners.\n\t\tlet boundSessionManager: ExtensionContext[\"sessionManager\"] | undefined;\n\t\tlet boundRunner: object | undefined;\n\t\tconst retiredRunners = new WeakSet<object>();\n\t\tconst ownsBinding = (ctx: ExtensionContext) =>\n\t\t\tboundSessionManager !== undefined && getExtensionContextOwner(ctx) === boundRunner;\n\t\tlet lease: { dispose(): void } | undefined;\n\t\tlet taskStore: OwnerTaskStore | undefined;\n\t\tlet unsubscribeTasks: (() => void) | undefined;\n\t\tlet agentRunning = false;\n\t\tlet openPromptCount = 0;\n\t\tlet availability: \"ready\" | \"unavailable\" | \"recovering\" = \"unavailable\";\n\t\tconst roots = new Map<string, WorkflowRootActivity>();\n\t\tconst acknowledgedBlocks = new Map<string, WorkflowRootActivity>();\n\t\tconst sameSummary = (left: WorkflowRootActivity, right: WorkflowRootActivity) =>\n\t\t\tleft.state === right.state &&\n\t\t\tleft.reason === right.reason &&\n\t\t\tleft.actionableBlockCount === right.actionableBlockCount &&\n\t\t\tleft.activeExecutionCount === right.activeExecutionCount &&\n\t\t\tleft.needsAttention === right.needsAttention;\n\t\tconst updateRoot = (root: WorkflowRootActivity) => {\n\t\t\tconst acknowledged = acknowledgedBlocks.get(root.rootRunId);\n\t\t\tif (acknowledged && !sameSummary(root, acknowledged)) acknowledgedBlocks.delete(root.rootRunId);\n\t\t\troots.set(root.rootRunId, root);\n\t\t};\n\t\tconst seenDiagnostics = new Set<string>();\n\t\tlet generation = 0;\n\t\tconst diagnostic = (value: HerdrDiagnostic) => {\n\t\t\tconst key = `${value.kind}:${value.owner ?? \"\"}`;\n\t\t\tif (seenDiagnostics.has(key)) return;\n\t\t\tseenDiagnostics.add(key);\n\t\t\tif (options.diagnostic) options.diagnostic(value);\n\t\t\telse console.error(`[Herdr] ${value.kind}${value.owner ? `: deferring to ${value.owner}` : \"\"}`);\n\t\t};\n\t\tconst tasksRunning = () => taskStore?.tasks.some((task) => task.execution.kind !== \"settled\") ?? false;\n\t\tconst report = (skipUnchanged = false) => {\n\t\t\tif (!owner) return;\n\t\t\tconst activity = deriveSessionActivity({\n\t\t\t\tagentRunning,\n\t\t\t\ttasksRunning: tasksRunning(),\n\t\t\t\topenPromptCount,\n\t\t\t\troots: [...roots.values()].filter((root) => !acknowledgedBlocks.has(root.rootRunId)),\n\t\t\t\tavailability,\n\t\t\t});\n\t\t\tif (activity) reportPaneActivity(owner, activity, skipUnchanged);\n\t\t};\n\t\tconst start = async (ctx: ExtensionContext) => {\n\t\t\tconst runner = getExtensionContextOwner(ctx);\n\t\t\tif (retiredRunners.has(runner)) return;\n\t\t\tif (boundSessionManager && ctx.sessionManager !== boundSessionManager) return;\n\t\t\tconst environment = captureHerdrEnvironment(options.env ?? process.env);\n\t\t\tif (!environment || ctx.mode !== \"tui\" || !ctx.hasUI || ctx.subagentPolicy || ctx.orchestrationContext) return;\n\t\t\tif (!(options.enabled ?? enabled)(ctx)) return;\n\t\t\tif (boundRunner && boundRunner !== runner) retiredRunners.add(boundRunner);\n\t\t\tboundRunner = runner;\n\t\t\tboundSessionManager = ctx.sessionManager;\n\t\t\tconst current = ++generation;\n\t\t\tlease?.dispose();\n\t\t\tlease = undefined;\n\t\t\tunsubscribeTasks?.();\n\t\t\ttaskStore?.dispose();\n\t\t\tunsubscribeTasks = undefined;\n\t\t\ttaskStore = undefined;\n\t\t\topenPromptCount = 0;\n\t\t\troots.clear();\n\t\t\tacknowledgedBlocks.clear();\n\t\t\tavailability = \"unavailable\";\n\t\t\tconst claimed = await claimPaneReporting(\n\t\t\t\tenvironment,\n\t\t\t\t{ id: ctx.sessionManager.getSessionId(), path: ctx.sessionManager.getSessionFile() },\n\t\t\t\t{ ...options, diagnostic },\n\t\t\t);\n\t\t\tif (current !== generation) {\n\t\t\t\tawait releasePaneReporting(claimed);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\towner = claimed;\n\t\t\tagentRunning = !ctx.isIdle();\n\t\t\tconst taskHost = ctx.getAgentTaskHost?.();\n\t\t\tif (taskHost) {\n\t\t\t\tconst { supervisor, owner: taskOwner } = taskHost.ownerBinding;\n\t\t\t\ttaskStore = new OwnerTaskStore(supervisor, taskOwner);\n\t\t\t\ttaskStore.connect();\n\t\t\t\tlet running = tasksRunning();\n\t\t\t\tunsubscribeTasks = taskStore.subscribe(() => {\n\t\t\t\t\tif (current !== generation) return;\n\t\t\t\t\tconst next = tasksRunning();\n\t\t\t\t\tif (next === running) return;\n\t\t\t\t\trunning = next;\n\t\t\t\t\treport();\n\t\t\t\t});\n\t\t\t}\n\t\t\tlease = ctx.observeWorkflowActivity((frame) => {\n\t\t\t\tif (current !== generation) return;\n\t\t\t\tif (frame.kind === \"snapshot\") {\n\t\t\t\t\tavailability = frame.availability;\n\t\t\t\t\troots.clear();\n\t\t\t\t\tif (frame.availability === \"ready\") {\n\t\t\t\t\t\tfor (const root of frame.roots) updateRoot(root);\n\t\t\t\t\t\tfor (const id of acknowledgedBlocks.keys()) if (!roots.has(id)) acknowledgedBlocks.delete(id);\n\t\t\t\t\t}\n\t\t\t\t} else if (frame.kind === \"changed\") {\n\t\t\t\t\tconst previous = roots.get(frame.root.rootRunId);\n\t\t\t\t\tupdateRoot(frame.root);\n\t\t\t\t\t// Graph-only changes do not alter the pane state; skip the redundant report.\n\t\t\t\t\tif (previous && sameSummary(previous, frame.root)) return;\n\t\t\t\t} else {\n\t\t\t\t\troots.delete(frame.rootRunId);\n\t\t\t\t\tacknowledgedBlocks.delete(frame.rootRunId);\n\t\t\t\t}\n\t\t\t\treport(frame.kind === \"snapshot\");\n\t\t\t});\n\t\t};\n\t\tpi.on(\"session_start\", (_event, ctx) => publishExtensionContextEffect(ctx, () => start(ctx)));\n\t\tpi.on(\"input\", (event, ctx) => {\n\t\t\tif (!ownsBinding(ctx) || event.source !== \"interactive\") return;\n\t\t\tlet changed = false;\n\t\t\tfor (const root of roots.values()) {\n\t\t\t\tif (root.state === \"blocked\" && !acknowledgedBlocks.has(root.rootRunId)) {\n\t\t\t\t\tacknowledgedBlocks.set(root.rootRunId, { ...root });\n\t\t\t\t\tchanged = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (changed) report();\n\t\t});\n\t\tpi.on(\"workflow_lifecycle\", (event, ctx) => {\n\t\t\tif (!ownsBinding(ctx) || event.delivery !== \"live\") return;\n\t\t\tconst target = event.target;\n\t\t\tconst newBlock =\n\t\t\t\ttarget.kind === \"prompt\"\n\t\t\t\t\t? target.status === \"opened\"\n\t\t\t\t\t: (target.kind === \"run\" || target.kind === \"stage\") &&\n\t\t\t\t\t\t(target.status === \"blocked\" || target.status === \"awaiting_input\") &&\n\t\t\t\t\t\ttarget.previousStatus !== target.status;\n\t\t\tif (newBlock && acknowledgedBlocks.delete(event.rootRunId)) report();\n\t\t});\n\t\tpi.on(\"agent_start\", (_event, ctx) => {\n\t\t\tif (!ownsBinding(ctx)) return;\n\t\t\tagentRunning = true;\n\t\t\treport();\n\t\t});\n\t\tpi.on(\"agent_settled\", (_event, ctx) => {\n\t\t\tif (!ownsBinding(ctx)) return;\n\t\t\tagentRunning = false;\n\t\t\treport();\n\t\t});\n\t\tpi.on(\"ui_prompt_start\", (_event, ctx) => {\n\t\t\tif (!ownsBinding(ctx)) return;\n\t\t\topenPromptCount++;\n\t\t\treport();\n\t\t});\n\t\tpi.on(\"ui_prompt_end\", (_event, ctx) => {\n\t\t\tif (!ownsBinding(ctx)) return;\n\t\t\topenPromptCount = Math.max(0, openPromptCount - 1);\n\t\t\treport();\n\t\t});\n\t\tpi.on(\"session_shutdown\", async (event, ctx) => {\n\t\t\tif (!ownsBinding(ctx)) return;\n\t\t\t// A non-quit stop may restart this runner, unless a successor supersedes it first.\n\t\t\tif (event.reason === \"quit\") retiredRunners.add(boundRunner!);\n\t\t\tgeneration++;\n\t\t\tlease?.dispose();\n\t\t\tlease = undefined;\n\t\t\tunsubscribeTasks?.();\n\t\t\ttaskStore?.dispose();\n\t\t\tunsubscribeTasks = undefined;\n\t\t\ttaskStore = undefined;\n\t\t\tconst previous = owner;\n\t\t\towner = undefined;\n\t\t\t// Clear before awaiting transport: a successor can bind while retirement drains,\n\t\t\t// and this shutdown's completion must never clear that newer binding.\n\t\t\tboundSessionManager = undefined;\n\t\t\tif (previous) {\n\t\t\t\tif (event.reason === \"quit\") await releasePaneReporting(previous);\n\t\t\t\telse await retirePaneReporting(previous);\n\t\t\t}\n\t\t});\n\t};\n}\n\nexport default function herdrExtension(pi: ExtensionAPI): void {\n\tcreateHerdrExtension()(pi);\n}\n"]}
@@ -17,13 +17,17 @@ export interface PaneOwner {
17
17
  status: "active" | "releasing" | "retired";
18
18
  seq: number;
19
19
  identitySent: boolean;
20
- pending?: SessionActivity;
20
+ lastDeliveredActivity?: SessionActivity;
21
+ pending?: {
22
+ activity: SessionActivity;
23
+ skipUnchanged: boolean;
24
+ };
21
25
  flight?: Promise<void>;
22
26
  release?: Promise<void>;
23
27
  flush(): Promise<void>;
24
28
  }
25
29
  export declare function claimPaneReporting(environment: HerdrEnvironment, identity: PaneIdentity, options?: PaneReportingOptions): Promise<PaneOwner>;
26
- export declare function reportPaneActivity(owner: PaneOwner, activity: SessionActivity): void;
30
+ export declare function reportPaneActivity(owner: PaneOwner, activity: SessionActivity, skipUnchanged?: boolean): void;
27
31
  /** Fence and drain a local reporter without unregistering the still-running agent. */
28
32
  export declare function retirePaneReporting(owner: PaneOwner): Promise<void>;
29
33
  export declare function releasePaneReporting(owner: PaneOwner): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"pane-owner.d.ts","sourceRoot":"","sources":["../../../src/extensions/herdr/pane-owner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAgB,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEpE,MAAM,WAAW,YAAY;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;CACd;AACD,MAAM,WAAW,oBAAoB;IACpC,KAAK,CAAC,EAAE,MAAM,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,eAAe,KAAK,IAAI,CAAC;CACnD;AACD,MAAM,WAAW,SAAS;IACzB,WAAW,EAAE,gBAAgB,CAAC;IAC9B,QAAQ,EAAE,YAAY,CAAC;IACvB,OAAO,EAAE,oBAAoB,CAAC;IAC9B,MAAM,EAAE,QAAQ,GAAG,WAAW,GAAG,SAAS,CAAC;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,MAAM,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAmCD,wBAAsB,kBAAkB,CACvC,WAAW,EAAE,gBAAgB,EAC7B,QAAQ,EAAE,YAAY,EACtB,OAAO,GAAE,oBAAyB,GAChC,OAAO,CAAC,SAAS,CAAC,CAoBpB;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,GAAG,IAAI,CAwBpF;AAED,sFAAsF;AACtF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAEnE;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAEpE"}
1
+ {"version":3,"file":"pane-owner.d.ts","sourceRoot":"","sources":["../../../src/extensions/herdr/pane-owner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAgB,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEpE,MAAM,WAAW,YAAY;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;CACd;AACD,MAAM,WAAW,oBAAoB;IACpC,KAAK,CAAC,EAAE,MAAM,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,eAAe,KAAK,IAAI,CAAC;CACnD;AACD,MAAM,WAAW,SAAS;IACzB,WAAW,EAAE,gBAAgB,CAAC;IAC9B,QAAQ,EAAE,YAAY,CAAC;IACvB,OAAO,EAAE,oBAAoB,CAAC;IAC9B,MAAM,EAAE,QAAQ,GAAG,WAAW,GAAG,SAAS,CAAC;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,OAAO,CAAC;IACtB,qBAAqB,CAAC,EAAE,eAAe,CAAC;IACxC,OAAO,CAAC,EAAE;QAAE,QAAQ,EAAE,eAAe,CAAC;QAAC,aAAa,EAAE,OAAO,CAAA;KAAE,CAAC;IAChE,MAAM,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAmCD,wBAAsB,kBAAkB,CACvC,WAAW,EAAE,gBAAgB,EAC7B,QAAQ,EAAE,YAAY,EACtB,OAAO,GAAE,oBAAyB,GAChC,OAAO,CAAC,SAAS,CAAC,CAoBpB;AAUD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAE,aAAa,UAAQ,GAAG,IAAI,CAiC3G;AAED,sFAAsF;AACtF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAEnE;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAEpE"}
@@ -51,18 +51,28 @@ export async function claimPaneReporting(environment, identity, options = {}) {
51
51
  owners.set(environment.paneId, owner);
52
52
  return owner;
53
53
  }
54
- export function reportPaneActivity(owner, activity) {
54
+ function matchesActivity(previous, activity) {
55
+ return (activity.state === previous?.state &&
56
+ activity.reason === previous?.reason &&
57
+ activity.message === previous?.message);
58
+ }
59
+ export function reportPaneActivity(owner, activity, skipUnchanged = false) {
55
60
  if (owner.status !== "active" || owners.get(owner.environment.paneId) !== owner) {
56
61
  diagnostic(owner, { kind: "stale_owner" });
57
62
  return;
58
63
  }
59
- owner.pending = activity;
64
+ if (!owner.flight && skipUnchanged && matchesActivity(owner.lastDeliveredActivity, activity))
65
+ return;
66
+ const pendingExplicitRefresh = owner.pending?.skipUnchanged === false && matchesActivity(owner.pending.activity, activity);
67
+ owner.pending = { activity, skipUnchanged: skipUnchanged && !pendingExplicitRefresh };
60
68
  if (owner.flight)
61
69
  return;
62
70
  owner.flight = (async () => {
63
71
  while (owner.pending && owner.status === "active") {
64
- const next = owner.pending;
72
+ const { activity: next, skipUnchanged } = owner.pending;
65
73
  owner.pending = undefined;
74
+ if (skipUnchanged && matchesActivity(owner.lastDeliveredActivity, next))
75
+ continue;
66
76
  allocateSequence(owner);
67
77
  const args = [...argv(owner, "report-agent"), "--state", next.state];
68
78
  if (next.message)
@@ -72,8 +82,13 @@ export function reportPaneActivity(owner, activity) {
72
82
  if (owner.identity.path && isAbsolute(owner.identity.path))
73
83
  args.push("--agent-session-path", owner.identity.path);
74
84
  }
75
- if (await send(owner, args))
85
+ if (await send(owner, args)) {
76
86
  owner.identitySent = true;
87
+ owner.lastDeliveredActivity = next;
88
+ }
89
+ else {
90
+ owner.lastDeliveredActivity = undefined;
91
+ }
77
92
  }
78
93
  })().finally(() => {
79
94
  owner.flight = undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"pane-owner.js","sourceRoot":"","sources":["../../../src/extensions/herdr/pane-owner.ts"],"names":[],"mappings":"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","sourcesContent":["import { isAbsolute } from \"node:path\";\nimport type { SessionActivity } from \"./activity.js\";\nimport type { HerdrEnvironment } from \"./environment.js\";\nimport { executeHerdr, type HerdrDiagnostic } from \"./transport.js\";\n\nexport interface PaneIdentity {\n\tid: string;\n\tpath?: string;\n}\nexport interface PaneReportingOptions {\n\tclock?: () => number;\n\ttimeoutMs?: number;\n\tdiagnostic?: (diagnostic: HerdrDiagnostic) => void;\n}\nexport interface PaneOwner {\n\tenvironment: HerdrEnvironment;\n\tidentity: PaneIdentity;\n\toptions: PaneReportingOptions;\n\tstatus: \"active\" | \"releasing\" | \"retired\";\n\tseq: number;\n\tidentitySent: boolean;\n\tpending?: SessionActivity;\n\tflight?: Promise<void>;\n\trelease?: Promise<void>;\n\tflush(): Promise<void>;\n}\n\n// Host module lifetime outlives inline extension factories and runner generations.\nconst owners = new Map<string, PaneOwner>();\nlet highWater = 0;\n\nfunction diagnostic(owner: PaneOwner, value: HerdrDiagnostic): void {\n\towner.options.diagnostic?.(value);\n}\n\n/** Every admitted command, including release, takes a fresh strictly increasing sequence: Herdr ignores equal or older `--seq`. */\nfunction allocateSequence(owner: PaneOwner): void {\n\towner.seq = highWater = Math.max((owner.options.clock ?? Date.now)(), highWater + 1);\n}\n\nfunction argv(owner: PaneOwner, command: string): string[] {\n\treturn [\n\t\t\"pane\",\n\t\tcommand,\n\t\towner.environment.paneId,\n\t\t\"--source\",\n\t\t\"custom:atomic\",\n\t\t\"--agent\",\n\t\t\"atomic\",\n\t\t\"--seq\",\n\t\tString(owner.seq),\n\t];\n}\n\nasync function send(owner: PaneOwner, args: string[]): Promise<boolean> {\n\tconst result = await executeHerdr(owner.environment, args, owner.options.timeoutMs);\n\tif (result) diagnostic(owner, result);\n\treturn result === undefined;\n}\n\nexport async function claimPaneReporting(\n\tenvironment: HerdrEnvironment,\n\tidentity: PaneIdentity,\n\toptions: PaneReportingOptions = {},\n): Promise<PaneOwner> {\n\tlet previous: PaneOwner | undefined;\n\tdo {\n\t\tprevious = owners.get(environment.paneId);\n\t\tif (previous) await retirePaneReporting(previous);\n\t} while (owners.get(environment.paneId) !== previous);\n\tconst owner: PaneOwner = {\n\t\tenvironment,\n\t\tidentity,\n\t\toptions,\n\t\tstatus: \"active\",\n\t\t// Inherit the registration even if recovery produces no successor report before quit.\n\t\tseq: previous?.seq ?? 0,\n\t\tidentitySent: false,\n\t\tasync flush() {\n\t\t\tawait this.flight;\n\t\t},\n\t};\n\towners.set(environment.paneId, owner);\n\treturn owner;\n}\n\nexport function reportPaneActivity(owner: PaneOwner, activity: SessionActivity): void {\n\tif (owner.status !== \"active\" || owners.get(owner.environment.paneId) !== owner) {\n\t\tdiagnostic(owner, { kind: \"stale_owner\" });\n\t\treturn;\n\t}\n\towner.pending = activity;\n\tif (owner.flight) return;\n\towner.flight = (async () => {\n\t\twhile (owner.pending && owner.status === \"active\") {\n\t\t\tconst next = owner.pending;\n\t\t\towner.pending = undefined;\n\t\t\tallocateSequence(owner);\n\t\t\tconst args = [...argv(owner, \"report-agent\"), \"--state\", next.state];\n\t\t\tif (next.message) args.push(\"--message\", next.message);\n\t\t\tif (!owner.identitySent) {\n\t\t\t\targs.push(\"--agent-session-id\", owner.identity.id);\n\t\t\t\tif (owner.identity.path && isAbsolute(owner.identity.path))\n\t\t\t\t\targs.push(\"--agent-session-path\", owner.identity.path);\n\t\t\t}\n\t\t\tif (await send(owner, args)) owner.identitySent = true;\n\t\t}\n\t})().finally(() => {\n\t\towner.flight = undefined;\n\t});\n}\n\n/** Fence and drain a local reporter without unregistering the still-running agent. */\nexport function retirePaneReporting(owner: PaneOwner): Promise<void> {\n\treturn stopPaneReporting(owner, false);\n}\n\nexport function releasePaneReporting(owner: PaneOwner): Promise<void> {\n\treturn stopPaneReporting(owner, true);\n}\n\nfunction stopPaneReporting(owner: PaneOwner, releaseRegistration: boolean): Promise<void> {\n\tif (owner.release) return owner.release;\n\tif (owners.get(owner.environment.paneId) !== owner || owner.status !== \"active\") {\n\t\tdiagnostic(owner, { kind: \"stale_owner\" });\n\t\treturn Promise.resolve();\n\t}\n\towner.status = \"releasing\";\n\towner.pending = undefined;\n\towner.release = (async () => {\n\t\tawait owner.flight;\n\t\t// A failed command may still have claimed authority before its response was lost.\n\t\tif (releaseRegistration && owner.seq > 0) {\n\t\t\tallocateSequence(owner);\n\t\t\tawait send(owner, argv(owner, \"release-agent\"));\n\t\t}\n\t\towner.status = \"retired\";\n\t\tif (releaseRegistration && owners.get(owner.environment.paneId) === owner)\n\t\t\towners.delete(owner.environment.paneId);\n\t})();\n\treturn owner.release;\n}\n"]}
1
+ {"version":3,"file":"pane-owner.js","sourceRoot":"","sources":["../../../src/extensions/herdr/pane-owner.ts"],"names":[],"mappings":"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","sourcesContent":["import { isAbsolute } from \"node:path\";\nimport type { SessionActivity } from \"./activity.js\";\nimport type { HerdrEnvironment } from \"./environment.js\";\nimport { executeHerdr, type HerdrDiagnostic } from \"./transport.js\";\n\nexport interface PaneIdentity {\n\tid: string;\n\tpath?: string;\n}\nexport interface PaneReportingOptions {\n\tclock?: () => number;\n\ttimeoutMs?: number;\n\tdiagnostic?: (diagnostic: HerdrDiagnostic) => void;\n}\nexport interface PaneOwner {\n\tenvironment: HerdrEnvironment;\n\tidentity: PaneIdentity;\n\toptions: PaneReportingOptions;\n\tstatus: \"active\" | \"releasing\" | \"retired\";\n\tseq: number;\n\tidentitySent: boolean;\n\tlastDeliveredActivity?: SessionActivity;\n\tpending?: { activity: SessionActivity; skipUnchanged: boolean };\n\tflight?: Promise<void>;\n\trelease?: Promise<void>;\n\tflush(): Promise<void>;\n}\n\n// Host module lifetime outlives inline extension factories and runner generations.\nconst owners = new Map<string, PaneOwner>();\nlet highWater = 0;\n\nfunction diagnostic(owner: PaneOwner, value: HerdrDiagnostic): void {\n\towner.options.diagnostic?.(value);\n}\n\n/** Every admitted command, including release, takes a fresh strictly increasing sequence: Herdr ignores equal or older `--seq`. */\nfunction allocateSequence(owner: PaneOwner): void {\n\towner.seq = highWater = Math.max((owner.options.clock ?? Date.now)(), highWater + 1);\n}\n\nfunction argv(owner: PaneOwner, command: string): string[] {\n\treturn [\n\t\t\"pane\",\n\t\tcommand,\n\t\towner.environment.paneId,\n\t\t\"--source\",\n\t\t\"custom:atomic\",\n\t\t\"--agent\",\n\t\t\"atomic\",\n\t\t\"--seq\",\n\t\tString(owner.seq),\n\t];\n}\n\nasync function send(owner: PaneOwner, args: string[]): Promise<boolean> {\n\tconst result = await executeHerdr(owner.environment, args, owner.options.timeoutMs);\n\tif (result) diagnostic(owner, result);\n\treturn result === undefined;\n}\n\nexport async function claimPaneReporting(\n\tenvironment: HerdrEnvironment,\n\tidentity: PaneIdentity,\n\toptions: PaneReportingOptions = {},\n): Promise<PaneOwner> {\n\tlet previous: PaneOwner | undefined;\n\tdo {\n\t\tprevious = owners.get(environment.paneId);\n\t\tif (previous) await retirePaneReporting(previous);\n\t} while (owners.get(environment.paneId) !== previous);\n\tconst owner: PaneOwner = {\n\t\tenvironment,\n\t\tidentity,\n\t\toptions,\n\t\tstatus: \"active\",\n\t\t// Inherit the registration even if recovery produces no successor report before quit.\n\t\tseq: previous?.seq ?? 0,\n\t\tidentitySent: false,\n\t\tasync flush() {\n\t\t\tawait this.flight;\n\t\t},\n\t};\n\towners.set(environment.paneId, owner);\n\treturn owner;\n}\n\nfunction matchesActivity(previous: SessionActivity | undefined, activity: SessionActivity): boolean {\n\treturn (\n\t\tactivity.state === previous?.state &&\n\t\tactivity.reason === previous?.reason &&\n\t\tactivity.message === previous?.message\n\t);\n}\n\nexport function reportPaneActivity(owner: PaneOwner, activity: SessionActivity, skipUnchanged = false): void {\n\tif (owner.status !== \"active\" || owners.get(owner.environment.paneId) !== owner) {\n\t\tdiagnostic(owner, { kind: \"stale_owner\" });\n\t\treturn;\n\t}\n\tif (!owner.flight && skipUnchanged && matchesActivity(owner.lastDeliveredActivity, activity)) return;\n\tconst pendingExplicitRefresh =\n\t\towner.pending?.skipUnchanged === false && matchesActivity(owner.pending.activity, activity);\n\towner.pending = { activity, skipUnchanged: skipUnchanged && !pendingExplicitRefresh };\n\tif (owner.flight) return;\n\towner.flight = (async () => {\n\t\twhile (owner.pending && owner.status === \"active\") {\n\t\t\tconst { activity: next, skipUnchanged } = owner.pending;\n\t\t\towner.pending = undefined;\n\t\t\tif (skipUnchanged && matchesActivity(owner.lastDeliveredActivity, next)) continue;\n\t\t\tallocateSequence(owner);\n\t\t\tconst args = [...argv(owner, \"report-agent\"), \"--state\", next.state];\n\t\t\tif (next.message) args.push(\"--message\", next.message);\n\t\t\tif (!owner.identitySent) {\n\t\t\t\targs.push(\"--agent-session-id\", owner.identity.id);\n\t\t\t\tif (owner.identity.path && isAbsolute(owner.identity.path))\n\t\t\t\t\targs.push(\"--agent-session-path\", owner.identity.path);\n\t\t\t}\n\t\t\tif (await send(owner, args)) {\n\t\t\t\towner.identitySent = true;\n\t\t\t\towner.lastDeliveredActivity = next;\n\t\t\t} else {\n\t\t\t\towner.lastDeliveredActivity = undefined;\n\t\t\t}\n\t\t}\n\t})().finally(() => {\n\t\towner.flight = undefined;\n\t});\n}\n\n/** Fence and drain a local reporter without unregistering the still-running agent. */\nexport function retirePaneReporting(owner: PaneOwner): Promise<void> {\n\treturn stopPaneReporting(owner, false);\n}\n\nexport function releasePaneReporting(owner: PaneOwner): Promise<void> {\n\treturn stopPaneReporting(owner, true);\n}\n\nfunction stopPaneReporting(owner: PaneOwner, releaseRegistration: boolean): Promise<void> {\n\tif (owner.release) return owner.release;\n\tif (owners.get(owner.environment.paneId) !== owner || owner.status !== \"active\") {\n\t\tdiagnostic(owner, { kind: \"stale_owner\" });\n\t\treturn Promise.resolve();\n\t}\n\towner.status = \"releasing\";\n\towner.pending = undefined;\n\towner.release = (async () => {\n\t\tawait owner.flight;\n\t\t// A failed command may still have claimed authority before its response was lost.\n\t\tif (releaseRegistration && owner.seq > 0) {\n\t\t\tallocateSequence(owner);\n\t\t\tawait send(owner, argv(owner, \"release-agent\"));\n\t\t}\n\t\towner.status = \"retired\";\n\t\tif (releaseRegistration && owners.get(owner.environment.paneId) === owner)\n\t\t\towners.delete(owner.environment.paneId);\n\t})();\n\treturn owner.release;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/extensions/llama/provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAON,KAAK,QAAQ,EAGb,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAEN,KAAK,cAAc,EAInB,MAAM,aAAa,CAAC;AAErB,eAAO,MAAM,iBAAiB,cAAc,CAAC;AAC7C,eAAO,MAAM,wBAAwB,0BAA0B,CAAC;AAuGhE,MAAM,WAAW,uBAAuB;IACvC,QAAQ,EAAE,QAAQ,CAAC,oBAAoB,CAAC,CAAC;IACzC,UAAU,CAAC,MAAM,EAAE,SAAS,cAAc,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,cAAc,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;CAC/G;AAED,wBAAgB,mBAAmB,IAAI,uBAAuB,CAkI7D"}
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/extensions/llama/provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAQN,KAAK,QAAQ,EAGb,MAAM,gBAAgB,CAAC;AAIxB,OAAO,EAEN,KAAK,cAAc,EAInB,MAAM,aAAa,CAAC;AAErB,eAAO,MAAM,iBAAiB,cAAc,CAAC;AAC7C,eAAO,MAAM,wBAAwB,0BAA0B,CAAC;AAuHhE,MAAM,WAAW,uBAAuB;IACvC,QAAQ,EAAE,QAAQ,CAAC,oBAAoB,CAAC,CAAC;IACzC,UAAU,CAAC,MAAM,EAAE,SAAS,cAAc,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,cAAc,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;CAC/G;AAED,wBAAgB,mBAAmB,IAAI,uBAAuB,CAqI7D"}
@@ -1,5 +1,6 @@
1
1
  import { isModelType, } from "@bastani/pi-ai";
2
2
  import { llamaCppClassifyApi } from "@bastani/pi-ai/api/llama-cpp-classify.lazy";
3
+ import { typesafeSystemOneApi } from "@bastani/pi-ai/api/typesafe-system-one.lazy";
3
4
  import { stream, streamSimple } from "@bastani/pi-ai/compat";
4
5
  import { LlamaClient, llamaInferenceUrl, normalizeLlamaServerUrl, } from "./client.js";
5
6
  export const LLAMA_PROVIDER_ID = "llama.cpp";
@@ -48,20 +49,29 @@ function contextWindowOf(model, cachedContextWindow) {
48
49
  return cachedContextWindow;
49
50
  return model.meta?.n_ctx_train && model.meta.n_ctx_train > 0 ? model.meta.n_ctx_train : 128000;
50
51
  }
51
- /** The same llama.cpp model used as a classifier: answers are read from next-token label probabilities. */
52
+ function isDecisionModel(model) {
53
+ return model.architecture?.output_modalities?.includes("decisions") === true;
54
+ }
55
+ function isChatModel(model) {
56
+ return !isDecisionModel(model) || model.architecture?.output_modalities?.includes("text") === true;
57
+ }
52
58
  function toPiClassifierModel(model, serverUrl, cachedContextWindow) {
59
+ const decision = isDecisionModel(model);
53
60
  return {
54
61
  type: "classifier",
55
62
  id: model.id,
56
63
  name: model.id,
57
- api: "llama-cpp-classify",
64
+ api: decision ? "typesafe-system-one" : "llama-cpp-classify",
58
65
  provider: LLAMA_PROVIDER_ID,
59
- baseUrl: serverUrl,
66
+ baseUrl: decision ? llamaInferenceUrl(serverUrl) : serverUrl,
60
67
  input: ["text"],
61
68
  cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
62
69
  contextWindow: contextWindowOf(model, cachedContextWindow),
63
70
  };
64
71
  }
72
+ function isLlamaClassifierModel(model) {
73
+ return (isModelType(model, "classifier") && (model.api === "llama-cpp-classify" || model.api === "typesafe-system-one"));
74
+ }
65
75
  function toPiModel(model, serverUrl, props, cachedContextWindow) {
66
76
  const contextWindow = contextWindowOf(model, cachedContextWindow);
67
77
  const reasoning = props?.chat_template?.includes("enable_thinking") === true;
@@ -93,10 +103,11 @@ function toPiModel(model, serverUrl, props, cachedContextWindow) {
93
103
  export function createLlamaProvider() {
94
104
  let models = [];
95
105
  let classifiers = [];
96
- const classifier = llamaCppClassifyApi();
106
+ const fallbackClassifier = llamaCppClassifyApi();
107
+ const decisionClassifier = typesafeSystemOneApi();
97
108
  const setCatalog = (catalog, serverUrl, options = {}) => {
98
109
  const selectable = catalog.filter((model) => modelIsSelectable(model, options.routerAutoload === true));
99
- models = selectable.map((model) => toPiModel(model, serverUrl));
110
+ models = selectable.filter(isChatModel).map((model) => toPiModel(model, serverUrl));
100
111
  classifiers = selectable.map((model) => toPiClassifierModel(model, serverUrl));
101
112
  };
102
113
  const provider = {
@@ -150,7 +161,7 @@ export function createLlamaProvider() {
150
161
  if (context.stored) {
151
162
  const stored = context.stored.models.filter((model) => model.provider === LLAMA_PROVIDER_ID);
152
163
  const restored = stored.filter((model) => isModelType(model, "chat") && model.api === "openai-completions");
153
- const restoredClassifiers = stored.filter((model) => isModelType(model, "classifier") && model.api === "llama-cpp-classify");
164
+ const restoredClassifiers = stored.filter(isLlamaClassifierModel);
154
165
  for (const model of [...restored, ...restoredClassifiers])
155
166
  cachedContextWindows.set(model.id, model.contextWindow);
156
167
  if (!(await context.publish({
@@ -175,7 +186,7 @@ export function createLlamaProvider() {
175
186
  if (context.signal.aborted)
176
187
  return;
177
188
  const selectable = catalog.filter((model) => modelIsSelectable(model, routerAutoload));
178
- const refreshed = await Promise.all(selectable.map(async (model) => {
189
+ const refreshed = await Promise.all(selectable.filter(isChatModel).map(async (model) => {
179
190
  // Query only loaded models: sleeping and autoload presets must not be woken by discovery.
180
191
  const cachedContextWindow = cachedContextWindows.get(model.id);
181
192
  if (model.status.value !== "loaded")
@@ -195,7 +206,7 @@ export function createLlamaProvider() {
195
206
  },
196
207
  stream: (model, context, options) => stream(model, context, options),
197
208
  streamSimple: (model, context, options) => streamSimple(model, context, options),
198
- classify: (model, context, options) => classifier.classify(model, context, options),
209
+ classify: (model, context, options) => (model.api === "typesafe-system-one" ? decisionClassifier : fallbackClassifier).classify(model, context, options),
199
210
  };
200
211
  return { provider, setCatalog };
201
212
  }
@@ -1 +1 @@
1
- {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/extensions/llama/provider.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\ttype ApiKeyCredential,\n\ttype AuthContext,\n\ttype AuthResult,\n\ttype ClassifierModel,\n\tisModelType,\n\ttype Model,\n\ttype Provider,\n\ttype ProviderStreamOptions,\n\ttype RefreshModelsContext,\n} from \"@bastani/pi-ai\";\nimport { llamaCppClassifyApi } from \"@bastani/pi-ai/api/llama-cpp-classify.lazy\";\nimport { stream, streamSimple } from \"@bastani/pi-ai/compat\";\nimport {\n\tLlamaClient,\n\ttype LlamaModelInfo,\n\ttype LlamaServerProps,\n\tllamaInferenceUrl,\n\tnormalizeLlamaServerUrl,\n} from \"./client.js\";\n\nexport const LLAMA_PROVIDER_ID = \"llama.cpp\";\nexport const DEFAULT_LLAMA_SERVER_URL = \"http://127.0.0.1:8080\";\nfunction credentialServerUrl(credential: ApiKeyCredential | undefined): string | undefined {\n\tconst value = credential?.env?.LLAMA_BASE_URL;\n\treturn typeof value === \"string\" && value.trim() ? normalizeLlamaServerUrl(value) : undefined;\n}\n\nasync function resolveServerUrl(\n\tctx: AuthContext,\n\tcredential: ApiKeyCredential | undefined,\n): Promise<string | undefined> {\n\tconst configured = credentialServerUrl(credential) ?? (await ctx.env(\"LLAMA_BASE_URL\"))?.trim();\n\treturn configured ? normalizeLlamaServerUrl(configured) : undefined;\n}\n\nfunction modelIsSelectable(model: LlamaModelInfo, routerAutoload = false): boolean {\n\tif (model.status.value === \"loaded\" || model.status.value === \"sleeping\") return true;\n\treturn routerAutoload && model.status.value === \"unloaded\" && !model.status.failed && model.source === \"preset\";\n}\n\nasync function routerAutoloadEnabled(\n\tclient: LlamaClient,\n\tcatalog: readonly LlamaModelInfo[],\n\tsignal: AbortSignal,\n): Promise<boolean> {\n\tif (!catalog.some((model) => model.status.value === \"unloaded\" && model.source === \"preset\")) return false;\n\ttry {\n\t\treturn (await client.props({ signal })).models_autoload === true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction configuredContextWindow(model: LlamaModelInfo): number | undefined {\n\tconst args = model.status.args ?? [];\n\tfor (let index = 0; index < args.length - 1; index++) {\n\t\tif (![\"--ctx-size\", \"-c\", \"-ctx\"].includes(args[index])) continue;\n\t\tconst contextWindow = Number(args[index + 1]);\n\t\tif (Number.isSafeInteger(contextWindow) && contextWindow > 0) return contextWindow;\n\t}\n\treturn undefined;\n}\n\nfunction contextWindowOf(model: LlamaModelInfo, cachedContextWindow?: number): number {\n\tif (model.meta?.n_ctx && model.meta.n_ctx > 0) return model.meta.n_ctx;\n\tconst configured = configuredContextWindow(model);\n\tif (configured) return configured;\n\tif (cachedContextWindow && cachedContextWindow > 0) return cachedContextWindow;\n\treturn model.meta?.n_ctx_train && model.meta.n_ctx_train > 0 ? model.meta.n_ctx_train : 128000;\n}\n\n/** The same llama.cpp model used as a classifier: answers are read from next-token label probabilities. */\nfunction toPiClassifierModel(\n\tmodel: LlamaModelInfo,\n\tserverUrl: string,\n\tcachedContextWindow?: number,\n): ClassifierModel<\"llama-cpp-classify\"> {\n\treturn {\n\t\ttype: \"classifier\",\n\t\tid: model.id,\n\t\tname: model.id,\n\t\tapi: \"llama-cpp-classify\",\n\t\tprovider: LLAMA_PROVIDER_ID,\n\t\tbaseUrl: serverUrl,\n\t\tinput: [\"text\"],\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t\tcontextWindow: contextWindowOf(model, cachedContextWindow),\n\t};\n}\n\nfunction toPiModel(\n\tmodel: LlamaModelInfo,\n\tserverUrl: string,\n\tprops?: LlamaServerProps,\n\tcachedContextWindow?: number,\n): Model<\"openai-completions\"> {\n\tconst contextWindow = contextWindowOf(model, cachedContextWindow);\n\tconst reasoning = props?.chat_template?.includes(\"enable_thinking\") === true;\n\treturn {\n\t\tid: model.id,\n\t\tname: model.id,\n\t\tapi: \"openai-completions\",\n\t\tprovider: LLAMA_PROVIDER_ID,\n\t\tbaseUrl: llamaInferenceUrl(serverUrl),\n\t\treasoning,\n\t\t...(reasoning && {\n\t\t\tthinkingLevelMap: { off: \"off\", minimal: null, low: null, medium: \"medium\", high: null, xhigh: null },\n\t\t}),\n\t\tinput: model.architecture?.input_modalities?.includes(\"image\") ? [\"text\", \"image\"] : [\"text\"],\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t\tcontextWindow,\n\t\tmaxTokens: contextWindow,\n\t\tcompat: {\n\t\t\tsupportsStore: false,\n\t\t\tsupportsDeveloperRole: false,\n\t\t\tsupportsReasoningEffort: false,\n\t\t\tsupportsUsageInStreaming: true,\n\t\t\tsupportsStrictMode: false,\n\t\t\tmaxTokensField: \"max_tokens\",\n\t\t\t...(reasoning && { thinkingFormat: \"qwen-chat-template\" }),\n\t\t},\n\t};\n}\n\nexport interface LlamaProviderController {\n\tprovider: Provider<\"openai-completions\">;\n\tsetCatalog(models: readonly LlamaModelInfo[], serverUrl: string, options?: { routerAutoload?: boolean }): void;\n}\n\nexport function createLlamaProvider(): LlamaProviderController {\n\tlet models: readonly Model<\"openai-completions\">[] = [];\n\tlet classifiers: readonly ClassifierModel<\"llama-cpp-classify\">[] = [];\n\tconst classifier = llamaCppClassifyApi();\n\n\tconst setCatalog = (\n\t\tcatalog: readonly LlamaModelInfo[],\n\t\tserverUrl: string,\n\t\toptions: { routerAutoload?: boolean } = {},\n\t): void => {\n\t\tconst selectable = catalog.filter((model) => modelIsSelectable(model, options.routerAutoload === true));\n\t\tmodels = selectable.map((model) => toPiModel(model, serverUrl));\n\t\tclassifiers = selectable.map((model) => toPiClassifierModel(model, serverUrl));\n\t};\n\n\tconst provider: Provider<\"openai-completions\"> = {\n\t\tid: LLAMA_PROVIDER_ID,\n\t\tname: \"llama.cpp\",\n\t\tbaseUrl: llamaInferenceUrl(DEFAULT_LLAMA_SERVER_URL),\n\t\tauth: {\n\t\t\tapiKey: {\n\t\t\t\tname: \"llama.cpp server\",\n\t\t\t\tlogin: async (interaction): Promise<ApiKeyCredential> => {\n\t\t\t\t\tconst enteredUrl = await interaction.prompt({\n\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\tmessage: \"llama.cpp server URL\",\n\t\t\t\t\t\tplaceholder: process.env.LLAMA_BASE_URL ?? DEFAULT_LLAMA_SERVER_URL,\n\t\t\t\t\t});\n\t\t\t\t\tconst serverUrl = normalizeLlamaServerUrl(\n\t\t\t\t\t\tenteredUrl.trim() || process.env.LLAMA_BASE_URL || DEFAULT_LLAMA_SERVER_URL,\n\t\t\t\t\t);\n\t\t\t\t\tconst apiKey = (\n\t\t\t\t\t\tawait interaction.prompt({\n\t\t\t\t\t\t\ttype: \"secret\",\n\t\t\t\t\t\t\tmessage: \"API key (optional)\",\n\t\t\t\t\t\t})\n\t\t\t\t\t).trim();\n\t\t\t\t\tawait new LlamaClient(serverUrl, apiKey || undefined).list({ signal: interaction.signal });\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttype: \"api_key\",\n\t\t\t\t\t\tkey: apiKey || undefined,\n\t\t\t\t\t\tenv: { LLAMA_BASE_URL: serverUrl },\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t\tcheck: async ({ ctx, credential }) => {\n\t\t\t\t\tconst serverUrl = await resolveServerUrl(ctx, credential);\n\t\t\t\t\treturn serverUrl\n\t\t\t\t\t\t? { type: \"api_key\", source: credential ? \"stored credential\" : \"LLAMA_BASE_URL\" }\n\t\t\t\t\t\t: undefined;\n\t\t\t\t},\n\t\t\t\tresolve: async ({ ctx, credential }): Promise<AuthResult | undefined> => {\n\t\t\t\t\tconst serverUrl = await resolveServerUrl(ctx, credential);\n\t\t\t\t\tif (!serverUrl) return undefined;\n\t\t\t\t\tconst apiKey = credential?.key ?? (await ctx.env(\"LLAMA_API_KEY\")) ?? \"local\";\n\t\t\t\t\treturn {\n\t\t\t\t\t\tauth: { apiKey, baseUrl: llamaInferenceUrl(serverUrl) },\n\t\t\t\t\t\tenv: { ...credential?.env, LLAMA_BASE_URL: serverUrl },\n\t\t\t\t\t\tsource: credential ? \"stored credential\" : \"LLAMA_BASE_URL\",\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tgetModels: () => models,\n\t\tgetAllModels: () => [...models, ...classifiers],\n\t\trefreshModels: async (context: RefreshModelsContext): Promise<void> => {\n\t\t\tconst cachedContextWindows = new Map<string, number>();\n\t\t\tif (context.stored) {\n\t\t\t\tconst stored = context.stored.models.filter((model) => model.provider === LLAMA_PROVIDER_ID);\n\t\t\t\tconst restored = stored.filter(\n\t\t\t\t\t(model): model is Model<\"openai-completions\"> =>\n\t\t\t\t\t\tisModelType(model, \"chat\") && model.api === \"openai-completions\",\n\t\t\t\t);\n\t\t\t\tconst restoredClassifiers = stored.filter(\n\t\t\t\t\t(model): model is ClassifierModel<\"llama-cpp-classify\"> =>\n\t\t\t\t\t\tisModelType(model, \"classifier\") && model.api === \"llama-cpp-classify\",\n\t\t\t\t);\n\t\t\t\tfor (const model of [...restored, ...restoredClassifiers])\n\t\t\t\t\tcachedContextWindows.set(model.id, model.contextWindow);\n\t\t\t\tif (\n\t\t\t\t\t!(await context.publish({\n\t\t\t\t\t\tupdate: () => {\n\t\t\t\t\t\t\tmodels = restored;\n\t\t\t\t\t\t\tclassifiers = restoredClassifiers;\n\t\t\t\t\t\t},\n\t\t\t\t\t}))\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!context.allowNetwork || context.signal.aborted || context.credential?.type !== \"api_key\") return;\n\t\t\tconst serverUrl = credentialServerUrl(context.credential);\n\t\t\tif (!serverUrl) return;\n\t\t\tconst client = new LlamaClient(serverUrl, context.credential.key);\n\t\t\tconst catalog = await client.list({ signal: context.signal });\n\t\t\tif (context.signal.aborted) return;\n\t\t\tconst routerAutoload = await routerAutoloadEnabled(client, catalog, context.signal);\n\t\t\tif (context.signal.aborted) return;\n\t\t\tconst selectable = catalog.filter((model) => modelIsSelectable(model, routerAutoload));\n\t\t\tconst refreshed = await Promise.all(\n\t\t\t\tselectable.map(async (model) => {\n\t\t\t\t\t// Query only loaded models: sleeping and autoload presets must not be woken by discovery.\n\t\t\t\t\tconst cachedContextWindow = cachedContextWindows.get(model.id);\n\t\t\t\t\tif (model.status.value !== \"loaded\") return toPiModel(model, serverUrl, undefined, cachedContextWindow);\n\t\t\t\t\treturn toPiModel(\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\tserverUrl,\n\t\t\t\t\t\tawait client.props({ model: model.id, signal: context.signal }),\n\t\t\t\t\t\tcachedContextWindow,\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t\t);\n\t\t\tconst refreshedClassifiers = selectable.map((model) =>\n\t\t\t\ttoPiClassifierModel(model, serverUrl, cachedContextWindows.get(model.id)),\n\t\t\t);\n\t\t\tif (context.signal.aborted) return;\n\t\t\tawait context.publish({\n\t\t\t\tpersist: { models: [...refreshed, ...refreshedClassifiers], checkedAt: Date.now() },\n\t\t\t\tupdate: () => {\n\t\t\t\t\tmodels = refreshed;\n\t\t\t\t\tclassifiers = refreshedClassifiers;\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\tstream: (model, context, options) => stream(model, context, options as ProviderStreamOptions | undefined),\n\t\tstreamSimple: (model, context, options) => streamSimple(model, context, options),\n\t\tclassify: (model, context, options) => classifier.classify(model, context, options),\n\t};\n\n\treturn { provider, setCatalog };\n}\n"]}
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/extensions/llama/provider.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\ttype AnyModel,\n\ttype ApiKeyCredential,\n\ttype AuthContext,\n\ttype AuthResult,\n\ttype ClassifierModel,\n\tisModelType,\n\ttype Model,\n\ttype Provider,\n\ttype ProviderStreamOptions,\n\ttype RefreshModelsContext,\n} from \"@bastani/pi-ai\";\nimport { llamaCppClassifyApi } from \"@bastani/pi-ai/api/llama-cpp-classify.lazy\";\nimport { typesafeSystemOneApi } from \"@bastani/pi-ai/api/typesafe-system-one.lazy\";\nimport { stream, streamSimple } from \"@bastani/pi-ai/compat\";\nimport {\n\tLlamaClient,\n\ttype LlamaModelInfo,\n\ttype LlamaServerProps,\n\tllamaInferenceUrl,\n\tnormalizeLlamaServerUrl,\n} from \"./client.js\";\n\nexport const LLAMA_PROVIDER_ID = \"llama.cpp\";\nexport const DEFAULT_LLAMA_SERVER_URL = \"http://127.0.0.1:8080\";\nfunction credentialServerUrl(credential: ApiKeyCredential | undefined): string | undefined {\n\tconst value = credential?.env?.LLAMA_BASE_URL;\n\treturn typeof value === \"string\" && value.trim() ? normalizeLlamaServerUrl(value) : undefined;\n}\n\nasync function resolveServerUrl(\n\tctx: AuthContext,\n\tcredential: ApiKeyCredential | undefined,\n): Promise<string | undefined> {\n\tconst configured = credentialServerUrl(credential) ?? (await ctx.env(\"LLAMA_BASE_URL\"))?.trim();\n\treturn configured ? normalizeLlamaServerUrl(configured) : undefined;\n}\n\nfunction modelIsSelectable(model: LlamaModelInfo, routerAutoload = false): boolean {\n\tif (model.status.value === \"loaded\" || model.status.value === \"sleeping\") return true;\n\treturn routerAutoload && model.status.value === \"unloaded\" && !model.status.failed && model.source === \"preset\";\n}\n\nasync function routerAutoloadEnabled(\n\tclient: LlamaClient,\n\tcatalog: readonly LlamaModelInfo[],\n\tsignal: AbortSignal,\n): Promise<boolean> {\n\tif (!catalog.some((model) => model.status.value === \"unloaded\" && model.source === \"preset\")) return false;\n\ttry {\n\t\treturn (await client.props({ signal })).models_autoload === true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction configuredContextWindow(model: LlamaModelInfo): number | undefined {\n\tconst args = model.status.args ?? [];\n\tfor (let index = 0; index < args.length - 1; index++) {\n\t\tif (![\"--ctx-size\", \"-c\", \"-ctx\"].includes(args[index])) continue;\n\t\tconst contextWindow = Number(args[index + 1]);\n\t\tif (Number.isSafeInteger(contextWindow) && contextWindow > 0) return contextWindow;\n\t}\n\treturn undefined;\n}\n\nfunction contextWindowOf(model: LlamaModelInfo, cachedContextWindow?: number): number {\n\tif (model.meta?.n_ctx && model.meta.n_ctx > 0) return model.meta.n_ctx;\n\tconst configured = configuredContextWindow(model);\n\tif (configured) return configured;\n\tif (cachedContextWindow && cachedContextWindow > 0) return cachedContextWindow;\n\treturn model.meta?.n_ctx_train && model.meta.n_ctx_train > 0 ? model.meta.n_ctx_train : 128000;\n}\n\ntype LlamaClassifierApi = \"llama-cpp-classify\" | \"typesafe-system-one\";\n\nfunction isDecisionModel(model: LlamaModelInfo): boolean {\n\treturn model.architecture?.output_modalities?.includes(\"decisions\") === true;\n}\n\nfunction isChatModel(model: LlamaModelInfo): boolean {\n\treturn !isDecisionModel(model) || model.architecture?.output_modalities?.includes(\"text\") === true;\n}\n\nfunction toPiClassifierModel(\n\tmodel: LlamaModelInfo,\n\tserverUrl: string,\n\tcachedContextWindow?: number,\n): ClassifierModel<LlamaClassifierApi> {\n\tconst decision = isDecisionModel(model);\n\treturn {\n\t\ttype: \"classifier\",\n\t\tid: model.id,\n\t\tname: model.id,\n\t\tapi: decision ? \"typesafe-system-one\" : \"llama-cpp-classify\",\n\t\tprovider: LLAMA_PROVIDER_ID,\n\t\tbaseUrl: decision ? llamaInferenceUrl(serverUrl) : serverUrl,\n\t\tinput: [\"text\"],\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t\tcontextWindow: contextWindowOf(model, cachedContextWindow),\n\t};\n}\n\nfunction isLlamaClassifierModel(model: AnyModel): model is ClassifierModel<LlamaClassifierApi> {\n\treturn (\n\t\tisModelType(model, \"classifier\") && (model.api === \"llama-cpp-classify\" || model.api === \"typesafe-system-one\")\n\t);\n}\n\nfunction toPiModel(\n\tmodel: LlamaModelInfo,\n\tserverUrl: string,\n\tprops?: LlamaServerProps,\n\tcachedContextWindow?: number,\n): Model<\"openai-completions\"> {\n\tconst contextWindow = contextWindowOf(model, cachedContextWindow);\n\tconst reasoning = props?.chat_template?.includes(\"enable_thinking\") === true;\n\treturn {\n\t\tid: model.id,\n\t\tname: model.id,\n\t\tapi: \"openai-completions\",\n\t\tprovider: LLAMA_PROVIDER_ID,\n\t\tbaseUrl: llamaInferenceUrl(serverUrl),\n\t\treasoning,\n\t\t...(reasoning && {\n\t\t\tthinkingLevelMap: { off: \"off\", minimal: null, low: null, medium: \"medium\", high: null, xhigh: null },\n\t\t}),\n\t\tinput: model.architecture?.input_modalities?.includes(\"image\") ? [\"text\", \"image\"] : [\"text\"],\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t\tcontextWindow,\n\t\tmaxTokens: contextWindow,\n\t\tcompat: {\n\t\t\tsupportsStore: false,\n\t\t\tsupportsDeveloperRole: false,\n\t\t\tsupportsReasoningEffort: false,\n\t\t\tsupportsUsageInStreaming: true,\n\t\t\tsupportsStrictMode: false,\n\t\t\tmaxTokensField: \"max_tokens\",\n\t\t\t...(reasoning && { thinkingFormat: \"qwen-chat-template\" }),\n\t\t},\n\t};\n}\n\nexport interface LlamaProviderController {\n\tprovider: Provider<\"openai-completions\">;\n\tsetCatalog(models: readonly LlamaModelInfo[], serverUrl: string, options?: { routerAutoload?: boolean }): void;\n}\n\nexport function createLlamaProvider(): LlamaProviderController {\n\tlet models: readonly Model<\"openai-completions\">[] = [];\n\tlet classifiers: readonly ClassifierModel<LlamaClassifierApi>[] = [];\n\tconst fallbackClassifier = llamaCppClassifyApi();\n\tconst decisionClassifier = typesafeSystemOneApi();\n\n\tconst setCatalog = (\n\t\tcatalog: readonly LlamaModelInfo[],\n\t\tserverUrl: string,\n\t\toptions: { routerAutoload?: boolean } = {},\n\t): void => {\n\t\tconst selectable = catalog.filter((model) => modelIsSelectable(model, options.routerAutoload === true));\n\t\tmodels = selectable.filter(isChatModel).map((model) => toPiModel(model, serverUrl));\n\t\tclassifiers = selectable.map((model) => toPiClassifierModel(model, serverUrl));\n\t};\n\n\tconst provider: Provider<\"openai-completions\"> = {\n\t\tid: LLAMA_PROVIDER_ID,\n\t\tname: \"llama.cpp\",\n\t\tbaseUrl: llamaInferenceUrl(DEFAULT_LLAMA_SERVER_URL),\n\t\tauth: {\n\t\t\tapiKey: {\n\t\t\t\tname: \"llama.cpp server\",\n\t\t\t\tlogin: async (interaction): Promise<ApiKeyCredential> => {\n\t\t\t\t\tconst enteredUrl = await interaction.prompt({\n\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\tmessage: \"llama.cpp server URL\",\n\t\t\t\t\t\tplaceholder: process.env.LLAMA_BASE_URL ?? DEFAULT_LLAMA_SERVER_URL,\n\t\t\t\t\t});\n\t\t\t\t\tconst serverUrl = normalizeLlamaServerUrl(\n\t\t\t\t\t\tenteredUrl.trim() || process.env.LLAMA_BASE_URL || DEFAULT_LLAMA_SERVER_URL,\n\t\t\t\t\t);\n\t\t\t\t\tconst apiKey = (\n\t\t\t\t\t\tawait interaction.prompt({\n\t\t\t\t\t\t\ttype: \"secret\",\n\t\t\t\t\t\t\tmessage: \"API key (optional)\",\n\t\t\t\t\t\t})\n\t\t\t\t\t).trim();\n\t\t\t\t\tawait new LlamaClient(serverUrl, apiKey || undefined).list({ signal: interaction.signal });\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttype: \"api_key\",\n\t\t\t\t\t\tkey: apiKey || undefined,\n\t\t\t\t\t\tenv: { LLAMA_BASE_URL: serverUrl },\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t\tcheck: async ({ ctx, credential }) => {\n\t\t\t\t\tconst serverUrl = await resolveServerUrl(ctx, credential);\n\t\t\t\t\treturn serverUrl\n\t\t\t\t\t\t? { type: \"api_key\", source: credential ? \"stored credential\" : \"LLAMA_BASE_URL\" }\n\t\t\t\t\t\t: undefined;\n\t\t\t\t},\n\t\t\t\tresolve: async ({ ctx, credential }): Promise<AuthResult | undefined> => {\n\t\t\t\t\tconst serverUrl = await resolveServerUrl(ctx, credential);\n\t\t\t\t\tif (!serverUrl) return undefined;\n\t\t\t\t\tconst apiKey = credential?.key ?? (await ctx.env(\"LLAMA_API_KEY\")) ?? \"local\";\n\t\t\t\t\treturn {\n\t\t\t\t\t\tauth: { apiKey, baseUrl: llamaInferenceUrl(serverUrl) },\n\t\t\t\t\t\tenv: { ...credential?.env, LLAMA_BASE_URL: serverUrl },\n\t\t\t\t\t\tsource: credential ? \"stored credential\" : \"LLAMA_BASE_URL\",\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tgetModels: () => models,\n\t\tgetAllModels: () => [...models, ...classifiers],\n\t\trefreshModels: async (context: RefreshModelsContext): Promise<void> => {\n\t\t\tconst cachedContextWindows = new Map<string, number>();\n\t\t\tif (context.stored) {\n\t\t\t\tconst stored = context.stored.models.filter((model) => model.provider === LLAMA_PROVIDER_ID);\n\t\t\t\tconst restored = stored.filter(\n\t\t\t\t\t(model): model is Model<\"openai-completions\"> =>\n\t\t\t\t\t\tisModelType(model, \"chat\") && model.api === \"openai-completions\",\n\t\t\t\t);\n\t\t\t\tconst restoredClassifiers = stored.filter(isLlamaClassifierModel);\n\t\t\t\tfor (const model of [...restored, ...restoredClassifiers])\n\t\t\t\t\tcachedContextWindows.set(model.id, model.contextWindow);\n\t\t\t\tif (\n\t\t\t\t\t!(await context.publish({\n\t\t\t\t\t\tupdate: () => {\n\t\t\t\t\t\t\tmodels = restored;\n\t\t\t\t\t\t\tclassifiers = restoredClassifiers;\n\t\t\t\t\t\t},\n\t\t\t\t\t}))\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!context.allowNetwork || context.signal.aborted || context.credential?.type !== \"api_key\") return;\n\t\t\tconst serverUrl = credentialServerUrl(context.credential);\n\t\t\tif (!serverUrl) return;\n\t\t\tconst client = new LlamaClient(serverUrl, context.credential.key);\n\t\t\tconst catalog = await client.list({ signal: context.signal });\n\t\t\tif (context.signal.aborted) return;\n\t\t\tconst routerAutoload = await routerAutoloadEnabled(client, catalog, context.signal);\n\t\t\tif (context.signal.aborted) return;\n\t\t\tconst selectable = catalog.filter((model) => modelIsSelectable(model, routerAutoload));\n\t\t\tconst refreshed = await Promise.all(\n\t\t\t\tselectable.filter(isChatModel).map(async (model) => {\n\t\t\t\t\t// Query only loaded models: sleeping and autoload presets must not be woken by discovery.\n\t\t\t\t\tconst cachedContextWindow = cachedContextWindows.get(model.id);\n\t\t\t\t\tif (model.status.value !== \"loaded\") return toPiModel(model, serverUrl, undefined, cachedContextWindow);\n\t\t\t\t\treturn toPiModel(\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\tserverUrl,\n\t\t\t\t\t\tawait client.props({ model: model.id, signal: context.signal }),\n\t\t\t\t\t\tcachedContextWindow,\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t\t);\n\t\t\tconst refreshedClassifiers = selectable.map((model) =>\n\t\t\t\ttoPiClassifierModel(model, serverUrl, cachedContextWindows.get(model.id)),\n\t\t\t);\n\t\t\tif (context.signal.aborted) return;\n\t\t\tawait context.publish({\n\t\t\t\tpersist: { models: [...refreshed, ...refreshedClassifiers], checkedAt: Date.now() },\n\t\t\t\tupdate: () => {\n\t\t\t\t\tmodels = refreshed;\n\t\t\t\t\tclassifiers = refreshedClassifiers;\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\tstream: (model, context, options) => stream(model, context, options as ProviderStreamOptions | undefined),\n\t\tstreamSimple: (model, context, options) => streamSimple(model, context, options),\n\t\tclassify: (model, context, options) =>\n\t\t\t(model.api === \"typesafe-system-one\" ? decisionClassifier : fallbackClassifier).classify(\n\t\t\t\tmodel,\n\t\t\t\tcontext,\n\t\t\t\toptions,\n\t\t\t),\n\t};\n\n\treturn { provider, setCatalog };\n}\n"]}