@viewportai/daemon 0.2.0 → 0.3.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 (818) hide show
  1. package/README.md +18 -6
  2. package/bin/vpd.js +0 -1
  3. package/dist/adapters/claude-message-normalizer.d.ts +24 -0
  4. package/dist/adapters/claude-message-normalizer.d.ts.map +1 -0
  5. package/dist/adapters/claude-message-normalizer.js +192 -0
  6. package/dist/adapters/claude-message-normalizer.js.map +1 -0
  7. package/dist/adapters/claude.d.ts +1 -23
  8. package/dist/adapters/claude.d.ts.map +1 -1
  9. package/dist/adapters/claude.js +20 -215
  10. package/dist/adapters/claude.js.map +1 -1
  11. package/dist/adapters/codex-sdk-loader.d.ts +1 -0
  12. package/dist/adapters/codex-sdk-loader.d.ts.map +1 -1
  13. package/dist/adapters/codex.d.ts +6 -2
  14. package/dist/adapters/codex.d.ts.map +1 -1
  15. package/dist/adapters/codex.js +44 -19
  16. package/dist/adapters/codex.js.map +1 -1
  17. package/dist/adapters/gemini-cli.js +2 -2
  18. package/dist/adapters/gemini-cli.js.map +1 -1
  19. package/dist/adapters/pty.d.ts.map +1 -1
  20. package/dist/adapters/pty.js +12 -10
  21. package/dist/adapters/pty.js.map +1 -1
  22. package/dist/agents/codex-defaults.d.ts +2 -0
  23. package/dist/agents/codex-defaults.d.ts.map +1 -0
  24. package/dist/agents/codex-defaults.js +2 -0
  25. package/dist/agents/codex-defaults.js.map +1 -0
  26. package/dist/agents/codex.d.ts.map +1 -1
  27. package/dist/agents/codex.js +15 -3
  28. package/dist/agents/codex.js.map +1 -1
  29. package/dist/cli/agent-commands.d.ts.map +1 -1
  30. package/dist/cli/agent-commands.js +12 -2
  31. package/dist/cli/agent-commands.js.map +1 -1
  32. package/dist/cli/command-shared.d.ts +30 -2
  33. package/dist/cli/command-shared.d.ts.map +1 -1
  34. package/dist/cli/command-shared.js +25 -27
  35. package/dist/cli/command-shared.js.map +1 -1
  36. package/dist/cli/commands.d.ts +7 -2
  37. package/dist/cli/commands.d.ts.map +1 -1
  38. package/dist/cli/commands.js +7 -2
  39. package/dist/cli/commands.js.map +1 -1
  40. package/dist/cli/context-access-command.d.ts +9 -0
  41. package/dist/cli/context-access-command.d.ts.map +1 -0
  42. package/dist/cli/context-access-command.js +133 -0
  43. package/dist/cli/context-access-command.js.map +1 -0
  44. package/dist/cli/context-add-command.d.ts +2 -0
  45. package/dist/cli/context-add-command.d.ts.map +1 -0
  46. package/dist/cli/context-add-command.js +74 -0
  47. package/dist/cli/context-add-command.js.map +1 -0
  48. package/dist/cli/context-candidate-preview-command.d.ts +2 -0
  49. package/dist/cli/context-candidate-preview-command.d.ts.map +1 -0
  50. package/dist/cli/context-candidate-preview-command.js +52 -0
  51. package/dist/cli/context-candidate-preview-command.js.map +1 -0
  52. package/dist/cli/context-command-parsers.d.ts +4 -0
  53. package/dist/cli/context-command-parsers.d.ts.map +1 -0
  54. package/dist/cli/context-command-parsers.js +32 -0
  55. package/dist/cli/context-command-parsers.js.map +1 -0
  56. package/dist/cli/context-command.d.ts +2 -0
  57. package/dist/cli/context-command.d.ts.map +1 -0
  58. package/dist/cli/context-command.js +323 -0
  59. package/dist/cli/context-command.js.map +1 -0
  60. package/dist/cli/context-provider-command.d.ts +4 -0
  61. package/dist/cli/context-provider-command.d.ts.map +1 -0
  62. package/dist/cli/context-provider-command.js +268 -0
  63. package/dist/cli/context-provider-command.js.map +1 -0
  64. package/dist/cli/context-provider-propose.d.ts +22 -0
  65. package/dist/cli/context-provider-propose.d.ts.map +1 -0
  66. package/dist/cli/context-provider-propose.js +26 -0
  67. package/dist/cli/context-provider-propose.js.map +1 -0
  68. package/dist/cli/context-provider-resolve.d.ts +11 -0
  69. package/dist/cli/context-provider-resolve.d.ts.map +1 -0
  70. package/dist/cli/context-provider-resolve.js +22 -0
  71. package/dist/cli/context-provider-resolve.js.map +1 -0
  72. package/dist/cli/context-sync-target.d.ts +12 -0
  73. package/dist/cli/context-sync-target.d.ts.map +1 -0
  74. package/dist/cli/context-sync-target.js +63 -0
  75. package/dist/cli/context-sync-target.js.map +1 -0
  76. package/dist/cli/context-vault-metadata-command.d.ts +3 -0
  77. package/dist/cli/context-vault-metadata-command.d.ts.map +1 -0
  78. package/dist/cli/context-vault-metadata-command.js +239 -0
  79. package/dist/cli/context-vault-metadata-command.js.map +1 -0
  80. package/dist/cli/context-vault-use-command.d.ts +2 -0
  81. package/dist/cli/context-vault-use-command.d.ts.map +1 -0
  82. package/dist/cli/context-vault-use-command.js +35 -0
  83. package/dist/cli/context-vault-use-command.js.map +1 -0
  84. package/dist/cli/contract-authorization.d.ts +25 -0
  85. package/dist/cli/contract-authorization.d.ts.map +1 -0
  86. package/dist/cli/contract-authorization.js +99 -0
  87. package/dist/cli/contract-authorization.js.map +1 -0
  88. package/dist/cli/daemon-client.d.ts.map +1 -1
  89. package/dist/cli/daemon-client.js +49 -14
  90. package/dist/cli/daemon-client.js.map +1 -1
  91. package/dist/cli/daemon-lifecycle.d.ts +2 -33
  92. package/dist/cli/daemon-lifecycle.d.ts.map +1 -1
  93. package/dist/cli/daemon-lifecycle.js +42 -16
  94. package/dist/cli/daemon-lifecycle.js.map +1 -1
  95. package/dist/cli/daemon-runtime-state.d.ts +47 -0
  96. package/dist/cli/daemon-runtime-state.d.ts.map +1 -0
  97. package/dist/cli/daemon-runtime-state.js +2 -0
  98. package/dist/cli/daemon-runtime-state.js.map +1 -0
  99. package/dist/cli/daemon-settings.d.ts.map +1 -1
  100. package/dist/cli/daemon-settings.js +24 -5
  101. package/dist/cli/daemon-settings.js.map +1 -1
  102. package/dist/cli/directory-commands.js +1 -1
  103. package/dist/cli/directory-commands.js.map +1 -1
  104. package/dist/cli/global-flags.d.ts +2 -0
  105. package/dist/cli/global-flags.d.ts.map +1 -0
  106. package/dist/cli/global-flags.js +8 -0
  107. package/dist/cli/global-flags.js.map +1 -0
  108. package/dist/cli/guard-command.d.ts +34 -0
  109. package/dist/cli/guard-command.d.ts.map +1 -0
  110. package/dist/cli/guard-command.js +161 -0
  111. package/dist/cli/guard-command.js.map +1 -0
  112. package/dist/cli/hook-command.d.ts +3 -1
  113. package/dist/cli/hook-command.d.ts.map +1 -1
  114. package/dist/cli/hook-command.js +33 -3
  115. package/dist/cli/hook-command.js.map +1 -1
  116. package/dist/cli/lifecycle-commands.d.ts +7 -2
  117. package/dist/cli/lifecycle-commands.d.ts.map +1 -1
  118. package/dist/cli/lifecycle-commands.js +169 -339
  119. package/dist/cli/lifecycle-commands.js.map +1 -1
  120. package/dist/cli/lifecycle-doctor-command.d.ts +2 -0
  121. package/dist/cli/lifecycle-doctor-command.d.ts.map +1 -0
  122. package/dist/cli/lifecycle-doctor-command.js +100 -0
  123. package/dist/cli/lifecycle-doctor-command.js.map +1 -0
  124. package/dist/cli/lifecycle-pair-command.d.ts +6 -0
  125. package/dist/cli/lifecycle-pair-command.d.ts.map +1 -0
  126. package/dist/cli/lifecycle-pair-command.js +286 -0
  127. package/dist/cli/lifecycle-pair-command.js.map +1 -0
  128. package/dist/cli/lifecycle-pair-server.d.ts +26 -0
  129. package/dist/cli/lifecycle-pair-server.d.ts.map +1 -0
  130. package/dist/cli/lifecycle-pair-server.js +166 -0
  131. package/dist/cli/lifecycle-pair-server.js.map +1 -0
  132. package/dist/cli/lifecycle-status-command.d.ts +2 -0
  133. package/dist/cli/lifecycle-status-command.d.ts.map +1 -0
  134. package/dist/cli/lifecycle-status-command.js +184 -0
  135. package/dist/cli/lifecycle-status-command.js.map +1 -0
  136. package/dist/cli/lifecycle-update-command.d.ts +2 -0
  137. package/dist/cli/lifecycle-update-command.d.ts.map +1 -0
  138. package/dist/cli/lifecycle-update-command.js +71 -0
  139. package/dist/cli/lifecycle-update-command.js.map +1 -0
  140. package/dist/cli/local-tls.d.ts +9 -0
  141. package/dist/cli/local-tls.d.ts.map +1 -0
  142. package/dist/cli/local-tls.js +84 -0
  143. package/dist/cli/local-tls.js.map +1 -0
  144. package/dist/cli/network.d.ts +11 -0
  145. package/dist/cli/network.d.ts.map +1 -0
  146. package/dist/cli/network.js +172 -0
  147. package/dist/cli/network.js.map +1 -0
  148. package/dist/cli/pairing-name-resolver.d.ts +2 -0
  149. package/dist/cli/pairing-name-resolver.d.ts.map +1 -0
  150. package/dist/cli/pairing-name-resolver.js +48 -0
  151. package/dist/cli/pairing-name-resolver.js.map +1 -0
  152. package/dist/cli/permission-commands.d.ts.map +1 -1
  153. package/dist/cli/permission-commands.js +11 -1
  154. package/dist/cli/permission-commands.js.map +1 -1
  155. package/dist/cli/relay-diagnostics.d.ts +8 -0
  156. package/dist/cli/relay-diagnostics.d.ts.map +1 -0
  157. package/dist/cli/relay-diagnostics.js +45 -0
  158. package/dist/cli/relay-diagnostics.js.map +1 -0
  159. package/dist/cli/remote-commands.d.ts.map +1 -1
  160. package/dist/cli/remote-commands.js +151 -85
  161. package/dist/cli/remote-commands.js.map +1 -1
  162. package/dist/cli/resource-config-command.d.ts +9 -0
  163. package/dist/cli/resource-config-command.d.ts.map +1 -0
  164. package/dist/cli/resource-config-command.js +292 -0
  165. package/dist/cli/resource-config-command.js.map +1 -0
  166. package/dist/cli/service-commands.d.ts +2 -0
  167. package/dist/cli/service-commands.d.ts.map +1 -1
  168. package/dist/cli/service-commands.js +23 -1
  169. package/dist/cli/service-commands.js.map +1 -1
  170. package/dist/cli/session-commands.d.ts +2 -0
  171. package/dist/cli/session-commands.d.ts.map +1 -1
  172. package/dist/cli/session-commands.js +94 -3
  173. package/dist/cli/session-commands.js.map +1 -1
  174. package/dist/cli/skills-command.d.ts +2 -0
  175. package/dist/cli/skills-command.d.ts.map +1 -0
  176. package/dist/cli/skills-command.js +170 -0
  177. package/dist/cli/skills-command.js.map +1 -0
  178. package/dist/cli/supervisor-protocol.d.ts +6 -1
  179. package/dist/cli/supervisor-protocol.d.ts.map +1 -1
  180. package/dist/cli/supervisor-runtime-config.d.ts +4 -0
  181. package/dist/cli/supervisor-runtime-config.d.ts.map +1 -0
  182. package/dist/cli/supervisor-runtime-config.js +67 -0
  183. package/dist/cli/supervisor-runtime-config.js.map +1 -0
  184. package/dist/cli/supervisor.d.ts.map +1 -1
  185. package/dist/cli/supervisor.js +81 -77
  186. package/dist/cli/supervisor.js.map +1 -1
  187. package/dist/cli/workflow-commands.d.ts +3 -0
  188. package/dist/cli/workflow-commands.d.ts.map +1 -0
  189. package/dist/cli/workflow-commands.js +271 -0
  190. package/dist/cli/workflow-commands.js.map +1 -0
  191. package/dist/cli/workflow-contract-resolver.d.ts +13 -0
  192. package/dist/cli/workflow-contract-resolver.d.ts.map +1 -0
  193. package/dist/cli/workflow-contract-resolver.js +68 -0
  194. package/dist/cli/workflow-contract-resolver.js.map +1 -0
  195. package/dist/cli/workflow-run-json.d.ts +34 -0
  196. package/dist/cli/workflow-run-json.d.ts.map +1 -0
  197. package/dist/cli/workflow-run-json.js +118 -0
  198. package/dist/cli/workflow-run-json.js.map +1 -0
  199. package/dist/cli/worktree-commands.d.ts.map +1 -1
  200. package/dist/cli/worktree-commands.js +12 -2
  201. package/dist/cli/worktree-commands.js.map +1 -1
  202. package/dist/cli/ws-client.js +22 -2
  203. package/dist/cli/ws-client.js.map +1 -1
  204. package/dist/config-resolution/approval-rules.d.ts +5 -0
  205. package/dist/config-resolution/approval-rules.d.ts.map +1 -0
  206. package/dist/config-resolution/approval-rules.js +14 -0
  207. package/dist/config-resolution/approval-rules.js.map +1 -0
  208. package/dist/config-resolution/config-writer.d.ts +18 -0
  209. package/dist/config-resolution/config-writer.d.ts.map +1 -0
  210. package/dist/config-resolution/config-writer.js +97 -0
  211. package/dist/config-resolution/config-writer.js.map +1 -0
  212. package/dist/config-resolution/discovery.d.ts +18 -0
  213. package/dist/config-resolution/discovery.d.ts.map +1 -0
  214. package/dist/config-resolution/discovery.js +225 -0
  215. package/dist/config-resolution/discovery.js.map +1 -0
  216. package/dist/config-resolution/index.d.ts +4 -0
  217. package/dist/config-resolution/index.d.ts.map +1 -0
  218. package/dist/config-resolution/index.js +4 -0
  219. package/dist/config-resolution/index.js.map +1 -0
  220. package/dist/config-resolution/resolver.d.ts +16 -0
  221. package/dist/config-resolution/resolver.d.ts.map +1 -0
  222. package/dist/config-resolution/resolver.js +327 -0
  223. package/dist/config-resolution/resolver.js.map +1 -0
  224. package/dist/config-resolution/schema.d.ts +112 -0
  225. package/dist/config-resolution/schema.d.ts.map +1 -0
  226. package/dist/config-resolution/schema.js +177 -0
  227. package/dist/config-resolution/schema.js.map +1 -0
  228. package/dist/config-resolution/stable-json.d.ts +3 -0
  229. package/dist/config-resolution/stable-json.d.ts.map +1 -0
  230. package/dist/config-resolution/stable-json.js +18 -0
  231. package/dist/config-resolution/stable-json.js.map +1 -0
  232. package/dist/config-resolution/types.d.ts +120 -0
  233. package/dist/config-resolution/types.d.ts.map +1 -0
  234. package/dist/config-resolution/types.js +5 -0
  235. package/dist/config-resolution/types.js.map +1 -0
  236. package/dist/context/local-edge-candidates.d.ts +41 -0
  237. package/dist/context/local-edge-candidates.d.ts.map +1 -0
  238. package/dist/context/local-edge-candidates.js +224 -0
  239. package/dist/context/local-edge-candidates.js.map +1 -0
  240. package/dist/context/local-edge-crypto.d.ts +28 -0
  241. package/dist/context/local-edge-crypto.d.ts.map +1 -0
  242. package/dist/context/local-edge-crypto.js +76 -0
  243. package/dist/context/local-edge-crypto.js.map +1 -0
  244. package/dist/context/local-edge-decision-applications.d.ts +13 -0
  245. package/dist/context/local-edge-decision-applications.d.ts.map +1 -0
  246. package/dist/context/local-edge-decision-applications.js +78 -0
  247. package/dist/context/local-edge-decision-applications.js.map +1 -0
  248. package/dist/context/local-edge-decision-signature.d.ts +3 -0
  249. package/dist/context/local-edge-decision-signature.d.ts.map +1 -0
  250. package/dist/context/local-edge-decision-signature.js +67 -0
  251. package/dist/context/local-edge-decision-signature.js.map +1 -0
  252. package/dist/context/local-edge-engine.d.ts +38 -0
  253. package/dist/context/local-edge-engine.d.ts.map +1 -0
  254. package/dist/context/local-edge-engine.js +138 -0
  255. package/dist/context/local-edge-engine.js.map +1 -0
  256. package/dist/context/local-edge-key-store.d.ts +4 -0
  257. package/dist/context/local-edge-key-store.d.ts.map +1 -0
  258. package/dist/context/local-edge-key-store.js +21 -0
  259. package/dist/context/local-edge-key-store.js.map +1 -0
  260. package/dist/context/local-edge-metadata.d.ts +8 -0
  261. package/dist/context/local-edge-metadata.d.ts.map +1 -0
  262. package/dist/context/local-edge-metadata.js +95 -0
  263. package/dist/context/local-edge-metadata.js.map +1 -0
  264. package/dist/context/local-edge-paths.d.ts +4 -0
  265. package/dist/context/local-edge-paths.d.ts.map +1 -0
  266. package/dist/context/local-edge-paths.js +11 -0
  267. package/dist/context/local-edge-paths.js.map +1 -0
  268. package/dist/context/local-edge-store.d.ts +115 -0
  269. package/dist/context/local-edge-store.d.ts.map +1 -0
  270. package/dist/context/local-edge-store.js +233 -0
  271. package/dist/context/local-edge-store.js.map +1 -0
  272. package/dist/context/local-edge-sync.d.ts +39 -0
  273. package/dist/context/local-edge-sync.d.ts.map +1 -0
  274. package/dist/context/local-edge-sync.js +192 -0
  275. package/dist/context/local-edge-sync.js.map +1 -0
  276. package/dist/context/local-edge-types.d.ts +309 -0
  277. package/dist/context/local-edge-types.d.ts.map +1 -0
  278. package/dist/context/local-edge-types.js +5 -0
  279. package/dist/context/local-edge-types.js.map +1 -0
  280. package/dist/context-providers/registry.d.ts +5 -0
  281. package/dist/context-providers/registry.d.ts.map +1 -0
  282. package/dist/context-providers/registry.js +10 -0
  283. package/dist/context-providers/registry.js.map +1 -0
  284. package/dist/context-providers/repo-docs-provider.d.ts +19 -0
  285. package/dist/context-providers/repo-docs-provider.d.ts.map +1 -0
  286. package/dist/context-providers/repo-docs-provider.js +188 -0
  287. package/dist/context-providers/repo-docs-provider.js.map +1 -0
  288. package/dist/context-providers/types.d.ts +53 -0
  289. package/dist/context-providers/types.d.ts.map +1 -0
  290. package/dist/context-providers/types.js +2 -0
  291. package/dist/context-providers/types.js.map +1 -0
  292. package/dist/context-providers/viewport-vault-provider.d.ts +3 -0
  293. package/dist/context-providers/viewport-vault-provider.d.ts.map +1 -0
  294. package/dist/context-providers/viewport-vault-provider.js +73 -0
  295. package/dist/context-providers/viewport-vault-provider.js.map +1 -0
  296. package/dist/core/agent-registry.d.ts +2 -0
  297. package/dist/core/agent-registry.d.ts.map +1 -1
  298. package/dist/core/agent-registry.js +1 -1
  299. package/dist/core/agent-registry.js.map +1 -1
  300. package/dist/core/config-schema.d.ts +18 -4
  301. package/dist/core/config-schema.d.ts.map +1 -1
  302. package/dist/core/config-schema.js +16 -4
  303. package/dist/core/config-schema.js.map +1 -1
  304. package/dist/core/config.d.ts +42 -12
  305. package/dist/core/config.d.ts.map +1 -1
  306. package/dist/core/config.js +181 -18
  307. package/dist/core/config.js.map +1 -1
  308. package/dist/core/daemon.d.ts +18 -0
  309. package/dist/core/daemon.d.ts.map +1 -1
  310. package/dist/core/daemon.js +71 -19
  311. package/dist/core/daemon.js.map +1 -1
  312. package/dist/core/discovered-sessions.d.ts.map +1 -1
  313. package/dist/core/discovered-sessions.js +5 -0
  314. package/dist/core/discovered-sessions.js.map +1 -1
  315. package/dist/core/error-codes.d.ts +1 -0
  316. package/dist/core/error-codes.d.ts.map +1 -1
  317. package/dist/core/error-codes.js +1 -0
  318. package/dist/core/error-codes.js.map +1 -1
  319. package/dist/core/errors.js +2 -0
  320. package/dist/core/errors.js.map +1 -1
  321. package/dist/core/events.d.ts +30 -0
  322. package/dist/core/events.d.ts.map +1 -1
  323. package/dist/core/events.js.map +1 -1
  324. package/dist/core/interfaces.d.ts +15 -0
  325. package/dist/core/interfaces.d.ts.map +1 -1
  326. package/dist/core/machine-name.d.ts +3 -0
  327. package/dist/core/machine-name.d.ts.map +1 -0
  328. package/dist/core/machine-name.js +11 -0
  329. package/dist/core/machine-name.js.map +1 -0
  330. package/dist/core/package-meta.d.ts +12 -0
  331. package/dist/core/package-meta.d.ts.map +1 -0
  332. package/dist/core/package-meta.js +87 -0
  333. package/dist/core/package-meta.js.map +1 -0
  334. package/dist/core/runtime-identity.d.ts +45 -0
  335. package/dist/core/runtime-identity.d.ts.map +1 -0
  336. package/dist/core/runtime-identity.js +130 -0
  337. package/dist/core/runtime-identity.js.map +1 -0
  338. package/dist/core/session-context-prompt.d.ts +5 -0
  339. package/dist/core/session-context-prompt.d.ts.map +1 -0
  340. package/dist/core/session-context-prompt.js +85 -0
  341. package/dist/core/session-context-prompt.js.map +1 -0
  342. package/dist/core/session-discovery-runner.d.ts +11 -0
  343. package/dist/core/session-discovery-runner.d.ts.map +1 -0
  344. package/dist/core/session-discovery-runner.js +37 -0
  345. package/dist/core/session-discovery-runner.js.map +1 -0
  346. package/dist/core/session-manager.d.ts +6 -0
  347. package/dist/core/session-manager.d.ts.map +1 -1
  348. package/dist/core/session-manager.js +32 -0
  349. package/dist/core/session-manager.js.map +1 -1
  350. package/dist/core/types.d.ts +2 -0
  351. package/dist/core/types.d.ts.map +1 -1
  352. package/dist/core/workflow-linked-discovery.d.ts +17 -0
  353. package/dist/core/workflow-linked-discovery.d.ts.map +1 -0
  354. package/dist/core/workflow-linked-discovery.js +53 -0
  355. package/dist/core/workflow-linked-discovery.js.map +1 -0
  356. package/dist/directories/manager.d.ts +1 -0
  357. package/dist/directories/manager.d.ts.map +1 -1
  358. package/dist/directories/manager.js +46 -3
  359. package/dist/directories/manager.js.map +1 -1
  360. package/dist/discovery/claude.js +1 -0
  361. package/dist/discovery/claude.js.map +1 -1
  362. package/dist/discovery/codex-parser.d.ts +10 -0
  363. package/dist/discovery/codex-parser.d.ts.map +1 -0
  364. package/dist/discovery/codex-parser.js +246 -0
  365. package/dist/discovery/codex-parser.js.map +1 -0
  366. package/dist/discovery/codex-summary.d.ts +6 -0
  367. package/dist/discovery/codex-summary.d.ts.map +1 -0
  368. package/dist/discovery/codex-summary.js +27 -0
  369. package/dist/discovery/codex-summary.js.map +1 -0
  370. package/dist/discovery/codex.d.ts +23 -2
  371. package/dist/discovery/codex.d.ts.map +1 -1
  372. package/dist/discovery/codex.js +65 -271
  373. package/dist/discovery/codex.js.map +1 -1
  374. package/dist/discovery/dedupe.d.ts +3 -0
  375. package/dist/discovery/dedupe.d.ts.map +1 -0
  376. package/dist/discovery/dedupe.js +13 -0
  377. package/dist/discovery/dedupe.js.map +1 -0
  378. package/dist/discovery/jsonl-entry-parser.d.ts +36 -0
  379. package/dist/discovery/jsonl-entry-parser.d.ts.map +1 -0
  380. package/dist/discovery/jsonl-entry-parser.js +332 -0
  381. package/dist/discovery/jsonl-entry-parser.js.map +1 -0
  382. package/dist/discovery/jsonl-paths.d.ts +17 -0
  383. package/dist/discovery/jsonl-paths.d.ts.map +1 -0
  384. package/dist/discovery/jsonl-paths.js +56 -0
  385. package/dist/discovery/jsonl-paths.js.map +1 -0
  386. package/dist/discovery/jsonl-reader.d.ts +37 -48
  387. package/dist/discovery/jsonl-reader.d.ts.map +1 -1
  388. package/dist/discovery/jsonl-reader.js +103 -315
  389. package/dist/discovery/jsonl-reader.js.map +1 -1
  390. package/dist/hooks/capabilities.d.ts +17 -0
  391. package/dist/hooks/capabilities.d.ts.map +1 -0
  392. package/dist/hooks/capabilities.js +114 -0
  393. package/dist/hooks/capabilities.js.map +1 -0
  394. package/dist/hooks/index.d.ts +2 -0
  395. package/dist/hooks/index.d.ts.map +1 -1
  396. package/dist/hooks/index.js +1 -0
  397. package/dist/hooks/index.js.map +1 -1
  398. package/dist/hooks/plan-extractor.d.ts +20 -0
  399. package/dist/hooks/plan-extractor.d.ts.map +1 -0
  400. package/dist/hooks/plan-extractor.js +123 -0
  401. package/dist/hooks/plan-extractor.js.map +1 -0
  402. package/dist/hooks/platform-plan-sync.d.ts +19 -0
  403. package/dist/hooks/platform-plan-sync.d.ts.map +1 -0
  404. package/dist/hooks/platform-plan-sync.js +57 -0
  405. package/dist/hooks/platform-plan-sync.js.map +1 -0
  406. package/dist/hooks/router.d.ts +1 -0
  407. package/dist/hooks/router.d.ts.map +1 -1
  408. package/dist/hooks/router.js +28 -75
  409. package/dist/hooks/router.js.map +1 -1
  410. package/dist/hooks/specific-events.d.ts +11 -0
  411. package/dist/hooks/specific-events.d.ts.map +1 -0
  412. package/dist/hooks/specific-events.js +125 -0
  413. package/dist/hooks/specific-events.js.map +1 -0
  414. package/dist/hooks/types.d.ts +17 -1
  415. package/dist/hooks/types.d.ts.map +1 -1
  416. package/dist/hooks/types.js +29 -0
  417. package/dist/hooks/types.js.map +1 -1
  418. package/dist/index.d.ts +6 -0
  419. package/dist/index.d.ts.map +1 -1
  420. package/dist/index.js +77 -4
  421. package/dist/index.js.map +1 -1
  422. package/dist/relay/bridge-connections.d.ts +26 -0
  423. package/dist/relay/bridge-connections.d.ts.map +1 -0
  424. package/dist/relay/bridge-connections.js +34 -0
  425. package/dist/relay/bridge-connections.js.map +1 -0
  426. package/dist/relay/bridge-crypto.d.ts +1 -0
  427. package/dist/relay/bridge-crypto.d.ts.map +1 -1
  428. package/dist/relay/bridge-crypto.js +9 -0
  429. package/dist/relay/bridge-crypto.js.map +1 -1
  430. package/dist/relay/bridge-daemon-key-registration.d.ts +16 -0
  431. package/dist/relay/bridge-daemon-key-registration.d.ts.map +1 -0
  432. package/dist/relay/bridge-daemon-key-registration.js +70 -0
  433. package/dist/relay/bridge-daemon-key-registration.js.map +1 -0
  434. package/dist/relay/bridge-errors.d.ts +2 -0
  435. package/dist/relay/bridge-errors.d.ts.map +1 -1
  436. package/dist/relay/bridge-errors.js +14 -0
  437. package/dist/relay/bridge-errors.js.map +1 -1
  438. package/dist/relay/bridge-frame-logger.d.ts +2 -0
  439. package/dist/relay/bridge-frame-logger.d.ts.map +1 -0
  440. package/dist/relay/bridge-frame-logger.js +37 -0
  441. package/dist/relay/bridge-frame-logger.js.map +1 -0
  442. package/dist/relay/bridge-handshake-profile.d.ts +3 -0
  443. package/dist/relay/bridge-handshake-profile.d.ts.map +1 -0
  444. package/dist/relay/bridge-handshake-profile.js +7 -0
  445. package/dist/relay/bridge-handshake-profile.js.map +1 -0
  446. package/dist/relay/bridge-identity-store.d.ts +9 -0
  447. package/dist/relay/bridge-identity-store.d.ts.map +1 -0
  448. package/dist/relay/bridge-identity-store.js +73 -0
  449. package/dist/relay/bridge-identity-store.js.map +1 -0
  450. package/dist/relay/bridge-key-exchange.d.ts +3 -6
  451. package/dist/relay/bridge-key-exchange.d.ts.map +1 -1
  452. package/dist/relay/bridge-key-exchange.js +4 -52
  453. package/dist/relay/bridge-key-exchange.js.map +1 -1
  454. package/dist/relay/bridge-noise-v3.d.ts.map +1 -1
  455. package/dist/relay/bridge-noise-v3.js +7 -4
  456. package/dist/relay/bridge-noise-v3.js.map +1 -1
  457. package/dist/relay/bridge-pairing-channel.d.ts +12 -0
  458. package/dist/relay/bridge-pairing-channel.d.ts.map +1 -0
  459. package/dist/relay/bridge-pairing-channel.js +30 -0
  460. package/dist/relay/bridge-pairing-channel.js.map +1 -0
  461. package/dist/relay/bridge-pairing-control-handler.d.ts +26 -0
  462. package/dist/relay/bridge-pairing-control-handler.d.ts.map +1 -0
  463. package/dist/relay/bridge-pairing-control-handler.js +136 -0
  464. package/dist/relay/bridge-pairing-control-handler.js.map +1 -0
  465. package/dist/relay/bridge-relay-sessions.d.ts +45 -0
  466. package/dist/relay/bridge-relay-sessions.d.ts.map +1 -0
  467. package/dist/relay/bridge-relay-sessions.js +88 -0
  468. package/dist/relay/bridge-relay-sessions.js.map +1 -0
  469. package/dist/relay/bridge-token-issuer.d.ts +32 -0
  470. package/dist/relay/bridge-token-issuer.d.ts.map +1 -0
  471. package/dist/relay/bridge-token-issuer.js +173 -0
  472. package/dist/relay/bridge-token-issuer.js.map +1 -0
  473. package/dist/relay/daemon-relay-bridge.d.ts +7 -11
  474. package/dist/relay/daemon-relay-bridge.d.ts.map +1 -1
  475. package/dist/relay/daemon-relay-bridge.js +67 -531
  476. package/dist/relay/daemon-relay-bridge.js.map +1 -1
  477. package/dist/relay/relay-control-frames.d.ts +31 -0
  478. package/dist/relay/relay-control-frames.d.ts.map +1 -0
  479. package/dist/relay/relay-control-frames.js +65 -0
  480. package/dist/relay/relay-control-frames.js.map +1 -0
  481. package/dist/server/auth.d.ts +3 -2
  482. package/dist/server/auth.d.ts.map +1 -1
  483. package/dist/server/auth.js +5 -3
  484. package/dist/server/auth.js.map +1 -1
  485. package/dist/server/discovered-session-window.d.ts +4 -0
  486. package/dist/server/discovered-session-window.d.ts.map +1 -0
  487. package/dist/server/discovered-session-window.js +5 -0
  488. package/dist/server/discovered-session-window.js.map +1 -0
  489. package/dist/server/hello-builder.d.ts +66 -3
  490. package/dist/server/hello-builder.d.ts.map +1 -1
  491. package/dist/server/hello-builder.js +145 -20
  492. package/dist/server/hello-builder.js.map +1 -1
  493. package/dist/server/http-context-routes.d.ts +3 -0
  494. package/dist/server/http-context-routes.d.ts.map +1 -0
  495. package/dist/server/http-context-routes.js +154 -0
  496. package/dist/server/http-context-routes.js.map +1 -0
  497. package/dist/server/http-health-routes.d.ts +10 -0
  498. package/dist/server/http-health-routes.d.ts.map +1 -0
  499. package/dist/server/http-health-routes.js +58 -0
  500. package/dist/server/http-health-routes.js.map +1 -0
  501. package/dist/server/http-lifecycle-routes.d.ts +6 -0
  502. package/dist/server/http-lifecycle-routes.d.ts.map +1 -0
  503. package/dist/server/http-lifecycle-routes.js +17 -0
  504. package/dist/server/http-lifecycle-routes.js.map +1 -0
  505. package/dist/server/http-pairing-routes.d.ts +14 -0
  506. package/dist/server/http-pairing-routes.d.ts.map +1 -0
  507. package/dist/server/http-pairing-routes.js +110 -0
  508. package/dist/server/http-pairing-routes.js.map +1 -0
  509. package/dist/server/http-request-schemas.d.ts +114 -0
  510. package/dist/server/http-request-schemas.d.ts.map +1 -0
  511. package/dist/server/http-request-schemas.js +137 -0
  512. package/dist/server/http-request-schemas.js.map +1 -0
  513. package/dist/server/http-route-types.d.ts +11 -0
  514. package/dist/server/http-route-types.d.ts.map +1 -0
  515. package/dist/server/http-route-types.js +2 -0
  516. package/dist/server/http-route-types.js.map +1 -0
  517. package/dist/server/http-server.d.ts +4 -15
  518. package/dist/server/http-server.d.ts.map +1 -1
  519. package/dist/server/http-server.js +135 -418
  520. package/dist/server/http-server.js.map +1 -1
  521. package/dist/server/http-session-routes.d.ts +4 -0
  522. package/dist/server/http-session-routes.d.ts.map +1 -0
  523. package/dist/server/http-session-routes.js +234 -0
  524. package/dist/server/http-session-routes.js.map +1 -0
  525. package/dist/server/pairing-file-store.d.ts +10 -0
  526. package/dist/server/pairing-file-store.d.ts.map +1 -0
  527. package/dist/server/pairing-file-store.js +69 -0
  528. package/dist/server/pairing-file-store.js.map +1 -0
  529. package/dist/server/pairing-identity-store.d.ts +5 -0
  530. package/dist/server/pairing-identity-store.d.ts.map +1 -0
  531. package/dist/server/pairing-identity-store.js +121 -0
  532. package/dist/server/pairing-identity-store.js.map +1 -0
  533. package/dist/server/pairing-offer-types.d.ts +98 -0
  534. package/dist/server/pairing-offer-types.d.ts.map +1 -0
  535. package/dist/server/pairing-offer-types.js +2 -0
  536. package/dist/server/pairing-offer-types.js.map +1 -0
  537. package/dist/server/pairing-offers.d.ts +4 -54
  538. package/dist/server/pairing-offers.d.ts.map +1 -1
  539. package/dist/server/pairing-offers.js +24 -409
  540. package/dist/server/pairing-offers.js.map +1 -1
  541. package/dist/server/pairing-peer-bindings.d.ts +18 -0
  542. package/dist/server/pairing-peer-bindings.d.ts.map +1 -0
  543. package/dist/server/pairing-peer-bindings.js +198 -0
  544. package/dist/server/pairing-peer-bindings.js.map +1 -0
  545. package/dist/server/rate-limiter.d.ts.map +1 -1
  546. package/dist/server/rate-limiter.js +4 -1
  547. package/dist/server/rate-limiter.js.map +1 -1
  548. package/dist/server/replay-events.d.ts +6 -0
  549. package/dist/server/replay-events.d.ts.map +1 -0
  550. package/dist/server/replay-events.js +104 -0
  551. package/dist/server/replay-events.js.map +1 -0
  552. package/dist/server/replay-persistence.d.ts +18 -0
  553. package/dist/server/replay-persistence.d.ts.map +1 -0
  554. package/dist/server/replay-persistence.js +123 -0
  555. package/dist/server/replay-persistence.js.map +1 -0
  556. package/dist/server/replay-types.d.ts +25 -0
  557. package/dist/server/replay-types.d.ts.map +1 -0
  558. package/dist/server/replay-types.js +2 -0
  559. package/dist/server/replay-types.js.map +1 -0
  560. package/dist/server/ring-buffer.d.ts +3 -30
  561. package/dist/server/ring-buffer.d.ts.map +1 -1
  562. package/dist/server/ring-buffer.js +10 -221
  563. package/dist/server/ring-buffer.js.map +1 -1
  564. package/dist/server/session-message-reader.d.ts +15 -0
  565. package/dist/server/session-message-reader.d.ts.map +1 -0
  566. package/dist/server/session-message-reader.js +107 -0
  567. package/dist/server/session-message-reader.js.map +1 -0
  568. package/dist/server/ws-command-handlers.d.ts +4 -1
  569. package/dist/server/ws-command-handlers.d.ts.map +1 -1
  570. package/dist/server/ws-command-handlers.js +25 -74
  571. package/dist/server/ws-command-handlers.js.map +1 -1
  572. package/dist/server/ws-daemon-event-bridge.d.ts.map +1 -1
  573. package/dist/server/ws-daemon-event-bridge.js +52 -3
  574. package/dist/server/ws-daemon-event-bridge.js.map +1 -1
  575. package/dist/server/ws-protocol.d.ts +178 -5
  576. package/dist/server/ws-protocol.d.ts.map +1 -1
  577. package/dist/server/ws-protocol.js +114 -5
  578. package/dist/server/ws-protocol.js.map +1 -1
  579. package/dist/server/ws-server.d.ts.map +1 -1
  580. package/dist/server/ws-server.js +1 -0
  581. package/dist/server/ws-server.js.map +1 -1
  582. package/dist/server/ws-session-command-handlers.d.ts +29 -0
  583. package/dist/server/ws-session-command-handlers.d.ts.map +1 -0
  584. package/dist/server/ws-session-command-handlers.js +276 -0
  585. package/dist/server/ws-session-command-handlers.js.map +1 -0
  586. package/dist/server/ws-workflow-command-handlers.d.ts +17 -0
  587. package/dist/server/ws-workflow-command-handlers.d.ts.map +1 -0
  588. package/dist/server/ws-workflow-command-handlers.js +68 -0
  589. package/dist/server/ws-workflow-command-handlers.js.map +1 -0
  590. package/dist/session-enrichment/git.d.ts +9 -0
  591. package/dist/session-enrichment/git.d.ts.map +1 -0
  592. package/dist/session-enrichment/git.js +48 -0
  593. package/dist/session-enrichment/git.js.map +1 -0
  594. package/dist/startup.d.ts +9 -0
  595. package/dist/startup.d.ts.map +1 -1
  596. package/dist/startup.js +109 -49
  597. package/dist/startup.js.map +1 -1
  598. package/dist/workflows/approval-on-reject.d.ts +17 -0
  599. package/dist/workflows/approval-on-reject.d.ts.map +1 -0
  600. package/dist/workflows/approval-on-reject.js +62 -0
  601. package/dist/workflows/approval-on-reject.js.map +1 -0
  602. package/dist/workflows/artifact-collector.d.ts +11 -0
  603. package/dist/workflows/artifact-collector.d.ts.map +1 -0
  604. package/dist/workflows/artifact-collector.js +59 -0
  605. package/dist/workflows/artifact-collector.js.map +1 -0
  606. package/dist/workflows/contract-binding.d.ts +3 -0
  607. package/dist/workflows/contract-binding.d.ts.map +1 -0
  608. package/dist/workflows/contract-binding.js +19 -0
  609. package/dist/workflows/contract-binding.js.map +1 -0
  610. package/dist/workflows/daemon-session.d.ts +36 -0
  611. package/dist/workflows/daemon-session.d.ts.map +1 -0
  612. package/dist/workflows/daemon-session.js +115 -0
  613. package/dist/workflows/daemon-session.js.map +1 -0
  614. package/dist/workflows/event-types.d.ts +10 -0
  615. package/dist/workflows/event-types.d.ts.map +1 -0
  616. package/dist/workflows/event-types.js +2 -0
  617. package/dist/workflows/event-types.js.map +1 -0
  618. package/dist/workflows/expression.d.ts +74 -0
  619. package/dist/workflows/expression.d.ts.map +1 -0
  620. package/dist/workflows/expression.js +132 -0
  621. package/dist/workflows/expression.js.map +1 -0
  622. package/dist/workflows/hook-registry.d.ts +24 -0
  623. package/dist/workflows/hook-registry.d.ts.map +1 -0
  624. package/dist/workflows/hook-registry.js +52 -0
  625. package/dist/workflows/hook-registry.js.map +1 -0
  626. package/dist/workflows/hook-types.d.ts +21 -0
  627. package/dist/workflows/hook-types.d.ts.map +1 -0
  628. package/dist/workflows/hook-types.js +2 -0
  629. package/dist/workflows/hook-types.js.map +1 -0
  630. package/dist/workflows/inline-agent-types.d.ts +21 -0
  631. package/dist/workflows/inline-agent-types.d.ts.map +1 -0
  632. package/dist/workflows/inline-agent-types.js +2 -0
  633. package/dist/workflows/inline-agent-types.js.map +1 -0
  634. package/dist/workflows/inline-agents.d.ts +5 -0
  635. package/dist/workflows/inline-agents.d.ts.map +1 -0
  636. package/dist/workflows/inline-agents.js +89 -0
  637. package/dist/workflows/inline-agents.js.map +1 -0
  638. package/dist/workflows/loop-executor.d.ts +17 -0
  639. package/dist/workflows/loop-executor.d.ts.map +1 -0
  640. package/dist/workflows/loop-executor.js +173 -0
  641. package/dist/workflows/loop-executor.js.map +1 -0
  642. package/dist/workflows/node-executor.d.ts +12 -0
  643. package/dist/workflows/node-executor.d.ts.map +1 -0
  644. package/dist/workflows/node-executor.js +179 -0
  645. package/dist/workflows/node-executor.js.map +1 -0
  646. package/dist/workflows/node-registry.d.ts +42 -0
  647. package/dist/workflows/node-registry.d.ts.map +1 -0
  648. package/dist/workflows/node-registry.js +124 -0
  649. package/dist/workflows/node-registry.js.map +1 -0
  650. package/dist/workflows/parser.d.ts +17 -0
  651. package/dist/workflows/parser.d.ts.map +1 -0
  652. package/dist/workflows/parser.js +250 -0
  653. package/dist/workflows/parser.js.map +1 -0
  654. package/dist/workflows/platform-command-applier.d.ts +11 -0
  655. package/dist/workflows/platform-command-applier.d.ts.map +1 -0
  656. package/dist/workflows/platform-command-applier.js +41 -0
  657. package/dist/workflows/platform-command-applier.js.map +1 -0
  658. package/dist/workflows/platform-runtime-command.d.ts +12 -0
  659. package/dist/workflows/platform-runtime-command.d.ts.map +1 -0
  660. package/dist/workflows/platform-runtime-command.js +37 -0
  661. package/dist/workflows/platform-runtime-command.js.map +1 -0
  662. package/dist/workflows/platform-sync.d.ts +37 -0
  663. package/dist/workflows/platform-sync.d.ts.map +1 -0
  664. package/dist/workflows/platform-sync.js +306 -0
  665. package/dist/workflows/platform-sync.js.map +1 -0
  666. package/dist/workflows/plugin-loader.d.ts +28 -0
  667. package/dist/workflows/plugin-loader.d.ts.map +1 -0
  668. package/dist/workflows/plugin-loader.js +134 -0
  669. package/dist/workflows/plugin-loader.js.map +1 -0
  670. package/dist/workflows/preflight.d.ts +9 -0
  671. package/dist/workflows/preflight.d.ts.map +1 -0
  672. package/dist/workflows/preflight.js +147 -0
  673. package/dist/workflows/preflight.js.map +1 -0
  674. package/dist/workflows/prompt-output.d.ts +6 -0
  675. package/dist/workflows/prompt-output.d.ts.map +1 -0
  676. package/dist/workflows/prompt-output.js +78 -0
  677. package/dist/workflows/prompt-output.js.map +1 -0
  678. package/dist/workflows/retry-classifier.d.ts +18 -0
  679. package/dist/workflows/retry-classifier.d.ts.map +1 -0
  680. package/dist/workflows/retry-classifier.js +30 -0
  681. package/dist/workflows/retry-classifier.js.map +1 -0
  682. package/dist/workflows/review-packet.d.ts +3 -0
  683. package/dist/workflows/review-packet.d.ts.map +1 -0
  684. package/dist/workflows/review-packet.js +149 -0
  685. package/dist/workflows/review-packet.js.map +1 -0
  686. package/dist/workflows/run-types.d.ts +191 -0
  687. package/dist/workflows/run-types.d.ts.map +1 -0
  688. package/dist/workflows/run-types.js +2 -0
  689. package/dist/workflows/run-types.js.map +1 -0
  690. package/dist/workflows/runner-canceler.d.ts +22 -0
  691. package/dist/workflows/runner-canceler.d.ts.map +1 -0
  692. package/dist/workflows/runner-canceler.js +91 -0
  693. package/dist/workflows/runner-canceler.js.map +1 -0
  694. package/dist/workflows/runner-reconciler.d.ts +19 -0
  695. package/dist/workflows/runner-reconciler.d.ts.map +1 -0
  696. package/dist/workflows/runner-reconciler.js +109 -0
  697. package/dist/workflows/runner-reconciler.js.map +1 -0
  698. package/dist/workflows/runner-resumer.d.ts +33 -0
  699. package/dist/workflows/runner-resumer.d.ts.map +1 -0
  700. package/dist/workflows/runner-resumer.js +81 -0
  701. package/dist/workflows/runner-resumer.js.map +1 -0
  702. package/dist/workflows/runner-scheduler.d.ts +35 -0
  703. package/dist/workflows/runner-scheduler.d.ts.map +1 -0
  704. package/dist/workflows/runner-scheduler.js +211 -0
  705. package/dist/workflows/runner-scheduler.js.map +1 -0
  706. package/dist/workflows/runner-shared.d.ts +21 -0
  707. package/dist/workflows/runner-shared.d.ts.map +1 -0
  708. package/dist/workflows/runner-shared.js +59 -0
  709. package/dist/workflows/runner-shared.js.map +1 -0
  710. package/dist/workflows/runner.d.ts +36 -0
  711. package/dist/workflows/runner.d.ts.map +1 -0
  712. package/dist/workflows/runner.js +289 -0
  713. package/dist/workflows/runner.js.map +1 -0
  714. package/dist/workflows/runtime-helpers.d.ts +40 -0
  715. package/dist/workflows/runtime-helpers.d.ts.map +1 -0
  716. package/dist/workflows/runtime-helpers.js +170 -0
  717. package/dist/workflows/runtime-helpers.js.map +1 -0
  718. package/dist/workflows/session-completion.d.ts +7 -0
  719. package/dist/workflows/session-completion.d.ts.map +1 -0
  720. package/dist/workflows/session-completion.js +89 -0
  721. package/dist/workflows/session-completion.js.map +1 -0
  722. package/dist/workflows/session-links.d.ts +21 -0
  723. package/dist/workflows/session-links.d.ts.map +1 -0
  724. package/dist/workflows/session-links.js +77 -0
  725. package/dist/workflows/session-links.js.map +1 -0
  726. package/dist/workflows/session-output.d.ts +21 -0
  727. package/dist/workflows/session-output.d.ts.map +1 -0
  728. package/dist/workflows/session-output.js +75 -0
  729. package/dist/workflows/session-output.js.map +1 -0
  730. package/dist/workflows/shell-abort-registry.d.ts +11 -0
  731. package/dist/workflows/shell-abort-registry.d.ts.map +1 -0
  732. package/dist/workflows/shell-abort-registry.js +35 -0
  733. package/dist/workflows/shell-abort-registry.js.map +1 -0
  734. package/dist/workflows/store.d.ts +14 -0
  735. package/dist/workflows/store.d.ts.map +1 -0
  736. package/dist/workflows/store.js +160 -0
  737. package/dist/workflows/store.js.map +1 -0
  738. package/dist/workflows/structured-outputs.d.ts +19 -0
  739. package/dist/workflows/structured-outputs.d.ts.map +1 -0
  740. package/dist/workflows/structured-outputs.js +95 -0
  741. package/dist/workflows/structured-outputs.js.map +1 -0
  742. package/dist/workflows/subflow-executor.d.ts +15 -0
  743. package/dist/workflows/subflow-executor.d.ts.map +1 -0
  744. package/dist/workflows/subflow-executor.js +177 -0
  745. package/dist/workflows/subflow-executor.js.map +1 -0
  746. package/dist/workflows/trigger-rule.d.ts +22 -0
  747. package/dist/workflows/trigger-rule.d.ts.map +1 -0
  748. package/dist/workflows/trigger-rule.js +57 -0
  749. package/dist/workflows/trigger-rule.js.map +1 -0
  750. package/dist/workflows/types.d.ts +240 -0
  751. package/dist/workflows/types.d.ts.map +1 -0
  752. package/dist/workflows/types.js +2 -0
  753. package/dist/workflows/types.js.map +1 -0
  754. package/dist/workflows/workflow-executor-schema.d.ts +51 -0
  755. package/dist/workflows/workflow-executor-schema.d.ts.map +1 -0
  756. package/dist/workflows/workflow-executor-schema.js +81 -0
  757. package/dist/workflows/workflow-executor-schema.js.map +1 -0
  758. package/dist/workflows/workflow-schema.d.ts +573 -0
  759. package/dist/workflows/workflow-schema.d.ts.map +1 -0
  760. package/dist/workflows/workflow-schema.js +294 -0
  761. package/dist/workflows/workflow-schema.js.map +1 -0
  762. package/dist/workflows/workflow-source.d.ts +3 -0
  763. package/dist/workflows/workflow-source.d.ts.map +1 -0
  764. package/dist/workflows/workflow-source.js +29 -0
  765. package/dist/workflows/workflow-source.js.map +1 -0
  766. package/docs/configuration.md +51 -26
  767. package/docs/developer-workflows.md +18 -2
  768. package/docs/protocol-matrix.json +120 -11
  769. package/docs/releasing.md +19 -51
  770. package/docs/security.md +6 -9
  771. package/docs/testing.md +3 -3
  772. package/node_modules/@viewportai/context-engine/README.md +33 -0
  773. package/node_modules/@viewportai/context-engine/fixtures/protocol-vectors/README.md +37 -0
  774. package/node_modules/@viewportai/context-engine/fixtures/protocol-vectors/bundle-manifest.json +50 -0
  775. package/node_modules/@viewportai/context-engine/fixtures/protocol-vectors/erase-receipt.json +10 -0
  776. package/node_modules/@viewportai/context-engine/fixtures/protocol-vectors/event.json +29 -0
  777. package/node_modules/@viewportai/context-engine/fixtures/protocol-vectors/hpke-key-grant.json +24 -0
  778. package/node_modules/@viewportai/context-engine/fixtures/protocol-vectors/key-grant.json +21 -0
  779. package/node_modules/@viewportai/context-engine/fixtures/protocol-vectors/profile.json +12 -0
  780. package/node_modules/@viewportai/context-engine/fixtures/protocol-vectors/signed-event.json +28 -0
  781. package/node_modules/@viewportai/context-engine/fixtures/protocol-vectors/standalone-decoder.mjs +124 -0
  782. package/node_modules/@viewportai/context-engine/package.json +11 -0
  783. package/node_modules/@viewportai/context-engine/schemas/context_bundle_manifest_v1.schema.json +134 -0
  784. package/node_modules/@viewportai/context-engine/schemas/context_erase_receipt_v1.schema.json +27 -0
  785. package/node_modules/@viewportai/context-engine/schemas/context_event_v1.schema.json +214 -0
  786. package/node_modules/@viewportai/context-engine/schemas/context_key_grant_hpke_draft_01.schema.json +27 -0
  787. package/node_modules/@viewportai/context-engine/schemas/context_key_grant_v1.schema.json +24 -0
  788. package/node_modules/@viewportai/context-engine/schemas/context_profile_v1.schema.json +24 -0
  789. package/node_modules/@viewportai/context-engine/src/cli.js +177 -0
  790. package/node_modules/@viewportai/context-engine/src/crypto/canonical.js +21 -0
  791. package/node_modules/@viewportai/context-engine/src/crypto/envelope.js +37 -0
  792. package/node_modules/@viewportai/context-engine/src/crypto/hpke-grants.js +298 -0
  793. package/node_modules/@viewportai/context-engine/src/crypto/keys.js +122 -0
  794. package/node_modules/@viewportai/context-engine/src/crypto/signatures.js +23 -0
  795. package/node_modules/@viewportai/context-engine/src/index.js +12 -0
  796. package/node_modules/@viewportai/context-engine/src/protocol/schemas.js +50 -0
  797. package/node_modules/@viewportai/context-engine/src/repo/access-model.js +170 -0
  798. package/node_modules/@viewportai/context-engine/src/repo/bundles.js +180 -0
  799. package/node_modules/@viewportai/context-engine/src/repo/candidates.js +205 -0
  800. package/node_modules/@viewportai/context-engine/src/repo/devices.js +141 -0
  801. package/node_modules/@viewportai/context-engine/src/repo/events.js +87 -0
  802. package/node_modules/@viewportai/context-engine/src/repo/files.js +33 -0
  803. package/node_modules/@viewportai/context-engine/src/repo/identities.js +128 -0
  804. package/node_modules/@viewportai/context-engine/src/repo/key-store.js +126 -0
  805. package/node_modules/@viewportai/context-engine/src/repo/materializer.js +299 -0
  806. package/node_modules/@viewportai/context-engine/src/repo/membership.js +177 -0
  807. package/node_modules/@viewportai/context-engine/src/repo/paths.js +25 -0
  808. package/node_modules/@viewportai/context-engine/src/repo/profiles.js +54 -0
  809. package/node_modules/@viewportai/context-engine/src/repo/receipts.js +68 -0
  810. package/node_modules/@viewportai/context-engine/src/repo/sync.js +163 -0
  811. package/node_modules/@viewportai/context-engine/src/repo/users.js +134 -0
  812. package/node_modules/@viewportai/context-engine/src/repo/vault.js +527 -0
  813. package/node_modules/@viewportai/context-engine/src/store/local-semantic.js +69 -0
  814. package/node_modules/@viewportai/context-engine/src/store/search.js +25 -0
  815. package/node_modules/@viewportai/context-engine/src/store/sqlite.js +76 -0
  816. package/package.json +22 -7
  817. package/schemas/viewport-config-v1.schema.json +209 -0
  818. package/schemas/workflow-v1.schema.json +245 -0
@@ -1,129 +1,26 @@
1
1
  import WebSocket from 'ws';
2
- import crypto from 'node:crypto';
3
2
  import { computeBackoffMs, sleep } from './bridge-backoff.js';
4
- import { CIRCUIT_BREAKER_MS, DEFAULT_MAX_PENDING_OUTBOUND, DEFAULT_MAX_PENDING_OUTBOUND_BYTES, ISSUE_FAILURE_THRESHOLD, RELAY_KEY_ROTATE_AFTER_MESSAGES, RELAY_REPLAY_WINDOW, RELAY_SESSION_IDLE_TTL_MS, } from './bridge-constants.js';
3
+ import { registerDaemonPublicKeyWithControlPlane } from './bridge-daemon-key-registration.js';
4
+ import { CIRCUIT_BREAKER_MS, DEFAULT_MAX_PENDING_OUTBOUND, DEFAULT_MAX_PENDING_OUTBOUND_BYTES, ISSUE_FAILURE_THRESHOLD, RELAY_KEY_ROTATE_AFTER_MESSAGES, } from './bridge-constants.js';
5
5
  import { decryptEnvelope, encryptEnvelope, fromBase64Url, parseRelayEnvelope, toBase64Url, } from './bridge-crypto.js';
6
- import { deriveSessionFromKeyExchange, loadOrCreateIdentity, parseRelayHandshakeProfile, parseRelayKeyExchangeInitFrame, } from './bridge-key-exchange.js';
6
+ import { logDaemonFrameSummary } from './bridge-frame-logger.js';
7
+ import { isCompatibleProfile } from './bridge-handshake-profile.js';
8
+ import { deriveSessionFromKeyExchange, loadOrCreateIdentity, parseRelayKeyExchangeInitFrame, } from './bridge-key-exchange.js';
7
9
  import { deriveNoiseV3SessionFromInit, parseRelayKeyExchangeInitFrameV3, } from './bridge-noise-v3.js';
8
- import { BridgeError } from './bridge-errors.js';
9
- import { verifyRelayTokenClaims } from './bridge-jwt.js';
10
- import { closeQuietly, resolveRelayTlsOptions, wsOpen } from './bridge-network.js';
11
- import { issuePairingOffer, redeemPairingOffer, resolveRelayPairingSecret, } from '../server/pairing-offers.js';
12
- import { loadConfig, saveConfig } from '../core/config.js';
10
+ import { BridgeError, isControlPlaneBridgeError, normalizeBridgeError, } from './bridge-errors.js';
11
+ import { openDaemonSocket, openRelayDaemonSocket } from './bridge-connections.js';
12
+ import { closeQuietly } from './bridge-network.js';
13
+ import { handleRelayPairingOfferRequest, handleRelayPairingRedeemRequest, pruneRelayPairingChannelKeys, } from './bridge-pairing-control-handler.js';
14
+ import { RelayTokenIssuer } from './bridge-token-issuer.js';
15
+ import { isRelayControlFrame, parsePairingOfferRequestFrame, parsePairingRedeemRequestFrame, } from './relay-control-frames.js';
16
+ import { acceptInboundRelaySeq, createRelaySessionState, enforceRelaySessionCapacity, sendToAllRelaySessions, } from './bridge-relay-sessions.js';
17
+ import { resolveRelayPairingSecret } from '../server/pairing-offers.js';
13
18
  import { logger as out } from '../core/output.js';
14
- const MAX_JWKS_KEYS = 64;
15
19
  export { CIRCUIT_BREAKER_MS } from './bridge-constants.js';
16
20
  export { computeBackoffMs, decryptEnvelope, encryptEnvelope, fromBase64Url, toBase64Url };
17
21
  const DEFAULT_PAIRING_CHANNEL_TTL_MS = 10 * 60_000;
18
22
  const DEFAULT_PAIRING_CHANNEL_MAX_ENTRIES = 2_048;
19
23
  const DEFAULT_RELAY_SESSION_MAX_ENTRIES = 4_096;
20
- async function parseRelayIssueResponse(res) {
21
- const json = (await res.json().catch(() => null));
22
- if (!json) {
23
- return {
24
- ok: false,
25
- reason: `relay token endpoint returned non-JSON (${res.status})`,
26
- };
27
- }
28
- return json;
29
- }
30
- function isRelayControlFrame(value) {
31
- if (!value || typeof value !== 'object' || Array.isArray(value))
32
- return false;
33
- const frame = value;
34
- if (frame['type'] === 'relay_status')
35
- return true;
36
- return (frame['type'] === 'relay_key_update_required' &&
37
- typeof frame['sessionId'] === 'string' &&
38
- typeof frame['nextEpoch'] === 'number');
39
- }
40
- function parsePairingOfferRequestFrame(value) {
41
- if (!value || typeof value !== 'object' || Array.isArray(value))
42
- return null;
43
- const frame = value;
44
- if (frame['type'] !== 'relay_pairing_offer_request')
45
- return null;
46
- if (typeof frame['requestId'] !== 'string' || frame['requestId'].trim().length === 0) {
47
- return null;
48
- }
49
- const ttlSeconds = frame['ttlSeconds'];
50
- if (typeof ttlSeconds !== 'undefined' &&
51
- (!Number.isInteger(ttlSeconds) || ttlSeconds < 30 || ttlSeconds > 3600)) {
52
- return null;
53
- }
54
- if (typeof frame['clientChannelPublicKey'] !== 'string' ||
55
- frame['clientChannelPublicKey'].trim().length === 0) {
56
- return null;
57
- }
58
- return {
59
- type: 'relay_pairing_offer_request',
60
- requestId: frame['requestId'],
61
- ttlSeconds: typeof ttlSeconds === 'number' ? ttlSeconds : undefined,
62
- clientChannelPublicKey: frame['clientChannelPublicKey'],
63
- };
64
- }
65
- function parsePairingRedeemRequestFrame(value) {
66
- if (!value || typeof value !== 'object' || Array.isArray(value))
67
- return null;
68
- const frame = value;
69
- if (frame['type'] !== 'relay_pairing_redeem_request')
70
- return null;
71
- if (typeof frame['requestId'] !== 'string' ||
72
- typeof frame['offerId'] !== 'string' ||
73
- typeof frame['encIv'] !== 'string' ||
74
- typeof frame['encTag'] !== 'string' ||
75
- typeof frame['encCiphertext'] !== 'string') {
76
- return null;
77
- }
78
- if (frame['requestId'].trim().length === 0 ||
79
- frame['offerId'].trim().length === 0 ||
80
- frame['encIv'].trim().length === 0 ||
81
- frame['encTag'].trim().length === 0 ||
82
- frame['encCiphertext'].trim().length === 0) {
83
- return null;
84
- }
85
- return {
86
- type: 'relay_pairing_redeem_request',
87
- requestId: frame['requestId'],
88
- offerId: frame['offerId'],
89
- encIv: frame['encIv'],
90
- encTag: frame['encTag'],
91
- encCiphertext: frame['encCiphertext'],
92
- };
93
- }
94
- function derivePairingChannelKey(sharedSecret, saltLabel) {
95
- const salt = crypto.createHash('sha256').update(saltLabel, 'utf8').digest();
96
- const raw = crypto.hkdfSync('sha256', sharedSecret, salt, Buffer.from('viewport-relay-pairing-channel-v1', 'utf8'), 32);
97
- return Buffer.isBuffer(raw) ? raw : Buffer.from(raw);
98
- }
99
- function encryptPairingPayload(key, plaintext, aadLabel) {
100
- const iv = crypto.randomBytes(12);
101
- const cipher = crypto.createCipheriv('aes-256-gcm', key, iv);
102
- cipher.setAAD(Buffer.from(aadLabel, 'utf8'));
103
- const ciphertext = Buffer.concat([cipher.update(plaintext, 'utf8'), cipher.final()]);
104
- const tag = cipher.getAuthTag();
105
- return {
106
- encIv: toBase64Url(iv),
107
- encTag: toBase64Url(tag),
108
- encCiphertext: toBase64Url(ciphertext),
109
- };
110
- }
111
- function decryptPairingPayload(key, encrypted, aadLabel) {
112
- const iv = fromBase64Url(encrypted.encIv);
113
- const tag = fromBase64Url(encrypted.encTag);
114
- const ciphertext = fromBase64Url(encrypted.encCiphertext);
115
- const decipher = crypto.createDecipheriv('aes-256-gcm', key, iv);
116
- decipher.setAAD(Buffer.from(aadLabel, 'utf8'));
117
- decipher.setAuthTag(tag);
118
- const plaintext = Buffer.concat([decipher.update(ciphertext), decipher.final()]);
119
- return plaintext.toString('utf8');
120
- }
121
- function profileStrength(profile) {
122
- return profile === 'noise-ikpsk2' ? 2 : 1;
123
- }
124
- function isCompatibleProfile(required, requested) {
125
- return profileStrength(requested) >= profileStrength(required);
126
- }
127
24
  export class DaemonRelayBridge {
128
25
  options;
129
26
  relayWs = null;
@@ -136,10 +33,7 @@ export class DaemonRelayBridge {
136
33
  daemonIdentity = null;
137
34
  daemonIssueToken;
138
35
  requiredProfile = 'noise-ik';
139
- relayTokenJwksUrl;
140
- relayTokenSigningKeys;
141
- jwksCacheExpiresAt = 0;
142
- jwksCacheKeys = {};
36
+ relayTokenIssuer;
143
37
  relaySessions = new Map();
144
38
  pairingChannelKeys = new Map();
145
39
  consecutiveIssueFailures = 0;
@@ -181,8 +75,7 @@ export class DaemonRelayBridge {
181
75
  ? options.relaySessionMaxEntries
182
76
  : DEFAULT_RELAY_SESSION_MAX_ENTRIES;
183
77
  this.daemonIssueToken = options.issueToken ?? null;
184
- this.relayTokenJwksUrl = options.relayTokenJwksUrl;
185
- this.relayTokenSigningKeys = options.relayTokenSigningKeys ?? {};
78
+ this.relayTokenIssuer = new RelayTokenIssuer(options, this.daemonIssueToken);
186
79
  }
187
80
  getStatus() {
188
81
  return {
@@ -217,62 +110,18 @@ export class DaemonRelayBridge {
217
110
  }
218
111
  async ensureKeyMaterial() {
219
112
  if (!this.daemonIdentity) {
220
- this.daemonIdentity = await loadOrCreateIdentity(this.options.workspaceId);
113
+ this.daemonIdentity = await loadOrCreateIdentity();
221
114
  }
222
115
  }
223
116
  async registerDaemonPublicKey() {
224
- if (!this.daemonIdentity) {
225
- throw new BridgeError('DAEMON_KEY_REGISTER_FAILED', 'daemon identity unavailable');
226
- }
227
- const url = `${this.options.relayServerUrl.replace(/\/+$/, '')}` +
228
- `/api/poc/workspaces/${encodeURIComponent(this.options.workspaceId)}/daemon-key`;
229
- const controller = new AbortController();
230
- const timeout = setTimeout(() => controller.abort(), 8_000);
231
- let res;
232
- try {
233
- res = await fetch(url, {
234
- method: 'POST',
235
- headers: { 'content-type': 'application/json' },
236
- body: JSON.stringify({
237
- credential: this.options.enrollToken,
238
- issueCredential: this.daemonIssueToken ?? undefined,
239
- daemonPublicKey: this.daemonIdentity.publicKey,
240
- }),
241
- signal: controller.signal,
242
- });
243
- }
244
- catch (error) {
245
- clearTimeout(timeout);
246
- throw new BridgeError('DAEMON_KEY_REGISTER_FAILED', error instanceof Error ? error.message : String(error));
247
- }
248
- clearTimeout(timeout);
249
- const parsed = (await res.json().catch(() => null));
250
- if (!res.ok || !parsed?.ok) {
251
- const reason = parsed?.reason ?? parsed?.error ?? `HTTP ${res.status}`;
252
- throw new BridgeError('DAEMON_KEY_REGISTER_FAILED', `daemon key registration failed: ${reason}`);
253
- }
254
- if (!parsed?.daemonIssueToken || parsed.daemonIssueToken.trim().length === 0) {
255
- if (this.daemonIssueToken && this.daemonIssueToken.trim().length > 0) {
256
- return;
257
- }
258
- throw new BridgeError('DAEMON_KEY_REGISTER_FAILED', 'daemon key registration succeeded but daemon issue token was missing');
259
- }
260
- this.daemonIssueToken = parsed.daemonIssueToken;
261
- await this.persistIssueToken(parsed.daemonIssueToken);
262
- }
263
- async persistIssueToken(issueToken) {
264
- const normalized = issueToken.trim();
265
- if (normalized.length === 0)
266
- return;
267
- try {
268
- const config = await loadConfig();
269
- config.daemon = config.daemon ?? {};
270
- config.daemon.relay = config.daemon.relay ?? {};
271
- config.daemon.relay.issueToken = normalized;
272
- await saveConfig(config);
273
- }
274
- catch (error) {
275
- out.warn(`[relay] failed to persist daemon issue token: ${error instanceof Error ? error.message : String(error)}`);
117
+ const issueToken = await registerDaemonPublicKeyWithControlPlane({
118
+ options: this.options,
119
+ identity: this.daemonIdentity,
120
+ daemonIssueToken: this.daemonIssueToken,
121
+ });
122
+ if (issueToken && issueToken !== this.daemonIssueToken) {
123
+ this.daemonIssueToken = issueToken;
124
+ this.relayTokenIssuer.setDaemonIssueToken(issueToken);
276
125
  }
277
126
  }
278
127
  async connectLoop(reason) {
@@ -303,25 +152,13 @@ export class DaemonRelayBridge {
303
152
  this.relaySessions.clear();
304
153
  this.consecutiveIssueFailures = 0;
305
154
  this.circuitOpenUntilMs = 0;
306
- const daemonHeaders = {};
307
- if (this.options.daemonAuthToken) {
308
- daemonHeaders.authorization = `Bearer ${this.options.daemonAuthToken}`;
309
- }
310
- const daemonWs = new WebSocket(this.options.daemonWsUrl, {
311
- headers: Object.keys(daemonHeaders).length > 0 ? daemonHeaders : undefined,
312
- });
313
- await wsOpen(daemonWs);
155
+ const daemonWs = await openDaemonSocket(this.options);
314
156
  this.daemonWs = daemonWs;
315
- const relayUrl = `${this.relayEndpoint}?role=workspace-daemon` +
316
- `&workspaceId=${encodeURIComponent(this.options.workspaceId)}`;
317
- const relayTlsOptions = resolveRelayTlsOptions(relayUrl, this.options.relayTlsVerify ?? 'auto', this.options.relayCaCertPath, this.options.relayTlsPins);
318
- const relayWs = new WebSocket(relayUrl, {
319
- ...relayTlsOptions,
320
- headers: {
321
- authorization: `Bearer ${issue.relayToken}`,
322
- },
157
+ const relayWs = await openRelayDaemonSocket({
158
+ ...this.options,
159
+ relayEndpoint: this.relayEndpoint,
160
+ relayToken: issue.relayToken,
323
161
  });
324
- await wsOpen(relayWs);
325
162
  this.relayWs = relayWs;
326
163
  out.log('[relay] daemon bridge connected');
327
164
  this.state = 'connected';
@@ -335,12 +172,10 @@ export class DaemonRelayBridge {
335
172
  this.relayWs = null;
336
173
  this.daemonWs = null;
337
174
  this.relaySessions.clear();
338
- const bridgeError = this.normalizeError(error);
175
+ const bridgeError = normalizeBridgeError(error);
339
176
  this.recordError(bridgeError.code, bridgeError.message);
340
177
  out.warn(`[relay] daemon bridge connect failed [${bridgeError.code}]: ${bridgeError.message}`);
341
- if (bridgeError.code === 'TOKEN_ISSUE_FAILED' ||
342
- bridgeError.code === 'TOKEN_RESPONSE_INVALID' ||
343
- bridgeError.code === 'DAEMON_KEY_REGISTER_FAILED') {
178
+ if (isControlPlaneBridgeError(bridgeError.code)) {
344
179
  this.consecutiveIssueFailures += 1;
345
180
  if (this.consecutiveIssueFailures >= ISSUE_FAILURE_THRESHOLD) {
346
181
  this.circuitOpenUntilMs = Date.now() + CIRCUIT_BREAKER_MS;
@@ -362,6 +197,7 @@ export class DaemonRelayBridge {
362
197
  installSocketHandlers(daemonWs, relayWs) {
363
198
  daemonWs.on('message', (raw) => {
364
199
  const payload = raw.toString('utf8');
200
+ logDaemonFrameSummary('daemon->relay', payload);
365
201
  if (relayWs.readyState === WebSocket.OPEN) {
366
202
  this.sendToAllRelaySessions(relayWs, payload);
367
203
  return;
@@ -399,13 +235,14 @@ export class DaemonRelayBridge {
399
235
  return;
400
236
  if (session.profile !== envelope.profile || session.epoch !== envelope.epoch)
401
237
  return;
402
- if (!this.acceptInboundSeq(session, envelope.seq)) {
238
+ if (!acceptInboundRelaySeq(session, envelope.seq)) {
403
239
  out.warn(`[relay] dropped replay/old frame for session ${session.sessionId}`);
404
240
  return;
405
241
  }
406
242
  try {
407
243
  const plaintext = decryptEnvelope(session.key, envelope);
408
244
  session.lastActivityAt = Date.now();
245
+ logDaemonFrameSummary('relay->daemon', plaintext);
409
246
  if (daemonWs.readyState === WebSocket.OPEN) {
410
247
  daemonWs.send(plaintext);
411
248
  }
@@ -437,64 +274,19 @@ export class DaemonRelayBridge {
437
274
  daemonWs.on('error', (err) => out.warn(`[relay] daemon ws error: ${err.message}`));
438
275
  }
439
276
  sendToAllRelaySessions(relayWs, payload) {
440
- this.pruneIdleSessions();
441
- for (const session of this.relaySessions.values()) {
442
- session.txSeq += 1;
443
- session.lastActivityAt = Date.now();
444
- const envelope = encryptEnvelope(session.key, payload, {
445
- profile: session.profile,
446
- sessionId: session.sessionId,
447
- epoch: session.epoch,
448
- seq: session.txSeq,
449
- });
450
- relayWs.send(envelope);
451
- if (!session.keyRotationRequested && session.txSeq >= this.keyRotateAfterMessages) {
452
- const rotateNotice = {
453
- type: 'relay_key_update_required',
454
- sessionId: session.sessionId,
455
- nextEpoch: session.epoch + 1,
456
- reason: 'message_threshold',
457
- };
458
- relayWs.send(JSON.stringify(rotateNotice));
459
- session.keyRotationRequested = true;
460
- }
461
- }
462
- }
463
- acceptInboundSeq(session, seq) {
464
- if (seq < 1)
465
- return false;
466
- if (session.rxSeenSeq.has(seq))
467
- return false;
468
- if (seq > session.rxHighestSeq + RELAY_REPLAY_WINDOW)
469
- return false;
470
- const minimumAllowed = Math.max(1, session.rxHighestSeq - RELAY_REPLAY_WINDOW + 1);
471
- if (seq < minimumAllowed)
472
- return false;
473
- session.rxSeenSeq.add(seq);
474
- if (seq > session.rxHighestSeq)
475
- session.rxHighestSeq = seq;
476
- const pruneBelow = Math.max(1, session.rxHighestSeq - RELAY_REPLAY_WINDOW + 1);
477
- for (const seen of session.rxSeenSeq) {
478
- if (seen < pruneBelow)
479
- session.rxSeenSeq.delete(seen);
480
- }
481
- return true;
482
- }
483
- pruneIdleSessions() {
484
- const now = Date.now();
485
- for (const [sessionId, session] of this.relaySessions.entries()) {
486
- if (now - session.lastActivityAt > RELAY_SESSION_IDLE_TTL_MS) {
487
- this.relaySessions.delete(sessionId);
488
- }
489
- }
277
+ sendToAllRelaySessions({
278
+ relayWs,
279
+ sessions: this.relaySessions,
280
+ payload,
281
+ keyRotateAfterMessages: this.keyRotateAfterMessages,
282
+ });
490
283
  }
491
284
  enforceRelaySessionCapacity() {
492
- this.pruneIdleSessions();
493
- while (this.relaySessions.size > this.relaySessionMaxEntries) {
494
- const oldestSessionId = this.relaySessions.keys().next().value;
495
- if (!oldestSessionId)
496
- break;
497
- this.relaySessions.delete(oldestSessionId);
285
+ const evicted = enforceRelaySessionCapacity({
286
+ sessions: this.relaySessions,
287
+ maxEntries: this.relaySessionMaxEntries,
288
+ });
289
+ for (const oldestSessionId of evicted) {
498
290
  out.warn(`[relay] evicted relay session ${oldestSessionId} due to relay session cap (${this.relaySessionMaxEntries})`);
499
291
  }
500
292
  }
@@ -605,14 +397,7 @@ export class DaemonRelayBridge {
605
397
  if (previous && init.previousSessionId) {
606
398
  this.relaySessions.delete(init.previousSessionId);
607
399
  }
608
- this.relaySessions.set(derived.session.sessionId, {
609
- ...derived.session,
610
- txSeq: 0,
611
- rxHighestSeq: 0,
612
- rxSeenSeq: new Set(),
613
- lastActivityAt: Date.now(),
614
- keyRotationRequested: false,
615
- });
400
+ this.relaySessions.set(derived.session.sessionId, createRelaySessionState(derived.session));
616
401
  this.enforceRelaySessionCapacity();
617
402
  if (relayWs.readyState === WebSocket.OPEN) {
618
403
  relayWs.send(JSON.stringify(derived.response));
@@ -669,15 +454,10 @@ export class DaemonRelayBridge {
669
454
  if (previous && init.previousSessionId) {
670
455
  this.relaySessions.delete(init.previousSessionId);
671
456
  }
672
- this.relaySessions.set(derived.session.sessionId, {
457
+ this.relaySessions.set(derived.session.sessionId, createRelaySessionState({
673
458
  ...derived.session,
674
459
  profile: derived.session.profile,
675
- txSeq: 0,
676
- rxHighestSeq: 0,
677
- rxSeenSeq: new Set(),
678
- lastActivityAt: Date.now(),
679
- keyRotationRequested: false,
680
- });
460
+ }));
681
461
  this.enforceRelaySessionCapacity();
682
462
  if (relayWs.readyState === WebSocket.OPEN) {
683
463
  relayWs.send(JSON.stringify(derived.response));
@@ -690,145 +470,37 @@ export class DaemonRelayBridge {
690
470
  }
691
471
  }
692
472
  async handlePairingOfferRequest(frame, relayWs) {
693
- const requestId = frame.requestId;
694
473
  const reply = (payload) => {
695
474
  if (relayWs.readyState === WebSocket.OPEN) {
696
475
  relayWs.send(JSON.stringify(payload));
697
476
  }
698
477
  };
699
- try {
700
- this.prunePairingChannelKeys();
701
- const clientChannelPublicKey = fromBase64Url(frame.clientChannelPublicKey);
702
- if (clientChannelPublicKey.length !== 65) {
703
- throw new Error('invalid clientChannelPublicKey');
704
- }
705
- const daemonChannel = crypto.createECDH('prime256v1');
706
- daemonChannel.generateKeys();
707
- const shared = daemonChannel.computeSecret(clientChannelPublicKey);
708
- const channelKey = derivePairingChannelKey(shared, `offer:${frame.requestId}`);
709
- const daemonUrl = new URL(this.options.daemonWsUrl);
710
- const issued = await issuePairingOffer({
711
- ttlSeconds: frame.ttlSeconds ?? 600,
712
- connection: {
713
- host: daemonUrl.hostname || '127.0.0.1',
714
- port: daemonUrl.port ? Number(daemonUrl.port) : 7070,
715
- listen: `relay:${this.options.workspaceId}`,
716
- profile: 'relay',
717
- },
718
- });
719
- this.pairingChannelKeys.set(issued.offerId, { key: channelKey, createdAt: Date.now() });
720
- const encryptedOffer = encryptPairingPayload(channelKey, JSON.stringify({
721
- offerId: issued.offerId,
722
- createdAt: issued.createdAt,
723
- expiresAt: issued.expiresAt,
724
- redeemSecret: issued.redeemSecret,
725
- trustAnchor: issued.trustAnchor,
726
- daemonDeviceId: issued.daemonDeviceId,
727
- daemonPublicKey: issued.daemonPublicKey,
728
- }), `offer:${frame.requestId}`);
729
- reply({
730
- type: 'relay_pairing_offer_response',
731
- requestId,
732
- ok: true,
733
- daemonChannelPublicKey: toBase64Url(daemonChannel.getPublicKey()),
734
- ...encryptedOffer,
735
- });
736
- }
737
- catch (error) {
738
- const message = error instanceof Error ? error.message : String(error);
739
- reply({
740
- type: 'relay_pairing_offer_response',
741
- requestId,
742
- ok: false,
743
- errorCode: 'PAIRING_OFFER_FAILED',
744
- error: message,
745
- });
746
- }
478
+ await handleRelayPairingOfferRequest({
479
+ frame,
480
+ reply,
481
+ pairingChannelKeys: this.pairingChannelKeys,
482
+ workspaceId: this.options.workspaceId,
483
+ daemonWsUrl: this.options.daemonWsUrl,
484
+ maxAgeMs: this.pairingChannelTtlMs,
485
+ maxEntries: this.pairingChannelMaxEntries,
486
+ });
747
487
  }
748
488
  async handlePairingRedeemRequest(frame, relayWs) {
749
- const requestId = frame.requestId;
750
489
  const reply = (payload) => {
751
490
  if (relayWs.readyState === WebSocket.OPEN) {
752
491
  relayWs.send(JSON.stringify(payload));
753
492
  }
754
493
  };
755
- try {
756
- this.prunePairingChannelKeys();
757
- const channel = this.pairingChannelKeys.get(frame.offerId);
758
- if (!channel) {
759
- throw new Error('pairing channel missing or expired');
760
- }
761
- const decrypted = decryptPairingPayload(channel.key, {
762
- encIv: frame.encIv,
763
- encTag: frame.encTag,
764
- encCiphertext: frame.encCiphertext,
765
- }, `redeem:${frame.requestId}:${frame.offerId}`);
766
- const parsed = JSON.parse(decrypted);
767
- if (typeof parsed.redeemSecret !== 'string' ||
768
- typeof parsed.trustAnchor !== 'string' ||
769
- typeof parsed.clientPublicKey !== 'string' ||
770
- typeof parsed.clientProof !== 'string' ||
771
- parsed.redeemSecret.trim().length === 0 ||
772
- parsed.trustAnchor.trim().length === 0 ||
773
- parsed.clientPublicKey.trim().length === 0 ||
774
- parsed.clientProof.trim().length === 0) {
775
- throw new Error('invalid encrypted pairing payload');
776
- }
777
- const redeemed = await redeemPairingOffer(frame.offerId, parsed.redeemSecret, parsed.trustAnchor, parsed.clientPublicKey, parsed.clientProof);
778
- if (!redeemed) {
779
- reply({
780
- type: 'relay_pairing_redeem_response',
781
- requestId,
782
- ok: false,
783
- errorCode: 'PAIRING_REDEEM_FAILED',
784
- error: 'offer not found or no longer valid',
785
- });
786
- return;
787
- }
788
- reply({
789
- type: 'relay_pairing_redeem_response',
790
- requestId,
791
- ok: true,
792
- redeemed: {
793
- offerId: redeemed.offerId,
794
- createdAt: redeemed.createdAt,
795
- expiresAt: redeemed.expiresAt,
796
- peerId: redeemed.peerId,
797
- daemonDeviceId: redeemed.daemonDeviceId,
798
- daemonPublicKey: redeemed.daemonPublicKey,
799
- relayPairingPeerId: redeemed.relayPairingPeerId,
800
- serverSignature: redeemed.serverSignature,
801
- },
802
- });
803
- this.pairingChannelKeys.delete(frame.offerId);
804
- }
805
- catch (error) {
806
- const message = error instanceof Error ? error.message : String(error);
807
- reply({
808
- type: 'relay_pairing_redeem_response',
809
- requestId,
810
- ok: false,
811
- errorCode: 'PAIRING_REDEEM_FAILED',
812
- error: message,
813
- });
814
- }
494
+ await handleRelayPairingRedeemRequest({
495
+ frame,
496
+ reply,
497
+ pairingChannelKeys: this.pairingChannelKeys,
498
+ maxAgeMs: this.pairingChannelTtlMs,
499
+ maxEntries: this.pairingChannelMaxEntries,
500
+ });
815
501
  }
816
502
  prunePairingChannelKeys(now = Date.now(), maxAgeMs = this.pairingChannelTtlMs, maxEntries = this.pairingChannelMaxEntries) {
817
- for (const [offerId, channel] of this.pairingChannelKeys.entries()) {
818
- if (now - channel.createdAt > maxAgeMs) {
819
- this.pairingChannelKeys.delete(offerId);
820
- }
821
- }
822
- const overflow = this.pairingChannelKeys.size - maxEntries;
823
- if (overflow <= 0) {
824
- return;
825
- }
826
- const oldest = Array.from(this.pairingChannelKeys.entries())
827
- .sort((a, b) => a[1].createdAt - b[1].createdAt)
828
- .slice(0, overflow);
829
- for (const [offerId] of oldest) {
830
- this.pairingChannelKeys.delete(offerId);
831
- }
503
+ pruneRelayPairingChannelKeys(this.pairingChannelKeys, now, maxAgeMs, maxEntries);
832
504
  }
833
505
  flushPendingOutbound() {
834
506
  const relayWs = this.relayWs;
@@ -854,144 +526,8 @@ export class DaemonRelayBridge {
854
526
  }
855
527
  return resolved;
856
528
  }
857
- async issueRelayToken() {
858
- const url = `${this.options.relayServerUrl.replace(/\/+$/, '')}/api/poc/relay-token`;
859
- const controller = new AbortController();
860
- const timeout = setTimeout(() => controller.abort(), 8_000);
861
- let res;
862
- if (!this.daemonIssueToken) {
863
- throw new BridgeError('TOKEN_ISSUE_FAILED', 'missing daemon issue token');
864
- }
865
- try {
866
- res = await fetch(url, {
867
- method: 'POST',
868
- headers: { 'content-type': 'application/json' },
869
- body: JSON.stringify({
870
- role: 'workspace-daemon',
871
- workspaceId: this.options.workspaceId,
872
- credential: this.daemonIssueToken,
873
- }),
874
- signal: controller.signal,
875
- });
876
- }
877
- catch (error) {
878
- clearTimeout(timeout);
879
- throw new BridgeError('TOKEN_ISSUE_FAILED', error instanceof Error ? error.message : String(error));
880
- }
881
- clearTimeout(timeout);
882
- const parsed = await parseRelayIssueResponse(res);
883
- if (!res.ok || !parsed.ok || !parsed.relayToken) {
884
- const reason = parsed.reason ?? parsed.error ?? `HTTP ${res.status}`;
885
- throw new BridgeError('TOKEN_ISSUE_FAILED', `issue relay token failed: ${reason}`);
886
- }
887
- let tokenClaims;
888
- let verificationKeys = await this.resolveRelayTokenVerificationKeys(false);
889
- try {
890
- tokenClaims = verifyRelayTokenClaims(parsed.relayToken, {
891
- issuer: this.options.relayTokenIssuer ?? 'viewport-server-poc',
892
- audience: this.options.relayTokenAudience ?? 'viewport-relay',
893
- signingKeys: verificationKeys,
894
- clockSkewSec: this.options.relayTokenClockSkewSec ?? 30,
895
- });
896
- }
897
- catch (error) {
898
- if (this.relayTokenJwksUrl &&
899
- error instanceof BridgeError &&
900
- error.code === 'TOKEN_RESPONSE_INVALID' &&
901
- error.message.includes('is not trusted')) {
902
- verificationKeys = await this.resolveRelayTokenVerificationKeys(true);
903
- tokenClaims = verifyRelayTokenClaims(parsed.relayToken, {
904
- issuer: this.options.relayTokenIssuer ?? 'viewport-server-poc',
905
- audience: this.options.relayTokenAudience ?? 'viewport-relay',
906
- signingKeys: verificationKeys,
907
- clockSkewSec: this.options.relayTokenClockSkewSec ?? 30,
908
- });
909
- }
910
- else {
911
- throw error;
912
- }
913
- }
914
- const profile = parseRelayHandshakeProfile(tokenClaims.e2eeProfile ?? 'noise-ik');
915
- if (!profile) {
916
- throw new BridgeError('TOKEN_RESPONSE_INVALID', 'missing/invalid e2eeProfile claim');
917
- }
918
- return {
919
- relayToken: parsed.relayToken,
920
- profile,
921
- };
922
- }
923
- async resolveRelayTokenVerificationKeys(forceRefresh) {
924
- if (!this.relayTokenJwksUrl) {
925
- return this.relayTokenSigningKeys;
926
- }
927
- const now = Date.now();
928
- if (!forceRefresh && now < this.jwksCacheExpiresAt && Object.keys(this.jwksCacheKeys).length) {
929
- return this.jwksCacheKeys;
930
- }
931
- const controller = new AbortController();
932
- const timeout = setTimeout(() => controller.abort(), 8_000);
933
- let res;
934
- try {
935
- res = await fetch(this.relayTokenJwksUrl, {
936
- method: 'GET',
937
- headers: { accept: 'application/json' },
938
- signal: controller.signal,
939
- });
940
- }
941
- catch (error) {
942
- clearTimeout(timeout);
943
- throw new BridgeError('TOKEN_RESPONSE_INVALID', `failed to fetch JWKS: ${error instanceof Error ? error.message : String(error)}`);
944
- }
945
- clearTimeout(timeout);
946
- if (!res.ok) {
947
- throw new BridgeError('TOKEN_RESPONSE_INVALID', `JWKS endpoint returned HTTP ${res.status}`);
948
- }
949
- const parsed = (await res.json().catch(() => null));
950
- if (!parsed || !Array.isArray(parsed.keys)) {
951
- throw new BridgeError('TOKEN_RESPONSE_INVALID', 'JWKS response missing keys array');
952
- }
953
- if (parsed.keys.length > MAX_JWKS_KEYS) {
954
- throw new BridgeError('TOKEN_RESPONSE_INVALID', `JWKS response contains too many keys (${parsed.keys.length} > ${MAX_JWKS_KEYS})`);
955
- }
956
- const keys = {};
957
- for (const entry of parsed.keys) {
958
- if (!entry || typeof entry !== 'object' || Array.isArray(entry))
959
- continue;
960
- const kid = typeof entry['kid'] === 'string' ? entry['kid'].trim() : '';
961
- const kty = typeof entry['kty'] === 'string' ? entry['kty'] : '';
962
- const alg = typeof entry['alg'] === 'string' ? entry['alg'] : '';
963
- const n = typeof entry['n'] === 'string' ? entry['n'] : '';
964
- const e = typeof entry['e'] === 'string' ? entry['e'] : '';
965
- if (!kid || kty !== 'RSA' || !n || !e)
966
- continue;
967
- if (alg && alg !== 'RS256')
968
- continue;
969
- try {
970
- const keyObject = crypto.createPublicKey({
971
- key: { kty: 'RSA', n, e },
972
- format: 'jwk',
973
- });
974
- keys[kid] = keyObject.export({ format: 'pem', type: 'spki' }).toString();
975
- }
976
- catch {
977
- continue;
978
- }
979
- }
980
- if (Object.keys(keys).length === 0) {
981
- throw new BridgeError('TOKEN_RESPONSE_INVALID', 'JWKS contained no usable signing keys');
982
- }
983
- this.jwksCacheKeys = keys;
984
- this.jwksCacheExpiresAt = Date.now() + 5 * 60_000;
985
- return keys;
986
- }
987
- normalizeError(error) {
988
- if (error instanceof BridgeError) {
989
- return error;
990
- }
991
- if (error instanceof Error) {
992
- return new BridgeError('UNKNOWN', error.message);
993
- }
994
- return new BridgeError('UNKNOWN', String(error));
529
+ issueRelayToken() {
530
+ return this.relayTokenIssuer.issue();
995
531
  }
996
532
  recordError(code, message) {
997
533
  this.lastErrorCode = code;