@duetso/agent 0.1.20
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/LICENSE +189 -0
- package/README.md +315 -0
- package/dist/package.json +84 -0
- package/dist/src/cli.d.ts +23 -0
- package/dist/src/cli.d.ts.map +1 -0
- package/dist/src/cli.js +754 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/core/serializer.d.ts +3 -0
- package/dist/src/core/serializer.d.ts.map +1 -0
- package/dist/src/core/serializer.js +22 -0
- package/dist/src/core/serializer.js.map +1 -0
- package/dist/src/core/structured-output.d.ts +13 -0
- package/dist/src/core/structured-output.d.ts.map +1 -0
- package/dist/src/core/structured-output.js +41 -0
- package/dist/src/core/structured-output.js.map +1 -0
- package/dist/src/guardrails/firewall.d.ts +7 -0
- package/dist/src/guardrails/firewall.d.ts.map +1 -0
- package/dist/src/guardrails/firewall.js +31 -0
- package/dist/src/guardrails/firewall.js.map +1 -0
- package/dist/src/guardrails/pattern.d.ts +13 -0
- package/dist/src/guardrails/pattern.d.ts.map +1 -0
- package/dist/src/guardrails/pattern.js +70 -0
- package/dist/src/guardrails/pattern.js.map +1 -0
- package/dist/src/guardrails/semantic.d.ts +14 -0
- package/dist/src/guardrails/semantic.d.ts.map +1 -0
- package/dist/src/guardrails/semantic.js +47 -0
- package/dist/src/guardrails/semantic.js.map +1 -0
- package/dist/src/index.d.ts +20 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +20 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/lib/compact-json.d.ts +11 -0
- package/dist/src/lib/compact-json.d.ts.map +1 -0
- package/dist/src/lib/compact-json.js +36 -0
- package/dist/src/lib/compact-json.js.map +1 -0
- package/dist/src/lib/xml.d.ts +3 -0
- package/dist/src/lib/xml.d.ts.map +1 -0
- package/dist/src/lib/xml.js +9 -0
- package/dist/src/lib/xml.js.map +1 -0
- package/dist/src/memory/observation-groups.d.ts +15 -0
- package/dist/src/memory/observation-groups.d.ts.map +1 -0
- package/dist/src/memory/observation-groups.js +159 -0
- package/dist/src/memory/observation-groups.js.map +1 -0
- package/dist/src/memory/observational-prompts.d.ts +27 -0
- package/dist/src/memory/observational-prompts.d.ts.map +1 -0
- package/dist/src/memory/observational-prompts.js +237 -0
- package/dist/src/memory/observational-prompts.js.map +1 -0
- package/dist/src/memory/observational.d.ts +63 -0
- package/dist/src/memory/observational.d.ts.map +1 -0
- package/dist/src/memory/observational.js +605 -0
- package/dist/src/memory/observational.js.map +1 -0
- package/dist/src/memory/storage.d.ts +3 -0
- package/dist/src/memory/storage.d.ts.map +1 -0
- package/dist/src/memory/storage.js +127 -0
- package/dist/src/memory/storage.js.map +1 -0
- package/dist/src/memory/store.d.ts +13 -0
- package/dist/src/memory/store.d.ts.map +1 -0
- package/dist/src/memory/store.js +106 -0
- package/dist/src/memory/store.js.map +1 -0
- package/dist/src/model-resolution/duet-gateway.d.ts +35 -0
- package/dist/src/model-resolution/duet-gateway.d.ts.map +1 -0
- package/dist/src/model-resolution/duet-gateway.js +56 -0
- package/dist/src/model-resolution/duet-gateway.js.map +1 -0
- package/dist/src/model-resolution/index.d.ts +31 -0
- package/dist/src/model-resolution/index.d.ts.map +1 -0
- package/dist/src/model-resolution/index.js +129 -0
- package/dist/src/model-resolution/index.js.map +1 -0
- package/dist/src/session/session-manager.d.ts +45 -0
- package/dist/src/session/session-manager.d.ts.map +1 -0
- package/dist/src/session/session-manager.js +94 -0
- package/dist/src/session/session-manager.js.map +1 -0
- package/dist/src/session/session.d.ts +113 -0
- package/dist/src/session/session.d.ts.map +1 -0
- package/dist/src/session/session.js +308 -0
- package/dist/src/session/session.js.map +1 -0
- package/dist/src/tui/app.d.ts +60 -0
- package/dist/src/tui/app.d.ts.map +1 -0
- package/dist/src/tui/app.js +742 -0
- package/dist/src/tui/app.js.map +1 -0
- package/dist/src/turn-runner/agent-events.d.ts +5 -0
- package/dist/src/turn-runner/agent-events.d.ts.map +1 -0
- package/dist/src/turn-runner/agent-events.js +59 -0
- package/dist/src/turn-runner/agent-events.js.map +1 -0
- package/dist/src/turn-runner/prompts.d.ts +13 -0
- package/dist/src/turn-runner/prompts.d.ts.map +1 -0
- package/dist/src/turn-runner/prompts.js +79 -0
- package/dist/src/turn-runner/prompts.js.map +1 -0
- package/dist/src/turn-runner/shell-state-handle.d.ts +32 -0
- package/dist/src/turn-runner/shell-state-handle.d.ts.map +1 -0
- package/dist/src/turn-runner/shell-state-handle.js +168 -0
- package/dist/src/turn-runner/shell-state-handle.js.map +1 -0
- package/dist/src/turn-runner/skill-context.d.ts +26 -0
- package/dist/src/turn-runner/skill-context.d.ts.map +1 -0
- package/dist/src/turn-runner/skill-context.js +110 -0
- package/dist/src/turn-runner/skill-context.js.map +1 -0
- package/dist/src/turn-runner/skills.d.ts +35 -0
- package/dist/src/turn-runner/skills.d.ts.map +1 -0
- package/dist/src/turn-runner/skills.js +130 -0
- package/dist/src/turn-runner/skills.js.map +1 -0
- package/dist/src/turn-runner/state-machine-controller.d.ts +90 -0
- package/dist/src/turn-runner/state-machine-controller.d.ts.map +1 -0
- package/dist/src/turn-runner/state-machine-controller.js +289 -0
- package/dist/src/turn-runner/state-machine-controller.js.map +1 -0
- package/dist/src/turn-runner/state-machine-session.d.ts +27 -0
- package/dist/src/turn-runner/state-machine-session.d.ts.map +1 -0
- package/dist/src/turn-runner/state-machine-session.js +189 -0
- package/dist/src/turn-runner/state-machine-session.js.map +1 -0
- package/dist/src/turn-runner/tools.d.ts +193 -0
- package/dist/src/turn-runner/tools.d.ts.map +1 -0
- package/dist/src/turn-runner/tools.js +509 -0
- package/dist/src/turn-runner/tools.js.map +1 -0
- package/dist/src/turn-runner/turn-runner.d.ts +160 -0
- package/dist/src/turn-runner/turn-runner.d.ts.map +1 -0
- package/dist/src/turn-runner/turn-runner.js +907 -0
- package/dist/src/turn-runner/turn-runner.js.map +1 -0
- package/dist/src/turn-runner/turn-state.d.ts +6 -0
- package/dist/src/turn-runner/turn-state.d.ts.map +1 -0
- package/dist/src/turn-runner/turn-state.js +32 -0
- package/dist/src/turn-runner/turn-state.js.map +1 -0
- package/dist/src/turn-runner/usage-accounting.d.ts +7 -0
- package/dist/src/turn-runner/usage-accounting.d.ts.map +1 -0
- package/dist/src/turn-runner/usage-accounting.js +49 -0
- package/dist/src/turn-runner/usage-accounting.js.map +1 -0
- package/dist/src/types/agent.d.ts +15 -0
- package/dist/src/types/agent.d.ts.map +1 -0
- package/dist/src/types/agent.js +2 -0
- package/dist/src/types/agent.js.map +1 -0
- package/dist/src/types/config.d.ts +37 -0
- package/dist/src/types/config.d.ts.map +1 -0
- package/dist/src/types/config.js +2 -0
- package/dist/src/types/config.js.map +1 -0
- package/dist/src/types/guardrails.d.ts +34 -0
- package/dist/src/types/guardrails.d.ts.map +1 -0
- package/dist/src/types/guardrails.js +2 -0
- package/dist/src/types/guardrails.js.map +1 -0
- package/dist/src/types/memory.d.ts +151 -0
- package/dist/src/types/memory.d.ts.map +1 -0
- package/dist/src/types/memory.js +2 -0
- package/dist/src/types/memory.js.map +1 -0
- package/dist/src/types/protocol.d.ts +426 -0
- package/dist/src/types/protocol.d.ts.map +1 -0
- package/dist/src/types/protocol.js +2 -0
- package/dist/src/types/protocol.js.map +1 -0
- package/dist/src/types/state-machine.d.ts +344 -0
- package/dist/src/types/state-machine.d.ts.map +1 -0
- package/dist/src/types/state-machine.js +2 -0
- package/dist/src/types/state-machine.js.map +1 -0
- package/package.json +84 -0
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { mkdirSync } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { nanoid } from "nanoid";
|
|
5
|
+
import { Session } from "./session.js";
|
|
6
|
+
export const DEFAULT_DUET_DIR = ".duet";
|
|
7
|
+
export const DEFAULT_DUET_HOME = join(homedir(), DEFAULT_DUET_DIR);
|
|
8
|
+
export const DEFAULT_SESSION_STORAGE_DIR = join(DEFAULT_DUET_HOME, "sessions");
|
|
9
|
+
export const DEFAULT_MEMORY_DB_PATH = join(DEFAULT_DUET_HOME, "memory.db");
|
|
10
|
+
export class SessionManager {
|
|
11
|
+
options;
|
|
12
|
+
sessions = new Map();
|
|
13
|
+
eventHandlers = new Set();
|
|
14
|
+
sessionStoragePath;
|
|
15
|
+
config;
|
|
16
|
+
constructor(config, options = {}) {
|
|
17
|
+
this.options = options;
|
|
18
|
+
this.config = withDefaultMemoryDbPath(config);
|
|
19
|
+
this.sessionStoragePath = options.sessionStoragePath ?? DEFAULT_SESSION_STORAGE_DIR;
|
|
20
|
+
}
|
|
21
|
+
subscribe(handler) {
|
|
22
|
+
this.eventHandlers.add(handler);
|
|
23
|
+
return () => {
|
|
24
|
+
this.eventHandlers.delete(handler);
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
create(input) {
|
|
28
|
+
const session = this.createSession(input.sessionId, false);
|
|
29
|
+
this.sessions.set(session.id, session);
|
|
30
|
+
const setup = session.start({
|
|
31
|
+
...(input.mode ? { mode: input.mode } : {}),
|
|
32
|
+
...(input.options ? { options: input.options } : {}),
|
|
33
|
+
});
|
|
34
|
+
if (input.prompt) {
|
|
35
|
+
const prompt = input.prompt;
|
|
36
|
+
void setup.then(() => session.prompt({
|
|
37
|
+
message: prompt,
|
|
38
|
+
}));
|
|
39
|
+
}
|
|
40
|
+
return session;
|
|
41
|
+
}
|
|
42
|
+
get(sessionId) {
|
|
43
|
+
return this.sessions.get(sessionId);
|
|
44
|
+
}
|
|
45
|
+
resume(sessionId) {
|
|
46
|
+
const existing = this.sessions.get(sessionId);
|
|
47
|
+
if (existing)
|
|
48
|
+
return existing;
|
|
49
|
+
const session = this.createSession(sessionId, true);
|
|
50
|
+
this.sessions.set(sessionId, session);
|
|
51
|
+
return session;
|
|
52
|
+
}
|
|
53
|
+
async dispose() {
|
|
54
|
+
for (const session of this.sessions.values()) {
|
|
55
|
+
await session.dispose();
|
|
56
|
+
}
|
|
57
|
+
this.sessions.clear();
|
|
58
|
+
}
|
|
59
|
+
createSession(sessionId, resumeFromStorage) {
|
|
60
|
+
const id = sessionId ?? createSessionId();
|
|
61
|
+
const sessionPath = join(this.sessionStoragePath, sanitizeSessionId(id));
|
|
62
|
+
mkdirSync(sessionPath, { recursive: true });
|
|
63
|
+
const session = new Session(this.config, {
|
|
64
|
+
id,
|
|
65
|
+
runner: this.options.createRunner?.(id),
|
|
66
|
+
resumeFromStorage,
|
|
67
|
+
sessionPath,
|
|
68
|
+
});
|
|
69
|
+
session.subscribe((event) => {
|
|
70
|
+
this.emit({ sessionId: session.id, event });
|
|
71
|
+
});
|
|
72
|
+
return session;
|
|
73
|
+
}
|
|
74
|
+
emit(event) {
|
|
75
|
+
for (const handler of this.eventHandlers) {
|
|
76
|
+
handler(event);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
function withDefaultMemoryDbPath(config) {
|
|
81
|
+
if (config.memoryDbPath !== undefined)
|
|
82
|
+
return config;
|
|
83
|
+
return {
|
|
84
|
+
...config,
|
|
85
|
+
memoryDbPath: DEFAULT_MEMORY_DB_PATH,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
function createSessionId() {
|
|
89
|
+
return `session_${nanoid(12)}`;
|
|
90
|
+
}
|
|
91
|
+
function sanitizeSessionId(sessionId) {
|
|
92
|
+
return sessionId.replace(/[^A-Za-z0-9_.-]/g, "_");
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=session-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../../src/session/session-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { type TurnEventHandler } from "../turn-runner/turn-runner.js";
|
|
2
|
+
import type { TurnRunnerConfig } from "../types/config.js";
|
|
3
|
+
import type { Skill } from "@earendil-works/pi-coding-agent";
|
|
4
|
+
import type { SkillCollision } from "../turn-runner/skills.js";
|
|
5
|
+
import type { TurnAgentFile, TurnEditFollowUpQueueCommand, TurnEvent, TurnInterruptCommand, TurnMode, TurnPromptBehavior, TurnQuestion, TurnStartCommand, TurnState, TurnTerminalEvent, TurnCommand, TurnOptions } from "../types/protocol.js";
|
|
6
|
+
export interface SessionStartInput {
|
|
7
|
+
/** Routing mode for subsequent prompts. Omit to use the session's configured default. */
|
|
8
|
+
mode?: TurnMode;
|
|
9
|
+
options?: TurnOptions;
|
|
10
|
+
}
|
|
11
|
+
export interface SessionPromptInput {
|
|
12
|
+
message: string;
|
|
13
|
+
behavior?: TurnPromptBehavior;
|
|
14
|
+
}
|
|
15
|
+
export interface SessionAnswerInput {
|
|
16
|
+
questions: TurnQuestion[];
|
|
17
|
+
answers: Record<string, string>;
|
|
18
|
+
behavior?: TurnPromptBehavior;
|
|
19
|
+
}
|
|
20
|
+
export interface SessionEditFollowUpQueueInput {
|
|
21
|
+
prompts: string[];
|
|
22
|
+
}
|
|
23
|
+
export type SessionEventHandler = (event: TurnEvent) => void;
|
|
24
|
+
export interface SessionTurnRunner {
|
|
25
|
+
start(command: TurnStartCommand): Promise<TurnState>;
|
|
26
|
+
turn(command: TurnCommand): Promise<TurnTerminalEvent>;
|
|
27
|
+
interrupt(command: TurnInterruptCommand): void;
|
|
28
|
+
editFollowUpQueue(command: TurnEditFollowUpQueueCommand): void;
|
|
29
|
+
subscribe(handler: TurnEventHandler): () => void;
|
|
30
|
+
getState(): TurnState | undefined;
|
|
31
|
+
getSkills(): Promise<readonly Skill[]>;
|
|
32
|
+
getResolvedAgentFiles(): Promise<readonly TurnAgentFile[]>;
|
|
33
|
+
getSkillCollisions(): Promise<readonly SkillCollision[]>;
|
|
34
|
+
dispose(): Promise<void>;
|
|
35
|
+
}
|
|
36
|
+
export interface SessionOptions {
|
|
37
|
+
id: string;
|
|
38
|
+
/** Concrete directory owned by this session. The manager creates it before construction. */
|
|
39
|
+
sessionPath: string;
|
|
40
|
+
runner?: SessionTurnRunner;
|
|
41
|
+
resumeFromStorage?: boolean;
|
|
42
|
+
}
|
|
43
|
+
export declare class Session {
|
|
44
|
+
readonly config: TurnRunnerConfig;
|
|
45
|
+
readonly id: string;
|
|
46
|
+
private readonly runner;
|
|
47
|
+
/** Directory owned by this session. State persistence writes `state.json` inside it. */
|
|
48
|
+
private readonly sessionPath;
|
|
49
|
+
/** Subscribers interested in this single session's raw turn-runner events. */
|
|
50
|
+
private readonly eventHandlers;
|
|
51
|
+
/** Removes the session's subscription to its owned runner during disposal. */
|
|
52
|
+
private readonly unsubscribeRunner;
|
|
53
|
+
/** In-flight runner turn, used to distinguish active work from a reusable terminal result. */
|
|
54
|
+
private activeTurn?;
|
|
55
|
+
/** In-flight runner setup, awaited before any turn dispatches so turn_started lands first. */
|
|
56
|
+
private startPromise?;
|
|
57
|
+
/** Most recent terminal event, returned immediately when callers wait after a turn has settled. */
|
|
58
|
+
private lastTerminal?;
|
|
59
|
+
/** Scheduled wake for sleeping state-machine states; cancelled when user input or interrupt arrives. */
|
|
60
|
+
private wakeTimer?;
|
|
61
|
+
/** Restores a prompt/answer turn back to sleep when the state machine is still waiting. */
|
|
62
|
+
private restoreSleepAfterTurn?;
|
|
63
|
+
/** Whether this session should hydrate `state.json` on first use. New sessions start empty. */
|
|
64
|
+
private readonly resumeFromStorage;
|
|
65
|
+
/** Pending callers of `waitForTerminal`, resolved together when the next terminal event arrives. */
|
|
66
|
+
private readonly terminalWaiters;
|
|
67
|
+
constructor(config: TurnRunnerConfig, options: SessionOptions);
|
|
68
|
+
subscribe(handler: SessionEventHandler): () => void;
|
|
69
|
+
/**
|
|
70
|
+
* Initialize the session before any turn runs. Calls the runner's setup
|
|
71
|
+
* step once so the caller can render skills and agent files immediately on
|
|
72
|
+
* launch, before the user types a prompt.
|
|
73
|
+
*
|
|
74
|
+
* Repeat calls are no-ops; resumed sessions reuse the persisted state.
|
|
75
|
+
*/
|
|
76
|
+
start(input?: SessionStartInput): Promise<void>;
|
|
77
|
+
prompt(input: SessionPromptInput): Promise<void>;
|
|
78
|
+
answer(input: SessionAnswerInput): Promise<void>;
|
|
79
|
+
interrupt(): Promise<void>;
|
|
80
|
+
private ensureStarted;
|
|
81
|
+
editFollowUpQueue(input: SessionEditFollowUpQueueInput): void;
|
|
82
|
+
waitForTerminal(): Promise<TurnTerminalEvent>;
|
|
83
|
+
isTurnActive(): boolean;
|
|
84
|
+
/** Current runner-owned turn state snapshot, including agent message history. */
|
|
85
|
+
getState(): TurnState | undefined;
|
|
86
|
+
/**
|
|
87
|
+
* Skills discovered for this session. Available after `start()` resolves;
|
|
88
|
+
* loading happens lazily on first call otherwise.
|
|
89
|
+
*/
|
|
90
|
+
getSkills(): Promise<readonly Skill[]>;
|
|
91
|
+
/** System-prompt files (AGENTS.md by default) that resolved on disk. */
|
|
92
|
+
getResolvedAgentFiles(): Promise<readonly TurnAgentFile[]>;
|
|
93
|
+
/** Skill name collisions where one definition shadowed another during discovery. */
|
|
94
|
+
getSkillCollisions(): Promise<readonly SkillCollision[]>;
|
|
95
|
+
/** Start this session from persisted state before dispatching a user command. */
|
|
96
|
+
hydrate(): Promise<void>;
|
|
97
|
+
dispose(): Promise<void>;
|
|
98
|
+
private dispatchTurn;
|
|
99
|
+
private handleTurnEvent;
|
|
100
|
+
private normalizeTerminalEvent;
|
|
101
|
+
private emit;
|
|
102
|
+
private scheduleWake;
|
|
103
|
+
private cancelWake;
|
|
104
|
+
private requireState;
|
|
105
|
+
private persistLatestState;
|
|
106
|
+
private startOptions;
|
|
107
|
+
private isWaitingOnScheduledState;
|
|
108
|
+
private currentScheduledState;
|
|
109
|
+
private readStoredState;
|
|
110
|
+
private writeStoredState;
|
|
111
|
+
private sessionFilePath;
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/session/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { TurnRunner } from "../turn-runner/turn-runner.js";
|
|
4
|
+
export class Session {
|
|
5
|
+
config;
|
|
6
|
+
id;
|
|
7
|
+
runner;
|
|
8
|
+
/** Directory owned by this session. State persistence writes `state.json` inside it. */
|
|
9
|
+
sessionPath;
|
|
10
|
+
/** Subscribers interested in this single session's raw turn-runner events. */
|
|
11
|
+
eventHandlers = new Set();
|
|
12
|
+
/** Removes the session's subscription to its owned runner during disposal. */
|
|
13
|
+
unsubscribeRunner;
|
|
14
|
+
/** In-flight runner turn, used to distinguish active work from a reusable terminal result. */
|
|
15
|
+
activeTurn;
|
|
16
|
+
/** In-flight runner setup, awaited before any turn dispatches so turn_started lands first. */
|
|
17
|
+
startPromise;
|
|
18
|
+
/** Most recent terminal event, returned immediately when callers wait after a turn has settled. */
|
|
19
|
+
lastTerminal;
|
|
20
|
+
/** Scheduled wake for sleeping state-machine states; cancelled when user input or interrupt arrives. */
|
|
21
|
+
wakeTimer;
|
|
22
|
+
/** Restores a prompt/answer turn back to sleep when the state machine is still waiting. */
|
|
23
|
+
restoreSleepAfterTurn;
|
|
24
|
+
/** Whether this session should hydrate `state.json` on first use. New sessions start empty. */
|
|
25
|
+
resumeFromStorage;
|
|
26
|
+
/** Pending callers of `waitForTerminal`, resolved together when the next terminal event arrives. */
|
|
27
|
+
terminalWaiters = [];
|
|
28
|
+
constructor(config, options) {
|
|
29
|
+
this.config = config;
|
|
30
|
+
this.id = options.id;
|
|
31
|
+
this.resumeFromStorage = options.resumeFromStorage ?? Boolean(options.id);
|
|
32
|
+
this.runner = options.runner ?? new TurnRunner(config);
|
|
33
|
+
this.sessionPath = options.sessionPath;
|
|
34
|
+
this.unsubscribeRunner = this.runner.subscribe((event) => void this.handleTurnEvent(event));
|
|
35
|
+
}
|
|
36
|
+
subscribe(handler) {
|
|
37
|
+
this.eventHandlers.add(handler);
|
|
38
|
+
return () => {
|
|
39
|
+
this.eventHandlers.delete(handler);
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Initialize the session before any turn runs. Calls the runner's setup
|
|
44
|
+
* step once so the caller can render skills and agent files immediately on
|
|
45
|
+
* launch, before the user types a prompt.
|
|
46
|
+
*
|
|
47
|
+
* Repeat calls are no-ops; resumed sessions reuse the persisted state.
|
|
48
|
+
*/
|
|
49
|
+
async start(input = {}) {
|
|
50
|
+
if (this.startPromise) {
|
|
51
|
+
await this.startPromise;
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
const state = this.resumeFromStorage ? await this.readStoredState() : undefined;
|
|
55
|
+
const command = {
|
|
56
|
+
type: "start",
|
|
57
|
+
...((input.mode ?? this.config.mode) ? { mode: input.mode ?? this.config.mode } : {}),
|
|
58
|
+
...(state ? { state } : {}),
|
|
59
|
+
...this.startOptions(input.options),
|
|
60
|
+
};
|
|
61
|
+
this.startPromise = this.runner.start(command).then(() => undefined);
|
|
62
|
+
await this.startPromise;
|
|
63
|
+
}
|
|
64
|
+
async prompt(input) {
|
|
65
|
+
await this.ensureStarted();
|
|
66
|
+
const state = await this.requireState();
|
|
67
|
+
this.cancelWake();
|
|
68
|
+
const wasSleeping = state.status === "sleeping";
|
|
69
|
+
this.restoreSleepAfterTurn = wasSleeping && this.isWaitingOnScheduledState(state);
|
|
70
|
+
const command = {
|
|
71
|
+
type: "prompt",
|
|
72
|
+
message: input.message,
|
|
73
|
+
behavior: input.behavior ?? "follow_up",
|
|
74
|
+
};
|
|
75
|
+
this.dispatchTurn(command);
|
|
76
|
+
}
|
|
77
|
+
async answer(input) {
|
|
78
|
+
await this.ensureStarted();
|
|
79
|
+
const state = await this.requireState();
|
|
80
|
+
this.cancelWake();
|
|
81
|
+
const wasSleeping = state.status === "sleeping";
|
|
82
|
+
this.restoreSleepAfterTurn = wasSleeping && this.isWaitingOnScheduledState(state);
|
|
83
|
+
const command = {
|
|
84
|
+
type: "answer",
|
|
85
|
+
questions: input.questions,
|
|
86
|
+
answers: input.answers,
|
|
87
|
+
behavior: input.behavior ?? "follow_up",
|
|
88
|
+
};
|
|
89
|
+
this.dispatchTurn(command);
|
|
90
|
+
}
|
|
91
|
+
async interrupt() {
|
|
92
|
+
await this.ensureStarted();
|
|
93
|
+
this.cancelWake();
|
|
94
|
+
this.runner.interrupt({ type: "interrupt" });
|
|
95
|
+
}
|
|
96
|
+
async ensureStarted() {
|
|
97
|
+
if (!this.startPromise) {
|
|
98
|
+
await this.start();
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
await this.startPromise;
|
|
102
|
+
}
|
|
103
|
+
editFollowUpQueue(input) {
|
|
104
|
+
this.runner.editFollowUpQueue({
|
|
105
|
+
type: "edit_follow_up_queue",
|
|
106
|
+
prompts: input.prompts,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
async waitForTerminal() {
|
|
110
|
+
if (this.lastTerminal && !this.activeTurn) {
|
|
111
|
+
return this.lastTerminal;
|
|
112
|
+
}
|
|
113
|
+
return new Promise((resolve) => {
|
|
114
|
+
this.terminalWaiters.push(resolve);
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
isTurnActive() {
|
|
118
|
+
return Boolean(this.activeTurn);
|
|
119
|
+
}
|
|
120
|
+
/** Current runner-owned turn state snapshot, including agent message history. */
|
|
121
|
+
getState() {
|
|
122
|
+
return this.runner.getState();
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Skills discovered for this session. Available after `start()` resolves;
|
|
126
|
+
* loading happens lazily on first call otherwise.
|
|
127
|
+
*/
|
|
128
|
+
getSkills() {
|
|
129
|
+
return this.runner.getSkills();
|
|
130
|
+
}
|
|
131
|
+
/** System-prompt files (AGENTS.md by default) that resolved on disk. */
|
|
132
|
+
getResolvedAgentFiles() {
|
|
133
|
+
return this.runner.getResolvedAgentFiles();
|
|
134
|
+
}
|
|
135
|
+
/** Skill name collisions where one definition shadowed another during discovery. */
|
|
136
|
+
getSkillCollisions() {
|
|
137
|
+
return this.runner.getSkillCollisions();
|
|
138
|
+
}
|
|
139
|
+
/** Start this session from persisted state before dispatching a user command. */
|
|
140
|
+
async hydrate() {
|
|
141
|
+
if (this.startPromise) {
|
|
142
|
+
await this.startPromise;
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
if (!this.resumeFromStorage)
|
|
146
|
+
return;
|
|
147
|
+
const state = await this.readStoredState();
|
|
148
|
+
if (!state)
|
|
149
|
+
return;
|
|
150
|
+
this.startPromise = this.runner
|
|
151
|
+
.start({ type: "start", state, ...this.startOptions() })
|
|
152
|
+
.then(() => undefined);
|
|
153
|
+
await this.startPromise;
|
|
154
|
+
}
|
|
155
|
+
async dispose() {
|
|
156
|
+
await this.persistLatestState();
|
|
157
|
+
this.unsubscribeRunner();
|
|
158
|
+
this.cancelWake();
|
|
159
|
+
await this.runner.dispose();
|
|
160
|
+
}
|
|
161
|
+
dispatchTurn(command) {
|
|
162
|
+
this.lastTerminal = undefined;
|
|
163
|
+
const activeTurn = this.runner
|
|
164
|
+
.turn(command)
|
|
165
|
+
.then(() => undefined)
|
|
166
|
+
.catch((error) => {
|
|
167
|
+
this.emit({
|
|
168
|
+
type: "system",
|
|
169
|
+
level: "error",
|
|
170
|
+
message: error instanceof Error ? error.message : String(error),
|
|
171
|
+
});
|
|
172
|
+
})
|
|
173
|
+
.finally(() => {
|
|
174
|
+
if (this.activeTurn === activeTurn) {
|
|
175
|
+
this.activeTurn = undefined;
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
this.activeTurn = activeTurn;
|
|
179
|
+
}
|
|
180
|
+
async handleTurnEvent(event) {
|
|
181
|
+
let emitted = event;
|
|
182
|
+
if (isTerminalEvent(event)) {
|
|
183
|
+
emitted = this.normalizeTerminalEvent(event);
|
|
184
|
+
this.lastTerminal = emitted;
|
|
185
|
+
await this.writeStoredState(emitted.state);
|
|
186
|
+
if (emitted.type === "sleep") {
|
|
187
|
+
this.scheduleWake(emitted);
|
|
188
|
+
}
|
|
189
|
+
for (const resolve of this.terminalWaiters.splice(0)) {
|
|
190
|
+
resolve(emitted);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
this.emit(emitted);
|
|
194
|
+
}
|
|
195
|
+
normalizeTerminalEvent(event) {
|
|
196
|
+
if (this.restoreSleepAfterTurn &&
|
|
197
|
+
event.type === "complete" &&
|
|
198
|
+
this.isWaitingOnScheduledState(event.state)) {
|
|
199
|
+
this.restoreSleepAfterTurn = false;
|
|
200
|
+
if (event.status === "failed") {
|
|
201
|
+
this.emit({
|
|
202
|
+
type: "system",
|
|
203
|
+
level: "error",
|
|
204
|
+
message: event.error ?? event.result ?? "Prompt failed while waiting.",
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
const state = this.currentScheduledState(event.state);
|
|
208
|
+
const progress = state ? event.state.stateMachine?.progress?.states[state.name] : undefined;
|
|
209
|
+
const wakeAt = progress?.nextWakeAt ??
|
|
210
|
+
(state?.kind === "poll" ? Date.now() + state.intervalMs : (state?.wakeAt ?? Date.now()));
|
|
211
|
+
return {
|
|
212
|
+
type: "sleep",
|
|
213
|
+
wakeAt,
|
|
214
|
+
state: { ...event.state, status: "sleeping" },
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
this.restoreSleepAfterTurn = false;
|
|
218
|
+
return event;
|
|
219
|
+
}
|
|
220
|
+
emit(event) {
|
|
221
|
+
for (const handler of this.eventHandlers) {
|
|
222
|
+
handler(event);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
scheduleWake(terminal) {
|
|
226
|
+
this.cancelWake();
|
|
227
|
+
this.wakeTimer = setTimeout(() => {
|
|
228
|
+
this.wakeTimer = undefined;
|
|
229
|
+
const state = this.runner.getState();
|
|
230
|
+
if (!state || state.status !== "sleeping")
|
|
231
|
+
return;
|
|
232
|
+
this.dispatchTurn({ type: "wake" });
|
|
233
|
+
}, Math.max(0, terminal.wakeAt - Date.now()));
|
|
234
|
+
}
|
|
235
|
+
cancelWake() {
|
|
236
|
+
if (this.wakeTimer) {
|
|
237
|
+
clearTimeout(this.wakeTimer);
|
|
238
|
+
this.wakeTimer = undefined;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
async requireState() {
|
|
242
|
+
await this.ensureStarted();
|
|
243
|
+
const state = this.runner.getState();
|
|
244
|
+
if (!state) {
|
|
245
|
+
throw new Error(`Unknown session: ${this.id}`);
|
|
246
|
+
}
|
|
247
|
+
return state;
|
|
248
|
+
}
|
|
249
|
+
async persistLatestState() {
|
|
250
|
+
const state = this.runner.getState();
|
|
251
|
+
if (!state)
|
|
252
|
+
return;
|
|
253
|
+
await this.writeStoredState(state);
|
|
254
|
+
}
|
|
255
|
+
startOptions(options) {
|
|
256
|
+
// CLI/TUI config is the current session contract. On resume it should
|
|
257
|
+
// override persisted options so flags like --model take effect immediately.
|
|
258
|
+
const effective = {
|
|
259
|
+
...(this.config.model ? { model: this.config.model } : {}),
|
|
260
|
+
...(this.config.memoryModel ? { memoryModel: this.config.memoryModel } : {}),
|
|
261
|
+
...(this.config.thinkingLevel ? { thinkingLevel: this.config.thinkingLevel } : {}),
|
|
262
|
+
...options,
|
|
263
|
+
};
|
|
264
|
+
return Object.keys(effective).length > 0 ? { options: effective } : {};
|
|
265
|
+
}
|
|
266
|
+
isWaitingOnScheduledState(state) {
|
|
267
|
+
return Boolean(this.currentScheduledState(state) && !state?.stateMachine?.terminal);
|
|
268
|
+
}
|
|
269
|
+
currentScheduledState(state) {
|
|
270
|
+
const stateMachine = state?.stateMachine;
|
|
271
|
+
const currentState = stateMachine?.currentState;
|
|
272
|
+
if (!stateMachine || !currentState)
|
|
273
|
+
return undefined;
|
|
274
|
+
const definitionState = stateMachine.definition.states.find((item) => item.name === currentState);
|
|
275
|
+
return definitionState?.kind === "poll" || definitionState?.kind === "timer"
|
|
276
|
+
? definitionState
|
|
277
|
+
: undefined;
|
|
278
|
+
}
|
|
279
|
+
async readStoredState() {
|
|
280
|
+
try {
|
|
281
|
+
const content = await readFile(this.sessionFilePath(), "utf-8");
|
|
282
|
+
const stored = JSON.parse(content);
|
|
283
|
+
return stored.state ?? stored.session;
|
|
284
|
+
}
|
|
285
|
+
catch (error) {
|
|
286
|
+
if (isEnoent(error) || String(error).includes(this.sessionFilePath())) {
|
|
287
|
+
return undefined;
|
|
288
|
+
}
|
|
289
|
+
throw error;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
async writeStoredState(state) {
|
|
293
|
+
await writeFile(this.sessionFilePath(), `${JSON.stringify({ sessionId: this.id, updatedAt: Date.now(), state }, null, 2)}\n`, "utf-8");
|
|
294
|
+
}
|
|
295
|
+
sessionFilePath() {
|
|
296
|
+
return join(this.sessionPath, "state.json");
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
function isTerminalEvent(event) {
|
|
300
|
+
return (event.type === "complete" ||
|
|
301
|
+
event.type === "ask" ||
|
|
302
|
+
event.type === "interrupted" ||
|
|
303
|
+
event.type === "sleep");
|
|
304
|
+
}
|
|
305
|
+
function isEnoent(error) {
|
|
306
|
+
return String(error).includes("ENOENT");
|
|
307
|
+
}
|
|
308
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/session/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { AgentMessage } from "@earendil-works/pi-agent-core";
|
|
2
|
+
import type { Session } from "../session/session.js";
|
|
3
|
+
import type { TurnTerminalEvent } from "../types/protocol.js";
|
|
4
|
+
export interface RunTuiInput {
|
|
5
|
+
session: Session;
|
|
6
|
+
initialPrompt?: string;
|
|
7
|
+
/** Current working directory shown in the startup header. */
|
|
8
|
+
workDir: string;
|
|
9
|
+
/** Session id shown in the startup header and resume context. */
|
|
10
|
+
sessionId: string;
|
|
11
|
+
/** Installed package version shown in the startup header. */
|
|
12
|
+
packageVersion: string;
|
|
13
|
+
/** Fully resolved provider:modelId string used for this CLI session. */
|
|
14
|
+
modelName: string;
|
|
15
|
+
/** Human-readable provenance for modelName, e.g. "inferred from ANTHROPIC_API_KEY in .env". */
|
|
16
|
+
modelSource?: string;
|
|
17
|
+
/** Fully resolved provider:modelId string used for observational memory work. */
|
|
18
|
+
memoryModelName: string;
|
|
19
|
+
/** Human-readable provenance for memoryModelName. */
|
|
20
|
+
memoryModelSource?: string;
|
|
21
|
+
/** Best-effort package update notice, shown in-TUI because stderr is hidden. */
|
|
22
|
+
newVersionNotice?: string;
|
|
23
|
+
/** Past messages to replay into the transcript on resume. */
|
|
24
|
+
history?: AgentMessage[];
|
|
25
|
+
/** Maximum prior-session display lines to replay on resume; 0 disables replay. */
|
|
26
|
+
resumeHistoryLines?: number;
|
|
27
|
+
}
|
|
28
|
+
type HistoryBlockKind = "user" | "agent" | "reasoning" | "tool" | "error";
|
|
29
|
+
export interface HistoryDisplayBlock {
|
|
30
|
+
kind: HistoryBlockKind;
|
|
31
|
+
content: string;
|
|
32
|
+
}
|
|
33
|
+
export interface LimitedHistory {
|
|
34
|
+
blocks: HistoryDisplayBlock[];
|
|
35
|
+
omittedLines: number;
|
|
36
|
+
}
|
|
37
|
+
export interface StartupHeaderInput {
|
|
38
|
+
packageVersion: string;
|
|
39
|
+
workDir: string;
|
|
40
|
+
sessionId: string;
|
|
41
|
+
modelName: string;
|
|
42
|
+
modelSource?: string;
|
|
43
|
+
memoryModelName: string;
|
|
44
|
+
memoryModelSource?: string;
|
|
45
|
+
newVersionNotice?: string;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Runs the interactive TUI for a session. Resolves with the most recent
|
|
49
|
+
* terminal event (if any) when the user exits the UI.
|
|
50
|
+
*
|
|
51
|
+
* Differentiating Enter vs Shift+Enter requires the terminal to report
|
|
52
|
+
* modifier keys with Enter, which most terminals only do when the Kitty
|
|
53
|
+
* keyboard protocol is enabled. We opt into it via `useKittyKeyboard`.
|
|
54
|
+
*/
|
|
55
|
+
export declare function runTui(input: RunTuiInput): Promise<TurnTerminalEvent | undefined>;
|
|
56
|
+
export declare function historyDisplayBlocks(history: readonly AgentMessage[]): HistoryDisplayBlock[];
|
|
57
|
+
export declare function startupHeaderLines(input: StartupHeaderInput): string[];
|
|
58
|
+
export declare function limitHistoryDisplayBlocks(blocks: readonly HistoryDisplayBlock[], maxLines: number): LimitedHistory;
|
|
59
|
+
export {};
|
|
60
|
+
//# sourceMappingURL=app.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/tui/app.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAWlE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,KAAK,EAIV,iBAAiB,EAGlB,MAAM,sBAAsB,CAAC;AAG9B,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,6DAA6D;IAC7D,OAAO,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,SAAS,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,cAAc,EAAE,MAAM,CAAC;IACvB,wEAAwE;IACxE,SAAS,EAAE,MAAM,CAAC;IAClB,+FAA+F;IAC/F,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iFAAiF;IACjF,eAAe,EAAE,MAAM,CAAC;IACxB,qDAAqD;IACrD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gFAAgF;IAChF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,6DAA6D;IAC7D,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,kFAAkF;IAClF,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,KAAK,gBAAgB,GAAG,MAAM,GAAG,OAAO,GAAG,WAAW,GAAG,MAAM,GAAG,OAAO,CAAC;AAE1E,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,gBAAgB,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,mBAAmB,EAAE,CAAC;IAC9B,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAsBD;;;;;;;GAOG;AACH,wBAAsB,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAgqBvF;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,GAAG,mBAAmB,EAAE,CAgD5F;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,EAAE,CActE;AAED,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,SAAS,mBAAmB,EAAE,EACtC,QAAQ,EAAE,MAAM,GACf,cAAc,CAyBhB"}
|