@intentic/sandbox-contract 1.248.0 → 1.250.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (879) hide show
  1. package/README.md +18 -15
  2. package/dist/chores/chores.d.ts.map +1 -1
  3. package/dist/chores/chores.js.map +1 -1
  4. package/dist/chores/digest.d.ts.map +1 -1
  5. package/dist/chores/digest.js.map +1 -1
  6. package/dist/chores/extension-update.d.ts.map +1 -1
  7. package/dist/chores/extension-update.js.map +1 -1
  8. package/dist/chores/fix-deps.d.ts.map +1 -1
  9. package/dist/chores/fix-deps.js.map +1 -1
  10. package/dist/chores/index.d.ts +2 -2
  11. package/dist/chores/index.d.ts.map +1 -1
  12. package/dist/chores/index.js +1 -1
  13. package/dist/chores/index.js.map +1 -1
  14. package/dist/chores/probes.d.ts.map +1 -1
  15. package/dist/chores/probes.js.map +1 -1
  16. package/dist/chores/prompt.d.ts.map +1 -1
  17. package/dist/chores/prompt.js.map +1 -1
  18. package/dist/chores/stack.d.ts.map +1 -1
  19. package/dist/chores/stack.js.map +1 -1
  20. package/dist/chores/verdict.d.ts +7 -1
  21. package/dist/chores/verdict.d.ts.map +1 -1
  22. package/dist/chores/verdict.js +8 -0
  23. package/dist/chores/verdict.js.map +1 -1
  24. package/dist/contracts/accounts.contract.d.ts.map +1 -1
  25. package/dist/contracts/accounts.contract.js.map +1 -1
  26. package/dist/contracts/activity.contract.d.ts +1 -0
  27. package/dist/contracts/activity.contract.d.ts.map +1 -1
  28. package/dist/contracts/agent.contract.d.ts +12 -205
  29. package/dist/contracts/agent.contract.d.ts.map +1 -1
  30. package/dist/contracts/agent.contract.js +2 -1
  31. package/dist/contracts/agent.contract.js.map +1 -1
  32. package/dist/contracts/agents.contract.d.ts +228 -54
  33. package/dist/contracts/agents.contract.d.ts.map +1 -1
  34. package/dist/contracts/agents.contract.js +11 -2
  35. package/dist/contracts/agents.contract.js.map +1 -1
  36. package/dist/contracts/automations.contract.d.ts +35 -17
  37. package/dist/contracts/automations.contract.d.ts.map +1 -1
  38. package/dist/contracts/automations.contract.js +10 -1
  39. package/dist/contracts/automations.contract.js.map +1 -1
  40. package/dist/contracts/capabilities.contract.d.ts +0 -12
  41. package/dist/contracts/capabilities.contract.d.ts.map +1 -1
  42. package/dist/contracts/capabilities.contract.js +1 -1
  43. package/dist/contracts/capabilities.contract.js.map +1 -1
  44. package/dist/contracts/chores.contract.d.ts.map +1 -1
  45. package/dist/contracts/chores.contract.js.map +1 -1
  46. package/dist/contracts/ci.contract.d.ts +9 -0
  47. package/dist/contracts/ci.contract.d.ts.map +1 -1
  48. package/dist/contracts/endpoints.contract.d.ts.map +1 -1
  49. package/dist/contracts/endpoints.contract.js.map +1 -1
  50. package/dist/contracts/exit.contract.d.ts.map +1 -1
  51. package/dist/contracts/exit.contract.js +1 -1
  52. package/dist/contracts/exit.contract.js.map +1 -1
  53. package/dist/contracts/extensions.contract.d.ts.map +1 -1
  54. package/dist/contracts/extensions.contract.js.map +1 -1
  55. package/dist/contracts/git.contract.d.ts +45 -6
  56. package/dist/contracts/git.contract.d.ts.map +1 -1
  57. package/dist/contracts/git.contract.js +9 -9
  58. package/dist/contracts/git.contract.js.map +1 -1
  59. package/dist/contracts/host.contract.d.ts +2 -0
  60. package/dist/contracts/host.contract.d.ts.map +1 -1
  61. package/dist/contracts/host.contract.js.map +1 -1
  62. package/dist/contracts/intentic.contract.js +1 -1
  63. package/dist/contracts/intentic.contract.js.map +1 -1
  64. package/dist/contracts/logs.contract.d.ts.map +1 -1
  65. package/dist/contracts/logs.contract.js.map +1 -1
  66. package/dist/contracts/loops.contract.d.ts.map +1 -1
  67. package/dist/contracts/loops.contract.js.map +1 -1
  68. package/dist/contracts/personas.contract.d.ts +1 -0
  69. package/dist/contracts/personas.contract.d.ts.map +1 -1
  70. package/dist/contracts/personas.contract.js +1 -1
  71. package/dist/contracts/personas.contract.js.map +1 -1
  72. package/dist/contracts/providers.contract.d.ts.map +1 -1
  73. package/dist/contracts/providers.contract.js.map +1 -1
  74. package/dist/contracts/runner.contract.d.ts +97 -171
  75. package/dist/contracts/runner.contract.d.ts.map +1 -1
  76. package/dist/contracts/runner.contract.js +2 -2
  77. package/dist/contracts/runner.contract.js.map +1 -1
  78. package/dist/contracts/safety.contract.d.ts.map +1 -1
  79. package/dist/contracts/safety.contract.js +1 -1
  80. package/dist/contracts/safety.contract.js.map +1 -1
  81. package/dist/contracts/secrets.contract.d.ts.map +1 -1
  82. package/dist/contracts/secrets.contract.js.map +1 -1
  83. package/dist/contracts/sessions.contract.d.ts +2 -41
  84. package/dist/contracts/sessions.contract.d.ts.map +1 -1
  85. package/dist/contracts/sessions.contract.js +1 -1
  86. package/dist/contracts/sessions.contract.js.map +1 -1
  87. package/dist/contracts/settings.contract.d.ts +8 -18
  88. package/dist/contracts/settings.contract.d.ts.map +1 -1
  89. package/dist/contracts/settings.contract.js.map +1 -1
  90. package/dist/contracts/share.contract.d.ts.map +1 -1
  91. package/dist/contracts/share.contract.js.map +1 -1
  92. package/dist/contracts/skills.contract.d.ts +6 -0
  93. package/dist/contracts/skills.contract.d.ts.map +1 -1
  94. package/dist/contracts/skills.contract.js +13 -4
  95. package/dist/contracts/skills.contract.js.map +1 -1
  96. package/dist/contracts/system.contract.d.ts +49 -73
  97. package/dist/contracts/system.contract.d.ts.map +1 -1
  98. package/dist/contracts/system.contract.js +12 -2
  99. package/dist/contracts/system.contract.js.map +1 -1
  100. package/dist/contracts/usage.contract.d.ts.map +1 -1
  101. package/dist/contracts/usage.contract.js.map +1 -1
  102. package/dist/contracts/vpn.contract.d.ts.map +1 -1
  103. package/dist/contracts/vpn.contract.js +1 -1
  104. package/dist/contracts/vpn.contract.js.map +1 -1
  105. package/dist/contracts/webext.contract.d.ts.map +1 -1
  106. package/dist/contracts/webext.contract.js.map +1 -1
  107. package/dist/contracts/workflows.contract.d.ts +7 -6
  108. package/dist/contracts/workflows.contract.d.ts.map +1 -1
  109. package/dist/contracts/workflows.contract.js +12 -3
  110. package/dist/contracts/workflows.contract.js.map +1 -1
  111. package/dist/contracts/workspace.contract.d.ts.map +1 -1
  112. package/dist/contracts/workspace.contract.js.map +1 -1
  113. package/dist/events/agent-events.d.ts +1237 -0
  114. package/dist/events/agent-events.d.ts.map +1 -0
  115. package/dist/events/agent-events.js +226 -0
  116. package/dist/events/agent-events.js.map +1 -0
  117. package/dist/events/cards.d.ts +404 -0
  118. package/dist/events/cards.d.ts.map +1 -0
  119. package/dist/events/cards.js +179 -0
  120. package/dist/events/cards.js.map +1 -0
  121. package/dist/events/resume.d.ts +23 -0
  122. package/dist/events/resume.d.ts.map +1 -0
  123. package/dist/events/resume.js +31 -0
  124. package/dist/events/resume.js.map +1 -0
  125. package/dist/events/system-events.d.ts +615 -0
  126. package/dist/events/system-events.d.ts.map +1 -0
  127. package/dist/events/system-events.js +64 -0
  128. package/dist/events/system-events.js.map +1 -0
  129. package/dist/events/transcript.d.ts +1755 -0
  130. package/dist/events/transcript.d.ts.map +1 -0
  131. package/dist/events/transcript.js +205 -0
  132. package/dist/events/transcript.js.map +1 -0
  133. package/dist/ids/conversation-ids.d.ts +8 -0
  134. package/dist/ids/conversation-ids.d.ts.map +1 -0
  135. package/dist/{conversation-ids.js → ids/conversation-ids.js} +13 -0
  136. package/dist/ids/conversation-ids.js.map +1 -0
  137. package/dist/ids/hostnames.d.ts.map +1 -0
  138. package/dist/ids/hostnames.js.map +1 -0
  139. package/dist/ids/session-names.d.ts.map +1 -0
  140. package/dist/ids/session-names.js.map +1 -0
  141. package/dist/ids/share-paths.d.ts.map +1 -0
  142. package/dist/ids/share-paths.js.map +1 -0
  143. package/dist/{tunnel-ids.d.ts → ids/tunnel-ids.d.ts} +1 -0
  144. package/dist/ids/tunnel-ids.d.ts.map +1 -0
  145. package/dist/{tunnel-ids.js → ids/tunnel-ids.js} +1 -0
  146. package/dist/ids/tunnel-ids.js.map +1 -0
  147. package/dist/index.d.ts +429 -450
  148. package/dist/index.d.ts.map +1 -1
  149. package/dist/index.js +54 -46
  150. package/dist/index.js.map +1 -1
  151. package/dist/{agent-catalog.d.ts → models/agent-catalog.d.ts} +2 -2
  152. package/dist/models/agent-catalog.d.ts.map +1 -0
  153. package/dist/models/agent-catalog.js.map +1 -0
  154. package/dist/models/agent-runtimes.d.ts.map +1 -0
  155. package/dist/models/agent-runtimes.js.map +1 -0
  156. package/dist/{fast-tier.d.ts → models/fast-tier.d.ts} +1 -1
  157. package/dist/models/fast-tier.d.ts.map +1 -0
  158. package/dist/models/fast-tier.js.map +1 -0
  159. package/dist/models/model-order.d.ts.map +1 -0
  160. package/dist/{model-order.js → models/model-order.js} +2 -0
  161. package/dist/models/model-order.js.map +1 -0
  162. package/dist/{model-pins.d.ts → models/model-pins.d.ts} +1 -1
  163. package/dist/models/model-pins.d.ts.map +1 -0
  164. package/dist/models/model-pins.js.map +1 -0
  165. package/dist/{model-roles.d.ts → models/model-roles.d.ts} +0 -33
  166. package/dist/models/model-roles.d.ts.map +1 -0
  167. package/dist/{model-roles.js → models/model-roles.js} +0 -35
  168. package/dist/models/model-roles.js.map +1 -0
  169. package/dist/{plan-pools.d.ts → models/plan-pools.d.ts} +1 -1
  170. package/dist/models/plan-pools.d.ts.map +1 -0
  171. package/dist/models/plan-pools.js.map +1 -0
  172. package/dist/models/prompt-complexity.d.ts.map +1 -0
  173. package/dist/models/prompt-complexity.js.map +1 -0
  174. package/dist/models/provider-specs.d.ts.map +1 -0
  175. package/dist/models/provider-specs.js.map +1 -0
  176. package/dist/policy/approvals-execution.d.ts.map +1 -0
  177. package/dist/policy/approvals-execution.js.map +1 -0
  178. package/dist/{batch-runs.d.ts → policy/batch-runs.d.ts} +5 -1
  179. package/dist/policy/batch-runs.d.ts.map +1 -0
  180. package/dist/{batch-runs.js → policy/batch-runs.js} +10 -7
  181. package/dist/policy/batch-runs.js.map +1 -0
  182. package/dist/policy/capability-env.d.ts.map +1 -0
  183. package/dist/policy/capability-env.js.map +1 -0
  184. package/dist/policy/capability-secrets.d.ts.map +1 -0
  185. package/dist/policy/capability-secrets.js.map +1 -0
  186. package/dist/{card-status.d.ts → policy/card-status.d.ts} +2 -2
  187. package/dist/policy/card-status.d.ts.map +1 -0
  188. package/dist/{card-status.js → policy/card-status.js} +1 -5
  189. package/dist/policy/card-status.js.map +1 -0
  190. package/dist/{command-classes.d.ts → policy/command-classes.d.ts} +6 -2
  191. package/dist/policy/command-classes.d.ts.map +1 -0
  192. package/dist/{command-classes.js → policy/command-classes.js} +48 -11
  193. package/dist/policy/command-classes.js.map +1 -0
  194. package/dist/{command-run.d.ts → policy/command-run.d.ts} +1 -1
  195. package/dist/policy/command-run.d.ts.map +1 -0
  196. package/dist/policy/command-run.js.map +1 -0
  197. package/dist/policy/control-scopes.d.ts +16 -0
  198. package/dist/policy/control-scopes.d.ts.map +1 -0
  199. package/dist/policy/control-scopes.js +26 -0
  200. package/dist/policy/control-scopes.js.map +1 -0
  201. package/dist/policy/credential-material.d.ts.map +1 -0
  202. package/dist/policy/credential-material.js.map +1 -0
  203. package/dist/policy/needs-action.d.ts.map +1 -0
  204. package/dist/policy/needs-action.js.map +1 -0
  205. package/dist/policy/output-fields.d.ts.map +1 -0
  206. package/dist/policy/output-fields.js.map +1 -0
  207. package/dist/policy/overlay-lint.d.ts.map +1 -0
  208. package/dist/policy/overlay-lint.js.map +1 -0
  209. package/dist/policy/owner-ticket.d.ts.map +1 -0
  210. package/dist/{owner-ticket.js → policy/owner-ticket.js} +1 -1
  211. package/dist/policy/owner-ticket.js.map +1 -0
  212. package/dist/{safety-policy.d.ts → policy/safety-policy.d.ts} +6 -5
  213. package/dist/policy/safety-policy.d.ts.map +1 -0
  214. package/dist/{safety-policy.js → policy/safety-policy.js} +12 -12
  215. package/dist/policy/safety-policy.js.map +1 -0
  216. package/dist/policy/search-globs.d.ts.map +1 -0
  217. package/dist/policy/search-globs.js.map +1 -0
  218. package/dist/protocol/container-requirements.d.ts +20 -0
  219. package/dist/protocol/container-requirements.d.ts.map +1 -0
  220. package/dist/protocol/container-requirements.js +23 -0
  221. package/dist/protocol/container-requirements.js.map +1 -0
  222. package/dist/{host-protocol.d.ts → protocol/host-protocol.d.ts} +1 -0
  223. package/dist/protocol/host-protocol.d.ts.map +1 -0
  224. package/dist/{host-protocol.js → protocol/host-protocol.js} +1 -0
  225. package/dist/protocol/host-protocol.js.map +1 -0
  226. package/dist/protocol/ingress-contract.d.ts.map +1 -0
  227. package/dist/{ingress-contract.js → protocol/ingress-contract.js} +1 -1
  228. package/dist/protocol/ingress-contract.js.map +1 -0
  229. package/dist/protocol/ingress-protocol.d.ts.map +1 -0
  230. package/dist/protocol/ingress-protocol.js.map +1 -0
  231. package/dist/protocol/listener-protocol.d.ts.map +1 -0
  232. package/dist/{listener-protocol.js → protocol/listener-protocol.js} +1 -1
  233. package/dist/protocol/listener-protocol.js.map +1 -0
  234. package/dist/{peer-dial.d.ts → protocol/peer-dial.d.ts} +4 -1
  235. package/dist/protocol/peer-dial.d.ts.map +1 -0
  236. package/dist/{peer-dial.js → protocol/peer-dial.js} +51 -10
  237. package/dist/protocol/peer-dial.js.map +1 -0
  238. package/dist/protocol/peer-mcp-server.d.ts.map +1 -0
  239. package/dist/protocol/peer-mcp-server.js.map +1 -0
  240. package/dist/protocol/request-id.d.ts.map +1 -0
  241. package/dist/protocol/request-id.js.map +1 -0
  242. package/dist/protocol/routes.d.ts.map +1 -0
  243. package/dist/protocol/routes.js.map +1 -0
  244. package/dist/{runner-protocol.d.ts → protocol/runner-protocol.d.ts} +1 -0
  245. package/dist/protocol/runner-protocol.d.ts.map +1 -0
  246. package/dist/{runner-protocol.js → protocol/runner-protocol.js} +2 -1
  247. package/dist/protocol/runner-protocol.js.map +1 -0
  248. package/dist/protocol/sse.d.ts.map +1 -0
  249. package/dist/protocol/sse.js.map +1 -0
  250. package/dist/{terminal-protocol.d.ts → protocol/terminal-protocol.d.ts} +1 -3
  251. package/dist/protocol/terminal-protocol.d.ts.map +1 -0
  252. package/dist/protocol/terminal-protocol.js.map +1 -0
  253. package/dist/protocol/webext-links.d.ts.map +1 -0
  254. package/dist/protocol/webext-links.js.map +1 -0
  255. package/dist/{webext-protocol.d.ts → protocol/webext-protocol.d.ts} +1 -0
  256. package/dist/protocol/webext-protocol.d.ts.map +1 -0
  257. package/dist/{webext-protocol.js → protocol/webext-protocol.js} +1 -0
  258. package/dist/protocol/webext-protocol.js.map +1 -0
  259. package/dist/schemas/activity.d.ts +2 -0
  260. package/dist/schemas/activity.d.ts.map +1 -1
  261. package/dist/schemas/activity.js +4 -0
  262. package/dist/schemas/activity.js.map +1 -1
  263. package/dist/schemas/agent.d.ts +16 -4
  264. package/dist/schemas/agent.d.ts.map +1 -1
  265. package/dist/schemas/agent.js +21 -4
  266. package/dist/schemas/agent.js.map +1 -1
  267. package/dist/schemas/agents.d.ts +17 -4
  268. package/dist/schemas/agents.d.ts.map +1 -1
  269. package/dist/schemas/agents.js +15 -4
  270. package/dist/schemas/agents.js.map +1 -1
  271. package/dist/schemas/approvals.d.ts.map +1 -1
  272. package/dist/schemas/approvals.js.map +1 -1
  273. package/dist/schemas/automations.d.ts +54 -28
  274. package/dist/schemas/automations.d.ts.map +1 -1
  275. package/dist/schemas/automations.js +26 -8
  276. package/dist/schemas/automations.js.map +1 -1
  277. package/dist/schemas/capabilities.d.ts +0 -8
  278. package/dist/schemas/capabilities.d.ts.map +1 -1
  279. package/dist/schemas/capabilities.js +0 -4
  280. package/dist/schemas/capabilities.js.map +1 -1
  281. package/dist/schemas/ci.d.ts +10 -0
  282. package/dist/schemas/ci.d.ts.map +1 -1
  283. package/dist/schemas/ci.js +9 -1
  284. package/dist/schemas/ci.js.map +1 -1
  285. package/dist/schemas/codebase-health.d.ts.map +1 -1
  286. package/dist/schemas/codebase-health.js.map +1 -1
  287. package/dist/schemas/devices.d.ts +92 -0
  288. package/dist/schemas/devices.d.ts.map +1 -1
  289. package/dist/schemas/devices.js +12 -1
  290. package/dist/schemas/devices.js.map +1 -1
  291. package/dist/schemas/engines.d.ts.map +1 -1
  292. package/dist/schemas/engines.js.map +1 -1
  293. package/dist/schemas/environment.d.ts.map +1 -1
  294. package/dist/schemas/environment.js.map +1 -1
  295. package/dist/schemas/exit.d.ts.map +1 -1
  296. package/dist/schemas/exit.js.map +1 -1
  297. package/dist/schemas/extension-updates.d.ts.map +1 -1
  298. package/dist/schemas/extension-updates.js.map +1 -1
  299. package/dist/schemas/git-history.d.ts.map +1 -1
  300. package/dist/schemas/git-history.js.map +1 -1
  301. package/dist/schemas/git.d.ts +80 -16
  302. package/dist/schemas/git.d.ts.map +1 -1
  303. package/dist/schemas/git.js +37 -25
  304. package/dist/schemas/git.js.map +1 -1
  305. package/dist/schemas/history.d.ts.map +1 -1
  306. package/dist/schemas/history.js.map +1 -1
  307. package/dist/schemas/hosts.d.ts.map +1 -1
  308. package/dist/schemas/hosts.js.map +1 -1
  309. package/dist/schemas/inventory.d.ts.map +1 -1
  310. package/dist/schemas/inventory.js.map +1 -1
  311. package/dist/schemas/issues.d.ts +0 -1
  312. package/dist/schemas/issues.d.ts.map +1 -1
  313. package/dist/schemas/issues.js +0 -1
  314. package/dist/schemas/issues.js.map +1 -1
  315. package/dist/schemas/logs.d.ts.map +1 -1
  316. package/dist/schemas/logs.js.map +1 -1
  317. package/dist/schemas/loops.d.ts.map +1 -1
  318. package/dist/schemas/loops.js +1 -1
  319. package/dist/schemas/loops.js.map +1 -1
  320. package/dist/schemas/maintenance.d.ts.map +1 -1
  321. package/dist/schemas/maintenance.js.map +1 -1
  322. package/dist/schemas/marketplace.d.ts +0 -4
  323. package/dist/schemas/marketplace.d.ts.map +1 -1
  324. package/dist/schemas/panels.d.ts.map +1 -1
  325. package/dist/schemas/panels.js.map +1 -1
  326. package/dist/schemas/personas.d.ts +2 -1
  327. package/dist/schemas/personas.d.ts.map +1 -1
  328. package/dist/schemas/personas.js +6 -2
  329. package/dist/schemas/personas.js.map +1 -1
  330. package/dist/schemas/plan-limits.d.ts +2 -4
  331. package/dist/schemas/plan-limits.d.ts.map +1 -1
  332. package/dist/schemas/plan-limits.js +5 -8
  333. package/dist/schemas/plan-limits.js.map +1 -1
  334. package/dist/schemas/ports.d.ts.map +1 -1
  335. package/dist/schemas/ports.js.map +1 -1
  336. package/dist/schemas/provider-oauth.d.ts.map +1 -1
  337. package/dist/schemas/provider-oauth.js.map +1 -1
  338. package/dist/schemas/provider-subscriptions.d.ts +1 -1
  339. package/dist/schemas/provider-subscriptions.d.ts.map +1 -1
  340. package/dist/schemas/provider-subscriptions.js +1 -1
  341. package/dist/schemas/provider-subscriptions.js.map +1 -1
  342. package/dist/schemas/public.d.ts.map +1 -1
  343. package/dist/schemas/public.js.map +1 -1
  344. package/dist/schemas/push.d.ts.map +1 -1
  345. package/dist/schemas/push.js.map +1 -1
  346. package/dist/schemas/secrets.d.ts.map +1 -1
  347. package/dist/schemas/secrets.js.map +1 -1
  348. package/dist/schemas/settings.d.ts +11 -9
  349. package/dist/schemas/settings.d.ts.map +1 -1
  350. package/dist/schemas/settings.js +22 -7
  351. package/dist/schemas/settings.js.map +1 -1
  352. package/dist/schemas/share.d.ts.map +1 -1
  353. package/dist/schemas/share.js.map +1 -1
  354. package/dist/schemas/shared.d.ts +4 -0
  355. package/dist/schemas/shared.d.ts.map +1 -1
  356. package/dist/schemas/shared.js +3 -0
  357. package/dist/schemas/shared.js.map +1 -1
  358. package/dist/schemas/system.d.ts +6 -0
  359. package/dist/schemas/system.d.ts.map +1 -1
  360. package/dist/schemas/system.js +10 -0
  361. package/dist/schemas/system.js.map +1 -1
  362. package/dist/schemas/terminal.d.ts.map +1 -1
  363. package/dist/schemas/terminal.js.map +1 -1
  364. package/dist/schemas/usage.d.ts.map +1 -1
  365. package/dist/schemas/usage.js.map +1 -1
  366. package/dist/schemas/vpn.d.ts.map +1 -1
  367. package/dist/schemas/vpn.js.map +1 -1
  368. package/dist/schemas/webext.d.ts.map +1 -1
  369. package/dist/schemas/webext.js.map +1 -1
  370. package/dist/schemas/workflows.d.ts +66 -9
  371. package/dist/schemas/workflows.d.ts.map +1 -1
  372. package/dist/schemas/workflows.js +6 -5
  373. package/dist/schemas/workflows.js.map +1 -1
  374. package/dist/schemas/workspace-repos.d.ts.map +1 -1
  375. package/dist/schemas/workspace-repos.js.map +1 -1
  376. package/dist/schemas/workspace-search.d.ts.map +1 -1
  377. package/dist/schemas/workspace-search.js.map +1 -1
  378. package/dist/schemas/workspace-setup.d.ts.map +1 -1
  379. package/dist/schemas/workspace-setup.js.map +1 -1
  380. package/dist/schemas/workspace-tree.d.ts.map +1 -1
  381. package/dist/schemas/workspace-tree.js.map +1 -1
  382. package/dist/state/arrival.d.ts.map +1 -0
  383. package/dist/{arrival.js → state/arrival.js} +1 -1
  384. package/dist/state/arrival.js.map +1 -0
  385. package/dist/state/contract-lock.d.ts.map +1 -0
  386. package/dist/{contract-lock.js → state/contract-lock.js} +1 -1
  387. package/dist/state/contract-lock.js.map +1 -0
  388. package/dist/{definition.d.ts → state/definition.d.ts} +21 -17
  389. package/dist/state/definition.d.ts.map +1 -0
  390. package/dist/{definition.js → state/definition.js} +4 -4
  391. package/dist/state/definition.js.map +1 -0
  392. package/dist/state/history-state.d.ts.map +1 -0
  393. package/dist/{history-state.js → state/history-state.js} +1 -0
  394. package/dist/state/history-state.js.map +1 -0
  395. package/dist/state/runtime-state.d.ts.map +1 -0
  396. package/dist/state/runtime-state.js.map +1 -0
  397. package/dist/state/starter.d.ts.map +1 -0
  398. package/dist/state/starter.js.map +1 -0
  399. package/dist/state/state-portability.d.ts.map +1 -0
  400. package/dist/state/state-portability.js.map +1 -0
  401. package/dist/state/versions.d.ts.map +1 -0
  402. package/dist/state/versions.js.map +1 -0
  403. package/dist/{workspace-state.d.ts → state/workspace-state.d.ts} +8 -0
  404. package/dist/state/workspace-state.d.ts.map +1 -0
  405. package/dist/{workspace-state.js → state/workspace-state.js} +25 -0
  406. package/dist/state/workspace-state.js.map +1 -0
  407. package/dist/{documents.d.ts → text/documents.d.ts} +1 -1
  408. package/dist/text/documents.d.ts.map +1 -0
  409. package/dist/{documents.js → text/documents.js} +1 -1
  410. package/dist/text/documents.js.map +1 -0
  411. package/dist/text/embed.d.ts.map +1 -0
  412. package/dist/text/embed.js.map +1 -0
  413. package/dist/text/mentions.d.ts.map +1 -0
  414. package/dist/text/mentions.js.map +1 -0
  415. package/dist/text/model-answer.d.ts +3 -0
  416. package/dist/text/model-answer.d.ts.map +1 -0
  417. package/dist/text/model-answer.js +3 -0
  418. package/dist/text/model-answer.js.map +1 -0
  419. package/dist/text/path-refs.d.ts.map +1 -0
  420. package/dist/text/path-refs.js.map +1 -0
  421. package/dist/{shell-regions.d.ts → text/shell-regions.d.ts} +1 -1
  422. package/dist/text/shell-regions.d.ts.map +1 -0
  423. package/dist/text/shell-regions.js.map +1 -0
  424. package/dist/text/title.d.ts.map +1 -0
  425. package/dist/text/title.js.map +1 -0
  426. package/dist/{transcript-fold.d.ts → text/transcript-fold.d.ts} +2 -1
  427. package/dist/text/transcript-fold.d.ts.map +1 -0
  428. package/dist/{transcript-fold.js → text/transcript-fold.js} +2 -16
  429. package/dist/text/transcript-fold.js.map +1 -0
  430. package/dist/text/whisper.d.ts +3 -0
  431. package/dist/text/whisper.d.ts.map +1 -0
  432. package/dist/text/whisper.js +11 -0
  433. package/dist/text/whisper.js.map +1 -0
  434. package/dist/{workflow-faults.d.ts → text/workflow-faults.d.ts} +1 -1
  435. package/dist/text/workflow-faults.d.ts.map +1 -0
  436. package/dist/{workflow-faults.js → text/workflow-faults.js} +1 -1
  437. package/dist/text/workflow-faults.js.map +1 -0
  438. package/package.json +70 -70
  439. package/src/chores/chores.test.ts +4 -10
  440. package/src/chores/chores.ts +148 -392
  441. package/src/chores/digest.ts +8 -28
  442. package/src/chores/extension-update.ts +3 -8
  443. package/src/chores/fix-deps.ts +4 -18
  444. package/src/chores/index.ts +2 -2
  445. package/src/chores/probes.test.ts +7 -43
  446. package/src/chores/probes.ts +62 -167
  447. package/src/chores/prompt.ts +10 -34
  448. package/src/chores/stack.test.ts +6 -45
  449. package/src/chores/stack.ts +27 -118
  450. package/src/chores/verdict.test.ts +101 -80
  451. package/src/chores/verdict.ts +54 -99
  452. package/src/contracts/accounts.contract.ts +4 -19
  453. package/src/contracts/agent.contract.ts +7 -22
  454. package/src/contracts/agents.contract.ts +25 -71
  455. package/src/contracts/automations.contract.ts +14 -30
  456. package/src/contracts/capabilities.contract.ts +8 -35
  457. package/src/contracts/chores.contract.ts +4 -15
  458. package/src/contracts/endpoints.contract.ts +5 -22
  459. package/src/contracts/exit.contract.ts +7 -30
  460. package/src/contracts/extensions.contract.ts +8 -30
  461. package/src/contracts/git.contract.ts +25 -49
  462. package/src/contracts/host.contract.ts +9 -44
  463. package/src/contracts/intentic.contract.ts +1 -1
  464. package/src/contracts/logs.contract.ts +3 -13
  465. package/src/contracts/loops.contract.ts +9 -40
  466. package/src/contracts/personas.contract.ts +10 -35
  467. package/src/contracts/providers.contract.ts +4 -17
  468. package/src/contracts/runner.contract.ts +12 -39
  469. package/src/contracts/safety.contract.ts +5 -14
  470. package/src/contracts/secrets.contract.ts +4 -22
  471. package/src/contracts/sessions.contract.ts +1 -1
  472. package/src/contracts/settings.contract.ts +4 -10
  473. package/src/contracts/share.contract.ts +3 -9
  474. package/src/contracts/skills.contract.ts +21 -19
  475. package/src/contracts/system.contract.ts +26 -52
  476. package/src/contracts/usage.contract.ts +7 -21
  477. package/src/contracts/vpn.contract.ts +9 -16
  478. package/src/contracts/webext.contract.ts +9 -25
  479. package/src/contracts/workflows.contract.ts +34 -58
  480. package/src/contracts/workspace.contract.ts +19 -50
  481. package/src/events/agent-events.ts +345 -0
  482. package/src/events/cards.ts +286 -0
  483. package/src/{events.test.ts → events/resume.test.ts} +4 -19
  484. package/src/events/resume.ts +60 -0
  485. package/src/events/system-events.ts +139 -0
  486. package/src/events/transcript.ts +320 -0
  487. package/src/{conversation-ids.test.ts → ids/conversation-ids.test.ts} +25 -13
  488. package/src/ids/conversation-ids.ts +178 -0
  489. package/src/ids/hostnames.ts +129 -0
  490. package/src/ids/session-names.ts +29 -0
  491. package/src/ids/share-paths.ts +43 -0
  492. package/src/{tunnel-ids.test.ts → ids/tunnel-ids.test.ts} +1 -14
  493. package/src/ids/tunnel-ids.ts +29 -0
  494. package/src/index.ts +71 -87
  495. package/src/{agent-catalog.test.ts → models/agent-catalog.test.ts} +19 -93
  496. package/src/models/agent-catalog.ts +174 -0
  497. package/src/models/agent-runtimes.ts +201 -0
  498. package/src/models/capability-ledger.test.ts +84 -0
  499. package/src/{fast-tier.test.ts → models/fast-tier.test.ts} +7 -18
  500. package/src/models/fast-tier.ts +36 -0
  501. package/src/{model-order.test.ts → models/model-order.test.ts} +54 -40
  502. package/src/models/model-order.ts +171 -0
  503. package/src/{model-pins.test.ts → models/model-pins.test.ts} +12 -46
  504. package/src/models/model-pins.ts +57 -0
  505. package/src/models/model-roles.test.ts +38 -0
  506. package/src/models/model-roles.ts +180 -0
  507. package/src/{plan-pools.test.ts → models/plan-pools.test.ts} +6 -11
  508. package/src/models/plan-pools.ts +65 -0
  509. package/src/{prompt-complexity.test.ts → models/prompt-complexity.test.ts} +8 -60
  510. package/src/models/prompt-complexity.ts +215 -0
  511. package/src/{provider-specs.test.ts → models/provider-specs.test.ts} +18 -47
  512. package/src/models/provider-specs.ts +272 -0
  513. package/src/policy/approvals-execution.ts +58 -0
  514. package/src/{batch-runs.test.ts → policy/batch-runs.test.ts} +4 -20
  515. package/src/policy/batch-runs.ts +137 -0
  516. package/src/policy/capability-secrets.ts +5 -0
  517. package/src/{card-status.ts → policy/card-status.ts} +11 -26
  518. package/src/{command-classes.test.ts → policy/command-classes.test.ts} +11 -118
  519. package/src/policy/command-classes.ts +395 -0
  520. package/src/policy/command-run.ts +65 -0
  521. package/src/policy/control-scopes.ts +38 -0
  522. package/src/{credential-material.test.ts → policy/credential-material.test.ts} +4 -26
  523. package/src/policy/credential-material.ts +91 -0
  524. package/src/policy/needs-action.ts +5 -0
  525. package/src/policy/output-fields.ts +86 -0
  526. package/src/policy/overlay-lint.ts +100 -0
  527. package/src/{owner-ticket.test.ts → policy/owner-ticket.test.ts} +1 -1
  528. package/src/{owner-ticket.ts → policy/owner-ticket.ts} +9 -31
  529. package/src/policy/safety-policy.test.ts +84 -0
  530. package/src/policy/safety-policy.ts +142 -0
  531. package/src/policy/search-globs.ts +60 -0
  532. package/src/protocol/container-requirements.test.ts +72 -0
  533. package/src/protocol/container-requirements.ts +58 -0
  534. package/src/protocol/host-protocol.ts +29 -0
  535. package/src/protocol/ingress-contract.ts +103 -0
  536. package/src/{ingress-protocol.test.ts → protocol/ingress-protocol.test.ts} +25 -90
  537. package/src/protocol/ingress-protocol.ts +441 -0
  538. package/src/protocol/listener-protocol.ts +75 -0
  539. package/src/{peer-dial.test.ts → protocol/peer-dial.test.ts} +52 -1
  540. package/src/protocol/peer-dial.ts +207 -0
  541. package/src/{peer-mcp-server.ts → protocol/peer-mcp-server.ts} +16 -41
  542. package/src/protocol/request-id.ts +5 -0
  543. package/src/{routes.test.ts → protocol/routes.test.ts} +14 -22
  544. package/src/protocol/routes.ts +159 -0
  545. package/src/protocol/runner-protocol.ts +197 -0
  546. package/src/protocol/terminal-protocol.ts +13 -0
  547. package/src/protocol/webext-links.ts +50 -0
  548. package/src/protocol/webext-protocol.ts +24 -0
  549. package/src/schemas/activity.ts +22 -30
  550. package/src/schemas/agent.ts +130 -238
  551. package/src/schemas/agents.ts +165 -483
  552. package/src/schemas/approvals.ts +23 -71
  553. package/src/schemas/automations.ts +142 -250
  554. package/src/schemas/capabilities.ts +127 -414
  555. package/src/schemas/ci.ts +56 -108
  556. package/src/schemas/codebase-health.ts +7 -11
  557. package/src/schemas/devices.ts +103 -321
  558. package/src/schemas/engines.ts +16 -44
  559. package/src/schemas/environment.ts +41 -91
  560. package/src/schemas/exit.ts +24 -81
  561. package/src/schemas/extension-updates.ts +42 -87
  562. package/src/schemas/git-history.ts +30 -84
  563. package/src/schemas/git.ts +141 -256
  564. package/src/schemas/history.ts +14 -40
  565. package/src/schemas/hosts.ts +9 -15
  566. package/src/schemas/inventory.ts +8 -10
  567. package/src/schemas/issues.ts +66 -134
  568. package/src/schemas/logs.ts +15 -34
  569. package/src/schemas/loops.ts +46 -163
  570. package/src/schemas/maintenance.ts +47 -172
  571. package/src/schemas/panels.ts +20 -45
  572. package/src/schemas/personas.ts +50 -200
  573. package/src/schemas/plan-limits.ts +58 -197
  574. package/src/schemas/ports.ts +14 -32
  575. package/src/schemas/provider-oauth.ts +23 -76
  576. package/src/schemas/provider-subscriptions.ts +4 -13
  577. package/src/schemas/public.ts +4 -15
  578. package/src/schemas/push.ts +8 -36
  579. package/src/schemas/secrets.ts +20 -64
  580. package/src/schemas/settings.ts +182 -602
  581. package/src/schemas/share.ts +14 -32
  582. package/src/schemas/shared.ts +14 -13
  583. package/src/schemas/system.ts +46 -78
  584. package/src/schemas/terminal.ts +41 -120
  585. package/src/schemas/usage.ts +44 -233
  586. package/src/schemas/version-seam.test.ts +9 -26
  587. package/src/schemas/vpn.ts +27 -64
  588. package/src/schemas/webext.ts +22 -53
  589. package/src/schemas/workflows.ts +57 -183
  590. package/src/schemas/workspace-repos.ts +12 -24
  591. package/src/schemas/workspace-search.ts +17 -35
  592. package/src/schemas/workspace-setup.ts +4 -11
  593. package/src/schemas/workspace-tree.ts +32 -91
  594. package/src/state/arrival.ts +109 -0
  595. package/src/state/contract-lock.test.ts +17 -0
  596. package/src/state/contract-lock.ts +49 -0
  597. package/src/state/definition.ts +143 -0
  598. package/src/state/history-state.ts +103 -0
  599. package/src/{runtime-state.test.ts → state/runtime-state.test.ts} +3 -10
  600. package/src/state/runtime-state.ts +63 -0
  601. package/src/state/starter.ts +5 -0
  602. package/src/state/state-portability.ts +27 -0
  603. package/src/state/versions.ts +26 -0
  604. package/src/{workspace-state.test.ts → state/workspace-state.test.ts} +65 -172
  605. package/src/state/workspace-state.ts +669 -0
  606. package/src/{documents.test.ts → text/documents.test.ts} +1 -1
  607. package/src/text/documents.ts +42 -0
  608. package/src/text/embed.ts +132 -0
  609. package/src/text/mentions.ts +21 -0
  610. package/src/text/model-answer.ts +9 -0
  611. package/src/text/path-refs.ts +39 -0
  612. package/src/text/shell-regions.ts +224 -0
  613. package/src/{title.test.ts → text/title.test.ts} +13 -32
  614. package/src/text/title.ts +202 -0
  615. package/src/{transcript-fold.test.ts → text/transcript-fold.test.ts} +5 -83
  616. package/src/{transcript-fold.ts → text/transcript-fold.ts} +65 -170
  617. package/src/text/whisper.test.ts +19 -0
  618. package/src/text/whisper.ts +17 -0
  619. package/src/{workflow-faults.test.ts → text/workflow-faults.test.ts} +6 -24
  620. package/src/{workflow-faults.ts → text/workflow-faults.ts} +20 -60
  621. package/dist/agent-catalog.d.ts.map +0 -1
  622. package/dist/agent-catalog.js.map +0 -1
  623. package/dist/agent-runtimes.d.ts.map +0 -1
  624. package/dist/agent-runtimes.js.map +0 -1
  625. package/dist/approvals-execution.d.ts.map +0 -1
  626. package/dist/approvals-execution.js.map +0 -1
  627. package/dist/arrival.d.ts.map +0 -1
  628. package/dist/arrival.js.map +0 -1
  629. package/dist/batch-runs.d.ts.map +0 -1
  630. package/dist/batch-runs.js.map +0 -1
  631. package/dist/capability-env.d.ts.map +0 -1
  632. package/dist/capability-env.js.map +0 -1
  633. package/dist/capability-secrets.d.ts.map +0 -1
  634. package/dist/capability-secrets.js.map +0 -1
  635. package/dist/card-status.d.ts.map +0 -1
  636. package/dist/card-status.js.map +0 -1
  637. package/dist/command-classes.d.ts.map +0 -1
  638. package/dist/command-classes.js.map +0 -1
  639. package/dist/command-run.d.ts.map +0 -1
  640. package/dist/command-run.js.map +0 -1
  641. package/dist/contract-lock.d.ts.map +0 -1
  642. package/dist/contract-lock.js.map +0 -1
  643. package/dist/conversation-ids.d.ts +0 -4
  644. package/dist/conversation-ids.d.ts.map +0 -1
  645. package/dist/conversation-ids.js.map +0 -1
  646. package/dist/credential-material.d.ts.map +0 -1
  647. package/dist/credential-material.js.map +0 -1
  648. package/dist/definition.d.ts.map +0 -1
  649. package/dist/definition.js.map +0 -1
  650. package/dist/documents.d.ts.map +0 -1
  651. package/dist/documents.js.map +0 -1
  652. package/dist/embed.d.ts.map +0 -1
  653. package/dist/embed.js.map +0 -1
  654. package/dist/events.d.ts +0 -4336
  655. package/dist/events.d.ts.map +0 -1
  656. package/dist/events.js +0 -725
  657. package/dist/events.js.map +0 -1
  658. package/dist/fast-tier.d.ts.map +0 -1
  659. package/dist/fast-tier.js.map +0 -1
  660. package/dist/history-state.d.ts.map +0 -1
  661. package/dist/history-state.js.map +0 -1
  662. package/dist/host-protocol.d.ts.map +0 -1
  663. package/dist/host-protocol.js.map +0 -1
  664. package/dist/hostnames.d.ts.map +0 -1
  665. package/dist/hostnames.js.map +0 -1
  666. package/dist/ingress-contract.d.ts.map +0 -1
  667. package/dist/ingress-contract.js.map +0 -1
  668. package/dist/ingress-protocol.d.ts.map +0 -1
  669. package/dist/ingress-protocol.js.map +0 -1
  670. package/dist/listener-protocol.d.ts.map +0 -1
  671. package/dist/listener-protocol.js.map +0 -1
  672. package/dist/mentions.d.ts.map +0 -1
  673. package/dist/mentions.js.map +0 -1
  674. package/dist/model-order.d.ts.map +0 -1
  675. package/dist/model-order.js.map +0 -1
  676. package/dist/model-pins.d.ts.map +0 -1
  677. package/dist/model-pins.js.map +0 -1
  678. package/dist/model-roles.d.ts.map +0 -1
  679. package/dist/model-roles.js.map +0 -1
  680. package/dist/needs-action.d.ts.map +0 -1
  681. package/dist/needs-action.js.map +0 -1
  682. package/dist/output-fields.d.ts.map +0 -1
  683. package/dist/output-fields.js.map +0 -1
  684. package/dist/overlay-lint.d.ts.map +0 -1
  685. package/dist/overlay-lint.js.map +0 -1
  686. package/dist/owner-ticket.d.ts.map +0 -1
  687. package/dist/owner-ticket.js.map +0 -1
  688. package/dist/path-refs.d.ts.map +0 -1
  689. package/dist/path-refs.js.map +0 -1
  690. package/dist/peer-dial.d.ts.map +0 -1
  691. package/dist/peer-dial.js.map +0 -1
  692. package/dist/peer-mcp-server.d.ts.map +0 -1
  693. package/dist/peer-mcp-server.js.map +0 -1
  694. package/dist/plan-pools.d.ts.map +0 -1
  695. package/dist/plan-pools.js.map +0 -1
  696. package/dist/prompt-complexity.d.ts.map +0 -1
  697. package/dist/prompt-complexity.js.map +0 -1
  698. package/dist/provider-specs.d.ts.map +0 -1
  699. package/dist/provider-specs.js.map +0 -1
  700. package/dist/request-id.d.ts.map +0 -1
  701. package/dist/request-id.js.map +0 -1
  702. package/dist/routes.d.ts.map +0 -1
  703. package/dist/routes.js.map +0 -1
  704. package/dist/runner-protocol.d.ts.map +0 -1
  705. package/dist/runner-protocol.js.map +0 -1
  706. package/dist/runtime-state.d.ts.map +0 -1
  707. package/dist/runtime-state.js.map +0 -1
  708. package/dist/safety-policy.d.ts.map +0 -1
  709. package/dist/safety-policy.js.map +0 -1
  710. package/dist/search-globs.d.ts.map +0 -1
  711. package/dist/search-globs.js.map +0 -1
  712. package/dist/session-names.d.ts.map +0 -1
  713. package/dist/session-names.js.map +0 -1
  714. package/dist/share-paths.d.ts.map +0 -1
  715. package/dist/share-paths.js.map +0 -1
  716. package/dist/shell-regions.d.ts.map +0 -1
  717. package/dist/shell-regions.js.map +0 -1
  718. package/dist/sse.d.ts.map +0 -1
  719. package/dist/sse.js.map +0 -1
  720. package/dist/starter.d.ts.map +0 -1
  721. package/dist/starter.js.map +0 -1
  722. package/dist/state-portability.d.ts.map +0 -1
  723. package/dist/state-portability.js.map +0 -1
  724. package/dist/terminal-protocol.d.ts.map +0 -1
  725. package/dist/terminal-protocol.js.map +0 -1
  726. package/dist/title.d.ts.map +0 -1
  727. package/dist/title.js.map +0 -1
  728. package/dist/transcript-fold.d.ts.map +0 -1
  729. package/dist/transcript-fold.js.map +0 -1
  730. package/dist/tunnel-ids.d.ts.map +0 -1
  731. package/dist/tunnel-ids.js.map +0 -1
  732. package/dist/versions.d.ts.map +0 -1
  733. package/dist/versions.js.map +0 -1
  734. package/dist/webext-links.d.ts.map +0 -1
  735. package/dist/webext-links.js.map +0 -1
  736. package/dist/webext-protocol.d.ts.map +0 -1
  737. package/dist/webext-protocol.js.map +0 -1
  738. package/dist/workflow-faults.d.ts.map +0 -1
  739. package/dist/workflow-faults.js.map +0 -1
  740. package/dist/workspace-state.d.ts.map +0 -1
  741. package/dist/workspace-state.js.map +0 -1
  742. package/src/agent-catalog.ts +0 -316
  743. package/src/agent-runtimes.ts +0 -419
  744. package/src/approvals-execution.ts +0 -96
  745. package/src/arrival.ts +0 -160
  746. package/src/batch-runs.ts +0 -188
  747. package/src/capability-ledger.test.ts +0 -140
  748. package/src/capability-secrets.ts +0 -20
  749. package/src/command-classes.ts +0 -617
  750. package/src/command-run.ts +0 -78
  751. package/src/contract-lock.test.ts +0 -23
  752. package/src/contract-lock.ts +0 -66
  753. package/src/conversation-ids.ts +0 -207
  754. package/src/credential-material.ts +0 -181
  755. package/src/definition.ts +0 -207
  756. package/src/documents.ts +0 -67
  757. package/src/embed.ts +0 -164
  758. package/src/events.ts +0 -1870
  759. package/src/fast-tier.ts +0 -72
  760. package/src/history-state.ts +0 -174
  761. package/src/host-protocol.ts +0 -36
  762. package/src/hostnames.ts +0 -180
  763. package/src/ingress-contract.ts +0 -157
  764. package/src/ingress-protocol.ts +0 -625
  765. package/src/listener-protocol.ts +0 -96
  766. package/src/mentions.ts +0 -25
  767. package/src/model-order.ts +0 -262
  768. package/src/model-pins.ts +0 -132
  769. package/src/model-roles.test.ts +0 -52
  770. package/src/model-roles.ts +0 -320
  771. package/src/needs-action.ts +0 -14
  772. package/src/output-fields.ts +0 -111
  773. package/src/overlay-lint.ts +0 -116
  774. package/src/path-refs.ts +0 -59
  775. package/src/peer-dial.ts +0 -163
  776. package/src/plan-pools.ts +0 -92
  777. package/src/prompt-complexity.ts +0 -334
  778. package/src/provider-specs.ts +0 -432
  779. package/src/request-id.ts +0 -41
  780. package/src/routes.ts +0 -219
  781. package/src/runner-protocol.ts +0 -239
  782. package/src/runtime-state.ts +0 -140
  783. package/src/safety-policy.test.ts +0 -88
  784. package/src/safety-policy.ts +0 -258
  785. package/src/search-globs.ts +0 -76
  786. package/src/session-names.ts +0 -44
  787. package/src/share-paths.ts +0 -68
  788. package/src/shell-regions.ts +0 -289
  789. package/src/starter.ts +0 -13
  790. package/src/state-portability.ts +0 -56
  791. package/src/terminal-protocol.ts +0 -16
  792. package/src/title.ts +0 -267
  793. package/src/tunnel-ids.ts +0 -57
  794. package/src/versions.ts +0 -48
  795. package/src/webext-links.ts +0 -90
  796. package/src/webext-protocol.ts +0 -27
  797. package/src/workspace-state.ts +0 -1090
  798. /package/dist/{hostnames.d.ts → ids/hostnames.d.ts} +0 -0
  799. /package/dist/{hostnames.js → ids/hostnames.js} +0 -0
  800. /package/dist/{session-names.d.ts → ids/session-names.d.ts} +0 -0
  801. /package/dist/{session-names.js → ids/session-names.js} +0 -0
  802. /package/dist/{share-paths.d.ts → ids/share-paths.d.ts} +0 -0
  803. /package/dist/{share-paths.js → ids/share-paths.js} +0 -0
  804. /package/dist/{agent-catalog.js → models/agent-catalog.js} +0 -0
  805. /package/dist/{agent-runtimes.d.ts → models/agent-runtimes.d.ts} +0 -0
  806. /package/dist/{agent-runtimes.js → models/agent-runtimes.js} +0 -0
  807. /package/dist/{fast-tier.js → models/fast-tier.js} +0 -0
  808. /package/dist/{model-order.d.ts → models/model-order.d.ts} +0 -0
  809. /package/dist/{model-pins.js → models/model-pins.js} +0 -0
  810. /package/dist/{plan-pools.js → models/plan-pools.js} +0 -0
  811. /package/dist/{prompt-complexity.d.ts → models/prompt-complexity.d.ts} +0 -0
  812. /package/dist/{prompt-complexity.js → models/prompt-complexity.js} +0 -0
  813. /package/dist/{provider-specs.d.ts → models/provider-specs.d.ts} +0 -0
  814. /package/dist/{provider-specs.js → models/provider-specs.js} +0 -0
  815. /package/dist/{approvals-execution.d.ts → policy/approvals-execution.d.ts} +0 -0
  816. /package/dist/{approvals-execution.js → policy/approvals-execution.js} +0 -0
  817. /package/dist/{capability-env.d.ts → policy/capability-env.d.ts} +0 -0
  818. /package/dist/{capability-env.js → policy/capability-env.js} +0 -0
  819. /package/dist/{capability-secrets.d.ts → policy/capability-secrets.d.ts} +0 -0
  820. /package/dist/{capability-secrets.js → policy/capability-secrets.js} +0 -0
  821. /package/dist/{command-run.js → policy/command-run.js} +0 -0
  822. /package/dist/{credential-material.d.ts → policy/credential-material.d.ts} +0 -0
  823. /package/dist/{credential-material.js → policy/credential-material.js} +0 -0
  824. /package/dist/{needs-action.d.ts → policy/needs-action.d.ts} +0 -0
  825. /package/dist/{needs-action.js → policy/needs-action.js} +0 -0
  826. /package/dist/{output-fields.d.ts → policy/output-fields.d.ts} +0 -0
  827. /package/dist/{output-fields.js → policy/output-fields.js} +0 -0
  828. /package/dist/{overlay-lint.d.ts → policy/overlay-lint.d.ts} +0 -0
  829. /package/dist/{overlay-lint.js → policy/overlay-lint.js} +0 -0
  830. /package/dist/{owner-ticket.d.ts → policy/owner-ticket.d.ts} +0 -0
  831. /package/dist/{search-globs.d.ts → policy/search-globs.d.ts} +0 -0
  832. /package/dist/{search-globs.js → policy/search-globs.js} +0 -0
  833. /package/dist/{ingress-contract.d.ts → protocol/ingress-contract.d.ts} +0 -0
  834. /package/dist/{ingress-protocol.d.ts → protocol/ingress-protocol.d.ts} +0 -0
  835. /package/dist/{ingress-protocol.js → protocol/ingress-protocol.js} +0 -0
  836. /package/dist/{listener-protocol.d.ts → protocol/listener-protocol.d.ts} +0 -0
  837. /package/dist/{peer-mcp-server.d.ts → protocol/peer-mcp-server.d.ts} +0 -0
  838. /package/dist/{peer-mcp-server.js → protocol/peer-mcp-server.js} +0 -0
  839. /package/dist/{request-id.d.ts → protocol/request-id.d.ts} +0 -0
  840. /package/dist/{request-id.js → protocol/request-id.js} +0 -0
  841. /package/dist/{routes.d.ts → protocol/routes.d.ts} +0 -0
  842. /package/dist/{routes.js → protocol/routes.js} +0 -0
  843. /package/dist/{sse.d.ts → protocol/sse.d.ts} +0 -0
  844. /package/dist/{sse.js → protocol/sse.js} +0 -0
  845. /package/dist/{terminal-protocol.js → protocol/terminal-protocol.js} +0 -0
  846. /package/dist/{webext-links.d.ts → protocol/webext-links.d.ts} +0 -0
  847. /package/dist/{webext-links.js → protocol/webext-links.js} +0 -0
  848. /package/dist/{arrival.d.ts → state/arrival.d.ts} +0 -0
  849. /package/dist/{contract-lock.d.ts → state/contract-lock.d.ts} +0 -0
  850. /package/dist/{history-state.d.ts → state/history-state.d.ts} +0 -0
  851. /package/dist/{runtime-state.d.ts → state/runtime-state.d.ts} +0 -0
  852. /package/dist/{runtime-state.js → state/runtime-state.js} +0 -0
  853. /package/dist/{starter.d.ts → state/starter.d.ts} +0 -0
  854. /package/dist/{starter.js → state/starter.js} +0 -0
  855. /package/dist/{state-portability.d.ts → state/state-portability.d.ts} +0 -0
  856. /package/dist/{state-portability.js → state/state-portability.js} +0 -0
  857. /package/dist/{versions.d.ts → state/versions.d.ts} +0 -0
  858. /package/dist/{versions.js → state/versions.js} +0 -0
  859. /package/dist/{embed.d.ts → text/embed.d.ts} +0 -0
  860. /package/dist/{embed.js → text/embed.js} +0 -0
  861. /package/dist/{mentions.d.ts → text/mentions.d.ts} +0 -0
  862. /package/dist/{mentions.js → text/mentions.js} +0 -0
  863. /package/dist/{path-refs.d.ts → text/path-refs.d.ts} +0 -0
  864. /package/dist/{path-refs.js → text/path-refs.js} +0 -0
  865. /package/dist/{shell-regions.js → text/shell-regions.js} +0 -0
  866. /package/dist/{title.d.ts → text/title.d.ts} +0 -0
  867. /package/dist/{title.js → text/title.js} +0 -0
  868. /package/src/{hostnames.test.ts → ids/hostnames.test.ts} +0 -0
  869. /package/src/{share-paths.test.ts → ids/share-paths.test.ts} +0 -0
  870. /package/src/{capability-env.ts → policy/capability-env.ts} +0 -0
  871. /package/src/{overlay-lint.test.ts → policy/overlay-lint.test.ts} +0 -0
  872. /package/src/{search-globs.test.ts → policy/search-globs.test.ts} +0 -0
  873. /package/src/{ingress-contract.test.ts → protocol/ingress-contract.test.ts} +0 -0
  874. /package/src/{peer-mcp-server.test.ts → protocol/peer-mcp-server.test.ts} +0 -0
  875. /package/src/{sse.ts → protocol/sse.ts} +0 -0
  876. /package/src/{versions.test.ts → state/versions.test.ts} +0 -0
  877. /package/src/{embed.test.ts → text/embed.test.ts} +0 -0
  878. /package/src/{mentions.test.ts → text/mentions.test.ts} +0 -0
  879. /package/src/{path-refs.test.ts → text/path-refs.test.ts} +0 -0
@@ -0,0 +1,669 @@
1
+ import { STATE_DIR } from "@intentic/constants";
2
+ import type { FileContribution } from "@intentic/extension-manifest";
3
+ import type { StateFile } from "./state-portability.js";
4
+
5
+ // Declares which workspace file backs which browser view, imported by both the daemon (builds store paths from
6
+ // `path`) and the browser (builds its invalidation table from `invalidates`). Extensions declare their own entries
7
+ // via `contributes.files`; the browser unions the two lists.
8
+
9
+ // A core entry is an extension's `contributes.files` entry plus two core-only fields: the right to declare no
10
+ // invalidations, and a portability class. `path` is workspace-root-relative, forward-slash, the space
11
+ // `workspaceChanged` paths arrive in. Matching is by prefix, so one entry covers an exact file, a directory (kept
12
+ // with its trailing slash so it can't prefix-match a sibling file), or a name family. Entries may nest; stateFileFor
13
+ // resolves the longest match.
14
+ export interface WorkspaceStateFile extends StateFile {
15
+ // Browser query keys this file feeds; empty is a real answer (`why` says which). Never a prefix over all of
16
+ // `.intentic/`: one stray write must not refetch every view.
17
+ readonly invalidates: readonly string[];
18
+ // Present only on entries with no invalidations.
19
+ readonly why?: string;
20
+ // Whether this entry is tracked by the root repo, so its diff is reviewable in Changes and `git log`. Absent by
21
+ // default; only configuration (settings, personas, skills, automations, workflow designs, environment overlay,
22
+ // which extensions are on) or authored content whose consequences leave the sandbox (workspace extensions, drafts
23
+ // posted under the owner's name) earns it. Ledgers and bulk content stay out even when `carry`. Narrower than
24
+ // `carry`: `carry` asks whether it moves to a new sandbox, this asks whether a human should review it changing.
25
+ readonly versioned?: true;
26
+ // Whether this is human- or agent-authored text a workspace search should surface (drafts, staged docs, workspace
27
+ // extensions); every `versioned` entry already counts. Kept independent of `versioned` since untracking a draft
28
+ // must not stop search finding it. `SEARCHABLE_STATE_PATHS` denies everything else by default.
29
+ readonly authored?: true;
30
+ // Whether desktop-sync copies this down to the owner's machine, a different question from `portability` (may this
31
+ // restore into a different sandbox): default is `carry` plus `identity`; `derived` (rebuildable) and `secret` are
32
+ // excluded from backup entirely. `false` is the only settable value, an entry opts out, never in.
33
+ readonly backup?: false;
34
+ // Who builds this path when it isn't the daemon; the coverage guard needs an explicit owner or it reads an entry
35
+ // the daemon never builds as dead. Absent for daemon-written entries.
36
+ readonly outsideWriter?: string;
37
+ }
38
+
39
+ // Declared `as const` so paths survive as literal types (`WorkspaceStatePath`); consumers still type entries as
40
+ // `WorkspaceStateFile` so optional fields like `note`/`why` aren't lost.
41
+ const STATE_FILES = [
42
+ // Holds no credential: values are vaulted (capabilities-store.ts's withSecretVault) and read back rehydrated; the
43
+ // vaulted keys are the complement of what `echo` exposes (capabilities/secret-fields.ts). `carry` because
44
+ // composeEnvironment reads Dockerfile fragments from here; `versioned` because connecting a capability is a
45
+ // consequential change worth reviewing.
46
+ {
47
+ path: ".intentic/config/capabilities.json",
48
+ invalidates: ["capabilities", "environment", "panels", "manifests"],
49
+ portability: "carry",
50
+ versioned: true,
51
+ },
52
+
53
+ // Declined capability recommendations and their evidence; shares the `capabilities` key since the catalog changes
54
+ // with it. Holds no credential.
55
+ { path: ".intentic/config/capability-dismissals.json", invalidates: ["capabilities"], portability: "carry", versioned: true },
56
+
57
+ // Ledger of when the agent's exits spent a stored secret; holds names and destinations, never values, so it may
58
+ // `carry`.
59
+ { path: ".intentic/records/secret-uses.json", invalidates: ["secrets"], portability: "carry" },
60
+
61
+ // Payment ledger: what was paid, to whom, how it settled, the tx hash if any. No credential (the signing key never
62
+ // enters the container), so it may `carry`.
63
+ {
64
+ path: ".intentic/records/wallet-ledger.json",
65
+ invalidates: [],
66
+ why: "Rendered through the wallet CLI and the capability card's live status probe, not from a browser query key.",
67
+ portability: "carry",
68
+ },
69
+
70
+ // Named personas: which connected accounts each speaks for, what a session wearing it may do, where it works
71
+ // (PersonaSchema). Invalidates `capabilities` too since a persona's account list is read together with the
72
+ // capability catalog. `carry`: a card is a name and ids, never a credential.
73
+ { path: ".intentic/config/personas.json", invalidates: ["personas", "capabilities", "manifests"], portability: "carry", versioned: true },
74
+
75
+ // Four files split by portability, not just prefix: `custom` is the owner-approved source and the only one that
76
+ // must travel; `approved` is composed from custom + capability fragments + the base image and is rebuilt on the
77
+ // target's first boot (carrying it would ship a `FROM` naming an image the target may not have); the proposal and
78
+ // per-tool drafts under `environment.d/` are pending agent requests, carried so the question survives the move.
79
+ { path: ".intentic/config/environment.custom.Dockerfile", invalidates: ["environment"], portability: "carry", versioned: true },
80
+ { path: ".intentic/config/environment.Dockerfile", invalidates: ["environment"], portability: "carry", versioned: true },
81
+ { path: ".intentic/config/environment.d/", invalidates: ["environment"], portability: "carry", versioned: true },
82
+ {
83
+ path: ".intentic/local/environment.approved.Dockerfile",
84
+ invalidates: ["environment"],
85
+ portability: "derived",
86
+ note: "The target composes its own overlay on first boot; rebuild it there to install the tools it names.",
87
+ },
88
+
89
+ { path: ".intentic/config/settings.json", invalidates: ["settings", "manifests"], portability: "carry", versioned: true },
90
+ // Safety policy read before every flagged command (safety-policy.ts). `carry`+`versioned`: governs what the agent
91
+ // may do unasked, so a fresh sandbox should start already governed and changes should show in review. Absent falls
92
+ // back to `DEFAULT_SAFETY_POLICY`, not unconfigured.
93
+ { path: ".intentic/config/safety.md", invalidates: ["safety-policy"], portability: "carry", versioned: true },
94
+ // Verdicts the policy above produced, newest first. `derived`/`local`: evidence about this machine, self-trimming,
95
+ // not carried. Own query key, separate from the policy's, since a verdict must not invalidate the document someone
96
+ // is editing.
97
+ {
98
+ path: ".intentic/local/safety-log.json",
99
+ invalidates: ["safety-log"],
100
+ portability: "derived",
101
+ note: "The target starts its own record of what it decided.",
102
+ },
103
+ // Apps the daemon starts on every boot (scaffold/autostart.ts). `carry`: an exported workspace should start the
104
+ // same things. Invalidates nothing: the browser reads what's running off `/panels`, not this file.
105
+ {
106
+ path: ".intentic/config/autostart.json",
107
+ invalidates: [],
108
+ why: "The browser reads what is running off /panels; this file only tells the daemon what to start at boot.",
109
+ portability: "carry",
110
+ versioned: true,
111
+ },
112
+ // Which commands are heavy enough to queue, and how many may run at once (platform/heavy-commands.ts), read per
113
+ // Bash command. `carry`: a property of the workspace, not the machine. `versioned`: raising the limit is a decision
114
+ // worth a diff.
115
+ { path: ".intentic/config/heavy-commands.json", invalidates: ["settings"], portability: "carry", versioned: true },
116
+ // Scripts the rule table runs, one per reader (settings.json points at them per event, e.g. `file.edited`).
117
+ // `versioned`: this is code that runs against every file an agent writes, more consequential than the rule naming
118
+ // it. `carry`: authored text, no credential. Invalidates nothing: the settings screen renders the rules from
119
+ // settings.json, not these scripts.
120
+ {
121
+ path: ".intentic/config/hooks/",
122
+ invalidates: [],
123
+ why: "The settings screen renders the rules that name these scripts, out of settings.json; nothing in the browser reads the scripts themselves.",
124
+ portability: "carry",
125
+ versioned: true,
126
+ // The daemon only runs these scripts by path; it never builds them, so there's no `statePath` call for the
127
+ // coverage guard to find.
128
+ outsideWriter: "the owner or an agent, authoring them; the daemon only ever RUNS one, by the path a rule's command names",
129
+ },
130
+ // Last-fired stamps for the rule table. `derived`: records what happened on this machine, not carried.
131
+ {
132
+ path: ".intentic/local/rule-firings.json",
133
+ invalidates: ["rule-firings"],
134
+ portability: "derived",
135
+ note: "Stamps of when each rule last did something; the new sandbox starts its own record.",
136
+ },
137
+ // Runtime-install ledger: which tools sessions installed, how often, and the last drift snapshot
138
+ // (environment/runtime-installs.ts). `carry` unlike rule-firings: this is about what the workspace's tasks keep
139
+ // needing, not what one machine did. The drift snapshot self-expires on a move since its `bornAt` won't match the
140
+ // new container.
141
+ { path: ".intentic/records/runtime-installs.json", invalidates: ["environment"], portability: "carry" },
142
+ // Where each agent engine's version comes from: blessed list, upstream newest, a pin, or the image
143
+ // (schemas/engines.ts). The versions themselves are machine state on the daemon's volume (architecture-specific
144
+ // binaries); the policy here travels. `versioned`: a human decision worth reviewing. Own key, not `environment`'s:
145
+ // the engines card reads its own route.
146
+ { path: ".intentic/config/engines.json", invalidates: ["engines"], portability: "carry", versioned: true },
147
+ // Written by the agent's approvals skill, read by the owner's inbox. `authored`: text meant to be found by search.
148
+ // `versioned`: an approval can spend, send, or delete under the owner's name, and is kept (not consumed) as a
149
+ // durable record of what was proposed, changed, and done.
150
+ { path: ".intentic/config/approvals/", invalidates: ["approvals"], portability: "carry", versioned: true, authored: true },
151
+ // Path is the daemon's (automations-store writes it); query keys belong to the intentic.automations extension,
152
+ // declared in its own manifest so uninstalling it removes the invalidation too.
153
+ {
154
+ path: ".intentic/config/automations.json",
155
+ invalidates: [],
156
+ why: "Declared by the intentic.automations extension's contributes.files, `automations` is its query key, not core's.",
157
+ portability: "carry",
158
+ versioned: true,
159
+ },
160
+ // Run history, split out of automations.json so a scheduled fire doesn't dirty the tracked config with ledger
161
+ // noise; a fire now touches nothing tracked. `carry`: about the automation, not the machine. Invalidation is
162
+ // declared by the intentic.automations extension since it renders each row's history from this file.
163
+ {
164
+ path: ".intentic/records/automation-runs.json",
165
+ invalidates: [],
166
+ why: "Declared by the intentic.automations extension's contributes.files, `automations` is its query key, not core's.",
167
+ portability: "carry",
168
+ },
169
+ {
170
+ path: ".intentic/records/approvals/",
171
+ invalidates: [],
172
+ why: "Declared by the intentic.approvals extension's contributes.files (the page that lists held wakes), `automation-approvals` is its query key, not core's.",
173
+ portability: "carry",
174
+ },
175
+ // Bug-report inbox, one file per fingerprint (daemon's issues-store), rendered by intentic.issues. `carry`: a fact
176
+ // about the product, not the container. Not `versioned`: machine-recorded telemetry, not an owner decision.
177
+ {
178
+ path: ".intentic/records/issues/",
179
+ invalidates: [],
180
+ why: "Declared by the intentic.issues extension's contributes.files, `issues` is its query key, not core's.",
181
+ portability: "carry",
182
+ },
183
+ // Maintenance ledger and probe evidence (daemon's chores-store), rendered by intentic.maintenance. `carry`:
184
+ // point-in-time evidence about this workspace.
185
+ {
186
+ path: ".intentic/records/chores/",
187
+ invalidates: [],
188
+ why: "Declared by the intentic.maintenance extension's contributes.files, `maintenance-report`/`maintenance-runs` are its query keys, not core's.",
189
+ portability: "carry",
190
+ },
191
+ // Documentation staging tree (documentation extension's paths.ts): generation writes here, the owner approves
192
+ // here, publishing copies into the repo. `authored`: draft READMEs, searchable like a post draft.
193
+ {
194
+ path: ".intentic/config/docs/",
195
+ invalidates: [],
196
+ why: "Declared by the intentic.documentation extension's contributes.files, `documentation`/`documentation-runs` are its query keys, not core's.",
197
+ portability: "carry",
198
+ authored: true,
199
+ outsideWriter: "the intentic.documentation extension's staging writes (its paths.ts)",
200
+ },
201
+ // Core keys, not the workflows extension's: the fleet board and chat panel render workflow runs regardless of
202
+ // whether that extension is enabled. This push is the only live feed the scheduler has. The runs file also
203
+ // invalidates `workflows` since `GET /workflows` embeds each design's runs.
204
+ { path: ".intentic/config/workflows.json", invalidates: ["workflows"], portability: "carry", versioned: true },
205
+ { path: ".intentic/records/workflow-runs.json", invalidates: ["workflows", "workflow-runs"], portability: "carry" },
206
+ // Saved loops: a manifest read by both the workflows page and every chat composer's loop picker, often in
207
+ // different windows, so an edit on one must reach the other. Core key for the same reason workflow designs are.
208
+ { path: ".intentic/config/loop-designs.json", invalidates: ["loop-designs"], portability: "carry", versioned: true },
209
+ {
210
+ path: ".intentic/records/loops.json",
211
+ invalidates: [],
212
+ why: "Ralph loops and their iteration history. Nothing observes it: where a RUNNING loop stands rides on the fleet roster (AgentSummary.loop), which the /events stream already pushes about once a second, and a second source invalidating on this file could only ever disagree with the card beside it. The iteration list of an ENDED loop is an on-demand read, nothing renders it until someone opens it (web's useLoops, which holds no query for exactly this reason).",
213
+ portability: "carry",
214
+ },
215
+
216
+ // Reached by no query, by design: invalidation only reaches an observed query key, and none of these are observed.
217
+ // Each entry's `why` states the constraint so a future reader doesn't have to re-derive it.
218
+ {
219
+ path: ".intentic/records/webchat-installs.json",
220
+ invalidates: [],
221
+ why: "Which origins have loaded a Front Desk's widget, written on a 30s flush timer while a customer's site serves page views. The install panel that renders it fetches on open and polls itself while it is on screen, which is the whole window in which the answer changes for anyone. Pushing instead would bill every connected browser a refetch per flush, for a panel almost nobody has open.",
222
+ portability: "carry",
223
+ },
224
+ {
225
+ path: ".intentic/records/issue-installs.json",
226
+ invalidates: [],
227
+ why: "The same probe for the bug reporter's script, on the same flush timer and read by the same kind of panel, so it is outside the push path for the same reason the Front Desk's is.",
228
+ portability: "carry",
229
+ },
230
+ {
231
+ path: ".intentic/records/thread-sessions.json",
232
+ invalidates: [],
233
+ why: "Thread bookkeeping (an inbound thread, a Front Desk visitor, a Discord or Slack channel, → sandbox conversation + provider session), written on EVERY inbound message. Nothing in the browser reads it: what a thread produces is a conversation, and the fleet board already learns about that from the agent registry's own push. Naming a key here would bill every connected browser a refetch per inbound message, the request storm this table's own note warns about, to refresh nothing it can see.",
234
+ portability: "carry",
235
+ },
236
+ // Extension configuration only; secret keys named by `contributes.settings[].secret` are vaulted separately
237
+ // (extensions/extension-settings.ts) and rehydrated on read, so no caller sees the split. `carry`+`versioned`:
238
+ // reviewable now that no credential is inside. No `note`: notes are for skipped/untracked entries; this one
239
+ // carries.
240
+ {
241
+ path: ".intentic/config/extension-settings.json",
242
+ invalidates: [],
243
+ why: "Held in a module-level shallowRef store per extension (web's extensionSettingsStore) with no query observer, and deliberately so: api.settings.get must answer SYNCHRONOUSLY from an extension's first activate() line, and the store outlives every component scope. A module-level QueryObserver is the one shape that would make invalidation refetch, and this app already ruled it out, it detaches on the queryClient.clear() at logout (see useSandbox's sandbox-list mirror). So a remote member's setting edit reaches this browser on its next load, not live.",
244
+ portability: "carry",
245
+ versioned: true,
246
+ },
247
+ // Unlike the settings file, this switch is observed by the Extensions tab's query, so a flip elsewhere shows up
248
+ // live. Toggling doesn't itself rerun the host, that happens via the loader's reconcile, triggered by the tab's own
249
+ // toggle.
250
+ {
251
+ path: ".intentic/config/extension-enablement.json",
252
+ invalidates: ["extensions"],
253
+ portability: "carry",
254
+ versioned: true,
255
+ },
256
+ // Workspace extensions: one directory per extension, written directly by the agent's file tools and live
257
+ // immediately (no clone, no install step). `authored`, unlike `.intentic/extensions/` below which holds clones.
258
+ // `versioned`: every other load path is already reviewable (a git-installed extension's sha, a baked one's image);
259
+ // this is the one kind with no install moment to review at, so the diff is the only review there is. The daemon
260
+ // restarts the extension host on a change here.
261
+ { path: ".intentic/config/workspace-extensions/", invalidates: ["extensions"], portability: "carry", versioned: true, authored: true },
262
+ // Per-extension update/advisory/health findings, written by the periodic check and by update/revert. Pushed live
263
+ // so an auto-disabling advisory doesn't wait for a reload.
264
+ { path: ".intentic/records/extension-updates.json", invalidates: ["extensions"], portability: "carry" },
265
+ // Owner's per-extension update posture (notify/agent/auto, advisory opt-out). `carry`: a decision about the
266
+ // extension, not the machine.
267
+ { path: ".intentic/config/extension-update-policy.json", invalidates: ["extensions"], portability: "carry", versioned: true },
268
+ // `carry`: evidence is about the extension, not the machine; dropping it would make every permission look unused
269
+ // rather than simply unmeasured.
270
+ {
271
+ path: ".intentic/records/extension-usage.json",
272
+ invalidates: [],
273
+ why: "Which of the routes each extension DECLARED it has actually called, the evidence behind the permissions list on its row. The one entry here whose empty set is a RATE decision rather than an architectural one: every browser with the app open reports its batch on a timer, so wiring this to the `extensions` query would refetch the whole list every few seconds for a figure nobody is watching change. The tab reads it when it loads, which is when anyone is reading it.",
274
+ portability: "carry",
275
+ },
276
+ // Holds no credential but stays `identity`, not `carry`: it mirrors the platform's own invite records (the
277
+ // enforcer's copy, so a grant it never received is never honoured), and review already happens on the Access tab
278
+ // against the authoritative record. An access list that traveled would let a source sandbox hand itself the
279
+ // target's ownership.
280
+ {
281
+ path: ".intentic/identity/members.json",
282
+ invalidates: [],
283
+ why: "Not this view's source at all: SandboxAccess renders the PLATFORM's invite records (apiClient.invite.list), and this file is the daemon's ENFORCED copy, written first so a grant the enforcer never got is never recorded, then never read back. A change here means the two disagreed, which the write order makes fail-closed rather than stale.",
284
+ portability: "identity",
285
+ note: "Re-invite collaborators from the Access tab, a grant is the platform's record, and the target enforces its own copy.",
286
+ },
287
+
288
+ // ---- daemon-owned, nothing derives from watching them ----
289
+ // AI-provider credentials and homes, plus the capability and extension-settings secret vaults, all under one root:
290
+ // several provider CLIs mix OAuth, config and thread metadata in one home, so no generic export can safely split
291
+ // them, and a new provider lands secret by construction. This tree is already outside the file routes, workspace
292
+ // walk and search index (composition.ts), which is why both secret vaults sit here too.
293
+ {
294
+ path: ".intentic/secrets/auth/",
295
+ invalidates: [],
296
+ why: "AI-provider credentials and runtime homes, plus the capability and extension-settings secret vaults; each account is rendered through owner-gated provider routes.",
297
+ portability: "secret",
298
+ note: "Sign the agent's AI accounts in again on the Agent tab, then re-enter each connection's credential on Capabilities and each extension's secret settings on Extensions, both arrived listed but unauthenticated.",
299
+ },
300
+ // Session transcripts, rewritten on every streamed token; nothing renders them off disk. Excluded as a descent
301
+ // filter, the watcher never walks this subtree at all, which is what makes it cheap.
302
+ {
303
+ path: ".intentic/records/sessions/claude/",
304
+ invalidates: [],
305
+ why: "Agent session transcripts; nothing derives from watching them, and descending into them would cost a fifth of the watcher.",
306
+ portability: "carry",
307
+ },
308
+ {
309
+ path: ".intentic/records/artifacts/",
310
+ invalidates: [],
311
+ why: "Durable outputs owned by conversations and extension runs: attachments, browser captures, generated images, acceptance reports, workflow step reports, voice transcripts, and loop ledgers.",
312
+ portability: "carry",
313
+ },
314
+ {
315
+ path: ".intentic/local/cache/",
316
+ invalidates: [],
317
+ why: "Rebuildable indexes and caches, the iq index and its vector sidecar, the whisper model, fileq's derived/ markdown shadows of binary files; ignored by the watcher and recreated from carried workspace content.",
318
+ portability: "derived",
319
+ },
320
+ // Extension runtime scratch, one directory per extension via `extensionRuntimeDir` below (the only way an
321
+ // extension may name a home here). Resume watermarks and cached tokens; all of it expires or re-derives.
322
+ {
323
+ path: ".intentic/local/runtime/",
324
+ invalidates: [],
325
+ why: "Extension runtime scratch (watermarks, cached short-lived tokens); nothing renders it and gateways re-derive it.",
326
+ portability: "derived",
327
+ outsideWriter: "extensions, through extensionRuntimeDir below",
328
+ },
329
+ {
330
+ path: ".intentic/local/tmp/",
331
+ invalidates: [],
332
+ why: "Scratch that agents and tools leave behind (build logs, demo checkouts); nothing reads it after the turn that wrote it. The state janitor empties it at boot.",
333
+ portability: "derived",
334
+ },
335
+ // Not written by the daemon: pnpm auto-creates its content-addressable store when an install runs from under
336
+ // `.intentic`. Declared anyway so the table accounts for everything under the state dir; a fresh install rebuilds
337
+ // it.
338
+ {
339
+ path: ".intentic/local/.pnpm-store/",
340
+ invalidates: [],
341
+ why: "pnpm's content-addressable store, auto-created by installs run from under .intentic; the next install rebuilds it.",
342
+ portability: "derived",
343
+ outsideWriter: "pnpm itself, when an install runs from under .intentic",
344
+ },
345
+ {
346
+ path: ".intentic/local/newest-run.json",
347
+ invalidates: [],
348
+ why: "The newest daemon version that ever ran this workspace (store/newest-run.ts), a downgrade tripwire, about THIS sandbox the way rule-firings is.",
349
+ portability: "derived",
350
+ note: "The target stamps its own daemon version on first boot.",
351
+ },
352
+ {
353
+ path: ".intentic/records/verify.json",
354
+ invalidates: [],
355
+ why: "The dependency verifier's verdict memory; nothing renders it directly, outcomes reach the owner as activity entries and workspace events.",
356
+ portability: "carry",
357
+ },
358
+ {
359
+ path: ".intentic/local/verify/",
360
+ invalidates: [],
361
+ why: "A running check's wrapper artifacts (log + exit status), read once by the daemon when the panel finishes.",
362
+ portability: "derived",
363
+ },
364
+ {
365
+ path: ".intentic/secrets/ci.json",
366
+ invalidates: [],
367
+ why: "Webhook secret + conclusion memory; the Pipelines view reads it through /ci/runs, not off disk.",
368
+ portability: "secret",
369
+ note: "Re-add the CI webhook on the Pipelines view, its secret is per-sandbox.",
370
+ },
371
+ // Credentials behind the daemon's public doors: an automation's webhook, a workflow's release gate, an issue
372
+ // intake key. Kept out of the versioned manifests that declare those doors (automations.json, workflows.json)
373
+ // since a credential has no place in a tracked, agent-readable file; reachable only through the route that lists
374
+ // the automation or workflow.
375
+ {
376
+ path: ".intentic/secrets/doors.json",
377
+ invalidates: [],
378
+ why: "The credentials behind the event webhooks, release gates and bug intakes; each surface reads its own through /automations and /workflows, never off disk.",
379
+ portability: "secret",
380
+ note: "Webhook, gate and intake URLs are minted fresh on the first read here: re-copy each into its caller's secret store.",
381
+ },
382
+ // The one `identity` entry that opts out of backup: unlike the rows beside it (a name, an id, a role), these
383
+ // tokens authenticate against this sandbox from outside it, so a copy has no business surviving the sandbox it
384
+ // admits callers to. Re-minted on a new sandbox regardless, so nothing is lost by excluding it.
385
+ {
386
+ path: ".intentic/identity/control-tokens.json",
387
+ invalidates: [],
388
+ why: "Hashed control tokens (the ACP editor bridge, and anything else driving this sandbox from outside), listed on demand by the owner.",
389
+ portability: "identity",
390
+ backup: false,
391
+ note: "Mint fresh control tokens, the old ones authenticate against the source sandbox.",
392
+ },
393
+ {
394
+ path: ".intentic/identity/owner.json",
395
+ invalidates: [],
396
+ why: "Bound once on first use; a change here means the sandbox was re-owned, which re-authenticates anyway.",
397
+ portability: "identity",
398
+ },
399
+ {
400
+ path: ".intentic/identity/workspace.json",
401
+ invalidates: [],
402
+ why: "The workspace identity, read from the /events hello frame rather than as a file.",
403
+ portability: "identity",
404
+ },
405
+ {
406
+ path: ".intentic/config/templates.json",
407
+ invalidates: [],
408
+ why: "Scaffold templates, read when the scaffold dialog opens.",
409
+ portability: "carry",
410
+ versioned: true,
411
+ },
412
+ // `derived` for size, not safety, these are logged-in sessions, but gigabytes of a store Chromium rewrites
413
+ // constantly and versions to its own build, so carrying it might not even work on the target.
414
+ {
415
+ path: ".intentic/local/browser/",
416
+ invalidates: [],
417
+ why: "Browser-login profiles: Chromium rewrites these constantly. Descent-ignored by the watcher outright.",
418
+ portability: "derived",
419
+ note: "Log the agent's browser back into any site it needs, profiles do not travel.",
420
+ },
421
+ {
422
+ path: ".intentic/local/extensions/",
423
+ invalidates: [],
424
+ why: "Extension checkouts, whole git clones. The `extensions` query is driven by the capability manifest above, not by their contents.",
425
+ portability: "derived",
426
+ note: "Extensions re-clone from the capability manifest on the target's next reconcile.",
427
+ },
428
+ { path: ".intentic/records/plugins/", invalidates: [], why: "Agent plugin dirs, read by the SDK's loader each turn.", portability: "carry" },
429
+ // Skills the owner wrote, source of truth for the reconciler that copies enabled ones into `.agents/skills`
430
+ // (settings.json's `skills` list); a skill switched off keeps its text here rather than nowhere. `versioned`+
431
+ // `carry`: it changes agent behavior and holds no credential.
432
+ { path: ".intentic/config/skills/", invalidates: ["skills"], portability: "carry", versioned: true },
433
+ // One folder per persona: its system prompt, skills and tools, laid out as a Claude Code plugin
434
+ // (`.claude-plugin/plugin.json`, `skills/`, `agents/`, `commands/`, `hooks/`, `.mcp.json`) so the runtime's own
435
+ // loader reads it directly. Kept separate from `personas.json` because this is prose and files rather than a
436
+ // diffable record; folding a 20k prompt into JSON would make every edit unreadable.
437
+ { path: ".intentic/config/personas/", invalidates: ["personas"], portability: "carry", versioned: true },
438
+ ] as const satisfies readonly WorkspaceStateFile[];
439
+
440
+ export const WORKSPACE_STATE_FILES: readonly WorkspaceStateFile[] = STATE_FILES;
441
+
442
+ // Entries the root repo tracks, in declaration order; history.ts turns this into the negations that carve them out
443
+ // of the wholesale `.intentic` exclusion. Derived here rather than duplicated beside the git rule, so marking an
444
+ // entry `versioned` is the only change needed.
445
+ export const VERSIONED_STATE_PATHS: readonly string[] = WORKSPACE_STATE_FILES.filter((file) => file.versioned).map((file) => file.path);
446
+
447
+ // Slice a workspace search may surface: `versioned` config plus `authored` content (approvals, staged docs,
448
+ // workspace extensions). Everything else under `.intentic` is machine state, denied by default. `auth/`, where
449
+ // vaulted credentials live, is always denied regardless.
450
+ export const SEARCHABLE_STATE_PATHS: readonly string[] = WORKSPACE_STATE_FILES.filter((file) => file.versioned || file.authored).map(
451
+ (file) => file.path,
452
+ );
453
+
454
+ // The kind of thing an entry is, and the axis the directory layout is built on. Derived from
455
+ // `versioned`/`authored`/`portability` rather than declared per entry, since those three answers already nest
456
+ // cleanly (every `versioned` and `authored` entry is `carry`), declaring the group separately would be a fourth
457
+ // fact to keep in step.
458
+ export type StateGroup =
459
+ // Reviewed and reviewable: settings, personas, skills, approvals, staged docs, environment overlay. Tracked,
460
+ // searchable, backed up, carried. Called `config` even though approvals and staged docs are authored content, not
461
+ // settings, since most members are.
462
+ | "config"
463
+ // What happened: run ledgers, chores, transcripts, artifacts. Machine-written, so untracked and unsearchable, but
464
+ // backed up and carried as the owner's history.
465
+ | "records"
466
+ // Rebuildable from what does travel: caches, indexes, extension checkouts, scratch, the composed overlay, browser
467
+ // profiles. Neither backed up nor carried; the janitor may delete it freely.
468
+ | "local"
469
+ // Who owns this sandbox and who may drive it. Backed up so the owner keeps their own access record; never carried,
470
+ // or a source sandbox could claim the target.
471
+ | "identity"
472
+ // Credentials. Never backed up; carried only when the owner opts in at export.
473
+ | "secrets";
474
+
475
+ // Directory each group lives in; group name is the folder name, one vocabulary, so the layout guard
476
+ // (workspace-state.test.ts) can check the whole tree with one rule. Two things don't collapse to a folder prefix:
477
+ // the staged-docs tree is searchable but deliberately untracked (publishing already copies it into the repo)
478
+ // despite living in `config/`; and the composed overlay plus rule-firing stamps are `derived`/`local` but still
479
+ // feed a view, so the watcher can't just skip all of `local/`. Both stay derived from the flags rather than the
480
+ // folder name.
481
+ export const STATE_GROUP_DIR: Readonly<Record<StateGroup, string>> = {
482
+ config: `${STATE_DIR}/config`,
483
+ records: `${STATE_DIR}/records`,
484
+ local: `${STATE_DIR}/local`,
485
+ identity: `${STATE_DIR}/identity`,
486
+ secrets: `${STATE_DIR}/secrets`,
487
+ };
488
+
489
+ // Every group, derived from the folder map so the two can't disagree on count; declaration order is the reading
490
+ // order (what you wrote, what happened, what's disposable, who owns this, the keys).
491
+ export const STATE_GROUPS = Object.keys(STATE_GROUP_DIR) as readonly StateGroup[];
492
+
493
+ // Group for one entry, checked most-specific first: a credential is a credential regardless of anything else.
494
+ export const stateGroupOf = (file: WorkspaceStateFile): StateGroup => {
495
+ switch (file.portability) {
496
+ case "secret":
497
+ return "secrets";
498
+ case "identity":
499
+ return "identity";
500
+ case "derived":
501
+ return "local";
502
+ case "carry":
503
+ return file.versioned === true || file.authored === true ? "config" : "records";
504
+ }
505
+ };
506
+
507
+ // Entries of one group, in declaration order, what a hand-kept path list would otherwise need.
508
+ export const stateGroupPaths = (group: StateGroup): readonly string[] =>
509
+ WORKSPACE_STATE_FILES.filter((file) => stateGroupOf(file) === group).map((file) => file.path);
510
+
511
+ // What an isolated turn shares live with the main tree vs. keeps as its own worktree checkout, split along the
512
+ // line git already draws: `versioned` entries are the worktree's own checkout (reviewed in its diff, landed like
513
+ // code); everything untracked is bound in from the main tree (agents/isolation.ts), or a transcript, ledger or
514
+ // staged doc written into a per-worktree copy would simply be lost. Whole-group dirs are bound where the whole
515
+ // group is untracked (records, local, identity, secrets); only `config`, which mixes tracked and untracked (the
516
+ // staged-docs tree), is bound entry by entry. Trailing slash kept on every directory entry.
517
+ export const SHARED_STATE_PATHS: readonly string[] = STATE_GROUPS.flatMap((group) => {
518
+ const files = WORKSPACE_STATE_FILES.filter((file) => stateGroupOf(file) === group);
519
+ return files.some((file) => file.versioned === true)
520
+ ? files.filter((file) => file.versioned !== true).map((file) => file.path)
521
+ : [`${STATE_GROUP_DIR[group]}/`];
522
+ });
523
+
524
+ // Slice desktop-sync copies down: ordinary state and the records binding this sandbox to its owner, minus anything
525
+ // that opts out via `backup: false`. Deliberately not the same question as the export bundle: a bundle asks what
526
+ // may be reconstituted elsewhere, this asks what the owner may keep a copy of.
527
+ export const BACKED_UP_STATE_PATHS: readonly string[] = WORKSPACE_STATE_FILES.filter(
528
+ (file) => file.backup !== false && (file.portability === "carry" || file.portability === "identity"),
529
+ ).map((file) => file.path);
530
+
531
+ // Complement of the above: everything that must not be copied down. Derived from the same predicate, so a new
532
+ // store defaults to excluded until its class says otherwise.
533
+ export const UNBACKED_STATE_PATHS: readonly string[] = WORKSPACE_STATE_FILES.filter((file) => !BACKED_UP_STATE_PATHS.includes(file.path)).map(
534
+ (file) => file.path,
535
+ );
536
+
537
+ // The only way an extension may name a scratch home, workspace-relative and forward-slash so the browser bundle
538
+ // can hold it too. Extension ids are already validated slugs; the character replace is defense in depth.
539
+ export const extensionRuntimeDir = (extension: string): string =>
540
+ `${STATE_GROUP_DIR.local}/runtime/extensions/${extension.replaceAll(/[^a-zA-Z0-9._-]/g, "_")}`;
541
+
542
+ // Manifests the unreadable-manifest notice reports on: exactly the entries that declare `manifests` in
543
+ // `invalidates`, since a file's problems are only worth showing if a write to it can refresh the notice. A broken
544
+ // file still falls back and sets its bad bytes aside (store/json-file.ts); it just stops asking the owner to fix
545
+ // it.
546
+ export const REPORTED_MANIFEST_PATHS: readonly string[] = WORKSPACE_STATE_FILES.filter((file) => file.invalidates.includes("manifests")).map(
547
+ (file) => file.path,
548
+ );
549
+
550
+ // Accepts either separator; the daemon holds these as platform paths and normalizing at every call site is what
551
+ // eventually gets forgotten.
552
+ export const isReportedManifest = (relPath: string): boolean => REPORTED_MANIFEST_PATHS.includes(relPath.replaceAll("\\", "/"));
553
+
554
+ // Entries directly under `.intentic/` the file API refuses to read, write, move or delete for anyone, owner
555
+ // included (workspace/workspace-files.ts enforces it). Declared here so the browser can draw the same rule instead
556
+ // of only reacting to a refusal. Naming them gives nothing away the tree doesn't already list; what's protected is
557
+ // the bytes.
558
+ // Group-relative names, and the one rule that cuts across every group rather than collapsing to a group prefix:
559
+ // what the file API refuses depends on whether the bytes are sensitive, not on what kind of entry it is.
560
+ export const LOCKED_STATE_ENTRIES: ReadonlySet<string> = new Set([
561
+ "identity/owner.json",
562
+ "identity/members.json",
563
+ "identity/control-tokens.json",
564
+ "config/capabilities.json",
565
+ "secrets/ci.json",
566
+ "secrets/doors.json",
567
+ "secrets/auth",
568
+ "records/sessions",
569
+ "local/browser",
570
+ // The provider CLI's own home, undeclared in the table above and so without a group; stays at the state dir root.
571
+ // The two-segment match below still reaches it since a bare name joins to itself. Locked: it holds a live session
572
+ // for whatever the agent is signed into.
573
+ "claude.json",
574
+ ]);
575
+
576
+ // Where the CLI's plan files land; `~/.claude/plans` symlinks here (sessions/session-store.ts), so a plan has a
577
+ // harness-owned address rather than a length heuristic. Locked even though its contents are the same text the chat
578
+ // already rendered for approval, unlike `records/sessions` which is locked for holding the provider's own session
579
+ // state.
580
+ export const PLAN_DOCUMENTS_DIR = `${STATE_DIR}/records/sessions/claude/plans`;
581
+
582
+ // Where message attachments land: the browser posts to `<this>/<uuid>/<name>` before the message is sent, and the
583
+ // turn reads them back (schemas/agent.ts). The role floor (auth/role-floor.ts) keys off this path: attaching is
584
+ // part of sending (a collaborator's grant), writing elsewhere in the workspace is the operating tier's, and both
585
+ // travel through the same upload route.
586
+ export const ATTACHMENTS_DIR = `${STATE_DIR}/records/artifacts/attachments`;
587
+
588
+ // Normalizes first: a path that opens inside the attachments dir and climbs back out with `..` would otherwise
589
+ // reach anywhere in the workspace under an attachment's address. A path that climbs above the root, or is
590
+ // absolute, is simply not an attachment, and falls back to the operating tier's floor rather than to permission.
591
+ export const isAttachmentPath = (relPath: string): boolean => {
592
+ const resolved: string[] = [];
593
+ for (const segment of relPath.split(/[\\/]/)) {
594
+ if (segment === "" || segment === ".") {
595
+ continue;
596
+ }
597
+ if (segment !== "..") {
598
+ resolved.push(segment);
599
+ continue;
600
+ }
601
+ if (resolved.pop() === undefined) {
602
+ // Climbed above the workspace root: whatever it names, it is not in here.
603
+ return false;
604
+ }
605
+ }
606
+ // An absolute path's leading separator produces an empty segment dropped from `resolved`, so it folds to the same
607
+ // shape as a relative one; checking the leading separator is what still tells the two apart.
608
+ return !relPath.startsWith("/") && !/^[A-Za-z]:/.test(relPath) && resolved.join("/").startsWith(`${ATTACHMENTS_DIR}/`);
609
+ };
610
+
611
+ // Which locked entry a root-relative path belongs to, or undefined if it's not in the control plane. Scoped tight:
612
+ // only the root `.intentic` counts (a nested repo's own is ordinary content), and the root's own `.git` joins the
613
+ // set as the pointer to the shadow history repo kept off the workspace so the agent can't rewrite its own past.
614
+ // Returns the entry name rather than a boolean since the refusal screen needs to say what the file holds. Accepts
615
+ // either slash.
616
+ export const lockedWorkspaceEntry = (relPath: string): string | undefined => {
617
+ const segments = relPath.split(/[\\/]/).filter((segment) => segment !== "" && segment !== ".");
618
+ if (segments[0] === ".git") {
619
+ return ".git";
620
+ }
621
+ if (segments[0] !== STATE_DIR) {
622
+ return undefined;
623
+ }
624
+ const rel = segments.join("/");
625
+ if (rel === PLAN_DOCUMENTS_DIR || rel.startsWith(`${PLAN_DOCUMENTS_DIR}/`)) {
626
+ return undefined;
627
+ }
628
+ // Two segments covers both spellings above: a grouped entry (`secrets/auth`) matches as written, and a bare root
629
+ // entry (`claude.json`) joins to itself.
630
+ const entry = segments.slice(1, 3).join("/");
631
+ return LOCKED_STATE_ENTRIES.has(entry) ? entry : undefined;
632
+ };
633
+
634
+ // Whether a path lands in the control plane and so is refused by the file API rather than opened.
635
+ export const isLockedWorkspacePath = (relPath: string): boolean => lockedWorkspaceEntry(relPath) !== undefined;
636
+
637
+ // Locked entries the root repo tracks anyway: refused by the file API but still diffable in Changes, since `git
638
+ // log` and every clone already have the bytes. Derives from the same `versioned` flag rather than naming a file,
639
+ // so marking another locked entry `versioned` doesn't need a second edit here. Every other surface (read, write,
640
+ // move, delete, publish) still asks `isLockedWorkspacePath` and still refuses. Accepts either slash.
641
+ export const isReviewableLockedPath = (relPath: string): boolean => {
642
+ const rel = relPath.replaceAll("\\", "/").replace(/^\.\//, "");
643
+ return isLockedWorkspacePath(rel) && VERSIONED_STATE_PATHS.some((path) => (path.endsWith("/") ? rel.startsWith(path) : rel === path));
644
+ };
645
+
646
+ // Every path this table declares, as a type; the daemon joins paths only through `statePath`
647
+ // (workspace/state-paths.ts), which accepts one of these and nothing else, so renaming a store's file is a compile
648
+ // error everywhere it's named rather than a view that silently stops refreshing.
649
+ export type WorkspaceStatePath = (typeof STATE_FILES)[number]["path"];
650
+
651
+ // Query keys a batch of changed paths makes stale; the browser's `/events` handler calls it. `contributed`
652
+ // (activated extensions' `contributes.files`) is a required argument, not imported, since which extensions are
653
+ // live is a browser-only fact and an optional argument here would be one a caller could forget to pass. Extension
654
+ // entries are unioned flat with core ones so a narrower extension entry can still fire under a core prefix that
655
+ // itself invalidates nothing.
656
+ export const staleQueryKeys = (paths: readonly string[], contributed: readonly FileContribution[]): readonly string[] => [
657
+ ...new Set(
658
+ [...WORKSPACE_STATE_FILES, ...contributed]
659
+ .filter((file) => file.invalidates.length > 0 && paths.some((path) => path.startsWith(file.path)))
660
+ .flatMap((file) => file.invalidates),
661
+ ),
662
+ ];
663
+
664
+ // Every query key any watched file feeds, what a new `/events` connection invalidates wholesale. The file push is
665
+ // these keys' only live feed, so a change while the stream was down would otherwise sit stale until the file's
666
+ // next write; re-asking on connect bounds that to one read per key.
667
+ export const fileBoundQueryKeys = (contributed: readonly FileContribution[]): readonly string[] => [
668
+ ...new Set([...WORKSPACE_STATE_FILES, ...contributed].flatMap((file) => file.invalidates)),
669
+ ];