@namzu/sdk 34.2.0 → 36.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 (669) hide show
  1. package/CHANGELOG.md +171 -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 +150 -0
  175. package/dist/provider/token-budget.js.map +1 -0
  176. package/dist/public-runtime.d.ts +14 -14
  177. package/dist/public-runtime.d.ts.map +1 -1
  178. package/dist/public-runtime.js +15 -10
  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 +13 -9
  214. package/dist/runtime/query/executor.d.ts.map +1 -1
  215. package/dist/runtime/query/executor.js +144 -55
  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 +42 -4
  221. package/dist/runtime/query/index.d.ts.map +1 -1
  222. package/dist/runtime/query/index.js +153 -52
  223. package/dist/runtime/query/index.js.map +1 -1
  224. package/dist/runtime/query/iteration/index.d.ts +3 -3
  225. package/dist/runtime/query/iteration/index.d.ts.map +1 -1
  226. package/dist/runtime/query/iteration/index.js +47 -11
  227. package/dist/runtime/query/iteration/index.js.map +1 -1
  228. package/dist/runtime/query/iteration/phases/compaction.d.ts.map +1 -1
  229. package/dist/runtime/query/iteration/phases/compaction.js +98 -30
  230. package/dist/runtime/query/iteration/phases/compaction.js.map +1 -1
  231. package/dist/runtime/query/iteration/phases/context.d.ts +4 -0
  232. package/dist/runtime/query/iteration/phases/context.d.ts.map +1 -1
  233. package/dist/runtime/query/iteration/phases/context.js.map +1 -1
  234. package/dist/runtime/query/iteration/phases/tool-review.d.ts.map +1 -1
  235. package/dist/runtime/query/iteration/phases/tool-review.js +29 -7
  236. package/dist/runtime/query/iteration/phases/tool-review.js.map +1 -1
  237. package/dist/runtime/query/iteration/phases/working-memory.d.ts.map +1 -1
  238. package/dist/runtime/query/iteration/phases/working-memory.js +25 -15
  239. package/dist/runtime/query/iteration/phases/working-memory.js.map +1 -1
  240. package/dist/runtime/query/iteration/stream-turn.d.ts.map +1 -1
  241. package/dist/runtime/query/iteration/stream-turn.js +10 -5
  242. package/dist/runtime/query/iteration/stream-turn.js.map +1 -1
  243. package/dist/runtime/query/plugin-hooks.d.ts +1 -1
  244. package/dist/runtime/query/plugin-hooks.d.ts.map +1 -1
  245. package/dist/runtime/query/plugin-hooks.js +20 -1
  246. package/dist/runtime/query/plugin-hooks.js.map +1 -1
  247. package/dist/runtime/query/prompt.d.ts.map +1 -1
  248. package/dist/runtime/query/prompt.js +14 -4
  249. package/dist/runtime/query/prompt.js.map +1 -1
  250. package/dist/runtime/query/repeat-call.d.ts +20 -2
  251. package/dist/runtime/query/repeat-call.d.ts.map +1 -1
  252. package/dist/runtime/query/repeat-call.js +35 -7
  253. package/dist/runtime/query/repeat-call.js.map +1 -1
  254. package/dist/runtime/query/result.d.ts.map +1 -1
  255. package/dist/runtime/query/result.js +9 -0
  256. package/dist/runtime/query/result.js.map +1 -1
  257. package/dist/runtime/query/review-policy.d.ts +142 -0
  258. package/dist/runtime/query/review-policy.d.ts.map +1 -0
  259. package/dist/runtime/query/review-policy.js +144 -0
  260. package/dist/runtime/query/review-policy.js.map +1 -0
  261. package/dist/runtime/query/run-state.d.ts.map +1 -1
  262. package/dist/runtime/query/run-state.js +4 -0
  263. package/dist/runtime/query/run-state.js.map +1 -1
  264. package/dist/runtime/query/steering.d.ts +4 -0
  265. package/dist/runtime/query/steering.d.ts.map +1 -1
  266. package/dist/runtime/query/steering.js +29 -0
  267. package/dist/runtime/query/steering.js.map +1 -1
  268. package/dist/runtime/query/token-budget.d.ts +7 -0
  269. package/dist/runtime/query/token-budget.d.ts.map +1 -0
  270. package/dist/runtime/query/token-budget.js +101 -0
  271. package/dist/runtime/query/token-budget.js.map +1 -0
  272. package/dist/runtime/query/tool-output-budget.d.ts +2 -0
  273. package/dist/runtime/query/tool-output-budget.d.ts.map +1 -1
  274. package/dist/runtime/query/tool-output-budget.js +29 -11
  275. package/dist/runtime/query/tool-output-budget.js.map +1 -1
  276. package/dist/runtime/query/tool-pause.d.ts.map +1 -1
  277. package/dist/runtime/query/tool-pause.js +4 -2
  278. package/dist/runtime/query/tool-pause.js.map +1 -1
  279. package/dist/runtime/query/tooling.d.ts +4 -0
  280. package/dist/runtime/query/tooling.d.ts.map +1 -1
  281. package/dist/runtime/query/tooling.js +4 -0
  282. package/dist/runtime/query/tooling.js.map +1 -1
  283. package/dist/sandbox/file-walk-program.d.ts +3 -0
  284. package/dist/sandbox/file-walk-program.d.ts.map +1 -0
  285. package/dist/sandbox/file-walk-program.js +94 -0
  286. package/dist/sandbox/file-walk-program.js.map +1 -0
  287. package/dist/sandbox/file-walk.d.ts +12 -0
  288. package/dist/sandbox/file-walk.d.ts.map +1 -0
  289. package/dist/sandbox/file-walk.js +429 -0
  290. package/dist/sandbox/file-walk.js.map +1 -0
  291. package/dist/sandbox/index.d.ts +2 -0
  292. package/dist/sandbox/index.d.ts.map +1 -1
  293. package/dist/sandbox/index.js +1 -0
  294. package/dist/sandbox/index.js.map +1 -1
  295. package/dist/sandbox/provider/local.d.ts +3 -1
  296. package/dist/sandbox/provider/local.d.ts.map +1 -1
  297. package/dist/sandbox/provider/local.js +121 -12
  298. package/dist/sandbox/provider/local.js.map +1 -1
  299. package/dist/scheduler/completion-inbox.d.ts +3 -2
  300. package/dist/scheduler/completion-inbox.d.ts.map +1 -1
  301. package/dist/scheduler/completion-inbox.js +29 -15
  302. package/dist/scheduler/completion-inbox.js.map +1 -1
  303. package/dist/scheduler/delegating.d.ts +1 -0
  304. package/dist/scheduler/delegating.d.ts.map +1 -1
  305. package/dist/scheduler/delegating.js +29 -12
  306. package/dist/scheduler/delegating.js.map +1 -1
  307. package/dist/scheduler/local.d.ts +1 -0
  308. package/dist/scheduler/local.d.ts.map +1 -1
  309. package/dist/scheduler/local.js +4 -7
  310. package/dist/scheduler/local.js.map +1 -1
  311. package/dist/session/index.d.ts +0 -1
  312. package/dist/session/index.d.ts.map +1 -1
  313. package/dist/session/index.js +0 -1
  314. package/dist/session/index.js.map +1 -1
  315. package/dist/session/workspace/path-builder.d.ts.map +1 -1
  316. package/dist/session/workspace/path-builder.js +5 -4
  317. package/dist/session/workspace/path-builder.js.map +1 -1
  318. package/dist/store/feedback/disk.d.ts.map +1 -1
  319. package/dist/store/feedback/disk.js +4 -6
  320. package/dist/store/feedback/disk.js.map +1 -1
  321. package/dist/store/index.d.ts +2 -0
  322. package/dist/store/index.d.ts.map +1 -1
  323. package/dist/store/index.js +1 -0
  324. package/dist/store/index.js.map +1 -1
  325. package/dist/store/memory/disk.d.ts.map +1 -1
  326. package/dist/store/memory/disk.js +3 -12
  327. package/dist/store/memory/disk.js.map +1 -1
  328. package/dist/store/run/checkpoint-disk.d.ts +3 -3
  329. package/dist/store/run/checkpoint-disk.d.ts.map +1 -1
  330. package/dist/store/run/checkpoint-disk.js +14 -26
  331. package/dist/store/run/checkpoint-disk.js.map +1 -1
  332. package/dist/store/run/claim-disk.js +1 -1
  333. package/dist/store/run/conformance.d.ts +1 -1
  334. package/dist/store/run/conformance.d.ts.map +1 -1
  335. package/dist/store/run/conformance.js +41 -33
  336. package/dist/store/run/conformance.js.map +1 -1
  337. package/dist/store/run/disk.d.ts.map +1 -1
  338. package/dist/store/run/disk.js +20 -4
  339. package/dist/store/run/disk.js.map +1 -1
  340. package/dist/store/run/token-budget-disk.d.ts +37 -0
  341. package/dist/store/run/token-budget-disk.d.ts.map +1 -0
  342. package/dist/store/run/token-budget-disk.js +208 -0
  343. package/dist/store/run/token-budget-disk.js.map +1 -0
  344. package/dist/store/session/disk.d.ts +4 -13
  345. package/dist/store/session/disk.d.ts.map +1 -1
  346. package/dist/store/session/disk.js +34 -31
  347. package/dist/store/session/disk.js.map +1 -1
  348. package/dist/store/session/memory.d.ts +2 -0
  349. package/dist/store/session/memory.d.ts.map +1 -1
  350. package/dist/store/session/memory.js +41 -2
  351. package/dist/store/session/memory.js.map +1 -1
  352. package/dist/store/task/disk.d.ts.map +1 -1
  353. package/dist/store/task/disk.js +7 -8
  354. package/dist/store/task/disk.js.map +1 -1
  355. package/dist/store/topic/memory.d.ts +2 -0
  356. package/dist/store/topic/memory.d.ts.map +1 -1
  357. package/dist/store/topic/memory.js +13 -1
  358. package/dist/store/topic/memory.js.map +1 -1
  359. package/dist/test-support/ids.d.ts +4 -19
  360. package/dist/test-support/ids.d.ts.map +1 -1
  361. package/dist/test-support/ids.js +51 -59
  362. package/dist/test-support/ids.js.map +1 -1
  363. package/dist/tools/advisory/index.d.ts.map +1 -1
  364. package/dist/tools/advisory/index.js +3 -1
  365. package/dist/tools/advisory/index.js.map +1 -1
  366. package/dist/tools/builtins/bash.d.ts +2 -0
  367. package/dist/tools/builtins/bash.d.ts.map +1 -1
  368. package/dist/tools/builtins/bash.js +224 -70
  369. package/dist/tools/builtins/bash.js.map +1 -1
  370. package/dist/tools/builtins/computer-use.d.ts +2 -2
  371. package/dist/tools/builtins/computer-use.d.ts.map +1 -1
  372. package/dist/tools/builtins/computer-use.js +4 -2
  373. package/dist/tools/builtins/computer-use.js.map +1 -1
  374. package/dist/tools/builtins/edit.js +2 -2
  375. package/dist/tools/builtins/edit.js.map +1 -1
  376. package/dist/tools/builtins/glob.d.ts +2 -1
  377. package/dist/tools/builtins/glob.d.ts.map +1 -1
  378. package/dist/tools/builtins/glob.js +95 -103
  379. package/dist/tools/builtins/glob.js.map +1 -1
  380. package/dist/tools/builtins/grep.d.ts.map +1 -1
  381. package/dist/tools/builtins/grep.js +155 -111
  382. package/dist/tools/builtins/grep.js.map +1 -1
  383. package/dist/tools/builtins/ls.js +4 -4
  384. package/dist/tools/builtins/ls.js.map +1 -1
  385. package/dist/tools/builtins/lsp.js +2 -2
  386. package/dist/tools/builtins/lsp.js.map +1 -1
  387. package/dist/tools/builtins/read-file.js +2 -2
  388. package/dist/tools/builtins/read-file.js.map +1 -1
  389. package/dist/tools/builtins/write-file.js +2 -2
  390. package/dist/tools/builtins/write-file.js.map +1 -1
  391. package/dist/tools/coordinator/ask-user-question.d.ts +33 -0
  392. package/dist/tools/coordinator/ask-user-question.d.ts.map +1 -0
  393. package/dist/tools/coordinator/ask-user-question.js +237 -0
  394. package/dist/tools/coordinator/ask-user-question.js.map +1 -0
  395. package/dist/tools/coordinator/index.d.ts +1 -2
  396. package/dist/tools/coordinator/index.d.ts.map +1 -1
  397. package/dist/tools/coordinator/index.js +4 -220
  398. package/dist/tools/coordinator/index.js.map +1 -1
  399. package/dist/tools/memory/read.d.ts.map +1 -1
  400. package/dist/tools/memory/read.js +2 -4
  401. package/dist/tools/memory/read.js.map +1 -1
  402. package/dist/tools/paths.d.ts +13 -0
  403. package/dist/tools/paths.d.ts.map +1 -1
  404. package/dist/tools/paths.js +53 -0
  405. package/dist/tools/paths.js.map +1 -1
  406. package/dist/tools/roster.d.ts +27 -0
  407. package/dist/tools/roster.d.ts.map +1 -0
  408. package/dist/tools/roster.js +42 -0
  409. package/dist/tools/roster.js.map +1 -0
  410. package/dist/types/agent/base.d.ts +5 -0
  411. package/dist/types/agent/base.d.ts.map +1 -1
  412. package/dist/types/agent/pipeline.d.ts +3 -0
  413. package/dist/types/agent/pipeline.d.ts.map +1 -1
  414. package/dist/types/agent/router.d.ts +2 -3
  415. package/dist/types/agent/router.d.ts.map +1 -1
  416. package/dist/types/agent/scheduler.d.ts +3 -0
  417. package/dist/types/agent/scheduler.d.ts.map +1 -1
  418. package/dist/types/agent/task.d.ts +5 -16
  419. package/dist/types/agent/task.d.ts.map +1 -1
  420. package/dist/types/agent/task.js.map +1 -1
  421. package/dist/types/common/index.d.ts.map +1 -1
  422. package/dist/types/common/index.js +3 -0
  423. package/dist/types/common/index.js.map +1 -1
  424. package/dist/types/computer-use/index.d.ts +8 -0
  425. package/dist/types/computer-use/index.d.ts.map +1 -1
  426. package/dist/types/computer-use/index.js.map +1 -1
  427. package/dist/types/hitl/index.d.ts +5 -0
  428. package/dist/types/hitl/index.d.ts.map +1 -1
  429. package/dist/types/hitl/index.js.map +1 -1
  430. package/dist/types/ids/brand.d.ts +5 -47
  431. package/dist/types/ids/brand.d.ts.map +1 -1
  432. package/dist/types/ids/brand.js +2 -39
  433. package/dist/types/ids/brand.js.map +1 -1
  434. package/dist/types/ids/index.d.ts +59 -69
  435. package/dist/types/ids/index.d.ts.map +1 -1
  436. package/dist/types/ids/index.js +12 -10
  437. package/dist/types/ids/index.js.map +1 -1
  438. package/dist/types/permission/index.d.ts +9 -0
  439. package/dist/types/permission/index.d.ts.map +1 -1
  440. package/dist/types/permission/index.js +9 -1
  441. package/dist/types/permission/index.js.map +1 -1
  442. package/dist/types/plugin/index.d.ts +45 -4
  443. package/dist/types/plugin/index.d.ts.map +1 -1
  444. package/dist/types/plugin/index.js +7 -0
  445. package/dist/types/plugin/index.js.map +1 -1
  446. package/dist/types/run/config.d.ts +3 -0
  447. package/dist/types/run/config.d.ts.map +1 -1
  448. package/dist/types/run/emergency.d.ts +5 -0
  449. package/dist/types/run/emergency.d.ts.map +1 -1
  450. package/dist/types/run/emergency.js.map +1 -1
  451. package/dist/types/run/entity.d.ts +6 -2
  452. package/dist/types/run/entity.d.ts.map +1 -1
  453. package/dist/types/run/events.d.ts +35 -0
  454. package/dist/types/run/events.d.ts.map +1 -1
  455. package/dist/types/run/events.js.map +1 -1
  456. package/dist/types/run/index.d.ts +1 -0
  457. package/dist/types/run/index.d.ts.map +1 -1
  458. package/dist/types/run/index.js +1 -0
  459. package/dist/types/run/index.js.map +1 -1
  460. package/dist/types/run/state.d.ts +16 -15
  461. package/dist/types/run/state.d.ts.map +1 -1
  462. package/dist/types/run/state.js +41 -22
  463. package/dist/types/run/state.js.map +1 -1
  464. package/dist/types/run/stop-reason.d.ts +3 -14
  465. package/dist/types/run/stop-reason.d.ts.map +1 -1
  466. package/dist/types/run/token-budget-store.d.ts +29 -0
  467. package/dist/types/run/token-budget-store.d.ts.map +1 -0
  468. package/dist/types/run/token-budget-store.js +25 -0
  469. package/dist/types/run/token-budget-store.js.map +1 -0
  470. package/dist/types/sandbox/index.d.ts +47 -2
  471. package/dist/types/sandbox/index.d.ts.map +1 -1
  472. package/dist/types/sandbox/index.js.map +1 -1
  473. package/dist/types/session/store.d.ts +8 -0
  474. package/dist/types/session/store.d.ts.map +1 -1
  475. package/dist/types/tool/index.d.ts +15 -0
  476. package/dist/types/tool/index.d.ts.map +1 -1
  477. package/dist/types/tool/index.js.map +1 -1
  478. package/dist/utils/frontmatter.d.ts +1 -1
  479. package/dist/utils/frontmatter.js +1 -1
  480. package/dist/utils/id-format.d.ts +3 -0
  481. package/dist/utils/id-format.d.ts.map +1 -0
  482. package/dist/utils/id-format.js +9 -0
  483. package/dist/utils/id-format.js.map +1 -0
  484. package/dist/utils/id.d.ts +65 -32
  485. package/dist/utils/id.d.ts.map +1 -1
  486. package/dist/utils/id.js +168 -148
  487. package/dist/utils/id.js.map +1 -1
  488. package/dist/utils/log/exception.js +1 -1
  489. package/dist/utils/log/exception.js.map +1 -1
  490. package/dist/utils/log/index.d.ts.map +1 -1
  491. package/dist/utils/log/index.js +1 -2
  492. package/dist/utils/log/index.js.map +1 -1
  493. package/dist/utils/log/templates.d.ts.map +1 -1
  494. package/dist/utils/log/templates.js +0 -1
  495. package/dist/utils/log/templates.js.map +1 -1
  496. package/package.json +6 -1
  497. package/src/agents/AGENTS.md +1 -1
  498. package/src/agents/PipelineAgent.ts +129 -109
  499. package/src/agents/ReactiveAgent.ts +2 -0
  500. package/src/agents/RouterAgent.ts +120 -73
  501. package/src/agents/SupervisorAgent.ts +12 -4
  502. package/src/agents/budget.ts +42 -0
  503. package/src/agents/explore.ts +29 -0
  504. package/src/agents/file-definitions.ts +237 -0
  505. package/src/agents/index.ts +15 -0
  506. package/src/bridge/a2a/mapper.ts +6 -0
  507. package/src/bridge/sse/mapper.ts +22 -0
  508. package/src/bus/lock.ts +1 -10
  509. package/src/compaction/consolidation.ts +79 -0
  510. package/src/compaction/factory.ts +3 -0
  511. package/src/compaction/index.ts +34 -4
  512. package/src/compaction/manager.ts +39 -1
  513. package/src/compaction/plan.ts +52 -21
  514. package/src/compaction/salience/bm25.ts +72 -0
  515. package/src/compaction/salience/goal.ts +44 -0
  516. package/src/compaction/salience/index.ts +19 -0
  517. package/src/compaction/salience/minhash.ts +53 -0
  518. package/src/compaction/salience/score.ts +305 -0
  519. package/src/compaction/salience/tokenize.ts +89 -0
  520. package/src/compaction/salience/working-set.ts +187 -0
  521. package/src/compaction/serializer.ts +16 -0
  522. package/src/compaction/token-estimate.ts +57 -0
  523. package/src/compaction/tool-result-editing.ts +28 -26
  524. package/src/compaction/types.ts +24 -1
  525. package/src/compaction/wire.ts +5 -1
  526. package/src/config/runtime.ts +13 -1
  527. package/src/connector/builtins/http.ts +2 -8
  528. package/src/connector/builtins/webhook.ts +2 -2
  529. package/src/connector/mcp/adapter.ts +32 -0
  530. package/src/connector/tools/adapter.ts +2 -2
  531. package/src/connector/tools/definitions.ts +2 -2
  532. package/src/constants/compaction/index.ts +1 -0
  533. package/src/constants/telemetry/index.ts +0 -1
  534. package/src/contracts/api.ts +5 -1
  535. package/src/contracts/schemas.ts +6 -20
  536. package/src/invariants/index.ts +1 -1
  537. package/src/manager/agent/lifecycle.ts +380 -352
  538. package/src/manager/run/persistence.ts +35 -5
  539. package/src/plugin/index.ts +19 -0
  540. package/src/plugin/shell-hook.ts +403 -0
  541. package/src/prompt/coding-agent-doctrine.ts +118 -0
  542. package/src/prompt/index.ts +8 -0
  543. package/src/provider/errors.ts +1 -1
  544. package/src/provider/fallback.ts +4 -1
  545. package/src/provider/retry.ts +4 -1
  546. package/src/provider/token-budget.ts +158 -0
  547. package/src/public-runtime.ts +56 -28
  548. package/src/public-tools.ts +5 -0
  549. package/src/public-types.ts +65 -0
  550. package/src/registry/command/kernel-commands.ts +16 -6
  551. package/src/registry/tool/execute.ts +4 -1
  552. package/src/run/LimitChecker.ts +1 -1
  553. package/src/run/drain.ts +1 -1
  554. package/src/run/reporter.ts +15 -0
  555. package/src/run/token-budget.ts +692 -0
  556. package/src/runtime/jobs/registry.ts +123 -17
  557. package/src/runtime/query/checkpoint.ts +10 -3
  558. package/src/runtime/query/context.ts +3 -57
  559. package/src/runtime/query/executor.ts +181 -71
  560. package/src/runtime/query/guard.ts +8 -0
  561. package/src/runtime/query/index.ts +209 -62
  562. package/src/runtime/query/iteration/index.ts +53 -15
  563. package/src/runtime/query/iteration/phases/compaction.ts +130 -31
  564. package/src/runtime/query/iteration/phases/context.ts +4 -0
  565. package/src/runtime/query/iteration/phases/tool-review.ts +39 -7
  566. package/src/runtime/query/iteration/phases/working-memory.ts +23 -14
  567. package/src/runtime/query/iteration/stream-turn.ts +9 -5
  568. package/src/runtime/query/plugin-hooks.ts +24 -2
  569. package/src/runtime/query/prompt.ts +21 -4
  570. package/src/runtime/query/repeat-call.ts +42 -7
  571. package/src/runtime/query/result.ts +9 -0
  572. package/src/runtime/query/review-policy.ts +231 -0
  573. package/src/runtime/query/run-state.ts +4 -0
  574. package/src/runtime/query/steering.ts +32 -0
  575. package/src/runtime/query/token-budget.ts +127 -0
  576. package/src/runtime/query/tool-output-budget.ts +33 -10
  577. package/src/runtime/query/tool-pause.ts +4 -2
  578. package/src/runtime/query/tooling.ts +8 -0
  579. package/src/sandbox/file-walk-program.ts +93 -0
  580. package/src/sandbox/file-walk.ts +463 -0
  581. package/src/sandbox/index.ts +2 -0
  582. package/src/sandbox/provider/local.ts +136 -13
  583. package/src/scheduler/completion-inbox.ts +29 -19
  584. package/src/scheduler/delegating.ts +35 -13
  585. package/src/scheduler/local.ts +5 -7
  586. package/src/session/index.ts +0 -1
  587. package/src/session/workspace/path-builder.ts +5 -4
  588. package/src/store/feedback/disk.ts +4 -6
  589. package/src/store/index.ts +2 -0
  590. package/src/store/memory/disk.ts +3 -11
  591. package/src/store/run/checkpoint-disk.ts +14 -27
  592. package/src/store/run/claim-disk.ts +1 -1
  593. package/src/store/run/conformance.ts +55 -39
  594. package/src/store/run/disk.ts +19 -4
  595. package/src/store/run/token-budget-disk.ts +247 -0
  596. package/src/store/session/disk.ts +36 -29
  597. package/src/store/session/memory.ts +38 -1
  598. package/src/store/task/disk.ts +7 -8
  599. package/src/store/topic/memory.ts +13 -1
  600. package/src/test-support/ids.ts +62 -59
  601. package/src/tools/advisory/index.ts +3 -1
  602. package/src/tools/builtins/bash.ts +241 -70
  603. package/src/tools/builtins/computer-use.ts +6 -2
  604. package/src/tools/builtins/edit.ts +2 -2
  605. package/src/tools/builtins/glob.ts +104 -122
  606. package/src/tools/builtins/grep.ts +166 -132
  607. package/src/tools/builtins/ls.ts +4 -4
  608. package/src/tools/builtins/lsp.ts +2 -2
  609. package/src/tools/builtins/read-file.ts +2 -2
  610. package/src/tools/builtins/write-file.ts +2 -2
  611. package/src/tools/coordinator/ask-user-question.ts +284 -0
  612. package/src/tools/coordinator/index.ts +5 -248
  613. package/src/tools/memory/read.ts +2 -4
  614. package/src/tools/paths.ts +64 -0
  615. package/src/tools/roster.ts +46 -0
  616. package/src/types/agent/base.ts +6 -0
  617. package/src/types/agent/pipeline.ts +3 -0
  618. package/src/types/agent/router.ts +2 -3
  619. package/src/types/agent/scheduler.ts +4 -0
  620. package/src/types/agent/task.ts +5 -18
  621. package/src/types/common/index.ts +3 -0
  622. package/src/types/computer-use/index.ts +8 -0
  623. package/src/types/hitl/index.ts +5 -0
  624. package/src/types/ids/brand.ts +5 -48
  625. package/src/types/ids/index.ts +66 -75
  626. package/src/types/permission/index.ts +11 -0
  627. package/src/types/plugin/index.ts +49 -1
  628. package/src/types/run/config.ts +3 -0
  629. package/src/types/run/emergency.ts +5 -0
  630. package/src/types/run/entity.ts +6 -2
  631. package/src/types/run/events.ts +37 -0
  632. package/src/types/run/index.ts +1 -0
  633. package/src/types/run/state.ts +58 -30
  634. package/src/types/run/stop-reason.ts +3 -14
  635. package/src/types/run/token-budget-store.ts +54 -0
  636. package/src/types/sandbox/index.ts +53 -0
  637. package/src/types/session/store.ts +8 -0
  638. package/src/types/tool/index.ts +15 -0
  639. package/src/utils/frontmatter.ts +1 -1
  640. package/src/utils/id-format.ts +9 -0
  641. package/src/utils/id.ts +222 -181
  642. package/src/utils/log/exception.ts +1 -1
  643. package/src/utils/log/index.ts +1 -2
  644. package/src/utils/log/templates.ts +0 -1
  645. package/dist/session/migration/errors.d.ts +0 -26
  646. package/dist/session/migration/errors.d.ts.map +0 -1
  647. package/dist/session/migration/errors.js +0 -22
  648. package/dist/session/migration/errors.js.map +0 -1
  649. package/dist/session/migration/filesystem.d.ts +0 -122
  650. package/dist/session/migration/filesystem.d.ts.map +0 -1
  651. package/dist/session/migration/filesystem.js +0 -379
  652. package/dist/session/migration/filesystem.js.map +0 -1
  653. package/dist/session/migration/id-prefix.d.ts +0 -113
  654. package/dist/session/migration/id-prefix.d.ts.map +0 -1
  655. package/dist/session/migration/id-prefix.js +0 -132
  656. package/dist/session/migration/id-prefix.js.map +0 -1
  657. package/dist/session/migration/index.d.ts +0 -12
  658. package/dist/session/migration/index.d.ts.map +0 -1
  659. package/dist/session/migration/index.js +0 -12
  660. package/dist/session/migration/index.js.map +0 -1
  661. package/dist/session/migration/marker.d.ts +0 -57
  662. package/dist/session/migration/marker.d.ts.map +0 -1
  663. package/dist/session/migration/marker.js +0 -123
  664. package/dist/session/migration/marker.js.map +0 -1
  665. package/src/session/migration/errors.ts +0 -23
  666. package/src/session/migration/filesystem.ts +0 -468
  667. package/src/session/migration/id-prefix.ts +0 -166
  668. package/src/session/migration/index.ts +0 -41
  669. package/src/session/migration/marker.ts +0 -142
@@ -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
@@ -1,7 +1,10 @@
1
1
  import type { CompactionConfig } from '../config/runtime.js'
2
- import { CHARS_PER_TOKEN } from '../constants/limits.js'
3
2
  import type { Message } from '../types/message/index.js'
4
3
  import { findSafeTrimIndex } from './dangling.js'
4
+ import { buildGoal } from './salience/goal.js'
5
+ import { scoreMessages } from './salience/score.js'
6
+ import { type WorkingSetPlan, planWorkingSet } from './salience/working-set.js'
7
+ import { estimateMessageTokens, estimateMessagesTokens } from './token-estimate.js'
5
8
  import { clearStaleToolResults } from './tool-result-editing.js'
6
9
 
7
10
  /**
@@ -43,6 +46,8 @@ export type CompactionPlan =
43
46
  readonly kind: 'cleared'
44
47
  readonly messages: readonly Message[]
45
48
  readonly clearedCount: number
49
+ /** Assistant narrations cut to their first sentence by the salience pass. */
50
+ readonly stubbedCount?: number
46
51
  readonly charsReclaimed: number
47
52
  readonly reclaimedTokens: number
48
53
  readonly reliefWasEnough: boolean
@@ -86,24 +91,6 @@ export interface CompactionPlanInput {
86
91
  readonly skipToolResultClear?: boolean
87
92
  }
88
93
 
89
- /**
90
- * How many characters a message's content is worth.
91
- *
92
- * An image costs far fewer tokens than its base64 length divided by four —
93
- * but under-counting it to zero is the worse error: it let a run full of
94
- * screenshots read as an empty context.
95
- */
96
- function measureContentChars(content: unknown): number {
97
- if (typeof content === 'string') return content.length
98
- if (!Array.isArray(content)) return 0
99
- let total = 0
100
- for (const block of content as readonly Record<string, unknown>[]) {
101
- if (block.type === 'text' && typeof block.text === 'string') total += block.text.length
102
- else if (block.type === 'image' && typeof block.data === 'string') total += block.data.length
103
- }
104
- return total
105
- }
106
-
107
94
  /**
108
95
  * The last index whose tail fits in `budgetTokens`, walking backwards.
109
96
  *
@@ -125,7 +112,7 @@ export function naiveKeepStartByTokens(messages: readonly Message[], budgetToken
125
112
  let tokens = 0
126
113
  let start = messages.length
127
114
  for (let index = messages.length - 1; index >= 0; index--) {
128
- const cost = Math.ceil(measureContentChars(messages[index]?.content) / CHARS_PER_TOKEN)
115
+ const cost = estimateMessageTokens(messages[index] as Message)
129
116
  // Checked BEFORE adding, so the boundary never includes a message
130
117
  // that pushes the tail over. Adding first and trimming after would
131
118
  // admit one oversized message on every run.
@@ -136,6 +123,49 @@ export function naiveKeepStartByTokens(messages: readonly Message[], budgetToken
136
123
  return start
137
124
  }
138
125
 
126
+ /**
127
+ * The salience pass: score every message and evict the least salient
128
+ * until the context is under `softTarget`. Returned as a `cleared` plan
129
+ * so the phase commits it the way it commits the stale-result pass; the
130
+ * summary path runs after it only when the trigger threshold is still
131
+ * exceeded.
132
+ */
133
+ /** Where the salience pass holds the context, as a fraction of the window. */
134
+ export const DEFAULT_SOFT_TARGET = 0.5
135
+
136
+ export function planSalienceWorkingSet(input: {
137
+ readonly messages: readonly Message[]
138
+ readonly config: CompactionConfig
139
+ readonly contextWindowTokens: number
140
+ readonly estimatedTokens: number
141
+ readonly openTasks?: readonly string[]
142
+ }): Extract<CompactionPlan, { kind: 'cleared' }> & { readonly working: WorkingSetPlan } {
143
+ const { config, estimatedTokens, contextWindowTokens: budget } = input
144
+ const goal = buildGoal(input.messages, {
145
+ ...(input.openTasks ? { openTasks: input.openTasks } : {}),
146
+ })
147
+ const scored = scoreMessages(input.messages, {
148
+ goal,
149
+ keepRecentMessages: config.keepRecentMessages,
150
+ })
151
+ const working = planWorkingSet(input.messages, scored, {
152
+ estimatedTokens,
153
+ targetTokens: Math.floor(budget * (config.softTarget ?? DEFAULT_SOFT_TARGET)),
154
+ minToolResultChars: config.minToolResultCharsToClear,
155
+ ...(config.preserveToolResultsFrom ? { preserveTools: config.preserveToolResultsFrom } : {}),
156
+ })
157
+ return {
158
+ kind: 'cleared',
159
+ messages: working.messages,
160
+ clearedCount: working.clearedCount,
161
+ stubbedCount: working.stubbedCount,
162
+ charsReclaimed: working.charsReclaimed,
163
+ reclaimedTokens: working.reclaimedTokens,
164
+ reliefWasEnough: (estimatedTokens - working.reclaimedTokens) / budget < config.triggerThreshold,
165
+ working,
166
+ }
167
+ }
168
+
139
169
  export function planCompaction(input: CompactionPlanInput): CompactionPlan {
140
170
  const { config, estimatedTokens, contextWindowTokens: budget } = input
141
171
 
@@ -151,7 +181,8 @@ export function planCompaction(input: CompactionPlanInput): CompactionPlan {
151
181
  })
152
182
 
153
183
  if (edit.clearedCount > 0) {
154
- const reclaimedTokens = Math.ceil(edit.charsReclaimed / CHARS_PER_TOKEN)
184
+ const reclaimedTokens =
185
+ estimateMessagesTokens(input.messages) - estimateMessagesTokens(edit.messages)
155
186
  // NOT on a forced pass. A forced pass runs because the provider
156
187
  // REJECTED the prompt as too long, which is a measurement — and
157
188
  // answering it with the same estimate the provider just refuted