@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,65 @@
1
+ import type { AccountUsage, UsageWindow, WindowGates } from "../schemas/plan-limits.js";
2
+
3
+ // Single reading of which account pool gates a given model (or, with none named, the account's tightest pool), shared
4
+ // by the daemon's picker/refusal logic and the browser's rings and rail. A pool gated `none` is excluded from the
5
+ // no-model case: visible to the account, never a gate on a turn.
6
+
7
+ // 100 = exhaustion (the call will be refused), not the browser's 90% warning threshold (usageStatus SPENT_PERCENT).
8
+ export const SPENT_UTILIZATION = 100;
9
+
10
+ export interface ModelRef {
11
+ // Wire model id.
12
+ readonly id: string;
13
+ // Display name, when available; matched too, since the tier word may be in either id or label.
14
+ readonly label?: string | undefined;
15
+ }
16
+
17
+ // Splits into lowercase alnum words for whole-word matching: a substring test would match "opus" inside a word that
18
+ // merely contains it.
19
+ export const wordsOf = (text: string): readonly string[] =>
20
+ text
21
+ .toLowerCase()
22
+ .split(/[^a-z0-9]+/)
23
+ .filter(Boolean);
24
+
25
+ // Whether `needle` appears as a contiguous run of whole words within `words`.
26
+ export const runOfWords = (words: readonly string[], needle: readonly string[]): boolean =>
27
+ needle.length > 0 && words.some((_, at) => needle.every((word, index) => words[at + index] === word));
28
+
29
+ const nameMatches = (name: string, model: ModelRef): boolean => {
30
+ const needle = wordsOf(name);
31
+ return runOfWords(wordsOf(model.id), needle) || (model.label !== undefined && runOfWords(wordsOf(model.label), needle));
32
+ };
33
+
34
+ export const gatesModel = (gates: WindowGates, model: ModelRef): boolean =>
35
+ gates === "all" ? true : gates === "none" ? false : gates.models.some((name) => nameMatches(name, model));
36
+
37
+ // Pools that gate this model, or, with no model given, every pool that gates anything.
38
+ export const gatingWindows = (usage: AccountUsage | undefined, model?: ModelRef): readonly UsageWindow[] =>
39
+ (usage?.windows ?? []).filter((window) => (model === undefined ? window.gates !== "none" : gatesModel(window.gates, model)));
40
+
41
+ const fullest = (windows: readonly UsageWindow[]): UsageWindow | undefined =>
42
+ windows.reduce<UsageWindow | undefined>((worst, window) => (worst === undefined || window.utilization > worst.utilization ? window : worst), undefined);
43
+
44
+ // The pool that gates the next turn: the fullest of the windows this model spends. Undefined means nothing gates it (or
45
+ // nothing was measured) — distinct from a measured 0%.
46
+ export const bindingWindow = (usage: AccountUsage | undefined, model?: ModelRef): UsageWindow | undefined => fullest(gatingWindows(usage, model));
47
+
48
+ // The model's own metered pool, by most specific name match; distinct from bindingWindow, which may answer with an
49
+ // all-models pool. Two matches tied in specificity return undefined rather than guess.
50
+ export const scopedWindow = (usage: AccountUsage | undefined, model: ModelRef): UsageWindow | undefined => {
51
+ const matched = (usage?.windows ?? [])
52
+ .flatMap((window) => {
53
+ if (window.gates === "all" || window.gates === "none") {
54
+ return [];
55
+ }
56
+ const specificity = Math.max(0, ...window.gates.models.filter((name) => nameMatches(name, model)).map((name) => wordsOf(name).length));
57
+ return specificity === 0 ? [] : [{ window, specificity }];
58
+ })
59
+ .toSorted((left, right) => right.specificity - left.specificity);
60
+ const best = matched[0];
61
+ if (best === undefined || matched[1]?.specificity === best.specificity) {
62
+ return undefined;
63
+ }
64
+ return best.window;
65
+ };
@@ -1,14 +1,8 @@
1
1
  import { expect, test } from "vitest";
2
2
  import { type ComplexityInput, FAST_CEILING, judgeComplexity } from "./prompt-complexity.js";
3
3
 
4
- /* WHETHER A TURN COULD HAVE RUN ON THE CHEAP RUNG, judged before anything is spent.
5
- *
6
- * What these tests pin is the ASYMMETRY, not the accuracy: the judge can only ever route down, so every one of
7
- * its mistakes in the "standard" direction costs a fraction of a cent and every mistake in the "fast" direction
8
- * costs a user their turn. So the properties worth nailing down are that silence resolves to standard, that a
9
- * gate or an escalating rule ends the question whatever else the sentence says, and that no rule ORDER can
10
- * change an answer. The weights themselves are a hypothesis with a ledger under it (settings.autoTier
11
- * "shadow"), and a test that froze them would be a test that made them impossible to fit. */
4
+ // Pins the asymmetry: the judge only ever routes down, so silence resolves to standard, any escalating rule or gate
5
+ // wins regardless of order, and the weights (settings.autoTier "shadow") stay unpinned.
12
6
 
13
7
  const turn = (prompt: string, over: Partial<ComplexityInput> = {}): ComplexityInput => ({
14
8
  prompt,
@@ -23,24 +17,16 @@ const turn = (prompt: string, over: Partial<ComplexityInput> = {}): ComplexityIn
23
17
 
24
18
  const tierOf = (prompt: string, over: Partial<ComplexityInput> = {}) => judgeComplexity(turn(prompt, over)).tier;
25
19
 
26
- // --- silence, and what it is read as -----------------------------------------------------------------
27
-
28
20
  test("a prompt matching nothing at all stays on the model the user picked", () => {
29
- // The single most important default in the file. An unrecognised request is MEDIUM, never simple: the
30
- // conservative reading of silence is the only safe one when a wrong downgrade costs a retry and a
31
- // user who stops trusting the feature.
32
21
  const verdict = judgeComplexity(turn(`Have another go at the thing we were discussing yesterday afternoon`));
33
22
 
34
23
  expect(verdict.tier).toBe(`standard`);
35
24
  expect(verdict.score).toBeGreaterThan(FAST_CEILING);
36
- // Nothing in the sentence made a positive claim in either direction, so only the two absence features
37
- // fired, and the pair of them cannot reach the ceiling by design.
25
+ // Only the two absence features fire on this input; together they cannot reach the ceiling.
38
26
  expect(verdict.rules).toEqual([`short-prompt`, `no-workspace-reference`]);
39
27
  });
40
28
 
41
29
  test("a short vague request is not read as an easy one", () => {
42
- // Absence of complexity is not evidence of simplicity. Weighted the obvious way, "short and naming no
43
- // file" reached the ceiling by itself and downgraded every terse request in the product.
44
30
  expect(tierOf(`fix the bug`)).toBe(`standard`);
45
31
  expect(tierOf(`have a look at the thing we discussed`)).toBe(`standard`);
46
32
  });
@@ -49,37 +35,26 @@ test("an empty-ish prompt is not mistaken for an easy one", () => {
49
35
  expect(tierOf(` `)).toBe(`standard`);
50
36
  });
51
37
 
52
- // --- the fast end ------------------------------------------------------------------------------------
53
-
54
38
  test("a short question about nothing in the workspace is the case this feature exists for", () => {
55
39
  expect(tierOf(`what is a closure?`)).toBe(`fast`);
56
40
  });
57
41
 
58
42
  test("naming a file keeps an otherwise easy question on the user's own model", () => {
59
- // "explain" is the easiest word in the lexicon, but the turn is now about real code in this repo rather
60
- // than about a concept, and the cheap rung's failures on real code are the silent kind.
43
+ // Same easy word; naming a real file, not a concept, tips the verdict to standard.
61
44
  expect(tierOf(`explain what is a closure`)).toBe(`fast`);
62
45
  expect(tierOf(`explain what src/agent/turn-plan.ts does`)).toBe(`standard`);
63
46
  });
64
47
 
65
48
  test("a trivial aside inside a hard conversation still gets through", () => {
66
- // The reason afterHardTurn is a weight and not a lock: a conversation that has been doing hard work is
67
- // still allowed to be asked an easy question, and locking it out is a mechanism that saves nothing.
68
49
  expect(tierOf(`what is a closure?`, { afterHardTurn: true })).toBe(`fast`);
69
50
  });
70
51
 
71
52
  test("a workspace-adjacent errand stops being cheap once the conversation has done hard work", () => {
72
- // The contrast with the test above is the whole rule. A pure knowledge question survives the penalty
73
- // because it earns every easing feature there is; an errand about this repo does not, and after hard work
74
- // it is far likelier to be the deceptive follow-up than a genuine aside.
75
53
  expect(tierOf(`list the exports`, { afterHardTurn: false })).toBe(`fast`);
76
54
  expect(tierOf(`list the exports`, { afterHardTurn: true })).toBe(`standard`);
77
55
  });
78
56
 
79
- // --- gates: the turn's situation, whatever its words say ---------------------------------------------
80
-
81
57
  test("a screenshot is never sent to the cheap rung, however simple the question about it", () => {
82
- // The tier most likely to misread an image, on the turn least likely to notice that it did.
83
58
  expect(tierOf(`what is this?`, { hasImages: true, attachments: 1 })).toBe(`standard`);
84
59
  });
85
60
 
@@ -88,8 +63,6 @@ test("plan mode is a request to think, so it is never answered by the model that
88
63
  });
89
64
 
90
65
  test("a surface-started run is never downgraded, because nobody is watching it fail", () => {
91
- // Same call a `run` role already makes in the other direction: a run billed whole, with a worktree in
92
- // it, is not the place to spend a guess.
93
66
  expect(tierOf(`what is a closure?`, { unattended: true })).toBe(`standard`);
94
67
  });
95
68
 
@@ -100,8 +73,6 @@ test("a gate reports itself and scores 1, so the ledger can tell a gate from a h
100
73
  expect(verdict.rules).toContain(`unattended`);
101
74
  });
102
75
 
103
- // --- escalating rules: any one ends the question ------------------------------------------------------
104
-
105
76
  test.each([
106
77
  [`pasted code`, "explain this\n```ts\nconst x = 1;\n```"],
107
78
  [`a stack trace`, "it broke\n at Object.run (/work/x.ts:12:3)"],
@@ -116,9 +87,7 @@ test.each([
116
87
  });
117
88
 
118
89
  test("an escalating rule beats every easing feature at once, so rule order cannot change an answer", () => {
119
- // Short, easy-worded, no workspace reference, a bare question: every negative weight in the file, plus one
120
- // escalating rule. Monotone escalation means the rule wins, which is what makes adding a rule tomorrow a
121
- // safe change: it can only ever move turns UP a tier.
90
+ // This prompt trips every easing weight in the file, plus one escalating rule; escalation still wins.
122
91
  const verdict = judgeComplexity(turn(`what is a race condition?`));
123
92
 
124
93
  expect(verdict.tier).toBe(`standard`);
@@ -135,11 +104,7 @@ test("three files in, the job is about a shape rather than about a file", () =>
135
104
  expect(tierOf(`have a look`, { attachments: 1 })).toBe(`standard`);
136
105
  });
137
106
 
138
- // --- the verdict as a record --------------------------------------------------------------------------
139
-
140
107
  test("names every rule that fired, because a score alone cannot say which feature did the work", () => {
141
- // The ledger stores these. Re-fitting the weights against real traffic needs to know WHICH feature moved a
142
- // turn, not merely that a threshold was crossed.
143
108
  const verdict = judgeComplexity(turn(`what is this?`));
144
109
 
145
110
  expect(verdict.rules).toEqual([`short-prompt`, `easy-words`, `bare-question`, `no-workspace-reference`]);
@@ -159,16 +124,10 @@ test("the score never leaves 0..1, so a stored row is always comparable against
159
124
  expect(ceiling.score).toBeLessThanOrEqual(1);
160
125
  });
161
126
 
162
- // --- the one dial, and the property it may not move ------------------------------------------------------
163
-
164
- /* The owner can move the cutoff (settings.autoTierEagerness) because "err toward my model or toward the cheap
165
- * one" is a preference nobody else can hold for them. What these pin is that the dial moves the cutoff and
166
- * NOTHING else, in particular not the rule that a downgrade needs something positively easy to have been said,
167
- * which was the property the old ceiling held only by arithmetic coincidence. */
127
+ // eagerness moves only the cutoff; a downgrade still needs a positive easy signal at any setting.
168
128
 
169
129
  test("the dial widens what counts as simple, in the direction it says", () => {
170
- // A question about a real file: eased by its words, held back by naming a path. The middle stop keeps it on
171
- // the user's pick, and the eager stop is precisely the choice to let it through.
130
+ // Eased by its words, held back by naming a real file; balanced keeps it standard, eager lets it through.
172
131
  const aboutAFile = `explain what src/app.ts does`;
173
132
 
174
133
  expect(tierOf(aboutAFile, { eagerness: `balanced` })).toBe(`standard`);
@@ -176,8 +135,7 @@ test("the dial widens what counts as simple, in the direction it says", () => {
176
135
  });
177
136
 
178
137
  test("the cautious stop wants every easing signal at once, not merely an easy word", () => {
179
- // Its whole content: leave no room for doubt. A statement in easy words still qualifies at the default,
180
- // and does not here; only a short bare question naming no file survives every stop.
138
+ // "explain closures" fails the cautious stop (not a bare question); only a bare question clears every stop.
181
139
  expect(tierOf(`explain closures`, { eagerness: `balanced` })).toBe(`fast`);
182
140
  expect(tierOf(`explain closures`, { eagerness: `cautious` })).toBe(`standard`);
183
141
  expect(tierOf(`what is a closure?`, { eagerness: `cautious` })).toBe(`fast`);
@@ -191,8 +149,6 @@ test("an absent dial is the balanced stop, so every row recorded before it exist
191
149
  });
192
150
 
193
151
  test("no setting of the dial can downgrade a short vague request", () => {
194
- // The whole safety argument for offering an eager stop at all. Absence of complexity is not evidence of
195
- // simplicity at ANY cutoff, so this is a rule in the judge rather than a sum that happens to clear it.
196
152
  for (const eagerness of [`cautious`, `balanced`, `eager`] as const) {
197
153
  expect(tierOf(`fix the bug`, { eagerness })).toBe(`standard`);
198
154
  expect(tierOf(`have a look at the thing we discussed`, { eagerness })).toBe(`standard`);
@@ -200,30 +156,22 @@ test("no setting of the dial can downgrade a short vague request", () => {
200
156
  });
201
157
 
202
158
  test("the deceptive follow-up is standard at every stop, because it never says anything easy", () => {
203
- /* "now do the same for the other file" is the case the whole afterHardTurn signal was built for, and the
204
- * easing rule turns out to answer it more strongly than any cutoff can: those words make no positive claim
205
- * of ease, so no setting of the dial reaches them. The weight still does its own job one test down. */
206
159
  for (const eagerness of [`cautious`, `balanced`, `eager`] as const) {
207
160
  expect(tierOf(`now do the same for the other file`, { eagerness, afterHardTurn: true })).toBe(`standard`);
208
161
  }
209
162
  });
210
163
 
211
164
  test("a turn following hard work has to clear a higher bar, and at the default an eased one no longer does", () => {
212
- // It raises the bar rather than locking the door (see ComplexityInput.afterHardTurn), so this is a shift of
213
- // one stop's worth, not a gate: the same words that route in a fresh conversation stay put in a hard one.
214
165
  expect(tierOf(`explain closures`)).toBe(`fast`);
215
166
  expect(tierOf(`explain closures`, { afterHardTurn: true })).toBe(`standard`);
216
167
  });
217
168
 
218
169
  test("the verdict carries the cutoff it was judged against, because a score alone stopped being an answer", () => {
219
- // With the cutoff an owner setting, the same 0.35 is standard on one stop and fast on another. A ledger of
220
- // bare scores could not tell those two rows apart; the ceiling beside each is what keeps a refit honest.
221
170
  const cautious = judgeComplexity(turn(`explain closures`, { eagerness: `cautious` }));
222
171
  const eager = judgeComplexity(turn(`explain closures`, { eagerness: `eager` }));
223
172
 
224
173
  expect(cautious.ceiling).toBeLessThan(FAST_CEILING);
225
174
  expect(eager.ceiling).toBeGreaterThan(FAST_CEILING);
226
- // Same words, same score, opposite verdicts: the pair that a column of bare scores could not have told apart.
227
175
  expect(cautious.score).toBe(eager.score);
228
176
  expect([cautious.tier, eager.tier]).toEqual([`standard`, `fast`]);
229
177
  });
@@ -0,0 +1,215 @@
1
+ // Judges whether a turn could run on the cheap rung of the provider the user is already on: a pure function over the
2
+ // turn's shape, no model or catalog access. Never fails up: every ambiguous case resolves to standard, since
3
+ // substituting a pricier model would just be honoring the original request.
4
+
5
+ // A verdict lists these, the shadow ledger stores them, a screen renders them: renaming one is a breaking change.
6
+ export type ComplexityRule =
7
+ // Gates: any one ends the question, standard with no score computed.
8
+ | "images"
9
+ | "plan-mode"
10
+ | "unattended"
11
+ // Escalating rules: any one forces standard; order between them cannot matter.
12
+ | "code-block"
13
+ | "stack-trace"
14
+ | "hard-words"
15
+ | "multi-step"
16
+ | "cross-cutting"
17
+ | "long-prompt"
18
+ | "many-attachments"
19
+ // Graded features: these only move the score.
20
+ | "medium-prompt"
21
+ | "attachment"
22
+ | "editor-context"
23
+ | "paths"
24
+ | "many-verbs"
25
+ | "after-hard-turn"
26
+ | "short-prompt"
27
+ | "easy-words"
28
+ | "bare-question"
29
+ | "no-workspace-reference";
30
+
31
+ export type ComplexityTier = "fast" | "standard";
32
+
33
+ // Everything the judge may know: primitive counts, flags and the prompt itself, no shared objects, so the daemon's turn
34
+ // and the composer's draft can each build one independently.
35
+ export interface ComplexityInput {
36
+ readonly prompt: string;
37
+ // Uploaded files plus @-mentioned workspace paths, resolved by the daemon into one count.
38
+ readonly attachments: number;
39
+ // Any attachment the model will read as an image; a cheap rung misreading one is the worst cell in the matrix.
40
+ readonly hasImages: boolean;
41
+ // The opt-in editor chip: the user pointed at a file and a selection, so the turn is about real code.
42
+ readonly editorContext: boolean;
43
+ // A surface started this, not a person at a composer (AgentTurn.unattended).
44
+ readonly unattended: boolean;
45
+ // The turn opens in plan mode: it is being asked to think before it acts.
46
+ readonly planMode: boolean;
47
+ // Whether the prior turn's judgement (not what it ran) was standard; a weight that raises the bar, not a lock.
48
+ readonly afterHardTurn: boolean;
49
+ // settings.autoTierEagerness; absent means balanced, what every pre-knob verdict was judged against.
50
+ readonly eagerness?: TierEagerness;
51
+ }
52
+
53
+ export interface ComplexityVerdict {
54
+ readonly tier: ComplexityTier;
55
+ // 0..1, rounded to three places so ledger rows compare exactly; 1 whenever a gate or escalating rule fired.
56
+ readonly score: number;
57
+ // Every rule that fired, in declaration order; empty means the base score, above the fast ceiling.
58
+ readonly rules: readonly ComplexityRule[];
59
+ // The ceiling this score was judged against, carried out since the ceiling is itself a setting that can change.
60
+ readonly ceiling: number;
61
+ }
62
+
63
+ // Above the fast ceiling on purpose: a prompt matching no rule at all is medium, not simple.
64
+ const BASE_SCORE = 0.5;
65
+
66
+ // How eager the judge is (settings.autoTierEagerness), the one knob this feature exposes:
67
+ // - cautious: floor of 0, downgrades only the clearest easy asks
68
+ // - balanced: the shipped default; every verdict before this knob existed was judged against it
69
+ // - eager: also lets an easy-worded question about real code through
70
+ export const FAST_CEILINGS = { cautious: 0, balanced: 0.25, eager: 0.4 } as const;
71
+ export type TierEagerness = keyof typeof FAST_CEILINGS;
72
+
73
+ // The stop used when nobody chose one: balanced, what every pre-knob verdict was judged against.
74
+ export const FAST_CEILING = FAST_CEILINGS.balanced;
75
+
76
+ // Characters, not tokens: thresholds mark a sentence turning into a brief, or carrying unfenced paste.
77
+ const MEDIUM_PROMPT_CHARS = 600;
78
+ const LONG_PROMPT_CHARS = 2400;
79
+ const SHORT_PROMPT_CHARS = 140;
80
+ // Three files in is a job about a shape rather than about a file, whatever the words say.
81
+ const MANY_ATTACHMENTS = 3;
82
+ // Three or more distinct imperatives is a list of jobs wearing the grammar of one.
83
+ const MANY_VERBS = 3;
84
+
85
+ // Short, boring word lists, case-insensitive on word boundaries; easy only lowers score, hard forces standard.
86
+ const EASY_WORDS =
87
+ /\b(?:what(?:'s| is| are)|explain|describe|summari[sz]e|list|show me|where(?:'s| is| are)|rename|typo|reword|reformat|format this|tidy|define|translate|spell|abbreviat)/i;
88
+
89
+ const HARD_WORDS =
90
+ /\b(?:refactor|redesign|architect|architecture|migrat|root cause|debug|investigat|diagnos|optimi[sz]|race condition|deadlock|memory leak|regression|security|threat model|benchmark|profil|audit|design a|plan (?:a|the|out)|why (?:does|is|are|did|would|can't|cannot))/i;
91
+
92
+ // "Do this, and also that": the strongest cheap signal of a job that is several jobs.
93
+ const MULTI_STEP = /\b(?:and then|after that|once (?:that|you)|followed by|as well as|then also)\b/i;
94
+
95
+ // A job whose subject is the shape of the codebase, not a place in it; the cheap rung is worst at exactly this.
96
+ const CROSS_CUTTING =
97
+ /\b(?:across (?:the|all|every)|every(?: single)? (?:file|module|package|component|usage|call ?site)|all (?:the|of the) (?:files|usages|call ?sites|places)|everywhere|throughout the|codebase-wide|repo-wide)\b/i;
98
+
99
+ // Fenced code, a diff, or an inline patch: proof the turn is real code, where the cheap rung fails silently.
100
+ const CODE_BLOCK = /```|^diff --git |^@@ .* @@|^[+-]{3} [ab]\//m;
101
+
102
+ // A thrown error the user pasted in: the canonical case where the expensive tier earns its price.
103
+ const STACK_TRACE =
104
+ /(?:^|\n)\s*(?:at [\w$.<>]+ \(|Traceback \(most recent call last\)|Caused by:|panic:|thread '.*' panicked|Unhandled|[A-Z]\w*(?:Error|Exception): )/;
105
+
106
+ // A workspace path or @-mention, distinguishing "explain closures" from "explain what this file does".
107
+ const PATH_LIKE =
108
+ /(?:^|\s)(?:@[\w./-]+|[\w-]+\/[\w./-]+\.[a-z]{1,5}\b|\b[\w-]+\.(?:ts|tsx|js|jsx|vue|py|go|rs|java|rb|css|scss|json|ya?ml|md|sql|sh)\b)/i;
109
+
110
+ // One sentence, ending in a question mark, with no second clause: knowledge, not work.
111
+ const BARE_QUESTION = /^[^.!?]{0,200}\?\s*$/;
112
+
113
+ // Imperatives that start a request, counted rather than matched: one is a task, three is a list.
114
+ const VERBS =
115
+ /\b(?:add|remove|delete|fix|write|create|make|update|change|move|rename|split|merge|extract|inline|wire|hook|test|check|run|build|deploy|document|implement|replace|convert|handle|support|expose|log|render|validate|parse|sort|filter|cache)\b/gi;
116
+
117
+ // Bullets and numbered steps, a checklist however casually it is written.
118
+ const LIST_LINES = /^\s*(?:[-*+]\s|\d+[.)]\s)/gm;
119
+
120
+ // Every rule that ends the question on its own; split from the graded features below because these are answers, not
121
+ // evidence.
122
+ const forcing = (input: ComplexityInput, text: string): ComplexityRule[] => {
123
+ const rules: ComplexityRule[] = [];
124
+ // Gates first, cheapest and least arguable: about the turn's situation rather than its words.
125
+ if (input.hasImages) {
126
+ rules.push("images");
127
+ }
128
+ if (input.planMode) {
129
+ rules.push("plan-mode");
130
+ }
131
+ // Unattended turns are billed whole with nobody watching a bad guess.
132
+ if (input.unattended) {
133
+ rules.push("unattended");
134
+ }
135
+ // Then the words: each of these claims the turn is about real code doing something real.
136
+ if (CODE_BLOCK.test(text)) {
137
+ rules.push("code-block");
138
+ }
139
+ if (STACK_TRACE.test(text)) {
140
+ rules.push("stack-trace");
141
+ }
142
+ if (HARD_WORDS.test(text)) {
143
+ rules.push("hard-words");
144
+ }
145
+ if (MULTI_STEP.test(text) || (text.match(LIST_LINES)?.length ?? 0) >= 2) {
146
+ rules.push("multi-step");
147
+ }
148
+ if (CROSS_CUTTING.test(text)) {
149
+ rules.push("cross-cutting");
150
+ }
151
+ if (text.length > LONG_PROMPT_CHARS) {
152
+ rules.push("long-prompt");
153
+ }
154
+ if (input.attachments >= MANY_ATTACHMENTS) {
155
+ rules.push("many-attachments");
156
+ }
157
+ return rules;
158
+ };
159
+
160
+ // Weights are a fitted hypothesis with a ledger under them, not a claim (ships in shadow first). A fast verdict always
161
+ // requires a positive `easing` feature to have fired: absence of complexity is not evidence of simplicity.
162
+ interface GradedFeature {
163
+ readonly rule: ComplexityRule;
164
+ readonly weight: number;
165
+ readonly of: (input: ComplexityInput, text: string) => boolean;
166
+ // A positive reason to think this is easy, not merely an absence of reasons to think it is hard.
167
+ readonly easing?: true;
168
+ }
169
+
170
+ const GRADED: readonly GradedFeature[] = [
171
+ { rule: "medium-prompt", weight: +0.2, of: (_input, text) => text.length > MEDIUM_PROMPT_CHARS },
172
+ { rule: "attachment", weight: +0.15, of: (input) => input.attachments > 0 },
173
+ { rule: "editor-context", weight: +0.1, of: (input) => input.editorContext },
174
+ // Naming a file holds an easy-worded question at standard on balanced; eager is the choice to let it through.
175
+ { rule: "paths", weight: +0.15, of: (_input, text) => PATH_LIKE.test(text) },
176
+ {
177
+ rule: "many-verbs",
178
+ weight: +0.15,
179
+ of: (_input, text) => new Set((text.match(VERBS) ?? []).map((verb) => verb.toLowerCase())).size >= MANY_VERBS,
180
+ },
181
+ // The heaviest weight: the only feature seeing past the words, heavy enough eager cannot downgrade past it.
182
+ { rule: "after-hard-turn", weight: +0.25, of: (input) => input.afterHardTurn },
183
+ // Declared in ledger order. `easing` marks the two positive signals; the rest are light absence features.
184
+ { rule: "short-prompt", weight: -0.1, of: (_input, text) => text.length <= SHORT_PROMPT_CHARS },
185
+ { rule: "easy-words", weight: -0.25, easing: true, of: (_input, text) => EASY_WORDS.test(text) },
186
+ { rule: "bare-question", weight: -0.15, easing: true, of: (_input, text) => BARE_QUESTION.test(text) },
187
+ {
188
+ rule: "no-workspace-reference",
189
+ weight: -0.1,
190
+ of: (input, text) => input.attachments === 0 && !input.editorContext && !PATH_LIKE.test(text),
191
+ },
192
+ ];
193
+
194
+ // Three places, so a stored score is a value not a float artefact, and same-rule rows compare equal.
195
+ const round3 = (value: number): number => Math.round(value * 1000) / 1000;
196
+
197
+ // Gates and escalators force standard at score 1 (monotone: a new rule only moves turns up a tier). Fast otherwise
198
+ // needs both a sub-ceiling score and a positive `easing` signal; silence alone never downgrades.
199
+ export const judgeComplexity = (input: ComplexityInput): ComplexityVerdict => {
200
+ const ceiling = FAST_CEILINGS[input.eagerness ?? "balanced"];
201
+ const text = input.prompt.trim();
202
+ const forced = forcing(input, text);
203
+ if (forced.length > 0) {
204
+ return { tier: "standard", score: 1, rules: forced, ceiling };
205
+ }
206
+ const hits = GRADED.filter((feature) => feature.of(input, text));
207
+ const score = Math.min(1, Math.max(0, BASE_SCORE + hits.reduce((total, feature) => total + feature.weight, 0)));
208
+ const eased = hits.some((feature) => feature.easing === true);
209
+ return {
210
+ tier: eased && score <= ceiling ? "fast" : "standard",
211
+ score: round3(score),
212
+ rules: hits.map((feature) => feature.rule),
213
+ ceiling,
214
+ };
215
+ };
@@ -11,23 +11,16 @@ import {
11
11
  PROVIDER_SPECS,
12
12
  providerSpec,
13
13
  } from "./provider-specs.js";
14
- import { NativeProviderParamSchema } from "./schemas/agent.js";
15
- import { TranslatorAccountsSchema } from "./schemas/plan-limits.js";
16
- import { KeyedProviderSchema } from "./schemas/provider-subscriptions.js";
14
+ import { NativeProviderParamSchema } from "../schemas/agent.js";
15
+ import { TranslatorAccountsSchema } from "../schemas/plan-limits.js";
16
+ import { KeyedProviderSchema } from "../schemas/provider-subscriptions.js";
17
17
 
18
- /* THE SPEC TABLE'S OWN GUARD, and it walks the TABLE rather than a list of names, which is the property that
19
- * makes it worth having: a provider added tomorrow is covered the day it is added, and one removed takes its
20
- * assertions with it.
21
- *
22
- * What it is for. Ten surfaces used to keep their own enumeration of the same providers; six were
23
- * `Record<NativeProvider, …>` and could not be short a row, and the other four were arrays and if-chains that
24
- * silently could. Those four are derived now, and this is what says so: for every provider in the table, every
25
- * derived list contains it, and every derived answer is one a surface can actually render. */
18
+ // Walks the spec table itself rather than a list of provider names, so a provider added or removed carries its
19
+ // assertions with it; every surface's derived list is checked against the table.
26
20
 
27
21
  describe("every provider in the table", () => {
28
22
  test.each(PROVIDER_SPECS.map((spec) => ({ id: spec.id, spec })))("$id is described completely", ({ id, spec }) => {
29
- // The strings a surface prints. Empty is the failure worth naming: each of these lands somewhere a
30
- // person reads, and a blank one renders as a row with no name rather than as an error anybody notices.
23
+ // Strings a surface prints; empty renders as a nameless row rather than a visible error.
31
24
  for (const [field, value] of Object.entries({
32
25
  label: spec.label,
33
26
  vendor: spec.vendor,
@@ -38,16 +31,14 @@ describe("every provider in the table", () => {
38
31
  })) {
39
32
  expect(value.trim(), `${id}.${field}`).not.toBe("");
40
33
  }
41
- // A brand mark, not the fallback glyph. `brand` is typed against these keys so this cannot fail without
42
- // someone reaching for a cast, which is exactly when a test earns its place.
34
+ // brand is typed against these keys, so this only fails if someone reaches for a cast.
43
35
  expect(PROVIDER_BRAND_PATHS[spec.brand], `${id} has no brand mark`).toEqual(expect.any(String));
44
36
  expect(ACCESS_COST[spec.access.kind], `${id} has an unpriced access kind`).toBeTypeOf("number");
45
37
  });
46
38
 
47
39
  test.each(PROVIDER_SPECS.map((spec) => ({ id: spec.id, spec })))("$id declares a reachable credential", ({ id, spec }) => {
48
40
  if (spec.auth.kind === "translator") {
49
- // The proxy's own name for it, which is what the daemon addresses its management API by. Reading
50
- // back undefined here is the `…/model-definitions/undefined` request that used to be possible.
41
+ // The CLIProxyAPI's own name for this provider, addressed by the daemon's management API.
51
42
  expect(cliProxyIdOf(id), `${id} is routed but names no CLIProxyAPI provider`).toBe(spec.auth.cliProxy);
52
43
  expect(KeyedProviderSchema.options, `${id} is routed but missing from KeyedProvider`).toContain(id);
53
44
  expect(Object.keys(TranslatorAccountsSchema.shape), `${id} has no slot in TranslatorAccounts`).toContain(id);
@@ -55,14 +46,10 @@ describe("every provider in the table", () => {
55
46
  }
56
47
  if (spec.auth.kind === "minted") {
57
48
  expect(MINTED_PROVIDERS, `${id} is minted but missing from MINTED_PROVIDERS`).toContain(id);
58
- // At least one estate to sign in to, because the head of this list is what a `login/start` that names
59
- // no variant gets: an empty one is a provider whose connect row has no button that can do anything.
49
+ // The head of this list is what a login/start naming no variant gets; empty means a dead connect button.
60
50
  expect(spec.auth.variants.length, `${id} is minted but offers no estate to sign in to`).toBeGreaterThan(0);
61
51
  for (const variant of spec.auth.variants) {
62
- /* THE TURN URL AND THE CATALOG URL ARE DIFFERENT SURFACES OF ONE ESTATE, and both halves of that
63
- * sentence are asserted: same host (a pair that drifted apart would send the catalog to one
64
- * vendor and the turn to another), and the turn's base carries NO version segment, because the
65
- * harness appends `/v1/messages` itself and a doubled one is a 404 mid-conversation. */
52
+ // Catalog and turn share one host (else different vendors); the turn base carries no version segment.
66
53
  expect(new URL(variant.anthropicBase).host, `${id}/${variant.id}'s catalog and turn hosts differ`).toBe(
67
54
  new URL(variant.catalogBase).host,
68
55
  );
@@ -70,19 +57,19 @@ describe("every provider in the table", () => {
70
57
  /\/v\d+$/,
71
58
  );
72
59
  expect(variant.label.trim(), `${id}/${variant.id} has no estate label`).not.toBe("");
73
- // The lookup every surface goes through, rather than the row behind it: an id that names a
74
- // variant must resolve to that variant and nothing else.
60
+ // The lookup every surface goes through, not the row behind it: a named variant must resolve to itself
61
+ // only.
75
62
  expect(mintedVariant(id, variant.id), `${id}/${variant.id} does not resolve`).toEqual(variant);
76
63
  }
77
- // An absent variant takes the head of the list, which is what a single-estate provider's connect row
78
- // always sends and what a `login/start` with no choice on it means.
64
+ // An absent variant defaults to the list's head: what a single-estate row or a choice-less login/start
65
+ // means.
79
66
  expect(mintedVariant(id), `${id}'s default estate is not the head of its list`).toEqual(spec.auth.variants[0]);
80
- // An estate id nobody declared is NOT the default: falling back would mint a key on one estate and
81
- // dial it at another, and report the refusal as an authentication problem.
67
+ // An unknown estate must not default: it would mint on one estate and dial another, misread as an auth
68
+ // failure.
82
69
  expect(mintedVariant(id, "no-such-estate"), `${id} defaults an unknown estate instead of refusing`).toBeUndefined();
83
70
  return;
84
71
  }
85
- // An oauth provider is served by a handshake this daemon runs; it is in neither routed list.
72
+ // An oauth provider is served by a handshake this daemon runs directly; it belongs in neither routed list.
86
73
  expect(KeyedProviderSchema.options, `${id} is not routed but appears in KeyedProvider`).not.toContain(id);
87
74
  expect(MINTED_PROVIDERS, `${id} is not minted but appears in MINTED_PROVIDERS`).not.toContain(id);
88
75
  expect(mintedVariants(id), `${id} is not minted but names estates`).toBeUndefined();
@@ -96,8 +83,7 @@ describe("every provider in the table", () => {
96
83
  ).toContain(id);
97
84
  expect(Object.keys(PROVIDER_ACCESS), "the access table").toContain(id);
98
85
  expect(Object.keys(PROVIDER_VENDOR), "the vendor table").toContain(id);
99
- // The catalog route's param schema is closed over the same vocabulary, so a provider the daemon holds a
100
- // catalog for but the schema does not name is a 400 on its own models route.
86
+ // The catalog route's param schema shares this vocabulary, or an untracked provider 400s on its models route.
101
87
  expect(NativeProviderParamSchema.safeParse({ provider: id }).success, "the catalog route's param").toBe(true);
102
88
  // The two lookups every surface goes through, rather than the tables behind them.
103
89
  expect(providerSpec(id)?.id).toBe(id);
@@ -106,27 +92,17 @@ describe("every provider in the table", () => {
106
92
  });
107
93
  });
108
94
 
109
- /* IDS ARE THE KEY EVERYTHING ELSE IS FILED UNDER, so a duplicate is not a cosmetic problem: the derived Records
110
- * would silently keep the last row, and `providerSpec` the first. */
111
95
  test("provider ids are unique", () => {
112
96
  const ids = PROVIDER_SPECS.map((spec) => spec.id);
113
97
  expect(new Set(ids).size).toBe(ids.length);
114
98
  });
115
99
 
116
- /* An id may contain neither a slash nor a colon, and both exclusions are load-bearing rather than tidy.
117
- * `endpoint/<id>` uses the slash to namespace a capability-minted provider, and the picker's pinned selections
118
- * are `${provider}:${model}` split on the FIRST colon (model-pins.ts), so an id carrying either would parse as
119
- * something else entirely, silently. */
120
100
  test("no provider id can be mistaken for an endpoint or a pinned selection", () => {
121
101
  for (const spec of PROVIDER_SPECS) {
122
102
  expect(spec.id, `${spec.id} would collide with the picker's key shapes`).toMatch(/^[a-z0-9-]+$/);
123
103
  }
124
104
  });
125
105
 
126
- /* THE HARNESS AXIS IS A FACT ABOUT THE TABLE, not a list any surface keeps. A provider whose two runtimes are
127
- * the same one has nothing to choose, and the chip must not be offered; one with two must offer it. Both
128
- * directions matter: the version of this that lived in the web named two providers and would have offered
129
- * Kimi, Meta and Z.ai a switch between two identical loops. */
130
106
  test("the harness chip is offered exactly where the two harnesses run different loops", () => {
131
107
  for (const spec of PROVIDER_SPECS) {
132
108
  const native = capabilitiesOf(spec.id, "native");
@@ -135,9 +111,6 @@ test("the harness chip is offered exactly where the two harnesses run different
135
111
  }
136
112
  });
137
113
 
138
- /* A MINTED PROVIDER HAS NO NATIVE RUNTIME, by construction rather than by coincidence: it is reached by pointing
139
- * the Claude Code loop at the vendor's own Anthropic endpoint, and there is no second loop to point anywhere
140
- * else. A spec row that claimed one would produce a picker chip offering a runtime nothing serves. */
141
114
  test("a minted provider runs the Claude Code loop on both harnesses", () => {
142
115
  for (const provider of MINTED_PROVIDERS) {
143
116
  expect(capabilitiesOf(provider, "native").runtime, provider).toBe("claude-code");
@@ -145,8 +118,6 @@ test("a minted provider runs the Claude Code loop on both harnesses", () => {
145
118
  }
146
119
  });
147
120
 
148
- // An id that names no provider must fall through every lookup rather than resolving to a neighbour's row, which
149
- // is what makes ACP agents and endpoint capabilities safe to name with arbitrary strings.
150
121
  test("an id that is not a provider resolves to nothing", () => {
151
122
  for (const id of ["", "some-installed-agent", "endpoint/ollama", "META", "z.ai"]) {
152
123
  expect(providerSpec(id), id).toBeUndefined();