@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,148 @@
1
+ /**
2
+ * Hook system types — adapter-agnostic event definitions for agent lifecycle hooks.
3
+ *
4
+ * The hook system allows the daemon to receive events from any agent (Claude Code,
5
+ * Gemini, Cursor, etc.) via lightweight CLI commands that POST to the daemon.
6
+ * Each hook event has a typed input schema and metadata about how it should be handled.
7
+ *
8
+ * Design:
9
+ * - HookEventKind: all supported event names (extensible enum-like union)
10
+ * - HookInput<K>: typed input for each event kind
11
+ * - HookEventDefinition: registry entry with schema, blocking flag, handler
12
+ * - HookResponse: what the daemon returns to the hook command
13
+ */
14
+ import { z } from 'zod';
15
+ // ---------------------------------------------------------------------------
16
+ // Hook event kinds — add new events here
17
+ // ---------------------------------------------------------------------------
18
+ export const HOOK_EVENT_KINDS = [
19
+ 'SessionStart',
20
+ 'SessionEnd',
21
+ 'PermissionRequest',
22
+ 'Notification',
23
+ 'Stop',
24
+ 'PreToolUse',
25
+ 'PostToolUse',
26
+ 'PostToolUseFailure',
27
+ 'SubagentStart',
28
+ 'SubagentStop',
29
+ 'UserPromptSubmit',
30
+ 'TaskCompleted',
31
+ ];
32
+ // ---------------------------------------------------------------------------
33
+ // Base input — all hook events include these fields
34
+ // ---------------------------------------------------------------------------
35
+ export const HookBaseInputSchema = z.object({
36
+ hook_event_name: z.string(),
37
+ session_id: z.string(),
38
+ transcript_path: z.string().optional(),
39
+ cwd: z.string().optional(),
40
+ permission_mode: z.string().optional(),
41
+ });
42
+ // ---------------------------------------------------------------------------
43
+ // Per-event input schemas
44
+ // ---------------------------------------------------------------------------
45
+ export const SessionStartInputSchema = HookBaseInputSchema.extend({
46
+ hook_event_name: z.literal('SessionStart'),
47
+ source: z.enum(['startup', 'resume', 'clear', 'compact']).optional(),
48
+ agent_type: z.string().optional(),
49
+ model: z.string().optional(),
50
+ });
51
+ export const SessionEndInputSchema = HookBaseInputSchema.extend({
52
+ hook_event_name: z.literal('SessionEnd'),
53
+ reason: z.string().optional(),
54
+ });
55
+ export const PermissionRequestInputSchema = HookBaseInputSchema.extend({
56
+ hook_event_name: z.literal('PermissionRequest'),
57
+ tool_name: z.string(),
58
+ tool_input: z.unknown().optional(),
59
+ });
60
+ export const NotificationInputSchema = HookBaseInputSchema.extend({
61
+ hook_event_name: z.literal('Notification'),
62
+ message: z.string(),
63
+ title: z.string().optional(),
64
+ notification_type: z.string().optional(),
65
+ });
66
+ export const StopInputSchema = HookBaseInputSchema.extend({
67
+ hook_event_name: z.literal('Stop'),
68
+ stop_hook_active: z.boolean().optional(),
69
+ last_assistant_message: z.string().optional(),
70
+ });
71
+ export const PreToolUseInputSchema = HookBaseInputSchema.extend({
72
+ hook_event_name: z.literal('PreToolUse'),
73
+ tool_name: z.string(),
74
+ tool_input: z.unknown().optional(),
75
+ tool_use_id: z.string().optional(),
76
+ });
77
+ export const PostToolUseInputSchema = HookBaseInputSchema.extend({
78
+ hook_event_name: z.literal('PostToolUse'),
79
+ tool_name: z.string(),
80
+ tool_input: z.unknown().optional(),
81
+ tool_response: z.unknown().optional(),
82
+ tool_use_id: z.string().optional(),
83
+ });
84
+ export const PostToolUseFailureInputSchema = HookBaseInputSchema.extend({
85
+ hook_event_name: z.literal('PostToolUseFailure'),
86
+ tool_name: z.string(),
87
+ tool_input: z.unknown().optional(),
88
+ tool_use_id: z.string().optional(),
89
+ error: z.string().optional(),
90
+ is_interrupt: z.boolean().optional(),
91
+ });
92
+ export const SubagentStartInputSchema = HookBaseInputSchema.extend({
93
+ hook_event_name: z.literal('SubagentStart'),
94
+ agent_id: z.string().optional(),
95
+ agent_type: z.string().optional(),
96
+ });
97
+ export const SubagentStopInputSchema = HookBaseInputSchema.extend({
98
+ hook_event_name: z.literal('SubagentStop'),
99
+ agent_id: z.string().optional(),
100
+ agent_type: z.string().optional(),
101
+ agent_transcript_path: z.string().optional(),
102
+ last_assistant_message: z.string().optional(),
103
+ });
104
+ export const UserPromptSubmitInputSchema = HookBaseInputSchema.extend({
105
+ hook_event_name: z.literal('UserPromptSubmit'),
106
+ prompt: z.string().optional(),
107
+ });
108
+ export const TaskCompletedInputSchema = HookBaseInputSchema.extend({
109
+ hook_event_name: z.literal('TaskCompleted'),
110
+ task_id: z.string().optional(),
111
+ task_subject: z.string().optional(),
112
+ task_description: z.string().optional(),
113
+ });
114
+ // ---------------------------------------------------------------------------
115
+ // Schema registry — maps event kind to its Zod schema
116
+ // ---------------------------------------------------------------------------
117
+ export const HOOK_INPUT_SCHEMAS = {
118
+ SessionStart: SessionStartInputSchema,
119
+ SessionEnd: SessionEndInputSchema,
120
+ PermissionRequest: PermissionRequestInputSchema,
121
+ Notification: NotificationInputSchema,
122
+ Stop: StopInputSchema,
123
+ PreToolUse: PreToolUseInputSchema,
124
+ PostToolUse: PostToolUseInputSchema,
125
+ PostToolUseFailure: PostToolUseFailureInputSchema,
126
+ SubagentStart: SubagentStartInputSchema,
127
+ SubagentStop: SubagentStopInputSchema,
128
+ UserPromptSubmit: UserPromptSubmitInputSchema,
129
+ TaskCompleted: TaskCompletedInputSchema,
130
+ };
131
+ // ---------------------------------------------------------------------------
132
+ // Default event definitions — blocking vs fire-and-forget
133
+ // ---------------------------------------------------------------------------
134
+ export const DEFAULT_EVENT_DEFINITIONS = [
135
+ { kind: 'SessionStart', blocking: false, defaultTimeoutMs: 5_000 },
136
+ { kind: 'SessionEnd', blocking: false, defaultTimeoutMs: 5_000 },
137
+ { kind: 'PermissionRequest', blocking: true, defaultTimeoutMs: 120_000 },
138
+ { kind: 'Notification', blocking: false, defaultTimeoutMs: 5_000 },
139
+ { kind: 'Stop', blocking: false, defaultTimeoutMs: 5_000 },
140
+ { kind: 'PreToolUse', blocking: false, defaultTimeoutMs: 5_000 },
141
+ { kind: 'PostToolUse', blocking: false, defaultTimeoutMs: 5_000 },
142
+ { kind: 'PostToolUseFailure', blocking: false, defaultTimeoutMs: 5_000 },
143
+ { kind: 'SubagentStart', blocking: false, defaultTimeoutMs: 5_000 },
144
+ { kind: 'SubagentStop', blocking: false, defaultTimeoutMs: 5_000 },
145
+ { kind: 'UserPromptSubmit', blocking: false, defaultTimeoutMs: 5_000 },
146
+ { kind: 'TaskCompleted', blocking: false, defaultTimeoutMs: 5_000 },
147
+ ];
148
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/hooks/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Viewport Daemon — CLI entry point.
4
+ *
5
+ * Commands:
6
+ * vpd start [--port 7070] Start the daemon
7
+ * vpd install Detect available agents
8
+ * vpd add <path> Register a directory
9
+ * vpd remove <path> Unregister a directory
10
+ * vpd list List directories + active sessions
11
+ * vpd status Daemon health check
12
+ * vpd stop Stop the daemon
13
+ * vpd restart Restart the daemon
14
+ * vpd worktree ... Worktree operator commands
15
+ */
16
+ export {};
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;GAaG"}
package/dist/index.js ADDED
@@ -0,0 +1,117 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Viewport Daemon — CLI entry point.
4
+ *
5
+ * Commands:
6
+ * vpd start [--port 7070] Start the daemon
7
+ * vpd install Detect available agents
8
+ * vpd add <path> Register a directory
9
+ * vpd remove <path> Unregister a directory
10
+ * vpd list List directories + active sessions
11
+ * vpd status Daemon health check
12
+ * vpd stop Stop the daemon
13
+ * vpd restart Restart the daemon
14
+ * vpd worktree ... Worktree operator commands
15
+ */
16
+ import { getCommand, getArgs } from './cli/args.js';
17
+ import { install, addDirectory, removeDirectory, list, status, stop, restart, run, send, logs, wait, attach, pair, update, showHelp, ls, stopSession, permit, agent, worktree, service, setup, } from './cli/commands.js';
18
+ import { hookNotify } from './cli/hook-command.js';
19
+ import { start, runSupervisorCommand, runWorkerCommand } from './startup.js';
20
+ const commands = {
21
+ start,
22
+ install,
23
+ add: addDirectory,
24
+ remove: removeDirectory,
25
+ list,
26
+ status,
27
+ stop,
28
+ restart,
29
+ run,
30
+ send,
31
+ logs,
32
+ wait,
33
+ attach,
34
+ pair,
35
+ update,
36
+ ls,
37
+ permit,
38
+ agent,
39
+ worktree,
40
+ service,
41
+ setup,
42
+ };
43
+ const command = getCommand();
44
+ // Sub-command: vpd hook notify --event <EventName>
45
+ if (command === 'hook') {
46
+ const subcommand = getArgs()[1];
47
+ if (subcommand === 'notify') {
48
+ hookNotify().catch(() => process.exit(1));
49
+ }
50
+ else {
51
+ console.error(`Unknown hook subcommand: ${subcommand}`);
52
+ console.error('Usage: vpd hook notify --event <EventName>');
53
+ process.exit(1);
54
+ }
55
+ }
56
+ else {
57
+ if (command === '__supervisor') {
58
+ runSupervisorCommand().catch((err) => {
59
+ console.error(`Supervisor error: ${err.message}`);
60
+ process.exit(1);
61
+ });
62
+ }
63
+ else if (command === '__worker') {
64
+ runWorkerCommand().catch((err) => {
65
+ console.error(`Worker error: ${err.message}`);
66
+ process.exit(1);
67
+ });
68
+ }
69
+ else {
70
+ let handler = commands[command];
71
+ if (command === 'daemon') {
72
+ const subcommand = getArgs()[1] ?? 'status';
73
+ if (subcommand === 'start')
74
+ handler = start;
75
+ if (subcommand === 'status')
76
+ handler = status;
77
+ if (subcommand === 'stop')
78
+ handler = stop;
79
+ if (subcommand === 'restart')
80
+ handler = restart;
81
+ if (subcommand === 'pair')
82
+ handler = pair;
83
+ if (subcommand === 'update')
84
+ handler = update;
85
+ if (subcommand === 'service')
86
+ handler = service;
87
+ if (subcommand === 'setup')
88
+ handler = setup;
89
+ }
90
+ else if (command === 'session') {
91
+ const subcommand = getArgs()[1];
92
+ if (subcommand === 'stop')
93
+ handler = stopSession;
94
+ }
95
+ else if (command === 'permit') {
96
+ handler = permit;
97
+ }
98
+ else if (command === 'agent') {
99
+ handler = agent;
100
+ }
101
+ else if (command === 'worktree') {
102
+ handler = worktree;
103
+ }
104
+ if (!handler) {
105
+ if (command !== 'help') {
106
+ console.error(`Unknown command: ${command}\n`);
107
+ }
108
+ showHelp();
109
+ process.exit(command === 'help' ? 0 : 1);
110
+ }
111
+ handler().catch((err) => {
112
+ console.error(`Error: ${err.message}`);
113
+ process.exit(1);
114
+ });
115
+ }
116
+ }
117
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Permission resolution engine.
3
+ *
4
+ * Resolves whether a tool call should be auto-approved, require user approval,
5
+ * or be denied — based on the layered PermissionsConfig.
6
+ *
7
+ * For v0.1: tool name matching only. Future: semantic Bash command matching,
8
+ * path-based rules, etc.
9
+ */
10
+ import type { PermissionsConfig } from '../core/types.js';
11
+ export type PermissionResolution = 'auto-approve' | 'require-approval' | 'deny';
12
+ /**
13
+ * Resolve the permission for a tool call.
14
+ *
15
+ * Priority: deny > autoApprove > requireApproval > default (require-approval)
16
+ */
17
+ export declare function resolvePermission(toolName: string, _toolInput: Record<string, unknown> | undefined, config: PermissionsConfig): PermissionResolution;
18
+ /**
19
+ * Check if a tool name matches any pattern in a list.
20
+ * For v0.1: exact match only. Future: glob/regex patterns.
21
+ */
22
+ export declare function matchesTool(toolName: string, patterns: string[]): boolean;
23
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/permissions/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAG1D,MAAM,MAAM,oBAAoB,GAAG,cAAc,GAAG,kBAAkB,GAAG,MAAM,CAAC;AAEhF;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC/C,MAAM,EAAE,iBAAiB,GACxB,oBAAoB,CAsBtB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAEzE"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Permission resolution engine.
3
+ *
4
+ * Resolves whether a tool call should be auto-approved, require user approval,
5
+ * or be denied — based on the layered PermissionsConfig.
6
+ *
7
+ * For v0.1: tool name matching only. Future: semantic Bash command matching,
8
+ * path-based rules, etc.
9
+ */
10
+ import { metrics } from '../core/metrics.js';
11
+ /**
12
+ * Resolve the permission for a tool call.
13
+ *
14
+ * Priority: deny > autoApprove > requireApproval > default (require-approval)
15
+ */
16
+ export function resolvePermission(toolName, _toolInput, config) {
17
+ // Deny takes highest priority
18
+ if (config.deny.includes(toolName)) {
19
+ metrics.increment('permissions.denied');
20
+ return 'deny';
21
+ }
22
+ // Auto-approve if listed
23
+ if (config.autoApprove.includes(toolName)) {
24
+ metrics.increment('permissions.auto_approved');
25
+ return 'auto-approve';
26
+ }
27
+ // Explicitly require approval if listed
28
+ if (config.requireApproval.includes(toolName)) {
29
+ metrics.increment('permissions.require_approval');
30
+ return 'require-approval';
31
+ }
32
+ // Default: require approval for unknown tools
33
+ metrics.increment('permissions.require_approval');
34
+ return 'require-approval';
35
+ }
36
+ /**
37
+ * Check if a tool name matches any pattern in a list.
38
+ * For v0.1: exact match only. Future: glob/regex patterns.
39
+ */
40
+ export function matchesTool(toolName, patterns) {
41
+ return patterns.includes(toolName);
42
+ }
43
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/permissions/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAI7C;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAC/B,QAAgB,EAChB,UAA+C,EAC/C,MAAyB;IAEzB,8BAA8B;IAC9B,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,OAAO,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QACxC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,yBAAyB;IACzB,IAAI,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1C,OAAO,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC;QAC/C,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,wCAAwC;IACxC,IAAI,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9C,OAAO,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAC;QAClD,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IAED,8CAA8C;IAC9C,OAAO,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAC;IAClD,OAAO,kBAAkB,CAAC;AAC5B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,QAAgB,EAAE,QAAkB;IAC9D,OAAO,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACrC,CAAC"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Plugin loader — discovers and loads agent plugins from:
3
+ * 1. ~/.viewport/plugins/ (user-installed plugins)
4
+ * 2. node_modules/ (project-local plugins)
5
+ *
6
+ * Plugins are npm packages that export an AgentDefinition.
7
+ * Convention: @viewport/agent-* or viewport-agent-*
8
+ *
9
+ * Each plugin's package.json must have a "viewport" field:
10
+ * { "viewport": { "type": "agent", "agentId": "my-agent" } }
11
+ */
12
+ import type { AgentDefinition } from '../core/agent-registry.js';
13
+ export interface PluginManifest {
14
+ /** Package name. */
15
+ name: string;
16
+ /** Package version. */
17
+ version: string;
18
+ /** Viewport plugin metadata. */
19
+ viewport: {
20
+ type: 'agent';
21
+ agentId: string;
22
+ };
23
+ }
24
+ export interface LoadedPlugin {
25
+ manifest: PluginManifest;
26
+ definition: AgentDefinition;
27
+ path: string;
28
+ }
29
+ /** Get the global plugins directory. */
30
+ export declare function pluginsDir(): string;
31
+ /**
32
+ * Discover and load all agent plugins.
33
+ * Scans:
34
+ * 1. ~/.viewport/plugins/
35
+ * 2. Current project's node_modules/ (optional)
36
+ */
37
+ export declare function loadPluginAgents(options?: {
38
+ projectDir?: string;
39
+ }): Promise<LoadedPlugin[]>;
40
+ /**
41
+ * List installed plugins (without loading them).
42
+ */
43
+ export declare function listPlugins(): Promise<PluginManifest[]>;
44
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/plugins/loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAMjE,MAAM,WAAW,cAAc;IAC7B,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,uBAAuB;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,gCAAgC;IAChC,QAAQ,EAAE;QACR,IAAI,EAAE,OAAO,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,cAAc,CAAC;IACzB,UAAU,EAAE,eAAe,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;CACd;AAMD,wCAAwC;AACxC,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AA6HD;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAiCjG;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAU7D"}
@@ -0,0 +1,177 @@
1
+ /**
2
+ * Plugin loader — discovers and loads agent plugins from:
3
+ * 1. ~/.viewport/plugins/ (user-installed plugins)
4
+ * 2. node_modules/ (project-local plugins)
5
+ *
6
+ * Plugins are npm packages that export an AgentDefinition.
7
+ * Convention: @viewport/agent-* or viewport-agent-*
8
+ *
9
+ * Each plugin's package.json must have a "viewport" field:
10
+ * { "viewport": { "type": "agent", "agentId": "my-agent" } }
11
+ */
12
+ import fs from 'node:fs/promises';
13
+ import path from 'node:path';
14
+ import { configDir } from '../core/config.js';
15
+ import { logger } from '../core/output.js';
16
+ // ---------------------------------------------------------------------------
17
+ // Plugin directories
18
+ // ---------------------------------------------------------------------------
19
+ /** Get the global plugins directory. */
20
+ export function pluginsDir() {
21
+ return path.join(configDir(), 'plugins');
22
+ }
23
+ // ---------------------------------------------------------------------------
24
+ // Plugin discovery
25
+ // ---------------------------------------------------------------------------
26
+ /**
27
+ * Scan a directory for Viewport plugin packages.
28
+ * Returns plugin manifests found in package.json files.
29
+ */
30
+ async function scanForPlugins(dir) {
31
+ const found = [];
32
+ try {
33
+ const entries = await fs.readdir(dir);
34
+ for (const entry of entries) {
35
+ const entryPath = path.join(dir, entry);
36
+ // Handle scoped packages (@viewport/agent-*)
37
+ if (entry.startsWith('@')) {
38
+ try {
39
+ const scopedEntries = await fs.readdir(entryPath);
40
+ for (const scopedEntry of scopedEntries) {
41
+ const scopedPath = path.join(entryPath, scopedEntry);
42
+ const manifest = await readPluginManifest(scopedPath);
43
+ if (manifest) {
44
+ found.push({ manifest, dir: scopedPath });
45
+ }
46
+ }
47
+ }
48
+ catch {
49
+ // Not a directory or unreadable
50
+ }
51
+ continue;
52
+ }
53
+ // Handle unscoped packages (viewport-agent-*)
54
+ if (entry.startsWith('viewport-agent-') || entry.startsWith('@viewport')) {
55
+ const manifest = await readPluginManifest(entryPath);
56
+ if (manifest) {
57
+ found.push({ manifest, dir: entryPath });
58
+ }
59
+ }
60
+ }
61
+ }
62
+ catch {
63
+ // Directory doesn't exist — not an error
64
+ }
65
+ return found;
66
+ }
67
+ /**
68
+ * Read and validate a plugin's package.json.
69
+ */
70
+ async function readPluginManifest(pkgDir) {
71
+ try {
72
+ const pkgPath = path.join(pkgDir, 'package.json');
73
+ const raw = await fs.readFile(pkgPath, 'utf-8');
74
+ const pkg = JSON.parse(raw);
75
+ // Must have viewport metadata
76
+ const viewport = pkg['viewport'];
77
+ if (!viewport || viewport['type'] !== 'agent' || typeof viewport['agentId'] !== 'string') {
78
+ return null;
79
+ }
80
+ return {
81
+ name: typeof pkg['name'] === 'string' ? pkg['name'] : 'unknown',
82
+ version: typeof pkg['version'] === 'string' ? pkg['version'] : '0.0.0',
83
+ viewport: {
84
+ type: 'agent',
85
+ agentId: viewport['agentId'],
86
+ },
87
+ };
88
+ }
89
+ catch {
90
+ return null;
91
+ }
92
+ }
93
+ // ---------------------------------------------------------------------------
94
+ // Plugin loading
95
+ // ---------------------------------------------------------------------------
96
+ /**
97
+ * Load a single plugin from its directory.
98
+ * The plugin must export an AgentDefinition as default or named 'definition'.
99
+ */
100
+ async function loadPlugin(manifest, pkgDir) {
101
+ try {
102
+ // Resolve the main entry point
103
+ const pkgPath = path.join(pkgDir, 'package.json');
104
+ const raw = await fs.readFile(pkgPath, 'utf-8');
105
+ const pkg = JSON.parse(raw);
106
+ const main = pkg['main'] ?? 'index.js';
107
+ const entryPath = path.resolve(pkgDir, main);
108
+ // Dynamic import
109
+ const mod = await import(entryPath);
110
+ const definition = mod.definition ?? mod.default?.definition ?? mod.default;
111
+ if (!definition || typeof definition.id !== 'string') {
112
+ logger.warn(`Plugin ${manifest.name}: no valid AgentDefinition exported`);
113
+ return null;
114
+ }
115
+ // Validate the definition has required fields
116
+ if (!definition.displayName || !definition.tier || !definition.createAdapter) {
117
+ logger.warn(`Plugin ${manifest.name}: incomplete AgentDefinition`);
118
+ return null;
119
+ }
120
+ return { manifest, definition, path: pkgDir };
121
+ }
122
+ catch (err) {
123
+ logger.warn(`Plugin ${manifest.name}: failed to load — ${err}`);
124
+ return null;
125
+ }
126
+ }
127
+ // ---------------------------------------------------------------------------
128
+ // Public API
129
+ // ---------------------------------------------------------------------------
130
+ /**
131
+ * Discover and load all agent plugins.
132
+ * Scans:
133
+ * 1. ~/.viewport/plugins/
134
+ * 2. Current project's node_modules/ (optional)
135
+ */
136
+ export async function loadPluginAgents(options) {
137
+ const scanDirs = [pluginsDir(), path.join(pluginsDir(), 'node_modules')];
138
+ // Optionally scan project-local node_modules
139
+ if (options?.projectDir) {
140
+ scanDirs.push(path.join(options.projectDir, 'node_modules'));
141
+ }
142
+ const allFound = [];
143
+ for (const dir of scanDirs) {
144
+ const found = await scanForPlugins(dir);
145
+ allFound.push(...found);
146
+ }
147
+ // Deduplicate by agentId (first one wins)
148
+ const seen = new Set();
149
+ const unique = allFound.filter((f) => {
150
+ if (seen.has(f.manifest.viewport.agentId))
151
+ return false;
152
+ seen.add(f.manifest.viewport.agentId);
153
+ return true;
154
+ });
155
+ // Load each plugin
156
+ const loaded = [];
157
+ for (const { manifest, dir } of unique) {
158
+ const plugin = await loadPlugin(manifest, dir);
159
+ if (plugin) {
160
+ loaded.push(plugin);
161
+ }
162
+ }
163
+ return loaded;
164
+ }
165
+ /**
166
+ * List installed plugins (without loading them).
167
+ */
168
+ export async function listPlugins() {
169
+ const scanDirs = [pluginsDir(), path.join(pluginsDir(), 'node_modules')];
170
+ const manifests = [];
171
+ for (const dir of scanDirs) {
172
+ const found = await scanForPlugins(dir);
173
+ manifests.push(...found.map((f) => f.manifest));
174
+ }
175
+ return manifests;
176
+ }
177
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/plugins/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Authentication module for the Viewport daemon.
3
+ *
4
+ * Local mode: random token saved to ~/.viewport/auth-token
5
+ * Relay mode (future): API key validated against relay server
6
+ */
7
+ export interface AuthProvider {
8
+ /** Validate a token/key. Returns true if valid. */
9
+ validate(token: string): Promise<boolean>;
10
+ /** Get the current token (for display in terminal). Null if N/A. */
11
+ getDisplayToken(): string | null;
12
+ }
13
+ /** Local file-based auth. Token saved to ~/.viewport/auth-token */
14
+ export declare class LocalAuthProvider implements AuthProvider {
15
+ private token;
16
+ initialize(): Promise<void>;
17
+ validate(token: string): Promise<boolean>;
18
+ getDisplayToken(): string | null;
19
+ }
20
+ /** No-op auth that allows everything. Used with --no-auth flag. */
21
+ export declare class NoopAuthProvider implements AuthProvider {
22
+ validate(): Promise<boolean>;
23
+ getDisplayToken(): string | null;
24
+ }
25
+ /** Extract Bearer token from Authorization header. */
26
+ export declare function extractBearerToken(authHeader: string | undefined): string | null;
27
+ export declare function extractTokenFromRequest(input: {
28
+ authorization?: string;
29
+ url?: string;
30
+ allowQueryToken?: boolean;
31
+ }): string | null;
32
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/server/auth.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,MAAM,WAAW,YAAY;IAC3B,mDAAmD;IACnD,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1C,oEAAoE;IACpE,eAAe,IAAI,MAAM,GAAG,IAAI,CAAC;CAClC;AAED,mEAAmE;AACnE,qBAAa,iBAAkB,YAAW,YAAY;IACpD,OAAO,CAAC,KAAK,CAAuB;IAE9B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAY3B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAW/C,eAAe,IAAI,MAAM,GAAG,IAAI;CAGjC;AAED,mEAAmE;AACnE,qBAAa,gBAAiB,YAAW,YAAY;IAC7C,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC;IAGlC,eAAe,IAAI,MAAM,GAAG,IAAI;CAGjC;AAED,sDAAsD;AACtD,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAIhF;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE;IAC7C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,GAAG,MAAM,GAAG,IAAI,CAgBhB"}