@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,28 @@
1
+ /**
2
+ * Workspace activity bucket aggregation (features/projects-workspaces.md § Workspace activity bucket;
3
+ * architecture/agent-lifecycle.md § Lifecycle status semantics).
4
+ *
5
+ * Workspace status is an aggregate signal — NOT an agent's literal status:
6
+ * - Root agents contribute their own bucket to their workspace (by cwd).
7
+ * - A running subagent escalates `running` to its ROOT PARENT's workspace, not its own cwd.
8
+ * - Non-running subagent attention/error states stay in the parent's track and do NOT escalate the
9
+ * workspace bucket.
10
+ */
11
+ export type WorkspaceBucket = "running" | "error" | "attention" | "idle" | "closed" | "none";
12
+ export interface AgentActivityInput {
13
+ id: string;
14
+ cwd: string;
15
+ /** Literal agent status. */
16
+ status: "initializing" | "idle" | "running" | "error" | "closed";
17
+ /** Root parent has `null`; a subagent points at its (possibly transitive) parent. */
18
+ parentAgentId: string | null;
19
+ /** Root agents may flag a non-running attention state (permission/error needing the user). */
20
+ needsAttention?: boolean;
21
+ }
22
+ /** Resolve an agent's root ancestor by walking parent links (cycle-safe). */
23
+ export declare function resolveRoot(agentId: string, byId: Map<string, AgentActivityInput>): AgentActivityInput | undefined;
24
+ /**
25
+ * Aggregate per-workspace activity buckets keyed by workspace cwd.
26
+ */
27
+ export declare function aggregateWorkspaceActivity(agents: AgentActivityInput[]): Map<string, WorkspaceBucket>;
28
+ //# sourceMappingURL=workspace-activity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-activity.d.ts","sourceRoot":"","sources":["../../src/projects/workspace-activity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,OAAO,GAAG,WAAW,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE7F,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,4BAA4B;IAC5B,MAAM,EAAE,cAAc,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;IACjE,qFAAqF;IACrF,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,8FAA8F;IAC9F,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AA2BD,6EAA6E;AAC7E,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,GACpC,kBAAkB,GAAG,SAAS,CAUhC;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,kBAAkB,EAAE,GAC3B,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAwB9B"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Workspace activity bucket aggregation (features/projects-workspaces.md § Workspace activity bucket;
3
+ * architecture/agent-lifecycle.md § Lifecycle status semantics).
4
+ *
5
+ * Workspace status is an aggregate signal — NOT an agent's literal status:
6
+ * - Root agents contribute their own bucket to their workspace (by cwd).
7
+ * - A running subagent escalates `running` to its ROOT PARENT's workspace, not its own cwd.
8
+ * - Non-running subagent attention/error states stay in the parent's track and do NOT escalate the
9
+ * workspace bucket.
10
+ */
11
+ const PRIORITY = {
12
+ running: 5,
13
+ error: 4,
14
+ attention: 3,
15
+ idle: 2,
16
+ closed: 1,
17
+ none: 0,
18
+ };
19
+ function statusBucket(status, needsAttention) {
20
+ if (status === "running")
21
+ return "running";
22
+ if (status === "error")
23
+ return "error";
24
+ if (needsAttention)
25
+ return "attention";
26
+ if (status === "closed")
27
+ return "closed";
28
+ // initializing folds into idle for the workspace signal.
29
+ return "idle";
30
+ }
31
+ function higher(a, b) {
32
+ return PRIORITY[a] >= PRIORITY[b] ? a : b;
33
+ }
34
+ /** Resolve an agent's root ancestor by walking parent links (cycle-safe). */
35
+ export function resolveRoot(agentId, byId) {
36
+ let current = byId.get(agentId);
37
+ const seen = new Set();
38
+ while (current && current.parentAgentId && !seen.has(current.id)) {
39
+ seen.add(current.id);
40
+ const parent = byId.get(current.parentAgentId);
41
+ if (!parent)
42
+ break;
43
+ current = parent;
44
+ }
45
+ return current;
46
+ }
47
+ /**
48
+ * Aggregate per-workspace activity buckets keyed by workspace cwd.
49
+ */
50
+ export function aggregateWorkspaceActivity(agents) {
51
+ const byId = new Map(agents.map((a) => [a.id, a]));
52
+ const buckets = new Map();
53
+ const contribute = (cwd, bucket) => {
54
+ if (bucket === "none")
55
+ return;
56
+ buckets.set(cwd, higher(buckets.get(cwd) ?? "none", bucket));
57
+ };
58
+ for (const agent of agents) {
59
+ const isRoot = agent.parentAgentId === null;
60
+ if (isRoot) {
61
+ contribute(agent.cwd, statusBucket(agent.status, agent.needsAttention));
62
+ continue;
63
+ }
64
+ // Subagent: ONLY a running state escalates, and it escalates to the root parent's workspace.
65
+ if (agent.status === "running") {
66
+ const root = resolveRoot(agent.id, byId);
67
+ if (root)
68
+ contribute(root.cwd, "running");
69
+ }
70
+ // Non-running subagent attention/error stays in the parent's track — no workspace escalation.
71
+ }
72
+ return buckets;
73
+ }
74
+ //# sourceMappingURL=workspace-activity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-activity.js","sourceRoot":"","sources":["../../src/projects/workspace-activity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAeH,MAAM,QAAQ,GAAoC;IAChD,OAAO,EAAE,CAAC;IACV,KAAK,EAAE,CAAC;IACR,SAAS,EAAE,CAAC;IACZ,IAAI,EAAE,CAAC;IACP,MAAM,EAAE,CAAC;IACT,IAAI,EAAE,CAAC;CACR,CAAC;AAEF,SAAS,YAAY,CACnB,MAAoC,EACpC,cAAwB;IAExB,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC3C,IAAI,MAAM,KAAK,OAAO;QAAE,OAAO,OAAO,CAAC;IACvC,IAAI,cAAc;QAAE,OAAO,WAAW,CAAC;IACvC,IAAI,MAAM,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IACzC,yDAAyD;IACzD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,MAAM,CAAC,CAAkB,EAAE,CAAkB;IACpD,OAAO,QAAQ,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,WAAW,CACzB,OAAe,EACf,IAAqC;IAErC,IAAI,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,OAAO,OAAO,IAAI,OAAO,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;QACjE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACrB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM;YAAE,MAAM;QACnB,OAAO,GAAG,MAAM,CAAC;IACnB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,0BAA0B,CACxC,MAA4B;IAE5B,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,IAAI,GAAG,EAA2B,CAAC;IAEnD,MAAM,UAAU,GAAG,CAAC,GAAW,EAAE,MAAuB,EAAQ,EAAE;QAChE,IAAI,MAAM,KAAK,MAAM;YAAE,OAAO;QAC9B,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC/D,CAAC,CAAC;IAEF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,KAAK,IAAI,CAAC;QAC5C,IAAI,MAAM,EAAE,CAAC;YACX,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,YAAY,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;YACxE,SAAS;QACX,CAAC;QACD,6FAA6F;QAC7F,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YACzC,IAAI,IAAI;gBAAE,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC5C,CAAC;QACD,8FAA8F;IAChG,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { type GitRunner } from "./git-detect.js";
2
+ import { type CheckoutStatusProjection } from "./status-projection.js";
3
+ /**
4
+ * Workspace git service: live status projections streamed as `checkout_status_update`
5
+ * (features/git-checkout.md § Status & diff). Recomputation is change-driven (a filesystem watcher
6
+ * calls `refresh()`), never polled. `CheckoutRefreshRequest` is gated by `features.checkoutRefresh`.
7
+ */
8
+ export type StatusListener = (projection: CheckoutStatusProjection) => void;
9
+ export declare class WorkspaceGitService {
10
+ private readonly gitRunner;
11
+ private readonly watched;
12
+ constructor(gitRunner?: GitRunner);
13
+ /** One-shot status read for a cwd. */
14
+ getStatus(cwd: string): Promise<CheckoutStatusProjection>;
15
+ /**
16
+ * Subscribe to live status for `cwd`. Emits the current projection immediately, then again on each
17
+ * `refresh(cwd)` that yields a *changed* projection. Returns an unsubscribe fn.
18
+ */
19
+ subscribe(cwd: string, listener: StatusListener): () => void;
20
+ /**
21
+ * Recompute status for `cwd` and notify listeners only when the projection changed since the last
22
+ * emit (dedupe — no spurious updates). Returns true when an update was broadcast.
23
+ */
24
+ refresh(cwd: string): Promise<boolean>;
25
+ private emit;
26
+ }
27
+ //# sourceMappingURL=workspace-git-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-git-service.d.ts","sourceRoot":"","sources":["../../src/projects/workspace-git-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,KAAK,wBAAwB,EAAiB,MAAM,wBAAwB,CAAC;AAEtF;;;;GAIG;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,UAAU,EAAE,wBAAwB,KAAK,IAAI,CAAC;AAO5E,qBAAa,mBAAmB;IAGlB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAFtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA8B;gBAEzB,SAAS,GAAE,SAA4B;IAEpE,sCAAsC;IACtC,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAIzD;;;OAGG;IACH,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,MAAM,IAAI;IAiB5D;;;OAGG;IACG,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;YAW9B,IAAI;CAMnB"}
@@ -0,0 +1,60 @@
1
+ import { defaultGitRunner } from "./git-detect.js";
2
+ import { projectStatus } from "./status-projection.js";
3
+ export class WorkspaceGitService {
4
+ gitRunner;
5
+ watched = new Map();
6
+ constructor(gitRunner = defaultGitRunner) {
7
+ this.gitRunner = gitRunner;
8
+ }
9
+ /** One-shot status read for a cwd. */
10
+ getStatus(cwd) {
11
+ return projectStatus(cwd, this.gitRunner);
12
+ }
13
+ /**
14
+ * Subscribe to live status for `cwd`. Emits the current projection immediately, then again on each
15
+ * `refresh(cwd)` that yields a *changed* projection. Returns an unsubscribe fn.
16
+ */
17
+ subscribe(cwd, listener) {
18
+ let entry = this.watched.get(cwd);
19
+ if (!entry) {
20
+ entry = { listeners: new Set(), last: null };
21
+ this.watched.set(cwd, entry);
22
+ }
23
+ entry.listeners.add(listener);
24
+ // Emit current state immediately (snapshot on subscribe).
25
+ void this.emit(cwd, listener);
26
+ return () => {
27
+ const e = this.watched.get(cwd);
28
+ if (!e)
29
+ return;
30
+ e.listeners.delete(listener);
31
+ if (e.listeners.size === 0)
32
+ this.watched.delete(cwd);
33
+ };
34
+ }
35
+ /**
36
+ * Recompute status for `cwd` and notify listeners only when the projection changed since the last
37
+ * emit (dedupe — no spurious updates). Returns true when an update was broadcast.
38
+ */
39
+ async refresh(cwd) {
40
+ const entry = this.watched.get(cwd);
41
+ if (!entry || entry.listeners.size === 0)
42
+ return false;
43
+ const projection = await projectStatus(cwd, this.gitRunner);
44
+ const serialized = JSON.stringify(projection);
45
+ if (serialized === entry.last)
46
+ return false;
47
+ entry.last = serialized;
48
+ for (const listener of entry.listeners)
49
+ listener(projection);
50
+ return true;
51
+ }
52
+ async emit(cwd, listener) {
53
+ const projection = await projectStatus(cwd, this.gitRunner);
54
+ const entry = this.watched.get(cwd);
55
+ if (entry)
56
+ entry.last = JSON.stringify(projection);
57
+ listener(projection);
58
+ }
59
+ }
60
+ //# sourceMappingURL=workspace-git-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-git-service.js","sourceRoot":"","sources":["../../src/projects/workspace-git-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAkB,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAiC,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAetF,MAAM,OAAO,mBAAmB;IAGD;IAFZ,OAAO,GAAG,IAAI,GAAG,EAAmB,CAAC;IAEtD,YAA6B,YAAuB,gBAAgB;QAAvC,cAAS,GAAT,SAAS,CAA8B;IAAG,CAAC;IAExE,sCAAsC;IACtC,SAAS,CAAC,GAAW;QACnB,OAAO,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAC5C,CAAC;IAED;;;OAGG;IACH,SAAS,CAAC,GAAW,EAAE,QAAwB;QAC7C,IAAI,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,KAAK,GAAG,EAAE,SAAS,EAAE,IAAI,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YAC7C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC/B,CAAC;QACD,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC9B,0DAA0D;QAC1D,KAAK,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC9B,OAAO,GAAG,EAAE;YACV,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAChC,IAAI,CAAC,CAAC;gBAAE,OAAO;YACf,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC7B,IAAI,CAAC,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC;gBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACvD,CAAC,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO,CAAC,GAAW;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QACvD,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5D,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAC9C,IAAI,UAAU,KAAK,KAAK,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QAC5C,KAAK,CAAC,IAAI,GAAG,UAAU,CAAC;QACxB,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,SAAS;YAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC7D,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,KAAK,CAAC,IAAI,CAAC,GAAW,EAAE,QAAwB;QACtD,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,KAAK;YAAE,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACnD,QAAQ,CAAC,UAAU,CAAC,CAAC;IACvB,CAAC;CACF"}
@@ -0,0 +1,59 @@
1
+ import type { ProjectRecord, ProjectRegistry, WorkspaceRecord, WorkspaceRegistry } from "../persistence/entity-schemas.js";
2
+ /**
3
+ * Project + workspace registries with `projectKey` derivation (features/projects-workspaces.md
4
+ * § Registries, § Project key derivation; architecture/persistence.md § Project/Workspace registry).
5
+ *
6
+ * A **project** groups workspaces sharing a git remote (or main repo root). A **workspace** is one
7
+ * concrete cwd on the daemon. Both registries are JSON arrays with `archivedAt` soft-delete.
8
+ */
9
+ export type WorkspaceKind = "local_checkout" | "worktree" | "directory";
10
+ /** Wire also accepts the legacy `checkout` kind; it maps to `local_checkout` and is never persisted. */
11
+ export declare function normalizeWorkspaceKind(kind: string): WorkspaceKind;
12
+ /**
13
+ * Normalize a git remote URL to a stable `host/owner/repo` form:
14
+ * https://github.com/owner/repo.git → github.com/owner/repo
15
+ * git@github.com:owner/repo.git → github.com/owner/repo
16
+ * ssh://git@host:22/owner/repo → host/owner/repo
17
+ */
18
+ export declare function normalizeRemote(remote: string): string;
19
+ /** Strip trailing separators; collapse duplicate separators. Case is preserved. */
20
+ export declare function normalizePath(p: string): string;
21
+ /**
22
+ * Derive the project key: git remote present → `remote:<normalized remote>`; else
23
+ * `path:<normalized rootPath>`. The key doubles as the projectId so remote-keyed ids are stable.
24
+ */
25
+ export declare function deriveProjectKey(info: {
26
+ remote?: string | null;
27
+ rootPath: string;
28
+ }): string;
29
+ export declare class WorkspaceRegistryService {
30
+ private readonly home;
31
+ constructor(home: string);
32
+ listProjects(): Promise<ProjectRegistry>;
33
+ listWorkspaces(): Promise<WorkspaceRegistry>;
34
+ listActiveProjects(): Promise<ProjectRecord[]>;
35
+ listActiveWorkspaces(): Promise<WorkspaceRecord[]>;
36
+ /**
37
+ * Resolve (or create) the project for a detection result. Active git projects are unique by
38
+ * normalized `rootPath`; reuse an existing active project sharing the same key.
39
+ */
40
+ resolveOrCreateProject(detection: {
41
+ rootPath: string;
42
+ remote?: string | null;
43
+ kind: "git" | "non_git";
44
+ displayName?: string;
45
+ }): Promise<ProjectRecord>;
46
+ /** Resolve (or create) a workspace for a cwd under a project. Reuse an existing active record. */
47
+ resolveOrCreateWorkspace(args: {
48
+ projectId: string;
49
+ cwd: string;
50
+ kind: WorkspaceKind | string;
51
+ displayName?: string;
52
+ }): Promise<{
53
+ workspace: WorkspaceRecord;
54
+ created: boolean;
55
+ }>;
56
+ /** Soft-delete a workspace by id. Returns the archived record, or null if not found/active. */
57
+ archiveWorkspace(workspaceId: string): Promise<WorkspaceRecord | null>;
58
+ }
59
+ //# sourceMappingURL=workspace-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-registry.d.ts","sourceRoot":"","sources":["../../src/projects/workspace-registry.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EACf,eAAe,EACf,iBAAiB,EAClB,MAAM,kCAAkC,CAAC;AAQ1C;;;;;;GAMG;AAEH,MAAM,MAAM,aAAa,GAAG,gBAAgB,GAAG,UAAU,GAAG,WAAW,CAAC;AAExE,wGAAwG;AACxG,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAIlE;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAiBtD;AAED,mFAAmF;AACnF,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAK3F;AAED,qBAAa,wBAAwB;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,MAAM;IAEnC,YAAY,IAAI,OAAO,CAAC,eAAe,CAAC;IAGxC,cAAc,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAG5C,kBAAkB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAG9C,oBAAoB,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IAIxD;;;OAGG;IACG,sBAAsB,CAAC,SAAS,EAAE;QACtC,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,IAAI,EAAE,KAAK,GAAG,SAAS,CAAC;QACxB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,GAAG,OAAO,CAAC,aAAa,CAAC;IA8B1B,kGAAkG;IAC5F,wBAAwB,CAAC,IAAI,EAAE;QACnC,SAAS,EAAE,MAAM,CAAC;QAClB,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,aAAa,GAAG,MAAM,CAAC;QAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,eAAe,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAwB7D,+FAA+F;IACzF,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;CAU7E"}
@@ -0,0 +1,149 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { loadProjects, loadWorkspaces, saveProjects, saveWorkspaces, } from "../persistence/entity-stores.js";
3
+ /** Wire also accepts the legacy `checkout` kind; it maps to `local_checkout` and is never persisted. */
4
+ export function normalizeWorkspaceKind(kind) {
5
+ if (kind === "checkout")
6
+ return "local_checkout";
7
+ if (kind === "local_checkout" || kind === "worktree" || kind === "directory")
8
+ return kind;
9
+ return "directory";
10
+ }
11
+ /**
12
+ * Normalize a git remote URL to a stable `host/owner/repo` form:
13
+ * https://github.com/owner/repo.git → github.com/owner/repo
14
+ * git@github.com:owner/repo.git → github.com/owner/repo
15
+ * ssh://git@host:22/owner/repo → host/owner/repo
16
+ */
17
+ export function normalizeRemote(remote) {
18
+ let r = remote.trim();
19
+ const hasScheme = /^[a-z][a-z0-9+.-]*:\/\//i.test(r);
20
+ // scp-like (no scheme): git@host:owner/repo(.git)
21
+ const scp = !hasScheme && r.match(/^[^@]+@([^:]+):(.+)$/);
22
+ if (scp) {
23
+ r = `${scp[1]}/${scp[2]}`;
24
+ }
25
+ else {
26
+ // strip scheme://[user@]host[:port]/
27
+ r = r.replace(/^[a-z][a-z0-9+.-]*:\/\//i, "");
28
+ const at = r.indexOf("@");
29
+ if (at !== -1)
30
+ r = r.slice(at + 1);
31
+ // drop a :port immediately after host
32
+ r = r.replace(/^([^/]+):\d+\//, "$1/");
33
+ }
34
+ r = r.replace(/\.git$/i, "").replace(/\/+$/, "");
35
+ return r.toLowerCase();
36
+ }
37
+ /** Strip trailing separators; collapse duplicate separators. Case is preserved. */
38
+ export function normalizePath(p) {
39
+ return p.replace(/[\\/]+/g, "/").replace(/\/+$/, "") || "/";
40
+ }
41
+ /**
42
+ * Derive the project key: git remote present → `remote:<normalized remote>`; else
43
+ * `path:<normalized rootPath>`. The key doubles as the projectId so remote-keyed ids are stable.
44
+ */
45
+ export function deriveProjectKey(info) {
46
+ if (info.remote && info.remote.trim().length > 0) {
47
+ return `remote:${normalizeRemote(info.remote)}`;
48
+ }
49
+ return `path:${normalizePath(info.rootPath)}`;
50
+ }
51
+ export class WorkspaceRegistryService {
52
+ home;
53
+ constructor(home) {
54
+ this.home = home;
55
+ }
56
+ async listProjects() {
57
+ return loadProjects(this.home);
58
+ }
59
+ async listWorkspaces() {
60
+ return loadWorkspaces(this.home);
61
+ }
62
+ async listActiveProjects() {
63
+ return (await this.listProjects()).filter((p) => !p.archivedAt);
64
+ }
65
+ async listActiveWorkspaces() {
66
+ return (await this.listWorkspaces()).filter((w) => !w.archivedAt);
67
+ }
68
+ /**
69
+ * Resolve (or create) the project for a detection result. Active git projects are unique by
70
+ * normalized `rootPath`; reuse an existing active project sharing the same key.
71
+ */
72
+ async resolveOrCreateProject(detection) {
73
+ const projectId = deriveProjectKey(detection);
74
+ const projects = await this.listProjects();
75
+ const now = new Date().toISOString();
76
+ // Exact key match (active) — reuse.
77
+ const byKey = projects.find((p) => p.projectId === projectId && !p.archivedAt);
78
+ if (byKey)
79
+ return byKey;
80
+ // Active git projects unique by normalized rootPath — reuse if an active one already exists.
81
+ const normRoot = normalizePath(detection.rootPath);
82
+ const byRoot = projects.find((p) => !p.archivedAt && p.kind === "git" && normalizePath(p.rootPath) === normRoot);
83
+ if (byRoot && detection.kind === "git")
84
+ return byRoot;
85
+ const record = {
86
+ projectId,
87
+ rootPath: detection.rootPath,
88
+ kind: detection.kind,
89
+ displayName: detection.displayName ?? defaultProjectName(projectId, detection.rootPath),
90
+ createdAt: now,
91
+ updatedAt: now,
92
+ archivedAt: null,
93
+ };
94
+ projects.push(record);
95
+ await saveProjects(this.home, projects);
96
+ return record;
97
+ }
98
+ /** Resolve (or create) a workspace for a cwd under a project. Reuse an existing active record. */
99
+ async resolveOrCreateWorkspace(args) {
100
+ const kind = normalizeWorkspaceKind(String(args.kind));
101
+ const workspaces = await this.listWorkspaces();
102
+ const now = new Date().toISOString();
103
+ const normCwd = normalizePath(args.cwd);
104
+ const existing = workspaces.find((w) => !w.archivedAt && normalizePath(w.cwd) === normCwd);
105
+ if (existing)
106
+ return { workspace: existing, created: false };
107
+ const record = {
108
+ workspaceId: randomUUID(),
109
+ projectId: args.projectId,
110
+ cwd: args.cwd,
111
+ kind,
112
+ displayName: args.displayName ?? defaultWorkspaceName(args.cwd),
113
+ createdAt: now,
114
+ updatedAt: now,
115
+ archivedAt: null,
116
+ };
117
+ workspaces.push(record);
118
+ await saveWorkspaces(this.home, workspaces);
119
+ return { workspace: record, created: true };
120
+ }
121
+ /** Soft-delete a workspace by id. Returns the archived record, or null if not found/active. */
122
+ async archiveWorkspace(workspaceId) {
123
+ const workspaces = await this.listWorkspaces();
124
+ const target = workspaces.find((w) => w.workspaceId === workspaceId);
125
+ if (!target || target.archivedAt)
126
+ return target ?? null;
127
+ const now = new Date().toISOString();
128
+ target.archivedAt = now;
129
+ target.updatedAt = now;
130
+ await saveWorkspaces(this.home, workspaces);
131
+ return target;
132
+ }
133
+ }
134
+ function defaultProjectName(projectId, rootPath) {
135
+ if (projectId.startsWith("remote:")) {
136
+ const parts = projectId.slice("remote:".length).split("/");
137
+ return parts[parts.length - 1] || projectId;
138
+ }
139
+ return basenameOf(rootPath);
140
+ }
141
+ function defaultWorkspaceName(cwd) {
142
+ return basenameOf(cwd);
143
+ }
144
+ function basenameOf(p) {
145
+ const norm = normalizePath(p);
146
+ const parts = norm.split("/");
147
+ return parts[parts.length - 1] || norm;
148
+ }
149
+ //# sourceMappingURL=workspace-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-registry.js","sourceRoot":"","sources":["../../src/projects/workspace-registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,100 @@
1
+ import type { WorkspaceRecord } from "../persistence/entity-schemas.js";
2
+ import type { Session } from "../ws/session.js";
3
+ import type { HandlerRegistry } from "../ws/router.js";
4
+ import { type GitRunner } from "./git-detect.js";
5
+ import { WorkspaceRegistryService } from "./workspace-registry.js";
6
+ /**
7
+ * Pi-Studio-managed git worktree service (features/worktrees.md § Operations, § Behavior,
8
+ * § Lifecycle config; architecture/agent-lifecycle.md § Archive). Handles create/setup, archive/
9
+ * teardown, and the `autoArchive`+`worktree` coupling.
10
+ */
11
+ /** Agent label naming the worktree workspace it lives in (for auto-archive coupling). */
12
+ export declare const WORKTREE_WORKSPACE_ID_LABEL = "pi-studio.worktree-workspace-id";
13
+ /** Agent label flagging auto-archive after the first terminal turn. */
14
+ export declare const AUTO_ARCHIVE_LABEL = "pi-studio.auto-archive";
15
+ export interface CreateWorktreeIntent {
16
+ /** Source checkout (main repo root) the worktree branches from. */
17
+ projectRoot: string;
18
+ /** Owning project id. */
19
+ projectId: string;
20
+ /** Requested worktree/branch name (slugged; may be generated if absent). */
21
+ name?: string;
22
+ /** Existing branch to check out (mutually exclusive with new-branch generation). */
23
+ branch?: string;
24
+ /** Base ref for a newly created branch. */
25
+ baseRef?: string;
26
+ /** Prompt used to generate a branch name when neither `name` nor `branch` is provided. */
27
+ generatePrompt?: string;
28
+ }
29
+ export interface WorktreeDescriptor {
30
+ workspace: WorkspaceRecord;
31
+ name: string;
32
+ branch: string;
33
+ path: string;
34
+ setupOk: boolean;
35
+ }
36
+ export type CommandRunResult = {
37
+ code: number;
38
+ stdout: string;
39
+ stderr: string;
40
+ };
41
+ export type CommandRunner = (command: string, opts: {
42
+ cwd: string;
43
+ env: Record<string, string>;
44
+ }) => Promise<CommandRunResult>;
45
+ export interface AgentLike {
46
+ id: string;
47
+ cwd: string;
48
+ labels: Record<string, string>;
49
+ }
50
+ export interface WorktreeServiceDeps {
51
+ home: string;
52
+ registry?: WorkspaceRegistryService;
53
+ broadcast: (sessions: Iterable<Session>, message: unknown) => void;
54
+ getActiveSessions?: () => Iterable<Session>;
55
+ gitRunner?: GitRunner;
56
+ /** Runs a `setup`/`teardown` shell command. Defaults to a no-op success. */
57
+ runCommand?: CommandRunner;
58
+ /** Resolve the `pi-studio.json` worktree lifecycle commands for a project root. */
59
+ readWorktreeLifecycle?: (projectRoot: string) => Promise<{
60
+ setup: string[];
61
+ teardown: string[];
62
+ }>;
63
+ /** Structured-generation branch-name generator. */
64
+ generateBranchName?: (prompt: string) => Promise<string>;
65
+ /** `worktrees.root` daemon-config override; defaults to `$PI_STUDIO_HOME/worktrees`. */
66
+ worktreeRoot?: string;
67
+ /** Active agents (for archiving contained agents + auto-archive coupling). */
68
+ listAgents?: () => AgentLike[];
69
+ /** Archive an agent by id (cascades per AgentManager). */
70
+ archiveAgent?: (id: string) => Promise<void>;
71
+ }
72
+ /** Slug a branch/worktree name: lowercase, keep `[a-z0-9-/]`, collapse separators. */
73
+ export declare function slugBranchName(name: string): string;
74
+ /**
75
+ * Resolve a unique, length-bounded worktree name. Over-long names are truncated and a deterministic
76
+ * 7-char hash suffix is appended; colliding names get a deterministic suffix that increments a salt
77
+ * until unique within `existing`.
78
+ */
79
+ export declare function resolveWorktreeName(rawName: string, existing: ReadonlySet<string>, maxLen?: number): string;
80
+ export declare class WorktreeService {
81
+ private readonly deps;
82
+ private readonly registry;
83
+ private readonly git;
84
+ private readonly runCommand;
85
+ constructor(deps: WorktreeServiceDeps);
86
+ registerHandlers(registry: HandlerRegistry, getActiveSessions: () => Iterable<Session>): void;
87
+ private worktreeRoot;
88
+ /** Create a Pi-Studio worktree, register it, and run `setup`. */
89
+ createWorktree(intent: CreateWorktreeIntent, getActiveSessions?: () => Iterable<Session>): Promise<WorktreeDescriptor>;
90
+ /** Archive a worktree: teardown → archive contained agents → `git worktree remove`/prune. */
91
+ archiveWorktree(workspaceId: string, getActiveSessions?: () => Iterable<Session>): Promise<boolean>;
92
+ /**
93
+ * Auto-archive coupling: when an agent created with `autoArchive` + a `worktree` target reaches a
94
+ * terminal turn, archive the agent AND its worktree (which cascades to any agents inside it).
95
+ * Returns true when an auto-archive was performed.
96
+ */
97
+ maybeAutoArchiveOnTerminalTurn(agent: AgentLike, getActiveSessions?: () => Iterable<Session>): Promise<boolean>;
98
+ private runLifecycle;
99
+ }
100
+ //# sourceMappingURL=worktree-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree-service.d.ts","sourceRoot":"","sources":["../../src/projects/worktree-service.ts"],"names":[],"mappings":"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"}