@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
@@ -1,40 +1,14 @@
1
- // devices: what ONE of the user's own machines is running
1
+ // What one of the user's own machines is running.
2
2
  import { z } from "zod";
3
3
  import { HostFactsSchema } from "./hosts.js";
4
- // The one sentinel every non-release build carries, so a locally compiled agent is never told it is behind.
5
- import { DEV_VERSION } from "../versions.js";
6
- /* The other end of desktop sync, stated as a fact instead of a claim.
7
- *
8
- * Everything here already existed, as the machine agent's printed status on a terminal nobody running the desktop app
9
- * has open, and as `docker ps` rows only the desktop app could see. Three surfaces each held a third of it: the
10
- * desktop app knew the containers and nothing about sync, the Desktop sync card knew an enrollment record and
11
- * printed the status command for the rest, and the folder a machine syncs into was known to neither
12
- * (SYNC_DIR is local agent state; the daemon is never told it). This is that one shape, so the same report can
13
- * be produced by the agent, read by the daemon, and rendered by one component in both apps.
14
- *
15
- * The producer is `intentic-machine status --json` in every carrier (this report rides as its `sync` half), the desktop app spawns it, the mirror watcher
16
- * posts it, a `host` capability runs it over run_command. One producer is what keeps the three from drifting,
17
- * the same argument as the desktop app spawning connect.sh rather than reimplementing it.
18
- *
19
- * WHO FILLS WHAT is the disclosure rule, made structural. The agent reports only what it uniquely knows, its
20
- * own pairings, folders, ports, watcher, and NEVER `sandboxes`: enumerating a machine's other containers to one
21
- * of them is the leak this design exists to avoid, and a sync agent has no business doing it anyway. The docker
22
- * half is supplied by whoever is READING (the desktop app from its own `docker ps`, the daemon from a
23
- * `host`-capability one), which is also the only side that has a reason to be trusted with it.
24
- *
25
- * What remains is scoping: a report reaching a sandbox carries that sandbox's pairing, not its siblings', and a
26
- * `mirror` enrollment, a collaborator's own laptop, drops `localDir` with it. So a member who mirrors one
27
- * dev-server port does not hand the sandbox's owner a map of their machine. */
4
+ import { DEV_VERSION } from "../state/versions.js";
5
+ // Desktop-sync report shape shared by the agent, daemon and browser, produced only by `intentic-machine status --json`.
6
+ // The agent never reports `sandboxes`; the docker half is filled in by whoever reads the report, scoped to the reader's
7
+ // own pairing.
28
8
 
29
- /* ONE SANDBOX'S SHARE OF ITS MACHINE, as docker enforces it right now: read off the container's HostConfig
30
- * and env by the machine agent, never asked of the sandbox (which cannot see its own cgroup ceiling as a
31
- * docker flag, only as a number in /sys/fs/cgroup).
32
- *
33
- * The two `*Runtime` lists are the same directive vocabulary the run contract allowlists
34
- * (@intentic/sandbox-run RUNTIME_DIRECTIVES), split by WHO asked: `overlayRuntime` is what the approved
35
- * environment demands (a view draws those locked — "required by the Docker capability"), `hostRuntime` is
36
- * what the owner asked for on top and may withdraw. `privileged` and `gpu` are the docker-side truth of the
37
- * union: what the container actually got, after a host without the nvidia runtime dropped the GPU. */
9
+ // One sandbox's resource share as docker currently enforces it, read off the container by the machine agent.
10
+ // `overlayRuntime` is the environment's locked demand; `hostRuntime` is the owner's addition; `privileged`/`gpu` are
11
+ // docker's enforced truth.
38
12
  export const SandboxResourcesSchema = z.object({
39
13
  // The cgroup memory ceiling in bytes; absent when docker imposes none (the hosted shape).
40
14
  memoryBytes: z.number().optional(),
@@ -47,19 +21,15 @@ export const SandboxResourcesSchema = z.object({
47
21
  });
48
22
  export type SandboxResources = z.infer<typeof SandboxResourcesSchema>;
49
23
 
50
- /* WHAT A RESHAPE ASKS FOR: the Resources dialog's answer, the `reshape` op's payload, and the shape the
51
- * machine turns into `ic sandbox reshape` flags. Every key is "leave it" when absent; the two caps take
52
- * `null` for "back to the default" (the machine-derived memory share; every core), which `ic` spells as
53
- * `default` and the run contract as an empty seed. At least one key, because a reshape with nothing to change
54
- * is a restart for nothing, and the machine refuses it before anything is spawned. */
24
+ // Reshape request, turned into `ic sandbox reshape` flags: absent means leave it, `null` on the two caps means back to
25
+ // the default; at least one key must be set.
55
26
  export const SandboxResourcesAskFieldsSchema = z.object({
56
27
  memoryGib: z.int().positive().nullable().optional(),
57
28
  cpus: z.int().positive().nullable().optional(),
58
29
  privileged: z.boolean().optional(),
59
30
  gpu: z.boolean().optional(),
60
31
  });
61
- // The fields alone are exported too, for a caller that composes them into a wider object (the machine's MCP
62
- // tool adds the slug beside them) and applies the at-least-one rule itself.
32
+ // Fields also exported separately for callers that compose them and enforce the at-least-one rule themselves.
63
33
  export const SandboxResourcesAskSchema = SandboxResourcesAskFieldsSchema.refine((ask) => Object.values(ask).some((value) => value !== undefined), {
64
34
  message: "a reshape must change at least one thing",
65
35
  });
@@ -73,44 +43,16 @@ export const DeviceSandboxSchema = z.object({
73
43
  name: z.string().optional(),
74
44
  running: z.boolean(),
75
45
  image: z.string(),
76
- // Absent when the sandbox has no cloudflared sidecar AT ALL (reached over the user's own proxy), which is
77
- // not the same fact as a sidecar that is down, and must not render as one.
46
+ // Absent when there is no cloudflared sidecar at all; that is not the same as a sidecar that is down.
78
47
  tunnelRunning: z.boolean().optional(),
79
- // Its share of the machine (above). Absent from a reader that did not inspect the container: the cheap
80
- // `docker ps` listing the machine's own fleet reads use carries none of it.
48
+ // Absent when the reader only ran a cheap `docker ps` listing without inspecting the container.
81
49
  resources: SandboxResourcesSchema.optional(),
82
50
  });
83
51
  export type DeviceSandbox = z.infer<typeof DeviceSandboxSchema>;
84
- /* ONE OPERATION ON ONE SANDBOX ON ONE MACHINE, the Devices view's buttons, and the only thing that changes a
85
- * machine's fleet from a browser.
86
- *
87
- * All nine ops travel one route because they are one decision to the person clicking, however differently they
88
- * behave underneath: three are a docker call that returns in a second, four run the `ic` flow for minutes, one
89
- * deletes, and one only reads. Splitting them by duration would put the same button on two doors and give the
90
- * view two shapes to render. So every op answers as a STREAM of lines ending in a result, the fast ones simply
91
- * have little to say, and `logs` is the case where the lines ARE the answer.
92
- *
93
- * `prepare` is the one that changes nothing on purpose: it downloads and builds the next update and stops
94
- * there, leaving the container running the image it was already running. It is what turns `update` from a wait
95
- * of minutes into a restart of seconds, and it is safe to offer at any moment for exactly that reason.
96
- *
97
- * `logs` is here rather than on a route of its own for the same reason the rest share it: it is a button in the
98
- * same row as the others, on a container that may be too broken to answer any other way, and the stream shape
99
- * already carries "many lines, then an outcome" exactly as a log tail wants to arrive.
100
- *
101
- * `reshape` is the one that changes the CONTAINER without changing its image: its share of the machine (memory
102
- * and CPU caps) and its privileges (privileged, the host's GPU), recreated onto the same image so the values
103
- * live on the container and outlive every later swap. It carries `resources`, the only op with a payload of
104
- * its own besides `rebuild`'s hash.
105
- *
106
- * The machine enforces which of them it will do: `sandboxes` covers everything but removal, which takes its own
107
- * switch, and a refusal comes back as the machine's own sentence naming the control to flip. */
108
- /* `runner-up` / `runner-remove` are the same door for a container that belongs to THIS SANDBOX rather than to
109
- * a person: a runner (runners/, docs/remote-runners-plan.md at the workspace root). They ride here because to
110
- * the machine they are the same act it already does, run and remove a sandbox container, and to the person
111
- * clicking they are the same row of buttons. Both take the `sandboxes` switch and neither takes the removal
112
- * one: a runner holds no workspace of its own, only a mirror of the parent's git, so removing it destroys
113
- * nothing the parent does not still have. */
52
+ // One operation on one sandbox, streamed as lines ending in a `result` or `error` frame. `prepare` builds the pending
53
+ // update without touching the container; `reshape` changes only its resources and privileges, not the image.
54
+ // `runner-up`/`runner-remove` act on a runner (this sandbox's own container), not a person's sandbox; gated by the
55
+ // `sandboxes` switch, not removal, since a runner holds no separate workspace to lose.
114
56
  export const DeviceSandboxOpSchema = z.enum([
115
57
  "start",
116
58
  "stop",
@@ -122,114 +64,59 @@ export const DeviceSandboxOpSchema = z.enum([
122
64
  "reshape",
123
65
  "remove",
124
66
  "logs",
67
+ // Only op that redeems a fresh setup code; others recreate a container from its own existing env.
68
+ "reconnect",
125
69
  "runner-up",
126
70
  "runner-remove",
127
71
  ]);
128
72
  export type DeviceSandboxOp = z.infer<typeof DeviceSandboxOpSchema>;
129
73
  export const DeviceSandboxFlowSchema = z.object({
130
74
  op: DeviceSandboxOpSchema,
131
- // Which sandbox, or, for the two runner ops, which RUNNER: the name it is known by at both ends, the
132
- // parent's `/system/runners` list and the machine's `ic runner list`.
75
+ // Sandbox slug, or the runner's name for the runner ops (as `/system/runners`/`ic runner list` know it).
133
76
  slug: z.string().min(1),
134
- // The approved overlay's sha256, required by `rebuild` and meaningless to the rest. It is the trust anchor:
135
- // only content that still hashes to what the owner reviewed is ever built.
77
+ // Approved overlay's sha256, required only by `rebuild`; only content matching it is ever built.
136
78
  hash: z.string().optional(),
137
79
  // What `reshape` should change, required by it and meaningless to the rest.
138
80
  resources: SandboxResourcesAskSchema.optional(),
139
- /* `runner-up` only, and both are filled in by the DAEMON, never by the caller: where the runner dials
140
- * (this sandbox's public URL) and the single-use pairing it redeems there. The browser asks for a runner
141
- * on a machine; it never holds the credential that makes one, which is what keeps a pairing out of every
142
- * surface between here and that machine. */
81
+ // `runner-up` only, daemon-filled, never by the caller: the browser never holds the pairing credential.
143
82
  parentUrl: z.string().optional(),
144
83
  pair: z.string().optional().meta({ secret: true }),
145
- /* `runner-up` only, daemon-filled like the pair: the parent's SHAPE, riding to the machine so the runner
146
- * starts as this sandbox's twin instead of a bare base image.
147
- *
148
- * `definition` is a settings-only sandbox.toml the container boots with as SANDBOX_DEFINITION_SEED (the
149
- * fleet door in @intentic/sandbox-run); the daemon scopes it before sending, capabilities and secret
150
- * names deliberately never ride to a runner. `overlay`/`overlayHash` are the parent's APPROVED composed
151
- * overlay, byte-exact with its sha256: the parent's owner already approved those bytes, so `ic runner up`
152
- * re-checks the hash and builds them at creation — approval by provenance, the same byte-exact check
153
- * `ic sandbox rebuild` runs, where a definition handed to a STRANGER must park at an approval gate. */
84
+ // Required by `reconnect` only; single-sandbox and short-lived, so a leak only buys a recreate.
85
+ setupCode: z.string().optional().meta({ secret: true }),
86
+ // `runner-up` only, daemon-filled: `definition` carries no capabilities or secrets; `overlay`/`overlayHash` are
87
+ // re-verified by hash before build.
154
88
  definition: z.string().optional(),
155
89
  overlay: z.string().optional(),
156
90
  overlayHash: z.string().optional(),
157
91
  });
158
92
  export type DeviceSandboxFlow = z.infer<typeof DeviceSandboxFlowSchema>;
159
- // The same input plus which machine it is for, the browser's half, since the daemon reaches the machine by id.
93
+ // Adds the device id to the flow input; the daemon looks up machines by id.
160
94
  export const DeviceSandboxFlowInputSchema = DeviceSandboxFlowSchema.extend({ id: z.string().min(1) });
161
95
  export type DeviceSandboxFlowInput = z.infer<typeof DeviceSandboxFlowInputSchema>;
162
- /* What a running operation says, in the one line shape every streamed flow in this product already uses
163
- * (IntenticLineSchema, which the browser's reader parses): `line` as the machine prints it, then exactly one
164
- * terminal frame, `result` when it worked, `error` when it did not, carrying the machine's own words either
165
- * way rather than a code this side invented. */
96
+ // Streamed operation output, matching `IntenticLineSchema`: `line` frames as printed, then one terminal frame, `result`
97
+ // or `error`, carrying the machine's own message rather than a code.
166
98
  export const DeviceFlowLineSchema = z.discriminatedUnion("kind", [
167
99
  z.object({ kind: z.literal("line"), text: z.string() }),
168
100
  z.object({ kind: z.literal("result"), message: z.string() }),
169
101
  z.object({ kind: z.literal("error"), message: z.string() }),
170
102
  ]);
171
103
  export type DeviceFlowLine = z.infer<typeof DeviceFlowLineSchema>;
172
- /* UPDATING OR RESTARTING THE AGENT ITSELF, from the row that reports its version.
173
- *
174
- * THE OPERATION THAT KILLS ITS OWN TRANSPORT, and that is the whole reason it is a flow of its own rather than
175
- * another entry in the DeviceCommand set below. `run_command` runs as a child of the resident process, and both
176
- * of these stop that process: `upgrade` calls stopResident() before it swaps the binary, and `run` stops before
177
- * it starts. So the socket carrying the request dies mid-command, and the child's stdout pipe dies with it —
178
- * an EPIPE on `process.stdout` is an uncaught exception in Node. An upgrade killed between
179
- * `swap(agentPath, previous)` and `swap(staged, agentPath)` leaves a device with NO `intentic-machine` binary
180
- * and a login entry pointing at a missing file, which is the one outcome worse than being out of date.
181
- *
182
- * The agent therefore runs the work DETACHED (spawnDetached, exactly as it launches its own loop) and streams
183
- * its log while it can. The stream ending with no terminal frame is the NORMAL case here, not a failure, and
184
- * confirmation is the version moving on the view's next poll — which is also the only honest confirmation: the
185
- * CLI's own `loop-behind` outcome exists because "a process came up" does not mean the new build is serving.
186
- *
187
- * `restart` needs no new CLI verb: bare `intentic-machine run` is a restart (reconcileResidency stops before it
188
- * starts), and it is the remedy for both a stalled loop and one serving an older build than the file beside it. */
104
+ // Both ops stop the resident process mid-command; a stream ending with no terminal frame is normal, not a failure, and
105
+ // confirmation is the version moving on the next poll. `restart` is just a bare `intentic-machine run`.
189
106
  export const DeviceAgentOpSchema = z.enum(["upgrade", "restart"]);
190
107
  export type DeviceAgentOp = z.infer<typeof DeviceAgentOpSchema>;
191
108
  export const DeviceAgentFlowSchema = z.object({ op: DeviceAgentOpSchema });
192
109
  export type DeviceAgentFlow = z.infer<typeof DeviceAgentFlowSchema>;
193
- // The same input plus which device it is for, the browser's half.
110
+ // Adds the device id to the flow input.
194
111
  export const DeviceAgentFlowInputSchema = DeviceAgentFlowSchema.extend({ id: z.string().min(1) });
195
112
  export type DeviceAgentFlowInput = z.infer<typeof DeviceAgentFlowInputSchema>;
196
- /* RUNNING ONE OF THIS PRODUCT'S OWN CLIs ON A CONNECTED DEVICE, FROM A BUTTON, with no agent in the loop.
197
- *
198
- * A machine that is connected as a device can already be told things: the ops above drive its docker, and an
199
- * agent with the `host` capability can run whatever it likes through `run_command`. What had no door was the
200
- * ordinary case in between — the user wants the thing the CLI on their machine already does, and the sandbox is
201
- * where they are looking. Their alternatives were to go and find a terminal, or to ask an agent to do it, which
202
- * spends a turn and a model's judgement on a decision that has none in it.
203
- *
204
- * So: a CLOSED SET OF NAMES, and the argv is built on the daemon from the name alone (hosts/device-commands.ts).
205
- * The browser sends `mirror-off`, never a command line. That is the whole security property, and it is the
206
- * reason this is an enum rather than a string: the same socket carries `run_command`, so a route that forwarded
207
- * caller-supplied text would hand every browser session a shell on the user's laptop, which is a grant the
208
- * capability card never made.
209
- *
210
- * The machine still enforces its own switches. "Run commands" being off comes back as its own refusal, in its
211
- * own words, naming the control to flip — exactly as it does for the sandbox ops. */
212
- /* THE SET, and why the file-sync half of it is here beside the mirroring half.
213
- *
214
- * Both are the same gesture to the person clicking: something this device is doing for this sandbox, turned
215
- * off or on from the row that describes it. They were split for a while by nothing but which one had been built
216
- * — mirroring had a button and pausing a file sync had a paragraph telling you to go and find a terminal — and
217
- * that is exactly the gap this door exists to close.
218
- *
219
- * `sync-unpair` is the one that DESTROYS something, and it is deliberately the machine's `sync uninstall
220
- * --sandbox`, not this side's idea of unpairing: the agent terminates both Mutagen sessions, drops the local
221
- * pairing and self-revokes its enrollment on the way out, so the machine cleans up after itself rather than
222
- * leaving a sandbox to guess what it managed to do. Revoking from the SANDBOX side (an unreachable machine, a
223
- * laptop that is never coming back) is a different act and a different route, see the enrollment revoke. */
113
+ // Closed set of command names; the daemon builds argv from the name alone (hosts/device-commands.ts). Never a free-text
114
+ // command: the same socket carries `run_command`, which would grant a shell on the user's machine.
115
+ // `sync-unpair` runs the machine's own `sync uninstall --sandbox` (terminates both Mutagen sessions, drops the pairing,
116
+ // self-revokes enrollment); revoking from the sandbox side is a different route.
224
117
  export const DeviceCommandSchema = z.enum(["mirror-off", "mirror-on", "sync-pause", "sync-resume", "sync-unpair"]);
225
118
  export type DeviceCommand = z.infer<typeof DeviceCommandSchema>;
226
- /* Which paired sandbox the command acts on: the machine's own id for it, as it appears in that machine's report,
227
- * so nothing here has to re-derive the sanitizing the agent applied. Absent means every sandbox that machine
228
- * pairs, which is what the CLI does when it is run bare.
229
- *
230
- * Pattern-bound because it becomes an argv token. It must start with an alphanumeric, not merely consist of id
231
- * characters: a value like `--takeover` is made only of legal id characters and is a FLAG by the time the CLI on
232
- * the machine parses it. Real ids are `sandbox-<hex>-<zone>`-shaped, so nothing legitimate leads with a dash. */
119
+ // Machine's sandbox id (absent = every paired sandbox); must start alphanumeric, else it parses as a CLI flag.
233
120
  export const DeviceSandboxIdSchema = z
234
121
  .string()
235
122
  .max(200)
@@ -240,66 +127,57 @@ export const DeviceCommandInputSchema = z.object({
240
127
  sandboxId: DeviceSandboxIdSchema.optional(),
241
128
  });
242
129
  export type DeviceCommandInput = z.infer<typeof DeviceCommandInputSchema>;
243
- /* What came back. `ok` is the command's own exit status, not this route's: a machine that refused the call, or a
244
- * CLI that exited non-zero, is a real answer to show the person who clicked, not an exception to convert into
245
- * one. Only an unreachable machine throws, because then there is nothing to report at all.
246
- *
247
- * `output` is what the command printed, kept because the CLI's own sentences ("Port mirroring OFF for: …") are
248
- * better than anything this side would write over them. */
130
+ // `ok` is the command's own exit status, not this route's: a refusal or non-zero exit is a real answer, not a thrown
131
+ // error. Only an unreachable machine throws. `output` is the command's own printed text.
249
132
  export const DeviceCommandResultSchema = z.object({
250
133
  ok: z.boolean(),
251
134
  message: z.string(),
252
135
  output: z.string().optional(),
253
136
  });
254
137
  export type DeviceCommandResult = z.infer<typeof DeviceCommandResultSchema>;
255
- // One paired sandbox as the local agent holds it. `localDir` is the answer to the question the Desktop sync card
256
- // has never been able to answer: which folder on that device this sandbox's /work actually is.
138
+
139
+ // Mutagen's three change kinds, read per side of a conflict; a count alone named no file, cause or remedy. Absent means
140
+ // Mutagen did not say, not that a side is untouched.
141
+ export const DeviceConflictChangeSchema = z.enum(["created", "modified", "deleted"]);
142
+ export type DeviceConflictChange = z.infer<typeof DeviceConflictChangeSchema>;
143
+
144
+ export const DeviceConflictSchema = z.object({
145
+ /** Relative to the synced folder (matches both `localDir` and /work); empty means the root itself. */
146
+ path: z.string(),
147
+ /** What happened on the device (Mutagen's alpha). */
148
+ local: DeviceConflictChangeSchema.optional(),
149
+ /** And in the sandbox's /work (its beta). */
150
+ sandbox: DeviceConflictChangeSchema.optional(),
151
+ });
152
+ export type DeviceConflict = z.infer<typeof DeviceConflictSchema>;
153
+
154
+ // One paired sandbox as the local agent holds it; `localDir` is which folder on that device holds this sandbox's /work.
257
155
  export const DevicePairingSchema = z.object({
258
156
  sandboxId: z.string(),
259
157
  mode: z.enum(["sync", "mirror"]),
260
- // Set only for mode "sync", and only for the sandbox being reported to, see the redaction note above.
158
+ // Set only for mode "sync", and only for the sandbox being reported to.
261
159
  localDir: z.string().optional(),
262
- /* Whether that device is putting this sandbox's ports on its own localhost, which is a switch its owner
263
- * holds and not a state this sandbox can read off anything else. An empty port list means two opposite
264
- * things — nothing is listening in the sandbox, or the machine was told to keep them off — and only the
265
- * second is worth a word on screen or a button to undo.
266
- *
267
- * The MACHINE owns the flag (the agent's `sync mirror off`), because the localhost being written to is
268
- * there: a device told to keep ports off must keep them off while this sandbox is asleep, unreachable, or
269
- * arguing. A browser asks for it by running that same command over the machine's `host` capability, so the
270
- * button and the CLI are one gesture rather than two mechanisms that can disagree.
271
- *
272
- * Optional because it is a fact only an agent new enough to have the switch reports; absent is read as "on",
273
- * which is what mirroring has always been. */
160
+ // Machine-owned switch (agent's own `sync mirror off`); absent reads as "on", not merely unknown.
274
161
  mirroring: z.enum(["on", "off"]).optional(),
275
- // Mutagen's own word for what the session is doing ("watching", "scanning", "transitioning", "halted-…").
276
- // Carried verbatim rather than mapped to a traffic light: the halted states name their own cause, and a UI
277
- // that reduces them to "problem" sends the user back to the terminal this report exists to replace.
162
+ // Mutagen's own status word, kept verbatim rather than reduced to a traffic light.
278
163
  mutagenStatus: z.string().optional(),
279
- // Conflicts Mutagen is holding rather than clobbering (the sync mode is two-way-SAFE). Nothing else in the
280
- // product surfaces these, so a file edited on both ends stays stuck until someone runs the CLI.
164
+ // Whole conflict count, including any Mutagen's own state truncates (`excludedConflicts`).
281
165
  conflicts: z.number().int().nonnegative().optional(),
166
+ // Conflicted paths, capped at `CONFLICT_PATHS_MAX`; `conflicts` above is the true, uncapped count.
167
+ conflictedPaths: z.array(DeviceConflictSchema).optional(),
282
168
  paused: z.boolean().optional(),
283
- /* The SECOND session's word, the one-way mirror carrying the sandbox's state dir down (sync's backupSpec).
284
- * Reported separately rather than folded into the status above, because the two fail independently and mean
285
- * different things: the first going quiet stops the owner's edits moving, the second going quiet stops their
286
- * personas, skills, automations, approvals and transcripts from surviving the sandbox. A backup that is not
287
- * running is only dangerous while nobody knows, so it gets its own word on the line. */
169
+ // Second session's status (the state-dir backup mirror), reported separately: the two fail independently.
288
170
  backupStatus: z.string().optional(),
289
171
  });
290
172
  export type DevicePairing = z.infer<typeof DevicePairingSchema>;
291
- /* One sandbox port and what became of it on this machine's localhost. The rows that did NOT make it are the
292
- * reason this carries a state rather than being a list of live forwards: two sandboxes on one device routinely
293
- * serve the same dev-server port and only one can own localhost:6480, so the loser's port is simply missing from
294
- * localhost with nothing anywhere saying why. Today that fact exists only as a line in mirror.log. */
173
+ // One sandbox port and what became of it on this machine's localhost; carries a state rather than just live forwards,
174
+ // since two sandboxes can claim the same port and the loser needs a reason shown.
295
175
  export const DevicePortStateSchema = z.enum([
296
176
  // Forwarded: the sandbox's listener answers on this machine's localhost at the same number.
297
177
  "mirrored",
298
- // Another PAIRED SANDBOX got there first (first paired wins), `heldBy` names it, because "busy on this
299
- // machine" sends people hunting for a process that does not exist.
178
+ // Another paired sandbox already holds the port (first paired wins); `heldBy` names it.
300
179
  "held-by-sandbox",
301
- // Something else on this device already binds the port, a local dev server, another tool. Not ours to
302
- // name, and not ours to take.
180
+ // Something outside this product already binds the port; not ours to name or take.
303
181
  "busy",
304
182
  ]);
305
183
  export const DevicePortSchema = z.object({
@@ -310,93 +188,49 @@ export const DevicePortSchema = z.object({
310
188
  state: DevicePortStateSchema,
311
189
  // Set only for "held-by-sandbox": the sandbox id that owns the local bind instead.
312
190
  heldBy: z.string().optional(),
313
- // What is listening on the sandbox side ("node …/vite"), for a row the user has to recognise to act on.
191
+ // What is listening on the sandbox side (e.g. `node …/vite`), so the user can recognise it.
314
192
  command: z.string().optional(),
315
193
  });
316
194
  export type DevicePort = z.infer<typeof DevicePortSchema>;
317
- /* THE AGENT ON THIS DEVICE, AS ONE BLOCK, because it is one binary and one process.
318
- *
319
- * It used to be two: `agents: { sync, host }` up in the report, and a `watcher` beside it. That split was a
320
- * fiction two merges out of date — `resident.ts` runs a SINGLE process serving the outbound socket per linked
321
- * sandbox and the mirror watcher together, from a single `intentic-machine` on disk — and it cost the Devices
322
- * view its version chip. The chip read `agents.sync` and labelled it with the ENROLLMENT MODE ("desktop sync
323
- * 1.243.0", or the same number as "ports only 1.243.0" on a mirror), so one binary's version wore two product
324
- * names and appeared on no row that had never been paired for sync. `agents.host` was never filled by the
325
- * report at all: the daemon fills `Device.agentVersion` from the hello frame it already holds.
326
- *
327
- * So: one block, and every version question about a device is answered inside it.
328
- *
329
- * `running` also decides whether everything ELSE in the report is still true — a healthy session list under a
330
- * dead loop means new dev-server ports stop appearing on localhost and commits stop arriving in the local
331
- * clones, while every other row reads exactly as it did the moment before. */
195
+ // The device's one agent process as a single block; `running` also gates whether the rest of the report is still
196
+ // current, a dead loop leaves every other row reading as it did before it died.
332
197
  export const DeviceAgentSchema = z.object({
333
198
  running: z.boolean(),
334
199
  pid: z.number().int().optional(),
335
- /* THE BUILD ON DISK: the file at `~/.intentic/bin/intentic-machine`, asked what it is rather than assumed
336
- * (the agent's own installed.ts). Absent on a device with no installed agent at all — a dev run, an `npx`
337
- * one, a binary somebody put elsewhere on their PATH — which is "not known", never a version. */
200
+ // Build on disk at `~/.intentic/bin/intentic-machine`; absent means no installed agent at all.
338
201
  installed: z.string().optional(),
339
- /* THE BUILD ACTUALLY SERVING, stamped into the pidfile by the loop that claimed it, which is the only place
340
- * the fact exists: replacing the binary does not touch the running process, so a device can hold a current
341
- * agent and go on serving a months-old one indefinitely. The two differing is a restart somebody is owed
342
- * (see agentBuildSkew). Absent when no loop is running, and when the one running predates the stamp. */
202
+ // Build actually serving, stamped in the pidfile; can lag `installed` indefinitely (see `agentBuildSkew`).
343
203
  build: z.string().optional(),
344
- /* When the loop last FINISHED a pass, the field that makes `running` mean something. The agent holds its
345
- * SSH transport listeners on its own event loop, so a failure that escapes the loop leaves a process that is
346
- * alive and a loop that is gone: pid present, unit "active", mirroring and the git bridge stopped. Absent
347
- * means the agent has not reported one (too old to stamp, or its first pass has not landed), which is not
348
- * the same as stalled, and readers must not treat it as either state. */
204
+ // When the loop last finished a pass; a live process can have a dead loop (see `agentStalled`).
349
205
  lastTickAt: z.number().optional(),
350
206
  });
351
207
  export type DeviceAgent = z.infer<typeof DeviceAgentSchema>;
352
- /* How long the loop may go without finishing a pass before "running" stops being the honest word for it. It
353
- * polls every 5s and its slowest step is bounded by two 10s network timeouts per pairing, so a minute is
354
- * several passes of slack, the same yardstick the Devices view already ages a whole report by.
355
- *
356
- * The rule lives HERE, next to the field, because the terminal and the browser both answer this question and a
357
- * device that is "running" in one and "stalled" in the other is worse than either answer alone. */
208
+ // Loop polls every 5s with two 10s network timeouts per pairing; a minute is several passes of slack.
358
209
  export const AGENT_STALL_AFTER_MS = 60_000;
359
210
  export const agentStalled = (agent: DeviceAgent, now: number): boolean =>
360
211
  agent.running && agent.lastTickAt !== undefined && now - agent.lastTickAt > AGENT_STALL_AFTER_MS;
361
212
  export const DeviceReportSchema = z.object({
362
- /* The OS hostname, and the JOIN KEY. A machine can arrive here two ways at once, volunteered by its sync
363
- * agent, and read through its `host` capability, and those two know it by different names (the enrolled
364
- * key's comment vs. the capability id the user typed). The hostname is the one thing both can state about
365
- * the same box, so it is what dedupes them into a single row. */
213
+ // OS hostname; the join key that dedupes a machine seen via sync and via its `host` capability.
366
214
  hostname: z.string(),
367
215
  os: z.string(),
368
- // Filled by the READER, never the agent (see above). Empty is the resting state: no Docker on the machine,
369
- // or nothing has looked. Neither is an error, and neither means "no sandboxes exist".
216
+ // Filled by the reader, never the agent; empty means no Docker or nothing looked, not that none exist.
370
217
  sandboxes: z.array(DeviceSandboxSchema),
371
218
  pairings: z.array(DevicePairingSchema),
372
219
  ports: z.array(DevicePortSchema),
373
- // The one agent this device runs, on disk and in flight, in one block (see DeviceAgentSchema for why it is
374
- // one and not the `agents` map plus a `watcher` it replaced).
220
+ // The one agent this device runs, on disk and in flight, in one block.
375
221
  agent: DeviceAgentSchema,
376
- // When the machine took this reading. NOT when the daemon received it. A report is a snapshot from a box
377
- // that may since have gone to sleep, and the UI ages it against this rather than presenting it as now.
222
+ // When the machine took this reading, not when the daemon received it; the UI ages the report against this.
378
223
  capturedAt: z.number(),
379
224
  });
380
225
  export type DeviceReport = z.infer<typeof DeviceReportSchema>;
381
226
 
382
- /* THE AGENT THIS MACHINE INSTALLED AND THE ONE IT IS RUNNING, when they are not the same build — the whole of
383
- * "you updated the agent and nothing changed", as a value.
384
- *
385
- * It is one comparison, and it lives HERE for the same reason agentStalled does: the terminal (`intentic-machine
386
- * status`) and the browser (the Devices row) both answer this question, and a machine that is behind in one and
387
- * fine in the other is worse than either answer alone. The remedy is the same in both: restart the loop.
388
- *
389
- * AN UNSTAMPED LOOP IS THE LOUDEST CASE, not a missing one, and reading it as "nothing to say" is what let this
390
- * whole check miss the machines it was written for. `agent.build` is stamped into the pidfile by the loop that
391
- * claimed it, so a loop old enough to predate the stamp reports none — and it is running, and something newer is
392
- * installed beside it, which is a skew by definition and a wider one than any it could have named. Every surface
393
- * therefore went quiet on precisely the machines furthest behind: upgrade, see the new number everywhere, watch
394
- * nothing change, and have no screen anywhere say why.
395
- *
396
- * So the running build is OPTIONAL in the answer and the question is asked of the installed one. Still silent
397
- * whenever the honest answer is "no idea": a loop that is stopped (nothing is serving, and every surface already
398
- * says so in louder words), a device with no installed agent to compare against, and a working-tree build, which
399
- * is not a version and must not be told it is behind. */
227
+ // Past this, a reading stops speaking for the machine and only says when it was taken. Read against the moment the
228
+ // reading was received, never the wall clock: a copy nobody has re-read is old, not evidence the machine went quiet.
229
+ export const REPORT_QUIET_AFTER_MS = 60_000;
230
+ export const reportQuiet = (report: DeviceReport, receivedAt: number): boolean => receivedAt - report.capturedAt > REPORT_QUIET_AFTER_MS;
231
+
232
+ // Compares running build against installed; silent when the loop is stopped, nothing installed, or installed is a dev
233
+ // build. An unstamped `running` still counts as skew.
400
234
  export const agentBuildSkew = (agent: DeviceAgent): { readonly running: string | undefined; readonly installed: string } | undefined => {
401
235
  const { build: running, installed } = agent;
402
236
  if (!agent.running || installed === undefined || installed === DEV_VERSION || running === installed) {
@@ -405,50 +239,27 @@ export const agentBuildSkew = (agent: DeviceAgent): { readonly running: string |
405
239
  return { running, installed };
406
240
  };
407
241
 
408
- // Why a device that is plainly THERE has no report to show. Each is a different errand for the reader, which is
409
- // the whole reason they are not collapsed into one "unavailable".
242
+ // Why a device that is present has no report; each value is a distinct thing for the reader to do about it.
410
243
  export const DeviceGapSchema = z.enum([
411
244
  // A host capability that is enrolled but has no socket right now. Laptops sleep; this is not a fault.
412
245
  "offline",
413
- // Connected, but "Run commands" is switched off on its capability card, so the daemon may not ask it
414
- // anything. The one gap the user can close in a single click, and the UI says which switch.
246
+ // Connected, but "Run commands" is off on its capability card; the daemon may not ask it anything.
415
247
  "scope-off",
416
- // Reachable, asked, but has no `intentic-machine` on it, so nothing knows about folders or mirrored ports there.
248
+ // Reachable and asked, but has no `intentic-machine` installed, so nothing knows its folders or ports.
417
249
  "no-agent",
418
- // A sync-enrolled machine that has not posted a report yet: either it just enrolled, or its agent predates
419
- // machine reports. Distinct from "no-agent" because the agent IS there and the folders ARE syncing.
250
+ // Sync-enrolled but has not posted a report yet; unlike `no-agent`, the agent is there and syncing.
420
251
  "unreported",
421
252
  ]);
422
253
  export type DeviceGap = z.infer<typeof DeviceGapSchema>;
423
- /* ONE DEVICE, however the sandbox happens to be able to see it, and it may be both ways at once.
424
- *
425
- * A machine reaches a sandbox through two independent doors: a desktop-sync enrollment (which volunteers its own
426
- * report) and a `host` capability (which the daemon can ask). They know the same box by different names, the
427
- * enrolled ssh key's comment vs. the capability id the user typed, so the two are reconciled on the `hostname`
428
- * their reports agree on, and left as separate rows when there is nothing to reconcile them by. Guessing that two
429
- * differently-named machines are the same one would merge two people's laptops on a shared sandbox. */
430
- /* THE DESKTOP-SYNC ENROLLMENT BEHIND A ROW, which used to be a boolean and could not be.
431
- *
432
- * `syncEnrolled: true` answered "is this machine paired" and nothing a reader standing in front of the row
433
- * actually asks next: WHICH half of desktop sync it holds (files and ports, or ports alone), whether it has
434
- * ever used the enrollment, and how to name it when they want it gone. Those three lived on /system/sync
435
- * instead, as one machine's worth of `syncingFrom` plus a list of `mirroredBy` names, which is the sandbox-level
436
- * shape this view exists to stop being: one card claiming a sandbox has A desktop sync, over a list of the
437
- * several devices that actually do.
438
- *
439
- * `machine` is the enrollment's own name for the box (the ssh key's comment). It is what the reports are filed
440
- * under, and it is the id the revoke route takes — the same string, so a row can revoke exactly the enrollment
441
- * it is drawn from. Two machines that present the same comment share one enrollment identity throughout the
442
- * daemon (reports included); that is a pre-existing property of naming machines by their key comment, and this
443
- * field inherits it rather than inventing a second identity that would disagree with the first. */
254
+ // A machine may be reachable via desktop sync and a host capability at once; the two are reconciled on `hostname`, and
255
+ // left as separate rows when there is nothing to reconcile them by.
256
+ // `machine` is the enrollment's name for the box (the ssh key's comment): what reports are filed under and what the
257
+ // revoke route takes. Two machines sharing a key comment share one enrollment identity.
444
258
  export const DeviceSyncSchema = z.object({
445
259
  machine: z.string(),
446
- /* Which half. "sync" is files AND ports and is SINGLE-HOLDER for the sandbox; "mirror" is ports only and any
447
- * number of machines may hold one. The row says which, because "your laptop is paired" is read as the first
448
- * by somebody who has the second, and then their files are not where they expect them. */
260
+ // "sync" is files+ports, single-holder per sandbox; "mirror" is ports only, any number of machines.
449
261
  mode: z.enum(["sync", "mirror"]),
450
- // When this machine last USED its enrollment (its watcher's own polls stamp it). Absent on one that never
451
- // has, which is exactly what a setup that did not finish leaves behind, and must not read as healthy.
262
+ // When this machine last used its enrollment; absent means never, not merely unknown, and is not healthy.
452
263
  seenAt: z.number().optional(),
453
264
  });
454
265
  export type DeviceSync = z.infer<typeof DeviceSyncSchema>;
@@ -457,34 +268,17 @@ export const DeviceSchema = z.object({
457
268
  key: z.string(),
458
269
  // What to call it on screen, the user's own name for the machine wherever one exists.
459
270
  label: z.string(),
460
- // The desktop-sync enrollment this machine holds with this sandbox, absent when it has none (a device
461
- // reached only through its `host` capability).
271
+ // Desktop-sync enrollment with this sandbox; absent when reached only via a host capability.
462
272
  sync: DeviceSyncSchema.optional(),
463
273
  // The host capability's id, when this machine is also a connected device. Absent otherwise.
464
274
  hostId: z.string().optional(),
465
- // Host-capability liveness. Absent when there is no host capability, which is NOT the same as offline.
275
+ // Host-capability liveness; absent when there is no host capability, not the same as offline.
466
276
  online: z.boolean().optional(),
467
- /* WHAT THE DEVICE IS, as distinct from how it is reachable, the half a row used to leave out entirely,
468
- * so a Windows laptop and a Linux desktop were two identical lines of text with different names on them.
469
- *
470
- * It is carried BESIDE the report rather than inside it because the rows that need it most are the ones with
471
- * no report: a connected device with no sync agent, or one that is asleep, still knows its own OS. Nothing
472
- * here depends on an agent being installed, and the daemon has held all of it since the machine connected.
473
- *
474
- * `platform` is the slug this side classifies the machine by, the host capability's own card ("windows",
475
- * "linux"), or the platform token a sync report carries, normalised to the same words. `facts` is the
476
- * machine's connect-time description of ITSELF, which is what says which Windows and which shell. */
277
+ // Carried beside the report so a device with no report still has an OS; `platform` is the normalised slug, `facts`
278
+ // its connect-time self-description.
477
279
  platform: z.string().optional(),
478
280
  facts: HostFactsSchema.optional(),
479
- /* The agent version the socket ANNOUNCED at connect, and when the device last held one: how a connected
480
- * device AGES. An old agent explains a row that lacks something newer devices have, and "last seen" is the
481
- * one honest thing an offline row can still say about itself.
482
- *
483
- * It is the same number as `report.agent.build` whenever both are known — one resident process stamps its
484
- * `MACHINE_VERSION` into the pidfile and sends it in the hello frame — and it is kept because it is the
485
- * ONLY version a row with no report has: a device whose "Run commands" switch is off, or which has no
486
- * agent to answer `status --json`, still told us what it was when it dialled. That is what stops the
487
- * Devices view's agent chip going blank on exactly the rows that need explaining. */
281
+ // Announced at connect; matches `report.agent.build` when known, the only version a report-less device has.
488
282
  agentVersion: z.string().optional(),
489
283
  lastSeen: z.number().optional(),
490
284
  report: DeviceReportSchema.optional(),
@@ -492,23 +286,11 @@ export const DeviceSchema = z.object({
492
286
  });
493
287
  export type Device = z.infer<typeof DeviceSchema>;
494
288
  export const DevicesListSchema = z.object({ devices: z.array(DeviceSchema) });
495
- /* GET /system/sync: what desktop sync is doing for this sandbox, WITHOUT naming any one machine as the answer.
496
- *
497
- * It used to carry `syncingFrom` + `syncSeenAt` + `mirroredBy`, which is the enrollment list flattened into one
498
- * holder and a list of everybody else — the shape a card that believed a sandbox has A desktop sync needed, and
499
- * the reason that card kept restating facts the Devices list beside it already had per machine. Every one of
500
- * those now rides on the machine's own row (DeviceSync), where a reader can act on it.
501
- *
502
- * What is left is what is genuinely about the SANDBOX rather than about any device: whether sync is possible
503
- * here at all, whether anything at all is enrolled, and the raw reports, which is the cheap ambient read the
504
- * rail's badge lives on (it must never fan out to somebody's laptop just to decide whether to draw a chip). */
289
+ // GET /system/sync: sandbox-level facts only, whether sync is possible, whether anything is enrolled, and raw device
290
+ // reports. Cheap: the sidebar badge reads this and must never fan out to a device.
505
291
  export const SyncStatusSchema = z.object({
506
292
  enrolled: z.boolean(),
507
- /* Whether this sandbox can do desktop sync at all. It used to be the SSH hostname the laptop would dial, and
508
- * its absence meant "this sandbox's reachability can't carry SSH", true of every sandbox on the platform's
509
- * own fabric, which is what made sync fail on the default path. The transport rides the daemon's own HTTPS
510
- * surface now, so a sandbox that can answer this read can also sync. Kept as a field rather than assumed,
511
- * because the card branches on it and a daemon too old to say is one that should not be offered sync. */
293
+ // Whether this sandbox can do desktop sync at all; absent means a daemon too old to say, so don't offer it.
512
294
  available: z.boolean().optional(),
513
295
  machines: z.array(DeviceReportSchema).optional(),
514
296
  });