@av-pi-studio/server 0.0.1

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 (315) hide show
  1. package/README.md +411 -0
  2. package/dist/.tsbuildinfo +1 -0
  3. package/dist/agent/agent-manager.d.ts +107 -0
  4. package/dist/agent/agent-manager.d.ts.map +1 -0
  5. package/dist/agent/agent-manager.js +218 -0
  6. package/dist/agent/agent-manager.js.map +1 -0
  7. package/dist/agent/agent-service.d.ts +36 -0
  8. package/dist/agent/agent-service.d.ts.map +1 -0
  9. package/dist/agent/agent-service.js +195 -0
  10. package/dist/agent/agent-service.js.map +1 -0
  11. package/dist/agent/index.d.ts +17 -0
  12. package/dist/agent/index.d.ts.map +1 -0
  13. package/dist/agent/index.js +18 -0
  14. package/dist/agent/index.js.map +1 -0
  15. package/dist/agent/manifest.d.ts +7 -0
  16. package/dist/agent/manifest.d.ts.map +1 -0
  17. package/dist/agent/manifest.js +27 -0
  18. package/dist/agent/manifest.js.map +1 -0
  19. package/dist/agent/mcp-server.d.ts +100 -0
  20. package/dist/agent/mcp-server.d.ts.map +1 -0
  21. package/dist/agent/mcp-server.js +163 -0
  22. package/dist/agent/mcp-server.js.map +1 -0
  23. package/dist/agent/permissions.d.ts +71 -0
  24. package/dist/agent/permissions.d.ts.map +1 -0
  25. package/dist/agent/permissions.js +132 -0
  26. package/dist/agent/permissions.js.map +1 -0
  27. package/dist/agent/provider-contract.d.ts +134 -0
  28. package/dist/agent/provider-contract.d.ts.map +1 -0
  29. package/dist/agent/provider-contract.js +2 -0
  30. package/dist/agent/provider-contract.js.map +1 -0
  31. package/dist/agent/provider-registry.d.ts +37 -0
  32. package/dist/agent/provider-registry.d.ts.map +1 -0
  33. package/dist/agent/provider-registry.js +92 -0
  34. package/dist/agent/provider-registry.js.map +1 -0
  35. package/dist/agent/provider-snapshot.d.ts +52 -0
  36. package/dist/agent/provider-snapshot.d.ts.map +1 -0
  37. package/dist/agent/provider-snapshot.js +73 -0
  38. package/dist/agent/provider-snapshot.js.map +1 -0
  39. package/dist/agent/providers/mock/mock-provider.d.ts +44 -0
  40. package/dist/agent/providers/mock/mock-provider.d.ts.map +1 -0
  41. package/dist/agent/providers/mock/mock-provider.js +162 -0
  42. package/dist/agent/providers/mock/mock-provider.js.map +1 -0
  43. package/dist/agent/providers/pi/agent.d.ts +80 -0
  44. package/dist/agent/providers/pi/agent.d.ts.map +1 -0
  45. package/dist/agent/providers/pi/agent.js +322 -0
  46. package/dist/agent/providers/pi/agent.js.map +1 -0
  47. package/dist/agent/providers/pi/event-mapper.d.ts +17 -0
  48. package/dist/agent/providers/pi/event-mapper.d.ts.map +1 -0
  49. package/dist/agent/providers/pi/event-mapper.js +150 -0
  50. package/dist/agent/providers/pi/event-mapper.js.map +1 -0
  51. package/dist/agent/providers/pi/rpc-transport.d.ts +53 -0
  52. package/dist/agent/providers/pi/rpc-transport.d.ts.map +1 -0
  53. package/dist/agent/providers/pi/rpc-transport.js +190 -0
  54. package/dist/agent/providers/pi/rpc-transport.js.map +1 -0
  55. package/dist/agent/providers/pi/session-hydration.d.ts +11 -0
  56. package/dist/agent/providers/pi/session-hydration.d.ts.map +1 -0
  57. package/dist/agent/providers/pi/session-hydration.js +167 -0
  58. package/dist/agent/providers/pi/session-hydration.js.map +1 -0
  59. package/dist/agent/rewind-rpc.d.ts +15 -0
  60. package/dist/agent/rewind-rpc.d.ts.map +1 -0
  61. package/dist/agent/rewind-rpc.js +30 -0
  62. package/dist/agent/rewind-rpc.js.map +1 -0
  63. package/dist/agent/session-operations.d.ts +32 -0
  64. package/dist/agent/session-operations.d.ts.map +1 -0
  65. package/dist/agent/session-operations.js +130 -0
  66. package/dist/agent/session-operations.js.map +1 -0
  67. package/dist/agent/structured-generation.d.ts +39 -0
  68. package/dist/agent/structured-generation.d.ts.map +1 -0
  69. package/dist/agent/structured-generation.js +78 -0
  70. package/dist/agent/structured-generation.js.map +1 -0
  71. package/dist/agent/timeline-rpc.d.ts +21 -0
  72. package/dist/agent/timeline-rpc.d.ts.map +1 -0
  73. package/dist/agent/timeline-rpc.js +59 -0
  74. package/dist/agent/timeline-rpc.js.map +1 -0
  75. package/dist/agent/timeline-store.d.ts +100 -0
  76. package/dist/agent/timeline-store.d.ts.map +1 -0
  77. package/dist/agent/timeline-store.js +255 -0
  78. package/dist/agent/timeline-store.js.map +1 -0
  79. package/dist/auth/index.d.ts +2 -0
  80. package/dist/auth/index.d.ts.map +1 -0
  81. package/dist/auth/index.js +3 -0
  82. package/dist/auth/index.js.map +1 -0
  83. package/dist/auth/password-auth.d.ts +44 -0
  84. package/dist/auth/password-auth.d.ts.map +1 -0
  85. package/dist/auth/password-auth.js +78 -0
  86. package/dist/auth/password-auth.js.map +1 -0
  87. package/dist/config/daemon-config.d.ts +634 -0
  88. package/dist/config/daemon-config.d.ts.map +1 -0
  89. package/dist/config/daemon-config.js +258 -0
  90. package/dist/config/daemon-config.js.map +1 -0
  91. package/dist/config/index.d.ts +3 -0
  92. package/dist/config/index.d.ts.map +1 -0
  93. package/dist/config/index.js +4 -0
  94. package/dist/config/index.js.map +1 -0
  95. package/dist/config/project-config.d.ts +104 -0
  96. package/dist/config/project-config.d.ts.map +1 -0
  97. package/dist/config/project-config.js +106 -0
  98. package/dist/config/project-config.js.map +1 -0
  99. package/dist/daemon/bootstrap.d.ts +37 -0
  100. package/dist/daemon/bootstrap.d.ts.map +1 -0
  101. package/dist/daemon/bootstrap.js +448 -0
  102. package/dist/daemon/bootstrap.js.map +1 -0
  103. package/dist/daemon/dev-bootstrap.d.ts +14 -0
  104. package/dist/daemon/dev-bootstrap.d.ts.map +1 -0
  105. package/dist/daemon/dev-bootstrap.js +231 -0
  106. package/dist/daemon/dev-bootstrap.js.map +1 -0
  107. package/dist/daemon/dev-main.d.ts +3 -0
  108. package/dist/daemon/dev-main.d.ts.map +1 -0
  109. package/dist/daemon/dev-main.js +36 -0
  110. package/dist/daemon/dev-main.js.map +1 -0
  111. package/dist/daemon/index.d.ts +15 -0
  112. package/dist/daemon/index.d.ts.map +1 -0
  113. package/dist/daemon/index.js +21 -0
  114. package/dist/daemon/index.js.map +1 -0
  115. package/dist/daemon/main.d.ts +3 -0
  116. package/dist/daemon/main.d.ts.map +1 -0
  117. package/dist/daemon/main.js +29 -0
  118. package/dist/daemon/main.js.map +1 -0
  119. package/dist/daemon/orchestration-rpc.d.ts +19 -0
  120. package/dist/daemon/orchestration-rpc.d.ts.map +1 -0
  121. package/dist/daemon/orchestration-rpc.js +136 -0
  122. package/dist/daemon/orchestration-rpc.js.map +1 -0
  123. package/dist/files/download-token-store.d.ts +14 -0
  124. package/dist/files/download-token-store.d.ts.map +1 -0
  125. package/dist/files/download-token-store.js +33 -0
  126. package/dist/files/download-token-store.js.map +1 -0
  127. package/dist/files/file-explorer.d.ts +54 -0
  128. package/dist/files/file-explorer.d.ts.map +1 -0
  129. package/dist/files/file-explorer.js +182 -0
  130. package/dist/files/file-explorer.js.map +1 -0
  131. package/dist/files/file-transfer.d.ts +30 -0
  132. package/dist/files/file-transfer.d.ts.map +1 -0
  133. package/dist/files/file-transfer.js +132 -0
  134. package/dist/files/file-transfer.js.map +1 -0
  135. package/dist/files/index.d.ts +4 -0
  136. package/dist/files/index.d.ts.map +1 -0
  137. package/dist/files/index.js +5 -0
  138. package/dist/files/index.js.map +1 -0
  139. package/dist/http/host-allowlist.d.ts +15 -0
  140. package/dist/http/host-allowlist.d.ts.map +1 -0
  141. package/dist/http/host-allowlist.js +52 -0
  142. package/dist/http/host-allowlist.js.map +1 -0
  143. package/dist/http/http-server.d.ts +27 -0
  144. package/dist/http/http-server.d.ts.map +1 -0
  145. package/dist/http/http-server.js +76 -0
  146. package/dist/http/http-server.js.map +1 -0
  147. package/dist/http/index.d.ts +3 -0
  148. package/dist/http/index.d.ts.map +1 -0
  149. package/dist/http/index.js +4 -0
  150. package/dist/http/index.js.map +1 -0
  151. package/dist/index.d.ts +18 -0
  152. package/dist/index.d.ts.map +1 -0
  153. package/dist/index.js +35 -0
  154. package/dist/index.js.map +1 -0
  155. package/dist/logging/index.d.ts +2 -0
  156. package/dist/logging/index.d.ts.map +1 -0
  157. package/dist/logging/index.js +2 -0
  158. package/dist/logging/index.js.map +1 -0
  159. package/dist/logging/logger.d.ts +48 -0
  160. package/dist/logging/logger.d.ts.map +1 -0
  161. package/dist/logging/logger.js +53 -0
  162. package/dist/logging/logger.js.map +1 -0
  163. package/dist/orchestration/chat-service.d.ts +61 -0
  164. package/dist/orchestration/chat-service.d.ts.map +1 -0
  165. package/dist/orchestration/chat-service.js +156 -0
  166. package/dist/orchestration/chat-service.js.map +1 -0
  167. package/dist/orchestration/cron.d.ts +30 -0
  168. package/dist/orchestration/cron.d.ts.map +1 -0
  169. package/dist/orchestration/cron.js +136 -0
  170. package/dist/orchestration/cron.js.map +1 -0
  171. package/dist/orchestration/index.d.ts +5 -0
  172. package/dist/orchestration/index.d.ts.map +1 -0
  173. package/dist/orchestration/index.js +6 -0
  174. package/dist/orchestration/index.js.map +1 -0
  175. package/dist/orchestration/loop-service.d.ts +129 -0
  176. package/dist/orchestration/loop-service.d.ts.map +1 -0
  177. package/dist/orchestration/loop-service.js +234 -0
  178. package/dist/orchestration/loop-service.js.map +1 -0
  179. package/dist/orchestration/schedule-service.d.ts +65 -0
  180. package/dist/orchestration/schedule-service.d.ts.map +1 -0
  181. package/dist/orchestration/schedule-service.js +201 -0
  182. package/dist/orchestration/schedule-service.js.map +1 -0
  183. package/dist/persistence/atomic-store.d.ts +45 -0
  184. package/dist/persistence/atomic-store.d.ts.map +1 -0
  185. package/dist/persistence/atomic-store.js +92 -0
  186. package/dist/persistence/atomic-store.js.map +1 -0
  187. package/dist/persistence/entity-schemas.d.ts +1707 -0
  188. package/dist/persistence/entity-schemas.d.ts.map +1 -0
  189. package/dist/persistence/entity-schemas.js +250 -0
  190. package/dist/persistence/entity-schemas.js.map +1 -0
  191. package/dist/persistence/entity-stores.d.ts +46 -0
  192. package/dist/persistence/entity-stores.d.ts.map +1 -0
  193. package/dist/persistence/entity-stores.js +167 -0
  194. package/dist/persistence/entity-stores.js.map +1 -0
  195. package/dist/persistence/index.d.ts +4 -0
  196. package/dist/persistence/index.d.ts.map +1 -0
  197. package/dist/persistence/index.js +5 -0
  198. package/dist/persistence/index.js.map +1 -0
  199. package/dist/projects/checkout-diff-manager.d.ts +44 -0
  200. package/dist/projects/checkout-diff-manager.d.ts.map +1 -0
  201. package/dist/projects/checkout-diff-manager.js +82 -0
  202. package/dist/projects/checkout-diff-manager.js.map +1 -0
  203. package/dist/projects/git-checkout-rpc.d.ts +18 -0
  204. package/dist/projects/git-checkout-rpc.d.ts.map +1 -0
  205. package/dist/projects/git-checkout-rpc.js +57 -0
  206. package/dist/projects/git-checkout-rpc.js.map +1 -0
  207. package/dist/projects/git-detect.d.ts +21 -0
  208. package/dist/projects/git-detect.d.ts.map +1 -0
  209. package/dist/projects/git-detect.js +34 -0
  210. package/dist/projects/git-detect.js.map +1 -0
  211. package/dist/projects/git-operations.d.ts +67 -0
  212. package/dist/projects/git-operations.d.ts.map +1 -0
  213. package/dist/projects/git-operations.js +200 -0
  214. package/dist/projects/git-operations.js.map +1 -0
  215. package/dist/projects/github-service.d.ts +80 -0
  216. package/dist/projects/github-service.d.ts.map +1 -0
  217. package/dist/projects/github-service.js +172 -0
  218. package/dist/projects/github-service.js.map +1 -0
  219. package/dist/projects/index.d.ts +13 -0
  220. package/dist/projects/index.d.ts.map +1 -0
  221. package/dist/projects/index.js +19 -0
  222. package/dist/projects/index.js.map +1 -0
  223. package/dist/projects/open-project.d.ts +35 -0
  224. package/dist/projects/open-project.d.ts.map +1 -0
  225. package/dist/projects/open-project.js +106 -0
  226. package/dist/projects/open-project.js.map +1 -0
  227. package/dist/projects/reconciliation.d.ts +15 -0
  228. package/dist/projects/reconciliation.d.ts.map +1 -0
  229. package/dist/projects/reconciliation.js +63 -0
  230. package/dist/projects/reconciliation.js.map +1 -0
  231. package/dist/projects/status-projection.d.ts +33 -0
  232. package/dist/projects/status-projection.d.ts.map +1 -0
  233. package/dist/projects/status-projection.js +98 -0
  234. package/dist/projects/status-projection.js.map +1 -0
  235. package/dist/projects/workspace-activity.d.ts +28 -0
  236. package/dist/projects/workspace-activity.d.ts.map +1 -0
  237. package/dist/projects/workspace-activity.js +74 -0
  238. package/dist/projects/workspace-activity.js.map +1 -0
  239. package/dist/projects/workspace-git-service.d.ts +27 -0
  240. package/dist/projects/workspace-git-service.d.ts.map +1 -0
  241. package/dist/projects/workspace-git-service.js +60 -0
  242. package/dist/projects/workspace-git-service.js.map +1 -0
  243. package/dist/projects/workspace-registry.d.ts +59 -0
  244. package/dist/projects/workspace-registry.d.ts.map +1 -0
  245. package/dist/projects/workspace-registry.js +149 -0
  246. package/dist/projects/workspace-registry.js.map +1 -0
  247. package/dist/projects/worktree-service.d.ts +100 -0
  248. package/dist/projects/worktree-service.d.ts.map +1 -0
  249. package/dist/projects/worktree-service.js +216 -0
  250. package/dist/projects/worktree-service.js.map +1 -0
  251. package/dist/proxy/index.d.ts +4 -0
  252. package/dist/proxy/index.d.ts.map +1 -0
  253. package/dist/proxy/index.js +5 -0
  254. package/dist/proxy/index.js.map +1 -0
  255. package/dist/proxy/service-hostname.d.ts +21 -0
  256. package/dist/proxy/service-hostname.d.ts.map +1 -0
  257. package/dist/proxy/service-hostname.js +44 -0
  258. package/dist/proxy/service-hostname.js.map +1 -0
  259. package/dist/proxy/service-port-registry.d.ts +36 -0
  260. package/dist/proxy/service-port-registry.d.ts.map +1 -0
  261. package/dist/proxy/service-port-registry.js +55 -0
  262. package/dist/proxy/service-port-registry.js.map +1 -0
  263. package/dist/proxy/service-proxy.d.ts +34 -0
  264. package/dist/proxy/service-proxy.d.ts.map +1 -0
  265. package/dist/proxy/service-proxy.js +54 -0
  266. package/dist/proxy/service-proxy.js.map +1 -0
  267. package/dist/terminal/index.d.ts +4 -0
  268. package/dist/terminal/index.d.ts.map +1 -0
  269. package/dist/terminal/index.js +5 -0
  270. package/dist/terminal/index.js.map +1 -0
  271. package/dist/terminal/pty-backend.d.ts +44 -0
  272. package/dist/terminal/pty-backend.d.ts.map +1 -0
  273. package/dist/terminal/pty-backend.js +119 -0
  274. package/dist/terminal/pty-backend.js.map +1 -0
  275. package/dist/terminal/screen-buffer.d.ts +21 -0
  276. package/dist/terminal/screen-buffer.d.ts.map +1 -0
  277. package/dist/terminal/screen-buffer.js +55 -0
  278. package/dist/terminal/screen-buffer.js.map +1 -0
  279. package/dist/terminal/terminal-manager.d.ts +79 -0
  280. package/dist/terminal/terminal-manager.d.ts.map +1 -0
  281. package/dist/terminal/terminal-manager.js +174 -0
  282. package/dist/terminal/terminal-manager.js.map +1 -0
  283. package/dist/terminal/terminal-rpc.d.ts +20 -0
  284. package/dist/terminal/terminal-rpc.d.ts.map +1 -0
  285. package/dist/terminal/terminal-rpc.js +122 -0
  286. package/dist/terminal/terminal-rpc.js.map +1 -0
  287. package/dist/util/concurrency.d.ts +16 -0
  288. package/dist/util/concurrency.d.ts.map +1 -0
  289. package/dist/util/concurrency.js +23 -0
  290. package/dist/util/concurrency.js.map +1 -0
  291. package/dist/util/index.d.ts +2 -0
  292. package/dist/util/index.d.ts.map +1 -0
  293. package/dist/util/index.js +2 -0
  294. package/dist/util/index.js.map +1 -0
  295. package/dist/ws/capability-store.d.ts +11 -0
  296. package/dist/ws/capability-store.d.ts.map +1 -0
  297. package/dist/ws/capability-store.js +10 -0
  298. package/dist/ws/capability-store.js.map +1 -0
  299. package/dist/ws/index.d.ts +5 -0
  300. package/dist/ws/index.d.ts.map +1 -0
  301. package/dist/ws/index.js +6 -0
  302. package/dist/ws/index.js.map +1 -0
  303. package/dist/ws/router.d.ts +34 -0
  304. package/dist/ws/router.d.ts.map +1 -0
  305. package/dist/ws/router.js +97 -0
  306. package/dist/ws/router.js.map +1 -0
  307. package/dist/ws/session.d.ts +28 -0
  308. package/dist/ws/session.d.ts.map +1 -0
  309. package/dist/ws/session.js +36 -0
  310. package/dist/ws/session.js.map +1 -0
  311. package/dist/ws/ws-server.d.ts +41 -0
  312. package/dist/ws/ws-server.d.ts.map +1 -0
  313. package/dist/ws/ws-server.js +104 -0
  314. package/dist/ws/ws-server.js.map +1 -0
  315. package/package.json +48 -0
@@ -0,0 +1,27 @@
1
+ import { MOCK_CAPABILITIES } from "./providers/mock/mock-provider.js";
2
+ import { PI_CAPABILITIES } from "./providers/pi/agent.js";
3
+ /**
4
+ * Provider manifest (features/agent-providers.md § Registration surface). UI scaffolding only —
5
+ * actual models/modes/features are discovered at runtime. Modes carry an `icon` + `colorTier`.
6
+ */
7
+ export const PROVIDER_MANIFEST = {
8
+ pi: {
9
+ id: "pi",
10
+ label: "Pi",
11
+ description: "The Pi coding agent (pi --mode rpc)",
12
+ capabilities: PI_CAPABILITIES,
13
+ modes: [
14
+ { id: "plan", label: "Plan", icon: "Compass", colorTier: "planning" },
15
+ { id: "default", label: "Default", icon: "Bot", colorTier: "moderate" },
16
+ { id: "full-access", label: "Full access", icon: "ShieldAlert", colorTier: "dangerous" },
17
+ ],
18
+ },
19
+ mock: {
20
+ id: "mock",
21
+ label: "Mock",
22
+ description: "In-process test provider (dev/test only)",
23
+ capabilities: MOCK_CAPABILITIES,
24
+ modes: [{ id: "default", label: "Default", icon: "Bot", colorTier: "safe" }],
25
+ },
26
+ };
27
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/agent/manifest.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAuC;IACnE,EAAE,EAAE;QACF,EAAE,EAAE,IAAI;QACR,KAAK,EAAE,IAAI;QACX,WAAW,EAAE,qCAAqC;QAClD,YAAY,EAAE,eAAe;QAC7B,KAAK,EAAE;YACL,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE;YACrE,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE;YACvE,EAAE,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE;SACzF;KACF;IACD,IAAI,EAAE;QACJ,EAAE,EAAE,MAAM;QACV,KAAK,EAAE,MAAM;QACb,WAAW,EAAE,0CAA0C;QACvD,YAAY,EAAE,iBAAiB;QAC/B,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;KAC7E;CACF,CAAC"}
@@ -0,0 +1,100 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * Daemon MCP server (features/mcp-server.md). Hosts orchestration tools at `/mcp/agents` so agents
4
+ * can control other agents + the daemon. The tool set mirrors the WS/CLI control plane. When
5
+ * `daemon.mcp.injectIntoAgents` is enabled, a per-agent `--mcp-config` is generated for Pi (adapter
6
+ * OAuth disabled); user/project MCP files are never touched.
7
+ *
8
+ * The transport (HTTP server) is wired in bootstrap; this module owns the tool registry, the
9
+ * `create_agent` semantics, and the injection-config generation, all injectable for tests.
10
+ */
11
+ export declare const MCP_ENDPOINT_PATH = "/mcp/agents";
12
+ export declare const MCP_SERVER_KEY = "pi-studio-agents";
13
+ export interface McpToolResult {
14
+ ok: boolean;
15
+ [key: string]: unknown;
16
+ }
17
+ export interface McpToolContext {
18
+ /** The agent invoking the tool (the "parent"), when the call originates inside an agent. */
19
+ callerAgentId?: string;
20
+ }
21
+ export type McpToolHandler<A> = (args: A, ctx: McpToolContext) => Promise<McpToolResult> | McpToolResult;
22
+ /** Backend the orchestration tools route to (AgentManager / permission / provider services). */
23
+ export interface McpBackend {
24
+ /** Create an async child agent. Returns its id. */
25
+ createAgent(input: {
26
+ config: Record<string, unknown>;
27
+ labels: Record<string, string>;
28
+ initialPrompt?: string;
29
+ notifyOnFinish: boolean;
30
+ autoArchive?: boolean;
31
+ }): Promise<{
32
+ agentId: string;
33
+ }>;
34
+ updateAgent?(agentId: string, patch: Record<string, unknown>): Promise<void>;
35
+ sendPrompt(agentId: string, prompt: string): Promise<void>;
36
+ getStatus(agentId: string): {
37
+ status: string;
38
+ title?: string;
39
+ } | undefined;
40
+ getActivity?(agentId: string): unknown;
41
+ listAgents(): Array<{
42
+ agentId: string;
43
+ status: string;
44
+ title?: string;
45
+ }>;
46
+ setMode?(agentId: string, modeId: string): Promise<void>;
47
+ /** Resolve when the agent reaches a terminal turn; resolve early/late is the backend's concern. */
48
+ waitForAgent(agentId: string, timeoutMs: number): Promise<{
49
+ status: string;
50
+ timedOut: boolean;
51
+ }>;
52
+ cancelAgent?(agentId: string): Promise<void>;
53
+ killAgent?(agentId: string): Promise<void>;
54
+ archiveAgent(agentId: string): Promise<void>;
55
+ listPendingPermissions(agentId?: string): Array<{
56
+ requestId: string;
57
+ agentId: string;
58
+ toolName?: string;
59
+ }>;
60
+ respondToPermission(requestId: string, response: unknown): {
61
+ resolved: boolean;
62
+ };
63
+ listProviders(): unknown;
64
+ inspectProvider?(providerId: string): unknown;
65
+ listModels(providerId: string): unknown;
66
+ }
67
+ export interface McpServerDeps {
68
+ backend: McpBackend;
69
+ /** Whether the MCP server is enabled (`daemon.mcp.enabled`/present). */
70
+ enabled: boolean;
71
+ /** Whether to inject the server into agents (`daemon.mcp.injectIntoAgents`). */
72
+ injectIntoAgents: boolean;
73
+ /** Daemon home; per-agent mcp configs live under `<home>/mcp/`. */
74
+ home: string;
75
+ /** Base URL of the local endpoint (host:port). */
76
+ baseUrl?: string;
77
+ defaultWaitTimeoutMs?: number;
78
+ }
79
+ export declare class McpServer {
80
+ private readonly deps;
81
+ private readonly tools;
82
+ private readonly defaultWaitTimeoutMs;
83
+ constructor(deps: McpServerDeps);
84
+ get enabled(): boolean;
85
+ /** Tool names currently exposed (empty when disabled). */
86
+ toolNames(): string[];
87
+ /** Register an extension tool (schedule/chat/loop/terminal/worktree tasks attach theirs here). */
88
+ registerTool<A>(name: string, schema: z.ZodType<A>, handler: McpToolHandler<A>): void;
89
+ /** Validate args + dispatch a tool call. */
90
+ callTool(name: string, rawArgs: unknown, ctx?: McpToolContext): Promise<McpToolResult>;
91
+ /** The `--mcp-config` object injected into Pi for a per-agent local server (OAuth disabled). */
92
+ injectionConfig(): Record<string, unknown> | null;
93
+ /**
94
+ * Write a per-agent `--mcp-config` under `<home>/mcp/agent-<id>.json` (never user/project files).
95
+ * Returns the path, or null when injection is disabled.
96
+ */
97
+ writeInjectionConfig(agentId: string): Promise<string | null>;
98
+ private registerCoreTools;
99
+ }
100
+ //# sourceMappingURL=mcp-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../../src/agent/mcp-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,163 @@
1
+ import { mkdir, writeFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { z } from "zod";
4
+ import { PARENT_AGENT_ID_LABEL } from "./agent-manager.js";
5
+ /**
6
+ * Daemon MCP server (features/mcp-server.md). Hosts orchestration tools at `/mcp/agents` so agents
7
+ * can control other agents + the daemon. The tool set mirrors the WS/CLI control plane. When
8
+ * `daemon.mcp.injectIntoAgents` is enabled, a per-agent `--mcp-config` is generated for Pi (adapter
9
+ * OAuth disabled); user/project MCP files are never touched.
10
+ *
11
+ * The transport (HTTP server) is wired in bootstrap; this module owns the tool registry, the
12
+ * `create_agent` semantics, and the injection-config generation, all injectable for tests.
13
+ */
14
+ export const MCP_ENDPOINT_PATH = "/mcp/agents";
15
+ export const MCP_SERVER_KEY = "pi-studio-agents";
16
+ export class McpServer {
17
+ deps;
18
+ tools = new Map();
19
+ defaultWaitTimeoutMs;
20
+ constructor(deps) {
21
+ this.deps = deps;
22
+ this.defaultWaitTimeoutMs = deps.defaultWaitTimeoutMs ?? 5 * 60_000;
23
+ if (deps.enabled)
24
+ this.registerCoreTools();
25
+ }
26
+ get enabled() {
27
+ return this.deps.enabled;
28
+ }
29
+ /** Tool names currently exposed (empty when disabled). */
30
+ toolNames() {
31
+ return [...this.tools.keys()].toSorted();
32
+ }
33
+ /** Register an extension tool (schedule/chat/loop/terminal/worktree tasks attach theirs here). */
34
+ registerTool(name, schema, handler) {
35
+ if (!this.deps.enabled)
36
+ return;
37
+ this.tools.set(name, { schema, handler: handler });
38
+ }
39
+ /** Validate args + dispatch a tool call. */
40
+ async callTool(name, rawArgs, ctx = {}) {
41
+ if (!this.deps.enabled)
42
+ return { ok: false, error: "mcp_disabled" };
43
+ const tool = this.tools.get(name);
44
+ if (!tool)
45
+ return { ok: false, error: `unknown_tool:${name}` };
46
+ const parsed = tool.schema.safeParse(rawArgs ?? {});
47
+ if (!parsed.success)
48
+ return { ok: false, error: "invalid_args", issues: parsed.error.issues };
49
+ return tool.handler(parsed.data, ctx);
50
+ }
51
+ // ─── Injection ─────────────────────────────────────────────────────────────
52
+ /** The `--mcp-config` object injected into Pi for a per-agent local server (OAuth disabled). */
53
+ injectionConfig() {
54
+ if (!this.deps.enabled || !this.deps.injectIntoAgents)
55
+ return null;
56
+ const url = `${this.deps.baseUrl ?? "http://127.0.0.1:0"}${MCP_ENDPOINT_PATH}`;
57
+ return {
58
+ mcpServers: {
59
+ [MCP_SERVER_KEY]: { type: "http", url, auth: false, oauth: false },
60
+ },
61
+ };
62
+ }
63
+ /**
64
+ * Write a per-agent `--mcp-config` under `<home>/mcp/agent-<id>.json` (never user/project files).
65
+ * Returns the path, or null when injection is disabled.
66
+ */
67
+ async writeInjectionConfig(agentId) {
68
+ const config = this.injectionConfig();
69
+ if (!config)
70
+ return null;
71
+ const dir = join(this.deps.home, "mcp");
72
+ await mkdir(dir, { recursive: true });
73
+ const path = join(dir, `agent-${agentId}.json`);
74
+ await writeFile(path, JSON.stringify(config, null, 2));
75
+ return path;
76
+ }
77
+ // ─── Core tools ──────────────────────────────────────────────────────────────
78
+ registerCoreTools() {
79
+ const b = this.deps.backend;
80
+ // create_agent — always async (agent-scoped); parent label unless detached; notifyOnFinish=true.
81
+ this.registerTool("create_agent", z.object({
82
+ config: z.record(z.unknown()).default({}),
83
+ prompt: z.string().optional(),
84
+ detached: z.boolean().optional(),
85
+ notifyOnFinish: z.boolean().optional(),
86
+ autoArchive: z.boolean().optional(),
87
+ labels: z.record(z.string()).optional(),
88
+ }), async (args, ctx) => {
89
+ const labels = { ...args.labels };
90
+ if (!args.detached && ctx.callerAgentId) {
91
+ labels[PARENT_AGENT_ID_LABEL] = ctx.callerAgentId;
92
+ }
93
+ const { agentId } = await b.createAgent({
94
+ config: args.config ?? {},
95
+ labels,
96
+ initialPrompt: args.prompt,
97
+ notifyOnFinish: args.notifyOnFinish ?? true,
98
+ autoArchive: args.autoArchive,
99
+ });
100
+ return { ok: true, agentId, detached: Boolean(args.detached) };
101
+ });
102
+ this.registerTool("wait_for_agent", z.object({ agentId: z.string(), timeoutMs: z.number().int().positive().optional() }), async (args) => {
103
+ const result = await b.waitForAgent(args.agentId, args.timeoutMs ?? this.defaultWaitTimeoutMs);
104
+ return { ok: true, ...result };
105
+ });
106
+ this.registerTool("send_agent_prompt", z.object({ agentId: z.string(), prompt: z.string() }), async (args) => {
107
+ await b.sendPrompt(args.agentId, args.prompt);
108
+ return { ok: true };
109
+ });
110
+ this.registerTool("get_agent_status", z.object({ agentId: z.string() }), (args) => {
111
+ const status = b.getStatus(args.agentId);
112
+ return status ? { ok: true, ...status } : { ok: false, error: "unknown_agent" };
113
+ });
114
+ this.registerTool("get_agent_activity", z.object({ agentId: z.string() }), (args) => ({
115
+ ok: true,
116
+ activity: b.getActivity?.(args.agentId) ?? null,
117
+ }));
118
+ this.registerTool("list_agents", z.object({}).passthrough(), () => ({
119
+ ok: true,
120
+ agents: b.listAgents(),
121
+ }));
122
+ this.registerTool("update_agent", z.object({ agentId: z.string(), patch: z.record(z.unknown()).default({}) }), async (args) => {
123
+ await b.updateAgent?.(args.agentId, args.patch ?? {});
124
+ return { ok: true };
125
+ });
126
+ this.registerTool("set_agent_mode", z.object({ agentId: z.string(), modeId: z.string() }), async (args) => {
127
+ await b.setMode?.(args.agentId, args.modeId);
128
+ return { ok: true };
129
+ });
130
+ this.registerTool("cancel_agent", z.object({ agentId: z.string() }), async (args) => {
131
+ await b.cancelAgent?.(args.agentId);
132
+ return { ok: true };
133
+ });
134
+ this.registerTool("kill_agent", z.object({ agentId: z.string() }), async (args) => {
135
+ await b.killAgent?.(args.agentId);
136
+ return { ok: true };
137
+ });
138
+ this.registerTool("archive_agent", z.object({ agentId: z.string() }), async (args) => {
139
+ await b.archiveAgent(args.agentId);
140
+ return { ok: true };
141
+ });
142
+ // Permissions.
143
+ this.registerTool("list_pending_permissions", z.object({ agentId: z.string().optional() }), (args) => ({ ok: true, permissions: b.listPendingPermissions(args.agentId) }));
144
+ this.registerTool("respond_to_permission", z.object({ requestId: z.string(), response: z.unknown() }), (args) => {
145
+ const result = b.respondToPermission(args.requestId, args.response);
146
+ return result.resolved ? { ok: true } : { ok: false, error: "unknown_permission" };
147
+ });
148
+ // Providers / models.
149
+ this.registerTool("list_providers", z.object({}).passthrough(), () => ({
150
+ ok: true,
151
+ providers: b.listProviders(),
152
+ }));
153
+ this.registerTool("inspect_provider", z.object({ providerId: z.string() }), (args) => ({
154
+ ok: true,
155
+ provider: b.inspectProvider?.(args.providerId) ?? null,
156
+ }));
157
+ this.registerTool("list_models", z.object({ providerId: z.string() }), (args) => ({
158
+ ok: true,
159
+ models: b.listModels(args.providerId),
160
+ }));
161
+ }
162
+ }
163
+ //# sourceMappingURL=mcp-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../../src/agent/mcp-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ import type { Session } from "../ws/session.js";
2
+ import type { HandlerRegistry } from "../ws/router.js";
3
+ import type { AgentManager } from "./agent-manager.js";
4
+ /**
5
+ * Tool-call permission flow + question-permission bridge
6
+ * (features/tool-permissions.md § Flow messages / § Behavior / § Question-permission bridge).
7
+ *
8
+ * When an agent's mode requires approval:
9
+ * 1. A tool call creates an `AgentPermissionRequest`, flags the agent as awaiting-input, and
10
+ * broadcasts `agent_permission_request` to all clients.
11
+ * 2. The turn WAITS until `resolvePermission(requestId, response)` is called.
12
+ * 3. The first resolution wins; `agent_permission_resolved` is broadcast to all clients.
13
+ * 4. Full-access modes (`colorTier:"dangerous"`) emit no requests.
14
+ *
15
+ * Question bridge: Pi `select`/`input`/`editor`/`confirm` surface as question permissions. A
16
+ * `select` with `allowComment:true` is ONE combined question — answer the `select`, then
17
+ * auto-answer the follow-up optional `input` (supplied comment or empty string).
18
+ */
19
+ export interface AgentPermissionRequestRecord {
20
+ requestId: string;
21
+ agentId: string;
22
+ toolName?: string;
23
+ action?: unknown;
24
+ responses?: string[];
25
+ /** Question-bridge kind. */
26
+ questionKind?: "select" | "input" | "editor" | "confirm";
27
+ allowComment?: boolean;
28
+ }
29
+ export type ResolutionResponse = string | Record<string, unknown>;
30
+ export interface LivePermission extends AgentPermissionRequestRecord {
31
+ resolve: (response: ResolutionResponse) => void;
32
+ }
33
+ /**
34
+ * In-memory permission state (not separately persisted — only broadcast-live per scope).
35
+ * Keyed by `requestId`.
36
+ */
37
+ export declare class PermissionStore {
38
+ private readonly pending;
39
+ add(req: LivePermission): void;
40
+ get(requestId: string): LivePermission | undefined;
41
+ remove(requestId: string): void;
42
+ listForAgent(agentId: string): LivePermission[];
43
+ }
44
+ export declare const globalPermissionStore: PermissionStore;
45
+ export interface PermissionServiceDeps {
46
+ manager: AgentManager;
47
+ broadcast: (sessions: Iterable<Session>, message: unknown) => void;
48
+ store?: PermissionStore;
49
+ }
50
+ export declare class PermissionService {
51
+ private readonly deps;
52
+ private readonly store;
53
+ constructor(deps: PermissionServiceDeps);
54
+ registerHandlers(registry: HandlerRegistry, getActiveSessions: () => Iterable<Session>): void;
55
+ private broadcastAll;
56
+ /**
57
+ * Create a permission request, broadcast it, and wait for resolution. Returns the decision.
58
+ * Throws if interrupted (the promise is rejected externally).
59
+ */
60
+ requestPermission(req: Omit<AgentPermissionRequestRecord, "requestId">, getSessions: () => Iterable<Session>): {
61
+ requestId: string;
62
+ decision: Promise<ResolutionResponse>;
63
+ };
64
+ /**
65
+ * Handle a respond-to-permission RPC. First resolution wins; subsequent calls are no-ops.
66
+ */
67
+ handleRespond(msg: Record<string, unknown>, getSessions: () => Iterable<Session>): Record<string, unknown>;
68
+ /** Cancel all pending permissions for an agent (called on interrupt). */
69
+ cancelPending(agentId: string, getSessions: () => Iterable<Session>): void;
70
+ }
71
+ //# sourceMappingURL=permissions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/agent/permissions.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD;;;;;;;;;;;;;;GAcG;AAEH,MAAM,WAAW,4BAA4B;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,4BAA4B;IAC5B,YAAY,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;IACzD,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAElE,MAAM,WAAW,cAAe,SAAQ,4BAA4B;IAClE,OAAO,EAAE,CAAC,QAAQ,EAAE,kBAAkB,KAAK,IAAI,CAAC;CACjD;AAED;;;GAGG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqC;IAE7D,GAAG,CAAC,GAAG,EAAE,cAAc,GAAG,IAAI;IAI9B,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAIlD,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAI/B,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,EAAE;CAGhD;AAED,eAAO,MAAM,qBAAqB,iBAAwB,CAAC;AAE3D,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,YAAY,CAAC;IACtB,SAAS,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACnE,KAAK,CAAC,EAAE,eAAe,CAAC;CACzB;AAED,qBAAa,iBAAiB;IAGhB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkB;gBAEX,IAAI,EAAE,qBAAqB;IAIxD,gBAAgB,CAAC,QAAQ,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC,OAAO,CAAC,GAAG,IAAI;IAO7F,OAAO,CAAC,YAAY;IAIpB;;;OAGG;IACH,iBAAiB,CACf,GAAG,EAAE,IAAI,CAAC,4BAA4B,EAAE,WAAW,CAAC,EACpD,WAAW,EAAE,MAAM,QAAQ,CAAC,OAAO,CAAC,GACnC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAA;KAAE;IAsB/D;;OAEG;IACH,aAAa,CACX,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,WAAW,EAAE,MAAM,QAAQ,CAAC,OAAO,CAAC,GACnC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAyD1B,yEAAyE;IACzE,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC,OAAO,CAAC,GAAG,IAAI;CAe3E"}
@@ -0,0 +1,132 @@
1
+ import { randomUUID } from "node:crypto";
2
+ /**
3
+ * In-memory permission state (not separately persisted — only broadcast-live per scope).
4
+ * Keyed by `requestId`.
5
+ */
6
+ export class PermissionStore {
7
+ pending = new Map();
8
+ add(req) {
9
+ this.pending.set(req.requestId, req);
10
+ }
11
+ get(requestId) {
12
+ return this.pending.get(requestId);
13
+ }
14
+ remove(requestId) {
15
+ this.pending.delete(requestId);
16
+ }
17
+ listForAgent(agentId) {
18
+ return [...this.pending.values()].filter((p) => p.agentId === agentId);
19
+ }
20
+ }
21
+ export const globalPermissionStore = new PermissionStore();
22
+ export class PermissionService {
23
+ deps;
24
+ store;
25
+ constructor(deps) {
26
+ this.deps = deps;
27
+ this.store = deps.store ?? globalPermissionStore;
28
+ }
29
+ registerHandlers(registry, getActiveSessions) {
30
+ registry.register("agent.permission.respond.request", (ctx) => this.handleRespond(ctx.message, getActiveSessions));
31
+ registry.registerAlias("respond_to_permission", "agent.permission.respond.request");
32
+ }
33
+ broadcastAll(sessions, msg) {
34
+ this.deps.broadcast(sessions, msg);
35
+ }
36
+ /**
37
+ * Create a permission request, broadcast it, and wait for resolution. Returns the decision.
38
+ * Throws if interrupted (the promise is rejected externally).
39
+ */
40
+ requestPermission(req, getSessions) {
41
+ const requestId = randomUUID();
42
+ let resolve;
43
+ const decision = new Promise((res) => {
44
+ resolve = res;
45
+ });
46
+ this.store.add({ ...req, requestId, resolve });
47
+ this.broadcastAll(getSessions(), {
48
+ type: "session",
49
+ message: {
50
+ type: "agent_permission_request",
51
+ requestId,
52
+ agentId: req.agentId,
53
+ toolName: req.toolName,
54
+ action: req.action,
55
+ responses: req.responses ?? ["allow", "deny"],
56
+ },
57
+ });
58
+ return { requestId, decision };
59
+ }
60
+ /**
61
+ * Handle a respond-to-permission RPC. First resolution wins; subsequent calls are no-ops.
62
+ */
63
+ handleRespond(msg, getSessions) {
64
+ const permId = msg.permissionRequestId;
65
+ const response = msg.response;
66
+ const pending = this.store.get(permId);
67
+ if (!pending) {
68
+ // Already resolved or unknown.
69
+ return {
70
+ type: "agent.permission.respond.response",
71
+ requestId: msg.requestId,
72
+ payload: { resolved: false },
73
+ };
74
+ }
75
+ this.store.remove(permId);
76
+ pending.resolve(response);
77
+ this.broadcastAll(getSessions(), {
78
+ type: "session",
79
+ message: {
80
+ type: "agent_permission_resolved",
81
+ requestId: permId,
82
+ agentId: pending.agentId,
83
+ decision: typeof response === "string" ? response : "allow",
84
+ },
85
+ });
86
+ // Question bridge: auto-answer a follow-up optional comment input.
87
+ if (pending.allowComment) {
88
+ // The Pi adapter will surface the follow-up `input` as another question permission;
89
+ // the comment (if any) is embedded in the response, or we auto-answer with empty string.
90
+ const comment = typeof response === "object" && "comment" in response ? response.comment : "";
91
+ // Find and resolve any pending follow-up input for the same agent.
92
+ const followUp = this.store
93
+ .listForAgent(pending.agentId)
94
+ .find((p) => p.questionKind === "input");
95
+ if (followUp) {
96
+ this.store.remove(followUp.requestId);
97
+ followUp.resolve(comment);
98
+ this.broadcastAll(getSessions(), {
99
+ type: "session",
100
+ message: {
101
+ type: "agent_permission_resolved",
102
+ requestId: followUp.requestId,
103
+ agentId: pending.agentId,
104
+ decision: "auto",
105
+ },
106
+ });
107
+ }
108
+ }
109
+ return {
110
+ type: "agent.permission.respond.response",
111
+ requestId: msg.requestId,
112
+ payload: { resolved: true },
113
+ };
114
+ }
115
+ /** Cancel all pending permissions for an agent (called on interrupt). */
116
+ cancelPending(agentId, getSessions) {
117
+ for (const pending of this.store.listForAgent(agentId)) {
118
+ this.store.remove(pending.requestId);
119
+ pending.resolve("canceled");
120
+ this.broadcastAll(getSessions(), {
121
+ type: "session",
122
+ message: {
123
+ type: "agent_permission_resolved",
124
+ requestId: pending.requestId,
125
+ agentId,
126
+ decision: "canceled",
127
+ },
128
+ });
129
+ }
130
+ }
131
+ }
132
+ //# sourceMappingURL=permissions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/agent/permissions.ts"],"names":[],"mappings":"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"}