@intentic/sandbox-contract 1.248.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 (877) 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.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 +423 -450
  146. package/dist/index.d.ts.map +1 -1
  147. package/dist/index.js +54 -46
  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} +1 -1
  160. package/dist/models/model-pins.d.ts.map +1 -0
  161. package/dist/models/model-pins.js.map +1 -0
  162. package/dist/{model-roles.d.ts → models/model-roles.d.ts} +0 -33
  163. package/dist/models/model-roles.d.ts.map +1 -0
  164. package/dist/{model-roles.js → models/model-roles.js} +0 -35
  165. package/dist/models/model-roles.js.map +1 -0
  166. package/dist/{plan-pools.d.ts → models/plan-pools.d.ts} +1 -1
  167. package/dist/models/plan-pools.d.ts.map +1 -0
  168. package/dist/models/plan-pools.js.map +1 -0
  169. package/dist/models/prompt-complexity.d.ts.map +1 -0
  170. package/dist/models/prompt-complexity.js.map +1 -0
  171. package/dist/models/provider-specs.d.ts.map +1 -0
  172. package/dist/models/provider-specs.js.map +1 -0
  173. package/dist/policy/approvals-execution.d.ts.map +1 -0
  174. package/dist/policy/approvals-execution.js.map +1 -0
  175. package/dist/{batch-runs.d.ts → policy/batch-runs.d.ts} +5 -1
  176. package/dist/policy/batch-runs.d.ts.map +1 -0
  177. package/dist/{batch-runs.js → policy/batch-runs.js} +10 -7
  178. package/dist/policy/batch-runs.js.map +1 -0
  179. package/dist/policy/capability-env.d.ts.map +1 -0
  180. package/dist/policy/capability-env.js.map +1 -0
  181. package/dist/policy/capability-secrets.d.ts.map +1 -0
  182. package/dist/policy/capability-secrets.js.map +1 -0
  183. package/dist/{card-status.d.ts → policy/card-status.d.ts} +2 -2
  184. package/dist/policy/card-status.d.ts.map +1 -0
  185. package/dist/{card-status.js → policy/card-status.js} +1 -5
  186. package/dist/policy/card-status.js.map +1 -0
  187. package/dist/{command-classes.d.ts → policy/command-classes.d.ts} +6 -2
  188. package/dist/policy/command-classes.d.ts.map +1 -0
  189. package/dist/{command-classes.js → policy/command-classes.js} +48 -11
  190. package/dist/policy/command-classes.js.map +1 -0
  191. package/dist/{command-run.d.ts → policy/command-run.d.ts} +1 -1
  192. package/dist/policy/command-run.d.ts.map +1 -0
  193. package/dist/policy/command-run.js.map +1 -0
  194. package/dist/policy/control-scopes.d.ts +16 -0
  195. package/dist/policy/control-scopes.d.ts.map +1 -0
  196. package/dist/policy/control-scopes.js +26 -0
  197. package/dist/policy/control-scopes.js.map +1 -0
  198. package/dist/policy/credential-material.d.ts.map +1 -0
  199. package/dist/policy/credential-material.js.map +1 -0
  200. package/dist/policy/needs-action.d.ts.map +1 -0
  201. package/dist/policy/needs-action.js.map +1 -0
  202. package/dist/policy/output-fields.d.ts.map +1 -0
  203. package/dist/policy/output-fields.js.map +1 -0
  204. package/dist/policy/overlay-lint.d.ts.map +1 -0
  205. package/dist/policy/overlay-lint.js.map +1 -0
  206. package/dist/policy/owner-ticket.d.ts.map +1 -0
  207. package/dist/{owner-ticket.js → policy/owner-ticket.js} +1 -1
  208. package/dist/policy/owner-ticket.js.map +1 -0
  209. package/dist/{safety-policy.d.ts → policy/safety-policy.d.ts} +6 -5
  210. package/dist/policy/safety-policy.d.ts.map +1 -0
  211. package/dist/{safety-policy.js → policy/safety-policy.js} +12 -12
  212. package/dist/policy/safety-policy.js.map +1 -0
  213. package/dist/policy/search-globs.d.ts.map +1 -0
  214. package/dist/policy/search-globs.js.map +1 -0
  215. package/dist/protocol/container-requirements.d.ts +20 -0
  216. package/dist/protocol/container-requirements.d.ts.map +1 -0
  217. package/dist/protocol/container-requirements.js +23 -0
  218. package/dist/protocol/container-requirements.js.map +1 -0
  219. package/dist/{host-protocol.d.ts → protocol/host-protocol.d.ts} +1 -0
  220. package/dist/protocol/host-protocol.d.ts.map +1 -0
  221. package/dist/{host-protocol.js → protocol/host-protocol.js} +1 -0
  222. package/dist/protocol/host-protocol.js.map +1 -0
  223. package/dist/protocol/ingress-contract.d.ts.map +1 -0
  224. package/dist/{ingress-contract.js → protocol/ingress-contract.js} +1 -1
  225. package/dist/protocol/ingress-contract.js.map +1 -0
  226. package/dist/protocol/ingress-protocol.d.ts.map +1 -0
  227. package/dist/protocol/ingress-protocol.js.map +1 -0
  228. package/dist/protocol/listener-protocol.d.ts.map +1 -0
  229. package/dist/{listener-protocol.js → protocol/listener-protocol.js} +1 -1
  230. package/dist/protocol/listener-protocol.js.map +1 -0
  231. package/dist/{peer-dial.d.ts → protocol/peer-dial.d.ts} +4 -1
  232. package/dist/protocol/peer-dial.d.ts.map +1 -0
  233. package/dist/{peer-dial.js → protocol/peer-dial.js} +51 -10
  234. package/dist/protocol/peer-dial.js.map +1 -0
  235. package/dist/protocol/peer-mcp-server.d.ts.map +1 -0
  236. package/dist/protocol/peer-mcp-server.js.map +1 -0
  237. package/dist/protocol/request-id.d.ts.map +1 -0
  238. package/dist/protocol/request-id.js.map +1 -0
  239. package/dist/protocol/routes.d.ts.map +1 -0
  240. package/dist/protocol/routes.js.map +1 -0
  241. package/dist/{runner-protocol.d.ts → protocol/runner-protocol.d.ts} +1 -0
  242. package/dist/protocol/runner-protocol.d.ts.map +1 -0
  243. package/dist/{runner-protocol.js → protocol/runner-protocol.js} +2 -1
  244. package/dist/protocol/runner-protocol.js.map +1 -0
  245. package/dist/protocol/sse.d.ts.map +1 -0
  246. package/dist/protocol/sse.js.map +1 -0
  247. package/dist/{terminal-protocol.d.ts → protocol/terminal-protocol.d.ts} +1 -3
  248. package/dist/protocol/terminal-protocol.d.ts.map +1 -0
  249. package/dist/protocol/terminal-protocol.js.map +1 -0
  250. package/dist/protocol/webext-links.d.ts.map +1 -0
  251. package/dist/protocol/webext-links.js.map +1 -0
  252. package/dist/{webext-protocol.d.ts → protocol/webext-protocol.d.ts} +1 -0
  253. package/dist/protocol/webext-protocol.d.ts.map +1 -0
  254. package/dist/{webext-protocol.js → protocol/webext-protocol.js} +1 -0
  255. package/dist/protocol/webext-protocol.js.map +1 -0
  256. package/dist/schemas/activity.d.ts +2 -0
  257. package/dist/schemas/activity.d.ts.map +1 -1
  258. package/dist/schemas/activity.js +4 -0
  259. package/dist/schemas/activity.js.map +1 -1
  260. package/dist/schemas/agent.d.ts +16 -4
  261. package/dist/schemas/agent.d.ts.map +1 -1
  262. package/dist/schemas/agent.js +21 -4
  263. package/dist/schemas/agent.js.map +1 -1
  264. package/dist/schemas/agents.d.ts +17 -4
  265. package/dist/schemas/agents.d.ts.map +1 -1
  266. package/dist/schemas/agents.js +15 -4
  267. package/dist/schemas/agents.js.map +1 -1
  268. package/dist/schemas/approvals.d.ts.map +1 -1
  269. package/dist/schemas/approvals.js.map +1 -1
  270. package/dist/schemas/automations.d.ts +54 -28
  271. package/dist/schemas/automations.d.ts.map +1 -1
  272. package/dist/schemas/automations.js +26 -8
  273. package/dist/schemas/automations.js.map +1 -1
  274. package/dist/schemas/capabilities.d.ts +0 -8
  275. package/dist/schemas/capabilities.d.ts.map +1 -1
  276. package/dist/schemas/capabilities.js +0 -4
  277. package/dist/schemas/capabilities.js.map +1 -1
  278. package/dist/schemas/ci.d.ts +10 -0
  279. package/dist/schemas/ci.d.ts.map +1 -1
  280. package/dist/schemas/ci.js +9 -1
  281. package/dist/schemas/ci.js.map +1 -1
  282. package/dist/schemas/codebase-health.d.ts.map +1 -1
  283. package/dist/schemas/codebase-health.js.map +1 -1
  284. package/dist/schemas/devices.d.ts +90 -0
  285. package/dist/schemas/devices.d.ts.map +1 -1
  286. package/dist/schemas/devices.js +10 -1
  287. package/dist/schemas/devices.js.map +1 -1
  288. package/dist/schemas/engines.d.ts.map +1 -1
  289. package/dist/schemas/engines.js.map +1 -1
  290. package/dist/schemas/environment.d.ts.map +1 -1
  291. package/dist/schemas/environment.js.map +1 -1
  292. package/dist/schemas/exit.d.ts.map +1 -1
  293. package/dist/schemas/exit.js.map +1 -1
  294. package/dist/schemas/extension-updates.d.ts.map +1 -1
  295. package/dist/schemas/extension-updates.js.map +1 -1
  296. package/dist/schemas/git-history.d.ts.map +1 -1
  297. package/dist/schemas/git-history.js.map +1 -1
  298. package/dist/schemas/git.d.ts +80 -16
  299. package/dist/schemas/git.d.ts.map +1 -1
  300. package/dist/schemas/git.js +37 -25
  301. package/dist/schemas/git.js.map +1 -1
  302. package/dist/schemas/history.d.ts.map +1 -1
  303. package/dist/schemas/history.js.map +1 -1
  304. package/dist/schemas/hosts.d.ts.map +1 -1
  305. package/dist/schemas/hosts.js.map +1 -1
  306. package/dist/schemas/inventory.d.ts.map +1 -1
  307. package/dist/schemas/inventory.js.map +1 -1
  308. package/dist/schemas/issues.d.ts +0 -1
  309. package/dist/schemas/issues.d.ts.map +1 -1
  310. package/dist/schemas/issues.js +0 -1
  311. package/dist/schemas/issues.js.map +1 -1
  312. package/dist/schemas/logs.d.ts.map +1 -1
  313. package/dist/schemas/logs.js.map +1 -1
  314. package/dist/schemas/loops.d.ts.map +1 -1
  315. package/dist/schemas/loops.js +1 -1
  316. package/dist/schemas/loops.js.map +1 -1
  317. package/dist/schemas/maintenance.d.ts.map +1 -1
  318. package/dist/schemas/maintenance.js.map +1 -1
  319. package/dist/schemas/marketplace.d.ts +0 -4
  320. package/dist/schemas/marketplace.d.ts.map +1 -1
  321. package/dist/schemas/panels.d.ts.map +1 -1
  322. package/dist/schemas/panels.js.map +1 -1
  323. package/dist/schemas/personas.d.ts +2 -1
  324. package/dist/schemas/personas.d.ts.map +1 -1
  325. package/dist/schemas/personas.js +6 -2
  326. package/dist/schemas/personas.js.map +1 -1
  327. package/dist/schemas/plan-limits.d.ts +2 -4
  328. package/dist/schemas/plan-limits.d.ts.map +1 -1
  329. package/dist/schemas/plan-limits.js +5 -8
  330. package/dist/schemas/plan-limits.js.map +1 -1
  331. package/dist/schemas/ports.d.ts.map +1 -1
  332. package/dist/schemas/ports.js.map +1 -1
  333. package/dist/schemas/provider-oauth.d.ts.map +1 -1
  334. package/dist/schemas/provider-oauth.js.map +1 -1
  335. package/dist/schemas/provider-subscriptions.d.ts +1 -1
  336. package/dist/schemas/provider-subscriptions.d.ts.map +1 -1
  337. package/dist/schemas/provider-subscriptions.js +1 -1
  338. package/dist/schemas/provider-subscriptions.js.map +1 -1
  339. package/dist/schemas/public.d.ts.map +1 -1
  340. package/dist/schemas/public.js.map +1 -1
  341. package/dist/schemas/push.d.ts.map +1 -1
  342. package/dist/schemas/push.js.map +1 -1
  343. package/dist/schemas/secrets.d.ts.map +1 -1
  344. package/dist/schemas/secrets.js.map +1 -1
  345. package/dist/schemas/settings.d.ts +6 -9
  346. package/dist/schemas/settings.d.ts.map +1 -1
  347. package/dist/schemas/settings.js +16 -5
  348. package/dist/schemas/settings.js.map +1 -1
  349. package/dist/schemas/share.d.ts.map +1 -1
  350. package/dist/schemas/share.js.map +1 -1
  351. package/dist/schemas/shared.d.ts +4 -0
  352. package/dist/schemas/shared.d.ts.map +1 -1
  353. package/dist/schemas/shared.js +3 -0
  354. package/dist/schemas/shared.js.map +1 -1
  355. package/dist/schemas/system.d.ts +6 -0
  356. package/dist/schemas/system.d.ts.map +1 -1
  357. package/dist/schemas/system.js +10 -0
  358. package/dist/schemas/system.js.map +1 -1
  359. package/dist/schemas/terminal.d.ts.map +1 -1
  360. package/dist/schemas/terminal.js.map +1 -1
  361. package/dist/schemas/usage.d.ts.map +1 -1
  362. package/dist/schemas/usage.js.map +1 -1
  363. package/dist/schemas/vpn.d.ts.map +1 -1
  364. package/dist/schemas/vpn.js.map +1 -1
  365. package/dist/schemas/webext.d.ts.map +1 -1
  366. package/dist/schemas/webext.js.map +1 -1
  367. package/dist/schemas/workflows.d.ts +66 -9
  368. package/dist/schemas/workflows.d.ts.map +1 -1
  369. package/dist/schemas/workflows.js +6 -5
  370. package/dist/schemas/workflows.js.map +1 -1
  371. package/dist/schemas/workspace-repos.d.ts.map +1 -1
  372. package/dist/schemas/workspace-repos.js.map +1 -1
  373. package/dist/schemas/workspace-search.d.ts.map +1 -1
  374. package/dist/schemas/workspace-search.js.map +1 -1
  375. package/dist/schemas/workspace-setup.d.ts.map +1 -1
  376. package/dist/schemas/workspace-setup.js.map +1 -1
  377. package/dist/schemas/workspace-tree.d.ts.map +1 -1
  378. package/dist/schemas/workspace-tree.js.map +1 -1
  379. package/dist/state/arrival.d.ts.map +1 -0
  380. package/dist/{arrival.js → state/arrival.js} +1 -1
  381. package/dist/state/arrival.js.map +1 -0
  382. package/dist/state/contract-lock.d.ts.map +1 -0
  383. package/dist/{contract-lock.js → state/contract-lock.js} +1 -1
  384. package/dist/state/contract-lock.js.map +1 -0
  385. package/dist/{definition.d.ts → state/definition.d.ts} +21 -17
  386. package/dist/state/definition.d.ts.map +1 -0
  387. package/dist/{definition.js → state/definition.js} +4 -4
  388. package/dist/state/definition.js.map +1 -0
  389. package/dist/state/history-state.d.ts.map +1 -0
  390. package/dist/{history-state.js → state/history-state.js} +1 -0
  391. package/dist/state/history-state.js.map +1 -0
  392. package/dist/state/runtime-state.d.ts.map +1 -0
  393. package/dist/state/runtime-state.js.map +1 -0
  394. package/dist/state/starter.d.ts.map +1 -0
  395. package/dist/state/starter.js.map +1 -0
  396. package/dist/state/state-portability.d.ts.map +1 -0
  397. package/dist/state/state-portability.js.map +1 -0
  398. package/dist/state/versions.d.ts.map +1 -0
  399. package/dist/state/versions.js.map +1 -0
  400. package/dist/{workspace-state.d.ts → state/workspace-state.d.ts} +8 -0
  401. package/dist/state/workspace-state.d.ts.map +1 -0
  402. package/dist/{workspace-state.js → state/workspace-state.js} +25 -0
  403. package/dist/state/workspace-state.js.map +1 -0
  404. package/dist/{documents.d.ts → text/documents.d.ts} +1 -1
  405. package/dist/text/documents.d.ts.map +1 -0
  406. package/dist/{documents.js → text/documents.js} +1 -1
  407. package/dist/text/documents.js.map +1 -0
  408. package/dist/text/embed.d.ts.map +1 -0
  409. package/dist/text/embed.js.map +1 -0
  410. package/dist/text/mentions.d.ts.map +1 -0
  411. package/dist/text/mentions.js.map +1 -0
  412. package/dist/text/model-answer.d.ts +3 -0
  413. package/dist/text/model-answer.d.ts.map +1 -0
  414. package/dist/text/model-answer.js +3 -0
  415. package/dist/text/model-answer.js.map +1 -0
  416. package/dist/text/path-refs.d.ts.map +1 -0
  417. package/dist/text/path-refs.js.map +1 -0
  418. package/dist/{shell-regions.d.ts → text/shell-regions.d.ts} +1 -1
  419. package/dist/text/shell-regions.d.ts.map +1 -0
  420. package/dist/text/shell-regions.js.map +1 -0
  421. package/dist/text/title.d.ts.map +1 -0
  422. package/dist/text/title.js.map +1 -0
  423. package/dist/{transcript-fold.d.ts → text/transcript-fold.d.ts} +2 -1
  424. package/dist/text/transcript-fold.d.ts.map +1 -0
  425. package/dist/{transcript-fold.js → text/transcript-fold.js} +2 -16
  426. package/dist/text/transcript-fold.js.map +1 -0
  427. package/dist/text/whisper.d.ts +3 -0
  428. package/dist/text/whisper.d.ts.map +1 -0
  429. package/dist/text/whisper.js +11 -0
  430. package/dist/text/whisper.js.map +1 -0
  431. package/dist/{workflow-faults.d.ts → text/workflow-faults.d.ts} +1 -1
  432. package/dist/text/workflow-faults.d.ts.map +1 -0
  433. package/dist/{workflow-faults.js → text/workflow-faults.js} +1 -1
  434. package/dist/text/workflow-faults.js.map +1 -0
  435. package/package.json +70 -70
  436. package/src/chores/chores.test.ts +4 -10
  437. package/src/chores/chores.ts +148 -392
  438. package/src/chores/digest.ts +8 -28
  439. package/src/chores/extension-update.ts +3 -8
  440. package/src/chores/fix-deps.ts +4 -18
  441. package/src/chores/index.ts +2 -2
  442. package/src/chores/probes.test.ts +7 -43
  443. package/src/chores/probes.ts +62 -167
  444. package/src/chores/prompt.ts +10 -34
  445. package/src/chores/stack.test.ts +6 -45
  446. package/src/chores/stack.ts +27 -118
  447. package/src/chores/verdict.test.ts +101 -80
  448. package/src/chores/verdict.ts +54 -99
  449. package/src/contracts/accounts.contract.ts +4 -19
  450. package/src/contracts/agent.contract.ts +7 -22
  451. package/src/contracts/agents.contract.ts +25 -71
  452. package/src/contracts/automations.contract.ts +14 -30
  453. package/src/contracts/capabilities.contract.ts +8 -35
  454. package/src/contracts/chores.contract.ts +4 -15
  455. package/src/contracts/endpoints.contract.ts +5 -22
  456. package/src/contracts/exit.contract.ts +7 -30
  457. package/src/contracts/extensions.contract.ts +8 -30
  458. package/src/contracts/git.contract.ts +25 -49
  459. package/src/contracts/host.contract.ts +9 -44
  460. package/src/contracts/intentic.contract.ts +1 -1
  461. package/src/contracts/logs.contract.ts +3 -13
  462. package/src/contracts/loops.contract.ts +9 -40
  463. package/src/contracts/personas.contract.ts +10 -35
  464. package/src/contracts/providers.contract.ts +4 -17
  465. package/src/contracts/runner.contract.ts +12 -39
  466. package/src/contracts/safety.contract.ts +5 -14
  467. package/src/contracts/secrets.contract.ts +4 -22
  468. package/src/contracts/sessions.contract.ts +1 -1
  469. package/src/contracts/settings.contract.ts +4 -10
  470. package/src/contracts/share.contract.ts +3 -9
  471. package/src/contracts/skills.contract.ts +4 -15
  472. package/src/contracts/system.contract.ts +26 -52
  473. package/src/contracts/usage.contract.ts +7 -21
  474. package/src/contracts/vpn.contract.ts +9 -16
  475. package/src/contracts/webext.contract.ts +9 -25
  476. package/src/contracts/workflows.contract.ts +34 -58
  477. package/src/contracts/workspace.contract.ts +19 -50
  478. package/src/events/agent-events.ts +345 -0
  479. package/src/events/cards.ts +286 -0
  480. package/src/{events.test.ts → events/resume.test.ts} +4 -19
  481. package/src/events/resume.ts +60 -0
  482. package/src/events/system-events.ts +139 -0
  483. package/src/events/transcript.ts +320 -0
  484. package/src/{conversation-ids.test.ts → ids/conversation-ids.test.ts} +25 -13
  485. package/src/ids/conversation-ids.ts +178 -0
  486. package/src/ids/hostnames.ts +129 -0
  487. package/src/ids/session-names.ts +29 -0
  488. package/src/ids/share-paths.ts +43 -0
  489. package/src/{tunnel-ids.test.ts → ids/tunnel-ids.test.ts} +1 -14
  490. package/src/ids/tunnel-ids.ts +29 -0
  491. package/src/index.ts +71 -87
  492. package/src/{agent-catalog.test.ts → models/agent-catalog.test.ts} +19 -93
  493. package/src/models/agent-catalog.ts +174 -0
  494. package/src/models/agent-runtimes.ts +201 -0
  495. package/src/models/capability-ledger.test.ts +84 -0
  496. package/src/{fast-tier.test.ts → models/fast-tier.test.ts} +7 -18
  497. package/src/models/fast-tier.ts +36 -0
  498. package/src/{model-order.test.ts → models/model-order.test.ts} +19 -40
  499. package/src/models/model-order.ts +163 -0
  500. package/src/{model-pins.test.ts → models/model-pins.test.ts} +12 -46
  501. package/src/models/model-pins.ts +57 -0
  502. package/src/models/model-roles.test.ts +38 -0
  503. package/src/models/model-roles.ts +180 -0
  504. package/src/{plan-pools.test.ts → models/plan-pools.test.ts} +6 -11
  505. package/src/models/plan-pools.ts +65 -0
  506. package/src/{prompt-complexity.test.ts → models/prompt-complexity.test.ts} +8 -60
  507. package/src/models/prompt-complexity.ts +215 -0
  508. package/src/{provider-specs.test.ts → models/provider-specs.test.ts} +18 -47
  509. package/src/models/provider-specs.ts +272 -0
  510. package/src/policy/approvals-execution.ts +58 -0
  511. package/src/{batch-runs.test.ts → policy/batch-runs.test.ts} +4 -20
  512. package/src/policy/batch-runs.ts +137 -0
  513. package/src/policy/capability-secrets.ts +5 -0
  514. package/src/{card-status.ts → policy/card-status.ts} +11 -26
  515. package/src/{command-classes.test.ts → policy/command-classes.test.ts} +11 -118
  516. package/src/policy/command-classes.ts +395 -0
  517. package/src/policy/command-run.ts +65 -0
  518. package/src/policy/control-scopes.ts +38 -0
  519. package/src/{credential-material.test.ts → policy/credential-material.test.ts} +4 -26
  520. package/src/policy/credential-material.ts +91 -0
  521. package/src/policy/needs-action.ts +5 -0
  522. package/src/policy/output-fields.ts +86 -0
  523. package/src/policy/overlay-lint.ts +100 -0
  524. package/src/{owner-ticket.test.ts → policy/owner-ticket.test.ts} +1 -1
  525. package/src/{owner-ticket.ts → policy/owner-ticket.ts} +9 -31
  526. package/src/policy/safety-policy.test.ts +84 -0
  527. package/src/policy/safety-policy.ts +142 -0
  528. package/src/policy/search-globs.ts +60 -0
  529. package/src/protocol/container-requirements.test.ts +72 -0
  530. package/src/protocol/container-requirements.ts +58 -0
  531. package/src/protocol/host-protocol.ts +29 -0
  532. package/src/protocol/ingress-contract.ts +103 -0
  533. package/src/{ingress-protocol.test.ts → protocol/ingress-protocol.test.ts} +25 -90
  534. package/src/protocol/ingress-protocol.ts +441 -0
  535. package/src/protocol/listener-protocol.ts +75 -0
  536. package/src/{peer-dial.test.ts → protocol/peer-dial.test.ts} +52 -1
  537. package/src/protocol/peer-dial.ts +207 -0
  538. package/src/{peer-mcp-server.ts → protocol/peer-mcp-server.ts} +16 -41
  539. package/src/protocol/request-id.ts +5 -0
  540. package/src/{routes.test.ts → protocol/routes.test.ts} +14 -22
  541. package/src/protocol/routes.ts +159 -0
  542. package/src/protocol/runner-protocol.ts +197 -0
  543. package/src/protocol/terminal-protocol.ts +13 -0
  544. package/src/protocol/webext-links.ts +50 -0
  545. package/src/protocol/webext-protocol.ts +24 -0
  546. package/src/schemas/activity.ts +22 -30
  547. package/src/schemas/agent.ts +130 -238
  548. package/src/schemas/agents.ts +165 -483
  549. package/src/schemas/approvals.ts +23 -71
  550. package/src/schemas/automations.ts +142 -250
  551. package/src/schemas/capabilities.ts +127 -414
  552. package/src/schemas/ci.ts +56 -108
  553. package/src/schemas/codebase-health.ts +7 -11
  554. package/src/schemas/devices.ts +98 -321
  555. package/src/schemas/engines.ts +16 -44
  556. package/src/schemas/environment.ts +41 -91
  557. package/src/schemas/exit.ts +24 -81
  558. package/src/schemas/extension-updates.ts +42 -87
  559. package/src/schemas/git-history.ts +30 -84
  560. package/src/schemas/git.ts +141 -256
  561. package/src/schemas/history.ts +14 -40
  562. package/src/schemas/hosts.ts +9 -15
  563. package/src/schemas/inventory.ts +8 -10
  564. package/src/schemas/issues.ts +66 -134
  565. package/src/schemas/logs.ts +15 -34
  566. package/src/schemas/loops.ts +46 -163
  567. package/src/schemas/maintenance.ts +47 -172
  568. package/src/schemas/panels.ts +20 -45
  569. package/src/schemas/personas.ts +50 -200
  570. package/src/schemas/plan-limits.ts +58 -197
  571. package/src/schemas/ports.ts +14 -32
  572. package/src/schemas/provider-oauth.ts +23 -76
  573. package/src/schemas/provider-subscriptions.ts +4 -13
  574. package/src/schemas/public.ts +4 -15
  575. package/src/schemas/push.ts +8 -36
  576. package/src/schemas/secrets.ts +20 -64
  577. package/src/schemas/settings.ts +175 -600
  578. package/src/schemas/share.ts +14 -32
  579. package/src/schemas/shared.ts +14 -13
  580. package/src/schemas/system.ts +46 -78
  581. package/src/schemas/terminal.ts +41 -120
  582. package/src/schemas/usage.ts +44 -233
  583. package/src/schemas/version-seam.test.ts +9 -26
  584. package/src/schemas/vpn.ts +27 -64
  585. package/src/schemas/webext.ts +22 -53
  586. package/src/schemas/workflows.ts +57 -183
  587. package/src/schemas/workspace-repos.ts +12 -24
  588. package/src/schemas/workspace-search.ts +17 -35
  589. package/src/schemas/workspace-setup.ts +4 -11
  590. package/src/schemas/workspace-tree.ts +32 -91
  591. package/src/state/arrival.ts +109 -0
  592. package/src/state/contract-lock.test.ts +17 -0
  593. package/src/state/contract-lock.ts +49 -0
  594. package/src/state/definition.ts +143 -0
  595. package/src/state/history-state.ts +103 -0
  596. package/src/{runtime-state.test.ts → state/runtime-state.test.ts} +3 -10
  597. package/src/state/runtime-state.ts +62 -0
  598. package/src/state/starter.ts +5 -0
  599. package/src/state/state-portability.ts +27 -0
  600. package/src/state/versions.ts +26 -0
  601. package/src/{workspace-state.test.ts → state/workspace-state.test.ts} +65 -172
  602. package/src/state/workspace-state.ts +669 -0
  603. package/src/{documents.test.ts → text/documents.test.ts} +1 -1
  604. package/src/text/documents.ts +42 -0
  605. package/src/text/embed.ts +132 -0
  606. package/src/text/mentions.ts +21 -0
  607. package/src/text/model-answer.ts +9 -0
  608. package/src/text/path-refs.ts +39 -0
  609. package/src/text/shell-regions.ts +224 -0
  610. package/src/{title.test.ts → text/title.test.ts} +13 -32
  611. package/src/text/title.ts +202 -0
  612. package/src/{transcript-fold.test.ts → text/transcript-fold.test.ts} +5 -83
  613. package/src/{transcript-fold.ts → text/transcript-fold.ts} +65 -170
  614. package/src/text/whisper.test.ts +19 -0
  615. package/src/text/whisper.ts +17 -0
  616. package/src/{workflow-faults.test.ts → text/workflow-faults.test.ts} +6 -24
  617. package/src/{workflow-faults.ts → text/workflow-faults.ts} +20 -60
  618. package/dist/agent-catalog.d.ts.map +0 -1
  619. package/dist/agent-catalog.js.map +0 -1
  620. package/dist/agent-runtimes.d.ts.map +0 -1
  621. package/dist/agent-runtimes.js.map +0 -1
  622. package/dist/approvals-execution.d.ts.map +0 -1
  623. package/dist/approvals-execution.js.map +0 -1
  624. package/dist/arrival.d.ts.map +0 -1
  625. package/dist/arrival.js.map +0 -1
  626. package/dist/batch-runs.d.ts.map +0 -1
  627. package/dist/batch-runs.js.map +0 -1
  628. package/dist/capability-env.d.ts.map +0 -1
  629. package/dist/capability-env.js.map +0 -1
  630. package/dist/capability-secrets.d.ts.map +0 -1
  631. package/dist/capability-secrets.js.map +0 -1
  632. package/dist/card-status.d.ts.map +0 -1
  633. package/dist/card-status.js.map +0 -1
  634. package/dist/command-classes.d.ts.map +0 -1
  635. package/dist/command-classes.js.map +0 -1
  636. package/dist/command-run.d.ts.map +0 -1
  637. package/dist/command-run.js.map +0 -1
  638. package/dist/contract-lock.d.ts.map +0 -1
  639. package/dist/contract-lock.js.map +0 -1
  640. package/dist/conversation-ids.d.ts +0 -4
  641. package/dist/conversation-ids.d.ts.map +0 -1
  642. package/dist/conversation-ids.js.map +0 -1
  643. package/dist/credential-material.d.ts.map +0 -1
  644. package/dist/credential-material.js.map +0 -1
  645. package/dist/definition.d.ts.map +0 -1
  646. package/dist/definition.js.map +0 -1
  647. package/dist/documents.d.ts.map +0 -1
  648. package/dist/documents.js.map +0 -1
  649. package/dist/embed.d.ts.map +0 -1
  650. package/dist/embed.js.map +0 -1
  651. package/dist/events.d.ts +0 -4336
  652. package/dist/events.d.ts.map +0 -1
  653. package/dist/events.js +0 -725
  654. package/dist/events.js.map +0 -1
  655. package/dist/fast-tier.d.ts.map +0 -1
  656. package/dist/fast-tier.js.map +0 -1
  657. package/dist/history-state.d.ts.map +0 -1
  658. package/dist/history-state.js.map +0 -1
  659. package/dist/host-protocol.d.ts.map +0 -1
  660. package/dist/host-protocol.js.map +0 -1
  661. package/dist/hostnames.d.ts.map +0 -1
  662. package/dist/hostnames.js.map +0 -1
  663. package/dist/ingress-contract.d.ts.map +0 -1
  664. package/dist/ingress-contract.js.map +0 -1
  665. package/dist/ingress-protocol.d.ts.map +0 -1
  666. package/dist/ingress-protocol.js.map +0 -1
  667. package/dist/listener-protocol.d.ts.map +0 -1
  668. package/dist/listener-protocol.js.map +0 -1
  669. package/dist/mentions.d.ts.map +0 -1
  670. package/dist/mentions.js.map +0 -1
  671. package/dist/model-order.d.ts.map +0 -1
  672. package/dist/model-order.js.map +0 -1
  673. package/dist/model-pins.d.ts.map +0 -1
  674. package/dist/model-pins.js.map +0 -1
  675. package/dist/model-roles.d.ts.map +0 -1
  676. package/dist/model-roles.js.map +0 -1
  677. package/dist/needs-action.d.ts.map +0 -1
  678. package/dist/needs-action.js.map +0 -1
  679. package/dist/output-fields.d.ts.map +0 -1
  680. package/dist/output-fields.js.map +0 -1
  681. package/dist/overlay-lint.d.ts.map +0 -1
  682. package/dist/overlay-lint.js.map +0 -1
  683. package/dist/owner-ticket.d.ts.map +0 -1
  684. package/dist/owner-ticket.js.map +0 -1
  685. package/dist/path-refs.d.ts.map +0 -1
  686. package/dist/path-refs.js.map +0 -1
  687. package/dist/peer-dial.d.ts.map +0 -1
  688. package/dist/peer-dial.js.map +0 -1
  689. package/dist/peer-mcp-server.d.ts.map +0 -1
  690. package/dist/peer-mcp-server.js.map +0 -1
  691. package/dist/plan-pools.d.ts.map +0 -1
  692. package/dist/plan-pools.js.map +0 -1
  693. package/dist/prompt-complexity.d.ts.map +0 -1
  694. package/dist/prompt-complexity.js.map +0 -1
  695. package/dist/provider-specs.d.ts.map +0 -1
  696. package/dist/provider-specs.js.map +0 -1
  697. package/dist/request-id.d.ts.map +0 -1
  698. package/dist/request-id.js.map +0 -1
  699. package/dist/routes.d.ts.map +0 -1
  700. package/dist/routes.js.map +0 -1
  701. package/dist/runner-protocol.d.ts.map +0 -1
  702. package/dist/runner-protocol.js.map +0 -1
  703. package/dist/runtime-state.d.ts.map +0 -1
  704. package/dist/runtime-state.js.map +0 -1
  705. package/dist/safety-policy.d.ts.map +0 -1
  706. package/dist/safety-policy.js.map +0 -1
  707. package/dist/search-globs.d.ts.map +0 -1
  708. package/dist/search-globs.js.map +0 -1
  709. package/dist/session-names.d.ts.map +0 -1
  710. package/dist/session-names.js.map +0 -1
  711. package/dist/share-paths.d.ts.map +0 -1
  712. package/dist/share-paths.js.map +0 -1
  713. package/dist/shell-regions.d.ts.map +0 -1
  714. package/dist/shell-regions.js.map +0 -1
  715. package/dist/sse.d.ts.map +0 -1
  716. package/dist/sse.js.map +0 -1
  717. package/dist/starter.d.ts.map +0 -1
  718. package/dist/starter.js.map +0 -1
  719. package/dist/state-portability.d.ts.map +0 -1
  720. package/dist/state-portability.js.map +0 -1
  721. package/dist/terminal-protocol.d.ts.map +0 -1
  722. package/dist/terminal-protocol.js.map +0 -1
  723. package/dist/title.d.ts.map +0 -1
  724. package/dist/title.js.map +0 -1
  725. package/dist/transcript-fold.d.ts.map +0 -1
  726. package/dist/transcript-fold.js.map +0 -1
  727. package/dist/tunnel-ids.d.ts.map +0 -1
  728. package/dist/tunnel-ids.js.map +0 -1
  729. package/dist/versions.d.ts.map +0 -1
  730. package/dist/versions.js.map +0 -1
  731. package/dist/webext-links.d.ts.map +0 -1
  732. package/dist/webext-links.js.map +0 -1
  733. package/dist/webext-protocol.d.ts.map +0 -1
  734. package/dist/webext-protocol.js.map +0 -1
  735. package/dist/workflow-faults.d.ts.map +0 -1
  736. package/dist/workflow-faults.js.map +0 -1
  737. package/dist/workspace-state.d.ts.map +0 -1
  738. package/dist/workspace-state.js.map +0 -1
  739. package/src/agent-catalog.ts +0 -316
  740. package/src/agent-runtimes.ts +0 -419
  741. package/src/approvals-execution.ts +0 -96
  742. package/src/arrival.ts +0 -160
  743. package/src/batch-runs.ts +0 -188
  744. package/src/capability-ledger.test.ts +0 -140
  745. package/src/capability-secrets.ts +0 -20
  746. package/src/command-classes.ts +0 -617
  747. package/src/command-run.ts +0 -78
  748. package/src/contract-lock.test.ts +0 -23
  749. package/src/contract-lock.ts +0 -66
  750. package/src/conversation-ids.ts +0 -207
  751. package/src/credential-material.ts +0 -181
  752. package/src/definition.ts +0 -207
  753. package/src/documents.ts +0 -67
  754. package/src/embed.ts +0 -164
  755. package/src/events.ts +0 -1870
  756. package/src/fast-tier.ts +0 -72
  757. package/src/history-state.ts +0 -174
  758. package/src/host-protocol.ts +0 -36
  759. package/src/hostnames.ts +0 -180
  760. package/src/ingress-contract.ts +0 -157
  761. package/src/ingress-protocol.ts +0 -625
  762. package/src/listener-protocol.ts +0 -96
  763. package/src/mentions.ts +0 -25
  764. package/src/model-order.ts +0 -262
  765. package/src/model-pins.ts +0 -132
  766. package/src/model-roles.test.ts +0 -52
  767. package/src/model-roles.ts +0 -320
  768. package/src/needs-action.ts +0 -14
  769. package/src/output-fields.ts +0 -111
  770. package/src/overlay-lint.ts +0 -116
  771. package/src/path-refs.ts +0 -59
  772. package/src/peer-dial.ts +0 -163
  773. package/src/plan-pools.ts +0 -92
  774. package/src/prompt-complexity.ts +0 -334
  775. package/src/provider-specs.ts +0 -432
  776. package/src/request-id.ts +0 -41
  777. package/src/routes.ts +0 -219
  778. package/src/runner-protocol.ts +0 -239
  779. package/src/runtime-state.ts +0 -140
  780. package/src/safety-policy.test.ts +0 -88
  781. package/src/safety-policy.ts +0 -258
  782. package/src/search-globs.ts +0 -76
  783. package/src/session-names.ts +0 -44
  784. package/src/share-paths.ts +0 -68
  785. package/src/shell-regions.ts +0 -289
  786. package/src/starter.ts +0 -13
  787. package/src/state-portability.ts +0 -56
  788. package/src/terminal-protocol.ts +0 -16
  789. package/src/title.ts +0 -267
  790. package/src/tunnel-ids.ts +0 -57
  791. package/src/versions.ts +0 -48
  792. package/src/webext-links.ts +0 -90
  793. package/src/webext-protocol.ts +0 -27
  794. package/src/workspace-state.ts +0 -1090
  795. /package/dist/{hostnames.d.ts → ids/hostnames.d.ts} +0 -0
  796. /package/dist/{hostnames.js → ids/hostnames.js} +0 -0
  797. /package/dist/{session-names.d.ts → ids/session-names.d.ts} +0 -0
  798. /package/dist/{session-names.js → ids/session-names.js} +0 -0
  799. /package/dist/{share-paths.d.ts → ids/share-paths.d.ts} +0 -0
  800. /package/dist/{share-paths.js → ids/share-paths.js} +0 -0
  801. /package/dist/{agent-catalog.js → models/agent-catalog.js} +0 -0
  802. /package/dist/{agent-runtimes.d.ts → models/agent-runtimes.d.ts} +0 -0
  803. /package/dist/{agent-runtimes.js → models/agent-runtimes.js} +0 -0
  804. /package/dist/{fast-tier.js → models/fast-tier.js} +0 -0
  805. /package/dist/{model-order.d.ts → models/model-order.d.ts} +0 -0
  806. /package/dist/{model-order.js → models/model-order.js} +0 -0
  807. /package/dist/{model-pins.js → models/model-pins.js} +0 -0
  808. /package/dist/{plan-pools.js → models/plan-pools.js} +0 -0
  809. /package/dist/{prompt-complexity.d.ts → models/prompt-complexity.d.ts} +0 -0
  810. /package/dist/{prompt-complexity.js → models/prompt-complexity.js} +0 -0
  811. /package/dist/{provider-specs.d.ts → models/provider-specs.d.ts} +0 -0
  812. /package/dist/{provider-specs.js → models/provider-specs.js} +0 -0
  813. /package/dist/{approvals-execution.d.ts → policy/approvals-execution.d.ts} +0 -0
  814. /package/dist/{approvals-execution.js → policy/approvals-execution.js} +0 -0
  815. /package/dist/{capability-env.d.ts → policy/capability-env.d.ts} +0 -0
  816. /package/dist/{capability-env.js → policy/capability-env.js} +0 -0
  817. /package/dist/{capability-secrets.d.ts → policy/capability-secrets.d.ts} +0 -0
  818. /package/dist/{capability-secrets.js → policy/capability-secrets.js} +0 -0
  819. /package/dist/{command-run.js → policy/command-run.js} +0 -0
  820. /package/dist/{credential-material.d.ts → policy/credential-material.d.ts} +0 -0
  821. /package/dist/{credential-material.js → policy/credential-material.js} +0 -0
  822. /package/dist/{needs-action.d.ts → policy/needs-action.d.ts} +0 -0
  823. /package/dist/{needs-action.js → policy/needs-action.js} +0 -0
  824. /package/dist/{output-fields.d.ts → policy/output-fields.d.ts} +0 -0
  825. /package/dist/{output-fields.js → policy/output-fields.js} +0 -0
  826. /package/dist/{overlay-lint.d.ts → policy/overlay-lint.d.ts} +0 -0
  827. /package/dist/{overlay-lint.js → policy/overlay-lint.js} +0 -0
  828. /package/dist/{owner-ticket.d.ts → policy/owner-ticket.d.ts} +0 -0
  829. /package/dist/{search-globs.d.ts → policy/search-globs.d.ts} +0 -0
  830. /package/dist/{search-globs.js → policy/search-globs.js} +0 -0
  831. /package/dist/{ingress-contract.d.ts → protocol/ingress-contract.d.ts} +0 -0
  832. /package/dist/{ingress-protocol.d.ts → protocol/ingress-protocol.d.ts} +0 -0
  833. /package/dist/{ingress-protocol.js → protocol/ingress-protocol.js} +0 -0
  834. /package/dist/{listener-protocol.d.ts → protocol/listener-protocol.d.ts} +0 -0
  835. /package/dist/{peer-mcp-server.d.ts → protocol/peer-mcp-server.d.ts} +0 -0
  836. /package/dist/{peer-mcp-server.js → protocol/peer-mcp-server.js} +0 -0
  837. /package/dist/{request-id.d.ts → protocol/request-id.d.ts} +0 -0
  838. /package/dist/{request-id.js → protocol/request-id.js} +0 -0
  839. /package/dist/{routes.d.ts → protocol/routes.d.ts} +0 -0
  840. /package/dist/{routes.js → protocol/routes.js} +0 -0
  841. /package/dist/{sse.d.ts → protocol/sse.d.ts} +0 -0
  842. /package/dist/{sse.js → protocol/sse.js} +0 -0
  843. /package/dist/{terminal-protocol.js → protocol/terminal-protocol.js} +0 -0
  844. /package/dist/{webext-links.d.ts → protocol/webext-links.d.ts} +0 -0
  845. /package/dist/{webext-links.js → protocol/webext-links.js} +0 -0
  846. /package/dist/{arrival.d.ts → state/arrival.d.ts} +0 -0
  847. /package/dist/{contract-lock.d.ts → state/contract-lock.d.ts} +0 -0
  848. /package/dist/{history-state.d.ts → state/history-state.d.ts} +0 -0
  849. /package/dist/{runtime-state.d.ts → state/runtime-state.d.ts} +0 -0
  850. /package/dist/{runtime-state.js → state/runtime-state.js} +0 -0
  851. /package/dist/{starter.d.ts → state/starter.d.ts} +0 -0
  852. /package/dist/{starter.js → state/starter.js} +0 -0
  853. /package/dist/{state-portability.d.ts → state/state-portability.d.ts} +0 -0
  854. /package/dist/{state-portability.js → state/state-portability.js} +0 -0
  855. /package/dist/{versions.d.ts → state/versions.d.ts} +0 -0
  856. /package/dist/{versions.js → state/versions.js} +0 -0
  857. /package/dist/{embed.d.ts → text/embed.d.ts} +0 -0
  858. /package/dist/{embed.js → text/embed.js} +0 -0
  859. /package/dist/{mentions.d.ts → text/mentions.d.ts} +0 -0
  860. /package/dist/{mentions.js → text/mentions.js} +0 -0
  861. /package/dist/{path-refs.d.ts → text/path-refs.d.ts} +0 -0
  862. /package/dist/{path-refs.js → text/path-refs.js} +0 -0
  863. /package/dist/{shell-regions.js → text/shell-regions.js} +0 -0
  864. /package/dist/{title.d.ts → text/title.d.ts} +0 -0
  865. /package/dist/{title.js → text/title.js} +0 -0
  866. /package/src/{hostnames.test.ts → ids/hostnames.test.ts} +0 -0
  867. /package/src/{share-paths.test.ts → ids/share-paths.test.ts} +0 -0
  868. /package/src/{capability-env.ts → policy/capability-env.ts} +0 -0
  869. /package/src/{overlay-lint.test.ts → policy/overlay-lint.test.ts} +0 -0
  870. /package/src/{search-globs.test.ts → policy/search-globs.test.ts} +0 -0
  871. /package/src/{ingress-contract.test.ts → protocol/ingress-contract.test.ts} +0 -0
  872. /package/src/{peer-mcp-server.test.ts → protocol/peer-mcp-server.test.ts} +0 -0
  873. /package/src/{sse.ts → protocol/sse.ts} +0 -0
  874. /package/src/{versions.test.ts → state/versions.test.ts} +0 -0
  875. /package/src/{embed.test.ts → text/embed.test.ts} +0 -0
  876. /package/src/{mentions.test.ts → text/mentions.test.ts} +0 -0
  877. /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",
@@ -104,7 +97,6 @@ test("files a re-served open-weights model on the cheap rung, not at the head of
104
97
  });
105
98
 
106
99
  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
100
  expect(["claude-opus-5", "claude-fable-5"].toSorted(compareModelIds)).toEqual(["claude-opus-5", "claude-fable-5"]);
109
101
  expect(["claude-fable-5", "claude-opus-5"].toSorted(compareModelIds)).toEqual(["claude-fable-5", "claude-opus-5"]);
110
102
  });
@@ -123,8 +115,6 @@ test("stands an id with nothing but numbers (and an ACP row's empty one) as its
123
115
  });
124
116
 
125
117
  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
118
  expect(releaseOf("claude-opus-4-1-20250805")).toEqual({ version: [4, 1], date: 20250805 });
129
119
  expect(["claude-opus-4-20250514", "claude-opus-4-1-20250805"].toSorted(compareModelIds)).toEqual([
130
120
  "claude-opus-4-1-20250805",
@@ -144,14 +134,13 @@ test("reads a longer version as the newer one, so 5.1 outranks 5", () => {
144
134
  });
145
135
 
146
136
  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.
137
+ // `kimi-latest` claims no release; guessing one would seat it above models that do say what they are.
148
138
  expect(releaseOf("kimi-latest").version).toEqual([]);
149
139
  expect(["kimi-latest", "kimi-k2-0711-preview"].toSorted(compareModelIds)).toEqual(["kimi-k2-0711-preview", "kimi-latest"]);
150
140
  });
151
141
 
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.
142
+ // compareCheapestFirst: what the quick model's one-click helper resolves against, the same tier scale read
143
+ // weakest-first.
155
144
 
156
145
  test("opens on the efficient rung and buries the frontier one: the exact inverse of the picker's order", () => {
157
146
  const claude = ["claude-opus-5", "claude-sonnet-5", "claude-haiku-4-5-20251001"];
@@ -161,9 +150,7 @@ test("opens on the efficient rung and buries the frontier one: the exact inverse
161
150
  });
162
151
 
163
152
  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.
153
+ // An id with no tier word is the provider's baseline, likelier the next flagship than a budget tier.
167
154
  expect(["gpt-5.6", "gpt-5.4-mini"].toSorted(compareCheapestFirst)).toEqual(["gpt-5.4-mini", "gpt-5.6"]);
168
155
  expect(["claude-mythos-1", "claude-haiku-4-5", "claude-sonnet-5"].toSorted(compareCheapestFirst).at(-1)).toBe("claude-mythos-1");
169
156
  });
@@ -176,8 +163,7 @@ test("takes the NEWEST build of the cheap rung, not merely any of them", () => {
176
163
 
177
164
  test("finds each vendor's own cheap rung, including a re-served open-weights row", () => {
178
165
  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.
166
+ // gpt-oss is Google's cheap option; `oss` is its only tier signal, without it the id would sink instead of lead.
181
167
  expect(["claude-opus-4-6-thinking", "gpt-oss-120b-medium"].toSorted(compareCheapestFirst)[0]).toBe("gpt-oss-120b-medium");
182
168
  expect(["grok-4", "grok-4-fast"].toSorted(compareCheapestFirst)[0]).toBe("grok-4-fast");
183
169
  });
@@ -187,38 +173,31 @@ test("reads a release-local tier ladder from the cheap end too", () => {
187
173
  });
188
174
 
189
175
  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. */
176
+ // A routed channel vends one row per thinking level; the cheapest model's top row must not win here.
194
177
  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.
178
+ // …and it is the level that decides, not the release: same model, quieter row wins.
196
179
  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.
180
+ // Tier still outranks thinking: a cheap thinking model beats a silent expensive one.
199
181
  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.
182
+ // An unannotated id is neither accused of thinking nor credited with silence: it sits between the stated ends.
202
183
  expect(["gemini-3-flash", "gemini-3.5-flash-low"].toSorted(compareCheapestFirst)[0]).toBe("gemini-3.5-flash-low");
203
184
  expect(["gemini-3-flash", "gemini-3.6-flash-high"].toSorted(compareCheapestFirst)[0]).toBe("gemini-3-flash");
204
185
  });
205
186
 
206
187
  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.
188
+ // What a settings row shows beside a pin.
208
189
  expect(namesThinking("gemini-3.6-flash-high")).toBe(true);
209
190
  expect(namesThinking("gemini-3.1-pro-low")).toBe(false);
210
191
  expect(namesThinking("gemini-3.5-flash-extra-low")).toBe(false);
211
192
  expect(namesThinking("claude-haiku-4-5-20251001")).toBe(false);
212
193
  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.
194
+ // An effort word other than `high` still names one; so does the on/off form beside its quiet row.
215
195
  expect(namesThinking("gpt-oss-120b-medium")).toBe(true);
216
196
  expect(namesThinking("kimi-k2-thinking")).toBe(true);
217
197
  expect(namesThinking("kimi-k2")).toBe(false);
218
198
  });
219
199
 
220
200
  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.
201
+ // Kimi names no tier word anywhere; with tier cancelled out, newest is the honest fallback.
223
202
  expect(["kimi-k2-0711-preview", "kimi-k2-0905-preview"].toSorted(compareCheapestFirst)[0]).toBe("kimi-k2-0905-preview");
224
203
  });