@duetso/agent 0.1.53 → 0.1.54
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 +13 -2
- package/dist/package.json +1 -1
- package/dist/src/cli/help.js +1 -1
- package/dist/src/cli/memory-db.d.ts.map +1 -1
- package/dist/src/cli/memory-db.js +14 -5
- package/dist/src/cli/memory-db.js.map +1 -1
- package/dist/src/cli/memory-tui.js +1 -1
- package/dist/src/cli/memory-tui.js.map +1 -1
- package/dist/src/cli/resume-hint.d.ts +1 -1
- package/dist/src/cli/resume-hint.d.ts.map +1 -1
- package/dist/src/cli/resume-hint.js +2 -2
- package/dist/src/cli/resume-hint.js.map +1 -1
- package/dist/src/cli/run.d.ts +1 -1
- package/dist/src/cli/run.d.ts.map +1 -1
- package/dist/src/cli/run.js +7 -6
- package/dist/src/cli/run.js.map +1 -1
- package/dist/src/memory/context-pack.d.ts +29 -0
- package/dist/src/memory/context-pack.d.ts.map +1 -0
- package/dist/src/memory/context-pack.js +40 -0
- package/dist/src/memory/context-pack.js.map +1 -0
- package/dist/src/memory/embedding-worker.d.ts +26 -0
- package/dist/src/memory/embedding-worker.d.ts.map +1 -0
- package/dist/src/memory/embedding-worker.js +145 -0
- package/dist/src/memory/embedding-worker.js.map +1 -0
- package/dist/src/memory/embedding.d.ts +59 -0
- package/dist/src/memory/embedding.d.ts.map +1 -0
- package/dist/src/memory/embedding.js +126 -0
- package/dist/src/memory/embedding.js.map +1 -0
- package/dist/src/memory/loader.d.ts +81 -0
- package/dist/src/memory/loader.d.ts.map +1 -0
- package/dist/src/memory/loader.js +162 -0
- package/dist/src/memory/loader.js.map +1 -0
- package/dist/src/memory/migrations.d.ts +54 -0
- package/dist/src/memory/migrations.d.ts.map +1 -0
- package/dist/src/memory/migrations.js +199 -0
- package/dist/src/memory/migrations.js.map +1 -0
- package/dist/src/memory/observational.d.ts +18 -0
- package/dist/src/memory/observational.d.ts.map +1 -1
- package/dist/src/memory/observational.js +63 -14
- package/dist/src/memory/observational.js.map +1 -1
- package/dist/src/memory/pglite.d.ts +5 -5
- package/dist/src/memory/pglite.d.ts.map +1 -1
- package/dist/src/memory/pglite.js +20 -6
- package/dist/src/memory/pglite.js.map +1 -1
- package/dist/src/memory/recall.d.ts +49 -0
- package/dist/src/memory/recall.d.ts.map +1 -0
- package/dist/src/memory/recall.js +185 -0
- package/dist/src/memory/recall.js.map +1 -0
- package/dist/src/memory/storage.d.ts +36 -1
- package/dist/src/memory/storage.d.ts.map +1 -1
- package/dist/src/memory/storage.js +68 -14
- package/dist/src/memory/storage.js.map +1 -1
- package/dist/src/memory/store.d.ts +33 -1
- package/dist/src/memory/store.d.ts.map +1 -1
- package/dist/src/memory/store.js +22 -16
- package/dist/src/memory/store.js.map +1 -1
- package/dist/src/session/session.d.ts.map +1 -1
- package/dist/src/session/session.js +5 -1
- package/dist/src/session/session.js.map +1 -1
- package/dist/src/tui/app.d.ts.map +1 -1
- package/dist/src/tui/app.js +327 -30
- package/dist/src/tui/app.js.map +1 -1
- package/dist/src/tui/autocomplete.d.ts.map +1 -1
- package/dist/src/tui/autocomplete.js +5 -0
- package/dist/src/tui/autocomplete.js.map +1 -1
- package/dist/src/tui/clipboard.d.ts +28 -0
- package/dist/src/tui/clipboard.d.ts.map +1 -0
- package/dist/src/tui/clipboard.js +95 -0
- package/dist/src/tui/clipboard.js.map +1 -0
- package/dist/src/tui/history.d.ts +14 -0
- package/dist/src/tui/history.d.ts.map +1 -1
- package/dist/src/tui/history.js +21 -0
- package/dist/src/tui/history.js.map +1 -1
- package/dist/src/tui/recent-sessions.d.ts +51 -0
- package/dist/src/tui/recent-sessions.d.ts.map +1 -0
- package/dist/src/tui/recent-sessions.js +150 -0
- package/dist/src/tui/recent-sessions.js.map +1 -0
- package/dist/src/tui/starters.d.ts +92 -0
- package/dist/src/tui/starters.d.ts.map +1 -0
- package/dist/src/tui/starters.js +196 -0
- package/dist/src/tui/starters.js.map +1 -0
- package/dist/src/tui/theme.d.ts +2 -2
- package/dist/src/tui/theme.d.ts.map +1 -1
- package/dist/src/tui/theme.js +2 -2
- package/dist/src/tui/theme.js.map +1 -1
- package/dist/src/tui/transcript-log.d.ts +45 -0
- package/dist/src/tui/transcript-log.d.ts.map +1 -0
- package/dist/src/tui/transcript-log.js +76 -0
- package/dist/src/tui/transcript-log.js.map +1 -0
- package/dist/src/turn-runner/tools.d.ts +28 -1
- package/dist/src/turn-runner/tools.d.ts.map +1 -1
- package/dist/src/turn-runner/tools.js +135 -3
- package/dist/src/turn-runner/tools.js.map +1 -1
- package/dist/src/turn-runner/turn-runner.d.ts +1 -0
- package/dist/src/turn-runner/turn-runner.d.ts.map +1 -1
- package/dist/src/turn-runner/turn-runner.js +70 -3
- package/dist/src/turn-runner/turn-runner.js.map +1 -1
- package/dist/src/types/config.d.ts +12 -0
- package/dist/src/types/config.d.ts.map +1 -1
- package/dist/src/types/memory.d.ts +59 -21
- package/dist/src/types/memory.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/src/memory/schema.d.ts +0 -7
- package/dist/src/memory/schema.d.ts.map +0 -1
- package/dist/src/memory/schema.js +0 -21
- package/dist/src/memory/schema.js.map +0 -1
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { PGlite } from "@electric-sql/pglite";
|
|
2
|
+
import type { Observation } from "../types/memory.js";
|
|
3
|
+
import type { EmbedFn } from "./embedding.js";
|
|
4
|
+
export type RecallScope = "session" | "global" | "all";
|
|
5
|
+
export interface RecallMemoryOptions {
|
|
6
|
+
db: PGlite;
|
|
7
|
+
/**
|
|
8
|
+
* Embedding callable. When omitted (or when it throws) the vector
|
|
9
|
+
* path is skipped silently and recall falls back to keyword-only.
|
|
10
|
+
*/
|
|
11
|
+
embed?: EmbedFn;
|
|
12
|
+
/** The user/agent's free-text query. */
|
|
13
|
+
query: string;
|
|
14
|
+
/** Maximum number of fused results to return. Defaults to 8. */
|
|
15
|
+
limit?: number;
|
|
16
|
+
/** Restrict to current session, every other session, or both. Defaults to "all". */
|
|
17
|
+
scope?: RecallScope;
|
|
18
|
+
/**
|
|
19
|
+
* Session id used to evaluate the `scope` filter. Required when
|
|
20
|
+
* scope is "session" or "global"; ignored when scope is "all".
|
|
21
|
+
*/
|
|
22
|
+
sessionId?: string;
|
|
23
|
+
}
|
|
24
|
+
export interface RecallMemoryResult {
|
|
25
|
+
observations: Observation[];
|
|
26
|
+
/** Whether the vector path actually ran. Useful for tool output to flag degraded mode. */
|
|
27
|
+
vectorSearchAttempted: boolean;
|
|
28
|
+
/** Whether the vector path produced any rows. False after a 401/network failure or empty index. */
|
|
29
|
+
vectorSearchSucceeded: boolean;
|
|
30
|
+
}
|
|
31
|
+
export declare function recallMemory(options: RecallMemoryOptions): Promise<RecallMemoryResult>;
|
|
32
|
+
interface ScoredHit {
|
|
33
|
+
id: string;
|
|
34
|
+
rank: number;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Reciprocal Rank Fusion. Each ranked list contributes
|
|
38
|
+
* `1 / (RRF_K + rank)` to a candidate's combined score; candidates
|
|
39
|
+
* that rank highly in either list rise to the top, and a single list
|
|
40
|
+
* dominating mediocre rows from the other does not steamroll a row
|
|
41
|
+
* that ranks well across both.
|
|
42
|
+
*
|
|
43
|
+
* Returns ids ordered by descending fused score. Ties (same score)
|
|
44
|
+
* resolve by first appearance, which mirrors gbrain's insertion-order
|
|
45
|
+
* tiebreak.
|
|
46
|
+
*/
|
|
47
|
+
export declare function reciprocalRankFusion(rankedLists: ScoredHit[][]): string[];
|
|
48
|
+
export {};
|
|
49
|
+
//# sourceMappingURL=recall.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recall.d.ts","sourceRoot":"","sources":["../../../src/memory/recall.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAwC,MAAM,oBAAoB,CAAC;AAC5F,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAkC9C,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,KAAK,CAAC;AAEvD,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,gEAAgE;IAChE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oFAAoF;IACpF,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,0FAA0F;IAC1F,qBAAqB,EAAE,OAAO,CAAC;IAC/B,mGAAmG;IACnG,qBAAqB,EAAE,OAAO,CAAC;CAChC;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAuC5F;AAED,UAAU,SAAS;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAqGD;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,SAAS,EAAE,EAAE,GAAG,MAAM,EAAE,CAqBzE"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hybrid retrieval over the durable memory database.
|
|
3
|
+
*
|
|
4
|
+
* Implements the gbrain / Zep / Letta pattern: vector search and
|
|
5
|
+
* keyword search run in parallel, results merge via Reciprocal Rank
|
|
6
|
+
* Fusion. Vector covers fuzzy paraphrases; keyword covers exact-token
|
|
7
|
+
* lookups (proper nouns, IDs, code symbols) where embeddings reliably
|
|
8
|
+
* miss. RRF needs no score normalization and is stable to ranking
|
|
9
|
+
* tweaks on either side.
|
|
10
|
+
*
|
|
11
|
+
* The two paths degrade independently:
|
|
12
|
+
* - No embedding client / endpoint unavailable: vector path is
|
|
13
|
+
* skipped and the function returns keyword-only results. Logged
|
|
14
|
+
* once by the tool layer; the user still gets recall.
|
|
15
|
+
* - Empty keyword query (whitespace, punctuation): keyword path
|
|
16
|
+
* returns nothing; vector path carries the result alone.
|
|
17
|
+
*
|
|
18
|
+
* If both paths fail to return anything (no API key + no FTS match)
|
|
19
|
+
* the function returns an empty list rather than throwing, so the
|
|
20
|
+
* tool can answer "nothing matched" without an error UX.
|
|
21
|
+
*/
|
|
22
|
+
/** Default top-K each retrieval path returns before fusion. Empirically a healthy over-fetch. */
|
|
23
|
+
const PER_PATH_TOP_K = 30;
|
|
24
|
+
/**
|
|
25
|
+
* RRF constant. Matches the value gbrain and the original Cormack et
|
|
26
|
+
* al. RRF paper recommend. Smaller k weights top-of-list more
|
|
27
|
+
* aggressively; the default trades some top-1 sharpness for stability
|
|
28
|
+
* across paths with different score scales.
|
|
29
|
+
*/
|
|
30
|
+
const RRF_K = 60;
|
|
31
|
+
export async function recallMemory(options) {
|
|
32
|
+
const limit = options.limit ?? 8;
|
|
33
|
+
const scope = options.scope ?? "all";
|
|
34
|
+
// session-scoped recall without a session id is a caller bug; return
|
|
35
|
+
// nothing rather than degrade to an unbounded global search.
|
|
36
|
+
if (scope === "session" && !options.sessionId) {
|
|
37
|
+
return { observations: [], vectorSearchAttempted: false, vectorSearchSucceeded: false };
|
|
38
|
+
}
|
|
39
|
+
const keywordHits = await keywordSearch(options.db, options.query, scope, options.sessionId);
|
|
40
|
+
let vectorAttempted = false;
|
|
41
|
+
let vectorHits = [];
|
|
42
|
+
if (options.embed) {
|
|
43
|
+
vectorAttempted = true;
|
|
44
|
+
try {
|
|
45
|
+
vectorHits = await vectorSearch(options.db, options.embed, options.query, scope, options.sessionId);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
// Embedding unavailable, network blip, or empty index — drop
|
|
49
|
+
// back to keyword-only. Caller surfaces the degraded mode.
|
|
50
|
+
vectorHits = [];
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
const fusedIds = reciprocalRankFusion([keywordHits, vectorHits]).slice(0, limit);
|
|
54
|
+
const observations = await hydrate(options.db, fusedIds);
|
|
55
|
+
return {
|
|
56
|
+
observations,
|
|
57
|
+
vectorSearchAttempted: vectorAttempted,
|
|
58
|
+
vectorSearchSucceeded: vectorHits.length > 0,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
async function keywordSearch(db, query, scope, sessionId) {
|
|
62
|
+
const trimmed = query.trim();
|
|
63
|
+
if (!trimmed)
|
|
64
|
+
return [];
|
|
65
|
+
// websearch_to_tsquery accepts free-form input with quotes and OR
|
|
66
|
+
// syntax, the same shape a user would type into a search box. ts_rank
|
|
67
|
+
// against the GIN index gives a relevance order rather than a uniform
|
|
68
|
+
// "matched" set.
|
|
69
|
+
const baseSql = `SELECT id
|
|
70
|
+
FROM observations
|
|
71
|
+
WHERE to_tsvector('english', content) @@ websearch_to_tsquery('english', $1)`;
|
|
72
|
+
const orderSql = `
|
|
73
|
+
ORDER BY ts_rank(to_tsvector('english', content), websearch_to_tsquery('english', $1)) DESC,
|
|
74
|
+
created_at DESC
|
|
75
|
+
LIMIT ${PER_PATH_TOP_K}`;
|
|
76
|
+
const { rows } = await runScopedQuery(db, baseSql, orderSql, [trimmed], scope, sessionId);
|
|
77
|
+
return rows.map((row, index) => ({ id: row.id, rank: index }));
|
|
78
|
+
}
|
|
79
|
+
async function vectorSearch(db, embed, query, scope, sessionId) {
|
|
80
|
+
const trimmed = query.trim();
|
|
81
|
+
if (!trimmed)
|
|
82
|
+
return [];
|
|
83
|
+
const [vector] = await embed([trimmed]);
|
|
84
|
+
if (!vector)
|
|
85
|
+
return [];
|
|
86
|
+
const baseSql = `SELECT o.id
|
|
87
|
+
FROM observation_embeddings e
|
|
88
|
+
JOIN observations o ON o.id = e.observation_id
|
|
89
|
+
WHERE TRUE`;
|
|
90
|
+
const orderSql = `
|
|
91
|
+
ORDER BY e.vector <=> $1::vector
|
|
92
|
+
LIMIT ${PER_PATH_TOP_K}`;
|
|
93
|
+
const { rows } = await runScopedQuery(db, baseSql, orderSql, [`[${vector.join(",")}]`], scope, sessionId,
|
|
94
|
+
// Vector search uses an `o.` alias for observations so the scope
|
|
95
|
+
// predicate has to follow.
|
|
96
|
+
"o.");
|
|
97
|
+
return rows.map((row, index) => ({ id: row.id, rank: index }));
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Append the scope predicate (if any) to a base query and run it. The
|
|
101
|
+
* base query must end with `WHERE <something>` so the predicate can
|
|
102
|
+
* be tacked on with `AND`. Predicates use IS DISTINCT FROM for the
|
|
103
|
+
* "global" branch so NULL-session legacy rows stay in the pool
|
|
104
|
+
* (they cannot match any current session), matching the loader.
|
|
105
|
+
*/
|
|
106
|
+
async function runScopedQuery(db, baseSql, orderSql, baseParams, scope, sessionId, columnPrefix = "") {
|
|
107
|
+
const nextParam = baseParams.length + 1;
|
|
108
|
+
if (scope === "session" && sessionId) {
|
|
109
|
+
return db.query(`${baseSql} AND ${columnPrefix}session_id = $${nextParam}${orderSql}`, [
|
|
110
|
+
...baseParams,
|
|
111
|
+
sessionId,
|
|
112
|
+
]);
|
|
113
|
+
}
|
|
114
|
+
if (scope === "global" && sessionId) {
|
|
115
|
+
return db.query(`${baseSql} AND ${columnPrefix}session_id IS DISTINCT FROM $${nextParam}${orderSql}`, [...baseParams, sessionId]);
|
|
116
|
+
}
|
|
117
|
+
return db.query(`${baseSql}${orderSql}`, baseParams);
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Reciprocal Rank Fusion. Each ranked list contributes
|
|
121
|
+
* `1 / (RRF_K + rank)` to a candidate's combined score; candidates
|
|
122
|
+
* that rank highly in either list rise to the top, and a single list
|
|
123
|
+
* dominating mediocre rows from the other does not steamroll a row
|
|
124
|
+
* that ranks well across both.
|
|
125
|
+
*
|
|
126
|
+
* Returns ids ordered by descending fused score. Ties (same score)
|
|
127
|
+
* resolve by first appearance, which mirrors gbrain's insertion-order
|
|
128
|
+
* tiebreak.
|
|
129
|
+
*/
|
|
130
|
+
export function reciprocalRankFusion(rankedLists) {
|
|
131
|
+
const scores = new Map();
|
|
132
|
+
let order = 0;
|
|
133
|
+
for (const list of rankedLists) {
|
|
134
|
+
for (const hit of list) {
|
|
135
|
+
const contribution = 1 / (RRF_K + hit.rank);
|
|
136
|
+
const existing = scores.get(hit.id);
|
|
137
|
+
if (existing) {
|
|
138
|
+
existing.score += contribution;
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
scores.set(hit.id, { score: contribution, firstSeen: order++ });
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return Array.from(scores.entries())
|
|
146
|
+
.sort((a, b) => {
|
|
147
|
+
if (b[1].score !== a[1].score)
|
|
148
|
+
return b[1].score - a[1].score;
|
|
149
|
+
return a[1].firstSeen - b[1].firstSeen;
|
|
150
|
+
})
|
|
151
|
+
.map(([id]) => id);
|
|
152
|
+
}
|
|
153
|
+
async function hydrate(db, ids) {
|
|
154
|
+
if (ids.length === 0)
|
|
155
|
+
return [];
|
|
156
|
+
const { rows } = await db.query(`SELECT id, created_at, session_id, kind, observed_date, referenced_date,
|
|
157
|
+
relative_date, time_of_day, priority, source_json, content, tags_json
|
|
158
|
+
FROM observations
|
|
159
|
+
WHERE id = ANY($1::text[])`, [ids]);
|
|
160
|
+
// Database returns rows in arbitrary order; reorder to match the
|
|
161
|
+
// fused ranking so callers can treat the array as the ranked
|
|
162
|
+
// result list directly.
|
|
163
|
+
const byId = new Map(rows.map((row) => [row.id, row]));
|
|
164
|
+
return ids
|
|
165
|
+
.map((id) => byId.get(id))
|
|
166
|
+
.filter((row) => row !== undefined)
|
|
167
|
+
.map(rowToObservation);
|
|
168
|
+
}
|
|
169
|
+
function rowToObservation(row) {
|
|
170
|
+
return {
|
|
171
|
+
id: row.id,
|
|
172
|
+
createdAt: row.created_at,
|
|
173
|
+
...(row.session_id !== null ? { sessionId: row.session_id } : {}),
|
|
174
|
+
kind: row.kind,
|
|
175
|
+
observedDate: row.observed_date,
|
|
176
|
+
...(row.referenced_date !== null ? { referencedDate: row.referenced_date } : {}),
|
|
177
|
+
...(row.relative_date !== null ? { relativeDate: row.relative_date } : {}),
|
|
178
|
+
...(row.time_of_day !== null ? { timeOfDay: row.time_of_day } : {}),
|
|
179
|
+
priority: row.priority,
|
|
180
|
+
source: JSON.parse(row.source_json),
|
|
181
|
+
content: row.content,
|
|
182
|
+
tags: JSON.parse(row.tags_json),
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=recall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recall.js","sourceRoot":"","sources":["../../../src/memory/recall.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,42 @@
|
|
|
1
|
+
import type { PGlite } from "@electric-sql/pglite";
|
|
2
|
+
import type { ObservationalMemorySettings } from "../types/memory.js";
|
|
3
|
+
import { type EmbedFn } from "./embedding.js";
|
|
1
4
|
import type { MemoryStore } from "./store.js";
|
|
2
5
|
export interface MemoryPersistenceHandle {
|
|
3
6
|
flush: () => Promise<void>;
|
|
4
7
|
dispose: () => Promise<void>;
|
|
8
|
+
/**
|
|
9
|
+
* The opened PGlite handle, exposed so tools (recall_memory, future
|
|
10
|
+
* loaders) can run their own queries against the same database the
|
|
11
|
+
* MemoryStore writes through. Undefined when memory persistence is
|
|
12
|
+
* disabled (the no-op handle); callers must not close it.
|
|
13
|
+
*/
|
|
14
|
+
db?: PGlite;
|
|
15
|
+
/** Embedding callable shared with the backfill worker, when configured. */
|
|
16
|
+
embed?: EmbedFn;
|
|
5
17
|
}
|
|
6
|
-
export
|
|
18
|
+
export interface LoadStoredMemoryOptions {
|
|
19
|
+
/**
|
|
20
|
+
* Embedding callable used by the background backfill worker. Omit to
|
|
21
|
+
* skip embedding work entirely — useful in tests that do not exercise
|
|
22
|
+
* `recall_memory`. The worker is built only when this is provided.
|
|
23
|
+
*/
|
|
24
|
+
embed?: EmbedFn;
|
|
25
|
+
/** Embedding model identifier written alongside each vector. */
|
|
26
|
+
embeddingModel?: string;
|
|
27
|
+
/** Optional override for the backfill log path; defaults to ~/.duet/logs/memory-backfill.log. */
|
|
28
|
+
embeddingLogPath?: string;
|
|
29
|
+
/**
|
|
30
|
+
* Settings + sessionId used to build the initial context pack. When
|
|
31
|
+
* provided, `loadStoredMemory` builds and freezes the rendered
|
|
32
|
+
* memory pack as part of the load so the first turn already sees a
|
|
33
|
+
* stable prefix. Omit to skip the initial build (the runner can
|
|
34
|
+
* trigger it later).
|
|
35
|
+
*/
|
|
36
|
+
contextPack?: {
|
|
37
|
+
settings: ObservationalMemorySettings;
|
|
38
|
+
sessionId?: string;
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
export declare function loadStoredMemory(memoryPath: string | false | undefined, cwd: string, store: MemoryStore, options?: LoadStoredMemoryOptions): Promise<MemoryPersistenceHandle>;
|
|
7
42
|
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/memory/storage.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/memory/storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAGnD,OAAO,KAAK,EAGV,2BAA2B,EAE5B,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAA2B,KAAK,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAIvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B;;;;;OAKG;IACH,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,2EAA2E;IAC3E,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,uBAAuB;IACtC;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,gEAAgE;IAChE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iGAAiG;IACjG,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;;;OAMG;IACH,WAAW,CAAC,EAAE;QACZ,QAAQ,EAAE,2BAA2B,CAAC;QACtC,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AAED,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,EACtC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,WAAW,EAClB,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,uBAAuB,CAAC,CA+DlC"}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
|
+
import { homedir } from "node:os";
|
|
1
2
|
import { join } from "node:path";
|
|
3
|
+
import { rebuildMemoryContextPack } from "./context-pack.js";
|
|
4
|
+
import { DEFAULT_EMBEDDING_MODEL } from "./embedding.js";
|
|
5
|
+
import { EmbeddingBackfillWorker } from "./embedding-worker.js";
|
|
6
|
+
import { runMigrations } from "./migrations.js";
|
|
2
7
|
import { openPGlite } from "./pglite.js";
|
|
3
|
-
|
|
4
|
-
export async function loadStoredMemory(memoryPath, cwd, store) {
|
|
8
|
+
export async function loadStoredMemory(memoryPath, cwd, store, options = {}) {
|
|
5
9
|
if (!memoryPath) {
|
|
6
10
|
const noop = async () => { };
|
|
7
11
|
return { flush: noop, dispose: noop };
|
|
@@ -15,21 +19,68 @@ export async function loadStoredMemory(memoryPath, cwd, store) {
|
|
|
15
19
|
void writeQueue;
|
|
16
20
|
};
|
|
17
21
|
const unsubscribe = store.on(enqueueWrite);
|
|
22
|
+
// The backfill worker runs whenever the CLI is up. Observers and
|
|
23
|
+
// reflectors write rows during turns; embeddings catch up in the
|
|
24
|
+
// background within a few batches, never blocking the foreground.
|
|
25
|
+
// Skipping the worker (no `embed` option) is intentional for tests
|
|
26
|
+
// and one-shot tools that do not call recall_memory.
|
|
27
|
+
const worker = options.embed
|
|
28
|
+
? new EmbeddingBackfillWorker({
|
|
29
|
+
db: database,
|
|
30
|
+
embed: options.embed,
|
|
31
|
+
model: options.embeddingModel ?? DEFAULT_EMBEDDING_MODEL,
|
|
32
|
+
logPath: options.embeddingLogPath ?? defaultEmbeddingLogPath(),
|
|
33
|
+
})
|
|
34
|
+
: undefined;
|
|
35
|
+
worker?.start();
|
|
36
|
+
if (options.contextPack) {
|
|
37
|
+
// Initial compaction trigger: freeze the rendered memory pack
|
|
38
|
+
// before the first turn dispatches so the prefix is stable from
|
|
39
|
+
// turn 1, not turn 2. Failure here is non-fatal: the pack stays
|
|
40
|
+
// empty and the runner can trigger a refresh later.
|
|
41
|
+
try {
|
|
42
|
+
await rebuildMemoryContextPack({
|
|
43
|
+
db: database,
|
|
44
|
+
store,
|
|
45
|
+
settings: options.contextPack.settings,
|
|
46
|
+
...(options.contextPack.sessionId !== undefined
|
|
47
|
+
? { sessionId: options.contextPack.sessionId }
|
|
48
|
+
: {}),
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
// Pack build failed; rendered memory will be empty until the
|
|
53
|
+
// next compaction trigger refreshes it. Logged silently here
|
|
54
|
+
// since callers do not need the noise mid-startup.
|
|
55
|
+
}
|
|
56
|
+
}
|
|
18
57
|
const flush = async () => {
|
|
19
58
|
await writeQueue;
|
|
20
59
|
};
|
|
21
60
|
const dispose = async () => {
|
|
22
61
|
unsubscribe();
|
|
62
|
+
await worker?.stop();
|
|
23
63
|
await flush();
|
|
24
64
|
await database.close();
|
|
25
65
|
};
|
|
26
|
-
return { flush, dispose };
|
|
66
|
+
return { flush, dispose, db: database, embed: options.embed };
|
|
67
|
+
}
|
|
68
|
+
function defaultEmbeddingLogPath() {
|
|
69
|
+
return join(homedir(), ".duet", "logs", "memory-backfill.log");
|
|
27
70
|
}
|
|
28
71
|
async function openMemoryDatabase(path) {
|
|
29
|
-
|
|
72
|
+
// Migrations double as the corruption probe: a failure inside
|
|
73
|
+
// runMigrations propagates through openPGlite's try block, which
|
|
74
|
+
// moves the directory aside and starts fresh rather than wedging
|
|
75
|
+
// the agent behind an opaque PGlite abort.
|
|
76
|
+
return openPGlite(path, {
|
|
77
|
+
init: async (db) => {
|
|
78
|
+
await runMigrations(db);
|
|
79
|
+
},
|
|
80
|
+
});
|
|
30
81
|
}
|
|
31
82
|
async function readMemorySnapshot(database) {
|
|
32
|
-
const result = await database.query(`SELECT id, created_at, observed_date, referenced_date, relative_date, time_of_day, priority,
|
|
83
|
+
const result = await database.query(`SELECT id, created_at, session_id, kind, observed_date, referenced_date, relative_date, time_of_day, priority, source_json, content, tags_json
|
|
33
84
|
FROM observations
|
|
34
85
|
ORDER BY created_at ASC`);
|
|
35
86
|
const observations = result.rows.map(rowToObservation);
|
|
@@ -64,28 +115,30 @@ async function syncObservations(database, observations) {
|
|
|
64
115
|
}
|
|
65
116
|
async function upsertObservation(database, observation) {
|
|
66
117
|
await database.query(`INSERT INTO observations (
|
|
67
|
-
id, created_at, observed_date, referenced_date, relative_date, time_of_day,
|
|
68
|
-
priority,
|
|
69
|
-
) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)
|
|
118
|
+
id, created_at, session_id, kind, observed_date, referenced_date, relative_date, time_of_day,
|
|
119
|
+
priority, source_json, content, tags_json
|
|
120
|
+
) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)
|
|
70
121
|
ON CONFLICT (id) DO UPDATE SET
|
|
71
122
|
created_at = EXCLUDED.created_at,
|
|
123
|
+
session_id = EXCLUDED.session_id,
|
|
124
|
+
kind = EXCLUDED.kind,
|
|
72
125
|
observed_date = EXCLUDED.observed_date,
|
|
73
126
|
referenced_date = EXCLUDED.referenced_date,
|
|
74
127
|
relative_date = EXCLUDED.relative_date,
|
|
75
128
|
time_of_day = EXCLUDED.time_of_day,
|
|
76
129
|
priority = EXCLUDED.priority,
|
|
77
|
-
scope = EXCLUDED.scope,
|
|
78
130
|
source_json = EXCLUDED.source_json,
|
|
79
131
|
content = EXCLUDED.content,
|
|
80
132
|
tags_json = EXCLUDED.tags_json`, [
|
|
81
133
|
observation.id,
|
|
82
134
|
observation.createdAt,
|
|
135
|
+
observation.sessionId ?? null,
|
|
136
|
+
observation.kind,
|
|
83
137
|
observation.observedDate,
|
|
84
138
|
observation.referencedDate ?? null,
|
|
85
139
|
observation.relativeDate ?? null,
|
|
86
140
|
observation.timeOfDay ?? null,
|
|
87
141
|
observation.priority,
|
|
88
|
-
observation.scope,
|
|
89
142
|
JSON.stringify(observation.source),
|
|
90
143
|
observation.content,
|
|
91
144
|
JSON.stringify(observation.tags),
|
|
@@ -101,12 +154,13 @@ function rowToObservation(row) {
|
|
|
101
154
|
return {
|
|
102
155
|
id: row.id,
|
|
103
156
|
createdAt: row.created_at,
|
|
157
|
+
...(row.session_id !== null ? { sessionId: row.session_id } : {}),
|
|
158
|
+
kind: row.kind,
|
|
104
159
|
observedDate: row.observed_date,
|
|
105
|
-
referencedDate: row.referenced_date
|
|
106
|
-
relativeDate: row.relative_date
|
|
107
|
-
timeOfDay: row.time_of_day
|
|
160
|
+
...(row.referenced_date !== null ? { referencedDate: row.referenced_date } : {}),
|
|
161
|
+
...(row.relative_date !== null ? { relativeDate: row.relative_date } : {}),
|
|
162
|
+
...(row.time_of_day !== null ? { timeOfDay: row.time_of_day } : {}),
|
|
108
163
|
priority: row.priority,
|
|
109
|
-
scope: row.scope,
|
|
110
164
|
source: JSON.parse(row.source_json),
|
|
111
165
|
content: row.content,
|
|
112
166
|
tags: JSON.parse(row.tags_json),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../src/memory/storage.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../src/memory/storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,45 @@
|
|
|
1
1
|
import type { MemoryStoreEventHandler, Observation, ObservationQuery, ObservationalMemorySnapshot } from "../types/memory.js";
|
|
2
|
+
/**
|
|
3
|
+
* Frozen view of memory rendered into the prompt prefix. Captured at
|
|
4
|
+
* compaction events (initial load, reflector completion, wire-shaping
|
|
5
|
+
* eviction) and held immutable between events so the rendered prefix
|
|
6
|
+
* stays content-deterministic across turns. The provider's prompt
|
|
7
|
+
* cache survives unchanged until the next compaction event, at which
|
|
8
|
+
* point exactly one cache invalidation is paid — not one per turn.
|
|
9
|
+
*
|
|
10
|
+
* Observations the observer writes mid-session still flow to the
|
|
11
|
+
* database in real time; they just do not enter `contextPack` until
|
|
12
|
+
* the next refresh. The model still sees them through `recall_memory`
|
|
13
|
+
* if it asks.
|
|
14
|
+
*/
|
|
15
|
+
export interface ContextPack {
|
|
16
|
+
/** Cross-session ranked memory; rendered above the local section. */
|
|
17
|
+
global: Observation[];
|
|
18
|
+
/** Current session's chronological compaction summary; rendered below global. */
|
|
19
|
+
local: Observation[];
|
|
20
|
+
}
|
|
2
21
|
export declare class MemoryStore {
|
|
3
22
|
private observations;
|
|
4
23
|
private handlers;
|
|
24
|
+
private contextPack;
|
|
5
25
|
on(handler: MemoryStoreEventHandler): () => void;
|
|
6
26
|
appendObservation(input: Omit<Observation, "id" | "createdAt">): Promise<Observation>;
|
|
7
27
|
recall(query: ObservationQuery): Promise<Observation[]>;
|
|
8
28
|
getSnapshot(): Promise<ObservationalMemorySnapshot>;
|
|
9
29
|
replaceObservations(observations: Observation[]): Promise<void>;
|
|
10
|
-
|
|
30
|
+
/**
|
|
31
|
+
* Replace the frozen view used by the runner's context transform.
|
|
32
|
+
* Called by `rebuildMemoryContextPack()` at compaction events and by
|
|
33
|
+
* `loadStoredMemory()` after the initial database seed.
|
|
34
|
+
*
|
|
35
|
+
* Holding the pack here (rather than recomputing inside the transform
|
|
36
|
+
* on every dispatch) is the entire point of the cache-stability
|
|
37
|
+
* design: until the next refresh, every turn renders exactly the
|
|
38
|
+
* same memory prefix.
|
|
39
|
+
*/
|
|
40
|
+
setContextPack(pack: ContextPack): void;
|
|
41
|
+
/** Current frozen pack. Returns empty arrays when memory is disabled or pre-compaction. */
|
|
42
|
+
getContextPack(): ContextPack;
|
|
11
43
|
private emit;
|
|
12
44
|
}
|
|
13
45
|
//# sourceMappingURL=store.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/memory/store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,uBAAuB,EACvB,WAAW,EAEX,gBAAgB,EAChB,2BAA2B,EAC5B,MAAM,oBAAoB,CAAC;AAE5B,qBAAa,WAAW;IACtB,OAAO,CAAC,YAAY,CAAuC;IAC3D,OAAO,CAAC,QAAQ,CAAsC;
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/memory/store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,uBAAuB,EACvB,WAAW,EAEX,gBAAgB,EAChB,2BAA2B,EAC5B,MAAM,oBAAoB,CAAC;AAE5B;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,WAAW;IAC1B,qEAAqE;IACrE,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,iFAAiF;IACjF,KAAK,EAAE,WAAW,EAAE,CAAC;CACtB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,YAAY,CAAuC;IAC3D,OAAO,CAAC,QAAQ,CAAsC;IACtD,OAAO,CAAC,WAAW,CAA0C;IAE7D,EAAE,CAAC,OAAO,EAAE,uBAAuB,GAAG,MAAM,IAAI;IAO1C,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;IAWrF,MAAM,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IA6BvD,WAAW,IAAI,OAAO,CAAC,2BAA2B,CAAC;IAcnD,mBAAmB,CAAC,YAAY,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAQrE;;;;;;;;;OASG;IACH,cAAc,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI;IAIvC,2FAA2F;IAC3F,cAAc,IAAI,WAAW;IAI7B,OAAO,CAAC,IAAI;CAKb"}
|
package/dist/src/memory/store.js
CHANGED
|
@@ -2,6 +2,7 @@ import { nanoid } from "nanoid";
|
|
|
2
2
|
export class MemoryStore {
|
|
3
3
|
observations = new Map();
|
|
4
4
|
handlers = new Set();
|
|
5
|
+
contextPack = { global: [], local: [] };
|
|
5
6
|
on(handler) {
|
|
6
7
|
this.handlers.add(handler);
|
|
7
8
|
return () => {
|
|
@@ -20,8 +21,11 @@ export class MemoryStore {
|
|
|
20
21
|
}
|
|
21
22
|
async recall(query) {
|
|
22
23
|
let candidates = Array.from(this.observations.values());
|
|
23
|
-
if (query.
|
|
24
|
-
candidates = candidates.filter((observation) => observation.
|
|
24
|
+
if (query.sessionId !== undefined) {
|
|
25
|
+
candidates = candidates.filter((observation) => observation.sessionId === query.sessionId);
|
|
26
|
+
}
|
|
27
|
+
if (query.kind) {
|
|
28
|
+
candidates = candidates.filter((observation) => observation.kind === query.kind);
|
|
25
29
|
}
|
|
26
30
|
if (query.tags?.length) {
|
|
27
31
|
candidates = candidates.filter((observation) => query.tags.some((tag) => observation.tags.includes(tag)));
|
|
@@ -57,12 +61,22 @@ export class MemoryStore {
|
|
|
57
61
|
}
|
|
58
62
|
this.emit({ type: "observations_replaced", observations });
|
|
59
63
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
64
|
+
/**
|
|
65
|
+
* Replace the frozen view used by the runner's context transform.
|
|
66
|
+
* Called by `rebuildMemoryContextPack()` at compaction events and by
|
|
67
|
+
* `loadStoredMemory()` after the initial database seed.
|
|
68
|
+
*
|
|
69
|
+
* Holding the pack here (rather than recomputing inside the transform
|
|
70
|
+
* on every dispatch) is the entire point of the cache-stability
|
|
71
|
+
* design: until the next refresh, every turn renders exactly the
|
|
72
|
+
* same memory prefix.
|
|
73
|
+
*/
|
|
74
|
+
setContextPack(pack) {
|
|
75
|
+
this.contextPack = pack;
|
|
76
|
+
}
|
|
77
|
+
/** Current frozen pack. Returns empty arrays when memory is disabled or pre-compaction. */
|
|
78
|
+
getContextPack() {
|
|
79
|
+
return this.contextPack;
|
|
66
80
|
}
|
|
67
81
|
emit(event) {
|
|
68
82
|
for (const handler of this.handlers) {
|
|
@@ -76,14 +90,6 @@ function createMemoryId() {
|
|
|
76
90
|
function priorityRank(priority) {
|
|
77
91
|
return priority === "high" ? 3 : priority === "medium" ? 2 : 1;
|
|
78
92
|
}
|
|
79
|
-
function priorityMarker(priority) {
|
|
80
|
-
return priority === "high" ? "HIGH" : priority === "medium" ? "MED" : "LOW";
|
|
81
|
-
}
|
|
82
|
-
function formatObservation(observation) {
|
|
83
|
-
const time = observation.timeOfDay ? ` ${observation.timeOfDay}` : "";
|
|
84
|
-
const referenced = observation.referencedDate ? ` [ref: ${observation.referencedDate}]` : "";
|
|
85
|
-
return `- ${priorityMarker(observation.priority)} ${observation.observedDate}${time}${referenced} ${observation.content}`;
|
|
86
|
-
}
|
|
87
93
|
function tokenize(text) {
|
|
88
94
|
return new Set(text
|
|
89
95
|
.toLowerCase()
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/memory/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/memory/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AA8BhC,MAAM,OAAO,WAAW;IACd,YAAY,GAA6B,IAAI,GAAG,EAAE,CAAC;IACnD,QAAQ,GAAG,IAAI,GAAG,EAA2B,CAAC;IAC9C,WAAW,GAAgB,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAE7D,EAAE,CAAC,OAAgC;QACjC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3B,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,KAA4C;QAClE,MAAM,WAAW,GAAgB;YAC/B,GAAG,KAAK;YACR,EAAE,EAAE,cAAc,EAAE;YACpB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;QACF,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;QACnD,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,WAAW,EAAE,CAAC,CAAC;QACzD,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAuB;QAClC,IAAI,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;QAExD,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YAClC,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,CAAC,CAAC;QAC7F,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC;QACnF,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;YACvB,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE,CAC7C,KAAK,CAAC,IAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAC1D,CAAC;QACJ,CAAC;QACD,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAChD,UAAU,GAAG,UAAU,CAAC,MAAM,CAC5B,CAAC,WAAW,EAAE,EAAE,CAAC,YAAY,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,OAAO,CAC/D,CAAC;QACJ,CAAC;QACD,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAChB,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACpC,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;QACpF,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;QACvD,CAAC;QACD,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,WAAW;QACf,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAC9D,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CACpC,CAAC;QACF,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,OAAO;YACL,YAAY;YACZ,eAAe,EAAE;gBACf,YAAY,EAAE,cAAc,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aAClF;YACD,SAAS;SACV,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,YAA2B;QACnD,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QAC1B,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;YACvC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;QACrD,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,YAAY,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED;;;;;;;;;OASG;IACH,cAAc,CAAC,IAAiB;QAC9B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC1B,CAAC;IAED,2FAA2F;IAC3F,cAAc;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAEO,IAAI,CAAC,KAAuB;QAClC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpC,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;CACF;AAED,SAAS,cAAc;IACrB,OAAO,OAAO,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;AAC7B,CAAC;AAED,SAAS,YAAY,CAAC,QAA6B;IACjD,OAAO,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,OAAO,IAAI,GAAG,CACZ,IAAI;SACD,WAAW,EAAE;SACb,KAAK,CAAC,YAAY,CAAC;SACnB,MAAM,CAAC,OAAO,CAAC,CACnB,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,WAAwB,EAAE,KAAkB;IAC7D,MAAM,IAAI,GAAG,GAAG,WAAW,CAAC,OAAO,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;IAClF,IAAI,KAAK,GAAG,YAAY,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC/C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACpC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/session/session.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/session/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -43,7 +43,11 @@ export class Session {
|
|
|
43
43
|
this.config = config;
|
|
44
44
|
this.id = options.id;
|
|
45
45
|
this.resumeFromStorage = options.resumeFromStorage ?? Boolean(options.id);
|
|
46
|
-
|
|
46
|
+
// Thread the session id into the runner config so observations the
|
|
47
|
+
// observer/reflector write are tagged with this session. The memory
|
|
48
|
+
// loader uses session id to separate local memory (this session) from
|
|
49
|
+
// global memory (every other session, ranked into a budget).
|
|
50
|
+
this.runner = options.runner ?? new TurnRunner({ ...config, sessionId: options.id });
|
|
47
51
|
this.sessionPath = options.sessionPath;
|
|
48
52
|
this.unsubscribeRunner = this.runner.subscribe((event) => void this.handleTurnEvent(event));
|
|
49
53
|
}
|