@simulacra-ai/core 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 +232 -0
- package/dist/checkpoints/default-summarization-strategy.d.ts +13 -0
- package/dist/checkpoints/default-summarization-strategy.d.ts.map +1 -0
- package/dist/checkpoints/default-summarization-strategy.js +63 -0
- package/dist/checkpoints/default-summarization-strategy.js.map +1 -0
- package/dist/checkpoints/index.d.ts +3 -0
- package/dist/checkpoints/index.d.ts.map +1 -0
- package/dist/checkpoints/index.js +3 -0
- package/dist/checkpoints/index.js.map +1 -0
- package/dist/checkpoints/types.d.ts +32 -0
- package/dist/checkpoints/types.d.ts.map +1 -0
- package/dist/checkpoints/types.js +2 -0
- package/dist/checkpoints/types.js.map +1 -0
- package/dist/context-transformers/checkpoint-context-transformer.d.ts +13 -0
- package/dist/context-transformers/checkpoint-context-transformer.d.ts.map +1 -0
- package/dist/context-transformers/checkpoint-context-transformer.js +32 -0
- package/dist/context-transformers/checkpoint-context-transformer.js.map +1 -0
- package/dist/context-transformers/composite-context-transformer.d.ts +31 -0
- package/dist/context-transformers/composite-context-transformer.d.ts.map +1 -0
- package/dist/context-transformers/composite-context-transformer.js +41 -0
- package/dist/context-transformers/composite-context-transformer.js.map +1 -0
- package/dist/context-transformers/index.d.ts +6 -0
- package/dist/context-transformers/index.d.ts.map +1 -0
- package/dist/context-transformers/index.js +6 -0
- package/dist/context-transformers/index.js.map +1 -0
- package/dist/context-transformers/noop-context-transformer.d.ts +24 -0
- package/dist/context-transformers/noop-context-transformer.d.ts.map +1 -0
- package/dist/context-transformers/noop-context-transformer.js +26 -0
- package/dist/context-transformers/noop-context-transformer.js.map +1 -0
- package/dist/context-transformers/tool-context-transformer.d.ts +26 -0
- package/dist/context-transformers/tool-context-transformer.d.ts.map +1 -0
- package/dist/context-transformers/tool-context-transformer.js +52 -0
- package/dist/context-transformers/tool-context-transformer.js.map +1 -0
- package/dist/context-transformers/types.d.ts +65 -0
- package/dist/context-transformers/types.d.ts.map +1 -0
- package/dist/context-transformers/types.js +2 -0
- package/dist/context-transformers/types.js.map +1 -0
- package/dist/conversations/conversation.d.ts +146 -0
- package/dist/conversations/conversation.d.ts.map +1 -0
- package/dist/conversations/conversation.js +642 -0
- package/dist/conversations/conversation.js.map +1 -0
- package/dist/conversations/index.d.ts +5 -0
- package/dist/conversations/index.d.ts.map +1 -0
- package/dist/conversations/index.js +5 -0
- package/dist/conversations/index.js.map +1 -0
- package/dist/conversations/stream-listener.d.ts +37 -0
- package/dist/conversations/stream-listener.d.ts.map +1 -0
- package/dist/conversations/stream-listener.js +68 -0
- package/dist/conversations/stream-listener.js.map +1 -0
- package/dist/conversations/token-tracker.d.ts +59 -0
- package/dist/conversations/token-tracker.d.ts.map +1 -0
- package/dist/conversations/token-tracker.js +98 -0
- package/dist/conversations/token-tracker.js.map +1 -0
- package/dist/conversations/types.d.ts +346 -0
- package/dist/conversations/types.d.ts.map +1 -0
- package/dist/conversations/types.js +2 -0
- package/dist/conversations/types.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/policies/composite-policy.d.ts +29 -0
- package/dist/policies/composite-policy.d.ts.map +1 -0
- package/dist/policies/composite-policy.js +77 -0
- package/dist/policies/composite-policy.js.map +1 -0
- package/dist/policies/default-policy.d.ts +7 -0
- package/dist/policies/default-policy.d.ts.map +1 -0
- package/dist/policies/default-policy.js +14 -0
- package/dist/policies/default-policy.js.map +1 -0
- package/dist/policies/index.d.ts +8 -0
- package/dist/policies/index.d.ts.map +1 -0
- package/dist/policies/index.js +8 -0
- package/dist/policies/index.js.map +1 -0
- package/dist/policies/noop-policy.d.ts +21 -0
- package/dist/policies/noop-policy.d.ts.map +1 -0
- package/dist/policies/noop-policy.js +36 -0
- package/dist/policies/noop-policy.js.map +1 -0
- package/dist/policies/rate-limit-policy.d.ts +44 -0
- package/dist/policies/rate-limit-policy.d.ts.map +1 -0
- package/dist/policies/rate-limit-policy.js +98 -0
- package/dist/policies/rate-limit-policy.js.map +1 -0
- package/dist/policies/retry-policy.d.ts +42 -0
- package/dist/policies/retry-policy.d.ts.map +1 -0
- package/dist/policies/retry-policy.js +114 -0
- package/dist/policies/retry-policy.js.map +1 -0
- package/dist/policies/token-limit-policy.d.ts +76 -0
- package/dist/policies/token-limit-policy.d.ts.map +1 -0
- package/dist/policies/token-limit-policy.js +134 -0
- package/dist/policies/token-limit-policy.js.map +1 -0
- package/dist/policies/types.d.ts +49 -0
- package/dist/policies/types.d.ts.map +1 -0
- package/dist/policies/types.js +9 -0
- package/dist/policies/types.js.map +1 -0
- package/dist/tools/index.d.ts +2 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +2 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/types.d.ts +180 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +2 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/utils/async.d.ts +125 -0
- package/dist/utils/async.d.ts.map +1 -0
- package/dist/utils/async.js +217 -0
- package/dist/utils/async.js.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/object.d.ts +80 -0
- package/dist/utils/object.d.ts.map +1 -0
- package/dist/utils/object.js +189 -0
- package/dist/utils/object.js.map +1 -0
- package/dist/utils/types.d.ts +17 -0
- package/dist/utils/types.d.ts.map +1 -0
- package/dist/utils/types.js +2 -0
- package/dist/utils/types.js.map +1 -0
- package/dist/workflows/index.d.ts +4 -0
- package/dist/workflows/index.d.ts.map +1 -0
- package/dist/workflows/index.js +4 -0
- package/dist/workflows/index.js.map +1 -0
- package/dist/workflows/types.d.ts +70 -0
- package/dist/workflows/types.d.ts.map +1 -0
- package/dist/workflows/types.js +2 -0
- package/dist/workflows/types.js.map +1 -0
- package/dist/workflows/workflow-manager.d.ts +74 -0
- package/dist/workflows/workflow-manager.d.ts.map +1 -0
- package/dist/workflows/workflow-manager.js +165 -0
- package/dist/workflows/workflow-manager.js.map +1 -0
- package/dist/workflows/workflow.d.ts +116 -0
- package/dist/workflows/workflow.d.ts.map +1 -0
- package/dist/workflows/workflow.js +351 -0
- package/dist/workflows/workflow.js.map +1 -0
- package/package.json +20 -0
|
@@ -0,0 +1,642 @@
|
|
|
1
|
+
var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
|
|
2
|
+
if (value !== null && value !== void 0) {
|
|
3
|
+
if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
|
|
4
|
+
var dispose, inner;
|
|
5
|
+
if (async) {
|
|
6
|
+
if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
|
|
7
|
+
dispose = value[Symbol.asyncDispose];
|
|
8
|
+
}
|
|
9
|
+
if (dispose === void 0) {
|
|
10
|
+
if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
|
|
11
|
+
dispose = value[Symbol.dispose];
|
|
12
|
+
if (async) inner = dispose;
|
|
13
|
+
}
|
|
14
|
+
if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
|
|
15
|
+
if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
|
|
16
|
+
env.stack.push({ value: value, dispose: dispose, async: async });
|
|
17
|
+
}
|
|
18
|
+
else if (async) {
|
|
19
|
+
env.stack.push({ async: true });
|
|
20
|
+
}
|
|
21
|
+
return value;
|
|
22
|
+
};
|
|
23
|
+
var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
|
|
24
|
+
return function (env) {
|
|
25
|
+
function fail(e) {
|
|
26
|
+
env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
|
|
27
|
+
env.hasError = true;
|
|
28
|
+
}
|
|
29
|
+
var r, s = 0;
|
|
30
|
+
function next() {
|
|
31
|
+
while (r = env.stack.pop()) {
|
|
32
|
+
try {
|
|
33
|
+
if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
|
|
34
|
+
if (r.dispose) {
|
|
35
|
+
var result = r.dispose.call(r.value);
|
|
36
|
+
if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
|
|
37
|
+
}
|
|
38
|
+
else s |= 1;
|
|
39
|
+
}
|
|
40
|
+
catch (e) {
|
|
41
|
+
fail(e);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
|
|
45
|
+
if (env.hasError) throw env.error;
|
|
46
|
+
}
|
|
47
|
+
return next();
|
|
48
|
+
};
|
|
49
|
+
})(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
|
50
|
+
var e = new Error(message);
|
|
51
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
52
|
+
});
|
|
53
|
+
import crypto from "node:crypto";
|
|
54
|
+
import EventEmitter from "node:events";
|
|
55
|
+
import { setImmediate } from "node:timers/promises";
|
|
56
|
+
import { DefaultSummarizationStrategy } from "../checkpoints/default-summarization-strategy.js";
|
|
57
|
+
import { CheckpointContextTransformer } from "../context-transformers/checkpoint-context-transformer.js";
|
|
58
|
+
import { CompositeContextTransformer } from "../context-transformers/composite-context-transformer.js";
|
|
59
|
+
import { ToolContextTransformer } from "../context-transformers/tool-context-transformer.js";
|
|
60
|
+
import { getDefaultPolicy } from "../policies/default-policy.js";
|
|
61
|
+
import { CancellationTokenSource } from "../utils/async.js";
|
|
62
|
+
import { StreamListener } from "./stream-listener.js";
|
|
63
|
+
/**
|
|
64
|
+
* Manages a conversation with a language model.
|
|
65
|
+
*
|
|
66
|
+
* The Conversation class handles message exchange, tool execution coordination,
|
|
67
|
+
* event emission, and state management for interactions with language models.
|
|
68
|
+
*/
|
|
69
|
+
export class Conversation {
|
|
70
|
+
#event_emitter;
|
|
71
|
+
#provider;
|
|
72
|
+
#policy;
|
|
73
|
+
#context_transformer;
|
|
74
|
+
#summarization_strategy;
|
|
75
|
+
#id = crypto.randomUUID();
|
|
76
|
+
#state = "idle";
|
|
77
|
+
#system;
|
|
78
|
+
#toolkit = [];
|
|
79
|
+
#messages = [];
|
|
80
|
+
#checkpoint_state;
|
|
81
|
+
#is_checkpoint = false;
|
|
82
|
+
/**
|
|
83
|
+
* Creates a new conversation instance.
|
|
84
|
+
*
|
|
85
|
+
* @param provider - The model provider for executing requests.
|
|
86
|
+
* @param policy - The policy for controlling request execution (default: retry + rate limiting).
|
|
87
|
+
* @param context_transformer - Transformer for modifying messages before sending (default: noop).
|
|
88
|
+
* @param summarization_strategy - Strategy for generating checkpoint summaries (default: DefaultSummarizationStrategy).
|
|
89
|
+
*/
|
|
90
|
+
constructor(provider, policy = getDefaultPolicy(), context_transformer = new CompositeContextTransformer([
|
|
91
|
+
new ToolContextTransformer(),
|
|
92
|
+
new CheckpointContextTransformer(),
|
|
93
|
+
]), summarization_strategy = new DefaultSummarizationStrategy()) {
|
|
94
|
+
this.#event_emitter = new EventEmitter();
|
|
95
|
+
this.#event_emitter.setMaxListeners(0);
|
|
96
|
+
this.#provider = provider;
|
|
97
|
+
this.#policy = policy;
|
|
98
|
+
this.#context_transformer = context_transformer;
|
|
99
|
+
this.#summarization_strategy = summarization_strategy;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* The unique identifier for this conversation.
|
|
103
|
+
*/
|
|
104
|
+
get id() {
|
|
105
|
+
return this.#id;
|
|
106
|
+
}
|
|
107
|
+
set id(value) {
|
|
108
|
+
this.#id = value;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* The current state of the conversation.
|
|
112
|
+
*/
|
|
113
|
+
get state() {
|
|
114
|
+
return this.#state;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* The system prompt for this conversation.
|
|
118
|
+
*/
|
|
119
|
+
get system() {
|
|
120
|
+
return this.#system;
|
|
121
|
+
}
|
|
122
|
+
set system(value) {
|
|
123
|
+
this.#system = value;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* The collection of tools available to the model in this conversation.
|
|
127
|
+
*/
|
|
128
|
+
get toolkit() {
|
|
129
|
+
return Object.freeze([...this.#toolkit]);
|
|
130
|
+
}
|
|
131
|
+
set toolkit(value) {
|
|
132
|
+
if (this.#state === "disposed") {
|
|
133
|
+
throw new Error("invalid state");
|
|
134
|
+
}
|
|
135
|
+
this.#toolkit = [...value];
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* The conversation message history.
|
|
139
|
+
*/
|
|
140
|
+
get messages() {
|
|
141
|
+
return Object.freeze([...this.#messages.map((m) => Object.freeze({ ...m }))]);
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* The most recent checkpoint state, if any.
|
|
145
|
+
*/
|
|
146
|
+
get checkpoint_state() {
|
|
147
|
+
return this.#checkpoint_state ? Object.freeze({ ...this.#checkpoint_state }) : undefined;
|
|
148
|
+
}
|
|
149
|
+
set checkpoint_state(value) {
|
|
150
|
+
this.#checkpoint_state = value;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Whether this conversation is a checkpoint session.
|
|
154
|
+
*/
|
|
155
|
+
get is_checkpoint() {
|
|
156
|
+
return this.#is_checkpoint;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Disposes the conversation and releases all resources.
|
|
160
|
+
*
|
|
161
|
+
* This method is called automatically when using the `using` keyword.
|
|
162
|
+
* Emits a dispose event and transitions to the disposed state.
|
|
163
|
+
*/
|
|
164
|
+
[Symbol.dispose]() {
|
|
165
|
+
if (this.state === "disposed") {
|
|
166
|
+
throw new Error("invalid state");
|
|
167
|
+
}
|
|
168
|
+
const previous = this.#state;
|
|
169
|
+
this.#event_emitter.emit("dispose", this);
|
|
170
|
+
this.#state = "disposed";
|
|
171
|
+
this.#event_emitter.emit("state_change", { current: this.#state, previous }, this);
|
|
172
|
+
this.#event_emitter.removeAllListeners();
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Sends a text prompt to the model.
|
|
176
|
+
*
|
|
177
|
+
* @param prompt - The text prompt to send.
|
|
178
|
+
* @returns A promise that resolves with the request data, or undefined if cancelled.
|
|
179
|
+
*/
|
|
180
|
+
async prompt(prompt) {
|
|
181
|
+
return await this.send_message([
|
|
182
|
+
{
|
|
183
|
+
timestamp: Date.now(),
|
|
184
|
+
type: "text",
|
|
185
|
+
text: prompt,
|
|
186
|
+
},
|
|
187
|
+
]);
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Sends a message with custom content to the model.
|
|
191
|
+
*
|
|
192
|
+
* @param contents - The content blocks to include in the message.
|
|
193
|
+
* @returns A promise that resolves with the request data, or undefined if cancelled.
|
|
194
|
+
*/
|
|
195
|
+
async send_message(contents) {
|
|
196
|
+
if (this.state !== "idle") {
|
|
197
|
+
throw new Error("invalid state");
|
|
198
|
+
}
|
|
199
|
+
let prompt_message = {
|
|
200
|
+
timestamp: Date.now(),
|
|
201
|
+
role: "user",
|
|
202
|
+
content: contents
|
|
203
|
+
.map((c) => ({
|
|
204
|
+
timestamp: Date.now(),
|
|
205
|
+
...c,
|
|
206
|
+
}))
|
|
207
|
+
.map((c) => ({
|
|
208
|
+
...c,
|
|
209
|
+
id: c.id ?? crypto.createHash("sha1").update(JSON.stringify(c)).digest("hex"),
|
|
210
|
+
})),
|
|
211
|
+
};
|
|
212
|
+
prompt_message = {
|
|
213
|
+
...prompt_message,
|
|
214
|
+
id: prompt_message.id ??
|
|
215
|
+
crypto.createHash("sha1").update(JSON.stringify(prompt_message)).digest("hex"),
|
|
216
|
+
};
|
|
217
|
+
let request_id;
|
|
218
|
+
let result;
|
|
219
|
+
let policy_result;
|
|
220
|
+
try {
|
|
221
|
+
const env_1 = { stack: [], error: void 0, hasError: false };
|
|
222
|
+
try {
|
|
223
|
+
const stream_listener = new StreamListener(async ({ event, payload }) => {
|
|
224
|
+
switch (event) {
|
|
225
|
+
case "start_message": {
|
|
226
|
+
const [{ message, usage }] = payload;
|
|
227
|
+
this.#set_state("streaming_response");
|
|
228
|
+
this.#event_emitter.emit("message_start", { request_id, usage, message }, this);
|
|
229
|
+
break;
|
|
230
|
+
}
|
|
231
|
+
case "update_message": {
|
|
232
|
+
const [{ message, usage }] = payload;
|
|
233
|
+
this.#event_emitter.emit("message_update", { request_id, usage, message }, this);
|
|
234
|
+
break;
|
|
235
|
+
}
|
|
236
|
+
case "complete_message": {
|
|
237
|
+
const [data] = payload;
|
|
238
|
+
let message = identify_message(data.message);
|
|
239
|
+
for (const t of this.#provider.context_transformers ?? []) {
|
|
240
|
+
if (t.transform_completion) {
|
|
241
|
+
message = await t.transform_completion(message);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
message = await this.#context_transformer.transform_completion(message);
|
|
245
|
+
const has_tool_calls = message.content.some((c) => c.type === "tool");
|
|
246
|
+
const stop_reason = has_tool_calls ? "tool_use" : data.stop_reason;
|
|
247
|
+
this.#set_state("idle");
|
|
248
|
+
this.#messages.push(prompt_message, message);
|
|
249
|
+
this.#event_emitter.emit("message_complete", { request_id, ...data, message, stop_reason }, this);
|
|
250
|
+
break;
|
|
251
|
+
}
|
|
252
|
+
case "start_content": {
|
|
253
|
+
const [data] = payload;
|
|
254
|
+
this.#event_emitter.emit("content_start", { request_id, ...data }, this);
|
|
255
|
+
break;
|
|
256
|
+
}
|
|
257
|
+
case "update_content": {
|
|
258
|
+
const [data] = payload;
|
|
259
|
+
this.#event_emitter.emit("content_update", { request_id, ...data }, this);
|
|
260
|
+
break;
|
|
261
|
+
}
|
|
262
|
+
case "complete_content": {
|
|
263
|
+
const [data] = payload;
|
|
264
|
+
this.#event_emitter.emit("content_complete", { request_id, ...data }, this);
|
|
265
|
+
break;
|
|
266
|
+
}
|
|
267
|
+
case "error": {
|
|
268
|
+
stream_listener[Symbol.dispose]();
|
|
269
|
+
const [error] = payload;
|
|
270
|
+
if (this.state !== "disposed") {
|
|
271
|
+
this.#set_state("idle");
|
|
272
|
+
}
|
|
273
|
+
this.#event_emitter.emit("request_error", { request_id, message: prompt_message, error }, {}, this);
|
|
274
|
+
break;
|
|
275
|
+
}
|
|
276
|
+
case "before_request": {
|
|
277
|
+
const [data] = payload;
|
|
278
|
+
this.#event_emitter.emit("before_request", { data }, this);
|
|
279
|
+
break;
|
|
280
|
+
}
|
|
281
|
+
case "request_raw": {
|
|
282
|
+
const [data] = payload;
|
|
283
|
+
this.#event_emitter.emit("raw_request", { request_id, data }, this);
|
|
284
|
+
break;
|
|
285
|
+
}
|
|
286
|
+
case "response_raw": {
|
|
287
|
+
const [data] = payload;
|
|
288
|
+
this.#event_emitter.emit("raw_response", { request_id, data }, this);
|
|
289
|
+
break;
|
|
290
|
+
}
|
|
291
|
+
case "stream_raw": {
|
|
292
|
+
const [data] = payload;
|
|
293
|
+
this.#event_emitter.emit("raw_stream", { request_id, data }, this);
|
|
294
|
+
break;
|
|
295
|
+
}
|
|
296
|
+
case "cancel": {
|
|
297
|
+
stream_listener[Symbol.dispose]();
|
|
298
|
+
if (this.state !== "disposed") {
|
|
299
|
+
this.#set_state("idle");
|
|
300
|
+
}
|
|
301
|
+
break;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
});
|
|
305
|
+
const source = __addDisposableResource(env_1, new CancellationTokenSource(), false);
|
|
306
|
+
const on_state_change = ({ current }) => {
|
|
307
|
+
if (current === "stopping") {
|
|
308
|
+
if (!source.is_cancelled) {
|
|
309
|
+
source.cancel();
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
if (current === "idle" || current === "disposed") {
|
|
313
|
+
this.off("state_change", on_state_change);
|
|
314
|
+
}
|
|
315
|
+
};
|
|
316
|
+
this.on("state_change", on_state_change);
|
|
317
|
+
const transformed_messages = await this.#get_prompt_context([
|
|
318
|
+
...this.#messages,
|
|
319
|
+
prompt_message,
|
|
320
|
+
]);
|
|
321
|
+
const tool_definitions = this.#toolkit.map((t) => t.get_definition());
|
|
322
|
+
// Policies are intentionally scoped to the initial request and connection.
|
|
323
|
+
// Mid-stream errors are not handled by the policy; they surface as events
|
|
324
|
+
// through stream_listener.
|
|
325
|
+
const result_promise = this.#policy.execute(source.token, async () => {
|
|
326
|
+
await this.#provider.execute_request({
|
|
327
|
+
messages: transformed_messages,
|
|
328
|
+
tools: tool_definitions,
|
|
329
|
+
system: this.#system,
|
|
330
|
+
}, stream_listener.create_receiver(), source.token);
|
|
331
|
+
return { message: prompt_message };
|
|
332
|
+
});
|
|
333
|
+
this.#event_emitter.emit("prompt_send", { message: prompt_message }, this);
|
|
334
|
+
this.#set_state("awaiting_response");
|
|
335
|
+
policy_result = await Promise.race([
|
|
336
|
+
result_promise,
|
|
337
|
+
new Promise((resolve) => {
|
|
338
|
+
const on_state_change = ({ current }) => {
|
|
339
|
+
if (current === "stopping") {
|
|
340
|
+
stream_listener[Symbol.dispose]();
|
|
341
|
+
resolve(undefined);
|
|
342
|
+
}
|
|
343
|
+
else if (current === "disposed") {
|
|
344
|
+
stream_listener[Symbol.dispose]();
|
|
345
|
+
resolve(undefined);
|
|
346
|
+
}
|
|
347
|
+
else if (current === "streaming_response") {
|
|
348
|
+
this.off("state_change", on_state_change);
|
|
349
|
+
}
|
|
350
|
+
};
|
|
351
|
+
this.on("state_change", on_state_change);
|
|
352
|
+
}),
|
|
353
|
+
]);
|
|
354
|
+
request_id = request_id ?? crypto.randomUUID();
|
|
355
|
+
result = {
|
|
356
|
+
message: prompt_message,
|
|
357
|
+
request_id,
|
|
358
|
+
};
|
|
359
|
+
if (policy_result) {
|
|
360
|
+
if (!policy_result.result) {
|
|
361
|
+
throw policy_result.error;
|
|
362
|
+
}
|
|
363
|
+
result = { ...result, ...policy_result.value };
|
|
364
|
+
this.#event_emitter.emit("request_success", result, policy_result.metadata ?? {}, this);
|
|
365
|
+
}
|
|
366
|
+
else {
|
|
367
|
+
if (this.#state !== "disposed") {
|
|
368
|
+
this.#set_state("idle");
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
catch (e_1) {
|
|
373
|
+
env_1.error = e_1;
|
|
374
|
+
env_1.hasError = true;
|
|
375
|
+
}
|
|
376
|
+
finally {
|
|
377
|
+
__disposeResources(env_1);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
catch (error) {
|
|
381
|
+
this.#event_emitter.emit("request_error", { request_id, message: prompt_message, error }, {}, this);
|
|
382
|
+
if (this.#state !== "disposed") {
|
|
383
|
+
this.#set_state("idle");
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
return result;
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Registers a one-time event listener.
|
|
390
|
+
*
|
|
391
|
+
* @template E - The event name type.
|
|
392
|
+
* @param event_name - The name of the event to listen for.
|
|
393
|
+
* @param listener - The callback function to invoke when the event occurs.
|
|
394
|
+
*/
|
|
395
|
+
once(event_name, listener) {
|
|
396
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
397
|
+
this.#event_emitter.once(event_name, listener);
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* Registers a persistent event listener.
|
|
401
|
+
*
|
|
402
|
+
* @template E - The event name type.
|
|
403
|
+
* @param event_name - The name of the event to listen for.
|
|
404
|
+
* @param listener - The callback function to invoke when the event occurs.
|
|
405
|
+
*/
|
|
406
|
+
on(event_name, listener) {
|
|
407
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
408
|
+
this.#event_emitter.on(event_name, listener);
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* Removes an event listener.
|
|
412
|
+
*
|
|
413
|
+
* @template E - The event name type.
|
|
414
|
+
* @param event_name - The name of the event.
|
|
415
|
+
* @param listener - The callback function to remove.
|
|
416
|
+
*/
|
|
417
|
+
off(event_name, listener) {
|
|
418
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
419
|
+
this.#event_emitter.off(event_name, listener);
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* Cancels an in-progress model response.
|
|
423
|
+
*
|
|
424
|
+
* Transitions the conversation to the "stopping" state, which triggers
|
|
425
|
+
* cancellation of the underlying request.
|
|
426
|
+
*/
|
|
427
|
+
cancel_response() {
|
|
428
|
+
if (this.state === "idle" || this.state === "disposed") {
|
|
429
|
+
throw new Error("invalid state");
|
|
430
|
+
}
|
|
431
|
+
this.#set_state("stopping");
|
|
432
|
+
}
|
|
433
|
+
/**
|
|
434
|
+
* Clears all messages from the conversation history.
|
|
435
|
+
*
|
|
436
|
+
* Can only be called when the conversation is idle.
|
|
437
|
+
*/
|
|
438
|
+
clear() {
|
|
439
|
+
if (this.state !== "idle") {
|
|
440
|
+
throw new Error("invalid state");
|
|
441
|
+
}
|
|
442
|
+
this.#messages = [];
|
|
443
|
+
this.#set_state("idle");
|
|
444
|
+
}
|
|
445
|
+
/**
|
|
446
|
+
* Loads messages into the conversation history.
|
|
447
|
+
*
|
|
448
|
+
* @param messages - The messages to load.
|
|
449
|
+
*/
|
|
450
|
+
load(messages) {
|
|
451
|
+
if (this.state !== "idle") {
|
|
452
|
+
throw new Error("invalid state");
|
|
453
|
+
}
|
|
454
|
+
this.#messages = [...messages.map((m) => Object.freeze({ ...m }))];
|
|
455
|
+
}
|
|
456
|
+
/**
|
|
457
|
+
* Creates a child conversation that inherits configuration from this conversation.
|
|
458
|
+
*
|
|
459
|
+
* Child events are propagated to the parent as "child_event" events.
|
|
460
|
+
*
|
|
461
|
+
* @param fork_session - Whether to copy the current message history to the child.
|
|
462
|
+
* @param id - Optional custom ID for the child conversation.
|
|
463
|
+
* @param system_prompt - Optional system prompt override for the child.
|
|
464
|
+
* @param is_checkpoint - Whether this child is a checkpoint summarization session.
|
|
465
|
+
* @returns The newly created child conversation.
|
|
466
|
+
*/
|
|
467
|
+
spawn_child(fork_session, id, system_prompt, is_checkpoint) {
|
|
468
|
+
const child = new Conversation(this.#provider.clone(), this.#policy, this.#context_transformer, this.#summarization_strategy);
|
|
469
|
+
if (id) {
|
|
470
|
+
child.id = id;
|
|
471
|
+
}
|
|
472
|
+
if (system_prompt) {
|
|
473
|
+
child.system = system_prompt;
|
|
474
|
+
}
|
|
475
|
+
if (fork_session) {
|
|
476
|
+
child.load(this.#messages);
|
|
477
|
+
}
|
|
478
|
+
if (is_checkpoint) {
|
|
479
|
+
child.#is_checkpoint = true;
|
|
480
|
+
}
|
|
481
|
+
this.#attach_child_event(child, "state_change");
|
|
482
|
+
this.#attach_child_event(child, "checkpoint_begin");
|
|
483
|
+
this.#attach_child_event(child, "checkpoint_complete");
|
|
484
|
+
this.#attach_child_event(child, "prompt_send");
|
|
485
|
+
this.#attach_child_event(child, "message_start");
|
|
486
|
+
this.#attach_child_event(child, "message_update");
|
|
487
|
+
this.#attach_child_event(child, "message_complete");
|
|
488
|
+
this.#attach_child_event(child, "content_start");
|
|
489
|
+
this.#attach_child_event(child, "content_update");
|
|
490
|
+
this.#attach_child_event(child, "content_complete");
|
|
491
|
+
this.#attach_child_event(child, "request_success");
|
|
492
|
+
this.#attach_child_event(child, "request_error");
|
|
493
|
+
this.#attach_child_event(child, "before_request");
|
|
494
|
+
this.#attach_child_event(child, "raw_request");
|
|
495
|
+
this.#attach_child_event(child, "raw_response");
|
|
496
|
+
this.#attach_child_event(child, "raw_stream");
|
|
497
|
+
this.#attach_child_event(child, "create_child");
|
|
498
|
+
this.#attach_child_event(child, "child_event");
|
|
499
|
+
this.#attach_child_event(child, "lifecycle_error");
|
|
500
|
+
this.#attach_child_event(child, "dispose");
|
|
501
|
+
this.#event_emitter.emit("create_child", child, this);
|
|
502
|
+
return child;
|
|
503
|
+
}
|
|
504
|
+
/**
|
|
505
|
+
* Creates a checkpoint summarizing the conversation so far.
|
|
506
|
+
*
|
|
507
|
+
* Spawns an ephemeral child conversation, sends the checkpoint prompt,
|
|
508
|
+
* and stores the resulting summary as the new checkpoint state.
|
|
509
|
+
*
|
|
510
|
+
* Requires a CheckpointContextTransformer (or composite that includes one)
|
|
511
|
+
* in the context transformer pipeline for the checkpoint state to take effect
|
|
512
|
+
* on subsequent prompts.
|
|
513
|
+
*
|
|
514
|
+
* @param config - Optional checkpoint configuration.
|
|
515
|
+
* @returns The new checkpoint state.
|
|
516
|
+
*/
|
|
517
|
+
async checkpoint(config) {
|
|
518
|
+
if (this.state !== "idle") {
|
|
519
|
+
throw new Error("invalid state");
|
|
520
|
+
}
|
|
521
|
+
if (this.#messages.length === 0) {
|
|
522
|
+
throw new Error("no messages to checkpoint");
|
|
523
|
+
}
|
|
524
|
+
const messages_since = this.#get_messages_since_checkpoint();
|
|
525
|
+
if (messages_since.length === 0) {
|
|
526
|
+
throw new Error("no new messages since last checkpoint");
|
|
527
|
+
}
|
|
528
|
+
const prompt_messages = this.#summarization_strategy.build_prompt({
|
|
529
|
+
session_id: this.#id,
|
|
530
|
+
messages: messages_since,
|
|
531
|
+
previous_checkpoint: this.#checkpoint_state,
|
|
532
|
+
system: this.#system,
|
|
533
|
+
context: config?.context,
|
|
534
|
+
});
|
|
535
|
+
const child = this.spawn_child(false, undefined, undefined, true);
|
|
536
|
+
this.#event_emitter.emit("checkpoint_begin", child, this);
|
|
537
|
+
try {
|
|
538
|
+
if (prompt_messages.length > 1) {
|
|
539
|
+
child.load(prompt_messages.slice(0, -1));
|
|
540
|
+
}
|
|
541
|
+
const last = prompt_messages[prompt_messages.length - 1];
|
|
542
|
+
if (last.role !== "user") {
|
|
543
|
+
throw new Error("checkpoint prompt strategy must return a user message last");
|
|
544
|
+
}
|
|
545
|
+
const response_promise = new Promise((resolve, reject) => {
|
|
546
|
+
child.once("message_complete", ({ message }) => resolve(message));
|
|
547
|
+
child.once("request_error", ({ error }) => reject(error instanceof Error ? error : new Error(String(error))));
|
|
548
|
+
});
|
|
549
|
+
await child.send_message(last.content);
|
|
550
|
+
const response = await response_promise;
|
|
551
|
+
const summary = response.content
|
|
552
|
+
.filter((c) => c.type === "text")
|
|
553
|
+
.map((c) => c.text)
|
|
554
|
+
.join("\n");
|
|
555
|
+
if (!summary) {
|
|
556
|
+
throw new Error("checkpoint produced an empty summary");
|
|
557
|
+
}
|
|
558
|
+
const boundary = this.#messages[this.#messages.length - 1];
|
|
559
|
+
if (!boundary.id) {
|
|
560
|
+
throw new Error("boundary message has no id");
|
|
561
|
+
}
|
|
562
|
+
const state = {
|
|
563
|
+
message_id: boundary.id,
|
|
564
|
+
summary,
|
|
565
|
+
};
|
|
566
|
+
this.#checkpoint_state = state;
|
|
567
|
+
this.#event_emitter.emit("checkpoint_complete", state, this);
|
|
568
|
+
return state;
|
|
569
|
+
}
|
|
570
|
+
finally {
|
|
571
|
+
if (child.state !== "disposed") {
|
|
572
|
+
child[Symbol.dispose]();
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
#get_messages_since_checkpoint() {
|
|
577
|
+
const checkpointState = this.#checkpoint_state;
|
|
578
|
+
if (!checkpointState) {
|
|
579
|
+
return [...this.#messages];
|
|
580
|
+
}
|
|
581
|
+
const idx = this.#messages.findIndex((m) => m.id === checkpointState.message_id);
|
|
582
|
+
if (idx === -1) {
|
|
583
|
+
return [...this.#messages];
|
|
584
|
+
}
|
|
585
|
+
return this.#messages.slice(idx + 1);
|
|
586
|
+
}
|
|
587
|
+
#set_state(value) {
|
|
588
|
+
if (this.#state === "disposed" || value === "disposed") {
|
|
589
|
+
throw new Error("invalid state");
|
|
590
|
+
}
|
|
591
|
+
if (this.#state !== value) {
|
|
592
|
+
const previous = this.#state;
|
|
593
|
+
this.#state = value;
|
|
594
|
+
this.#event_emitter.emit("state_change", {
|
|
595
|
+
current: value,
|
|
596
|
+
previous,
|
|
597
|
+
}, this);
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
async #get_prompt_context(messages) {
|
|
601
|
+
for (const t of this.#provider.context_transformers ?? []) {
|
|
602
|
+
if (t.transform_prompt) {
|
|
603
|
+
messages = await t.transform_prompt(messages);
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
const context = { checkpoint: this.#checkpoint_state };
|
|
607
|
+
return await this.#context_transformer.transform_prompt(messages, context);
|
|
608
|
+
}
|
|
609
|
+
#attach_child_event(child, event_name) {
|
|
610
|
+
const handler = (...args) => {
|
|
611
|
+
this.#event_emitter.emit("child_event", {
|
|
612
|
+
event_name,
|
|
613
|
+
event_args: args,
|
|
614
|
+
}, this);
|
|
615
|
+
};
|
|
616
|
+
child.on(event_name, handler);
|
|
617
|
+
child.once("dispose", () => setImmediate(() => child.off(event_name, handler)));
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
function identify_message(message) {
|
|
621
|
+
const content = message.content?.map(identify_content);
|
|
622
|
+
const id = message.id ??
|
|
623
|
+
crypto
|
|
624
|
+
.createHash("sha1")
|
|
625
|
+
.update(JSON.stringify({ ...message, content }))
|
|
626
|
+
.digest("hex");
|
|
627
|
+
return {
|
|
628
|
+
timestamp: Date.now(),
|
|
629
|
+
...message,
|
|
630
|
+
content,
|
|
631
|
+
id,
|
|
632
|
+
};
|
|
633
|
+
}
|
|
634
|
+
function identify_content(content) {
|
|
635
|
+
const id = content.id ?? crypto.createHash("sha1").update(JSON.stringify(content)).digest("hex");
|
|
636
|
+
return {
|
|
637
|
+
timestamp: Date.now(),
|
|
638
|
+
...content,
|
|
639
|
+
id,
|
|
640
|
+
};
|
|
641
|
+
}
|
|
642
|
+
//# sourceMappingURL=conversation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation.js","sourceRoot":"","sources":["../../src/conversations/conversation.ts"],"names":[],"mappings":"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"}
|