@intentic/sandbox-contract 1.247.0 → 1.249.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 (883) hide show
  1. package/README.md +18 -15
  2. package/dist/chores/chores.d.ts.map +1 -1
  3. package/dist/chores/chores.js.map +1 -1
  4. package/dist/chores/digest.d.ts.map +1 -1
  5. package/dist/chores/digest.js.map +1 -1
  6. package/dist/chores/extension-update.d.ts.map +1 -1
  7. package/dist/chores/extension-update.js.map +1 -1
  8. package/dist/chores/fix-deps.d.ts.map +1 -1
  9. package/dist/chores/fix-deps.js.map +1 -1
  10. package/dist/chores/index.d.ts +2 -2
  11. package/dist/chores/index.d.ts.map +1 -1
  12. package/dist/chores/index.js +1 -1
  13. package/dist/chores/index.js.map +1 -1
  14. package/dist/chores/probes.d.ts.map +1 -1
  15. package/dist/chores/probes.js.map +1 -1
  16. package/dist/chores/prompt.d.ts.map +1 -1
  17. package/dist/chores/prompt.js.map +1 -1
  18. package/dist/chores/stack.d.ts.map +1 -1
  19. package/dist/chores/stack.js.map +1 -1
  20. package/dist/chores/verdict.d.ts +7 -1
  21. package/dist/chores/verdict.d.ts.map +1 -1
  22. package/dist/chores/verdict.js +8 -0
  23. package/dist/chores/verdict.js.map +1 -1
  24. package/dist/contracts/accounts.contract.d.ts.map +1 -1
  25. package/dist/contracts/accounts.contract.js.map +1 -1
  26. package/dist/contracts/activity.contract.d.ts +1 -0
  27. package/dist/contracts/activity.contract.d.ts.map +1 -1
  28. package/dist/contracts/agent.contract.d.ts +13 -205
  29. package/dist/contracts/agent.contract.d.ts.map +1 -1
  30. package/dist/contracts/agent.contract.js +2 -1
  31. package/dist/contracts/agent.contract.js.map +1 -1
  32. package/dist/contracts/agents.contract.d.ts +228 -54
  33. package/dist/contracts/agents.contract.d.ts.map +1 -1
  34. package/dist/contracts/agents.contract.js +11 -2
  35. package/dist/contracts/agents.contract.js.map +1 -1
  36. package/dist/contracts/automations.contract.d.ts +35 -17
  37. package/dist/contracts/automations.contract.d.ts.map +1 -1
  38. package/dist/contracts/automations.contract.js +10 -1
  39. package/dist/contracts/automations.contract.js.map +1 -1
  40. package/dist/contracts/capabilities.contract.d.ts +0 -12
  41. package/dist/contracts/capabilities.contract.d.ts.map +1 -1
  42. package/dist/contracts/capabilities.contract.js +1 -1
  43. package/dist/contracts/capabilities.contract.js.map +1 -1
  44. package/dist/contracts/chores.contract.d.ts.map +1 -1
  45. package/dist/contracts/chores.contract.js.map +1 -1
  46. package/dist/contracts/ci.contract.d.ts +9 -0
  47. package/dist/contracts/ci.contract.d.ts.map +1 -1
  48. package/dist/contracts/endpoints.contract.d.ts.map +1 -1
  49. package/dist/contracts/endpoints.contract.js.map +1 -1
  50. package/dist/contracts/exit.contract.d.ts.map +1 -1
  51. package/dist/contracts/exit.contract.js +1 -1
  52. package/dist/contracts/exit.contract.js.map +1 -1
  53. package/dist/contracts/extensions.contract.d.ts.map +1 -1
  54. package/dist/contracts/extensions.contract.js.map +1 -1
  55. package/dist/contracts/git.contract.d.ts +45 -6
  56. package/dist/contracts/git.contract.d.ts.map +1 -1
  57. package/dist/contracts/git.contract.js +9 -9
  58. package/dist/contracts/git.contract.js.map +1 -1
  59. package/dist/contracts/host.contract.d.ts +2 -0
  60. package/dist/contracts/host.contract.d.ts.map +1 -1
  61. package/dist/contracts/host.contract.js.map +1 -1
  62. package/dist/contracts/intentic.contract.js +1 -1
  63. package/dist/contracts/intentic.contract.js.map +1 -1
  64. package/dist/contracts/logs.contract.d.ts.map +1 -1
  65. package/dist/contracts/logs.contract.js.map +1 -1
  66. package/dist/contracts/loops.contract.d.ts.map +1 -1
  67. package/dist/contracts/loops.contract.js.map +1 -1
  68. package/dist/contracts/personas.contract.d.ts +39 -4
  69. package/dist/contracts/personas.contract.d.ts.map +1 -1
  70. package/dist/contracts/personas.contract.js +10 -1
  71. package/dist/contracts/personas.contract.js.map +1 -1
  72. package/dist/contracts/providers.contract.d.ts.map +1 -1
  73. package/dist/contracts/providers.contract.js.map +1 -1
  74. package/dist/contracts/runner.contract.d.ts +6 -80
  75. package/dist/contracts/runner.contract.d.ts.map +1 -1
  76. package/dist/contracts/runner.contract.js +2 -2
  77. package/dist/contracts/runner.contract.js.map +1 -1
  78. package/dist/contracts/safety.contract.d.ts.map +1 -1
  79. package/dist/contracts/safety.contract.js +1 -1
  80. package/dist/contracts/safety.contract.js.map +1 -1
  81. package/dist/contracts/secrets.contract.d.ts.map +1 -1
  82. package/dist/contracts/secrets.contract.js.map +1 -1
  83. package/dist/contracts/sessions.contract.d.ts +2 -41
  84. package/dist/contracts/sessions.contract.d.ts.map +1 -1
  85. package/dist/contracts/sessions.contract.js +1 -1
  86. package/dist/contracts/sessions.contract.js.map +1 -1
  87. package/dist/contracts/settings.contract.d.ts +10 -10
  88. package/dist/contracts/settings.contract.d.ts.map +1 -1
  89. package/dist/contracts/settings.contract.js.map +1 -1
  90. package/dist/contracts/share.contract.d.ts.map +1 -1
  91. package/dist/contracts/share.contract.js.map +1 -1
  92. package/dist/contracts/skills.contract.d.ts.map +1 -1
  93. package/dist/contracts/skills.contract.js.map +1 -1
  94. package/dist/contracts/system.contract.d.ts +49 -73
  95. package/dist/contracts/system.contract.d.ts.map +1 -1
  96. package/dist/contracts/system.contract.js +12 -2
  97. package/dist/contracts/system.contract.js.map +1 -1
  98. package/dist/contracts/usage.contract.d.ts.map +1 -1
  99. package/dist/contracts/usage.contract.js.map +1 -1
  100. package/dist/contracts/vpn.contract.d.ts.map +1 -1
  101. package/dist/contracts/vpn.contract.js +1 -1
  102. package/dist/contracts/vpn.contract.js.map +1 -1
  103. package/dist/contracts/webext.contract.d.ts.map +1 -1
  104. package/dist/contracts/webext.contract.js.map +1 -1
  105. package/dist/contracts/workflows.contract.d.ts +7 -6
  106. package/dist/contracts/workflows.contract.d.ts.map +1 -1
  107. package/dist/contracts/workflows.contract.js +12 -3
  108. package/dist/contracts/workflows.contract.js.map +1 -1
  109. package/dist/contracts/workspace.contract.d.ts.map +1 -1
  110. package/dist/contracts/workspace.contract.js.map +1 -1
  111. package/dist/events/agent-events.d.ts +1237 -0
  112. package/dist/events/agent-events.d.ts.map +1 -0
  113. package/dist/events/agent-events.js +226 -0
  114. package/dist/events/agent-events.js.map +1 -0
  115. package/dist/events/cards.d.ts +404 -0
  116. package/dist/events/cards.d.ts.map +1 -0
  117. package/dist/events/cards.js +179 -0
  118. package/dist/events/cards.js.map +1 -0
  119. package/dist/events/resume.d.ts +23 -0
  120. package/dist/events/resume.d.ts.map +1 -0
  121. package/dist/events/resume.js +31 -0
  122. package/dist/events/resume.js.map +1 -0
  123. package/dist/events/system-events.d.ts +615 -0
  124. package/dist/events/system-events.d.ts.map +1 -0
  125. package/dist/events/system-events.js +64 -0
  126. package/dist/events/system-events.js.map +1 -0
  127. package/dist/events/transcript.d.ts +1755 -0
  128. package/dist/events/transcript.d.ts.map +1 -0
  129. package/dist/events/transcript.js +205 -0
  130. package/dist/events/transcript.js.map +1 -0
  131. package/dist/ids/conversation-ids.d.ts +8 -0
  132. package/dist/ids/conversation-ids.d.ts.map +1 -0
  133. package/dist/{conversation-ids.js → ids/conversation-ids.js} +13 -0
  134. package/dist/ids/conversation-ids.js.map +1 -0
  135. package/dist/ids/hostnames.d.ts.map +1 -0
  136. package/dist/ids/hostnames.js.map +1 -0
  137. package/dist/ids/session-names.d.ts.map +1 -0
  138. package/dist/ids/session-names.js.map +1 -0
  139. package/dist/ids/share-paths.d.ts.map +1 -0
  140. package/dist/ids/share-paths.js.map +1 -0
  141. package/dist/{tunnel-ids.d.ts → ids/tunnel-ids.d.ts} +1 -0
  142. package/dist/ids/tunnel-ids.d.ts.map +1 -0
  143. package/dist/{tunnel-ids.js → ids/tunnel-ids.js} +1 -0
  144. package/dist/ids/tunnel-ids.js.map +1 -0
  145. package/dist/index.d.ts +464 -447
  146. package/dist/index.d.ts.map +1 -1
  147. package/dist/index.js +54 -47
  148. package/dist/index.js.map +1 -1
  149. package/dist/{agent-catalog.d.ts → models/agent-catalog.d.ts} +2 -2
  150. package/dist/models/agent-catalog.d.ts.map +1 -0
  151. package/dist/models/agent-catalog.js.map +1 -0
  152. package/dist/models/agent-runtimes.d.ts.map +1 -0
  153. package/dist/models/agent-runtimes.js.map +1 -0
  154. package/dist/{fast-tier.d.ts → models/fast-tier.d.ts} +1 -1
  155. package/dist/models/fast-tier.d.ts.map +1 -0
  156. package/dist/models/fast-tier.js.map +1 -0
  157. package/dist/models/model-order.d.ts.map +1 -0
  158. package/dist/models/model-order.js.map +1 -0
  159. package/dist/{model-pins.d.ts → models/model-pins.d.ts} +2 -4
  160. package/dist/models/model-pins.d.ts.map +1 -0
  161. package/dist/models/model-pins.js +22 -0
  162. package/dist/models/model-pins.js.map +1 -0
  163. package/dist/{model-roles.d.ts → models/model-roles.d.ts} +25 -30
  164. package/dist/models/model-roles.d.ts.map +1 -0
  165. package/dist/{model-roles.js → models/model-roles.js} +30 -27
  166. package/dist/models/model-roles.js.map +1 -0
  167. package/dist/{plan-pools.d.ts → models/plan-pools.d.ts} +1 -1
  168. package/dist/models/plan-pools.d.ts.map +1 -0
  169. package/dist/models/plan-pools.js.map +1 -0
  170. package/dist/models/prompt-complexity.d.ts.map +1 -0
  171. package/dist/models/prompt-complexity.js.map +1 -0
  172. package/dist/models/provider-specs.d.ts.map +1 -0
  173. package/dist/models/provider-specs.js.map +1 -0
  174. package/dist/policy/approvals-execution.d.ts.map +1 -0
  175. package/dist/policy/approvals-execution.js.map +1 -0
  176. package/dist/{batch-runs.d.ts → policy/batch-runs.d.ts} +5 -1
  177. package/dist/policy/batch-runs.d.ts.map +1 -0
  178. package/dist/{batch-runs.js → policy/batch-runs.js} +10 -7
  179. package/dist/policy/batch-runs.js.map +1 -0
  180. package/dist/policy/capability-env.d.ts.map +1 -0
  181. package/dist/policy/capability-env.js.map +1 -0
  182. package/dist/policy/capability-secrets.d.ts.map +1 -0
  183. package/dist/policy/capability-secrets.js.map +1 -0
  184. package/dist/{card-status.d.ts → policy/card-status.d.ts} +2 -2
  185. package/dist/policy/card-status.d.ts.map +1 -0
  186. package/dist/{card-status.js → policy/card-status.js} +1 -5
  187. package/dist/policy/card-status.js.map +1 -0
  188. package/dist/{command-classes.d.ts → policy/command-classes.d.ts} +6 -2
  189. package/dist/policy/command-classes.d.ts.map +1 -0
  190. package/dist/{command-classes.js → policy/command-classes.js} +48 -11
  191. package/dist/policy/command-classes.js.map +1 -0
  192. package/dist/{command-run.d.ts → policy/command-run.d.ts} +1 -1
  193. package/dist/policy/command-run.d.ts.map +1 -0
  194. package/dist/policy/command-run.js.map +1 -0
  195. package/dist/policy/control-scopes.d.ts +16 -0
  196. package/dist/policy/control-scopes.d.ts.map +1 -0
  197. package/dist/policy/control-scopes.js +26 -0
  198. package/dist/policy/control-scopes.js.map +1 -0
  199. package/dist/policy/credential-material.d.ts.map +1 -0
  200. package/dist/policy/credential-material.js.map +1 -0
  201. package/dist/policy/needs-action.d.ts.map +1 -0
  202. package/dist/policy/needs-action.js.map +1 -0
  203. package/dist/policy/output-fields.d.ts.map +1 -0
  204. package/dist/policy/output-fields.js.map +1 -0
  205. package/dist/policy/overlay-lint.d.ts.map +1 -0
  206. package/dist/policy/overlay-lint.js.map +1 -0
  207. package/dist/policy/owner-ticket.d.ts.map +1 -0
  208. package/dist/{owner-ticket.js → policy/owner-ticket.js} +1 -1
  209. package/dist/policy/owner-ticket.js.map +1 -0
  210. package/dist/{safety-policy.d.ts → policy/safety-policy.d.ts} +6 -5
  211. package/dist/policy/safety-policy.d.ts.map +1 -0
  212. package/dist/{safety-policy.js → policy/safety-policy.js} +12 -12
  213. package/dist/policy/safety-policy.js.map +1 -0
  214. package/dist/policy/search-globs.d.ts.map +1 -0
  215. package/dist/policy/search-globs.js.map +1 -0
  216. package/dist/protocol/container-requirements.d.ts +20 -0
  217. package/dist/protocol/container-requirements.d.ts.map +1 -0
  218. package/dist/protocol/container-requirements.js +23 -0
  219. package/dist/protocol/container-requirements.js.map +1 -0
  220. package/dist/{host-protocol.d.ts → protocol/host-protocol.d.ts} +1 -0
  221. package/dist/protocol/host-protocol.d.ts.map +1 -0
  222. package/dist/{host-protocol.js → protocol/host-protocol.js} +1 -0
  223. package/dist/protocol/host-protocol.js.map +1 -0
  224. package/dist/protocol/ingress-contract.d.ts.map +1 -0
  225. package/dist/{ingress-contract.js → protocol/ingress-contract.js} +1 -1
  226. package/dist/protocol/ingress-contract.js.map +1 -0
  227. package/dist/protocol/ingress-protocol.d.ts.map +1 -0
  228. package/dist/protocol/ingress-protocol.js.map +1 -0
  229. package/dist/protocol/listener-protocol.d.ts.map +1 -0
  230. package/dist/{listener-protocol.js → protocol/listener-protocol.js} +1 -1
  231. package/dist/protocol/listener-protocol.js.map +1 -0
  232. package/dist/{peer-dial.d.ts → protocol/peer-dial.d.ts} +4 -1
  233. package/dist/protocol/peer-dial.d.ts.map +1 -0
  234. package/dist/{peer-dial.js → protocol/peer-dial.js} +51 -10
  235. package/dist/protocol/peer-dial.js.map +1 -0
  236. package/dist/protocol/peer-mcp-server.d.ts.map +1 -0
  237. package/dist/protocol/peer-mcp-server.js.map +1 -0
  238. package/dist/protocol/request-id.d.ts.map +1 -0
  239. package/dist/protocol/request-id.js.map +1 -0
  240. package/dist/protocol/routes.d.ts.map +1 -0
  241. package/dist/protocol/routes.js.map +1 -0
  242. package/dist/{runner-protocol.d.ts → protocol/runner-protocol.d.ts} +1 -0
  243. package/dist/protocol/runner-protocol.d.ts.map +1 -0
  244. package/dist/{runner-protocol.js → protocol/runner-protocol.js} +2 -1
  245. package/dist/protocol/runner-protocol.js.map +1 -0
  246. package/dist/protocol/sse.d.ts.map +1 -0
  247. package/dist/protocol/sse.js.map +1 -0
  248. package/dist/{terminal-protocol.d.ts → protocol/terminal-protocol.d.ts} +1 -3
  249. package/dist/protocol/terminal-protocol.d.ts.map +1 -0
  250. package/dist/protocol/terminal-protocol.js.map +1 -0
  251. package/dist/protocol/webext-links.d.ts.map +1 -0
  252. package/dist/protocol/webext-links.js.map +1 -0
  253. package/dist/{webext-protocol.d.ts → protocol/webext-protocol.d.ts} +1 -0
  254. package/dist/protocol/webext-protocol.d.ts.map +1 -0
  255. package/dist/{webext-protocol.js → protocol/webext-protocol.js} +1 -0
  256. package/dist/protocol/webext-protocol.js.map +1 -0
  257. package/dist/schemas/activity.d.ts +2 -0
  258. package/dist/schemas/activity.d.ts.map +1 -1
  259. package/dist/schemas/activity.js +4 -0
  260. package/dist/schemas/activity.js.map +1 -1
  261. package/dist/schemas/agent.d.ts +17 -4
  262. package/dist/schemas/agent.d.ts.map +1 -1
  263. package/dist/schemas/agent.js +21 -4
  264. package/dist/schemas/agent.js.map +1 -1
  265. package/dist/schemas/agents.d.ts +17 -4
  266. package/dist/schemas/agents.d.ts.map +1 -1
  267. package/dist/schemas/agents.js +15 -4
  268. package/dist/schemas/agents.js.map +1 -1
  269. package/dist/schemas/approvals.d.ts.map +1 -1
  270. package/dist/schemas/approvals.js.map +1 -1
  271. package/dist/schemas/automations.d.ts +54 -28
  272. package/dist/schemas/automations.d.ts.map +1 -1
  273. package/dist/schemas/automations.js +26 -8
  274. package/dist/schemas/automations.js.map +1 -1
  275. package/dist/schemas/capabilities.d.ts +0 -8
  276. package/dist/schemas/capabilities.d.ts.map +1 -1
  277. package/dist/schemas/capabilities.js +0 -4
  278. package/dist/schemas/capabilities.js.map +1 -1
  279. package/dist/schemas/ci.d.ts +10 -0
  280. package/dist/schemas/ci.d.ts.map +1 -1
  281. package/dist/schemas/ci.js +9 -1
  282. package/dist/schemas/ci.js.map +1 -1
  283. package/dist/schemas/codebase-health.d.ts.map +1 -1
  284. package/dist/schemas/codebase-health.js.map +1 -1
  285. package/dist/schemas/devices.d.ts +90 -0
  286. package/dist/schemas/devices.d.ts.map +1 -1
  287. package/dist/schemas/devices.js +10 -1
  288. package/dist/schemas/devices.js.map +1 -1
  289. package/dist/schemas/engines.d.ts.map +1 -1
  290. package/dist/schemas/engines.js.map +1 -1
  291. package/dist/schemas/environment.d.ts.map +1 -1
  292. package/dist/schemas/environment.js.map +1 -1
  293. package/dist/schemas/exit.d.ts.map +1 -1
  294. package/dist/schemas/exit.js.map +1 -1
  295. package/dist/schemas/extension-updates.d.ts.map +1 -1
  296. package/dist/schemas/extension-updates.js.map +1 -1
  297. package/dist/schemas/git-history.d.ts.map +1 -1
  298. package/dist/schemas/git-history.js.map +1 -1
  299. package/dist/schemas/git.d.ts +80 -16
  300. package/dist/schemas/git.d.ts.map +1 -1
  301. package/dist/schemas/git.js +37 -25
  302. package/dist/schemas/git.js.map +1 -1
  303. package/dist/schemas/history.d.ts.map +1 -1
  304. package/dist/schemas/history.js.map +1 -1
  305. package/dist/schemas/hosts.d.ts.map +1 -1
  306. package/dist/schemas/hosts.js.map +1 -1
  307. package/dist/schemas/inventory.d.ts.map +1 -1
  308. package/dist/schemas/inventory.js.map +1 -1
  309. package/dist/schemas/issues.d.ts +0 -1
  310. package/dist/schemas/issues.d.ts.map +1 -1
  311. package/dist/schemas/issues.js +0 -1
  312. package/dist/schemas/issues.js.map +1 -1
  313. package/dist/schemas/logs.d.ts.map +1 -1
  314. package/dist/schemas/logs.js.map +1 -1
  315. package/dist/schemas/loops.d.ts.map +1 -1
  316. package/dist/schemas/loops.js +1 -1
  317. package/dist/schemas/loops.js.map +1 -1
  318. package/dist/schemas/maintenance.d.ts.map +1 -1
  319. package/dist/schemas/maintenance.js.map +1 -1
  320. package/dist/schemas/marketplace.d.ts +0 -4
  321. package/dist/schemas/marketplace.d.ts.map +1 -1
  322. package/dist/schemas/panels.d.ts.map +1 -1
  323. package/dist/schemas/panels.js.map +1 -1
  324. package/dist/schemas/personas.d.ts +49 -4
  325. package/dist/schemas/personas.d.ts.map +1 -1
  326. package/dist/schemas/personas.js +32 -5
  327. package/dist/schemas/personas.js.map +1 -1
  328. package/dist/schemas/plan-limits.d.ts +2 -4
  329. package/dist/schemas/plan-limits.d.ts.map +1 -1
  330. package/dist/schemas/plan-limits.js +5 -8
  331. package/dist/schemas/plan-limits.js.map +1 -1
  332. package/dist/schemas/ports.d.ts.map +1 -1
  333. package/dist/schemas/ports.js.map +1 -1
  334. package/dist/schemas/provider-oauth.d.ts.map +1 -1
  335. package/dist/schemas/provider-oauth.js.map +1 -1
  336. package/dist/schemas/provider-subscriptions.d.ts +1 -1
  337. package/dist/schemas/provider-subscriptions.d.ts.map +1 -1
  338. package/dist/schemas/provider-subscriptions.js +1 -1
  339. package/dist/schemas/provider-subscriptions.js.map +1 -1
  340. package/dist/schemas/public.d.ts.map +1 -1
  341. package/dist/schemas/public.js.map +1 -1
  342. package/dist/schemas/push.d.ts.map +1 -1
  343. package/dist/schemas/push.js.map +1 -1
  344. package/dist/schemas/secrets.d.ts.map +1 -1
  345. package/dist/schemas/secrets.js.map +1 -1
  346. package/dist/schemas/settings.d.ts +7 -5
  347. package/dist/schemas/settings.d.ts.map +1 -1
  348. package/dist/schemas/settings.js +18 -8
  349. package/dist/schemas/settings.js.map +1 -1
  350. package/dist/schemas/share.d.ts.map +1 -1
  351. package/dist/schemas/share.js.map +1 -1
  352. package/dist/schemas/shared.d.ts +4 -0
  353. package/dist/schemas/shared.d.ts.map +1 -1
  354. package/dist/schemas/shared.js +3 -0
  355. package/dist/schemas/shared.js.map +1 -1
  356. package/dist/schemas/system.d.ts +6 -0
  357. package/dist/schemas/system.d.ts.map +1 -1
  358. package/dist/schemas/system.js +10 -0
  359. package/dist/schemas/system.js.map +1 -1
  360. package/dist/schemas/terminal.d.ts.map +1 -1
  361. package/dist/schemas/terminal.js.map +1 -1
  362. package/dist/schemas/usage.d.ts.map +1 -1
  363. package/dist/schemas/usage.js.map +1 -1
  364. package/dist/schemas/vpn.d.ts.map +1 -1
  365. package/dist/schemas/vpn.js.map +1 -1
  366. package/dist/schemas/webext.d.ts.map +1 -1
  367. package/dist/schemas/webext.js.map +1 -1
  368. package/dist/schemas/workflows.d.ts +66 -9
  369. package/dist/schemas/workflows.d.ts.map +1 -1
  370. package/dist/schemas/workflows.js +6 -5
  371. package/dist/schemas/workflows.js.map +1 -1
  372. package/dist/schemas/workspace-repos.d.ts.map +1 -1
  373. package/dist/schemas/workspace-repos.js.map +1 -1
  374. package/dist/schemas/workspace-search.d.ts.map +1 -1
  375. package/dist/schemas/workspace-search.js.map +1 -1
  376. package/dist/schemas/workspace-setup.d.ts.map +1 -1
  377. package/dist/schemas/workspace-setup.js.map +1 -1
  378. package/dist/schemas/workspace-tree.d.ts.map +1 -1
  379. package/dist/schemas/workspace-tree.js.map +1 -1
  380. package/dist/state/arrival.d.ts.map +1 -0
  381. package/dist/{arrival.js → state/arrival.js} +1 -1
  382. package/dist/state/arrival.js.map +1 -0
  383. package/dist/state/contract-lock.d.ts.map +1 -0
  384. package/dist/{contract-lock.js → state/contract-lock.js} +1 -1
  385. package/dist/state/contract-lock.js.map +1 -0
  386. package/dist/{definition.d.ts → state/definition.d.ts} +21 -17
  387. package/dist/state/definition.d.ts.map +1 -0
  388. package/dist/{definition.js → state/definition.js} +4 -4
  389. package/dist/state/definition.js.map +1 -0
  390. package/dist/state/history-state.d.ts.map +1 -0
  391. package/dist/{history-state.js → state/history-state.js} +1 -0
  392. package/dist/state/history-state.js.map +1 -0
  393. package/dist/state/runtime-state.d.ts.map +1 -0
  394. package/dist/state/runtime-state.js.map +1 -0
  395. package/dist/state/starter.d.ts.map +1 -0
  396. package/dist/state/starter.js.map +1 -0
  397. package/dist/state/state-portability.d.ts.map +1 -0
  398. package/dist/state/state-portability.js.map +1 -0
  399. package/dist/state/versions.d.ts.map +1 -0
  400. package/dist/state/versions.js.map +1 -0
  401. package/dist/{workspace-state.d.ts → state/workspace-state.d.ts} +8 -5
  402. package/dist/state/workspace-state.d.ts.map +1 -0
  403. package/dist/{workspace-state.js → state/workspace-state.js} +25 -1
  404. package/dist/state/workspace-state.js.map +1 -0
  405. package/dist/{documents.d.ts → text/documents.d.ts} +1 -1
  406. package/dist/text/documents.d.ts.map +1 -0
  407. package/dist/{documents.js → text/documents.js} +1 -1
  408. package/dist/text/documents.js.map +1 -0
  409. package/dist/text/embed.d.ts.map +1 -0
  410. package/dist/text/embed.js.map +1 -0
  411. package/dist/text/mentions.d.ts.map +1 -0
  412. package/dist/text/mentions.js.map +1 -0
  413. package/dist/text/model-answer.d.ts +3 -0
  414. package/dist/text/model-answer.d.ts.map +1 -0
  415. package/dist/text/model-answer.js +3 -0
  416. package/dist/text/model-answer.js.map +1 -0
  417. package/dist/text/path-refs.d.ts.map +1 -0
  418. package/dist/text/path-refs.js.map +1 -0
  419. package/dist/{shell-regions.d.ts → text/shell-regions.d.ts} +1 -1
  420. package/dist/text/shell-regions.d.ts.map +1 -0
  421. package/dist/text/shell-regions.js.map +1 -0
  422. package/dist/text/title.d.ts.map +1 -0
  423. package/dist/text/title.js.map +1 -0
  424. package/dist/{transcript-fold.d.ts → text/transcript-fold.d.ts} +2 -1
  425. package/dist/text/transcript-fold.d.ts.map +1 -0
  426. package/dist/{transcript-fold.js → text/transcript-fold.js} +2 -16
  427. package/dist/text/transcript-fold.js.map +1 -0
  428. package/dist/text/whisper.d.ts +3 -0
  429. package/dist/text/whisper.d.ts.map +1 -0
  430. package/dist/text/whisper.js +11 -0
  431. package/dist/text/whisper.js.map +1 -0
  432. package/dist/{workflow-faults.d.ts → text/workflow-faults.d.ts} +1 -1
  433. package/dist/text/workflow-faults.d.ts.map +1 -0
  434. package/dist/{workflow-faults.js → text/workflow-faults.js} +1 -1
  435. package/dist/text/workflow-faults.js.map +1 -0
  436. package/package.json +70 -70
  437. package/src/chores/chores.test.ts +4 -10
  438. package/src/chores/chores.ts +148 -392
  439. package/src/chores/digest.ts +8 -28
  440. package/src/chores/extension-update.ts +3 -8
  441. package/src/chores/fix-deps.ts +4 -18
  442. package/src/chores/index.ts +2 -2
  443. package/src/chores/probes.test.ts +7 -43
  444. package/src/chores/probes.ts +62 -167
  445. package/src/chores/prompt.ts +10 -34
  446. package/src/chores/stack.test.ts +6 -45
  447. package/src/chores/stack.ts +27 -118
  448. package/src/chores/verdict.test.ts +101 -80
  449. package/src/chores/verdict.ts +54 -99
  450. package/src/contracts/accounts.contract.ts +4 -19
  451. package/src/contracts/agent.contract.ts +7 -22
  452. package/src/contracts/agents.contract.ts +25 -71
  453. package/src/contracts/automations.contract.ts +14 -30
  454. package/src/contracts/capabilities.contract.ts +8 -35
  455. package/src/contracts/chores.contract.ts +4 -15
  456. package/src/contracts/endpoints.contract.ts +5 -22
  457. package/src/contracts/exit.contract.ts +7 -30
  458. package/src/contracts/extensions.contract.ts +8 -30
  459. package/src/contracts/git.contract.ts +25 -49
  460. package/src/contracts/host.contract.ts +9 -44
  461. package/src/contracts/intentic.contract.ts +1 -1
  462. package/src/contracts/logs.contract.ts +3 -13
  463. package/src/contracts/loops.contract.ts +9 -40
  464. package/src/contracts/personas.contract.ts +22 -30
  465. package/src/contracts/providers.contract.ts +4 -17
  466. package/src/contracts/runner.contract.ts +12 -39
  467. package/src/contracts/safety.contract.ts +5 -14
  468. package/src/contracts/secrets.contract.ts +4 -22
  469. package/src/contracts/sessions.contract.ts +1 -1
  470. package/src/contracts/settings.contract.ts +4 -10
  471. package/src/contracts/share.contract.ts +3 -9
  472. package/src/contracts/skills.contract.ts +4 -15
  473. package/src/contracts/system.contract.ts +26 -52
  474. package/src/contracts/usage.contract.ts +7 -21
  475. package/src/contracts/vpn.contract.ts +9 -16
  476. package/src/contracts/webext.contract.ts +9 -25
  477. package/src/contracts/workflows.contract.ts +34 -58
  478. package/src/contracts/workspace.contract.ts +19 -50
  479. package/src/events/agent-events.ts +345 -0
  480. package/src/events/cards.ts +286 -0
  481. package/src/{events.test.ts → events/resume.test.ts} +4 -19
  482. package/src/events/resume.ts +60 -0
  483. package/src/events/system-events.ts +139 -0
  484. package/src/events/transcript.ts +320 -0
  485. package/src/{conversation-ids.test.ts → ids/conversation-ids.test.ts} +25 -13
  486. package/src/ids/conversation-ids.ts +178 -0
  487. package/src/ids/hostnames.ts +129 -0
  488. package/src/ids/session-names.ts +29 -0
  489. package/src/ids/share-paths.ts +43 -0
  490. package/src/{tunnel-ids.test.ts → ids/tunnel-ids.test.ts} +1 -14
  491. package/src/ids/tunnel-ids.ts +29 -0
  492. package/src/index.ts +71 -88
  493. package/src/{agent-catalog.test.ts → models/agent-catalog.test.ts} +19 -93
  494. package/src/models/agent-catalog.ts +174 -0
  495. package/src/models/agent-runtimes.ts +201 -0
  496. package/src/models/capability-ledger.test.ts +84 -0
  497. package/src/{fast-tier.test.ts → models/fast-tier.test.ts} +7 -18
  498. package/src/models/fast-tier.ts +36 -0
  499. package/src/{model-order.test.ts → models/model-order.test.ts} +19 -40
  500. package/src/models/model-order.ts +163 -0
  501. package/src/models/model-pins.test.ts +87 -0
  502. package/src/models/model-pins.ts +57 -0
  503. package/src/models/model-roles.test.ts +38 -0
  504. package/src/models/model-roles.ts +180 -0
  505. package/src/{plan-pools.test.ts → models/plan-pools.test.ts} +6 -11
  506. package/src/models/plan-pools.ts +65 -0
  507. package/src/{prompt-complexity.test.ts → models/prompt-complexity.test.ts} +8 -60
  508. package/src/models/prompt-complexity.ts +215 -0
  509. package/src/{provider-specs.test.ts → models/provider-specs.test.ts} +18 -47
  510. package/src/models/provider-specs.ts +272 -0
  511. package/src/policy/approvals-execution.ts +58 -0
  512. package/src/{batch-runs.test.ts → policy/batch-runs.test.ts} +4 -20
  513. package/src/policy/batch-runs.ts +137 -0
  514. package/src/policy/capability-secrets.ts +5 -0
  515. package/src/{card-status.ts → policy/card-status.ts} +11 -26
  516. package/src/{command-classes.test.ts → policy/command-classes.test.ts} +11 -118
  517. package/src/policy/command-classes.ts +395 -0
  518. package/src/policy/command-run.ts +65 -0
  519. package/src/policy/control-scopes.ts +38 -0
  520. package/src/{credential-material.test.ts → policy/credential-material.test.ts} +4 -26
  521. package/src/policy/credential-material.ts +91 -0
  522. package/src/policy/needs-action.ts +5 -0
  523. package/src/policy/output-fields.ts +86 -0
  524. package/src/policy/overlay-lint.ts +100 -0
  525. package/src/{owner-ticket.test.ts → policy/owner-ticket.test.ts} +1 -1
  526. package/src/{owner-ticket.ts → policy/owner-ticket.ts} +9 -31
  527. package/src/policy/safety-policy.test.ts +84 -0
  528. package/src/policy/safety-policy.ts +142 -0
  529. package/src/policy/search-globs.ts +60 -0
  530. package/src/protocol/container-requirements.test.ts +72 -0
  531. package/src/protocol/container-requirements.ts +58 -0
  532. package/src/protocol/host-protocol.ts +29 -0
  533. package/src/protocol/ingress-contract.ts +103 -0
  534. package/src/{ingress-protocol.test.ts → protocol/ingress-protocol.test.ts} +25 -90
  535. package/src/protocol/ingress-protocol.ts +441 -0
  536. package/src/protocol/listener-protocol.ts +75 -0
  537. package/src/{peer-dial.test.ts → protocol/peer-dial.test.ts} +52 -1
  538. package/src/protocol/peer-dial.ts +207 -0
  539. package/src/{peer-mcp-server.ts → protocol/peer-mcp-server.ts} +16 -41
  540. package/src/protocol/request-id.ts +5 -0
  541. package/src/{routes.test.ts → protocol/routes.test.ts} +14 -22
  542. package/src/protocol/routes.ts +159 -0
  543. package/src/protocol/runner-protocol.ts +197 -0
  544. package/src/protocol/terminal-protocol.ts +13 -0
  545. package/src/protocol/webext-links.ts +50 -0
  546. package/src/protocol/webext-protocol.ts +24 -0
  547. package/src/schemas/activity.ts +22 -30
  548. package/src/schemas/agent.ts +130 -238
  549. package/src/schemas/agents.ts +165 -483
  550. package/src/schemas/approvals.ts +23 -71
  551. package/src/schemas/automations.ts +145 -249
  552. package/src/schemas/capabilities.ts +127 -414
  553. package/src/schemas/ci.ts +56 -108
  554. package/src/schemas/codebase-health.ts +7 -11
  555. package/src/schemas/devices.ts +98 -321
  556. package/src/schemas/engines.ts +16 -44
  557. package/src/schemas/environment.ts +41 -91
  558. package/src/schemas/exit.ts +24 -81
  559. package/src/schemas/extension-updates.ts +42 -87
  560. package/src/schemas/git-history.ts +30 -84
  561. package/src/schemas/git.ts +141 -256
  562. package/src/schemas/history.ts +14 -40
  563. package/src/schemas/hosts.ts +9 -15
  564. package/src/schemas/inventory.ts +8 -10
  565. package/src/schemas/issues.ts +66 -134
  566. package/src/schemas/logs.ts +15 -34
  567. package/src/schemas/loops.ts +46 -163
  568. package/src/schemas/maintenance.ts +47 -172
  569. package/src/schemas/panels.ts +20 -45
  570. package/src/schemas/personas.ts +85 -168
  571. package/src/schemas/plan-limits.ts +58 -197
  572. package/src/schemas/ports.ts +14 -32
  573. package/src/schemas/provider-oauth.ts +23 -76
  574. package/src/schemas/provider-subscriptions.ts +4 -13
  575. package/src/schemas/public.ts +4 -15
  576. package/src/schemas/push.ts +8 -36
  577. package/src/schemas/secrets.ts +20 -64
  578. package/src/schemas/settings.ts +177 -597
  579. package/src/schemas/share.ts +14 -32
  580. package/src/schemas/shared.ts +14 -13
  581. package/src/schemas/system.ts +46 -78
  582. package/src/schemas/terminal.ts +41 -120
  583. package/src/schemas/usage.ts +44 -233
  584. package/src/schemas/version-seam.test.ts +9 -26
  585. package/src/schemas/vpn.ts +27 -64
  586. package/src/schemas/webext.ts +22 -53
  587. package/src/schemas/workflows.ts +57 -183
  588. package/src/schemas/workspace-repos.ts +12 -24
  589. package/src/schemas/workspace-search.ts +17 -35
  590. package/src/schemas/workspace-setup.ts +4 -11
  591. package/src/schemas/workspace-tree.ts +32 -91
  592. package/src/state/arrival.ts +109 -0
  593. package/src/state/contract-lock.test.ts +17 -0
  594. package/src/state/contract-lock.ts +49 -0
  595. package/src/state/definition.ts +143 -0
  596. package/src/state/history-state.ts +103 -0
  597. package/src/{runtime-state.test.ts → state/runtime-state.test.ts} +3 -10
  598. package/src/state/runtime-state.ts +62 -0
  599. package/src/state/starter.ts +5 -0
  600. package/src/state/state-portability.ts +27 -0
  601. package/src/state/versions.ts +26 -0
  602. package/src/{workspace-state.test.ts → state/workspace-state.test.ts} +65 -173
  603. package/src/state/workspace-state.ts +669 -0
  604. package/src/{documents.test.ts → text/documents.test.ts} +1 -1
  605. package/src/text/documents.ts +42 -0
  606. package/src/text/embed.ts +132 -0
  607. package/src/text/mentions.ts +21 -0
  608. package/src/text/model-answer.ts +9 -0
  609. package/src/text/path-refs.ts +39 -0
  610. package/src/text/shell-regions.ts +224 -0
  611. package/src/{title.test.ts → text/title.test.ts} +13 -32
  612. package/src/text/title.ts +202 -0
  613. package/src/{transcript-fold.test.ts → text/transcript-fold.test.ts} +5 -83
  614. package/src/{transcript-fold.ts → text/transcript-fold.ts} +65 -170
  615. package/src/text/whisper.test.ts +19 -0
  616. package/src/text/whisper.ts +17 -0
  617. package/src/{workflow-faults.test.ts → text/workflow-faults.test.ts} +6 -24
  618. package/src/{workflow-faults.ts → text/workflow-faults.ts} +20 -60
  619. package/dist/agent-catalog.d.ts.map +0 -1
  620. package/dist/agent-catalog.js.map +0 -1
  621. package/dist/agent-runtimes.d.ts.map +0 -1
  622. package/dist/agent-runtimes.js.map +0 -1
  623. package/dist/approvals-execution.d.ts.map +0 -1
  624. package/dist/approvals-execution.js.map +0 -1
  625. package/dist/arrival.d.ts.map +0 -1
  626. package/dist/arrival.js.map +0 -1
  627. package/dist/batch-runs.d.ts.map +0 -1
  628. package/dist/batch-runs.js.map +0 -1
  629. package/dist/capability-env.d.ts.map +0 -1
  630. package/dist/capability-env.js.map +0 -1
  631. package/dist/capability-secrets.d.ts.map +0 -1
  632. package/dist/capability-secrets.js.map +0 -1
  633. package/dist/card-status.d.ts.map +0 -1
  634. package/dist/card-status.js.map +0 -1
  635. package/dist/command-classes.d.ts.map +0 -1
  636. package/dist/command-classes.js.map +0 -1
  637. package/dist/command-run.d.ts.map +0 -1
  638. package/dist/command-run.js.map +0 -1
  639. package/dist/contract-lock.d.ts.map +0 -1
  640. package/dist/contract-lock.js.map +0 -1
  641. package/dist/conversation-ids.d.ts +0 -4
  642. package/dist/conversation-ids.d.ts.map +0 -1
  643. package/dist/conversation-ids.js.map +0 -1
  644. package/dist/credential-material.d.ts.map +0 -1
  645. package/dist/credential-material.js.map +0 -1
  646. package/dist/definition.d.ts.map +0 -1
  647. package/dist/definition.js.map +0 -1
  648. package/dist/documents.d.ts.map +0 -1
  649. package/dist/documents.js.map +0 -1
  650. package/dist/embed.d.ts.map +0 -1
  651. package/dist/embed.js.map +0 -1
  652. package/dist/events.d.ts +0 -4336
  653. package/dist/events.d.ts.map +0 -1
  654. package/dist/events.js +0 -725
  655. package/dist/events.js.map +0 -1
  656. package/dist/fast-tier.d.ts.map +0 -1
  657. package/dist/fast-tier.js.map +0 -1
  658. package/dist/history-state.d.ts.map +0 -1
  659. package/dist/history-state.js.map +0 -1
  660. package/dist/host-protocol.d.ts.map +0 -1
  661. package/dist/host-protocol.js.map +0 -1
  662. package/dist/hostnames.d.ts.map +0 -1
  663. package/dist/hostnames.js.map +0 -1
  664. package/dist/ingress-contract.d.ts.map +0 -1
  665. package/dist/ingress-contract.js.map +0 -1
  666. package/dist/ingress-protocol.d.ts.map +0 -1
  667. package/dist/ingress-protocol.js.map +0 -1
  668. package/dist/listener-protocol.d.ts.map +0 -1
  669. package/dist/listener-protocol.js.map +0 -1
  670. package/dist/mentions.d.ts.map +0 -1
  671. package/dist/mentions.js.map +0 -1
  672. package/dist/model-order.d.ts.map +0 -1
  673. package/dist/model-order.js.map +0 -1
  674. package/dist/model-pins.d.ts.map +0 -1
  675. package/dist/model-pins.js +0 -45
  676. package/dist/model-pins.js.map +0 -1
  677. package/dist/model-roles.d.ts.map +0 -1
  678. package/dist/model-roles.js.map +0 -1
  679. package/dist/needs-action.d.ts.map +0 -1
  680. package/dist/needs-action.js.map +0 -1
  681. package/dist/output-fields.d.ts.map +0 -1
  682. package/dist/output-fields.js.map +0 -1
  683. package/dist/overlay-lint.d.ts.map +0 -1
  684. package/dist/overlay-lint.js.map +0 -1
  685. package/dist/owner-ticket.d.ts.map +0 -1
  686. package/dist/owner-ticket.js.map +0 -1
  687. package/dist/path-refs.d.ts.map +0 -1
  688. package/dist/path-refs.js.map +0 -1
  689. package/dist/peer-dial.d.ts.map +0 -1
  690. package/dist/peer-dial.js.map +0 -1
  691. package/dist/peer-mcp-server.d.ts.map +0 -1
  692. package/dist/peer-mcp-server.js.map +0 -1
  693. package/dist/plan-pools.d.ts.map +0 -1
  694. package/dist/plan-pools.js.map +0 -1
  695. package/dist/prompt-complexity.d.ts.map +0 -1
  696. package/dist/prompt-complexity.js.map +0 -1
  697. package/dist/provider-specs.d.ts.map +0 -1
  698. package/dist/provider-specs.js.map +0 -1
  699. package/dist/request-id.d.ts.map +0 -1
  700. package/dist/request-id.js.map +0 -1
  701. package/dist/routes.d.ts.map +0 -1
  702. package/dist/routes.js.map +0 -1
  703. package/dist/runner-protocol.d.ts.map +0 -1
  704. package/dist/runner-protocol.js.map +0 -1
  705. package/dist/runtime-state.d.ts.map +0 -1
  706. package/dist/runtime-state.js.map +0 -1
  707. package/dist/safety-policy.d.ts.map +0 -1
  708. package/dist/safety-policy.js.map +0 -1
  709. package/dist/schemas/context.d.ts +0 -30
  710. package/dist/schemas/context.d.ts.map +0 -1
  711. package/dist/schemas/context.js +0 -34
  712. package/dist/schemas/context.js.map +0 -1
  713. package/dist/search-globs.d.ts.map +0 -1
  714. package/dist/search-globs.js.map +0 -1
  715. package/dist/session-names.d.ts.map +0 -1
  716. package/dist/session-names.js.map +0 -1
  717. package/dist/share-paths.d.ts.map +0 -1
  718. package/dist/share-paths.js.map +0 -1
  719. package/dist/shell-regions.d.ts.map +0 -1
  720. package/dist/shell-regions.js.map +0 -1
  721. package/dist/sse.d.ts.map +0 -1
  722. package/dist/sse.js.map +0 -1
  723. package/dist/starter.d.ts.map +0 -1
  724. package/dist/starter.js.map +0 -1
  725. package/dist/state-portability.d.ts.map +0 -1
  726. package/dist/state-portability.js.map +0 -1
  727. package/dist/terminal-protocol.d.ts.map +0 -1
  728. package/dist/terminal-protocol.js.map +0 -1
  729. package/dist/title.d.ts.map +0 -1
  730. package/dist/title.js.map +0 -1
  731. package/dist/transcript-fold.d.ts.map +0 -1
  732. package/dist/transcript-fold.js.map +0 -1
  733. package/dist/tunnel-ids.d.ts.map +0 -1
  734. package/dist/tunnel-ids.js.map +0 -1
  735. package/dist/versions.d.ts.map +0 -1
  736. package/dist/versions.js.map +0 -1
  737. package/dist/webext-links.d.ts.map +0 -1
  738. package/dist/webext-links.js.map +0 -1
  739. package/dist/webext-protocol.d.ts.map +0 -1
  740. package/dist/webext-protocol.js.map +0 -1
  741. package/dist/workflow-faults.d.ts.map +0 -1
  742. package/dist/workflow-faults.js.map +0 -1
  743. package/dist/workspace-state.d.ts.map +0 -1
  744. package/dist/workspace-state.js.map +0 -1
  745. package/src/agent-catalog.ts +0 -316
  746. package/src/agent-runtimes.ts +0 -419
  747. package/src/approvals-execution.ts +0 -96
  748. package/src/arrival.ts +0 -160
  749. package/src/batch-runs.ts +0 -188
  750. package/src/capability-ledger.test.ts +0 -140
  751. package/src/capability-secrets.ts +0 -20
  752. package/src/command-classes.ts +0 -617
  753. package/src/command-run.ts +0 -78
  754. package/src/contract-lock.test.ts +0 -23
  755. package/src/contract-lock.ts +0 -66
  756. package/src/conversation-ids.ts +0 -207
  757. package/src/credential-material.ts +0 -181
  758. package/src/definition.ts +0 -207
  759. package/src/documents.ts +0 -67
  760. package/src/embed.ts +0 -164
  761. package/src/events.ts +0 -1870
  762. package/src/fast-tier.ts +0 -72
  763. package/src/history-state.ts +0 -174
  764. package/src/host-protocol.ts +0 -36
  765. package/src/hostnames.ts +0 -180
  766. package/src/ingress-contract.ts +0 -157
  767. package/src/ingress-protocol.ts +0 -625
  768. package/src/listener-protocol.ts +0 -96
  769. package/src/mentions.ts +0 -25
  770. package/src/model-order.ts +0 -262
  771. package/src/model-pins.test.ts +0 -202
  772. package/src/model-pins.ts +0 -183
  773. package/src/model-roles.ts +0 -224
  774. package/src/needs-action.ts +0 -14
  775. package/src/output-fields.ts +0 -111
  776. package/src/overlay-lint.ts +0 -116
  777. package/src/path-refs.ts +0 -59
  778. package/src/peer-dial.ts +0 -163
  779. package/src/plan-pools.ts +0 -92
  780. package/src/prompt-complexity.ts +0 -334
  781. package/src/provider-specs.ts +0 -432
  782. package/src/request-id.ts +0 -41
  783. package/src/routes.ts +0 -219
  784. package/src/runner-protocol.ts +0 -239
  785. package/src/runtime-state.ts +0 -140
  786. package/src/safety-policy.test.ts +0 -88
  787. package/src/safety-policy.ts +0 -258
  788. package/src/schemas/context.ts +0 -87
  789. package/src/search-globs.ts +0 -76
  790. package/src/session-names.ts +0 -44
  791. package/src/share-paths.ts +0 -68
  792. package/src/shell-regions.ts +0 -289
  793. package/src/starter.ts +0 -13
  794. package/src/state-portability.ts +0 -56
  795. package/src/terminal-protocol.ts +0 -16
  796. package/src/title.ts +0 -267
  797. package/src/tunnel-ids.ts +0 -57
  798. package/src/versions.ts +0 -48
  799. package/src/webext-links.ts +0 -90
  800. package/src/webext-protocol.ts +0 -27
  801. package/src/workspace-state.ts +0 -1096
  802. /package/dist/{hostnames.d.ts → ids/hostnames.d.ts} +0 -0
  803. /package/dist/{hostnames.js → ids/hostnames.js} +0 -0
  804. /package/dist/{session-names.d.ts → ids/session-names.d.ts} +0 -0
  805. /package/dist/{session-names.js → ids/session-names.js} +0 -0
  806. /package/dist/{share-paths.d.ts → ids/share-paths.d.ts} +0 -0
  807. /package/dist/{share-paths.js → ids/share-paths.js} +0 -0
  808. /package/dist/{agent-catalog.js → models/agent-catalog.js} +0 -0
  809. /package/dist/{agent-runtimes.d.ts → models/agent-runtimes.d.ts} +0 -0
  810. /package/dist/{agent-runtimes.js → models/agent-runtimes.js} +0 -0
  811. /package/dist/{fast-tier.js → models/fast-tier.js} +0 -0
  812. /package/dist/{model-order.d.ts → models/model-order.d.ts} +0 -0
  813. /package/dist/{model-order.js → models/model-order.js} +0 -0
  814. /package/dist/{plan-pools.js → models/plan-pools.js} +0 -0
  815. /package/dist/{prompt-complexity.d.ts → models/prompt-complexity.d.ts} +0 -0
  816. /package/dist/{prompt-complexity.js → models/prompt-complexity.js} +0 -0
  817. /package/dist/{provider-specs.d.ts → models/provider-specs.d.ts} +0 -0
  818. /package/dist/{provider-specs.js → models/provider-specs.js} +0 -0
  819. /package/dist/{approvals-execution.d.ts → policy/approvals-execution.d.ts} +0 -0
  820. /package/dist/{approvals-execution.js → policy/approvals-execution.js} +0 -0
  821. /package/dist/{capability-env.d.ts → policy/capability-env.d.ts} +0 -0
  822. /package/dist/{capability-env.js → policy/capability-env.js} +0 -0
  823. /package/dist/{capability-secrets.d.ts → policy/capability-secrets.d.ts} +0 -0
  824. /package/dist/{capability-secrets.js → policy/capability-secrets.js} +0 -0
  825. /package/dist/{command-run.js → policy/command-run.js} +0 -0
  826. /package/dist/{credential-material.d.ts → policy/credential-material.d.ts} +0 -0
  827. /package/dist/{credential-material.js → policy/credential-material.js} +0 -0
  828. /package/dist/{needs-action.d.ts → policy/needs-action.d.ts} +0 -0
  829. /package/dist/{needs-action.js → policy/needs-action.js} +0 -0
  830. /package/dist/{output-fields.d.ts → policy/output-fields.d.ts} +0 -0
  831. /package/dist/{output-fields.js → policy/output-fields.js} +0 -0
  832. /package/dist/{overlay-lint.d.ts → policy/overlay-lint.d.ts} +0 -0
  833. /package/dist/{overlay-lint.js → policy/overlay-lint.js} +0 -0
  834. /package/dist/{owner-ticket.d.ts → policy/owner-ticket.d.ts} +0 -0
  835. /package/dist/{search-globs.d.ts → policy/search-globs.d.ts} +0 -0
  836. /package/dist/{search-globs.js → policy/search-globs.js} +0 -0
  837. /package/dist/{ingress-contract.d.ts → protocol/ingress-contract.d.ts} +0 -0
  838. /package/dist/{ingress-protocol.d.ts → protocol/ingress-protocol.d.ts} +0 -0
  839. /package/dist/{ingress-protocol.js → protocol/ingress-protocol.js} +0 -0
  840. /package/dist/{listener-protocol.d.ts → protocol/listener-protocol.d.ts} +0 -0
  841. /package/dist/{peer-mcp-server.d.ts → protocol/peer-mcp-server.d.ts} +0 -0
  842. /package/dist/{peer-mcp-server.js → protocol/peer-mcp-server.js} +0 -0
  843. /package/dist/{request-id.d.ts → protocol/request-id.d.ts} +0 -0
  844. /package/dist/{request-id.js → protocol/request-id.js} +0 -0
  845. /package/dist/{routes.d.ts → protocol/routes.d.ts} +0 -0
  846. /package/dist/{routes.js → protocol/routes.js} +0 -0
  847. /package/dist/{sse.d.ts → protocol/sse.d.ts} +0 -0
  848. /package/dist/{sse.js → protocol/sse.js} +0 -0
  849. /package/dist/{terminal-protocol.js → protocol/terminal-protocol.js} +0 -0
  850. /package/dist/{webext-links.d.ts → protocol/webext-links.d.ts} +0 -0
  851. /package/dist/{webext-links.js → protocol/webext-links.js} +0 -0
  852. /package/dist/{arrival.d.ts → state/arrival.d.ts} +0 -0
  853. /package/dist/{contract-lock.d.ts → state/contract-lock.d.ts} +0 -0
  854. /package/dist/{history-state.d.ts → state/history-state.d.ts} +0 -0
  855. /package/dist/{runtime-state.d.ts → state/runtime-state.d.ts} +0 -0
  856. /package/dist/{runtime-state.js → state/runtime-state.js} +0 -0
  857. /package/dist/{starter.d.ts → state/starter.d.ts} +0 -0
  858. /package/dist/{starter.js → state/starter.js} +0 -0
  859. /package/dist/{state-portability.d.ts → state/state-portability.d.ts} +0 -0
  860. /package/dist/{state-portability.js → state/state-portability.js} +0 -0
  861. /package/dist/{versions.d.ts → state/versions.d.ts} +0 -0
  862. /package/dist/{versions.js → state/versions.js} +0 -0
  863. /package/dist/{embed.d.ts → text/embed.d.ts} +0 -0
  864. /package/dist/{embed.js → text/embed.js} +0 -0
  865. /package/dist/{mentions.d.ts → text/mentions.d.ts} +0 -0
  866. /package/dist/{mentions.js → text/mentions.js} +0 -0
  867. /package/dist/{path-refs.d.ts → text/path-refs.d.ts} +0 -0
  868. /package/dist/{path-refs.js → text/path-refs.js} +0 -0
  869. /package/dist/{shell-regions.js → text/shell-regions.js} +0 -0
  870. /package/dist/{title.d.ts → text/title.d.ts} +0 -0
  871. /package/dist/{title.js → text/title.js} +0 -0
  872. /package/src/{hostnames.test.ts → ids/hostnames.test.ts} +0 -0
  873. /package/src/{share-paths.test.ts → ids/share-paths.test.ts} +0 -0
  874. /package/src/{capability-env.ts → policy/capability-env.ts} +0 -0
  875. /package/src/{overlay-lint.test.ts → policy/overlay-lint.test.ts} +0 -0
  876. /package/src/{search-globs.test.ts → policy/search-globs.test.ts} +0 -0
  877. /package/src/{ingress-contract.test.ts → protocol/ingress-contract.test.ts} +0 -0
  878. /package/src/{peer-mcp-server.test.ts → protocol/peer-mcp-server.test.ts} +0 -0
  879. /package/src/{sse.ts → protocol/sse.ts} +0 -0
  880. /package/src/{versions.test.ts → state/versions.test.ts} +0 -0
  881. /package/src/{embed.test.ts → text/embed.test.ts} +0 -0
  882. /package/src/{mentions.test.ts → text/mentions.test.ts} +0 -0
  883. /package/src/{path-refs.test.ts → text/path-refs.test.ts} +0 -0
@@ -0,0 +1,163 @@
1
+ // Orders a model catalog the same way for every provider, since only Anthropic's /v1/models returns one worth keeping.
2
+ // Every other provider hands back a set in registry order, so this file derives an order instead, from the two facts an
3
+ // id reliably carries: tier (the adjective) and release (the numbers).
4
+
5
+ // A version-ish segment: digits/dots, optionally prefixed by v or k (`5.1`, `k3`); anything else is a name.
6
+ const VERSION_SEGMENT = /^(?:v|k)?[\d.]+$/i;
7
+
8
+ // A date stamp, not a version component: 6+ digits; conflating the two misorders a dated build's compare.
9
+ const DATE_SEGMENT = /^\d{6,}$/;
10
+
11
+ const segmentsOf = (id: string): string[] => id.split(/[-_]/);
12
+
13
+ // A model's family: its id with every version-ish segment dropped, so claude-opus-5 and claude-opus-4-8 land together.
14
+ // Derived, never listed.
15
+ export const familyOf = (id: string): string => {
16
+ const stem = segmentsOf(id)
17
+ .filter((segment) => !VERSION_SEGMENT.test(segment))
18
+ .join("-");
19
+ // An all-numeric id, or an ACP row's empty one, has no stem: it stands as its own family.
20
+ return stem === "" ? id : stem;
21
+ };
22
+
23
+ export interface ModelRelease {
24
+ // Version components in id order; empty for an unversioned id, which then reads as the oldest of its tier.
25
+ readonly version: readonly number[];
26
+ // The id's date stamp, 0 for none: the tiebreak between two builds of the same version.
27
+ readonly date: number;
28
+ }
29
+
30
+ export const releaseOf = (id: string): ModelRelease => {
31
+ const numeric = segmentsOf(id)
32
+ .filter((segment) => VERSION_SEGMENT.test(segment))
33
+ .map((segment) => segment.replace(/^[vk]/i, ""));
34
+ const stamps = numeric.filter((segment) => DATE_SEGMENT.test(segment)).map(Number);
35
+ return {
36
+ version: numeric
37
+ .filter((segment) => !DATE_SEGMENT.test(segment))
38
+ .flatMap((segment) => segment.split(".").map(Number))
39
+ .filter((component) => Number.isFinite(component)),
40
+ date: Math.max(0, ...stamps),
41
+ };
42
+ };
43
+
44
+ // Newest first. A missing component reads as -1, so gpt-5 sorts under gpt-5.1; the date stamp breaks the rest.
45
+ const compareRelease = (left: ModelRelease, right: ModelRelease): number => {
46
+ for (let index = 0; index < Math.max(left.version.length, right.version.length); index += 1) {
47
+ const diff = (right.version[index] ?? -1) - (left.version[index] ?? -1);
48
+ if (diff !== 0) {
49
+ return diff;
50
+ }
51
+ }
52
+ return right.date - left.date;
53
+ };
54
+
55
+ // Unranked families lead, not sink: an id with no tier word is likelier a new flagship than a budget model.
56
+ const TIER_RANK: Readonly<Record<string, number>> = {
57
+ // Frontier: the tier a vendor ships last and charges most for.
58
+ opus: 0,
59
+ fable: 0,
60
+ pro: 0,
61
+ max: 0,
62
+ ultra: 0,
63
+ heavy: 0,
64
+ // Everyday: the workhorse a step below the frontier.
65
+ sonnet: 1,
66
+ flash: 1,
67
+ mini: 1,
68
+ // Efficient: the cheap/fast end, the rung that costs less than the one above it.
69
+ haiku: 2,
70
+ // An open-weights model re-served beside a vendor's line (gpt-oss on Google's) is this rung by construction.
71
+ oss: 2,
72
+ lite: 2,
73
+ nano: 2,
74
+ fast: 2,
75
+ small: 2,
76
+ };
77
+
78
+ const UNRANKED = -1;
79
+
80
+ // A release-local ladder (Codex 5.6 sol>terra>luna), kept separate so cross-release recency still outranks it.
81
+ const RELEASE_TIER_RANK: Readonly<Record<string, number>> = {
82
+ sol: 0,
83
+ terra: 1,
84
+ luna: 2,
85
+ };
86
+
87
+ const lastRankOf = (family: string, ranks: Readonly<Record<string, number>>): number => {
88
+ let rank = UNRANKED;
89
+ for (const segment of family.split("-")) {
90
+ const found = ranks[segment];
91
+ if (found !== undefined) {
92
+ rank = found;
93
+ }
94
+ }
95
+ return rank;
96
+ };
97
+
98
+ const releaseTierRankOf = (family: string): number => lastRankOf(family, RELEASE_TIER_RANK);
99
+
100
+ // How hard an id says it will think; ties on tier, so only compareCheapestFirst's tiebreak may read it.
101
+ const THINKING_RANK: Readonly<Record<string, number>> = {
102
+ minimal: 0,
103
+ none: 0,
104
+ low: 1,
105
+ medium: 3,
106
+ high: 4,
107
+ max: 4,
108
+ // A switch, not a level: vending `kimi-k2` beside `kimi-k2-thinking` names the same model, reasoning turned on.
109
+ thinking: 4,
110
+ };
111
+
112
+ // An id naming no level sits between both ends, the provider's default, not the cheapest or dearest reading.
113
+ const UNSTATED_THINKING = 2;
114
+
115
+ const thinkingRankOf = (family: string): number => {
116
+ const rank = lastRankOf(family, THINKING_RANK);
117
+ return rank === UNRANKED ? UNSTATED_THINKING : rank;
118
+ };
119
+
120
+ // The last recognized word wins: gemini-flash-lite is Flash's cheap end, gpt-codex-max is Codex's frontier end.
121
+ export const tierRankOf = (family: string): number => lastRankOf(family, TIER_RANK);
122
+
123
+ // The canonical order of two ids: tier first, then release, then a release-local tier. Stable under Array#toSorted, so
124
+ // ids this rule cannot separate keep their arrival order.
125
+ export const compareModelIds = (left: string, right: string): number => {
126
+ const leftFamily = familyOf(left);
127
+ const rightFamily = familyOf(right);
128
+ return (
129
+ tierRankOf(leftFamily) - tierRankOf(rightFamily) ||
130
+ compareRelease(releaseOf(left), releaseOf(right)) ||
131
+ releaseTierRankOf(leftFamily) - releaseTierRankOf(rightFamily)
132
+ );
133
+ };
134
+
135
+ // The order for a catalog its endpoint published as an unordered set (everything but Anthropic). Ties break on id, not
136
+ // arrival order, since a registry can reorder a tied set between refreshes.
137
+ export const compareUnrankedModelIds = (left: string, right: string): number => compareModelIds(left, right) || left.localeCompare(right);
138
+
139
+ // The same tier scale read from the weakest end, for the caller that wants the cheapest model, not the strongest. An
140
+ // unranked family still sinks last on both orders; a tier-less catalog (Kimi) falls back to its newest release.
141
+ export const compareCheapestFirst = (left: string, right: string): number => {
142
+ const leftFamily = familyOf(left);
143
+ const rightFamily = familyOf(right);
144
+ return (
145
+ tierRankOf(rightFamily) - tierRankOf(leftFamily) ||
146
+ // Before release: two rows differing only by thinking are the same model; recency must not pick between them.
147
+ thinkingRankOf(leftFamily) - thinkingRankOf(rightFamily) ||
148
+ compareRelease(releaseOf(left), releaseOf(right)) ||
149
+ releaseTierRankOf(rightFamily) - releaseTierRankOf(leftFamily)
150
+ );
151
+ };
152
+
153
+ // Tier only, not release or thinking level, so a downgrade stays legible as one. An unranked family is false on either
154
+ // side: an unranked candidate might be the next flagship, and an unranked pick's tier is unknown to have been beaten.
155
+ export const isCheaperRung = (candidate: string, pick: string): boolean => {
156
+ const candidateRank = tierRankOf(familyOf(candidate));
157
+ const pickRank = tierRankOf(familyOf(pick));
158
+ return candidateRank !== UNRANKED && pickRank !== UNRANKED && candidateRank > pickRank;
159
+ };
160
+
161
+ // True only for an id that spells out a level above the quiet end, so an unannotated id is never accused of it.
162
+ // Exported so a settings row can label a pinned thinking variant.
163
+ export const namesThinking = (id: string): boolean => thinkingRankOf(familyOf(id)) > UNSTATED_THINKING;
@@ -0,0 +1,87 @@
1
+ import { expect, test } from "vitest";
2
+ import { type ModelSource, modelPinKey, parsePinned, readyChain } from "./model-pins.js";
3
+ import type { ModelPin } from "../schemas/agent.js";
4
+
5
+ // Which models a job spends, and in what order: the owner's own list decides, nothing is derived for an empty one, and
6
+ // there is a fallback rung whenever one is written.
7
+
8
+ // A pin as settings rows store one; tests focus on order, so most entries carry just provider:model.
9
+ const pin = (key: string): ModelPin => {
10
+ const at = key.indexOf(`:`);
11
+ return { provider: key.slice(0, at), model: key.slice(at + 1) };
12
+ };
13
+
14
+ // Catalogs as providers publish them; the resolver never reads them, so a wrong fixture would hide it.
15
+ const CLAUDE: ModelSource = { provider: `claude`, ready: true, models: [`claude-opus-5`, `claude-sonnet-5`, `claude-haiku-4-5-20251001`] };
16
+ const GOOGLE: ModelSource = { provider: `gemini`, ready: true, models: [`gemini-3-flash`, `gemini-3-flash-lite`, `gemini-3-pro`] };
17
+ const CODEX: ModelSource = { provider: `codex`, ready: true, models: [`gpt-5.4-mini`, `gpt-5.6`] };
18
+ const KIMI: ModelSource = { provider: `kimi`, ready: true, models: [`kimi-k2.6`, `kimi-k2.7-code`, `kimi-k3`] };
19
+
20
+ const offline = (source: ModelSource): ModelSource => ({ ...source, ready: false });
21
+
22
+ // The model that answers when nothing goes wrong: the head of the chain, what every surface reads.
23
+ const head = (sources: readonly ModelSource[], pinned: readonly string[]): ModelPin | undefined => readyChain(sources, pinned.map(pin))[0];
24
+
25
+ test("honours a pinned model verbatim, including an id no catalog lists yet", () => {
26
+ expect(head([CLAUDE, GOOGLE], [`claude:claude-opus-5`])).toEqual({ provider: `claude`, model: `claude-opus-5` });
27
+ // The picker's custom-id escape hatch reaches here too: a lagging catalog still must run the exact id named.
28
+ expect(head([CLAUDE], [`claude:claude-haiku-9`])).toEqual({ provider: `claude`, model: `claude-haiku-9` });
29
+ });
30
+
31
+ test("refuses a malformed key rather than reading half a pin out of it", () => {
32
+ for (const key of [`claude`, `claude:`, `:claude-haiku-4-5`, ` `]) {
33
+ expect(parsePinned(key)).toBeUndefined();
34
+ }
35
+ expect(parsePinned(`claude:claude-haiku-4-5`)).toEqual({ provider: `claude`, model: `claude-haiku-4-5` });
36
+ });
37
+
38
+ test("resolves an unset job to nothing, however many accounts are connected", () => {
39
+ expect(readyChain([CLAUDE, GOOGLE, KIMI], [])).toEqual([]);
40
+ expect(head([CLAUDE, GOOGLE], [])).toBeUndefined();
41
+ });
42
+
43
+ test("carries an entry's run settings through untouched", () => {
44
+ const configured: ModelPin = { provider: `claude`, model: `claude-opus-5`, effort: `max`, thinking: true, harness: `claude-code` };
45
+
46
+ expect(readyChain([CLAUDE], [configured])).toEqual([configured]);
47
+ });
48
+
49
+ test("reports nothing when the accounts a job named have all gone", () => {
50
+ expect(head([offline(CLAUDE), GOOGLE], [`claude:claude-haiku-4-5-20251001`])).toBeUndefined();
51
+ expect(head([], [`claude:claude-haiku-4-5`])).toBeUndefined();
52
+ });
53
+
54
+ test("keeps the pinned models in the order they were written", () => {
55
+ expect(readyChain([CLAUDE, GOOGLE, CODEX], [`codex:gpt-5.6`, `gemini:gemini-3-flash`, `claude:claude-haiku-4-5-20251001`].map(pin))).toEqual([
56
+ { provider: `codex`, model: `gpt-5.6` },
57
+ { provider: `gemini`, model: `gemini-3-flash` },
58
+ { provider: `claude`, model: `claude-haiku-4-5-20251001` },
59
+ ]);
60
+ });
61
+
62
+ test("drops a pin whose provider went away and keeps the rest of the order intact", () => {
63
+ expect(readyChain([CLAUDE, offline(GOOGLE), CODEX], [`codex:gpt-5.6`, `gemini:gemini-3-flash`, `claude:claude-haiku-4-5`].map(pin))).toEqual([
64
+ { provider: `codex`, model: `gpt-5.6` },
65
+ { provider: `claude`, model: `claude-haiku-4-5` },
66
+ ]);
67
+ });
68
+
69
+ test("stops at the end of a pinned list rather than reaching for an account the user left out", () => {
70
+ expect(readyChain([CLAUDE, GOOGLE, KIMI], [`claude:claude-haiku-4-5`].map(pin))).toEqual([{ provider: `claude`, model: `claude-haiku-4-5` }]);
71
+ });
72
+
73
+ test("names each model once, however many times the list repeats it", () => {
74
+ // A duplicate pin is a real state (hand-edited lists, one entry reused across jobs), not a bug to collapse.
75
+ expect(readyChain([CLAUDE], [`claude:claude-haiku-4-5`, `claude:claude-haiku-4-5`].map(pin))).toEqual([
76
+ { provider: `claude`, model: `claude-haiku-4-5` },
77
+ ]);
78
+ });
79
+
80
+ // A configured endpoint is a provider like any other here: its picker options come from the same catalog.
81
+ const OLLAMA: ModelSource = { provider: `endpoint/ollama`, ready: true, models: [`qwen3-coder`, `gemma3-27b`] };
82
+
83
+ test("honours a pin on a configured endpoint: the whole id, not the half before its slash", () => {
84
+ expect(head([CLAUDE, OLLAMA], [`endpoint/ollama:qwen3-coder`])).toEqual({ provider: `endpoint/ollama`, model: `qwen3-coder` });
85
+ // parsePinned splits on the first colon; an id with its own colon needs the slash form or parsing breaks.
86
+ expect(modelPinKey({ provider: `endpoint/ollama`, model: `qwen3-coder` })).toBe(`endpoint/ollama:qwen3-coder`);
87
+ });
@@ -0,0 +1,57 @@
1
+ import { modelsFor } from "./agent-catalog.js";
2
+ import type { AgentProvider, ModelPin } from "../schemas/agent.js";
3
+
4
+ // The order to try models in for a role or job (settings.modelRoles), shared by daemon and browser so both agree what a
5
+ // job will spend before it runs. An empty list resolves to nothing for every role: nothing is derived or auto-selected.
6
+ // The caller decides what an empty answer means (a helper is off; a run falls back to the chat's own pick).
7
+
8
+ // One provider's standing in the decision: can a turn go, and what its catalog holds. ACP agents have no rung here (an
9
+ // empty model id), but endpoint/<id> providers must be included, matching the picker's own options.
10
+ export interface ModelSource {
11
+ // AgentProvider, not NativeProvider: an endpoint's id is user-created, no fixed union; nothing here ranks cost.
12
+ readonly provider: AgentProvider;
13
+ // Same connection predicate every surface gates on; a nonempty catalog does not imply ready to send.
14
+ readonly ready: boolean;
15
+ // Nothing here reads this (a pin is verbatim); kept because it's what a source is, and callers still gather it.
16
+ readonly models: readonly string[];
17
+ }
18
+
19
+ export interface ModelChoice {
20
+ readonly provider: AgentProvider;
21
+ readonly model: string;
22
+ }
23
+
24
+ // A (provider, model) pair on the wire: `${provider}:${modelId}`, the same key shape the picker mints. Used to compare
25
+ // entries, dedupe a role list, and store autoFastModels.
26
+ export const modelPinKey = (choice: ModelChoice): string => `${choice.provider}:${choice.model}`;
27
+
28
+ // Splits on the first colon only: a provider id never contains one, a model id might. Exported since autoFastModels
29
+ // stores these keys.
30
+ export const parsePinned = (pinned: string): ModelChoice | undefined => {
31
+ const separator = pinned.indexOf(`:`);
32
+ if (separator <= 0 || separator === pinned.length - 1) {
33
+ return undefined;
34
+ }
35
+ return { provider: pinned.slice(0, separator), model: pinned.slice(separator + 1) };
36
+ };
37
+
38
+ // A pin as a person reads it: the catalog's own label, or the raw id when the static catalog has not caught up with it
39
+ // (a real case, via the picker's custom-id escape hatch).
40
+ export const pinnedModelLabel = (choice: ModelChoice): string =>
41
+ modelsFor(choice.provider).find((option) => option.value === choice.model)?.label ?? choice.model;
42
+
43
+ // Filters pinned entries to ready providers only; there is no floor beneath a written list, so an account left unnamed
44
+ // is never reached. Returns whole pins, not bare pairs, since effort, thinking and harness must survive with the pick.
45
+ export const readyChain = (sources: readonly ModelSource[], pinned: readonly ModelPin[]): readonly ModelPin[] => {
46
+ const ready = new Set(sources.filter((source) => source.ready).map((source) => source.provider));
47
+ // Taken verbatim, unvalidated: the picker's custom-id escape hatch must run exactly the id it names.
48
+ const requested = pinned.filter((pin) => ready.has(pin.provider));
49
+ // First occurrence wins, whole: two entries can name one model with different knobs, and the earlier is meant.
50
+ const chain: ModelPin[] = [];
51
+ for (const pin of requested) {
52
+ if (!chain.some((held) => modelPinKey(held) === modelPinKey(pin))) {
53
+ chain.push(pin);
54
+ }
55
+ }
56
+ return chain;
57
+ };
@@ -0,0 +1,38 @@
1
+ import { expect, test } from "vitest";
2
+ import { MODEL_ROLE_BLOCKS, MODEL_ROLES, type ModelRoleSpec } from "./model-roles.js";
3
+
4
+ // The catalog draws the settings page directly, so its properties (every role in one block) must hold of the table
5
+ // itself, not be remembered by whoever adds a row.
6
+
7
+ // Typed at its declared width, not the literal tuple: trigger is absent from a helper's type, under test here.
8
+ const roles: readonly ModelRoleSpec[] = MODEL_ROLES;
9
+
10
+ test("every whole session says what starts it, and it is the block it is drawn in", () => {
11
+ const blockOf = new Map(MODEL_ROLE_BLOCKS.flatMap((block) => block.roles.map((role) => [role.id, block.id] as const)));
12
+
13
+ for (const role of roles) {
14
+ expect(role.kind === `run` ? role.trigger : role.kind, role.id).toBe(blockOf.get(role.id));
15
+ }
16
+ });
17
+
18
+ test("a one-shot declares no trigger at all: nothing presses a commit subject into being", () => {
19
+ for (const helper of roles.filter((role) => role.kind === `helper`)) {
20
+ expect(Object.keys(helper), helper.id).not.toContain(`trigger`);
21
+ }
22
+ });
23
+
24
+ test("the blocks hold every role once, in the table's own order", () => {
25
+ const blocked = MODEL_ROLE_BLOCKS.flatMap((block) => block.roles.map((role) => role.id));
26
+
27
+ expect(blocked.toSorted()).toEqual(MODEL_ROLES.map((role) => role.id).toSorted());
28
+ // The block order mirrors reach ordering (unpicked jobs, then click-started sessions, then auto-started ones).
29
+ expect(blocked).toEqual(MODEL_ROLES.map((role) => role.id));
30
+ });
31
+
32
+ test("each block says what it is, so the page keeps no headings of its own", () => {
33
+ for (const block of MODEL_ROLE_BLOCKS) {
34
+ expect(block.label, block.id).toMatch(/\S/);
35
+ // A block with nothing in it would draw a heading over an empty surface.
36
+ expect(block.roles.length, block.id).toBeGreaterThan(1);
37
+ }
38
+ });
@@ -0,0 +1,180 @@
1
+ import { z } from "zod";
2
+
3
+ // Every job that picks a model, one row per job; the unit is the role, not a difficulty tier. Each list is an ordered
4
+ // fallback ladder; empty means the job is off (helper) or falls back to the caller's own chat model (run). Adding a
5
+ // role is one row here, settings, resolver and daemon all read this table.
6
+
7
+ export const ModelRoleKindSchema = z.enum(["helper", "run"]);
8
+ export type ModelRoleKind = z.infer<typeof ModelRoleKindSchema>;
9
+
10
+ // Which block a run role sorts into on the settings page: pressed by the owner, or started unprompted; helpers declare
11
+ // none.
12
+ export type ModelRoleTrigger = "pressed" | "unprompted";
13
+
14
+ // `id` is a bare string here; narrowed to the role union on `ModelRoleSpec` below, since that union derives from this
15
+ // table via `satisfies`.
16
+ interface ModelRoleRow {
17
+ readonly id: string;
18
+ // The owner's own words for the job; never a difficulty tier.
19
+ readonly label: string;
20
+ // Must add information beyond the label, not restate it.
21
+ readonly blurb: string;
22
+ readonly kind: ModelRoleKind;
23
+ /** Required when `kind` is "run"; unset for helpers. */
24
+ readonly trigger?: ModelRoleTrigger;
25
+ // Icon name from the shared icon set; kept here, not in a separate web-side map keyed by id.
26
+ readonly icon: string;
27
+ }
28
+
29
+ // Ids are wire-stable (`AgentTurn.runRole`); order matches the settings page's block grouping below.
30
+ export const MODEL_ROLES = [
31
+ {
32
+ id: "commit-message",
33
+ label: "Commit messages",
34
+ blurb: "The subject written when an agent's work lands, and the release note under it.",
35
+ kind: "helper",
36
+ icon: "file-edit",
37
+ },
38
+ {
39
+ id: "session-title",
40
+ label: "Session titles",
41
+ blurb: "The name a conversation wears on the board, written a second into its first turn.",
42
+ kind: "helper",
43
+ icon: "pencil",
44
+ },
45
+ {
46
+ // Prompt includes the command about to run, which may be attacker-controlled; a small model can be swayed.
47
+ id: "safety-judge",
48
+ label: "Safety judge",
49
+ blurb: "Which model reads your safety policy before a flagged command runs.",
50
+ kind: "helper",
51
+ icon: "shield",
52
+ },
53
+ {
54
+ id: "loop-verdict",
55
+ label: "Loop verdicts",
56
+ blurb: "Whether a loop's iteration met the goal, or the loop goes round again.",
57
+ kind: "helper",
58
+ icon: "check-square",
59
+ },
60
+ {
61
+ // Picks one persona id or none from a fixed list; a classification, not free text.
62
+ id: "persona-router",
63
+ label: "Persona routing",
64
+ blurb: "Which model reads a new chat's first message and picks the persona for it.",
65
+ kind: "helper",
66
+ icon: "users",
67
+ },
68
+ {
69
+ id: "pipeline-fix",
70
+ label: "Pipeline fixes",
71
+ blurb: "The agent started by Fix on a red pipeline.",
72
+ kind: "run",
73
+ trigger: "pressed",
74
+ icon: "wave-pulse",
75
+ },
76
+ {
77
+ id: "deployment-fix",
78
+ label: "Deployment fixes",
79
+ blurb: "The agent started by Fix on a deployment that is down.",
80
+ kind: "run",
81
+ trigger: "pressed",
82
+ icon: "server",
83
+ },
84
+ {
85
+ id: "maintenance-chore",
86
+ label: "Maintenance chores",
87
+ blurb: "A chore run started from the Maintenance board.",
88
+ kind: "run",
89
+ trigger: "pressed",
90
+ icon: "wrench",
91
+ },
92
+ {
93
+ id: "documentation-run",
94
+ label: "Documentation runs",
95
+ blurb: "A pass over a repo's own documentation.",
96
+ kind: "run",
97
+ trigger: "pressed",
98
+ icon: "book",
99
+ },
100
+ {
101
+ id: "acceptance-run",
102
+ label: "Acceptance runs",
103
+ blurb: "One session per story in an acceptance fan-out.",
104
+ kind: "run",
105
+ trigger: "pressed",
106
+ icon: "list-check",
107
+ },
108
+ {
109
+ id: "pre-push-fix",
110
+ label: "Pre-push fixes",
111
+ blurb: "The fix proposed when a check fails on the way to a push.",
112
+ kind: "run",
113
+ trigger: "pressed",
114
+ icon: "cloud-upload",
115
+ },
116
+ {
117
+ // Pressed trigger: the owner's approval click starts this turn; the queue between is just machinery.
118
+ id: "approval-queue",
119
+ label: "Approvals queue",
120
+ blurb: "The turn that publishes or acts on what you approved.",
121
+ kind: "run",
122
+ trigger: "pressed",
123
+ icon: "check-circle",
124
+ },
125
+ {
126
+ id: "extension-review",
127
+ label: "Extension update reviews",
128
+ blurb: "The agent that reads an extension update before it is applied.",
129
+ kind: "run",
130
+ trigger: "unprompted",
131
+ icon: "box",
132
+ },
133
+ {
134
+ id: "loop-iteration",
135
+ label: "Loop iterations",
136
+ blurb: "Each round of a loop working towards its goal.",
137
+ kind: "run",
138
+ trigger: "unprompted",
139
+ icon: "repeat",
140
+ },
141
+ ] as const satisfies readonly ModelRoleRow[];
142
+
143
+ export type ModelRole = (typeof MODEL_ROLES)[number]["id"];
144
+ export type ModelRoleSpec = ModelRoleRow & { readonly id: ModelRole };
145
+
146
+ export const MODEL_ROLE_IDS = MODEL_ROLES.map((role) => role.id) as readonly ModelRole[];
147
+
148
+ // Enum, not a string: an id outside this table names nothing, so it should fail loudly rather than be ignored.
149
+ export const ModelRoleSchema = z.enum(MODEL_ROLE_IDS as [ModelRole, ...ModelRole[]]);
150
+
151
+ // Groups MODEL_ROLES for the settings page by kind and trigger; each role belongs to exactly one block, in table order.
152
+ export type ModelRoleBlockId = "helper" | "pressed" | "unprompted";
153
+
154
+ export interface ModelRoleBlock {
155
+ readonly id: ModelRoleBlockId;
156
+ /** Heading shown on the settings page. */
157
+ readonly label: string;
158
+ /** Its roles, in MODEL_ROLES order. */
159
+ readonly roles: readonly ModelRoleSpec[];
160
+ }
161
+
162
+ const rolesWhere = (match: (role: ModelRoleSpec) => boolean): readonly ModelRoleSpec[] => MODEL_ROLES.filter((role) => match(role));
163
+
164
+ export const MODEL_ROLE_BLOCKS: readonly ModelRoleBlock[] = [
165
+ {
166
+ id: "helper",
167
+ label: "Automatic helpers",
168
+ roles: rolesWhere((role) => role.kind === "helper"),
169
+ },
170
+ {
171
+ id: "pressed",
172
+ label: "Runs you start",
173
+ roles: rolesWhere((role) => role.kind === "run" && role.trigger === "pressed"),
174
+ },
175
+ {
176
+ id: "unprompted",
177
+ label: "Runs that start themselves",
178
+ roles: rolesWhere((role) => role.kind === "run" && role.trigger === "unprompted"),
179
+ },
180
+ ];
@@ -1,10 +1,9 @@
1
1
  import { expect, test } from "vitest";
2
2
  import { bindingWindow, gatesModel, gatingWindows, scopedWindow } from "./plan-pools.js";
3
- import type { AccountUsage, UsageWindow } from "./schemas/plan-limits.js";
3
+ import type { AccountUsage, UsageWindow } from "../schemas/plan-limits.js";
4
4
 
5
- /* ONE RULE FOR "WHICH POOL STANDS IN THE WAY OF THIS MODEL", shared by the daemon's picker and the browser's
6
- * rings. What these pin is the case the six rules it replaced disagreed on: a plan that meters models
7
- * separately, where the account's fullest pool and the pool a given model spends are different allowances. */
5
+ // One rule for which pool blocks a given model, shared by the daemon and the browser: a plan can meter models
6
+ // separately, so the account's fullest pool need not be the model's own.
8
7
 
9
8
  const window = (over: Partial<UsageWindow> & Pick<UsageWindow, "kind">): UsageWindow => ({ utilization: 10, gates: "all", ...over });
10
9
  const usage = (...windows: UsageWindow[]): AccountUsage => ({ windows, measuredAt: 0 });
@@ -24,7 +23,6 @@ const CLAUDE = usage(
24
23
  test("matches a pool's names as runs of whole words against the id and the label alike", () => {
25
24
  expect(gatesModel({ models: ["opus"] }, { id: "claude-opus-4-6" })).toBe(true);
26
25
  expect(gatesModel({ models: ["Opus"] }, { id: "some-id", label: "Claude Opus 4.6" })).toBe(true);
27
- // "Sonnet" is not in "claude-opus-4-6", and a substring test is what would have said "son" was.
28
26
  expect(gatesModel({ models: ["son"] }, { id: "claude-sonnet-4-6" })).toBe(false);
29
27
  expect(gatesModel({ models: ["claude opus"] }, { id: "claude-opus-4-6" })).toBe(true);
30
28
  expect(gatesModel({ models: ["opus claude"] }, { id: "claude-opus-4-6" })).toBe(false);
@@ -33,12 +31,11 @@ test("matches a pool's names as runs of whole words against the id and the label
33
31
  });
34
32
 
35
33
  test("a Google account spent for Gemini still has room for Claude Opus, and the other way round", () => {
36
- // The Antigravity case: one sign-in, two allowances on two clocks. Reading the account's fullest pool put a
37
- // red ring over Claude Opus while its own pool sat at 27%.
34
+ // One account, two independently metered pools (Gemini vs Claude/GPT), each on its own clock.
38
35
  expect(bindingWindow(GOOGLE, { id: "claude-opus-4-6-thinking" })?.kind).toBe("google:3p-weekly");
39
36
  expect(bindingWindow(GOOGLE, { id: "gpt-oss-120b" })?.kind).toBe("google:3p-weekly");
40
37
  expect(bindingWindow(GOOGLE, { id: "gemini-3-pro" })?.kind).toBe("google:gemini-weekly");
41
- // A family the channel has not published a pool for is gated by nothing: unmeasured, never blocked.
38
+ // A model family with no published pool is unmeasured, not blocked.
42
39
  expect(bindingWindow(GOOGLE, { id: "kimi-k2" })).toBeUndefined();
43
40
  });
44
41
 
@@ -49,8 +46,6 @@ test("a Claude account's spent Opus slice does not bind a Haiku call, and its ow
49
46
  });
50
47
 
51
48
  test("with no model named, the account's tightest pool is the answer, and a pool gating nothing is never it", () => {
52
- // The Cowork surface pool is at 99% and gates none of this sandbox's turns: shown on the roster, never the
53
- // account's headroom.
54
49
  expect(bindingWindow(CLAUDE)?.kind).toBe("model:Opus");
55
50
  expect(gatingWindows(CLAUDE).map((entry) => entry.kind)).toEqual(["five_hour", "seven_day", "model:Opus"]);
56
51
  expect(bindingWindow(undefined)).toBeUndefined();
@@ -59,7 +54,7 @@ test("with no model named, the account's tightest pool is the answer, and a pool
59
54
 
60
55
  test("names the pool a plan meters this model by on its own, preferring the more specific and refusing a tie", () => {
61
56
  expect(scopedWindow(CLAUDE, { id: "claude-opus-4-6" })?.kind).toBe("model:Opus");
62
- // The all-models weekly is not this model's own allowance, so a plan with no slice for it says nothing.
57
+ // five_hour and seven_day meter all models, not just this one; scopedWindow needs a model-specific pool.
63
58
  expect(scopedWindow(CLAUDE, { id: "claude-haiku-4-5" })).toBeUndefined();
64
59
  const layered = usage(
65
60
  window({ kind: "model:Opus", gates: { models: ["Opus"] } }),
@@ -0,0 +1,65 @@
1
+ import type { AccountUsage, UsageWindow, WindowGates } from "../schemas/plan-limits.js";
2
+
3
+ // Single reading of which account pool gates a given model (or, with none named, the account's tightest pool), shared
4
+ // by the daemon's picker/refusal logic and the browser's rings and rail. A pool gated `none` is excluded from the
5
+ // no-model case: visible to the account, never a gate on a turn.
6
+
7
+ // 100 = exhaustion (the call will be refused), not the browser's 90% warning threshold (usageStatus SPENT_PERCENT).
8
+ export const SPENT_UTILIZATION = 100;
9
+
10
+ export interface ModelRef {
11
+ // Wire model id.
12
+ readonly id: string;
13
+ // Display name, when available; matched too, since the tier word may be in either id or label.
14
+ readonly label?: string | undefined;
15
+ }
16
+
17
+ // Splits into lowercase alnum words for whole-word matching: a substring test would match "opus" inside a word that
18
+ // merely contains it.
19
+ export const wordsOf = (text: string): readonly string[] =>
20
+ text
21
+ .toLowerCase()
22
+ .split(/[^a-z0-9]+/)
23
+ .filter(Boolean);
24
+
25
+ // Whether `needle` appears as a contiguous run of whole words within `words`.
26
+ export const runOfWords = (words: readonly string[], needle: readonly string[]): boolean =>
27
+ needle.length > 0 && words.some((_, at) => needle.every((word, index) => words[at + index] === word));
28
+
29
+ const nameMatches = (name: string, model: ModelRef): boolean => {
30
+ const needle = wordsOf(name);
31
+ return runOfWords(wordsOf(model.id), needle) || (model.label !== undefined && runOfWords(wordsOf(model.label), needle));
32
+ };
33
+
34
+ export const gatesModel = (gates: WindowGates, model: ModelRef): boolean =>
35
+ gates === "all" ? true : gates === "none" ? false : gates.models.some((name) => nameMatches(name, model));
36
+
37
+ // Pools that gate this model, or, with no model given, every pool that gates anything.
38
+ export const gatingWindows = (usage: AccountUsage | undefined, model?: ModelRef): readonly UsageWindow[] =>
39
+ (usage?.windows ?? []).filter((window) => (model === undefined ? window.gates !== "none" : gatesModel(window.gates, model)));
40
+
41
+ const fullest = (windows: readonly UsageWindow[]): UsageWindow | undefined =>
42
+ windows.reduce<UsageWindow | undefined>((worst, window) => (worst === undefined || window.utilization > worst.utilization ? window : worst), undefined);
43
+
44
+ // The pool that gates the next turn: the fullest of the windows this model spends. Undefined means nothing gates it (or
45
+ // nothing was measured) — distinct from a measured 0%.
46
+ export const bindingWindow = (usage: AccountUsage | undefined, model?: ModelRef): UsageWindow | undefined => fullest(gatingWindows(usage, model));
47
+
48
+ // The model's own metered pool, by most specific name match; distinct from bindingWindow, which may answer with an
49
+ // all-models pool. Two matches tied in specificity return undefined rather than guess.
50
+ export const scopedWindow = (usage: AccountUsage | undefined, model: ModelRef): UsageWindow | undefined => {
51
+ const matched = (usage?.windows ?? [])
52
+ .flatMap((window) => {
53
+ if (window.gates === "all" || window.gates === "none") {
54
+ return [];
55
+ }
56
+ const specificity = Math.max(0, ...window.gates.models.filter((name) => nameMatches(name, model)).map((name) => wordsOf(name).length));
57
+ return specificity === 0 ? [] : [{ window, specificity }];
58
+ })
59
+ .toSorted((left, right) => right.specificity - left.specificity);
60
+ const best = matched[0];
61
+ if (best === undefined || matched[1]?.specificity === best.specificity) {
62
+ return undefined;
63
+ }
64
+ return best.window;
65
+ };