@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,128 @@
1
+ /**
2
+ * Agent Registry — the extensibility backbone of Viewport.
3
+ *
4
+ * Agent definitions describe how to detect, configure, and instantiate
5
+ * each supported agent. The daemon core never imports agent-specific code
6
+ * directly — it loads agents from the registry.
7
+ *
8
+ * Two tiers:
9
+ * - SDK adapters: deep integration (structured tool calls, permissions, tokens)
10
+ * - PTY adapters: broad compatibility (terminal I/O, spawn any CLI)
11
+ */
12
+ import type { AgentAdapter, SessionDiscovery } from './interfaces.js';
13
+ import type { PermissionsConfig, GitTrackerConfig } from './types.js';
14
+ export type AgentTier = 'sdk' | 'pty';
15
+ export interface AgentDefaults {
16
+ /** Tool names that trigger git commits. */
17
+ commitOn: string[];
18
+ /** Tools that are safe to auto-approve. */
19
+ autoApprove: string[];
20
+ /** Tools that require user approval. */
21
+ requireApproval: string[];
22
+ /** Tools to always deny. */
23
+ deny: string[];
24
+ }
25
+ export interface AgentCapabilities {
26
+ /** Agent emits structured tool call events. */
27
+ structuredToolCalls: boolean;
28
+ /** Agent supports interactive permission callbacks. */
29
+ permissionCallbacks: boolean;
30
+ /** Agent reports token usage. */
31
+ tokenUsage: boolean;
32
+ /** Sessions can be resumed. */
33
+ resume: boolean;
34
+ /** Agent supports extended thinking / chain-of-thought streaming. */
35
+ extendedThinking: boolean;
36
+ }
37
+ export interface AgentDetection {
38
+ /** Check if the agent is installed / available on this machine. */
39
+ check: () => Promise<boolean>;
40
+ /** Human-readable description (shown in `vpd install`). */
41
+ description: string;
42
+ }
43
+ /** Model info from agent SDKs (e.g. Claude's supportedModels()). */
44
+ export interface ModelInfo {
45
+ /** Model identifier to use in API calls. */
46
+ value: string;
47
+ /** Human-readable display name. */
48
+ displayName: string;
49
+ /** Description of the model's capabilities. */
50
+ description: string;
51
+ /** Whether this model supports effort levels. */
52
+ supportsEffort?: boolean;
53
+ /** Available effort levels for this model. */
54
+ supportedEffortLevels?: ('low' | 'medium' | 'high' | 'max')[];
55
+ /** Whether this model supports adaptive thinking. */
56
+ supportsAdaptiveThinking?: boolean;
57
+ }
58
+ export interface AgentDefinition {
59
+ /** Unique identifier (e.g. 'claude', 'aider', 'codex'). */
60
+ id: string;
61
+ /** Display name for UIs. */
62
+ displayName: string;
63
+ /** Integration tier. */
64
+ tier: AgentTier;
65
+ /** Agent-specific tool defaults (merged into config resolution chain). */
66
+ defaults: AgentDefaults;
67
+ /** Declared capabilities — UI adapts based on these. */
68
+ capabilities: AgentCapabilities;
69
+ /** Detection: how to check if this agent is available. */
70
+ detection: AgentDetection;
71
+ /** Factory: create an adapter. Returns null if unavailable. */
72
+ createAdapter: () => Promise<AgentAdapter | null>;
73
+ /** Factory: create a discovery provider (for agents that persist session history). */
74
+ createDiscovery?: () => Promise<SessionDiscovery | null>;
75
+ /** Directories this agent uses for session storage (for file watching). */
76
+ watchDirs?: () => string[];
77
+ /** Fetch available models from the agent's SDK. Returns empty array if not supported. */
78
+ fetchModels?: () => Promise<ModelInfo[]>;
79
+ }
80
+ export declare class AgentRegistry {
81
+ private definitions;
82
+ private cachedModels;
83
+ /** Register an agent definition. */
84
+ register(definition: AgentDefinition): void;
85
+ /** Get an agent definition by ID. */
86
+ get(agentId: string): AgentDefinition | undefined;
87
+ /** Get all registered definitions. */
88
+ getAll(): AgentDefinition[];
89
+ /** Get agent IDs. */
90
+ getIds(): string[];
91
+ /** Check which registered agents are available on this machine. */
92
+ detectAvailable(): Promise<Map<string, boolean>>;
93
+ /**
94
+ * Resolve agent-specific permissions defaults.
95
+ * Returns a PermissionsConfig from the agent's registered defaults,
96
+ * used as the base layer in config resolution.
97
+ */
98
+ resolveAgentPermissions(agentId: string): PermissionsConfig | undefined;
99
+ /**
100
+ * Resolve agent-specific git tracker defaults.
101
+ * Returns partial GitTrackerConfig with commitOn from the agent's defaults.
102
+ */
103
+ resolveAgentGitConfig(agentId: string): Partial<GitTrackerConfig> | undefined;
104
+ /** Get capabilities for a specific agent (for hello message). */
105
+ getCapabilities(agentId: string): AgentCapabilities | undefined;
106
+ /** Get all directories that registered agents want watched. */
107
+ getAllWatchDirs(): string[];
108
+ /**
109
+ * Fetch available models from all registered agents that support it.
110
+ * Results are cached — call invalidateModelCache() to refresh.
111
+ */
112
+ fetchAllModels(): Promise<ModelInfo[]>;
113
+ /** Get cached models (synchronous — returns empty if not yet fetched). */
114
+ getCachedModels(): ModelInfo[];
115
+ /** Invalidate the model cache (e.g. on reconnect). */
116
+ invalidateModelCache(): void;
117
+ /** Serialize all agents for the hello message. */
118
+ toHelloPayload(): AgentInfo[];
119
+ }
120
+ /** Serialized agent info for the wire protocol (hello message). */
121
+ export interface AgentInfo {
122
+ id: string;
123
+ displayName: string;
124
+ tier: AgentTier;
125
+ available: boolean;
126
+ capabilities: AgentCapabilities;
127
+ }
128
+ //# sourceMappingURL=agent-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-registry.d.ts","sourceRoot":"","sources":["../../src/core/agent-registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,131 @@
1
+ /**
2
+ * Agent Registry — the extensibility backbone of Viewport.
3
+ *
4
+ * Agent definitions describe how to detect, configure, and instantiate
5
+ * each supported agent. The daemon core never imports agent-specific code
6
+ * directly — it loads agents from the registry.
7
+ *
8
+ * Two tiers:
9
+ * - SDK adapters: deep integration (structured tool calls, permissions, tokens)
10
+ * - PTY adapters: broad compatibility (terminal I/O, spawn any CLI)
11
+ */
12
+ // ---------------------------------------------------------------------------
13
+ // Agent registry — holds registered definitions
14
+ // ---------------------------------------------------------------------------
15
+ export class AgentRegistry {
16
+ definitions = new Map();
17
+ cachedModels = null;
18
+ /** Register an agent definition. */
19
+ register(definition) {
20
+ this.definitions.set(definition.id, definition);
21
+ }
22
+ /** Get an agent definition by ID. */
23
+ get(agentId) {
24
+ return this.definitions.get(agentId);
25
+ }
26
+ /** Get all registered definitions. */
27
+ getAll() {
28
+ return [...this.definitions.values()];
29
+ }
30
+ /** Get agent IDs. */
31
+ getIds() {
32
+ return [...this.definitions.keys()];
33
+ }
34
+ /** Check which registered agents are available on this machine. */
35
+ async detectAvailable() {
36
+ const results = new Map();
37
+ const checks = this.getAll().map(async (def) => {
38
+ try {
39
+ const available = await def.detection.check();
40
+ results.set(def.id, available);
41
+ }
42
+ catch {
43
+ results.set(def.id, false);
44
+ }
45
+ });
46
+ await Promise.all(checks);
47
+ return results;
48
+ }
49
+ /**
50
+ * Resolve agent-specific permissions defaults.
51
+ * Returns a PermissionsConfig from the agent's registered defaults,
52
+ * used as the base layer in config resolution.
53
+ */
54
+ resolveAgentPermissions(agentId) {
55
+ const def = this.definitions.get(agentId);
56
+ if (!def)
57
+ return undefined;
58
+ return {
59
+ autoApprove: def.defaults.autoApprove,
60
+ requireApproval: def.defaults.requireApproval,
61
+ deny: def.defaults.deny,
62
+ };
63
+ }
64
+ /**
65
+ * Resolve agent-specific git tracker defaults.
66
+ * Returns partial GitTrackerConfig with commitOn from the agent's defaults.
67
+ */
68
+ resolveAgentGitConfig(agentId) {
69
+ const def = this.definitions.get(agentId);
70
+ if (!def)
71
+ return undefined;
72
+ return {
73
+ commitOn: def.defaults.commitOn,
74
+ };
75
+ }
76
+ /** Get capabilities for a specific agent (for hello message). */
77
+ getCapabilities(agentId) {
78
+ return this.definitions.get(agentId)?.capabilities;
79
+ }
80
+ /** Get all directories that registered agents want watched. */
81
+ getAllWatchDirs() {
82
+ const dirs = [];
83
+ for (const def of this.definitions.values()) {
84
+ if (def.watchDirs) {
85
+ dirs.push(...def.watchDirs());
86
+ }
87
+ }
88
+ return dirs;
89
+ }
90
+ /**
91
+ * Fetch available models from all registered agents that support it.
92
+ * Results are cached — call invalidateModelCache() to refresh.
93
+ */
94
+ async fetchAllModels() {
95
+ if (this.cachedModels)
96
+ return this.cachedModels;
97
+ const allModels = [];
98
+ for (const def of this.definitions.values()) {
99
+ if (def.fetchModels) {
100
+ try {
101
+ const models = await def.fetchModels();
102
+ allModels.push(...models);
103
+ }
104
+ catch {
105
+ // Agent's model fetch failed — non-fatal
106
+ }
107
+ }
108
+ }
109
+ this.cachedModels = allModels;
110
+ return allModels;
111
+ }
112
+ /** Get cached models (synchronous — returns empty if not yet fetched). */
113
+ getCachedModels() {
114
+ return this.cachedModels ?? [];
115
+ }
116
+ /** Invalidate the model cache (e.g. on reconnect). */
117
+ invalidateModelCache() {
118
+ this.cachedModels = null;
119
+ }
120
+ /** Serialize all agents for the hello message. */
121
+ toHelloPayload() {
122
+ return this.getAll().map((def) => ({
123
+ id: def.id,
124
+ displayName: def.displayName,
125
+ tier: def.tier,
126
+ available: true, // Only registered agents that passed detection are in the registry at runtime
127
+ capabilities: def.capabilities,
128
+ }));
129
+ }
130
+ }
131
+ //# sourceMappingURL=agent-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-registry.js","sourceRoot":"","sources":["../../src/core/agent-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAiFH,8EAA8E;AAC9E,gDAAgD;AAChD,8EAA8E;AAE9E,MAAM,OAAO,aAAa;IAChB,WAAW,GAAG,IAAI,GAAG,EAA2B,CAAC;IACjD,YAAY,GAAuB,IAAI,CAAC;IAEhD,oCAAoC;IACpC,QAAQ,CAAC,UAA2B;QAClC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IAClD,CAAC;IAED,qCAAqC;IACrC,GAAG,CAAC,OAAe;QACjB,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;IAED,sCAAsC;IACtC,MAAM;QACJ,OAAO,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,qBAAqB;IACrB,MAAM;QACJ,OAAO,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,mEAAmE;IACnE,KAAK,CAAC,eAAe;QACnB,MAAM,OAAO,GAAG,IAAI,GAAG,EAAmB,CAAC;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YAC7C,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;gBAC9C,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;YACjC,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC,CAAC,CAAC;QACH,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1B,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;;OAIG;IACH,uBAAuB,CAAC,OAAe;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,CAAC,GAAG;YAAE,OAAO,SAAS,CAAC;QAC3B,OAAO;YACL,WAAW,EAAE,GAAG,CAAC,QAAQ,CAAC,WAAW;YACrC,eAAe,EAAE,GAAG,CAAC,QAAQ,CAAC,eAAe;YAC7C,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,IAAI;SACxB,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,qBAAqB,CAAC,OAAe;QACnC,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,CAAC,GAAG;YAAE,OAAO,SAAS,CAAC;QAC3B,OAAO;YACL,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,QAAQ;SAChC,CAAC;IACJ,CAAC;IAED,iEAAiE;IACjE,eAAe,CAAC,OAAe;QAC7B,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,YAAY,CAAC;IACrD,CAAC;IAED,+DAA+D;IAC/D,eAAe;QACb,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;YAC5C,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;gBAClB,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,cAAc;QAClB,IAAI,IAAI,CAAC,YAAY;YAAE,OAAO,IAAI,CAAC,YAAY,CAAC;QAEhD,MAAM,SAAS,GAAgB,EAAE,CAAC;QAClC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;YAC5C,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;gBACpB,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;oBACvC,SAAS,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;gBAC5B,CAAC;gBAAC,MAAM,CAAC;oBACP,yCAAyC;gBAC3C,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;QAC9B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,0EAA0E;IAC1E,eAAe;QACb,OAAO,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC;IACjC,CAAC;IAED,sDAAsD;IACtD,oBAAoB;QAClB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;IAC3B,CAAC;IAED,kDAAkD;IAClD,cAAc;QACZ,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACjC,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,SAAS,EAAE,IAAI,EAAE,8EAA8E;YAC/F,YAAY,EAAE,GAAG,CAAC,YAAY;SAC/B,CAAC,CAAC,CAAC;IACN,CAAC;CACF"}
@@ -0,0 +1,77 @@
1
+ import { z } from 'zod';
2
+ export declare const ViewportConfigSchema: z.ZodObject<{
3
+ defaults: z.ZodOptional<z.ZodObject<{
4
+ agent: z.ZodOptional<z.ZodString>;
5
+ model: z.ZodOptional<z.ZodString>;
6
+ gitTracker: z.ZodOptional<z.ZodObject<{
7
+ enabled: z.ZodOptional<z.ZodBoolean>;
8
+ commitOn: z.ZodOptional<z.ZodArray<z.ZodString>>;
9
+ ignore: z.ZodOptional<z.ZodArray<z.ZodString>>;
10
+ autoSquashOnComplete: z.ZodOptional<z.ZodBoolean>;
11
+ branchPrefix: z.ZodOptional<z.ZodString>;
12
+ commitAuthor: z.ZodOptional<z.ZodString>;
13
+ maxCommitsPerSession: z.ZodOptional<z.ZodNumber>;
14
+ worktreeRoot: z.ZodOptional<z.ZodString>;
15
+ }, z.core.$strict>>;
16
+ permissions: z.ZodOptional<z.ZodObject<{
17
+ autoApprove: z.ZodOptional<z.ZodArray<z.ZodString>>;
18
+ requireApproval: z.ZodOptional<z.ZodArray<z.ZodString>>;
19
+ deny: z.ZodOptional<z.ZodArray<z.ZodString>>;
20
+ }, z.core.$strict>>;
21
+ costCapUsd: z.ZodOptional<z.ZodNumber>;
22
+ trust: z.ZodOptional<z.ZodEnum<{
23
+ operator: "operator";
24
+ automated: "automated";
25
+ external: "external";
26
+ }>>;
27
+ }, z.core.$strict>>;
28
+ directories: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
29
+ path: z.ZodString;
30
+ config: z.ZodOptional<z.ZodObject<{
31
+ agent: z.ZodOptional<z.ZodString>;
32
+ model: z.ZodOptional<z.ZodString>;
33
+ gitTracker: z.ZodOptional<z.ZodObject<{
34
+ enabled: z.ZodOptional<z.ZodBoolean>;
35
+ commitOn: z.ZodOptional<z.ZodArray<z.ZodString>>;
36
+ ignore: z.ZodOptional<z.ZodArray<z.ZodString>>;
37
+ autoSquashOnComplete: z.ZodOptional<z.ZodBoolean>;
38
+ branchPrefix: z.ZodOptional<z.ZodString>;
39
+ commitAuthor: z.ZodOptional<z.ZodString>;
40
+ maxCommitsPerSession: z.ZodOptional<z.ZodNumber>;
41
+ worktreeRoot: z.ZodOptional<z.ZodString>;
42
+ }, z.core.$strict>>;
43
+ permissions: z.ZodOptional<z.ZodObject<{
44
+ autoApprove: z.ZodOptional<z.ZodArray<z.ZodString>>;
45
+ requireApproval: z.ZodOptional<z.ZodArray<z.ZodString>>;
46
+ deny: z.ZodOptional<z.ZodArray<z.ZodString>>;
47
+ }, z.core.$strict>>;
48
+ costCapUsd: z.ZodOptional<z.ZodNumber>;
49
+ trust: z.ZodOptional<z.ZodEnum<{
50
+ operator: "operator";
51
+ automated: "automated";
52
+ external: "external";
53
+ }>>;
54
+ }, z.core.$strict>>;
55
+ }, z.core.$strict>>>;
56
+ relayUrl: z.ZodOptional<z.ZodString>;
57
+ relayToken: z.ZodOptional<z.ZodString>;
58
+ machineId: z.ZodOptional<z.ZodString>;
59
+ daemon: z.ZodOptional<z.ZodObject<{
60
+ listen: z.ZodOptional<z.ZodString>;
61
+ profile: z.ZodOptional<z.ZodEnum<{
62
+ local: "local";
63
+ lan: "lan";
64
+ relay: "relay";
65
+ }>>;
66
+ allowedHosts: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodLiteral<true>]>>;
67
+ allowedOrigins: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodLiteral<true>]>>;
68
+ authEnabled: z.ZodOptional<z.ZodBoolean>;
69
+ logFile: z.ZodOptional<z.ZodString>;
70
+ relay: z.ZodOptional<z.ZodObject<{
71
+ enabled: z.ZodOptional<z.ZodBoolean>;
72
+ endpoint: z.ZodOptional<z.ZodString>;
73
+ publicEndpoint: z.ZodOptional<z.ZodString>;
74
+ }, z.core.$strict>>;
75
+ }, z.core.$strict>>;
76
+ }, z.core.$strict>;
77
+ //# sourceMappingURL=config-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-schema.d.ts","sourceRoot":"","sources":["../../src/core/config-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAkCxB,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAqCtB,CAAC"}
@@ -0,0 +1,66 @@
1
+ import { z } from 'zod';
2
+ const PartialGitTrackerSchema = z
3
+ .object({
4
+ enabled: z.boolean().optional(),
5
+ commitOn: z.array(z.string()).optional(),
6
+ ignore: z.array(z.string()).optional(),
7
+ autoSquashOnComplete: z.boolean().optional(),
8
+ branchPrefix: z.string().optional(),
9
+ commitAuthor: z.string().optional(),
10
+ maxCommitsPerSession: z.number().int().positive().optional(),
11
+ worktreeRoot: z.string().optional(),
12
+ })
13
+ .strict();
14
+ const PartialPermissionsSchema = z
15
+ .object({
16
+ autoApprove: z.array(z.string()).optional(),
17
+ requireApproval: z.array(z.string()).optional(),
18
+ deny: z.array(z.string()).optional(),
19
+ })
20
+ .strict();
21
+ const PartialSessionConfigSchema = z
22
+ .object({
23
+ agent: z.string().min(1).max(128).optional(),
24
+ model: z.string().min(1).max(256).optional(),
25
+ gitTracker: PartialGitTrackerSchema.optional(),
26
+ permissions: PartialPermissionsSchema.optional(),
27
+ costCapUsd: z.number().nonnegative().optional(),
28
+ trust: z.enum(['operator', 'automated', 'external']).optional(),
29
+ })
30
+ .strict();
31
+ export const ViewportConfigSchema = z
32
+ .object({
33
+ defaults: PartialSessionConfigSchema.optional(),
34
+ directories: z
35
+ .record(z.string(), z
36
+ .object({
37
+ path: z.string().min(1),
38
+ config: PartialSessionConfigSchema.optional(),
39
+ })
40
+ .strict())
41
+ .optional(),
42
+ relayUrl: z.string().optional(),
43
+ relayToken: z.string().optional(),
44
+ machineId: z.string().optional(),
45
+ daemon: z
46
+ .object({
47
+ listen: z.string().optional(),
48
+ profile: z.enum(['local', 'lan', 'relay']).optional(),
49
+ allowedHosts: z.union([z.array(z.string()), z.literal(true)]).optional(),
50
+ allowedOrigins: z.union([z.array(z.string()), z.literal(true)]).optional(),
51
+ authEnabled: z.boolean().optional(),
52
+ logFile: z.string().optional(),
53
+ relay: z
54
+ .object({
55
+ enabled: z.boolean().optional(),
56
+ endpoint: z.string().optional(),
57
+ publicEndpoint: z.string().optional(),
58
+ })
59
+ .strict()
60
+ .optional(),
61
+ })
62
+ .strict()
63
+ .optional(),
64
+ })
65
+ .strict();
66
+ //# sourceMappingURL=config-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-schema.js","sourceRoot":"","sources":["../../src/core/config-schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Layered configuration system for the Viewport daemon.
3
+ *
4
+ * Resolution order (later wins):
5
+ * built-in defaults → global config → directory overrides → session overrides
6
+ *
7
+ * Config file: ~/.viewport/config.json
8
+ */
9
+ import type { SessionConfig } from './types.js';
10
+ import type { AgentRegistry } from './agent-registry.js';
11
+ export declare const BUILT_IN_DEFAULTS: SessionConfig;
12
+ /**
13
+ * Deep merge objects. Arrays are replaced (not concatenated).
14
+ * `undefined` values in source are skipped (don't overwrite with undefined).
15
+ */
16
+ export declare function deepMerge<T>(...sources: Array<Partial<T> | undefined>): T;
17
+ export interface ViewportConfig {
18
+ /** Global defaults applied to all directories. */
19
+ defaults?: Partial<SessionConfig>;
20
+ /** Per-directory config overrides. Keyed by directory ID. */
21
+ directories?: Record<string, {
22
+ path: string;
23
+ config?: Partial<SessionConfig>;
24
+ }>;
25
+ /** Relay URL for remote access. */
26
+ relayUrl?: string;
27
+ /** Machine token for relay auth. */
28
+ relayToken?: string;
29
+ /** Machine ID. */
30
+ machineId?: string;
31
+ /** Daemon runtime defaults (listen/profile/security/lifecycle options). */
32
+ daemon?: {
33
+ listen?: string;
34
+ profile?: 'local' | 'lan' | 'relay';
35
+ allowedHosts?: string[] | true;
36
+ allowedOrigins?: string[] | true;
37
+ authEnabled?: boolean;
38
+ logFile?: string;
39
+ relay?: {
40
+ enabled?: boolean;
41
+ endpoint?: string;
42
+ publicEndpoint?: string;
43
+ };
44
+ };
45
+ }
46
+ export declare function resolveViewportHome(env?: NodeJS.ProcessEnv): string;
47
+ /** Returns the path to the Viewport config directory. */
48
+ export declare function configDir(): string;
49
+ /** Returns the path to the Viewport config file. */
50
+ export declare function configFilePath(): string;
51
+ /** Load the config file, returning empty config if it doesn't exist. */
52
+ export declare function loadConfig(): Promise<ViewportConfig>;
53
+ /** Save the config file, creating the directory if needed. */
54
+ export declare function saveConfig(config: ViewportConfig): Promise<void>;
55
+ /**
56
+ * Resolve the full SessionConfig for a directory, with optional session overrides.
57
+ *
58
+ * Resolution: builtInDefaults ← agentDefaults ← globalDefaults ← directoryConfig ← sessionOverrides
59
+ *
60
+ * Agent defaults inject agent-specific tool names and permissions without
61
+ * polluting the framework-level built-in defaults.
62
+ */
63
+ export declare function resolveConfig(agentDefaults?: Partial<SessionConfig>, globalDefaults?: Partial<SessionConfig>, directoryConfig?: Partial<SessionConfig>, sessionOverrides?: Partial<SessionConfig>): SessionConfig;
64
+ export declare class ConfigManager {
65
+ private config;
66
+ private loaded;
67
+ private agentRegistry;
68
+ /** Load config from disk. Safe to call multiple times. */
69
+ load(): Promise<void>;
70
+ /** Set the agent registry for agent-aware config resolution. */
71
+ setAgentRegistry(registry: AgentRegistry): void;
72
+ /** Get the raw viewport config. */
73
+ getConfig(): ViewportConfig;
74
+ /** Resolve a full SessionConfig for a directory, with agent-specific defaults. */
75
+ resolveSessionConfig(directoryId?: string, sessionOverrides?: Partial<SessionConfig>): SessionConfig;
76
+ /** Build a partial SessionConfig from agent definition defaults. */
77
+ private buildAgentDefaults;
78
+ /** Get the relay URL (if configured). */
79
+ getRelayUrl(): string | undefined;
80
+ /** Get the machine ID. */
81
+ getMachineId(): string;
82
+ /** Get daemon runtime settings from config (if any). */
83
+ getDaemonConfig(): {
84
+ listen?: string;
85
+ profile?: 'local' | 'lan' | 'relay';
86
+ allowedHosts?: string[] | true;
87
+ allowedOrigins?: string[] | true;
88
+ authEnabled?: boolean;
89
+ logFile?: string;
90
+ relay?: {
91
+ enabled?: boolean;
92
+ endpoint?: string;
93
+ publicEndpoint?: string;
94
+ };
95
+ } | undefined;
96
+ /** Merge daemon runtime settings into config. */
97
+ setDaemonConfig(daemonConfig: NonNullable<ViewportConfig['daemon']>): Promise<void>;
98
+ /** Update global defaults. */
99
+ setDefaults(defaults: Partial<SessionConfig>): Promise<void>;
100
+ /** Register a directory with optional config. */
101
+ registerDirectory(directoryId: string, dirPath: string, config?: Partial<SessionConfig>): Promise<void>;
102
+ /** Unregister a directory. */
103
+ unregisterDirectory(directoryId: string): Promise<void>;
104
+ /** Get all registered directories. */
105
+ getDirectories(): Record<string, {
106
+ path: string;
107
+ config?: Partial<SessionConfig>;
108
+ }>;
109
+ private ensureLoaded;
110
+ }
111
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}