@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,80 @@
1
+ import type { AgentCapabilityFlags, AgentSessionConfig } from "@av-pi-studio/protocol";
2
+ import type { AgentClient, AgentModeDefinition, AgentModelDefinition, AgentSession, CreateSessionOptions, ImportableSessionRow, ImportSessionArgs, ImportSessionResult, LaunchContext, PersistenceHandle } from "../../provider-contract.js";
3
+ import type { TimelineRow } from "../../timeline-store.js";
4
+ import { type PiTransportFactory } from "./rpc-transport.js";
5
+ /**
6
+ * Pi provider adapter (features/agent-providers.md § Pi lifecycle / § Models·modes·features /
7
+ * § Import & resume). Spawns `pi --mode rpc` (or a configured `command`), maps RPC events to
8
+ * `AgentStreamEvent`s, passes Pi-Studio system prompts via `--append-system-prompt` (preserving Pi's
9
+ * default prompt), and discovers models/modes via top-level RPC calls (never a scratch session).
10
+ */
11
+ export declare const PI_CAPABILITIES: AgentCapabilityFlags;
12
+ export interface PiClientDeps {
13
+ /** Provider id (custom `extends:"pi"` profiles reuse this adapter with their own id). */
14
+ provider?: string;
15
+ /** Launch command; defaults to `pi --mode rpc`. */
16
+ command?: string[];
17
+ env?: Record<string, string>;
18
+ /** JSONL session directory for import discovery (`params.sessionDir` for forks). */
19
+ sessionDir?: string;
20
+ /** System prompt appended to every session (preserves Pi's default prompt). */
21
+ appendSystemPrompt?: string;
22
+ /** Injected for tests; defaults to the real process transport. */
23
+ transportFactory?: PiTransportFactory;
24
+ /** Injected for tests; defaults to a `$PATH` scan. */
25
+ binaryResolver?: (bin: string, env?: Record<string, string | undefined>) => boolean;
26
+ }
27
+ export interface PiSessionLaunch {
28
+ args: string[];
29
+ cwd: string;
30
+ env: Record<string, string>;
31
+ sessionFile?: string;
32
+ }
33
+ /** Build Pi argv, appending (never replacing) the system prompt and optional `--mcp-config`. */
34
+ export declare function buildPiArgs(base: string[], opts: {
35
+ appendSystemPrompt?: string;
36
+ mcpConfigPath?: string;
37
+ }): string[];
38
+ export declare class PiAgentClient implements AgentClient {
39
+ private readonly deps;
40
+ readonly provider: string;
41
+ readonly capabilities: import("zod").objectOutputType<{
42
+ supportsStreaming: import("zod").ZodBoolean;
43
+ supportsSessionPersistence: import("zod").ZodBoolean;
44
+ supportsDynamicModes: import("zod").ZodBoolean;
45
+ supportsMcpServers: import("zod").ZodBoolean;
46
+ supportsReasoningStream: import("zod").ZodBoolean;
47
+ supportsToolInvocations: import("zod").ZodBoolean;
48
+ supportsRewindConversation: import("zod").ZodOptional<import("zod").ZodBoolean>;
49
+ supportsRewindFiles: import("zod").ZodOptional<import("zod").ZodBoolean>;
50
+ supportsRewindBoth: import("zod").ZodOptional<import("zod").ZodBoolean>;
51
+ }, import("zod").ZodTypeAny, "passthrough">;
52
+ private readonly command;
53
+ private readonly factory;
54
+ private readonly resolver;
55
+ constructor(deps?: PiClientDeps);
56
+ isAvailable(): boolean;
57
+ /** Build a clear error when the Pi binary cannot be resolved (avoids a raw spawn ENOENT). */
58
+ private unavailableError;
59
+ private buildEnv;
60
+ createSession(config: AgentSessionConfig, launchContext?: LaunchContext, options?: CreateSessionOptions): Promise<AgentSession>;
61
+ resumeSession(handle: PersistenceHandle, overrides?: Partial<AgentSessionConfig>, launchContext?: LaunchContext): Promise<AgentSession>;
62
+ /** Discover models via the Pi RPC `get_available_models` command (no scratch session). */
63
+ listModels(opts?: {
64
+ cwd?: string;
65
+ }): Promise<AgentModelDefinition[]>;
66
+ /** Pi RPC has no `list_modes`; modes come from the provider manifest, not the process. */
67
+ listModes(): Promise<AgentModeDefinition[]>;
68
+ private topLevel;
69
+ /** Enumerate Pi JSONL session files for the import picker (rows only). */
70
+ listImportableSessions(opts?: {
71
+ cwd?: string;
72
+ }): Promise<ImportableSessionRow[]>;
73
+ /** Resume one native session (the JSONL file is the `nativeHandle`) and return a hydrated result. */
74
+ importSession(args: ImportSessionArgs): Promise<ImportSessionResult>;
75
+ /** Rebuild a timeline by reading Pi's own on-disk JSONL session file (no live process needed). */
76
+ hydrateTimeline(handle: PersistenceHandle): TimelineRow[];
77
+ }
78
+ /** Factory matching the provider-registry signature. */
79
+ export declare function createPiClient(deps?: PiClientDeps): PiAgentClient;
80
+ //# sourceMappingURL=agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../../../src/agent/providers/pi/agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,322 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ import { mapPiEvent } from "./event-mapper.js";
5
+ import { hydrateTimelineFromSessionFile } from "./session-hydration.js";
6
+ import { createProcessTransport, defaultPiCommand, resolveBinaryOnPath, } from "./rpc-transport.js";
7
+ /**
8
+ * Pi provider adapter (features/agent-providers.md § Pi lifecycle / § Models·modes·features /
9
+ * § Import & resume). Spawns `pi --mode rpc` (or a configured `command`), maps RPC events to
10
+ * `AgentStreamEvent`s, passes Pi-Studio system prompts via `--append-system-prompt` (preserving Pi's
11
+ * default prompt), and discovers models/modes via top-level RPC calls (never a scratch session).
12
+ */
13
+ export const PI_CAPABILITIES = {
14
+ supportsStreaming: true,
15
+ supportsSessionPersistence: true,
16
+ supportsDynamicModes: true,
17
+ supportsMcpServers: true,
18
+ supportsReasoningStream: true,
19
+ supportsToolInvocations: true,
20
+ };
21
+ /** Build Pi argv, appending (never replacing) the system prompt and optional `--mcp-config`. */
22
+ export function buildPiArgs(base, opts) {
23
+ const args = [...base];
24
+ if (opts.appendSystemPrompt)
25
+ args.push("--append-system-prompt", opts.appendSystemPrompt);
26
+ if (opts.mcpConfigPath)
27
+ args.push("--mcp-config", opts.mcpConfigPath);
28
+ return args;
29
+ }
30
+ class PiAgentSession {
31
+ transport;
32
+ provider;
33
+ id = randomUUID();
34
+ capabilities = PI_CAPABILITIES;
35
+ subscribers = new Set();
36
+ history = [];
37
+ modes = [];
38
+ mode;
39
+ sessionFile;
40
+ constructor(transport, opts) {
41
+ this.transport = transport;
42
+ this.provider = opts.provider;
43
+ this.mode = opts.config.modeId ?? null;
44
+ this.sessionFile = opts.sessionFile;
45
+ transport.onEvent((raw) => {
46
+ // Auto-respond to extension UI dialogs so the agent never blocks waiting on a client that
47
+ // isn't wired for them (POC). Safe default: cancel (extension receives undefined/false).
48
+ const rec = raw;
49
+ if (rec?.type === "extension_ui_request") {
50
+ const method = rec.method;
51
+ if (method === "select" ||
52
+ method === "confirm" ||
53
+ method === "input" ||
54
+ method === "editor") {
55
+ this.transport.notify("extension_ui_response", { id: rec.id, cancelled: true });
56
+ }
57
+ return;
58
+ }
59
+ const event = mapPiEvent(raw);
60
+ if (event)
61
+ this.emit(event);
62
+ });
63
+ }
64
+ emit(event) {
65
+ this.history.push(event);
66
+ for (const cb of this.subscribers)
67
+ cb(event);
68
+ }
69
+ setDiscoveredModes(modes) {
70
+ this.modes = modes;
71
+ }
72
+ /**
73
+ * Learn the JSONL session file Pi picked for THIS process via `get_state` (docs/rpc.md
74
+ * `get_state.sessionFile`). A freshly spawned `createSession` never sets `sessionFile` at
75
+ * construction (only resume/import do, since they choose the file up front) — without this,
76
+ * `describePersistence()` would return no `nativeHandle` and a plain restart could never find
77
+ * the conversation Pi already wrote to disk. Best-effort: `--no-session` or a request failure
78
+ * leaves `sessionFile` unset, which is a legitimate ephemeral-session state, not an error.
79
+ */
80
+ async discoverSessionFile() {
81
+ try {
82
+ const state = (await this.transport.request("get_state"));
83
+ if (typeof state.sessionFile === "string")
84
+ this.sessionFile = state.sessionFile;
85
+ }
86
+ catch {
87
+ /* best-effort */
88
+ }
89
+ }
90
+ subscribe(cb) {
91
+ this.subscribers.add(cb);
92
+ return () => this.subscribers.delete(cb);
93
+ }
94
+ async *streamHistory() {
95
+ for (const event of this.history)
96
+ yield event;
97
+ }
98
+ startTurn(prompt, opts) {
99
+ const turnId = randomUUID();
100
+ // Pi RPC `prompt` command (docs/rpc.md): `{type:"prompt", message, images?}`. Images must be
101
+ // Pi's `ImageContent` shape (`{type:"image", data, mimeType}`) — the client only sends
102
+ // `{mimeType, data}`, so convert here rather than forwarding the wire shape verbatim.
103
+ const images = opts?.images
104
+ ?.map((img) => {
105
+ const rec = img;
106
+ const data = typeof rec.data === "string" ? rec.data : undefined;
107
+ const mimeType = typeof rec.mimeType === "string" ? rec.mimeType : undefined;
108
+ return data && mimeType ? { type: "image", data, mimeType } : undefined;
109
+ })
110
+ .filter((img) => img !== undefined);
111
+ this.transport.notify("prompt", {
112
+ message: prompt,
113
+ ...(images && images.length > 0 ? { images } : {}),
114
+ });
115
+ return Promise.resolve({ turnId });
116
+ }
117
+ run(prompt, opts) {
118
+ return new Promise((resolve) => {
119
+ const unsub = this.subscribe((event) => {
120
+ if (event.kind === "turn_completed" ||
121
+ event.kind === "turn_failed" ||
122
+ event.kind === "turn_canceled") {
123
+ unsub();
124
+ resolve();
125
+ }
126
+ });
127
+ void this.startTurn(prompt, opts);
128
+ });
129
+ }
130
+ getRuntimeInfo() {
131
+ return { provider: this.provider, sessionId: this.id, modeId: this.mode ?? undefined };
132
+ }
133
+ getAvailableModes() {
134
+ return this.modes;
135
+ }
136
+ getCurrentMode() {
137
+ return this.mode;
138
+ }
139
+ async setMode(id) {
140
+ // Pi RPC has no `set_mode` command (modes are a Pi-Studio concept layered over the provider).
141
+ // Track it locally; model/thinking changes go through setModel/setThinkingOption.
142
+ this.mode = id;
143
+ return Promise.resolve();
144
+ }
145
+ getPendingPermissions() {
146
+ return [];
147
+ }
148
+ respondToPermission(requestId, response) {
149
+ this.transport.notify("respond_to_permission", { requestId, response });
150
+ return Promise.resolve();
151
+ }
152
+ describePersistence() {
153
+ return {
154
+ provider: this.provider,
155
+ sessionId: this.id,
156
+ ...(this.sessionFile ? { nativeHandle: this.sessionFile } : {}),
157
+ };
158
+ }
159
+ interrupt() {
160
+ this.transport.notify("abort", {});
161
+ return Promise.resolve();
162
+ }
163
+ close() {
164
+ this.subscribers.clear();
165
+ return this.transport.close();
166
+ }
167
+ }
168
+ export class PiAgentClient {
169
+ deps;
170
+ provider;
171
+ capabilities = PI_CAPABILITIES;
172
+ command;
173
+ factory;
174
+ resolver;
175
+ constructor(deps = {}) {
176
+ this.deps = deps;
177
+ this.provider = deps.provider ?? "pi";
178
+ this.command = deps.command ?? defaultPiCommand();
179
+ this.factory = deps.transportFactory ?? createProcessTransport;
180
+ this.resolver = deps.binaryResolver ?? resolveBinaryOnPath;
181
+ }
182
+ isAvailable() {
183
+ return this.resolver(this.command[0], this.deps.env);
184
+ }
185
+ /** Build a clear error when the Pi binary cannot be resolved (avoids a raw spawn ENOENT). */
186
+ unavailableError() {
187
+ return new Error(`Pi provider unavailable: '${this.command[0]}' was not found on PATH. ` +
188
+ `Install the Pi CLI, ensure it is on the daemon's PATH, or set ` +
189
+ `agents.providers.pi.command to its absolute path in config.json. ` +
190
+ `(Or use the 'mock' provider for a dependency-free test.)`);
191
+ }
192
+ buildEnv(launchContext, options) {
193
+ return { ...this.deps.env, ...launchContext?.env, ...options?.env };
194
+ }
195
+ async createSession(config, launchContext, options) {
196
+ if (!this.isAvailable())
197
+ return Promise.reject(this.unavailableError());
198
+ const args = buildPiArgs(this.command, {
199
+ appendSystemPrompt: config.systemPrompt ?? this.deps.appendSystemPrompt,
200
+ });
201
+ const transport = this.factory({
202
+ args,
203
+ cwd: launchContext?.cwd ?? config.cwd,
204
+ env: this.buildEnv(launchContext, options),
205
+ });
206
+ const session = new PiAgentSession(transport, { provider: this.provider, config });
207
+ // Learn the JSONL file Pi picked for this fresh process, so `describePersistence()` can hand
208
+ // back a `nativeHandle` a restarted daemon can later rehydrate the timeline from.
209
+ await session.discoverSessionFile();
210
+ return session;
211
+ }
212
+ resumeSession(handle, overrides, launchContext) {
213
+ if (!this.isAvailable())
214
+ return Promise.reject(this.unavailableError());
215
+ const sessionFile = typeof handle.nativeHandle === "string" ? handle.nativeHandle : undefined;
216
+ const cwd = launchContext?.cwd ?? overrides?.cwd ?? ".";
217
+ const transport = this.factory({
218
+ args: buildPiArgs(this.command, { appendSystemPrompt: this.deps.appendSystemPrompt }),
219
+ cwd,
220
+ env: this.buildEnv(launchContext),
221
+ sessionFile,
222
+ });
223
+ return Promise.resolve(new PiAgentSession(transport, {
224
+ provider: this.provider,
225
+ config: { provider: this.provider, cwd, ...overrides },
226
+ sessionFile,
227
+ }));
228
+ }
229
+ /** Discover models via the Pi RPC `get_available_models` command (no scratch session). */
230
+ async listModels(opts) {
231
+ const data = await this.topLevel("get_available_models", opts?.cwd);
232
+ const raw = data?.models;
233
+ const models = Array.isArray(raw) ? raw : [];
234
+ return models.map((m) => {
235
+ const rec = m;
236
+ return {
237
+ id: String(rec.id ?? rec.name ?? ""),
238
+ label: typeof rec.name === "string" ? rec.name : String(rec.id ?? ""),
239
+ };
240
+ });
241
+ }
242
+ /** Pi RPC has no `list_modes`; modes come from the provider manifest, not the process. */
243
+ listModes() {
244
+ return Promise.resolve([]);
245
+ }
246
+ async topLevel(command, cwd) {
247
+ if (!this.isAvailable())
248
+ throw this.unavailableError();
249
+ const transport = this.factory({
250
+ args: buildPiArgs(this.command, { appendSystemPrompt: this.deps.appendSystemPrompt }),
251
+ cwd: cwd ?? ".",
252
+ env: this.buildEnv(),
253
+ });
254
+ try {
255
+ return await transport.request(command);
256
+ }
257
+ finally {
258
+ await transport.close();
259
+ }
260
+ }
261
+ /** Enumerate Pi JSONL session files for the import picker (rows only). */
262
+ listImportableSessions(opts) {
263
+ const dir = this.deps.sessionDir;
264
+ if (!dir || !existsSync(dir))
265
+ return Promise.resolve([]);
266
+ const rows = [];
267
+ for (const file of readdirSync(dir)) {
268
+ if (!file.endsWith(".jsonl"))
269
+ continue;
270
+ const full = join(dir, file);
271
+ let cwd = "";
272
+ let title;
273
+ let promptPreview;
274
+ try {
275
+ const firstLine = readFileSync(full, "utf8")
276
+ .split("\n")
277
+ .find((l) => l.trim());
278
+ if (firstLine) {
279
+ const head = JSON.parse(firstLine);
280
+ cwd = typeof head.cwd === "string" ? head.cwd : "";
281
+ title = typeof head.title === "string" ? head.title : undefined;
282
+ promptPreview = typeof head.prompt === "string" ? head.prompt : undefined;
283
+ }
284
+ }
285
+ catch {
286
+ // best-effort metadata; the row is still importable
287
+ }
288
+ if (opts?.cwd && cwd && cwd !== opts.cwd)
289
+ continue;
290
+ rows.push({
291
+ providerHandleId: full,
292
+ cwd,
293
+ title,
294
+ promptPreview,
295
+ lastActivityAt: statSync(full).mtime.toISOString(),
296
+ });
297
+ }
298
+ return Promise.resolve(rows);
299
+ }
300
+ /** Resume one native session (the JSONL file is the `nativeHandle`) and return a hydrated result. */
301
+ async importSession(args) {
302
+ const session = await this.resumeSession({ provider: this.provider, nativeHandle: args.providerHandleId }, { cwd: args.cwd }, { cwd: args.cwd });
303
+ const persistence = session.describePersistence();
304
+ return {
305
+ session,
306
+ persistence,
307
+ timeline: this.hydrateTimeline(persistence).map((row) => row.event),
308
+ };
309
+ }
310
+ /** Rebuild a timeline by reading Pi's own on-disk JSONL session file (no live process needed). */
311
+ hydrateTimeline(handle) {
312
+ const sessionFile = typeof handle.nativeHandle === "string" ? handle.nativeHandle : undefined;
313
+ if (!sessionFile)
314
+ return [];
315
+ return hydrateTimelineFromSessionFile(sessionFile);
316
+ }
317
+ }
318
+ /** Factory matching the provider-registry signature. */
319
+ export function createPiClient(deps = {}) {
320
+ return new PiAgentClient(deps);
321
+ }
322
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../../../src/agent/providers/pi/agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { AgentStreamEvent, ToolCallDetail } from "@av-pi-studio/protocol";
2
+ /**
3
+ * Map a Pi tool-call payload to a normalized `ToolCallDetail`. Accepts either a
4
+ * `tool_execution_start`-shaped record (`toolName` + `args`) or a `tool_execution_end`-shaped one
5
+ * (`toolName` + `result`, no `args`). For `edit`, the human-readable unified `patch` is only
6
+ * present on the *end* event under `result.details.patch`, so it is pulled from there when args
7
+ * carry no diff. `output` (tool stdout/result text) is only present on *end* events — `start`
8
+ * events have no `result` yet, so `outputOf` yields `undefined` for them, which is correct.
9
+ */
10
+ export declare function mapToolCall(raw: unknown): ToolCallDetail;
11
+ /** Map one raw Pi event to an `AgentStreamEvent`, or `null` if it is not a stream event.
12
+ *
13
+ * Real Pi RPC events (docs/rpc.md): `agent_start`/`agent_end`, `turn_start`/`turn_end`,
14
+ * `message_update` (carrying an `assistantMessageEvent` delta), `tool_execution_start|end`, etc.
15
+ */
16
+ export declare function mapPiEvent(raw: unknown): AgentStreamEvent | null;
17
+ //# sourceMappingURL=event-mapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-mapper.d.ts","sourceRoot":"","sources":["../../../../src/agent/providers/pi/event-mapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AA2B/E;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,cAAc,CA6CxD;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,gBAAgB,GAAG,IAAI,CAqEhE"}
@@ -0,0 +1,150 @@
1
+ /**
2
+ * Maps raw Pi RPC events → provider-neutral `AgentStreamEvent`s, and Pi tool calls →
3
+ * `ToolCallDetail` kinds (features/agent-sessions.md § Stream events). The exact Pi event schema is
4
+ * TODO(verify); this mapper tolerates `type`/`kind` discriminants and common field names.
5
+ */
6
+ function asRecord(value) {
7
+ return value && typeof value === "object" ? value : {};
8
+ }
9
+ function str(value) {
10
+ return typeof value === "string" ? value : undefined;
11
+ }
12
+ /** Join `result.content` text blocks (Pi RPC `tool_execution_end` shape) into one string. */
13
+ function outputOf(tool) {
14
+ const content = asRecord(tool.result).content;
15
+ if (!Array.isArray(content))
16
+ return undefined;
17
+ const text = content
18
+ .filter((block) => asRecord(block).type === "text")
19
+ .map((block) => block.text ?? "")
20
+ .join("");
21
+ return text || undefined;
22
+ }
23
+ /**
24
+ * Map a Pi tool-call payload to a normalized `ToolCallDetail`. Accepts either a
25
+ * `tool_execution_start`-shaped record (`toolName` + `args`) or a `tool_execution_end`-shaped one
26
+ * (`toolName` + `result`, no `args`). For `edit`, the human-readable unified `patch` is only
27
+ * present on the *end* event under `result.details.patch`, so it is pulled from there when args
28
+ * carry no diff. `output` (tool stdout/result text) is only present on *end* events — `start`
29
+ * events have no `result` yet, so `outputOf` yields `undefined` for them, which is correct.
30
+ */
31
+ export function mapToolCall(raw) {
32
+ const tool = asRecord(raw);
33
+ const name = (str(tool.name) ?? str(tool.tool) ?? str(tool.toolName) ?? "").toLowerCase();
34
+ const input = asRecord(tool.input ?? tool.arguments ?? tool.args);
35
+ const resultDetails = asRecord(asRecord(tool.result).details);
36
+ const output = outputOf(tool);
37
+ switch (name) {
38
+ case "shell":
39
+ case "bash":
40
+ case "exec":
41
+ case "run":
42
+ return { kind: "shell", command: str(input.command) ?? str(input.cmd), output };
43
+ case "read":
44
+ case "read_file":
45
+ case "cat":
46
+ return { kind: "read", path: str(input.path) ?? str(input.file), output };
47
+ case "edit":
48
+ case "apply_patch":
49
+ case "patch":
50
+ return {
51
+ kind: "edit",
52
+ path: str(input.path),
53
+ diff: str(input.diff) ?? str(input.patch) ?? str(resultDetails.patch) ?? str(resultDetails.diff),
54
+ output,
55
+ };
56
+ case "write":
57
+ case "write_file":
58
+ case "create":
59
+ return { kind: "write", path: str(input.path) ?? str(input.file), output };
60
+ case "search":
61
+ case "grep":
62
+ case "glob":
63
+ return { kind: "search", query: str(input.query) ?? str(input.pattern), output };
64
+ case "fetch":
65
+ case "web_fetch":
66
+ case "http":
67
+ return { kind: "fetch", url: str(input.url), output };
68
+ case "task":
69
+ case "agent":
70
+ case "subagent":
71
+ return { kind: "task", description: str(input.description) ?? str(input.prompt), output };
72
+ default:
73
+ // Unknown provider tool → surface as a task with the raw name as description.
74
+ return { kind: "task", description: name || undefined, output };
75
+ }
76
+ }
77
+ /** Map one raw Pi event to an `AgentStreamEvent`, or `null` if it is not a stream event.
78
+ *
79
+ * Real Pi RPC events (docs/rpc.md): `agent_start`/`agent_end`, `turn_start`/`turn_end`,
80
+ * `message_update` (carrying an `assistantMessageEvent` delta), `tool_execution_start|end`, etc.
81
+ */
82
+ export function mapPiEvent(raw) {
83
+ const event = asRecord(raw);
84
+ const type = str(event.type) ?? str(event.kind);
85
+ if (!type)
86
+ return null;
87
+ switch (type) {
88
+ // ── Run / turn boundaries ──
89
+ case "agent_start":
90
+ return { kind: "turn_started" };
91
+ case "agent_end":
92
+ return { kind: "turn_completed" };
93
+ // ── Streaming assistant deltas ──
94
+ case "message_update": {
95
+ const delta = asRecord(event.assistantMessageEvent);
96
+ const dtype = str(delta.type);
97
+ if (dtype === "text_delta")
98
+ return { kind: "assistant_message", text: str(delta.delta) };
99
+ if (dtype === "thinking_delta")
100
+ return { kind: "reasoning", text: str(delta.delta) };
101
+ if (dtype === "toolcall_end") {
102
+ const tc = asRecord(delta.toolCall);
103
+ return {
104
+ kind: "tool_call",
105
+ callId: str(tc.id),
106
+ tool: mapToolCall(tc),
107
+ status: "started",
108
+ };
109
+ }
110
+ if (dtype === "error")
111
+ return { kind: "error", message: str(delta.reason) ?? "error" };
112
+ return null;
113
+ }
114
+ // ── Tool execution ──
115
+ case "tool_execution_start":
116
+ return {
117
+ kind: "tool_call",
118
+ callId: str(event.toolCallId),
119
+ tool: mapToolCall(event),
120
+ status: "running",
121
+ };
122
+ case "tool_execution_end":
123
+ return {
124
+ kind: "tool_call",
125
+ callId: str(event.toolCallId),
126
+ tool: mapToolCall(event),
127
+ status: event.isError ? "error" : "completed",
128
+ };
129
+ // ── Errors ──
130
+ case "extension_error":
131
+ return { kind: "error", message: str(event.error) };
132
+ case "error":
133
+ return { kind: "error", message: str(event.message ?? event.error) };
134
+ // ── Ignored (handled elsewhere / not surfaced as timeline events) ──
135
+ case "turn_start":
136
+ case "turn_end":
137
+ case "message_start":
138
+ case "message_end":
139
+ case "tool_execution_update":
140
+ case "queue_update":
141
+ case "compaction_start":
142
+ case "compaction_end":
143
+ case "auto_retry_start":
144
+ case "auto_retry_end":
145
+ return null;
146
+ default:
147
+ return null;
148
+ }
149
+ }
150
+ //# sourceMappingURL=event-mapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-mapper.js","sourceRoot":"","sources":["../../../../src/agent/providers/pi/event-mapper.ts"],"names":[],"mappings":"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"}