@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 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/core/output.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,eAAO,MAAM,MAAM;oBACD,OAAO,EAAE,KAAG,IAAI;qBAGf,OAAO,EAAE,KAAG,IAAI;qBAGhB,OAAO,EAAE,KAAG,IAAI;sBAGf,OAAO,EAAE,KAAG,IAAI;CAGnC,CAAC"}
@@ -0,0 +1,22 @@
1
+ /* eslint-disable no-console */
2
+ /**
3
+ * Unified process output facade for CLI/runtime messaging.
4
+ *
5
+ * Keep direct console usage centralized here so call sites can migrate
6
+ * without changing user-visible behavior.
7
+ */
8
+ export const logger = {
9
+ log: (...parts) => {
10
+ console.log(...parts);
11
+ },
12
+ info: (...parts) => {
13
+ console.info(...parts);
14
+ },
15
+ warn: (...parts) => {
16
+ console.warn(...parts);
17
+ },
18
+ error: (...parts) => {
19
+ console.error(...parts);
20
+ },
21
+ };
22
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/core/output.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAE/B;;;;;GAKG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,GAAG,EAAE,CAAC,GAAG,KAAgB,EAAQ,EAAE;QACjC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IACxB,CAAC;IACD,IAAI,EAAE,CAAC,GAAG,KAAgB,EAAQ,EAAE;QAClC,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;IACzB,CAAC;IACD,IAAI,EAAE,CAAC,GAAG,KAAgB,EAAQ,EAAE;QAClC,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;IACzB,CAAC;IACD,KAAK,EAAE,CAAC,GAAG,KAAgB,EAAQ,EAAE;QACnC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC;IAC1B,CAAC;CACF,CAAC"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * PermissionCoordinator — handles permission resolution and async approval flow.
3
+ *
4
+ * Builds the canUseTool handler that adapters receive, resolves auto-approve/deny
5
+ * from config, and waits for user responses via the event bus for require-approval.
6
+ */
7
+ import type { TypedEventEmitter } from './events.js';
8
+ import type { DaemonEvents } from './events.js';
9
+ import type { SessionConfig, PermissionDecision, PendingPermissionRequest, SessionAgentMode } from './types.js';
10
+ export declare class PermissionCoordinator {
11
+ private readonly eventBus;
12
+ private readonly timeoutMs;
13
+ /** Tracks pending permission requests per session: sessionId -> Set<requestId>. */
14
+ private pendingPermissions;
15
+ /** Maps requestId -> toolName for resolving allow-always. */
16
+ private requestToolNames;
17
+ /** Maps requestId -> full pending request metadata (for operator tooling). */
18
+ private pendingRequestDetails;
19
+ /** Per-session operator mode. */
20
+ private sessionModes;
21
+ constructor(eventBus: TypedEventEmitter<DaemonEvents>, timeoutMs?: number);
22
+ /**
23
+ * Create the async permission handler for an agent session.
24
+ *
25
+ * The returned function matches the SDK's canUseTool signature. It:
26
+ * 1. Checks the config for auto-approve / deny
27
+ * 2. For require-approval, emits a permission:requested event and
28
+ * waits for permission:responded on the event bus
29
+ */
30
+ createPermissionHandler(sessionId: string, configOrGetter: SessionConfig | (() => SessionConfig)): (toolName: string, input: Record<string, unknown>, context: {
31
+ signal: AbortSignal;
32
+ toolUseId: string;
33
+ decisionReason?: string;
34
+ }) => Promise<PermissionDecision>;
35
+ /**
36
+ * Respond to a pending permission request by emitting the responded event.
37
+ *
38
+ * The daemon's createPermissionHandler listens for this event to resolve
39
+ * the pending promise.
40
+ */
41
+ respondPermission(sessionId: string, requestId: string, decision: PermissionDecision): void;
42
+ /**
43
+ * Reject any pending permission promises for a session.
44
+ *
45
+ * Called on session end/error to prevent dangling promises. Emits a deny
46
+ * response for each pending request, which resolves the waiting promises
47
+ * in the permission handlers.
48
+ */
49
+ rejectPendingPermissions(sessionId: string): void;
50
+ /**
51
+ * Validate that a session exists before responding to a permission.
52
+ * Throws SESSION_NOT_FOUND if the session is not active.
53
+ */
54
+ respondPermissionForSession(sessionId: string, requestId: string, decision: PermissionDecision, sessionExists: boolean): void;
55
+ /** Get the tool name for a pending permission request. */
56
+ getRequestToolName(requestId: string): string | undefined;
57
+ /**
58
+ * Add a tool to a session's auto-approve list at runtime.
59
+ * Used when the user selects "Always Allow" for a tool.
60
+ */
61
+ addAutoApprove(config: SessionConfig, toolName: string): SessionConfig;
62
+ setSessionMode(sessionId: string, mode: SessionAgentMode): void;
63
+ getSessionMode(sessionId: string): SessionAgentMode;
64
+ clearSessionMode(sessionId: string): void;
65
+ listPendingPermissions(sessionId?: string): PendingPermissionRequest[];
66
+ }
67
+ //# sourceMappingURL=permission-coordinator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permission-coordinator.d.ts","sourceRoot":"","sources":["../../src/core/permission-coordinator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EACV,aAAa,EACb,kBAAkB,EAElB,wBAAwB,EACxB,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAOpB,qBAAa,qBAAqB;IAW9B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAX5B,mFAAmF;IACnF,OAAO,CAAC,kBAAkB,CAAkC;IAC5D,6DAA6D;IAC7D,OAAO,CAAC,gBAAgB,CAA6B;IACrD,8EAA8E;IAC9E,OAAO,CAAC,qBAAqB,CAA+C;IAC5E,iCAAiC;IACjC,OAAO,CAAC,YAAY,CAAuC;gBAGxC,QAAQ,EAAE,iBAAiB,CAAC,YAAY,CAAC,EACzC,SAAS,GAAE,MAA8B;IAG5D;;;;;;;OAOG;IACH,uBAAuB,CACrB,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,aAAa,GAAG,CAAC,MAAM,aAAa,CAAC,GACpD,CACD,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,EAAE;QAAE,MAAM,EAAE,WAAW,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,KACzE,OAAO,CAAC,kBAAkB,CAAC;IA+GhC;;;;;OAKG;IACH,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,kBAAkB,GAAG,IAAI;IAI3F;;;;;;OAMG;IACH,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAsBjD;;;OAGG;IACH,2BAA2B,CACzB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,kBAAkB,EAC5B,aAAa,EAAE,OAAO,GACrB,IAAI;IAOP,0DAA0D;IAC1D,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIzD;;;OAGG;IACH,cAAc,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,GAAG,aAAa;IAatE,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,IAAI;IAI/D,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB;IAInD,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAIzC,sBAAsB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,wBAAwB,EAAE;CAUvE"}
@@ -0,0 +1,209 @@
1
+ /**
2
+ * PermissionCoordinator — handles permission resolution and async approval flow.
3
+ *
4
+ * Builds the canUseTool handler that adapters receive, resolves auto-approve/deny
5
+ * from config, and waits for user responses via the event bus for require-approval.
6
+ */
7
+ import { resolvePermission } from '../permissions/engine.js';
8
+ import { ViewportError } from './errors.js';
9
+ /** Default timeout for permission requests (5 minutes). */
10
+ const PERMISSION_TIMEOUT_MS = 5 * 60 * 1000;
11
+ export class PermissionCoordinator {
12
+ eventBus;
13
+ timeoutMs;
14
+ /** Tracks pending permission requests per session: sessionId -> Set<requestId>. */
15
+ pendingPermissions = new Map();
16
+ /** Maps requestId -> toolName for resolving allow-always. */
17
+ requestToolNames = new Map();
18
+ /** Maps requestId -> full pending request metadata (for operator tooling). */
19
+ pendingRequestDetails = new Map();
20
+ /** Per-session operator mode. */
21
+ sessionModes = new Map();
22
+ constructor(eventBus, timeoutMs = PERMISSION_TIMEOUT_MS) {
23
+ this.eventBus = eventBus;
24
+ this.timeoutMs = timeoutMs;
25
+ }
26
+ /**
27
+ * Create the async permission handler for an agent session.
28
+ *
29
+ * The returned function matches the SDK's canUseTool signature. It:
30
+ * 1. Checks the config for auto-approve / deny
31
+ * 2. For require-approval, emits a permission:requested event and
32
+ * waits for permission:responded on the event bus
33
+ */
34
+ createPermissionHandler(sessionId, configOrGetter) {
35
+ const getConfig = () => typeof configOrGetter === 'function' ? configOrGetter() : configOrGetter;
36
+ return async (toolName, input, context) => {
37
+ if (this.sessionModes.get(sessionId) === 'bypass') {
38
+ return { behavior: 'allow' };
39
+ }
40
+ const resolution = resolvePermission(toolName, input, getConfig().permissions);
41
+ if (resolution === 'auto-approve') {
42
+ return { behavior: 'allow' };
43
+ }
44
+ if (resolution === 'deny') {
45
+ return { behavior: 'deny', message: `Tool "${toolName}" is denied by policy` };
46
+ }
47
+ // require-approval — emit event and wait for response
48
+ const request = {
49
+ requestId: context.toolUseId,
50
+ toolName,
51
+ description: `${toolName} wants to execute`,
52
+ input,
53
+ decisionReason: context.decisionReason,
54
+ };
55
+ this.eventBus.emit('permission:requested', { sessionId, request });
56
+ // Track this pending permission
57
+ if (!this.pendingPermissions.has(sessionId)) {
58
+ this.pendingPermissions.set(sessionId, new Set());
59
+ }
60
+ this.pendingPermissions.get(sessionId).add(context.toolUseId);
61
+ this.requestToolNames.set(context.toolUseId, toolName);
62
+ this.pendingRequestDetails.set(context.toolUseId, {
63
+ sessionId,
64
+ requestId: context.toolUseId,
65
+ toolName,
66
+ description: request.description,
67
+ input: request.input,
68
+ decisionReason: request.decisionReason,
69
+ blockedPath: request.blockedPath,
70
+ createdAt: Date.now(),
71
+ });
72
+ // Return a promise that resolves when respondPermission is called
73
+ return new Promise((resolve) => {
74
+ let resolved = false;
75
+ const cleanup = () => {
76
+ const pending = this.pendingPermissions.get(sessionId);
77
+ if (pending) {
78
+ pending.delete(context.toolUseId);
79
+ if (pending.size === 0) {
80
+ this.pendingPermissions.delete(sessionId);
81
+ }
82
+ }
83
+ this.requestToolNames.delete(context.toolUseId);
84
+ this.pendingRequestDetails.delete(context.toolUseId);
85
+ };
86
+ const resolveOnce = (decision) => {
87
+ if (resolved)
88
+ return;
89
+ resolved = true;
90
+ clearTimeout(timer);
91
+ this.eventBus.off('permission:responded', handler);
92
+ cleanup();
93
+ resolve(decision);
94
+ };
95
+ // Auto-deny after timeout
96
+ const timer = setTimeout(() => {
97
+ this.eventBus.emit('session:attention', {
98
+ sessionId,
99
+ attention: {
100
+ requiresAttention: true,
101
+ reason: 'idle_timeout',
102
+ timestamp: Date.now(),
103
+ },
104
+ });
105
+ resolveOnce({
106
+ behavior: 'deny',
107
+ message: `Permission request timed out after ${this.timeoutMs / 1000}s`,
108
+ });
109
+ }, this.timeoutMs);
110
+ const handler = (data) => {
111
+ if (data.sessionId === sessionId && data.requestId === context.toolUseId) {
112
+ resolveOnce(data.decision);
113
+ }
114
+ };
115
+ this.eventBus.on('permission:responded', handler);
116
+ // Abort signal cancellation
117
+ context.signal.addEventListener('abort', () => {
118
+ resolveOnce({ behavior: 'deny', message: 'Request cancelled' });
119
+ }, { once: true });
120
+ });
121
+ };
122
+ }
123
+ /**
124
+ * Respond to a pending permission request by emitting the responded event.
125
+ *
126
+ * The daemon's createPermissionHandler listens for this event to resolve
127
+ * the pending promise.
128
+ */
129
+ respondPermission(sessionId, requestId, decision) {
130
+ this.eventBus.emit('permission:responded', { sessionId, requestId, decision });
131
+ }
132
+ /**
133
+ * Reject any pending permission promises for a session.
134
+ *
135
+ * Called on session end/error to prevent dangling promises. Emits a deny
136
+ * response for each pending request, which resolves the waiting promises
137
+ * in the permission handlers.
138
+ */
139
+ rejectPendingPermissions(sessionId) {
140
+ const pending = this.pendingPermissions.get(sessionId);
141
+ if (!pending || pending.size === 0)
142
+ return;
143
+ // Copy the set since respondPermission will modify it via the handler cleanup
144
+ const requestIds = [...pending];
145
+ for (const requestId of requestIds) {
146
+ this.respondPermission(sessionId, requestId, {
147
+ behavior: 'deny',
148
+ message: 'Session ended',
149
+ });
150
+ }
151
+ // Ensure cleanup even if handlers didn't fire
152
+ this.pendingPermissions.delete(sessionId);
153
+ for (const [requestId, detail] of this.pendingRequestDetails) {
154
+ if (detail.sessionId === sessionId) {
155
+ this.pendingRequestDetails.delete(requestId);
156
+ }
157
+ }
158
+ }
159
+ /**
160
+ * Validate that a session exists before responding to a permission.
161
+ * Throws SESSION_NOT_FOUND if the session is not active.
162
+ */
163
+ respondPermissionForSession(sessionId, requestId, decision, sessionExists) {
164
+ if (!sessionExists) {
165
+ throw new ViewportError('SESSION_NOT_FOUND', `No active session: ${sessionId}`);
166
+ }
167
+ this.respondPermission(sessionId, requestId, decision);
168
+ }
169
+ /** Get the tool name for a pending permission request. */
170
+ getRequestToolName(requestId) {
171
+ return this.requestToolNames.get(requestId);
172
+ }
173
+ /**
174
+ * Add a tool to a session's auto-approve list at runtime.
175
+ * Used when the user selects "Always Allow" for a tool.
176
+ */
177
+ addAutoApprove(config, toolName) {
178
+ if (!config.permissions.autoApprove.includes(toolName)) {
179
+ return {
180
+ ...config,
181
+ permissions: {
182
+ ...config.permissions,
183
+ autoApprove: [...config.permissions.autoApprove, toolName],
184
+ },
185
+ };
186
+ }
187
+ return config;
188
+ }
189
+ setSessionMode(sessionId, mode) {
190
+ this.sessionModes.set(sessionId, mode);
191
+ }
192
+ getSessionMode(sessionId) {
193
+ return this.sessionModes.get(sessionId) ?? 'detect';
194
+ }
195
+ clearSessionMode(sessionId) {
196
+ this.sessionModes.delete(sessionId);
197
+ }
198
+ listPendingPermissions(sessionId) {
199
+ const out = [];
200
+ for (const detail of this.pendingRequestDetails.values()) {
201
+ if (!sessionId || detail.sessionId === sessionId) {
202
+ out.push({ ...detail });
203
+ }
204
+ }
205
+ out.sort((a, b) => a.createdAt - b.createdAt);
206
+ return out;
207
+ }
208
+ }
209
+ //# sourceMappingURL=permission-coordinator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permission-coordinator.js","sourceRoot":"","sources":["../../src/core/permission-coordinator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * SessionManager — manages the lifecycle of active agent sessions.
3
+ *
4
+ * Owns session storage, launch/resume/kill, event wiring, and tracker setup.
5
+ * Uses the daemon's event bus for all inter-module communication.
6
+ */
7
+ import type { AgentAdapter, RunTracker, RunTrackerFactory, Session } from './interfaces.js';
8
+ import type { SessionAgentMode, SessionConfig, SessionMessage, SessionState, Step } from './types.js';
9
+ import type { TypedEventEmitter } from './events.js';
10
+ import type { DaemonEvents } from './events.js';
11
+ import type { ConfigManager } from './config.js';
12
+ import type { DirectoryManager } from '../directories/manager.js';
13
+ import type { PermissionCoordinator } from './permission-coordinator.js';
14
+ /** Listener references for cleanup on session end / shutdown. */
15
+ interface SessionListeners {
16
+ onMessage: (msg: SessionMessage) => void;
17
+ onStateChange: (state: SessionState) => void;
18
+ onEnded: (reason: string) => Promise<void>;
19
+ }
20
+ export interface ActiveSession {
21
+ session: Session;
22
+ tracker: RunTracker;
23
+ config: SessionConfig;
24
+ startedAt: number;
25
+ directoryId: string;
26
+ worktreePath: string;
27
+ listeners?: SessionListeners;
28
+ }
29
+ export declare class SessionManager {
30
+ private readonly eventBus;
31
+ private readonly configManager;
32
+ private readonly directoryManager;
33
+ private readonly permissionCoordinator;
34
+ private readonly adapters;
35
+ private readonly getTrackerFactory;
36
+ private sessions;
37
+ private sessionModes;
38
+ constructor(eventBus: TypedEventEmitter<DaemonEvents>, configManager: ConfigManager, directoryManager: DirectoryManager, permissionCoordinator: PermissionCoordinator, adapters: Map<string, AgentAdapter>, getTrackerFactory: () => RunTrackerFactory | null);
39
+ /**
40
+ * Launch a new agent session in a registered directory.
41
+ *
42
+ * 1. Resolves config (global -> directory -> session overrides)
43
+ * 2. Creates a tracker (git or noop)
44
+ * 3. Sets up the tracker (creates worktree if git-backed)
45
+ * 4. Wires permission handler
46
+ * 5. Starts the session via the adapter
47
+ * 6. Wires events
48
+ */
49
+ launchSession(directoryId: string, prompt: string, overrides?: Partial<SessionConfig>): Promise<string>;
50
+ /**
51
+ * Resume a discovered session via the adapter's resume support.
52
+ *
53
+ * Uses the original sessionId so the SDK can load the existing conversation.
54
+ */
55
+ resumeSession(originalSessionId: string, directoryId: string, prompt?: string, overrides?: Partial<SessionConfig>): Promise<string>;
56
+ /** Kill an active session. */
57
+ killSession(sessionId: string): Promise<void>;
58
+ /** Send a follow-up prompt to a session. */
59
+ sendPrompt(sessionId: string, text: string): Promise<void>;
60
+ /** Get all active session IDs. */
61
+ getActiveSessions(): string[];
62
+ /** Get session state and metadata. */
63
+ getSessionInfo(sessionId: string): {
64
+ state: SessionState;
65
+ directoryId: string;
66
+ agent: string;
67
+ mode: SessionAgentMode;
68
+ steps: ReadonlyArray<Step>;
69
+ };
70
+ listSessionSummaries(): Array<{
71
+ sessionId: string;
72
+ directoryId: string;
73
+ agent: string;
74
+ state: SessionState;
75
+ mode: SessionAgentMode;
76
+ startedAt: number;
77
+ }>;
78
+ listWorktreeSummaries(sessionId?: string): Array<{
79
+ sessionId: string;
80
+ directoryId: string;
81
+ agent: string;
82
+ state: SessionState;
83
+ mode: SessionAgentMode;
84
+ worktreePath: string;
85
+ stepCount: number;
86
+ lastStepSha: string | null;
87
+ lastStepAt: number | null;
88
+ }>;
89
+ /** Get diffs for a session. */
90
+ getSessionDiffs(sessionId: string): Promise<Array<{
91
+ step: number;
92
+ sha: string;
93
+ diff: string;
94
+ }>>;
95
+ /** Get the total diff across a session. */
96
+ getSessionSummaryDiff(sessionId: string): Promise<string>;
97
+ /** Roll back a session to a specific commit. */
98
+ rollback(sessionId: string, toSha: string): Promise<void>;
99
+ /** Create a retry branch from a specific commit. */
100
+ branchRetry(sessionId: string, fromSha: string): Promise<string>;
101
+ /** Squash-merge a session's changes into the target branch. */
102
+ squashMerge(sessionId: string, targetBranch: string, commitMessage: string): Promise<void>;
103
+ /** Check if a session exists. */
104
+ hasSession(sessionId: string): boolean;
105
+ /** Get the session config (for runtime permission updates). */
106
+ getSessionConfig(sessionId: string): SessionConfig | undefined;
107
+ updateSessionConfig(sessionId: string, config: SessionConfig): void;
108
+ setSessionMode(sessionId: string, mode: SessionAgentMode): void;
109
+ getSessionMode(sessionId: string): SessionAgentMode;
110
+ /** Gracefully shut down: tear down all active sessions. */
111
+ shutdown(): Promise<void>;
112
+ private getActiveSession;
113
+ /**
114
+ * Create and set up a tracker. If GitTracker setup fails (e.g. directory
115
+ * isn't a git repo), falls back to NoopTracker and logs a warning.
116
+ */
117
+ private setupTracker;
118
+ private wireSessionEvents;
119
+ }
120
+ export {};
121
+ //# sourceMappingURL=session-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/core/session-manager.ts"],"names":[],"mappings":"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"}