@viewportai/daemon 0.1.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 (350) hide show
  1. package/LICENSE +176 -0
  2. package/README.md +157 -0
  3. package/bin/vpd.js +3 -0
  4. package/dist/adapters/claude.d.ts +119 -0
  5. package/dist/adapters/claude.d.ts.map +1 -0
  6. package/dist/adapters/claude.js +621 -0
  7. package/dist/adapters/claude.js.map +1 -0
  8. package/dist/adapters/codex-event-normalizers.d.ts +10 -0
  9. package/dist/adapters/codex-event-normalizers.d.ts.map +1 -0
  10. package/dist/adapters/codex-event-normalizers.js +208 -0
  11. package/dist/adapters/codex-event-normalizers.js.map +1 -0
  12. package/dist/adapters/codex-sdk-loader.d.ts +47 -0
  13. package/dist/adapters/codex-sdk-loader.d.ts.map +1 -0
  14. package/dist/adapters/codex-sdk-loader.js +19 -0
  15. package/dist/adapters/codex-sdk-loader.js.map +1 -0
  16. package/dist/adapters/codex.d.ts +56 -0
  17. package/dist/adapters/codex.d.ts.map +1 -0
  18. package/dist/adapters/codex.js +267 -0
  19. package/dist/adapters/codex.js.map +1 -0
  20. package/dist/adapters/gemini-cli.d.ts +49 -0
  21. package/dist/adapters/gemini-cli.d.ts.map +1 -0
  22. package/dist/adapters/gemini-cli.js +181 -0
  23. package/dist/adapters/gemini-cli.js.map +1 -0
  24. package/dist/adapters/pty.d.ts +56 -0
  25. package/dist/adapters/pty.d.ts.map +1 -0
  26. package/dist/adapters/pty.js +223 -0
  27. package/dist/adapters/pty.js.map +1 -0
  28. package/dist/agents/aider.d.ts +9 -0
  29. package/dist/agents/aider.d.ts.map +1 -0
  30. package/dist/agents/aider.js +37 -0
  31. package/dist/agents/aider.js.map +1 -0
  32. package/dist/agents/built-in.d.ts +4 -0
  33. package/dist/agents/built-in.d.ts.map +1 -0
  34. package/dist/agents/built-in.js +6 -0
  35. package/dist/agents/built-in.js.map +1 -0
  36. package/dist/agents/claude.d.ts +12 -0
  37. package/dist/agents/claude.d.ts.map +1 -0
  38. package/dist/agents/claude.js +93 -0
  39. package/dist/agents/claude.js.map +1 -0
  40. package/dist/agents/codex.d.ts +6 -0
  41. package/dist/agents/codex.d.ts.map +1 -0
  42. package/dist/agents/codex.js +64 -0
  43. package/dist/agents/codex.js.map +1 -0
  44. package/dist/agents/command-detection.d.ts +6 -0
  45. package/dist/agents/command-detection.d.ts.map +1 -0
  46. package/dist/agents/command-detection.js +12 -0
  47. package/dist/agents/command-detection.js.map +1 -0
  48. package/dist/agents/gemini.d.ts +6 -0
  49. package/dist/agents/gemini.d.ts.map +1 -0
  50. package/dist/agents/gemini.js +36 -0
  51. package/dist/agents/gemini.js.map +1 -0
  52. package/dist/cli/agent-commands.d.ts +2 -0
  53. package/dist/cli/agent-commands.d.ts.map +1 -0
  54. package/dist/cli/agent-commands.js +87 -0
  55. package/dist/cli/agent-commands.js.map +1 -0
  56. package/dist/cli/args.d.ts +9 -0
  57. package/dist/cli/args.d.ts.map +1 -0
  58. package/dist/cli/args.js +34 -0
  59. package/dist/cli/args.js.map +1 -0
  60. package/dist/cli/command-shared.d.ts +53 -0
  61. package/dist/cli/command-shared.d.ts.map +1 -0
  62. package/dist/cli/command-shared.js +239 -0
  63. package/dist/cli/command-shared.js.map +1 -0
  64. package/dist/cli/commands.d.ts +20 -0
  65. package/dist/cli/commands.d.ts.map +1 -0
  66. package/dist/cli/commands.js +20 -0
  67. package/dist/cli/commands.js.map +1 -0
  68. package/dist/cli/daemon-client.d.ts +30 -0
  69. package/dist/cli/daemon-client.d.ts.map +1 -0
  70. package/dist/cli/daemon-client.js +161 -0
  71. package/dist/cli/daemon-client.js.map +1 -0
  72. package/dist/cli/daemon-lifecycle.d.ts +47 -0
  73. package/dist/cli/daemon-lifecycle.d.ts.map +1 -0
  74. package/dist/cli/daemon-lifecycle.js +262 -0
  75. package/dist/cli/daemon-lifecycle.js.map +1 -0
  76. package/dist/cli/daemon-settings.d.ts +9 -0
  77. package/dist/cli/daemon-settings.d.ts.map +1 -0
  78. package/dist/cli/daemon-settings.js +168 -0
  79. package/dist/cli/daemon-settings.js.map +1 -0
  80. package/dist/cli/directory-commands.d.ts +4 -0
  81. package/dist/cli/directory-commands.d.ts.map +1 -0
  82. package/dist/cli/directory-commands.js +190 -0
  83. package/dist/cli/directory-commands.js.map +1 -0
  84. package/dist/cli/hook-command.d.ts +14 -0
  85. package/dist/cli/hook-command.d.ts.map +1 -0
  86. package/dist/cli/hook-command.js +96 -0
  87. package/dist/cli/hook-command.js.map +1 -0
  88. package/dist/cli/install-command.d.ts +2 -0
  89. package/dist/cli/install-command.d.ts.map +1 -0
  90. package/dist/cli/install-command.js +91 -0
  91. package/dist/cli/install-command.js.map +1 -0
  92. package/dist/cli/lifecycle-commands.d.ts +10 -0
  93. package/dist/cli/lifecycle-commands.d.ts.map +1 -0
  94. package/dist/cli/lifecycle-commands.js +524 -0
  95. package/dist/cli/lifecycle-commands.js.map +1 -0
  96. package/dist/cli/listen-target.d.ts +13 -0
  97. package/dist/cli/listen-target.d.ts.map +1 -0
  98. package/dist/cli/listen-target.js +102 -0
  99. package/dist/cli/listen-target.js.map +1 -0
  100. package/dist/cli/orchestration-commands.d.ts +8 -0
  101. package/dist/cli/orchestration-commands.d.ts.map +1 -0
  102. package/dist/cli/orchestration-commands.js +340 -0
  103. package/dist/cli/orchestration-commands.js.map +1 -0
  104. package/dist/cli/permission-commands.d.ts +2 -0
  105. package/dist/cli/permission-commands.d.ts.map +1 -0
  106. package/dist/cli/permission-commands.js +138 -0
  107. package/dist/cli/permission-commands.js.map +1 -0
  108. package/dist/cli/runtime-toolchain.d.ts +35 -0
  109. package/dist/cli/runtime-toolchain.d.ts.map +1 -0
  110. package/dist/cli/runtime-toolchain.js +184 -0
  111. package/dist/cli/runtime-toolchain.js.map +1 -0
  112. package/dist/cli/service-commands.d.ts +19 -0
  113. package/dist/cli/service-commands.d.ts.map +1 -0
  114. package/dist/cli/service-commands.js +273 -0
  115. package/dist/cli/service-commands.js.map +1 -0
  116. package/dist/cli/session-commands.d.ts +3 -0
  117. package/dist/cli/session-commands.d.ts.map +1 -0
  118. package/dist/cli/session-commands.js +146 -0
  119. package/dist/cli/session-commands.js.map +1 -0
  120. package/dist/cli/setup-command.d.ts +12 -0
  121. package/dist/cli/setup-command.d.ts.map +1 -0
  122. package/dist/cli/setup-command.js +223 -0
  123. package/dist/cli/setup-command.js.map +1 -0
  124. package/dist/cli/supervisor-protocol.d.ts +20 -0
  125. package/dist/cli/supervisor-protocol.d.ts.map +1 -0
  126. package/dist/cli/supervisor-protocol.js +5 -0
  127. package/dist/cli/supervisor-protocol.js.map +1 -0
  128. package/dist/cli/supervisor.d.ts +10 -0
  129. package/dist/cli/supervisor.d.ts.map +1 -0
  130. package/dist/cli/supervisor.js +218 -0
  131. package/dist/cli/supervisor.js.map +1 -0
  132. package/dist/cli/worktree-commands.d.ts +2 -0
  133. package/dist/cli/worktree-commands.d.ts.map +1 -0
  134. package/dist/cli/worktree-commands.js +250 -0
  135. package/dist/cli/worktree-commands.js.map +1 -0
  136. package/dist/cli/ws-client.d.ts +20 -0
  137. package/dist/cli/ws-client.d.ts.map +1 -0
  138. package/dist/cli/ws-client.js +103 -0
  139. package/dist/cli/ws-client.js.map +1 -0
  140. package/dist/core/agent-registry.d.ts +128 -0
  141. package/dist/core/agent-registry.d.ts.map +1 -0
  142. package/dist/core/agent-registry.js +131 -0
  143. package/dist/core/agent-registry.js.map +1 -0
  144. package/dist/core/config-schema.d.ts +77 -0
  145. package/dist/core/config-schema.d.ts.map +1 -0
  146. package/dist/core/config-schema.js +66 -0
  147. package/dist/core/config-schema.js.map +1 -0
  148. package/dist/core/config.d.ts +111 -0
  149. package/dist/core/config.d.ts.map +1 -0
  150. package/dist/core/config.js +244 -0
  151. package/dist/core/config.js.map +1 -0
  152. package/dist/core/daemon.d.ts +113 -0
  153. package/dist/core/daemon.d.ts.map +1 -0
  154. package/dist/core/daemon.js +197 -0
  155. package/dist/core/daemon.js.map +1 -0
  156. package/dist/core/discovered-sessions.d.ts +7 -0
  157. package/dist/core/discovered-sessions.d.ts.map +1 -0
  158. package/dist/core/discovered-sessions.js +39 -0
  159. package/dist/core/discovered-sessions.js.map +1 -0
  160. package/dist/core/error-codes.d.ts +31 -0
  161. package/dist/core/error-codes.d.ts.map +1 -0
  162. package/dist/core/error-codes.js +30 -0
  163. package/dist/core/error-codes.js.map +1 -0
  164. package/dist/core/errors.d.ts +16 -0
  165. package/dist/core/errors.d.ts.map +1 -0
  166. package/dist/core/errors.js +43 -0
  167. package/dist/core/errors.js.map +1 -0
  168. package/dist/core/events.d.ts +183 -0
  169. package/dist/core/events.d.ts.map +1 -0
  170. package/dist/core/events.js +61 -0
  171. package/dist/core/events.js.map +1 -0
  172. package/dist/core/interfaces.d.ts +115 -0
  173. package/dist/core/interfaces.d.ts.map +1 -0
  174. package/dist/core/interfaces.js +9 -0
  175. package/dist/core/interfaces.js.map +1 -0
  176. package/dist/core/logger.d.ts +11 -0
  177. package/dist/core/logger.d.ts.map +1 -0
  178. package/dist/core/logger.js +17 -0
  179. package/dist/core/logger.js.map +1 -0
  180. package/dist/core/metrics.d.ts +24 -0
  181. package/dist/core/metrics.d.ts.map +1 -0
  182. package/dist/core/metrics.js +32 -0
  183. package/dist/core/metrics.js.map +1 -0
  184. package/dist/core/output.d.ts +13 -0
  185. package/dist/core/output.d.ts.map +1 -0
  186. package/dist/core/output.js +22 -0
  187. package/dist/core/output.js.map +1 -0
  188. package/dist/core/permission-coordinator.d.ts +67 -0
  189. package/dist/core/permission-coordinator.d.ts.map +1 -0
  190. package/dist/core/permission-coordinator.js +209 -0
  191. package/dist/core/permission-coordinator.js.map +1 -0
  192. package/dist/core/session-manager.d.ts +121 -0
  193. package/dist/core/session-manager.d.ts.map +1 -0
  194. package/dist/core/session-manager.js +354 -0
  195. package/dist/core/session-manager.js.map +1 -0
  196. package/dist/core/session-state-file.d.ts +20 -0
  197. package/dist/core/session-state-file.d.ts.map +1 -0
  198. package/dist/core/session-state-file.js +49 -0
  199. package/dist/core/session-state-file.js.map +1 -0
  200. package/dist/core/types.d.ts +250 -0
  201. package/dist/core/types.d.ts.map +1 -0
  202. package/dist/core/types.js +88 -0
  203. package/dist/core/types.js.map +1 -0
  204. package/dist/directories/manager.d.ts +32 -0
  205. package/dist/directories/manager.d.ts.map +1 -0
  206. package/dist/directories/manager.js +86 -0
  207. package/dist/directories/manager.js.map +1 -0
  208. package/dist/discovery/claude.d.ts +29 -0
  209. package/dist/discovery/claude.d.ts.map +1 -0
  210. package/dist/discovery/claude.js +55 -0
  211. package/dist/discovery/claude.js.map +1 -0
  212. package/dist/discovery/codex.d.ts +11 -0
  213. package/dist/discovery/codex.d.ts.map +1 -0
  214. package/dist/discovery/codex.js +365 -0
  215. package/dist/discovery/codex.js.map +1 -0
  216. package/dist/discovery/gemini.d.ts +15 -0
  217. package/dist/discovery/gemini.d.ts.map +1 -0
  218. package/dist/discovery/gemini.js +151 -0
  219. package/dist/discovery/gemini.js.map +1 -0
  220. package/dist/discovery/jsonl-reader.d.ts +122 -0
  221. package/dist/discovery/jsonl-reader.d.ts.map +1 -0
  222. package/dist/discovery/jsonl-reader.js +622 -0
  223. package/dist/discovery/jsonl-reader.js.map +1 -0
  224. package/dist/discovery/watcher.d.ts +29 -0
  225. package/dist/discovery/watcher.d.ts.map +1 -0
  226. package/dist/discovery/watcher.js +383 -0
  227. package/dist/discovery/watcher.js.map +1 -0
  228. package/dist/hooks/index.d.ts +10 -0
  229. package/dist/hooks/index.d.ts.map +1 -0
  230. package/dist/hooks/index.js +8 -0
  231. package/dist/hooks/index.js.map +1 -0
  232. package/dist/hooks/installers/base.d.ts +27 -0
  233. package/dist/hooks/installers/base.d.ts.map +1 -0
  234. package/dist/hooks/installers/base.js +9 -0
  235. package/dist/hooks/installers/base.js.map +1 -0
  236. package/dist/hooks/installers/claude.d.ts +18 -0
  237. package/dist/hooks/installers/claude.d.ts.map +1 -0
  238. package/dist/hooks/installers/claude.js +120 -0
  239. package/dist/hooks/installers/claude.js.map +1 -0
  240. package/dist/hooks/router.d.ts +63 -0
  241. package/dist/hooks/router.d.ts.map +1 -0
  242. package/dist/hooks/router.js +259 -0
  243. package/dist/hooks/router.js.map +1 -0
  244. package/dist/hooks/supervision.d.ts +27 -0
  245. package/dist/hooks/supervision.d.ts.map +1 -0
  246. package/dist/hooks/supervision.js +67 -0
  247. package/dist/hooks/supervision.js.map +1 -0
  248. package/dist/hooks/types.d.ts +171 -0
  249. package/dist/hooks/types.d.ts.map +1 -0
  250. package/dist/hooks/types.js +148 -0
  251. package/dist/hooks/types.js.map +1 -0
  252. package/dist/index.d.ts +17 -0
  253. package/dist/index.d.ts.map +1 -0
  254. package/dist/index.js +117 -0
  255. package/dist/index.js.map +1 -0
  256. package/dist/permissions/engine.d.ts +23 -0
  257. package/dist/permissions/engine.d.ts.map +1 -0
  258. package/dist/permissions/engine.js +43 -0
  259. package/dist/permissions/engine.js.map +1 -0
  260. package/dist/plugins/loader.d.ts +44 -0
  261. package/dist/plugins/loader.d.ts.map +1 -0
  262. package/dist/plugins/loader.js +177 -0
  263. package/dist/plugins/loader.js.map +1 -0
  264. package/dist/server/auth.d.ts +32 -0
  265. package/dist/server/auth.d.ts.map +1 -0
  266. package/dist/server/auth.js +78 -0
  267. package/dist/server/auth.js.map +1 -0
  268. package/dist/server/discovered-watch-key.d.ts +5 -0
  269. package/dist/server/discovered-watch-key.d.ts.map +1 -0
  270. package/dist/server/discovered-watch-key.js +31 -0
  271. package/dist/server/discovered-watch-key.js.map +1 -0
  272. package/dist/server/hello-builder.d.ts +17 -0
  273. package/dist/server/hello-builder.d.ts.map +1 -0
  274. package/dist/server/hello-builder.js +71 -0
  275. package/dist/server/hello-builder.js.map +1 -0
  276. package/dist/server/http-server.d.ts +30 -0
  277. package/dist/server/http-server.d.ts.map +1 -0
  278. package/dist/server/http-server.js +561 -0
  279. package/dist/server/http-server.js.map +1 -0
  280. package/dist/server/message-normalizers.d.ts +11 -0
  281. package/dist/server/message-normalizers.d.ts.map +1 -0
  282. package/dist/server/message-normalizers.js +104 -0
  283. package/dist/server/message-normalizers.js.map +1 -0
  284. package/dist/server/pairing-offers.d.ts +78 -0
  285. package/dist/server/pairing-offers.d.ts.map +1 -0
  286. package/dist/server/pairing-offers.js +502 -0
  287. package/dist/server/pairing-offers.js.map +1 -0
  288. package/dist/server/rate-limiter.d.ts +21 -0
  289. package/dist/server/rate-limiter.d.ts.map +1 -0
  290. package/dist/server/rate-limiter.js +61 -0
  291. package/dist/server/rate-limiter.js.map +1 -0
  292. package/dist/server/ring-buffer.d.ts +34 -0
  293. package/dist/server/ring-buffer.d.ts.map +1 -0
  294. package/dist/server/ring-buffer.js +73 -0
  295. package/dist/server/ring-buffer.js.map +1 -0
  296. package/dist/server/security.d.ts +22 -0
  297. package/dist/server/security.d.ts.map +1 -0
  298. package/dist/server/security.js +123 -0
  299. package/dist/server/security.js.map +1 -0
  300. package/dist/server/ws-command-handlers.d.ts +25 -0
  301. package/dist/server/ws-command-handlers.d.ts.map +1 -0
  302. package/dist/server/ws-command-handlers.js +218 -0
  303. package/dist/server/ws-command-handlers.js.map +1 -0
  304. package/dist/server/ws-daemon-event-bridge.d.ts +22 -0
  305. package/dist/server/ws-daemon-event-bridge.d.ts.map +1 -0
  306. package/dist/server/ws-daemon-event-bridge.js +321 -0
  307. package/dist/server/ws-daemon-event-bridge.js.map +1 -0
  308. package/dist/server/ws-limits.d.ts +2 -0
  309. package/dist/server/ws-limits.d.ts.map +1 -0
  310. package/dist/server/ws-limits.js +12 -0
  311. package/dist/server/ws-limits.js.map +1 -0
  312. package/dist/server/ws-protocol.d.ts +248 -0
  313. package/dist/server/ws-protocol.d.ts.map +1 -0
  314. package/dist/server/ws-protocol.js +157 -0
  315. package/dist/server/ws-protocol.js.map +1 -0
  316. package/dist/server/ws-server.d.ts +26 -0
  317. package/dist/server/ws-server.d.ts.map +1 -0
  318. package/dist/server/ws-server.js +290 -0
  319. package/dist/server/ws-server.js.map +1 -0
  320. package/dist/startup-agents.d.ts +6 -0
  321. package/dist/startup-agents.d.ts.map +1 -0
  322. package/dist/startup-agents.js +97 -0
  323. package/dist/startup-agents.js.map +1 -0
  324. package/dist/startup-prereqs.d.ts +29 -0
  325. package/dist/startup-prereqs.d.ts.map +1 -0
  326. package/dist/startup-prereqs.js +209 -0
  327. package/dist/startup-prereqs.js.map +1 -0
  328. package/dist/startup-watchers.d.ts +7 -0
  329. package/dist/startup-watchers.d.ts.map +1 -0
  330. package/dist/startup-watchers.js +196 -0
  331. package/dist/startup-watchers.js.map +1 -0
  332. package/dist/startup.d.ts +20 -0
  333. package/dist/startup.d.ts.map +1 -0
  334. package/dist/startup.js +335 -0
  335. package/dist/startup.js.map +1 -0
  336. package/dist/tracking/git-tracker.d.ts +52 -0
  337. package/dist/tracking/git-tracker.d.ts.map +1 -0
  338. package/dist/tracking/git-tracker.js +277 -0
  339. package/dist/tracking/git-tracker.js.map +1 -0
  340. package/dist/tracking/noop-tracker.d.ts +27 -0
  341. package/dist/tracking/noop-tracker.d.ts.map +1 -0
  342. package/dist/tracking/noop-tracker.js +42 -0
  343. package/dist/tracking/noop-tracker.js.map +1 -0
  344. package/docs/configuration.md +75 -0
  345. package/docs/developer-workflows.md +107 -0
  346. package/docs/protocol-matrix.json +155 -0
  347. package/docs/releasing.md +65 -0
  348. package/docs/security.md +48 -0
  349. package/docs/testing.md +112 -0
  350. package/package.json +84 -0
@@ -0,0 +1,155 @@
1
+ {
2
+ "version": 1,
3
+ "messages": [
4
+ {
5
+ "type": "launch",
6
+ "class": "stable",
7
+ "schema": "src/server/ws-protocol.ts#LaunchSchema",
8
+ "handler": "src/server/ws-command-handlers.ts#launch",
9
+ "unitTests": ["tests/server/ws-protocol.test.ts", "tests/server/ws-command-handlers.test.ts"],
10
+ "integrationTests": ["tests/server/ws-server.test.ts", "tests/e2e/protocol-session-lifecycle.test.ts"],
11
+ "surfacedInUi": true,
12
+ "surfacedInCli": true
13
+ },
14
+ {
15
+ "type": "kill",
16
+ "class": "stable",
17
+ "schema": "src/server/ws-protocol.ts#KillSchema",
18
+ "handler": "src/server/ws-command-handlers.ts#kill",
19
+ "unitTests": ["tests/server/ws-protocol.test.ts"],
20
+ "integrationTests": ["tests/server/ws-server.test.ts", "tests/e2e/protocol-session-lifecycle.test.ts"],
21
+ "surfacedInUi": true,
22
+ "surfacedInCli": false
23
+ },
24
+ {
25
+ "type": "prompt",
26
+ "class": "stable",
27
+ "schema": "src/server/ws-protocol.ts#PromptSchema",
28
+ "handler": "src/server/ws-command-handlers.ts#prompt",
29
+ "unitTests": ["tests/server/ws-protocol.test.ts", "tests/server/ws-command-handlers.test.ts"],
30
+ "integrationTests": ["tests/server/ws-server.test.ts", "tests/e2e/protocol-session-lifecycle.test.ts"],
31
+ "surfacedInUi": true,
32
+ "surfacedInCli": true
33
+ },
34
+ {
35
+ "type": "respond-permission",
36
+ "class": "stable",
37
+ "schema": "src/server/ws-protocol.ts#RespondPermissionSchema",
38
+ "handler": "src/server/ws-command-handlers.ts#respond-permission",
39
+ "unitTests": ["tests/server/ws-protocol.test.ts"],
40
+ "integrationTests": ["tests/server/ws-server.test.ts", "tests/e2e/protocol-session-lifecycle.test.ts"],
41
+ "surfacedInUi": true,
42
+ "surfacedInCli": true
43
+ },
44
+ {
45
+ "type": "subscribe",
46
+ "class": "stable",
47
+ "schema": "src/server/ws-protocol.ts#SubscribeSchema",
48
+ "handler": "src/server/ws-command-handlers.ts#subscribe",
49
+ "unitTests": ["tests/server/ws-protocol.test.ts", "tests/server/ring-buffer.test.ts"],
50
+ "integrationTests": ["tests/server/ws-server.test.ts"],
51
+ "surfacedInUi": true,
52
+ "surfacedInCli": true
53
+ },
54
+ {
55
+ "type": "unsubscribe",
56
+ "class": "stable",
57
+ "schema": "src/server/ws-protocol.ts#UnsubscribeSchema",
58
+ "handler": "src/server/ws-command-handlers.ts#unsubscribe",
59
+ "unitTests": ["tests/server/ws-protocol.test.ts"],
60
+ "integrationTests": ["tests/server/ws-server.test.ts"],
61
+ "surfacedInUi": true,
62
+ "surfacedInCli": false
63
+ },
64
+ {
65
+ "type": "rollback",
66
+ "class": "stable",
67
+ "schema": "src/server/ws-protocol.ts#RollbackSchema",
68
+ "handler": "src/server/ws-command-handlers.ts#rollback",
69
+ "unitTests": ["tests/server/ws-protocol.test.ts"],
70
+ "integrationTests": ["tests/server/ws-server.test.ts"],
71
+ "surfacedInUi": true,
72
+ "surfacedInCli": false
73
+ },
74
+ {
75
+ "type": "branch-retry",
76
+ "class": "stable",
77
+ "schema": "src/server/ws-protocol.ts#BranchRetrySchema",
78
+ "handler": "src/server/ws-command-handlers.ts#branch-retry",
79
+ "unitTests": ["tests/server/ws-protocol.test.ts"],
80
+ "integrationTests": ["tests/server/ws-server.test.ts"],
81
+ "surfacedInUi": true,
82
+ "surfacedInCli": false
83
+ },
84
+ {
85
+ "type": "squash-merge",
86
+ "class": "stable",
87
+ "schema": "src/server/ws-protocol.ts#SquashMergeSchema",
88
+ "handler": "src/server/ws-command-handlers.ts#squash-merge",
89
+ "unitTests": ["tests/server/ws-protocol.test.ts"],
90
+ "integrationTests": ["tests/server/ws-server.test.ts"],
91
+ "surfacedInUi": true,
92
+ "surfacedInCli": false
93
+ },
94
+ {
95
+ "type": "list-sessions",
96
+ "class": "stable",
97
+ "schema": "src/server/ws-protocol.ts#ListSessionsSchema",
98
+ "handler": "src/server/ws-command-handlers.ts#list-sessions",
99
+ "unitTests": ["tests/server/ws-protocol.test.ts", "tests/server/ws-command-handlers.test.ts"],
100
+ "integrationTests": ["tests/server/ws-server.test.ts"],
101
+ "surfacedInUi": true,
102
+ "surfacedInCli": false
103
+ },
104
+ {
105
+ "type": "resume",
106
+ "class": "stable",
107
+ "schema": "src/server/ws-protocol.ts#ResumeSchema",
108
+ "handler": "src/server/ws-command-handlers.ts#resume",
109
+ "unitTests": ["tests/server/ws-protocol.test.ts", "tests/server/ws-command-handlers.test.ts"],
110
+ "integrationTests": ["tests/server/ws-server.test.ts", "tests/e2e/protocol-session-lifecycle.test.ts"],
111
+ "surfacedInUi": true,
112
+ "surfacedInCli": false
113
+ },
114
+ {
115
+ "type": "watch-discovered-session",
116
+ "class": "stable",
117
+ "schema": "src/server/ws-protocol.ts#WatchDiscoveredSessionSchema",
118
+ "handler": "src/server/ws-command-handlers.ts#watch-discovered-session",
119
+ "unitTests": ["tests/server/ws-protocol.test.ts", "tests/server/ws-command-handlers.test.ts"],
120
+ "integrationTests": ["tests/server/ws-server.test.ts", "tests/e2e/protocol-discovery-hooks.test.ts"],
121
+ "surfacedInUi": true,
122
+ "surfacedInCli": false
123
+ },
124
+ {
125
+ "type": "unwatch-discovered-session",
126
+ "class": "stable",
127
+ "schema": "src/server/ws-protocol.ts#UnwatchDiscoveredSessionSchema",
128
+ "handler": "src/server/ws-command-handlers.ts#unwatch-discovered-session",
129
+ "unitTests": ["tests/server/ws-protocol.test.ts", "tests/server/ws-command-handlers.test.ts"],
130
+ "integrationTests": ["tests/server/ws-server.test.ts", "tests/e2e/protocol-discovery-hooks.test.ts"],
131
+ "surfacedInUi": true,
132
+ "surfacedInCli": false
133
+ },
134
+ {
135
+ "type": "supervise",
136
+ "class": "experimental",
137
+ "schema": "src/server/ws-protocol.ts#SuperviseSchema",
138
+ "handler": "src/server/ws-command-handlers.ts#supervise",
139
+ "unitTests": ["tests/server/ws-protocol.test.ts"],
140
+ "integrationTests": ["tests/e2e/protocol-discovery-hooks.test.ts"],
141
+ "surfacedInUi": true,
142
+ "surfacedInCli": false
143
+ },
144
+ {
145
+ "type": "respond-hook-permission",
146
+ "class": "experimental",
147
+ "schema": "src/server/ws-protocol.ts#RespondHookPermissionSchema",
148
+ "handler": "src/server/ws-command-handlers.ts#respond-hook-permission",
149
+ "unitTests": ["tests/server/ws-protocol.test.ts"],
150
+ "integrationTests": ["tests/e2e/protocol-discovery-hooks.test.ts"],
151
+ "surfacedInUi": true,
152
+ "surfacedInCli": false
153
+ }
154
+ ]
155
+ }
@@ -0,0 +1,65 @@
1
+ # Releasing and npm Publish
2
+
3
+ ## Current source of truth
4
+
5
+ 1. npm package name: `@viewportai/daemon` (`package.json` `name`).
6
+ 2. Version source: semantic-release from commit history on `main`.
7
+ 3. Publish trigger: `.github/workflows/release.yml` after `CI` succeeds on a push to `main`.
8
+ 4. npm auth: granular `NPM_TOKEN` secret in GitHub Actions.
9
+
10
+ ## Version rules
11
+
12
+ 1. `feat:` => `minor` (for example `0.4.0` -> `0.5.0`).
13
+ 2. `fix:` => `patch` (for example `0.4.1` -> `0.4.2`).
14
+ 3. `perf:` / `refactor:` / `revert:` => `patch`.
15
+ 4. `BREAKING CHANGE:` footer or `!` in type/scope => `major`.
16
+ 5. `docs:`, `test:`, `chore:` alone => no release.
17
+
18
+ ## One-time setup for production publish
19
+
20
+ 1. Create npm organization scope `@viewportai` (or verify ownership if it already exists).
21
+ 2. Ensure repository package name remains `@viewportai/daemon`.
22
+ 3. Create a granular npm token with publish rights to `@viewportai/daemon`.
23
+ 4. Add GitHub Actions secret `NPM_TOKEN` in repo settings.
24
+ 5. Ensure branch protection on `main` requires the `CI` workflow to pass before merge.
25
+ 6. Ensure branch protection on `main` requires the `Semantic PR` workflow to pass before merge.
26
+ 7. Use squash-merge so the semantic PR title becomes the release-driving commit on `main`.
27
+ 8. Ensure npm package access is public (already configured via `publishConfig.access=public`).
28
+ 9. For this repository, enforce a pre-1.0 stream with a one-time baseline tag on the bootstrap `main` commit: `git tag v0.0.0 && git push origin v0.0.0`.
29
+ 10. Keep `package.json` publish metadata canonical for provenance:
30
+ - `repository.url` must be exactly `https://github.com/viewportai/daemon`
31
+ - `bin.vpd` must be exactly `bin/vpd.js`
32
+
33
+ ## Release flow
34
+
35
+ 1. Open PR with semantic commits.
36
+ 2. Merge to `main` after CI green.
37
+ 3. `release.yml` runs semantic-release:
38
+ - calculates next version,
39
+ - updates `CHANGELOG.md`, `package.json`, and `package-lock.json`,
40
+ - creates git tag,
41
+ - creates GitHub release,
42
+ - publishes package to npm.
43
+ 4. Validate via:
44
+ - GitHub release/tag exists (`vX.Y.Z`),
45
+ - npm package version appears in registry,
46
+ - `vpd --version` from fresh global install matches.
47
+
48
+ ## Local dry run
49
+
50
+ Use this before rollout changes to release config:
51
+
52
+ ```bash
53
+ npx -y \
54
+ -p semantic-release \
55
+ -p @semantic-release/changelog \
56
+ -p @semantic-release/commit-analyzer \
57
+ -p conventional-changelog-conventionalcommits \
58
+ -p @semantic-release/git \
59
+ -p @semantic-release/github \
60
+ -p @semantic-release/npm \
61
+ -p @semantic-release/release-notes-generator \
62
+ semantic-release --dry-run
63
+ ```
64
+
65
+ This does not publish; it only reports what version would be released.
@@ -0,0 +1,48 @@
1
+ # Viewport Daemon Security Profiles
2
+
3
+ ## Profiles
4
+
5
+ - `local`
6
+ - Host must be loopback.
7
+ - Auth optional.
8
+ - Intended for single-machine use.
9
+ - `lan`
10
+ - Requires explicit host allowlist (`--allowed-hosts` or config/env equivalent).
11
+ - Auth required.
12
+ - `relay`
13
+ - Requires explicit host allowlist.
14
+ - Auth required.
15
+ - Relay transport and key exchange are next-phase work.
16
+
17
+ ## Current controls
18
+
19
+ - Host header allowlist enforcement.
20
+ - Origin allowlist enforcement.
21
+ - Token auth (`~/.viewport/auth-token`) for protected API/WS.
22
+ - WS auth supports `?token=` query fallback for browser compatibility.
23
+ - Tradeoff: query tokens can leak via logs/history.
24
+ - Preferred path is `Authorization: Bearer ...`.
25
+ - WebSocket payload limits, backpressure handling, and rate limiting.
26
+ - Path traversal protection for file APIs.
27
+
28
+ ## Pairing foundations (current phase)
29
+
30
+ - `vpd pair` creates short-lived offers (default 10 minutes, max 60 minutes).
31
+ - Offer URL contains `offerId`, one-time proof, trust-anchor fingerprint, and connection metadata, not the auth token.
32
+ - Offers are persisted and can be listed/revoked:
33
+ - `vpd pair list`
34
+ - `vpd pair revoke <offer-id>`
35
+ - Daemon trust anchor can be inspected:
36
+ - `vpd pair anchor`
37
+ - Offer redemption is one-time:
38
+ - `POST /api/pair/redeem` with `offerId` + `proof` + `trustAnchor`
39
+ - Local loopback profile can bypass bearer auth for redeem; LAN/relay profiles cannot.
40
+ - Pairing events are written to `~/.viewport/pairing-audit.jsonl`.
41
+
42
+ ## Relay-phase extensions
43
+
44
+ The next phase should add:
45
+
46
+ - Explicit device identity binding.
47
+ - Revocation propagation across relay sessions.
48
+ - Short-lived capability tokens scoped by command/permission class.
@@ -0,0 +1,112 @@
1
+ # Daemon Testing Guide
2
+
3
+ ## Layers
4
+
5
+ 1. Unit tests: fast behavior checks for isolated modules.
6
+ 2. Integration tests: daemon + HTTP/WS route behavior in-process.
7
+ 3. Protocol e2e tests: WS command/event lifecycle with harness.
8
+ 4. Fullstack net e2e: real CLI -> real daemon HTTP/WS over localhost.
9
+
10
+ ## Commands
11
+
12
+ Fast confidence:
13
+
14
+ ```bash
15
+ npm run check:protocol-matrix
16
+ npm run typecheck
17
+ npm run test -- tests/cli tests/server
18
+ ```
19
+
20
+ Single-entry test command with modes:
21
+
22
+ ```bash
23
+ npm run test
24
+ npm run test --verify
25
+ npm run test --e2e
26
+ npm run test --fullstack
27
+ npm run test --env
28
+ npm run test --service
29
+ ```
30
+
31
+ Protocol e2e:
32
+
33
+ ```bash
34
+ npm run test:e2e
35
+ ```
36
+
37
+ Fullstack CLI proof (network bind required):
38
+
39
+ ```bash
40
+ npm run test:e2e:fullstack
41
+ ```
42
+
43
+ Full gate:
44
+
45
+ ```bash
46
+ npm run check
47
+ ```
48
+
49
+ Local environment verification:
50
+
51
+ ```bash
52
+ # isolated daemon lifecycle verification (temp VIEWPORT_HOME + dedicated listen target)
53
+ npm run verify:env
54
+
55
+ # includes launchd/systemd install + active status checks
56
+ npm run verify:env:service
57
+
58
+ # validates local tarball install + binary lifecycle in isolated npm prefix
59
+ npm run verify:install
60
+ ```
61
+
62
+ `verify:install` requires network access to resolve package runtime dependencies.
63
+
64
+ One-command local checker:
65
+
66
+ ```bash
67
+ # repo gates only
68
+ npm run verify:repo
69
+
70
+ # repo gates + env verification + service checks
71
+ bash ./scripts/verify.sh --env --service
72
+
73
+ # repo gates + fullstack net e2e + env verification + service checks
74
+ bash ./scripts/verify.sh --fullstack --env --service
75
+ ```
76
+
77
+ ## CI Linux verification
78
+
79
+ GitHub Actions now runs a dedicated Linux runtime verification path:
80
+
81
+ ```bash
82
+ npm run verify:linux:ci
83
+ ```
84
+
85
+ This validates:
86
+ 1. Tarball install verification (`verify:install`)
87
+ 2. Dev install + isolated daemon lifecycle verification (`verify:env`)
88
+ 3. systemd user-service verification when available on runner (`verify:env:service`)
89
+
90
+ ## What fullstack e2e proves
91
+
92
+ `tests/e2e/cli-fullstack-workflow.test.ts` verifies in one workflow:
93
+
94
+ 1. `vpd run` launches over real WS.
95
+ 2. `vpd ls` and `vpd agent mode` hit real HTTP routes.
96
+ 3. `vpd worktree diffs/summary/retry/squash` use live daemon state.
97
+ 4. Pairing trust-anchor flow: offer + redeem success and mismatch rejection.
98
+ 5. `vpd session stop` terminates the live session.
99
+
100
+ The test is opt-in via `VIEWPORT_RUN_NET_E2E=1` because it requires binding a localhost port.
101
+
102
+ ## Dev install flows
103
+
104
+ Use local source without publishing to npm:
105
+
106
+ ```bash
107
+ # tarball install flow (recommended)
108
+ ./scripts/install-dev.sh --yes --no-service --no-prereqs --no-hooks
109
+
110
+ # npm link flow
111
+ ./scripts/install-dev.sh --link --yes --no-service --no-prereqs --no-hooks
112
+ ```
package/package.json ADDED
@@ -0,0 +1,84 @@
1
+ {
2
+ "name": "@viewportai/daemon",
3
+ "version": "0.1.0",
4
+ "description": "Viewport daemon — supervision and orchestration layer for AI coding agents",
5
+ "license": "Apache-2.0",
6
+ "type": "module",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/viewportai/daemon"
10
+ },
11
+ "bugs": {
12
+ "url": "https://github.com/viewportai/daemon/issues"
13
+ },
14
+ "homepage": "https://github.com/viewportai/daemon#readme",
15
+ "bin": {
16
+ "vpd": "bin/vpd.js"
17
+ },
18
+ "files": [
19
+ "bin",
20
+ "dist",
21
+ "README.md",
22
+ "docs"
23
+ ],
24
+ "publishConfig": {
25
+ "access": "public"
26
+ },
27
+ "engines": {
28
+ "node": ">=20.0.0"
29
+ },
30
+ "scripts": {
31
+ "dev": "tsx watch src/index.ts",
32
+ "build": "tsc",
33
+ "prepack": "npm run build",
34
+ "typecheck": "tsc --noEmit",
35
+ "test": "bash ./scripts/test.sh",
36
+ "test:unit": "vitest run",
37
+ "test:verify": "npm run test -- --verify",
38
+ "test:setup": "vitest run tests/cli/setup-command.test.ts tests/cli/service-commands.test.ts tests/startup-prereqs.test.ts tests/core/built-in-agents.test.ts",
39
+ "test:e2e": "vitest run tests/e2e",
40
+ "test:e2e:fullstack": "VIEWPORT_RUN_NET_E2E=1 vitest run tests/e2e/cli-fullstack-workflow.test.ts",
41
+ "test:watch": "vitest",
42
+ "test:coverage": "vitest run --coverage",
43
+ "check:file-size": "node ./scripts/check-file-sizes.mjs",
44
+ "check:protocol-matrix": "node ./scripts/check-protocol-matrix.mjs",
45
+ "lint": "eslint src/ tests/ --no-error-on-unmatched-pattern",
46
+ "format": "prettier --write \"{src,tests}/**/*.ts\"",
47
+ "format:check": "prettier --check \"{src,tests}/**/*.ts\"",
48
+ "check": "npm run check:file-size && npm run check:protocol-matrix && npm run typecheck && npm run lint && npm run format:check && npm run test",
49
+ "dev:install": "bash ./scripts/install-dev.sh --yes --no-service --no-prereqs --no-hooks",
50
+ "dev:link": "bash ./scripts/install-dev.sh --link --yes --no-service --no-prereqs --no-hooks",
51
+ "dev:uninstall": "bash ./scripts/uninstall.sh --service",
52
+ "dev:uninstall:all": "bash ./scripts/uninstall.sh --service --purge-home",
53
+ "dev:reinstall": "npm run dev:uninstall && npm run dev:install",
54
+ "verify:repo": "bash ./scripts/verify.sh",
55
+ "verify:linux:ci": "bash ./scripts/verify-linux-ci.sh",
56
+ "verify:env": "bash ./scripts/test-env.sh",
57
+ "verify:env:service": "bash ./scripts/test-env.sh --service",
58
+ "verify:install": "bash ./scripts/install-verify.sh"
59
+ },
60
+ "dependencies": {
61
+ "@anthropic-ai/claude-agent-sdk": "^0.2.63",
62
+ "@fastify/cors": "^10.0.1",
63
+ "@fastify/websocket": "^11.0.1",
64
+ "@openai/codex-sdk": "^0.107.0",
65
+ "fastify": "^5.2.1",
66
+ "pino": "^9.6.0",
67
+ "pino-pretty": "^13.1.3",
68
+ "zod": "^4.0.0"
69
+ },
70
+ "devDependencies": {
71
+ "@types/node": "^22.13.4",
72
+ "@types/ws": "^8.18.1",
73
+ "@vitest/coverage-v8": "^3.0.5",
74
+ "conventional-changelog-conventionalcommits": "^9.2.0",
75
+ "eslint": "^9.20.0",
76
+ "eslint-config-prettier": "^10.0.1",
77
+ "eslint-plugin-prettier": "^5.2.3",
78
+ "prettier": "^3.5.2",
79
+ "tsx": "^4.19.3",
80
+ "typescript": "^5.7.3",
81
+ "typescript-eslint": "^8.24.1",
82
+ "vitest": "^3.0.5"
83
+ }
84
+ }