@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,130 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
export class SessionOperationsService {
|
|
3
|
+
deps;
|
|
4
|
+
now;
|
|
5
|
+
constructor(deps) {
|
|
6
|
+
this.deps = deps;
|
|
7
|
+
this.now = deps.now ?? (() => new Date().toISOString());
|
|
8
|
+
}
|
|
9
|
+
registerHandlers(registry, getActiveSessions) {
|
|
10
|
+
registry.register("interrupt_agent", (ctx) => this.handleInterrupt(ctx.message, getActiveSessions));
|
|
11
|
+
registry.register("update_agent", (ctx) => this.handleUpdate(ctx.message, getActiveSessions));
|
|
12
|
+
registry.register("resume_agent", (ctx) => this.handleResume(ctx.message, getActiveSessions));
|
|
13
|
+
registry.register("import_agent_session", (ctx) => this.handleImport(ctx.message, getActiveSessions));
|
|
14
|
+
// Legacy flat alias.
|
|
15
|
+
registry.registerAlias("cancel_agent", "interrupt_agent");
|
|
16
|
+
}
|
|
17
|
+
broadcastAll(sessions, msg) {
|
|
18
|
+
this.deps.broadcast(sessions, msg);
|
|
19
|
+
}
|
|
20
|
+
async handleInterrupt(msg, getSessions) {
|
|
21
|
+
const agentId = msg.agentId;
|
|
22
|
+
const managed = this.deps.manager.get(agentId);
|
|
23
|
+
if (!managed?.session)
|
|
24
|
+
return { type: "interrupt_response", agentId, ok: false };
|
|
25
|
+
await managed.session.interrupt();
|
|
26
|
+
// The provider session will emit turn_canceled which goes through runTurn's subscriber.
|
|
27
|
+
// If the agent is still "running" (interrupt was out-of-band), force it to idle.
|
|
28
|
+
if (managed.record.lastStatus === "running") {
|
|
29
|
+
await this.deps.manager.setStatus(agentId, "idle");
|
|
30
|
+
this.broadcastAll(getSessions(), { type: "agent_update", agentId, status: "idle" });
|
|
31
|
+
}
|
|
32
|
+
return { type: "interrupt_response", agentId, ok: true };
|
|
33
|
+
}
|
|
34
|
+
async handleUpdate(msg, getSessions) {
|
|
35
|
+
const agentId = msg.agentId;
|
|
36
|
+
const managed = this.deps.manager.get(agentId);
|
|
37
|
+
if (!managed)
|
|
38
|
+
throw new Error(`unknown agent: ${agentId}`);
|
|
39
|
+
// Update fields that do NOT require a session recreate.
|
|
40
|
+
const title = typeof msg.title === "string" ? msg.title : managed.record.title;
|
|
41
|
+
const labels = msg.labels ?? managed.record.labels;
|
|
42
|
+
const config = {
|
|
43
|
+
...managed.record.config,
|
|
44
|
+
...msg.config,
|
|
45
|
+
};
|
|
46
|
+
// Apply mode/model/thinking to the live session (if attached).
|
|
47
|
+
if (managed.session) {
|
|
48
|
+
if (typeof msg.modeId === "string")
|
|
49
|
+
await managed.session.setMode(msg.modeId);
|
|
50
|
+
if (typeof msg.model === "string")
|
|
51
|
+
await managed.session.setModel?.(msg.model);
|
|
52
|
+
if (typeof msg.thinkingOptionId === "string") {
|
|
53
|
+
await managed.session.setThinkingOption?.(msg.thinkingOptionId);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Persist updated record without recreating the session.
|
|
57
|
+
managed.record = {
|
|
58
|
+
...managed.record,
|
|
59
|
+
title,
|
|
60
|
+
labels,
|
|
61
|
+
config: config,
|
|
62
|
+
updatedAt: this.now(),
|
|
63
|
+
};
|
|
64
|
+
this.broadcastAll(getSessions(), {
|
|
65
|
+
type: "agent_update",
|
|
66
|
+
agentId,
|
|
67
|
+
status: managed.record.lastStatus,
|
|
68
|
+
title,
|
|
69
|
+
labels,
|
|
70
|
+
});
|
|
71
|
+
return { type: "update_agent_response", agentId, ok: true };
|
|
72
|
+
}
|
|
73
|
+
async handleResume(msg, getSessions) {
|
|
74
|
+
const agentId = msg.agentId;
|
|
75
|
+
const managed = this.deps.manager.get(agentId);
|
|
76
|
+
if (!managed)
|
|
77
|
+
throw new Error(`unknown agent: ${agentId}`);
|
|
78
|
+
const handle = managed.record.persistence;
|
|
79
|
+
if (!handle) {
|
|
80
|
+
// Stale / no handle → rpc_error.
|
|
81
|
+
throw new Error(`agent ${agentId} has no persistence handle (stale or not resumable)`);
|
|
82
|
+
}
|
|
83
|
+
const client = this.deps.resolveClient(managed.record.provider);
|
|
84
|
+
const session = await client.resumeSession(handle);
|
|
85
|
+
this.deps.manager.attachSession(agentId, session);
|
|
86
|
+
await this.deps.manager.persistSessionHandle(agentId);
|
|
87
|
+
await this.deps.manager.setStatus(agentId, "idle");
|
|
88
|
+
this.broadcastAll(getSessions(), {
|
|
89
|
+
type: "agent_update",
|
|
90
|
+
agentId,
|
|
91
|
+
status: "idle",
|
|
92
|
+
});
|
|
93
|
+
return { type: "resume_agent_response", agentId, ok: true };
|
|
94
|
+
}
|
|
95
|
+
async handleImport(msg, getSessions) {
|
|
96
|
+
const provider = msg.provider ?? "pi";
|
|
97
|
+
const cwd = msg.cwd ?? ".";
|
|
98
|
+
const providerHandleId = msg.providerHandleId;
|
|
99
|
+
const client = this.deps.resolveClient(provider);
|
|
100
|
+
if (!client.importSession)
|
|
101
|
+
throw new Error(`provider ${provider} does not support import`);
|
|
102
|
+
const result = await client.importSession({ providerHandleId, cwd });
|
|
103
|
+
// Create the agent record and seed the timeline BEFORE publishing.
|
|
104
|
+
const record = {
|
|
105
|
+
id: randomUUID(),
|
|
106
|
+
provider,
|
|
107
|
+
cwd,
|
|
108
|
+
createdAt: this.now(),
|
|
109
|
+
updatedAt: this.now(),
|
|
110
|
+
labels: {},
|
|
111
|
+
lastStatus: "idle",
|
|
112
|
+
timeline: result.timeline.map((e) => ({ epoch: 0, seq: 0, timestamp: this.now(), event: e })),
|
|
113
|
+
persistence: result.persistence,
|
|
114
|
+
};
|
|
115
|
+
const managed = await this.deps.manager.add(record);
|
|
116
|
+
this.deps.manager.attachSession(record.id, result.session);
|
|
117
|
+
// Publish only once the agent is ready.
|
|
118
|
+
this.broadcastAll(getSessions(), {
|
|
119
|
+
type: "agent_update",
|
|
120
|
+
agentId: record.id,
|
|
121
|
+
status: "idle",
|
|
122
|
+
});
|
|
123
|
+
return {
|
|
124
|
+
type: "import_agent_session_response",
|
|
125
|
+
agentId: record.id,
|
|
126
|
+
ok: true,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=session-operations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-operations.js","sourceRoot":"","sources":["../../src/agent/session-operations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Daemon-side LLM-backed metadata generation (architecture/structured-generation.md § Tasks,
|
|
3
|
+
* § Provider selection, § Behavior). Drives agent-title generation, commit messages, PR text,
|
|
4
|
+
* branch names without creating throwaway `AgentSession`s.
|
|
5
|
+
*/
|
|
6
|
+
export declare const MAX_EXPLICIT_AGENT_TITLE_CHARS = 80;
|
|
7
|
+
/** Supported metadata generation tasks. */
|
|
8
|
+
export type GenerationTask = "agent_title" | "commit_message" | "pr_title" | "pr_body" | "branch_name";
|
|
9
|
+
/** A candidate provider entry from `agents.metadataGeneration.providers`. */
|
|
10
|
+
export interface MetadataGenerationCandidate {
|
|
11
|
+
provider: string;
|
|
12
|
+
model?: string;
|
|
13
|
+
thinkingOptionId?: string;
|
|
14
|
+
}
|
|
15
|
+
/** Minimal provider RPC interface (no AgentSession created). */
|
|
16
|
+
export interface StructuredGenerationProvider {
|
|
17
|
+
readonly provider: string;
|
|
18
|
+
isAvailable(): boolean | Promise<boolean>;
|
|
19
|
+
/** Top-level structured generation call. Returns `null` when output is invalid/unavailable. */
|
|
20
|
+
structuredGenerate(prompt: string, task: GenerationTask): Promise<string | null>;
|
|
21
|
+
}
|
|
22
|
+
export interface GenerateOpts {
|
|
23
|
+
/** Configured provider fallback order from `agents.metadataGeneration.providers`. */
|
|
24
|
+
configuredCandidates?: MetadataGenerationCandidate[];
|
|
25
|
+
/** Already-resolved providers to try (in order). */
|
|
26
|
+
candidates?: StructuredGenerationProvider[];
|
|
27
|
+
/** Context passed to the prompt builder. */
|
|
28
|
+
context?: Record<string, unknown>;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Build a simple deterministic fallback for each task type. Used when all providers fail.
|
|
32
|
+
*/
|
|
33
|
+
export declare function deterministicFallback(task: GenerationTask, context?: Record<string, unknown>): string;
|
|
34
|
+
/**
|
|
35
|
+
* Try each candidate in order, returning the first valid result. Falls back to a
|
|
36
|
+
* deterministic fallback if all providers fail. Never creates a throwaway `AgentSession`.
|
|
37
|
+
*/
|
|
38
|
+
export declare function generate(task: GenerationTask, opts?: GenerateOpts): Promise<string>;
|
|
39
|
+
//# sourceMappingURL=structured-generation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structured-generation.d.ts","sourceRoot":"","sources":["../../src/agent/structured-generation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,8BAA8B,KAAK,CAAC;AAEjD,2CAA2C;AAC3C,MAAM,MAAM,cAAc,GACtB,aAAa,GACb,gBAAgB,GAChB,UAAU,GACV,SAAS,GACT,aAAa,CAAC;AAElB,6EAA6E;AAC7E,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,gEAAgE;AAChE,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,WAAW,IAAI,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1C,+FAA+F;IAC/F,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CAClF;AAED,MAAM,WAAW,YAAY;IAC3B,qFAAqF;IACrF,oBAAoB,CAAC,EAAE,2BAA2B,EAAE,CAAC;IACrD,oDAAoD;IACpD,UAAU,CAAC,EAAE,4BAA4B,EAAE,CAAC;IAC5C,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,cAAc,EACpB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,MAAM,CAsBR;AASD;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,GAAE,YAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAgB7F"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Daemon-side LLM-backed metadata generation (architecture/structured-generation.md § Tasks,
|
|
3
|
+
* § Provider selection, § Behavior). Drives agent-title generation, commit messages, PR text,
|
|
4
|
+
* branch names without creating throwaway `AgentSession`s.
|
|
5
|
+
*/
|
|
6
|
+
export const MAX_EXPLICIT_AGENT_TITLE_CHARS = 80;
|
|
7
|
+
/**
|
|
8
|
+
* Build a simple deterministic fallback for each task type. Used when all providers fail.
|
|
9
|
+
*/
|
|
10
|
+
export function deterministicFallback(task, context) {
|
|
11
|
+
const prompt = context?.prompt ?? context?.initialPrompt ?? "";
|
|
12
|
+
switch (task) {
|
|
13
|
+
case "agent_title":
|
|
14
|
+
return truncateTitle(prompt || "Untitled agent");
|
|
15
|
+
case "commit_message":
|
|
16
|
+
return truncateTitle(prompt || "Update");
|
|
17
|
+
case "pr_title":
|
|
18
|
+
return truncateTitle(prompt || "Changes");
|
|
19
|
+
case "pr_body":
|
|
20
|
+
return prompt ? `${prompt.slice(0, 200)}\n\n(Generated)` : "(No description)";
|
|
21
|
+
case "branch_name": {
|
|
22
|
+
const slug = (prompt || "update")
|
|
23
|
+
.toLowerCase()
|
|
24
|
+
.replace(/[^a-z0-9\s-]/g, "")
|
|
25
|
+
.replace(/\s+/g, "-")
|
|
26
|
+
.replace(/-{2,}/g, "-")
|
|
27
|
+
.slice(0, 40)
|
|
28
|
+
.replace(/-$/, "");
|
|
29
|
+
return slug || "update";
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function truncateTitle(text) {
|
|
34
|
+
const cleaned = text.replace(/\s+/g, " ").trim();
|
|
35
|
+
return cleaned.length > MAX_EXPLICIT_AGENT_TITLE_CHARS
|
|
36
|
+
? `${cleaned.slice(0, MAX_EXPLICIT_AGENT_TITLE_CHARS - 1)}…`
|
|
37
|
+
: cleaned;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Try each candidate in order, returning the first valid result. Falls back to a
|
|
41
|
+
* deterministic fallback if all providers fail. Never creates a throwaway `AgentSession`.
|
|
42
|
+
*/
|
|
43
|
+
export async function generate(task, opts = {}) {
|
|
44
|
+
const { candidates = [], context } = opts;
|
|
45
|
+
for (const candidate of candidates) {
|
|
46
|
+
try {
|
|
47
|
+
const available = await candidate.isAvailable();
|
|
48
|
+
if (!available)
|
|
49
|
+
continue;
|
|
50
|
+
const result = await candidate.structuredGenerate(buildPrompt(task, context), task);
|
|
51
|
+
if (result && result.trim().length > 0) {
|
|
52
|
+
return task === "agent_title" ? truncateTitle(result) : result;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
// Provider failed → fall through to next.
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return deterministicFallback(task, context);
|
|
60
|
+
}
|
|
61
|
+
function buildPrompt(task, context) {
|
|
62
|
+
const ctx = context ?? {};
|
|
63
|
+
const prompt = ctx.prompt ?? ctx.initialPrompt ?? "";
|
|
64
|
+
const cwd = ctx.cwd ?? "";
|
|
65
|
+
switch (task) {
|
|
66
|
+
case "agent_title":
|
|
67
|
+
return `Generate a short, descriptive title (≤${MAX_EXPLICIT_AGENT_TITLE_CHARS} chars) for an agent session started with: "${prompt}"`;
|
|
68
|
+
case "commit_message":
|
|
69
|
+
return `Write a concise Git commit message for: "${prompt}"${cwd ? ` in ${cwd}` : ""}`;
|
|
70
|
+
case "pr_title":
|
|
71
|
+
return `Write a short PR title for: "${prompt}"`;
|
|
72
|
+
case "pr_body":
|
|
73
|
+
return `Write a brief PR description for: "${prompt}"`;
|
|
74
|
+
case "branch_name":
|
|
75
|
+
return `Generate a short, slug-safe Git branch name for: "${prompt}"`;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=structured-generation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structured-generation.js","sourceRoot":"","sources":["../../src/agent/structured-generation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { HandlerRegistry } from "../ws/router.js";
|
|
2
|
+
import type { AgentManager } from "./agent-manager.js";
|
|
3
|
+
import type { AgentClient } from "./provider-contract.js";
|
|
4
|
+
export interface TimelineHandlerDeps {
|
|
5
|
+
manager: AgentManager;
|
|
6
|
+
resolveClient: (provider: string) => AgentClient;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* `fetch_agent_timeline_request` handler (features/timeline-streaming.md § Fetch request/response,
|
|
10
|
+
* § Behavior — server). Returns full projected items (never deltas) with all paging fields. Bounded
|
|
11
|
+
* at `DEFAULT_PAGE_SIZE`; clients page to completion (`hasNewer:false`).
|
|
12
|
+
*
|
|
13
|
+
* A restarted daemon has no in-memory `AgentTimelineStore` for any agent (it lives only in
|
|
14
|
+
* process memory — see agent-service.ts). Rather than returning an empty page, fall back to the
|
|
15
|
+
* agent's provider re-deriving the timeline from its own durable native history (e.g. `pi`'s
|
|
16
|
+
* on-disk JSONL session file via `AgentClient.hydrateTimeline`), keyed off the record's persisted
|
|
17
|
+
* `persistence` handle. The result is seeded once into the in-memory store so subsequent pages
|
|
18
|
+
* (and any later live turn) build on it normally.
|
|
19
|
+
*/
|
|
20
|
+
export declare function registerTimelineHandler(registry: HandlerRegistry, deps: TimelineHandlerDeps): void;
|
|
21
|
+
//# sourceMappingURL=timeline-rpc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeline-rpc.d.ts","sourceRoot":"","sources":["../../src/agent/timeline-rpc.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAqB,MAAM,wBAAwB,CAAC;AAE7E,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,YAAY,CAAC;IACtB,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,WAAW,CAAC;CAClD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,eAAe,EAAE,IAAI,EAAE,mBAAmB,GAAG,IAAI,CA6ClG"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { getTimeline, seedTimeline } from "./agent-service.js";
|
|
2
|
+
import { DEFAULT_PAGE_SIZE } from "./timeline-store.js";
|
|
3
|
+
/**
|
|
4
|
+
* `fetch_agent_timeline_request` handler (features/timeline-streaming.md § Fetch request/response,
|
|
5
|
+
* § Behavior — server). Returns full projected items (never deltas) with all paging fields. Bounded
|
|
6
|
+
* at `DEFAULT_PAGE_SIZE`; clients page to completion (`hasNewer:false`).
|
|
7
|
+
*
|
|
8
|
+
* A restarted daemon has no in-memory `AgentTimelineStore` for any agent (it lives only in
|
|
9
|
+
* process memory — see agent-service.ts). Rather than returning an empty page, fall back to the
|
|
10
|
+
* agent's provider re-deriving the timeline from its own durable native history (e.g. `pi`'s
|
|
11
|
+
* on-disk JSONL session file via `AgentClient.hydrateTimeline`), keyed off the record's persisted
|
|
12
|
+
* `persistence` handle. The result is seeded once into the in-memory store so subsequent pages
|
|
13
|
+
* (and any later live turn) build on it normally.
|
|
14
|
+
*/
|
|
15
|
+
export function registerTimelineHandler(registry, deps) {
|
|
16
|
+
registry.register("fetch_agent_timeline_request", (ctx) => {
|
|
17
|
+
const msg = ctx.message;
|
|
18
|
+
const agentId = msg.agentId;
|
|
19
|
+
const direction = msg.direction ?? "after";
|
|
20
|
+
const cursor = msg.cursor;
|
|
21
|
+
const limit = typeof msg.limit === "number" && msg.limit > 0 ? msg.limit : DEFAULT_PAGE_SIZE;
|
|
22
|
+
let timeline = getTimeline(agentId);
|
|
23
|
+
if (!timeline) {
|
|
24
|
+
const record = deps.manager.get(agentId)?.record;
|
|
25
|
+
const handle = record?.persistence;
|
|
26
|
+
if (record && handle) {
|
|
27
|
+
const client = deps.resolveClient(record.provider);
|
|
28
|
+
const rows = client.hydrateTimeline?.(handle) ?? [];
|
|
29
|
+
if (rows.length > 0)
|
|
30
|
+
seedTimeline(agentId, rows);
|
|
31
|
+
}
|
|
32
|
+
timeline = getTimeline(agentId);
|
|
33
|
+
}
|
|
34
|
+
if (!timeline) {
|
|
35
|
+
// No in-memory timeline and no rehydratable native history — genuinely empty.
|
|
36
|
+
return {
|
|
37
|
+
type: "fetch_agent_timeline_response",
|
|
38
|
+
requestId: ctx.requestId ?? "",
|
|
39
|
+
agentId,
|
|
40
|
+
items: [],
|
|
41
|
+
seqStart: 0,
|
|
42
|
+
seqEnd: 0,
|
|
43
|
+
sourceSeqRanges: [],
|
|
44
|
+
collapsed: false,
|
|
45
|
+
hasNewer: false,
|
|
46
|
+
startCursor: null,
|
|
47
|
+
endCursor: null,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
const page = timeline.page({ direction, cursor, limit });
|
|
51
|
+
return {
|
|
52
|
+
type: "fetch_agent_timeline_response",
|
|
53
|
+
requestId: ctx.requestId ?? "",
|
|
54
|
+
agentId,
|
|
55
|
+
...page,
|
|
56
|
+
};
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=timeline-rpc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeline-rpc.js","sourceRoot":"","sources":["../../src/agent/timeline-rpc.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AASxD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,uBAAuB,CAAC,QAAyB,EAAE,IAAyB;IAC1F,QAAQ,CAAC,QAAQ,CAAC,8BAA8B,EAAE,CAAC,GAAG,EAA2B,EAAE;QACjF,MAAM,GAAG,GAAG,GAAG,CAAC,OAAkC,CAAC;QACnD,MAAM,OAAO,GAAG,GAAG,CAAC,OAAiB,CAAC;QACtC,MAAM,SAAS,GAAI,GAAG,CAAC,SAAgC,IAAI,OAAO,CAAC;QACnE,MAAM,MAAM,GAAG,GAAG,CAAC,MAAmC,CAAC;QACvD,MAAM,KAAK,GAAG,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,IAAI,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,iBAAiB,CAAC;QAE7F,IAAI,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QACpC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;YACjD,MAAM,MAAM,GAAG,MAAM,EAAE,WAA4C,CAAC;YACpE,IAAI,MAAM,IAAI,MAAM,EAAE,CAAC;gBACrB,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACnD,MAAM,IAAI,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;gBACpD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;oBAAE,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACnD,CAAC;YACD,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QAClC,CAAC;QAED,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,8EAA8E;YAC9E,OAAO;gBACL,IAAI,EAAE,+BAA+B;gBACrC,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,EAAE;gBAC9B,OAAO;gBACP,KAAK,EAAE,EAAE;gBACT,QAAQ,EAAE,CAAC;gBACX,MAAM,EAAE,CAAC;gBACT,eAAe,EAAE,EAAE;gBACnB,SAAS,EAAE,KAAK;gBAChB,QAAQ,EAAE,KAAK;gBACf,WAAW,EAAE,IAAI;gBACjB,SAAS,EAAE,IAAI;aAChB,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QACzD,OAAO;YACL,IAAI,EAAE,+BAA+B;YACrC,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,EAAE;YAC9B,OAAO;YACP,GAAG,IAAI;SACR,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Append-only per-agent timeline store (features/timeline-streaming.md § Timeline model,
|
|
3
|
+
* § Behavior). Rows persist alongside the agent record in `agents/{cwd}/{id}.json`.
|
|
4
|
+
*
|
|
5
|
+
* Key concepts:
|
|
6
|
+
* - **Epoch** — each run (`startTurn`) increments the epoch; rows within one epoch are ordered by
|
|
7
|
+
* monotonically-increasing `seq`.
|
|
8
|
+
* - **Source row** — one `AgentStreamEvent` mapped to one raw storage row (epoch + seq + timestamp
|
|
9
|
+
* owned by the daemon, never the provider).
|
|
10
|
+
* - **Projected item** — what a client renders. Multi-source events collapse: a tool-call lifecycle
|
|
11
|
+
* (status updates, result) is ONE projected item regardless of how many source rows it spans;
|
|
12
|
+
* adjacent assistant/reasoning chunks merge into one per run before counting toward the page limit.
|
|
13
|
+
* - **Page** — bounded at `DEFAULT_PAGE_SIZE` projected items; supports `direction:"before"|"after"`
|
|
14
|
+
* from an opaque cursor (encoded as base-10 `seq` string), with all paging fields.
|
|
15
|
+
*/
|
|
16
|
+
import type { AgentStreamEvent } from "@av-pi-studio/protocol";
|
|
17
|
+
export declare const DEFAULT_PAGE_SIZE = 200;
|
|
18
|
+
export interface TimelineRow {
|
|
19
|
+
epoch: number;
|
|
20
|
+
seq: number;
|
|
21
|
+
/** Daemon-owned canonical timestamp (ISO-8601). */
|
|
22
|
+
timestamp: string;
|
|
23
|
+
event: AgentStreamEvent;
|
|
24
|
+
}
|
|
25
|
+
export interface ToolCallItem {
|
|
26
|
+
kind: "tool_call";
|
|
27
|
+
callId?: string;
|
|
28
|
+
sourceSeqStart: number;
|
|
29
|
+
sourceSeqEnd: number;
|
|
30
|
+
events: AgentStreamEvent[];
|
|
31
|
+
}
|
|
32
|
+
export interface AssistantItem {
|
|
33
|
+
kind: "assistant";
|
|
34
|
+
sourceSeqStart: number;
|
|
35
|
+
sourceSeqEnd: number;
|
|
36
|
+
events: AgentStreamEvent[];
|
|
37
|
+
}
|
|
38
|
+
export interface OtherItem {
|
|
39
|
+
kind: "other";
|
|
40
|
+
sourceSeq: number;
|
|
41
|
+
event: AgentStreamEvent;
|
|
42
|
+
}
|
|
43
|
+
export type ProjectedItem = ToolCallItem | AssistantItem | OtherItem;
|
|
44
|
+
/** Collapse a contiguous slice of rows into projected items. */
|
|
45
|
+
export declare function projectRows(rows: TimelineRow[]): ProjectedItem[];
|
|
46
|
+
/** Encode a cursor from a sequence number (opaque string → base-10 decimal). */
|
|
47
|
+
export declare function encodeCursor(seq: number): string;
|
|
48
|
+
/** Decode a cursor; returns `undefined` for an invalid/absent cursor. */
|
|
49
|
+
export declare function decodeCursor(cursor: string | null | undefined): number | undefined;
|
|
50
|
+
export interface SourceSeqRange {
|
|
51
|
+
start: number;
|
|
52
|
+
end: number;
|
|
53
|
+
}
|
|
54
|
+
export interface TimelinePage {
|
|
55
|
+
items: ProjectedItem[];
|
|
56
|
+
seqStart: number;
|
|
57
|
+
seqEnd: number;
|
|
58
|
+
sourceSeqRanges: SourceSeqRange[];
|
|
59
|
+
collapsed: boolean;
|
|
60
|
+
hasNewer: boolean;
|
|
61
|
+
startCursor: string | null;
|
|
62
|
+
endCursor: string | null;
|
|
63
|
+
}
|
|
64
|
+
export declare class AgentTimelineStore {
|
|
65
|
+
private rows;
|
|
66
|
+
private epoch;
|
|
67
|
+
private nextSeq;
|
|
68
|
+
private readonly now;
|
|
69
|
+
constructor(opts?: {
|
|
70
|
+
initialRows?: TimelineRow[];
|
|
71
|
+
now?: () => string;
|
|
72
|
+
});
|
|
73
|
+
/** Start a new epoch (called when a new run begins). */
|
|
74
|
+
startEpoch(): number;
|
|
75
|
+
/** Append one event, assigning the daemon-owned timestamp + monotonic seq. */
|
|
76
|
+
append(event: AgentStreamEvent): TimelineRow;
|
|
77
|
+
currentEpoch(): number;
|
|
78
|
+
allRows(): TimelineRow[];
|
|
79
|
+
rowCount(): number;
|
|
80
|
+
/**
|
|
81
|
+
* Truncate the timeline back to just before the user message identified by messageId.
|
|
82
|
+
* The messageId corresponds to the `messageId` field in user_message stream events.
|
|
83
|
+
* Returns the ISO timestamp of the last retained row, or undefined if nothing was retained.
|
|
84
|
+
* (features/rewind.md § Wire contract)
|
|
85
|
+
*/
|
|
86
|
+
truncateBeforeMessage(messageId: string): string | undefined;
|
|
87
|
+
/**
|
|
88
|
+
* Return a bounded page of projected items.
|
|
89
|
+
*
|
|
90
|
+
* `direction:"after"` from cursor returns rows AFTER that seq (newer); `"before"` returns rows
|
|
91
|
+
* BEFORE that seq (older). Without a cursor, `"after"` returns from the start; `"before"` from
|
|
92
|
+
* the tail.
|
|
93
|
+
*/
|
|
94
|
+
page(opts: {
|
|
95
|
+
direction: "before" | "after";
|
|
96
|
+
cursor?: string | null;
|
|
97
|
+
limit?: number;
|
|
98
|
+
}): TimelinePage;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=timeline-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeline-store.d.ts","sourceRoot":"","sources":["../../src/agent/timeline-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,eAAO,MAAM,iBAAiB,MAAM,CAAC;AAMrC,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,mDAAmD;IACnD,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,gBAAgB,CAAC;CACzB;AAaD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,gBAAgB,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,WAAW,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,gBAAgB,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,gBAAgB,CAAC;CACzB;AAED,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,aAAa,GAAG,SAAS,CAAC;AAErE,gEAAgE;AAChE,wBAAgB,WAAW,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,aAAa,EAAE,CAgDhE;AAMD,gFAAgF;AAChF,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,yEAAyE;AACzE,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAIlF;AAMD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAMD,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,IAAI,CAAqB;IACjC,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;gBAEvB,IAAI,GAAE;QAAE,WAAW,CAAC,EAAE,WAAW,EAAE,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;KAAO;IAU1E,wDAAwD;IACxD,UAAU,IAAI,MAAM;IAKpB,8EAA8E;IAC9E,MAAM,CAAC,KAAK,EAAE,gBAAgB,GAAG,WAAW;IAW5C,YAAY,IAAI,MAAM;IAItB,OAAO,IAAI,WAAW,EAAE;IAIxB,QAAQ,IAAI,MAAM;IAIlB;;;;;OAKG;IACH,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAe5D;;;;;;OAMG;IACH,IAAI,CAAC,IAAI,EAAE;QACT,SAAS,EAAE,QAAQ,GAAG,OAAO,CAAC;QAC9B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,YAAY;CAkFjB"}
|