@intentic/sandbox-contract 1.247.0 → 1.249.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (883) hide show
  1. package/README.md +18 -15
  2. package/dist/chores/chores.d.ts.map +1 -1
  3. package/dist/chores/chores.js.map +1 -1
  4. package/dist/chores/digest.d.ts.map +1 -1
  5. package/dist/chores/digest.js.map +1 -1
  6. package/dist/chores/extension-update.d.ts.map +1 -1
  7. package/dist/chores/extension-update.js.map +1 -1
  8. package/dist/chores/fix-deps.d.ts.map +1 -1
  9. package/dist/chores/fix-deps.js.map +1 -1
  10. package/dist/chores/index.d.ts +2 -2
  11. package/dist/chores/index.d.ts.map +1 -1
  12. package/dist/chores/index.js +1 -1
  13. package/dist/chores/index.js.map +1 -1
  14. package/dist/chores/probes.d.ts.map +1 -1
  15. package/dist/chores/probes.js.map +1 -1
  16. package/dist/chores/prompt.d.ts.map +1 -1
  17. package/dist/chores/prompt.js.map +1 -1
  18. package/dist/chores/stack.d.ts.map +1 -1
  19. package/dist/chores/stack.js.map +1 -1
  20. package/dist/chores/verdict.d.ts +7 -1
  21. package/dist/chores/verdict.d.ts.map +1 -1
  22. package/dist/chores/verdict.js +8 -0
  23. package/dist/chores/verdict.js.map +1 -1
  24. package/dist/contracts/accounts.contract.d.ts.map +1 -1
  25. package/dist/contracts/accounts.contract.js.map +1 -1
  26. package/dist/contracts/activity.contract.d.ts +1 -0
  27. package/dist/contracts/activity.contract.d.ts.map +1 -1
  28. package/dist/contracts/agent.contract.d.ts +13 -205
  29. package/dist/contracts/agent.contract.d.ts.map +1 -1
  30. package/dist/contracts/agent.contract.js +2 -1
  31. package/dist/contracts/agent.contract.js.map +1 -1
  32. package/dist/contracts/agents.contract.d.ts +228 -54
  33. package/dist/contracts/agents.contract.d.ts.map +1 -1
  34. package/dist/contracts/agents.contract.js +11 -2
  35. package/dist/contracts/agents.contract.js.map +1 -1
  36. package/dist/contracts/automations.contract.d.ts +35 -17
  37. package/dist/contracts/automations.contract.d.ts.map +1 -1
  38. package/dist/contracts/automations.contract.js +10 -1
  39. package/dist/contracts/automations.contract.js.map +1 -1
  40. package/dist/contracts/capabilities.contract.d.ts +0 -12
  41. package/dist/contracts/capabilities.contract.d.ts.map +1 -1
  42. package/dist/contracts/capabilities.contract.js +1 -1
  43. package/dist/contracts/capabilities.contract.js.map +1 -1
  44. package/dist/contracts/chores.contract.d.ts.map +1 -1
  45. package/dist/contracts/chores.contract.js.map +1 -1
  46. package/dist/contracts/ci.contract.d.ts +9 -0
  47. package/dist/contracts/ci.contract.d.ts.map +1 -1
  48. package/dist/contracts/endpoints.contract.d.ts.map +1 -1
  49. package/dist/contracts/endpoints.contract.js.map +1 -1
  50. package/dist/contracts/exit.contract.d.ts.map +1 -1
  51. package/dist/contracts/exit.contract.js +1 -1
  52. package/dist/contracts/exit.contract.js.map +1 -1
  53. package/dist/contracts/extensions.contract.d.ts.map +1 -1
  54. package/dist/contracts/extensions.contract.js.map +1 -1
  55. package/dist/contracts/git.contract.d.ts +45 -6
  56. package/dist/contracts/git.contract.d.ts.map +1 -1
  57. package/dist/contracts/git.contract.js +9 -9
  58. package/dist/contracts/git.contract.js.map +1 -1
  59. package/dist/contracts/host.contract.d.ts +2 -0
  60. package/dist/contracts/host.contract.d.ts.map +1 -1
  61. package/dist/contracts/host.contract.js.map +1 -1
  62. package/dist/contracts/intentic.contract.js +1 -1
  63. package/dist/contracts/intentic.contract.js.map +1 -1
  64. package/dist/contracts/logs.contract.d.ts.map +1 -1
  65. package/dist/contracts/logs.contract.js.map +1 -1
  66. package/dist/contracts/loops.contract.d.ts.map +1 -1
  67. package/dist/contracts/loops.contract.js.map +1 -1
  68. package/dist/contracts/personas.contract.d.ts +39 -4
  69. package/dist/contracts/personas.contract.d.ts.map +1 -1
  70. package/dist/contracts/personas.contract.js +10 -1
  71. package/dist/contracts/personas.contract.js.map +1 -1
  72. package/dist/contracts/providers.contract.d.ts.map +1 -1
  73. package/dist/contracts/providers.contract.js.map +1 -1
  74. package/dist/contracts/runner.contract.d.ts +6 -80
  75. package/dist/contracts/runner.contract.d.ts.map +1 -1
  76. package/dist/contracts/runner.contract.js +2 -2
  77. package/dist/contracts/runner.contract.js.map +1 -1
  78. package/dist/contracts/safety.contract.d.ts.map +1 -1
  79. package/dist/contracts/safety.contract.js +1 -1
  80. package/dist/contracts/safety.contract.js.map +1 -1
  81. package/dist/contracts/secrets.contract.d.ts.map +1 -1
  82. package/dist/contracts/secrets.contract.js.map +1 -1
  83. package/dist/contracts/sessions.contract.d.ts +2 -41
  84. package/dist/contracts/sessions.contract.d.ts.map +1 -1
  85. package/dist/contracts/sessions.contract.js +1 -1
  86. package/dist/contracts/sessions.contract.js.map +1 -1
  87. package/dist/contracts/settings.contract.d.ts +10 -10
  88. package/dist/contracts/settings.contract.d.ts.map +1 -1
  89. package/dist/contracts/settings.contract.js.map +1 -1
  90. package/dist/contracts/share.contract.d.ts.map +1 -1
  91. package/dist/contracts/share.contract.js.map +1 -1
  92. package/dist/contracts/skills.contract.d.ts.map +1 -1
  93. package/dist/contracts/skills.contract.js.map +1 -1
  94. package/dist/contracts/system.contract.d.ts +49 -73
  95. package/dist/contracts/system.contract.d.ts.map +1 -1
  96. package/dist/contracts/system.contract.js +12 -2
  97. package/dist/contracts/system.contract.js.map +1 -1
  98. package/dist/contracts/usage.contract.d.ts.map +1 -1
  99. package/dist/contracts/usage.contract.js.map +1 -1
  100. package/dist/contracts/vpn.contract.d.ts.map +1 -1
  101. package/dist/contracts/vpn.contract.js +1 -1
  102. package/dist/contracts/vpn.contract.js.map +1 -1
  103. package/dist/contracts/webext.contract.d.ts.map +1 -1
  104. package/dist/contracts/webext.contract.js.map +1 -1
  105. package/dist/contracts/workflows.contract.d.ts +7 -6
  106. package/dist/contracts/workflows.contract.d.ts.map +1 -1
  107. package/dist/contracts/workflows.contract.js +12 -3
  108. package/dist/contracts/workflows.contract.js.map +1 -1
  109. package/dist/contracts/workspace.contract.d.ts.map +1 -1
  110. package/dist/contracts/workspace.contract.js.map +1 -1
  111. package/dist/events/agent-events.d.ts +1237 -0
  112. package/dist/events/agent-events.d.ts.map +1 -0
  113. package/dist/events/agent-events.js +226 -0
  114. package/dist/events/agent-events.js.map +1 -0
  115. package/dist/events/cards.d.ts +404 -0
  116. package/dist/events/cards.d.ts.map +1 -0
  117. package/dist/events/cards.js +179 -0
  118. package/dist/events/cards.js.map +1 -0
  119. package/dist/events/resume.d.ts +23 -0
  120. package/dist/events/resume.d.ts.map +1 -0
  121. package/dist/events/resume.js +31 -0
  122. package/dist/events/resume.js.map +1 -0
  123. package/dist/events/system-events.d.ts +615 -0
  124. package/dist/events/system-events.d.ts.map +1 -0
  125. package/dist/events/system-events.js +64 -0
  126. package/dist/events/system-events.js.map +1 -0
  127. package/dist/events/transcript.d.ts +1755 -0
  128. package/dist/events/transcript.d.ts.map +1 -0
  129. package/dist/events/transcript.js +205 -0
  130. package/dist/events/transcript.js.map +1 -0
  131. package/dist/ids/conversation-ids.d.ts +8 -0
  132. package/dist/ids/conversation-ids.d.ts.map +1 -0
  133. package/dist/{conversation-ids.js → ids/conversation-ids.js} +13 -0
  134. package/dist/ids/conversation-ids.js.map +1 -0
  135. package/dist/ids/hostnames.d.ts.map +1 -0
  136. package/dist/ids/hostnames.js.map +1 -0
  137. package/dist/ids/session-names.d.ts.map +1 -0
  138. package/dist/ids/session-names.js.map +1 -0
  139. package/dist/ids/share-paths.d.ts.map +1 -0
  140. package/dist/ids/share-paths.js.map +1 -0
  141. package/dist/{tunnel-ids.d.ts → ids/tunnel-ids.d.ts} +1 -0
  142. package/dist/ids/tunnel-ids.d.ts.map +1 -0
  143. package/dist/{tunnel-ids.js → ids/tunnel-ids.js} +1 -0
  144. package/dist/ids/tunnel-ids.js.map +1 -0
  145. package/dist/index.d.ts +464 -447
  146. package/dist/index.d.ts.map +1 -1
  147. package/dist/index.js +54 -47
  148. package/dist/index.js.map +1 -1
  149. package/dist/{agent-catalog.d.ts → models/agent-catalog.d.ts} +2 -2
  150. package/dist/models/agent-catalog.d.ts.map +1 -0
  151. package/dist/models/agent-catalog.js.map +1 -0
  152. package/dist/models/agent-runtimes.d.ts.map +1 -0
  153. package/dist/models/agent-runtimes.js.map +1 -0
  154. package/dist/{fast-tier.d.ts → models/fast-tier.d.ts} +1 -1
  155. package/dist/models/fast-tier.d.ts.map +1 -0
  156. package/dist/models/fast-tier.js.map +1 -0
  157. package/dist/models/model-order.d.ts.map +1 -0
  158. package/dist/models/model-order.js.map +1 -0
  159. package/dist/{model-pins.d.ts → models/model-pins.d.ts} +2 -4
  160. package/dist/models/model-pins.d.ts.map +1 -0
  161. package/dist/models/model-pins.js +22 -0
  162. package/dist/models/model-pins.js.map +1 -0
  163. package/dist/{model-roles.d.ts → models/model-roles.d.ts} +25 -30
  164. package/dist/models/model-roles.d.ts.map +1 -0
  165. package/dist/{model-roles.js → models/model-roles.js} +30 -27
  166. package/dist/models/model-roles.js.map +1 -0
  167. package/dist/{plan-pools.d.ts → models/plan-pools.d.ts} +1 -1
  168. package/dist/models/plan-pools.d.ts.map +1 -0
  169. package/dist/models/plan-pools.js.map +1 -0
  170. package/dist/models/prompt-complexity.d.ts.map +1 -0
  171. package/dist/models/prompt-complexity.js.map +1 -0
  172. package/dist/models/provider-specs.d.ts.map +1 -0
  173. package/dist/models/provider-specs.js.map +1 -0
  174. package/dist/policy/approvals-execution.d.ts.map +1 -0
  175. package/dist/policy/approvals-execution.js.map +1 -0
  176. package/dist/{batch-runs.d.ts → policy/batch-runs.d.ts} +5 -1
  177. package/dist/policy/batch-runs.d.ts.map +1 -0
  178. package/dist/{batch-runs.js → policy/batch-runs.js} +10 -7
  179. package/dist/policy/batch-runs.js.map +1 -0
  180. package/dist/policy/capability-env.d.ts.map +1 -0
  181. package/dist/policy/capability-env.js.map +1 -0
  182. package/dist/policy/capability-secrets.d.ts.map +1 -0
  183. package/dist/policy/capability-secrets.js.map +1 -0
  184. package/dist/{card-status.d.ts → policy/card-status.d.ts} +2 -2
  185. package/dist/policy/card-status.d.ts.map +1 -0
  186. package/dist/{card-status.js → policy/card-status.js} +1 -5
  187. package/dist/policy/card-status.js.map +1 -0
  188. package/dist/{command-classes.d.ts → policy/command-classes.d.ts} +6 -2
  189. package/dist/policy/command-classes.d.ts.map +1 -0
  190. package/dist/{command-classes.js → policy/command-classes.js} +48 -11
  191. package/dist/policy/command-classes.js.map +1 -0
  192. package/dist/{command-run.d.ts → policy/command-run.d.ts} +1 -1
  193. package/dist/policy/command-run.d.ts.map +1 -0
  194. package/dist/policy/command-run.js.map +1 -0
  195. package/dist/policy/control-scopes.d.ts +16 -0
  196. package/dist/policy/control-scopes.d.ts.map +1 -0
  197. package/dist/policy/control-scopes.js +26 -0
  198. package/dist/policy/control-scopes.js.map +1 -0
  199. package/dist/policy/credential-material.d.ts.map +1 -0
  200. package/dist/policy/credential-material.js.map +1 -0
  201. package/dist/policy/needs-action.d.ts.map +1 -0
  202. package/dist/policy/needs-action.js.map +1 -0
  203. package/dist/policy/output-fields.d.ts.map +1 -0
  204. package/dist/policy/output-fields.js.map +1 -0
  205. package/dist/policy/overlay-lint.d.ts.map +1 -0
  206. package/dist/policy/overlay-lint.js.map +1 -0
  207. package/dist/policy/owner-ticket.d.ts.map +1 -0
  208. package/dist/{owner-ticket.js → policy/owner-ticket.js} +1 -1
  209. package/dist/policy/owner-ticket.js.map +1 -0
  210. package/dist/{safety-policy.d.ts → policy/safety-policy.d.ts} +6 -5
  211. package/dist/policy/safety-policy.d.ts.map +1 -0
  212. package/dist/{safety-policy.js → policy/safety-policy.js} +12 -12
  213. package/dist/policy/safety-policy.js.map +1 -0
  214. package/dist/policy/search-globs.d.ts.map +1 -0
  215. package/dist/policy/search-globs.js.map +1 -0
  216. package/dist/protocol/container-requirements.d.ts +20 -0
  217. package/dist/protocol/container-requirements.d.ts.map +1 -0
  218. package/dist/protocol/container-requirements.js +23 -0
  219. package/dist/protocol/container-requirements.js.map +1 -0
  220. package/dist/{host-protocol.d.ts → protocol/host-protocol.d.ts} +1 -0
  221. package/dist/protocol/host-protocol.d.ts.map +1 -0
  222. package/dist/{host-protocol.js → protocol/host-protocol.js} +1 -0
  223. package/dist/protocol/host-protocol.js.map +1 -0
  224. package/dist/protocol/ingress-contract.d.ts.map +1 -0
  225. package/dist/{ingress-contract.js → protocol/ingress-contract.js} +1 -1
  226. package/dist/protocol/ingress-contract.js.map +1 -0
  227. package/dist/protocol/ingress-protocol.d.ts.map +1 -0
  228. package/dist/protocol/ingress-protocol.js.map +1 -0
  229. package/dist/protocol/listener-protocol.d.ts.map +1 -0
  230. package/dist/{listener-protocol.js → protocol/listener-protocol.js} +1 -1
  231. package/dist/protocol/listener-protocol.js.map +1 -0
  232. package/dist/{peer-dial.d.ts → protocol/peer-dial.d.ts} +4 -1
  233. package/dist/protocol/peer-dial.d.ts.map +1 -0
  234. package/dist/{peer-dial.js → protocol/peer-dial.js} +51 -10
  235. package/dist/protocol/peer-dial.js.map +1 -0
  236. package/dist/protocol/peer-mcp-server.d.ts.map +1 -0
  237. package/dist/protocol/peer-mcp-server.js.map +1 -0
  238. package/dist/protocol/request-id.d.ts.map +1 -0
  239. package/dist/protocol/request-id.js.map +1 -0
  240. package/dist/protocol/routes.d.ts.map +1 -0
  241. package/dist/protocol/routes.js.map +1 -0
  242. package/dist/{runner-protocol.d.ts → protocol/runner-protocol.d.ts} +1 -0
  243. package/dist/protocol/runner-protocol.d.ts.map +1 -0
  244. package/dist/{runner-protocol.js → protocol/runner-protocol.js} +2 -1
  245. package/dist/protocol/runner-protocol.js.map +1 -0
  246. package/dist/protocol/sse.d.ts.map +1 -0
  247. package/dist/protocol/sse.js.map +1 -0
  248. package/dist/{terminal-protocol.d.ts → protocol/terminal-protocol.d.ts} +1 -3
  249. package/dist/protocol/terminal-protocol.d.ts.map +1 -0
  250. package/dist/protocol/terminal-protocol.js.map +1 -0
  251. package/dist/protocol/webext-links.d.ts.map +1 -0
  252. package/dist/protocol/webext-links.js.map +1 -0
  253. package/dist/{webext-protocol.d.ts → protocol/webext-protocol.d.ts} +1 -0
  254. package/dist/protocol/webext-protocol.d.ts.map +1 -0
  255. package/dist/{webext-protocol.js → protocol/webext-protocol.js} +1 -0
  256. package/dist/protocol/webext-protocol.js.map +1 -0
  257. package/dist/schemas/activity.d.ts +2 -0
  258. package/dist/schemas/activity.d.ts.map +1 -1
  259. package/dist/schemas/activity.js +4 -0
  260. package/dist/schemas/activity.js.map +1 -1
  261. package/dist/schemas/agent.d.ts +17 -4
  262. package/dist/schemas/agent.d.ts.map +1 -1
  263. package/dist/schemas/agent.js +21 -4
  264. package/dist/schemas/agent.js.map +1 -1
  265. package/dist/schemas/agents.d.ts +17 -4
  266. package/dist/schemas/agents.d.ts.map +1 -1
  267. package/dist/schemas/agents.js +15 -4
  268. package/dist/schemas/agents.js.map +1 -1
  269. package/dist/schemas/approvals.d.ts.map +1 -1
  270. package/dist/schemas/approvals.js.map +1 -1
  271. package/dist/schemas/automations.d.ts +54 -28
  272. package/dist/schemas/automations.d.ts.map +1 -1
  273. package/dist/schemas/automations.js +26 -8
  274. package/dist/schemas/automations.js.map +1 -1
  275. package/dist/schemas/capabilities.d.ts +0 -8
  276. package/dist/schemas/capabilities.d.ts.map +1 -1
  277. package/dist/schemas/capabilities.js +0 -4
  278. package/dist/schemas/capabilities.js.map +1 -1
  279. package/dist/schemas/ci.d.ts +10 -0
  280. package/dist/schemas/ci.d.ts.map +1 -1
  281. package/dist/schemas/ci.js +9 -1
  282. package/dist/schemas/ci.js.map +1 -1
  283. package/dist/schemas/codebase-health.d.ts.map +1 -1
  284. package/dist/schemas/codebase-health.js.map +1 -1
  285. package/dist/schemas/devices.d.ts +90 -0
  286. package/dist/schemas/devices.d.ts.map +1 -1
  287. package/dist/schemas/devices.js +10 -1
  288. package/dist/schemas/devices.js.map +1 -1
  289. package/dist/schemas/engines.d.ts.map +1 -1
  290. package/dist/schemas/engines.js.map +1 -1
  291. package/dist/schemas/environment.d.ts.map +1 -1
  292. package/dist/schemas/environment.js.map +1 -1
  293. package/dist/schemas/exit.d.ts.map +1 -1
  294. package/dist/schemas/exit.js.map +1 -1
  295. package/dist/schemas/extension-updates.d.ts.map +1 -1
  296. package/dist/schemas/extension-updates.js.map +1 -1
  297. package/dist/schemas/git-history.d.ts.map +1 -1
  298. package/dist/schemas/git-history.js.map +1 -1
  299. package/dist/schemas/git.d.ts +80 -16
  300. package/dist/schemas/git.d.ts.map +1 -1
  301. package/dist/schemas/git.js +37 -25
  302. package/dist/schemas/git.js.map +1 -1
  303. package/dist/schemas/history.d.ts.map +1 -1
  304. package/dist/schemas/history.js.map +1 -1
  305. package/dist/schemas/hosts.d.ts.map +1 -1
  306. package/dist/schemas/hosts.js.map +1 -1
  307. package/dist/schemas/inventory.d.ts.map +1 -1
  308. package/dist/schemas/inventory.js.map +1 -1
  309. package/dist/schemas/issues.d.ts +0 -1
  310. package/dist/schemas/issues.d.ts.map +1 -1
  311. package/dist/schemas/issues.js +0 -1
  312. package/dist/schemas/issues.js.map +1 -1
  313. package/dist/schemas/logs.d.ts.map +1 -1
  314. package/dist/schemas/logs.js.map +1 -1
  315. package/dist/schemas/loops.d.ts.map +1 -1
  316. package/dist/schemas/loops.js +1 -1
  317. package/dist/schemas/loops.js.map +1 -1
  318. package/dist/schemas/maintenance.d.ts.map +1 -1
  319. package/dist/schemas/maintenance.js.map +1 -1
  320. package/dist/schemas/marketplace.d.ts +0 -4
  321. package/dist/schemas/marketplace.d.ts.map +1 -1
  322. package/dist/schemas/panels.d.ts.map +1 -1
  323. package/dist/schemas/panels.js.map +1 -1
  324. package/dist/schemas/personas.d.ts +49 -4
  325. package/dist/schemas/personas.d.ts.map +1 -1
  326. package/dist/schemas/personas.js +32 -5
  327. package/dist/schemas/personas.js.map +1 -1
  328. package/dist/schemas/plan-limits.d.ts +2 -4
  329. package/dist/schemas/plan-limits.d.ts.map +1 -1
  330. package/dist/schemas/plan-limits.js +5 -8
  331. package/dist/schemas/plan-limits.js.map +1 -1
  332. package/dist/schemas/ports.d.ts.map +1 -1
  333. package/dist/schemas/ports.js.map +1 -1
  334. package/dist/schemas/provider-oauth.d.ts.map +1 -1
  335. package/dist/schemas/provider-oauth.js.map +1 -1
  336. package/dist/schemas/provider-subscriptions.d.ts +1 -1
  337. package/dist/schemas/provider-subscriptions.d.ts.map +1 -1
  338. package/dist/schemas/provider-subscriptions.js +1 -1
  339. package/dist/schemas/provider-subscriptions.js.map +1 -1
  340. package/dist/schemas/public.d.ts.map +1 -1
  341. package/dist/schemas/public.js.map +1 -1
  342. package/dist/schemas/push.d.ts.map +1 -1
  343. package/dist/schemas/push.js.map +1 -1
  344. package/dist/schemas/secrets.d.ts.map +1 -1
  345. package/dist/schemas/secrets.js.map +1 -1
  346. package/dist/schemas/settings.d.ts +7 -5
  347. package/dist/schemas/settings.d.ts.map +1 -1
  348. package/dist/schemas/settings.js +18 -8
  349. package/dist/schemas/settings.js.map +1 -1
  350. package/dist/schemas/share.d.ts.map +1 -1
  351. package/dist/schemas/share.js.map +1 -1
  352. package/dist/schemas/shared.d.ts +4 -0
  353. package/dist/schemas/shared.d.ts.map +1 -1
  354. package/dist/schemas/shared.js +3 -0
  355. package/dist/schemas/shared.js.map +1 -1
  356. package/dist/schemas/system.d.ts +6 -0
  357. package/dist/schemas/system.d.ts.map +1 -1
  358. package/dist/schemas/system.js +10 -0
  359. package/dist/schemas/system.js.map +1 -1
  360. package/dist/schemas/terminal.d.ts.map +1 -1
  361. package/dist/schemas/terminal.js.map +1 -1
  362. package/dist/schemas/usage.d.ts.map +1 -1
  363. package/dist/schemas/usage.js.map +1 -1
  364. package/dist/schemas/vpn.d.ts.map +1 -1
  365. package/dist/schemas/vpn.js.map +1 -1
  366. package/dist/schemas/webext.d.ts.map +1 -1
  367. package/dist/schemas/webext.js.map +1 -1
  368. package/dist/schemas/workflows.d.ts +66 -9
  369. package/dist/schemas/workflows.d.ts.map +1 -1
  370. package/dist/schemas/workflows.js +6 -5
  371. package/dist/schemas/workflows.js.map +1 -1
  372. package/dist/schemas/workspace-repos.d.ts.map +1 -1
  373. package/dist/schemas/workspace-repos.js.map +1 -1
  374. package/dist/schemas/workspace-search.d.ts.map +1 -1
  375. package/dist/schemas/workspace-search.js.map +1 -1
  376. package/dist/schemas/workspace-setup.d.ts.map +1 -1
  377. package/dist/schemas/workspace-setup.js.map +1 -1
  378. package/dist/schemas/workspace-tree.d.ts.map +1 -1
  379. package/dist/schemas/workspace-tree.js.map +1 -1
  380. package/dist/state/arrival.d.ts.map +1 -0
  381. package/dist/{arrival.js → state/arrival.js} +1 -1
  382. package/dist/state/arrival.js.map +1 -0
  383. package/dist/state/contract-lock.d.ts.map +1 -0
  384. package/dist/{contract-lock.js → state/contract-lock.js} +1 -1
  385. package/dist/state/contract-lock.js.map +1 -0
  386. package/dist/{definition.d.ts → state/definition.d.ts} +21 -17
  387. package/dist/state/definition.d.ts.map +1 -0
  388. package/dist/{definition.js → state/definition.js} +4 -4
  389. package/dist/state/definition.js.map +1 -0
  390. package/dist/state/history-state.d.ts.map +1 -0
  391. package/dist/{history-state.js → state/history-state.js} +1 -0
  392. package/dist/state/history-state.js.map +1 -0
  393. package/dist/state/runtime-state.d.ts.map +1 -0
  394. package/dist/state/runtime-state.js.map +1 -0
  395. package/dist/state/starter.d.ts.map +1 -0
  396. package/dist/state/starter.js.map +1 -0
  397. package/dist/state/state-portability.d.ts.map +1 -0
  398. package/dist/state/state-portability.js.map +1 -0
  399. package/dist/state/versions.d.ts.map +1 -0
  400. package/dist/state/versions.js.map +1 -0
  401. package/dist/{workspace-state.d.ts → state/workspace-state.d.ts} +8 -5
  402. package/dist/state/workspace-state.d.ts.map +1 -0
  403. package/dist/{workspace-state.js → state/workspace-state.js} +25 -1
  404. package/dist/state/workspace-state.js.map +1 -0
  405. package/dist/{documents.d.ts → text/documents.d.ts} +1 -1
  406. package/dist/text/documents.d.ts.map +1 -0
  407. package/dist/{documents.js → text/documents.js} +1 -1
  408. package/dist/text/documents.js.map +1 -0
  409. package/dist/text/embed.d.ts.map +1 -0
  410. package/dist/text/embed.js.map +1 -0
  411. package/dist/text/mentions.d.ts.map +1 -0
  412. package/dist/text/mentions.js.map +1 -0
  413. package/dist/text/model-answer.d.ts +3 -0
  414. package/dist/text/model-answer.d.ts.map +1 -0
  415. package/dist/text/model-answer.js +3 -0
  416. package/dist/text/model-answer.js.map +1 -0
  417. package/dist/text/path-refs.d.ts.map +1 -0
  418. package/dist/text/path-refs.js.map +1 -0
  419. package/dist/{shell-regions.d.ts → text/shell-regions.d.ts} +1 -1
  420. package/dist/text/shell-regions.d.ts.map +1 -0
  421. package/dist/text/shell-regions.js.map +1 -0
  422. package/dist/text/title.d.ts.map +1 -0
  423. package/dist/text/title.js.map +1 -0
  424. package/dist/{transcript-fold.d.ts → text/transcript-fold.d.ts} +2 -1
  425. package/dist/text/transcript-fold.d.ts.map +1 -0
  426. package/dist/{transcript-fold.js → text/transcript-fold.js} +2 -16
  427. package/dist/text/transcript-fold.js.map +1 -0
  428. package/dist/text/whisper.d.ts +3 -0
  429. package/dist/text/whisper.d.ts.map +1 -0
  430. package/dist/text/whisper.js +11 -0
  431. package/dist/text/whisper.js.map +1 -0
  432. package/dist/{workflow-faults.d.ts → text/workflow-faults.d.ts} +1 -1
  433. package/dist/text/workflow-faults.d.ts.map +1 -0
  434. package/dist/{workflow-faults.js → text/workflow-faults.js} +1 -1
  435. package/dist/text/workflow-faults.js.map +1 -0
  436. package/package.json +70 -70
  437. package/src/chores/chores.test.ts +4 -10
  438. package/src/chores/chores.ts +148 -392
  439. package/src/chores/digest.ts +8 -28
  440. package/src/chores/extension-update.ts +3 -8
  441. package/src/chores/fix-deps.ts +4 -18
  442. package/src/chores/index.ts +2 -2
  443. package/src/chores/probes.test.ts +7 -43
  444. package/src/chores/probes.ts +62 -167
  445. package/src/chores/prompt.ts +10 -34
  446. package/src/chores/stack.test.ts +6 -45
  447. package/src/chores/stack.ts +27 -118
  448. package/src/chores/verdict.test.ts +101 -80
  449. package/src/chores/verdict.ts +54 -99
  450. package/src/contracts/accounts.contract.ts +4 -19
  451. package/src/contracts/agent.contract.ts +7 -22
  452. package/src/contracts/agents.contract.ts +25 -71
  453. package/src/contracts/automations.contract.ts +14 -30
  454. package/src/contracts/capabilities.contract.ts +8 -35
  455. package/src/contracts/chores.contract.ts +4 -15
  456. package/src/contracts/endpoints.contract.ts +5 -22
  457. package/src/contracts/exit.contract.ts +7 -30
  458. package/src/contracts/extensions.contract.ts +8 -30
  459. package/src/contracts/git.contract.ts +25 -49
  460. package/src/contracts/host.contract.ts +9 -44
  461. package/src/contracts/intentic.contract.ts +1 -1
  462. package/src/contracts/logs.contract.ts +3 -13
  463. package/src/contracts/loops.contract.ts +9 -40
  464. package/src/contracts/personas.contract.ts +22 -30
  465. package/src/contracts/providers.contract.ts +4 -17
  466. package/src/contracts/runner.contract.ts +12 -39
  467. package/src/contracts/safety.contract.ts +5 -14
  468. package/src/contracts/secrets.contract.ts +4 -22
  469. package/src/contracts/sessions.contract.ts +1 -1
  470. package/src/contracts/settings.contract.ts +4 -10
  471. package/src/contracts/share.contract.ts +3 -9
  472. package/src/contracts/skills.contract.ts +4 -15
  473. package/src/contracts/system.contract.ts +26 -52
  474. package/src/contracts/usage.contract.ts +7 -21
  475. package/src/contracts/vpn.contract.ts +9 -16
  476. package/src/contracts/webext.contract.ts +9 -25
  477. package/src/contracts/workflows.contract.ts +34 -58
  478. package/src/contracts/workspace.contract.ts +19 -50
  479. package/src/events/agent-events.ts +345 -0
  480. package/src/events/cards.ts +286 -0
  481. package/src/{events.test.ts → events/resume.test.ts} +4 -19
  482. package/src/events/resume.ts +60 -0
  483. package/src/events/system-events.ts +139 -0
  484. package/src/events/transcript.ts +320 -0
  485. package/src/{conversation-ids.test.ts → ids/conversation-ids.test.ts} +25 -13
  486. package/src/ids/conversation-ids.ts +178 -0
  487. package/src/ids/hostnames.ts +129 -0
  488. package/src/ids/session-names.ts +29 -0
  489. package/src/ids/share-paths.ts +43 -0
  490. package/src/{tunnel-ids.test.ts → ids/tunnel-ids.test.ts} +1 -14
  491. package/src/ids/tunnel-ids.ts +29 -0
  492. package/src/index.ts +71 -88
  493. package/src/{agent-catalog.test.ts → models/agent-catalog.test.ts} +19 -93
  494. package/src/models/agent-catalog.ts +174 -0
  495. package/src/models/agent-runtimes.ts +201 -0
  496. package/src/models/capability-ledger.test.ts +84 -0
  497. package/src/{fast-tier.test.ts → models/fast-tier.test.ts} +7 -18
  498. package/src/models/fast-tier.ts +36 -0
  499. package/src/{model-order.test.ts → models/model-order.test.ts} +19 -40
  500. package/src/models/model-order.ts +163 -0
  501. package/src/models/model-pins.test.ts +87 -0
  502. package/src/models/model-pins.ts +57 -0
  503. package/src/models/model-roles.test.ts +38 -0
  504. package/src/models/model-roles.ts +180 -0
  505. package/src/{plan-pools.test.ts → models/plan-pools.test.ts} +6 -11
  506. package/src/models/plan-pools.ts +65 -0
  507. package/src/{prompt-complexity.test.ts → models/prompt-complexity.test.ts} +8 -60
  508. package/src/models/prompt-complexity.ts +215 -0
  509. package/src/{provider-specs.test.ts → models/provider-specs.test.ts} +18 -47
  510. package/src/models/provider-specs.ts +272 -0
  511. package/src/policy/approvals-execution.ts +58 -0
  512. package/src/{batch-runs.test.ts → policy/batch-runs.test.ts} +4 -20
  513. package/src/policy/batch-runs.ts +137 -0
  514. package/src/policy/capability-secrets.ts +5 -0
  515. package/src/{card-status.ts → policy/card-status.ts} +11 -26
  516. package/src/{command-classes.test.ts → policy/command-classes.test.ts} +11 -118
  517. package/src/policy/command-classes.ts +395 -0
  518. package/src/policy/command-run.ts +65 -0
  519. package/src/policy/control-scopes.ts +38 -0
  520. package/src/{credential-material.test.ts → policy/credential-material.test.ts} +4 -26
  521. package/src/policy/credential-material.ts +91 -0
  522. package/src/policy/needs-action.ts +5 -0
  523. package/src/policy/output-fields.ts +86 -0
  524. package/src/policy/overlay-lint.ts +100 -0
  525. package/src/{owner-ticket.test.ts → policy/owner-ticket.test.ts} +1 -1
  526. package/src/{owner-ticket.ts → policy/owner-ticket.ts} +9 -31
  527. package/src/policy/safety-policy.test.ts +84 -0
  528. package/src/policy/safety-policy.ts +142 -0
  529. package/src/policy/search-globs.ts +60 -0
  530. package/src/protocol/container-requirements.test.ts +72 -0
  531. package/src/protocol/container-requirements.ts +58 -0
  532. package/src/protocol/host-protocol.ts +29 -0
  533. package/src/protocol/ingress-contract.ts +103 -0
  534. package/src/{ingress-protocol.test.ts → protocol/ingress-protocol.test.ts} +25 -90
  535. package/src/protocol/ingress-protocol.ts +441 -0
  536. package/src/protocol/listener-protocol.ts +75 -0
  537. package/src/{peer-dial.test.ts → protocol/peer-dial.test.ts} +52 -1
  538. package/src/protocol/peer-dial.ts +207 -0
  539. package/src/{peer-mcp-server.ts → protocol/peer-mcp-server.ts} +16 -41
  540. package/src/protocol/request-id.ts +5 -0
  541. package/src/{routes.test.ts → protocol/routes.test.ts} +14 -22
  542. package/src/protocol/routes.ts +159 -0
  543. package/src/protocol/runner-protocol.ts +197 -0
  544. package/src/protocol/terminal-protocol.ts +13 -0
  545. package/src/protocol/webext-links.ts +50 -0
  546. package/src/protocol/webext-protocol.ts +24 -0
  547. package/src/schemas/activity.ts +22 -30
  548. package/src/schemas/agent.ts +130 -238
  549. package/src/schemas/agents.ts +165 -483
  550. package/src/schemas/approvals.ts +23 -71
  551. package/src/schemas/automations.ts +145 -249
  552. package/src/schemas/capabilities.ts +127 -414
  553. package/src/schemas/ci.ts +56 -108
  554. package/src/schemas/codebase-health.ts +7 -11
  555. package/src/schemas/devices.ts +98 -321
  556. package/src/schemas/engines.ts +16 -44
  557. package/src/schemas/environment.ts +41 -91
  558. package/src/schemas/exit.ts +24 -81
  559. package/src/schemas/extension-updates.ts +42 -87
  560. package/src/schemas/git-history.ts +30 -84
  561. package/src/schemas/git.ts +141 -256
  562. package/src/schemas/history.ts +14 -40
  563. package/src/schemas/hosts.ts +9 -15
  564. package/src/schemas/inventory.ts +8 -10
  565. package/src/schemas/issues.ts +66 -134
  566. package/src/schemas/logs.ts +15 -34
  567. package/src/schemas/loops.ts +46 -163
  568. package/src/schemas/maintenance.ts +47 -172
  569. package/src/schemas/panels.ts +20 -45
  570. package/src/schemas/personas.ts +85 -168
  571. package/src/schemas/plan-limits.ts +58 -197
  572. package/src/schemas/ports.ts +14 -32
  573. package/src/schemas/provider-oauth.ts +23 -76
  574. package/src/schemas/provider-subscriptions.ts +4 -13
  575. package/src/schemas/public.ts +4 -15
  576. package/src/schemas/push.ts +8 -36
  577. package/src/schemas/secrets.ts +20 -64
  578. package/src/schemas/settings.ts +177 -597
  579. package/src/schemas/share.ts +14 -32
  580. package/src/schemas/shared.ts +14 -13
  581. package/src/schemas/system.ts +46 -78
  582. package/src/schemas/terminal.ts +41 -120
  583. package/src/schemas/usage.ts +44 -233
  584. package/src/schemas/version-seam.test.ts +9 -26
  585. package/src/schemas/vpn.ts +27 -64
  586. package/src/schemas/webext.ts +22 -53
  587. package/src/schemas/workflows.ts +57 -183
  588. package/src/schemas/workspace-repos.ts +12 -24
  589. package/src/schemas/workspace-search.ts +17 -35
  590. package/src/schemas/workspace-setup.ts +4 -11
  591. package/src/schemas/workspace-tree.ts +32 -91
  592. package/src/state/arrival.ts +109 -0
  593. package/src/state/contract-lock.test.ts +17 -0
  594. package/src/state/contract-lock.ts +49 -0
  595. package/src/state/definition.ts +143 -0
  596. package/src/state/history-state.ts +103 -0
  597. package/src/{runtime-state.test.ts → state/runtime-state.test.ts} +3 -10
  598. package/src/state/runtime-state.ts +62 -0
  599. package/src/state/starter.ts +5 -0
  600. package/src/state/state-portability.ts +27 -0
  601. package/src/state/versions.ts +26 -0
  602. package/src/{workspace-state.test.ts → state/workspace-state.test.ts} +65 -173
  603. package/src/state/workspace-state.ts +669 -0
  604. package/src/{documents.test.ts → text/documents.test.ts} +1 -1
  605. package/src/text/documents.ts +42 -0
  606. package/src/text/embed.ts +132 -0
  607. package/src/text/mentions.ts +21 -0
  608. package/src/text/model-answer.ts +9 -0
  609. package/src/text/path-refs.ts +39 -0
  610. package/src/text/shell-regions.ts +224 -0
  611. package/src/{title.test.ts → text/title.test.ts} +13 -32
  612. package/src/text/title.ts +202 -0
  613. package/src/{transcript-fold.test.ts → text/transcript-fold.test.ts} +5 -83
  614. package/src/{transcript-fold.ts → text/transcript-fold.ts} +65 -170
  615. package/src/text/whisper.test.ts +19 -0
  616. package/src/text/whisper.ts +17 -0
  617. package/src/{workflow-faults.test.ts → text/workflow-faults.test.ts} +6 -24
  618. package/src/{workflow-faults.ts → text/workflow-faults.ts} +20 -60
  619. package/dist/agent-catalog.d.ts.map +0 -1
  620. package/dist/agent-catalog.js.map +0 -1
  621. package/dist/agent-runtimes.d.ts.map +0 -1
  622. package/dist/agent-runtimes.js.map +0 -1
  623. package/dist/approvals-execution.d.ts.map +0 -1
  624. package/dist/approvals-execution.js.map +0 -1
  625. package/dist/arrival.d.ts.map +0 -1
  626. package/dist/arrival.js.map +0 -1
  627. package/dist/batch-runs.d.ts.map +0 -1
  628. package/dist/batch-runs.js.map +0 -1
  629. package/dist/capability-env.d.ts.map +0 -1
  630. package/dist/capability-env.js.map +0 -1
  631. package/dist/capability-secrets.d.ts.map +0 -1
  632. package/dist/capability-secrets.js.map +0 -1
  633. package/dist/card-status.d.ts.map +0 -1
  634. package/dist/card-status.js.map +0 -1
  635. package/dist/command-classes.d.ts.map +0 -1
  636. package/dist/command-classes.js.map +0 -1
  637. package/dist/command-run.d.ts.map +0 -1
  638. package/dist/command-run.js.map +0 -1
  639. package/dist/contract-lock.d.ts.map +0 -1
  640. package/dist/contract-lock.js.map +0 -1
  641. package/dist/conversation-ids.d.ts +0 -4
  642. package/dist/conversation-ids.d.ts.map +0 -1
  643. package/dist/conversation-ids.js.map +0 -1
  644. package/dist/credential-material.d.ts.map +0 -1
  645. package/dist/credential-material.js.map +0 -1
  646. package/dist/definition.d.ts.map +0 -1
  647. package/dist/definition.js.map +0 -1
  648. package/dist/documents.d.ts.map +0 -1
  649. package/dist/documents.js.map +0 -1
  650. package/dist/embed.d.ts.map +0 -1
  651. package/dist/embed.js.map +0 -1
  652. package/dist/events.d.ts +0 -4336
  653. package/dist/events.d.ts.map +0 -1
  654. package/dist/events.js +0 -725
  655. package/dist/events.js.map +0 -1
  656. package/dist/fast-tier.d.ts.map +0 -1
  657. package/dist/fast-tier.js.map +0 -1
  658. package/dist/history-state.d.ts.map +0 -1
  659. package/dist/history-state.js.map +0 -1
  660. package/dist/host-protocol.d.ts.map +0 -1
  661. package/dist/host-protocol.js.map +0 -1
  662. package/dist/hostnames.d.ts.map +0 -1
  663. package/dist/hostnames.js.map +0 -1
  664. package/dist/ingress-contract.d.ts.map +0 -1
  665. package/dist/ingress-contract.js.map +0 -1
  666. package/dist/ingress-protocol.d.ts.map +0 -1
  667. package/dist/ingress-protocol.js.map +0 -1
  668. package/dist/listener-protocol.d.ts.map +0 -1
  669. package/dist/listener-protocol.js.map +0 -1
  670. package/dist/mentions.d.ts.map +0 -1
  671. package/dist/mentions.js.map +0 -1
  672. package/dist/model-order.d.ts.map +0 -1
  673. package/dist/model-order.js.map +0 -1
  674. package/dist/model-pins.d.ts.map +0 -1
  675. package/dist/model-pins.js +0 -45
  676. package/dist/model-pins.js.map +0 -1
  677. package/dist/model-roles.d.ts.map +0 -1
  678. package/dist/model-roles.js.map +0 -1
  679. package/dist/needs-action.d.ts.map +0 -1
  680. package/dist/needs-action.js.map +0 -1
  681. package/dist/output-fields.d.ts.map +0 -1
  682. package/dist/output-fields.js.map +0 -1
  683. package/dist/overlay-lint.d.ts.map +0 -1
  684. package/dist/overlay-lint.js.map +0 -1
  685. package/dist/owner-ticket.d.ts.map +0 -1
  686. package/dist/owner-ticket.js.map +0 -1
  687. package/dist/path-refs.d.ts.map +0 -1
  688. package/dist/path-refs.js.map +0 -1
  689. package/dist/peer-dial.d.ts.map +0 -1
  690. package/dist/peer-dial.js.map +0 -1
  691. package/dist/peer-mcp-server.d.ts.map +0 -1
  692. package/dist/peer-mcp-server.js.map +0 -1
  693. package/dist/plan-pools.d.ts.map +0 -1
  694. package/dist/plan-pools.js.map +0 -1
  695. package/dist/prompt-complexity.d.ts.map +0 -1
  696. package/dist/prompt-complexity.js.map +0 -1
  697. package/dist/provider-specs.d.ts.map +0 -1
  698. package/dist/provider-specs.js.map +0 -1
  699. package/dist/request-id.d.ts.map +0 -1
  700. package/dist/request-id.js.map +0 -1
  701. package/dist/routes.d.ts.map +0 -1
  702. package/dist/routes.js.map +0 -1
  703. package/dist/runner-protocol.d.ts.map +0 -1
  704. package/dist/runner-protocol.js.map +0 -1
  705. package/dist/runtime-state.d.ts.map +0 -1
  706. package/dist/runtime-state.js.map +0 -1
  707. package/dist/safety-policy.d.ts.map +0 -1
  708. package/dist/safety-policy.js.map +0 -1
  709. package/dist/schemas/context.d.ts +0 -30
  710. package/dist/schemas/context.d.ts.map +0 -1
  711. package/dist/schemas/context.js +0 -34
  712. package/dist/schemas/context.js.map +0 -1
  713. package/dist/search-globs.d.ts.map +0 -1
  714. package/dist/search-globs.js.map +0 -1
  715. package/dist/session-names.d.ts.map +0 -1
  716. package/dist/session-names.js.map +0 -1
  717. package/dist/share-paths.d.ts.map +0 -1
  718. package/dist/share-paths.js.map +0 -1
  719. package/dist/shell-regions.d.ts.map +0 -1
  720. package/dist/shell-regions.js.map +0 -1
  721. package/dist/sse.d.ts.map +0 -1
  722. package/dist/sse.js.map +0 -1
  723. package/dist/starter.d.ts.map +0 -1
  724. package/dist/starter.js.map +0 -1
  725. package/dist/state-portability.d.ts.map +0 -1
  726. package/dist/state-portability.js.map +0 -1
  727. package/dist/terminal-protocol.d.ts.map +0 -1
  728. package/dist/terminal-protocol.js.map +0 -1
  729. package/dist/title.d.ts.map +0 -1
  730. package/dist/title.js.map +0 -1
  731. package/dist/transcript-fold.d.ts.map +0 -1
  732. package/dist/transcript-fold.js.map +0 -1
  733. package/dist/tunnel-ids.d.ts.map +0 -1
  734. package/dist/tunnel-ids.js.map +0 -1
  735. package/dist/versions.d.ts.map +0 -1
  736. package/dist/versions.js.map +0 -1
  737. package/dist/webext-links.d.ts.map +0 -1
  738. package/dist/webext-links.js.map +0 -1
  739. package/dist/webext-protocol.d.ts.map +0 -1
  740. package/dist/webext-protocol.js.map +0 -1
  741. package/dist/workflow-faults.d.ts.map +0 -1
  742. package/dist/workflow-faults.js.map +0 -1
  743. package/dist/workspace-state.d.ts.map +0 -1
  744. package/dist/workspace-state.js.map +0 -1
  745. package/src/agent-catalog.ts +0 -316
  746. package/src/agent-runtimes.ts +0 -419
  747. package/src/approvals-execution.ts +0 -96
  748. package/src/arrival.ts +0 -160
  749. package/src/batch-runs.ts +0 -188
  750. package/src/capability-ledger.test.ts +0 -140
  751. package/src/capability-secrets.ts +0 -20
  752. package/src/command-classes.ts +0 -617
  753. package/src/command-run.ts +0 -78
  754. package/src/contract-lock.test.ts +0 -23
  755. package/src/contract-lock.ts +0 -66
  756. package/src/conversation-ids.ts +0 -207
  757. package/src/credential-material.ts +0 -181
  758. package/src/definition.ts +0 -207
  759. package/src/documents.ts +0 -67
  760. package/src/embed.ts +0 -164
  761. package/src/events.ts +0 -1870
  762. package/src/fast-tier.ts +0 -72
  763. package/src/history-state.ts +0 -174
  764. package/src/host-protocol.ts +0 -36
  765. package/src/hostnames.ts +0 -180
  766. package/src/ingress-contract.ts +0 -157
  767. package/src/ingress-protocol.ts +0 -625
  768. package/src/listener-protocol.ts +0 -96
  769. package/src/mentions.ts +0 -25
  770. package/src/model-order.ts +0 -262
  771. package/src/model-pins.test.ts +0 -202
  772. package/src/model-pins.ts +0 -183
  773. package/src/model-roles.ts +0 -224
  774. package/src/needs-action.ts +0 -14
  775. package/src/output-fields.ts +0 -111
  776. package/src/overlay-lint.ts +0 -116
  777. package/src/path-refs.ts +0 -59
  778. package/src/peer-dial.ts +0 -163
  779. package/src/plan-pools.ts +0 -92
  780. package/src/prompt-complexity.ts +0 -334
  781. package/src/provider-specs.ts +0 -432
  782. package/src/request-id.ts +0 -41
  783. package/src/routes.ts +0 -219
  784. package/src/runner-protocol.ts +0 -239
  785. package/src/runtime-state.ts +0 -140
  786. package/src/safety-policy.test.ts +0 -88
  787. package/src/safety-policy.ts +0 -258
  788. package/src/schemas/context.ts +0 -87
  789. package/src/search-globs.ts +0 -76
  790. package/src/session-names.ts +0 -44
  791. package/src/share-paths.ts +0 -68
  792. package/src/shell-regions.ts +0 -289
  793. package/src/starter.ts +0 -13
  794. package/src/state-portability.ts +0 -56
  795. package/src/terminal-protocol.ts +0 -16
  796. package/src/title.ts +0 -267
  797. package/src/tunnel-ids.ts +0 -57
  798. package/src/versions.ts +0 -48
  799. package/src/webext-links.ts +0 -90
  800. package/src/webext-protocol.ts +0 -27
  801. package/src/workspace-state.ts +0 -1096
  802. /package/dist/{hostnames.d.ts → ids/hostnames.d.ts} +0 -0
  803. /package/dist/{hostnames.js → ids/hostnames.js} +0 -0
  804. /package/dist/{session-names.d.ts → ids/session-names.d.ts} +0 -0
  805. /package/dist/{session-names.js → ids/session-names.js} +0 -0
  806. /package/dist/{share-paths.d.ts → ids/share-paths.d.ts} +0 -0
  807. /package/dist/{share-paths.js → ids/share-paths.js} +0 -0
  808. /package/dist/{agent-catalog.js → models/agent-catalog.js} +0 -0
  809. /package/dist/{agent-runtimes.d.ts → models/agent-runtimes.d.ts} +0 -0
  810. /package/dist/{agent-runtimes.js → models/agent-runtimes.js} +0 -0
  811. /package/dist/{fast-tier.js → models/fast-tier.js} +0 -0
  812. /package/dist/{model-order.d.ts → models/model-order.d.ts} +0 -0
  813. /package/dist/{model-order.js → models/model-order.js} +0 -0
  814. /package/dist/{plan-pools.js → models/plan-pools.js} +0 -0
  815. /package/dist/{prompt-complexity.d.ts → models/prompt-complexity.d.ts} +0 -0
  816. /package/dist/{prompt-complexity.js → models/prompt-complexity.js} +0 -0
  817. /package/dist/{provider-specs.d.ts → models/provider-specs.d.ts} +0 -0
  818. /package/dist/{provider-specs.js → models/provider-specs.js} +0 -0
  819. /package/dist/{approvals-execution.d.ts → policy/approvals-execution.d.ts} +0 -0
  820. /package/dist/{approvals-execution.js → policy/approvals-execution.js} +0 -0
  821. /package/dist/{capability-env.d.ts → policy/capability-env.d.ts} +0 -0
  822. /package/dist/{capability-env.js → policy/capability-env.js} +0 -0
  823. /package/dist/{capability-secrets.d.ts → policy/capability-secrets.d.ts} +0 -0
  824. /package/dist/{capability-secrets.js → policy/capability-secrets.js} +0 -0
  825. /package/dist/{command-run.js → policy/command-run.js} +0 -0
  826. /package/dist/{credential-material.d.ts → policy/credential-material.d.ts} +0 -0
  827. /package/dist/{credential-material.js → policy/credential-material.js} +0 -0
  828. /package/dist/{needs-action.d.ts → policy/needs-action.d.ts} +0 -0
  829. /package/dist/{needs-action.js → policy/needs-action.js} +0 -0
  830. /package/dist/{output-fields.d.ts → policy/output-fields.d.ts} +0 -0
  831. /package/dist/{output-fields.js → policy/output-fields.js} +0 -0
  832. /package/dist/{overlay-lint.d.ts → policy/overlay-lint.d.ts} +0 -0
  833. /package/dist/{overlay-lint.js → policy/overlay-lint.js} +0 -0
  834. /package/dist/{owner-ticket.d.ts → policy/owner-ticket.d.ts} +0 -0
  835. /package/dist/{search-globs.d.ts → policy/search-globs.d.ts} +0 -0
  836. /package/dist/{search-globs.js → policy/search-globs.js} +0 -0
  837. /package/dist/{ingress-contract.d.ts → protocol/ingress-contract.d.ts} +0 -0
  838. /package/dist/{ingress-protocol.d.ts → protocol/ingress-protocol.d.ts} +0 -0
  839. /package/dist/{ingress-protocol.js → protocol/ingress-protocol.js} +0 -0
  840. /package/dist/{listener-protocol.d.ts → protocol/listener-protocol.d.ts} +0 -0
  841. /package/dist/{peer-mcp-server.d.ts → protocol/peer-mcp-server.d.ts} +0 -0
  842. /package/dist/{peer-mcp-server.js → protocol/peer-mcp-server.js} +0 -0
  843. /package/dist/{request-id.d.ts → protocol/request-id.d.ts} +0 -0
  844. /package/dist/{request-id.js → protocol/request-id.js} +0 -0
  845. /package/dist/{routes.d.ts → protocol/routes.d.ts} +0 -0
  846. /package/dist/{routes.js → protocol/routes.js} +0 -0
  847. /package/dist/{sse.d.ts → protocol/sse.d.ts} +0 -0
  848. /package/dist/{sse.js → protocol/sse.js} +0 -0
  849. /package/dist/{terminal-protocol.js → protocol/terminal-protocol.js} +0 -0
  850. /package/dist/{webext-links.d.ts → protocol/webext-links.d.ts} +0 -0
  851. /package/dist/{webext-links.js → protocol/webext-links.js} +0 -0
  852. /package/dist/{arrival.d.ts → state/arrival.d.ts} +0 -0
  853. /package/dist/{contract-lock.d.ts → state/contract-lock.d.ts} +0 -0
  854. /package/dist/{history-state.d.ts → state/history-state.d.ts} +0 -0
  855. /package/dist/{runtime-state.d.ts → state/runtime-state.d.ts} +0 -0
  856. /package/dist/{runtime-state.js → state/runtime-state.js} +0 -0
  857. /package/dist/{starter.d.ts → state/starter.d.ts} +0 -0
  858. /package/dist/{starter.js → state/starter.js} +0 -0
  859. /package/dist/{state-portability.d.ts → state/state-portability.d.ts} +0 -0
  860. /package/dist/{state-portability.js → state/state-portability.js} +0 -0
  861. /package/dist/{versions.d.ts → state/versions.d.ts} +0 -0
  862. /package/dist/{versions.js → state/versions.js} +0 -0
  863. /package/dist/{embed.d.ts → text/embed.d.ts} +0 -0
  864. /package/dist/{embed.js → text/embed.js} +0 -0
  865. /package/dist/{mentions.d.ts → text/mentions.d.ts} +0 -0
  866. /package/dist/{mentions.js → text/mentions.js} +0 -0
  867. /package/dist/{path-refs.d.ts → text/path-refs.d.ts} +0 -0
  868. /package/dist/{path-refs.js → text/path-refs.js} +0 -0
  869. /package/dist/{shell-regions.js → text/shell-regions.js} +0 -0
  870. /package/dist/{title.d.ts → text/title.d.ts} +0 -0
  871. /package/dist/{title.js → text/title.js} +0 -0
  872. /package/src/{hostnames.test.ts → ids/hostnames.test.ts} +0 -0
  873. /package/src/{share-paths.test.ts → ids/share-paths.test.ts} +0 -0
  874. /package/src/{capability-env.ts → policy/capability-env.ts} +0 -0
  875. /package/src/{overlay-lint.test.ts → policy/overlay-lint.test.ts} +0 -0
  876. /package/src/{search-globs.test.ts → policy/search-globs.test.ts} +0 -0
  877. /package/src/{ingress-contract.test.ts → protocol/ingress-contract.test.ts} +0 -0
  878. /package/src/{peer-mcp-server.test.ts → protocol/peer-mcp-server.test.ts} +0 -0
  879. /package/src/{sse.ts → protocol/sse.ts} +0 -0
  880. /package/src/{versions.test.ts → state/versions.test.ts} +0 -0
  881. /package/src/{embed.test.ts → text/embed.test.ts} +0 -0
  882. /package/src/{mentions.test.ts → text/mentions.test.ts} +0 -0
  883. /package/src/{path-refs.test.ts → text/path-refs.test.ts} +0 -0
@@ -1,96 +0,0 @@
1
- import { z } from "zod";
2
- import { ActivityStatusSchema } from "./schemas/activity.js";
3
-
4
- /* The wire between the daemon and an extension's realtime-listener GATEWAY process (ext-discord, ext-slack,
5
- * ext-telegram, ext-whatsapp, ext-imap): the four provider-scoped routes app.ts mounts under
6
- * /listeners/:provider, state, dispatch, failure, status. These shapes used to live daemon-side only, with
7
- * every gateway hand-writing its own copy of the payloads as untyped literals; a field rename broke five
8
- * producers silently. They live in the contract now so BOTH ends compile against one declaration, the daemon
9
- * parses with the schemas, the gateways (via @intentic/connector-runtime) type against the inferred types. */
10
-
11
- // One normalized inbound event, serialized as a JSON line in the automation's payload, and the JSON body a
12
- // realtime source POSTs to /listeners/<provider>/dispatch. A zod schema (not a bare interface) because it's
13
- // parsed from an extension gateway's request; `provider` and `type` are open strings, the source is
14
- // extension-declared (contributes.listener), not a core enum.
15
- export const ListenerMessageSchema = z.object({
16
- provider: z.string().min(1),
17
- type: z.string().min(1),
18
- id: z.string(),
19
- channelId: z.string(),
20
- author: z.object({ id: z.string(), name: z.string() }),
21
- content: z.string(),
22
- // Discord message: it @mentions one of our bots or replies to a bot's message. Voice events never set it.
23
- mentioned: z.boolean().optional(),
24
- // CI pipeline event: the ref it ran on. Top-level rather than inside `extra` for the same reason
25
- // `mentioned` is, the dispatcher MATCHES on it, and a narrowing axis the trigger can name has to be
26
- // a field of the message rather than a key in a provider's opaque bag.
27
- branch: z.string().optional(),
28
- // Prior channel messages (chronological) fetched when a bot is tagged, so the agent can reason about why.
29
- // Kept a top-level field (not in `extra`) so it reaches the model's payload but stays out of the activity
30
- // feed, which logs only content/extra.
31
- history: z
32
- .array(
33
- z.object({
34
- author: z.object({ id: z.string(), name: z.string() }),
35
- content: z.string(),
36
- timestamp: z.string(),
37
- self: z.boolean().optional(),
38
- }),
39
- )
40
- .optional(),
41
- timestamp: z.string(),
42
- // Provider-specific fields (discord message: guildId, attachments; voice_utterance: path;
43
- // voice_transcript: path, participants, durationSeconds).
44
- extra: z.record(z.string(), z.unknown()).optional(),
45
- });
46
- export type ListenerMessage = z.infer<typeof ListenerMessageSchema>;
47
-
48
- // One ndjson frame of a /listeners/<provider>/dispatch?stream=1 response, a text delta for one automation's
49
- // reply, the provider's own failure sentence, or that automation's terminal marker. A type, not a schema: the
50
- // DAEMON produces these (listener.routes.ts), so nothing parses them from untrusted input.
51
- export interface ListenerDispatchFrame {
52
- readonly automationId: string;
53
- readonly delta?: string;
54
- // The turn refused or broke, in the provider's own words, forwarded verbatim because a gateway delivers
55
- // into the owner's own channel, where the actual sentence is the useful thing.
56
- readonly failed?: string;
57
- readonly end?: boolean;
58
- }
59
-
60
- /* WHERE ONE CAPABILITY'S LINK-A-DEVICE CEREMONY STANDS (whatsapp), reported every status tick.
61
- *
62
- * A CODE IS NOT THE ONLY THING WORTH SAYING, and publishing only codes is what made a phone that had never
63
- * linked read as connected: the seconds before the first code, a gateway that just restarted, and a number
64
- * WhatsApp refused all looked identical from the daemon's side, an absent code, so the card fell through to
65
- * "ready" and the owner was sent away from the one screen that could have shown them the step. Each of those is
66
- * its own state here, and every one of them means NOT PAIRED YET.
67
- *
68
- * `since` stamps the CURRENT code. WhatsApp closes an unpaired socket after a minute or so and each reopen mints
69
- * a fresh code, so a code is a thing with an age, the card says how old the one on screen is rather than
70
- * leaving the owner to type a dead one twice. */
71
- export const ListenerPairingSchema = z.object({
72
- // waiting: a socket is up and the code hasn't arrived (or the last one died with its socket).
73
- // code: `code` is live, type it on the phone. failed: `detail` says what WhatsApp refused.
74
- state: z.enum(["waiting", "code", "failed"]),
75
- code: z.string().optional(),
76
- detail: z.string().optional(),
77
- since: z.number().optional(),
78
- });
79
- export type ListenerPairing = z.infer<typeof ListenerPairingSchema>;
80
-
81
- // Push-based listener status: a gateway process POSTs its live connection/voice snapshot to
82
- // /listeners/<provider>/status, and the activity route reads it from there, the daemon holds no provider
83
- // connection of its own to probe. The body IS the ActivityStatus the /activity/status probe used to build from
84
- // in-process discord singletons, plus the per-gateway extras that ride the same channel: whether whisper is
85
- // present (discord's voice-pending signal) and each unpaired capability's ceremony by id (whatsapp's
86
- // link-a-device flow, the capability card renders it as the step the owner is standing in front of).
87
- export const ListenerStatusSchema = ActivityStatusSchema.extend({
88
- whisperReady: z.boolean().optional(),
89
- pairing: z.record(z.string(), ListenerPairingSchema).optional(),
90
- });
91
- export type ListenerStatus = z.infer<typeof ListenerStatusSchema>;
92
-
93
- // A connection's place in the reconcile lifecycle, as the status snapshot reports it: `idle` = up but holding
94
- // nothing on purpose (no enabled listener automation to connect for), `pairing` = the socket is up but the
95
- // credential is a ceremony nobody has completed yet (whatsapp), the rest are the connect loop.
96
- export type ListenerGatewayPhase = "idle" | "ready" | "pairing" | "connecting" | "disconnected";
package/src/mentions.ts DELETED
@@ -1,25 +0,0 @@
1
- /* @-FILE MENTIONS, the two readers of the same text: the composer, which sends every path a message names as
2
- * an attachment (the daemon resolves workspace-relative paths and folds them into the prompt as a Read-tool
3
- * note, no upload involved), and the fold, which draws a message's UPLOADED files as chips and its inline
4
- * mentions as nothing at all, because they are already visible in the words. One tokenizer, so what the
5
- * composer counts as a mention is what the transcript declines to redraw. */
6
-
7
- // Every path-looking @ token in text, including tokens that are not valid composer mentions. Broad on purpose:
8
- // old turns persisted these candidates in the shared attachment field, and the fold needs the broad set to
9
- // recognise and hide those inline paths rather than redraw them as file chips.
10
- export const mentionedPathTokens = (text: string): string[] => {
11
- const paths = new Set<string>();
12
- for (const match of text.matchAll(/(?:^|\s)@([^\s@]+)/g)) {
13
- const token = (match[1] as string).replace(/[.,;:!?)]+$/, ``);
14
- if (token.includes(`/`) || token.includes(`.`)) {
15
- paths.add(token);
16
- }
17
- }
18
- return [...paths];
19
- };
20
-
21
- // Workspace paths referenced as @-mentions in a prompt, deduped. A scoped package script prefix from copied
22
- // pnpm output has the same opening shape (`@scope/package:test:`) but is not a file; accepting it hands the
23
- // daemon a phantom attachment which only becomes visible when a transcript redraws the wire fields.
24
- const PACKAGE_SCRIPT = /^[^/]+\/[^/]+:[^/]+$/u;
25
- export const mentionPaths = (text: string): string[] => mentionedPathTokens(text).filter((token) => !PACKAGE_SCRIPT.test(token));
@@ -1,262 +0,0 @@
1
- /* HOW A MODEL CATALOG IS ORDERED, one rule for every provider, because only one provider publishes an order
2
- * worth keeping.
3
- *
4
- * Anthropic's REST /v1/models answers newest-first: that IS a provider opinion, and Claude's catalog rides it
5
- * (claude-models.ts). Every other provider here is read through an OpenAI-compatible /v1/models. Codex and
6
- * Gemini and Kimi via the bundled translator, or out of xAI's "Did you mean" rejection, and those
7
- * endpoints publish a SET, not a ranking: they hand the ids back in whatever order their registry iterates,
8
- * which in practice is alphabetical. Reading that as a preference is what put "GPT 5.4 Mini" at the head of the
9
- * Codex group with GPT 5.6 below it, and what made a fresh Codex conversation start on whichever id happened to
10
- * sort first, models[0] is the provider default.
11
- *
12
- * So for those providers the order is DERIVED from the id, out of the only two facts an id reliably carries:
13
- * which TIER the model is (the adjective) and which RELEASE it is (the numbers). Both are provider-agnostic,
14
- * every vendor names its models the same way, which is what lets the daemon's four catalog services and the
15
- * web's picker share one rule instead of each inventing a local one. */
16
-
17
- // A version-ish segment: digits and dots, optionally prefixed by the vendor's version marker (`4`, `5.1`, `v2`,
18
- // `k3`, `k2.7`, `20251001`). Kimi is the one provider that fuses the marker with the generation; treating `k3`
19
- // as a name made the current flagship look unversioned, so K2.x sorted above it. Everything else is a NAME
20
- // segment and belongs to the family, which is what makes the split below exhaustive.
21
- const VERSION_SEGMENT = /^(?:v|k)?[\d.]+$/i;
22
-
23
- // A date stamp rather than a version component: six digits or more (20251001, 250514). The distinction is not
24
- // cosmetic, claude-opus-4-1-20250805 (Opus 4.1) and claude-opus-4-20250514 (Opus 4.0) compare as (4,1) vs (4)
25
- // with the stamps held apart, and as (4,1,20250805) vs (4,20250514), the OLDER model winning, without.
26
- const DATE_SEGMENT = /^\d{6,}$/;
27
-
28
- const segmentsOf = (id: string): string[] => id.split(/[-_]/);
29
-
30
- // A model's FAMILY, its id with every version-ish segment dropped, so claude-opus-5 and claude-opus-4-8 land
31
- // together (as do gpt-5.1/gpt-5, and claude-haiku-4-5-20251001 with its date suffix). Derived, never listed: a
32
- // family that ships tomorrow groups itself. The id is the stable key here, labels get renamed, ids don't.
33
- export const familyOf = (id: string): string => {
34
- const stem = segmentsOf(id)
35
- .filter((segment) => !VERSION_SEGMENT.test(segment))
36
- .join("-");
37
- // An all-numeric id (and an ACP row's empty one) has no stem to speak of; it stands as its own family.
38
- return stem === "" ? id : stem;
39
- };
40
-
41
- export interface ModelRelease {
42
- // The version components in id order: gpt-5.1 → [5, 1], claude-opus-4-8 → [4, 8]. EMPTY for an unversioned
43
- // id (kimi-latest, gemini-pro-agent), which therefore reads as the oldest of its tier: a rolling alias names
44
- // no release, and inventing one for it would outrank the models that do name theirs.
45
- readonly version: readonly number[];
46
- // The id's date stamp, 0 for none, the tiebreak between two builds of the SAME version.
47
- readonly date: number;
48
- }
49
-
50
- export const releaseOf = (id: string): ModelRelease => {
51
- const numeric = segmentsOf(id)
52
- .filter((segment) => VERSION_SEGMENT.test(segment))
53
- .map((segment) => segment.replace(/^[vk]/i, ""));
54
- const stamps = numeric.filter((segment) => DATE_SEGMENT.test(segment)).map(Number);
55
- return {
56
- version: numeric
57
- .filter((segment) => !DATE_SEGMENT.test(segment))
58
- .flatMap((segment) => segment.split(".").map(Number))
59
- .filter((component) => Number.isFinite(component)),
60
- date: Math.max(0, ...stamps),
61
- };
62
- };
63
-
64
- // Newest first. A missing component reads as -1, so gpt-5 sorts under gpt-5.1 and an unversioned id sorts under
65
- // every versioned one; the date stamp breaks what is left.
66
- const compareRelease = (left: ModelRelease, right: ModelRelease): number => {
67
- for (let index = 0; index < Math.max(left.version.length, right.version.length); index += 1) {
68
- const diff = (right.version[index] ?? -1) - (left.version[index] ?? -1);
69
- if (diff !== 0) {
70
- return diff;
71
- }
72
- }
73
- return right.date - left.date;
74
- };
75
-
76
- /* THE ONE CURATED FACT in this file, and the only one the providers publish nowhere the app can read: which tier
77
- * is the frontier and which is the cheap one. It ranks FAMILIES, never models, and it is a vocabulary of tier
78
- * ADJECTIVES rather than a table of ids, that scoping is the whole point, because a per-model ranking table
79
- * failed here once already. The words are the ones every vendor reaches for, so a release that ships tomorrow
80
- * ranks itself as long as it is named like its predecessors, and a release named some other way ranks as unknown.
81
- *
82
- * An UNKNOWN family LEADS rather than sinks, and that direction is the point: the ranking this replaced sank
83
- * unrecognized ids to a floor below the everyday tier, so a brand-new flagship sorted beneath the model it
84
- * replaced. An id carrying no tier word at all is the provider's BASE line (gpt-5.6, grok-4, kimi-k2), which is
85
- * exactly the line a user reaches for, and a family nobody here has heard of is far likelier to be the next
86
- * flagship than the next budget tier. Being wrong costs one row's position; being wrong the other way hides a
87
- * launch. */
88
- const TIER_RANK: Readonly<Record<string, number>> = {
89
- // Frontier: the tier a vendor ships last and charges most for.
90
- opus: 0,
91
- fable: 0,
92
- pro: 0,
93
- max: 0,
94
- ultra: 0,
95
- heavy: 0,
96
- // Everyday: the workhorse a step below the frontier.
97
- sonnet: 1,
98
- flash: 1,
99
- mini: 1,
100
- // Efficient: the cheap/fast end, the rung whose whole purpose is to cost less than the one above it.
101
- haiku: 2,
102
- // An open-weights model a vendor re-serves beside its own (gpt-oss-120b on Google's channel) is that rung by
103
- // construction: it is there to be the free/cheap option next to the frontier line, never the flagship. Without
104
- // it the id carries no tier word at all and would LEAD the section it sits in.
105
- oss: 2,
106
- lite: 2,
107
- nano: 2,
108
- fast: 2,
109
- small: 2,
110
- };
111
-
112
- const UNRANKED = -1;
113
-
114
- /* Some providers name a capability ladder INSIDE one release instead of using the cross-release adjectives
115
- * above. Codex 5.6's Sol/Terra/Luna rows are that shape: they must remain together ahead of the older 5.5 line,
116
- * but their order is not an arbitrary id tiebreak. Sol is the strongest, followed by Terra, then Luna. Keeping
117
- * this as a separate rank lets release recency still win across generations (a future GPT 5.7 base model must
118
- * not be buried under a recognized 5.6 suffix), while the three siblings sort by their real tier. */
119
- const RELEASE_TIER_RANK: Readonly<Record<string, number>> = {
120
- sol: 0,
121
- terra: 1,
122
- luna: 2,
123
- };
124
-
125
- const lastRankOf = (family: string, ranks: Readonly<Record<string, number>>): number => {
126
- let rank = UNRANKED;
127
- for (const segment of family.split("-")) {
128
- const found = ranks[segment];
129
- if (found !== undefined) {
130
- rank = found;
131
- }
132
- }
133
- return rank;
134
- };
135
-
136
- const releaseTierRankOf = (family: string): number => lastRankOf(family, RELEASE_TIER_RANK);
137
-
138
- /* HOW HARD AN ID SAYS IT WILL THINK. A routed catalog does not publish one row per model, it publishes one row
139
- * per model PER THINKING LEVEL, spelling the level into the id: `gemini-3.6-flash-high` and
140
- * `gemini-3.5-flash-extra-low` are the same Flash at opposite ends of its reasoning budget.
141
- *
142
- * Which the ranking above cannot see at all, and that blind spot has a direction: `high` and `low` are both
143
- * unrecognized words, so two variants of one model tie on tier and the RELEASE tiebreak settles them, and the
144
- * newest variant a channel publishes is routinely the high one. The quick model, whose entire job is to be the
145
- * cheap rung, would therefore reach for the most expensive reading of the cheapest model it can find.
146
- *
147
- * That is not a small mis-sort. Thinking is the difference between a commit message that is in the box before
148
- * the user has finished reading the file list and one that arrives half a minute later, measured at ~2s versus
149
- * ~27s on the same model and the same diff (claude/claude-one-shot.ts, which disables thinking for the rungs where a
150
- * request parameter can). For a routed rung there is no such parameter: the id IS the setting, so this ranking
151
- * is the only place the choice can be made.
152
- *
153
- * Read ONLY by the cheap-end order. A picker orders a catalog by what a person reaches for, and a person
154
- * pinning `-high` on purpose means it, see compareCheapestFirst for the seam this belongs to. */
155
- const THINKING_RANK: Readonly<Record<string, number>> = {
156
- minimal: 0,
157
- none: 0,
158
- low: 1,
159
- medium: 3,
160
- high: 4,
161
- max: 4,
162
- // Not a level but a switch, and the loudest statement an id can make about this: a channel that vends
163
- // `kimi-k2` beside `kimi-k2-thinking` is naming the same model with its reasoning turned on.
164
- thinking: 4,
165
- };
166
-
167
- /* An id naming NO level sits between the two ends rather than at either, the provider's own default, which for
168
- * a model that can think is usually some thinking. Ranking it cheapest would seat a silent default ahead of an
169
- * id that explicitly says `minimal`, and ranking it dearest would bury every model whose channel publishes no
170
- * variants at all (Anthropic's, Kimi's) beneath one that does. Neither is what the id claims. */
171
- const UNSTATED_THINKING = 2;
172
-
173
- const thinkingRankOf = (family: string): number => {
174
- const rank = lastRankOf(family, THINKING_RANK);
175
- return rank === UNRANKED ? UNSTATED_THINKING : rank;
176
- };
177
-
178
- // The LAST recognized word wins, because tier words compose and the rightmost is the most specific one:
179
- // gemini-flash-lite is the cheap end of Flash, gpt-codex-max the frontier end of Codex.
180
- export const tierRankOf = (family: string): number => lastRankOf(family, TIER_RANK);
181
-
182
- // The canonical order of two model ids: broad tier first, then release, then a tier declared within that release.
183
- // Hand it straight to Array#toSorted, that sort is stable, so two ids this rule cannot separate keep the order
184
- // they arrived in (for Claude, the provider's own).
185
- export const compareModelIds = (left: string, right: string): number => {
186
- const leftFamily = familyOf(left);
187
- const rightFamily = familyOf(right);
188
- return (
189
- tierRankOf(leftFamily) - tierRankOf(rightFamily) ||
190
- compareRelease(releaseOf(left), releaseOf(right)) ||
191
- releaseTierRankOf(leftFamily) - releaseTierRankOf(rightFamily)
192
- );
193
- };
194
-
195
- /* The order for a catalog its endpoint published as a SET. Codex, Gemini, Kimi and Grok, i.e. everything but
196
- * Anthropic's ranked list. Falling back on arrival order is what the rule above does with a tie, and for a RANKED
197
- * catalog that is exactly right: the tie is the provider's own opinion, so claude-opus-5 stays ahead of
198
- * claude-fable-5. For a set there is no opinion to keep, and the header of this file assumed the leftover order
199
- * was at least alphabetical, it is not. A subscription can hand tied rows back in whatever order its registry
200
- * iterated THIS request, so the tie decides which model a fresh conversation opens on and can flip between
201
- * catalog refreshes.
202
- *
203
- * So a set breaks its own ties on the id. Which sibling that seats first is arbitrary, but it is the same
204
- * arbitrary answer every refresh, which is the property `default` actually needs. */
205
- export const compareUnrankedModelIds = (left: string, right: string): number => compareModelIds(left, right) || left.localeCompare(right);
206
-
207
- /* THE SAME TIER SCALE READ FROM THE OTHER END, for the one caller that wants the WEAKEST model rather than the
208
- * strongest: the quick model behind an automatic helper (the commit message written at land time). A picker
209
- * orders a catalog by what a user reaches for; this orders it by what a helper should spend, and the two are
210
- * exact opposites, so they share TIER_RANK rather than each naming its own list of cheap ids.
211
- *
212
- * The direction of UNRANKED is the reason this can't just be compareModelIds reversed. There, an unrecognized
213
- * family LEADS, because an id carrying no tier word is the provider's base line and a family nobody here has
214
- * heard of is likelier the next flagship than the next budget tier. Reversing would therefore seat exactly that
215
- * unknown-probably-flagship id as the cheap pick. So unknown sinks to LAST here too, both orders agree it is
216
- * not the efficient rung, and the cheap end is only ever a family whose tier word is actually recognized.
217
- * Falling off the end of a catalog with no efficient tier at all (Kimi publishes none) is then honest: the
218
- * newest of what it does publish, chosen by the release tiebreak below. */
219
- export const compareCheapestFirst = (left: string, right: string): number => {
220
- const leftFamily = familyOf(left);
221
- const rightFamily = familyOf(right);
222
- return (
223
- tierRankOf(rightFamily) - tierRankOf(leftFamily) ||
224
- // BEFORE release, and that placement is the point: two rows of one model differing only in thinking
225
- // level are the same model, so recency has nothing to say between them, and letting it speak is what
226
- // seated the high variant. Tier still wins over both, a thinking Haiku is cheaper than a silent Opus.
227
- thinkingRankOf(leftFamily) - thinkingRankOf(rightFamily) ||
228
- compareRelease(releaseOf(left), releaseOf(right)) ||
229
- releaseTierRankOf(rightFamily) - releaseTierRankOf(leftFamily)
230
- );
231
- };
232
-
233
- /* IS `candidate` A STRICTLY CHEAPER RUNG THAN `pick`, on the tier ladder alone. The predicate automatic tier
234
- * selection runs on (prompt-complexity.ts judges the turn, fast-tier.ts spends this to find something cheaper
235
- * to run it on), and it lives here because it is a question about the tier vocabulary, which is this file's
236
- * one curated fact.
237
- *
238
- * TIER ONLY, deliberately: not release, not thinking level. A downgrade has to be legible as a downgrade, and
239
- * "the same model one release older" or "the same model with less thinking" are not the saving this mechanism
240
- * promises, they are a different turn wearing the user's model name. Haiku under Sonnet is; Sonnet 4 under
241
- * Sonnet 5 is not.
242
- *
243
- * AN UNRANKED FAMILY IS FALSE ON EITHER SIDE, and both directions matter. A candidate carrying no tier word is
244
- * a provider's base line or a family nobody here has heard of, so calling it the budget option is a guess, and
245
- * the scale already says the likelier reading is "next flagship". The PICK being unranked is the subtler half:
246
- * the safety argument for automatic tier selection is that it can only ever route DOWN, and against an id whose
247
- * tier is unknown nothing can be shown to be down. So an unrecognised pick is left alone rather than swapped
248
- * for something merely known to be cheap, which is how a saving turns into a bill. */
249
- export const isCheaperRung = (candidate: string, pick: string): boolean => {
250
- const candidateRank = tierRankOf(familyOf(candidate));
251
- const pickRank = tierRankOf(familyOf(pick));
252
- return candidateRank !== UNRANKED && pickRank !== UNRANKED && candidateRank > pickRank;
253
- };
254
-
255
- /* WOULD RUNNING THIS ID MAKE THE MODEL THINK, as far as its name admits, which for a routed catalog is as far
256
- * as anyone can tell without running it. True only for an id that spells out a level ABOVE the quiet end, so an
257
- * ordinary id nobody has annotated (claude-haiku-4-5, kimi-k2) is never accused of it.
258
- *
259
- * Exported for one job: a settings row that lets someone pin the quick model has to be able to say that the row
260
- * they picked is the thinking one. The ordering above keeps Auto off these by construction; a PIN is a
261
- * deliberate choice and is honoured as written, which only works if the choice is legible when it is made. */
262
- export const namesThinking = (id: string): boolean => thinkingRankOf(familyOf(id)) > UNSTATED_THINKING;
@@ -1,202 +0,0 @@
1
- import { expect, test } from "vitest";
2
- import { type ModelSource, modelPinKey, parsePinned, resolveRoleModels } from "./model-pins.js";
3
- import type { ModelPin } from "./schemas/agent.js";
4
-
5
- /* Which models a job spends, and in which order. The rule answers two surfaces at once: the daemon walks it,
6
- * the browser names its head in that job's settings row, so what these tests pin is that a sandbox's
7
- * connections alone decide it, with no stored id to go stale, and that there is always a rung underneath the
8
- * first one whenever the sandbox has another account to reach for.
9
- *
10
- * `commit-message` and `pipeline-fix` stand in for the two KINDS of role here (model-roles.ts): the first is a
11
- * one-shot, whose empty list derives the Auto ladder, and the second is a whole session, whose empty list
12
- * resolves to nothing so the caller's own composer pick answers. Everything else about the two is identical,
13
- * which is why one resolver serves both. */
14
-
15
- const HELPER = `commit-message` as const;
16
- const RUN = `pipeline-fix` as const;
17
-
18
- // A pin as the settings rows store one. The tests are about ORDER, so most of them name only the pair; the
19
- // knobs an entry can carry ride through untouched and are asserted where that matters.
20
- const pin = (key: string): ModelPin => {
21
- const at = key.indexOf(`:`);
22
- return { provider: key.slice(0, at), model: key.slice(at + 1) };
23
- };
24
-
25
- // Catalogs as their providers actually publish them: Claude's ranked list, the rest in registry order.
26
- const CLAUDE: ModelSource = { provider: `claude`, ready: true, models: [`claude-opus-5`, `claude-sonnet-5`, `claude-haiku-4-5-20251001`] };
27
- const GOOGLE: ModelSource = { provider: `gemini`, ready: true, models: [`gemini-3-flash`, `gemini-3-flash-lite`, `gemini-3-pro`] };
28
- const CODEX: ModelSource = { provider: `codex`, ready: true, models: [`gpt-5.4-mini`, `gpt-5.6`] };
29
- const KIMI: ModelSource = { provider: `kimi`, ready: true, models: [`kimi-k2.6`, `kimi-k2.7-code`, `kimi-k3`] };
30
-
31
- const offline = (source: ModelSource): ModelSource => ({ ...source, ready: false });
32
-
33
- // The model that answers when nothing goes wrong: the head of the chain, which is what most of what follows is
34
- // about and what every surface naming the spend up front reads.
35
- const head = (sources: readonly ModelSource[], pinned: readonly string[]): ModelPin | undefined =>
36
- resolveRoleModels(sources, pinned.map(pin), HELPER)[0];
37
-
38
- test("reaches for the efficient rung of the one connected provider, never its flagship", () => {
39
- expect(head([CLAUDE], [])).toEqual({ provider: `claude`, model: `claude-haiku-4-5-20251001` });
40
- });
41
-
42
- test("spends the FREE channel over the subscription when both offer the same rung", () => {
43
- // Both publish a cheap-tier row, so nothing separates them on capability, and one of them costs the user
44
- // nothing while the other eats headroom they watch. A background helper should not quietly bill the Claude plan.
45
- expect(head([CLAUDE, GOOGLE], [])).toEqual({ provider: `gemini`, model: `gemini-3-flash-lite` });
46
- });
47
-
48
- test("puts tier ahead of cost: a free frontier model is still the wrong tool for a commit message", () => {
49
- // Google connected but publishing only its Pro line. Ordering on price first would seat a flagship here,
50
- // which is the exact outcome the feature exists to avoid.
51
- const proOnly: ModelSource = { provider: `gemini`, ready: true, models: [`gemini-3-pro`] };
52
-
53
- expect(head([CLAUDE, proOnly], [])).toEqual({ provider: `claude`, model: `claude-haiku-4-5-20251001` });
54
- });
55
-
56
- test("uses stable provider order when two subscriptions offer the same tier", () => {
57
- const kimiCheap: ModelSource = { provider: `kimi`, ready: true, models: [`kimi-k2-mini`] };
58
- const claudeCheap: ModelSource = { provider: `claude`, ready: true, models: [`claude-haiku-4-5`] };
59
-
60
- expect(head([kimiCheap, claudeCheap], [])?.provider).toBe(`claude`);
61
- });
62
-
63
- test("answers the same thing however the connected providers happen to be listed", () => {
64
- // The daemon assembles these from live stores and the browser from its own refs; neither order is a fact.
65
- const answers = [head([CLAUDE, GOOGLE, CODEX], []), head([CODEX, CLAUDE, GOOGLE], []), head([GOOGLE, CODEX, CLAUDE], [])];
66
-
67
- expect(new Set(answers.map((answer) => modelPinKey(answer!))).size).toBe(1);
68
- });
69
-
70
- test("honours a pinned model verbatim, including an id no catalog lists yet", () => {
71
- expect(head([CLAUDE, GOOGLE], [`claude:claude-opus-5`])).toEqual({ provider: `claude`, model: `claude-opus-5` });
72
- // The picker's custom-id escape hatch reaches here too: a catalog can lag a release, and running something
73
- // other than what the settings row names would be the worse failure.
74
- expect(head([CLAUDE], [`claude:claude-haiku-9`])).toEqual({ provider: `claude`, model: `claude-haiku-9` });
75
- });
76
-
77
- test("falls back to Auto when the pinned provider is no longer connected", () => {
78
- // Rather than failing every click with a credential error while the sandbox can plainly still answer.
79
- expect(head([offline(CLAUDE), GOOGLE], [`claude:claude-haiku-4-5-20251001`])).toEqual({
80
- provider: `gemini`,
81
- model: `gemini-3-flash-lite`,
82
- });
83
- });
84
-
85
- /* A MALFORMED KEY IS REFUSED WHERE KEYS STILL EXIST. A role's list holds PINS, whose two halves are separate
86
- * fields the schema requires (ModelPinSchema), so "claude with an empty model" is no longer a shape the
87
- * resolver can be handed — it is rejected at the settings boundary instead. What still travels as a key is
88
- * `autoFastModels`, so the rule lives with the parser that reads one, and this is where it is pinned. */
89
- test("refuses a malformed key rather than reading half a pin out of it", () => {
90
- for (const key of [`claude`, `claude:`, `:claude-haiku-4-5`, ` `]) {
91
- expect(parsePinned(key)).toBeUndefined();
92
- }
93
- expect(parsePinned(`claude:claude-haiku-4-5`)).toEqual({ provider: `claude`, model: `claude-haiku-4-5` });
94
- });
95
-
96
- /* THE TWO KINDS OF ROLE DIFFER ON EXACTLY ONE THING: what an empty list means. It is the whole reason the
97
- * resolver takes a role rather than a boolean, and the reason the two used to be separate files. */
98
- test("derives a ladder for an unpinned one-shot and nothing at all for an unpinned session", () => {
99
- // A commit message exists to stay off the frontier tier, so working it out from what is connected is a good
100
- // answer and gets better as accounts are added.
101
- expect(resolveRoleModels([CLAUDE, GOOGLE], [], HELPER)).toEqual([
102
- { provider: `gemini`, model: `gemini-3-flash-lite` },
103
- { provider: `claude`, model: `claude-haiku-4-5-20251001` },
104
- ]);
105
- // A pipeline fix is a whole session billed whole, and nothing here can judge what one is worth — so the
106
- // caller's own floor (the owner's composer pick) answers instead of a ladder this file invented.
107
- expect(resolveRoleModels([CLAUDE, GOOGLE], [], RUN)).toEqual([]);
108
- });
109
-
110
- test("carries an entry's run settings through untouched, on either kind of role", () => {
111
- // The resolver picks WHICH entry; how that entry runs is the entry's own business and rides along whole,
112
- // because the turn (or the one-shot) is composed from all of it.
113
- const configured: ModelPin = { provider: `claude`, model: `claude-opus-5`, effort: `max`, thinking: true, harness: `claude-code` };
114
-
115
- expect(resolveRoleModels([CLAUDE], [configured], RUN)).toEqual([configured]);
116
- expect(resolveRoleModels([CLAUDE], [configured], HELPER)).toEqual([configured]);
117
- });
118
-
119
- test("serves the newest of a catalog that publishes no cheap tier at all", () => {
120
- // Kimi names no tier word anywhere. There is no cheaper rung to find, so the newest row is the honest answer.
121
- expect(head([KIMI], [])).toEqual({ provider: `kimi`, model: `kimi-k3` });
122
- });
123
-
124
- test("reports nothing when no account is connected, so the button can say so instead of failing on click", () => {
125
- expect(head([offline(CLAUDE), offline(GOOGLE)], [])).toBeUndefined();
126
- expect(resolveRoleModels([offline(CLAUDE), offline(GOOGLE)], [], HELPER)).toEqual([]);
127
- expect(head([], [`claude:claude-haiku-4-5`])).toBeUndefined();
128
- });
129
-
130
- test("skips a connected provider whose catalog has not loaded yet", () => {
131
- const unloaded: ModelSource = { provider: `grok`, ready: true, models: [] };
132
-
133
- expect(head([unloaded, CLAUDE], [])).toEqual({ provider: `claude`, model: `claude-haiku-4-5-20251001` });
134
- expect(head([unloaded], [])).toBeUndefined();
135
- });
136
-
137
- /* THE CHAIN: what the daemon walks when the model at the top of it refuses. A spent allowance is the ordinary
138
- * case, not the exotic one: the account a helper shares with the chat runs out mid-afternoon, and the whole
139
- * point of the list is that the click still lands on the next rung down. */
140
-
141
- test("keeps the pinned models in the order they were written", () => {
142
- expect(resolveRoleModels([CLAUDE, GOOGLE, CODEX], [`codex:gpt-5.6`, `gemini:gemini-3-flash`, `claude:claude-haiku-4-5-20251001`].map(pin), HELPER)).toEqual([
143
- { provider: `codex`, model: `gpt-5.6` },
144
- { provider: `gemini`, model: `gemini-3-flash` },
145
- { provider: `claude`, model: `claude-haiku-4-5-20251001` },
146
- ]);
147
- });
148
-
149
- test("drops a pin whose provider went away and keeps the rest of the order intact", () => {
150
- expect(resolveRoleModels([CLAUDE, offline(GOOGLE), CODEX], [`codex:gpt-5.6`, `gemini:gemini-3-flash`, `claude:claude-haiku-4-5`].map(pin), HELPER)).toEqual([
151
- { provider: `codex`, model: `gpt-5.6` },
152
- { provider: `claude`, model: `claude-haiku-4-5` },
153
- ]);
154
- });
155
-
156
- test("stops at the end of a pinned list rather than reaching for an account the user left out", () => {
157
- // Google and Kimi are connected and cheaper. The user wrote down one model, so one model is what this may
158
- // spend: a pin exists precisely to keep a helper off the accounts it does not name.
159
- expect(resolveRoleModels([CLAUDE, GOOGLE, KIMI], [`claude:claude-haiku-4-5`].map(pin), HELPER)).toEqual([{ provider: `claude`, model: `claude-haiku-4-5` }]);
160
- });
161
-
162
- test("names each model once, however many times the list repeats it", () => {
163
- // The list is edited by hand; a duplicate would spend a second attempt proving the same account is out.
164
- expect(resolveRoleModels([CLAUDE], [`claude:claude-haiku-4-5`, `claude:claude-haiku-4-5`].map(pin), HELPER)).toEqual([
165
- { provider: `claude`, model: `claude-haiku-4-5` },
166
- ]);
167
- });
168
-
169
- test("Auto is a ladder too, every connected provider's cheap rung, best first", () => {
170
- expect(resolveRoleModels([CLAUDE, GOOGLE, KIMI], [], HELPER)).toEqual([
171
- { provider: `gemini`, model: `gemini-3-flash-lite` },
172
- { provider: `claude`, model: `claude-haiku-4-5-20251001` },
173
- { provider: `kimi`, model: `kimi-k3` },
174
- ]);
175
- });
176
-
177
- /* A MODEL ENDPOINT the user configured is a provider like any other here, and the reason it has to be is the
178
- * settings row: its options are built from the same picker catalog, so a pin naming one that this resolver
179
- * dropped would print one model's name in the settings row and spend a different account entirely. */
180
- const OLLAMA: ModelSource = { provider: `endpoint/ollama`, ready: true, models: [`qwen3-coder`, `gemma3-27b`] };
181
-
182
- test("honours a pin on a configured endpoint: the whole id, not the half before its slash", () => {
183
- expect(head([CLAUDE, OLLAMA], [`endpoint/ollama:qwen3-coder`])).toEqual({ provider: `endpoint/ollama`, model: `qwen3-coder` });
184
- // And it round-trips through the key shape the picker mints, which is where the slash-not-colon rule earns
185
- // itself: parsePinned splits on the FIRST colon, so an `endpoint:ollama` id would have parsed the provider
186
- // as "endpoint" and the model as "ollama:qwen3-coder": a pin that silently resolves to nothing.
187
- expect(modelPinKey({ provider: `endpoint/ollama`, model: `qwen3-coder` })).toBe(`endpoint/ollama:qwen3-coder`);
188
- });
189
-
190
- test("leaves Auto to the providers whose price is known, rather than reaching for someone's own server", () => {
191
- // Claude publishes a Haiku-class row; the endpoint's ids carry no tier word at all, so they are UNRANKED and
192
- // lose on tier. What a turn on a user's own model API costs is not a fact this repo holds, and Auto should
193
- // not be asserting one.
194
- expect(head([CLAUDE, OLLAMA], [])).toEqual({ provider: `claude`, model: `claude-haiku-4-5-20251001` });
195
- });
196
-
197
- test("still answers from an endpoint when it is the only thing configured", () => {
198
- // No tier word in either id, so the shared id-derived ordering decides between them exactly as it does for
199
- // Kimi above: the point here is that a sandbox whose only model API is its owner's still gets an answer
200
- // rather than the disabled "nothing connected" button.
201
- expect(head([offline(CLAUDE), OLLAMA], [])).toEqual({ provider: `endpoint/ollama`, model: `qwen3-coder` });
202
- });