@namzu/sdk 0.1.8 → 0.3.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 (626) hide show
  1. package/CHANGELOG.md +69 -2
  2. package/dist/agents/ReactiveAgent.d.ts.map +1 -1
  3. package/dist/agents/ReactiveAgent.js +5 -2
  4. package/dist/agents/ReactiveAgent.js.map +1 -1
  5. package/dist/agents/RouterAgent.d.ts.map +1 -1
  6. package/dist/agents/RouterAgent.js +3 -0
  7. package/dist/agents/RouterAgent.js.map +1 -1
  8. package/dist/agents/SupervisorAgent.d.ts.map +1 -1
  9. package/dist/agents/SupervisorAgent.js +21 -5
  10. package/dist/agents/SupervisorAgent.js.map +1 -1
  11. package/dist/bridge/a2a/index.d.ts +1 -1
  12. package/dist/bridge/a2a/index.d.ts.map +1 -1
  13. package/dist/bridge/a2a/index.js +1 -1
  14. package/dist/bridge/a2a/index.js.map +1 -1
  15. package/dist/bridge/a2a/mapper.d.ts.map +1 -1
  16. package/dist/bridge/a2a/mapper.js +6 -0
  17. package/dist/bridge/a2a/mapper.js.map +1 -1
  18. package/dist/bridge/a2a/message.d.ts +0 -2
  19. package/dist/bridge/a2a/message.d.ts.map +1 -1
  20. package/dist/bridge/a2a/message.js +0 -26
  21. package/dist/bridge/a2a/message.js.map +1 -1
  22. package/dist/bridge/a2a/task.d.ts +5 -4
  23. package/dist/bridge/a2a/task.d.ts.map +1 -1
  24. package/dist/bridge/a2a/task.js +4 -4
  25. package/dist/bridge/a2a/task.js.map +1 -1
  26. package/dist/bridge/sse/mapper.d.ts.map +1 -1
  27. package/dist/bridge/sse/mapper.js +6 -0
  28. package/dist/bridge/sse/mapper.js.map +1 -1
  29. package/dist/constants/a2a/index.d.ts +2 -2
  30. package/dist/constants/a2a/index.d.ts.map +1 -1
  31. package/dist/constants/a2a/index.js.map +1 -1
  32. package/dist/contracts/api.d.ts +14 -27
  33. package/dist/contracts/api.d.ts.map +1 -1
  34. package/dist/contracts/ids.d.ts +1 -1
  35. package/dist/contracts/ids.d.ts.map +1 -1
  36. package/dist/contracts/index.d.ts +3 -3
  37. package/dist/contracts/index.d.ts.map +1 -1
  38. package/dist/contracts/index.js +1 -1
  39. package/dist/contracts/index.js.map +1 -1
  40. package/dist/contracts/schemas.d.ts +1 -31
  41. package/dist/contracts/schemas.d.ts.map +1 -1
  42. package/dist/contracts/schemas.js +1 -7
  43. package/dist/contracts/schemas.js.map +1 -1
  44. package/dist/gateway/local.d.ts.map +1 -1
  45. package/dist/gateway/local.js +6 -0
  46. package/dist/gateway/local.js.map +1 -1
  47. package/dist/index.d.ts +6 -3
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +6 -3
  50. package/dist/index.js.map +1 -1
  51. package/dist/manager/agent/__tests__/lifecycle.test.d.ts +2 -0
  52. package/dist/manager/agent/__tests__/lifecycle.test.d.ts.map +1 -0
  53. package/dist/manager/agent/__tests__/lifecycle.test.js +316 -0
  54. package/dist/manager/agent/__tests__/lifecycle.test.js.map +1 -0
  55. package/dist/manager/agent/lifecycle.d.ts +67 -3
  56. package/dist/manager/agent/lifecycle.d.ts.map +1 -1
  57. package/dist/manager/agent/lifecycle.js +375 -14
  58. package/dist/manager/agent/lifecycle.js.map +1 -1
  59. package/dist/manager/index.d.ts +2 -0
  60. package/dist/manager/index.d.ts.map +1 -1
  61. package/dist/manager/index.js +1 -0
  62. package/dist/manager/index.js.map +1 -1
  63. package/dist/manager/run/persistence.d.ts +10 -1
  64. package/dist/manager/run/persistence.d.ts.map +1 -1
  65. package/dist/manager/run/persistence.js +20 -0
  66. package/dist/manager/run/persistence.js.map +1 -1
  67. package/dist/manager/thread/__tests__/lifecycle.test.d.ts +2 -0
  68. package/dist/manager/thread/__tests__/lifecycle.test.d.ts.map +1 -0
  69. package/dist/manager/thread/__tests__/lifecycle.test.js +216 -0
  70. package/dist/manager/thread/__tests__/lifecycle.test.js.map +1 -0
  71. package/dist/manager/thread/lifecycle.d.ts +105 -0
  72. package/dist/manager/thread/lifecycle.d.ts.map +1 -0
  73. package/dist/manager/thread/lifecycle.js +186 -0
  74. package/dist/manager/thread/lifecycle.js.map +1 -0
  75. package/dist/rag/retriever.js +2 -2
  76. package/dist/run/reporter.d.ts.map +1 -1
  77. package/dist/run/reporter.js +25 -0
  78. package/dist/run/reporter.js.map +1 -1
  79. package/dist/runtime/query/__tests__/context.test.d.ts +2 -0
  80. package/dist/runtime/query/__tests__/context.test.d.ts.map +1 -0
  81. package/dist/runtime/query/__tests__/context.test.js +85 -0
  82. package/dist/runtime/query/__tests__/context.test.js.map +1 -0
  83. package/dist/runtime/query/context-cache.d.ts +3 -3
  84. package/dist/runtime/query/context-cache.d.ts.map +1 -1
  85. package/dist/runtime/query/context-cache.js +2 -2
  86. package/dist/runtime/query/context-cache.js.map +1 -1
  87. package/dist/runtime/query/context.d.ts +45 -1
  88. package/dist/runtime/query/context.d.ts.map +1 -1
  89. package/dist/runtime/query/context.js +50 -8
  90. package/dist/runtime/query/context.js.map +1 -1
  91. package/dist/runtime/query/events.d.ts.map +1 -1
  92. package/dist/runtime/query/events.js +8 -0
  93. package/dist/runtime/query/events.js.map +1 -1
  94. package/dist/runtime/query/index.d.ts +22 -1
  95. package/dist/runtime/query/index.d.ts.map +1 -1
  96. package/dist/runtime/query/index.js +11 -0
  97. package/dist/runtime/query/index.js.map +1 -1
  98. package/dist/session/__tests__/integration/_fixtures.d.ts +122 -0
  99. package/dist/session/__tests__/integration/_fixtures.d.ts.map +1 -0
  100. package/dist/session/__tests__/integration/_fixtures.js +215 -0
  101. package/dist/session/__tests__/integration/_fixtures.js.map +1 -0
  102. package/dist/session/__tests__/integration/archive-gate.test.d.ts +15 -0
  103. package/dist/session/__tests__/integration/archive-gate.test.d.ts.map +1 -0
  104. package/dist/session/__tests__/integration/archive-gate.test.js +214 -0
  105. package/dist/session/__tests__/integration/archive-gate.test.js.map +1 -0
  106. package/dist/session/__tests__/integration/capacity-caps.test.d.ts +13 -0
  107. package/dist/session/__tests__/integration/capacity-caps.test.d.ts.map +1 -0
  108. package/dist/session/__tests__/integration/capacity-caps.test.js +123 -0
  109. package/dist/session/__tests__/integration/capacity-caps.test.js.map +1 -0
  110. package/dist/session/__tests__/integration/e2e-spawn.test.d.ts +18 -0
  111. package/dist/session/__tests__/integration/e2e-spawn.test.d.ts.map +1 -0
  112. package/dist/session/__tests__/integration/e2e-spawn.test.js +238 -0
  113. package/dist/session/__tests__/integration/e2e-spawn.test.js.map +1 -0
  114. package/dist/session/__tests__/integration/event-stream-ordering.test.d.ts +15 -0
  115. package/dist/session/__tests__/integration/event-stream-ordering.test.d.ts.map +1 -0
  116. package/dist/session/__tests__/integration/event-stream-ordering.test.js +330 -0
  117. package/dist/session/__tests__/integration/event-stream-ordering.test.js.map +1 -0
  118. package/dist/session/__tests__/integration/handoff-broadcast-e2e.test.d.ts +12 -0
  119. package/dist/session/__tests__/integration/handoff-broadcast-e2e.test.d.ts.map +1 -0
  120. package/dist/session/__tests__/integration/handoff-broadcast-e2e.test.js +182 -0
  121. package/dist/session/__tests__/integration/handoff-broadcast-e2e.test.js.map +1 -0
  122. package/dist/session/__tests__/integration/handoff-illegal-transition.test.d.ts +18 -0
  123. package/dist/session/__tests__/integration/handoff-illegal-transition.test.d.ts.map +1 -0
  124. package/dist/session/__tests__/integration/handoff-illegal-transition.test.js +156 -0
  125. package/dist/session/__tests__/integration/handoff-illegal-transition.test.js.map +1 -0
  126. package/dist/session/__tests__/integration/handoff-single-e2e.test.d.ts +15 -0
  127. package/dist/session/__tests__/integration/handoff-single-e2e.test.d.ts.map +1 -0
  128. package/dist/session/__tests__/integration/handoff-single-e2e.test.js +179 -0
  129. package/dist/session/__tests__/integration/handoff-single-e2e.test.js.map +1 -0
  130. package/dist/session/__tests__/integration/hierarchy-lifecycle.test.d.ts +12 -0
  131. package/dist/session/__tests__/integration/hierarchy-lifecycle.test.d.ts.map +1 -0
  132. package/dist/session/__tests__/integration/hierarchy-lifecycle.test.js +158 -0
  133. package/dist/session/__tests__/integration/hierarchy-lifecycle.test.js.map +1 -0
  134. package/dist/session/__tests__/integration/migration-filesystem.test.d.ts +11 -0
  135. package/dist/session/__tests__/integration/migration-filesystem.test.d.ts.map +1 -0
  136. package/dist/session/__tests__/integration/migration-filesystem.test.js +140 -0
  137. package/dist/session/__tests__/integration/migration-filesystem.test.js.map +1 -0
  138. package/dist/session/__tests__/integration/migration-id-prefix.test.d.ts +13 -0
  139. package/dist/session/__tests__/integration/migration-id-prefix.test.d.ts.map +1 -0
  140. package/dist/session/__tests__/integration/migration-id-prefix.test.js +84 -0
  141. package/dist/session/__tests__/integration/migration-id-prefix.test.js.map +1 -0
  142. package/dist/session/__tests__/integration/prev-artifact-dag.test.d.ts +14 -0
  143. package/dist/session/__tests__/integration/prev-artifact-dag.test.d.ts.map +1 -0
  144. package/dist/session/__tests__/integration/prev-artifact-dag.test.js +242 -0
  145. package/dist/session/__tests__/integration/prev-artifact-dag.test.js.map +1 -0
  146. package/dist/session/__tests__/integration/retention-archive.test.d.ts +12 -0
  147. package/dist/session/__tests__/integration/retention-archive.test.d.ts.map +1 -0
  148. package/dist/session/__tests__/integration/retention-archive.test.js +187 -0
  149. package/dist/session/__tests__/integration/retention-archive.test.js.map +1 -0
  150. package/dist/session/__tests__/integration/spawn-rollback.test.d.ts +26 -0
  151. package/dist/session/__tests__/integration/spawn-rollback.test.d.ts.map +1 -0
  152. package/dist/session/__tests__/integration/spawn-rollback.test.js +236 -0
  153. package/dist/session/__tests__/integration/spawn-rollback.test.js.map +1 -0
  154. package/dist/session/__tests__/integration/summary-materialization-e2e.test.d.ts +18 -0
  155. package/dist/session/__tests__/integration/summary-materialization-e2e.test.d.ts.map +1 -0
  156. package/dist/session/__tests__/integration/summary-materialization-e2e.test.js +201 -0
  157. package/dist/session/__tests__/integration/summary-materialization-e2e.test.js.map +1 -0
  158. package/dist/session/__tests__/integration/tenant-isolation.test.d.ts +14 -0
  159. package/dist/session/__tests__/integration/tenant-isolation.test.d.ts.map +1 -0
  160. package/dist/session/__tests__/integration/tenant-isolation.test.js +189 -0
  161. package/dist/session/__tests__/integration/tenant-isolation.test.js.map +1 -0
  162. package/dist/session/errors.d.ts +139 -0
  163. package/dist/session/errors.d.ts.map +1 -0
  164. package/dist/session/errors.js +107 -0
  165. package/dist/session/errors.js.map +1 -0
  166. package/dist/session/events/index.d.ts +4 -0
  167. package/dist/session/events/index.d.ts.map +1 -0
  168. package/dist/session/events/index.js +8 -0
  169. package/dist/session/events/index.js.map +1 -0
  170. package/dist/session/events/schema-version.d.ts +13 -0
  171. package/dist/session/events/schema-version.d.ts.map +1 -0
  172. package/dist/session/events/schema-version.js +12 -0
  173. package/dist/session/events/schema-version.js.map +1 -0
  174. package/dist/session/events/types.d.ts +64 -0
  175. package/dist/session/events/types.d.ts.map +1 -0
  176. package/dist/session/events/types.js +2 -0
  177. package/dist/session/events/types.js.map +1 -0
  178. package/dist/session/handoff/__tests__/broadcast.test.d.ts +2 -0
  179. package/dist/session/handoff/__tests__/broadcast.test.d.ts.map +1 -0
  180. package/dist/session/handoff/__tests__/broadcast.test.js +261 -0
  181. package/dist/session/handoff/__tests__/broadcast.test.js.map +1 -0
  182. package/dist/session/handoff/__tests__/capacity.test.d.ts +2 -0
  183. package/dist/session/handoff/__tests__/capacity.test.d.ts.map +1 -0
  184. package/dist/session/handoff/__tests__/capacity.test.js +103 -0
  185. package/dist/session/handoff/__tests__/capacity.test.js.map +1 -0
  186. package/dist/session/handoff/__tests__/single.test.d.ts +2 -0
  187. package/dist/session/handoff/__tests__/single.test.d.ts.map +1 -0
  188. package/dist/session/handoff/__tests__/single.test.js +239 -0
  189. package/dist/session/handoff/__tests__/single.test.js.map +1 -0
  190. package/dist/session/handoff/assignment.d.ts +71 -0
  191. package/dist/session/handoff/assignment.d.ts.map +1 -0
  192. package/dist/session/handoff/assignment.js +11 -0
  193. package/dist/session/handoff/assignment.js.map +1 -0
  194. package/dist/session/handoff/broadcast.d.ts +54 -0
  195. package/dist/session/handoff/broadcast.d.ts.map +1 -0
  196. package/dist/session/handoff/broadcast.js +311 -0
  197. package/dist/session/handoff/broadcast.js.map +1 -0
  198. package/dist/session/handoff/capacity.d.ts +66 -0
  199. package/dist/session/handoff/capacity.d.ts.map +1 -0
  200. package/dist/session/handoff/capacity.js +60 -0
  201. package/dist/session/handoff/capacity.js.map +1 -0
  202. package/dist/session/handoff/events.d.ts +66 -0
  203. package/dist/session/handoff/events.d.ts.map +1 -0
  204. package/dist/session/handoff/events.js +13 -0
  205. package/dist/session/handoff/events.js.map +1 -0
  206. package/dist/session/handoff/index.d.ts +12 -0
  207. package/dist/session/handoff/index.d.ts.map +1 -0
  208. package/dist/session/handoff/index.js +9 -0
  209. package/dist/session/handoff/index.js.map +1 -0
  210. package/dist/session/handoff/single.d.ts +69 -0
  211. package/dist/session/handoff/single.d.ts.map +1 -0
  212. package/dist/session/handoff/single.js +229 -0
  213. package/dist/session/handoff/single.js.map +1 -0
  214. package/dist/session/handoff/version.d.ts +52 -0
  215. package/dist/session/handoff/version.d.ts.map +1 -0
  216. package/dist/session/handoff/version.js +36 -0
  217. package/dist/session/handoff/version.js.map +1 -0
  218. package/dist/session/hierarchy/__tests__/session.test.d.ts +2 -0
  219. package/dist/session/hierarchy/__tests__/session.test.d.ts.map +1 -0
  220. package/dist/session/hierarchy/__tests__/session.test.js +69 -0
  221. package/dist/session/hierarchy/__tests__/session.test.js.map +1 -0
  222. package/dist/session/hierarchy/actor.d.ts +26 -0
  223. package/dist/session/hierarchy/actor.d.ts.map +1 -0
  224. package/dist/session/hierarchy/actor.js +2 -0
  225. package/dist/session/hierarchy/actor.js.map +1 -0
  226. package/dist/session/hierarchy/index.d.ts +9 -0
  227. package/dist/session/hierarchy/index.d.ts.map +1 -0
  228. package/dist/session/hierarchy/index.js +4 -0
  229. package/dist/session/hierarchy/index.js.map +1 -0
  230. package/dist/session/hierarchy/lineage.d.ts +15 -0
  231. package/dist/session/hierarchy/lineage.d.ts.map +1 -0
  232. package/dist/session/hierarchy/lineage.js +2 -0
  233. package/dist/session/hierarchy/lineage.js.map +1 -0
  234. package/dist/session/hierarchy/project.d.ts +40 -0
  235. package/dist/session/hierarchy/project.d.ts.map +1 -0
  236. package/dist/session/hierarchy/project.js +2 -0
  237. package/dist/session/hierarchy/project.js.map +1 -0
  238. package/dist/session/hierarchy/session.d.ts +71 -0
  239. package/dist/session/hierarchy/session.d.ts.map +1 -0
  240. package/dist/session/hierarchy/session.js +51 -0
  241. package/dist/session/hierarchy/session.js.map +1 -0
  242. package/dist/session/hierarchy/sub-session.d.ts +76 -0
  243. package/dist/session/hierarchy/sub-session.d.ts.map +1 -0
  244. package/dist/session/hierarchy/sub-session.js +2 -0
  245. package/dist/session/hierarchy/sub-session.js.map +1 -0
  246. package/dist/session/hierarchy/tenant.d.ts +13 -0
  247. package/dist/session/hierarchy/tenant.d.ts.map +1 -0
  248. package/dist/session/hierarchy/tenant.js +2 -0
  249. package/dist/session/hierarchy/tenant.js.map +1 -0
  250. package/dist/session/hierarchy/thread.d.ts +54 -0
  251. package/dist/session/hierarchy/thread.d.ts.map +1 -0
  252. package/dist/session/hierarchy/thread.js +2 -0
  253. package/dist/session/hierarchy/thread.js.map +1 -0
  254. package/dist/session/index.d.ts +10 -0
  255. package/dist/session/index.d.ts.map +1 -0
  256. package/dist/session/index.js +15 -0
  257. package/dist/session/index.js.map +1 -0
  258. package/dist/session/intervention/__tests__/prev-artifact.test.d.ts +2 -0
  259. package/dist/session/intervention/__tests__/prev-artifact.test.d.ts.map +1 -0
  260. package/dist/session/intervention/__tests__/prev-artifact.test.js +179 -0
  261. package/dist/session/intervention/__tests__/prev-artifact.test.js.map +1 -0
  262. package/dist/session/intervention/index.d.ts +3 -0
  263. package/dist/session/intervention/index.d.ts.map +1 -0
  264. package/dist/session/intervention/index.js +8 -0
  265. package/dist/session/intervention/index.js.map +1 -0
  266. package/dist/session/intervention/prev-artifact.d.ts +103 -0
  267. package/dist/session/intervention/prev-artifact.d.ts.map +1 -0
  268. package/dist/session/intervention/prev-artifact.js +112 -0
  269. package/dist/session/intervention/prev-artifact.js.map +1 -0
  270. package/dist/session/migration/__tests__/filesystem.test.d.ts +2 -0
  271. package/dist/session/migration/__tests__/filesystem.test.d.ts.map +1 -0
  272. package/dist/session/migration/__tests__/filesystem.test.js +188 -0
  273. package/dist/session/migration/__tests__/filesystem.test.js.map +1 -0
  274. package/dist/session/migration/__tests__/id-prefix.test.d.ts +2 -0
  275. package/dist/session/migration/__tests__/id-prefix.test.d.ts.map +1 -0
  276. package/dist/session/migration/__tests__/id-prefix.test.js +83 -0
  277. package/dist/session/migration/__tests__/id-prefix.test.js.map +1 -0
  278. package/dist/session/migration/__tests__/marker.test.d.ts +2 -0
  279. package/dist/session/migration/__tests__/marker.test.d.ts.map +1 -0
  280. package/dist/session/migration/__tests__/marker.test.js +75 -0
  281. package/dist/session/migration/__tests__/marker.test.js.map +1 -0
  282. package/dist/session/migration/errors.d.ts +26 -0
  283. package/dist/session/migration/errors.d.ts.map +1 -0
  284. package/dist/session/migration/errors.js +22 -0
  285. package/dist/session/migration/errors.js.map +1 -0
  286. package/dist/session/migration/filesystem.d.ts +94 -0
  287. package/dist/session/migration/filesystem.d.ts.map +1 -0
  288. package/dist/session/migration/filesystem.js +319 -0
  289. package/dist/session/migration/filesystem.js.map +1 -0
  290. package/dist/session/migration/id-prefix.d.ts +93 -0
  291. package/dist/session/migration/id-prefix.d.ts.map +1 -0
  292. package/dist/session/migration/id-prefix.js +111 -0
  293. package/dist/session/migration/id-prefix.js.map +1 -0
  294. package/dist/session/migration/index.d.ts +8 -0
  295. package/dist/session/migration/index.d.ts.map +1 -0
  296. package/dist/session/migration/index.js +8 -0
  297. package/dist/session/migration/index.js.map +1 -0
  298. package/dist/session/migration/marker.d.ts +57 -0
  299. package/dist/session/migration/marker.d.ts.map +1 -0
  300. package/dist/session/migration/marker.js +111 -0
  301. package/dist/session/migration/marker.js.map +1 -0
  302. package/dist/session/retention/__tests__/archive.test.d.ts +2 -0
  303. package/dist/session/retention/__tests__/archive.test.d.ts.map +1 -0
  304. package/dist/session/retention/__tests__/archive.test.js +253 -0
  305. package/dist/session/retention/__tests__/archive.test.js.map +1 -0
  306. package/dist/session/retention/__tests__/disk-backend.test.d.ts +2 -0
  307. package/dist/session/retention/__tests__/disk-backend.test.d.ts.map +1 -0
  308. package/dist/session/retention/__tests__/disk-backend.test.js +154 -0
  309. package/dist/session/retention/__tests__/disk-backend.test.js.map +1 -0
  310. package/dist/session/retention/archive-backend-ref.d.ts +18 -0
  311. package/dist/session/retention/archive-backend-ref.d.ts.map +1 -0
  312. package/dist/session/retention/archive-backend-ref.js +2 -0
  313. package/dist/session/retention/archive-backend-ref.js.map +1 -0
  314. package/dist/session/retention/archive.d.ts +130 -0
  315. package/dist/session/retention/archive.d.ts.map +1 -0
  316. package/dist/session/retention/archive.js +203 -0
  317. package/dist/session/retention/archive.js.map +1 -0
  318. package/dist/session/retention/backend.d.ts +101 -0
  319. package/dist/session/retention/backend.d.ts.map +1 -0
  320. package/dist/session/retention/backend.js +15 -0
  321. package/dist/session/retention/backend.js.map +1 -0
  322. package/dist/session/retention/disk-backend.d.ts +59 -0
  323. package/dist/session/retention/disk-backend.d.ts.map +1 -0
  324. package/dist/session/retention/disk-backend.js +236 -0
  325. package/dist/session/retention/disk-backend.js.map +1 -0
  326. package/dist/session/retention/index.d.ts +9 -0
  327. package/dist/session/retention/index.d.ts.map +1 -0
  328. package/dist/session/retention/index.js +6 -0
  329. package/dist/session/retention/index.js.map +1 -0
  330. package/dist/session/retention/policy.d.ts +49 -0
  331. package/dist/session/retention/policy.d.ts.map +1 -0
  332. package/dist/session/retention/policy.js +21 -0
  333. package/dist/session/retention/policy.js.map +1 -0
  334. package/dist/session/summary/__tests__/materialize.test.d.ts +2 -0
  335. package/dist/session/summary/__tests__/materialize.test.d.ts.map +1 -0
  336. package/dist/session/summary/__tests__/materialize.test.js +270 -0
  337. package/dist/session/summary/__tests__/materialize.test.js.map +1 -0
  338. package/dist/session/summary/deliverable.d.ts +74 -0
  339. package/dist/session/summary/deliverable.d.ts.map +1 -0
  340. package/dist/session/summary/deliverable.js +20 -0
  341. package/dist/session/summary/deliverable.js.map +1 -0
  342. package/dist/session/summary/index.d.ts +6 -0
  343. package/dist/session/summary/index.d.ts.map +1 -0
  344. package/dist/session/summary/index.js +9 -0
  345. package/dist/session/summary/index.js.map +1 -0
  346. package/dist/session/summary/materialize.d.ts +82 -0
  347. package/dist/session/summary/materialize.d.ts.map +1 -0
  348. package/dist/session/summary/materialize.js +117 -0
  349. package/dist/session/summary/materialize.js.map +1 -0
  350. package/dist/session/summary/ref.d.ts +91 -0
  351. package/dist/session/summary/ref.d.ts.map +1 -0
  352. package/dist/session/summary/ref.js +51 -0
  353. package/dist/session/summary/ref.js.map +1 -0
  354. package/dist/session/workspace/__tests__/git-worktree.test.d.ts +2 -0
  355. package/dist/session/workspace/__tests__/git-worktree.test.d.ts.map +1 -0
  356. package/dist/session/workspace/__tests__/git-worktree.test.js +244 -0
  357. package/dist/session/workspace/__tests__/git-worktree.test.js.map +1 -0
  358. package/dist/session/workspace/__tests__/path-builder.test.d.ts +2 -0
  359. package/dist/session/workspace/__tests__/path-builder.test.d.ts.map +1 -0
  360. package/dist/session/workspace/__tests__/path-builder.test.js +37 -0
  361. package/dist/session/workspace/__tests__/path-builder.test.js.map +1 -0
  362. package/dist/session/workspace/driver.d.ts +55 -0
  363. package/dist/session/workspace/driver.d.ts.map +1 -0
  364. package/dist/session/workspace/driver.js +12 -0
  365. package/dist/session/workspace/driver.js.map +1 -0
  366. package/dist/session/workspace/git-worktree.d.ts +65 -0
  367. package/dist/session/workspace/git-worktree.d.ts.map +1 -0
  368. package/dist/session/workspace/git-worktree.js +156 -0
  369. package/dist/session/workspace/git-worktree.js.map +1 -0
  370. package/dist/session/workspace/index.d.ts +8 -0
  371. package/dist/session/workspace/index.d.ts.map +1 -0
  372. package/dist/session/workspace/index.js +7 -0
  373. package/dist/session/workspace/index.js.map +1 -0
  374. package/dist/session/workspace/path-builder.d.ts +50 -0
  375. package/dist/session/workspace/path-builder.d.ts.map +1 -0
  376. package/dist/session/workspace/path-builder.js +50 -0
  377. package/dist/session/workspace/path-builder.js.map +1 -0
  378. package/dist/session/workspace/ref.d.ts +46 -0
  379. package/dist/session/workspace/ref.d.ts.map +1 -0
  380. package/dist/session/workspace/ref.js +11 -0
  381. package/dist/session/workspace/ref.js.map +1 -0
  382. package/dist/session/workspace/registry.d.ts +26 -0
  383. package/dist/session/workspace/registry.d.ts.map +1 -0
  384. package/dist/session/workspace/registry.js +35 -0
  385. package/dist/session/workspace/registry.js.map +1 -0
  386. package/dist/store/index.d.ts +0 -2
  387. package/dist/store/index.d.ts.map +1 -1
  388. package/dist/store/index.js +0 -1
  389. package/dist/store/index.js.map +1 -1
  390. package/dist/store/session/__tests__/disk.test.d.ts +2 -0
  391. package/dist/store/session/__tests__/disk.test.d.ts.map +1 -0
  392. package/dist/store/session/__tests__/disk.test.js +267 -0
  393. package/dist/store/session/__tests__/disk.test.js.map +1 -0
  394. package/dist/store/session/__tests__/memory.test.d.ts +2 -0
  395. package/dist/store/session/__tests__/memory.test.d.ts.map +1 -0
  396. package/dist/store/session/__tests__/memory.test.js +258 -0
  397. package/dist/store/session/__tests__/memory.test.js.map +1 -0
  398. package/dist/store/session/disk.d.ts +86 -0
  399. package/dist/store/session/disk.d.ts.map +1 -0
  400. package/dist/store/session/disk.js +818 -0
  401. package/dist/store/session/disk.js.map +1 -0
  402. package/dist/store/session/index.d.ts +7 -0
  403. package/dist/store/session/index.d.ts.map +1 -0
  404. package/dist/store/session/index.js +10 -0
  405. package/dist/store/session/index.js.map +1 -0
  406. package/dist/store/session/linkage.d.ts +38 -0
  407. package/dist/store/session/linkage.d.ts.map +1 -0
  408. package/dist/store/session/linkage.js +64 -0
  409. package/dist/store/session/linkage.js.map +1 -0
  410. package/dist/store/session/memory.d.ts +49 -0
  411. package/dist/store/session/memory.d.ts.map +1 -0
  412. package/dist/store/session/memory.js +335 -0
  413. package/dist/store/session/memory.js.map +1 -0
  414. package/dist/store/session/messages.d.ts +20 -0
  415. package/dist/store/session/messages.d.ts.map +1 -0
  416. package/dist/store/session/messages.js +12 -0
  417. package/dist/store/session/messages.js.map +1 -0
  418. package/dist/store/thread/disk.d.ts +41 -0
  419. package/dist/store/thread/disk.d.ts.map +1 -0
  420. package/dist/store/thread/disk.js +229 -0
  421. package/dist/store/thread/disk.js.map +1 -0
  422. package/dist/store/thread/index.d.ts +4 -0
  423. package/dist/store/thread/index.d.ts.map +1 -0
  424. package/dist/store/thread/index.js +6 -0
  425. package/dist/store/thread/index.js.map +1 -0
  426. package/dist/store/thread/memory.d.ts +23 -0
  427. package/dist/store/thread/memory.d.ts.map +1 -0
  428. package/dist/store/thread/memory.js +90 -0
  429. package/dist/store/thread/memory.js.map +1 -0
  430. package/dist/tools/builtins/__tests__/structuredOutput.example.d.ts +1 -1
  431. package/dist/types/agent/base.d.ts +24 -1
  432. package/dist/types/agent/base.d.ts.map +1 -1
  433. package/dist/types/agent/factory.d.ts +8 -2
  434. package/dist/types/agent/factory.d.ts.map +1 -1
  435. package/dist/types/agent/task.d.ts +57 -2
  436. package/dist/types/agent/task.d.ts.map +1 -1
  437. package/dist/types/agent/task.js.map +1 -1
  438. package/dist/types/ids/index.d.ts +22 -3
  439. package/dist/types/ids/index.d.ts.map +1 -1
  440. package/dist/types/ids/index.js +8 -1
  441. package/dist/types/ids/index.js.map +1 -1
  442. package/dist/types/invocation/__tests__/state.test.js +36 -29
  443. package/dist/types/invocation/__tests__/state.test.js.map +1 -1
  444. package/dist/types/invocation/index.d.ts +20 -4
  445. package/dist/types/invocation/index.d.ts.map +1 -1
  446. package/dist/types/invocation/index.js +10 -7
  447. package/dist/types/invocation/index.js.map +1 -1
  448. package/dist/types/rag/retrieval.d.ts +4 -3
  449. package/dist/types/rag/retrieval.d.ts.map +1 -1
  450. package/dist/types/run/config.d.ts +12 -1
  451. package/dist/types/run/config.d.ts.map +1 -1
  452. package/dist/types/run/events.d.ts +26 -1
  453. package/dist/types/run/events.d.ts.map +1 -1
  454. package/dist/types/run/index.d.ts.map +1 -1
  455. package/dist/types/run/index.js +8 -0
  456. package/dist/types/run/index.js.map +1 -1
  457. package/dist/types/run/metadata.d.ts +12 -2
  458. package/dist/types/run/metadata.d.ts.map +1 -1
  459. package/dist/types/run/status.d.ts +26 -0
  460. package/dist/types/run/status.d.ts.map +1 -0
  461. package/dist/types/run/status.js +2 -0
  462. package/dist/types/run/status.js.map +1 -0
  463. package/dist/types/session/ids.d.ts +9 -0
  464. package/dist/types/session/ids.d.ts.map +1 -0
  465. package/dist/types/session/ids.js +9 -0
  466. package/dist/types/session/ids.js.map +1 -0
  467. package/dist/types/session/index.d.ts +3 -0
  468. package/dist/types/session/index.d.ts.map +1 -0
  469. package/dist/types/session/index.js +5 -0
  470. package/dist/types/session/index.js.map +1 -0
  471. package/dist/types/session/store.d.ts +210 -0
  472. package/dist/types/session/store.d.ts.map +1 -0
  473. package/dist/types/session/store.js +9 -0
  474. package/dist/types/session/store.js.map +1 -0
  475. package/dist/types/thread/index.d.ts +2 -0
  476. package/dist/types/thread/index.d.ts.map +1 -0
  477. package/dist/types/thread/index.js +5 -0
  478. package/dist/types/thread/index.js.map +1 -0
  479. package/dist/types/thread/store.d.ts +86 -0
  480. package/dist/types/thread/store.d.ts.map +1 -0
  481. package/dist/types/thread/store.js +22 -0
  482. package/dist/types/thread/store.js.map +1 -0
  483. package/dist/utils/id.d.ts +8 -2
  484. package/dist/utils/id.d.ts.map +1 -1
  485. package/dist/utils/id.js +22 -4
  486. package/dist/utils/id.js.map +1 -1
  487. package/package.json +6 -11
  488. package/src/agents/ReactiveAgent.ts +7 -2
  489. package/src/agents/RouterAgent.ts +5 -0
  490. package/src/agents/SupervisorAgent.ts +29 -6
  491. package/src/bridge/a2a/index.ts +0 -1
  492. package/src/bridge/a2a/mapper.ts +7 -0
  493. package/src/bridge/a2a/message.ts +0 -32
  494. package/src/bridge/a2a/task.ts +9 -8
  495. package/src/bridge/sse/mapper.ts +8 -1
  496. package/src/constants/a2a/index.ts +2 -2
  497. package/src/contracts/api.ts +14 -30
  498. package/src/contracts/ids.ts +1 -1
  499. package/src/contracts/index.ts +3 -7
  500. package/src/contracts/schemas.ts +1 -8
  501. package/src/gateway/local.ts +6 -0
  502. package/src/index.ts +14 -4
  503. package/src/manager/agent/__tests__/lifecycle.test.ts +473 -0
  504. package/src/manager/agent/lifecycle.ts +515 -21
  505. package/src/manager/index.ts +3 -0
  506. package/src/manager/run/persistence.ts +26 -1
  507. package/src/manager/thread/__tests__/lifecycle.test.ts +286 -0
  508. package/src/manager/thread/lifecycle.ts +217 -0
  509. package/src/rag/retriever.ts +2 -2
  510. package/src/run/reporter.ts +28 -0
  511. package/src/runtime/query/__tests__/context.test.ts +102 -0
  512. package/src/runtime/query/context-cache.ts +4 -4
  513. package/src/runtime/query/context.ts +98 -9
  514. package/src/runtime/query/events.ts +8 -0
  515. package/src/runtime/query/index.ts +38 -1
  516. package/src/session/__tests__/integration/_fixtures.ts +310 -0
  517. package/src/session/__tests__/integration/archive-gate.test.ts +288 -0
  518. package/src/session/__tests__/integration/capacity-caps.test.ts +171 -0
  519. package/src/session/__tests__/integration/e2e-spawn.test.ts +296 -0
  520. package/src/session/__tests__/integration/event-stream-ordering.test.ts +410 -0
  521. package/src/session/__tests__/integration/handoff-broadcast-e2e.test.ts +271 -0
  522. package/src/session/__tests__/integration/handoff-illegal-transition.test.ts +214 -0
  523. package/src/session/__tests__/integration/handoff-single-e2e.test.ts +251 -0
  524. package/src/session/__tests__/integration/hierarchy-lifecycle.test.ts +240 -0
  525. package/src/session/__tests__/integration/migration-filesystem.test.ts +209 -0
  526. package/src/session/__tests__/integration/migration-id-prefix.test.ts +101 -0
  527. package/src/session/__tests__/integration/prev-artifact-dag.test.ts +325 -0
  528. package/src/session/__tests__/integration/retention-archive.test.ts +233 -0
  529. package/src/session/__tests__/integration/spawn-rollback.test.ts +313 -0
  530. package/src/session/__tests__/integration/summary-materialization-e2e.test.ts +239 -0
  531. package/src/session/__tests__/integration/tenant-isolation.test.ts +292 -0
  532. package/src/session/errors.ts +159 -0
  533. package/src/session/events/index.ts +16 -0
  534. package/src/session/events/schema-version.ts +13 -0
  535. package/src/session/events/types.ts +71 -0
  536. package/src/session/handoff/__tests__/broadcast.test.ts +378 -0
  537. package/src/session/handoff/__tests__/capacity.test.ts +129 -0
  538. package/src/session/handoff/__tests__/single.test.ts +333 -0
  539. package/src/session/handoff/assignment.ts +74 -0
  540. package/src/session/handoff/broadcast.ts +406 -0
  541. package/src/session/handoff/capacity.ts +121 -0
  542. package/src/session/handoff/events.ts +72 -0
  543. package/src/session/handoff/index.ts +29 -0
  544. package/src/session/handoff/single.ts +310 -0
  545. package/src/session/handoff/version.ts +59 -0
  546. package/src/session/hierarchy/__tests__/session.test.ts +100 -0
  547. package/src/session/hierarchy/actor.ts +17 -0
  548. package/src/session/hierarchy/index.ts +18 -0
  549. package/src/session/hierarchy/lineage.ts +15 -0
  550. package/src/session/hierarchy/project.ts +41 -0
  551. package/src/session/hierarchy/session.ts +109 -0
  552. package/src/session/hierarchy/sub-session.ts +92 -0
  553. package/src/session/hierarchy/tenant.ts +13 -0
  554. package/src/session/hierarchy/thread.ts +55 -0
  555. package/src/session/index.ts +15 -0
  556. package/src/session/intervention/__tests__/prev-artifact.test.ts +234 -0
  557. package/src/session/intervention/index.ts +16 -0
  558. package/src/session/intervention/prev-artifact.ts +180 -0
  559. package/src/session/migration/__tests__/filesystem.test.ts +263 -0
  560. package/src/session/migration/__tests__/id-prefix.test.ts +101 -0
  561. package/src/session/migration/__tests__/marker.test.ts +84 -0
  562. package/src/session/migration/errors.ts +23 -0
  563. package/src/session/migration/filesystem.ts +401 -0
  564. package/src/session/migration/id-prefix.ts +141 -0
  565. package/src/session/migration/index.ts +38 -0
  566. package/src/session/migration/marker.ts +131 -0
  567. package/src/session/retention/__tests__/archive.test.ts +318 -0
  568. package/src/session/retention/__tests__/disk-backend.test.ts +180 -0
  569. package/src/session/retention/archive-backend-ref.ts +17 -0
  570. package/src/session/retention/archive.ts +281 -0
  571. package/src/session/retention/backend.ts +107 -0
  572. package/src/session/retention/disk-backend.ts +304 -0
  573. package/src/session/retention/index.ts +16 -0
  574. package/src/session/retention/policy.ts +53 -0
  575. package/src/session/summary/__tests__/materialize.test.ts +343 -0
  576. package/src/session/summary/deliverable.ts +84 -0
  577. package/src/session/summary/index.ts +31 -0
  578. package/src/session/summary/materialize.ts +169 -0
  579. package/src/session/summary/ref.ts +104 -0
  580. package/src/session/workspace/__tests__/git-worktree.test.ts +258 -0
  581. package/src/session/workspace/__tests__/path-builder.test.ts +51 -0
  582. package/src/session/workspace/driver.ts +60 -0
  583. package/src/session/workspace/git-worktree.ts +209 -0
  584. package/src/session/workspace/index.ts +25 -0
  585. package/src/session/workspace/path-builder.ts +71 -0
  586. package/src/session/workspace/ref.ts +50 -0
  587. package/src/session/workspace/registry.ts +42 -0
  588. package/src/store/index.ts +0 -3
  589. package/src/store/session/__tests__/disk.test.ts +397 -0
  590. package/src/store/session/__tests__/memory.test.ts +402 -0
  591. package/src/store/session/disk.ts +976 -0
  592. package/src/store/session/index.ts +13 -0
  593. package/src/store/session/linkage.ts +80 -0
  594. package/src/store/session/memory.ts +412 -0
  595. package/src/store/session/messages.ts +21 -0
  596. package/src/store/thread/disk.ts +261 -0
  597. package/src/store/thread/index.ts +7 -0
  598. package/src/store/thread/memory.ts +104 -0
  599. package/src/types/agent/base.ts +27 -1
  600. package/src/types/agent/factory.ts +8 -3
  601. package/src/types/agent/task.ts +66 -2
  602. package/src/types/ids/index.ts +34 -3
  603. package/src/types/invocation/__tests__/state.test.ts +37 -29
  604. package/src/types/invocation/index.ts +26 -10
  605. package/src/types/rag/retrieval.ts +4 -3
  606. package/src/types/run/config.ts +13 -1
  607. package/src/types/run/events.ts +36 -1
  608. package/src/types/run/index.ts +8 -0
  609. package/src/types/run/metadata.ts +12 -2
  610. package/src/types/run/status.ts +33 -0
  611. package/src/types/session/ids.ts +23 -0
  612. package/src/types/session/index.ts +27 -0
  613. package/src/types/session/store.ts +252 -0
  614. package/src/types/thread/index.ts +5 -0
  615. package/src/types/thread/store.ts +92 -0
  616. package/src/utils/id.ts +34 -4
  617. package/dist/store/conversation/memory.d.ts +0 -21
  618. package/dist/store/conversation/memory.d.ts.map +0 -1
  619. package/dist/store/conversation/memory.js +0 -86
  620. package/dist/store/conversation/memory.js.map +0 -1
  621. package/dist/types/conversation/index.d.ts +0 -7
  622. package/dist/types/conversation/index.d.ts.map +0 -1
  623. package/dist/types/conversation/index.js +0 -2
  624. package/dist/types/conversation/index.js.map +0 -1
  625. package/src/store/conversation/memory.ts +0 -121
  626. package/src/types/conversation/index.ts +0 -8
@@ -0,0 +1,261 @@
1
+ /**
2
+ * DiskThreadStore — filesystem-backed implementation of {@link ThreadStore}.
3
+ *
4
+ * Every mutation is write-tmp-rename (Convention #8). Layout uses the Phase 2
5
+ * intermediate shape:
6
+ *
7
+ * {rootDir}/projects/{projectId}/threads/{threadId}/
8
+ * thread.json
9
+ *
10
+ * Sessions stay under `projects/{projectId}/sessions/{sessionId}/...` rather
11
+ * than nesting under `threads/{threadId}/` — the denormalized `threadId` on
12
+ * each session record (Phase 2.4 decision) makes thread-scoped queries
13
+ * addressable without path-level nesting, and keeps Project-scoped consumers
14
+ * (handoff, retention, archival) a single-directory scan. Phase 6 collapses
15
+ * `projects/{projectId}/` to `.namzu/` as part of `namzu init` folder binding.
16
+ *
17
+ * Tenant scoping is enforced through the JSON payload (`tenantId` field on
18
+ * every record), not the path — cross-tenant reads reject with
19
+ * {@link TenantIsolationError} (Convention #17).
20
+ */
21
+
22
+ import { mkdir, readFile, readdir, rename, rm, unlink, writeFile } from 'node:fs/promises'
23
+ import { join } from 'node:path'
24
+ import { StaleThreadError, TenantIsolationError } from '../../session/errors.js'
25
+ import type { Thread, ThreadStatus } from '../../session/hierarchy/thread.js'
26
+ import type { TenantId } from '../../types/ids/index.js'
27
+ import type { ProjectId, ThreadId } from '../../types/session/ids.js'
28
+ import type { CreateThreadParams, ThreadStore } from '../../types/thread/store.js'
29
+ import { generateThreadId } from '../../utils/id.js'
30
+
31
+ /** Config for {@link DiskThreadStore}. `rootDir` is absolute. */
32
+ export interface DiskThreadStoreConfig {
33
+ rootDir: string
34
+ }
35
+
36
+ interface PersistedThread {
37
+ id: ThreadId
38
+ projectId: ProjectId
39
+ tenantId: TenantId
40
+ title: string
41
+ status: ThreadStatus
42
+ ownerVersion: number
43
+ createdAt: string
44
+ updatedAt: string
45
+ }
46
+
47
+ /** Index of threadId → (projectId, path). Lazy; populated on create / lookup. */
48
+ interface ThreadIndexEntry {
49
+ threadId: ThreadId
50
+ projectId: ProjectId
51
+ path: string
52
+ }
53
+
54
+ export class DiskThreadStore implements ThreadStore {
55
+ private readonly rootDir: string
56
+ private readonly threadIndex = new Map<ThreadId, ThreadIndexEntry>()
57
+
58
+ constructor(config: DiskThreadStoreConfig) {
59
+ this.rootDir = config.rootDir
60
+ }
61
+
62
+ async createThread(params: CreateThreadParams, tenantId: TenantId): Promise<Thread> {
63
+ const now = new Date()
64
+ const thread: Thread = {
65
+ id: generateThreadId(),
66
+ projectId: params.projectId,
67
+ tenantId,
68
+ title: params.title,
69
+ status: 'open',
70
+ ownerVersion: 0,
71
+ createdAt: now,
72
+ updatedAt: now,
73
+ }
74
+ const dir = join(this.rootDir, 'projects', params.projectId, 'threads', thread.id)
75
+ await mkdir(dir, { recursive: true })
76
+ await atomicWriteJson(join(dir, 'thread.json'), serializeThread(thread))
77
+ this.threadIndex.set(thread.id, {
78
+ threadId: thread.id,
79
+ projectId: params.projectId,
80
+ path: dir,
81
+ })
82
+ return thread
83
+ }
84
+
85
+ async getThread(threadId: ThreadId, tenantId: TenantId): Promise<Thread | null> {
86
+ const located = await this.locateThread(threadId)
87
+ if (!located) return null
88
+ const raw = await readJson<PersistedThread>(join(located.path, 'thread.json'))
89
+ if (!raw) return null
90
+ this.assertTenant(raw.tenantId, tenantId, `thread(${threadId})`)
91
+ return deserializeThread(raw)
92
+ }
93
+
94
+ async updateThread(thread: Thread, tenantId: TenantId): Promise<void> {
95
+ if (thread.tenantId !== tenantId) {
96
+ throw new TenantIsolationError({
97
+ requested: tenantId,
98
+ resource: `thread(${thread.id}) payload`,
99
+ })
100
+ }
101
+ const located = await this.locateThread(thread.id)
102
+ if (!located) {
103
+ throw new Error(`Thread ${thread.id} not found`)
104
+ }
105
+ const existing = await readJson<PersistedThread>(join(located.path, 'thread.json'))
106
+ if (!existing) {
107
+ throw new Error(`Thread ${thread.id} not found`)
108
+ }
109
+ this.assertTenant(existing.tenantId, tenantId, `thread(${thread.id})`)
110
+
111
+ // CAS on ownerVersion. On mismatch, caller must re-read + re-apply +
112
+ // retry. No silent overwrite (Convention #0).
113
+ if (thread.ownerVersion !== existing.ownerVersion) {
114
+ throw new StaleThreadError({
115
+ threadId: thread.id,
116
+ expectedVersion: thread.ownerVersion,
117
+ actualVersion: existing.ownerVersion,
118
+ })
119
+ }
120
+
121
+ const updated: Thread = {
122
+ ...thread,
123
+ ownerVersion: existing.ownerVersion + 1,
124
+ updatedAt: new Date(),
125
+ }
126
+ await atomicWriteJson(join(located.path, 'thread.json'), serializeThread(updated))
127
+ }
128
+
129
+ async deleteThread(threadId: ThreadId, tenantId: TenantId): Promise<void> {
130
+ const located = await this.locateThread(threadId)
131
+ if (!located) return // Idempotent: missing = no-op.
132
+ const existing = await readJson<PersistedThread>(join(located.path, 'thread.json'))
133
+ if (!existing) return
134
+ this.assertTenant(existing.tenantId, tenantId, `thread(${threadId})`)
135
+
136
+ // The store does NOT enforce "no attached sessions" here — that is a
137
+ // cross-store precondition owned by ThreadManager. This keeps the
138
+ // boundary clean; ThreadStore has no awareness of SessionStore layout.
139
+ await rm(located.path, { recursive: true, force: true })
140
+ this.threadIndex.delete(threadId)
141
+ }
142
+
143
+ async listThreads(projectId: ProjectId, tenantId: TenantId): Promise<readonly Thread[]> {
144
+ const threadsDir = join(this.rootDir, 'projects', projectId, 'threads')
145
+ let entries: string[]
146
+ try {
147
+ entries = await readdir(threadsDir)
148
+ } catch (err) {
149
+ const code = (err as NodeJS.ErrnoException).code
150
+ if (code === 'ENOENT') return []
151
+ throw err
152
+ }
153
+
154
+ const results: Thread[] = []
155
+ for (const entry of entries) {
156
+ if (!entry.startsWith('thd_')) continue
157
+ const path = join(threadsDir, entry)
158
+ const raw = await readJson<PersistedThread>(join(path, 'thread.json'))
159
+ if (!raw) continue
160
+ // Cross-tenant records in the same directory are skipped silently —
161
+ // the listing is scoped to the caller's tenant. Mismatch is not an
162
+ // isolation violation because the caller never requested the record.
163
+ if (raw.tenantId !== tenantId) continue
164
+ results.push(deserializeThread(raw))
165
+ this.threadIndex.set(raw.id, { threadId: raw.id, projectId, path })
166
+ }
167
+ results.sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime())
168
+ return results
169
+ }
170
+
171
+ private async locateThread(threadId: ThreadId): Promise<ThreadIndexEntry | null> {
172
+ const cached = this.threadIndex.get(threadId)
173
+ if (cached) return cached
174
+
175
+ // Walk projects/* looking for the thread dir. Cost is bounded by number
176
+ // of projects (usually 1) × number of threads per project.
177
+ const projectsDir = join(this.rootDir, 'projects')
178
+ let projectDirs: string[]
179
+ try {
180
+ projectDirs = await readdir(projectsDir)
181
+ } catch (err) {
182
+ const code = (err as NodeJS.ErrnoException).code
183
+ if (code === 'ENOENT') return null
184
+ throw err
185
+ }
186
+
187
+ for (const rawProject of projectDirs) {
188
+ if (!rawProject.startsWith('prj_')) continue
189
+ const threadPath = join(projectsDir, rawProject, 'threads', threadId)
190
+ const raw = await readJson<PersistedThread>(join(threadPath, 'thread.json'))
191
+ if (raw?.id === threadId) {
192
+ const entry: ThreadIndexEntry = {
193
+ threadId,
194
+ projectId: rawProject as ProjectId,
195
+ path: threadPath,
196
+ }
197
+ this.threadIndex.set(threadId, entry)
198
+ return entry
199
+ }
200
+ }
201
+ return null
202
+ }
203
+
204
+ private assertTenant(owning: TenantId, requested: TenantId, resource: string): void {
205
+ if (owning !== requested) {
206
+ throw new TenantIsolationError({ requested, resource })
207
+ }
208
+ }
209
+ }
210
+
211
+ // Serialization -----------------------------------------------------------
212
+
213
+ function serializeThread(thread: Thread): PersistedThread {
214
+ return {
215
+ id: thread.id,
216
+ projectId: thread.projectId,
217
+ tenantId: thread.tenantId,
218
+ title: thread.title,
219
+ status: thread.status,
220
+ ownerVersion: thread.ownerVersion,
221
+ createdAt: thread.createdAt.toISOString(),
222
+ updatedAt: thread.updatedAt.toISOString(),
223
+ }
224
+ }
225
+
226
+ function deserializeThread(raw: PersistedThread): Thread {
227
+ return {
228
+ id: raw.id,
229
+ projectId: raw.projectId,
230
+ tenantId: raw.tenantId,
231
+ title: raw.title,
232
+ status: raw.status,
233
+ ownerVersion: raw.ownerVersion,
234
+ createdAt: new Date(raw.createdAt),
235
+ updatedAt: new Date(raw.updatedAt),
236
+ }
237
+ }
238
+
239
+ // FS helpers -----------------------------------------------------------------
240
+
241
+ async function readJson<T>(path: string): Promise<T | null> {
242
+ try {
243
+ const raw = await readFile(path, 'utf-8')
244
+ return JSON.parse(raw) as T
245
+ } catch (err) {
246
+ const code = (err as NodeJS.ErrnoException).code
247
+ if (code === 'ENOENT') return null
248
+ throw err
249
+ }
250
+ }
251
+
252
+ async function atomicWriteJson(filePath: string, value: unknown): Promise<void> {
253
+ const tempPath = `${filePath}.tmp`
254
+ try {
255
+ await writeFile(tempPath, JSON.stringify(value, null, 2), 'utf-8')
256
+ await rename(tempPath, filePath)
257
+ } catch (err) {
258
+ await unlink(tempPath).catch(() => undefined)
259
+ throw err
260
+ }
261
+ }
@@ -0,0 +1,7 @@
1
+ // Sub-barrel for the Thread persistence module (Convention #4).
2
+ // Concrete implementations live in sibling files; re-export them here so
3
+ // consumers import via `../store/thread/index.js`.
4
+
5
+ export { InMemoryThreadStore } from './memory.js'
6
+ export { DiskThreadStore } from './disk.js'
7
+ export type { DiskThreadStoreConfig } from './disk.js'
@@ -0,0 +1,104 @@
1
+ /**
2
+ * InMemoryThreadStore — reference in-memory implementation of
3
+ * {@link ThreadStore}.
4
+ *
5
+ * Mirrors the write-time CAS contract of the disk store: every
6
+ * `updateThread` compares the supplied `ownerVersion` against the persisted
7
+ * copy and rejects with `StaleThreadError` on mismatch. Convention #17:
8
+ * cross-tenant access throws `TenantIsolationError` with no fallback.
9
+ */
10
+
11
+ import { StaleThreadError, TenantIsolationError } from '../../session/errors.js'
12
+ import type { Thread } from '../../session/hierarchy/thread.js'
13
+ import type { TenantId } from '../../types/ids/index.js'
14
+ import type { ProjectId, ThreadId } from '../../types/session/ids.js'
15
+ import type { CreateThreadParams, ThreadStore } from '../../types/thread/store.js'
16
+ import { generateThreadId } from '../../utils/id.js'
17
+
18
+ interface ThreadRecord {
19
+ tenantId: TenantId
20
+ thread: Thread
21
+ }
22
+
23
+ export class InMemoryThreadStore implements ThreadStore {
24
+ private readonly threads = new Map<ThreadId, ThreadRecord>()
25
+
26
+ async createThread(params: CreateThreadParams, tenantId: TenantId): Promise<Thread> {
27
+ const now = new Date()
28
+ const thread: Thread = {
29
+ id: generateThreadId(),
30
+ projectId: params.projectId,
31
+ tenantId,
32
+ title: params.title,
33
+ status: 'open',
34
+ ownerVersion: 0,
35
+ createdAt: now,
36
+ updatedAt: now,
37
+ }
38
+ this.threads.set(thread.id, { tenantId, thread })
39
+ return thread
40
+ }
41
+
42
+ async getThread(threadId: ThreadId, tenantId: TenantId): Promise<Thread | null> {
43
+ const record = this.threads.get(threadId)
44
+ if (!record) return null
45
+ this.assertTenant(record.tenantId, tenantId, `thread(${threadId})`)
46
+ return record.thread
47
+ }
48
+
49
+ async updateThread(thread: Thread, tenantId: TenantId): Promise<void> {
50
+ if (thread.tenantId !== tenantId) {
51
+ throw new TenantIsolationError({
52
+ requested: tenantId,
53
+ resource: `thread(${thread.id}) payload`,
54
+ })
55
+ }
56
+ const existing = this.threads.get(thread.id)
57
+ if (!existing) {
58
+ throw new Error(`Thread ${thread.id} not found`)
59
+ }
60
+ this.assertTenant(existing.tenantId, tenantId, `thread(${thread.id})`)
61
+
62
+ // CAS on ownerVersion — supplied version must match persisted exactly.
63
+ // Any drift means another writer already advanced the record; the caller
64
+ // must re-read + re-apply + retry.
65
+ if (thread.ownerVersion !== existing.thread.ownerVersion) {
66
+ throw new StaleThreadError({
67
+ threadId: thread.id,
68
+ expectedVersion: thread.ownerVersion,
69
+ actualVersion: existing.thread.ownerVersion,
70
+ })
71
+ }
72
+
73
+ const updated: Thread = {
74
+ ...thread,
75
+ ownerVersion: existing.thread.ownerVersion + 1,
76
+ updatedAt: new Date(),
77
+ }
78
+ this.threads.set(thread.id, { tenantId, thread: updated })
79
+ }
80
+
81
+ async deleteThread(threadId: ThreadId, tenantId: TenantId): Promise<void> {
82
+ const record = this.threads.get(threadId)
83
+ if (!record) return // Idempotent: missing = no-op.
84
+ this.assertTenant(record.tenantId, tenantId, `thread(${threadId})`)
85
+ this.threads.delete(threadId)
86
+ }
87
+
88
+ async listThreads(projectId: ProjectId, tenantId: TenantId): Promise<readonly Thread[]> {
89
+ const matches: Thread[] = []
90
+ for (const { tenantId: ownerTenant, thread } of this.threads.values()) {
91
+ if (ownerTenant !== tenantId) continue
92
+ if (thread.projectId !== projectId) continue
93
+ matches.push(thread)
94
+ }
95
+ matches.sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime())
96
+ return matches
97
+ }
98
+
99
+ private assertTenant(owning: TenantId, requested: TenantId, resource: string): void {
100
+ if (owning !== requested) {
101
+ throw new TenantIsolationError({ requested, resource })
102
+ }
103
+ }
104
+ }
@@ -1,9 +1,10 @@
1
1
  import type { AgentStatus, CostInfo, TokenUsage } from '../common/index.js'
2
- import type { RunId, ThreadId } from '../ids/index.js'
2
+ import type { RunId, SessionId, TenantId } from '../ids/index.js'
3
3
  import type { InvocationState } from '../invocation/index.js'
4
4
  import type { Message } from '../message/index.js'
5
5
  import type { PermissionMode } from '../permission/index.js'
6
6
  import type { StopReason } from '../run/stop-reason.js'
7
+ import type { ProjectId, ThreadId } from '../session/ids.js'
7
8
  import type { TaskStore } from '../task/index.js'
8
9
  import type { ToolAvailability } from '../tool/index.js'
9
10
 
@@ -22,8 +23,33 @@ export interface BaseAgentConfig {
22
23
  permissionMode?: PermissionMode
23
24
  env?: Record<string, string>
24
25
 
26
+ /**
27
+ * Long-lived goal scope for the run. Required at runtime — agents reject
28
+ * configs missing this (`'X requires sessionId, projectId, and tenantId
29
+ * in config'`).
30
+ *
31
+ * Kept optional at the TYPE level because {@link AgentManager} stamps
32
+ * this field AFTER `configBuilder` returns (manager/agent/lifecycle.ts).
33
+ * Tightening to required is a separate task alongside
34
+ * `AgentFactoryOptions` carrying the triple.
35
+ */
36
+ projectId?: ProjectId
37
+
38
+ /**
39
+ * Topic the run belongs to. Optional at the TYPE level for the same
40
+ * reason as `projectId` — {@link AgentManager} stamps this field after
41
+ * `configBuilder` returns so `configBuilder` implementations do not
42
+ * need to be updated before this tightens. Tightening to required
43
+ * lands with the `AgentFactoryOptions` triple refactor.
44
+ */
25
45
  threadId?: ThreadId
26
46
 
47
+ /** Session under which the run executes. See `projectId` for the tightening plan. */
48
+ sessionId?: SessionId
49
+
50
+ /** Isolation boundary (Convention #17). See `projectId` for the tightening plan. */
51
+ tenantId?: TenantId
52
+
27
53
  parentRunId?: RunId
28
54
 
29
55
  depth?: number
@@ -14,7 +14,14 @@ export interface AgentDefinition {
14
14
  }
15
15
 
16
16
  export interface AgentFactoryOptions {
17
- apiKey: string
17
+ /**
18
+ * API key for providers that authenticate via key (OpenAI, Anthropic,
19
+ * OpenRouter). Optional because BYO-provider flows (Bedrock IAM, custom
20
+ * `ProviderRegistry.create(...)`) resolve credentials outside this object.
21
+ * `configBuilder` implementations should treat an absent `apiKey` as the
22
+ * BYO signal and use the provider passed via the agent config instead.
23
+ */
24
+ apiKey?: string
18
25
  model?: string
19
26
  workingDirectory?: string
20
27
  tokenBudget?: number
@@ -39,8 +46,6 @@ export interface AgentFactoryOptions {
39
46
 
40
47
  taskRouter?: TaskRouterConfig
41
48
 
42
- threadId?: string
43
-
44
49
  runId?: string
45
50
 
46
51
  parentRunId?: string
@@ -1,7 +1,10 @@
1
+ import type { ActorRef } from '../../session/hierarchy/actor.js'
2
+ import type { WorkspaceBackendKind } from '../../session/workspace/ref.js'
1
3
  import type { TokenUsage } from '../common/index.js'
2
- import type { RunId, TaskId, ThreadId } from '../ids/index.js'
4
+ import type { RunId, SessionId, TaskId, TenantId } from '../ids/index.js'
3
5
  import type { Message } from '../message/index.js'
4
6
  import type { RunEventListener } from '../run/events.js'
7
+ import type { ProjectId, ThreadId } from '../session/ids.js'
5
8
  import type { AgentInput, BaseAgentConfig, BaseAgentResult } from './base.js'
6
9
  import type { Agent } from './core.js'
7
10
  import type { AgentFactoryOptions } from './factory.js'
@@ -19,6 +22,12 @@ export function isTerminalAgentTaskState(state: AgentTaskState): boolean {
19
22
  return state === 'completed' || state === 'failed' || state === 'canceled' || state === 'rejected'
20
23
  }
21
24
 
25
+ /**
26
+ * Context carried into {@link AgentManager.sendMessage}. `tenantId`,
27
+ * `threadId`, `sessionId`, `projectId`, and `parentActor` are required —
28
+ * the spawn path is the ingress point for the session hierarchy; callers
29
+ * must provide the full scoping set.
30
+ */
22
31
  export interface AgentTaskContext {
23
32
  parentRunId: RunId
24
33
 
@@ -32,7 +41,37 @@ export interface AgentTaskContext {
32
41
 
33
42
  factoryOptions?: AgentFactoryOptions
34
43
 
35
- threadId?: ThreadId
44
+ /** Isolation boundary. Required per session-hierarchy.md §12.1. */
45
+ tenantId: TenantId
46
+
47
+ /**
48
+ * Topic the current task belongs to. Required in 0.3.0 — spawn copies
49
+ * this onto the child session without a second ThreadStore round-trip,
50
+ * and gates creation on {@link ThreadManager.requireOpen}. Children
51
+ * inherit the parent's `threadId` verbatim; cross-thread spawn is
52
+ * forbidden by design (a delegated sub-agent stays on the same topic).
53
+ */
54
+ threadId: ThreadId
55
+
56
+ /**
57
+ * Parent session under which any sub-agent spawn is recorded. Required
58
+ * in 0.2.0; a spawn cannot be attributed without it.
59
+ */
60
+ sessionId: SessionId
61
+
62
+ /**
63
+ * Long-lived goal scope. Required. Denormalized from the owning Thread
64
+ * (see {@link Thread}) — structurally immutable per Phase 2.4 decision
65
+ * (sessions never cross threads, threads never cross projects).
66
+ */
67
+ projectId: ProjectId
68
+
69
+ /**
70
+ * The actor invoking this task. Children built off this context stamp
71
+ * their own `parentActor: ActorRef` linking back via the actor chain
72
+ * (session-hierarchy.md §4.3 / §10.4).
73
+ */
74
+ parentActor: ActorRef
36
75
  }
37
76
 
38
77
  export interface AgentTaskBudget {
@@ -66,6 +105,12 @@ export interface AgentTaskProgress {
66
105
  recentActivities: string[]
67
106
  }
68
107
 
108
+ /**
109
+ * Options accepted by {@link AgentManager.sendMessage}. Phase 6 adds the
110
+ * required sub-session spawn scope (`parentSessionId`, `tenantId`, `projectId`,
111
+ * `parentActor`) so the manager can create a SubSession + child Session +
112
+ * WorkspaceRef triple atomically on every spawn.
113
+ */
69
114
  export interface SendMessageOptions {
70
115
  agentId: string
71
116
 
@@ -77,6 +122,25 @@ export interface SendMessageOptions {
77
122
  tokenBudget?: number
78
123
  timeoutMs?: number
79
124
  }
125
+
126
+ /**
127
+ * Parent session under which the new sub-session is created. Capacity
128
+ * validation (depth + width) is applied against this session.
129
+ */
130
+ parentSessionId: SessionId
131
+
132
+ tenantId: TenantId
133
+
134
+ projectId: ProjectId
135
+
136
+ /** The actor requesting the spawn — seeds the child's `parentActor`. */
137
+ parentActor: ActorRef
138
+
139
+ /**
140
+ * Workspace backend to provision for the child session. Defaults to
141
+ * `git-worktree` — the MVP reference backend from Phase 3.
142
+ */
143
+ workspaceBackend?: WorkspaceBackendKind
80
144
  }
81
145
 
82
146
  export interface AgentManagerConfig {
@@ -1,7 +1,6 @@
1
- export type ThreadId = `thd_${string}`
2
1
  export type RunId = `run_${string}`
3
2
  export type MessageId = `msg_${string}`
4
- export type SessionId = `sess_${string}`
3
+ export type SessionId = `ses_${string}`
5
4
  export type ToolCallId = `call_${string}`
6
5
  export type ActivityId = `act_${string}`
7
6
  export type TaskId = `task_${string}`
@@ -11,7 +10,7 @@ export type DocumentId = `doc_${string}`
11
10
  export type ChunkId = `chk_${string}`
12
11
  export type ConnectorId = `conn_${string}`
13
12
  export type ConnectorInstanceId = `ci_${string}`
14
- export type TenantId = `ten_${string}`
13
+ export type TenantId = `tnt_${string}`
15
14
  export type CredentialId = `cred_${string}`
16
15
  export type ExecutionContextId = `ectx_${string}`
17
16
  export type MCPServerId = `mcp_${string}`
@@ -26,3 +25,35 @@ export type EmergencySaveId = `esave_${string}`
26
25
  export type MemoryId = `mem_${string}`
27
26
  export type PluginId = `plg_${string}`
28
27
  export type SandboxId = `sbx_${string}`
28
+
29
+ // Actor identifiers (Session Hierarchy §4.3). Branded so actor refs cannot be
30
+ // constructed from bare strings.
31
+ export type UserId = `usr_${string}`
32
+ export type AgentId = `agt_${string}`
33
+
34
+ // Shared-store placeholder refs (Session Hierarchy §4.2 / §3.2). Full shapes
35
+ // land in later phases; kept here as opaque branded IDs so ProjectConfig can
36
+ // reference them today.
37
+ export type MemoryStoreRef = `mms_${string}`
38
+ export type VaultRef = `vlt_${string}`
39
+ export type KnowledgeBaseRef = `kbs_${string}`
40
+
41
+ // Session hierarchy IDs. Convention #2 branded IDs; prefixes mandated by the
42
+ // five-layer hierarchy (Project → Thread → Session → SubSession → Run). The
43
+ // `types/session/ids.ts` barrel re-exports these for co-location ergonomics.
44
+ export type ProjectId = `prj_${string}`
45
+ export type ThreadId = `thd_${string}`
46
+ export type SubSessionId = `sub_${string}`
47
+ export type HandoffId = `hof_${string}`
48
+ export type WorkspaceId = `wsp_${string}`
49
+ export type SummaryId = `sum_${string}`
50
+ export type DeliverableId = `del_${string}`
51
+
52
+ /**
53
+ * Sentinel {@link TenantId} for legacy pre-0.2.0 runs rehomed by the
54
+ * boot-time filesystem migration. Consumers with strict tenant enforcement
55
+ * should either tag these records on first access or reject them until a
56
+ * real tenant is assigned — the kernel surfaces the sentinel but does not
57
+ * prescribe policy (Convention #17).
58
+ */
59
+ export const UNKNOWN_TENANT_ID = 'tnt_unknown_legacy' as TenantId