@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.
- package/README.md +411 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/agent/agent-manager.d.ts +107 -0
- package/dist/agent/agent-manager.d.ts.map +1 -0
- package/dist/agent/agent-manager.js +218 -0
- package/dist/agent/agent-manager.js.map +1 -0
- package/dist/agent/agent-service.d.ts +36 -0
- package/dist/agent/agent-service.d.ts.map +1 -0
- package/dist/agent/agent-service.js +195 -0
- package/dist/agent/agent-service.js.map +1 -0
- package/dist/agent/index.d.ts +17 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +18 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/manifest.d.ts +7 -0
- package/dist/agent/manifest.d.ts.map +1 -0
- package/dist/agent/manifest.js +27 -0
- package/dist/agent/manifest.js.map +1 -0
- package/dist/agent/mcp-server.d.ts +100 -0
- package/dist/agent/mcp-server.d.ts.map +1 -0
- package/dist/agent/mcp-server.js +163 -0
- package/dist/agent/mcp-server.js.map +1 -0
- package/dist/agent/permissions.d.ts +71 -0
- package/dist/agent/permissions.d.ts.map +1 -0
- package/dist/agent/permissions.js +132 -0
- package/dist/agent/permissions.js.map +1 -0
- package/dist/agent/provider-contract.d.ts +134 -0
- package/dist/agent/provider-contract.d.ts.map +1 -0
- package/dist/agent/provider-contract.js +2 -0
- package/dist/agent/provider-contract.js.map +1 -0
- package/dist/agent/provider-registry.d.ts +37 -0
- package/dist/agent/provider-registry.d.ts.map +1 -0
- package/dist/agent/provider-registry.js +92 -0
- package/dist/agent/provider-registry.js.map +1 -0
- package/dist/agent/provider-snapshot.d.ts +52 -0
- package/dist/agent/provider-snapshot.d.ts.map +1 -0
- package/dist/agent/provider-snapshot.js +73 -0
- package/dist/agent/provider-snapshot.js.map +1 -0
- package/dist/agent/providers/mock/mock-provider.d.ts +44 -0
- package/dist/agent/providers/mock/mock-provider.d.ts.map +1 -0
- package/dist/agent/providers/mock/mock-provider.js +162 -0
- package/dist/agent/providers/mock/mock-provider.js.map +1 -0
- package/dist/agent/providers/pi/agent.d.ts +80 -0
- package/dist/agent/providers/pi/agent.d.ts.map +1 -0
- package/dist/agent/providers/pi/agent.js +322 -0
- package/dist/agent/providers/pi/agent.js.map +1 -0
- package/dist/agent/providers/pi/event-mapper.d.ts +17 -0
- package/dist/agent/providers/pi/event-mapper.d.ts.map +1 -0
- package/dist/agent/providers/pi/event-mapper.js +150 -0
- package/dist/agent/providers/pi/event-mapper.js.map +1 -0
- package/dist/agent/providers/pi/rpc-transport.d.ts +53 -0
- package/dist/agent/providers/pi/rpc-transport.d.ts.map +1 -0
- package/dist/agent/providers/pi/rpc-transport.js +190 -0
- package/dist/agent/providers/pi/rpc-transport.js.map +1 -0
- package/dist/agent/providers/pi/session-hydration.d.ts +11 -0
- package/dist/agent/providers/pi/session-hydration.d.ts.map +1 -0
- package/dist/agent/providers/pi/session-hydration.js +167 -0
- package/dist/agent/providers/pi/session-hydration.js.map +1 -0
- package/dist/agent/rewind-rpc.d.ts +15 -0
- package/dist/agent/rewind-rpc.d.ts.map +1 -0
- package/dist/agent/rewind-rpc.js +30 -0
- package/dist/agent/rewind-rpc.js.map +1 -0
- package/dist/agent/session-operations.d.ts +32 -0
- package/dist/agent/session-operations.d.ts.map +1 -0
- package/dist/agent/session-operations.js +130 -0
- package/dist/agent/session-operations.js.map +1 -0
- package/dist/agent/structured-generation.d.ts +39 -0
- package/dist/agent/structured-generation.d.ts.map +1 -0
- package/dist/agent/structured-generation.js +78 -0
- package/dist/agent/structured-generation.js.map +1 -0
- package/dist/agent/timeline-rpc.d.ts +21 -0
- package/dist/agent/timeline-rpc.d.ts.map +1 -0
- package/dist/agent/timeline-rpc.js +59 -0
- package/dist/agent/timeline-rpc.js.map +1 -0
- package/dist/agent/timeline-store.d.ts +100 -0
- package/dist/agent/timeline-store.d.ts.map +1 -0
- package/dist/agent/timeline-store.js +255 -0
- package/dist/agent/timeline-store.js.map +1 -0
- package/dist/auth/index.d.ts +2 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +3 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/password-auth.d.ts +44 -0
- package/dist/auth/password-auth.d.ts.map +1 -0
- package/dist/auth/password-auth.js +78 -0
- package/dist/auth/password-auth.js.map +1 -0
- package/dist/config/daemon-config.d.ts +634 -0
- package/dist/config/daemon-config.d.ts.map +1 -0
- package/dist/config/daemon-config.js +258 -0
- package/dist/config/daemon-config.js.map +1 -0
- package/dist/config/index.d.ts +3 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +4 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/project-config.d.ts +104 -0
- package/dist/config/project-config.d.ts.map +1 -0
- package/dist/config/project-config.js +106 -0
- package/dist/config/project-config.js.map +1 -0
- package/dist/daemon/bootstrap.d.ts +37 -0
- package/dist/daemon/bootstrap.d.ts.map +1 -0
- package/dist/daemon/bootstrap.js +448 -0
- package/dist/daemon/bootstrap.js.map +1 -0
- package/dist/daemon/dev-bootstrap.d.ts +14 -0
- package/dist/daemon/dev-bootstrap.d.ts.map +1 -0
- package/dist/daemon/dev-bootstrap.js +231 -0
- package/dist/daemon/dev-bootstrap.js.map +1 -0
- package/dist/daemon/dev-main.d.ts +3 -0
- package/dist/daemon/dev-main.d.ts.map +1 -0
- package/dist/daemon/dev-main.js +36 -0
- package/dist/daemon/dev-main.js.map +1 -0
- package/dist/daemon/index.d.ts +15 -0
- package/dist/daemon/index.d.ts.map +1 -0
- package/dist/daemon/index.js +21 -0
- package/dist/daemon/index.js.map +1 -0
- package/dist/daemon/main.d.ts +3 -0
- package/dist/daemon/main.d.ts.map +1 -0
- package/dist/daemon/main.js +29 -0
- package/dist/daemon/main.js.map +1 -0
- package/dist/daemon/orchestration-rpc.d.ts +19 -0
- package/dist/daemon/orchestration-rpc.d.ts.map +1 -0
- package/dist/daemon/orchestration-rpc.js +136 -0
- package/dist/daemon/orchestration-rpc.js.map +1 -0
- package/dist/files/download-token-store.d.ts +14 -0
- package/dist/files/download-token-store.d.ts.map +1 -0
- package/dist/files/download-token-store.js +33 -0
- package/dist/files/download-token-store.js.map +1 -0
- package/dist/files/file-explorer.d.ts +54 -0
- package/dist/files/file-explorer.d.ts.map +1 -0
- package/dist/files/file-explorer.js +182 -0
- package/dist/files/file-explorer.js.map +1 -0
- package/dist/files/file-transfer.d.ts +30 -0
- package/dist/files/file-transfer.d.ts.map +1 -0
- package/dist/files/file-transfer.js +132 -0
- package/dist/files/file-transfer.js.map +1 -0
- package/dist/files/index.d.ts +4 -0
- package/dist/files/index.d.ts.map +1 -0
- package/dist/files/index.js +5 -0
- package/dist/files/index.js.map +1 -0
- package/dist/http/host-allowlist.d.ts +15 -0
- package/dist/http/host-allowlist.d.ts.map +1 -0
- package/dist/http/host-allowlist.js +52 -0
- package/dist/http/host-allowlist.js.map +1 -0
- package/dist/http/http-server.d.ts +27 -0
- package/dist/http/http-server.d.ts.map +1 -0
- package/dist/http/http-server.js +76 -0
- package/dist/http/http-server.js.map +1 -0
- package/dist/http/index.d.ts +3 -0
- package/dist/http/index.d.ts.map +1 -0
- package/dist/http/index.js +4 -0
- package/dist/http/index.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/logging/index.d.ts +2 -0
- package/dist/logging/index.d.ts.map +1 -0
- package/dist/logging/index.js +2 -0
- package/dist/logging/index.js.map +1 -0
- package/dist/logging/logger.d.ts +48 -0
- package/dist/logging/logger.d.ts.map +1 -0
- package/dist/logging/logger.js +53 -0
- package/dist/logging/logger.js.map +1 -0
- package/dist/orchestration/chat-service.d.ts +61 -0
- package/dist/orchestration/chat-service.d.ts.map +1 -0
- package/dist/orchestration/chat-service.js +156 -0
- package/dist/orchestration/chat-service.js.map +1 -0
- package/dist/orchestration/cron.d.ts +30 -0
- package/dist/orchestration/cron.d.ts.map +1 -0
- package/dist/orchestration/cron.js +136 -0
- package/dist/orchestration/cron.js.map +1 -0
- package/dist/orchestration/index.d.ts +5 -0
- package/dist/orchestration/index.d.ts.map +1 -0
- package/dist/orchestration/index.js +6 -0
- package/dist/orchestration/index.js.map +1 -0
- package/dist/orchestration/loop-service.d.ts +129 -0
- package/dist/orchestration/loop-service.d.ts.map +1 -0
- package/dist/orchestration/loop-service.js +234 -0
- package/dist/orchestration/loop-service.js.map +1 -0
- package/dist/orchestration/schedule-service.d.ts +65 -0
- package/dist/orchestration/schedule-service.d.ts.map +1 -0
- package/dist/orchestration/schedule-service.js +201 -0
- package/dist/orchestration/schedule-service.js.map +1 -0
- package/dist/persistence/atomic-store.d.ts +45 -0
- package/dist/persistence/atomic-store.d.ts.map +1 -0
- package/dist/persistence/atomic-store.js +92 -0
- package/dist/persistence/atomic-store.js.map +1 -0
- package/dist/persistence/entity-schemas.d.ts +1707 -0
- package/dist/persistence/entity-schemas.d.ts.map +1 -0
- package/dist/persistence/entity-schemas.js +250 -0
- package/dist/persistence/entity-schemas.js.map +1 -0
- package/dist/persistence/entity-stores.d.ts +46 -0
- package/dist/persistence/entity-stores.d.ts.map +1 -0
- package/dist/persistence/entity-stores.js +167 -0
- package/dist/persistence/entity-stores.js.map +1 -0
- package/dist/persistence/index.d.ts +4 -0
- package/dist/persistence/index.d.ts.map +1 -0
- package/dist/persistence/index.js +5 -0
- package/dist/persistence/index.js.map +1 -0
- package/dist/projects/checkout-diff-manager.d.ts +44 -0
- package/dist/projects/checkout-diff-manager.d.ts.map +1 -0
- package/dist/projects/checkout-diff-manager.js +82 -0
- package/dist/projects/checkout-diff-manager.js.map +1 -0
- package/dist/projects/git-checkout-rpc.d.ts +18 -0
- package/dist/projects/git-checkout-rpc.d.ts.map +1 -0
- package/dist/projects/git-checkout-rpc.js +57 -0
- package/dist/projects/git-checkout-rpc.js.map +1 -0
- package/dist/projects/git-detect.d.ts +21 -0
- package/dist/projects/git-detect.d.ts.map +1 -0
- package/dist/projects/git-detect.js +34 -0
- package/dist/projects/git-detect.js.map +1 -0
- package/dist/projects/git-operations.d.ts +67 -0
- package/dist/projects/git-operations.d.ts.map +1 -0
- package/dist/projects/git-operations.js +200 -0
- package/dist/projects/git-operations.js.map +1 -0
- package/dist/projects/github-service.d.ts +80 -0
- package/dist/projects/github-service.d.ts.map +1 -0
- package/dist/projects/github-service.js +172 -0
- package/dist/projects/github-service.js.map +1 -0
- package/dist/projects/index.d.ts +13 -0
- package/dist/projects/index.d.ts.map +1 -0
- package/dist/projects/index.js +19 -0
- package/dist/projects/index.js.map +1 -0
- package/dist/projects/open-project.d.ts +35 -0
- package/dist/projects/open-project.d.ts.map +1 -0
- package/dist/projects/open-project.js +106 -0
- package/dist/projects/open-project.js.map +1 -0
- package/dist/projects/reconciliation.d.ts +15 -0
- package/dist/projects/reconciliation.d.ts.map +1 -0
- package/dist/projects/reconciliation.js +63 -0
- package/dist/projects/reconciliation.js.map +1 -0
- package/dist/projects/status-projection.d.ts +33 -0
- package/dist/projects/status-projection.d.ts.map +1 -0
- package/dist/projects/status-projection.js +98 -0
- package/dist/projects/status-projection.js.map +1 -0
- package/dist/projects/workspace-activity.d.ts +28 -0
- package/dist/projects/workspace-activity.d.ts.map +1 -0
- package/dist/projects/workspace-activity.js +74 -0
- package/dist/projects/workspace-activity.js.map +1 -0
- package/dist/projects/workspace-git-service.d.ts +27 -0
- package/dist/projects/workspace-git-service.d.ts.map +1 -0
- package/dist/projects/workspace-git-service.js +60 -0
- package/dist/projects/workspace-git-service.js.map +1 -0
- package/dist/projects/workspace-registry.d.ts +59 -0
- package/dist/projects/workspace-registry.d.ts.map +1 -0
- package/dist/projects/workspace-registry.js +149 -0
- package/dist/projects/workspace-registry.js.map +1 -0
- package/dist/projects/worktree-service.d.ts +100 -0
- package/dist/projects/worktree-service.d.ts.map +1 -0
- package/dist/projects/worktree-service.js +216 -0
- package/dist/projects/worktree-service.js.map +1 -0
- package/dist/proxy/index.d.ts +4 -0
- package/dist/proxy/index.d.ts.map +1 -0
- package/dist/proxy/index.js +5 -0
- package/dist/proxy/index.js.map +1 -0
- package/dist/proxy/service-hostname.d.ts +21 -0
- package/dist/proxy/service-hostname.d.ts.map +1 -0
- package/dist/proxy/service-hostname.js +44 -0
- package/dist/proxy/service-hostname.js.map +1 -0
- package/dist/proxy/service-port-registry.d.ts +36 -0
- package/dist/proxy/service-port-registry.d.ts.map +1 -0
- package/dist/proxy/service-port-registry.js +55 -0
- package/dist/proxy/service-port-registry.js.map +1 -0
- package/dist/proxy/service-proxy.d.ts +34 -0
- package/dist/proxy/service-proxy.d.ts.map +1 -0
- package/dist/proxy/service-proxy.js +54 -0
- package/dist/proxy/service-proxy.js.map +1 -0
- package/dist/terminal/index.d.ts +4 -0
- package/dist/terminal/index.d.ts.map +1 -0
- package/dist/terminal/index.js +5 -0
- package/dist/terminal/index.js.map +1 -0
- package/dist/terminal/pty-backend.d.ts +44 -0
- package/dist/terminal/pty-backend.d.ts.map +1 -0
- package/dist/terminal/pty-backend.js +119 -0
- package/dist/terminal/pty-backend.js.map +1 -0
- package/dist/terminal/screen-buffer.d.ts +21 -0
- package/dist/terminal/screen-buffer.d.ts.map +1 -0
- package/dist/terminal/screen-buffer.js +55 -0
- package/dist/terminal/screen-buffer.js.map +1 -0
- package/dist/terminal/terminal-manager.d.ts +79 -0
- package/dist/terminal/terminal-manager.d.ts.map +1 -0
- package/dist/terminal/terminal-manager.js +174 -0
- package/dist/terminal/terminal-manager.js.map +1 -0
- package/dist/terminal/terminal-rpc.d.ts +20 -0
- package/dist/terminal/terminal-rpc.d.ts.map +1 -0
- package/dist/terminal/terminal-rpc.js +122 -0
- package/dist/terminal/terminal-rpc.js.map +1 -0
- package/dist/util/concurrency.d.ts +16 -0
- package/dist/util/concurrency.d.ts.map +1 -0
- package/dist/util/concurrency.js +23 -0
- package/dist/util/concurrency.js.map +1 -0
- package/dist/util/index.d.ts +2 -0
- package/dist/util/index.d.ts.map +1 -0
- package/dist/util/index.js +2 -0
- package/dist/util/index.js.map +1 -0
- package/dist/ws/capability-store.d.ts +11 -0
- package/dist/ws/capability-store.d.ts.map +1 -0
- package/dist/ws/capability-store.js +10 -0
- package/dist/ws/capability-store.js.map +1 -0
- package/dist/ws/index.d.ts +5 -0
- package/dist/ws/index.d.ts.map +1 -0
- package/dist/ws/index.js +6 -0
- package/dist/ws/index.js.map +1 -0
- package/dist/ws/router.d.ts +34 -0
- package/dist/ws/router.d.ts.map +1 -0
- package/dist/ws/router.js +97 -0
- package/dist/ws/router.js.map +1 -0
- package/dist/ws/session.d.ts +28 -0
- package/dist/ws/session.d.ts.map +1 -0
- package/dist/ws/session.js +36 -0
- package/dist/ws/session.js.map +1 -0
- package/dist/ws/ws-server.d.ts +41 -0
- package/dist/ws/ws-server.d.ts.map +1 -0
- package/dist/ws/ws-server.js +104 -0
- package/dist/ws/ws-server.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { Unsubscribe } from "../../provider-contract.js";
|
|
2
|
+
/**
|
|
3
|
+
* Transport abstraction over a `pi --mode rpc` process (Pi RPC protocol, docs/rpc.md). The concrete
|
|
4
|
+
* implementation spawns the process; tests inject a fake.
|
|
5
|
+
*
|
|
6
|
+
* Wire shape: commands are JSON lines `{type, ...fields, id?}`; the matching reply is
|
|
7
|
+
* `{type:"response", command, success, id?, data?, error?}`; everything else is a streamed event.
|
|
8
|
+
*/
|
|
9
|
+
export interface PiTransportSpawnArgs {
|
|
10
|
+
/** Full argv (`command[0]` is the binary). */
|
|
11
|
+
args: string[];
|
|
12
|
+
cwd: string;
|
|
13
|
+
env: Record<string, string>;
|
|
14
|
+
/** Pi JSONL session file for resume/import (becomes the `nativeHandle`). */
|
|
15
|
+
sessionFile?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface PiRpcTransport {
|
|
18
|
+
/** Send a command and await its correlated `{type:"response"}`. Resolves with `data` (or rejects). */
|
|
19
|
+
request(command: string, params?: Record<string, unknown>): Promise<unknown>;
|
|
20
|
+
/** Fire-and-forget command (no response awaited), e.g. `prompt`, `abort`. */
|
|
21
|
+
notify(command: string, params?: Record<string, unknown>): void;
|
|
22
|
+
/** Subscribe to streamed events (any non-`response` line). */
|
|
23
|
+
onEvent(cb: (event: unknown) => void): Unsubscribe;
|
|
24
|
+
close(): Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
export type PiTransportFactory = (spawnArgs: PiTransportSpawnArgs) => PiRpcTransport;
|
|
27
|
+
/** Returns true if `bin` resolves to an executable (absolute/relative path or on `$PATH`). */
|
|
28
|
+
export declare function resolveBinaryOnPath(bin: string, env?: Record<string, string | undefined>): boolean;
|
|
29
|
+
/** Expand a leading `~` / `~/` to the user's home directory (clients sometimes send a literal `~`). */
|
|
30
|
+
export declare function expandHome(dir: string): string;
|
|
31
|
+
/**
|
|
32
|
+
* Resolve the `pi` CLI **bundled inside the `@earendil-works/pi-coding-agent` dependency** (its
|
|
33
|
+
* `bin` is `dist/cli.js`, a sibling of the package's `dist/index.js`). This is what lets pi-studio
|
|
34
|
+
* run the agent without a separate global `pi` install. Returns `null` if the package isn't present.
|
|
35
|
+
*
|
|
36
|
+
* Note: `import.meta.resolve` is used (not `require.resolve`) because the package's `exports` map
|
|
37
|
+
* only defines the `import` condition, so CJS resolution throws `ERR_PACKAGE_PATH_NOT_EXPORTED`.
|
|
38
|
+
*/
|
|
39
|
+
export declare function resolveBundledPiCli(): string | null;
|
|
40
|
+
/**
|
|
41
|
+
* Default Pi launch command. Prefers the bundled CLI (`node <pkg>/dist/cli.js --mode rpc`) so no
|
|
42
|
+
* global install is required; falls back to a global `pi --mode rpc` on `$PATH` if the dependency
|
|
43
|
+
* is absent.
|
|
44
|
+
*/
|
|
45
|
+
export declare function defaultPiCommand(): string[];
|
|
46
|
+
/**
|
|
47
|
+
* Default transport: spawn `pi --mode rpc` and frame JSON commands/events over stdio per the Pi RPC
|
|
48
|
+
* protocol. Framing is strict JSONL: split on `\n` only, strip an optional trailing `\r`. (Node's
|
|
49
|
+
* `readline` is intentionally avoided — it also splits on U+2028/U+2029, which are valid inside JSON
|
|
50
|
+
* strings and would corrupt records.)
|
|
51
|
+
*/
|
|
52
|
+
export declare function createProcessTransport(spawnArgs: PiTransportSpawnArgs): PiRpcTransport;
|
|
53
|
+
//# sourceMappingURL=rpc-transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc-transport.d.ts","sourceRoot":"","sources":["../../../../src/agent/providers/pi/rpc-transport.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAE9D;;;;;;GAMG;AAEH,MAAM,WAAW,oBAAoB;IACnC,8CAA8C;IAC9C,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,sGAAsG;IACtG,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7E,6EAA6E;IAC7E,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAChE,8DAA8D;IAC9D,OAAO,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,WAAW,CAAC;IACnD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,MAAM,MAAM,kBAAkB,GAAG,CAAC,SAAS,EAAE,oBAAoB,KAAK,cAAc,CAAC;AAErF,8FAA8F;AAC9F,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,EACX,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GACpD,OAAO,CAGT;AAED,uGAAuG;AACvG,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAI9C;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,GAAG,IAAI,CAmBnD;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,EAAE,CAI3C;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,oBAAoB,GAAG,cAAc,CA0HtF"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { dirname, join } from "node:path";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
import treeKill from "tree-kill";
|
|
7
|
+
import which from "which";
|
|
8
|
+
/** Returns true if `bin` resolves to an executable (absolute/relative path or on `$PATH`). */
|
|
9
|
+
export function resolveBinaryOnPath(bin, env = process.env) {
|
|
10
|
+
if (bin.includes("/") || bin.includes("\\"))
|
|
11
|
+
return existsSync(bin);
|
|
12
|
+
return which.sync(bin, { nothrow: true, path: env.PATH ?? env.Path }) !== null;
|
|
13
|
+
}
|
|
14
|
+
/** Expand a leading `~` / `~/` to the user's home directory (clients sometimes send a literal `~`). */
|
|
15
|
+
export function expandHome(dir) {
|
|
16
|
+
if (dir === "~")
|
|
17
|
+
return homedir();
|
|
18
|
+
if (dir.startsWith("~/"))
|
|
19
|
+
return join(homedir(), dir.slice(2));
|
|
20
|
+
return dir;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Resolve the `pi` CLI **bundled inside the `@earendil-works/pi-coding-agent` dependency** (its
|
|
24
|
+
* `bin` is `dist/cli.js`, a sibling of the package's `dist/index.js`). This is what lets pi-studio
|
|
25
|
+
* run the agent without a separate global `pi` install. Returns `null` if the package isn't present.
|
|
26
|
+
*
|
|
27
|
+
* Note: `import.meta.resolve` is used (not `require.resolve`) because the package's `exports` map
|
|
28
|
+
* only defines the `import` condition, so CJS resolution throws `ERR_PACKAGE_PATH_NOT_EXPORTED`.
|
|
29
|
+
*/
|
|
30
|
+
export function resolveBundledPiCli() {
|
|
31
|
+
// 1) ESM resolution — works in the compiled daemon (real `node` ESM).
|
|
32
|
+
try {
|
|
33
|
+
const indexPath = fileURLToPath(import.meta.resolve("@earendil-works/pi-coding-agent"));
|
|
34
|
+
const cli = join(dirname(indexPath), "cli.js");
|
|
35
|
+
if (existsSync(cli))
|
|
36
|
+
return cli;
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
// `import.meta.resolve` is unavailable under some loaders (e.g. vitest); fall through.
|
|
40
|
+
}
|
|
41
|
+
// 2) Walk up from cwd looking for the dependency in node_modules (loader-independent).
|
|
42
|
+
const rel = join("node_modules", "@earendil-works", "pi-coding-agent", "dist", "cli.js");
|
|
43
|
+
let dir = process.cwd();
|
|
44
|
+
for (;;) {
|
|
45
|
+
const candidate = join(dir, rel);
|
|
46
|
+
if (existsSync(candidate))
|
|
47
|
+
return candidate;
|
|
48
|
+
const parent = dirname(dir);
|
|
49
|
+
if (parent === dir)
|
|
50
|
+
return null;
|
|
51
|
+
dir = parent;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Default Pi launch command. Prefers the bundled CLI (`node <pkg>/dist/cli.js --mode rpc`) so no
|
|
56
|
+
* global install is required; falls back to a global `pi --mode rpc` on `$PATH` if the dependency
|
|
57
|
+
* is absent.
|
|
58
|
+
*/
|
|
59
|
+
export function defaultPiCommand() {
|
|
60
|
+
const cli = resolveBundledPiCli();
|
|
61
|
+
if (cli)
|
|
62
|
+
return [process.execPath, cli, "--mode", "rpc"];
|
|
63
|
+
return ["pi", "--mode", "rpc"];
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Default transport: spawn `pi --mode rpc` and frame JSON commands/events over stdio per the Pi RPC
|
|
67
|
+
* protocol. Framing is strict JSONL: split on `\n` only, strip an optional trailing `\r`. (Node's
|
|
68
|
+
* `readline` is intentionally avoided — it also splits on U+2028/U+2029, which are valid inside JSON
|
|
69
|
+
* strings and would corrupt records.)
|
|
70
|
+
*/
|
|
71
|
+
export function createProcessTransport(spawnArgs) {
|
|
72
|
+
const [command, ...rest] = spawnArgs.args;
|
|
73
|
+
const child = spawn(command, rest, {
|
|
74
|
+
cwd: expandHome(spawnArgs.cwd),
|
|
75
|
+
env: { ...process.env, ...spawnArgs.env },
|
|
76
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
77
|
+
});
|
|
78
|
+
const pending = new Map();
|
|
79
|
+
const eventCbs = new Set();
|
|
80
|
+
let nextId = 0;
|
|
81
|
+
/** Set once the process fails to spawn or exits abnormally; all further calls reject with it. */
|
|
82
|
+
let failure = null;
|
|
83
|
+
const failAll = (error) => {
|
|
84
|
+
failure = error;
|
|
85
|
+
for (const [, p] of pending)
|
|
86
|
+
p.reject(error);
|
|
87
|
+
pending.clear();
|
|
88
|
+
// Surface as a stream event so the session can emit an `error` timeline entry.
|
|
89
|
+
for (const cb of eventCbs)
|
|
90
|
+
cb({ type: "error", error: error.message });
|
|
91
|
+
};
|
|
92
|
+
// CRITICAL: a missing binary emits an async 'error' event. Without this listener Node rethrows it
|
|
93
|
+
// as an unhandled error and crashes the whole daemon. Convert it into a clean operation failure.
|
|
94
|
+
child.on("error", (err) => {
|
|
95
|
+
failAll(err.message.includes("ENOENT")
|
|
96
|
+
? new Error(`failed to spawn '${command}': not found on PATH. Install the Pi CLI or use the mock provider.`)
|
|
97
|
+
: err);
|
|
98
|
+
});
|
|
99
|
+
child.on("exit", (code, signal) => {
|
|
100
|
+
if (pending.size > 0) {
|
|
101
|
+
failAll(new Error(`pi process exited (code ${code ?? "null"}${signal ? `, ${signal}` : ""})`));
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
child.stdin?.on("error", () => {
|
|
105
|
+
// Broken pipe after the process died; the exit/error handler already reports it.
|
|
106
|
+
});
|
|
107
|
+
const writeStdin = (payload) => {
|
|
108
|
+
if (failure || !child.stdin || child.stdin.destroyed)
|
|
109
|
+
return false;
|
|
110
|
+
try {
|
|
111
|
+
child.stdin.write(payload);
|
|
112
|
+
return true;
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
// Strict JSONL reader: split on \n only, strip a trailing \r.
|
|
119
|
+
let buffer = "";
|
|
120
|
+
const handleLine = (line) => {
|
|
121
|
+
const text = (line.endsWith("\r") ? line.slice(0, -1) : line).trim();
|
|
122
|
+
if (!text)
|
|
123
|
+
return;
|
|
124
|
+
let msg;
|
|
125
|
+
try {
|
|
126
|
+
msg = JSON.parse(text);
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
const record = msg;
|
|
132
|
+
if (record.type === "response") {
|
|
133
|
+
const id = record.id === undefined ? undefined : String(record.id);
|
|
134
|
+
if (id && pending.has(id)) {
|
|
135
|
+
const p = pending.get(id);
|
|
136
|
+
pending.delete(id);
|
|
137
|
+
if (record.success === false)
|
|
138
|
+
p?.reject(new Error(String(record.error ?? "command failed")));
|
|
139
|
+
else
|
|
140
|
+
p?.resolve(record.data ?? record);
|
|
141
|
+
}
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
for (const cb of eventCbs)
|
|
145
|
+
cb(msg);
|
|
146
|
+
};
|
|
147
|
+
child.stdout?.on("data", (chunk) => {
|
|
148
|
+
buffer += chunk.toString("utf8");
|
|
149
|
+
let nl = buffer.indexOf("\n");
|
|
150
|
+
while (nl !== -1) {
|
|
151
|
+
handleLine(buffer.slice(0, nl));
|
|
152
|
+
buffer = buffer.slice(nl + 1);
|
|
153
|
+
nl = buffer.indexOf("\n");
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
return {
|
|
157
|
+
request(commandType, params = {}) {
|
|
158
|
+
const id = `c${nextId++}`;
|
|
159
|
+
return new Promise((resolve, reject) => {
|
|
160
|
+
if (failure) {
|
|
161
|
+
reject(failure);
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
pending.set(id, { resolve, reject });
|
|
165
|
+
if (!writeStdin(`${JSON.stringify({ type: commandType, ...params, id })}\n`)) {
|
|
166
|
+
pending.delete(id);
|
|
167
|
+
reject(failure ?? new Error("pi transport is not writable"));
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
},
|
|
171
|
+
notify(commandType, params = {}) {
|
|
172
|
+
writeStdin(`${JSON.stringify({ type: commandType, ...params })}\n`);
|
|
173
|
+
},
|
|
174
|
+
onEvent(cb) {
|
|
175
|
+
eventCbs.add(cb);
|
|
176
|
+
return () => eventCbs.delete(cb);
|
|
177
|
+
},
|
|
178
|
+
close() {
|
|
179
|
+
// Kill the whole `pi` process tree so any helpers it spawned don't linger.
|
|
180
|
+
if (child.pid !== undefined) {
|
|
181
|
+
treeKill(child.pid, "SIGTERM", () => {
|
|
182
|
+
// best-effort
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
child.kill();
|
|
186
|
+
return Promise.resolve();
|
|
187
|
+
},
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=rpc-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc-transport.js","sourceRoot":"","sources":["../../../../src/agent/providers/pi/rpc-transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { TimelineRow } from "../../timeline-store.js";
|
|
2
|
+
/**
|
|
3
|
+
* Load a Pi session file and replay its active branch into daemon `TimelineRow`s, wrapped with
|
|
4
|
+
* `turn_started`/`turn_completed` (or `turn_failed`/`turn_canceled`, per the closing assistant
|
|
5
|
+
* message's `stopReason`) markers around each user→assistant exchange — the same shape
|
|
6
|
+
* `projectRows` (`timeline-store.ts`) groups for a live run. Each turn gets its own epoch. Returns
|
|
7
|
+
* `[]` for a missing/corrupt/empty file (never throws — a stale handle degrades to an empty
|
|
8
|
+
* timeline, not a crash).
|
|
9
|
+
*/
|
|
10
|
+
export declare function hydrateTimelineFromSessionFile(sessionFile: string): TimelineRow[];
|
|
11
|
+
//# sourceMappingURL=session-hydration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-hydration.d.ts","sourceRoot":"","sources":["../../../../src/agent/providers/pi/session-hydration.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAyG3D;;;;;;;GAOG;AACH,wBAAgB,8BAA8B,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,EAAE,CA2DjF"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { SessionManager } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import { mapToolCall } from "./event-mapper.js";
|
|
3
|
+
/**
|
|
4
|
+
* Rehydrate a daemon `TimelineRow[]` from Pi's own on-disk JSONL session file (docs:
|
|
5
|
+
* session-format.md § SessionMessageEntry). Pi persists the full conversation (messages, tool
|
|
6
|
+
* calls/results, diffs) independently of Pi-Studio's daemon-owned `AgentTimelineStore`, which
|
|
7
|
+
* lives only in memory and is lost on daemon restart. Rather than duplicating that persistence,
|
|
8
|
+
* the daemon rebuilds its timeline from Pi's file on demand — the single source of truth for
|
|
9
|
+
* conversation content is Pi's session file, not a daemon-side copy.
|
|
10
|
+
*
|
|
11
|
+
* Only the active branch (root → current leaf, resolved through forks/compaction by
|
|
12
|
+
* `SessionManager.getBranch()`) is replayed — exactly what the live session would have streamed.
|
|
13
|
+
* Row timestamps are taken from the originating session entry (Pi-owned replay time), matching the
|
|
14
|
+
* "daemon-owned, provider-may-supply-original-replay-timestamps" rule in timeline-streaming.md.
|
|
15
|
+
*/
|
|
16
|
+
function asRecord(value) {
|
|
17
|
+
return value && typeof value === "object" ? value : {};
|
|
18
|
+
}
|
|
19
|
+
function textOf(content) {
|
|
20
|
+
if (typeof content === "string")
|
|
21
|
+
return content;
|
|
22
|
+
if (!Array.isArray(content))
|
|
23
|
+
return "";
|
|
24
|
+
return content
|
|
25
|
+
.filter((block) => asRecord(block).type === "text")
|
|
26
|
+
.map((block) => block.text ?? "")
|
|
27
|
+
.join("");
|
|
28
|
+
}
|
|
29
|
+
/** ISO timestamp for an entry: session entries use ISO strings; message timestamps are epoch-ms. */
|
|
30
|
+
function timestampOf(entry) {
|
|
31
|
+
if (entry.type === "message") {
|
|
32
|
+
const ts = asRecord(entry.message).timestamp;
|
|
33
|
+
if (typeof ts === "number")
|
|
34
|
+
return new Date(ts).toISOString();
|
|
35
|
+
}
|
|
36
|
+
return entry.timestamp;
|
|
37
|
+
}
|
|
38
|
+
/** Map one `SessionMessageEntry.message` (an `AgentMessage`) to zero or more stream events. */
|
|
39
|
+
function mapMessage(message) {
|
|
40
|
+
const m = asRecord(message);
|
|
41
|
+
switch (m.role) {
|
|
42
|
+
case "user":
|
|
43
|
+
return [{ kind: "user_message", text: textOf(m.content) }];
|
|
44
|
+
case "assistant": {
|
|
45
|
+
const events = [];
|
|
46
|
+
const blocks = Array.isArray(m.content) ? m.content : [];
|
|
47
|
+
for (const raw of blocks) {
|
|
48
|
+
const block = asRecord(raw);
|
|
49
|
+
if (block.type === "text" && typeof block.text === "string" && block.text) {
|
|
50
|
+
events.push({ kind: "assistant_message", text: block.text });
|
|
51
|
+
}
|
|
52
|
+
else if (block.type === "thinking" && typeof block.thinking === "string") {
|
|
53
|
+
events.push({ kind: "reasoning", text: block.thinking });
|
|
54
|
+
}
|
|
55
|
+
else if (block.type === "toolCall") {
|
|
56
|
+
events.push({
|
|
57
|
+
kind: "tool_call",
|
|
58
|
+
callId: typeof block.id === "string" ? block.id : undefined,
|
|
59
|
+
tool: mapToolCall({ name: block.name, arguments: block.arguments }),
|
|
60
|
+
status: "running",
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return events;
|
|
65
|
+
}
|
|
66
|
+
case "toolResult":
|
|
67
|
+
return [
|
|
68
|
+
{
|
|
69
|
+
kind: "tool_call",
|
|
70
|
+
callId: typeof m.toolCallId === "string" ? m.toolCallId : undefined,
|
|
71
|
+
tool: mapToolCall({
|
|
72
|
+
name: m.toolName,
|
|
73
|
+
result: { details: asRecord(m.details), content: m.content },
|
|
74
|
+
}),
|
|
75
|
+
status: m.isError ? "error" : "completed",
|
|
76
|
+
},
|
|
77
|
+
];
|
|
78
|
+
case "bashExecution":
|
|
79
|
+
return [
|
|
80
|
+
{
|
|
81
|
+
kind: "tool_call",
|
|
82
|
+
tool: {
|
|
83
|
+
kind: "shell",
|
|
84
|
+
command: typeof m.command === "string" ? m.command : undefined,
|
|
85
|
+
output: typeof m.output === "string" ? m.output : undefined,
|
|
86
|
+
},
|
|
87
|
+
status: m.exitCode === 0 || m.exitCode === undefined ? "completed" : "error",
|
|
88
|
+
},
|
|
89
|
+
];
|
|
90
|
+
default:
|
|
91
|
+
// custom / branchSummary / compactionSummary entries carry no user-facing timeline row.
|
|
92
|
+
return [];
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/** Map one session-file entry (message or otherwise) to zero or more stream events. */
|
|
96
|
+
function mapEntry(entry) {
|
|
97
|
+
if (entry.type === "message")
|
|
98
|
+
return mapMessage(entry.message);
|
|
99
|
+
return [];
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Load a Pi session file and replay its active branch into daemon `TimelineRow`s, wrapped with
|
|
103
|
+
* `turn_started`/`turn_completed` (or `turn_failed`/`turn_canceled`, per the closing assistant
|
|
104
|
+
* message's `stopReason`) markers around each user→assistant exchange — the same shape
|
|
105
|
+
* `projectRows` (`timeline-store.ts`) groups for a live run. Each turn gets its own epoch. Returns
|
|
106
|
+
* `[]` for a missing/corrupt/empty file (never throws — a stale handle degrades to an empty
|
|
107
|
+
* timeline, not a crash).
|
|
108
|
+
*/
|
|
109
|
+
export function hydrateTimelineFromSessionFile(sessionFile) {
|
|
110
|
+
let entries;
|
|
111
|
+
try {
|
|
112
|
+
entries = SessionManager.open(sessionFile).getBranch();
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
return [];
|
|
116
|
+
}
|
|
117
|
+
const rows = [];
|
|
118
|
+
let epoch = 0;
|
|
119
|
+
let seq = 0;
|
|
120
|
+
let turnOpen = false;
|
|
121
|
+
/** Closer for the turn in progress, refined as assistant messages arrive within it. */
|
|
122
|
+
let turnCloser = { kind: "turn_completed" };
|
|
123
|
+
let turnCloserTimestamp = "";
|
|
124
|
+
const push = (event, timestamp) => {
|
|
125
|
+
rows.push({ epoch, seq: seq++, timestamp, event });
|
|
126
|
+
};
|
|
127
|
+
const closeTurn = () => {
|
|
128
|
+
if (!turnOpen)
|
|
129
|
+
return;
|
|
130
|
+
push(turnCloser, turnCloserTimestamp);
|
|
131
|
+
turnOpen = false;
|
|
132
|
+
};
|
|
133
|
+
for (const entry of entries) {
|
|
134
|
+
const timestamp = timestampOf(entry);
|
|
135
|
+
const isUserMessage = entry.type === "message" && asRecord(entry.message).role === "user";
|
|
136
|
+
if (isUserMessage) {
|
|
137
|
+
closeTurn();
|
|
138
|
+
epoch++;
|
|
139
|
+
for (const event of mapEntry(entry))
|
|
140
|
+
push(event, timestamp);
|
|
141
|
+
push({ kind: "turn_started" }, timestamp);
|
|
142
|
+
turnOpen = true;
|
|
143
|
+
turnCloser = { kind: "turn_completed" };
|
|
144
|
+
turnCloserTimestamp = timestamp;
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
if (entry.type === "message" && asRecord(entry.message).role === "assistant") {
|
|
148
|
+
const stopReason = asRecord(entry.message).stopReason;
|
|
149
|
+
if (stopReason === "error") {
|
|
150
|
+
const errorMessage = asRecord(entry.message).errorMessage;
|
|
151
|
+
turnCloser = {
|
|
152
|
+
kind: "turn_failed",
|
|
153
|
+
error: typeof errorMessage === "string" ? errorMessage : "turn failed",
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
else if (stopReason === "aborted") {
|
|
157
|
+
turnCloser = { kind: "turn_canceled" };
|
|
158
|
+
}
|
|
159
|
+
turnCloserTimestamp = timestamp;
|
|
160
|
+
}
|
|
161
|
+
for (const event of mapEntry(entry))
|
|
162
|
+
push(event, timestamp);
|
|
163
|
+
}
|
|
164
|
+
closeTurn();
|
|
165
|
+
return rows;
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=session-hydration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-hydration.js","sourceRoot":"","sources":["../../../../src/agent/providers/pi/session-hydration.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { HandlerRegistry } from "../ws/router.js";
|
|
2
|
+
import { AgentTimelineStore as TimelineStore } from "./timeline-store.js";
|
|
3
|
+
export interface RewindDeps {
|
|
4
|
+
/** Look up an agent's timeline store by agentId. Returns undefined if not found. */
|
|
5
|
+
getTimelineStore: (agentId: string) => TimelineStore | undefined;
|
|
6
|
+
/**
|
|
7
|
+
* Revert workspace file changes since the checkpoint at / before messageId.
|
|
8
|
+
* For worktree-backed workspaces this means a git-based revert.
|
|
9
|
+
* Returns a promise that resolves on success or rejects on failure.
|
|
10
|
+
* TODO(verify): exact checkpoint strategy for non-git workspaces.
|
|
11
|
+
*/
|
|
12
|
+
revertFilesSince: (agentId: string, messageId: string) => Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
export declare function registerRewindHandler(registry: HandlerRegistry, deps: RewindDeps): void;
|
|
15
|
+
//# sourceMappingURL=rewind-rpc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rewind-rpc.d.ts","sourceRoot":"","sources":["../../src/agent/rewind-rpc.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,eAAe,EAAqB,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,kBAAkB,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAE1E,MAAM,WAAW,UAAU;IACzB,oFAAoF;IACpF,gBAAgB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,aAAa,GAAG,SAAS,CAAC;IACjE;;;;;OAKG;IACH,gBAAgB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACzE;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,eAAe,EAAE,IAAI,EAAE,UAAU,GAAG,IAAI,CA4BvF"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// Rewind RPC handler — sprint-015/task-007.
|
|
2
|
+
// features/rewind.md § Wire contract, § Behavior & Algorithms (daemon side)
|
|
3
|
+
import { agentRewindRequestSchema, agentRewindResponseSchema, } from "@av-pi-studio/protocol";
|
|
4
|
+
import { AgentTimelineStore as TimelineStore } from "./timeline-store.js";
|
|
5
|
+
export function registerRewindHandler(registry, deps) {
|
|
6
|
+
registry.register("agent.rewind.request", async (ctx) => {
|
|
7
|
+
const parsed = agentRewindRequestSchema.safeParse(ctx.message);
|
|
8
|
+
if (!parsed.success)
|
|
9
|
+
throw new Error(`Invalid rewind request: ${parsed.error.message}`);
|
|
10
|
+
const { agentId, messageId, mode, requestId } = parsed.data;
|
|
11
|
+
const rewindConversation = mode !== "files";
|
|
12
|
+
const rewindFiles = mode !== "conversation";
|
|
13
|
+
let truncatedAt;
|
|
14
|
+
if (rewindConversation) {
|
|
15
|
+
const store = deps.getTimelineStore(agentId);
|
|
16
|
+
if (!store)
|
|
17
|
+
throw new Error(`Agent not found: ${agentId}`);
|
|
18
|
+
truncatedAt = store.truncateBeforeMessage(messageId);
|
|
19
|
+
}
|
|
20
|
+
if (rewindFiles) {
|
|
21
|
+
await deps.revertFilesSince(agentId, messageId);
|
|
22
|
+
}
|
|
23
|
+
return agentRewindResponseSchema.parse({
|
|
24
|
+
type: "agent.rewind.response",
|
|
25
|
+
requestId,
|
|
26
|
+
payload: { agentId, messageId, mode, truncatedAt },
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=rewind-rpc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rewind-rpc.js","sourceRoot":"","sources":["../../src/agent/rewind-rpc.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,4EAA4E;AAE5E,OAAO,EACL,wBAAwB,EACxB,yBAAyB,GAG1B,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,kBAAkB,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAc1E,MAAM,UAAU,qBAAqB,CAAC,QAAyB,EAAE,IAAgB;IAC/E,QAAQ,CAAC,QAAQ,CAAC,sBAAsB,EAAE,KAAK,EAAE,GAAsB,EAAE,EAAE;QACzE,MAAM,MAAM,GAAG,wBAAwB,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC/D,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAExF,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;QAE5D,MAAM,kBAAkB,GAAG,IAAI,KAAK,OAAO,CAAC;QAC5C,MAAM,WAAW,GAAG,IAAI,KAAK,cAAc,CAAC;QAE5C,IAAI,WAA+B,CAAC;QAEpC,IAAI,kBAAkB,EAAE,CAAC;YACvB,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAC7C,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;YAC3D,WAAW,GAAG,KAAK,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;QACvD,CAAC;QAED,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAClD,CAAC;QAED,OAAO,yBAAyB,CAAC,KAAK,CAAC;YACrC,IAAI,EAAE,uBAAuB;YAC7B,SAAS;YACT,OAAO,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE;SACnD,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
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
|
+
import type { AgentClient } from "./provider-contract.js";
|
|
5
|
+
import type { AgentService } from "./agent-service.js";
|
|
6
|
+
/**
|
|
7
|
+
* Session operations beyond create/first-run (features/agent-sessions.md § Other operations,
|
|
8
|
+
* features/agent-providers.md § Import & resume):
|
|
9
|
+
* - interrupt current turn → `turn_canceled` → `idle`
|
|
10
|
+
* - update config (model/mode/thinking/features/title) without recreating the session
|
|
11
|
+
* - resume a closed session via PersistenceHandle
|
|
12
|
+
* - import a native provider session (seed timeline → publish)
|
|
13
|
+
*/
|
|
14
|
+
export interface SessionOpsDeps {
|
|
15
|
+
manager: AgentManager;
|
|
16
|
+
resolveClient: (provider: string) => AgentClient;
|
|
17
|
+
service: AgentService;
|
|
18
|
+
broadcast: (sessions: Iterable<Session>, message: unknown) => void;
|
|
19
|
+
now?: () => string;
|
|
20
|
+
}
|
|
21
|
+
export declare class SessionOperationsService {
|
|
22
|
+
private readonly deps;
|
|
23
|
+
private readonly now;
|
|
24
|
+
constructor(deps: SessionOpsDeps);
|
|
25
|
+
registerHandlers(registry: HandlerRegistry, getActiveSessions: () => Iterable<Session>): void;
|
|
26
|
+
private broadcastAll;
|
|
27
|
+
handleInterrupt(msg: Record<string, unknown>, getSessions: () => Iterable<Session>): Promise<unknown>;
|
|
28
|
+
handleUpdate(msg: Record<string, unknown>, getSessions: () => Iterable<Session>): Promise<unknown>;
|
|
29
|
+
handleResume(msg: Record<string, unknown>, getSessions: () => Iterable<Session>): Promise<unknown>;
|
|
30
|
+
handleImport(msg: Record<string, unknown>, getSessions: () => Iterable<Session>): Promise<unknown>;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=session-operations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-operations.d.ts","sourceRoot":"","sources":["../../src/agent/session-operations.ts"],"names":[],"mappings":"AAGA,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;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD;;;;;;;GAOG;AAEH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,YAAY,CAAC;IACtB,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,WAAW,CAAC;IACjD,OAAO,EAAE,YAAY,CAAC;IACtB,SAAS,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACnE,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,qBAAa,wBAAwB;IAGvB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFjC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;gBAEN,IAAI,EAAE,cAAc;IAIjD,gBAAgB,CAAC,QAAQ,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC,OAAO,CAAC,GAAG,IAAI;IAiB7F,OAAO,CAAC,YAAY;IAId,eAAe,CACnB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,WAAW,EAAE,MAAM,QAAQ,CAAC,OAAO,CAAC,GACnC,OAAO,CAAC,OAAO,CAAC;IAeb,YAAY,CAChB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,WAAW,EAAE,MAAM,QAAQ,CAAC,OAAO,CAAC,GACnC,OAAO,CAAC,OAAO,CAAC;IAyCb,YAAY,CAChB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,WAAW,EAAE,MAAM,QAAQ,CAAC,OAAO,CAAC,GACnC,OAAO,CAAC,OAAO,CAAC;IA0Bb,YAAY,CAChB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,WAAW,EAAE,MAAM,QAAQ,CAAC,OAAO,CAAC,GACnC,OAAO,CAAC,OAAO,CAAC;CAsCpB"}
|