@namzu/sdk 49.0.0 → 50.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (737) hide show
  1. package/CHANGELOG.md +507 -0
  2. package/README.md +137 -125
  3. package/dist/agents/QueryAgent.d.ts.map +1 -1
  4. package/dist/agents/QueryAgent.js +1 -0
  5. package/dist/agents/QueryAgent.js.map +1 -1
  6. package/dist/agents/examples/SupervisorAgent.d.ts.map +1 -1
  7. package/dist/agents/examples/SupervisorAgent.js +1 -0
  8. package/dist/agents/examples/SupervisorAgent.js.map +1 -1
  9. package/dist/agents/runAgent.d.ts +2 -0
  10. package/dist/agents/runAgent.d.ts.map +1 -1
  11. package/dist/agents/runAgent.js +1 -0
  12. package/dist/agents/runAgent.js.map +1 -1
  13. package/dist/authorization/shell-lexer.d.ts.map +1 -1
  14. package/dist/authorization/shell-lexer.js +16 -1
  15. package/dist/authorization/shell-lexer.js.map +1 -1
  16. package/dist/bridge/acp/permission.d.ts +8 -2
  17. package/dist/bridge/acp/permission.d.ts.map +1 -1
  18. package/dist/bridge/acp/permission.js +1 -0
  19. package/dist/bridge/acp/permission.js.map +1 -1
  20. package/dist/bridge/acp/server.d.ts +25 -1
  21. package/dist/bridge/acp/server.d.ts.map +1 -1
  22. package/dist/bridge/acp/server.js +205 -21
  23. package/dist/bridge/acp/server.js.map +1 -1
  24. package/dist/bridge/acp/tasks.d.ts +5 -0
  25. package/dist/bridge/acp/tasks.d.ts.map +1 -0
  26. package/dist/bridge/acp/tasks.js +19 -0
  27. package/dist/bridge/acp/tasks.js.map +1 -0
  28. package/dist/bridge/acp/update.d.ts.map +1 -1
  29. package/dist/bridge/acp/update.js +148 -13
  30. package/dist/bridge/acp/update.js.map +1 -1
  31. package/dist/config/runtime.d.ts +31 -31
  32. package/dist/connector/mcp/adapter.d.ts.map +1 -1
  33. package/dist/connector/mcp/adapter.js +11 -4
  34. package/dist/connector/mcp/adapter.js.map +1 -1
  35. package/dist/connector/mcp/client.d.ts.map +1 -1
  36. package/dist/connector/mcp/client.js +6 -3
  37. package/dist/connector/mcp/client.js.map +1 -1
  38. package/dist/constants/acp/index.d.ts +3 -0
  39. package/dist/constants/acp/index.d.ts.map +1 -1
  40. package/dist/constants/acp/index.js +3 -0
  41. package/dist/constants/acp/index.js.map +1 -1
  42. package/dist/contracts/a2a.d.ts +80 -80
  43. package/dist/contracts/schemas.d.ts +2 -2
  44. package/dist/contracts/session/schemas.d.ts +10 -10
  45. package/dist/manager/agent/lifecycle.d.ts +11 -0
  46. package/dist/manager/agent/lifecycle.d.ts.map +1 -1
  47. package/dist/manager/agent/lifecycle.js +178 -3
  48. package/dist/manager/agent/lifecycle.js.map +1 -1
  49. package/dist/manager/plan/lifecycle.d.ts +7 -8
  50. package/dist/manager/plan/lifecycle.d.ts.map +1 -1
  51. package/dist/manager/plan/lifecycle.js +7 -8
  52. package/dist/manager/plan/lifecycle.js.map +1 -1
  53. package/dist/manager/resident/consumption.d.ts +8 -8
  54. package/dist/manager/resident/learning-cycle.d.ts +2 -2
  55. package/dist/manager/resident/learning-observation.d.ts +12 -12
  56. package/dist/manager/resident/learning.d.ts +82 -82
  57. package/dist/manager/resident/outbox.d.ts +8 -8
  58. package/dist/manager/resident/proposal.d.ts +2 -2
  59. package/dist/manager/resident/store.d.ts +10 -10
  60. package/dist/manager/session/attribution.d.ts +1 -0
  61. package/dist/manager/session/attribution.d.ts.map +1 -1
  62. package/dist/manager/session/attribution.js +9 -1
  63. package/dist/manager/session/attribution.js.map +1 -1
  64. package/dist/manager/session/streamed-message-identity.d.ts +6 -0
  65. package/dist/manager/session/streamed-message-identity.d.ts.map +1 -0
  66. package/dist/manager/session/streamed-message-identity.js +14 -0
  67. package/dist/manager/session/streamed-message-identity.js.map +1 -0
  68. package/dist/manager/session/turn-recorder.d.ts.map +1 -1
  69. package/dist/manager/session/turn-recorder.js +4 -3
  70. package/dist/manager/session/turn-recorder.js.map +1 -1
  71. package/dist/pals/activity/causality.d.ts +23 -0
  72. package/dist/pals/activity/causality.d.ts.map +1 -0
  73. package/dist/pals/activity/causality.js +205 -0
  74. package/dist/pals/activity/causality.js.map +1 -0
  75. package/dist/pals/activity/projection.d.ts +5 -0
  76. package/dist/pals/activity/projection.d.ts.map +1 -0
  77. package/dist/pals/activity/projection.js +79 -0
  78. package/dist/pals/activity/projection.js.map +1 -0
  79. package/dist/pals/activity/source.d.ts +16 -0
  80. package/dist/pals/activity/source.d.ts.map +1 -0
  81. package/dist/pals/activity/source.js +235 -0
  82. package/dist/pals/activity/source.js.map +1 -0
  83. package/dist/pals/activity/subscription-policy.d.ts +38 -0
  84. package/dist/pals/activity/subscription-policy.d.ts.map +1 -0
  85. package/dist/pals/activity/subscription-policy.js +183 -0
  86. package/dist/pals/activity/subscription-policy.js.map +1 -0
  87. package/dist/pals/activity/subscription-schema.d.ts +353 -0
  88. package/dist/pals/activity/subscription-schema.d.ts.map +1 -0
  89. package/dist/pals/activity/subscription-schema.js +24 -0
  90. package/dist/pals/activity/subscription-schema.js.map +1 -0
  91. package/dist/pals/activity/subscription-store.d.ts +25 -0
  92. package/dist/pals/activity/subscription-store.d.ts.map +1 -0
  93. package/dist/pals/activity/subscription-store.js +152 -0
  94. package/dist/pals/activity/subscription-store.js.map +1 -0
  95. package/dist/pals/activity/subscription-types.d.ts +42 -0
  96. package/dist/pals/activity/subscription-types.d.ts.map +1 -0
  97. package/dist/pals/activity/subscription-types.js +2 -0
  98. package/dist/pals/activity/subscription-types.js.map +1 -0
  99. package/dist/pals/activity/subscriptions.d.ts +32 -0
  100. package/dist/pals/activity/subscriptions.d.ts.map +1 -0
  101. package/dist/pals/activity/subscriptions.js +151 -0
  102. package/dist/pals/activity/subscriptions.js.map +1 -0
  103. package/dist/pals/activity/types.d.ts +77 -0
  104. package/dist/pals/activity/types.d.ts.map +1 -0
  105. package/dist/pals/activity/types.js +2 -0
  106. package/dist/pals/activity/types.js.map +1 -0
  107. package/dist/pals/channels/ingress.d.ts +9 -0
  108. package/dist/pals/channels/ingress.d.ts.map +1 -0
  109. package/dist/pals/channels/ingress.js +131 -0
  110. package/dist/pals/channels/ingress.js.map +1 -0
  111. package/dist/pals/channels/routes.d.ts +20 -0
  112. package/dist/pals/channels/routes.d.ts.map +1 -0
  113. package/dist/pals/channels/routes.js +111 -0
  114. package/dist/pals/channels/routes.js.map +1 -0
  115. package/dist/pals/channels/routing.d.ts +37 -0
  116. package/dist/pals/channels/routing.d.ts.map +1 -0
  117. package/dist/pals/channels/routing.js +150 -0
  118. package/dist/pals/channels/routing.js.map +1 -0
  119. package/dist/pals/channels/schema.d.ts +234 -0
  120. package/dist/pals/channels/schema.d.ts.map +1 -0
  121. package/dist/pals/channels/schema.js +94 -0
  122. package/dist/pals/channels/schema.js.map +1 -0
  123. package/dist/pals/channels/types.d.ts +115 -0
  124. package/dist/pals/channels/types.d.ts.map +1 -0
  125. package/dist/pals/channels/types.js +2 -0
  126. package/dist/pals/channels/types.js.map +1 -0
  127. package/dist/pals/communication/broker.d.ts +8 -0
  128. package/dist/pals/communication/broker.d.ts.map +1 -0
  129. package/dist/pals/communication/broker.js +121 -0
  130. package/dist/pals/communication/broker.js.map +1 -0
  131. package/dist/pals/communication/dispatch.d.ts +4 -0
  132. package/dist/pals/communication/dispatch.d.ts.map +1 -0
  133. package/dist/pals/communication/dispatch.js +57 -0
  134. package/dist/pals/communication/dispatch.js.map +1 -0
  135. package/dist/pals/communication/inbound.d.ts +9 -0
  136. package/dist/pals/communication/inbound.d.ts.map +1 -0
  137. package/dist/pals/communication/inbound.js +155 -0
  138. package/dist/pals/communication/inbound.js.map +1 -0
  139. package/dist/pals/communication/ingress-dispatch.d.ts +5 -0
  140. package/dist/pals/communication/ingress-dispatch.d.ts.map +1 -0
  141. package/dist/pals/communication/ingress-dispatch.js +51 -0
  142. package/dist/pals/communication/ingress-dispatch.js.map +1 -0
  143. package/dist/pals/communication/ingress-inbound.d.ts +9 -0
  144. package/dist/pals/communication/ingress-inbound.d.ts.map +1 -0
  145. package/dist/pals/communication/ingress-inbound.js +222 -0
  146. package/dist/pals/communication/ingress-inbound.js.map +1 -0
  147. package/dist/pals/communication/ingress-schema.d.ts +7829 -0
  148. package/dist/pals/communication/ingress-schema.d.ts.map +1 -0
  149. package/dist/pals/communication/ingress-schema.js +479 -0
  150. package/dist/pals/communication/ingress-schema.js.map +1 -0
  151. package/dist/pals/communication/ingress-types.d.ts +187 -0
  152. package/dist/pals/communication/ingress-types.d.ts.map +1 -0
  153. package/dist/pals/communication/ingress-types.js +73 -0
  154. package/dist/pals/communication/ingress-types.js.map +1 -0
  155. package/dist/pals/communication/operator.d.ts +75 -0
  156. package/dist/pals/communication/operator.d.ts.map +1 -0
  157. package/dist/pals/communication/operator.js +217 -0
  158. package/dist/pals/communication/operator.js.map +1 -0
  159. package/dist/pals/communication/policy.d.ts +41 -0
  160. package/dist/pals/communication/policy.d.ts.map +1 -0
  161. package/dist/pals/communication/policy.js +138 -0
  162. package/dist/pals/communication/policy.js.map +1 -0
  163. package/dist/pals/communication/schema.d.ts +2000 -0
  164. package/dist/pals/communication/schema.d.ts.map +1 -0
  165. package/dist/pals/communication/schema.js +170 -0
  166. package/dist/pals/communication/schema.js.map +1 -0
  167. package/dist/pals/communication/store.d.ts +61 -0
  168. package/dist/pals/communication/store.d.ts.map +1 -0
  169. package/dist/pals/communication/store.js +450 -0
  170. package/dist/pals/communication/store.js.map +1 -0
  171. package/dist/pals/communication/tools.d.ts +23 -0
  172. package/dist/pals/communication/tools.d.ts.map +1 -0
  173. package/dist/pals/communication/tools.js +107 -0
  174. package/dist/pals/communication/tools.js.map +1 -0
  175. package/dist/pals/communication/types.d.ts +168 -0
  176. package/dist/pals/communication/types.d.ts.map +1 -0
  177. package/dist/pals/communication/types.js +24 -0
  178. package/dist/pals/communication/types.js.map +1 -0
  179. package/dist/pals/communication/verify.d.ts +22 -0
  180. package/dist/pals/communication/verify.d.ts.map +1 -0
  181. package/dist/pals/communication/verify.js +142 -0
  182. package/dist/pals/communication/verify.js.map +1 -0
  183. package/dist/pals/lifecycle.d.ts +37 -0
  184. package/dist/pals/lifecycle.d.ts.map +1 -0
  185. package/dist/pals/lifecycle.js +22 -0
  186. package/dist/pals/lifecycle.js.map +1 -0
  187. package/dist/pals/prompt.d.ts +30 -0
  188. package/dist/pals/prompt.d.ts.map +1 -0
  189. package/dist/pals/prompt.js +65 -0
  190. package/dist/pals/prompt.js.map +1 -0
  191. package/dist/pals/reference-images.d.ts +44 -0
  192. package/dist/pals/reference-images.d.ts.map +1 -0
  193. package/dist/pals/reference-images.js +248 -0
  194. package/dist/pals/reference-images.js.map +1 -0
  195. package/dist/pals/runtime.d.ts +46 -0
  196. package/dist/pals/runtime.d.ts.map +1 -0
  197. package/dist/pals/runtime.js +624 -0
  198. package/dist/pals/runtime.js.map +1 -0
  199. package/dist/pals/store.d.ts +26 -0
  200. package/dist/pals/store.d.ts.map +1 -0
  201. package/dist/pals/store.js +334 -0
  202. package/dist/pals/store.js.map +1 -0
  203. package/dist/pals/types.d.ts +145 -0
  204. package/dist/pals/types.d.ts.map +1 -0
  205. package/dist/pals/types.js +2 -0
  206. package/dist/pals/types.js.map +1 -0
  207. package/dist/peers/envelope.js +1 -1
  208. package/dist/peers/envelope.js.map +1 -1
  209. package/dist/peers/protocol.d.ts +83 -83
  210. package/dist/peers/record.d.ts +10 -10
  211. package/dist/plugin/shell-hook.d.ts.map +1 -1
  212. package/dist/plugin/shell-hook.js +7 -2
  213. package/dist/plugin/shell-hook.js.map +1 -1
  214. package/dist/process/kill-tree.d.ts.map +1 -1
  215. package/dist/process/kill-tree.js +9 -1
  216. package/dist/process/kill-tree.js.map +1 -1
  217. package/dist/provider/errors.d.ts +19 -0
  218. package/dist/provider/errors.d.ts.map +1 -1
  219. package/dist/provider/errors.js +123 -2
  220. package/dist/provider/errors.js.map +1 -1
  221. package/dist/public-runtime.d.ts +41 -13
  222. package/dist/public-runtime.d.ts.map +1 -1
  223. package/dist/public-runtime.js +35 -7
  224. package/dist/public-runtime.js.map +1 -1
  225. package/dist/public-tools.d.ts +8 -3
  226. package/dist/public-tools.d.ts.map +1 -1
  227. package/dist/public-tools.js +8 -3
  228. package/dist/public-tools.js.map +1 -1
  229. package/dist/public-types.d.ts +27 -7
  230. package/dist/public-types.d.ts.map +1 -1
  231. package/dist/registry/tool/presentation.d.ts +1 -0
  232. package/dist/registry/tool/presentation.d.ts.map +1 -1
  233. package/dist/registry/tool/presentation.js +9 -7
  234. package/dist/registry/tool/presentation.js.map +1 -1
  235. package/dist/runtime/harness-session/index.d.ts +5 -0
  236. package/dist/runtime/harness-session/index.d.ts.map +1 -0
  237. package/dist/runtime/harness-session/index.js +928 -0
  238. package/dist/runtime/harness-session/index.js.map +1 -0
  239. package/dist/runtime/harness-session/journal.d.ts +37 -0
  240. package/dist/runtime/harness-session/journal.d.ts.map +1 -0
  241. package/dist/runtime/harness-session/journal.js +177 -0
  242. package/dist/runtime/harness-session/journal.js.map +1 -0
  243. package/dist/runtime/harness-session/saved-view.d.ts +8 -0
  244. package/dist/runtime/harness-session/saved-view.d.ts.map +1 -0
  245. package/dist/runtime/harness-session/saved-view.js +112 -0
  246. package/dist/runtime/harness-session/saved-view.js.map +1 -0
  247. package/dist/runtime/jobs/awaited-jobs.d.ts +2 -1
  248. package/dist/runtime/jobs/awaited-jobs.d.ts.map +1 -1
  249. package/dist/runtime/jobs/awaited-jobs.js +2 -1
  250. package/dist/runtime/jobs/awaited-jobs.js.map +1 -1
  251. package/dist/runtime/jobs/registry.d.ts +56 -1
  252. package/dist/runtime/jobs/registry.d.ts.map +1 -1
  253. package/dist/runtime/jobs/registry.js +351 -34
  254. package/dist/runtime/jobs/registry.js.map +1 -1
  255. package/dist/runtime/query/abandon-turn.d.ts +12 -1
  256. package/dist/runtime/query/abandon-turn.d.ts.map +1 -1
  257. package/dist/runtime/query/abandon-turn.js +3 -1
  258. package/dist/runtime/query/abandon-turn.js.map +1 -1
  259. package/dist/runtime/query/checkpoint.d.ts +4 -0
  260. package/dist/runtime/query/checkpoint.d.ts.map +1 -1
  261. package/dist/runtime/query/checkpoint.js +10 -0
  262. package/dist/runtime/query/checkpoint.js.map +1 -1
  263. package/dist/runtime/query/durable-inbound.d.ts +5 -0
  264. package/dist/runtime/query/durable-inbound.d.ts.map +1 -0
  265. package/dist/runtime/query/durable-inbound.js +89 -0
  266. package/dist/runtime/query/durable-inbound.js.map +1 -0
  267. package/dist/runtime/query/events.d.ts +4 -0
  268. package/dist/runtime/query/events.d.ts.map +1 -1
  269. package/dist/runtime/query/events.js +22 -5
  270. package/dist/runtime/query/events.js.map +1 -1
  271. package/dist/runtime/query/executor/tool-call-admission.d.ts +5 -1
  272. package/dist/runtime/query/executor/tool-call-admission.d.ts.map +1 -1
  273. package/dist/runtime/query/executor/tool-call-admission.js +85 -13
  274. package/dist/runtime/query/executor/tool-call-admission.js.map +1 -1
  275. package/dist/runtime/query/executor.d.ts +41 -18
  276. package/dist/runtime/query/executor.d.ts.map +1 -1
  277. package/dist/runtime/query/executor.js +227 -114
  278. package/dist/runtime/query/executor.js.map +1 -1
  279. package/dist/runtime/query/index.d.ts +3 -0
  280. package/dist/runtime/query/index.d.ts.map +1 -1
  281. package/dist/runtime/query/index.js +21 -4
  282. package/dist/runtime/query/index.js.map +1 -1
  283. package/dist/runtime/query/iteration/index.d.ts +18 -6
  284. package/dist/runtime/query/iteration/index.d.ts.map +1 -1
  285. package/dist/runtime/query/iteration/index.js +144 -67
  286. package/dist/runtime/query/iteration/index.js.map +1 -1
  287. package/dist/runtime/query/iteration/outstanding-work.d.ts +9 -5
  288. package/dist/runtime/query/iteration/outstanding-work.d.ts.map +1 -1
  289. package/dist/runtime/query/iteration/outstanding-work.js +61 -6
  290. package/dist/runtime/query/iteration/outstanding-work.js.map +1 -1
  291. package/dist/runtime/query/iteration/phases/context.d.ts +4 -0
  292. package/dist/runtime/query/iteration/phases/context.d.ts.map +1 -1
  293. package/dist/runtime/query/iteration/phases/context.js.map +1 -1
  294. package/dist/runtime/query/iteration/phases/tool-review.d.ts.map +1 -1
  295. package/dist/runtime/query/iteration/phases/tool-review.js +99 -16
  296. package/dist/runtime/query/iteration/phases/tool-review.js.map +1 -1
  297. package/dist/runtime/query/observation-context.d.ts +2 -2
  298. package/dist/runtime/query/observation-context.d.ts.map +1 -1
  299. package/dist/runtime/query/observation-context.js +20 -13
  300. package/dist/runtime/query/observation-context.js.map +1 -1
  301. package/dist/runtime/query/prepare-turn.js +2 -2
  302. package/dist/runtime/query/prepare-turn.js.map +1 -1
  303. package/dist/runtime/query/prompt-cache.d.ts +1 -0
  304. package/dist/runtime/query/prompt-cache.d.ts.map +1 -1
  305. package/dist/runtime/query/prompt-cache.js +2 -0
  306. package/dist/runtime/query/prompt-cache.js.map +1 -1
  307. package/dist/runtime/query/prompt.d.ts +2 -0
  308. package/dist/runtime/query/prompt.d.ts.map +1 -1
  309. package/dist/runtime/query/prompt.js +23 -1
  310. package/dist/runtime/query/prompt.js.map +1 -1
  311. package/dist/runtime/query/repeat-call.d.ts +12 -3
  312. package/dist/runtime/query/repeat-call.d.ts.map +1 -1
  313. package/dist/runtime/query/repeat-call.js +33 -10
  314. package/dist/runtime/query/repeat-call.js.map +1 -1
  315. package/dist/runtime/query/resume-pending.d.ts +5 -6
  316. package/dist/runtime/query/resume-pending.d.ts.map +1 -1
  317. package/dist/runtime/query/resume-pending.js +30 -3
  318. package/dist/runtime/query/resume-pending.js.map +1 -1
  319. package/dist/runtime/query/resume-session.js +1 -1
  320. package/dist/runtime/query/resume-session.js.map +1 -1
  321. package/dist/runtime/query/review-policy.d.ts +8 -1
  322. package/dist/runtime/query/review-policy.d.ts.map +1 -1
  323. package/dist/runtime/query/review-policy.js +6 -0
  324. package/dist/runtime/query/review-policy.js.map +1 -1
  325. package/dist/runtime/query/saved-presentation.d.ts +13 -0
  326. package/dist/runtime/query/saved-presentation.d.ts.map +1 -0
  327. package/dist/runtime/query/saved-presentation.js +63 -0
  328. package/dist/runtime/query/saved-presentation.js.map +1 -0
  329. package/dist/runtime/query/steering.d.ts +6 -9
  330. package/dist/runtime/query/steering.d.ts.map +1 -1
  331. package/dist/runtime/query/steering.js.map +1 -1
  332. package/dist/runtime/query/tool-executions.d.ts +7 -3
  333. package/dist/runtime/query/tool-executions.d.ts.map +1 -1
  334. package/dist/runtime/query/tool-executions.js +89 -9
  335. package/dist/runtime/query/tool-executions.js.map +1 -1
  336. package/dist/runtime/query/tooling.d.ts +3 -1
  337. package/dist/runtime/query/tooling.d.ts.map +1 -1
  338. package/dist/runtime/query/tooling.js +3 -0
  339. package/dist/runtime/query/tooling.js.map +1 -1
  340. package/dist/scheduler/completion-inbox.d.ts +25 -1
  341. package/dist/scheduler/completion-inbox.d.ts.map +1 -1
  342. package/dist/scheduler/completion-inbox.js +102 -8
  343. package/dist/scheduler/completion-inbox.js.map +1 -1
  344. package/dist/scheduler/delegating.d.ts.map +1 -1
  345. package/dist/scheduler/delegating.js +5 -0
  346. package/dist/scheduler/delegating.js.map +1 -1
  347. package/dist/scheduler/local.d.ts.map +1 -1
  348. package/dist/scheduler/local.js +2 -0
  349. package/dist/scheduler/local.js.map +1 -1
  350. package/dist/session/summary/materialize.d.ts +10 -6
  351. package/dist/session/summary/materialize.d.ts.map +1 -1
  352. package/dist/session/summary/materialize.js +41 -8
  353. package/dist/session/summary/materialize.js.map +1 -1
  354. package/dist/store/budget/ledger.d.ts +9 -0
  355. package/dist/store/budget/ledger.d.ts.map +1 -1
  356. package/dist/store/budget/ledger.js +58 -6
  357. package/dist/store/budget/ledger.js.map +1 -1
  358. package/dist/store/evidence/index-page.d.ts +12 -12
  359. package/dist/store/evidence/source-text.d.ts +4 -4
  360. package/dist/store/session/disk.d.ts +9 -4
  361. package/dist/store/session/disk.d.ts.map +1 -1
  362. package/dist/store/session/disk.js +57 -11
  363. package/dist/store/session/disk.js.map +1 -1
  364. package/dist/store/session/memory.d.ts +5 -3
  365. package/dist/store/session/memory.d.ts.map +1 -1
  366. package/dist/store/session/memory.js +24 -7
  367. package/dist/store/session/memory.js.map +1 -1
  368. package/dist/store/session-log/core.d.ts +26 -6
  369. package/dist/store/session-log/core.d.ts.map +1 -1
  370. package/dist/store/session-log/core.js +61 -8
  371. package/dist/store/session-log/core.js.map +1 -1
  372. package/dist/store/session-log/disk.d.ts +2 -2
  373. package/dist/store/session-log/disk.d.ts.map +1 -1
  374. package/dist/store/session-log/disk.js +1 -0
  375. package/dist/store/session-log/disk.js.map +1 -1
  376. package/dist/store/session-log/fold.d.ts +7 -0
  377. package/dist/store/session-log/fold.d.ts.map +1 -1
  378. package/dist/store/session-log/fold.js +21 -0
  379. package/dist/store/session-log/fold.js.map +1 -1
  380. package/dist/store/session-log/index.d.ts +5 -3
  381. package/dist/store/session-log/index.d.ts.map +1 -1
  382. package/dist/store/session-log/index.js +3 -1
  383. package/dist/store/session-log/index.js.map +1 -1
  384. package/dist/store/session-log/memory.d.ts +1 -1
  385. package/dist/store/session-log/memory.d.ts.map +1 -1
  386. package/dist/store/session-log/memory.js +1 -0
  387. package/dist/store/session-log/memory.js.map +1 -1
  388. package/dist/store/session-log/spill.d.ts +10 -3
  389. package/dist/store/session-log/spill.d.ts.map +1 -1
  390. package/dist/store/session-log/spill.js +70 -5
  391. package/dist/store/session-log/spill.js.map +1 -1
  392. package/dist/store/session-log/structured-result.d.ts +21 -0
  393. package/dist/store/session-log/structured-result.d.ts.map +1 -0
  394. package/dist/store/session-log/structured-result.js +67 -0
  395. package/dist/store/session-log/structured-result.js.map +1 -0
  396. package/dist/store/task/disk.d.ts +11 -0
  397. package/dist/store/task/disk.d.ts.map +1 -1
  398. package/dist/store/task/disk.js +41 -2
  399. package/dist/store/task/disk.js.map +1 -1
  400. package/dist/store/task/memory.d.ts.map +1 -1
  401. package/dist/store/task/memory.js +15 -3
  402. package/dist/store/task/memory.js.map +1 -1
  403. package/dist/tools/admit-facts.d.ts +13 -0
  404. package/dist/tools/admit-facts.d.ts.map +1 -0
  405. package/dist/tools/admit-facts.js +142 -0
  406. package/dist/tools/admit-facts.js.map +1 -0
  407. package/dist/tools/builtins/bash.d.ts +4 -1
  408. package/dist/tools/builtins/bash.d.ts.map +1 -1
  409. package/dist/tools/builtins/bash.js +108 -22
  410. package/dist/tools/builtins/bash.js.map +1 -1
  411. package/dist/tools/builtins/browser.d.ts +10 -10
  412. package/dist/tools/builtins/computer-use.d.ts +90 -90
  413. package/dist/tools/builtins/edit.d.ts +17 -0
  414. package/dist/tools/builtins/edit.d.ts.map +1 -1
  415. package/dist/tools/builtins/edit.js +34 -0
  416. package/dist/tools/builtins/edit.js.map +1 -1
  417. package/dist/tools/builtins/file-write-result.d.ts.map +1 -1
  418. package/dist/tools/builtins/file-write-result.js +13 -0
  419. package/dist/tools/builtins/file-write-result.js.map +1 -1
  420. package/dist/tools/builtins/glob.d.ts.map +1 -1
  421. package/dist/tools/builtins/glob.js +12 -0
  422. package/dist/tools/builtins/glob.js.map +1 -1
  423. package/dist/tools/builtins/grep.d.ts.map +1 -1
  424. package/dist/tools/builtins/grep.js +14 -0
  425. package/dist/tools/builtins/grep.js.map +1 -1
  426. package/dist/tools/builtins/index.d.ts +2 -0
  427. package/dist/tools/builtins/index.d.ts.map +1 -1
  428. package/dist/tools/builtins/index.js +1 -0
  429. package/dist/tools/builtins/index.js.map +1 -1
  430. package/dist/tools/builtins/job.d.ts.map +1 -1
  431. package/dist/tools/builtins/job.js +4 -1
  432. package/dist/tools/builtins/job.js.map +1 -1
  433. package/dist/tools/builtins/lsp.d.ts +2 -2
  434. package/dist/tools/builtins/read-file.d.ts.map +1 -1
  435. package/dist/tools/builtins/read-file.js +49 -0
  436. package/dist/tools/builtins/read-file.js.map +1 -1
  437. package/dist/tools/builtins/view-image.d.ts +24 -0
  438. package/dist/tools/builtins/view-image.d.ts.map +1 -0
  439. package/dist/tools/builtins/view-image.js +385 -0
  440. package/dist/tools/builtins/view-image.js.map +1 -0
  441. package/dist/tools/builtins/wait-for-job-bounds.d.ts +2 -0
  442. package/dist/tools/builtins/wait-for-job-bounds.d.ts.map +1 -1
  443. package/dist/tools/builtins/wait-for-job-bounds.js +1 -0
  444. package/dist/tools/builtins/wait-for-job-bounds.js.map +1 -1
  445. package/dist/tools/builtins/wait-for-job.d.ts +2 -0
  446. package/dist/tools/builtins/wait-for-job.d.ts.map +1 -1
  447. package/dist/tools/builtins/wait-for-job.js +104 -6
  448. package/dist/tools/builtins/wait-for-job.js.map +1 -1
  449. package/dist/tools/builtins/write-file.d.ts.map +1 -1
  450. package/dist/tools/builtins/write-file.js +1 -0
  451. package/dist/tools/builtins/write-file.js.map +1 -1
  452. package/dist/tools/command-shell.d.ts +37 -2
  453. package/dist/tools/command-shell.d.ts.map +1 -1
  454. package/dist/tools/command-shell.js +100 -3
  455. package/dist/tools/command-shell.js.map +1 -1
  456. package/dist/tools/coordinator/agent.d.ts +9 -19
  457. package/dist/tools/coordinator/agent.d.ts.map +1 -1
  458. package/dist/tools/coordinator/agent.js.map +1 -1
  459. package/dist/tools/coordinator/index.d.ts.map +1 -1
  460. package/dist/tools/coordinator/index.js +127 -67
  461. package/dist/tools/coordinator/index.js.map +1 -1
  462. package/dist/tools/coordinator/wait-with-idle-bound.d.ts +2 -0
  463. package/dist/tools/coordinator/wait-with-idle-bound.d.ts.map +1 -1
  464. package/dist/tools/coordinator/wait-with-idle-bound.js +1 -1
  465. package/dist/tools/coordinator/wait-with-idle-bound.js.map +1 -1
  466. package/dist/tools/defineTool.d.ts.map +1 -1
  467. package/dist/tools/defineTool.js +4 -0
  468. package/dist/tools/defineTool.js.map +1 -1
  469. package/dist/tools/failure-facts.d.ts +8 -0
  470. package/dist/tools/failure-facts.d.ts.map +1 -0
  471. package/dist/tools/failure-facts.js +24 -0
  472. package/dist/tools/failure-facts.js.map +1 -0
  473. package/dist/tools/host-output.d.ts +24 -0
  474. package/dist/tools/host-output.d.ts.map +1 -0
  475. package/dist/tools/host-output.js +117 -0
  476. package/dist/tools/host-output.js.map +1 -0
  477. package/dist/tools/oem-code-pages.d.ts +8 -0
  478. package/dist/tools/oem-code-pages.d.ts.map +1 -0
  479. package/dist/tools/oem-code-pages.js +23 -0
  480. package/dist/tools/oem-code-pages.js.map +1 -0
  481. package/dist/tools/schedules/schedule-tool.d.ts.map +1 -1
  482. package/dist/tools/schedules/schedule-tool.js +35 -6
  483. package/dist/tools/schedules/schedule-tool.js.map +1 -1
  484. package/dist/tools/schedules/types.d.ts +23 -3
  485. package/dist/tools/schedules/types.d.ts.map +1 -1
  486. package/dist/tools/task/list.d.ts.map +1 -1
  487. package/dist/tools/task/list.js +14 -6
  488. package/dist/tools/task/list.js.map +1 -1
  489. package/dist/tools/task/present.d.ts.map +1 -1
  490. package/dist/tools/task/present.js +26 -6
  491. package/dist/tools/task/present.js.map +1 -1
  492. package/dist/tools/task/update.d.ts.map +1 -1
  493. package/dist/tools/task/update.js +12 -5
  494. package/dist/tools/task/update.js.map +1 -1
  495. package/dist/tools/text-window.d.ts +19 -0
  496. package/dist/tools/text-window.d.ts.map +1 -0
  497. package/dist/tools/text-window.js +83 -0
  498. package/dist/tools/text-window.js.map +1 -0
  499. package/dist/toolsets/manager.d.ts +11 -0
  500. package/dist/toolsets/manager.d.ts.map +1 -1
  501. package/dist/toolsets/manager.js +45 -1
  502. package/dist/toolsets/manager.js.map +1 -1
  503. package/dist/types/acp/index.d.ts +137 -1
  504. package/dist/types/acp/index.d.ts.map +1 -1
  505. package/dist/types/agent/base.d.ts +3 -0
  506. package/dist/types/agent/base.d.ts.map +1 -1
  507. package/dist/types/agent/manager.d.ts +8 -23
  508. package/dist/types/agent/manager.d.ts.map +1 -1
  509. package/dist/types/agent/scheduler.d.ts +10 -1
  510. package/dist/types/agent/scheduler.d.ts.map +1 -1
  511. package/dist/types/agent/task.d.ts +4 -0
  512. package/dist/types/agent/task.d.ts.map +1 -1
  513. package/dist/types/authorization/index.d.ts +30 -30
  514. package/dist/types/connector/mcp.d.ts +7 -0
  515. package/dist/types/connector/mcp.d.ts.map +1 -1
  516. package/dist/types/errors/catalog.d.ts.map +1 -1
  517. package/dist/types/errors/catalog.js +4 -2
  518. package/dist/types/errors/catalog.js.map +1 -1
  519. package/dist/types/harness/schema.d.ts +354 -0
  520. package/dist/types/harness/schema.d.ts.map +1 -0
  521. package/dist/types/harness/schema.js +203 -0
  522. package/dist/types/harness/schema.js.map +1 -0
  523. package/dist/types/harness/session.d.ts +278 -0
  524. package/dist/types/harness/session.d.ts.map +1 -0
  525. package/dist/types/harness/session.js +2 -0
  526. package/dist/types/harness/session.js.map +1 -0
  527. package/dist/types/hitl/index.d.ts +12 -0
  528. package/dist/types/hitl/index.d.ts.map +1 -1
  529. package/dist/types/hitl/index.js.map +1 -1
  530. package/dist/types/job/index.d.ts +47 -0
  531. package/dist/types/job/index.d.ts.map +1 -0
  532. package/dist/types/job/index.js +2 -0
  533. package/dist/types/job/index.js.map +1 -0
  534. package/dist/types/message/inbound-delivery.d.ts +44 -0
  535. package/dist/types/message/inbound-delivery.d.ts.map +1 -0
  536. package/dist/types/message/inbound-delivery.js +14 -0
  537. package/dist/types/message/inbound-delivery.js.map +1 -0
  538. package/dist/types/message/index.d.ts +4 -1
  539. package/dist/types/message/index.d.ts.map +1 -1
  540. package/dist/types/message/index.js +5 -1
  541. package/dist/types/message/index.js.map +1 -1
  542. package/dist/types/plugin/index.d.ts +6 -6
  543. package/dist/types/sandbox/index.d.ts +39 -2
  544. package/dist/types/sandbox/index.d.ts.map +1 -1
  545. package/dist/types/sandbox/index.js.map +1 -1
  546. package/dist/types/session/checkpoint.d.ts +24 -17
  547. package/dist/types/session/checkpoint.d.ts.map +1 -1
  548. package/dist/types/session/checkpoint.js +1 -0
  549. package/dist/types/session/checkpoint.js.map +1 -1
  550. package/dist/types/session/events.d.ts +23 -1
  551. package/dist/types/session/events.d.ts.map +1 -1
  552. package/dist/types/session/events.js.map +1 -1
  553. package/dist/types/session/records.d.ts +1514 -565
  554. package/dist/types/session/records.d.ts.map +1 -1
  555. package/dist/types/session/records.js +89 -1
  556. package/dist/types/session/records.js.map +1 -1
  557. package/dist/types/session/step.d.ts +2 -0
  558. package/dist/types/session/step.d.ts.map +1 -1
  559. package/dist/types/session/step.js.map +1 -1
  560. package/dist/types/session/store.d.ts +19 -10
  561. package/dist/types/session/store.d.ts.map +1 -1
  562. package/dist/types/session/tool-execution.d.ts +6 -0
  563. package/dist/types/session/tool-execution.d.ts.map +1 -1
  564. package/dist/types/structured-output/index.d.ts +12 -2
  565. package/dist/types/structured-output/index.d.ts.map +1 -1
  566. package/dist/types/summary/ref.d.ts +3 -1
  567. package/dist/types/summary/ref.d.ts.map +1 -1
  568. package/dist/types/tool/index.d.ts +32 -4
  569. package/dist/types/tool/index.d.ts.map +1 -1
  570. package/dist/types/tool/index.js.map +1 -1
  571. package/dist/types/tool/presentation.d.ts +106 -0
  572. package/dist/types/tool/presentation.d.ts.map +1 -1
  573. package/dist/utils/json-snapshot.d.ts +6 -2
  574. package/dist/utils/json-snapshot.d.ts.map +1 -1
  575. package/dist/utils/json-snapshot.js +19 -9
  576. package/dist/utils/json-snapshot.js.map +1 -1
  577. package/dist/utils/structured-result-json.d.ts +5 -0
  578. package/dist/utils/structured-result-json.d.ts.map +1 -0
  579. package/dist/utils/structured-result-json.js +10 -0
  580. package/dist/utils/structured-result-json.js.map +1 -0
  581. package/package.json +1 -1
  582. package/src/agents/QueryAgent.ts +1 -0
  583. package/src/agents/examples/SupervisorAgent.ts +1 -0
  584. package/src/agents/runAgent.ts +3 -0
  585. package/src/authorization/shell-lexer.ts +16 -1
  586. package/src/bridge/acp/permission.ts +17 -3
  587. package/src/bridge/acp/server.ts +271 -25
  588. package/src/bridge/acp/tasks.ts +23 -0
  589. package/src/bridge/acp/update.ts +167 -13
  590. package/src/connector/mcp/adapter.ts +16 -4
  591. package/src/connector/mcp/client.ts +6 -2
  592. package/src/constants/acp/index.ts +4 -0
  593. package/src/manager/agent/lifecycle.ts +230 -3
  594. package/src/manager/plan/lifecycle.ts +11 -9
  595. package/src/manager/session/attribution.ts +12 -2
  596. package/src/manager/session/streamed-message-identity.ts +21 -0
  597. package/src/manager/session/turn-recorder.ts +4 -3
  598. package/src/pals/activity/causality.ts +261 -0
  599. package/src/pals/activity/projection.ts +89 -0
  600. package/src/pals/activity/source.ts +240 -0
  601. package/src/pals/activity/subscription-policy.ts +230 -0
  602. package/src/pals/activity/subscription-schema.ts +27 -0
  603. package/src/pals/activity/subscription-store.ts +172 -0
  604. package/src/pals/activity/subscription-types.ts +48 -0
  605. package/src/pals/activity/subscriptions.ts +209 -0
  606. package/src/pals/activity/types.ts +108 -0
  607. package/src/pals/channels/ingress.ts +153 -0
  608. package/src/pals/channels/routes.ts +118 -0
  609. package/src/pals/channels/routing.ts +197 -0
  610. package/src/pals/channels/schema.ts +108 -0
  611. package/src/pals/channels/types.ts +156 -0
  612. package/src/pals/communication/broker.ts +131 -0
  613. package/src/pals/communication/dispatch.ts +66 -0
  614. package/src/pals/communication/inbound.ts +193 -0
  615. package/src/pals/communication/ingress-dispatch.ts +63 -0
  616. package/src/pals/communication/ingress-inbound.ts +269 -0
  617. package/src/pals/communication/ingress-schema.ts +526 -0
  618. package/src/pals/communication/ingress-types.ts +336 -0
  619. package/src/pals/communication/operator.ts +315 -0
  620. package/src/pals/communication/policy.ts +174 -0
  621. package/src/pals/communication/schema.ts +173 -0
  622. package/src/pals/communication/store.ts +577 -0
  623. package/src/pals/communication/tools.ts +139 -0
  624. package/src/pals/communication/types.ts +227 -0
  625. package/src/pals/communication/verify.ts +220 -0
  626. package/src/pals/lifecycle.ts +54 -0
  627. package/src/pals/prompt.ts +101 -0
  628. package/src/pals/reference-images.ts +322 -0
  629. package/src/pals/runtime.ts +670 -0
  630. package/src/pals/store.ts +369 -0
  631. package/src/pals/types.ts +157 -0
  632. package/src/peers/envelope.ts +1 -1
  633. package/src/plugin/shell-hook.ts +8 -2
  634. package/src/process/kill-tree.ts +10 -1
  635. package/src/provider/errors.ts +135 -2
  636. package/src/public-runtime.ts +117 -12
  637. package/src/public-tools.ts +13 -1
  638. package/src/public-types.ts +69 -7
  639. package/src/registry/tool/presentation.ts +9 -4
  640. package/src/runtime/harness-session/index.ts +1125 -0
  641. package/src/runtime/harness-session/journal.ts +209 -0
  642. package/src/runtime/harness-session/saved-view.ts +122 -0
  643. package/src/runtime/jobs/awaited-jobs.ts +2 -1
  644. package/src/runtime/jobs/registry.ts +397 -41
  645. package/src/runtime/query/abandon-turn.ts +18 -2
  646. package/src/runtime/query/checkpoint.ts +11 -0
  647. package/src/runtime/query/durable-inbound.ts +101 -0
  648. package/src/runtime/query/events.ts +22 -5
  649. package/src/runtime/query/executor/tool-call-admission.ts +125 -32
  650. package/src/runtime/query/executor.ts +316 -130
  651. package/src/runtime/query/index.ts +24 -4
  652. package/src/runtime/query/iteration/index.ts +218 -104
  653. package/src/runtime/query/iteration/outstanding-work.ts +55 -7
  654. package/src/runtime/query/iteration/phases/context.ts +4 -0
  655. package/src/runtime/query/iteration/phases/tool-review.ts +118 -21
  656. package/src/runtime/query/observation-context.ts +22 -16
  657. package/src/runtime/query/prepare-turn.ts +2 -2
  658. package/src/runtime/query/prompt-cache.ts +3 -0
  659. package/src/runtime/query/prompt.ts +32 -1
  660. package/src/runtime/query/repeat-call.ts +40 -10
  661. package/src/runtime/query/resume-pending.ts +60 -7
  662. package/src/runtime/query/resume-session.ts +1 -1
  663. package/src/runtime/query/review-policy.ts +23 -2
  664. package/src/runtime/query/saved-presentation.ts +70 -0
  665. package/src/runtime/query/steering.ts +6 -9
  666. package/src/runtime/query/tool-executions.ts +108 -9
  667. package/src/runtime/query/tooling.ts +6 -1
  668. package/src/scheduler/completion-inbox.ts +108 -7
  669. package/src/scheduler/delegating.ts +5 -0
  670. package/src/scheduler/local.ts +2 -0
  671. package/src/session/summary/materialize.ts +51 -9
  672. package/src/store/budget/ledger.ts +60 -5
  673. package/src/store/session/disk.ts +77 -10
  674. package/src/store/session/memory.ts +32 -7
  675. package/src/store/session-log/core.ts +118 -11
  676. package/src/store/session-log/disk.ts +9 -2
  677. package/src/store/session-log/fold.ts +22 -0
  678. package/src/store/session-log/index.ts +5 -0
  679. package/src/store/session-log/memory.ts +2 -1
  680. package/src/store/session-log/spill.ts +89 -6
  681. package/src/store/session-log/structured-result.ts +96 -0
  682. package/src/store/task/disk.ts +46 -2
  683. package/src/store/task/memory.ts +13 -3
  684. package/src/tools/admit-facts.ts +145 -0
  685. package/src/tools/builtins/bash.ts +132 -24
  686. package/src/tools/builtins/edit.ts +42 -0
  687. package/src/tools/builtins/file-write-result.ts +14 -0
  688. package/src/tools/builtins/glob.ts +12 -0
  689. package/src/tools/builtins/grep.ts +14 -0
  690. package/src/tools/builtins/index.ts +2 -0
  691. package/src/tools/builtins/job.ts +4 -1
  692. package/src/tools/builtins/read-file.ts +57 -0
  693. package/src/tools/builtins/view-image.ts +409 -0
  694. package/src/tools/builtins/wait-for-job-bounds.ts +3 -0
  695. package/src/tools/builtins/wait-for-job.ts +141 -32
  696. package/src/tools/builtins/write-file.ts +4 -2
  697. package/src/tools/command-shell.ts +132 -5
  698. package/src/tools/coordinator/agent.ts +9 -19
  699. package/src/tools/coordinator/index.ts +150 -75
  700. package/src/tools/coordinator/wait-with-idle-bound.ts +3 -1
  701. package/src/tools/defineTool.ts +4 -0
  702. package/src/tools/failure-facts.ts +24 -0
  703. package/src/tools/host-output.ts +136 -0
  704. package/src/tools/oem-code-pages.ts +22 -0
  705. package/src/tools/schedules/schedule-tool.ts +38 -5
  706. package/src/tools/schedules/types.ts +23 -3
  707. package/src/tools/task/list.ts +15 -7
  708. package/src/tools/task/present.ts +37 -7
  709. package/src/tools/task/update.ts +12 -5
  710. package/src/tools/text-window.ts +87 -0
  711. package/src/toolsets/manager.ts +58 -1
  712. package/src/types/acp/index.ts +150 -4
  713. package/src/types/agent/base.ts +3 -0
  714. package/src/types/agent/manager.ts +8 -23
  715. package/src/types/agent/scheduler.ts +10 -1
  716. package/src/types/agent/task.ts +4 -0
  717. package/src/types/connector/mcp.ts +7 -0
  718. package/src/types/errors/catalog.ts +4 -2
  719. package/src/types/harness/schema.ts +203 -0
  720. package/src/types/harness/session.ts +306 -0
  721. package/src/types/hitl/index.ts +17 -1
  722. package/src/types/job/index.ts +42 -0
  723. package/src/types/message/inbound-delivery.ts +63 -0
  724. package/src/types/message/index.ts +8 -1
  725. package/src/types/sandbox/index.ts +46 -0
  726. package/src/types/session/checkpoint.ts +4 -1
  727. package/src/types/session/events.ts +23 -1
  728. package/src/types/session/records.ts +114 -2
  729. package/src/types/session/step.ts +2 -0
  730. package/src/types/session/store.ts +23 -9
  731. package/src/types/session/tool-execution.ts +6 -0
  732. package/src/types/structured-output/index.ts +13 -2
  733. package/src/types/summary/ref.ts +3 -1
  734. package/src/types/tool/index.ts +39 -5
  735. package/src/types/tool/presentation.ts +121 -0
  736. package/src/utils/json-snapshot.ts +26 -9
  737. package/src/utils/structured-result-json.ts +10 -0
@@ -0,0 +1,670 @@
1
+ import type {
2
+ ComputerUseAction,
3
+ ComputerUseHost,
4
+ ComputerUseResult,
5
+ } from '../types/computer-use/index.js'
6
+ import { PalLifecycleEmitter, type PalLifecycleListener } from './lifecycle.js'
7
+ import type {
8
+ PalAdmission,
9
+ PalAdmissionRequest,
10
+ PalComputerControl,
11
+ PalComputerControlState,
12
+ PalComputerInput,
13
+ PalComputerScreenStream,
14
+ PalConversationAdmission,
15
+ PalEnvironmentLease,
16
+ PalRuntimeOptions,
17
+ } from './types.js'
18
+
19
+ export class PalUnavailableError extends Error {
20
+ override readonly name = 'PalUnavailableError'
21
+ }
22
+
23
+ function captureInput(input: PalComputerInput): PalComputerInput {
24
+ const invalid = () => new Error('Invalid Pal computer input.')
25
+ const shape = (value: unknown, keys: readonly string[]): value is Record<string, unknown> =>
26
+ !!value &&
27
+ typeof value === 'object' &&
28
+ !Array.isArray(value) &&
29
+ Object.keys(value).length === keys.length &&
30
+ keys.every((key) => Object.hasOwn(value, key))
31
+ const point = (value: unknown) => {
32
+ if (
33
+ !shape(value, ['x', 'y']) ||
34
+ !Number.isSafeInteger(value.x) ||
35
+ !Number.isSafeInteger(value.y) ||
36
+ (value.x as number) < 0 ||
37
+ (value.y as number) < 0 ||
38
+ (value.x as number) > 32767 ||
39
+ (value.y as number) > 32767
40
+ )
41
+ throw invalid()
42
+ return { x: value.x as number, y: value.y as number }
43
+ }
44
+ const button = (value: unknown) => {
45
+ if (value !== 'left' && value !== 'right' && value !== 'middle') throw invalid()
46
+ return value
47
+ }
48
+ if (!input || typeof input !== 'object') throw invalid()
49
+ switch (input.type) {
50
+ case 'mouse_move':
51
+ if (!shape(input, ['type', 'to'])) throw invalid()
52
+ return { type: input.type, to: point(input.to) }
53
+ case 'mouse_click':
54
+ if (!shape(input, ['type', 'at', 'button'])) throw invalid()
55
+ return { type: input.type, at: point(input.at), button: button(input.button) }
56
+ case 'mouse_drag':
57
+ if (!shape(input, ['type', 'from', 'to', 'button'])) throw invalid()
58
+ return {
59
+ type: input.type,
60
+ from: point(input.from),
61
+ to: point(input.to),
62
+ button: button(input.button),
63
+ }
64
+ case 'scroll':
65
+ if (
66
+ !shape(input, ['type', 'at', 'direction', 'amount']) ||
67
+ !['up', 'down', 'left', 'right'].includes(input.direction) ||
68
+ !Number.isSafeInteger(input.amount) ||
69
+ input.amount < 1 ||
70
+ input.amount > 100
71
+ )
72
+ throw invalid()
73
+ return {
74
+ type: input.type,
75
+ at: point(input.at),
76
+ direction: input.direction,
77
+ amount: input.amount,
78
+ }
79
+ case 'type_text':
80
+ if (
81
+ !shape(input, ['type', 'text']) ||
82
+ typeof input.text !== 'string' ||
83
+ input.text.length > 100_000 ||
84
+ input.text.includes('\0')
85
+ )
86
+ throw invalid()
87
+ return { type: input.type, text: input.text }
88
+ case 'key':
89
+ if (
90
+ !shape(input, ['type', 'keys']) ||
91
+ typeof input.keys !== 'string' ||
92
+ !input.keys.trim() ||
93
+ input.keys.length > 100 ||
94
+ !/^[a-zA-Z0-9_+ -]+$/.test(input.keys)
95
+ )
96
+ throw invalid()
97
+ return { type: input.type, keys: input.keys }
98
+ case 'key_down':
99
+ case 'key_up':
100
+ if (
101
+ !shape(input, ['type', 'key', 'keyboardId']) ||
102
+ typeof input.key !== 'string' ||
103
+ !/^[a-zA-Z0-9_]{1,40}$/.test(input.key) ||
104
+ typeof input.keyboardId !== 'string' ||
105
+ !/^[a-zA-Z0-9_-]{16,80}$/.test(input.keyboardId)
106
+ )
107
+ throw invalid()
108
+ return { type: input.type, key: input.key, keyboardId: input.keyboardId }
109
+ case 'release_keys':
110
+ if (
111
+ !shape(input, ['type', 'keyboardId']) ||
112
+ typeof input.keyboardId !== 'string' ||
113
+ !/^[a-zA-Z0-9_-]{16,80}$/.test(input.keyboardId)
114
+ )
115
+ throw invalid()
116
+ return { type: input.type, keyboardId: input.keyboardId }
117
+ default:
118
+ throw invalid()
119
+ }
120
+ }
121
+
122
+ function controlMode(control: PalComputerControl): PalComputerControl['mode'] {
123
+ return control.mode
124
+ }
125
+
126
+ function freshAdmissionComputer(host: ComputerUseHost, assertActive: () => void): ComputerUseHost {
127
+ let observed = false
128
+ const requireScreen = () => {
129
+ if (!observed)
130
+ throw new PalUnavailableError(
131
+ 'Capture a fresh Pal computer screenshot after operator control before sending GUI input.',
132
+ )
133
+ }
134
+ return new Proxy(Object.create(host) as ComputerUseHost, {
135
+ get(_target, property) {
136
+ const value = Reflect.get(host, property, host)
137
+ if (typeof value !== 'function') return value
138
+ if (property === 'execute')
139
+ return async (action: ComputerUseAction) => {
140
+ assertActive()
141
+ if (action.type !== 'screenshot' && action.type !== 'cursor_position') requireScreen()
142
+ const result: ComputerUseResult = await host.execute(action)
143
+ assertActive()
144
+ if (action.type === 'screenshot' && result.type === 'screenshot') observed = true
145
+ return result
146
+ }
147
+ return async (...args: unknown[]) => {
148
+ assertActive()
149
+ if (property === 'focusWindow' || property === 'executeWindow' || property === 'uiAct')
150
+ requireScreen()
151
+ const result = await Reflect.apply(value, host, args)
152
+ assertActive()
153
+ return result
154
+ }
155
+ },
156
+ })
157
+ }
158
+
159
+ /** One host-owned local computer and one active input controller per Pal. */
160
+ export class PalRuntime {
161
+ private readonly computers = new Map<string, PalEnvironmentLease>()
162
+ private readonly starting = new Map<string, Promise<PalEnvironmentLease>>()
163
+ private readonly controllers = new Map<
164
+ string,
165
+ { readonly conversationId: string; generation?: number }
166
+ >()
167
+ private readonly conversations = new Map<string, { readonly conversationId: string }>()
168
+ private readonly lifecycle = new PalLifecycleEmitter()
169
+ private readonly stopping = new Set<string>()
170
+ private readonly freshScreenRequired = new Set<string>()
171
+ private readonly controlOperations = new Map<
172
+ string,
173
+ { readonly transition: boolean; readonly promise: Promise<unknown> }
174
+ >()
175
+ private readonly failures = new Map<string, string>()
176
+ private closing: Promise<void> | undefined
177
+ private closed = false
178
+ constructor(private readonly options: PalRuntimeOptions) {}
179
+
180
+ /** Live observations only. Unsubscribe does not stop the Pal or its computer. */
181
+ onLifecycle(listener: PalLifecycleListener): () => void {
182
+ return this.lifecycle.on(listener)
183
+ }
184
+
185
+ computer(palId: string): PalEnvironmentLease | null {
186
+ const lease = this.computers.get(palId)
187
+ if (lease && lease.sandbox.status !== 'ready' && lease.sandbox.status !== 'busy')
188
+ this.failures.set(palId, 'This Pal computer retired. Stop it before starting it again.')
189
+ return this.failures.has(palId) || this.stopping.has(palId) ? null : (lease ?? null)
190
+ }
191
+ computerError(palId: string): string | null {
192
+ this.computer(palId)
193
+ return this.failures.get(palId) ?? null
194
+ }
195
+ /** Trusted host observation only. The credentials do not grant guest input authority. */
196
+ computerScreenStream(palId: string, generation: number): PalComputerScreenStream {
197
+ if (this.closed) throw new PalUnavailableError('The Pal runtime is closed.')
198
+ if (!Number.isSafeInteger(generation) || generation < 1)
199
+ throw new PalUnavailableError('Invalid Pal computer generation.')
200
+ const pal = this.options.store.get(palId)
201
+ const lease = this.computer(palId)
202
+ if (
203
+ !pal ||
204
+ !lease ||
205
+ lease.palId !== pal.id ||
206
+ lease.generation !== generation ||
207
+ this.starting.has(palId) ||
208
+ this.stopping.has(palId)
209
+ )
210
+ throw new PalUnavailableError('This Pal computer generation is unavailable or changed.')
211
+ const stream = lease.screenStream
212
+ if (!stream) throw new PalUnavailableError('This Pal computer does not support a live screen.')
213
+ const { protocol, url, authorization } = stream
214
+ const bounded = (value: unknown): value is string =>
215
+ typeof value === 'string' &&
216
+ value.length > 0 &&
217
+ value.length <= 4096 &&
218
+ value.trim() === value &&
219
+ ![...value].some((character) => {
220
+ const code = character.charCodeAt(0)
221
+ return code < 32 || code === 127
222
+ })
223
+ if (protocol !== 'rfb' || !bounded(url) || !bounded(authorization))
224
+ throw new PalUnavailableError('The Pal computer returned an invalid live screen descriptor.')
225
+ let target: URL
226
+ try {
227
+ target = new URL(url)
228
+ } catch {
229
+ throw new PalUnavailableError('The Pal computer returned an invalid live screen descriptor.')
230
+ }
231
+ if (
232
+ (target.protocol !== 'ws:' && target.protocol !== 'wss:') ||
233
+ target.username ||
234
+ target.password ||
235
+ this.computer(palId) !== lease ||
236
+ lease.generation !== generation
237
+ )
238
+ throw new PalUnavailableError('The Pal computer returned an invalid live screen descriptor.')
239
+ return Object.freeze({ protocol, url, authorization })
240
+ }
241
+ /** Actual provider authority, including a transition reserved by this runtime. */
242
+ computerControl(palId: string): PalComputerControlState {
243
+ const lease = this.computer(palId)
244
+ if (!lease) return { supported: false, mode: 'unavailable' }
245
+ if (!lease.operatorControl) return { supported: false, mode: 'unavailable' }
246
+ if (this.controlOperations.get(palId)?.transition)
247
+ return { supported: true, mode: 'transitioning' }
248
+ const mode = lease.operatorControl.mode
249
+ const heldKeyboard =
250
+ lease.operatorControl.heldKeyboard === true ? { heldKeyboard: true as const } : {}
251
+ return mode === 'pal' || mode === 'operator' || mode === 'transitioning'
252
+ ? { supported: true, mode, ...heldKeyboard }
253
+ : { supported: true, mode: 'unavailable' }
254
+ }
255
+ busy(palId: string): boolean {
256
+ return (
257
+ this.conversations.has(palId) ||
258
+ this.controllers.has(palId) ||
259
+ this.starting.has(palId) ||
260
+ this.stopping.has(palId) ||
261
+ this.controlOperations.has(palId) ||
262
+ (this.computers.get(palId)?.operatorControl?.mode !== undefined &&
263
+ this.computers.get(palId)?.operatorControl?.mode !== 'pal')
264
+ )
265
+ }
266
+ /** Actual guest lifecycle/control transition, independent of model-only chat. */
267
+ computerChanging(palId: string): boolean {
268
+ return this.starting.has(palId) || this.stopping.has(palId) || this.controlOperations.has(palId)
269
+ }
270
+ private ownedControl(palId: string, generation: number) {
271
+ if (this.closed) throw new PalUnavailableError('The Pal runtime is closed.')
272
+ if (!Number.isSafeInteger(generation) || generation < 1)
273
+ throw new PalUnavailableError('Invalid Pal computer generation.')
274
+ const pal = this.options.store.get(palId)
275
+ const lease = this.computer(palId)
276
+ if (
277
+ !pal ||
278
+ !lease ||
279
+ lease.palId !== pal.id ||
280
+ lease.generation !== generation ||
281
+ this.starting.has(palId) ||
282
+ this.stopping.has(palId)
283
+ )
284
+ throw new PalUnavailableError('This Pal computer generation is unavailable or changed.')
285
+ if (this.controllers.has(palId))
286
+ throw new PalUnavailableError('Stop this Pal’s active work before taking computer control.')
287
+ if (this.controlOperations.has(palId))
288
+ throw new PalUnavailableError('This Pal computer control operation is still pending.')
289
+ if (!lease.operatorControl)
290
+ throw new PalUnavailableError('This Pal computer does not support operator control.')
291
+ return { lease, control: lease.operatorControl }
292
+ }
293
+ private async controlOperation<T>(
294
+ palId: string,
295
+ generation: number,
296
+ transition: boolean,
297
+ run: (control: PalComputerControl) => Promise<T>,
298
+ ): Promise<T> {
299
+ const { lease, control } = this.ownedControl(palId, generation)
300
+ // Reserve before invoking the provider; synchronous observers cannot admit a new task.
301
+ const promise = Promise.resolve().then(async () => {
302
+ if (this.closed || this.computer(palId) !== lease || !this.options.store.get(palId))
303
+ throw new PalUnavailableError('This Pal computer control operation lost its ownership.')
304
+ return run(control)
305
+ })
306
+ const operation = { transition, promise }
307
+ this.controlOperations.set(palId, operation)
308
+ try {
309
+ return await promise
310
+ } finally {
311
+ if (this.controlOperations.get(palId) === operation) this.controlOperations.delete(palId)
312
+ }
313
+ }
314
+ async takeOver(palId: string, generation: number): Promise<void> {
315
+ return this.controlOperation(palId, generation, true, async (control) => {
316
+ if (control.mode !== 'pal')
317
+ throw new PalUnavailableError('This Pal computer is not under Pal control.')
318
+ // A preview capture must never certify what a later Pal admission has observed.
319
+ this.freshScreenRequired.add(palId)
320
+ await control.takeOver()
321
+ if (controlMode(control) !== 'operator')
322
+ throw new PalUnavailableError('Operator control of this Pal computer was not confirmed.')
323
+ })
324
+ }
325
+ async returnControl(palId: string, generation: number): Promise<void> {
326
+ return this.controlOperation(palId, generation, true, async (control) => {
327
+ if (control.mode !== 'operator')
328
+ throw new PalUnavailableError('This Pal computer is not under operator control.')
329
+ await control.returnControl()
330
+ if (controlMode(control) !== 'pal')
331
+ throw new PalUnavailableError('Pal control of this computer was not confirmed.')
332
+ })
333
+ }
334
+ async executeOperatorInput(
335
+ palId: string,
336
+ generation: number,
337
+ input: PalComputerInput,
338
+ ): Promise<ComputerUseResult> {
339
+ const captured = captureInput(input)
340
+ return this.controlOperation(palId, generation, false, async (control) => {
341
+ if (control.mode !== 'operator')
342
+ throw new PalUnavailableError('Take operator control before sending computer input.')
343
+ if (
344
+ (captured.type === 'key_down' ||
345
+ captured.type === 'key_up' ||
346
+ captured.type === 'release_keys') &&
347
+ control.heldKeyboard !== true
348
+ )
349
+ throw new PalUnavailableError('This Pal computer does not support held keyboard input.')
350
+ return control.executeInput(captured)
351
+ })
352
+ }
353
+ async startComputer(palId: string, signal?: AbortSignal): Promise<PalEnvironmentLease> {
354
+ signal?.throwIfAborted()
355
+ if (this.closed) throw new PalUnavailableError('The Pal runtime is closed.')
356
+ if (this.stopping.has(palId)) throw new PalUnavailableError('This Pal computer is stopping.')
357
+ if (this.failures.has(palId))
358
+ throw new PalUnavailableError(this.failures.get(palId) ?? 'This Pal computer is unavailable.')
359
+ const pal = this.options.store.get(palId)
360
+ if (!pal || pal.paused) throw new PalUnavailableError('This Pal is paused or unavailable.')
361
+ const held = this.computers.get(palId)
362
+ if (held) {
363
+ if (held.sandbox.status !== 'ready' && held.sandbox.status !== 'busy')
364
+ throw new PalUnavailableError(
365
+ 'This Pal computer retired. Stop it before starting it again.',
366
+ )
367
+ return held
368
+ }
369
+ const pending = this.starting.get(palId)
370
+ if (pending) {
371
+ const lease = await pending
372
+ signal?.throwIfAborted()
373
+ return lease
374
+ }
375
+ const provider = this.options.environments
376
+ if (!provider) throw new PalUnavailableError('This Pal needs a ready local virtual computer.')
377
+ // Publish shared ownership before invoking observers or the provider.
378
+ const start = Promise.resolve().then(async () => {
379
+ this.lifecycle.emit({ type: 'computer.starting', palId })
380
+ let lease: PalEnvironmentLease | undefined
381
+ try {
382
+ lease = await provider.acquire({
383
+ pal,
384
+ conversationId: `computer:${pal.id}`,
385
+ ...(signal ? { signal } : {}),
386
+ })
387
+ signal?.throwIfAborted()
388
+ const latest = this.options.store.get(pal.id)
389
+ if (this.closed || !latest || latest.paused || latest.workspace !== pal.workspace)
390
+ throw new PalUnavailableError('This Pal became unavailable while starting its computer.')
391
+ if (
392
+ lease.palId !== pal.id ||
393
+ !lease.environmentId?.trim() ||
394
+ !Number.isSafeInteger(lease.generation) ||
395
+ lease.generation < 1 ||
396
+ !lease.sandbox ||
397
+ !lease.computerUseHost ||
398
+ !lease.computerUseHost.capabilities.screenshot ||
399
+ !lease.computerUseHost.capabilities.mouse ||
400
+ !lease.computerUseHost.capabilities.keyboard ||
401
+ (lease.sandbox.status !== 'ready' && lease.sandbox.status !== 'busy')
402
+ )
403
+ throw new PalUnavailableError(
404
+ 'The virtual computer lease does not match this Pal or is not ready.',
405
+ )
406
+ this.computers.set(palId, lease)
407
+ this.lifecycle.emit({ type: 'computer.ready', palId, generation: lease.generation })
408
+ return lease
409
+ } catch (error) {
410
+ try {
411
+ await lease?.release()
412
+ } catch (releaseError) {
413
+ if (lease) this.computers.set(palId, lease)
414
+ this.failures.set(
415
+ palId,
416
+ 'A rejected Pal computer could not be released. Retry stopping it.',
417
+ )
418
+ this.lifecycle.emit({ type: 'computer.start-failed', palId, reason: 'cleanup-required' })
419
+ throw new AggregateError(
420
+ [error, releaseError],
421
+ 'Pal computer admission and cleanup failed.',
422
+ )
423
+ }
424
+ this.lifecycle.emit({ type: 'computer.start-failed', palId, reason: 'unavailable' })
425
+ throw error
426
+ }
427
+ })
428
+ this.starting.set(palId, start)
429
+ try {
430
+ return await start
431
+ } finally {
432
+ if (this.starting.get(palId) === start) this.starting.delete(palId)
433
+ }
434
+ }
435
+ async stopComputer(palId: string): Promise<void> {
436
+ if (this.controlOperations.has(palId))
437
+ throw new PalUnavailableError('Wait for this Pal computer control operation to finish.')
438
+ if (this.stopping.has(palId))
439
+ throw new PalUnavailableError('This Pal computer is already stopping.')
440
+ if (this.controllers.has(palId))
441
+ throw new PalUnavailableError('Stop this Pal’s active work before stopping its computer.')
442
+ if (this.starting.has(palId))
443
+ throw new PalUnavailableError('Wait for this Pal computer to finish starting.')
444
+ const lease = this.computers.get(palId)
445
+ if (!lease) return
446
+ const identity =
447
+ lease.palId === palId && Number.isSafeInteger(lease.generation) && lease.generation > 0
448
+ ? { generation: lease.generation }
449
+ : {}
450
+ this.stopping.add(palId)
451
+ this.lifecycle.emit({ type: 'computer.stopping', palId, ...identity })
452
+ try {
453
+ await lease.release()
454
+ if (this.computers.get(palId) === lease) this.computers.delete(palId)
455
+ this.freshScreenRequired.delete(palId)
456
+ this.failures.delete(palId)
457
+ this.lifecycle.emit({ type: 'computer.stopped', palId, ...identity })
458
+ } catch (error) {
459
+ this.failures.set(palId, 'The Pal computer could not be stopped. Retry stopping it.')
460
+ this.lifecycle.emit({ type: 'computer.stop-failed', palId, ...identity })
461
+ throw error
462
+ } finally {
463
+ this.stopping.delete(palId)
464
+ }
465
+ }
466
+ /** Admit model conversation without starting or borrowing any computer. */
467
+ async admitConversation(input: PalAdmissionRequest): Promise<PalConversationAdmission> {
468
+ const request = { ...input }
469
+ request.signal?.throwIfAborted()
470
+ if (!request.conversationId.trim()) throw new Error('A Pal conversation id is required.')
471
+ if (this.closed) throw new PalUnavailableError('The Pal runtime is closed.')
472
+ const current = this.options.store.get(request.palId)
473
+ if (!current || current.paused)
474
+ throw new PalUnavailableError('This Pal is paused or unavailable.')
475
+ if (this.conversations.has(current.id) || this.controllers.has(current.id))
476
+ throw new PalUnavailableError('This Pal is busy in another conversation.')
477
+ const definition = structuredClone(
478
+ request.revision === undefined
479
+ ? current
480
+ : this.options.store.getRevision(current.id, request.revision),
481
+ )
482
+ const controller = { conversationId: request.conversationId }
483
+ this.conversations.set(current.id, controller)
484
+ let released = false
485
+ let computer: PalAdmission | undefined
486
+ let acquiring: Promise<PalAdmission> | undefined
487
+ const assertActive = () => {
488
+ request.signal?.throwIfAborted()
489
+ if (released || this.closed || this.conversations.get(current.id) !== controller)
490
+ throw new PalUnavailableError('This Pal conversation admission is no longer owned.')
491
+ const latest = this.options.store.get(current.id)
492
+ if (!latest || latest.paused)
493
+ throw new PalUnavailableError('This Pal is paused or unavailable.')
494
+ if (latest.workspace !== definition.workspace)
495
+ throw new PalUnavailableError('Pal workspace identity changed.')
496
+ }
497
+ return {
498
+ definition,
499
+ assertActive,
500
+ acquireComputer: async () => {
501
+ assertActive()
502
+ if (computer) {
503
+ computer.assertActive()
504
+ return computer
505
+ }
506
+ if (acquiring) return acquiring
507
+ const pending = (async () => {
508
+ const guest = await this.admitComputer(
509
+ { ...request, revision: definition.revision },
510
+ controller,
511
+ )
512
+ try {
513
+ assertActive()
514
+ computer = {
515
+ ...guest,
516
+ assertActive: () => {
517
+ assertActive()
518
+ guest.assertActive()
519
+ },
520
+ }
521
+ return computer
522
+ } catch (error) {
523
+ await guest.release()
524
+ throw error
525
+ }
526
+ })()
527
+ acquiring = pending
528
+ try {
529
+ return await pending
530
+ } finally {
531
+ if (acquiring === pending) acquiring = undefined
532
+ }
533
+ },
534
+ release: async () => {
535
+ released = true
536
+ if (this.conversations.get(current.id) === controller) this.conversations.delete(current.id)
537
+ await acquiring?.catch(() => undefined)
538
+ await computer?.release()
539
+ },
540
+ }
541
+ }
542
+ async admit(request: PalAdmissionRequest): Promise<PalAdmission> {
543
+ return this.admitComputer({ ...request })
544
+ }
545
+ private async admitComputer(
546
+ request: PalAdmissionRequest,
547
+ conversation?: { readonly conversationId: string },
548
+ ): Promise<PalAdmission> {
549
+ request.signal?.throwIfAborted()
550
+ if (!request.conversationId.trim()) throw new Error('A Pal conversation id is required.')
551
+ if (this.closed) throw new PalUnavailableError('The Pal runtime is closed.')
552
+ const current = this.options.store.get(request.palId)
553
+ if (!current || current.paused)
554
+ throw new PalUnavailableError('This Pal is paused or unavailable.')
555
+ if (this.conversations.has(current.id) && this.conversations.get(current.id) !== conversation)
556
+ throw new PalUnavailableError('This Pal is busy in another conversation.')
557
+ const definition =
558
+ request.revision === undefined
559
+ ? current
560
+ : this.options.store.getRevision(current.id, request.revision)
561
+ if (
562
+ this.controlOperations.has(current.id) ||
563
+ (this.computers.get(current.id)?.operatorControl &&
564
+ this.computers.get(current.id)?.operatorControl?.mode !== 'pal')
565
+ )
566
+ throw new PalUnavailableError('Return this Pal computer to Pal control before starting work.')
567
+ if (this.controllers.has(current.id))
568
+ throw new PalUnavailableError('This Pal computer is busy in another conversation.')
569
+ const controller = {
570
+ conversationId: request.conversationId,
571
+ generation: undefined as number | undefined,
572
+ }
573
+ this.controllers.set(current.id, controller)
574
+ try {
575
+ const lease = await this.startComputer(current.id, request.signal)
576
+ let released = false
577
+ const assertActive = () => {
578
+ request.signal?.throwIfAborted()
579
+ if (
580
+ released ||
581
+ this.closed ||
582
+ this.controllers.get(current.id) !== controller ||
583
+ this.computers.get(current.id) !== lease
584
+ )
585
+ throw new PalUnavailableError('This Pal admission no longer owns its computer.')
586
+ if (lease.sandbox.status !== 'ready' && lease.sandbox.status !== 'busy')
587
+ throw new PalUnavailableError('This Pal computer retired during its work.')
588
+ if (
589
+ this.controlOperations.has(current.id) ||
590
+ (lease.operatorControl && lease.operatorControl.mode !== 'pal')
591
+ )
592
+ throw new PalUnavailableError('This Pal admission does not have Pal computer control.')
593
+ const latest = this.options.store.get(definition.id)
594
+ if (!latest || latest.paused)
595
+ throw new PalUnavailableError('This Pal is paused or unavailable.')
596
+ if (latest.workspace !== definition.workspace)
597
+ throw new PalUnavailableError('Pal workspace identity changed.')
598
+ }
599
+ assertActive()
600
+ controller.generation = lease.generation
601
+ this.lifecycle.emit({
602
+ type: 'admission.acquired',
603
+ palId: current.id,
604
+ generation: lease.generation,
605
+ conversationId: controller.conversationId,
606
+ })
607
+ return {
608
+ definition,
609
+ lease: this.freshScreenRequired.has(current.id)
610
+ ? {
611
+ ...lease,
612
+ computerUseHost: freshAdmissionComputer(lease.computerUseHost, assertActive),
613
+ release: () => lease.release(),
614
+ }
615
+ : lease,
616
+ assertActive,
617
+ release: async () => {
618
+ if (released) return
619
+ released = true
620
+ if (this.controllers.get(current.id) === controller) {
621
+ this.controllers.delete(current.id)
622
+ this.lifecycle.emit({
623
+ type: 'admission.released',
624
+ palId: current.id,
625
+ generation: lease.generation,
626
+ conversationId: controller.conversationId,
627
+ reason: 'released',
628
+ })
629
+ }
630
+ },
631
+ }
632
+ } catch (error) {
633
+ if (this.controllers.get(current.id) === controller) this.controllers.delete(current.id)
634
+ throw error
635
+ }
636
+ }
637
+ async close(): Promise<void> {
638
+ if (this.closing) return this.closing
639
+ this.closed = true
640
+ this.conversations.clear()
641
+ const closing = (async () => {
642
+ await Promise.allSettled(this.starting.values())
643
+ await Promise.allSettled([...this.controlOperations.values()].map(({ promise }) => promise))
644
+ for (const [palId, controller] of this.controllers) {
645
+ if (controller.generation !== undefined)
646
+ this.lifecycle.emit({
647
+ type: 'admission.released',
648
+ palId,
649
+ generation: controller.generation,
650
+ conversationId: controller.conversationId,
651
+ reason: 'closed',
652
+ })
653
+ }
654
+ this.controllers.clear()
655
+ const results = await Promise.allSettled(
656
+ [...this.computers.keys()].map((id) => this.stopComputer(id)),
657
+ )
658
+ const failures = results
659
+ .filter((result): result is PromiseRejectedResult => result.status === 'rejected')
660
+ .map((result) => result.reason)
661
+ if (failures.length) throw new AggregateError(failures, 'Failed to stop Pal computers.')
662
+ })()
663
+ this.closing = closing
664
+ try {
665
+ await closing
666
+ } finally {
667
+ if (this.closing === closing) this.closing = undefined
668
+ }
669
+ }
670
+ }