@intentic/sandbox-contract 1.248.0 → 1.250.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 (879) 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 +12 -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 +1 -0
  69. package/dist/contracts/personas.contract.d.ts.map +1 -1
  70. package/dist/contracts/personas.contract.js +1 -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 +97 -171
  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 +8 -18
  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 +6 -0
  93. package/dist/contracts/skills.contract.d.ts.map +1 -1
  94. package/dist/contracts/skills.contract.js +13 -4
  95. package/dist/contracts/skills.contract.js.map +1 -1
  96. package/dist/contracts/system.contract.d.ts +49 -73
  97. package/dist/contracts/system.contract.d.ts.map +1 -1
  98. package/dist/contracts/system.contract.js +12 -2
  99. package/dist/contracts/system.contract.js.map +1 -1
  100. package/dist/contracts/usage.contract.d.ts.map +1 -1
  101. package/dist/contracts/usage.contract.js.map +1 -1
  102. package/dist/contracts/vpn.contract.d.ts.map +1 -1
  103. package/dist/contracts/vpn.contract.js +1 -1
  104. package/dist/contracts/vpn.contract.js.map +1 -1
  105. package/dist/contracts/webext.contract.d.ts.map +1 -1
  106. package/dist/contracts/webext.contract.js.map +1 -1
  107. package/dist/contracts/workflows.contract.d.ts +7 -6
  108. package/dist/contracts/workflows.contract.d.ts.map +1 -1
  109. package/dist/contracts/workflows.contract.js +12 -3
  110. package/dist/contracts/workflows.contract.js.map +1 -1
  111. package/dist/contracts/workspace.contract.d.ts.map +1 -1
  112. package/dist/contracts/workspace.contract.js.map +1 -1
  113. package/dist/events/agent-events.d.ts +1237 -0
  114. package/dist/events/agent-events.d.ts.map +1 -0
  115. package/dist/events/agent-events.js +226 -0
  116. package/dist/events/agent-events.js.map +1 -0
  117. package/dist/events/cards.d.ts +404 -0
  118. package/dist/events/cards.d.ts.map +1 -0
  119. package/dist/events/cards.js +179 -0
  120. package/dist/events/cards.js.map +1 -0
  121. package/dist/events/resume.d.ts +23 -0
  122. package/dist/events/resume.d.ts.map +1 -0
  123. package/dist/events/resume.js +31 -0
  124. package/dist/events/resume.js.map +1 -0
  125. package/dist/events/system-events.d.ts +615 -0
  126. package/dist/events/system-events.d.ts.map +1 -0
  127. package/dist/events/system-events.js +64 -0
  128. package/dist/events/system-events.js.map +1 -0
  129. package/dist/events/transcript.d.ts +1755 -0
  130. package/dist/events/transcript.d.ts.map +1 -0
  131. package/dist/events/transcript.js +205 -0
  132. package/dist/events/transcript.js.map +1 -0
  133. package/dist/ids/conversation-ids.d.ts +8 -0
  134. package/dist/ids/conversation-ids.d.ts.map +1 -0
  135. package/dist/{conversation-ids.js → ids/conversation-ids.js} +13 -0
  136. package/dist/ids/conversation-ids.js.map +1 -0
  137. package/dist/ids/hostnames.d.ts.map +1 -0
  138. package/dist/ids/hostnames.js.map +1 -0
  139. package/dist/ids/session-names.d.ts.map +1 -0
  140. package/dist/ids/session-names.js.map +1 -0
  141. package/dist/ids/share-paths.d.ts.map +1 -0
  142. package/dist/ids/share-paths.js.map +1 -0
  143. package/dist/{tunnel-ids.d.ts → ids/tunnel-ids.d.ts} +1 -0
  144. package/dist/ids/tunnel-ids.d.ts.map +1 -0
  145. package/dist/{tunnel-ids.js → ids/tunnel-ids.js} +1 -0
  146. package/dist/ids/tunnel-ids.js.map +1 -0
  147. package/dist/index.d.ts +429 -450
  148. package/dist/index.d.ts.map +1 -1
  149. package/dist/index.js +54 -46
  150. package/dist/index.js.map +1 -1
  151. package/dist/{agent-catalog.d.ts → models/agent-catalog.d.ts} +2 -2
  152. package/dist/models/agent-catalog.d.ts.map +1 -0
  153. package/dist/models/agent-catalog.js.map +1 -0
  154. package/dist/models/agent-runtimes.d.ts.map +1 -0
  155. package/dist/models/agent-runtimes.js.map +1 -0
  156. package/dist/{fast-tier.d.ts → models/fast-tier.d.ts} +1 -1
  157. package/dist/models/fast-tier.d.ts.map +1 -0
  158. package/dist/models/fast-tier.js.map +1 -0
  159. package/dist/models/model-order.d.ts.map +1 -0
  160. package/dist/{model-order.js → models/model-order.js} +2 -0
  161. package/dist/models/model-order.js.map +1 -0
  162. package/dist/{model-pins.d.ts → models/model-pins.d.ts} +1 -1
  163. package/dist/models/model-pins.d.ts.map +1 -0
  164. package/dist/models/model-pins.js.map +1 -0
  165. package/dist/{model-roles.d.ts → models/model-roles.d.ts} +0 -33
  166. package/dist/models/model-roles.d.ts.map +1 -0
  167. package/dist/{model-roles.js → models/model-roles.js} +0 -35
  168. package/dist/models/model-roles.js.map +1 -0
  169. package/dist/{plan-pools.d.ts → models/plan-pools.d.ts} +1 -1
  170. package/dist/models/plan-pools.d.ts.map +1 -0
  171. package/dist/models/plan-pools.js.map +1 -0
  172. package/dist/models/prompt-complexity.d.ts.map +1 -0
  173. package/dist/models/prompt-complexity.js.map +1 -0
  174. package/dist/models/provider-specs.d.ts.map +1 -0
  175. package/dist/models/provider-specs.js.map +1 -0
  176. package/dist/policy/approvals-execution.d.ts.map +1 -0
  177. package/dist/policy/approvals-execution.js.map +1 -0
  178. package/dist/{batch-runs.d.ts → policy/batch-runs.d.ts} +5 -1
  179. package/dist/policy/batch-runs.d.ts.map +1 -0
  180. package/dist/{batch-runs.js → policy/batch-runs.js} +10 -7
  181. package/dist/policy/batch-runs.js.map +1 -0
  182. package/dist/policy/capability-env.d.ts.map +1 -0
  183. package/dist/policy/capability-env.js.map +1 -0
  184. package/dist/policy/capability-secrets.d.ts.map +1 -0
  185. package/dist/policy/capability-secrets.js.map +1 -0
  186. package/dist/{card-status.d.ts → policy/card-status.d.ts} +2 -2
  187. package/dist/policy/card-status.d.ts.map +1 -0
  188. package/dist/{card-status.js → policy/card-status.js} +1 -5
  189. package/dist/policy/card-status.js.map +1 -0
  190. package/dist/{command-classes.d.ts → policy/command-classes.d.ts} +6 -2
  191. package/dist/policy/command-classes.d.ts.map +1 -0
  192. package/dist/{command-classes.js → policy/command-classes.js} +48 -11
  193. package/dist/policy/command-classes.js.map +1 -0
  194. package/dist/{command-run.d.ts → policy/command-run.d.ts} +1 -1
  195. package/dist/policy/command-run.d.ts.map +1 -0
  196. package/dist/policy/command-run.js.map +1 -0
  197. package/dist/policy/control-scopes.d.ts +16 -0
  198. package/dist/policy/control-scopes.d.ts.map +1 -0
  199. package/dist/policy/control-scopes.js +26 -0
  200. package/dist/policy/control-scopes.js.map +1 -0
  201. package/dist/policy/credential-material.d.ts.map +1 -0
  202. package/dist/policy/credential-material.js.map +1 -0
  203. package/dist/policy/needs-action.d.ts.map +1 -0
  204. package/dist/policy/needs-action.js.map +1 -0
  205. package/dist/policy/output-fields.d.ts.map +1 -0
  206. package/dist/policy/output-fields.js.map +1 -0
  207. package/dist/policy/overlay-lint.d.ts.map +1 -0
  208. package/dist/policy/overlay-lint.js.map +1 -0
  209. package/dist/policy/owner-ticket.d.ts.map +1 -0
  210. package/dist/{owner-ticket.js → policy/owner-ticket.js} +1 -1
  211. package/dist/policy/owner-ticket.js.map +1 -0
  212. package/dist/{safety-policy.d.ts → policy/safety-policy.d.ts} +6 -5
  213. package/dist/policy/safety-policy.d.ts.map +1 -0
  214. package/dist/{safety-policy.js → policy/safety-policy.js} +12 -12
  215. package/dist/policy/safety-policy.js.map +1 -0
  216. package/dist/policy/search-globs.d.ts.map +1 -0
  217. package/dist/policy/search-globs.js.map +1 -0
  218. package/dist/protocol/container-requirements.d.ts +20 -0
  219. package/dist/protocol/container-requirements.d.ts.map +1 -0
  220. package/dist/protocol/container-requirements.js +23 -0
  221. package/dist/protocol/container-requirements.js.map +1 -0
  222. package/dist/{host-protocol.d.ts → protocol/host-protocol.d.ts} +1 -0
  223. package/dist/protocol/host-protocol.d.ts.map +1 -0
  224. package/dist/{host-protocol.js → protocol/host-protocol.js} +1 -0
  225. package/dist/protocol/host-protocol.js.map +1 -0
  226. package/dist/protocol/ingress-contract.d.ts.map +1 -0
  227. package/dist/{ingress-contract.js → protocol/ingress-contract.js} +1 -1
  228. package/dist/protocol/ingress-contract.js.map +1 -0
  229. package/dist/protocol/ingress-protocol.d.ts.map +1 -0
  230. package/dist/protocol/ingress-protocol.js.map +1 -0
  231. package/dist/protocol/listener-protocol.d.ts.map +1 -0
  232. package/dist/{listener-protocol.js → protocol/listener-protocol.js} +1 -1
  233. package/dist/protocol/listener-protocol.js.map +1 -0
  234. package/dist/{peer-dial.d.ts → protocol/peer-dial.d.ts} +4 -1
  235. package/dist/protocol/peer-dial.d.ts.map +1 -0
  236. package/dist/{peer-dial.js → protocol/peer-dial.js} +51 -10
  237. package/dist/protocol/peer-dial.js.map +1 -0
  238. package/dist/protocol/peer-mcp-server.d.ts.map +1 -0
  239. package/dist/protocol/peer-mcp-server.js.map +1 -0
  240. package/dist/protocol/request-id.d.ts.map +1 -0
  241. package/dist/protocol/request-id.js.map +1 -0
  242. package/dist/protocol/routes.d.ts.map +1 -0
  243. package/dist/protocol/routes.js.map +1 -0
  244. package/dist/{runner-protocol.d.ts → protocol/runner-protocol.d.ts} +1 -0
  245. package/dist/protocol/runner-protocol.d.ts.map +1 -0
  246. package/dist/{runner-protocol.js → protocol/runner-protocol.js} +2 -1
  247. package/dist/protocol/runner-protocol.js.map +1 -0
  248. package/dist/protocol/sse.d.ts.map +1 -0
  249. package/dist/protocol/sse.js.map +1 -0
  250. package/dist/{terminal-protocol.d.ts → protocol/terminal-protocol.d.ts} +1 -3
  251. package/dist/protocol/terminal-protocol.d.ts.map +1 -0
  252. package/dist/protocol/terminal-protocol.js.map +1 -0
  253. package/dist/protocol/webext-links.d.ts.map +1 -0
  254. package/dist/protocol/webext-links.js.map +1 -0
  255. package/dist/{webext-protocol.d.ts → protocol/webext-protocol.d.ts} +1 -0
  256. package/dist/protocol/webext-protocol.d.ts.map +1 -0
  257. package/dist/{webext-protocol.js → protocol/webext-protocol.js} +1 -0
  258. package/dist/protocol/webext-protocol.js.map +1 -0
  259. package/dist/schemas/activity.d.ts +2 -0
  260. package/dist/schemas/activity.d.ts.map +1 -1
  261. package/dist/schemas/activity.js +4 -0
  262. package/dist/schemas/activity.js.map +1 -1
  263. package/dist/schemas/agent.d.ts +16 -4
  264. package/dist/schemas/agent.d.ts.map +1 -1
  265. package/dist/schemas/agent.js +21 -4
  266. package/dist/schemas/agent.js.map +1 -1
  267. package/dist/schemas/agents.d.ts +17 -4
  268. package/dist/schemas/agents.d.ts.map +1 -1
  269. package/dist/schemas/agents.js +15 -4
  270. package/dist/schemas/agents.js.map +1 -1
  271. package/dist/schemas/approvals.d.ts.map +1 -1
  272. package/dist/schemas/approvals.js.map +1 -1
  273. package/dist/schemas/automations.d.ts +54 -28
  274. package/dist/schemas/automations.d.ts.map +1 -1
  275. package/dist/schemas/automations.js +26 -8
  276. package/dist/schemas/automations.js.map +1 -1
  277. package/dist/schemas/capabilities.d.ts +0 -8
  278. package/dist/schemas/capabilities.d.ts.map +1 -1
  279. package/dist/schemas/capabilities.js +0 -4
  280. package/dist/schemas/capabilities.js.map +1 -1
  281. package/dist/schemas/ci.d.ts +10 -0
  282. package/dist/schemas/ci.d.ts.map +1 -1
  283. package/dist/schemas/ci.js +9 -1
  284. package/dist/schemas/ci.js.map +1 -1
  285. package/dist/schemas/codebase-health.d.ts.map +1 -1
  286. package/dist/schemas/codebase-health.js.map +1 -1
  287. package/dist/schemas/devices.d.ts +92 -0
  288. package/dist/schemas/devices.d.ts.map +1 -1
  289. package/dist/schemas/devices.js +12 -1
  290. package/dist/schemas/devices.js.map +1 -1
  291. package/dist/schemas/engines.d.ts.map +1 -1
  292. package/dist/schemas/engines.js.map +1 -1
  293. package/dist/schemas/environment.d.ts.map +1 -1
  294. package/dist/schemas/environment.js.map +1 -1
  295. package/dist/schemas/exit.d.ts.map +1 -1
  296. package/dist/schemas/exit.js.map +1 -1
  297. package/dist/schemas/extension-updates.d.ts.map +1 -1
  298. package/dist/schemas/extension-updates.js.map +1 -1
  299. package/dist/schemas/git-history.d.ts.map +1 -1
  300. package/dist/schemas/git-history.js.map +1 -1
  301. package/dist/schemas/git.d.ts +80 -16
  302. package/dist/schemas/git.d.ts.map +1 -1
  303. package/dist/schemas/git.js +37 -25
  304. package/dist/schemas/git.js.map +1 -1
  305. package/dist/schemas/history.d.ts.map +1 -1
  306. package/dist/schemas/history.js.map +1 -1
  307. package/dist/schemas/hosts.d.ts.map +1 -1
  308. package/dist/schemas/hosts.js.map +1 -1
  309. package/dist/schemas/inventory.d.ts.map +1 -1
  310. package/dist/schemas/inventory.js.map +1 -1
  311. package/dist/schemas/issues.d.ts +0 -1
  312. package/dist/schemas/issues.d.ts.map +1 -1
  313. package/dist/schemas/issues.js +0 -1
  314. package/dist/schemas/issues.js.map +1 -1
  315. package/dist/schemas/logs.d.ts.map +1 -1
  316. package/dist/schemas/logs.js.map +1 -1
  317. package/dist/schemas/loops.d.ts.map +1 -1
  318. package/dist/schemas/loops.js +1 -1
  319. package/dist/schemas/loops.js.map +1 -1
  320. package/dist/schemas/maintenance.d.ts.map +1 -1
  321. package/dist/schemas/maintenance.js.map +1 -1
  322. package/dist/schemas/marketplace.d.ts +0 -4
  323. package/dist/schemas/marketplace.d.ts.map +1 -1
  324. package/dist/schemas/panels.d.ts.map +1 -1
  325. package/dist/schemas/panels.js.map +1 -1
  326. package/dist/schemas/personas.d.ts +2 -1
  327. package/dist/schemas/personas.d.ts.map +1 -1
  328. package/dist/schemas/personas.js +6 -2
  329. package/dist/schemas/personas.js.map +1 -1
  330. package/dist/schemas/plan-limits.d.ts +2 -4
  331. package/dist/schemas/plan-limits.d.ts.map +1 -1
  332. package/dist/schemas/plan-limits.js +5 -8
  333. package/dist/schemas/plan-limits.js.map +1 -1
  334. package/dist/schemas/ports.d.ts.map +1 -1
  335. package/dist/schemas/ports.js.map +1 -1
  336. package/dist/schemas/provider-oauth.d.ts.map +1 -1
  337. package/dist/schemas/provider-oauth.js.map +1 -1
  338. package/dist/schemas/provider-subscriptions.d.ts +1 -1
  339. package/dist/schemas/provider-subscriptions.d.ts.map +1 -1
  340. package/dist/schemas/provider-subscriptions.js +1 -1
  341. package/dist/schemas/provider-subscriptions.js.map +1 -1
  342. package/dist/schemas/public.d.ts.map +1 -1
  343. package/dist/schemas/public.js.map +1 -1
  344. package/dist/schemas/push.d.ts.map +1 -1
  345. package/dist/schemas/push.js.map +1 -1
  346. package/dist/schemas/secrets.d.ts.map +1 -1
  347. package/dist/schemas/secrets.js.map +1 -1
  348. package/dist/schemas/settings.d.ts +11 -9
  349. package/dist/schemas/settings.d.ts.map +1 -1
  350. package/dist/schemas/settings.js +22 -7
  351. package/dist/schemas/settings.js.map +1 -1
  352. package/dist/schemas/share.d.ts.map +1 -1
  353. package/dist/schemas/share.js.map +1 -1
  354. package/dist/schemas/shared.d.ts +4 -0
  355. package/dist/schemas/shared.d.ts.map +1 -1
  356. package/dist/schemas/shared.js +3 -0
  357. package/dist/schemas/shared.js.map +1 -1
  358. package/dist/schemas/system.d.ts +6 -0
  359. package/dist/schemas/system.d.ts.map +1 -1
  360. package/dist/schemas/system.js +10 -0
  361. package/dist/schemas/system.js.map +1 -1
  362. package/dist/schemas/terminal.d.ts.map +1 -1
  363. package/dist/schemas/terminal.js.map +1 -1
  364. package/dist/schemas/usage.d.ts.map +1 -1
  365. package/dist/schemas/usage.js.map +1 -1
  366. package/dist/schemas/vpn.d.ts.map +1 -1
  367. package/dist/schemas/vpn.js.map +1 -1
  368. package/dist/schemas/webext.d.ts.map +1 -1
  369. package/dist/schemas/webext.js.map +1 -1
  370. package/dist/schemas/workflows.d.ts +66 -9
  371. package/dist/schemas/workflows.d.ts.map +1 -1
  372. package/dist/schemas/workflows.js +6 -5
  373. package/dist/schemas/workflows.js.map +1 -1
  374. package/dist/schemas/workspace-repos.d.ts.map +1 -1
  375. package/dist/schemas/workspace-repos.js.map +1 -1
  376. package/dist/schemas/workspace-search.d.ts.map +1 -1
  377. package/dist/schemas/workspace-search.js.map +1 -1
  378. package/dist/schemas/workspace-setup.d.ts.map +1 -1
  379. package/dist/schemas/workspace-setup.js.map +1 -1
  380. package/dist/schemas/workspace-tree.d.ts.map +1 -1
  381. package/dist/schemas/workspace-tree.js.map +1 -1
  382. package/dist/state/arrival.d.ts.map +1 -0
  383. package/dist/{arrival.js → state/arrival.js} +1 -1
  384. package/dist/state/arrival.js.map +1 -0
  385. package/dist/state/contract-lock.d.ts.map +1 -0
  386. package/dist/{contract-lock.js → state/contract-lock.js} +1 -1
  387. package/dist/state/contract-lock.js.map +1 -0
  388. package/dist/{definition.d.ts → state/definition.d.ts} +21 -17
  389. package/dist/state/definition.d.ts.map +1 -0
  390. package/dist/{definition.js → state/definition.js} +4 -4
  391. package/dist/state/definition.js.map +1 -0
  392. package/dist/state/history-state.d.ts.map +1 -0
  393. package/dist/{history-state.js → state/history-state.js} +1 -0
  394. package/dist/state/history-state.js.map +1 -0
  395. package/dist/state/runtime-state.d.ts.map +1 -0
  396. package/dist/state/runtime-state.js.map +1 -0
  397. package/dist/state/starter.d.ts.map +1 -0
  398. package/dist/state/starter.js.map +1 -0
  399. package/dist/state/state-portability.d.ts.map +1 -0
  400. package/dist/state/state-portability.js.map +1 -0
  401. package/dist/state/versions.d.ts.map +1 -0
  402. package/dist/state/versions.js.map +1 -0
  403. package/dist/{workspace-state.d.ts → state/workspace-state.d.ts} +8 -0
  404. package/dist/state/workspace-state.d.ts.map +1 -0
  405. package/dist/{workspace-state.js → state/workspace-state.js} +25 -0
  406. package/dist/state/workspace-state.js.map +1 -0
  407. package/dist/{documents.d.ts → text/documents.d.ts} +1 -1
  408. package/dist/text/documents.d.ts.map +1 -0
  409. package/dist/{documents.js → text/documents.js} +1 -1
  410. package/dist/text/documents.js.map +1 -0
  411. package/dist/text/embed.d.ts.map +1 -0
  412. package/dist/text/embed.js.map +1 -0
  413. package/dist/text/mentions.d.ts.map +1 -0
  414. package/dist/text/mentions.js.map +1 -0
  415. package/dist/text/model-answer.d.ts +3 -0
  416. package/dist/text/model-answer.d.ts.map +1 -0
  417. package/dist/text/model-answer.js +3 -0
  418. package/dist/text/model-answer.js.map +1 -0
  419. package/dist/text/path-refs.d.ts.map +1 -0
  420. package/dist/text/path-refs.js.map +1 -0
  421. package/dist/{shell-regions.d.ts → text/shell-regions.d.ts} +1 -1
  422. package/dist/text/shell-regions.d.ts.map +1 -0
  423. package/dist/text/shell-regions.js.map +1 -0
  424. package/dist/text/title.d.ts.map +1 -0
  425. package/dist/text/title.js.map +1 -0
  426. package/dist/{transcript-fold.d.ts → text/transcript-fold.d.ts} +2 -1
  427. package/dist/text/transcript-fold.d.ts.map +1 -0
  428. package/dist/{transcript-fold.js → text/transcript-fold.js} +2 -16
  429. package/dist/text/transcript-fold.js.map +1 -0
  430. package/dist/text/whisper.d.ts +3 -0
  431. package/dist/text/whisper.d.ts.map +1 -0
  432. package/dist/text/whisper.js +11 -0
  433. package/dist/text/whisper.js.map +1 -0
  434. package/dist/{workflow-faults.d.ts → text/workflow-faults.d.ts} +1 -1
  435. package/dist/text/workflow-faults.d.ts.map +1 -0
  436. package/dist/{workflow-faults.js → text/workflow-faults.js} +1 -1
  437. package/dist/text/workflow-faults.js.map +1 -0
  438. package/package.json +70 -70
  439. package/src/chores/chores.test.ts +4 -10
  440. package/src/chores/chores.ts +148 -392
  441. package/src/chores/digest.ts +8 -28
  442. package/src/chores/extension-update.ts +3 -8
  443. package/src/chores/fix-deps.ts +4 -18
  444. package/src/chores/index.ts +2 -2
  445. package/src/chores/probes.test.ts +7 -43
  446. package/src/chores/probes.ts +62 -167
  447. package/src/chores/prompt.ts +10 -34
  448. package/src/chores/stack.test.ts +6 -45
  449. package/src/chores/stack.ts +27 -118
  450. package/src/chores/verdict.test.ts +101 -80
  451. package/src/chores/verdict.ts +54 -99
  452. package/src/contracts/accounts.contract.ts +4 -19
  453. package/src/contracts/agent.contract.ts +7 -22
  454. package/src/contracts/agents.contract.ts +25 -71
  455. package/src/contracts/automations.contract.ts +14 -30
  456. package/src/contracts/capabilities.contract.ts +8 -35
  457. package/src/contracts/chores.contract.ts +4 -15
  458. package/src/contracts/endpoints.contract.ts +5 -22
  459. package/src/contracts/exit.contract.ts +7 -30
  460. package/src/contracts/extensions.contract.ts +8 -30
  461. package/src/contracts/git.contract.ts +25 -49
  462. package/src/contracts/host.contract.ts +9 -44
  463. package/src/contracts/intentic.contract.ts +1 -1
  464. package/src/contracts/logs.contract.ts +3 -13
  465. package/src/contracts/loops.contract.ts +9 -40
  466. package/src/contracts/personas.contract.ts +10 -35
  467. package/src/contracts/providers.contract.ts +4 -17
  468. package/src/contracts/runner.contract.ts +12 -39
  469. package/src/contracts/safety.contract.ts +5 -14
  470. package/src/contracts/secrets.contract.ts +4 -22
  471. package/src/contracts/sessions.contract.ts +1 -1
  472. package/src/contracts/settings.contract.ts +4 -10
  473. package/src/contracts/share.contract.ts +3 -9
  474. package/src/contracts/skills.contract.ts +21 -19
  475. package/src/contracts/system.contract.ts +26 -52
  476. package/src/contracts/usage.contract.ts +7 -21
  477. package/src/contracts/vpn.contract.ts +9 -16
  478. package/src/contracts/webext.contract.ts +9 -25
  479. package/src/contracts/workflows.contract.ts +34 -58
  480. package/src/contracts/workspace.contract.ts +19 -50
  481. package/src/events/agent-events.ts +345 -0
  482. package/src/events/cards.ts +286 -0
  483. package/src/{events.test.ts → events/resume.test.ts} +4 -19
  484. package/src/events/resume.ts +60 -0
  485. package/src/events/system-events.ts +139 -0
  486. package/src/events/transcript.ts +320 -0
  487. package/src/{conversation-ids.test.ts → ids/conversation-ids.test.ts} +25 -13
  488. package/src/ids/conversation-ids.ts +178 -0
  489. package/src/ids/hostnames.ts +129 -0
  490. package/src/ids/session-names.ts +29 -0
  491. package/src/ids/share-paths.ts +43 -0
  492. package/src/{tunnel-ids.test.ts → ids/tunnel-ids.test.ts} +1 -14
  493. package/src/ids/tunnel-ids.ts +29 -0
  494. package/src/index.ts +71 -87
  495. package/src/{agent-catalog.test.ts → models/agent-catalog.test.ts} +19 -93
  496. package/src/models/agent-catalog.ts +174 -0
  497. package/src/models/agent-runtimes.ts +201 -0
  498. package/src/models/capability-ledger.test.ts +84 -0
  499. package/src/{fast-tier.test.ts → models/fast-tier.test.ts} +7 -18
  500. package/src/models/fast-tier.ts +36 -0
  501. package/src/{model-order.test.ts → models/model-order.test.ts} +54 -40
  502. package/src/models/model-order.ts +171 -0
  503. package/src/{model-pins.test.ts → models/model-pins.test.ts} +12 -46
  504. package/src/models/model-pins.ts +57 -0
  505. package/src/models/model-roles.test.ts +38 -0
  506. package/src/models/model-roles.ts +180 -0
  507. package/src/{plan-pools.test.ts → models/plan-pools.test.ts} +6 -11
  508. package/src/models/plan-pools.ts +65 -0
  509. package/src/{prompt-complexity.test.ts → models/prompt-complexity.test.ts} +8 -60
  510. package/src/models/prompt-complexity.ts +215 -0
  511. package/src/{provider-specs.test.ts → models/provider-specs.test.ts} +18 -47
  512. package/src/models/provider-specs.ts +272 -0
  513. package/src/policy/approvals-execution.ts +58 -0
  514. package/src/{batch-runs.test.ts → policy/batch-runs.test.ts} +4 -20
  515. package/src/policy/batch-runs.ts +137 -0
  516. package/src/policy/capability-secrets.ts +5 -0
  517. package/src/{card-status.ts → policy/card-status.ts} +11 -26
  518. package/src/{command-classes.test.ts → policy/command-classes.test.ts} +11 -118
  519. package/src/policy/command-classes.ts +395 -0
  520. package/src/policy/command-run.ts +65 -0
  521. package/src/policy/control-scopes.ts +38 -0
  522. package/src/{credential-material.test.ts → policy/credential-material.test.ts} +4 -26
  523. package/src/policy/credential-material.ts +91 -0
  524. package/src/policy/needs-action.ts +5 -0
  525. package/src/policy/output-fields.ts +86 -0
  526. package/src/policy/overlay-lint.ts +100 -0
  527. package/src/{owner-ticket.test.ts → policy/owner-ticket.test.ts} +1 -1
  528. package/src/{owner-ticket.ts → policy/owner-ticket.ts} +9 -31
  529. package/src/policy/safety-policy.test.ts +84 -0
  530. package/src/policy/safety-policy.ts +142 -0
  531. package/src/policy/search-globs.ts +60 -0
  532. package/src/protocol/container-requirements.test.ts +72 -0
  533. package/src/protocol/container-requirements.ts +58 -0
  534. package/src/protocol/host-protocol.ts +29 -0
  535. package/src/protocol/ingress-contract.ts +103 -0
  536. package/src/{ingress-protocol.test.ts → protocol/ingress-protocol.test.ts} +25 -90
  537. package/src/protocol/ingress-protocol.ts +441 -0
  538. package/src/protocol/listener-protocol.ts +75 -0
  539. package/src/{peer-dial.test.ts → protocol/peer-dial.test.ts} +52 -1
  540. package/src/protocol/peer-dial.ts +207 -0
  541. package/src/{peer-mcp-server.ts → protocol/peer-mcp-server.ts} +16 -41
  542. package/src/protocol/request-id.ts +5 -0
  543. package/src/{routes.test.ts → protocol/routes.test.ts} +14 -22
  544. package/src/protocol/routes.ts +159 -0
  545. package/src/protocol/runner-protocol.ts +197 -0
  546. package/src/protocol/terminal-protocol.ts +13 -0
  547. package/src/protocol/webext-links.ts +50 -0
  548. package/src/protocol/webext-protocol.ts +24 -0
  549. package/src/schemas/activity.ts +22 -30
  550. package/src/schemas/agent.ts +130 -238
  551. package/src/schemas/agents.ts +165 -483
  552. package/src/schemas/approvals.ts +23 -71
  553. package/src/schemas/automations.ts +142 -250
  554. package/src/schemas/capabilities.ts +127 -414
  555. package/src/schemas/ci.ts +56 -108
  556. package/src/schemas/codebase-health.ts +7 -11
  557. package/src/schemas/devices.ts +103 -321
  558. package/src/schemas/engines.ts +16 -44
  559. package/src/schemas/environment.ts +41 -91
  560. package/src/schemas/exit.ts +24 -81
  561. package/src/schemas/extension-updates.ts +42 -87
  562. package/src/schemas/git-history.ts +30 -84
  563. package/src/schemas/git.ts +141 -256
  564. package/src/schemas/history.ts +14 -40
  565. package/src/schemas/hosts.ts +9 -15
  566. package/src/schemas/inventory.ts +8 -10
  567. package/src/schemas/issues.ts +66 -134
  568. package/src/schemas/logs.ts +15 -34
  569. package/src/schemas/loops.ts +46 -163
  570. package/src/schemas/maintenance.ts +47 -172
  571. package/src/schemas/panels.ts +20 -45
  572. package/src/schemas/personas.ts +50 -200
  573. package/src/schemas/plan-limits.ts +58 -197
  574. package/src/schemas/ports.ts +14 -32
  575. package/src/schemas/provider-oauth.ts +23 -76
  576. package/src/schemas/provider-subscriptions.ts +4 -13
  577. package/src/schemas/public.ts +4 -15
  578. package/src/schemas/push.ts +8 -36
  579. package/src/schemas/secrets.ts +20 -64
  580. package/src/schemas/settings.ts +182 -602
  581. package/src/schemas/share.ts +14 -32
  582. package/src/schemas/shared.ts +14 -13
  583. package/src/schemas/system.ts +46 -78
  584. package/src/schemas/terminal.ts +41 -120
  585. package/src/schemas/usage.ts +44 -233
  586. package/src/schemas/version-seam.test.ts +9 -26
  587. package/src/schemas/vpn.ts +27 -64
  588. package/src/schemas/webext.ts +22 -53
  589. package/src/schemas/workflows.ts +57 -183
  590. package/src/schemas/workspace-repos.ts +12 -24
  591. package/src/schemas/workspace-search.ts +17 -35
  592. package/src/schemas/workspace-setup.ts +4 -11
  593. package/src/schemas/workspace-tree.ts +32 -91
  594. package/src/state/arrival.ts +109 -0
  595. package/src/state/contract-lock.test.ts +17 -0
  596. package/src/state/contract-lock.ts +49 -0
  597. package/src/state/definition.ts +143 -0
  598. package/src/state/history-state.ts +103 -0
  599. package/src/{runtime-state.test.ts → state/runtime-state.test.ts} +3 -10
  600. package/src/state/runtime-state.ts +63 -0
  601. package/src/state/starter.ts +5 -0
  602. package/src/state/state-portability.ts +27 -0
  603. package/src/state/versions.ts +26 -0
  604. package/src/{workspace-state.test.ts → state/workspace-state.test.ts} +65 -172
  605. package/src/state/workspace-state.ts +669 -0
  606. package/src/{documents.test.ts → text/documents.test.ts} +1 -1
  607. package/src/text/documents.ts +42 -0
  608. package/src/text/embed.ts +132 -0
  609. package/src/text/mentions.ts +21 -0
  610. package/src/text/model-answer.ts +9 -0
  611. package/src/text/path-refs.ts +39 -0
  612. package/src/text/shell-regions.ts +224 -0
  613. package/src/{title.test.ts → text/title.test.ts} +13 -32
  614. package/src/text/title.ts +202 -0
  615. package/src/{transcript-fold.test.ts → text/transcript-fold.test.ts} +5 -83
  616. package/src/{transcript-fold.ts → text/transcript-fold.ts} +65 -170
  617. package/src/text/whisper.test.ts +19 -0
  618. package/src/text/whisper.ts +17 -0
  619. package/src/{workflow-faults.test.ts → text/workflow-faults.test.ts} +6 -24
  620. package/src/{workflow-faults.ts → text/workflow-faults.ts} +20 -60
  621. package/dist/agent-catalog.d.ts.map +0 -1
  622. package/dist/agent-catalog.js.map +0 -1
  623. package/dist/agent-runtimes.d.ts.map +0 -1
  624. package/dist/agent-runtimes.js.map +0 -1
  625. package/dist/approvals-execution.d.ts.map +0 -1
  626. package/dist/approvals-execution.js.map +0 -1
  627. package/dist/arrival.d.ts.map +0 -1
  628. package/dist/arrival.js.map +0 -1
  629. package/dist/batch-runs.d.ts.map +0 -1
  630. package/dist/batch-runs.js.map +0 -1
  631. package/dist/capability-env.d.ts.map +0 -1
  632. package/dist/capability-env.js.map +0 -1
  633. package/dist/capability-secrets.d.ts.map +0 -1
  634. package/dist/capability-secrets.js.map +0 -1
  635. package/dist/card-status.d.ts.map +0 -1
  636. package/dist/card-status.js.map +0 -1
  637. package/dist/command-classes.d.ts.map +0 -1
  638. package/dist/command-classes.js.map +0 -1
  639. package/dist/command-run.d.ts.map +0 -1
  640. package/dist/command-run.js.map +0 -1
  641. package/dist/contract-lock.d.ts.map +0 -1
  642. package/dist/contract-lock.js.map +0 -1
  643. package/dist/conversation-ids.d.ts +0 -4
  644. package/dist/conversation-ids.d.ts.map +0 -1
  645. package/dist/conversation-ids.js.map +0 -1
  646. package/dist/credential-material.d.ts.map +0 -1
  647. package/dist/credential-material.js.map +0 -1
  648. package/dist/definition.d.ts.map +0 -1
  649. package/dist/definition.js.map +0 -1
  650. package/dist/documents.d.ts.map +0 -1
  651. package/dist/documents.js.map +0 -1
  652. package/dist/embed.d.ts.map +0 -1
  653. package/dist/embed.js.map +0 -1
  654. package/dist/events.d.ts +0 -4336
  655. package/dist/events.d.ts.map +0 -1
  656. package/dist/events.js +0 -725
  657. package/dist/events.js.map +0 -1
  658. package/dist/fast-tier.d.ts.map +0 -1
  659. package/dist/fast-tier.js.map +0 -1
  660. package/dist/history-state.d.ts.map +0 -1
  661. package/dist/history-state.js.map +0 -1
  662. package/dist/host-protocol.d.ts.map +0 -1
  663. package/dist/host-protocol.js.map +0 -1
  664. package/dist/hostnames.d.ts.map +0 -1
  665. package/dist/hostnames.js.map +0 -1
  666. package/dist/ingress-contract.d.ts.map +0 -1
  667. package/dist/ingress-contract.js.map +0 -1
  668. package/dist/ingress-protocol.d.ts.map +0 -1
  669. package/dist/ingress-protocol.js.map +0 -1
  670. package/dist/listener-protocol.d.ts.map +0 -1
  671. package/dist/listener-protocol.js.map +0 -1
  672. package/dist/mentions.d.ts.map +0 -1
  673. package/dist/mentions.js.map +0 -1
  674. package/dist/model-order.d.ts.map +0 -1
  675. package/dist/model-order.js.map +0 -1
  676. package/dist/model-pins.d.ts.map +0 -1
  677. package/dist/model-pins.js.map +0 -1
  678. package/dist/model-roles.d.ts.map +0 -1
  679. package/dist/model-roles.js.map +0 -1
  680. package/dist/needs-action.d.ts.map +0 -1
  681. package/dist/needs-action.js.map +0 -1
  682. package/dist/output-fields.d.ts.map +0 -1
  683. package/dist/output-fields.js.map +0 -1
  684. package/dist/overlay-lint.d.ts.map +0 -1
  685. package/dist/overlay-lint.js.map +0 -1
  686. package/dist/owner-ticket.d.ts.map +0 -1
  687. package/dist/owner-ticket.js.map +0 -1
  688. package/dist/path-refs.d.ts.map +0 -1
  689. package/dist/path-refs.js.map +0 -1
  690. package/dist/peer-dial.d.ts.map +0 -1
  691. package/dist/peer-dial.js.map +0 -1
  692. package/dist/peer-mcp-server.d.ts.map +0 -1
  693. package/dist/peer-mcp-server.js.map +0 -1
  694. package/dist/plan-pools.d.ts.map +0 -1
  695. package/dist/plan-pools.js.map +0 -1
  696. package/dist/prompt-complexity.d.ts.map +0 -1
  697. package/dist/prompt-complexity.js.map +0 -1
  698. package/dist/provider-specs.d.ts.map +0 -1
  699. package/dist/provider-specs.js.map +0 -1
  700. package/dist/request-id.d.ts.map +0 -1
  701. package/dist/request-id.js.map +0 -1
  702. package/dist/routes.d.ts.map +0 -1
  703. package/dist/routes.js.map +0 -1
  704. package/dist/runner-protocol.d.ts.map +0 -1
  705. package/dist/runner-protocol.js.map +0 -1
  706. package/dist/runtime-state.d.ts.map +0 -1
  707. package/dist/runtime-state.js.map +0 -1
  708. package/dist/safety-policy.d.ts.map +0 -1
  709. package/dist/safety-policy.js.map +0 -1
  710. package/dist/search-globs.d.ts.map +0 -1
  711. package/dist/search-globs.js.map +0 -1
  712. package/dist/session-names.d.ts.map +0 -1
  713. package/dist/session-names.js.map +0 -1
  714. package/dist/share-paths.d.ts.map +0 -1
  715. package/dist/share-paths.js.map +0 -1
  716. package/dist/shell-regions.d.ts.map +0 -1
  717. package/dist/shell-regions.js.map +0 -1
  718. package/dist/sse.d.ts.map +0 -1
  719. package/dist/sse.js.map +0 -1
  720. package/dist/starter.d.ts.map +0 -1
  721. package/dist/starter.js.map +0 -1
  722. package/dist/state-portability.d.ts.map +0 -1
  723. package/dist/state-portability.js.map +0 -1
  724. package/dist/terminal-protocol.d.ts.map +0 -1
  725. package/dist/terminal-protocol.js.map +0 -1
  726. package/dist/title.d.ts.map +0 -1
  727. package/dist/title.js.map +0 -1
  728. package/dist/transcript-fold.d.ts.map +0 -1
  729. package/dist/transcript-fold.js.map +0 -1
  730. package/dist/tunnel-ids.d.ts.map +0 -1
  731. package/dist/tunnel-ids.js.map +0 -1
  732. package/dist/versions.d.ts.map +0 -1
  733. package/dist/versions.js.map +0 -1
  734. package/dist/webext-links.d.ts.map +0 -1
  735. package/dist/webext-links.js.map +0 -1
  736. package/dist/webext-protocol.d.ts.map +0 -1
  737. package/dist/webext-protocol.js.map +0 -1
  738. package/dist/workflow-faults.d.ts.map +0 -1
  739. package/dist/workflow-faults.js.map +0 -1
  740. package/dist/workspace-state.d.ts.map +0 -1
  741. package/dist/workspace-state.js.map +0 -1
  742. package/src/agent-catalog.ts +0 -316
  743. package/src/agent-runtimes.ts +0 -419
  744. package/src/approvals-execution.ts +0 -96
  745. package/src/arrival.ts +0 -160
  746. package/src/batch-runs.ts +0 -188
  747. package/src/capability-ledger.test.ts +0 -140
  748. package/src/capability-secrets.ts +0 -20
  749. package/src/command-classes.ts +0 -617
  750. package/src/command-run.ts +0 -78
  751. package/src/contract-lock.test.ts +0 -23
  752. package/src/contract-lock.ts +0 -66
  753. package/src/conversation-ids.ts +0 -207
  754. package/src/credential-material.ts +0 -181
  755. package/src/definition.ts +0 -207
  756. package/src/documents.ts +0 -67
  757. package/src/embed.ts +0 -164
  758. package/src/events.ts +0 -1870
  759. package/src/fast-tier.ts +0 -72
  760. package/src/history-state.ts +0 -174
  761. package/src/host-protocol.ts +0 -36
  762. package/src/hostnames.ts +0 -180
  763. package/src/ingress-contract.ts +0 -157
  764. package/src/ingress-protocol.ts +0 -625
  765. package/src/listener-protocol.ts +0 -96
  766. package/src/mentions.ts +0 -25
  767. package/src/model-order.ts +0 -262
  768. package/src/model-pins.ts +0 -132
  769. package/src/model-roles.test.ts +0 -52
  770. package/src/model-roles.ts +0 -320
  771. package/src/needs-action.ts +0 -14
  772. package/src/output-fields.ts +0 -111
  773. package/src/overlay-lint.ts +0 -116
  774. package/src/path-refs.ts +0 -59
  775. package/src/peer-dial.ts +0 -163
  776. package/src/plan-pools.ts +0 -92
  777. package/src/prompt-complexity.ts +0 -334
  778. package/src/provider-specs.ts +0 -432
  779. package/src/request-id.ts +0 -41
  780. package/src/routes.ts +0 -219
  781. package/src/runner-protocol.ts +0 -239
  782. package/src/runtime-state.ts +0 -140
  783. package/src/safety-policy.test.ts +0 -88
  784. package/src/safety-policy.ts +0 -258
  785. package/src/search-globs.ts +0 -76
  786. package/src/session-names.ts +0 -44
  787. package/src/share-paths.ts +0 -68
  788. package/src/shell-regions.ts +0 -289
  789. package/src/starter.ts +0 -13
  790. package/src/state-portability.ts +0 -56
  791. package/src/terminal-protocol.ts +0 -16
  792. package/src/title.ts +0 -267
  793. package/src/tunnel-ids.ts +0 -57
  794. package/src/versions.ts +0 -48
  795. package/src/webext-links.ts +0 -90
  796. package/src/webext-protocol.ts +0 -27
  797. package/src/workspace-state.ts +0 -1090
  798. /package/dist/{hostnames.d.ts → ids/hostnames.d.ts} +0 -0
  799. /package/dist/{hostnames.js → ids/hostnames.js} +0 -0
  800. /package/dist/{session-names.d.ts → ids/session-names.d.ts} +0 -0
  801. /package/dist/{session-names.js → ids/session-names.js} +0 -0
  802. /package/dist/{share-paths.d.ts → ids/share-paths.d.ts} +0 -0
  803. /package/dist/{share-paths.js → ids/share-paths.js} +0 -0
  804. /package/dist/{agent-catalog.js → models/agent-catalog.js} +0 -0
  805. /package/dist/{agent-runtimes.d.ts → models/agent-runtimes.d.ts} +0 -0
  806. /package/dist/{agent-runtimes.js → models/agent-runtimes.js} +0 -0
  807. /package/dist/{fast-tier.js → models/fast-tier.js} +0 -0
  808. /package/dist/{model-order.d.ts → models/model-order.d.ts} +0 -0
  809. /package/dist/{model-pins.js → models/model-pins.js} +0 -0
  810. /package/dist/{plan-pools.js → models/plan-pools.js} +0 -0
  811. /package/dist/{prompt-complexity.d.ts → models/prompt-complexity.d.ts} +0 -0
  812. /package/dist/{prompt-complexity.js → models/prompt-complexity.js} +0 -0
  813. /package/dist/{provider-specs.d.ts → models/provider-specs.d.ts} +0 -0
  814. /package/dist/{provider-specs.js → models/provider-specs.js} +0 -0
  815. /package/dist/{approvals-execution.d.ts → policy/approvals-execution.d.ts} +0 -0
  816. /package/dist/{approvals-execution.js → policy/approvals-execution.js} +0 -0
  817. /package/dist/{capability-env.d.ts → policy/capability-env.d.ts} +0 -0
  818. /package/dist/{capability-env.js → policy/capability-env.js} +0 -0
  819. /package/dist/{capability-secrets.d.ts → policy/capability-secrets.d.ts} +0 -0
  820. /package/dist/{capability-secrets.js → policy/capability-secrets.js} +0 -0
  821. /package/dist/{command-run.js → policy/command-run.js} +0 -0
  822. /package/dist/{credential-material.d.ts → policy/credential-material.d.ts} +0 -0
  823. /package/dist/{credential-material.js → policy/credential-material.js} +0 -0
  824. /package/dist/{needs-action.d.ts → policy/needs-action.d.ts} +0 -0
  825. /package/dist/{needs-action.js → policy/needs-action.js} +0 -0
  826. /package/dist/{output-fields.d.ts → policy/output-fields.d.ts} +0 -0
  827. /package/dist/{output-fields.js → policy/output-fields.js} +0 -0
  828. /package/dist/{overlay-lint.d.ts → policy/overlay-lint.d.ts} +0 -0
  829. /package/dist/{overlay-lint.js → policy/overlay-lint.js} +0 -0
  830. /package/dist/{owner-ticket.d.ts → policy/owner-ticket.d.ts} +0 -0
  831. /package/dist/{search-globs.d.ts → policy/search-globs.d.ts} +0 -0
  832. /package/dist/{search-globs.js → policy/search-globs.js} +0 -0
  833. /package/dist/{ingress-contract.d.ts → protocol/ingress-contract.d.ts} +0 -0
  834. /package/dist/{ingress-protocol.d.ts → protocol/ingress-protocol.d.ts} +0 -0
  835. /package/dist/{ingress-protocol.js → protocol/ingress-protocol.js} +0 -0
  836. /package/dist/{listener-protocol.d.ts → protocol/listener-protocol.d.ts} +0 -0
  837. /package/dist/{peer-mcp-server.d.ts → protocol/peer-mcp-server.d.ts} +0 -0
  838. /package/dist/{peer-mcp-server.js → protocol/peer-mcp-server.js} +0 -0
  839. /package/dist/{request-id.d.ts → protocol/request-id.d.ts} +0 -0
  840. /package/dist/{request-id.js → protocol/request-id.js} +0 -0
  841. /package/dist/{routes.d.ts → protocol/routes.d.ts} +0 -0
  842. /package/dist/{routes.js → protocol/routes.js} +0 -0
  843. /package/dist/{sse.d.ts → protocol/sse.d.ts} +0 -0
  844. /package/dist/{sse.js → protocol/sse.js} +0 -0
  845. /package/dist/{terminal-protocol.js → protocol/terminal-protocol.js} +0 -0
  846. /package/dist/{webext-links.d.ts → protocol/webext-links.d.ts} +0 -0
  847. /package/dist/{webext-links.js → protocol/webext-links.js} +0 -0
  848. /package/dist/{arrival.d.ts → state/arrival.d.ts} +0 -0
  849. /package/dist/{contract-lock.d.ts → state/contract-lock.d.ts} +0 -0
  850. /package/dist/{history-state.d.ts → state/history-state.d.ts} +0 -0
  851. /package/dist/{runtime-state.d.ts → state/runtime-state.d.ts} +0 -0
  852. /package/dist/{runtime-state.js → state/runtime-state.js} +0 -0
  853. /package/dist/{starter.d.ts → state/starter.d.ts} +0 -0
  854. /package/dist/{starter.js → state/starter.js} +0 -0
  855. /package/dist/{state-portability.d.ts → state/state-portability.d.ts} +0 -0
  856. /package/dist/{state-portability.js → state/state-portability.js} +0 -0
  857. /package/dist/{versions.d.ts → state/versions.d.ts} +0 -0
  858. /package/dist/{versions.js → state/versions.js} +0 -0
  859. /package/dist/{embed.d.ts → text/embed.d.ts} +0 -0
  860. /package/dist/{embed.js → text/embed.js} +0 -0
  861. /package/dist/{mentions.d.ts → text/mentions.d.ts} +0 -0
  862. /package/dist/{mentions.js → text/mentions.js} +0 -0
  863. /package/dist/{path-refs.d.ts → text/path-refs.d.ts} +0 -0
  864. /package/dist/{path-refs.js → text/path-refs.js} +0 -0
  865. /package/dist/{shell-regions.js → text/shell-regions.js} +0 -0
  866. /package/dist/{title.d.ts → text/title.d.ts} +0 -0
  867. /package/dist/{title.js → text/title.js} +0 -0
  868. /package/src/{hostnames.test.ts → ids/hostnames.test.ts} +0 -0
  869. /package/src/{share-paths.test.ts → ids/share-paths.test.ts} +0 -0
  870. /package/src/{capability-env.ts → policy/capability-env.ts} +0 -0
  871. /package/src/{overlay-lint.test.ts → policy/overlay-lint.test.ts} +0 -0
  872. /package/src/{search-globs.test.ts → policy/search-globs.test.ts} +0 -0
  873. /package/src/{ingress-contract.test.ts → protocol/ingress-contract.test.ts} +0 -0
  874. /package/src/{peer-mcp-server.test.ts → protocol/peer-mcp-server.test.ts} +0 -0
  875. /package/src/{sse.ts → protocol/sse.ts} +0 -0
  876. /package/src/{versions.test.ts → state/versions.test.ts} +0 -0
  877. /package/src/{embed.test.ts → text/embed.test.ts} +0 -0
  878. /package/src/{mentions.test.ts → text/mentions.test.ts} +0 -0
  879. /package/src/{path-refs.test.ts → text/path-refs.test.ts} +0 -0
@@ -0,0 +1,201 @@
1
+ // What each agentic loop can do, one record per runtime, nothing about which provider runs on it. A capability is
2
+ // listed only if something reads it: a gate, a control, or limitationsOf. This file is the bottom of the provider graph
3
+ // and imports nothing from the rest of the contract, so the arrow points one way.
4
+
5
+ // An execution backend: one way a turn runs its own work, named for AgentCapabilities.execution and the persona switch
6
+ // that grants it.
7
+ export type ExecutionBackend = "shell" | "js";
8
+
9
+ export interface AgentCapabilities {
10
+ // Which loop serves the turn; `opencode-gemini` stays separate since adapter health keys off this field.
11
+ readonly runtime: "claude-code" | "codex" | "opencode" | "opencode-gemini" | "acp" | "pi" | "cursor";
12
+ // Mid-turn injection (the SteeringQueue behind /agent/steer); needs the SDK's streaming-input mode.
13
+ readonly steering: boolean;
14
+ // How much of the permission-mode axis the runtime honours: every PermissionMode, or just propose-then-approve.
15
+ readonly permissions: "modes" | "plan";
16
+ // Can stop mid-turn and ask the user a multiple-choice question (`question` frames).
17
+ readonly questions: boolean;
18
+ // Which tools reach the agent, full down to none; never rounded up or down from what a runtime has.
19
+ readonly mcp: "full" | "tools" | "browser" | "http" | "none";
20
+ // Which ways of executing the daemon stands behind here; distinct from `mcp`, which names tools, not execution.
21
+ readonly execution: readonly ExecutionBackend[];
22
+ // Reasoning-effort selection is forwarded to the model.
23
+ readonly effort: boolean;
24
+ // Whether the loop can ask for fast speed; the route's own answer is decided separately, at the endpoint.
25
+ readonly fastMode: boolean;
26
+ // How an isolated turn's worktree is enforced: a mount namespace, or merely cwd'd in, /work still shared.
27
+ readonly isolation: "namespace" | "cwd";
28
+ // Publishes its slash commands (`commands` frames) for the composer's `/` popover.
29
+ readonly commands: boolean;
30
+ // Runs its shell in a tmux session the terminal panel can attach to (`terminal` frames).
31
+ readonly terminals: boolean;
32
+ // Fails with the coded frames auto-resume keys off, so a turn the provider killed is re-run once it's back.
33
+ readonly recovery: boolean;
34
+ // How much of the owner's instructions this runtime takes: replace the base, append to it, or no seam at all.
35
+ readonly instructions: "replace" | "append" | "none";
36
+ // How the runtime discovers loaded skills: scans its own filesystem, or the daemon names them in the opener.
37
+ readonly skillDiscovery: "native" | "prompt";
38
+ // Whether the owner's safety policy reaches this runtime, and how:
39
+ // hooks - its own pre-execution hook can park a call and wait for a card (Claude Code only).
40
+ // approval - a vendor approval channel the daemon answers from policy; the vendor picks which calls to raise.
41
+ // refuse-only - the same channel, but a clock forces a refusal instead of a park.
42
+ // none - no seam before a command runs; treated as tainted, never as clean.
43
+ readonly rulebook: "hooks" | "approval" | "refuse-only" | "none";
44
+ // Whether a credential is masked; "none" is structural, only the Claude Code loop can rewrite a model's read.
45
+ readonly secrets: "masked" | "none";
46
+ }
47
+
48
+ // The Claude Code Agent SDK loop, the ceiling every other runtime is measured against: the only one that owns the whole
49
+ // request (permission callbacks, the ask tool, plugins, hooks, the mount-namespace spawn seam).
50
+ export const CLAUDE_CODE: AgentCapabilities = {
51
+ runtime: "claude-code",
52
+ steering: true,
53
+ permissions: "modes",
54
+ questions: true,
55
+ mcp: "full",
56
+ // The one loop with a seam for the daemon's own backend, so it hosts JS beside its Bash.
57
+ execution: ["shell", "js"],
58
+ effort: true,
59
+ fastMode: true,
60
+ isolation: "namespace",
61
+ commands: true,
62
+ terminals: true,
63
+ recovery: true,
64
+ instructions: "replace",
65
+ skillDiscovery: "native",
66
+ // The only runtime with its own pre-execution hook, so the only one where a hold can park instead of refusing.
67
+ rulebook: "hooks",
68
+ secrets: "masked",
69
+ };
70
+
71
+ // Codex app-server: item-level events, process-backed MCP, and four seams (steer, a question request, the skills list,
72
+ // the shared mount namespace). Daemon-side servers, plugins, server approvals stay unwired.
73
+ export const CODEX: AgentCapabilities = {
74
+ runtime: "codex",
75
+ steering: true,
76
+ permissions: "plan",
77
+ questions: true,
78
+ mcp: "browser",
79
+ execution: ["shell"],
80
+ effort: true,
81
+ fastMode: false,
82
+ isolation: "namespace",
83
+ commands: true,
84
+ terminals: false,
85
+ recovery: false,
86
+ // Both ride the per-thread config: one replaces Codex's base prompt, the other adds a developer message.
87
+ instructions: "replace",
88
+ skillDiscovery: "native",
89
+ // Asked only when the owner has written command rules; an unconfigured workspace pays nothing for it.
90
+ rulebook: "approval",
91
+ secrets: "none",
92
+ };
93
+
94
+ // OpenCode (the Grok runtime): its own agentic loop, its own tools, allow-all permissions. Takes a model id, a prompt
95
+ // and one system message of ours; no effort scale, no tools of ours, no command list.
96
+ export const OPENCODE: AgentCapabilities = {
97
+ runtime: "opencode",
98
+ steering: false,
99
+ permissions: "plan",
100
+ questions: false,
101
+ mcp: "none",
102
+ execution: ["shell"],
103
+ effort: false,
104
+ fastMode: false,
105
+ isolation: "cwd",
106
+ commands: false,
107
+ terminals: false,
108
+ recovery: false,
109
+ // `system` on the prompt body, per message; adds to OpenCode's own prompt, with no seam to replace it.
110
+ instructions: "append",
111
+ skillDiscovery: "prompt",
112
+ // refuse-only for its inactivity watchdog, not its protocol: a paused approval reads as a stalled turn.
113
+ rulebook: "refuse-only",
114
+ secrets: "none",
115
+ };
116
+
117
+ // The same OpenCode loop, serving Gemini instead of xAI, identical abilities. The Claude Code loop announces itself in
118
+ // every request, which Google's Antigravity channel refuses; this loop's prompt makes no such announcement.
119
+ export const OPENCODE_GEMINI: AgentCapabilities = {
120
+ ...OPENCODE,
121
+ runtime: "opencode-gemini",
122
+ };
123
+
124
+ // Any agent speaking the Agent Client Protocol: a documented floor, not the native ceiling. Publishes commands and
125
+ // terminals, takes http MCP tools when offered, but owns its own model, effort and permission posture.
126
+ export const ACP: AgentCapabilities = {
127
+ runtime: "acp",
128
+ steering: false,
129
+ permissions: "plan",
130
+ questions: false,
131
+ mcp: "http",
132
+ execution: ["shell"],
133
+ effort: false,
134
+ fastMode: false,
135
+ isolation: "cwd",
136
+ commands: true,
137
+ terminals: true,
138
+ recovery: false,
139
+ // ACP's calls carry no system field: the agent owns its instructions, the persona note rides the message.
140
+ instructions: "none",
141
+ skillDiscovery: "prompt",
142
+ // In the protocol floor, so every agent has it; which calls it asks about is entirely its own choice.
143
+ rulebook: "approval",
144
+ secrets: "none",
145
+ };
146
+
147
+ // Pi driven over its RPC mode: above the ACP floor and below the Claude Code ceiling. Real mid-turn steering, an effort
148
+ // scale, and a published command list; no MCP seam, no approval channel, bash runs in-process with no terminal session.
149
+ export const PI: AgentCapabilities = {
150
+ runtime: "pi",
151
+ steering: true,
152
+ permissions: "plan",
153
+ questions: false,
154
+ mcp: "none",
155
+ execution: ["shell"],
156
+ effort: true,
157
+ fastMode: false,
158
+ isolation: "cwd",
159
+ commands: true,
160
+ terminals: false,
161
+ recovery: false,
162
+ // Pi's RPC sets no standing instructions; like ACP, it hears the persona note through the user message.
163
+ instructions: "none",
164
+ skillDiscovery: "prompt",
165
+ // The one runtime with no seam at all: bash runs in-process, and no rule the owner writes can apply.
166
+ rulebook: "none",
167
+ secrets: "none",
168
+ };
169
+
170
+ // Cursor's own runtime, driven through `@cursor/sdk` in this daemon's process; an embedding surface, so most seams
171
+ // other runtimes lack are function arguments here. The harness axis doesn't apply: the SDK is the only door.
172
+ export const CURSOR: AgentCapabilities = {
173
+ runtime: "cursor",
174
+ // The SDK's Run can be cancelled but not written to mid-flight; a second send errors rather than injecting.
175
+ steering: false,
176
+ // Cursor's own plan mode, not this repo's emulation; not "modes" since the hook can't gate the whole surface.
177
+ permissions: "plan",
178
+ // True since the daemon supplies its own ask tool; Cursor's own can fabricate an answer, so it's disallowed.
179
+ questions: true,
180
+ // stdio + http/sse MCP servers plus host callbacks; everything but a Claude Code plugin checkout.
181
+ mcp: "tools",
182
+ execution: ["shell"],
183
+ // Cursor publishes effort as model parameters, not one scale; true here just means it's forwardable at all.
184
+ effort: true,
185
+ fastMode: false,
186
+ // cwd: Cursor's loop runs inside the daemon's own process, whose /work must stay the shared checkout.
187
+ isolation: "cwd",
188
+ // Cursor's commands are files on disk the SDK loads but doesn't publish back, so there's no list to offer.
189
+ commands: false,
190
+ // The SDK runs its shell in-process; there is no tmux session for the terminal panel to attach to.
191
+ terminals: false,
192
+ // The SDK throws typed errors instead of dissolving a refusal into prose, so the adapter files coded frames.
193
+ recovery: true,
194
+ // append, reached differently: `beforeSubmitPrompt`'s reply folds the prompt onto Cursor's base, unreplaceable.
195
+ instructions: "append",
196
+ skillDiscovery: "prompt",
197
+ // The full hook tier, the only foreign runtime to reach it: a hold parks since the vendor waits on the hook.
198
+ rulebook: "hooks",
199
+ // none, structurally: its hooks only allow/deny or are discarded, nothing here to substitute a reference into.
200
+ secrets: "none",
201
+ };
@@ -0,0 +1,84 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { capabilitiesOf, limitationsOf } from "./agent-catalog.js";
3
+ import type { AgentCapabilities } from "./agent-runtimes.js";
4
+
5
+ // Whether a capability claim is backed by an enforcement seam or merely descriptive prose reaching the user through
6
+ // limitationsOf; the split must stay exhaustive against AgentCapabilities.
7
+
8
+ type Backing = "enforced" | "descriptive";
9
+
10
+ const LEDGER: Record<keyof AgentCapabilities, Backing> = {
11
+ // adapter-registry.ts maps this runtime to its serving adapter; also keys per-runtime health probes.
12
+ runtime: "enforced",
13
+ // conversation.ts's `steerable`: the composer offers mid-turn injection only where there is a queue.
14
+ steering: "enforced",
15
+ // turn-plan.ts forwards permissionMode only under "modes"; the composer's mode list is built from it.
16
+ permissions: "enforced",
17
+ // turn-plan.ts opens the tool seam on "full"; anything less gets the setup notice instead.
18
+ mcp: "enforced",
19
+ // turn-plan.ts drops effort unless the runtime takes it; ComposerEffort.vue renders no scale without it.
20
+ effort: "enforced",
21
+ // turn-plan.ts drops fast unless the loop can request it; fastAllowed, not this field, is the real answer.
22
+ fastMode: "enforced",
23
+ // turn-plan.ts tells a "cwd" turn its worktree path; under "namespace" the mount makes that unnecessary.
24
+ isolation: "enforced",
25
+ // system-prompt.ts composes standing instructions against this: replace, append, or a user-message note.
26
+ instructions: "enforced",
27
+ // turn-plan.ts notes the catalogue only for "prompt"; "native" runtimes use their own loader instead.
28
+ skillDiscovery: "enforced",
29
+ // turn-plan.ts plans jsExecution only where "js" is declared; without it no Code tool is mounted.
30
+ execution: "enforced",
31
+ // turn-plan.ts carries this on every request; guard/turn-gate.ts derives the gate's shape from it:
32
+ // - none: no consult, taint bit stays permanently set
33
+ // - refuse-only: a hold refuses instead of parking
34
+ // - other values: park on a card
35
+ rulebook: "enforced",
36
+
37
+ // Descriptive: true of the runtime but nothing consults these; wiring one up moves it to enforced.
38
+ questions: "descriptive",
39
+ commands: "descriptive",
40
+ terminals: "descriptive",
41
+ recovery: "descriptive",
42
+ // descriptive: only the Claude Code loop can mask a secret before the model reads it, via its PostToolUse hook.
43
+ secrets: "descriptive",
44
+ };
45
+
46
+ // Every ability true, read live from the catalog: the ceiling limitationsOf has nothing to disclose against.
47
+ const CEILING = capabilitiesOf("claude", "native");
48
+
49
+ const fieldsWhere = (backing: Backing): (keyof AgentCapabilities)[] =>
50
+ (Object.keys(LEDGER) as (keyof AgentCapabilities)[]).filter((field) => LEDGER[field] === backing);
51
+
52
+ it("classifies exactly the fields a live record carries", () => {
53
+ expect(Object.keys(LEDGER).toSorted()).toEqual(Object.keys(CEILING).toSorted());
54
+ });
55
+
56
+ // Checked per field rather than by an aggregate count, so one field silently contributing nothing still fails.
57
+ describe("a descriptive claim reaches the user", () => {
58
+ it("has something to disclose against: the ceiling discloses nothing", () => {
59
+ expect(limitationsOf(CEILING)).toEqual([]);
60
+ });
61
+
62
+ // A boolean field's floor is false; every other descriptive field must name its own weak value here.
63
+ const DIMINISHED: Partial<Record<keyof AgentCapabilities, unknown>> = { secrets: "none" };
64
+
65
+ it.each(fieldsWhere("descriptive"))("%s puts its own sentence in the picker when the runtime lacks it", (field) => {
66
+ const boolean = typeof CEILING[field] === "boolean";
67
+ // A boolean's floor is false and needs no entry here; every other descriptive field must have one or this
68
+ // fails.
69
+ expect(
70
+ boolean ? [field] : Object.keys(DIMINISHED),
71
+ `${field} is descriptive and not a boolean: add its weakest value to DIMINISHED above`,
72
+ ).toContain(field);
73
+ const floor = boolean ? false : DIMINISHED[field];
74
+
75
+ const lacking: AgentCapabilities = { ...CEILING, [field]: floor };
76
+
77
+ expect(limitationsOf(lacking)).toHaveLength(1);
78
+ });
79
+ });
80
+
81
+ it("is a real split: neither side is empty", () => {
82
+ expect(fieldsWhere("enforced").length).toBeGreaterThan(0);
83
+ expect(fieldsWhere("descriptive").length).toBeGreaterThan(0);
84
+ });
@@ -1,13 +1,8 @@
1
1
  import { expect, test } from "vitest";
2
2
  import { fastTierModel } from "./fast-tier.js";
3
3
 
4
- /* WHERE A DOWNGRADED TURN ACTUALLY LANDS. The judge (prompt-complexity.ts) says a turn could be cheaper; this
5
- * says whether there is anywhere cheaper to put it, on the provider it is already on.
6
- *
7
- * Two properties carry the whole feature, and everything below is one of them: a downgrade is only ever to a
8
- * genuinely CHEAPER rung of the same catalog (so "cheaper" can never quietly become "older", or "the same model
9
- * with less thinking"), and it never crosses PROVIDER (because that retires the conversation's session, which
10
- * throws away the context that made the follow-up cheap to answer in the first place). */
4
+ // Whether a downgraded turn has anywhere cheaper to land on its current provider; a downgrade must be a genuinely
5
+ // cheaper rung of the same catalog and never cross provider, since that retires the session.
11
6
 
12
7
  const CLAUDE = [`claude-opus-5`, `claude-sonnet-5`, `claude-haiku-4-5-20251001`];
13
8
  const GOOGLE = [`gemini-3-pro`, `gemini-3-flash`, `gemini-3-flash-lite`];
@@ -28,20 +23,16 @@ test("reads the cheap end the same way the quick model does, on every vendor's v
28
23
  // --- the ceiling: the user's own pick -------------------------------------------------------------------
29
24
 
30
25
  test("a user already on the cheap rung has nowhere to be sent", () => {
31
- // The common case worth being exact about rather than an edge case. Undefined means "run what they asked
32
- // for", which is the honest answer and the one that costs nothing to be wrong about.
26
+ // undefined means run the original pick: the safe default when nothing is cheaper.
33
27
  expect(fastFor(`claude-haiku-4-5-20251001`)).toBeUndefined();
34
28
  });
35
29
 
36
30
  test("never swaps a model for an older build of the same tier", () => {
37
- // A downgrade has to be legible AS a downgrade. Last year's Sonnet under this year's Sonnet is not a
38
- // saving the feature promised, it is a different turn wearing the user's own model name.
39
31
  expect(fastFor(`claude-sonnet-5`, { models: [`claude-sonnet-5`, `claude-sonnet-4`] })).toBeUndefined();
40
32
  });
41
33
 
42
34
  test("never downgrades a model whose family this build does not recognise", () => {
43
- // An id carrying no tier word is a provider's base line or a family nobody here has heard of, and betting
44
- // a user's turn on the guess that an unknown id is the budget one is the wrong direction to be wrong in.
35
+ // An id with no tier word is either the provider's own baseline or an unrecognised family.
45
36
  expect(fastFor(`claude-opus-5`, { models: [`some-new-thing`] })).toBeUndefined();
46
37
  expect(fastFor(`some-new-thing`, { models: CLAUDE })).toBeUndefined();
47
38
  });
@@ -61,19 +52,17 @@ test("a pin on this provider wins over the catalog's own cheap end", () => {
61
52
  });
62
53
 
63
54
  test("takes a pinned id verbatim, so a model the static catalog has not caught up with is still pinnable", () => {
64
- // The same call readyChain makes, and for the same reason: the picker offers a custom-id escape
65
- // hatch, and second-guessing the id here would run a different model than the settings row names.
55
+ // Takes a pinned id verbatim: second-guessing it would run a different model than the settings row names.
66
56
  expect(fastFor(`claude-opus-5`, { pinned: [`claude:claude-haiku-9`] })).toBe(`claude-haiku-9`);
67
57
  });
68
58
 
69
59
  test("drops a pin naming another provider rather than crossing to it", () => {
70
- // Switching provider retires the conversation's session (turnRequest.ts `resumes`). Starting the
71
- // conversation over to save a fraction of a cent is not a saving, so the pin is ignored and Auto answers.
60
+ // Crossing provider retires the session (turnRequest.ts's resumes); the pin is ignored instead.
72
61
  expect(fastFor(`claude-opus-5`, { pinned: [`gemini:gemini-3-flash-lite`] })).toBe(`claude-haiku-4-5-20251001`);
73
62
  });
74
63
 
75
64
  test("skips a pin that is not actually cheaper than what the user picked", () => {
76
- // A pin is a preference about WHICH cheap rung, never a licence to swap a model for its equal or better.
65
+ // A pin picks which cheap rung, never licence to swap to an equal or better model.
77
66
  expect(fastFor(`claude-sonnet-5`, { pinned: [`claude:claude-opus-5`] })).toBe(`claude-haiku-4-5-20251001`);
78
67
  });
79
68
 
@@ -0,0 +1,36 @@
1
+ import { compareCheapestFirst, isCheaperRung } from "./model-order.js";
2
+ import { parsePinned } from "./model-pins.js";
3
+ import type { AgentProvider } from "../schemas/agent.js";
4
+
5
+ // Picks which model a downgraded turn runs on, once prompt-complexity.ts decides a turn could be cheaper. Only routes
6
+ // down to a cheaper rung of the model the user already picked; ambiguous cases resolve to undefined, meaning run their
7
+ // pick. Never crosses provider: that retires the session and loses the context that made the follow-up cheap.
8
+
9
+ export interface FastTierInput {
10
+ readonly provider: AgentProvider;
11
+ // Empty means the composer has not resolved a pick yet; that resolves to no downgrade, not a guess.
12
+ readonly model: string;
13
+ // Empty is a real state (catalog not loaded yet), and resolves to no downgrade rather than a guess.
14
+ readonly models: readonly string[];
15
+ // settings.autoFastModels: ordered `${provider}:${modelId}` keys, empty for Auto; other providers drop.
16
+ readonly pinned: readonly string[];
17
+ }
18
+
19
+ // A pin is taken verbatim but must still be cheaper than the pick; Auto falls back to the cheapest rung, in the same
20
+ // cheap-first order the quick model uses. Undefined means nothing is cheaper.
21
+ export const fastTierModel = (input: FastTierInput): string | undefined => {
22
+ if (input.model === "") {
23
+ return undefined;
24
+ }
25
+ const pinned = input.pinned
26
+ .flatMap((key) => {
27
+ const choice = parsePinned(key);
28
+ return choice === undefined || choice.provider !== input.provider ? [] : [choice.model];
29
+ })
30
+ .find((model) => isCheaperRung(model, input.model));
31
+ if (pinned !== undefined) {
32
+ return pinned;
33
+ }
34
+ const cheapest = input.models.toSorted(compareCheapestFirst)[0];
35
+ return cheapest !== undefined && isCheaperRung(cheapest, input.model) ? cheapest : undefined;
36
+ };
@@ -1,17 +1,14 @@
1
1
  import { expect, test } from "vitest";
2
2
  import { compareCheapestFirst, compareModelIds, compareUnrankedModelIds, familyOf, namesThinking, releaseOf, tierRankOf } from "./model-order.js";
3
3
 
4
- /* The order every provider's catalog is served and browsed in. The rule exists because only Anthropic publishes
5
- * a ranking: the OpenAI-compatible endpoints behind Codex, Gemini, Kimi and Grok hand back a SET, and taking
6
- * their registry order for a preference is what opened the Codex group on GPT 5.4 Mini and started fresh Codex
7
- * conversations on whichever id sorted first. */
4
+ // The order every provider's catalog is served and browsed in; only Anthropic's catalog arrives ranked, the rest hand
5
+ // back sets, so their registry order is not a preference.
8
6
 
9
7
  // A Codex catalog exactly as an OpenAI-compatible /v1/models hands it over: alphabetical, i.e. meaningless.
10
8
  const CODEX = ["gpt-5.1-codex", "gpt-5.4-mini", "gpt-5.5", "gpt-5.6-luna", "gpt-5.6-sol", "gpt-5.6-terra"];
11
9
 
12
10
  test("ranks the frontier line above the cheap one and the newest release above its predecessors", () => {
13
- // The base line (no tier word) leads, newest first; the mini rung sinks under all of it regardless of how
14
- // recently it shipped, which is the whole decision a user makes in this list.
11
+ // The base (no-tier) line leads, newest first; mini sinks below all of it regardless of recency.
15
12
  expect(CODEX.toSorted(compareModelIds)).toEqual(["gpt-5.6-sol", "gpt-5.6-terra", "gpt-5.6-luna", "gpt-5.5", "gpt-5.1-codex", "gpt-5.4-mini"]);
16
13
  });
17
14
 
@@ -43,13 +40,12 @@ test("the Codex release-tier order is stable across catalog refreshes", () => {
43
40
  for (const arrival of arrivals) {
44
41
  expect(arrival.toSorted(compareUnrankedModelIds)).toEqual(["gpt-5.6-sol", "gpt-5.6-terra", "gpt-5.6-luna"]);
45
42
  }
46
- // Same rule, so ranking still outranks the tiebreak: the mini rung stays at the tail, under every sibling.
43
+ // Ranking still outranks the tiebreak: mini stays at the tail under every sibling.
47
44
  expect(["gpt-5.4-mini", ...arrivals[0]!].toSorted(compareUnrankedModelIds).at(-1)).toBe("gpt-5.4-mini");
48
45
  });
49
46
 
50
47
  test("leaves a RANKED catalog's ties alone: the id tiebreak is for sets, and Anthropic publishes an opinion", () => {
51
- // compareUnrankedModelIds would seat claude-fable-5 ahead of claude-opus-5 on the id alone. Anthropic's
52
- // catalog arrives newest-first, so that order is a fact about the provider, not a leftover to be broken.
48
+ // compareUnrankedModelIds would rank fable ahead of opus by id; ranked catalogs keep the provider's own order.
53
49
  expect(["claude-opus-5", "claude-fable-5"].toSorted(compareModelIds)).toEqual(["claude-opus-5", "claude-fable-5"]);
54
50
  expect(["claude-opus-5", "claude-fable-5"].toSorted(compareUnrankedModelIds)).toEqual(["claude-fable-5", "claude-opus-5"]);
55
51
  });
@@ -82,20 +78,17 @@ test("reads Kimi's k-prefixed generation so K3 leads the K2.x catalog", () => {
82
78
  });
83
79
 
84
80
  test("the rightmost tier word wins, because tier words compose", () => {
85
- // flash-lite is the cheap end of Flash, codex-max the frontier end of Codex: reading the leftmost word
86
- // instead would file both under the tier they modify.
81
+ // flash-lite is Flash's cheap end, codex-max is Codex's frontier end; the leftmost word would misfile both.
87
82
  expect(tierRankOf(familyOf("gemini-3-flash-lite"))).toBe(tierRankOf("lite"));
88
83
  expect(tierRankOf(familyOf("gpt-5.1-codex-max"))).toBe(tierRankOf("max"));
89
84
  });
90
85
 
91
86
  test("leads with a family carrying no tier word at all, so a brand-new flagship is never buried by its novelty", () => {
92
- // The precise inverse of the ranking this replaced, which sank unrecognized ids BELOW the everyday tier.
93
87
  expect(["claude-sonnet-5", "claude-mythos-1", "claude-opus-5"].toSorted(compareModelIds)[0]).toBe("claude-mythos-1");
94
88
  });
95
89
 
96
90
  test("files a re-served open-weights model on the cheap rung, not at the head of the catalog it visits", () => {
97
- // Google's channel vends gpt-oss beside Gemini and Claude. It carries no tier word of its own, so the
98
- // lead-the-unknown rule would open that whole section on it: above Opus.
91
+ // gpt-oss also ships on Google's channel; with no tier word, lead-unknown would wrongly rank it above Opus.
99
92
  expect(["gpt-oss-120b-medium", "claude-opus-4-6-thinking", "gemini-pro-agent"].toSorted(compareModelIds)).toEqual([
100
93
  "claude-opus-4-6-thinking",
101
94
  "gemini-pro-agent",
@@ -103,8 +96,42 @@ test("files a re-served open-weights model on the cheap rung, not at the head of
103
96
  ]);
104
97
  });
105
98
 
99
+ // The Google channel as CLIProxyAPI publishes it: one row per thinking level, ids that agree on nothing. The catalog's
100
+ // head is the default a turn with no pin receives and the row an open chat is repointed to when its own pin goes
101
+ // missing, so which of these leads is a routing decision, not a cosmetic one.
102
+ const ANTIGRAVITY = [
103
+ "gemini-3.8-flash-high",
104
+ "gemini-3.6-flash-high",
105
+ "gemini-3.1-pro-low",
106
+ "gemini-3-flash",
107
+ "claude-sonnet-4-6",
108
+ "gpt-oss-120b-medium",
109
+ "gemini-3.1-flash-lite",
110
+ "claude-opus-4-6-thinking",
111
+ "gemini-3.7-flash-high",
112
+ "gemini-pro-agent",
113
+ ];
114
+
115
+ test("seats a quiet rung under its own tier's ordinary rows, whatever version its id claims", () => {
116
+ // Both are Gemini 3.1 Pro; only the quiet one says which level, and only the loud one omits the version. On release
117
+ // alone the Low row leads the tier and every unpinned Google turn opens on it.
118
+ expect(["gemini-3.1-pro-low", "gemini-pro-agent"].toSorted(compareUnrankedModelIds)).toEqual(["gemini-pro-agent", "gemini-3.1-pro-low"]);
119
+ expect(["claude-sonnet-4-6-minimal", "claude-sonnet-4-6"].toSorted(compareModelIds)).toEqual(["claude-sonnet-4-6", "claude-sonnet-4-6-minimal"]);
120
+ // Only BELOW the default is quiet: a loud row keeps its release, so the newer model still leads its tier.
121
+ expect(["claude-opus-4-6-thinking", "claude-opus-5"].toSorted(compareModelIds)).toEqual(["claude-opus-5", "claude-opus-4-6-thinking"]);
122
+ expect(["gpt-oss-120b-medium", "gpt-oss-120b-low"].toSorted(compareModelIds)).toEqual(["gpt-oss-120b-medium", "gpt-oss-120b-low"]);
123
+ });
124
+
125
+ test("hands the Google channel a default that is a frontier row, before and after its Opus row goes missing", () => {
126
+ expect(ANTIGRAVITY.toSorted(compareUnrankedModelIds)[0]).toBe("claude-opus-4-6-thinking");
127
+ // What the picker and every unpinned turn fall to while the channel is out of Opus capacity: Pro at its own level,
128
+ // not the same model's Low row.
129
+ expect(ANTIGRAVITY.filter((id) => id !== "claude-opus-4-6-thinking").toSorted(compareUnrankedModelIds)[0]).toBe("gemini-pro-agent");
130
+ // The quiet row still sorts above every lesser tier: demoted within Pro, not out of it.
131
+ expect(ANTIGRAVITY.toSorted(compareUnrankedModelIds).slice(0, 3)).toEqual(["claude-opus-4-6-thinking", "gemini-pro-agent", "gemini-3.1-pro-low"]);
132
+ });
133
+
106
134
  test("keeps the arrival order between ids the rule cannot separate: Anthropic's catalog IS ranked", () => {
107
- // Same tier, same version: nothing here outranks the order the provider itself reported.
108
135
  expect(["claude-opus-5", "claude-fable-5"].toSorted(compareModelIds)).toEqual(["claude-opus-5", "claude-fable-5"]);
109
136
  expect(["claude-fable-5", "claude-opus-5"].toSorted(compareModelIds)).toEqual(["claude-fable-5", "claude-opus-5"]);
110
137
  });
@@ -123,8 +150,6 @@ test("stands an id with nothing but numbers (and an ACP row's empty one) as its
123
150
  });
124
151
 
125
152
  test("holds date stamps apart from version components, or a dated build outranks the point release after it", () => {
126
- // The failure this prevents: claude-opus-4-1-20250805 (Opus 4.1) read as (4,1,20250805) loses to
127
- // claude-opus-4-20250514 (Opus 4.0) read as (4,20250514): the older model, by six digits.
128
153
  expect(releaseOf("claude-opus-4-1-20250805")).toEqual({ version: [4, 1], date: 20250805 });
129
154
  expect(["claude-opus-4-20250514", "claude-opus-4-1-20250805"].toSorted(compareModelIds)).toEqual([
130
155
  "claude-opus-4-1-20250805",
@@ -144,14 +169,13 @@ test("reads a longer version as the newer one, so 5.1 outranks 5", () => {
144
169
  });
145
170
 
146
171
  test("sorts an unversioned rolling alias under the releases that name their version", () => {
147
- // `kimi-latest` claims no release; guessing one for it would seat it above models that do say what they are.
172
+ // `kimi-latest` claims no release; guessing one would seat it above models that do say what they are.
148
173
  expect(releaseOf("kimi-latest").version).toEqual([]);
149
174
  expect(["kimi-latest", "kimi-k2-0711-preview"].toSorted(compareModelIds)).toEqual(["kimi-k2-0711-preview", "kimi-latest"]);
150
175
  });
151
176
 
152
- // --- the cheap end (compareCheapestFirst) ---------------------------------------------------------------
153
- // What the quick model behind a one-click helper resolves against: the same tier scale, read for the weakest
154
- // row instead of the strongest.
177
+ // compareCheapestFirst: what the quick model's one-click helper resolves against, the same tier scale read
178
+ // weakest-first.
155
179
 
156
180
  test("opens on the efficient rung and buries the frontier one: the exact inverse of the picker's order", () => {
157
181
  const claude = ["claude-opus-5", "claude-sonnet-5", "claude-haiku-4-5-20251001"];
@@ -161,9 +185,7 @@ test("opens on the efficient rung and buries the frontier one: the exact inverse
161
185
  });
162
186
 
163
187
  test("keeps an UNRANKED family off the cheap end, where a plain reversal would have seated it first", () => {
164
- // The whole reason this is not `-compareModelIds`. An id with no tier word is the provider's base line, and
165
- // an unheard-of family is likelier the next flagship than the next budget tier, so both orders agree it is
166
- // not the efficient rung, and a helper never spends frontier money on a commit message.
188
+ // An id with no tier word is the provider's baseline, likelier the next flagship than a budget tier.
167
189
  expect(["gpt-5.6", "gpt-5.4-mini"].toSorted(compareCheapestFirst)).toEqual(["gpt-5.4-mini", "gpt-5.6"]);
168
190
  expect(["claude-mythos-1", "claude-haiku-4-5", "claude-sonnet-5"].toSorted(compareCheapestFirst).at(-1)).toBe("claude-mythos-1");
169
191
  });
@@ -176,8 +198,7 @@ test("takes the NEWEST build of the cheap rung, not merely any of them", () => {
176
198
 
177
199
  test("finds each vendor's own cheap rung, including a re-served open-weights row", () => {
178
200
  expect(["gemini-3-pro", "gemini-3-flash", "gemini-3-flash-lite"].toSorted(compareCheapestFirst)[0]).toBe("gemini-3-flash-lite");
179
- // Google's channel vends gpt-oss beside Gemini's own line; it is there to be the cheap option, and `oss`
180
- // is what says so: without that word the id carries no tier at all and would sink to the bottom.
201
+ // gpt-oss is Google's cheap option; `oss` is its only tier signal, without it the id would sink instead of lead.
181
202
  expect(["claude-opus-4-6-thinking", "gpt-oss-120b-medium"].toSorted(compareCheapestFirst)[0]).toBe("gpt-oss-120b-medium");
182
203
  expect(["grok-4", "grok-4-fast"].toSorted(compareCheapestFirst)[0]).toBe("grok-4-fast");
183
204
  });
@@ -187,38 +208,31 @@ test("reads a release-local tier ladder from the cheap end too", () => {
187
208
  });
188
209
 
189
210
  test("refuses the thinking variant of a model, however new it is", () => {
190
- /* The bug this rule exists for, in the shape the live catalog actually publishes it: a routed channel vends
191
- * one row per thinking LEVEL, and the newest row of the cheapest model was the high one, so the ladder
192
- * whose whole job is to be the cheap rung reached for the most expensive reading of it, and a commit
193
- * message that takes 2s took closer to 30. */
211
+ // A routed channel vends one row per thinking level; the cheapest model's top row must not win here.
194
212
  expect(["gemini-3.6-flash-high", "gemini-3.5-flash-extra-low"].toSorted(compareCheapestFirst)[0]).toBe("gemini-3.5-flash-extra-low");
195
- // …and it is the LEVEL that decides, not the release: same model, quieter row wins.
213
+ // …and it is the level that decides, not the release: same model, quieter row wins.
196
214
  expect(["gemini-3.5-flash-high", "gemini-3.5-flash-minimal"].toSorted(compareCheapestFirst)[0]).toBe("gemini-3.5-flash-minimal");
197
- // Tier still outranks it: a thinking cheap model beats a silent expensive one, which is the order that
198
- // keeps this from quietly promoting a frontier row for being unannotated.
215
+ // Tier still outranks thinking: a cheap thinking model beats a silent expensive one.
199
216
  expect(["gemini-3-pro", "gemini-3.6-flash-high"].toSorted(compareCheapestFirst)[0]).toBe("gemini-3.6-flash-high");
200
- // An id nobody annotated is not accused of thinking, and is not credited with silence either: it sits
201
- // between the stated ends.
217
+ // An unannotated id is neither accused of thinking nor credited with silence: it sits between the stated ends.
202
218
  expect(["gemini-3-flash", "gemini-3.5-flash-low"].toSorted(compareCheapestFirst)[0]).toBe("gemini-3.5-flash-low");
203
219
  expect(["gemini-3-flash", "gemini-3.6-flash-high"].toSorted(compareCheapestFirst)[0]).toBe("gemini-3-flash");
204
220
  });
205
221
 
206
222
  test("names the thinking rows, and only those", () => {
207
- // What a settings row shows beside a pin, so that choosing one is a choice rather than an accident.
223
+ // What a settings row shows beside a pin.
208
224
  expect(namesThinking("gemini-3.6-flash-high")).toBe(true);
209
225
  expect(namesThinking("gemini-3.1-pro-low")).toBe(false);
210
226
  expect(namesThinking("gemini-3.5-flash-extra-low")).toBe(false);
211
227
  expect(namesThinking("claude-haiku-4-5-20251001")).toBe(false);
212
228
  expect(namesThinking("gpt-5.6-luna")).toBe(false);
213
- // An effort word that is not `high` still names one; so does the on/off form a channel vends beside its
214
- // quiet row.
229
+ // An effort word other than `high` still names one; so does the on/off form beside its quiet row.
215
230
  expect(namesThinking("gpt-oss-120b-medium")).toBe(true);
216
231
  expect(namesThinking("kimi-k2-thinking")).toBe(true);
217
232
  expect(namesThinking("kimi-k2")).toBe(false);
218
233
  });
219
234
 
220
235
  test("falls back on the newest release for a catalog that publishes no cheap tier at all", () => {
221
- // Kimi names no tier word anywhere, so every row is UNRANKED and the tier term cancels. Serving the newest
222
- // of what it does publish is the honest answer: there is no cheaper rung to find.
236
+ // Kimi names no tier word anywhere; with tier cancelled out, newest is the honest fallback.
223
237
  expect(["kimi-k2-0711-preview", "kimi-k2-0905-preview"].toSorted(compareCheapestFirst)[0]).toBe("kimi-k2-0905-preview");
224
238
  });