@intentic/sandbox-contract 1.326.0 → 1.328.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 (537) hide show
  1. package/README.md +24 -12
  2. package/dist/chores/chores.d.ts.map +1 -1
  3. package/dist/chores/chores.js +29 -20
  4. package/dist/chores/chores.js.map +1 -1
  5. package/dist/chores/probes.d.ts +1 -0
  6. package/dist/chores/probes.d.ts.map +1 -1
  7. package/dist/chores/probes.js +81 -12
  8. package/dist/chores/probes.js.map +1 -1
  9. package/dist/contracts/agent.contract.d.ts +1467 -6
  10. package/dist/contracts/agent.contract.d.ts.map +1 -1
  11. package/dist/contracts/agent.contract.js +2 -2
  12. package/dist/contracts/agent.contract.js.map +1 -1
  13. package/dist/contracts/agents.contract.d.ts +1391 -0
  14. package/dist/contracts/agents.contract.d.ts.map +1 -1
  15. package/dist/contracts/agents.contract.js +1 -1
  16. package/dist/contracts/automations.contract.d.ts +123 -4
  17. package/dist/contracts/automations.contract.d.ts.map +1 -1
  18. package/dist/contracts/automations.contract.js +13 -2
  19. package/dist/contracts/automations.contract.js.map +1 -1
  20. package/dist/contracts/capabilities.contract.d.ts +79 -8
  21. package/dist/contracts/capabilities.contract.d.ts.map +1 -1
  22. package/dist/contracts/chores.contract.d.ts +2 -0
  23. package/dist/contracts/chores.contract.d.ts.map +1 -1
  24. package/dist/contracts/ci.contract.d.ts +2 -0
  25. package/dist/contracts/ci.contract.d.ts.map +1 -1
  26. package/dist/contracts/device.contract.d.ts +52 -0
  27. package/dist/contracts/device.contract.d.ts.map +1 -1
  28. package/dist/contracts/device.contract.js +2 -0
  29. package/dist/contracts/device.contract.js.map +1 -1
  30. package/dist/contracts/endpoints.contract.d.ts +42 -33
  31. package/dist/contracts/endpoints.contract.d.ts.map +1 -1
  32. package/dist/contracts/endpoints.contract.js +17 -7
  33. package/dist/contracts/endpoints.contract.js.map +1 -1
  34. package/dist/contracts/extensions.contract.d.ts +192 -0
  35. package/dist/contracts/extensions.contract.d.ts.map +1 -1
  36. package/dist/contracts/extensions.contract.js +37 -1
  37. package/dist/contracts/extensions.contract.js.map +1 -1
  38. package/dist/contracts/needs.contract.d.ts +1009 -0
  39. package/dist/contracts/needs.contract.d.ts.map +1 -1
  40. package/dist/contracts/pages.contract.d.ts +34 -0
  41. package/dist/contracts/pages.contract.d.ts.map +1 -0
  42. package/dist/contracts/pages.contract.js +49 -0
  43. package/dist/contracts/pages.contract.js.map +1 -0
  44. package/dist/contracts/phone.contract.d.ts +78 -0
  45. package/dist/contracts/phone.contract.d.ts.map +1 -0
  46. package/dist/contracts/phone.contract.js +11 -0
  47. package/dist/contracts/phone.contract.js.map +1 -0
  48. package/dist/contracts/privacy.contract.d.ts +20 -0
  49. package/dist/contracts/privacy.contract.d.ts.map +1 -1
  50. package/dist/contracts/privacy.contract.js +12 -2
  51. package/dist/contracts/privacy.contract.js.map +1 -1
  52. package/dist/contracts/runner.contract.d.ts +648 -127
  53. package/dist/contracts/runner.contract.d.ts.map +1 -1
  54. package/dist/contracts/runner.contract.js +1 -1
  55. package/dist/contracts/runner.contract.js.map +1 -1
  56. package/dist/contracts/secrets.contract.d.ts +88 -0
  57. package/dist/contracts/secrets.contract.d.ts.map +1 -1
  58. package/dist/contracts/secrets.contract.js +20 -1
  59. package/dist/contracts/secrets.contract.js.map +1 -1
  60. package/dist/contracts/sessions.contract.d.ts +184 -0
  61. package/dist/contracts/sessions.contract.d.ts.map +1 -1
  62. package/dist/contracts/settings.contract.d.ts +16 -58
  63. package/dist/contracts/settings.contract.d.ts.map +1 -1
  64. package/dist/contracts/settings.contract.js +10 -1
  65. package/dist/contracts/settings.contract.js.map +1 -1
  66. package/dist/contracts/system.contract.d.ts +227 -32
  67. package/dist/contracts/system.contract.d.ts.map +1 -1
  68. package/dist/contracts/system.contract.js +18 -1
  69. package/dist/contracts/system.contract.js.map +1 -1
  70. package/dist/documents/conversions.d.ts.map +1 -1
  71. package/dist/documents/conversions.js +2 -1
  72. package/dist/documents/conversions.js.map +1 -1
  73. package/dist/documents/read.d.ts.map +1 -1
  74. package/dist/documents/read.js +4 -4
  75. package/dist/documents/read.js.map +1 -1
  76. package/dist/events/agent-events.d.ts +747 -1
  77. package/dist/events/agent-events.d.ts.map +1 -1
  78. package/dist/events/agent-events.js +14 -1
  79. package/dist/events/agent-events.js.map +1 -1
  80. package/dist/events/requests.d.ts +40 -0
  81. package/dist/events/requests.d.ts.map +1 -1
  82. package/dist/events/requests.js +39 -0
  83. package/dist/events/requests.js.map +1 -1
  84. package/dist/events/system-events.d.ts +120 -0
  85. package/dist/events/system-events.d.ts.map +1 -1
  86. package/dist/events/transcript.d.ts +1131 -1
  87. package/dist/events/transcript.d.ts.map +1 -1
  88. package/dist/events/transcript.js +9 -1
  89. package/dist/events/transcript.js.map +1 -1
  90. package/dist/ids/hostnames.d.ts +2 -0
  91. package/dist/ids/hostnames.d.ts.map +1 -1
  92. package/dist/ids/hostnames.js +18 -15
  93. package/dist/ids/hostnames.js.map +1 -1
  94. package/dist/ids/sandbox-id.d.ts +2 -0
  95. package/dist/ids/sandbox-id.d.ts.map +1 -0
  96. package/dist/ids/sandbox-id.js +2 -0
  97. package/dist/ids/sandbox-id.js.map +1 -0
  98. package/dist/ids/tunnel-ids.d.ts +1 -1
  99. package/dist/ids/tunnel-ids.d.ts.map +1 -1
  100. package/dist/ids/tunnel-ids.js +1 -1
  101. package/dist/ids/tunnel-ids.js.map +1 -1
  102. package/dist/index.d.ts +4902 -177
  103. package/dist/index.d.ts.map +1 -1
  104. package/dist/index.js +25 -9
  105. package/dist/index.js.map +1 -1
  106. package/dist/models/agent-catalog.d.ts +0 -1
  107. package/dist/models/agent-catalog.d.ts.map +1 -1
  108. package/dist/models/agent-catalog.js +0 -1
  109. package/dist/models/agent-catalog.js.map +1 -1
  110. package/dist/models/agent-runtimes.d.ts +1 -1
  111. package/dist/models/agent-runtimes.d.ts.map +1 -1
  112. package/dist/models/agent-runtimes.js +1 -1
  113. package/dist/models/agent-runtimes.js.map +1 -1
  114. package/dist/models/provider-specs.d.ts +1 -0
  115. package/dist/models/provider-specs.d.ts.map +1 -1
  116. package/dist/models/provider-specs.js +11 -0
  117. package/dist/models/provider-specs.js.map +1 -1
  118. package/dist/netd/browser-wire.d.ts.map +1 -0
  119. package/dist/netd/browser-wire.js.map +1 -0
  120. package/dist/{front → netd}/generated/browser-wire.d.ts +8 -0
  121. package/dist/netd/generated/browser-wire.d.ts.map +1 -0
  122. package/dist/netd/generated/browser-wire.js.map +1 -0
  123. package/dist/{front → netd}/generated/wire.d.ts +20 -11
  124. package/dist/netd/generated/wire.d.ts.map +1 -0
  125. package/dist/{front → netd}/generated/wire.js.map +1 -1
  126. package/dist/netd/netd-wire.d.ts +9 -0
  127. package/dist/netd/netd-wire.d.ts.map +1 -0
  128. package/dist/netd/netd-wire.js +8 -0
  129. package/dist/netd/netd-wire.js.map +1 -0
  130. package/dist/policy/credential-material.d.ts +2 -0
  131. package/dist/policy/credential-material.d.ts.map +1 -1
  132. package/dist/policy/credential-material.js +14 -8
  133. package/dist/policy/credential-material.js.map +1 -1
  134. package/dist/policy/message-limits.d.ts +14 -0
  135. package/dist/policy/message-limits.d.ts.map +1 -0
  136. package/dist/policy/message-limits.js +15 -0
  137. package/dist/policy/message-limits.js.map +1 -0
  138. package/dist/policy/request-status.d.ts.map +1 -1
  139. package/dist/policy/request-status.js +9 -1
  140. package/dist/policy/request-status.js.map +1 -1
  141. package/dist/policy/reserved-servers.d.ts.map +1 -1
  142. package/dist/policy/reserved-servers.js +1 -0
  143. package/dist/policy/reserved-servers.js.map +1 -1
  144. package/dist/policy/turned-away.d.ts.map +1 -1
  145. package/dist/policy/turned-away.js +2 -0
  146. package/dist/policy/turned-away.js.map +1 -1
  147. package/dist/protocol/container-requirements.d.ts.map +1 -1
  148. package/dist/protocol/container-requirements.js +3 -4
  149. package/dist/protocol/container-requirements.js.map +1 -1
  150. package/dist/protocol/doors/host-protocol.d.ts.map +1 -0
  151. package/dist/protocol/doors/host-protocol.js.map +1 -0
  152. package/dist/protocol/{listener-protocol.d.ts → doors/listener-protocol.d.ts} +22 -0
  153. package/dist/protocol/doors/listener-protocol.d.ts.map +1 -0
  154. package/dist/protocol/doors/listener-protocol.js +38 -0
  155. package/dist/protocol/doors/listener-protocol.js.map +1 -0
  156. package/dist/protocol/doors/phone-links.d.ts +16 -0
  157. package/dist/protocol/doors/phone-links.d.ts.map +1 -0
  158. package/dist/protocol/doors/phone-links.js +28 -0
  159. package/dist/protocol/doors/phone-links.js.map +1 -0
  160. package/dist/protocol/doors/phone-protocol.d.ts +47 -0
  161. package/dist/protocol/doors/phone-protocol.d.ts.map +1 -0
  162. package/dist/protocol/doors/phone-protocol.js +33 -0
  163. package/dist/protocol/doors/phone-protocol.js.map +1 -0
  164. package/dist/protocol/doors/runner-protocol.d.ts.map +1 -0
  165. package/dist/protocol/{runner-protocol.js → doors/runner-protocol.js} +1 -1
  166. package/dist/protocol/doors/runner-protocol.js.map +1 -0
  167. package/dist/protocol/{webext-links.d.ts → doors/webext-links.d.ts} +1 -0
  168. package/dist/protocol/doors/webext-links.d.ts.map +1 -0
  169. package/dist/protocol/{webext-links.js → doors/webext-links.js} +1 -0
  170. package/dist/protocol/doors/webext-links.js.map +1 -0
  171. package/dist/protocol/doors/webext-protocol.d.ts.map +1 -0
  172. package/dist/protocol/doors/webext-protocol.js.map +1 -0
  173. package/dist/protocol/edge-verdict.d.ts +1 -1
  174. package/dist/protocol/edge-verdict.d.ts.map +1 -1
  175. package/dist/protocol/headers.d.ts +4 -0
  176. package/dist/protocol/headers.d.ts.map +1 -0
  177. package/dist/protocol/headers.js +4 -0
  178. package/dist/protocol/headers.js.map +1 -0
  179. package/dist/protocol/ingress-contract.d.ts +1 -1
  180. package/dist/protocol/ingress-contract.d.ts.map +1 -1
  181. package/dist/protocol/ingress-contract.js +1 -5
  182. package/dist/protocol/ingress-contract.js.map +1 -1
  183. package/dist/protocol/peer-dial.d.ts.map +1 -1
  184. package/dist/protocol/peer-dial.js +18 -36
  185. package/dist/protocol/peer-dial.js.map +1 -1
  186. package/dist/protocol/raw/extension-protocol.d.ts +47 -0
  187. package/dist/protocol/raw/extension-protocol.d.ts.map +1 -0
  188. package/dist/protocol/raw/extension-protocol.js +32 -0
  189. package/dist/protocol/raw/extension-protocol.js.map +1 -0
  190. package/dist/protocol/raw/raw-json-routes.d.ts +855 -0
  191. package/dist/protocol/raw/raw-json-routes.d.ts.map +1 -0
  192. package/dist/protocol/raw/raw-json-routes.js +28 -0
  193. package/dist/protocol/raw/raw-json-routes.js.map +1 -0
  194. package/dist/protocol/{raw-routes.d.ts → raw/raw-routes.d.ts} +50 -3
  195. package/dist/protocol/raw/raw-routes.d.ts.map +1 -0
  196. package/dist/protocol/{raw-routes.js → raw/raw-routes.js} +17 -3
  197. package/dist/protocol/raw/raw-routes.js.map +1 -0
  198. package/dist/protocol/raw/route-path.d.ts +3 -0
  199. package/dist/protocol/raw/route-path.d.ts.map +1 -0
  200. package/dist/protocol/raw/route-path.js +8 -0
  201. package/dist/protocol/raw/route-path.js.map +1 -0
  202. package/dist/protocol/route-meta.d.ts +1 -1
  203. package/dist/protocol/route-meta.d.ts.map +1 -1
  204. package/dist/protocol/routes.d.ts +1 -0
  205. package/dist/protocol/routes.d.ts.map +1 -1
  206. package/dist/protocol/routes.js +8 -0
  207. package/dist/protocol/routes.js.map +1 -1
  208. package/dist/protocol/sse.d.ts +2 -1
  209. package/dist/protocol/sse.d.ts.map +1 -1
  210. package/dist/protocol/sse.js +23 -12
  211. package/dist/protocol/sse.js.map +1 -1
  212. package/dist/protocol/tunnel-bulk.js +1 -1
  213. package/dist/protocol/tunnel-bulk.js.map +1 -1
  214. package/dist/protocol/vitals.d.ts +2 -1
  215. package/dist/protocol/vitals.d.ts.map +1 -1
  216. package/dist/protocol/vitals.js +1 -0
  217. package/dist/protocol/vitals.js.map +1 -1
  218. package/dist/schemas/activity.d.ts +1 -0
  219. package/dist/schemas/activity.d.ts.map +1 -1
  220. package/dist/schemas/activity.js.map +1 -1
  221. package/dist/schemas/agent.d.ts +6 -0
  222. package/dist/schemas/agent.d.ts.map +1 -1
  223. package/dist/schemas/agent.js +9 -4
  224. package/dist/schemas/agent.js.map +1 -1
  225. package/dist/schemas/agents-list.d.ts +404 -0
  226. package/dist/schemas/agents-list.d.ts.map +1 -0
  227. package/dist/schemas/agents-list.js +14 -0
  228. package/dist/schemas/agents-list.js.map +1 -0
  229. package/dist/schemas/agents.d.ts +203 -0
  230. package/dist/schemas/agents.d.ts.map +1 -1
  231. package/dist/schemas/agents.js +44 -0
  232. package/dist/schemas/agents.js.map +1 -1
  233. package/dist/schemas/automations.d.ts +235 -347
  234. package/dist/schemas/automations.d.ts.map +1 -1
  235. package/dist/schemas/automations.js +82 -13
  236. package/dist/schemas/automations.js.map +1 -1
  237. package/dist/schemas/capabilities.d.ts +43 -8
  238. package/dist/schemas/capabilities.d.ts.map +1 -1
  239. package/dist/schemas/capabilities.js +6 -2
  240. package/dist/schemas/capabilities.js.map +1 -1
  241. package/dist/schemas/ci.d.ts +4 -0
  242. package/dist/schemas/ci.d.ts.map +1 -1
  243. package/dist/schemas/ci.js +8 -0
  244. package/dist/schemas/ci.js.map +1 -1
  245. package/dist/schemas/devices.d.ts +67 -0
  246. package/dist/schemas/devices.d.ts.map +1 -1
  247. package/dist/schemas/devices.js +8 -0
  248. package/dist/schemas/devices.js.map +1 -1
  249. package/dist/schemas/engines.d.ts +57 -0
  250. package/dist/schemas/engines.d.ts.map +1 -1
  251. package/dist/schemas/engines.js +4 -0
  252. package/dist/schemas/engines.js.map +1 -1
  253. package/dist/schemas/extension-updates.d.ts +329 -0
  254. package/dist/schemas/extension-updates.d.ts.map +1 -1
  255. package/dist/schemas/extension-updates.js +68 -3
  256. package/dist/schemas/extension-updates.js.map +1 -1
  257. package/dist/schemas/git/git.d.ts +11 -0
  258. package/dist/schemas/git/git.d.ts.map +1 -1
  259. package/dist/schemas/git/git.js +4 -4
  260. package/dist/schemas/git/git.js.map +1 -1
  261. package/dist/schemas/history.d.ts +2 -0
  262. package/dist/schemas/history.d.ts.map +1 -1
  263. package/dist/schemas/history.js.map +1 -1
  264. package/dist/schemas/hosts.d.ts +74 -0
  265. package/dist/schemas/hosts.d.ts.map +1 -1
  266. package/dist/schemas/hosts.js +10 -1
  267. package/dist/schemas/hosts.js.map +1 -1
  268. package/dist/schemas/loopback-catch.d.ts +1 -0
  269. package/dist/schemas/loopback-catch.d.ts.map +1 -1
  270. package/dist/schemas/loopback-catch.js +1 -0
  271. package/dist/schemas/loopback-catch.js.map +1 -1
  272. package/dist/schemas/maintenance.d.ts +8 -0
  273. package/dist/schemas/maintenance.d.ts.map +1 -1
  274. package/dist/schemas/maintenance.js +6 -0
  275. package/dist/schemas/maintenance.js.map +1 -1
  276. package/dist/schemas/members.d.ts +58 -0
  277. package/dist/schemas/members.d.ts.map +1 -0
  278. package/dist/schemas/members.js +16 -0
  279. package/dist/schemas/members.js.map +1 -0
  280. package/dist/schemas/metrics.d.ts +10 -0
  281. package/dist/schemas/metrics.d.ts.map +1 -1
  282. package/dist/schemas/metrics.js +19 -3
  283. package/dist/schemas/metrics.js.map +1 -1
  284. package/dist/schemas/needs.d.ts +1159 -1
  285. package/dist/schemas/needs.d.ts.map +1 -1
  286. package/dist/schemas/needs.js +25 -3
  287. package/dist/schemas/needs.js.map +1 -1
  288. package/dist/schemas/offload.js +1 -1
  289. package/dist/schemas/offload.js.map +1 -1
  290. package/dist/schemas/peer-enrollment.d.ts +7 -0
  291. package/dist/schemas/peer-enrollment.d.ts.map +1 -0
  292. package/dist/schemas/peer-enrollment.js +6 -0
  293. package/dist/schemas/peer-enrollment.js.map +1 -0
  294. package/dist/schemas/phone.d.ts +231 -0
  295. package/dist/schemas/phone.d.ts.map +1 -0
  296. package/dist/schemas/phone.js +57 -0
  297. package/dist/schemas/phone.js.map +1 -0
  298. package/dist/schemas/privacy.d.ts +41 -0
  299. package/dist/schemas/privacy.d.ts.map +1 -1
  300. package/dist/schemas/privacy.js +20 -3
  301. package/dist/schemas/privacy.js.map +1 -1
  302. package/dist/schemas/project-delivery.d.ts +94 -0
  303. package/dist/schemas/project-delivery.d.ts.map +1 -0
  304. package/dist/schemas/project-delivery.js +35 -0
  305. package/dist/schemas/project-delivery.js.map +1 -0
  306. package/dist/schemas/providers/plan-limits.d.ts +7 -0
  307. package/dist/schemas/providers/plan-limits.d.ts.map +1 -1
  308. package/dist/schemas/providers/plan-limits.js +22 -1
  309. package/dist/schemas/providers/plan-limits.js.map +1 -1
  310. package/dist/schemas/providers/usage.d.ts +1 -2
  311. package/dist/schemas/providers/usage.d.ts.map +1 -1
  312. package/dist/schemas/providers/usage.js +1 -2
  313. package/dist/schemas/providers/usage.js.map +1 -1
  314. package/dist/schemas/push.d.ts +1 -0
  315. package/dist/schemas/push.d.ts.map +1 -1
  316. package/dist/schemas/push.js.map +1 -1
  317. package/dist/schemas/secrets.d.ts +99 -0
  318. package/dist/schemas/secrets.d.ts.map +1 -1
  319. package/dist/schemas/secrets.js +34 -3
  320. package/dist/schemas/secrets.js.map +1 -1
  321. package/dist/schemas/settings-history.d.ts +1 -1
  322. package/dist/schemas/settings-history.d.ts.map +1 -1
  323. package/dist/schemas/settings-history.js +1 -0
  324. package/dist/schemas/settings-history.js.map +1 -1
  325. package/dist/schemas/settings.d.ts +13 -58
  326. package/dist/schemas/settings.d.ts.map +1 -1
  327. package/dist/schemas/settings.js +8 -13
  328. package/dist/schemas/settings.js.map +1 -1
  329. package/dist/schemas/terminal.d.ts +32 -0
  330. package/dist/schemas/terminal.d.ts.map +1 -1
  331. package/dist/schemas/terminal.js +37 -0
  332. package/dist/schemas/terminal.js.map +1 -1
  333. package/dist/schemas/updates.d.ts +1 -0
  334. package/dist/schemas/updates.d.ts.map +1 -1
  335. package/dist/schemas/updates.js +4 -0
  336. package/dist/schemas/updates.js.map +1 -1
  337. package/dist/schemas/workspace/workspace-search.d.ts +1 -0
  338. package/dist/schemas/workspace/workspace-search.d.ts.map +1 -1
  339. package/dist/schemas/workspace/workspace-search.js.map +1 -1
  340. package/dist/schemas/workspace/workspace-tree.d.ts +3 -0
  341. package/dist/schemas/workspace/workspace-tree.d.ts.map +1 -1
  342. package/dist/schemas/workspace/workspace-tree.js +22 -5
  343. package/dist/schemas/workspace/workspace-tree.js.map +1 -1
  344. package/dist/state/arrival.d.ts +59 -0
  345. package/dist/state/arrival.d.ts.map +1 -1
  346. package/dist/state/arrival.js +17 -0
  347. package/dist/state/arrival.js.map +1 -1
  348. package/dist/state/contract-lock.js +2 -2
  349. package/dist/state/contract-lock.js.map +1 -1
  350. package/dist/state/definition.d.ts +82 -16
  351. package/dist/state/definition.d.ts.map +1 -1
  352. package/dist/state/history-state.d.ts.map +1 -1
  353. package/dist/state/history-state.js +38 -0
  354. package/dist/state/history-state.js.map +1 -1
  355. package/dist/state/runtime-state.d.ts +6 -0
  356. package/dist/state/runtime-state.d.ts.map +1 -1
  357. package/dist/state/runtime-state.js +2 -0
  358. package/dist/state/runtime-state.js.map +1 -1
  359. package/dist/state/workspace-state.d.ts +24 -6
  360. package/dist/state/workspace-state.d.ts.map +1 -1
  361. package/dist/state/workspace-state.js +29 -7
  362. package/dist/state/workspace-state.js.map +1 -1
  363. package/dist/text/embed.d.ts +10 -0
  364. package/dist/text/embed.d.ts.map +1 -1
  365. package/dist/text/embed.js +25 -0
  366. package/dist/text/embed.js.map +1 -1
  367. package/dist/text/pages.d.ts +53 -0
  368. package/dist/text/pages.d.ts.map +1 -0
  369. package/dist/text/pages.js +230 -0
  370. package/dist/text/pages.js.map +1 -0
  371. package/dist/text/transcript-fold.d.ts +1 -0
  372. package/dist/text/transcript-fold.d.ts.map +1 -1
  373. package/dist/text/transcript-fold.js +30 -2
  374. package/dist/text/transcript-fold.js.map +1 -1
  375. package/dist/webext/index.d.ts +3 -2
  376. package/dist/webext/index.d.ts.map +1 -1
  377. package/dist/webext/index.js +3 -2
  378. package/dist/webext/index.js.map +1 -1
  379. package/package.json +77 -22
  380. package/src/chores/chores.ts +41 -21
  381. package/src/chores/{probes.test.ts → probes.integration.test.ts} +134 -1
  382. package/src/chores/probes.ts +128 -14
  383. package/src/chores/verdict.test.ts +29 -0
  384. package/src/contracts/agent.contract.ts +2 -2
  385. package/src/contracts/agents.contract.ts +1 -1
  386. package/src/contracts/automations.contract.ts +19 -1
  387. package/src/contracts/device.contract.ts +5 -0
  388. package/src/contracts/endpoints.contract.ts +32 -26
  389. package/src/contracts/extensions.contract.ts +49 -0
  390. package/src/contracts/pages.contract.ts +61 -0
  391. package/src/contracts/phone.contract.ts +21 -0
  392. package/src/contracts/privacy.contract.ts +13 -1
  393. package/src/contracts/runner.contract.ts +1 -1
  394. package/src/contracts/secrets.contract.ts +25 -0
  395. package/src/contracts/settings.contract.ts +10 -0
  396. package/src/contracts/system.contract.ts +26 -0
  397. package/src/documents/conversions.ts +3 -1
  398. package/src/documents/read.ts +4 -5
  399. package/src/events/agent-events.ts +27 -3
  400. package/src/events/requests.ts +47 -0
  401. package/src/events/transcript.ts +14 -0
  402. package/src/ids/hostnames.fixture.json +14 -10
  403. package/src/ids/hostnames.test.ts +21 -2
  404. package/src/ids/hostnames.ts +34 -15
  405. package/src/ids/sandbox-id.ts +3 -0
  406. package/src/ids/tunnel-ids.ts +1 -2
  407. package/src/index.ts +29 -12
  408. package/src/models/agent-catalog.ts +1 -2
  409. package/src/models/agent-runtimes.ts +12 -6
  410. package/src/models/provider-specs.test.ts +12 -0
  411. package/src/models/provider-specs.ts +16 -0
  412. package/src/{front → netd}/browser-wire.ts +1 -1
  413. package/src/{front → netd}/generated/browser-wire.json +80 -7
  414. package/src/{front → netd}/generated/browser-wire.ts +34 -7
  415. package/src/{front/generated/front-wire.json → netd/generated/netd-wire.json} +103 -41
  416. package/src/{front → netd}/generated/tunnel.json +15 -1
  417. package/src/{front → netd}/generated/wire.ts +26 -21
  418. package/src/netd/netd-wire.ts +24 -0
  419. package/src/{front → netd}/wire-manifests.test.ts +31 -11
  420. package/src/policy/credential-material.ts +39 -11
  421. package/src/policy/message-limits.ts +25 -0
  422. package/src/policy/request-status.ts +10 -1
  423. package/src/policy/reserved-servers.ts +3 -2
  424. package/src/policy/tests/credential-material.test.ts +49 -1
  425. package/src/policy/tests/message-limits.test.ts +27 -0
  426. package/src/policy/tests/reserved-servers.test.ts +3 -3
  427. package/src/policy/turned-away.ts +5 -1
  428. package/src/protocol/container-requirements.ts +4 -5
  429. package/src/protocol/{listener-protocol.ts → doors/listener-protocol.ts} +37 -15
  430. package/src/protocol/doors/phone-links.ts +50 -0
  431. package/src/protocol/doors/phone-protocol.test.ts +136 -0
  432. package/src/protocol/doors/phone-protocol.ts +71 -0
  433. package/src/protocol/{runner-protocol.ts → doors/runner-protocol.ts} +1 -1
  434. package/src/protocol/{webext-links.ts → doors/webext-links.ts} +4 -0
  435. package/src/protocol/edge-verdict.ts +1 -1
  436. package/src/protocol/headers.ts +14 -0
  437. package/src/protocol/ingress-contract.ts +6 -10
  438. package/src/protocol/peer-dial.test.ts +83 -4
  439. package/src/protocol/peer-dial.ts +33 -40
  440. package/src/protocol/raw/extension-protocol.ts +59 -0
  441. package/src/protocol/raw/raw-json-routes.ts +61 -0
  442. package/src/protocol/{raw-routes.ts → raw/raw-routes.ts} +40 -7
  443. package/src/protocol/raw/route-path.ts +13 -0
  444. package/src/protocol/route-meta.ts +4 -4
  445. package/src/protocol/routes.ts +12 -0
  446. package/src/protocol/sse.test.ts +49 -0
  447. package/src/protocol/sse.ts +29 -14
  448. package/src/protocol/tunnel-bulk.test.ts +1 -1
  449. package/src/protocol/tunnel-bulk.ts +2 -2
  450. package/src/protocol/vitals.test.ts +7 -7
  451. package/src/protocol/vitals.ts +12 -7
  452. package/src/schemas/activity.ts +1 -0
  453. package/src/schemas/agent.ts +11 -4
  454. package/src/schemas/agents-list.ts +24 -0
  455. package/src/schemas/agents.ts +71 -2
  456. package/src/schemas/automations.ts +126 -24
  457. package/src/schemas/capabilities.ts +13 -3
  458. package/src/schemas/ci.ts +10 -0
  459. package/src/schemas/devices.ts +24 -0
  460. package/src/schemas/engines.ts +7 -0
  461. package/src/schemas/extension-updates.ts +93 -3
  462. package/src/schemas/git/git.ts +15 -4
  463. package/src/schemas/history.ts +2 -0
  464. package/src/schemas/hosts.ts +23 -1
  465. package/src/schemas/loopback-catch.ts +6 -1
  466. package/src/schemas/maintenance.ts +9 -0
  467. package/src/schemas/members.ts +33 -0
  468. package/src/schemas/metrics.ts +21 -3
  469. package/src/schemas/needs.ts +36 -3
  470. package/src/schemas/offload.ts +1 -1
  471. package/src/schemas/peer-enrollment.ts +14 -0
  472. package/src/schemas/phone.ts +121 -0
  473. package/src/schemas/privacy.ts +36 -7
  474. package/src/schemas/project-delivery.ts +78 -0
  475. package/src/schemas/providers/plan-limits.ts +27 -3
  476. package/src/schemas/providers/usage.ts +3 -3
  477. package/src/schemas/push.ts +1 -0
  478. package/src/schemas/secrets.ts +54 -3
  479. package/src/schemas/settings-history.ts +2 -0
  480. package/src/schemas/settings.ts +20 -22
  481. package/src/schemas/terminal.ts +50 -0
  482. package/src/schemas/updates.test.ts +47 -0
  483. package/src/schemas/updates.ts +4 -0
  484. package/src/schemas/workspace/workspace-search.ts +2 -0
  485. package/src/schemas/workspace/workspace-tree.ts +40 -12
  486. package/src/state/arrival.ts +40 -0
  487. package/src/state/contract-lock.test.ts +1 -1
  488. package/src/state/contract-lock.ts +5 -5
  489. package/src/state/history-state.ts +72 -1
  490. package/src/state/runtime-state.ts +4 -0
  491. package/src/state/workspace-state.ts +65 -20
  492. package/src/text/embed.test.ts +21 -1
  493. package/src/text/embed.ts +50 -3
  494. package/src/text/pages.test.ts +161 -0
  495. package/src/text/pages.ts +344 -0
  496. package/src/text/transcript-fold.test.ts +22 -0
  497. package/src/text/transcript-fold.ts +41 -2
  498. package/src/webext/index.ts +3 -2
  499. package/dist/front/browser-wire.d.ts.map +0 -1
  500. package/dist/front/browser-wire.js.map +0 -1
  501. package/dist/front/front-wire.d.ts +0 -6
  502. package/dist/front/front-wire.d.ts.map +0 -1
  503. package/dist/front/front-wire.js +0 -5
  504. package/dist/front/front-wire.js.map +0 -1
  505. package/dist/front/generated/browser-wire.d.ts.map +0 -1
  506. package/dist/front/generated/browser-wire.js.map +0 -1
  507. package/dist/front/generated/wire.d.ts.map +0 -1
  508. package/dist/protocol/host-protocol.d.ts.map +0 -1
  509. package/dist/protocol/host-protocol.js.map +0 -1
  510. package/dist/protocol/listener-protocol.d.ts.map +0 -1
  511. package/dist/protocol/listener-protocol.js +0 -33
  512. package/dist/protocol/listener-protocol.js.map +0 -1
  513. package/dist/protocol/raw-routes.d.ts.map +0 -1
  514. package/dist/protocol/raw-routes.js.map +0 -1
  515. package/dist/protocol/request-id.d.ts +0 -2
  516. package/dist/protocol/request-id.d.ts.map +0 -1
  517. package/dist/protocol/request-id.js +0 -2
  518. package/dist/protocol/request-id.js.map +0 -1
  519. package/dist/protocol/runner-protocol.d.ts.map +0 -1
  520. package/dist/protocol/runner-protocol.js.map +0 -1
  521. package/dist/protocol/webext-links.d.ts.map +0 -1
  522. package/dist/protocol/webext-links.js.map +0 -1
  523. package/dist/protocol/webext-protocol.d.ts.map +0 -1
  524. package/dist/protocol/webext-protocol.js.map +0 -1
  525. package/src/front/front-wire.ts +0 -15
  526. package/src/protocol/request-id.ts +0 -2
  527. /package/dist/{front → netd}/browser-wire.d.ts +0 -0
  528. /package/dist/{front → netd}/browser-wire.js +0 -0
  529. /package/dist/{front → netd}/generated/browser-wire.js +0 -0
  530. /package/dist/{front → netd}/generated/wire.js +0 -0
  531. /package/dist/protocol/{host-protocol.d.ts → doors/host-protocol.d.ts} +0 -0
  532. /package/dist/protocol/{host-protocol.js → doors/host-protocol.js} +0 -0
  533. /package/dist/protocol/{runner-protocol.d.ts → doors/runner-protocol.d.ts} +0 -0
  534. /package/dist/protocol/{webext-protocol.d.ts → doors/webext-protocol.d.ts} +0 -0
  535. /package/dist/protocol/{webext-protocol.js → doors/webext-protocol.js} +0 -0
  536. /package/src/protocol/{host-protocol.ts → doors/host-protocol.ts} +0 -0
  537. /package/src/protocol/{webext-protocol.ts → doors/webext-protocol.ts} +0 -0
@@ -1,7 +1,9 @@
1
1
  {
2
2
  "askPatienceMs": 5000,
3
3
  "env": {
4
- "frontSocket": "INTENTIC_FRONT_SOCKET",
4
+ "generation": "INTENTIC_NODE_GENERATION",
5
+ "instance": "INTENTIC_INSTANCE",
6
+ "netdSocket": "INTENTIC_NETD_SOCKET",
5
7
  "nodeSocket": "INTENTIC_NODE_SOCKET"
6
8
  },
7
9
  "frame": {
@@ -99,33 +101,8 @@
99
101
  ],
100
102
  "type": "object"
101
103
  },
102
- "FrontQuestion": {
103
- "description": "A question Node asks the front.",
104
- "oneOf": [
105
- {
106
- "description": "Where each checkout's count stands, once every write that finished before this was sent is counted.",
107
- "properties": {
108
- "dirs": {
109
- "items": {
110
- "type": "string"
111
- },
112
- "type": "array"
113
- },
114
- "question": {
115
- "const": "sync",
116
- "type": "string"
117
- }
118
- },
119
- "required": [
120
- "question",
121
- "dirs"
122
- ],
123
- "type": "object"
124
- }
125
- ]
126
- },
127
104
  "ListenConfig": {
128
- "description": "Every port the front binds, as Node's config names them; an absent one is not bound.",
105
+ "description": "Every port netd binds, as Node's config names them; an absent one is not bound.",
129
106
  "properties": {
130
107
  "daemon": {
131
108
  "$ref": "#/$defs/Endpoint"
@@ -176,8 +153,33 @@
176
153
  ],
177
154
  "type": "object"
178
155
  },
156
+ "NetdQuestion": {
157
+ "description": "A question Node asks netd.",
158
+ "oneOf": [
159
+ {
160
+ "description": "Where each checkout's count stands, once every write that finished before this was sent is counted.",
161
+ "properties": {
162
+ "dirs": {
163
+ "items": {
164
+ "type": "string"
165
+ },
166
+ "type": "array"
167
+ },
168
+ "question": {
169
+ "const": "sync",
170
+ "type": "string"
171
+ }
172
+ },
173
+ "required": [
174
+ "question",
175
+ "dirs"
176
+ ],
177
+ "type": "object"
178
+ }
179
+ ]
180
+ },
179
181
  "Page": {
180
- "description": "An answer Node renders whole when asked, for the front to write as it stands: a refusal page, or the probe's report.",
182
+ "description": "An answer Node renders whole when asked, for netd to write as it stands: a refusal page, or the probe's report.",
181
183
  "properties": {
182
184
  "body": {
183
185
  "type": "string"
@@ -206,7 +208,7 @@
206
208
  "description": "What becomes of a preview host's request, decided by Node once, when asked.",
207
209
  "oneOf": [
208
210
  {
209
- "description": "The front relays it to this upstream.",
211
+ "description": "netd relays it to this upstream.",
210
212
  "properties": {
211
213
  "to": {
212
214
  "const": "upstream",
@@ -223,7 +225,7 @@
223
225
  "type": "object"
224
226
  },
225
227
  {
226
- "description": "The front answers it with this page.",
228
+ "description": "netd answers it with this page.",
227
229
  "properties": {
228
230
  "page": {
229
231
  "$ref": "#/$defs/Page"
@@ -265,7 +267,7 @@
265
267
  "description": "What a terminal socket opens onto, as Node decided from its ticket, session name and working directory.",
266
268
  "oneOf": [
267
269
  {
268
- "description": "The tmux session `name`, created in `create_in` when it does not exist yet; without a directory it is only ever\nattached, so a session that is gone fails as itself rather than as a bare shell in its place. The front composes\nthe command.",
270
+ "description": "The tmux session `name`, created in `create_in` when it does not exist yet; without a directory it is only ever\nattached, so a session that is gone fails as itself rather than as a bare shell in its place. netd composes\nthe command.",
269
271
  "properties": {
270
272
  "createIn": {
271
273
  "type": [
@@ -409,7 +411,7 @@
409
411
  "type": "object"
410
412
  },
411
413
  "WatchedCheckout": {
412
- "description": "A checkout whose changes the front counts: its working tree, the git dir holding its index and HEAD, and the common\ndir holding refs and excludes (the git dir itself for a repository's main checkout).",
414
+ "description": "A checkout whose changes netd counts: its working tree, the git dir holding its index and HEAD, and the common\ndir holding refs and excludes (the git dir itself for a repository's main checkout).",
413
415
  "properties": {
414
416
  "commonDir": {
415
417
  "type": "string"
@@ -429,14 +431,22 @@
429
431
  "type": "object"
430
432
  }
431
433
  },
432
- "description": "Everything Node sends the front.",
434
+ "description": "Everything Node sends netd.",
433
435
  "oneOf": [
434
436
  {
435
- "description": "Node's HTTP socket is accepting; once per Node process.",
437
+ "description": "Node's HTTP socket is accepting; once per Node process. `generation` is the `GENERATION_ENV` it was started with,\nabsent from a Node that predates it.",
436
438
  "properties": {
437
439
  "build": {
438
440
  "type": "string"
439
441
  },
442
+ "generation": {
443
+ "format": "uint64",
444
+ "minimum": 0,
445
+ "type": [
446
+ "integer",
447
+ "null"
448
+ ]
449
+ },
440
450
  "kind": {
441
451
  "const": "hello",
442
452
  "type": "string"
@@ -526,7 +536,7 @@
526
536
  "type": "string"
527
537
  },
528
538
  "question": {
529
- "$ref": "#/$defs/FrontQuestion"
539
+ "$ref": "#/$defs/NetdQuestion"
530
540
  }
531
541
  },
532
542
  "required": [
@@ -642,10 +652,10 @@
642
652
  ],
643
653
  "toNode": {
644
654
  "$defs": {
645
- "FrontAnswer": {
655
+ "NetdAnswer": {
646
656
  "oneOf": [
647
657
  {
648
- "description": "Each asked checkout's generation, in the order asked: a number that moves whenever anything a `git status` there\nreads may have changed, and null for a checkout the front is not counting.",
658
+ "description": "Each asked checkout's generation, in the order asked: a number that moves whenever anything a `git status` there\nreads may have changed, and null for a checkout netd is not counting.",
649
659
  "properties": {
650
660
  "answer": {
651
661
  "const": "sync",
@@ -672,7 +682,7 @@
672
682
  ]
673
683
  },
674
684
  "Question": {
675
- "description": "A question the front asks Node.",
685
+ "description": "A question netd asks Node.",
676
686
  "oneOf": [
677
687
  {
678
688
  "description": "What becomes of a request to a preview host; `probe` when it asks the preview probe's path.",
@@ -713,7 +723,7 @@
713
723
  "type": "object"
714
724
  },
715
725
  {
716
- "description": "Whether Node's event loop turns, and how fast: answered `pong` at once, by the link itself. The front sends one\nevery 2 s once the previous one is answered, and reports the round trip as the vitals' lag. An older Node answers\nwith a refusal, or with an answer the front cannot read, and either still counts as answered.",
726
+ "description": "Whether Node's event loop turns, and how fast: answered `pong` at once, by the link itself. netd sends one\nevery 2 s once the previous one is answered, and reports the round trip as the vitals' lag. An older Node answers\nwith a refusal, or with an answer netd cannot read, and either still counts as answered.",
717
727
  "properties": {
718
728
  "question": {
719
729
  "const": "ping",
@@ -726,9 +736,44 @@
726
736
  "type": "object"
727
737
  }
728
738
  ]
739
+ },
740
+ "TunnelRefusal": {
741
+ "description": "Why netd stopped dialling the ingress at its usual pace, past an ordinary drop it redials at once.",
742
+ "oneOf": [
743
+ {
744
+ "description": "Another copy of this sandbox (a container holding the same grant) holds its tunnel, running on `host` as the\nedge named it: the edge refused this netd three times in a row, and netd now dials every 15 minutes.",
745
+ "properties": {
746
+ "host": {
747
+ "type": "string"
748
+ },
749
+ "refusal": {
750
+ "const": "elsewhere",
751
+ "type": "string"
752
+ }
753
+ },
754
+ "required": [
755
+ "refusal",
756
+ "host"
757
+ ],
758
+ "type": "object"
759
+ },
760
+ {
761
+ "description": "The platform deleted this sandbox: the edge closed its tunnel for that, and netd stopped dialling.",
762
+ "properties": {
763
+ "refusal": {
764
+ "const": "deleted",
765
+ "type": "string"
766
+ }
767
+ },
768
+ "required": [
769
+ "refusal"
770
+ ],
771
+ "type": "object"
772
+ }
773
+ ]
729
774
  }
730
775
  },
731
- "description": "Everything the front sends Node.",
776
+ "description": "Everything netd sends Node.",
732
777
  "oneOf": [
733
778
  {
734
779
  "properties": {
@@ -755,7 +800,7 @@
755
800
  {
756
801
  "properties": {
757
802
  "answer": {
758
- "$ref": "#/$defs/FrontAnswer"
803
+ "$ref": "#/$defs/NetdAnswer"
759
804
  },
760
805
  "id": {
761
806
  "format": "uint32",
@@ -797,6 +842,7 @@
797
842
  "type": "object"
798
843
  },
799
844
  {
845
+ "description": "Where the ingress tunnel's interactive socket stands, told on every change and again to each Node that says\nhello. `reason` says why it is not held, in netd's words (a drop, the edge's refusal), and `refused` when\nnetd stopped redialling at its usual pace (2026-10-05).",
800
846
  "properties": {
801
847
  "connected": {
802
848
  "type": "boolean"
@@ -804,6 +850,22 @@
804
850
  "kind": {
805
851
  "const": "tunnel",
806
852
  "type": "string"
853
+ },
854
+ "reason": {
855
+ "type": [
856
+ "string",
857
+ "null"
858
+ ]
859
+ },
860
+ "refused": {
861
+ "anyOf": [
862
+ {
863
+ "$ref": "#/$defs/TunnelRefusal"
864
+ },
865
+ {
866
+ "type": "null"
867
+ }
868
+ ]
807
869
  }
808
870
  },
809
871
  "required": [
@@ -1,7 +1,10 @@
1
1
  {
2
2
  "close": {
3
3
  "away": 1001,
4
+ "deleted": 4010,
5
+ "demoted": 4008,
4
6
  "displaced": 4001,
7
+ "heldElsewhere": 4009,
5
8
  "refused": 4003
6
9
  },
7
10
  "headers": {
@@ -10,23 +13,34 @@
10
13
  "lane": "x-intentic-lane",
11
14
  "transports": "x-intentic-transports"
12
15
  },
16
+ "identity": {
17
+ "holder": "x-intentic-holder",
18
+ "host": "x-intentic-host",
19
+ "instance": "x-intentic-instance"
20
+ },
13
21
  "lanes": [
14
22
  "interactive",
15
23
  "bulk"
16
24
  ],
17
25
  "liveness": {
18
26
  "deadAfterMs": 45000,
19
- "pingEveryMs": 15000
27
+ "helloPatienceMs": 15000,
28
+ "pingEveryMs": 15000,
29
+ "probeEveryMs": 15000,
30
+ "probePatienceMs": 10000
20
31
  },
21
32
  "mux": "yamux",
22
33
  "path": "/tunnel/v2",
23
34
  "quic": {
24
35
  "alpn": "intentic-tunnel/1",
25
36
  "hello": {
37
+ "acknowledged": 1,
26
38
  "gone": 2,
27
39
  "held": 0,
40
+ "heldElsewhere": 3,
28
41
  "refused": 1
29
42
  },
43
+ "probe": "\u0000intentic-probe\n",
30
44
  "yieldAfterBytes": 1048576
31
45
  },
32
46
  "transports": [
@@ -14,25 +14,12 @@ export type Certificate = { certificate: string, privateKey: string, };
14
14
  export type Endpoint = { host: string, port: number, };
15
15
 
16
16
  /**
17
- * Everything Node sends the front.
17
+ * Everything Node sends netd.
18
18
  */
19
- export type FromNode = { "kind": "hello", build: string, pid: number, } | { "kind": "listen", config: ListenConfig, } | { "kind": "certificate", certificate?: Certificate, } | { "kind": "tunnel", tunnel?: TunnelConfig, } | { "kind": "ask", id: number, question: FrontQuestion, } | { "kind": "answer", id: number, answer: Answer, } | { "kind": "refused", id: number, message: string, } | { "kind": "revoke", member?: string, } | { "kind": "watch", checkout: WatchedCheckout, } | { "kind": "unwatch", dir: string, };
20
-
21
- export type FrontAnswer = { "answer": "sync", generations: Array<number | null>, };
22
-
23
- /**
24
- * Request headers only the front sets on what it forwards to Node; it strips them from everything arriving outside.
25
- * Exported as a literal type, so a Node constant naming one that drifts from this spelling fails to compile.
26
- */
27
- export type FrontHeader = "x-intentic-preview" | "x-intentic-preview-unreachable";
19
+ export type FromNode = { "kind": "hello", build: string, pid: number, generation?: number, } | { "kind": "listen", config: ListenConfig, } | { "kind": "certificate", certificate?: Certificate, } | { "kind": "tunnel", tunnel?: TunnelConfig, } | { "kind": "ask", id: number, question: NetdQuestion, } | { "kind": "answer", id: number, answer: Answer, } | { "kind": "refused", id: number, message: string, } | { "kind": "revoke", member?: string, } | { "kind": "watch", checkout: WatchedCheckout, } | { "kind": "unwatch", dir: string, };
28
20
 
29
21
  /**
30
- * A question Node asks the front.
31
- */
32
- export type FrontQuestion = { "question": "sync", dirs: Array<string>, };
33
-
34
- /**
35
- * Every port the front binds, as Node's config names them; an absent one is not bound.
22
+ * Every port netd binds, as Node's config names them; an absent one is not bound.
36
23
  */
37
24
  export type ListenConfig = { daemon: Endpoint, preview?: Endpoint, loopback?: Endpoint,
38
25
  /**
@@ -48,8 +35,21 @@ frameAncestors: Array<string>,
48
35
  */
49
36
  previewProbePath: string, };
50
37
 
38
+ export type NetdAnswer = { "answer": "sync", generations: Array<number | null>, };
39
+
51
40
  /**
52
- * An answer Node renders whole when asked, for the front to write as it stands: a refusal page, or the probe's report.
41
+ * Request headers only netd sets on what it forwards to Node; it strips them from everything arriving outside.
42
+ * Exported as a literal type, so a Node constant naming one that drifts from this spelling fails to compile.
43
+ */
44
+ export type NetdHeader = "x-intentic-preview" | "x-intentic-preview-unreachable";
45
+
46
+ /**
47
+ * A question Node asks netd.
48
+ */
49
+ export type NetdQuestion = { "question": "sync", dirs: Array<string>, };
50
+
51
+ /**
52
+ * An answer Node renders whole when asked, for netd to write as it stands: a refusal page, or the probe's report.
53
53
  */
54
54
  export type Page = { status: number, headers: { [key in string]: string }, body: string, };
55
55
 
@@ -59,7 +59,7 @@ export type Page = { status: number, headers: { [key in string]: string }, body:
59
59
  export type PreviewRoute = { "to": "upstream", upstream: Upstream, } | { "to": "page", page: Page, } | { "to": "outbox" };
60
60
 
61
61
  /**
62
- * A question the front asks Node.
62
+ * A question netd asks Node.
63
63
  */
64
64
  export type Question = { "question": "preview", host: string, probe: boolean, } | { "question": "terminal", query: string, } | { "question": "ping" };
65
65
 
@@ -71,9 +71,9 @@ export type Scheme = "http" | "https";
71
71
  export type TerminalPlan = { "plan": "session", name: string, createIn?: string, } | { "plan": "tail", path: string, } | { "plan": "exit", code: number, reason: string, } | { "plan": "refused", code: number, reason: string, };
72
72
 
73
73
  /**
74
- * Everything the front sends Node.
74
+ * Everything netd sends Node.
75
75
  */
76
- export type ToNode = { "kind": "ask", id: number, question: Question, } | { "kind": "answer", id: number, answer: FrontAnswer, } | { "kind": "refused", id: number, message: string, } | { "kind": "tunnel", connected: boolean, };
76
+ export type ToNode = { "kind": "ask", id: number, question: Question, } | { "kind": "answer", id: number, answer: NetdAnswer, } | { "kind": "refused", id: number, message: string, } | { "kind": "tunnel", connected: boolean, reason?: string, refused?: TunnelRefusal, };
77
77
 
78
78
  /**
79
79
  * The ingress tunnel's door, the reachability grant it presents there, and the daemon's transfer routes it announces
@@ -81,6 +81,11 @@ export type ToNode = { "kind": "ask", id: number, question: Question, } | { "kin
81
81
  */
82
82
  export type TunnelConfig = { url: string, grant: string, bulk: Array<string>, };
83
83
 
84
+ /**
85
+ * Why netd stopped dialling the ingress at its usual pace, past an ordinary drop it redials at once.
86
+ */
87
+ export type TunnelRefusal = { "refusal": "elsewhere", host: string, } | { "refusal": "deleted" };
88
+
84
89
  /**
85
90
  * A local upstream a preview host relays to.
86
91
  */
@@ -95,7 +100,7 @@ localhost: boolean,
95
100
  frameable: boolean, };
96
101
 
97
102
  /**
98
- * A checkout whose changes the front counts: its working tree, the git dir holding its index and HEAD, and the common
103
+ * A checkout whose changes netd counts: its working tree, the git dir holding its index and HEAD, and the common
99
104
  * dir holding refs and excludes (the git dir itself for a repository's main checkout).
100
105
  */
101
106
  export type WatchedCheckout = { dir: string, gitDir: string, commonDir: string, };
@@ -0,0 +1,24 @@
1
+ // The control socket between intentic-netd and the daemon. The Rust crate `netd-wire` is the definition: its types
2
+ // arrive as TypeScript in generated/, and every value here is held to the manifest it writes beside it
3
+ // (wire-manifests.test.ts), which contract.lock.json pins.
4
+
5
+ export type * from "./generated/wire.js";
6
+
7
+ // Set by intentic-netd on the daemon it spawns: where to dial the control socket, and where to serve HTTP.
8
+ export const NETD_SOCKET_ENV = "INTENTIC_NETD_SOCKET";
9
+ export const NODE_SOCKET_ENV = "INTENTIC_NODE_SOCKET";
10
+ // Also set by intentic-netd on each daemon it starts: which start this is, counted from 1 and said back in the hello, so
11
+ // netd hands the control socket to a newer start and never to a copy of the same one.
12
+ export const NODE_GENERATION_ENV = "INTENTIC_NODE_GENERATION";
13
+ // Which copy of the sandbox is speaking, set once per container start when netd can, so a daemon restarted inside one
14
+ // container stays the same copy.
15
+ export const INSTANCE_ENV = "INTENTIC_INSTANCE";
16
+
17
+ // How long either side waits for the answer to a question it asked before giving up on it.
18
+ export const ASK_PATIENCE_MS = 5000;
19
+
20
+ // A frame is this many bytes of big-endian length, then that many bytes of JSON.
21
+ export const FRAME_LENGTH_BYTES = 4;
22
+ // The largest frame either side accepts. A length past it means the stream is corrupt, never a large message, and the
23
+ // link is dropped rather than buffering toward it.
24
+ export const FRAME_MAX_BYTES = 64 * 1024 * 1024;
@@ -1,9 +1,17 @@
1
1
  import { readFileSync } from "node:fs";
2
2
  import { EDGE_VERDICT_HEADER, edgeVerdictOf } from "../protocol/edge-verdict.js";
3
3
  import { INGRESS_GRANT_HEADER, INGRESS_TUNNEL_PATH } from "../protocol/ingress-contract.js";
4
- import { VITALS_PATH } from "../protocol/vitals.js";
4
+ import { VITALS_FILE, VITALS_PATH } from "../protocol/vitals.js";
5
5
  import { EDGE_TRANSPORTS, TERMINAL_PATH, WEBTRANSPORT_PATH } from "./browser-wire.js";
6
- import { ASK_PATIENCE_MS, FRAME_LENGTH_BYTES, FRONT_SOCKET_ENV, NODE_SOCKET_ENV } from "./front-wire.js";
6
+ import {
7
+ ASK_PATIENCE_MS,
8
+ FRAME_LENGTH_BYTES,
9
+ FRAME_MAX_BYTES,
10
+ INSTANCE_ENV,
11
+ NETD_SOCKET_ENV,
12
+ NODE_GENERATION_ENV,
13
+ NODE_SOCKET_ENV,
14
+ } from "./netd-wire.js";
7
15
 
8
16
  // The manifests `cargo test` writes from the Rust crates that define this wire: every value TypeScript restates is read
9
17
  // back against them, so the two languages cannot drift and contract.lock.json pins what both agree on.
@@ -15,16 +23,16 @@ const tunnel = manifest("tunnel") as {
15
23
  headers: { grant: string; transports: string };
16
24
  transports: string[];
17
25
  };
18
- // SAFETY: front-wire's own test writes this manifest with exactly these keys, and the lock pins them.
19
- const socket = manifest("front-wire") as {
20
- env: { frontSocket: string; nodeSocket: string };
26
+ // SAFETY: netd-wire's own test writes this manifest with exactly these keys, and the lock pins them.
27
+ const socket = manifest("netd-wire") as {
28
+ env: { netdSocket: string; nodeSocket: string; generation: string; instance: string };
21
29
  askPatienceMs: number;
22
- frame: { lengthBytes: number };
30
+ frame: { lengthBytes: number; maxBytes: number };
23
31
  };
24
32
  const browser = manifest("browser-wire") as {
25
33
  edge: { verdictHeader: string; verdicts: { oneOf: { const: string }[] } };
26
34
  terminal: { path: string; upgrade: string };
27
- vitals: { path: string; body: { $defs: { NodeLink: { oneOf: { const: string }[] } } } };
35
+ vitals: { path: string; file: string; body: { $defs: { NodeLink: { oneOf: { const: string }[] } } } };
28
36
  webTransport: { path: string };
29
37
  };
30
38
 
@@ -36,12 +44,23 @@ describe("the wire outside oRPC, as the Rust crates define it", () => {
36
44
  });
37
45
  });
38
46
 
39
- it("names the control socket's env vars, its patience and its framing as front-wire does", () => {
40
- expect({ front: FRONT_SOCKET_ENV, node: NODE_SOCKET_ENV, patience: ASK_PATIENCE_MS, length: FRAME_LENGTH_BYTES }).toEqual({
41
- front: socket.env.frontSocket,
47
+ it("names the control socket's env vars, its patience and its framing as netd-wire does", () => {
48
+ expect({
49
+ netd: NETD_SOCKET_ENV,
50
+ node: NODE_SOCKET_ENV,
51
+ generation: NODE_GENERATION_ENV,
52
+ instance: INSTANCE_ENV,
53
+ patience: ASK_PATIENCE_MS,
54
+ length: FRAME_LENGTH_BYTES,
55
+ max: FRAME_MAX_BYTES,
56
+ }).toEqual({
57
+ netd: socket.env.netdSocket,
42
58
  node: socket.env.nodeSocket,
59
+ generation: socket.env.generation,
60
+ instance: socket.env.instance,
43
61
  patience: socket.askPatienceMs,
44
62
  length: socket.frame.lengthBytes,
63
+ max: socket.frame.maxBytes,
45
64
  });
46
65
  });
47
66
 
@@ -61,8 +80,9 @@ describe("the wire outside oRPC, as the Rust crates define it", () => {
61
80
  });
62
81
  });
63
82
 
64
- it("finds the front's vitals where browser-wire says it answers them, in the states it names", () => {
83
+ it("finds netd's vitals where browser-wire says it answers them, in the states it names", () => {
65
84
  expect(VITALS_PATH).toBe(browser.vitals.path);
85
+ expect(VITALS_FILE).toBe(browser.vitals.file);
66
86
  expect(browser.vitals.body.$defs.NodeLink.oneOf.map((state) => state.const)).toEqual(["starting", "up", "restarting"]);
67
87
  });
68
88
  });
@@ -13,17 +13,21 @@ const PLACEHOLDER =
13
13
  // Shorter than any credential a service issues; clears dev-compose defaults like POSTGRES_PASSWORD=dev.
14
14
  const MIN_VALUE = 6;
15
15
 
16
- // Credentials recognisable without a key: issuer-prefixed tokens, PEM/PuTTY headers, a URL's userinfo password.
16
+ // Credentials recognisable without a key: issuer-prefixed tokens, PEM/PuTTY headers, a URL's userinfo password. Each one
17
+ // already masked is excluded (a header followed by the mask, a `***@` userinfo), so masked text never reads as holding a
18
+ // credential: the share page masks with this table and the public outbox then sniffs it with the same one.
17
19
  const STRUCTURAL_SHAPES = [
18
- /-----BEGIN (?:[A-Z0-9]+ )*PRIVATE KEY-----/,
19
- /PuTTY-User-Key-File-\d/,
20
+ // A header followed by a body line (base64 or a `Proc-Type:` header) or nothing at all, the way a read cut short ends;
21
+ // lines split by newlines or by `\n` escapes, as a key inside JSON is.
22
+ /-----BEGIN (?:[A-Z0-9]+ )*PRIVATE KEY(?: BLOCK)?-----(?=(?:\s|\\[nr])*(?:$|[A-Za-z0-9+/]{4}|[A-Za-z-]+:))/,
23
+ /PuTTY-User-Key-File-\d:(?![ \t]*\*\*\*)/,
20
24
  // scheme://user:password@host; a DSN's bare key@host (no colon) or an already-masked ***@ userinfo is excluded.
21
25
  /\b[a-z][a-z0-9+.-]*:\/\/[^\s/:@]+:(?!\*+@)[^\s/@]{3,}@/i,
22
26
  ];
23
27
 
24
28
  const ISSUED_TOKENS = [
25
29
  /\bnpm_[A-Za-z0-9]{30,}/,
26
- /\b(?:ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9]{30,}/,
30
+ /\bgh[pousr]_[A-Za-z0-9]{20,}/,
27
31
  /\bgithub_pat_[A-Za-z0-9_]{50,}/,
28
32
  /\bglpat-[A-Za-z0-9_-]{16,}/,
29
33
  /\bxox[baprs]-[A-Za-z0-9-]{10,}/,
@@ -43,11 +47,16 @@ const TOKEN_SHAPES = [...STRUCTURAL_SHAPES, ...ISSUED_TOKENS];
43
47
  // Deferred references, stripped first: unstripped, each reads as a credential twice over.
44
48
  const DEFERRED_VALUE = /\{\{[^}\n]*\}\}|\$\{[^}\n]*\}/g;
45
49
 
50
+ // The self-identifying half of the detector: only shapes that name their own issuer or structure, never a key=value
51
+ // guess. For text that is not known to be a credential file, where precision matters more than recall: the public
52
+ // outbox sniffs published files with this, and a minified bundle's `apiKey:process.env.API_KEY` must not refuse it.
53
+ export const holdsCredentialToken = (text: string): boolean => TOKEN_SHAPES.some((pattern) => pattern.test(text));
54
+
46
55
  // Does this file's text hold something worth a card? Handed the whole file; the caller decides how much of a large one
47
56
  // to read.
48
57
  export const holdsCredentialMaterial = (file: string): boolean => {
49
58
  const text = file.replace(DEFERRED_VALUE, "");
50
- if (TOKEN_SHAPES.some((pattern) => pattern.test(text))) {
59
+ if (holdsCredentialToken(text)) {
51
60
  return true;
52
61
  }
53
62
  for (const match of text.matchAll(CREDENTIAL_ASSIGNMENT)) {
@@ -59,24 +68,43 @@ export const holdsCredentialMaterial = (file: string): boolean => {
59
68
  return false;
60
69
  };
61
70
 
62
- // Blunt because scoped to reads already known to be of a credential file; a .ppk body is the one known gap.
63
- const MASK = "***";
71
+ // What a masked credential reads as; the detectors above skip it wherever it stands in for a value.
72
+ export const CREDENTIAL_MASK = "***";
73
+ const MASK = CREDENTIAL_MASK;
64
74
 
65
75
  // The g twins, built once: the tables above skip g since `test` wants none, but replace/replaceAll demands one.
66
76
  const globally = (patterns: readonly RegExp[]): readonly RegExp[] => patterns.map((pattern) => new RegExp(pattern.source, `${pattern.flags}g`));
67
77
  const ISSUED_TOKENS_G = globally(ISSUED_TOKENS);
68
78
  const CREDENTIAL_ASSIGNMENT_G = new RegExp(CREDENTIAL_ASSIGNMENT.source, CREDENTIAL_ASSIGNMENT.flags);
69
79
 
70
- // The two shapes that mask to something else: a PEM keeps its header/footer, a URL keeps scheme, user and host.
71
- const PRIVATE_KEY_BLOCK = /(-----BEGIN ((?:[A-Z0-9]+ )*)PRIVATE KEY-----)[\s\S]*?(-----END \2PRIVATE KEY-----)/g;
80
+ // Already masked, so masking twice changes nothing.
81
+ const MASKED_NEXT = String.raw`(?!(?:\s|\\[nr])*\*\*\*)`;
82
+ // One armored body line after a newline or a `\n` escape: a whole line of base64 (ended by the line or by the string or
83
+ // markup quoting it, never by more words), or a `Proc-Type: 4,ENCRYPTED` style header.
84
+ const ARMOR_LINES = String.raw`(?:(?:\s|\\[nr])+(?:[A-Za-z-]+:[^\n\\]*|[A-Za-z0-9+/=]+(?=[ \t]*(?:[\r\n"'\`<>,;})\]]|\\[nr]|$))))*`;
85
+ // The shapes that mask to something else: a PEM keeps its header and footer, its body masked through to the matching
86
+ // footer, or through its last body line when the text was cut short before one; a PuTTY key keeps its first line's
87
+ // label; a URL keeps scheme, user and host.
88
+ const PRIVATE_KEY_BLOCK = new RegExp(
89
+ String.raw`(-----BEGIN ((?:[A-Z0-9]+ )*)PRIVATE KEY( BLOCK)?-----)${MASKED_NEXT}(?:[\s\S]*?(-----END \2PRIVATE KEY\3-----)|${ARMOR_LINES})`,
90
+ "g",
91
+ );
92
+ const PUTTY_KEY = new RegExp(String.raw`(PuTTY-User-Key-File-\d:)${MASKED_NEXT}[^\n\\]*${ARMOR_LINES}`, "g");
72
93
  const URL_PASSWORD = /(\b[a-z][a-z0-9+.-]*:\/\/[^\s/:@]+:)(?!\*+@)[^\s/@]{3,}@/gi;
73
94
 
74
95
  // The truncated opener left once the bare-value arm stops at its first `}`, anchored at the start.
75
96
  const DEFERRED_OPENER = /^(?:\{\{|\$)/;
76
97
 
98
+ // Keys first: a token shape matched inside a key's body would cut the body short before the key pass reached it.
77
99
  export const maskCredentialMaterial = (text: string): string =>
78
- ISSUED_TOKENS_G.reduce((masked, token) => masked.replace(token, MASK), text)
79
- .replace(PRIVATE_KEY_BLOCK, `$1\n${MASK}\n$3`)
100
+ ISSUED_TOKENS_G.reduce(
101
+ (masked, token) => masked.replace(token, MASK),
102
+ text
103
+ .replace(PRIVATE_KEY_BLOCK, (_block, header: string, _label, _kind, footer: string | undefined) =>
104
+ footer === undefined ? `${header}\n${MASK}` : `${header}\n${MASK}\n${footer}`,
105
+ )
106
+ .replace(PUTTY_KEY, `$1 ${MASK}`),
107
+ )
80
108
  .replace(URL_PASSWORD, `$1${MASK}@`)
81
109
  // Masks just the value, leaving key/separator/quoting readable; skips mirror the detector's own.
82
110
  .replace(CREDENTIAL_ASSIGNMENT_G, (match, ...groups: unknown[]) => {
@@ -0,0 +1,25 @@
1
+ // The longest one message may be on each platform, declared once: the approvals inbox counts a post against it (over it,
2
+ // a post does not post), the daemon refuses a direct publish past it, and each messaging gateway spills a reply into a
3
+ // follow-up message there. Measured in JavaScript string length (UTF-16 code units), which never undercounts a
4
+ // platform that counts characters. A platform absent here has no known cap.
5
+ export const MESSAGE_LIMITS = {
6
+ bluesky: 300,
7
+ discord: 2_000,
8
+ instagram: 2_200,
9
+ linkedin: 3_000,
10
+ mastodon: 500,
11
+ // Slack's own advice is to keep a message under 4,000 characters; past 40,000 it truncates.
12
+ slack: 4_000,
13
+ // sendMessage refuses anything longer outright.
14
+ telegram: 4_096,
15
+ // A linked device (what the WhatsApp extension is) sends up to 65,536; the 4,096 often quoted is the Business API's.
16
+ whatsapp: 65_536,
17
+ x: 280,
18
+ youtube: 5_000,
19
+ } as const satisfies Readonly<Record<string, number>>;
20
+
21
+ // `platform` is a bare string by contract, matched case-insensitively. A Map, so only the table's own keys answer: a
22
+ // record lookup answered `constructor` with Object.prototype's function.
23
+ const LIMITS = new Map<string, number>(Object.entries(MESSAGE_LIMITS));
24
+
25
+ export const messageLimitOf = (platform: string): number | undefined => LIMITS.get(platform.toLowerCase());
@@ -24,7 +24,7 @@ const permissionStatusOf = (reply: AgentReply | undefined): PermissionStatus =>
24
24
 
25
25
  export const settledRequests = (cards: TranscriptRequests, reply: AgentReply | undefined): TranscriptRequests => {
26
26
  const out: Cards = {};
27
- const { plan, question, permission, browserHelp, terminalHelp, capabilityOffer, paymentOffer, credentialOffer } = cards;
27
+ const { plan, question, permission, browserHelp, terminalHelp, capabilityOffer, paymentOffer, credentialOffer, pageAsk } = cards;
28
28
  if (plan !== undefined) {
29
29
  out.plan = { ...plan, status: reply?.kind !== "plan" ? "cancelled" : reply.approve ? "approved" : "rejected" };
30
30
  }
@@ -68,6 +68,15 @@ export const settledRequests = (cards: TranscriptRequests, reply: AgentReply | u
68
68
  status: reply?.kind !== "credential_offer" ? "cancelled" : reply.approve ? "approved" : "skipped",
69
69
  };
70
70
  }
71
+ // The page's answer rides the card, as the agent was handed it; a dismissal keeps none.
72
+ if (pageAsk !== undefined) {
73
+ const answered = reply?.kind === "page_ask" && reply.cancelled !== true;
74
+ out.pageAsk = {
75
+ ...pageAsk,
76
+ status: answered ? "answered" : "cancelled",
77
+ ...(answered && reply.value !== undefined ? { value: reply.value } : {}),
78
+ };
79
+ }
71
80
  return out;
72
81
  };
73
82