open-agent-sdk 0.1.0-alpha.0
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 +21 -0
- package/README.md +284 -0
- package/README.zh.md +285 -0
- package/dist/agent/agent-definition.d.ts +107 -0
- package/dist/agent/agent-definition.d.ts.map +1 -0
- package/dist/agent/agent-definition.js +90 -0
- package/dist/agent/agent-definition.js.map +1 -0
- package/dist/agent/react-loop.d.ts +117 -0
- package/dist/agent/react-loop.d.ts.map +1 -0
- package/dist/agent/react-loop.js +674 -0
- package/dist/agent/react-loop.js.map +1 -0
- package/dist/agent/subagent-runner.d.ts +67 -0
- package/dist/agent/subagent-runner.d.ts.map +1 -0
- package/dist/agent/subagent-runner.js +168 -0
- package/dist/agent/subagent-runner.js.map +1 -0
- package/dist/hooks/index.d.ts +8 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +9 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/inputs.d.ts +56 -0
- package/dist/hooks/inputs.d.ts.map +1 -0
- package/dist/hooks/inputs.js +150 -0
- package/dist/hooks/inputs.js.map +1 -0
- package/dist/hooks/manager.d.ts +63 -0
- package/dist/hooks/manager.d.ts.map +1 -0
- package/dist/hooks/manager.js +137 -0
- package/dist/hooks/manager.js.map +1 -0
- package/dist/hooks/types.d.ts +191 -0
- package/dist/hooks/types.d.ts.map +1 -0
- package/dist/hooks/types.js +6 -0
- package/dist/hooks/types.js.map +1 -0
- package/dist/index.d.ts +109 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +218 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/errors.d.ts +26 -0
- package/dist/mcp/errors.d.ts.map +1 -0
- package/dist/mcp/errors.js +43 -0
- package/dist/mcp/errors.js.map +1 -0
- package/dist/mcp/index.d.ts +11 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +13 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/manager.d.ts +50 -0
- package/dist/mcp/manager.d.ts.map +1 -0
- package/dist/mcp/manager.js +170 -0
- package/dist/mcp/manager.js.map +1 -0
- package/dist/mcp/server-registry.d.ts +48 -0
- package/dist/mcp/server-registry.d.ts.map +1 -0
- package/dist/mcp/server-registry.js +121 -0
- package/dist/mcp/server-registry.js.map +1 -0
- package/dist/mcp/tool-adapter.d.ts +42 -0
- package/dist/mcp/tool-adapter.d.ts.map +1 -0
- package/dist/mcp/tool-adapter.js +89 -0
- package/dist/mcp/tool-adapter.js.map +1 -0
- package/dist/mcp/types.d.ts +74 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +21 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/permissions/index.d.ts +3 -0
- package/dist/permissions/index.d.ts.map +1 -0
- package/dist/permissions/index.js +4 -0
- package/dist/permissions/index.js.map +1 -0
- package/dist/permissions/manager.d.ts +40 -0
- package/dist/permissions/manager.d.ts.map +1 -0
- package/dist/permissions/manager.js +115 -0
- package/dist/permissions/manager.js.map +1 -0
- package/dist/permissions/types.d.ts +124 -0
- package/dist/permissions/types.d.ts.map +1 -0
- package/dist/permissions/types.js +25 -0
- package/dist/permissions/types.js.map +1 -0
- package/dist/providers/anthropic.d.ts +18 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +126 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/base.d.ts +85 -0
- package/dist/providers/base.d.ts.map +1 -0
- package/dist/providers/base.js +36 -0
- package/dist/providers/base.js.map +1 -0
- package/dist/providers/google.d.ts +12 -0
- package/dist/providers/google.d.ts.map +1 -0
- package/dist/providers/google.js +123 -0
- package/dist/providers/google.js.map +1 -0
- package/dist/providers/openai.d.ts +12 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +110 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/session/factory.d.ts +156 -0
- package/dist/session/factory.d.ts.map +1 -0
- package/dist/session/factory.js +311 -0
- package/dist/session/factory.js.map +1 -0
- package/dist/session/index.d.ts +8 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +7 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/session.d.ts +144 -0
- package/dist/session/session.d.ts.map +1 -0
- package/dist/session/session.js +319 -0
- package/dist/session/session.js.map +1 -0
- package/dist/session/storage.d.ts +105 -0
- package/dist/session/storage.d.ts.map +1 -0
- package/dist/session/storage.js +148 -0
- package/dist/session/storage.js.map +1 -0
- package/dist/tools/ask-user-question.d.ts +31 -0
- package/dist/tools/ask-user-question.d.ts.map +1 -0
- package/dist/tools/ask-user-question.js +66 -0
- package/dist/tools/ask-user-question.js.map +1 -0
- package/dist/tools/bash-output.d.ts +22 -0
- package/dist/tools/bash-output.d.ts.map +1 -0
- package/dist/tools/bash-output.js +43 -0
- package/dist/tools/bash-output.js.map +1 -0
- package/dist/tools/bash.d.ts +36 -0
- package/dist/tools/bash.d.ts.map +1 -0
- package/dist/tools/bash.js +161 -0
- package/dist/tools/bash.js.map +1 -0
- package/dist/tools/edit.d.ts +24 -0
- package/dist/tools/edit.d.ts.map +1 -0
- package/dist/tools/edit.js +83 -0
- package/dist/tools/edit.js.map +1 -0
- package/dist/tools/glob.d.ts +22 -0
- package/dist/tools/glob.d.ts.map +1 -0
- package/dist/tools/glob.js +248 -0
- package/dist/tools/glob.js.map +1 -0
- package/dist/tools/grep.d.ts +39 -0
- package/dist/tools/grep.d.ts.map +1 -0
- package/dist/tools/grep.js +312 -0
- package/dist/tools/grep.js.map +1 -0
- package/dist/tools/kill-bash.d.ts +19 -0
- package/dist/tools/kill-bash.d.ts.map +1 -0
- package/dist/tools/kill-bash.js +64 -0
- package/dist/tools/kill-bash.js.map +1 -0
- package/dist/tools/read.d.ts +26 -0
- package/dist/tools/read.d.ts.map +1 -0
- package/dist/tools/read.js +87 -0
- package/dist/tools/read.js.map +1 -0
- package/dist/tools/registry.d.ts +32 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +91 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/task-create.d.ts +22 -0
- package/dist/tools/task-create.d.ts.map +1 -0
- package/dist/tools/task-create.js +42 -0
- package/dist/tools/task-create.js.map +1 -0
- package/dist/tools/task-get.d.ts +19 -0
- package/dist/tools/task-get.d.ts.map +1 -0
- package/dist/tools/task-get.js +38 -0
- package/dist/tools/task-get.js.map +1 -0
- package/dist/tools/task-list.d.ts +18 -0
- package/dist/tools/task-list.d.ts.map +1 -0
- package/dist/tools/task-list.js +27 -0
- package/dist/tools/task-list.js.map +1 -0
- package/dist/tools/task-storage.d.ts +6 -0
- package/dist/tools/task-storage.d.ts.map +1 -0
- package/dist/tools/task-storage.js +83 -0
- package/dist/tools/task-storage.js.map +1 -0
- package/dist/tools/task-update.d.ts +28 -0
- package/dist/tools/task-update.d.ts.map +1 -0
- package/dist/tools/task-update.js +118 -0
- package/dist/tools/task-update.js.map +1 -0
- package/dist/tools/task.d.ts +80 -0
- package/dist/tools/task.d.ts.map +1 -0
- package/dist/tools/task.js +99 -0
- package/dist/tools/task.js.map +1 -0
- package/dist/tools/web-fetch.d.ts +21 -0
- package/dist/tools/web-fetch.d.ts.map +1 -0
- package/dist/tools/web-fetch.js +124 -0
- package/dist/tools/web-fetch.js.map +1 -0
- package/dist/tools/web-search.d.ts +20 -0
- package/dist/tools/web-search.d.ts.map +1 -0
- package/dist/tools/web-search.js +127 -0
- package/dist/tools/web-search.js.map +1 -0
- package/dist/tools/write.d.ts +22 -0
- package/dist/tools/write.d.ts.map +1 -0
- package/dist/tools/write.js +46 -0
- package/dist/tools/write.js.map +1 -0
- package/dist/types/messages.d.ts +138 -0
- package/dist/types/messages.d.ts.map +1 -0
- package/dist/types/messages.js +88 -0
- package/dist/types/messages.js.map +1 -0
- package/dist/types/task.d.ts +29 -0
- package/dist/types/task.d.ts.map +1 -0
- package/dist/types/task.js +5 -0
- package/dist/types/task.js.map +1 -0
- package/dist/types/tools.d.ts +56 -0
- package/dist/types/tools.d.ts.map +1 -0
- package/dist/types/tools.js +25 -0
- package/dist/types/tools.js.map +1 -0
- package/dist/utils/logger.d.ts +19 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +46 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/uuid.d.ts +3 -0
- package/dist/utils/uuid.d.ts.map +1 -0
- package/dist/utils/uuid.js +5 -0
- package/dist/utils/uuid.js.map +1 -0
- package/package.json +38 -0
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session class for managing conversation state
|
|
3
|
+
* Provides a stateful interface for multi-turn interactions
|
|
4
|
+
*/
|
|
5
|
+
import type { ReActLoop } from '../agent/react-loop';
|
|
6
|
+
import type { SDKMessage } from '../types/messages';
|
|
7
|
+
import type { SessionStorage } from './storage';
|
|
8
|
+
/** Session states following a state machine pattern */
|
|
9
|
+
export declare enum SessionState {
|
|
10
|
+
IDLE = "idle",
|
|
11
|
+
READY = "ready",
|
|
12
|
+
RUNNING = "running",
|
|
13
|
+
ERROR = "error",
|
|
14
|
+
CLOSED = "closed"
|
|
15
|
+
}
|
|
16
|
+
/** Base error class for session-related errors */
|
|
17
|
+
export declare class SessionError extends Error {
|
|
18
|
+
constructor(message: string);
|
|
19
|
+
}
|
|
20
|
+
/** Error thrown when send() is called but session is not in IDLE state */
|
|
21
|
+
export declare class SessionNotIdleError extends SessionError {
|
|
22
|
+
constructor();
|
|
23
|
+
}
|
|
24
|
+
/** Error thrown when stream() is called but session is not in READY state */
|
|
25
|
+
export declare class SessionNotReadyError extends SessionError {
|
|
26
|
+
constructor();
|
|
27
|
+
}
|
|
28
|
+
/** Error thrown when stream() is called while another stream is active */
|
|
29
|
+
export declare class SessionAlreadyStreamingError extends SessionError {
|
|
30
|
+
constructor();
|
|
31
|
+
}
|
|
32
|
+
/** Error thrown when any operation is called on a closed session */
|
|
33
|
+
export declare class SessionClosedError extends SessionError {
|
|
34
|
+
constructor();
|
|
35
|
+
}
|
|
36
|
+
/** Options for creating a new Session */
|
|
37
|
+
export interface SessionOptions {
|
|
38
|
+
/** Model identifier */
|
|
39
|
+
model: string;
|
|
40
|
+
/** Provider name */
|
|
41
|
+
provider: string;
|
|
42
|
+
/** Optional session ID (generated if not provided) */
|
|
43
|
+
id?: string;
|
|
44
|
+
/** Parent session ID if this session was forked */
|
|
45
|
+
parentSessionId?: string;
|
|
46
|
+
/** Timestamp when this session was forked */
|
|
47
|
+
forkedAt?: number;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Session class for managing conversation state
|
|
51
|
+
*
|
|
52
|
+
* State machine:
|
|
53
|
+
* [idle] --send()--> [ready]
|
|
54
|
+
* ▲ │
|
|
55
|
+
* │ ▼
|
|
56
|
+
* [closed] [running] --stream结束--> [idle]
|
|
57
|
+
* │
|
|
58
|
+
* ▼
|
|
59
|
+
* [error] --> [idle]
|
|
60
|
+
*
|
|
61
|
+
* Constraints:
|
|
62
|
+
* - send() can only be called in IDLE state
|
|
63
|
+
* - stream() can only be called in READY state
|
|
64
|
+
* - Only one stream can be active at a time
|
|
65
|
+
* - close() can be called in any state
|
|
66
|
+
*/
|
|
67
|
+
export declare class Session {
|
|
68
|
+
readonly id: string;
|
|
69
|
+
readonly model: string;
|
|
70
|
+
readonly provider: string;
|
|
71
|
+
readonly createdAt: number;
|
|
72
|
+
readonly parentSessionId?: string;
|
|
73
|
+
readonly forkedAt?: number;
|
|
74
|
+
private _state;
|
|
75
|
+
private loop;
|
|
76
|
+
private messages;
|
|
77
|
+
private isStreaming;
|
|
78
|
+
private storage?;
|
|
79
|
+
private updatedAt;
|
|
80
|
+
constructor(loop: ReActLoop, options: SessionOptions, storage?: SessionStorage);
|
|
81
|
+
/**
|
|
82
|
+
* Load a session from storage by ID
|
|
83
|
+
* @param id - Session ID to load
|
|
84
|
+
* @param storage - Storage implementation to use
|
|
85
|
+
* @param loop - ReActLoop instance for the session
|
|
86
|
+
* @returns Session instance or null if not found
|
|
87
|
+
*/
|
|
88
|
+
static loadFromStorage(id: string, storage: SessionStorage, loop: ReActLoop): Promise<Session | null>;
|
|
89
|
+
/**
|
|
90
|
+
* Save session data to storage
|
|
91
|
+
* @private
|
|
92
|
+
*/
|
|
93
|
+
private saveToStorage;
|
|
94
|
+
/** Current state of the session */
|
|
95
|
+
get state(): SessionState;
|
|
96
|
+
/**
|
|
97
|
+
* Send a user message to the session
|
|
98
|
+
* Transitions state from IDLE to READY
|
|
99
|
+
*
|
|
100
|
+
* @param message - User's message
|
|
101
|
+
* @throws {SessionNotIdleError} If session is not in IDLE state
|
|
102
|
+
* @throws {SessionClosedError} If session is closed
|
|
103
|
+
*/
|
|
104
|
+
send(message: string): Promise<void>;
|
|
105
|
+
/**
|
|
106
|
+
* Stream the agent's response
|
|
107
|
+
* Transitions state from READY to RUNNING, then back to IDLE
|
|
108
|
+
*
|
|
109
|
+
* @returns AsyncGenerator yielding SDK messages
|
|
110
|
+
* @throws {SessionNotReadyError} If session is not in READY state
|
|
111
|
+
* @throws {SessionAlreadyStreamingError} If another stream is active
|
|
112
|
+
* @throws {SessionClosedError} If session is closed
|
|
113
|
+
*/
|
|
114
|
+
stream(): AsyncGenerator<SDKMessage>;
|
|
115
|
+
/**
|
|
116
|
+
* Get a readonly copy of the message history
|
|
117
|
+
*
|
|
118
|
+
* @returns Readonly array of SDK messages
|
|
119
|
+
*/
|
|
120
|
+
getMessages(): readonly SDKMessage[];
|
|
121
|
+
/**
|
|
122
|
+
* Close the session
|
|
123
|
+
* Can be called from any state
|
|
124
|
+
*/
|
|
125
|
+
close(): Promise<void>;
|
|
126
|
+
/**
|
|
127
|
+
* Support for async dispose pattern (await using)
|
|
128
|
+
*/
|
|
129
|
+
[Symbol.asyncDispose](): Promise<void>;
|
|
130
|
+
/**
|
|
131
|
+
* Compact the conversation history to reduce token usage.
|
|
132
|
+
* Generates a summary of older messages and preserves recent rounds.
|
|
133
|
+
*
|
|
134
|
+
* @returns Result of the compaction operation
|
|
135
|
+
* @throws {SessionClosedError} If session is closed
|
|
136
|
+
*/
|
|
137
|
+
compact(): Promise<{
|
|
138
|
+
success: boolean;
|
|
139
|
+
preTokens?: number;
|
|
140
|
+
preservedRounds?: number;
|
|
141
|
+
reason?: string;
|
|
142
|
+
}>;
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/session/session.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,WAAW,CAAC;AAI7D,uDAAuD;AACvD,oBAAY,YAAY;IACtB,IAAI,SAAS;IACb,KAAK,UAAU;IACf,OAAO,YAAY;IACnB,KAAK,UAAU;IACf,MAAM,WAAW;CAClB;AAED,kDAAkD;AAClD,qBAAa,YAAa,SAAQ,KAAK;gBACzB,OAAO,EAAE,MAAM;CAI5B;AAED,0EAA0E;AAC1E,qBAAa,mBAAoB,SAAQ,YAAY;;CAKpD;AAED,6EAA6E;AAC7E,qBAAa,oBAAqB,SAAQ,YAAY;;CAKrD;AAED,0EAA0E;AAC1E,qBAAa,4BAA6B,SAAQ,YAAY;;CAK7D;AAED,oEAAoE;AACpE,qBAAa,kBAAmB,SAAQ,YAAY;;CAKnD;AAED,yCAAyC;AACzC,MAAM,WAAW,cAAc;IAC7B,uBAAuB;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,oBAAoB;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,mDAAmD;IACnD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,OAAO;IAClB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAE3B,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,IAAI,CAAY;IACxB,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,OAAO,CAAC,CAAiB;IACjC,OAAO,CAAC,SAAS,CAAS;gBAEd,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,cAAc;IAe9E;;;;;;OAMG;WACU,eAAe,CAC1B,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,cAAc,EACvB,IAAI,EAAE,SAAS,GACd,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAuB1B;;;OAGG;YACW,aAAa;IAyB3B,mCAAmC;IACnC,IAAI,KAAK,IAAI,YAAY,CAExB;IAED;;;;;;;OAOG;IACG,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAsB1C;;;;;;;;OAQG;IACI,MAAM,IAAI,cAAc,CAAC,UAAU,CAAC;IAwE3C;;;;OAIG;IACH,WAAW,IAAI,SAAS,UAAU,EAAE;IAIpC;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B;;OAEG;IACG,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5C;;;;;;OAMG;IACG,OAAO,IAAI,OAAO,CAAC;QACvB,OAAO,EAAE,OAAO,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;CAgDH"}
|
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session class for managing conversation state
|
|
3
|
+
* Provides a stateful interface for multi-turn interactions
|
|
4
|
+
*/
|
|
5
|
+
import { logger } from '../utils/logger';
|
|
6
|
+
import { generateUUID } from '../utils/uuid';
|
|
7
|
+
/** Session states following a state machine pattern */
|
|
8
|
+
export var SessionState;
|
|
9
|
+
(function (SessionState) {
|
|
10
|
+
SessionState["IDLE"] = "idle";
|
|
11
|
+
SessionState["READY"] = "ready";
|
|
12
|
+
SessionState["RUNNING"] = "running";
|
|
13
|
+
SessionState["ERROR"] = "error";
|
|
14
|
+
SessionState["CLOSED"] = "closed";
|
|
15
|
+
})(SessionState || (SessionState = {}));
|
|
16
|
+
/** Base error class for session-related errors */
|
|
17
|
+
export class SessionError extends Error {
|
|
18
|
+
constructor(message) {
|
|
19
|
+
super(message);
|
|
20
|
+
this.name = 'SessionError';
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/** Error thrown when send() is called but session is not in IDLE state */
|
|
24
|
+
export class SessionNotIdleError extends SessionError {
|
|
25
|
+
constructor() {
|
|
26
|
+
super('Cannot send message: session is not in idle state');
|
|
27
|
+
this.name = 'SessionNotIdleError';
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/** Error thrown when stream() is called but session is not in READY state */
|
|
31
|
+
export class SessionNotReadyError extends SessionError {
|
|
32
|
+
constructor() {
|
|
33
|
+
super('Cannot start stream: session is not in ready state. Call send() first.');
|
|
34
|
+
this.name = 'SessionNotReadyError';
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/** Error thrown when stream() is called while another stream is active */
|
|
38
|
+
export class SessionAlreadyStreamingError extends SessionError {
|
|
39
|
+
constructor() {
|
|
40
|
+
super('Cannot start stream: another stream is already active');
|
|
41
|
+
this.name = 'SessionAlreadyStreamingError';
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/** Error thrown when any operation is called on a closed session */
|
|
45
|
+
export class SessionClosedError extends SessionError {
|
|
46
|
+
constructor() {
|
|
47
|
+
super('Session is closed');
|
|
48
|
+
this.name = 'SessionClosedError';
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Session class for managing conversation state
|
|
53
|
+
*
|
|
54
|
+
* State machine:
|
|
55
|
+
* [idle] --send()--> [ready]
|
|
56
|
+
* ▲ │
|
|
57
|
+
* │ ▼
|
|
58
|
+
* [closed] [running] --stream结束--> [idle]
|
|
59
|
+
* │
|
|
60
|
+
* ▼
|
|
61
|
+
* [error] --> [idle]
|
|
62
|
+
*
|
|
63
|
+
* Constraints:
|
|
64
|
+
* - send() can only be called in IDLE state
|
|
65
|
+
* - stream() can only be called in READY state
|
|
66
|
+
* - Only one stream can be active at a time
|
|
67
|
+
* - close() can be called in any state
|
|
68
|
+
*/
|
|
69
|
+
export class Session {
|
|
70
|
+
id;
|
|
71
|
+
model;
|
|
72
|
+
provider;
|
|
73
|
+
createdAt;
|
|
74
|
+
parentSessionId;
|
|
75
|
+
forkedAt;
|
|
76
|
+
_state;
|
|
77
|
+
loop;
|
|
78
|
+
messages;
|
|
79
|
+
isStreaming;
|
|
80
|
+
storage;
|
|
81
|
+
updatedAt;
|
|
82
|
+
constructor(loop, options, storage) {
|
|
83
|
+
this.id = options.id ?? generateUUID();
|
|
84
|
+
this.model = options.model;
|
|
85
|
+
this.provider = options.provider;
|
|
86
|
+
this.createdAt = Date.now();
|
|
87
|
+
this.updatedAt = this.createdAt;
|
|
88
|
+
this.parentSessionId = options.parentSessionId;
|
|
89
|
+
this.forkedAt = options.forkedAt;
|
|
90
|
+
this.loop = loop;
|
|
91
|
+
this.messages = [];
|
|
92
|
+
this._state = SessionState.IDLE;
|
|
93
|
+
this.isStreaming = false;
|
|
94
|
+
this.storage = storage;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Load a session from storage by ID
|
|
98
|
+
* @param id - Session ID to load
|
|
99
|
+
* @param storage - Storage implementation to use
|
|
100
|
+
* @param loop - ReActLoop instance for the session
|
|
101
|
+
* @returns Session instance or null if not found
|
|
102
|
+
*/
|
|
103
|
+
static async loadFromStorage(id, storage, loop) {
|
|
104
|
+
const data = await storage.load(id);
|
|
105
|
+
if (!data) {
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
// Create session with loaded data including fork metadata
|
|
109
|
+
const session = new Session(loop, {
|
|
110
|
+
id: data.id,
|
|
111
|
+
model: data.model,
|
|
112
|
+
provider: data.provider,
|
|
113
|
+
parentSessionId: data.parentSessionId,
|
|
114
|
+
forkedAt: data.forkedAt,
|
|
115
|
+
}, storage);
|
|
116
|
+
// Restore message history and timestamps
|
|
117
|
+
session.messages = [...data.messages];
|
|
118
|
+
session.createdAt = data.createdAt;
|
|
119
|
+
session.updatedAt = data.updatedAt;
|
|
120
|
+
return session;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Save session data to storage
|
|
124
|
+
* @private
|
|
125
|
+
*/
|
|
126
|
+
async saveToStorage() {
|
|
127
|
+
if (!this.storage) {
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
this.updatedAt = Date.now();
|
|
131
|
+
const sessionData = {
|
|
132
|
+
id: this.id,
|
|
133
|
+
model: this.model,
|
|
134
|
+
provider: this.provider,
|
|
135
|
+
createdAt: this.createdAt,
|
|
136
|
+
updatedAt: this.updatedAt,
|
|
137
|
+
messages: [...this.messages],
|
|
138
|
+
options: {
|
|
139
|
+
model: this.model,
|
|
140
|
+
provider: this.provider,
|
|
141
|
+
},
|
|
142
|
+
parentSessionId: this.parentSessionId,
|
|
143
|
+
forkedAt: this.forkedAt,
|
|
144
|
+
};
|
|
145
|
+
await this.storage.save(sessionData);
|
|
146
|
+
}
|
|
147
|
+
/** Current state of the session */
|
|
148
|
+
get state() {
|
|
149
|
+
return this._state;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Send a user message to the session
|
|
153
|
+
* Transitions state from IDLE to READY
|
|
154
|
+
*
|
|
155
|
+
* @param message - User's message
|
|
156
|
+
* @throws {SessionNotIdleError} If session is not in IDLE state
|
|
157
|
+
* @throws {SessionClosedError} If session is closed
|
|
158
|
+
*/
|
|
159
|
+
async send(message) {
|
|
160
|
+
if (this._state === SessionState.CLOSED) {
|
|
161
|
+
throw new SessionClosedError();
|
|
162
|
+
}
|
|
163
|
+
if (this._state !== SessionState.IDLE) {
|
|
164
|
+
throw new SessionNotIdleError();
|
|
165
|
+
}
|
|
166
|
+
// Create user message and add to history
|
|
167
|
+
const userMessage = {
|
|
168
|
+
type: 'user',
|
|
169
|
+
uuid: generateUUID(),
|
|
170
|
+
session_id: this.id,
|
|
171
|
+
message: { role: 'user', content: message },
|
|
172
|
+
parent_tool_use_id: null,
|
|
173
|
+
};
|
|
174
|
+
this.messages.push(userMessage);
|
|
175
|
+
this._state = SessionState.READY;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Stream the agent's response
|
|
179
|
+
* Transitions state from READY to RUNNING, then back to IDLE
|
|
180
|
+
*
|
|
181
|
+
* @returns AsyncGenerator yielding SDK messages
|
|
182
|
+
* @throws {SessionNotReadyError} If session is not in READY state
|
|
183
|
+
* @throws {SessionAlreadyStreamingError} If another stream is active
|
|
184
|
+
* @throws {SessionClosedError} If session is closed
|
|
185
|
+
*/
|
|
186
|
+
async *stream() {
|
|
187
|
+
if (this._state === SessionState.CLOSED) {
|
|
188
|
+
throw new SessionClosedError();
|
|
189
|
+
}
|
|
190
|
+
if (this.isStreaming) {
|
|
191
|
+
throw new SessionAlreadyStreamingError();
|
|
192
|
+
}
|
|
193
|
+
if (this._state !== SessionState.READY) {
|
|
194
|
+
throw new SessionNotReadyError();
|
|
195
|
+
}
|
|
196
|
+
this._state = SessionState.RUNNING;
|
|
197
|
+
this.isStreaming = true;
|
|
198
|
+
try {
|
|
199
|
+
// Get the last user message
|
|
200
|
+
const lastUserMessage = this.messages[this.messages.length - 1];
|
|
201
|
+
if (lastUserMessage.type !== 'user') {
|
|
202
|
+
throw new SessionError('Expected last message to be from user');
|
|
203
|
+
}
|
|
204
|
+
const userPrompt = lastUserMessage.message.content;
|
|
205
|
+
// Pass history messages (excluding the current user message which will be added by runStream)
|
|
206
|
+
const historyMessages = this.messages.slice(0, -1);
|
|
207
|
+
logger.debug('[Session] historyMessages count:', historyMessages.length);
|
|
208
|
+
logger.debug('[Session] historyMessages:', JSON.stringify(historyMessages, null, 2));
|
|
209
|
+
// Run the ReAct loop and yield messages
|
|
210
|
+
for await (const event of this.loop.runStream(userPrompt, historyMessages)) {
|
|
211
|
+
switch (event.type) {
|
|
212
|
+
case 'assistant':
|
|
213
|
+
this.messages.push(event.message);
|
|
214
|
+
yield event.message;
|
|
215
|
+
break;
|
|
216
|
+
case 'tool_result':
|
|
217
|
+
this.messages.push(event.message);
|
|
218
|
+
yield event.message;
|
|
219
|
+
break;
|
|
220
|
+
case 'usage':
|
|
221
|
+
// Usage stats are tracked but not yielded as SDK messages
|
|
222
|
+
break;
|
|
223
|
+
case 'done':
|
|
224
|
+
// Stream completed
|
|
225
|
+
break;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
this._state = SessionState.IDLE;
|
|
229
|
+
}
|
|
230
|
+
catch (error) {
|
|
231
|
+
this._state = SessionState.ERROR;
|
|
232
|
+
throw error;
|
|
233
|
+
}
|
|
234
|
+
finally {
|
|
235
|
+
this.isStreaming = false;
|
|
236
|
+
// If we were in ERROR state, transition back to IDLE for recovery
|
|
237
|
+
if (this._state === SessionState.ERROR) {
|
|
238
|
+
this._state = SessionState.IDLE;
|
|
239
|
+
}
|
|
240
|
+
// Save to storage after stream completes
|
|
241
|
+
if (this.storage) {
|
|
242
|
+
await this.saveToStorage();
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Get a readonly copy of the message history
|
|
248
|
+
*
|
|
249
|
+
* @returns Readonly array of SDK messages
|
|
250
|
+
*/
|
|
251
|
+
getMessages() {
|
|
252
|
+
return Object.freeze([...this.messages]);
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Close the session
|
|
256
|
+
* Can be called from any state
|
|
257
|
+
*/
|
|
258
|
+
async close() {
|
|
259
|
+
this._state = SessionState.CLOSED;
|
|
260
|
+
this.isStreaming = false;
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Support for async dispose pattern (await using)
|
|
264
|
+
*/
|
|
265
|
+
async [Symbol.asyncDispose]() {
|
|
266
|
+
await this.close();
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Compact the conversation history to reduce token usage.
|
|
270
|
+
* Generates a summary of older messages and preserves recent rounds.
|
|
271
|
+
*
|
|
272
|
+
* @returns Result of the compaction operation
|
|
273
|
+
* @throws {SessionClosedError} If session is closed
|
|
274
|
+
*/
|
|
275
|
+
async compact() {
|
|
276
|
+
if (this._state === SessionState.CLOSED) {
|
|
277
|
+
throw new SessionClosedError();
|
|
278
|
+
}
|
|
279
|
+
// Estimate token count (rough approximation)
|
|
280
|
+
const estimatedTokens = this.messages.reduce((total, msg) => {
|
|
281
|
+
if ('message' in msg && msg.message) {
|
|
282
|
+
if ('content' in msg.message) {
|
|
283
|
+
if (typeof msg.message.content === 'string') {
|
|
284
|
+
return total + msg.message.content.length / 4; // Rough estimate: 4 chars per token
|
|
285
|
+
}
|
|
286
|
+
else if (Array.isArray(msg.message.content)) {
|
|
287
|
+
return total + msg.message.content.reduce((sum, c) => {
|
|
288
|
+
if (c.type === 'text')
|
|
289
|
+
return sum + c.text.length / 4;
|
|
290
|
+
return sum + 50; // Tool calls estimate
|
|
291
|
+
}, 0);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
return total + 50; // Default estimate for system/tool messages
|
|
296
|
+
}, 0);
|
|
297
|
+
const preTokens = Math.floor(estimatedTokens);
|
|
298
|
+
// Call the loop's compact method
|
|
299
|
+
const result = await this.loop.compact(this.messages, 'manual', preTokens);
|
|
300
|
+
if (!result.summaryGenerated) {
|
|
301
|
+
return {
|
|
302
|
+
success: false,
|
|
303
|
+
reason: 'nothing_to_compact',
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
// Update session messages with compacted version
|
|
307
|
+
this.messages = result.messages;
|
|
308
|
+
// Save to storage
|
|
309
|
+
if (this.storage) {
|
|
310
|
+
await this.saveToStorage();
|
|
311
|
+
}
|
|
312
|
+
return {
|
|
313
|
+
success: true,
|
|
314
|
+
preTokens: result.preTokens,
|
|
315
|
+
preservedRounds: result.preservedRounds,
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
//# 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,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session storage interfaces and implementations
|
|
3
|
+
* Supports in-memory (default) and file-based persistence
|
|
4
|
+
*/
|
|
5
|
+
import type { SDKMessage } from '../types/messages';
|
|
6
|
+
import type { PermissionMode } from '../permissions/types';
|
|
7
|
+
import type { HooksConfig } from '../hooks/types';
|
|
8
|
+
/** Session data structure for storage */
|
|
9
|
+
export interface SessionData {
|
|
10
|
+
/** Unique session identifier */
|
|
11
|
+
id: string;
|
|
12
|
+
/** Model identifier (e.g., 'gpt-4o') */
|
|
13
|
+
model: string;
|
|
14
|
+
/** Provider identifier (e.g., 'openai') */
|
|
15
|
+
provider: string;
|
|
16
|
+
/** Session creation timestamp */
|
|
17
|
+
createdAt: number;
|
|
18
|
+
/** Last update timestamp */
|
|
19
|
+
updatedAt: number;
|
|
20
|
+
/** Message history */
|
|
21
|
+
messages: SDKMessage[];
|
|
22
|
+
/** Session options (excluding storage to avoid circular reference) */
|
|
23
|
+
options: Omit<SessionOptions, 'storage'>;
|
|
24
|
+
/** Parent session ID if this session was forked */
|
|
25
|
+
parentSessionId?: string;
|
|
26
|
+
/** Timestamp when this session was forked */
|
|
27
|
+
forkedAt?: number;
|
|
28
|
+
}
|
|
29
|
+
/** Session configuration options */
|
|
30
|
+
export interface SessionOptions {
|
|
31
|
+
/** Model identifier (required) */
|
|
32
|
+
model: string;
|
|
33
|
+
/** Provider identifier (optional, defaults to auto-detect) */
|
|
34
|
+
provider?: string;
|
|
35
|
+
/** API key (optional, can use env var) */
|
|
36
|
+
apiKey?: string;
|
|
37
|
+
/** Maximum number of turns (optional) */
|
|
38
|
+
maxTurns?: number;
|
|
39
|
+
/** Allowed tool names (optional, defaults to all) */
|
|
40
|
+
allowedTools?: string[];
|
|
41
|
+
/** System prompt (optional) */
|
|
42
|
+
systemPrompt?: string;
|
|
43
|
+
/** Working directory (optional) */
|
|
44
|
+
cwd?: string;
|
|
45
|
+
/** Environment variables (optional) */
|
|
46
|
+
env?: Record<string, string>;
|
|
47
|
+
/** AbortController for cancellation (optional) */
|
|
48
|
+
abortController?: AbortController;
|
|
49
|
+
/** Storage implementation (optional, defaults to InMemoryStorage) */
|
|
50
|
+
storage?: SessionStorage;
|
|
51
|
+
/** Permission mode for the session (optional, default: 'default') */
|
|
52
|
+
permissionMode?: PermissionMode;
|
|
53
|
+
/** Required to be true when using bypassPermissions mode (optional) */
|
|
54
|
+
allowDangerouslySkipPermissions?: boolean;
|
|
55
|
+
/** MCP servers configuration (optional) */
|
|
56
|
+
mcpServers?: Record<string, unknown>;
|
|
57
|
+
/** Hooks configuration (optional) */
|
|
58
|
+
hooks?: HooksConfig;
|
|
59
|
+
}
|
|
60
|
+
/** Storage interface for session persistence */
|
|
61
|
+
export interface SessionStorage {
|
|
62
|
+
/** Save session data */
|
|
63
|
+
save(data: SessionData): Promise<void>;
|
|
64
|
+
/** Load session by ID, returns null if not found */
|
|
65
|
+
load(id: string): Promise<SessionData | null>;
|
|
66
|
+
/** Delete session by ID */
|
|
67
|
+
delete(id: string): Promise<void>;
|
|
68
|
+
/** List all session IDs */
|
|
69
|
+
list(): Promise<string[]>;
|
|
70
|
+
/** Check if session exists */
|
|
71
|
+
exists(id: string): Promise<boolean>;
|
|
72
|
+
}
|
|
73
|
+
/** File storage options */
|
|
74
|
+
export interface FileStorageOptions {
|
|
75
|
+
/** Directory path for session files (default: ~/.open-agent/sessions) */
|
|
76
|
+
directory?: string;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* In-memory storage implementation (default)
|
|
80
|
+
* Data is lost when process exits
|
|
81
|
+
*/
|
|
82
|
+
export declare class InMemoryStorage implements SessionStorage {
|
|
83
|
+
private sessions;
|
|
84
|
+
save(data: SessionData): Promise<void>;
|
|
85
|
+
load(id: string): Promise<SessionData | null>;
|
|
86
|
+
delete(id: string): Promise<void>;
|
|
87
|
+
list(): Promise<string[]>;
|
|
88
|
+
exists(id: string): Promise<boolean>;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* File-based storage implementation
|
|
92
|
+
* Persists sessions to JSON files
|
|
93
|
+
*/
|
|
94
|
+
export declare class FileStorage implements SessionStorage {
|
|
95
|
+
private directory;
|
|
96
|
+
constructor(options?: FileStorageOptions);
|
|
97
|
+
private getFilePath;
|
|
98
|
+
save(data: SessionData): Promise<void>;
|
|
99
|
+
load(id: string): Promise<SessionData | null>;
|
|
100
|
+
delete(id: string): Promise<void>;
|
|
101
|
+
list(): Promise<string[]>;
|
|
102
|
+
exists(id: string): Promise<boolean>;
|
|
103
|
+
private ensureDir;
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/session/storage.ts"],"names":[],"mappings":"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"}
|