@methodts/runtime 0.1.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 (537) hide show
  1. package/dist/__fixtures__/executor-fixtures.d.ts +10 -0
  2. package/dist/__fixtures__/executor-fixtures.d.ts.map +1 -0
  3. package/dist/__fixtures__/executor-fixtures.js +36 -0
  4. package/dist/__fixtures__/executor-fixtures.js.map +1 -0
  5. package/dist/architecture.test.d.ts +2 -0
  6. package/dist/architecture.test.d.ts.map +1 -0
  7. package/dist/architecture.test.js +143 -0
  8. package/dist/architecture.test.js.map +1 -0
  9. package/dist/config/cost-governor-config.d.ts +40 -0
  10. package/dist/config/cost-governor-config.d.ts.map +1 -0
  11. package/dist/config/cost-governor-config.js +48 -0
  12. package/dist/config/cost-governor-config.js.map +1 -0
  13. package/dist/config/index.d.ts +7 -0
  14. package/dist/config/index.d.ts.map +1 -0
  15. package/dist/config/index.js +6 -0
  16. package/dist/config/index.js.map +1 -0
  17. package/dist/config/sessions-config.d.ts +29 -0
  18. package/dist/config/sessions-config.d.ts.map +1 -0
  19. package/dist/config/sessions-config.js +37 -0
  20. package/dist/config/sessions-config.js.map +1 -0
  21. package/dist/config/strategies-config.d.ts +38 -0
  22. package/dist/config/strategies-config.d.ts.map +1 -0
  23. package/dist/config/strategies-config.js +41 -0
  24. package/dist/config/strategies-config.js.map +1 -0
  25. package/dist/cost-governor/backpressure-queue.d.ts +20 -0
  26. package/dist/cost-governor/backpressure-queue.d.ts.map +1 -0
  27. package/dist/cost-governor/backpressure-queue.js +78 -0
  28. package/dist/cost-governor/backpressure-queue.js.map +1 -0
  29. package/dist/cost-governor/backpressure-queue.test.d.ts +2 -0
  30. package/dist/cost-governor/backpressure-queue.test.d.ts.map +1 -0
  31. package/dist/cost-governor/backpressure-queue.test.js +48 -0
  32. package/dist/cost-governor/backpressure-queue.test.js.map +1 -0
  33. package/dist/cost-governor/cost-events.d.ts +65 -0
  34. package/dist/cost-governor/cost-events.d.ts.map +1 -0
  35. package/dist/cost-governor/cost-events.js +48 -0
  36. package/dist/cost-governor/cost-events.js.map +1 -0
  37. package/dist/cost-governor/cost-governor-app-id.test.d.ts +19 -0
  38. package/dist/cost-governor/cost-governor-app-id.test.d.ts.map +1 -0
  39. package/dist/cost-governor/cost-governor-app-id.test.js +201 -0
  40. package/dist/cost-governor/cost-governor-app-id.test.js.map +1 -0
  41. package/dist/cost-governor/cost-oracle-impl.d.ts +19 -0
  42. package/dist/cost-governor/cost-oracle-impl.d.ts.map +1 -0
  43. package/dist/cost-governor/cost-oracle-impl.js +52 -0
  44. package/dist/cost-governor/cost-oracle-impl.js.map +1 -0
  45. package/dist/cost-governor/estimator.d.ts +22 -0
  46. package/dist/cost-governor/estimator.d.ts.map +1 -0
  47. package/dist/cost-governor/estimator.js +119 -0
  48. package/dist/cost-governor/estimator.js.map +1 -0
  49. package/dist/cost-governor/estimator.test.d.ts +2 -0
  50. package/dist/cost-governor/estimator.test.d.ts.map +1 -0
  51. package/dist/cost-governor/estimator.test.js +141 -0
  52. package/dist/cost-governor/estimator.test.js.map +1 -0
  53. package/dist/cost-governor/index.d.ts +75 -0
  54. package/dist/cost-governor/index.d.ts.map +1 -0
  55. package/dist/cost-governor/index.js +120 -0
  56. package/dist/cost-governor/index.js.map +1 -0
  57. package/dist/cost-governor/observations-store.d.ts +49 -0
  58. package/dist/cost-governor/observations-store.d.ts.map +1 -0
  59. package/dist/cost-governor/observations-store.js +179 -0
  60. package/dist/cost-governor/observations-store.js.map +1 -0
  61. package/dist/cost-governor/observations-store.test.d.ts +2 -0
  62. package/dist/cost-governor/observations-store.test.d.ts.map +1 -0
  63. package/dist/cost-governor/observations-store.test.js +191 -0
  64. package/dist/cost-governor/observations-store.test.js.map +1 -0
  65. package/dist/cost-governor/percentile.d.ts +17 -0
  66. package/dist/cost-governor/percentile.d.ts.map +1 -0
  67. package/dist/cost-governor/percentile.js +33 -0
  68. package/dist/cost-governor/percentile.js.map +1 -0
  69. package/dist/cost-governor/percentile.test.d.ts +2 -0
  70. package/dist/cost-governor/percentile.test.d.ts.map +1 -0
  71. package/dist/cost-governor/percentile.test.js +46 -0
  72. package/dist/cost-governor/percentile.test.js.map +1 -0
  73. package/dist/cost-governor/rate-governor-impl.d.ts +73 -0
  74. package/dist/cost-governor/rate-governor-impl.d.ts.map +1 -0
  75. package/dist/cost-governor/rate-governor-impl.js +148 -0
  76. package/dist/cost-governor/rate-governor-impl.js.map +1 -0
  77. package/dist/cost-governor/signature-builder.d.ts +22 -0
  78. package/dist/cost-governor/signature-builder.d.ts.map +1 -0
  79. package/dist/cost-governor/signature-builder.js +43 -0
  80. package/dist/cost-governor/signature-builder.js.map +1 -0
  81. package/dist/cost-governor/signature-builder.test.d.ts +2 -0
  82. package/dist/cost-governor/signature-builder.test.d.ts.map +1 -0
  83. package/dist/cost-governor/signature-builder.test.js +58 -0
  84. package/dist/cost-governor/signature-builder.test.js.map +1 -0
  85. package/dist/cost-governor/token-bucket.d.ts +57 -0
  86. package/dist/cost-governor/token-bucket.d.ts.map +1 -0
  87. package/dist/cost-governor/token-bucket.js +109 -0
  88. package/dist/cost-governor/token-bucket.js.map +1 -0
  89. package/dist/cost-governor/token-bucket.test.d.ts +2 -0
  90. package/dist/cost-governor/token-bucket.test.d.ts.map +1 -0
  91. package/dist/cost-governor/token-bucket.test.js +67 -0
  92. package/dist/cost-governor/token-bucket.test.js.map +1 -0
  93. package/dist/dlq/cortex-dlq-observer.d.ts +22 -0
  94. package/dist/dlq/cortex-dlq-observer.d.ts.map +1 -0
  95. package/dist/dlq/cortex-dlq-observer.js +29 -0
  96. package/dist/dlq/cortex-dlq-observer.js.map +1 -0
  97. package/dist/dlq/dlq-observer.test.d.ts +8 -0
  98. package/dist/dlq/dlq-observer.test.d.ts.map +1 -0
  99. package/dist/dlq/dlq-observer.test.js +103 -0
  100. package/dist/dlq/dlq-observer.test.js.map +1 -0
  101. package/dist/dlq/index.d.ts +6 -0
  102. package/dist/dlq/index.d.ts.map +1 -0
  103. package/dist/dlq/index.js +6 -0
  104. package/dist/dlq/index.js.map +1 -0
  105. package/dist/event-bus/adapters.d.ts +50 -0
  106. package/dist/event-bus/adapters.d.ts.map +1 -0
  107. package/dist/event-bus/adapters.js +51 -0
  108. package/dist/event-bus/adapters.js.map +1 -0
  109. package/dist/event-bus/adapters.test.d.ts +5 -0
  110. package/dist/event-bus/adapters.test.d.ts.map +1 -0
  111. package/dist/event-bus/adapters.test.js +73 -0
  112. package/dist/event-bus/adapters.test.js.map +1 -0
  113. package/dist/event-bus/agent-event-adapter.d.ts +22 -0
  114. package/dist/event-bus/agent-event-adapter.d.ts.map +1 -0
  115. package/dist/event-bus/agent-event-adapter.js +49 -0
  116. package/dist/event-bus/agent-event-adapter.js.map +1 -0
  117. package/dist/event-bus/agent-event-adapter.test.d.ts +5 -0
  118. package/dist/event-bus/agent-event-adapter.test.d.ts.map +1 -0
  119. package/dist/event-bus/agent-event-adapter.test.js +170 -0
  120. package/dist/event-bus/agent-event-adapter.test.js.map +1 -0
  121. package/dist/event-bus/channel-sink.d.ts +71 -0
  122. package/dist/event-bus/channel-sink.d.ts.map +1 -0
  123. package/dist/event-bus/channel-sink.js +159 -0
  124. package/dist/event-bus/channel-sink.js.map +1 -0
  125. package/dist/event-bus/channel-sink.test.d.ts +5 -0
  126. package/dist/event-bus/channel-sink.test.d.ts.map +1 -0
  127. package/dist/event-bus/channel-sink.test.js +234 -0
  128. package/dist/event-bus/channel-sink.test.js.map +1 -0
  129. package/dist/event-bus/event-types.snapshot.test.d.ts +27 -0
  130. package/dist/event-bus/event-types.snapshot.test.d.ts.map +1 -0
  131. package/dist/event-bus/event-types.snapshot.test.js +165 -0
  132. package/dist/event-bus/event-types.snapshot.test.js.map +1 -0
  133. package/dist/event-bus/genesis-sink.d.ts +55 -0
  134. package/dist/event-bus/genesis-sink.d.ts.map +1 -0
  135. package/dist/event-bus/genesis-sink.js +141 -0
  136. package/dist/event-bus/genesis-sink.js.map +1 -0
  137. package/dist/event-bus/genesis-sink.test.d.ts +5 -0
  138. package/dist/event-bus/genesis-sink.test.d.ts.map +1 -0
  139. package/dist/event-bus/genesis-sink.test.js +160 -0
  140. package/dist/event-bus/genesis-sink.test.js.map +1 -0
  141. package/dist/event-bus/in-memory-event-bus.d.ts +60 -0
  142. package/dist/event-bus/in-memory-event-bus.d.ts.map +1 -0
  143. package/dist/event-bus/in-memory-event-bus.js +274 -0
  144. package/dist/event-bus/in-memory-event-bus.js.map +1 -0
  145. package/dist/event-bus/in-memory-event-bus.test.d.ts +5 -0
  146. package/dist/event-bus/in-memory-event-bus.test.d.ts.map +1 -0
  147. package/dist/event-bus/in-memory-event-bus.test.js +457 -0
  148. package/dist/event-bus/in-memory-event-bus.test.js.map +1 -0
  149. package/dist/event-bus/index.d.ts +22 -0
  150. package/dist/event-bus/index.d.ts.map +1 -0
  151. package/dist/event-bus/index.js +17 -0
  152. package/dist/event-bus/index.js.map +1 -0
  153. package/dist/event-bus/persistence-sink.d.ts +74 -0
  154. package/dist/event-bus/persistence-sink.d.ts.map +1 -0
  155. package/dist/event-bus/persistence-sink.js +193 -0
  156. package/dist/event-bus/persistence-sink.js.map +1 -0
  157. package/dist/event-bus/persistence-sink.test.d.ts +6 -0
  158. package/dist/event-bus/persistence-sink.test.d.ts.map +1 -0
  159. package/dist/event-bus/persistence-sink.test.js +319 -0
  160. package/dist/event-bus/persistence-sink.test.js.map +1 -0
  161. package/dist/event-bus/session-checkpoint-sink.d.ts +91 -0
  162. package/dist/event-bus/session-checkpoint-sink.d.ts.map +1 -0
  163. package/dist/event-bus/session-checkpoint-sink.js +107 -0
  164. package/dist/event-bus/session-checkpoint-sink.js.map +1 -0
  165. package/dist/event-bus/session-checkpoint-sink.test.d.ts +5 -0
  166. package/dist/event-bus/session-checkpoint-sink.test.d.ts.map +1 -0
  167. package/dist/event-bus/session-checkpoint-sink.test.js +215 -0
  168. package/dist/event-bus/session-checkpoint-sink.test.js.map +1 -0
  169. package/dist/event-bus/webhook-connector.d.ts +59 -0
  170. package/dist/event-bus/webhook-connector.d.ts.map +1 -0
  171. package/dist/event-bus/webhook-connector.js +191 -0
  172. package/dist/event-bus/webhook-connector.js.map +1 -0
  173. package/dist/event-bus/webhook-connector.test.d.ts +5 -0
  174. package/dist/event-bus/webhook-connector.test.d.ts.map +1 -0
  175. package/dist/event-bus/webhook-connector.test.js +214 -0
  176. package/dist/event-bus/webhook-connector.test.js.map +1 -0
  177. package/dist/executors/cortex-job-backed-executor.d.ts +137 -0
  178. package/dist/executors/cortex-job-backed-executor.d.ts.map +1 -0
  179. package/dist/executors/cortex-job-backed-executor.js +441 -0
  180. package/dist/executors/cortex-job-backed-executor.js.map +1 -0
  181. package/dist/executors/cortex-job-backed-executor.test.d.ts +13 -0
  182. package/dist/executors/cortex-job-backed-executor.test.d.ts.map +1 -0
  183. package/dist/executors/cortex-job-backed-executor.test.js +303 -0
  184. package/dist/executors/cortex-job-backed-executor.test.js.map +1 -0
  185. package/dist/executors/index.d.ts +9 -0
  186. package/dist/executors/index.d.ts.map +1 -0
  187. package/dist/executors/index.js +9 -0
  188. package/dist/executors/index.js.map +1 -0
  189. package/dist/index.d.ts +2 -0
  190. package/dist/index.d.ts.map +1 -0
  191. package/dist/index.js +13 -0
  192. package/dist/index.js.map +1 -0
  193. package/dist/ports/checkpoint-sink.d.ts +69 -0
  194. package/dist/ports/checkpoint-sink.d.ts.map +1 -0
  195. package/dist/ports/checkpoint-sink.js +16 -0
  196. package/dist/ports/checkpoint-sink.js.map +1 -0
  197. package/dist/ports/checkpoint.d.ts +68 -0
  198. package/dist/ports/checkpoint.d.ts.map +1 -0
  199. package/dist/ports/checkpoint.js +14 -0
  200. package/dist/ports/checkpoint.js.map +1 -0
  201. package/dist/ports/continuation-envelope-cross-app.test.d.ts +10 -0
  202. package/dist/ports/continuation-envelope-cross-app.test.d.ts.map +1 -0
  203. package/dist/ports/continuation-envelope-cross-app.test.js +95 -0
  204. package/dist/ports/continuation-envelope-cross-app.test.js.map +1 -0
  205. package/dist/ports/continuation-envelope.d.ts +199 -0
  206. package/dist/ports/continuation-envelope.d.ts.map +1 -0
  207. package/dist/ports/continuation-envelope.js +69 -0
  208. package/dist/ports/continuation-envelope.js.map +1 -0
  209. package/dist/ports/conversation.d.ts +64 -0
  210. package/dist/ports/conversation.d.ts.map +1 -0
  211. package/dist/ports/conversation.js +19 -0
  212. package/dist/ports/conversation.js.map +1 -0
  213. package/dist/ports/cost-oracle.d.ts +26 -0
  214. package/dist/ports/cost-oracle.d.ts.map +1 -0
  215. package/dist/ports/cost-oracle.js +9 -0
  216. package/dist/ports/cost-oracle.js.map +1 -0
  217. package/dist/ports/cross-app-invoker.d.ts +198 -0
  218. package/dist/ports/cross-app-invoker.d.ts.map +1 -0
  219. package/dist/ports/cross-app-invoker.js +157 -0
  220. package/dist/ports/cross-app-invoker.js.map +1 -0
  221. package/dist/ports/dlq-observer.d.ts +40 -0
  222. package/dist/ports/dlq-observer.d.ts.map +1 -0
  223. package/dist/ports/dlq-observer.js +20 -0
  224. package/dist/ports/dlq-observer.js.map +1 -0
  225. package/dist/ports/event-bus.d.ts +169 -0
  226. package/dist/ports/event-bus.d.ts.map +1 -0
  227. package/dist/ports/event-bus.js +20 -0
  228. package/dist/ports/event-bus.js.map +1 -0
  229. package/dist/ports/event-reader.d.ts +21 -0
  230. package/dist/ports/event-reader.d.ts.map +1 -0
  231. package/dist/ports/event-reader.js +12 -0
  232. package/dist/ports/event-reader.js.map +1 -0
  233. package/dist/ports/event-rotator.d.ts +39 -0
  234. package/dist/ports/event-rotator.d.ts.map +1 -0
  235. package/dist/ports/event-rotator.js +15 -0
  236. package/dist/ports/event-rotator.js.map +1 -0
  237. package/dist/ports/file-system.d.ts +48 -0
  238. package/dist/ports/file-system.d.ts.map +1 -0
  239. package/dist/ports/file-system.js +10 -0
  240. package/dist/ports/file-system.js.map +1 -0
  241. package/dist/ports/historical-observations.d.ts +39 -0
  242. package/dist/ports/historical-observations.d.ts.map +1 -0
  243. package/dist/ports/historical-observations.js +12 -0
  244. package/dist/ports/historical-observations.js.map +1 -0
  245. package/dist/ports/in-memory-source.d.ts +46 -0
  246. package/dist/ports/in-memory-source.d.ts.map +1 -0
  247. package/dist/ports/in-memory-source.js +69 -0
  248. package/dist/ports/in-memory-source.js.map +1 -0
  249. package/dist/ports/index.d.ts +32 -0
  250. package/dist/ports/index.d.ts.map +1 -0
  251. package/dist/ports/index.js +10 -0
  252. package/dist/ports/index.js.map +1 -0
  253. package/dist/ports/job-backed-executor.d.ts +139 -0
  254. package/dist/ports/job-backed-executor.d.ts.map +1 -0
  255. package/dist/ports/job-backed-executor.js +56 -0
  256. package/dist/ports/job-backed-executor.js.map +1 -0
  257. package/dist/ports/methodology-source.d.ts +95 -0
  258. package/dist/ports/methodology-source.d.ts.map +1 -0
  259. package/dist/ports/methodology-source.js +26 -0
  260. package/dist/ports/methodology-source.js.map +1 -0
  261. package/dist/ports/native-session-discovery.d.ts +20 -0
  262. package/dist/ports/native-session-discovery.d.ts.map +1 -0
  263. package/dist/ports/native-session-discovery.js +13 -0
  264. package/dist/ports/native-session-discovery.js.map +1 -0
  265. package/dist/ports/projection-store.d.ts +48 -0
  266. package/dist/ports/projection-store.d.ts.map +1 -0
  267. package/dist/ports/projection-store.js +17 -0
  268. package/dist/ports/projection-store.js.map +1 -0
  269. package/dist/ports/projection.d.ts +29 -0
  270. package/dist/ports/projection.d.ts.map +1 -0
  271. package/dist/ports/projection.js +13 -0
  272. package/dist/ports/projection.js.map +1 -0
  273. package/dist/ports/rate-governor.d.ts +17 -0
  274. package/dist/ports/rate-governor.d.ts.map +1 -0
  275. package/dist/ports/rate-governor.js +11 -0
  276. package/dist/ports/rate-governor.js.map +1 -0
  277. package/dist/ports/schedule-client.d.ts +29 -0
  278. package/dist/ports/schedule-client.d.ts.map +1 -0
  279. package/dist/ports/schedule-client.js +2 -0
  280. package/dist/ports/schedule-client.js.map +1 -0
  281. package/dist/ports/session-pool.d.ts +162 -0
  282. package/dist/ports/session-pool.d.ts.map +1 -0
  283. package/dist/ports/session-pool.js +21 -0
  284. package/dist/ports/session-pool.js.map +1 -0
  285. package/dist/ports/session-store-errors.d.ts +22 -0
  286. package/dist/ports/session-store-errors.d.ts.map +1 -0
  287. package/dist/ports/session-store-errors.js +29 -0
  288. package/dist/ports/session-store-errors.js.map +1 -0
  289. package/dist/ports/session-store-types.d.ts +132 -0
  290. package/dist/ports/session-store-types.d.ts.map +1 -0
  291. package/dist/ports/session-store-types.js +14 -0
  292. package/dist/ports/session-store-types.js.map +1 -0
  293. package/dist/ports/session-store.d.ts +69 -0
  294. package/dist/ports/session-store.d.ts.map +1 -0
  295. package/dist/ports/session-store.js +23 -0
  296. package/dist/ports/session-store.js.map +1 -0
  297. package/dist/ports/yaml-loader.d.ts +15 -0
  298. package/dist/ports/yaml-loader.d.ts.map +1 -0
  299. package/dist/ports/yaml-loader.js +13 -0
  300. package/dist/ports/yaml-loader.js.map +1 -0
  301. package/dist/scheduling/index.d.ts +6 -0
  302. package/dist/scheduling/index.d.ts.map +1 -0
  303. package/dist/scheduling/index.js +6 -0
  304. package/dist/scheduling/index.js.map +1 -0
  305. package/dist/scheduling/scheduled-pact.d.ts +97 -0
  306. package/dist/scheduling/scheduled-pact.d.ts.map +1 -0
  307. package/dist/scheduling/scheduled-pact.js +89 -0
  308. package/dist/scheduling/scheduled-pact.js.map +1 -0
  309. package/dist/sessions/__tests__/cognitive-modules.test.d.ts +10 -0
  310. package/dist/sessions/__tests__/cognitive-modules.test.d.ts.map +1 -0
  311. package/dist/sessions/__tests__/cognitive-modules.test.js +535 -0
  312. package/dist/sessions/__tests__/cognitive-modules.test.js.map +1 -0
  313. package/dist/sessions/__tests__/cognitive-provider.test.d.ts +13 -0
  314. package/dist/sessions/__tests__/cognitive-provider.test.d.ts.map +1 -0
  315. package/dist/sessions/__tests__/cognitive-provider.test.js +331 -0
  316. package/dist/sessions/__tests__/cognitive-provider.test.js.map +1 -0
  317. package/dist/sessions/__tests__/cognitive-sink.test.d.ts +19 -0
  318. package/dist/sessions/__tests__/cognitive-sink.test.d.ts.map +1 -0
  319. package/dist/sessions/__tests__/cognitive-sink.test.js +334 -0
  320. package/dist/sessions/__tests__/cognitive-sink.test.js.map +1 -0
  321. package/dist/sessions/__tests__/runtime-tools.test.d.ts +2 -0
  322. package/dist/sessions/__tests__/runtime-tools.test.d.ts.map +1 -0
  323. package/dist/sessions/__tests__/runtime-tools.test.js +83 -0
  324. package/dist/sessions/__tests__/runtime-tools.test.js.map +1 -0
  325. package/dist/sessions/auto-retro.d.ts +29 -0
  326. package/dist/sessions/auto-retro.d.ts.map +1 -0
  327. package/dist/sessions/auto-retro.js +181 -0
  328. package/dist/sessions/auto-retro.js.map +1 -0
  329. package/dist/sessions/auto-retro.test.d.ts +2 -0
  330. package/dist/sessions/auto-retro.test.d.ts.map +1 -0
  331. package/dist/sessions/auto-retro.test.js +361 -0
  332. package/dist/sessions/auto-retro.test.js.map +1 -0
  333. package/dist/sessions/channels.d.ts +55 -0
  334. package/dist/sessions/channels.d.ts.map +1 -0
  335. package/dist/sessions/channels.js +118 -0
  336. package/dist/sessions/channels.js.map +1 -0
  337. package/dist/sessions/channels.test.d.ts +2 -0
  338. package/dist/sessions/channels.test.d.ts.map +1 -0
  339. package/dist/sessions/channels.test.js +285 -0
  340. package/dist/sessions/channels.test.js.map +1 -0
  341. package/dist/sessions/cognitive-modules.d.ts +100 -0
  342. package/dist/sessions/cognitive-modules.d.ts.map +1 -0
  343. package/dist/sessions/cognitive-modules.js +458 -0
  344. package/dist/sessions/cognitive-modules.js.map +1 -0
  345. package/dist/sessions/cognitive-provider.d.ts +42 -0
  346. package/dist/sessions/cognitive-provider.d.ts.map +1 -0
  347. package/dist/sessions/cognitive-provider.js +208 -0
  348. package/dist/sessions/cognitive-provider.js.map +1 -0
  349. package/dist/sessions/cognitive-sink.d.ts +73 -0
  350. package/dist/sessions/cognitive-sink.d.ts.map +1 -0
  351. package/dist/sessions/cognitive-sink.js +154 -0
  352. package/dist/sessions/cognitive-sink.js.map +1 -0
  353. package/dist/sessions/diagnostics.d.ts +70 -0
  354. package/dist/sessions/diagnostics.d.ts.map +1 -0
  355. package/dist/sessions/diagnostics.js +129 -0
  356. package/dist/sessions/diagnostics.js.map +1 -0
  357. package/dist/sessions/diagnostics.test.d.ts +2 -0
  358. package/dist/sessions/diagnostics.test.d.ts.map +1 -0
  359. package/dist/sessions/diagnostics.test.js +135 -0
  360. package/dist/sessions/diagnostics.test.js.map +1 -0
  361. package/dist/sessions/index.d.ts +32 -0
  362. package/dist/sessions/index.d.ts.map +1 -0
  363. package/dist/sessions/index.js +33 -0
  364. package/dist/sessions/index.js.map +1 -0
  365. package/dist/sessions/pool.d.ts +218 -0
  366. package/dist/sessions/pool.d.ts.map +1 -0
  367. package/dist/sessions/pool.js +991 -0
  368. package/dist/sessions/pool.js.map +1 -0
  369. package/dist/sessions/pool.test.d.ts +2 -0
  370. package/dist/sessions/pool.test.d.ts.map +1 -0
  371. package/dist/sessions/pool.test.js +633 -0
  372. package/dist/sessions/pool.test.js.map +1 -0
  373. package/dist/sessions/print-session.d.ts +142 -0
  374. package/dist/sessions/print-session.d.ts.map +1 -0
  375. package/dist/sessions/print-session.js +325 -0
  376. package/dist/sessions/print-session.js.map +1 -0
  377. package/dist/sessions/print-session.test.d.ts +2 -0
  378. package/dist/sessions/print-session.test.d.ts.map +1 -0
  379. package/dist/sessions/print-session.test.js +418 -0
  380. package/dist/sessions/print-session.test.js.map +1 -0
  381. package/dist/sessions/runtime-tools.d.ts +22 -0
  382. package/dist/sessions/runtime-tools.d.ts.map +1 -0
  383. package/dist/sessions/runtime-tools.js +162 -0
  384. package/dist/sessions/runtime-tools.js.map +1 -0
  385. package/dist/sessions/scope-hook.d.ts +77 -0
  386. package/dist/sessions/scope-hook.d.ts.map +1 -0
  387. package/dist/sessions/scope-hook.js +323 -0
  388. package/dist/sessions/scope-hook.js.map +1 -0
  389. package/dist/sessions/scope-hook.test.d.ts +2 -0
  390. package/dist/sessions/scope-hook.test.d.ts.map +1 -0
  391. package/dist/sessions/scope-hook.test.js +249 -0
  392. package/dist/sessions/scope-hook.test.js.map +1 -0
  393. package/dist/sessions/session-store/checkpoint-sink-impl.d.ts +16 -0
  394. package/dist/sessions/session-store/checkpoint-sink-impl.d.ts.map +1 -0
  395. package/dist/sessions/session-store/checkpoint-sink-impl.js +191 -0
  396. package/dist/sessions/session-store/checkpoint-sink-impl.js.map +1 -0
  397. package/dist/sessions/session-store/checkpoint-sink-impl.test.d.ts +5 -0
  398. package/dist/sessions/session-store/checkpoint-sink-impl.test.d.ts.map +1 -0
  399. package/dist/sessions/session-store/checkpoint-sink-impl.test.js +137 -0
  400. package/dist/sessions/session-store/checkpoint-sink-impl.test.js.map +1 -0
  401. package/dist/sessions/session-store/conformance.d.ts +59 -0
  402. package/dist/sessions/session-store/conformance.d.ts.map +1 -0
  403. package/dist/sessions/session-store/conformance.js +172 -0
  404. package/dist/sessions/session-store/conformance.js.map +1 -0
  405. package/dist/sessions/session-store/conformance.test.d.ts +7 -0
  406. package/dist/sessions/session-store/conformance.test.d.ts.map +1 -0
  407. package/dist/sessions/session-store/conformance.test.js +22 -0
  408. package/dist/sessions/session-store/conformance.test.js.map +1 -0
  409. package/dist/sessions/session-store/in-memory-session-store.d.ts +23 -0
  410. package/dist/sessions/session-store/in-memory-session-store.d.ts.map +1 -0
  411. package/dist/sessions/session-store/in-memory-session-store.js +197 -0
  412. package/dist/sessions/session-store/in-memory-session-store.js.map +1 -0
  413. package/dist/sessions/session-store/in-memory-session-store.test.d.ts +6 -0
  414. package/dist/sessions/session-store/in-memory-session-store.test.d.ts.map +1 -0
  415. package/dist/sessions/session-store/in-memory-session-store.test.js +183 -0
  416. package/dist/sessions/session-store/in-memory-session-store.test.js.map +1 -0
  417. package/dist/sessions/session-store/index.d.ts +20 -0
  418. package/dist/sessions/session-store/index.d.ts.map +1 -0
  419. package/dist/sessions/session-store/index.js +15 -0
  420. package/dist/sessions/session-store/index.js.map +1 -0
  421. package/dist/sessions/session-store/resume.d.ts +88 -0
  422. package/dist/sessions/session-store/resume.d.ts.map +1 -0
  423. package/dist/sessions/session-store/resume.js +96 -0
  424. package/dist/sessions/session-store/resume.js.map +1 -0
  425. package/dist/sessions/session-store/resume.test.d.ts +5 -0
  426. package/dist/sessions/session-store/resume.test.d.ts.map +1 -0
  427. package/dist/sessions/session-store/resume.test.js +119 -0
  428. package/dist/sessions/session-store/resume.test.js.map +1 -0
  429. package/dist/sessions/spawn-queue.d.ts +28 -0
  430. package/dist/sessions/spawn-queue.d.ts.map +1 -0
  431. package/dist/sessions/spawn-queue.js +63 -0
  432. package/dist/sessions/spawn-queue.js.map +1 -0
  433. package/dist/sessions/spawn-queue.test.d.ts +2 -0
  434. package/dist/sessions/spawn-queue.test.d.ts.map +1 -0
  435. package/dist/sessions/spawn-queue.test.js +65 -0
  436. package/dist/sessions/spawn-queue.test.js.map +1 -0
  437. package/dist/sessions/types.d.ts +16 -0
  438. package/dist/sessions/types.d.ts.map +1 -0
  439. package/dist/sessions/types.js +11 -0
  440. package/dist/sessions/types.js.map +1 -0
  441. package/dist/sessions/worktree-stale.test.d.ts +2 -0
  442. package/dist/sessions/worktree-stale.test.d.ts.map +1 -0
  443. package/dist/sessions/worktree-stale.test.js +468 -0
  444. package/dist/sessions/worktree-stale.test.js.map +1 -0
  445. package/dist/strategy/artifact-store.d.ts +12 -0
  446. package/dist/strategy/artifact-store.d.ts.map +1 -0
  447. package/dist/strategy/artifact-store.js +12 -0
  448. package/dist/strategy/artifact-store.js.map +1 -0
  449. package/dist/strategy/artifact-store.test.d.ts +2 -0
  450. package/dist/strategy/artifact-store.test.d.ts.map +1 -0
  451. package/dist/strategy/artifact-store.test.js +170 -0
  452. package/dist/strategy/artifact-store.test.js.map +1 -0
  453. package/dist/strategy/context-load-executor.d.ts +23 -0
  454. package/dist/strategy/context-load-executor.d.ts.map +1 -0
  455. package/dist/strategy/context-load-executor.js +87 -0
  456. package/dist/strategy/context-load-executor.js.map +1 -0
  457. package/dist/strategy/context-load-executor.test.d.ts +16 -0
  458. package/dist/strategy/context-load-executor.test.d.ts.map +1 -0
  459. package/dist/strategy/context-load-executor.test.js +158 -0
  460. package/dist/strategy/context-load-executor.test.js.map +1 -0
  461. package/dist/strategy/cortex-cross-app-invoker.stub.d.ts +65 -0
  462. package/dist/strategy/cortex-cross-app-invoker.stub.d.ts.map +1 -0
  463. package/dist/strategy/cortex-cross-app-invoker.stub.js +68 -0
  464. package/dist/strategy/cortex-cross-app-invoker.stub.js.map +1 -0
  465. package/dist/strategy/cross-app-node-executor.d.ts +54 -0
  466. package/dist/strategy/cross-app-node-executor.d.ts.map +1 -0
  467. package/dist/strategy/cross-app-node-executor.js +98 -0
  468. package/dist/strategy/cross-app-node-executor.js.map +1 -0
  469. package/dist/strategy/cross-app-node-executor.test.d.ts +13 -0
  470. package/dist/strategy/cross-app-node-executor.test.d.ts.map +1 -0
  471. package/dist/strategy/cross-app-node-executor.test.js +160 -0
  472. package/dist/strategy/cross-app-node-executor.test.js.map +1 -0
  473. package/dist/strategy/gates.d.ts +13 -0
  474. package/dist/strategy/gates.d.ts.map +1 -0
  475. package/dist/strategy/gates.js +13 -0
  476. package/dist/strategy/gates.js.map +1 -0
  477. package/dist/strategy/gates.test.d.ts +2 -0
  478. package/dist/strategy/gates.test.d.ts.map +1 -0
  479. package/dist/strategy/gates.test.js +299 -0
  480. package/dist/strategy/gates.test.js.map +1 -0
  481. package/dist/strategy/human-approval-resolver.d.ts +23 -0
  482. package/dist/strategy/human-approval-resolver.d.ts.map +1 -0
  483. package/dist/strategy/human-approval-resolver.js +94 -0
  484. package/dist/strategy/human-approval-resolver.js.map +1 -0
  485. package/dist/strategy/human-approval-resolver.test.d.ts +16 -0
  486. package/dist/strategy/human-approval-resolver.test.d.ts.map +1 -0
  487. package/dist/strategy/human-approval-resolver.test.js +200 -0
  488. package/dist/strategy/human-approval-resolver.test.js.map +1 -0
  489. package/dist/strategy/in-process-cross-app-invoker.d.ts +105 -0
  490. package/dist/strategy/in-process-cross-app-invoker.d.ts.map +1 -0
  491. package/dist/strategy/in-process-cross-app-invoker.js +206 -0
  492. package/dist/strategy/in-process-cross-app-invoker.js.map +1 -0
  493. package/dist/strategy/in-process-cross-app-invoker.test.d.ts +15 -0
  494. package/dist/strategy/in-process-cross-app-invoker.test.d.ts.map +1 -0
  495. package/dist/strategy/in-process-cross-app-invoker.test.js +190 -0
  496. package/dist/strategy/in-process-cross-app-invoker.test.js.map +1 -0
  497. package/dist/strategy/index.d.ts +29 -0
  498. package/dist/strategy/index.d.ts.map +1 -0
  499. package/dist/strategy/index.js +29 -0
  500. package/dist/strategy/index.js.map +1 -0
  501. package/dist/strategy/pacta-strategy.d.ts +97 -0
  502. package/dist/strategy/pacta-strategy.d.ts.map +1 -0
  503. package/dist/strategy/pacta-strategy.js +117 -0
  504. package/dist/strategy/pacta-strategy.js.map +1 -0
  505. package/dist/strategy/pacta-strategy.test.d.ts +2 -0
  506. package/dist/strategy/pacta-strategy.test.d.ts.map +1 -0
  507. package/dist/strategy/pacta-strategy.test.js +234 -0
  508. package/dist/strategy/pacta-strategy.test.js.map +1 -0
  509. package/dist/strategy/retro-generator.d.ts +18 -0
  510. package/dist/strategy/retro-generator.d.ts.map +1 -0
  511. package/dist/strategy/retro-generator.js +22 -0
  512. package/dist/strategy/retro-generator.js.map +1 -0
  513. package/dist/strategy/retro-writer.d.ts +25 -0
  514. package/dist/strategy/retro-writer.d.ts.map +1 -0
  515. package/dist/strategy/retro-writer.js +65 -0
  516. package/dist/strategy/retro-writer.js.map +1 -0
  517. package/dist/strategy/strategy-executor.d.ts +39 -0
  518. package/dist/strategy/strategy-executor.d.ts.map +1 -0
  519. package/dist/strategy/strategy-executor.js +253 -0
  520. package/dist/strategy/strategy-executor.js.map +1 -0
  521. package/dist/strategy/strategy-executor.test.d.ts +8 -0
  522. package/dist/strategy/strategy-executor.test.d.ts.map +1 -0
  523. package/dist/strategy/strategy-executor.test.js +1301 -0
  524. package/dist/strategy/strategy-executor.test.js.map +1 -0
  525. package/dist/strategy/strategy-parser.d.ts +30 -0
  526. package/dist/strategy/strategy-parser.d.ts.map +1 -0
  527. package/dist/strategy/strategy-parser.js +30 -0
  528. package/dist/strategy/strategy-parser.js.map +1 -0
  529. package/dist/strategy/sub-strategy-source.d.ts +27 -0
  530. package/dist/strategy/sub-strategy-source.d.ts.map +1 -0
  531. package/dist/strategy/sub-strategy-source.js +77 -0
  532. package/dist/strategy/sub-strategy-source.js.map +1 -0
  533. package/dist/strategy/types.d.ts +12 -0
  534. package/dist/strategy/types.d.ts.map +1 -0
  535. package/dist/strategy/types.js +9 -0
  536. package/dist/strategy/types.js.map +1 -0
  537. package/package.json +87 -0
@@ -0,0 +1,633 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ import { describe, it, beforeEach } from 'node:test';
3
+ import assert from 'node:assert/strict';
4
+ import { createSessionChannels } from './channels.js';
5
+ /**
6
+ * Create a fake PtySession for testing without spawning a real PTY process.
7
+ */
8
+ function fakePtySession(id, initialStatus = 'ready') {
9
+ let status = initialStatus;
10
+ let promptCount = 0;
11
+ let lastActivityAt = new Date();
12
+ return {
13
+ id,
14
+ get status() { return status; },
15
+ set status(s) { status = s; },
16
+ queueDepth: 0,
17
+ get promptCount() { return promptCount; },
18
+ set promptCount(n) { promptCount = n; },
19
+ get lastActivityAt() { return lastActivityAt; },
20
+ set lastActivityAt(d) { lastActivityAt = d; },
21
+ get transcript() { return ''; },
22
+ onOutput(_cb) { return () => { }; },
23
+ onExit(_cb) { },
24
+ async sendPrompt(_prompt, _timeoutMs, _settleDelayMs) {
25
+ promptCount++;
26
+ lastActivityAt = new Date();
27
+ return { output: 'mock response', timedOut: false };
28
+ },
29
+ resize() { },
30
+ kill() {
31
+ status = 'dead';
32
+ },
33
+ interrupt() { return false; },
34
+ adaptiveSettle: null,
35
+ pid: null,
36
+ };
37
+ }
38
+ const DEFAULT_CHAIN = {
39
+ parent_session_id: null,
40
+ depth: 0,
41
+ children: [],
42
+ budget: { max_depth: 3, max_agents: 10, agents_spawned: 0 },
43
+ };
44
+ const DEFAULT_WORKTREE = {
45
+ isolation: 'shared',
46
+ worktree_path: null,
47
+ worktree_branch: null,
48
+ metals_available: true,
49
+ };
50
+ /**
51
+ * Build a test pool that uses fakePtySession for unit testing.
52
+ * Mirrors createPool's bookkeeping logic without PTY dependencies.
53
+ * PRD 006: Includes session chain tracking.
54
+ */
55
+ function createTestPool(maxSessions = 5) {
56
+ const sessions = new Map();
57
+ const sessionMetadata = new Map();
58
+ const sessionWorkdirs = new Map();
59
+ const sessionChains = new Map();
60
+ const sessionChannelsMap = new Map();
61
+ let totalSpawned = 0;
62
+ const startedAt = new Date();
63
+ let nextId = 0;
64
+ const pool = {
65
+ async create({ workdir, initialPrompt: _initialPrompt, spawnArgs: _spawnArgs, metadata, parentSessionId, depth, budget }) {
66
+ const activeSessions = [...sessions.values()].filter((s) => s.status !== 'dead').length;
67
+ if (activeSessions >= maxSessions) {
68
+ throw new Error(`Session pool full — maximum ${maxSessions} active sessions`);
69
+ }
70
+ const effectiveDepth = depth ?? 0;
71
+ const effectiveBudget = {
72
+ max_depth: budget?.max_depth ?? 3,
73
+ max_agents: budget?.max_agents ?? 10,
74
+ agents_spawned: budget?.agents_spawned ?? 0,
75
+ };
76
+ // Budget validation for child sessions
77
+ if (parentSessionId) {
78
+ const parentChain = sessionChains.get(parentSessionId);
79
+ if (parentChain) {
80
+ if (effectiveDepth >= parentChain.budget.max_depth) {
81
+ throw new Error(JSON.stringify({
82
+ error: 'DEPTH_EXCEEDED',
83
+ message: `Depth limit exceeded: depth ${effectiveDepth} >= max_depth ${parentChain.budget.max_depth}`,
84
+ budget: parentChain.budget,
85
+ }));
86
+ }
87
+ if (parentChain.budget.agents_spawned >= parentChain.budget.max_agents) {
88
+ throw new Error(JSON.stringify({
89
+ error: 'BUDGET_EXHAUSTED',
90
+ message: `Agent budget exceeded: ${parentChain.budget.agents_spawned}/${parentChain.budget.max_agents}`,
91
+ budget: parentChain.budget,
92
+ }));
93
+ }
94
+ parentChain.budget.agents_spawned++;
95
+ effectiveBudget.max_depth = parentChain.budget.max_depth;
96
+ effectiveBudget.max_agents = parentChain.budget.max_agents;
97
+ effectiveBudget.agents_spawned = parentChain.budget.agents_spawned;
98
+ }
99
+ }
100
+ const sessionId = `test-session-${nextId++}`;
101
+ const session = fakePtySession(sessionId);
102
+ sessions.set(sessionId, session);
103
+ sessionWorkdirs.set(sessionId, workdir);
104
+ if (metadata) {
105
+ sessionMetadata.set(sessionId, metadata);
106
+ }
107
+ const chainInfo = {
108
+ parent_session_id: parentSessionId ?? null,
109
+ depth: effectiveDepth,
110
+ children: [],
111
+ budget: effectiveBudget,
112
+ };
113
+ sessionChains.set(sessionId, chainInfo);
114
+ sessionChannelsMap.set(sessionId, createSessionChannels());
115
+ if (parentSessionId) {
116
+ const parentChain = sessionChains.get(parentSessionId);
117
+ if (parentChain) {
118
+ parentChain.children.push(sessionId);
119
+ }
120
+ }
121
+ totalSpawned++;
122
+ return { sessionId, nickname: `test-${nextId - 1}`, status: session.status, chain: chainInfo, worktree: DEFAULT_WORKTREE, mode: 'print' };
123
+ },
124
+ async prompt(sessionId, prompt, timeoutMs, settleDelayMs) {
125
+ const session = sessions.get(sessionId);
126
+ if (!session)
127
+ throw new Error(`Session not found: ${sessionId}`);
128
+ if (session.status === 'dead')
129
+ throw new Error(`Session ${sessionId} is dead — cannot send prompt`);
130
+ const result = await session.sendPrompt(prompt, timeoutMs, settleDelayMs);
131
+ // Read printMetadata in-place (same tick — no race); fake sessions return null
132
+ const printSession = session;
133
+ const metadata = printSession.printMetadata ?? null;
134
+ return { output: result.output, timedOut: result.timedOut, metadata };
135
+ },
136
+ async promptStream(sessionId, prompt, onEvent, timeoutMs) {
137
+ const result = await pool.prompt(sessionId, prompt, timeoutMs);
138
+ if (result.output) {
139
+ onEvent({ type: 'text', content: result.output });
140
+ }
141
+ onEvent({ type: 'done', output: result.output, metadata: result.metadata, timed_out: result.timedOut });
142
+ },
143
+ status(sessionId) {
144
+ const session = sessions.get(sessionId);
145
+ if (!session)
146
+ throw new Error(`Session not found: ${sessionId}`);
147
+ return {
148
+ sessionId: session.id,
149
+ nickname: session.id,
150
+ purpose: null,
151
+ status: session.status,
152
+ queueDepth: session.queueDepth,
153
+ metadata: sessionMetadata.get(sessionId),
154
+ promptCount: session.promptCount,
155
+ lastActivityAt: session.lastActivityAt,
156
+ workdir: sessionWorkdirs.get(sessionId) ?? '',
157
+ chain: sessionChains.get(sessionId) ?? DEFAULT_CHAIN,
158
+ worktree: DEFAULT_WORKTREE,
159
+ stale: false,
160
+ waiting_for: null,
161
+ mode: 'print',
162
+ diagnostics: null,
163
+ };
164
+ },
165
+ kill(sessionId, _worktreeAction) {
166
+ const session = sessions.get(sessionId);
167
+ if (!session)
168
+ throw new Error(`Session not found: ${sessionId}`);
169
+ session.kill();
170
+ return { sessionId: session.id, killed: true, worktree_cleaned: false };
171
+ },
172
+ list() {
173
+ return [...sessions.entries()].map(([sessionId, session]) => ({
174
+ sessionId: session.id,
175
+ nickname: session.id,
176
+ purpose: null,
177
+ status: session.status,
178
+ queueDepth: session.queueDepth,
179
+ metadata: sessionMetadata.get(sessionId),
180
+ promptCount: session.promptCount,
181
+ lastActivityAt: session.lastActivityAt,
182
+ workdir: sessionWorkdirs.get(sessionId) ?? '',
183
+ chain: sessionChains.get(sessionId) ?? DEFAULT_CHAIN,
184
+ worktree: DEFAULT_WORKTREE,
185
+ stale: false,
186
+ waiting_for: null,
187
+ mode: 'print',
188
+ diagnostics: null,
189
+ }));
190
+ },
191
+ getChannels(sessionId) {
192
+ const channels = sessionChannelsMap.get(sessionId);
193
+ if (!channels) {
194
+ throw new Error(`Session not found: ${sessionId}`);
195
+ }
196
+ return channels;
197
+ },
198
+ getSession(sessionId) {
199
+ const session = sessions.get(sessionId);
200
+ if (!session)
201
+ throw new Error(`Session not found: ${sessionId}`);
202
+ return session;
203
+ },
204
+ poolStats() {
205
+ const allSessions = [...sessions.values()];
206
+ const active = allSessions.filter((s) => s.status !== 'dead').length;
207
+ const dead = allSessions.filter((s) => s.status === 'dead').length;
208
+ return {
209
+ totalSpawned,
210
+ startedAt,
211
+ maxSessions,
212
+ activeSessions: active,
213
+ deadSessions: dead,
214
+ };
215
+ },
216
+ removeDead(ttlMs) {
217
+ let removed = 0;
218
+ for (const [sessionId, session] of sessions.entries()) {
219
+ if (session.status === 'dead') {
220
+ if (Date.now() - session.lastActivityAt.getTime() > ttlMs) {
221
+ sessions.delete(sessionId);
222
+ sessionMetadata.delete(sessionId);
223
+ sessionWorkdirs.delete(sessionId);
224
+ sessionChains.delete(sessionId);
225
+ sessionChannelsMap.delete(sessionId);
226
+ removed++;
227
+ }
228
+ }
229
+ }
230
+ return removed;
231
+ },
232
+ checkStale() {
233
+ return { stale: [], killed: [] };
234
+ },
235
+ childPids() {
236
+ return [];
237
+ },
238
+ setObservationHook() {
239
+ // no-op in test pool
240
+ },
241
+ restoreSession(snapshot) {
242
+ if (sessions.has(snapshot.sessionId))
243
+ return;
244
+ const sid = snapshot.sessionId;
245
+ let status = 'ready';
246
+ let promptCount = snapshot.promptCount;
247
+ let lastActivityAt = new Date();
248
+ const stubSession = {
249
+ id: sid,
250
+ get status() { return status; },
251
+ set status(s) { status = s; },
252
+ queueDepth: 0,
253
+ get promptCount() { return promptCount; },
254
+ set promptCount(n) { promptCount = n; },
255
+ get lastActivityAt() { return lastActivityAt; },
256
+ set lastActivityAt(d) { lastActivityAt = d; },
257
+ get transcript() { return ''; },
258
+ onOutput(_cb) { return () => { }; },
259
+ onExit(_cb) { },
260
+ async sendPrompt(_prompt) {
261
+ promptCount++;
262
+ lastActivityAt = new Date();
263
+ return { output: 'restored response', timedOut: false };
264
+ },
265
+ resize() { },
266
+ kill() { status = 'dead'; },
267
+ interrupt() { return false; },
268
+ adaptiveSettle: null,
269
+ pid: null,
270
+ };
271
+ sessions.set(sid, stubSession);
272
+ sessionWorkdirs.set(sid, snapshot.workdir);
273
+ sessionChains.set(sid, {
274
+ parent_session_id: snapshot.parentSessionId ?? null,
275
+ depth: snapshot.depth,
276
+ children: [],
277
+ budget: { max_depth: 3, max_agents: 10, agents_spawned: 0 },
278
+ });
279
+ sessionChannelsMap.set(sid, createSessionChannels());
280
+ // Note: totalSpawned NOT incremented for restored sessions
281
+ },
282
+ cleanupStaleCognitiveSessions() {
283
+ return { killed: [] };
284
+ },
285
+ };
286
+ return pool;
287
+ }
288
+ describe('SessionPool', () => {
289
+ let pool;
290
+ beforeEach(() => {
291
+ pool = createTestPool(3);
292
+ });
293
+ describe('create()', () => {
294
+ it('accepts and stores metadata on session creation', async () => {
295
+ const meta = { role: 'worker', task: 'build' };
296
+ const result = await pool.create({
297
+ workdir: '/tmp/test',
298
+ metadata: meta,
299
+ });
300
+ assert.ok(result.sessionId);
301
+ assert.equal(result.status, 'ready');
302
+ const status = pool.status(result.sessionId);
303
+ assert.deepEqual(status.metadata, meta);
304
+ });
305
+ it('creates a session without metadata', async () => {
306
+ const result = await pool.create({ workdir: '/tmp/test' });
307
+ assert.ok(result.sessionId);
308
+ const status = pool.status(result.sessionId);
309
+ assert.equal(status.metadata, undefined);
310
+ });
311
+ it('stores workdir with the session', async () => {
312
+ const result = await pool.create({ workdir: '/home/user/project' });
313
+ const status = pool.status(result.sessionId);
314
+ assert.equal(status.workdir, '/home/user/project');
315
+ });
316
+ it('accepts spawnArgs parameter', async () => {
317
+ // spawnArgs are passed to spawnSession — we just verify create() doesn't reject them
318
+ const result = await pool.create({
319
+ workdir: '/tmp/test',
320
+ spawnArgs: ['--model', 'opus'],
321
+ });
322
+ assert.ok(result.sessionId);
323
+ });
324
+ it('increments totalSpawned on each create', async () => {
325
+ assert.equal(pool.poolStats().totalSpawned, 0);
326
+ await pool.create({ workdir: '/tmp/a' });
327
+ assert.equal(pool.poolStats().totalSpawned, 1);
328
+ await pool.create({ workdir: '/tmp/b' });
329
+ assert.equal(pool.poolStats().totalSpawned, 2);
330
+ });
331
+ it('enforces max session limit', async () => {
332
+ await pool.create({ workdir: '/tmp/a' });
333
+ await pool.create({ workdir: '/tmp/b' });
334
+ await pool.create({ workdir: '/tmp/c' });
335
+ await assert.rejects(() => pool.create({ workdir: '/tmp/d' }), /pool full/);
336
+ });
337
+ });
338
+ describe('prompt()', () => {
339
+ it('returns output and timedOut from sendPrompt', async () => {
340
+ const result = await pool.create({ workdir: '/tmp/test' });
341
+ const promptResult = await pool.prompt(result.sessionId, 'hello');
342
+ assert.equal(promptResult.output, 'mock response');
343
+ assert.equal(promptResult.timedOut, false);
344
+ });
345
+ it('returns metadata key in result (null for fake sessions without printMetadata)', async () => {
346
+ const result = await pool.create({ workdir: '/tmp/test' });
347
+ const promptResult = await pool.prompt(result.sessionId, 'hello');
348
+ // metadata key must be present — value is null for sessions that don't expose printMetadata
349
+ assert.ok(Object.prototype.hasOwnProperty.call(promptResult, 'metadata'), 'metadata key must be present');
350
+ assert.equal(promptResult.metadata, null);
351
+ });
352
+ it('throws for unknown session', async () => {
353
+ await assert.rejects(() => pool.prompt('nonexistent-id', 'hello'), /not found/);
354
+ });
355
+ it('throws for dead session', async () => {
356
+ const result = await pool.create({ workdir: '/tmp/test' });
357
+ pool.kill(result.sessionId);
358
+ await assert.rejects(() => pool.prompt(result.sessionId, 'hello'), /dead/);
359
+ });
360
+ });
361
+ describe('status()', () => {
362
+ it('returns metadata, promptCount, lastActivityAt, workdir', async () => {
363
+ const meta = { env: 'test' };
364
+ const result = await pool.create({
365
+ workdir: '/tmp/project',
366
+ metadata: meta,
367
+ });
368
+ const status = pool.status(result.sessionId);
369
+ assert.equal(status.sessionId, result.sessionId);
370
+ assert.equal(status.status, 'ready');
371
+ assert.equal(status.queueDepth, 0);
372
+ assert.deepEqual(status.metadata, meta);
373
+ assert.equal(status.promptCount, 0);
374
+ assert.ok(status.lastActivityAt instanceof Date);
375
+ assert.equal(status.workdir, '/tmp/project');
376
+ });
377
+ it('reflects updated promptCount after sending a prompt', async () => {
378
+ const result = await pool.create({ workdir: '/tmp/test' });
379
+ await pool.prompt(result.sessionId, 'hello');
380
+ const status = pool.status(result.sessionId);
381
+ assert.equal(status.promptCount, 1);
382
+ });
383
+ it('updates lastActivityAt after sending a prompt', async () => {
384
+ const result = await pool.create({ workdir: '/tmp/test' });
385
+ const before = pool.status(result.sessionId).lastActivityAt;
386
+ // Small delay to ensure timestamp differs
387
+ await new Promise((r) => setTimeout(r, 10));
388
+ await pool.prompt(result.sessionId, 'test prompt');
389
+ const after = pool.status(result.sessionId).lastActivityAt;
390
+ assert.ok(after.getTime() >= before.getTime());
391
+ });
392
+ it('throws for unknown session', () => {
393
+ assert.throws(() => pool.status('nonexistent-id'), /not found/);
394
+ });
395
+ });
396
+ describe('list()', () => {
397
+ it('returns metadata, promptCount, lastActivityAt, workdir for each session', async () => {
398
+ await pool.create({ workdir: '/tmp/a', metadata: { role: 'alpha' } });
399
+ await pool.create({ workdir: '/tmp/b', metadata: { role: 'beta' } });
400
+ const sessions = pool.list();
401
+ assert.equal(sessions.length, 2);
402
+ const alpha = sessions.find((s) => s.workdir === '/tmp/a');
403
+ const beta = sessions.find((s) => s.workdir === '/tmp/b');
404
+ assert.ok(alpha);
405
+ assert.ok(beta);
406
+ assert.deepEqual(alpha.metadata, { role: 'alpha' });
407
+ assert.deepEqual(beta.metadata, { role: 'beta' });
408
+ assert.equal(alpha.promptCount, 0);
409
+ assert.equal(beta.promptCount, 0);
410
+ assert.ok(alpha.lastActivityAt instanceof Date);
411
+ assert.ok(beta.lastActivityAt instanceof Date);
412
+ });
413
+ it('includes sessions without metadata', async () => {
414
+ await pool.create({ workdir: '/tmp/no-meta' });
415
+ const sessions = pool.list();
416
+ assert.equal(sessions.length, 1);
417
+ assert.equal(sessions[0].metadata, undefined);
418
+ assert.equal(sessions[0].workdir, '/tmp/no-meta');
419
+ });
420
+ });
421
+ describe('poolStats()', () => {
422
+ it('returns correct stats after creation and kills', async () => {
423
+ const stats0 = pool.poolStats();
424
+ assert.equal(stats0.totalSpawned, 0);
425
+ assert.equal(stats0.maxSessions, 3);
426
+ assert.equal(stats0.activeSessions, 0);
427
+ assert.equal(stats0.deadSessions, 0);
428
+ assert.ok(stats0.startedAt instanceof Date);
429
+ const s1 = await pool.create({ workdir: '/tmp/a' });
430
+ await pool.create({ workdir: '/tmp/b' });
431
+ const stats1 = pool.poolStats();
432
+ assert.equal(stats1.totalSpawned, 2);
433
+ assert.equal(stats1.activeSessions, 2);
434
+ assert.equal(stats1.deadSessions, 0);
435
+ pool.kill(s1.sessionId);
436
+ const stats2 = pool.poolStats();
437
+ assert.equal(stats2.totalSpawned, 2);
438
+ assert.equal(stats2.activeSessions, 1);
439
+ assert.equal(stats2.deadSessions, 1);
440
+ });
441
+ it('startedAt is set at pool creation time', () => {
442
+ const before = new Date();
443
+ const freshPool = createTestPool();
444
+ const stats = freshPool.poolStats();
445
+ const after = new Date();
446
+ assert.ok(stats.startedAt.getTime() >= before.getTime());
447
+ assert.ok(stats.startedAt.getTime() <= after.getTime());
448
+ });
449
+ });
450
+ describe('removeDead()', () => {
451
+ it('removes dead sessions older than TTL', async () => {
452
+ const s1 = await pool.create({ workdir: '/tmp/a' });
453
+ const s2 = await pool.create({ workdir: '/tmp/b' });
454
+ pool.kill(s1.sessionId);
455
+ // Small delay so that the dead session's lastActivityAt is in the past
456
+ await new Promise((r) => setTimeout(r, 15));
457
+ // With TTL of 10ms, the dead session (killed >15ms ago) should be removed
458
+ const removed = pool.removeDead(10);
459
+ assert.equal(removed, 1);
460
+ // The dead session should no longer be found
461
+ assert.throws(() => pool.status(s1.sessionId), /not found/);
462
+ // The alive session should still exist
463
+ const status = pool.status(s2.sessionId);
464
+ assert.equal(status.status, 'ready');
465
+ });
466
+ it('does not remove dead sessions younger than TTL', async () => {
467
+ const s1 = await pool.create({ workdir: '/tmp/a' });
468
+ pool.kill(s1.sessionId);
469
+ // With a very high TTL, nothing should be removed
470
+ const removed = pool.removeDead(999_999_999);
471
+ assert.equal(removed, 0);
472
+ // Session should still exist
473
+ const status = pool.status(s1.sessionId);
474
+ assert.equal(status.status, 'dead');
475
+ });
476
+ it('does not remove alive sessions', async () => {
477
+ await pool.create({ workdir: '/tmp/a' });
478
+ await pool.create({ workdir: '/tmp/b' });
479
+ const removed = pool.removeDead(0);
480
+ assert.equal(removed, 0);
481
+ assert.equal(pool.list().length, 2);
482
+ });
483
+ it('returns 0 when no sessions exist', () => {
484
+ const removed = pool.removeDead(0);
485
+ assert.equal(removed, 0);
486
+ });
487
+ });
488
+ // ── PRD 006: Session Chain Tests ──────────────────────────────
489
+ describe('session chains (PRD 006)', () => {
490
+ it('root session has depth 0 and no parent', async () => {
491
+ const result = await pool.create({ workdir: '/tmp/root' });
492
+ const status = pool.status(result.sessionId);
493
+ assert.equal(status.chain.depth, 0);
494
+ assert.equal(status.chain.parent_session_id, null);
495
+ assert.deepEqual(status.chain.children, []);
496
+ });
497
+ it('child session records parent and depth', async () => {
498
+ const parent = await pool.create({ workdir: '/tmp/parent' });
499
+ const child = await pool.create({
500
+ workdir: '/tmp/child',
501
+ parentSessionId: parent.sessionId,
502
+ depth: 1,
503
+ });
504
+ const childStatus = pool.status(child.sessionId);
505
+ assert.equal(childStatus.chain.parent_session_id, parent.sessionId);
506
+ assert.equal(childStatus.chain.depth, 1);
507
+ const parentStatus = pool.status(parent.sessionId);
508
+ assert.deepEqual(parentStatus.chain.children, [child.sessionId]);
509
+ });
510
+ it('rejects spawn when depth exceeds max_depth', async () => {
511
+ const root = await pool.create({
512
+ workdir: '/tmp/root',
513
+ budget: { max_depth: 2, max_agents: 10 },
514
+ });
515
+ await assert.rejects(() => pool.create({
516
+ workdir: '/tmp/deep',
517
+ parentSessionId: root.sessionId,
518
+ depth: 2,
519
+ }), /DEPTH_EXCEEDED/);
520
+ });
521
+ it('rejects spawn when agent budget is exhausted', async () => {
522
+ const root = await pool.create({
523
+ workdir: '/tmp/root',
524
+ budget: { max_depth: 5, max_agents: 1 },
525
+ });
526
+ // First child — should succeed (agents_spawned goes from 0 to 1)
527
+ await pool.create({
528
+ workdir: '/tmp/child1',
529
+ parentSessionId: root.sessionId,
530
+ depth: 1,
531
+ });
532
+ // Second child — should fail (agents_spawned = 1, max_agents = 1)
533
+ await assert.rejects(() => pool.create({
534
+ workdir: '/tmp/child2',
535
+ parentSessionId: root.sessionId,
536
+ depth: 1,
537
+ }), /BUDGET_EXHAUSTED/);
538
+ });
539
+ it('returns chain info from create()', async () => {
540
+ const result = await pool.create({
541
+ workdir: '/tmp/root',
542
+ budget: { max_depth: 5, max_agents: 20 },
543
+ });
544
+ assert.equal(result.chain.depth, 0);
545
+ assert.equal(result.chain.parent_session_id, null);
546
+ assert.equal(result.chain.budget.max_depth, 5);
547
+ assert.equal(result.chain.budget.max_agents, 20);
548
+ });
549
+ it('list() includes chain info for all sessions', async () => {
550
+ const root = await pool.create({ workdir: '/tmp/root' });
551
+ await pool.create({
552
+ workdir: '/tmp/child',
553
+ parentSessionId: root.sessionId,
554
+ depth: 1,
555
+ });
556
+ const sessions = pool.list();
557
+ assert.equal(sessions.length, 2);
558
+ const rootSession = sessions.find(s => s.chain.depth === 0);
559
+ const childSession = sessions.find(s => s.chain.depth === 1);
560
+ assert.ok(rootSession);
561
+ assert.ok(childSession);
562
+ assert.equal(childSession.chain.parent_session_id, rootSession.sessionId);
563
+ });
564
+ });
565
+ // ── PRD 029: restoreSession Tests ──────────────────────────────
566
+ describe('restoreSession (PRD 029)', () => {
567
+ const baseSnapshot = {
568
+ sessionId: 'restored-abc-123',
569
+ nickname: 'restored-alpha',
570
+ purpose: 'test recovery',
571
+ workdir: '/tmp/restored',
572
+ mode: 'print',
573
+ depth: 0,
574
+ parentSessionId: null,
575
+ isolation: 'shared',
576
+ metadata: { origin: 'test' },
577
+ promptCount: 5,
578
+ };
579
+ it('restoreSession populates pool.list()', () => {
580
+ pool.restoreSession(baseSnapshot);
581
+ const sessions = pool.list();
582
+ assert.equal(sessions.length, 1);
583
+ assert.equal(sessions[0].sessionId, 'restored-abc-123');
584
+ assert.equal(sessions[0].workdir, '/tmp/restored');
585
+ assert.equal(sessions[0].promptCount, 5);
586
+ });
587
+ it('restoreSession does not spawn a process (pid is null, totalSpawned unchanged)', () => {
588
+ const beforeStats = pool.poolStats();
589
+ assert.equal(beforeStats.totalSpawned, 0);
590
+ pool.restoreSession(baseSnapshot);
591
+ const afterStats = pool.poolStats();
592
+ assert.equal(afterStats.totalSpawned, 0, 'totalSpawned should not increment for restored sessions');
593
+ assert.equal(afterStats.activeSessions, 1, 'restored session should be active');
594
+ const session = pool.getSession('restored-abc-123');
595
+ assert.equal(session.pid, null, 'restored session should have null pid');
596
+ });
597
+ it('duplicate restore (same ID) is silently ignored', () => {
598
+ pool.restoreSession(baseSnapshot);
599
+ pool.restoreSession(baseSnapshot); // second restore — same ID
600
+ const sessions = pool.list();
601
+ assert.equal(sessions.length, 1, 'duplicate restore should not create a second entry');
602
+ });
603
+ it('restored session does not count against spawn limits', async () => {
604
+ // Pool has maxSessions = 3
605
+ pool.restoreSession(baseSnapshot);
606
+ pool.restoreSession({ ...baseSnapshot, sessionId: 'restored-2', nickname: 'restored-bravo' });
607
+ pool.restoreSession({ ...baseSnapshot, sessionId: 'restored-3', nickname: 'restored-cedar' });
608
+ // 3 restored sessions in a pool of max 3 — but create() should still work
609
+ // because restored sessions are already tracked (not "newly spawned")
610
+ // The pool checks active non-dead sessions, and restored sessions ARE active.
611
+ // So this SHOULD reject — the pool is full of active sessions.
612
+ const sessions = pool.list();
613
+ assert.equal(sessions.length, 3);
614
+ // Verify pool considers them active
615
+ const stats = pool.poolStats();
616
+ assert.equal(stats.activeSessions, 3);
617
+ });
618
+ it('restored session status() returns chain info', () => {
619
+ pool.restoreSession({ ...baseSnapshot, depth: 2, parentSessionId: 'parent-xyz' });
620
+ const status = pool.status('restored-abc-123');
621
+ assert.equal(status.chain.depth, 2);
622
+ assert.equal(status.chain.parent_session_id, 'parent-xyz');
623
+ });
624
+ it('restored session can be killed', () => {
625
+ pool.restoreSession(baseSnapshot);
626
+ const result = pool.kill('restored-abc-123');
627
+ assert.equal(result.killed, true);
628
+ const status = pool.status('restored-abc-123');
629
+ assert.equal(status.status, 'dead');
630
+ });
631
+ });
632
+ });
633
+ //# sourceMappingURL=pool.test.js.map