@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,107 @@
|
|
|
1
|
+
import type { AgentStatus } from "@av-pi-studio/protocol";
|
|
2
|
+
import type { AgentRecord } from "../persistence/entity-schemas.js";
|
|
3
|
+
import type { AgentSession } from "./provider-contract.js";
|
|
4
|
+
/**
|
|
5
|
+
* AgentManager — the single source of truth for agent lifecycle state
|
|
6
|
+
* (architecture/agent-lifecycle.md § States / § Lifecycle status semantics / § Relationship labels,
|
|
7
|
+
* daemon-bootstrap.md § Recovery). State changes persist to the agent record AND broadcast
|
|
8
|
+
* `agent_update` to all subscribers. Status is **literal**: a parent stays `idle` even while a child
|
|
9
|
+
* runs.
|
|
10
|
+
*/
|
|
11
|
+
export declare const PARENT_AGENT_ID_LABEL = "pi-studio.parent-agent-id";
|
|
12
|
+
/** A managed agent: its persisted record, optional live session, and derived parent id. */
|
|
13
|
+
export interface ManagedAgent {
|
|
14
|
+
record: AgentRecord;
|
|
15
|
+
session: AgentSession | null;
|
|
16
|
+
parentAgentId: string | null;
|
|
17
|
+
}
|
|
18
|
+
/** Broadcast shape for an `agent_update` (matches the protocol session message). */
|
|
19
|
+
export interface AgentUpdateBroadcast {
|
|
20
|
+
type: "agent_update";
|
|
21
|
+
agentId: string;
|
|
22
|
+
status: AgentStatus;
|
|
23
|
+
title?: string;
|
|
24
|
+
labels: Record<string, string>;
|
|
25
|
+
}
|
|
26
|
+
/** Broadcast shape for an `agent_archived` lifecycle event. */
|
|
27
|
+
export interface AgentArchivedBroadcast {
|
|
28
|
+
type: "agent_archived";
|
|
29
|
+
agentId: string;
|
|
30
|
+
archivedAt: string;
|
|
31
|
+
}
|
|
32
|
+
/** Broadcast shape for an `agent_deleted` lifecycle event (hard delete — no persisted trace). */
|
|
33
|
+
export interface AgentDeletedBroadcast {
|
|
34
|
+
type: "agent_deleted";
|
|
35
|
+
agentId: string;
|
|
36
|
+
}
|
|
37
|
+
export type AgentManagerEvent = AgentUpdateBroadcast | AgentArchivedBroadcast | AgentDeletedBroadcast;
|
|
38
|
+
export type AgentManagerSubscriber = (event: AgentManagerEvent) => void;
|
|
39
|
+
export declare class InvalidAgentTransitionError extends Error {
|
|
40
|
+
constructor(from: AgentStatus, to: AgentStatus);
|
|
41
|
+
}
|
|
42
|
+
export declare function canTransition(from: AgentStatus, to: AgentStatus): boolean;
|
|
43
|
+
export interface AgentManagerDeps {
|
|
44
|
+
home: string;
|
|
45
|
+
saveAgent?: (record: AgentRecord) => Promise<void>;
|
|
46
|
+
loadAllAgents?: () => Promise<AgentRecord[]>;
|
|
47
|
+
/** Delete a persisted agent record file by (cwd, id). Injectable for tests. */
|
|
48
|
+
deleteAgent?: (cwd: string, id: string) => Promise<boolean>;
|
|
49
|
+
/** Loop service hook: recover `running` loops as `stopped` with an interruption log entry. */
|
|
50
|
+
onRecoverLoops?: () => Promise<void> | void;
|
|
51
|
+
now?: () => string;
|
|
52
|
+
}
|
|
53
|
+
export declare class AgentManager {
|
|
54
|
+
private readonly deps;
|
|
55
|
+
private readonly agents;
|
|
56
|
+
private readonly subscribers;
|
|
57
|
+
private readonly save;
|
|
58
|
+
private readonly loadAll;
|
|
59
|
+
private readonly delete;
|
|
60
|
+
private readonly now;
|
|
61
|
+
constructor(deps: AgentManagerDeps);
|
|
62
|
+
subscribe(cb: AgentManagerSubscriber): () => void;
|
|
63
|
+
private broadcast;
|
|
64
|
+
private wrap;
|
|
65
|
+
/** Register a new agent: persist + broadcast its initial state. */
|
|
66
|
+
add(record: AgentRecord): Promise<ManagedAgent>;
|
|
67
|
+
attachSession(id: string, session: AgentSession): void;
|
|
68
|
+
/**
|
|
69
|
+
* Snapshot and persist the live session's resume handle (e.g. Pi's on-disk JSONL session file)
|
|
70
|
+
* onto the record. Called right after session creation/attach so a plain daemon restart — not
|
|
71
|
+
* just an archive — leaves a handle behind: without one, `fetch_agent_timeline_request` has no
|
|
72
|
+
* way to rebuild an agent's conversation once its in-memory timeline is gone
|
|
73
|
+
* (architecture/persistence.md § Agent record `persistence` field).
|
|
74
|
+
*/
|
|
75
|
+
persistSessionHandle(id: string): Promise<void>;
|
|
76
|
+
/** Transition an agent's `lastStatus`, persisting and broadcasting the change. */
|
|
77
|
+
setStatus(id: string, status: AgentStatus): Promise<ManagedAgent>;
|
|
78
|
+
get(id: string): ManagedAgent | undefined;
|
|
79
|
+
/** Active (non-archived) agents. */
|
|
80
|
+
list(): ManagedAgent[];
|
|
81
|
+
/** Every tracked agent, including archived. */
|
|
82
|
+
listAll(): ManagedAgent[];
|
|
83
|
+
parentAgentId(id: string): string | null;
|
|
84
|
+
private broadcastArchived;
|
|
85
|
+
/**
|
|
86
|
+
* Archive (soft delete) an agent and recursively cascade to its non-detached children
|
|
87
|
+
* (architecture/agent-lifecycle.md § Archive). Snapshots the session's persistence handle, sets
|
|
88
|
+
* `archivedAt`, normalizes `lastStatus` away from running/initializing, notifies subscribers,
|
|
89
|
+
* closes/kills the runtime, then archives each child whose parent label points at this agent.
|
|
90
|
+
* Detached agents (no parent label) are never cascade-archived. Idempotent.
|
|
91
|
+
*/
|
|
92
|
+
archiveAgent(id: string): Promise<void>;
|
|
93
|
+
private broadcastDeleted;
|
|
94
|
+
/**
|
|
95
|
+
* Hard-delete an agent: closes/kills any live runtime, removes its persisted record file from
|
|
96
|
+
* disk, drops it from memory, and recursively cascades to its non-detached children — same
|
|
97
|
+
* cascade rule as `archiveAgent`. Unlike archive, there is no trace left to resume from. Returns
|
|
98
|
+
* true if the agent existed (false = already gone, still idempotent/no-op).
|
|
99
|
+
*/
|
|
100
|
+
deleteAgent(id: string): Promise<boolean>;
|
|
101
|
+
/**
|
|
102
|
+
* Boot recovery: rehydrate persisted agents (runtime is NOT auto-resumed — records only), then run
|
|
103
|
+
* the loop-recovery hook (`running` loops → `stopped`). Returns the number of agents reloaded.
|
|
104
|
+
*/
|
|
105
|
+
recover(): Promise<number>;
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=agent-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-manager.d.ts","sourceRoot":"","sources":["../../src/agent/agent-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import { deleteAgent as deleteAgentFromDisk, loadAllAgents as loadAllAgentsFromDisk, saveAgent as saveAgentToDisk, } from "../persistence/entity-stores.js";
|
|
2
|
+
/**
|
|
3
|
+
* AgentManager — the single source of truth for agent lifecycle state
|
|
4
|
+
* (architecture/agent-lifecycle.md § States / § Lifecycle status semantics / § Relationship labels,
|
|
5
|
+
* daemon-bootstrap.md § Recovery). State changes persist to the agent record AND broadcast
|
|
6
|
+
* `agent_update` to all subscribers. Status is **literal**: a parent stays `idle` even while a child
|
|
7
|
+
* runs.
|
|
8
|
+
*/
|
|
9
|
+
export const PARENT_AGENT_ID_LABEL = "pi-studio.parent-agent-id";
|
|
10
|
+
export class InvalidAgentTransitionError extends Error {
|
|
11
|
+
constructor(from, to) {
|
|
12
|
+
super(`invalid agent transition: ${from} → ${to}`);
|
|
13
|
+
this.name = "InvalidAgentTransitionError";
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
// initializing → idle ⇄ running ; idle/running → error → closed (closed is terminal).
|
|
17
|
+
const ALLOWED_TRANSITIONS = {
|
|
18
|
+
initializing: new Set(["idle", "error", "closed"]),
|
|
19
|
+
idle: new Set(["running", "error", "closed"]),
|
|
20
|
+
running: new Set(["idle", "error", "closed"]),
|
|
21
|
+
error: new Set(["idle", "closed"]),
|
|
22
|
+
closed: new Set(),
|
|
23
|
+
};
|
|
24
|
+
export function canTransition(from, to) {
|
|
25
|
+
if (from === to)
|
|
26
|
+
return true;
|
|
27
|
+
return ALLOWED_TRANSITIONS[from].has(to);
|
|
28
|
+
}
|
|
29
|
+
export class AgentManager {
|
|
30
|
+
deps;
|
|
31
|
+
agents = new Map();
|
|
32
|
+
subscribers = new Set();
|
|
33
|
+
save;
|
|
34
|
+
loadAll;
|
|
35
|
+
delete;
|
|
36
|
+
now;
|
|
37
|
+
constructor(deps) {
|
|
38
|
+
this.deps = deps;
|
|
39
|
+
this.save = deps.saveAgent ?? ((record) => saveAgentToDisk(deps.home, record));
|
|
40
|
+
this.loadAll = deps.loadAllAgents ?? (() => loadAllAgentsFromDisk(deps.home));
|
|
41
|
+
this.delete = deps.deleteAgent ?? ((cwd, id) => deleteAgentFromDisk(deps.home, cwd, id));
|
|
42
|
+
this.now = deps.now ?? (() => new Date().toISOString());
|
|
43
|
+
}
|
|
44
|
+
subscribe(cb) {
|
|
45
|
+
this.subscribers.add(cb);
|
|
46
|
+
return () => this.subscribers.delete(cb);
|
|
47
|
+
}
|
|
48
|
+
broadcast(record) {
|
|
49
|
+
const update = {
|
|
50
|
+
type: "agent_update",
|
|
51
|
+
agentId: record.id,
|
|
52
|
+
status: record.lastStatus,
|
|
53
|
+
...(record.title ? { title: record.title } : {}),
|
|
54
|
+
labels: record.labels,
|
|
55
|
+
};
|
|
56
|
+
for (const cb of this.subscribers)
|
|
57
|
+
cb(update);
|
|
58
|
+
}
|
|
59
|
+
wrap(record, session = null) {
|
|
60
|
+
return {
|
|
61
|
+
record,
|
|
62
|
+
session,
|
|
63
|
+
parentAgentId: record.labels[PARENT_AGENT_ID_LABEL] ?? null,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
/** Register a new agent: persist + broadcast its initial state. */
|
|
67
|
+
async add(record) {
|
|
68
|
+
const managed = this.wrap(record);
|
|
69
|
+
this.agents.set(record.id, managed);
|
|
70
|
+
await this.save(record);
|
|
71
|
+
this.broadcast(record);
|
|
72
|
+
return managed;
|
|
73
|
+
}
|
|
74
|
+
attachSession(id, session) {
|
|
75
|
+
const managed = this.agents.get(id);
|
|
76
|
+
if (managed)
|
|
77
|
+
managed.session = session;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Snapshot and persist the live session's resume handle (e.g. Pi's on-disk JSONL session file)
|
|
81
|
+
* onto the record. Called right after session creation/attach so a plain daemon restart — not
|
|
82
|
+
* just an archive — leaves a handle behind: without one, `fetch_agent_timeline_request` has no
|
|
83
|
+
* way to rebuild an agent's conversation once its in-memory timeline is gone
|
|
84
|
+
* (architecture/persistence.md § Agent record `persistence` field).
|
|
85
|
+
*/
|
|
86
|
+
async persistSessionHandle(id) {
|
|
87
|
+
const managed = this.agents.get(id);
|
|
88
|
+
if (!managed?.session)
|
|
89
|
+
return;
|
|
90
|
+
const handle = managed.session.describePersistence();
|
|
91
|
+
if (!handle)
|
|
92
|
+
return;
|
|
93
|
+
managed.record = {
|
|
94
|
+
...managed.record,
|
|
95
|
+
persistence: handle,
|
|
96
|
+
updatedAt: this.now(),
|
|
97
|
+
};
|
|
98
|
+
await this.save(managed.record);
|
|
99
|
+
}
|
|
100
|
+
/** Transition an agent's `lastStatus`, persisting and broadcasting the change. */
|
|
101
|
+
async setStatus(id, status) {
|
|
102
|
+
const managed = this.agents.get(id);
|
|
103
|
+
if (!managed)
|
|
104
|
+
throw new Error(`unknown agent: ${id}`);
|
|
105
|
+
const from = managed.record.lastStatus;
|
|
106
|
+
if (!canTransition(from, status))
|
|
107
|
+
throw new InvalidAgentTransitionError(from, status);
|
|
108
|
+
managed.record = { ...managed.record, lastStatus: status, updatedAt: this.now() };
|
|
109
|
+
await this.save(managed.record);
|
|
110
|
+
this.broadcast(managed.record);
|
|
111
|
+
return managed;
|
|
112
|
+
}
|
|
113
|
+
get(id) {
|
|
114
|
+
return this.agents.get(id);
|
|
115
|
+
}
|
|
116
|
+
/** Active (non-archived) agents. */
|
|
117
|
+
list() {
|
|
118
|
+
return [...this.agents.values()].filter((m) => !m.record.archivedAt);
|
|
119
|
+
}
|
|
120
|
+
/** Every tracked agent, including archived. */
|
|
121
|
+
listAll() {
|
|
122
|
+
return [...this.agents.values()];
|
|
123
|
+
}
|
|
124
|
+
parentAgentId(id) {
|
|
125
|
+
return this.agents.get(id)?.parentAgentId ?? null;
|
|
126
|
+
}
|
|
127
|
+
broadcastArchived(agentId, archivedAt) {
|
|
128
|
+
const event = { type: "agent_archived", agentId, archivedAt };
|
|
129
|
+
for (const cb of this.subscribers)
|
|
130
|
+
cb(event);
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Archive (soft delete) an agent and recursively cascade to its non-detached children
|
|
134
|
+
* (architecture/agent-lifecycle.md § Archive). Snapshots the session's persistence handle, sets
|
|
135
|
+
* `archivedAt`, normalizes `lastStatus` away from running/initializing, notifies subscribers,
|
|
136
|
+
* closes/kills the runtime, then archives each child whose parent label points at this agent.
|
|
137
|
+
* Detached agents (no parent label) are never cascade-archived. Idempotent.
|
|
138
|
+
*/
|
|
139
|
+
async archiveAgent(id) {
|
|
140
|
+
const managed = this.agents.get(id);
|
|
141
|
+
if (!managed || managed.record.archivedAt)
|
|
142
|
+
return;
|
|
143
|
+
// Snapshot the live session's persistence handle so the record can resume later.
|
|
144
|
+
let persistence = managed.record.persistence;
|
|
145
|
+
if (managed.session) {
|
|
146
|
+
const handle = managed.session.describePersistence();
|
|
147
|
+
if (handle)
|
|
148
|
+
persistence = handle;
|
|
149
|
+
}
|
|
150
|
+
const archivedAt = this.now();
|
|
151
|
+
const lastStatus = managed.record.lastStatus === "running" || managed.record.lastStatus === "initializing"
|
|
152
|
+
? "closed"
|
|
153
|
+
: managed.record.lastStatus;
|
|
154
|
+
managed.record = {
|
|
155
|
+
...managed.record,
|
|
156
|
+
archivedAt,
|
|
157
|
+
lastStatus,
|
|
158
|
+
...(persistence ? { persistence } : {}),
|
|
159
|
+
updatedAt: archivedAt,
|
|
160
|
+
};
|
|
161
|
+
await this.save(managed.record);
|
|
162
|
+
// Close the runtime (kills the process if still running).
|
|
163
|
+
if (managed.session) {
|
|
164
|
+
await managed.session.close();
|
|
165
|
+
managed.session = null;
|
|
166
|
+
}
|
|
167
|
+
this.broadcastArchived(id, archivedAt);
|
|
168
|
+
// Cascade to non-detached children (those whose parent label == this id).
|
|
169
|
+
for (const child of this.listAll()) {
|
|
170
|
+
if (child.record.id !== id && child.parentAgentId === id && !child.record.archivedAt) {
|
|
171
|
+
await this.archiveAgent(child.record.id);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
broadcastDeleted(agentId) {
|
|
176
|
+
const event = { type: "agent_deleted", agentId };
|
|
177
|
+
for (const cb of this.subscribers)
|
|
178
|
+
cb(event);
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Hard-delete an agent: closes/kills any live runtime, removes its persisted record file from
|
|
182
|
+
* disk, drops it from memory, and recursively cascades to its non-detached children — same
|
|
183
|
+
* cascade rule as `archiveAgent`. Unlike archive, there is no trace left to resume from. Returns
|
|
184
|
+
* true if the agent existed (false = already gone, still idempotent/no-op).
|
|
185
|
+
*/
|
|
186
|
+
async deleteAgent(id) {
|
|
187
|
+
const managed = this.agents.get(id);
|
|
188
|
+
if (!managed)
|
|
189
|
+
return false;
|
|
190
|
+
if (managed.session) {
|
|
191
|
+
await managed.session.close();
|
|
192
|
+
managed.session = null;
|
|
193
|
+
}
|
|
194
|
+
await this.delete(managed.record.cwd, id);
|
|
195
|
+
this.agents.delete(id);
|
|
196
|
+
this.broadcastDeleted(id);
|
|
197
|
+
// Cascade to non-detached children (those whose parent label == this id) — snapshot first,
|
|
198
|
+
// since deleting mutates `this.agents` out from under a live iteration.
|
|
199
|
+
const children = this.listAll().filter((child) => child.record.id !== id && child.parentAgentId === id);
|
|
200
|
+
for (const child of children) {
|
|
201
|
+
await this.deleteAgent(child.record.id);
|
|
202
|
+
}
|
|
203
|
+
return true;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Boot recovery: rehydrate persisted agents (runtime is NOT auto-resumed — records only), then run
|
|
207
|
+
* the loop-recovery hook (`running` loops → `stopped`). Returns the number of agents reloaded.
|
|
208
|
+
*/
|
|
209
|
+
async recover() {
|
|
210
|
+
const records = await this.loadAll();
|
|
211
|
+
for (const record of records) {
|
|
212
|
+
this.agents.set(record.id, this.wrap(record, null));
|
|
213
|
+
}
|
|
214
|
+
await this.deps.onRecoverLoops?.();
|
|
215
|
+
return records.length;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=agent-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-manager.js","sourceRoot":"","sources":["../../src/agent/agent-manager.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,WAAW,IAAI,mBAAmB,EAClC,aAAa,IAAI,qBAAqB,EACtC,SAAS,IAAI,eAAe,GAC7B,MAAM,iCAAiC,CAAC;AAIzC;;;;;;GAMG;AAEH,MAAM,CAAC,MAAM,qBAAqB,GAAG,2BAA2B,CAAC;AAkCjE,MAAM,OAAO,2BAA4B,SAAQ,KAAK;IACpD,YAAY,IAAiB,EAAE,EAAe;QAC5C,KAAK,CAAC,6BAA6B,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;QACnD,IAAI,CAAC,IAAI,GAAG,6BAA6B,CAAC;IAC5C,CAAC;CACF;AAED,sFAAsF;AACtF,MAAM,mBAAmB,GAAkD;IACzE,YAAY,EAAE,IAAI,GAAG,CAAc,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC/D,IAAI,EAAE,IAAI,GAAG,CAAc,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC1D,OAAO,EAAE,IAAI,GAAG,CAAc,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC1D,KAAK,EAAE,IAAI,GAAG,CAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC/C,MAAM,EAAE,IAAI,GAAG,EAAe;CAC/B,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,IAAiB,EAAE,EAAe;IAC9D,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAC7B,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAC3C,CAAC;AAaD,MAAM,OAAO,YAAY;IAQM;IAPZ,MAAM,GAAG,IAAI,GAAG,EAAwB,CAAC;IACzC,WAAW,GAAG,IAAI,GAAG,EAA0B,CAAC;IAChD,IAAI,CAAyC;IAC7C,OAAO,CAA+B;IACtC,MAAM,CAAgD;IACtD,GAAG,CAAe;IAEnC,YAA6B,IAAsB;QAAtB,SAAI,GAAJ,IAAI,CAAkB;QACjD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QAC/E,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,IAAI,CAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9E,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;QACzF,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,SAAS,CAAC,EAA0B;QAClC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACzB,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC3C,CAAC;IAEO,SAAS,CAAC,MAAmB;QACnC,MAAM,MAAM,GAAyB;YACnC,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE,MAAM,CAAC,EAAE;YAClB,MAAM,EAAE,MAAM,CAAC,UAAU;YACzB,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChD,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC;QACF,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,WAAW;YAAE,EAAE,CAAC,MAAM,CAAC,CAAC;IAChD,CAAC;IAEO,IAAI,CAAC,MAAmB,EAAE,UAA+B,IAAI;QACnE,OAAO;YACL,MAAM;YACN,OAAO;YACP,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,IAAI,IAAI;SAC5D,CAAC;IACJ,CAAC;IAED,mEAAmE;IACnE,KAAK,CAAC,GAAG,CAAC,MAAmB;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QACpC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACvB,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,aAAa,CAAC,EAAU,EAAE,OAAqB;QAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACpC,IAAI,OAAO;YAAE,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;IACzC,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,oBAAoB,CAAC,EAAU;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,OAAO,EAAE,OAAO;YAAE,OAAO;QAC9B,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC;QACrD,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,OAAO,CAAC,MAAM,GAAG;YACf,GAAG,OAAO,CAAC,MAAM;YACjB,WAAW,EAAE,MAAoC;YACjD,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;QACF,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;IAED,kFAAkF;IAClF,KAAK,CAAC,SAAS,CAAC,EAAU,EAAE,MAAmB;QAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;QAEtD,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC;QACvC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC;YAAE,MAAM,IAAI,2BAA2B,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAEtF,OAAO,CAAC,MAAM,GAAG,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAClF,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAChC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC/B,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC;IAED,oCAAoC;IACpC,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACvE,CAAC;IAED,+CAA+C;IAC/C,OAAO;QACL,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,aAAa,CAAC,EAAU;QACtB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,aAAa,IAAI,IAAI,CAAC;IACpD,CAAC;IAEO,iBAAiB,CAAC,OAAe,EAAE,UAAkB;QAC3D,MAAM,KAAK,GAA2B,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;QACtF,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,WAAW;YAAE,EAAE,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,YAAY,CAAC,EAAU;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,UAAU;YAAE,OAAO;QAElD,iFAAiF;QACjF,IAAI,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC;QAC7C,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC;YACrD,IAAI,MAAM;gBAAE,WAAW,GAAG,MAAoC,CAAC;QACjE,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC9B,MAAM,UAAU,GACd,OAAO,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,UAAU,KAAK,cAAc;YACrF,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC;QAEhC,OAAO,CAAC,MAAM,GAAG;YACf,GAAG,OAAO,CAAC,MAAM;YACjB,UAAU;YACV,UAAU;YACV,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvC,SAAS,EAAE,UAAU;SACtB,CAAC;QACF,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAEhC,0DAA0D;QAC1D,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAC9B,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;QACzB,CAAC;QAED,IAAI,CAAC,iBAAiB,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QAEvC,0EAA0E;QAC1E,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;YACnC,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,aAAa,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;gBACrF,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;IACH,CAAC;IAEO,gBAAgB,CAAC,OAAe;QACtC,MAAM,KAAK,GAA0B,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC;QACxE,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,WAAW;YAAE,EAAE,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,WAAW,CAAC,EAAU;QAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC;QAE3B,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAC9B,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;QACzB,CAAC;QAED,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACvB,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;QAE1B,2FAA2F;QAC3F,wEAAwE;QACxE,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,CACpC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,aAAa,KAAK,EAAE,CAChE,CAAC;QACF,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC7B,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC1C,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO;QACX,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACrC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;QACtD,CAAC;QACD,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;QACnC,OAAO,OAAO,CAAC,MAAM,CAAC;IACxB,CAAC;CACF"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { Session } from "../ws/session.js";
|
|
2
|
+
import type { HandlerRegistry } from "../ws/router.js";
|
|
3
|
+
import { AgentManager } from "./agent-manager.js";
|
|
4
|
+
import type { AgentClient, AgentSession, RunOptions } from "./provider-contract.js";
|
|
5
|
+
import { AgentTimelineStore } from "./timeline-store.js";
|
|
6
|
+
/**
|
|
7
|
+
* AgentService wires `create_agent_request` + run/turn loop + `agent_stream` broadcast
|
|
8
|
+
* (features/agent-sessions.md § Create / § Behavior, architecture/websocket-protocol.md).
|
|
9
|
+
*/
|
|
10
|
+
export interface AgentServiceDeps {
|
|
11
|
+
manager: AgentManager;
|
|
12
|
+
resolveClient: (provider: string) => AgentClient;
|
|
13
|
+
broadcast: (sessions: Iterable<Session>, message: unknown) => void;
|
|
14
|
+
now?: () => string;
|
|
15
|
+
}
|
|
16
|
+
export declare function getTimeline(agentId: string): AgentTimelineStore | undefined;
|
|
17
|
+
/**
|
|
18
|
+
* Seed the in-memory timeline for an agent that has none yet (e.g. right after a daemon restart)
|
|
19
|
+
* from externally rehydrated rows — see `timeline-rpc.ts`'s fallback to a provider's
|
|
20
|
+
* `hydrateTimeline()`. No-op if a timeline already exists (never overwrites live/streamed rows).
|
|
21
|
+
*/
|
|
22
|
+
export declare function seedTimeline(agentId: string, rows: import("./timeline-store.js").TimelineRow[]): void;
|
|
23
|
+
export declare class AgentService {
|
|
24
|
+
private readonly deps;
|
|
25
|
+
private readonly now;
|
|
26
|
+
constructor(deps: AgentServiceDeps);
|
|
27
|
+
registerHandlers(registry: HandlerRegistry, getActiveSessions: () => Iterable<Session>): void;
|
|
28
|
+
private broadcastAll;
|
|
29
|
+
handleCreate(msg: Record<string, unknown>, getSessions: () => Iterable<Session>): Promise<unknown>;
|
|
30
|
+
handleSendPrompt(msg: Record<string, unknown>, getSessions: () => Iterable<Session>): Promise<unknown>;
|
|
31
|
+
runTurn(agentId: string, session: AgentSession, prompt: string, getSessions: () => Iterable<Session>, opts?: RunOptions & {
|
|
32
|
+
clientMessageId?: string;
|
|
33
|
+
autoArchive?: boolean;
|
|
34
|
+
}): Promise<void>;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=agent-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-service.d.ts","sourceRoot":"","sources":["../../src/agent/agent-service.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAyB,MAAM,oBAAoB,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpF,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD;;;GAGG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,YAAY,CAAC;IACtB,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,WAAW,CAAC;IACjD,SAAS,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACnE,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAcD,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAE3E;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,qBAAqB,EAAE,WAAW,EAAE,GAAG,IAAI,CAGrG;AAED,qBAAa,YAAY;IAGX,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFjC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;gBAEN,IAAI,EAAE,gBAAgB;IAInD,gBAAgB,CAAC,QAAQ,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC,OAAO,CAAC,GAAG,IAAI;IAS7F,OAAO,CAAC,YAAY;IAId,YAAY,CAChB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,WAAW,EAAE,MAAM,QAAQ,CAAC,OAAO,CAAC,GACnC,OAAO,CAAC,OAAO,CAAC;IA6Db,gBAAgB,CACpB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,WAAW,EAAE,MAAM,QAAQ,CAAC,OAAO,CAAC,GACnC,OAAO,CAAC,OAAO,CAAC;IAYb,OAAO,CACX,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,QAAQ,CAAC,OAAO,CAAC,EACpC,IAAI,GAAE,UAAU,GAAG;QAAE,eAAe,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAA;KAAO,GAC1E,OAAO,CAAC,IAAI,CAAC;CAkGjB"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { AgentManager, PARENT_AGENT_ID_LABEL } from "./agent-manager.js";
|
|
3
|
+
import { AgentTimelineStore } from "./timeline-store.js";
|
|
4
|
+
/** In-memory timeline per agentId; persisted rows are on the AgentRecord.timeline. */
|
|
5
|
+
const timelinesByAgentId = new Map();
|
|
6
|
+
function getOrCreateTimeline(agentId, now) {
|
|
7
|
+
let t = timelinesByAgentId.get(agentId);
|
|
8
|
+
if (!t) {
|
|
9
|
+
t = new AgentTimelineStore({ now });
|
|
10
|
+
timelinesByAgentId.set(agentId, t);
|
|
11
|
+
}
|
|
12
|
+
return t;
|
|
13
|
+
}
|
|
14
|
+
export function getTimeline(agentId) {
|
|
15
|
+
return timelinesByAgentId.get(agentId);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Seed the in-memory timeline for an agent that has none yet (e.g. right after a daemon restart)
|
|
19
|
+
* from externally rehydrated rows — see `timeline-rpc.ts`'s fallback to a provider's
|
|
20
|
+
* `hydrateTimeline()`. No-op if a timeline already exists (never overwrites live/streamed rows).
|
|
21
|
+
*/
|
|
22
|
+
export function seedTimeline(agentId, rows) {
|
|
23
|
+
if (timelinesByAgentId.has(agentId))
|
|
24
|
+
return;
|
|
25
|
+
timelinesByAgentId.set(agentId, new AgentTimelineStore({ initialRows: rows }));
|
|
26
|
+
}
|
|
27
|
+
export class AgentService {
|
|
28
|
+
deps;
|
|
29
|
+
now;
|
|
30
|
+
constructor(deps) {
|
|
31
|
+
this.deps = deps;
|
|
32
|
+
this.now = deps.now ?? (() => new Date().toISOString());
|
|
33
|
+
}
|
|
34
|
+
registerHandlers(registry, getActiveSessions) {
|
|
35
|
+
registry.register("create_agent_request", (ctx) => this.handleCreate(ctx.message, getActiveSessions));
|
|
36
|
+
registry.register("send_agent_prompt", (ctx) => this.handleSendPrompt(ctx.message, getActiveSessions));
|
|
37
|
+
}
|
|
38
|
+
broadcastAll(sessions, message) {
|
|
39
|
+
this.deps.broadcast(sessions, message);
|
|
40
|
+
}
|
|
41
|
+
async handleCreate(msg, getSessions) {
|
|
42
|
+
const requestId = msg.requestId ?? randomUUID();
|
|
43
|
+
const config = msg.config;
|
|
44
|
+
if (!config)
|
|
45
|
+
throw new Error("missing config");
|
|
46
|
+
const provider = config.provider ?? "mock";
|
|
47
|
+
const cwd = config.cwd ?? ".";
|
|
48
|
+
const initialPrompt = msg.initialPrompt;
|
|
49
|
+
const title = config.title ?? msg.title;
|
|
50
|
+
const labels = msg.labels ?? {};
|
|
51
|
+
if (title && !labels["title"])
|
|
52
|
+
labels["title"] = title;
|
|
53
|
+
const clientMessageId = msg.clientMessageId;
|
|
54
|
+
const autoArchive = Boolean(msg.autoArchive);
|
|
55
|
+
// 1. Create the agent record at status "initializing".
|
|
56
|
+
const record = {
|
|
57
|
+
id: randomUUID(),
|
|
58
|
+
provider,
|
|
59
|
+
cwd,
|
|
60
|
+
createdAt: this.now(),
|
|
61
|
+
updatedAt: this.now(),
|
|
62
|
+
labels,
|
|
63
|
+
lastStatus: "initializing",
|
|
64
|
+
timeline: [],
|
|
65
|
+
};
|
|
66
|
+
const managed = await this.deps.manager.add(record);
|
|
67
|
+
const agentId = record.id;
|
|
68
|
+
this.broadcastAll(getSessions(), {
|
|
69
|
+
type: "agent_update",
|
|
70
|
+
agentId,
|
|
71
|
+
status: "initializing",
|
|
72
|
+
labels,
|
|
73
|
+
});
|
|
74
|
+
// 2. Create the provider session → status "idle".
|
|
75
|
+
const client = this.deps.resolveClient(provider);
|
|
76
|
+
const session = await client.createSession({ provider, cwd, ...config }, { cwd });
|
|
77
|
+
this.deps.manager.attachSession(agentId, session);
|
|
78
|
+
await this.deps.manager.persistSessionHandle(agentId);
|
|
79
|
+
await this.deps.manager.setStatus(agentId, "idle");
|
|
80
|
+
this.broadcastAll(getSessions(), { type: "agent_update", agentId, status: "idle", labels });
|
|
81
|
+
// 3. Run initial prompt if provided.
|
|
82
|
+
if (initialPrompt) {
|
|
83
|
+
await this.runTurn(agentId, session, initialPrompt, getSessions, {
|
|
84
|
+
clientMessageId,
|
|
85
|
+
autoArchive,
|
|
86
|
+
images: msg.images,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
return {
|
|
90
|
+
type: "create_agent_response",
|
|
91
|
+
requestId,
|
|
92
|
+
payload: { agentId },
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
async handleSendPrompt(msg, getSessions) {
|
|
96
|
+
const agentId = msg.agentId;
|
|
97
|
+
const prompt = msg.prompt;
|
|
98
|
+
const managed = this.deps.manager.get(agentId);
|
|
99
|
+
if (!managed?.session)
|
|
100
|
+
throw new Error(`no live session for agent ${agentId}`);
|
|
101
|
+
await this.runTurn(agentId, managed.session, prompt, getSessions, {
|
|
102
|
+
clientMessageId: msg.clientMessageId,
|
|
103
|
+
images: msg.images,
|
|
104
|
+
});
|
|
105
|
+
return { type: "agent_prompt_response", agentId, status: "idle" };
|
|
106
|
+
}
|
|
107
|
+
async runTurn(agentId, session, prompt, getSessions, opts = {}) {
|
|
108
|
+
const timeline = getOrCreateTimeline(agentId, this.now);
|
|
109
|
+
timeline.startEpoch();
|
|
110
|
+
await this.deps.manager.setStatus(agentId, "running");
|
|
111
|
+
this.broadcastAll(getSessions(), { type: "agent_update", agentId, status: "running" });
|
|
112
|
+
let userMessageEmitted = false;
|
|
113
|
+
let userMessageId;
|
|
114
|
+
const unsubscribe = session.subscribe((event) => {
|
|
115
|
+
// Canonical user_message: emit exactly once keyed by provider message id.
|
|
116
|
+
if (event.kind === "user_message" && !userMessageEmitted) {
|
|
117
|
+
const msgId = event.messageId ?? opts.clientMessageId ?? randomUUID();
|
|
118
|
+
if (userMessageId === undefined || userMessageId === msgId) {
|
|
119
|
+
userMessageId = msgId;
|
|
120
|
+
userMessageEmitted = true;
|
|
121
|
+
const userRow = timeline.append({
|
|
122
|
+
kind: "user_message",
|
|
123
|
+
messageId: msgId,
|
|
124
|
+
text: prompt,
|
|
125
|
+
images: opts.images,
|
|
126
|
+
});
|
|
127
|
+
this.broadcastAll(getSessions(), {
|
|
128
|
+
type: "session",
|
|
129
|
+
message: {
|
|
130
|
+
type: "agent_stream",
|
|
131
|
+
agentId,
|
|
132
|
+
seq: userRow.seq,
|
|
133
|
+
timestamp: userRow.timestamp,
|
|
134
|
+
event: { kind: "user_message", messageId: msgId, text: prompt, images: opts.images },
|
|
135
|
+
},
|
|
136
|
+
});
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// All other events: append + broadcast.
|
|
141
|
+
const row = timeline.append(event);
|
|
142
|
+
this.broadcastAll(getSessions(), {
|
|
143
|
+
type: "session",
|
|
144
|
+
message: {
|
|
145
|
+
type: "agent_stream",
|
|
146
|
+
agentId,
|
|
147
|
+
seq: row.seq,
|
|
148
|
+
timestamp: row.timestamp,
|
|
149
|
+
event,
|
|
150
|
+
},
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
// If provider never emits a user_message, emit one ourselves.
|
|
154
|
+
if (!userMessageEmitted) {
|
|
155
|
+
const msgId = opts.clientMessageId ?? randomUUID();
|
|
156
|
+
userMessageId = msgId;
|
|
157
|
+
const row = timeline.append({
|
|
158
|
+
kind: "user_message",
|
|
159
|
+
messageId: msgId,
|
|
160
|
+
text: prompt,
|
|
161
|
+
images: opts.images,
|
|
162
|
+
});
|
|
163
|
+
this.broadcastAll(getSessions(), {
|
|
164
|
+
type: "session",
|
|
165
|
+
message: {
|
|
166
|
+
type: "agent_stream",
|
|
167
|
+
agentId,
|
|
168
|
+
seq: row.seq,
|
|
169
|
+
timestamp: row.timestamp,
|
|
170
|
+
event: { kind: "user_message", messageId: msgId, text: prompt, images: opts.images },
|
|
171
|
+
},
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
try {
|
|
175
|
+
await session.run(prompt, opts);
|
|
176
|
+
}
|
|
177
|
+
finally {
|
|
178
|
+
unsubscribe();
|
|
179
|
+
}
|
|
180
|
+
const finalManaged = this.deps.manager.get(agentId);
|
|
181
|
+
const lastEvent = timeline.allRows().at(-1)?.event;
|
|
182
|
+
const newStatus = lastEvent?.kind === "turn_failed" || lastEvent?.kind === "error" ? "error" : "idle";
|
|
183
|
+
await this.deps.manager.setStatus(agentId, newStatus);
|
|
184
|
+
this.broadcastAll(getSessions(), { type: "agent_update", agentId, status: newStatus });
|
|
185
|
+
// autoArchive hook (worktree coupling wired in sprint-008).
|
|
186
|
+
if (opts.autoArchive &&
|
|
187
|
+
(lastEvent?.kind === "turn_completed" ||
|
|
188
|
+
lastEvent?.kind === "turn_failed" ||
|
|
189
|
+
lastEvent?.kind === "turn_canceled") &&
|
|
190
|
+
finalManaged) {
|
|
191
|
+
await this.deps.manager.archiveAgent(agentId);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=agent-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-service.js","sourceRoot":"","sources":["../../src/agent/agent-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAOzC,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAczD,sFAAsF;AACtF,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAA8B,CAAC;AAEjE,SAAS,mBAAmB,CAAC,OAAe,EAAE,GAAkB;IAC9D,IAAI,CAAC,GAAG,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACxC,IAAI,CAAC,CAAC,EAAE,CAAC;QACP,CAAC,GAAG,IAAI,kBAAkB,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QACpC,kBAAkB,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,OAAO,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACzC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,IAAiD;IAC7F,IAAI,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC;QAAE,OAAO;IAC5C,kBAAkB,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,kBAAkB,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACjF,CAAC;AAED,MAAM,OAAO,YAAY;IAGM;IAFZ,GAAG,CAAe;IAEnC,YAA6B,IAAsB;QAAtB,SAAI,GAAJ,IAAI,CAAkB;QACjD,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,gBAAgB,CAAC,QAAyB,EAAE,iBAA0C;QACpF,QAAQ,CAAC,QAAQ,CAAC,sBAAsB,EAAE,CAAC,GAAG,EAAE,EAAE,CAChD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAClD,CAAC;QACF,QAAQ,CAAC,QAAQ,CAAC,mBAAmB,EAAE,CAAC,GAAG,EAAE,EAAE,CAC7C,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,EAAE,iBAAiB,CAAC,CACtD,CAAC;IACJ,CAAC;IAEO,YAAY,CAAC,QAA2B,EAAE,OAAgB;QAChE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,YAAY,CAChB,GAA4B,EAC5B,WAAoC;QAEpC,MAAM,SAAS,GAAI,GAAG,CAAC,SAAoB,IAAI,UAAU,EAAE,CAAC;QAC5D,MAAM,MAAM,GAAG,GAAG,CAAC,MAA6C,CAAC;QACjE,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAI,MAAM,CAAC,QAA+B,IAAI,MAAM,CAAC;QACnE,MAAM,GAAG,GAAI,MAAM,CAAC,GAA0B,IAAI,GAAG,CAAC;QACtD,MAAM,aAAa,GAAG,GAAG,CAAC,aAAmC,CAAC;QAC9D,MAAM,KAAK,GAAI,MAAM,CAAC,KAA4B,IAAK,GAAG,CAAC,KAA4B,CAAC;QACxF,MAAM,MAAM,GAAI,GAAG,CAAC,MAA6C,IAAI,EAAE,CAAC;QACxE,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;YAAE,MAAM,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC;QACvD,MAAM,eAAe,GAAG,GAAG,CAAC,eAAqC,CAAC;QAClE,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAE7C,uDAAuD;QACvD,MAAM,MAAM,GAAgB;YAC1B,EAAE,EAAE,UAAU,EAAE;YAChB,QAAQ;YACR,GAAG;YACH,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,MAAM;YACN,UAAU,EAAE,cAAc;YAC1B,QAAQ,EAAE,EAAE;SACb,CAAC;QAEF,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpD,MAAM,OAAO,GAAG,MAAM,CAAC,EAAE,CAAC;QAC1B,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,EAAE;YAC/B,IAAI,EAAE,cAAc;YACpB,OAAO;YACP,MAAM,EAAE,cAAc;YACtB,MAAM;SACP,CAAC,CAAC;QAEH,kDAAkD;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,aAAa,CACxC,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,MAAM,EAAiD,EAC3E,EAAE,GAAG,EAAE,CACR,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;QACtD,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACnD,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAE5F,qCAAqC;QACrC,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE;gBAC/D,eAAe;gBACf,WAAW;gBACX,MAAM,EAAE,GAAG,CAAC,MAAuC;aACpD,CAAC,CAAC;QACL,CAAC;QAED,OAAO;YACL,IAAI,EAAE,uBAAuB;YAC7B,SAAS;YACT,OAAO,EAAE,EAAE,OAAO,EAAE;SACrB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,gBAAgB,CACpB,GAA4B,EAC5B,WAAoC;QAEpC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAiB,CAAC;QACtC,MAAM,MAAM,GAAG,GAAG,CAAC,MAAgB,CAAC;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC/C,IAAI,CAAC,OAAO,EAAE,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,OAAO,EAAE,CAAC,CAAC;QAC/E,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE;YAChE,eAAe,EAAE,GAAG,CAAC,eAAqC;YAC1D,MAAM,EAAE,GAAG,CAAC,MAAuC;SACpD,CAAC,CAAC;QACH,OAAO,EAAE,IAAI,EAAE,uBAAuB,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IACpE,CAAC;IAED,KAAK,CAAC,OAAO,CACX,OAAe,EACf,OAAqB,EACrB,MAAc,EACd,WAAoC,EACpC,OAAyE,EAAE;QAE3E,MAAM,QAAQ,GAAG,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QACxD,QAAQ,CAAC,UAAU,EAAE,CAAC;QAEtB,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACtD,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QAEvF,IAAI,kBAAkB,GAAG,KAAK,CAAC;QAC/B,IAAI,aAAiC,CAAC;QAEtC,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,KAAuB,EAAE,EAAE;YAChE,0EAA0E;YAC1E,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBACzD,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,eAAe,IAAI,UAAU,EAAE,CAAC;gBACtE,IAAI,aAAa,KAAK,SAAS,IAAI,aAAa,KAAK,KAAK,EAAE,CAAC;oBAC3D,aAAa,GAAG,KAAK,CAAC;oBACtB,kBAAkB,GAAG,IAAI,CAAC;oBAC1B,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC;wBAC9B,IAAI,EAAE,cAAc;wBACpB,SAAS,EAAE,KAAK;wBAChB,IAAI,EAAE,MAAM;wBACZ,MAAM,EAAE,IAAI,CAAC,MAAM;qBACpB,CAAC,CAAC;oBACH,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,EAAE;wBAC/B,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE;4BACP,IAAI,EAAE,cAAc;4BACpB,OAAO;4BACP,GAAG,EAAE,OAAO,CAAC,GAAG;4BAChB,SAAS,EAAE,OAAO,CAAC,SAAS;4BAC5B,KAAK,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;yBACrF;qBACF,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;YACH,CAAC;YAED,wCAAwC;YACxC,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACnC,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,EAAE;gBAC/B,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE;oBACP,IAAI,EAAE,cAAc;oBACpB,OAAO;oBACP,GAAG,EAAE,GAAG,CAAC,GAAG;oBACZ,SAAS,EAAE,GAAG,CAAC,SAAS;oBACxB,KAAK;iBACN;aACF,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,8DAA8D;QAC9D,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACxB,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,IAAI,UAAU,EAAE,CAAC;YACnD,aAAa,GAAG,KAAK,CAAC;YACtB,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC;gBAC1B,IAAI,EAAE,cAAc;gBACpB,SAAS,EAAE,KAAK;gBAChB,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC,CAAC;YACH,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,EAAE;gBAC/B,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE;oBACP,IAAI,EAAE,cAAc;oBACpB,OAAO;oBACP,GAAG,EAAE,GAAG,CAAC,GAAG;oBACZ,SAAS,EAAE,GAAG,CAAC,SAAS;oBACxB,KAAK,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;iBACrF;aACF,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAClC,CAAC;gBAAS,CAAC;YACT,WAAW,EAAE,CAAC;QAChB,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACpD,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;QACnD,MAAM,SAAS,GACb,SAAS,EAAE,IAAI,KAAK,aAAa,IAAI,SAAS,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;QAEtF,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACtD,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QAEvF,4DAA4D;QAC5D,IACE,IAAI,CAAC,WAAW;YAChB,CAAC,SAAS,EAAE,IAAI,KAAK,gBAAgB;gBACnC,SAAS,EAAE,IAAI,KAAK,aAAa;gBACjC,SAAS,EAAE,IAAI,KAAK,eAAe,CAAC;YACtC,YAAY,EACZ,CAAC;YACD,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export * from "./provider-contract.js";
|
|
2
|
+
export * from "./providers/mock/mock-provider.js";
|
|
3
|
+
export * from "./providers/pi/agent.js";
|
|
4
|
+
export * from "./providers/pi/event-mapper.js";
|
|
5
|
+
export * from "./providers/pi/rpc-transport.js";
|
|
6
|
+
export * from "./manifest.js";
|
|
7
|
+
export * from "./provider-registry.js";
|
|
8
|
+
export * from "./provider-snapshot.js";
|
|
9
|
+
export * from "./agent-manager.js";
|
|
10
|
+
export * from "./timeline-store.js";
|
|
11
|
+
export * from "./agent-service.js";
|
|
12
|
+
export * from "./timeline-rpc.js";
|
|
13
|
+
export * from "./session-operations.js";
|
|
14
|
+
export * from "./permissions.js";
|
|
15
|
+
export * from "./structured-generation.js";
|
|
16
|
+
export * from "./mcp-server.js";
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agent/index.ts"],"names":[],"mappings":"AACA,cAAc,wBAAwB,CAAC;AACvC,cAAc,mCAAmC,CAAC;AAClD,cAAc,yBAAyB,CAAC;AACxC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iCAAiC,CAAC;AAChD,cAAc,eAAe,CAAC;AAC9B,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// Provider contracts, providers, registry, snapshot, and the agent manager.
|
|
2
|
+
export * from "./provider-contract.js";
|
|
3
|
+
export * from "./providers/mock/mock-provider.js";
|
|
4
|
+
export * from "./providers/pi/agent.js";
|
|
5
|
+
export * from "./providers/pi/event-mapper.js";
|
|
6
|
+
export * from "./providers/pi/rpc-transport.js";
|
|
7
|
+
export * from "./manifest.js";
|
|
8
|
+
export * from "./provider-registry.js";
|
|
9
|
+
export * from "./provider-snapshot.js";
|
|
10
|
+
export * from "./agent-manager.js";
|
|
11
|
+
export * from "./timeline-store.js";
|
|
12
|
+
export * from "./agent-service.js";
|
|
13
|
+
export * from "./timeline-rpc.js";
|
|
14
|
+
export * from "./session-operations.js";
|
|
15
|
+
export * from "./permissions.js";
|
|
16
|
+
export * from "./structured-generation.js";
|
|
17
|
+
export * from "./mcp-server.js";
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/agent/index.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,cAAc,wBAAwB,CAAC;AACvC,cAAc,mCAAmC,CAAC;AAClD,cAAc,yBAAyB,CAAC;AACxC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iCAAiC,CAAC;AAChD,cAAc,eAAe,CAAC;AAC9B,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ProviderDefinition } from "@av-pi-studio/protocol";
|
|
2
|
+
/**
|
|
3
|
+
* Provider manifest (features/agent-providers.md § Registration surface). UI scaffolding only —
|
|
4
|
+
* actual models/modes/features are discovered at runtime. Modes carry an `icon` + `colorTier`.
|
|
5
|
+
*/
|
|
6
|
+
export declare const PROVIDER_MANIFEST: Record<string, ProviderDefinition>;
|
|
7
|
+
//# sourceMappingURL=manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/agent/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAKjE;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAmBhE,CAAC"}
|