@namzu/sdk 34.2.0 → 35.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (637) hide show
  1. package/CHANGELOG.md +133 -0
  2. package/README.md +2 -6
  3. package/dist/agents/PipelineAgent.d.ts.map +1 -1
  4. package/dist/agents/PipelineAgent.js +118 -100
  5. package/dist/agents/PipelineAgent.js.map +1 -1
  6. package/dist/agents/ReactiveAgent.d.ts.map +1 -1
  7. package/dist/agents/ReactiveAgent.js +2 -0
  8. package/dist/agents/ReactiveAgent.js.map +1 -1
  9. package/dist/agents/RouterAgent.d.ts.map +1 -1
  10. package/dist/agents/RouterAgent.js +105 -61
  11. package/dist/agents/RouterAgent.js.map +1 -1
  12. package/dist/agents/SupervisorAgent.d.ts.map +1 -1
  13. package/dist/agents/SupervisorAgent.js +8 -4
  14. package/dist/agents/SupervisorAgent.js.map +1 -1
  15. package/dist/agents/budget.d.ts +6 -0
  16. package/dist/agents/budget.d.ts.map +1 -0
  17. package/dist/agents/budget.js +33 -0
  18. package/dist/agents/budget.js.map +1 -0
  19. package/dist/agents/explore.d.ts +20 -0
  20. package/dist/agents/explore.d.ts.map +1 -0
  21. package/dist/agents/explore.js +26 -0
  22. package/dist/agents/explore.js.map +1 -0
  23. package/dist/agents/file-definitions.d.ts +80 -0
  24. package/dist/agents/file-definitions.d.ts.map +1 -0
  25. package/dist/agents/file-definitions.js +179 -0
  26. package/dist/agents/file-definitions.js.map +1 -0
  27. package/dist/agents/index.d.ts +3 -0
  28. package/dist/agents/index.d.ts.map +1 -1
  29. package/dist/agents/index.js +2 -0
  30. package/dist/agents/index.js.map +1 -1
  31. package/dist/bridge/a2a/mapper.d.ts.map +1 -1
  32. package/dist/bridge/a2a/mapper.js +6 -0
  33. package/dist/bridge/a2a/mapper.js.map +1 -1
  34. package/dist/bridge/sse/mapper.d.ts.map +1 -1
  35. package/dist/bridge/sse/mapper.js +22 -0
  36. package/dist/bridge/sse/mapper.js.map +1 -1
  37. package/dist/bus/lock.d.ts.map +1 -1
  38. package/dist/bus/lock.js +1 -10
  39. package/dist/bus/lock.js.map +1 -1
  40. package/dist/compaction/consolidation.d.ts +31 -0
  41. package/dist/compaction/consolidation.d.ts.map +1 -0
  42. package/dist/compaction/consolidation.js +63 -0
  43. package/dist/compaction/consolidation.js.map +1 -0
  44. package/dist/compaction/factory.d.ts.map +1 -1
  45. package/dist/compaction/factory.js +3 -0
  46. package/dist/compaction/factory.js.map +1 -1
  47. package/dist/compaction/index.d.ts +6 -1
  48. package/dist/compaction/index.d.ts.map +1 -1
  49. package/dist/compaction/index.js +6 -0
  50. package/dist/compaction/index.js.map +1 -1
  51. package/dist/compaction/manager.d.ts +7 -0
  52. package/dist/compaction/manager.d.ts.map +1 -1
  53. package/dist/compaction/manager.js +31 -0
  54. package/dist/compaction/manager.js.map +1 -1
  55. package/dist/compaction/plan.d.ts +23 -0
  56. package/dist/compaction/plan.d.ts.map +1 -1
  57. package/dist/compaction/plan.js +41 -24
  58. package/dist/compaction/plan.js.map +1 -1
  59. package/dist/compaction/salience/bm25.d.ts +26 -0
  60. package/dist/compaction/salience/bm25.d.ts.map +1 -0
  61. package/dist/compaction/salience/bm25.js +56 -0
  62. package/dist/compaction/salience/bm25.js.map +1 -0
  63. package/dist/compaction/salience/goal.d.ts +21 -0
  64. package/dist/compaction/salience/goal.d.ts.map +1 -0
  65. package/dist/compaction/salience/goal.js +32 -0
  66. package/dist/compaction/salience/goal.js.map +1 -0
  67. package/dist/compaction/salience/index.d.ts +4 -0
  68. package/dist/compaction/salience/index.d.ts.map +1 -0
  69. package/dist/compaction/salience/index.js +4 -0
  70. package/dist/compaction/salience/index.js.map +1 -0
  71. package/dist/compaction/salience/minhash.d.ts +17 -0
  72. package/dist/compaction/salience/minhash.d.ts.map +1 -0
  73. package/dist/compaction/salience/minhash.js +54 -0
  74. package/dist/compaction/salience/minhash.js.map +1 -0
  75. package/dist/compaction/salience/score.d.ts +64 -0
  76. package/dist/compaction/salience/score.d.ts.map +1 -0
  77. package/dist/compaction/salience/score.js +256 -0
  78. package/dist/compaction/salience/score.js.map +1 -0
  79. package/dist/compaction/salience/tokenize.d.ts +20 -0
  80. package/dist/compaction/salience/tokenize.d.ts.map +1 -0
  81. package/dist/compaction/salience/tokenize.js +92 -0
  82. package/dist/compaction/salience/tokenize.js.map +1 -0
  83. package/dist/compaction/salience/working-set.d.ts +59 -0
  84. package/dist/compaction/salience/working-set.d.ts.map +1 -0
  85. package/dist/compaction/salience/working-set.js +137 -0
  86. package/dist/compaction/salience/working-set.js.map +1 -0
  87. package/dist/compaction/serializer.d.ts +2 -0
  88. package/dist/compaction/serializer.d.ts.map +1 -1
  89. package/dist/compaction/serializer.js +15 -0
  90. package/dist/compaction/serializer.js.map +1 -1
  91. package/dist/compaction/token-estimate.d.ts +13 -0
  92. package/dist/compaction/token-estimate.d.ts.map +1 -0
  93. package/dist/compaction/token-estimate.js +58 -0
  94. package/dist/compaction/token-estimate.js.map +1 -0
  95. package/dist/compaction/tool-result-editing.d.ts +10 -2
  96. package/dist/compaction/tool-result-editing.d.ts.map +1 -1
  97. package/dist/compaction/tool-result-editing.js +22 -24
  98. package/dist/compaction/tool-result-editing.js.map +1 -1
  99. package/dist/compaction/types.d.ts +22 -1
  100. package/dist/compaction/types.d.ts.map +1 -1
  101. package/dist/compaction/wire.d.ts +3 -1
  102. package/dist/compaction/wire.d.ts.map +1 -1
  103. package/dist/compaction/wire.js +2 -0
  104. package/dist/compaction/wire.js.map +1 -1
  105. package/dist/config/runtime.d.ts +58 -28
  106. package/dist/config/runtime.d.ts.map +1 -1
  107. package/dist/config/runtime.js +13 -1
  108. package/dist/config/runtime.js.map +1 -1
  109. package/dist/connector/builtins/http.d.ts.map +1 -1
  110. package/dist/connector/builtins/http.js +2 -8
  111. package/dist/connector/builtins/http.js.map +1 -1
  112. package/dist/connector/builtins/webhook.js +2 -2
  113. package/dist/connector/builtins/webhook.js.map +1 -1
  114. package/dist/connector/mcp/adapter.d.ts +2 -0
  115. package/dist/connector/mcp/adapter.d.ts.map +1 -1
  116. package/dist/connector/mcp/adapter.js +30 -0
  117. package/dist/connector/mcp/adapter.js.map +1 -1
  118. package/dist/connector/tools/adapter.js +2 -2
  119. package/dist/connector/tools/adapter.js.map +1 -1
  120. package/dist/connector/tools/definitions.js +2 -2
  121. package/dist/connector/tools/definitions.js.map +1 -1
  122. package/dist/constants/compaction/index.d.ts +1 -0
  123. package/dist/constants/compaction/index.d.ts.map +1 -1
  124. package/dist/constants/compaction/index.js +1 -0
  125. package/dist/constants/compaction/index.js.map +1 -1
  126. package/dist/constants/telemetry/index.d.ts +0 -1
  127. package/dist/constants/telemetry/index.d.ts.map +1 -1
  128. package/dist/constants/telemetry/index.js +0 -1
  129. package/dist/constants/telemetry/index.js.map +1 -1
  130. package/dist/contracts/a2a.d.ts +5 -5
  131. package/dist/contracts/api.d.ts +4 -2
  132. package/dist/contracts/api.d.ts.map +1 -1
  133. package/dist/contracts/schemas.d.ts +1 -15
  134. package/dist/contracts/schemas.d.ts.map +1 -1
  135. package/dist/contracts/schemas.js +5 -20
  136. package/dist/contracts/schemas.js.map +1 -1
  137. package/dist/invariants/index.d.ts +1 -1
  138. package/dist/manager/agent/lifecycle.d.ts +2 -18
  139. package/dist/manager/agent/lifecycle.d.ts.map +1 -1
  140. package/dist/manager/agent/lifecycle.js +373 -340
  141. package/dist/manager/agent/lifecycle.js.map +1 -1
  142. package/dist/manager/run/persistence.d.ts +3 -0
  143. package/dist/manager/run/persistence.d.ts.map +1 -1
  144. package/dist/manager/run/persistence.js +35 -5
  145. package/dist/manager/run/persistence.js.map +1 -1
  146. package/dist/plugin/index.d.ts +2 -0
  147. package/dist/plugin/index.d.ts.map +1 -1
  148. package/dist/plugin/index.js +1 -0
  149. package/dist/plugin/index.js.map +1 -1
  150. package/dist/plugin/shell-hook.d.ts +128 -0
  151. package/dist/plugin/shell-hook.d.ts.map +1 -0
  152. package/dist/plugin/shell-hook.js +299 -0
  153. package/dist/plugin/shell-hook.js.map +1 -0
  154. package/dist/prompt/coding-agent-doctrine.d.ts +63 -0
  155. package/dist/prompt/coding-agent-doctrine.d.ts.map +1 -0
  156. package/dist/prompt/coding-agent-doctrine.js +100 -0
  157. package/dist/prompt/coding-agent-doctrine.js.map +1 -0
  158. package/dist/prompt/index.d.ts +2 -0
  159. package/dist/prompt/index.d.ts.map +1 -1
  160. package/dist/prompt/index.js +1 -0
  161. package/dist/prompt/index.js.map +1 -1
  162. package/dist/provider/errors.d.ts +1 -1
  163. package/dist/provider/errors.js +1 -1
  164. package/dist/provider/fallback.d.ts +2 -0
  165. package/dist/provider/fallback.d.ts.map +1 -1
  166. package/dist/provider/fallback.js +3 -1
  167. package/dist/provider/fallback.js.map +1 -1
  168. package/dist/provider/retry.d.ts +2 -0
  169. package/dist/provider/retry.d.ts.map +1 -1
  170. package/dist/provider/retry.js +3 -1
  171. package/dist/provider/retry.js.map +1 -1
  172. package/dist/provider/token-budget.d.ts +13 -0
  173. package/dist/provider/token-budget.d.ts.map +1 -0
  174. package/dist/provider/token-budget.js +102 -0
  175. package/dist/provider/token-budget.js.map +1 -0
  176. package/dist/public-runtime.d.ts +12 -12
  177. package/dist/public-runtime.d.ts.map +1 -1
  178. package/dist/public-runtime.js +14 -9
  179. package/dist/public-runtime.js.map +1 -1
  180. package/dist/public-tools.d.ts +2 -0
  181. package/dist/public-tools.d.ts.map +1 -1
  182. package/dist/public-tools.js +2 -0
  183. package/dist/public-tools.js.map +1 -1
  184. package/dist/public-types.d.ts +12 -2
  185. package/dist/public-types.d.ts.map +1 -1
  186. package/dist/registry/command/kernel-commands.d.ts.map +1 -1
  187. package/dist/registry/command/kernel-commands.js +18 -6
  188. package/dist/registry/command/kernel-commands.js.map +1 -1
  189. package/dist/registry/tool/execute.d.ts.map +1 -1
  190. package/dist/registry/tool/execute.js +4 -1
  191. package/dist/registry/tool/execute.js.map +1 -1
  192. package/dist/run/LimitChecker.js +1 -1
  193. package/dist/run/LimitChecker.js.map +1 -1
  194. package/dist/run/drain.js +1 -1
  195. package/dist/run/reporter.d.ts.map +1 -1
  196. package/dist/run/reporter.js +15 -0
  197. package/dist/run/reporter.js.map +1 -1
  198. package/dist/run/token-budget.d.ts +108 -0
  199. package/dist/run/token-budget.d.ts.map +1 -0
  200. package/dist/run/token-budget.js +591 -0
  201. package/dist/run/token-budget.js.map +1 -0
  202. package/dist/runtime/jobs/registry.d.ts +29 -0
  203. package/dist/runtime/jobs/registry.d.ts.map +1 -1
  204. package/dist/runtime/jobs/registry.js +98 -18
  205. package/dist/runtime/jobs/registry.js.map +1 -1
  206. package/dist/runtime/query/checkpoint.d.ts.map +1 -1
  207. package/dist/runtime/query/checkpoint.js +10 -3
  208. package/dist/runtime/query/checkpoint.js.map +1 -1
  209. package/dist/runtime/query/context.d.ts +2 -26
  210. package/dist/runtime/query/context.d.ts.map +1 -1
  211. package/dist/runtime/query/context.js +1 -29
  212. package/dist/runtime/query/context.js.map +1 -1
  213. package/dist/runtime/query/executor.d.ts +12 -9
  214. package/dist/runtime/query/executor.d.ts.map +1 -1
  215. package/dist/runtime/query/executor.js +95 -46
  216. package/dist/runtime/query/executor.js.map +1 -1
  217. package/dist/runtime/query/guard.d.ts.map +1 -1
  218. package/dist/runtime/query/guard.js +8 -0
  219. package/dist/runtime/query/guard.js.map +1 -1
  220. package/dist/runtime/query/index.d.ts +35 -4
  221. package/dist/runtime/query/index.d.ts.map +1 -1
  222. package/dist/runtime/query/index.js +152 -52
  223. package/dist/runtime/query/index.js.map +1 -1
  224. package/dist/runtime/query/iteration/index.d.ts.map +1 -1
  225. package/dist/runtime/query/iteration/index.js +16 -5
  226. package/dist/runtime/query/iteration/index.js.map +1 -1
  227. package/dist/runtime/query/iteration/phases/compaction.d.ts.map +1 -1
  228. package/dist/runtime/query/iteration/phases/compaction.js +98 -30
  229. package/dist/runtime/query/iteration/phases/compaction.js.map +1 -1
  230. package/dist/runtime/query/iteration/phases/context.d.ts +2 -0
  231. package/dist/runtime/query/iteration/phases/context.d.ts.map +1 -1
  232. package/dist/runtime/query/iteration/phases/context.js.map +1 -1
  233. package/dist/runtime/query/iteration/phases/tool-review.d.ts.map +1 -1
  234. package/dist/runtime/query/iteration/phases/tool-review.js +29 -7
  235. package/dist/runtime/query/iteration/phases/tool-review.js.map +1 -1
  236. package/dist/runtime/query/iteration/phases/working-memory.d.ts.map +1 -1
  237. package/dist/runtime/query/iteration/phases/working-memory.js +25 -15
  238. package/dist/runtime/query/iteration/phases/working-memory.js.map +1 -1
  239. package/dist/runtime/query/plugin-hooks.d.ts +1 -1
  240. package/dist/runtime/query/plugin-hooks.d.ts.map +1 -1
  241. package/dist/runtime/query/plugin-hooks.js +20 -1
  242. package/dist/runtime/query/plugin-hooks.js.map +1 -1
  243. package/dist/runtime/query/repeat-call.d.ts +20 -2
  244. package/dist/runtime/query/repeat-call.d.ts.map +1 -1
  245. package/dist/runtime/query/repeat-call.js +35 -7
  246. package/dist/runtime/query/repeat-call.js.map +1 -1
  247. package/dist/runtime/query/result.d.ts.map +1 -1
  248. package/dist/runtime/query/result.js +9 -0
  249. package/dist/runtime/query/result.js.map +1 -1
  250. package/dist/runtime/query/review-policy.d.ts +142 -0
  251. package/dist/runtime/query/review-policy.d.ts.map +1 -0
  252. package/dist/runtime/query/review-policy.js +144 -0
  253. package/dist/runtime/query/review-policy.js.map +1 -0
  254. package/dist/runtime/query/run-state.d.ts.map +1 -1
  255. package/dist/runtime/query/run-state.js +4 -0
  256. package/dist/runtime/query/run-state.js.map +1 -1
  257. package/dist/runtime/query/steering.d.ts +4 -0
  258. package/dist/runtime/query/steering.d.ts.map +1 -1
  259. package/dist/runtime/query/steering.js +29 -0
  260. package/dist/runtime/query/steering.js.map +1 -1
  261. package/dist/runtime/query/token-budget.d.ts +7 -0
  262. package/dist/runtime/query/token-budget.d.ts.map +1 -0
  263. package/dist/runtime/query/token-budget.js +101 -0
  264. package/dist/runtime/query/token-budget.js.map +1 -0
  265. package/dist/runtime/query/tool-output-budget.d.ts +2 -0
  266. package/dist/runtime/query/tool-output-budget.d.ts.map +1 -1
  267. package/dist/runtime/query/tool-output-budget.js +29 -11
  268. package/dist/runtime/query/tool-output-budget.js.map +1 -1
  269. package/dist/runtime/query/tool-pause.d.ts.map +1 -1
  270. package/dist/runtime/query/tool-pause.js +4 -2
  271. package/dist/runtime/query/tool-pause.js.map +1 -1
  272. package/dist/runtime/query/tooling.d.ts +4 -0
  273. package/dist/runtime/query/tooling.d.ts.map +1 -1
  274. package/dist/runtime/query/tooling.js +4 -0
  275. package/dist/runtime/query/tooling.js.map +1 -1
  276. package/dist/sandbox/provider/local.d.ts +3 -1
  277. package/dist/sandbox/provider/local.d.ts.map +1 -1
  278. package/dist/sandbox/provider/local.js +112 -12
  279. package/dist/sandbox/provider/local.js.map +1 -1
  280. package/dist/scheduler/delegating.d.ts +1 -0
  281. package/dist/scheduler/delegating.d.ts.map +1 -1
  282. package/dist/scheduler/delegating.js +29 -12
  283. package/dist/scheduler/delegating.js.map +1 -1
  284. package/dist/scheduler/local.d.ts +1 -0
  285. package/dist/scheduler/local.d.ts.map +1 -1
  286. package/dist/scheduler/local.js +4 -7
  287. package/dist/scheduler/local.js.map +1 -1
  288. package/dist/session/index.d.ts +0 -1
  289. package/dist/session/index.d.ts.map +1 -1
  290. package/dist/session/index.js +0 -1
  291. package/dist/session/index.js.map +1 -1
  292. package/dist/session/workspace/path-builder.d.ts.map +1 -1
  293. package/dist/session/workspace/path-builder.js +5 -4
  294. package/dist/session/workspace/path-builder.js.map +1 -1
  295. package/dist/store/feedback/disk.d.ts.map +1 -1
  296. package/dist/store/feedback/disk.js +4 -6
  297. package/dist/store/feedback/disk.js.map +1 -1
  298. package/dist/store/index.d.ts +2 -0
  299. package/dist/store/index.d.ts.map +1 -1
  300. package/dist/store/index.js +1 -0
  301. package/dist/store/index.js.map +1 -1
  302. package/dist/store/memory/disk.d.ts.map +1 -1
  303. package/dist/store/memory/disk.js +3 -12
  304. package/dist/store/memory/disk.js.map +1 -1
  305. package/dist/store/run/checkpoint-disk.d.ts +3 -3
  306. package/dist/store/run/checkpoint-disk.d.ts.map +1 -1
  307. package/dist/store/run/checkpoint-disk.js +14 -26
  308. package/dist/store/run/checkpoint-disk.js.map +1 -1
  309. package/dist/store/run/claim-disk.js +1 -1
  310. package/dist/store/run/conformance.d.ts +1 -1
  311. package/dist/store/run/conformance.d.ts.map +1 -1
  312. package/dist/store/run/conformance.js +41 -33
  313. package/dist/store/run/conformance.js.map +1 -1
  314. package/dist/store/run/disk.d.ts.map +1 -1
  315. package/dist/store/run/disk.js +20 -4
  316. package/dist/store/run/disk.js.map +1 -1
  317. package/dist/store/run/token-budget-disk.d.ts +37 -0
  318. package/dist/store/run/token-budget-disk.d.ts.map +1 -0
  319. package/dist/store/run/token-budget-disk.js +208 -0
  320. package/dist/store/run/token-budget-disk.js.map +1 -0
  321. package/dist/store/session/disk.d.ts +4 -13
  322. package/dist/store/session/disk.d.ts.map +1 -1
  323. package/dist/store/session/disk.js +34 -31
  324. package/dist/store/session/disk.js.map +1 -1
  325. package/dist/store/session/memory.d.ts +2 -0
  326. package/dist/store/session/memory.d.ts.map +1 -1
  327. package/dist/store/session/memory.js +41 -2
  328. package/dist/store/session/memory.js.map +1 -1
  329. package/dist/store/task/disk.d.ts.map +1 -1
  330. package/dist/store/task/disk.js +7 -8
  331. package/dist/store/task/disk.js.map +1 -1
  332. package/dist/store/topic/memory.d.ts +2 -0
  333. package/dist/store/topic/memory.d.ts.map +1 -1
  334. package/dist/store/topic/memory.js +13 -1
  335. package/dist/store/topic/memory.js.map +1 -1
  336. package/dist/test-support/ids.d.ts +4 -19
  337. package/dist/test-support/ids.d.ts.map +1 -1
  338. package/dist/test-support/ids.js +51 -59
  339. package/dist/test-support/ids.js.map +1 -1
  340. package/dist/tools/advisory/index.d.ts.map +1 -1
  341. package/dist/tools/advisory/index.js +3 -1
  342. package/dist/tools/advisory/index.js.map +1 -1
  343. package/dist/tools/builtins/bash.d.ts +2 -0
  344. package/dist/tools/builtins/bash.d.ts.map +1 -1
  345. package/dist/tools/builtins/bash.js +9 -11
  346. package/dist/tools/builtins/bash.js.map +1 -1
  347. package/dist/tools/builtins/computer-use.d.ts +2 -2
  348. package/dist/tools/builtins/computer-use.d.ts.map +1 -1
  349. package/dist/tools/builtins/computer-use.js +4 -2
  350. package/dist/tools/builtins/computer-use.js.map +1 -1
  351. package/dist/tools/builtins/edit.js +2 -2
  352. package/dist/tools/builtins/edit.js.map +1 -1
  353. package/dist/tools/builtins/glob.js +3 -3
  354. package/dist/tools/builtins/glob.js.map +1 -1
  355. package/dist/tools/builtins/grep.js +2 -2
  356. package/dist/tools/builtins/grep.js.map +1 -1
  357. package/dist/tools/builtins/ls.js +2 -2
  358. package/dist/tools/builtins/ls.js.map +1 -1
  359. package/dist/tools/builtins/lsp.js +2 -2
  360. package/dist/tools/builtins/lsp.js.map +1 -1
  361. package/dist/tools/builtins/read-file.js +2 -2
  362. package/dist/tools/builtins/read-file.js.map +1 -1
  363. package/dist/tools/builtins/write-file.js +2 -2
  364. package/dist/tools/builtins/write-file.js.map +1 -1
  365. package/dist/tools/coordinator/ask-user-question.d.ts +33 -0
  366. package/dist/tools/coordinator/ask-user-question.d.ts.map +1 -0
  367. package/dist/tools/coordinator/ask-user-question.js +237 -0
  368. package/dist/tools/coordinator/ask-user-question.js.map +1 -0
  369. package/dist/tools/coordinator/index.d.ts +1 -2
  370. package/dist/tools/coordinator/index.d.ts.map +1 -1
  371. package/dist/tools/coordinator/index.js +4 -220
  372. package/dist/tools/coordinator/index.js.map +1 -1
  373. package/dist/tools/memory/read.d.ts.map +1 -1
  374. package/dist/tools/memory/read.js +2 -4
  375. package/dist/tools/memory/read.js.map +1 -1
  376. package/dist/tools/paths.d.ts +13 -0
  377. package/dist/tools/paths.d.ts.map +1 -1
  378. package/dist/tools/paths.js +53 -0
  379. package/dist/tools/paths.js.map +1 -1
  380. package/dist/tools/roster.d.ts +27 -0
  381. package/dist/tools/roster.d.ts.map +1 -0
  382. package/dist/tools/roster.js +42 -0
  383. package/dist/tools/roster.js.map +1 -0
  384. package/dist/types/agent/base.d.ts +5 -0
  385. package/dist/types/agent/base.d.ts.map +1 -1
  386. package/dist/types/agent/pipeline.d.ts +3 -0
  387. package/dist/types/agent/pipeline.d.ts.map +1 -1
  388. package/dist/types/agent/router.d.ts +2 -3
  389. package/dist/types/agent/router.d.ts.map +1 -1
  390. package/dist/types/agent/scheduler.d.ts +3 -0
  391. package/dist/types/agent/scheduler.d.ts.map +1 -1
  392. package/dist/types/agent/task.d.ts +5 -16
  393. package/dist/types/agent/task.d.ts.map +1 -1
  394. package/dist/types/agent/task.js.map +1 -1
  395. package/dist/types/common/index.d.ts.map +1 -1
  396. package/dist/types/common/index.js +3 -0
  397. package/dist/types/common/index.js.map +1 -1
  398. package/dist/types/computer-use/index.d.ts +8 -0
  399. package/dist/types/computer-use/index.d.ts.map +1 -1
  400. package/dist/types/computer-use/index.js.map +1 -1
  401. package/dist/types/hitl/index.d.ts +5 -0
  402. package/dist/types/hitl/index.d.ts.map +1 -1
  403. package/dist/types/hitl/index.js.map +1 -1
  404. package/dist/types/ids/brand.d.ts +5 -47
  405. package/dist/types/ids/brand.d.ts.map +1 -1
  406. package/dist/types/ids/brand.js +2 -39
  407. package/dist/types/ids/brand.js.map +1 -1
  408. package/dist/types/ids/index.d.ts +59 -69
  409. package/dist/types/ids/index.d.ts.map +1 -1
  410. package/dist/types/ids/index.js +12 -10
  411. package/dist/types/ids/index.js.map +1 -1
  412. package/dist/types/permission/index.d.ts +9 -0
  413. package/dist/types/permission/index.d.ts.map +1 -1
  414. package/dist/types/permission/index.js +9 -1
  415. package/dist/types/permission/index.js.map +1 -1
  416. package/dist/types/plugin/index.d.ts +45 -4
  417. package/dist/types/plugin/index.d.ts.map +1 -1
  418. package/dist/types/plugin/index.js +7 -0
  419. package/dist/types/plugin/index.js.map +1 -1
  420. package/dist/types/run/config.d.ts +3 -0
  421. package/dist/types/run/config.d.ts.map +1 -1
  422. package/dist/types/run/emergency.d.ts +5 -0
  423. package/dist/types/run/emergency.d.ts.map +1 -1
  424. package/dist/types/run/emergency.js.map +1 -1
  425. package/dist/types/run/entity.d.ts +6 -2
  426. package/dist/types/run/entity.d.ts.map +1 -1
  427. package/dist/types/run/events.d.ts +35 -0
  428. package/dist/types/run/events.d.ts.map +1 -1
  429. package/dist/types/run/events.js.map +1 -1
  430. package/dist/types/run/index.d.ts +1 -0
  431. package/dist/types/run/index.d.ts.map +1 -1
  432. package/dist/types/run/index.js +1 -0
  433. package/dist/types/run/index.js.map +1 -1
  434. package/dist/types/run/state.d.ts +16 -15
  435. package/dist/types/run/state.d.ts.map +1 -1
  436. package/dist/types/run/state.js +41 -22
  437. package/dist/types/run/state.js.map +1 -1
  438. package/dist/types/run/stop-reason.d.ts +3 -14
  439. package/dist/types/run/stop-reason.d.ts.map +1 -1
  440. package/dist/types/run/token-budget-store.d.ts +29 -0
  441. package/dist/types/run/token-budget-store.d.ts.map +1 -0
  442. package/dist/types/run/token-budget-store.js +25 -0
  443. package/dist/types/run/token-budget-store.js.map +1 -0
  444. package/dist/types/sandbox/index.d.ts +27 -2
  445. package/dist/types/sandbox/index.d.ts.map +1 -1
  446. package/dist/types/sandbox/index.js.map +1 -1
  447. package/dist/types/session/store.d.ts +8 -0
  448. package/dist/types/session/store.d.ts.map +1 -1
  449. package/dist/types/tool/index.d.ts +15 -0
  450. package/dist/types/tool/index.d.ts.map +1 -1
  451. package/dist/types/tool/index.js.map +1 -1
  452. package/dist/utils/frontmatter.d.ts +1 -1
  453. package/dist/utils/frontmatter.js +1 -1
  454. package/dist/utils/id-format.d.ts +3 -0
  455. package/dist/utils/id-format.d.ts.map +1 -0
  456. package/dist/utils/id-format.js +9 -0
  457. package/dist/utils/id-format.js.map +1 -0
  458. package/dist/utils/id.d.ts +65 -32
  459. package/dist/utils/id.d.ts.map +1 -1
  460. package/dist/utils/id.js +168 -148
  461. package/dist/utils/id.js.map +1 -1
  462. package/dist/utils/log/exception.js +1 -1
  463. package/dist/utils/log/exception.js.map +1 -1
  464. package/dist/utils/log/index.d.ts.map +1 -1
  465. package/dist/utils/log/index.js +1 -2
  466. package/dist/utils/log/index.js.map +1 -1
  467. package/dist/utils/log/templates.d.ts.map +1 -1
  468. package/dist/utils/log/templates.js +0 -1
  469. package/dist/utils/log/templates.js.map +1 -1
  470. package/package.json +1 -1
  471. package/src/agents/AGENTS.md +1 -1
  472. package/src/agents/PipelineAgent.ts +129 -109
  473. package/src/agents/ReactiveAgent.ts +2 -0
  474. package/src/agents/RouterAgent.ts +120 -73
  475. package/src/agents/SupervisorAgent.ts +12 -4
  476. package/src/agents/budget.ts +42 -0
  477. package/src/agents/explore.ts +29 -0
  478. package/src/agents/file-definitions.ts +237 -0
  479. package/src/agents/index.ts +15 -0
  480. package/src/bridge/a2a/mapper.ts +6 -0
  481. package/src/bridge/sse/mapper.ts +22 -0
  482. package/src/bus/lock.ts +1 -10
  483. package/src/compaction/consolidation.ts +79 -0
  484. package/src/compaction/factory.ts +3 -0
  485. package/src/compaction/index.ts +34 -4
  486. package/src/compaction/manager.ts +39 -1
  487. package/src/compaction/plan.ts +52 -21
  488. package/src/compaction/salience/bm25.ts +72 -0
  489. package/src/compaction/salience/goal.ts +44 -0
  490. package/src/compaction/salience/index.ts +19 -0
  491. package/src/compaction/salience/minhash.ts +53 -0
  492. package/src/compaction/salience/score.ts +305 -0
  493. package/src/compaction/salience/tokenize.ts +89 -0
  494. package/src/compaction/salience/working-set.ts +187 -0
  495. package/src/compaction/serializer.ts +16 -0
  496. package/src/compaction/token-estimate.ts +57 -0
  497. package/src/compaction/tool-result-editing.ts +28 -26
  498. package/src/compaction/types.ts +24 -1
  499. package/src/compaction/wire.ts +5 -1
  500. package/src/config/runtime.ts +13 -1
  501. package/src/connector/builtins/http.ts +2 -8
  502. package/src/connector/builtins/webhook.ts +2 -2
  503. package/src/connector/mcp/adapter.ts +32 -0
  504. package/src/connector/tools/adapter.ts +2 -2
  505. package/src/connector/tools/definitions.ts +2 -2
  506. package/src/constants/compaction/index.ts +1 -0
  507. package/src/constants/telemetry/index.ts +0 -1
  508. package/src/contracts/api.ts +5 -1
  509. package/src/contracts/schemas.ts +6 -20
  510. package/src/invariants/index.ts +1 -1
  511. package/src/manager/agent/lifecycle.ts +380 -352
  512. package/src/manager/run/persistence.ts +35 -5
  513. package/src/plugin/index.ts +19 -0
  514. package/src/plugin/shell-hook.ts +403 -0
  515. package/src/prompt/coding-agent-doctrine.ts +118 -0
  516. package/src/prompt/index.ts +8 -0
  517. package/src/provider/errors.ts +1 -1
  518. package/src/provider/fallback.ts +4 -1
  519. package/src/provider/retry.ts +4 -1
  520. package/src/provider/token-budget.ts +114 -0
  521. package/src/public-runtime.ts +54 -27
  522. package/src/public-tools.ts +5 -0
  523. package/src/public-types.ts +65 -0
  524. package/src/registry/command/kernel-commands.ts +16 -6
  525. package/src/registry/tool/execute.ts +4 -1
  526. package/src/run/LimitChecker.ts +1 -1
  527. package/src/run/drain.ts +1 -1
  528. package/src/run/reporter.ts +15 -0
  529. package/src/run/token-budget.ts +692 -0
  530. package/src/runtime/jobs/registry.ts +123 -17
  531. package/src/runtime/query/checkpoint.ts +10 -3
  532. package/src/runtime/query/context.ts +3 -57
  533. package/src/runtime/query/executor.ts +128 -58
  534. package/src/runtime/query/guard.ts +8 -0
  535. package/src/runtime/query/index.ts +201 -62
  536. package/src/runtime/query/iteration/index.ts +24 -6
  537. package/src/runtime/query/iteration/phases/compaction.ts +130 -31
  538. package/src/runtime/query/iteration/phases/context.ts +2 -0
  539. package/src/runtime/query/iteration/phases/tool-review.ts +39 -7
  540. package/src/runtime/query/iteration/phases/working-memory.ts +23 -14
  541. package/src/runtime/query/plugin-hooks.ts +24 -2
  542. package/src/runtime/query/repeat-call.ts +42 -7
  543. package/src/runtime/query/result.ts +9 -0
  544. package/src/runtime/query/review-policy.ts +231 -0
  545. package/src/runtime/query/run-state.ts +4 -0
  546. package/src/runtime/query/steering.ts +32 -0
  547. package/src/runtime/query/token-budget.ts +127 -0
  548. package/src/runtime/query/tool-output-budget.ts +33 -10
  549. package/src/runtime/query/tool-pause.ts +4 -2
  550. package/src/runtime/query/tooling.ts +8 -0
  551. package/src/sandbox/provider/local.ts +123 -13
  552. package/src/scheduler/delegating.ts +35 -13
  553. package/src/scheduler/local.ts +5 -7
  554. package/src/session/index.ts +0 -1
  555. package/src/session/workspace/path-builder.ts +5 -4
  556. package/src/store/feedback/disk.ts +4 -6
  557. package/src/store/index.ts +2 -0
  558. package/src/store/memory/disk.ts +3 -11
  559. package/src/store/run/checkpoint-disk.ts +14 -27
  560. package/src/store/run/claim-disk.ts +1 -1
  561. package/src/store/run/conformance.ts +55 -39
  562. package/src/store/run/disk.ts +19 -4
  563. package/src/store/run/token-budget-disk.ts +247 -0
  564. package/src/store/session/disk.ts +36 -29
  565. package/src/store/session/memory.ts +38 -1
  566. package/src/store/task/disk.ts +7 -8
  567. package/src/store/topic/memory.ts +13 -1
  568. package/src/test-support/ids.ts +62 -59
  569. package/src/tools/advisory/index.ts +3 -1
  570. package/src/tools/builtins/bash.ts +11 -12
  571. package/src/tools/builtins/computer-use.ts +6 -2
  572. package/src/tools/builtins/edit.ts +2 -2
  573. package/src/tools/builtins/glob.ts +3 -3
  574. package/src/tools/builtins/grep.ts +2 -2
  575. package/src/tools/builtins/ls.ts +2 -2
  576. package/src/tools/builtins/lsp.ts +2 -2
  577. package/src/tools/builtins/read-file.ts +2 -2
  578. package/src/tools/builtins/write-file.ts +2 -2
  579. package/src/tools/coordinator/ask-user-question.ts +284 -0
  580. package/src/tools/coordinator/index.ts +5 -248
  581. package/src/tools/memory/read.ts +2 -4
  582. package/src/tools/paths.ts +64 -0
  583. package/src/tools/roster.ts +46 -0
  584. package/src/types/agent/base.ts +6 -0
  585. package/src/types/agent/pipeline.ts +3 -0
  586. package/src/types/agent/router.ts +2 -3
  587. package/src/types/agent/scheduler.ts +4 -0
  588. package/src/types/agent/task.ts +5 -18
  589. package/src/types/common/index.ts +3 -0
  590. package/src/types/computer-use/index.ts +8 -0
  591. package/src/types/hitl/index.ts +5 -0
  592. package/src/types/ids/brand.ts +5 -48
  593. package/src/types/ids/index.ts +66 -75
  594. package/src/types/permission/index.ts +11 -0
  595. package/src/types/plugin/index.ts +49 -1
  596. package/src/types/run/config.ts +3 -0
  597. package/src/types/run/emergency.ts +5 -0
  598. package/src/types/run/entity.ts +6 -2
  599. package/src/types/run/events.ts +37 -0
  600. package/src/types/run/index.ts +1 -0
  601. package/src/types/run/state.ts +58 -30
  602. package/src/types/run/stop-reason.ts +3 -14
  603. package/src/types/run/token-budget-store.ts +54 -0
  604. package/src/types/sandbox/index.ts +32 -0
  605. package/src/types/session/store.ts +8 -0
  606. package/src/types/tool/index.ts +15 -0
  607. package/src/utils/frontmatter.ts +1 -1
  608. package/src/utils/id-format.ts +9 -0
  609. package/src/utils/id.ts +222 -181
  610. package/src/utils/log/exception.ts +1 -1
  611. package/src/utils/log/index.ts +1 -2
  612. package/src/utils/log/templates.ts +0 -1
  613. package/dist/session/migration/errors.d.ts +0 -26
  614. package/dist/session/migration/errors.d.ts.map +0 -1
  615. package/dist/session/migration/errors.js +0 -22
  616. package/dist/session/migration/errors.js.map +0 -1
  617. package/dist/session/migration/filesystem.d.ts +0 -122
  618. package/dist/session/migration/filesystem.d.ts.map +0 -1
  619. package/dist/session/migration/filesystem.js +0 -379
  620. package/dist/session/migration/filesystem.js.map +0 -1
  621. package/dist/session/migration/id-prefix.d.ts +0 -113
  622. package/dist/session/migration/id-prefix.d.ts.map +0 -1
  623. package/dist/session/migration/id-prefix.js +0 -132
  624. package/dist/session/migration/id-prefix.js.map +0 -1
  625. package/dist/session/migration/index.d.ts +0 -12
  626. package/dist/session/migration/index.d.ts.map +0 -1
  627. package/dist/session/migration/index.js +0 -12
  628. package/dist/session/migration/index.js.map +0 -1
  629. package/dist/session/migration/marker.d.ts +0 -57
  630. package/dist/session/migration/marker.d.ts.map +0 -1
  631. package/dist/session/migration/marker.js +0 -123
  632. package/dist/session/migration/marker.js.map +0 -1
  633. package/src/session/migration/errors.ts +0 -23
  634. package/src/session/migration/filesystem.ts +0 -468
  635. package/src/session/migration/id-prefix.ts +0 -166
  636. package/src/session/migration/index.ts +0 -41
  637. package/src/session/migration/marker.ts +0 -142
@@ -0,0 +1,42 @@
1
+ import { TokenBudget } from '../run/token-budget.js'
2
+ import { openTokenBudget } from '../store/run/token-budget-disk.js'
3
+ import type { AgentInput, BaseAgentConfig } from '../types/agent/base.js'
4
+ import type { RunId } from '../types/ids/index.js'
5
+
6
+ /** Resolve one authority before a composite agent constructs its scheduler. */
7
+ export async function resolveAgentBudget(
8
+ input: AgentInput,
9
+ config: BaseAgentConfig,
10
+ runId: RunId,
11
+ ): Promise<TokenBudget> {
12
+ if (!Number.isSafeInteger(config.tokenBudget) || config.tokenBudget < 0) {
13
+ throw new Error('Agent token budget must be a nonnegative safe integer')
14
+ }
15
+ if (config.budget) {
16
+ config.budget.bindRun(runId)
17
+ if (
18
+ config.tokenBudget > 0 &&
19
+ (config.budget.limit === 0 || config.tokenBudget < config.budget.limit)
20
+ ) {
21
+ config.budget.narrow(config.tokenBudget)
22
+ }
23
+ await config.budget.flush()
24
+ return config.budget
25
+ }
26
+ if (config.parentRunId) {
27
+ throw new Error('A delegated agent requires its inherited token budget authority')
28
+ }
29
+ const { tenantId, projectId, sessionId } = config
30
+ const budget =
31
+ tenantId && projectId && sessionId
32
+ ? await openTokenBudget({
33
+ scope: { tenantId, projectId, sessionId, runId },
34
+ limit: config.tokenBudget,
35
+ pathBuilder: config.pathBuilder,
36
+ workingDirectory: input.workingDirectory,
37
+ })
38
+ : TokenBudget.create(config.tokenBudget, runId)
39
+ budget.bindRun(runId)
40
+ await budget.flush()
41
+ return budget
42
+ }
@@ -0,0 +1,29 @@
1
+ /**
2
+ * The delegate that can only look.
3
+ *
4
+ * "Find where X is defined", "which files reference Y", "how does Z work" are
5
+ * the delegations a parent makes most, and a child built from the parent's
6
+ * whole working set answers them holding `write` and `bash` — so a lookup
7
+ * needs the same approvals as a change. A host that offers this delegate
8
+ * builds its roster with `filterReadOnlyTools` and its prompt from the text
9
+ * here; the two are exported separately because a host adds its own
10
+ * doctrine and environment around the prompt.
11
+ */
12
+
13
+ export const EXPLORE_AGENT_ID = 'explore'
14
+
15
+ export const EXPLORE_AGENT_DESCRIPTION =
16
+ 'A read-only sub-agent for finding files, symbols and answers.'
17
+
18
+ /**
19
+ * What an explore delegate is told. Names its limits in the first person so
20
+ * a model does not describe a change as made, and asks for file:line
21
+ * references because that is what the parent acts on.
22
+ */
23
+ export const EXPLORE_AGENT_PROMPT = [
24
+ 'You are a read-only sub-agent dispatched to find things out: where something is defined, which files reference it, how a piece of code works, what a directory contains.',
25
+ 'You cannot see the parent conversation — work only from the prompt you were given.',
26
+ 'You have reading and searching tools only. You cannot edit, write or run commands, and you must not describe a change as made.',
27
+ 'Search broadly first, then read what matters. Report file paths with line numbers, quote the relevant lines, and say plainly what you did not find.',
28
+ 'End with a concise answer the parent can act on; do not ask the parent questions.',
29
+ ].join('\n')
@@ -0,0 +1,237 @@
1
+ /**
2
+ * Sub-agents defined in a Markdown file.
3
+ *
4
+ * Skills are defined this way one directory over (`skills/loader.ts`): YAML
5
+ * frontmatter for what the thing IS, a Markdown body for what it is told.
6
+ * An agent file is the same shape for a delegate — a name the `Agent` tool
7
+ * can be asked for, a description the model chooses by, and optionally a
8
+ * tool allowlist, a model and a read-only flag — so a repository can say
9
+ * "our reviewer uses these tools and this model" once, and every host that
10
+ * builds delegates from this kernel offers the same reviewer.
11
+ *
12
+ * ```md
13
+ * ---
14
+ * name: reviewer
15
+ * description: Reviews a diff for correctness and convention drift.
16
+ * tools: read, grep, glob # optional allowlist, intersected with the parent's set
17
+ * model: claude-sonnet-4-5 # optional override
18
+ * readOnly: true # optional; keeps only read-only tools
19
+ * ---
20
+ * You review changes for this repository. Cite file:line for every finding …
21
+ * ```
22
+ *
23
+ * `tools` is one comma-separated line: this kernel's frontmatter reader
24
+ * refuses block lists and flow sequences by design, so there is no other
25
+ * form to accept.
26
+ *
27
+ * This module decides what a file MEANS. Where files live — which
28
+ * directories, in which order, which one shadows which — is the host's
29
+ * decision, passed in as an ordered list of roots; later roots win. A file
30
+ * that cannot be loaded is REPORTED with its path and reason rather than
31
+ * silently absent, and never takes the rest of the roster with it: an
32
+ * agent whose `tools` line failed to parse would otherwise run with the
33
+ * parent's whole set, which is the opposite of what the line was for.
34
+ */
35
+
36
+ import { readFile, readdir, stat } from 'node:fs/promises'
37
+ import { join } from 'node:path'
38
+
39
+ import { parseFrontmatter } from '../utils/frontmatter.js'
40
+ import { SCOPE_ATTRIBUTE } from '../utils/log/types.js'
41
+ import { type Logger, resolveLogger } from '../utils/logger.js'
42
+
43
+ /** Per-file character budget for the prompt body. */
44
+ export const MAX_AGENT_FILE_CHARS = 32_000
45
+
46
+ /** Bytes above which a file is not even read. */
47
+ const MAX_AGENT_FILE_BYTES = 4 * 1024 * 1024
48
+
49
+ /** The names a file may not claim by default: the delegate types a host ships. */
50
+ export const DEFAULT_RESERVED_AGENT_NAMES: ReadonlySet<string> = new Set([
51
+ 'general-purpose',
52
+ 'explore',
53
+ ])
54
+
55
+ const NAME_PATTERN = /^[a-z][a-z0-9-]{0,63}$/
56
+
57
+ export interface AgentFileDefinition {
58
+ readonly name: string
59
+ readonly description: string
60
+ /** The system prompt: the file's body, already cut to the budget. */
61
+ readonly prompt: string
62
+ /** Tool names the agent may use; absent means the parent's working set. */
63
+ readonly tools?: readonly string[]
64
+ readonly model?: string
65
+ readonly readOnly: boolean
66
+ readonly path: string
67
+ /** The host's label for the root this file came from (`user`, `project`, …). */
68
+ readonly source: string
69
+ }
70
+
71
+ export interface SkippedAgentFile {
72
+ readonly path: string
73
+ readonly reason: string
74
+ }
75
+
76
+ export interface AgentDefinitionRoot {
77
+ readonly dir: string
78
+ readonly source: string
79
+ }
80
+
81
+ export interface DiscoveredAgentDefinitions {
82
+ /** In first-seen order; a later root's file replaces an earlier one's by name. */
83
+ readonly definitions: readonly AgentFileDefinition[]
84
+ readonly skipped: readonly SkippedAgentFile[]
85
+ }
86
+
87
+ export interface DiscoverAgentDefinitionsOptions {
88
+ /** Names refused in a file. Defaults to `DEFAULT_RESERVED_AGENT_NAMES`. */
89
+ readonly reserved?: ReadonlySet<string>
90
+ readonly log?: Logger
91
+ }
92
+
93
+ /**
94
+ * Every `*.md` in every root, later roots shadowing earlier ones by name.
95
+ * A root that is not there contributes nothing; a file that is there and
96
+ * wrong is reported.
97
+ */
98
+ export async function discoverAgentDefinitions(
99
+ roots: readonly AgentDefinitionRoot[],
100
+ options: DiscoverAgentDefinitionsOptions = {},
101
+ ): Promise<DiscoveredAgentDefinitions> {
102
+ const logger = resolveLogger(options.log).child({ [SCOPE_ATTRIBUTE]: 'agents/file-definitions' })
103
+ const byName = new Map<string, AgentFileDefinition>()
104
+ const skipped: SkippedAgentFile[] = []
105
+ for (const root of roots) {
106
+ let files: string[]
107
+ try {
108
+ files = (await readdir(root.dir, { withFileTypes: true }))
109
+ .filter((entry) => entry.isFile() && entry.name.endsWith('.md'))
110
+ .map((entry) => entry.name)
111
+ .sort()
112
+ } catch {
113
+ logger.debug('agent definitions directory not found', { 'namzu.agents.dir': root.dir })
114
+ continue
115
+ }
116
+ for (const file of files) {
117
+ const found = await parseAgentFile(join(root.dir, file), root.source, options.reserved)
118
+ if ('reason' in found) skipped.push(found)
119
+ else byName.set(found.name, found)
120
+ }
121
+ }
122
+ return { definitions: [...byName.values()], skipped }
123
+ }
124
+
125
+ export async function parseAgentFile(
126
+ path: string,
127
+ source: string,
128
+ reserved: ReadonlySet<string> = DEFAULT_RESERVED_AGENT_NAMES,
129
+ ): Promise<AgentFileDefinition | SkippedAgentFile> {
130
+ let raw: string
131
+ try {
132
+ if ((await stat(path)).size > MAX_AGENT_FILE_BYTES) {
133
+ return { path, reason: 'is larger than 4 MiB, which no agent file is' }
134
+ }
135
+ raw = await readFile(path, 'utf8')
136
+ } catch (error) {
137
+ return {
138
+ path,
139
+ reason: `could not be read: ${error instanceof Error ? error.message : String(error)}`,
140
+ }
141
+ }
142
+ return parseAgentMarkdown(raw, path, source, reserved)
143
+ }
144
+
145
+ /** Pure: the file's text to a definition, or the reason it is refused. */
146
+ export function parseAgentMarkdown(
147
+ raw: string,
148
+ path: string,
149
+ source: string,
150
+ reserved: ReadonlySet<string> = DEFAULT_RESERVED_AGENT_NAMES,
151
+ ): AgentFileDefinition | SkippedAgentFile {
152
+ if (!raw.trimStart().startsWith('---')) {
153
+ return { path, reason: 'has no frontmatter; an agent file starts with `---` and a `name:`' }
154
+ }
155
+ let parsed: ReturnType<typeof parseFrontmatter>
156
+ try {
157
+ parsed = parseFrontmatter(raw, path)
158
+ } catch (error) {
159
+ return {
160
+ path,
161
+ reason: `frontmatter did not parse: ${error instanceof Error ? error.message : String(error)}`,
162
+ }
163
+ }
164
+ const { values, body } = parsed
165
+
166
+ const name = scalar(values.name)
167
+ if (name === undefined) return { path, reason: 'has no `name:` in its frontmatter' }
168
+ if (!NAME_PATTERN.test(name)) {
169
+ return { path, reason: `\`name: ${name}\` is not a lower-case identifier (a-z, 0-9, -)` }
170
+ }
171
+ if (reserved.has(name)) {
172
+ return { path, reason: `\`name: ${name}\` is a built-in type and cannot be redefined` }
173
+ }
174
+ const description = scalar(values.description)
175
+ if (description === undefined || description.trim().length === 0) {
176
+ return { path, reason: 'has no `description:`; the model chooses an agent by it' }
177
+ }
178
+
179
+ let tools: readonly string[] | undefined
180
+ if (values.tools !== undefined) {
181
+ const list = stringList(values.tools)
182
+ if (list === undefined || list.length === 0) {
183
+ return { path, reason: '`tools:` must be a non-empty, comma-separated list of tool names' }
184
+ }
185
+ tools = list
186
+ }
187
+ const model = scalar(values.model)
188
+ if (values.model !== undefined && (model === undefined || model.trim().length === 0)) {
189
+ return { path, reason: '`model:` must be a model name' }
190
+ }
191
+ let readOnly = false
192
+ if (values.readOnly !== undefined) {
193
+ const flag = scalar(values.readOnly)
194
+ if (flag !== 'true' && flag !== 'false') {
195
+ return { path, reason: '`readOnly:` must be true or false' }
196
+ }
197
+ readOnly = flag === 'true'
198
+ }
199
+
200
+ const trimmed = body.trim()
201
+ if (trimmed.length === 0) {
202
+ return { path, reason: "has an empty body; the body is the agent's system prompt" }
203
+ }
204
+ const prompt =
205
+ trimmed.length > MAX_AGENT_FILE_CHARS
206
+ ? `${trimmed.slice(0, MAX_AGENT_FILE_CHARS)}\n\n[namzu: this prompt was cut at ${MAX_AGENT_FILE_CHARS} characters; ${trimmed.length - MAX_AGENT_FILE_CHARS} were omitted]`
207
+ : trimmed
208
+
209
+ return {
210
+ name,
211
+ description: description.trim(),
212
+ prompt,
213
+ ...(tools ? { tools } : {}),
214
+ ...(model ? { model: model.trim() } : {}),
215
+ readOnly,
216
+ path,
217
+ source,
218
+ }
219
+ }
220
+
221
+ type FrontmatterValue = ReturnType<typeof parseFrontmatter>['values'][string]
222
+
223
+ function scalar(value: FrontmatterValue | undefined): string | undefined {
224
+ return value?.kind === 'scalar' ? value.value : undefined
225
+ }
226
+
227
+ /** A comma-separated scalar; anything else is refused. */
228
+ function stringList(value: FrontmatterValue): readonly string[] | undefined {
229
+ if (value.kind !== 'scalar') return undefined
230
+ const text = value.value.trim()
231
+ const inner = text.startsWith('[') && text.endsWith(']') ? text.slice(1, -1) : text
232
+ const items = inner
233
+ .split(',')
234
+ .map((item) => item.trim())
235
+ .filter((item) => item.length > 0)
236
+ return items.length > 0 ? items : undefined
237
+ }
@@ -17,3 +17,18 @@ export {
17
17
  DEFAULT_TOKEN_BUDGET,
18
18
  } from './runAgent.js'
19
19
  export type { AgentIdentity, RunAgentOptions, RunAgentResult } from './runAgent.js'
20
+ export {
21
+ DEFAULT_RESERVED_AGENT_NAMES,
22
+ MAX_AGENT_FILE_CHARS,
23
+ discoverAgentDefinitions,
24
+ parseAgentFile,
25
+ parseAgentMarkdown,
26
+ } from './file-definitions.js'
27
+ export type {
28
+ AgentDefinitionRoot,
29
+ AgentFileDefinition,
30
+ DiscoverAgentDefinitionsOptions,
31
+ DiscoveredAgentDefinitions,
32
+ SkippedAgentFile,
33
+ } from './file-definitions.js'
34
+ export { EXPLORE_AGENT_DESCRIPTION, EXPLORE_AGENT_ID, EXPLORE_AGENT_PROMPT } from './explore.js'
@@ -245,6 +245,12 @@ const MAPPING: {
245
245
  // strategies fired is a property of how it manages its own window, and a
246
246
  // peer modelling a task lifecycle can act on none of them.
247
247
  compaction_tool_results_cleared: null,
248
+ // What the run wrote to its own memory store is this runtime's business;
249
+ // a peer sees the task's outcome, not its housekeeping.
250
+ memory_consolidated: null,
251
+ // A job's exit is housekeeping of this runtime's host; the peer sees the
252
+ // task's outcome.
253
+ background_job_exited: null,
248
254
  // Compaction, succeeded or declined, is a property of how this runtime
249
255
  // manages its own context. A peer models a task lifecycle and cannot act on
250
256
  // either outcome.
@@ -133,6 +133,28 @@ const MAPPING: {
133
133
  // dominate the stream it rides on.
134
134
  request_envelope: null,
135
135
 
136
+ background_job_exited: {
137
+ wire: 'background_job.exited',
138
+ transform: (e, runId) => ({
139
+ run_id: runId,
140
+ job_id: e.jobId,
141
+ command: e.command,
142
+ status: e.status,
143
+ ...(e.exitCode !== undefined ? { exit_code: e.exitCode } : {}),
144
+ ...(e.signal ? { signal: e.signal } : {}),
145
+ }),
146
+ },
147
+ memory_consolidated: {
148
+ wire: 'memory.consolidated',
149
+ transform: (e, runId) => ({
150
+ run_id: runId,
151
+ memory_id: e.memoryId,
152
+ title: e.title,
153
+ decisions: e.decisions,
154
+ discoveries: e.discoveries,
155
+ failures: e.failures,
156
+ }),
157
+ },
136
158
  compaction_tool_results_cleared: {
137
159
  wire: 'compaction.tool_results_cleared',
138
160
  transform: (e, runId) => ({
package/src/bus/lock.ts CHANGED
@@ -42,16 +42,7 @@ export class FileLockManager {
42
42
  }
43
43
 
44
44
  private generateLockId(): LockId {
45
- // Through `asLockId` rather than returning the template directly: the
46
- // return TYPE alone accepts any `lock_`-shaped string today, and will
47
- // stop accepting one the moment the id types go nominal (NZ-SURF-11).
48
- //
49
- // The UUID stays, and `utils/id.ts` deliberately does not gain a
50
- // `generateLockId`. Every generator there mints 12 base-36 characters;
51
- // moving this one would change the shape of a value `FileLockManager`
52
- // writes to disk, which is a behaviour change wearing a refactor's
53
- // clothes. What this task is about is the constructor, not the entropy.
54
- return asLockId(`lock_${randomUUID()}`)
45
+ return asLockId(randomUUID())
55
46
  }
56
47
 
57
48
  private getAgentLockSet(owner: RunId): Set<string> {
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Consolidation: what a run learned, written down where the next run can
3
+ * find it.
4
+ *
5
+ * The working state is episodic memory — what happened in THIS run: the
6
+ * decisions taken, the discoveries made, the failures met and how. It
7
+ * dies with the run, and the semantic store behind `search_memory` only
8
+ * ever received what a model chose to `save_memory` mid-task, which is
9
+ * rarely the thing a later run needed. Consolidation is the bridge: at
10
+ * the end of a run, the entries that can outlive it become one memory
11
+ * entry, tagged so a later run can search for what was learned rather
12
+ * than what was done. What is deliberately NOT carried: the tool
13
+ * results, the plan, the requirements — those describe the task, not a
14
+ * lesson. Pure: the caller writes the entry, this only says what it is.
15
+ */
16
+
17
+ import type { CreateMemoryParams } from '../types/memory/index.js'
18
+ import type { WorkingState } from './types.js'
19
+
20
+ export const CONSOLIDATION_TAG = 'learning'
21
+
22
+ export interface ConsolidationMeta {
23
+ readonly runId: string
24
+ /** Milliseconds since the epoch, for the entry's metadata. */
25
+ readonly at: number
26
+ }
27
+
28
+ const MAX_TASK_IN_TITLE = 72
29
+
30
+ function head(text: string, max: number): string {
31
+ const line = text.split('\n')[0]?.trim() ?? ''
32
+ return line.length <= max ? line : `${line.slice(0, max - 1)}…`
33
+ }
34
+
35
+ /**
36
+ * The memory entry a run's state consolidates to, or `null` when the run
37
+ * learned nothing worth a later run's attention — no decisions, no
38
+ * discoveries, no failures. A run that only read and edited leaves no
39
+ * entry rather than an empty one.
40
+ */
41
+ export function consolidationEntry(
42
+ state: WorkingState,
43
+ meta: ConsolidationMeta,
44
+ ): CreateMemoryParams | null {
45
+ const decisions = state.decisions.filter((d) => d.trim().length > 0)
46
+ const discoveries = state.discoveries.filter((d) => d.trim().length > 0)
47
+ const failures = state.failures.filter((f) => f.trim().length > 0)
48
+ if (decisions.length + discoveries.length + failures.length === 0) return null
49
+
50
+ const task = state.task.trim()
51
+ const files = [...state.files.values()]
52
+ .filter((slot) => slot.actions.some((a) => a.type !== 'read'))
53
+ .map((slot) => slot.path)
54
+ const section = (name: string, items: readonly string[]): string[] =>
55
+ items.length === 0 ? [] : [`## ${name}`, '', ...items.map((item) => `- ${item}`), '']
56
+ const content = [
57
+ task ? `Task: ${task}` : 'Task: (not stated)',
58
+ '',
59
+ ...section('Decisions', decisions),
60
+ ...section('Discoveries', discoveries),
61
+ ...section('Failures and what was done about them', failures),
62
+ ...(files.length ? ['## Files changed', '', ...files.map((f) => `- \`${f}\``), ''] : []),
63
+ ].join('\n')
64
+ const counts = [
65
+ decisions.length ? `${decisions.length} decision${decisions.length === 1 ? '' : 's'}` : '',
66
+ discoveries.length
67
+ ? `${discoveries.length} discover${discoveries.length === 1 ? 'y' : 'ies'}`
68
+ : '',
69
+ failures.length ? `${failures.length} failure${failures.length === 1 ? '' : 's'}` : '',
70
+ ].filter((part) => part.length > 0)
71
+ return {
72
+ title: task ? `Learned: ${head(task, MAX_TASK_IN_TITLE)}` : `Learned in run ${meta.runId}`,
73
+ summary: `${counts.join(', ')} from run ${meta.runId}.`,
74
+ content,
75
+ format: 'markdown',
76
+ tags: [CONSOLIDATION_TAG, `run:${meta.runId}`],
77
+ metadata: { runId: meta.runId, consolidatedAt: meta.at, kind: 'consolidation' },
78
+ }
79
+ }
@@ -33,6 +33,9 @@ export function createConversationManager(
33
33
  ): ConversationManager {
34
34
  switch (strategy) {
35
35
  case 'structured':
36
+ case 'salience':
37
+ // The salience pass changes what is evicted, not how the state
38
+ // slots are kept; the structured manager owns those for both.
36
39
  return new StructuredCompactionManager(config)
37
40
  case 'sliding-window':
38
41
  return new SlidingWindowManager({
@@ -1,10 +1,12 @@
1
1
  export type {
2
- WorkingState,
3
- PlanSlot,
4
- FileSlot,
2
+ CompactionStrategy,
5
3
  FileAction,
4
+ FileSlot,
5
+ PinSlot,
6
+ PlanSlot,
6
7
  ToolResultSlot,
7
- CompactionStrategy,
8
+ WorkingState,
9
+ WorkingStatePin,
8
10
  } from './types.js'
9
11
 
10
12
  export type {
@@ -70,3 +72,31 @@ export type { ToolResultEditConfig, ToolResultEditOutcome } from './tool-result-
70
72
  export { compactNow, compactRegion } from './manual.js'
71
73
  export type { CompactionResult, CompactNowInput, CompactRegionInput } from './manual.js'
72
74
  export { COMPACTION_HEADER, buildCompactionMessage, isCompactionMessage } from './summary.js'
75
+
76
+ // The salience-scored working set: every message scored, the least salient
77
+ // evicted first. See `docs/sdk/salience-working-set.md`.
78
+ export {
79
+ DEFAULT_SALIENCE_CONFIG,
80
+ DEFAULT_SALIENCE_WEIGHTS,
81
+ buildGoal,
82
+ isStubbedNarration,
83
+ messageText,
84
+ planWorkingSet,
85
+ scoreMessages,
86
+ } from './salience/index.js'
87
+ export type {
88
+ GoalSources,
89
+ ProtectedReason,
90
+ SalienceConfig,
91
+ SalienceWeights,
92
+ ScoreOptions,
93
+ ScoredMessage,
94
+ WorkingSetAction,
95
+ WorkingSetOptions,
96
+ WorkingSetPlan,
97
+ } from './salience/index.js'
98
+ export { DEFAULT_SOFT_TARGET, planSalienceWorkingSet } from './plan.js'
99
+
100
+ // Episodic → semantic: what a run learned, as the entry a later run searches.
101
+ export { CONSOLIDATION_TAG, consolidationEntry } from './consolidation.js'
102
+ export type { ConsolidationMeta } from './consolidation.js'
@@ -1,10 +1,23 @@
1
1
  import type { CompactionConfig } from '../config/runtime.js'
2
- import type { FileAction, FileSlot, PlanSlot, ToolResultSlot, WorkingState } from './types.js'
2
+ import type {
3
+ FileAction,
4
+ FileSlot,
5
+ PinSlot,
6
+ PlanSlot,
7
+ ToolResultSlot,
8
+ WorkingState,
9
+ } from './types.js'
10
+
11
+ /** Pins kept at most; the oldest is dropped past this, and the drop is counted. */
12
+ export const MAX_PINS = 40
13
+ /** Characters one pin may carry; a pin is a fact, not a document. */
14
+ export const MAX_PIN_CHARS = 600
3
15
 
4
16
  function createEmptyState(): WorkingState {
5
17
  return {
6
18
  task: '',
7
19
  plan: [],
20
+ pins: new Map<string, PinSlot>(),
8
21
  files: new Map<string, FileSlot>(),
9
22
  decisions: [],
10
23
  failures: [],
@@ -34,6 +47,30 @@ export class WorkingStateManager {
34
47
  this.state.plan = plan
35
48
  }
36
49
 
50
+ /** Pin a fact under `key`, replacing what that key held; empty text unpins. */
51
+ pin(key: string, text: string, source: string): void {
52
+ const k = key.trim()
53
+ if (k.length === 0) return
54
+ const body = text.trim().slice(0, MAX_PIN_CHARS)
55
+ if (body.length === 0) {
56
+ this.state.pins?.delete(k)
57
+ return
58
+ }
59
+ if (!this.state.pins) this.state.pins = new Map()
60
+ this.state.pins.delete(k)
61
+ this.state.pins.set(k, { key: k, text: body, source, updatedAt: Date.now() })
62
+ while (this.state.pins.size > MAX_PINS) {
63
+ const oldest = [...this.state.pins.values()].sort((a, b) => a.updatedAt - b.updatedAt)[0]
64
+ if (!oldest) break
65
+ this.state.pins.delete(oldest.key)
66
+ this.state.evicted.pins = (this.state.evicted.pins ?? 0) + 1
67
+ }
68
+ }
69
+
70
+ unpin(key: string): void {
71
+ this.state.pins?.delete(key.trim())
72
+ }
73
+
37
74
  trackFile(path: string, action: FileAction): void {
38
75
  const existing = this.state.files.get(path)
39
76
  if (existing) {
@@ -116,6 +153,7 @@ export class WorkingStateManager {
116
153
  let count = 0
117
154
  if (this.state.task) count++
118
155
  count += this.state.plan.length
156
+ count += this.state.pins?.size ?? 0
119
157
  count += this.state.files.size
120
158
  count += this.state.decisions.length
121
159
  count += this.state.failures.length