@duetso/agent 0.1.99 → 0.1.102
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/dist/package.json +1 -1
- package/dist/src/memory/context-pack.d.ts +2 -2
- package/dist/src/memory/context-pack.d.ts.map +1 -1
- package/dist/src/memory/context-pack.js +21 -16
- package/dist/src/memory/context-pack.js.map +1 -1
- package/dist/src/memory/embedding-worker.d.ts +46 -3
- package/dist/src/memory/embedding-worker.d.ts.map +1 -1
- package/dist/src/memory/embedding-worker.js +139 -37
- package/dist/src/memory/embedding-worker.js.map +1 -1
- package/dist/src/memory/observational.d.ts +8 -3
- package/dist/src/memory/observational.d.ts.map +1 -1
- package/dist/src/memory/observational.js +10 -10
- package/dist/src/memory/observational.js.map +1 -1
- package/dist/src/memory/pglite.d.ts +57 -17
- package/dist/src/memory/pglite.d.ts.map +1 -1
- package/dist/src/memory/pglite.js +153 -140
- package/dist/src/memory/pglite.js.map +1 -1
- package/dist/src/memory/recall.d.ts +9 -2
- package/dist/src/memory/recall.d.ts.map +1 -1
- package/dist/src/memory/recall.js +23 -20
- package/dist/src/memory/recall.js.map +1 -1
- package/dist/src/memory/session.d.ts +78 -0
- package/dist/src/memory/session.d.ts.map +1 -0
- package/dist/src/memory/session.js +198 -0
- package/dist/src/memory/session.js.map +1 -0
- package/dist/src/memory/storage.d.ts +29 -15
- package/dist/src/memory/storage.d.ts.map +1 -1
- package/dist/src/memory/storage.js +80 -54
- package/dist/src/memory/storage.js.map +1 -1
- package/dist/src/turn-runner/tools.d.ts +8 -6
- package/dist/src/turn-runner/tools.d.ts.map +1 -1
- package/dist/src/turn-runner/tools.js +3 -3
- package/dist/src/turn-runner/tools.js.map +1 -1
- package/dist/src/turn-runner/turn-runner.d.ts.map +1 -1
- package/dist/src/turn-runner/turn-runner.js +14 -6
- package/dist/src/turn-runner/turn-runner.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pglite.js","sourceRoot":"","sources":["../../../src/memory/pglite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AACrD,OAAO,EACL,SAAS,EACT,SAAS,EACT,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,UAAU,EACV,SAAS,GACV,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAElE;;;;;;;GAOG;AACH,MAAM,iBAAiB,GAAG,EAAE,MAAM,EAAW,CAAC;AAE9C;;;;GAIG;AACH,MAAM,cAAc,GAAG,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"pglite.js","sourceRoot":"","sources":["../../../src/memory/pglite.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,16 @@
|
|
|
1
|
-
import type { PGlite } from "@electric-sql/pglite";
|
|
2
1
|
import type { Observation } from "../types/memory.js";
|
|
3
2
|
import type { EmbedFn } from "./embedding.js";
|
|
3
|
+
import type { MemorySession } from "./session.js";
|
|
4
4
|
export type RecallScope = "session" | "global" | "all";
|
|
5
5
|
export interface RecallMemoryOptions {
|
|
6
|
-
|
|
6
|
+
/**
|
|
7
|
+
* Memory session that owns the PGlite handle and cross-process lock.
|
|
8
|
+
* The recall call wraps every query in a single `withDb` so keyword,
|
|
9
|
+
* vector, and hydration all run against the same open. When the lock
|
|
10
|
+
* cannot be acquired, recall returns an empty result instead of
|
|
11
|
+
* throwing so the tool surface degrades gracefully.
|
|
12
|
+
*/
|
|
13
|
+
session: MemorySession;
|
|
7
14
|
/**
|
|
8
15
|
* Embedding callable. When omitted (or when it throws) the vector
|
|
9
16
|
* path is skipped silently and recall falls back to keyword-only.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recall.d.ts","sourceRoot":"","sources":["../../../src/memory/recall.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"recall.d.ts","sourceRoot":"","sources":["../../../src/memory/recall.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAwC,MAAM,oBAAoB,CAAC;AAC5F,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAkClD,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,KAAK,CAAC;AAEvD,MAAM,WAAW,mBAAmB;IAClC;;;;;;OAMG;IACH,OAAO,EAAE,aAAa,CAAC;IACvB;;;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,CAoC5F;AAED,UAAU,SAAS;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAsGD;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,SAAS,EAAE,EAAE,GAAG,MAAM,EAAE,CAqBzE"}
|
|
@@ -36,27 +36,30 @@ export async function recallMemory(options) {
|
|
|
36
36
|
if (scope === "session" && !options.sessionId) {
|
|
37
37
|
return { observations: [], vectorSearchAttempted: false, vectorSearchSucceeded: false };
|
|
38
38
|
}
|
|
39
|
-
const
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
39
|
+
const result = await options.session.withDb(async (db) => {
|
|
40
|
+
const keywordHits = await keywordSearch(db, options.query, scope, options.sessionId);
|
|
41
|
+
let vectorAttempted = false;
|
|
42
|
+
let vectorHits = [];
|
|
43
|
+
if (options.embed) {
|
|
44
|
+
vectorAttempted = true;
|
|
45
|
+
try {
|
|
46
|
+
vectorHits = await vectorSearch(db, options.embed, options.query, scope, options.sessionId);
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
// Embedding unavailable, network blip, or empty index — drop
|
|
50
|
+
// back to keyword-only. Caller surfaces the degraded mode.
|
|
51
|
+
vectorHits = [];
|
|
52
|
+
}
|
|
51
53
|
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
};
|
|
54
|
+
const fusedIds = reciprocalRankFusion([keywordHits, vectorHits]).slice(0, limit);
|
|
55
|
+
const observations = await hydrate(db, fusedIds);
|
|
56
|
+
return {
|
|
57
|
+
observations,
|
|
58
|
+
vectorSearchAttempted: vectorAttempted,
|
|
59
|
+
vectorSearchSucceeded: vectorHits.length > 0,
|
|
60
|
+
};
|
|
61
|
+
});
|
|
62
|
+
return result ?? { observations: [], vectorSearchAttempted: false, vectorSearchSucceeded: false };
|
|
60
63
|
}
|
|
61
64
|
async function keywordSearch(db, query, scope, sessionId) {
|
|
62
65
|
const trimmed = query.trim();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recall.js","sourceRoot":"","sources":["../../../src/memory/recall.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"recall.js","sourceRoot":"","sources":["../../../src/memory/recall.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type { PGlite } from "@electric-sql/pglite";
|
|
2
|
+
import { type OpenPGliteOptions } from "./pglite.js";
|
|
3
|
+
export interface MemorySessionOptions {
|
|
4
|
+
/** Absolute path to the PGlite data directory. */
|
|
5
|
+
path: string;
|
|
6
|
+
/**
|
|
7
|
+
* Passed through to `openPGliteHoldingLock` on each open — typically
|
|
8
|
+
* supplies `init` (migrations) and `onRecover` (quarantine surface).
|
|
9
|
+
*/
|
|
10
|
+
openOptions: OpenPGliteOptions;
|
|
11
|
+
/**
|
|
12
|
+
* How long to keep the handle open after the last in-flight op
|
|
13
|
+
* resolves. A new `withDb` call within this window reuses the open
|
|
14
|
+
* handle and cancels the pending close. Defaults to 2s.
|
|
15
|
+
*/
|
|
16
|
+
idleCloseMs?: number;
|
|
17
|
+
/**
|
|
18
|
+
* Wall-time budget for waiting on the cross-process lock before a
|
|
19
|
+
* single `withDb` call gives up. On exhaustion the call resolves to
|
|
20
|
+
* `undefined` and `onWarn` is invoked once. Defaults to 30s.
|
|
21
|
+
*/
|
|
22
|
+
lockWaitBudgetMs?: number;
|
|
23
|
+
/**
|
|
24
|
+
* Invoked once when a `withDb` call is skipped because the lock
|
|
25
|
+
* could not be acquired within `lockWaitBudgetMs`. Lets the host
|
|
26
|
+
* surface a single user-visible warning instead of repeating per
|
|
27
|
+
* skipped op.
|
|
28
|
+
*/
|
|
29
|
+
onWarn?: (message: string) => void;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Manages a single PGlite handle for one dataDir across many short
|
|
33
|
+
* bursts of work. Refcounted opens keep the handle (and the
|
|
34
|
+
* cross-process `.duet-open.lock`) alive while any `withDb` is
|
|
35
|
+
* in-flight; an idle timer releases both shortly after the last op
|
|
36
|
+
* resolves so a peer process can step in.
|
|
37
|
+
*
|
|
38
|
+
* Concurrent in-process `withDb` calls share one `PGlite.create`: the
|
|
39
|
+
* first call allocates `this.opening` and every other call awaits the
|
|
40
|
+
* same promise, so two opens cannot race into `init` and double-run
|
|
41
|
+
* migrations against a fresh dataDir.
|
|
42
|
+
*/
|
|
43
|
+
export declare class MemorySession {
|
|
44
|
+
private readonly path;
|
|
45
|
+
private readonly openOptions;
|
|
46
|
+
private readonly idleCloseMs;
|
|
47
|
+
private readonly lockWaitBudgetMs;
|
|
48
|
+
private readonly onWarn?;
|
|
49
|
+
private db;
|
|
50
|
+
private lockPath;
|
|
51
|
+
private opening;
|
|
52
|
+
private refs;
|
|
53
|
+
private idleTimer;
|
|
54
|
+
private disposed;
|
|
55
|
+
private disposing;
|
|
56
|
+
constructor(opts: MemorySessionOptions);
|
|
57
|
+
/**
|
|
58
|
+
* Run `fn` against the (lazily-opened) memory database. Returns
|
|
59
|
+
* `undefined` without invoking `fn` when the session is disposed or
|
|
60
|
+
* the lock could not be acquired within the budget; otherwise
|
|
61
|
+
* returns whatever `fn` returns. Errors thrown inside `fn`
|
|
62
|
+
* propagate.
|
|
63
|
+
*/
|
|
64
|
+
withDb<T>(fn: (db: PGlite) => Promise<T>): Promise<T | undefined>;
|
|
65
|
+
/**
|
|
66
|
+
* Wait for any in-flight `withDb` to drain, cancel a pending idle
|
|
67
|
+
* close, then close the handle and release the lock. Subsequent
|
|
68
|
+
* `withDb` calls resolve to `undefined`.
|
|
69
|
+
*/
|
|
70
|
+
dispose(): Promise<void>;
|
|
71
|
+
private runDispose;
|
|
72
|
+
private ensureOpen;
|
|
73
|
+
private openWithPolling;
|
|
74
|
+
private scheduleIdleClose;
|
|
75
|
+
private cancelIdleClose;
|
|
76
|
+
private closeNow;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/memory/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAEL,KAAK,iBAAiB,EAIvB,MAAM,aAAa,CAAC;AA4BrB,MAAM,WAAW,oBAAoB;IACnC,kDAAkD;IAClD,IAAI,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,WAAW,EAAE,iBAAiB,CAAC;IAC/B;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;;OAKG;IACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAoB;IAChD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAA4B;IAEpD,OAAO,CAAC,EAAE,CAAqB;IAC/B,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,OAAO,CAA0C;IACzD,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,SAAS,CAA4C;IAC7D,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,SAAS,CAA4B;gBAEjC,IAAI,EAAE,oBAAoB;IAQtC;;;;;;OAMG;IACG,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IA0BvE;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;YAMhB,UAAU;YAYV,UAAU;YAqBV,eAAe;IAwB7B,OAAO,CAAC,iBAAiB;IAWzB,OAAO,CAAC,eAAe;YAOT,QAAQ;CAevB"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { MemoryLockTimeoutError, openPGliteHoldingLock, releaseOpenLock, tryAcquireOpenLock, } from "./pglite.js";
|
|
2
|
+
/**
|
|
3
|
+
* Default time the PGlite handle stays open after the last `withDb`
|
|
4
|
+
* call resolves before it is closed and the cross-process lock is
|
|
5
|
+
* released. Keeps short bursts of writes (observer + reflector +
|
|
6
|
+
* embedding upserts in the same turn) on one open without making a
|
|
7
|
+
* sitting CLI permanently hold the lock against a second CLI.
|
|
8
|
+
*/
|
|
9
|
+
const DEFAULT_IDLE_CLOSE_MS = 2_000;
|
|
10
|
+
/**
|
|
11
|
+
* Default total wall-time budget for waiting on the cross-process
|
|
12
|
+
* open-lock. Generous enough to outlast a moderate write burst from a
|
|
13
|
+
* concurrent duet CLI but bounded so a wedged peer cannot stall the
|
|
14
|
+
* caller's turn indefinitely; on exhaustion `withDb` resolves to
|
|
15
|
+
* `undefined` and the caller degrades gracefully.
|
|
16
|
+
*/
|
|
17
|
+
const DEFAULT_LOCK_WAIT_BUDGET_MS = 30_000;
|
|
18
|
+
/**
|
|
19
|
+
* Exponential backoff schedule used while polling for the open-lock.
|
|
20
|
+
* Doubles from 50ms up to a 1s ceiling so a peer that releases the
|
|
21
|
+
* lock during an idle-close gap is picked up within ~50ms, while a
|
|
22
|
+
* long-running peer does not produce a poll storm.
|
|
23
|
+
*/
|
|
24
|
+
const POLL_BACKOFF_MS = [50, 100, 200, 400, 800, 1000];
|
|
25
|
+
/**
|
|
26
|
+
* Manages a single PGlite handle for one dataDir across many short
|
|
27
|
+
* bursts of work. Refcounted opens keep the handle (and the
|
|
28
|
+
* cross-process `.duet-open.lock`) alive while any `withDb` is
|
|
29
|
+
* in-flight; an idle timer releases both shortly after the last op
|
|
30
|
+
* resolves so a peer process can step in.
|
|
31
|
+
*
|
|
32
|
+
* Concurrent in-process `withDb` calls share one `PGlite.create`: the
|
|
33
|
+
* first call allocates `this.opening` and every other call awaits the
|
|
34
|
+
* same promise, so two opens cannot race into `init` and double-run
|
|
35
|
+
* migrations against a fresh dataDir.
|
|
36
|
+
*/
|
|
37
|
+
export class MemorySession {
|
|
38
|
+
path;
|
|
39
|
+
openOptions;
|
|
40
|
+
idleCloseMs;
|
|
41
|
+
lockWaitBudgetMs;
|
|
42
|
+
onWarn;
|
|
43
|
+
db;
|
|
44
|
+
lockPath;
|
|
45
|
+
opening;
|
|
46
|
+
refs = 0;
|
|
47
|
+
idleTimer;
|
|
48
|
+
disposed = false;
|
|
49
|
+
disposing;
|
|
50
|
+
constructor(opts) {
|
|
51
|
+
this.path = opts.path;
|
|
52
|
+
this.openOptions = opts.openOptions;
|
|
53
|
+
this.idleCloseMs = opts.idleCloseMs ?? DEFAULT_IDLE_CLOSE_MS;
|
|
54
|
+
this.lockWaitBudgetMs = opts.lockWaitBudgetMs ?? DEFAULT_LOCK_WAIT_BUDGET_MS;
|
|
55
|
+
if (opts.onWarn)
|
|
56
|
+
this.onWarn = opts.onWarn;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Run `fn` against the (lazily-opened) memory database. Returns
|
|
60
|
+
* `undefined` without invoking `fn` when the session is disposed or
|
|
61
|
+
* the lock could not be acquired within the budget; otherwise
|
|
62
|
+
* returns whatever `fn` returns. Errors thrown inside `fn`
|
|
63
|
+
* propagate.
|
|
64
|
+
*/
|
|
65
|
+
async withDb(fn) {
|
|
66
|
+
if (this.disposed)
|
|
67
|
+
return undefined;
|
|
68
|
+
this.cancelIdleClose();
|
|
69
|
+
// Increment refs before awaiting the open so a concurrent
|
|
70
|
+
// `dispose()` waits for this call to finish even if the await on
|
|
71
|
+
// `ensureOpen` resolves before fn runs. Without this, dispose
|
|
72
|
+
// could see refs=0, close the handle, and leave fn to run against
|
|
73
|
+
// a closed db.
|
|
74
|
+
this.refs++;
|
|
75
|
+
try {
|
|
76
|
+
const db = await this.ensureOpen();
|
|
77
|
+
if (!db)
|
|
78
|
+
return undefined;
|
|
79
|
+
// Once the handle is open, run fn even if dispose was called
|
|
80
|
+
// while we were waiting on `ensureOpen`. dispose's drain loop
|
|
81
|
+
// waits for refs to reach zero, so the call completes against
|
|
82
|
+
// a still-open db; without this we would silently skip fn even
|
|
83
|
+
// though the caller had already committed to running it.
|
|
84
|
+
return await fn(db);
|
|
85
|
+
}
|
|
86
|
+
finally {
|
|
87
|
+
this.refs--;
|
|
88
|
+
if (this.refs === 0 && !this.disposed) {
|
|
89
|
+
this.scheduleIdleClose();
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Wait for any in-flight `withDb` to drain, cancel a pending idle
|
|
95
|
+
* close, then close the handle and release the lock. Subsequent
|
|
96
|
+
* `withDb` calls resolve to `undefined`.
|
|
97
|
+
*/
|
|
98
|
+
async dispose() {
|
|
99
|
+
if (this.disposing)
|
|
100
|
+
return this.disposing;
|
|
101
|
+
this.disposing = this.runDispose();
|
|
102
|
+
return this.disposing;
|
|
103
|
+
}
|
|
104
|
+
async runDispose() {
|
|
105
|
+
this.disposed = true;
|
|
106
|
+
this.cancelIdleClose();
|
|
107
|
+
// Wait for in-flight withDb fns to settle. Polling is fine here:
|
|
108
|
+
// dispose is rare and refs decrements happen on microtask
|
|
109
|
+
// boundaries, so this loop spins a few times at most.
|
|
110
|
+
while (this.refs > 0) {
|
|
111
|
+
await sleep(5);
|
|
112
|
+
}
|
|
113
|
+
await this.closeNow();
|
|
114
|
+
}
|
|
115
|
+
async ensureOpen() {
|
|
116
|
+
if (this.db)
|
|
117
|
+
return this.db;
|
|
118
|
+
if (this.opening)
|
|
119
|
+
return this.opening;
|
|
120
|
+
this.opening = this.openWithPolling()
|
|
121
|
+
.then((db) => {
|
|
122
|
+
this.db = db;
|
|
123
|
+
return db;
|
|
124
|
+
})
|
|
125
|
+
.catch((error) => {
|
|
126
|
+
if (error instanceof MemoryLockTimeoutError) {
|
|
127
|
+
this.onWarn?.("memory db busy, skipping op");
|
|
128
|
+
return undefined;
|
|
129
|
+
}
|
|
130
|
+
throw error;
|
|
131
|
+
})
|
|
132
|
+
.finally(() => {
|
|
133
|
+
this.opening = undefined;
|
|
134
|
+
});
|
|
135
|
+
return this.opening;
|
|
136
|
+
}
|
|
137
|
+
async openWithPolling() {
|
|
138
|
+
const start = Date.now();
|
|
139
|
+
let attempt = 0;
|
|
140
|
+
let lastHolderPid = 0;
|
|
141
|
+
while (true) {
|
|
142
|
+
const result = tryAcquireOpenLock(this.path);
|
|
143
|
+
if ("lockPath" in result) {
|
|
144
|
+
const opened = await openPGliteHoldingLock(this.path, this.openOptions, result.lockPath);
|
|
145
|
+
this.lockPath = opened.lockPath;
|
|
146
|
+
return opened.db;
|
|
147
|
+
}
|
|
148
|
+
lastHolderPid = result.holderPid;
|
|
149
|
+
const elapsed = Date.now() - start;
|
|
150
|
+
if (elapsed >= this.lockWaitBudgetMs) {
|
|
151
|
+
throw new MemoryLockTimeoutError(this.path, lastHolderPid, this.lockWaitBudgetMs);
|
|
152
|
+
}
|
|
153
|
+
const base = POLL_BACKOFF_MS[Math.min(attempt, POLL_BACKOFF_MS.length - 1)] ?? 1000;
|
|
154
|
+
const remaining = this.lockWaitBudgetMs - elapsed;
|
|
155
|
+
const delay = Math.max(1, Math.min(base, remaining));
|
|
156
|
+
attempt++;
|
|
157
|
+
await sleep(delay);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
scheduleIdleClose() {
|
|
161
|
+
this.cancelIdleClose();
|
|
162
|
+
this.idleTimer = setTimeout(() => {
|
|
163
|
+
this.idleTimer = undefined;
|
|
164
|
+
// Re-check refs in case a new withDb arrived between the timer
|
|
165
|
+
// firing and this callback running.
|
|
166
|
+
if (this.refs > 0 || this.disposed)
|
|
167
|
+
return;
|
|
168
|
+
void this.closeNow();
|
|
169
|
+
}, this.idleCloseMs);
|
|
170
|
+
}
|
|
171
|
+
cancelIdleClose() {
|
|
172
|
+
if (this.idleTimer) {
|
|
173
|
+
clearTimeout(this.idleTimer);
|
|
174
|
+
this.idleTimer = undefined;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
async closeNow() {
|
|
178
|
+
const db = this.db;
|
|
179
|
+
const lockPath = this.lockPath;
|
|
180
|
+
this.db = undefined;
|
|
181
|
+
this.lockPath = undefined;
|
|
182
|
+
if (db) {
|
|
183
|
+
try {
|
|
184
|
+
await db.close();
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
// PGlite occasionally throws on close after an aborted op;
|
|
188
|
+
// we still need to release the lock so a peer can open.
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
if (lockPath)
|
|
192
|
+
releaseOpenLock(lockPath);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
function sleep(ms) {
|
|
196
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/memory/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import type { PGlite } from "@electric-sql/pglite";
|
|
2
1
|
import type { Observation, ObservationalMemorySettings } from "../types/memory.js";
|
|
3
2
|
import type { EmbedFn } from "./embedding.js";
|
|
3
|
+
import { MemorySession } from "./session.js";
|
|
4
4
|
import type { MemoryContextCache } from "./store.js";
|
|
5
|
-
export type MemoryDatabase = PGlite;
|
|
6
5
|
/**
|
|
7
|
-
* Handle returned by `loadStoredMemory`. Callers
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
6
|
+
* Handle returned by `loadStoredMemory`. Callers pass `session` into the
|
|
7
|
+
* storage helpers, which each open the underlying PGlite handle just long
|
|
8
|
+
* enough to run their queries and then hand it back to the idle-close
|
|
9
|
+
* timer so a peer duet CLI can acquire the cross-process lock between
|
|
10
|
+
* bursts. `session` is undefined when memory persistence is disabled.
|
|
11
11
|
*/
|
|
12
12
|
export interface MemoryPersistenceHandle {
|
|
13
|
-
|
|
13
|
+
session: MemorySession | undefined;
|
|
14
14
|
embed: EmbedFn | undefined;
|
|
15
15
|
dispose: () => Promise<void>;
|
|
16
16
|
}
|
|
@@ -35,40 +35,54 @@ export interface LoadStoredMemoryOptions {
|
|
|
35
35
|
backupPath: string;
|
|
36
36
|
cause: unknown;
|
|
37
37
|
}) => void;
|
|
38
|
+
/**
|
|
39
|
+
* Invoked once when a `withDb` call is skipped because the cross-process
|
|
40
|
+
* open-lock could not be acquired within the wait budget. The runner
|
|
41
|
+
* surfaces this as a single user-visible system warning so two concurrent
|
|
42
|
+
* duet CLIs can coexist (one degrades to no-memory) without spamming the
|
|
43
|
+
* UI per skipped op.
|
|
44
|
+
*/
|
|
45
|
+
onWarn?: (message: string) => void;
|
|
38
46
|
}
|
|
39
47
|
export declare function loadStoredMemory(memoryPath: string | false | undefined, cwd: string, options?: LoadStoredMemoryOptions): Promise<MemoryPersistenceHandle>;
|
|
40
48
|
/**
|
|
41
49
|
* Insert a new observation row, materializing `id`, `createdAt`, and
|
|
42
50
|
* `lastUsedAt = createdAt`. Returns the populated `Observation` so
|
|
43
51
|
* callers can refer to the freshly-assigned id (e.g. to keep
|
|
44
|
-
* observation-group range markers consistent).
|
|
52
|
+
* observation-group range markers consistent). Returns `undefined`
|
|
53
|
+
* when the cross-process lock could not be acquired within the
|
|
54
|
+
* session's wait budget — writes are silently dropped in that case so
|
|
55
|
+
* a concurrent duet CLI does not crash the foreground turn.
|
|
45
56
|
*/
|
|
46
|
-
export declare function appendObservation(
|
|
57
|
+
export declare function appendObservation(session: MemorySession, input: Omit<Observation, "id" | "createdAt" | "lastUsedAt">): Promise<Observation | undefined>;
|
|
47
58
|
/**
|
|
48
59
|
* Replace this session's rows with the given list. Used by reflection,
|
|
49
60
|
* which condenses the session's observation log into one reflection
|
|
50
61
|
* row. Scoping the delete to `session_id = $1` is what makes the
|
|
51
62
|
* cross-session global pool durable: another session's rows are never
|
|
52
|
-
* touched by the current session's reflection.
|
|
63
|
+
* touched by the current session's reflection. No-op when the
|
|
64
|
+
* cross-process lock could not be acquired.
|
|
53
65
|
*/
|
|
54
|
-
export declare function replaceSessionObservations(
|
|
66
|
+
export declare function replaceSessionObservations(session: MemorySession, sessionId: string, observations: readonly Observation[]): Promise<void>;
|
|
55
67
|
/**
|
|
56
68
|
* Read this session's observations in chronological order along with a
|
|
57
69
|
* rough token count. Used by the observer (to gate reflection on
|
|
58
70
|
* cumulative session-local observation tokens) and by
|
|
59
71
|
* `getUnobservedMessageTail` to find the highest message id already
|
|
60
|
-
* folded into an observation-group range.
|
|
72
|
+
* folded into an observation-group range. Returns an empty snapshot
|
|
73
|
+
* when the cross-process lock could not be acquired.
|
|
61
74
|
*/
|
|
62
75
|
export interface SessionObservationsSnapshot {
|
|
63
76
|
observations: Observation[];
|
|
64
77
|
estimatedObservationTokens: number;
|
|
65
78
|
}
|
|
66
|
-
export declare function readSessionObservations(
|
|
79
|
+
export declare function readSessionObservations(session: MemorySession, sessionId: string): Promise<SessionObservationsSnapshot>;
|
|
67
80
|
/**
|
|
68
81
|
* Bump `last_used_at` for the given ids to `now`. Fire-and-forget
|
|
69
82
|
* usage signal: if the model's response leaned on a particular
|
|
70
83
|
* memory, that memory's ranking refreshes so it stays surfaced. No-op
|
|
71
|
-
* when `ids` is empty
|
|
84
|
+
* when `ids` is empty or when the cross-process lock could not be
|
|
85
|
+
* acquired.
|
|
72
86
|
*/
|
|
73
|
-
export declare function bumpLastUsed(
|
|
87
|
+
export declare function bumpLastUsed(session: MemorySession, ids: readonly string[], now: number): Promise<void>;
|
|
74
88
|
//# 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":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AACnF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAI9C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAGrD;;;;;;GAMG;AACH,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,aAAa,GAAG,SAAS,CAAC;IACnC,KAAK,EAAE,OAAO,GAAG,SAAS,CAAC;IAC3B,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iGAAiG;IACjG,WAAW,CAAC,EAAE;QACZ,KAAK,EAAE,kBAAkB,CAAC;QAC1B,QAAQ,EAAE,2BAA2B,CAAC;QACtC,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC;IACnE;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAED,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,EACtC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,uBAAuB,CAAC,CAwElC;AAMD;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,aAAa,EACtB,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,WAAW,GAAG,YAAY,CAAC,GAC1D,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAYlC;AAED;;;;;;;GAOG;AACH,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,aAAa,EACtB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,SAAS,WAAW,EAAE,GACnC,OAAO,CAAC,IAAI,CAAC,CAiBf;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,2BAA2B;IAC1C,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,0BAA0B,EAAE,MAAM,CAAC;CACpC;AAED,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,aAAa,EACtB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,2BAA2B,CAAC,CAmBtC;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,aAAa,EACtB,GAAG,EAAE,SAAS,MAAM,EAAE,EACtB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,IAAI,CAAC,CAQf"}
|