instar 1.2.74 → 1.2.76
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/commands/server.d.ts.map +1 -1
- package/dist/commands/server.js +43 -1
- package/dist/commands/server.js.map +1 -1
- package/dist/config/ConfigDefaults.d.ts.map +1 -1
- package/dist/config/ConfigDefaults.js +6 -0
- package/dist/config/ConfigDefaults.js.map +1 -1
- package/dist/core/Usher.d.ts +57 -0
- package/dist/core/Usher.d.ts.map +1 -0
- package/dist/core/Usher.js +179 -0
- package/dist/core/Usher.js.map +1 -0
- package/dist/core/UsherSignalStore.d.ts +58 -0
- package/dist/core/UsherSignalStore.d.ts.map +1 -0
- package/dist/core/UsherSignalStore.js +113 -0
- package/dist/core/UsherSignalStore.js.map +1 -0
- package/dist/core/types.d.ts +8 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/server/AgentServer.d.ts +2 -0
- package/dist/server/AgentServer.d.ts.map +1 -1
- package/dist/server/AgentServer.js +5 -0
- package/dist/server/AgentServer.js.map +1 -1
- package/dist/server/CapabilityIndex.d.ts.map +1 -1
- package/dist/server/CapabilityIndex.js +1 -0
- package/dist/server/CapabilityIndex.js.map +1 -1
- package/dist/server/usherRoutes.d.ts +16 -0
- package/dist/server/usherRoutes.d.ts.map +1 -0
- package/dist/server/usherRoutes.js +40 -0
- package/dist/server/usherRoutes.js.map +1 -0
- package/dist/threadline/ConversationStore.d.ts +53 -25
- package/dist/threadline/ConversationStore.d.ts.map +1 -1
- package/dist/threadline/ConversationStore.js +149 -68
- package/dist/threadline/ConversationStore.js.map +1 -1
- package/dist/threadline/ThreadResumeMap.d.ts +49 -116
- package/dist/threadline/ThreadResumeMap.d.ts.map +1 -1
- package/dist/threadline/ThreadResumeMap.js +194 -252
- package/dist/threadline/ThreadResumeMap.js.map +1 -1
- package/dist/threadline/ThreadlineObservability.d.ts +6 -1
- package/dist/threadline/ThreadlineObservability.d.ts.map +1 -1
- package/dist/threadline/ThreadlineObservability.js +17 -8
- package/dist/threadline/ThreadlineObservability.js.map +1 -1
- package/package.json +1 -1
- package/src/data/builtin-manifest.json +3 -3
- package/upgrades/1.2.75.md +69 -0
- package/upgrades/1.2.76.md +64 -0
- package/upgrades/side-effects/cwa-usher.md +82 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Usher HTTP routes — the read-only pull surface for the Usher's re-surface
|
|
3
|
+
* signals + precision metrics (rung 4). Signal-only: consumers PULL; the Usher
|
|
4
|
+
* never pushes to chat and never injects.
|
|
5
|
+
*
|
|
6
|
+
* GET /usher/signals?topicId=N — recent re-surface suggestions
|
|
7
|
+
* GET /usher/metrics?topicId=N — fired / acted precision funnel
|
|
8
|
+
*
|
|
9
|
+
* Operator-facing (INTERNAL_PREFIXES). Spec: docs/specs/cwa-usher.md §3–4.
|
|
10
|
+
*/
|
|
11
|
+
import { Router } from 'express';
|
|
12
|
+
import { z } from 'zod';
|
|
13
|
+
const TopicIdParam = z.coerce.number().int().nonnegative();
|
|
14
|
+
export function createUsherRoutes(deps) {
|
|
15
|
+
const router = Router();
|
|
16
|
+
const store = deps.signalStore;
|
|
17
|
+
if (!store) {
|
|
18
|
+
router.use('/usher', (_req, res) => res.status(503).json({ error: 'usher disabled' }));
|
|
19
|
+
return router;
|
|
20
|
+
}
|
|
21
|
+
router.get('/usher/signals', (req, res) => {
|
|
22
|
+
const parsed = TopicIdParam.safeParse(req.query.topicId);
|
|
23
|
+
if (!parsed.success)
|
|
24
|
+
return res.status(400).json({ error: 'topicId query param required' });
|
|
25
|
+
const limit = Math.min(50, Math.max(1, Number(req.query.limit) || 20));
|
|
26
|
+
res.json({ topicId: parsed.data, signals: store.getSignals(parsed.data, limit) });
|
|
27
|
+
});
|
|
28
|
+
router.get('/usher/metrics', (req, res) => {
|
|
29
|
+
const parsed = TopicIdParam.safeParse(req.query.topicId);
|
|
30
|
+
if (!parsed.success)
|
|
31
|
+
return res.status(400).json({ error: 'topicId query param required' });
|
|
32
|
+
const m = store.getMetrics(parsed.data);
|
|
33
|
+
// Precision = acted / fired (the read that gates rung 5; paired externally
|
|
34
|
+
// with the human-as-detector miss-map for the "what it missed" half).
|
|
35
|
+
const precision = m.fired > 0 ? m.acted / m.fired : null;
|
|
36
|
+
res.json({ topicId: parsed.data, metrics: { ...m, precision } });
|
|
37
|
+
});
|
|
38
|
+
return router;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=usherRoutes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usherRoutes.js","sourceRoot":"","sources":["../../src/server/usherRoutes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;AAE3D,MAAM,UAAU,iBAAiB,CAAC,IAA8C;IAC9E,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;IACxB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC;IAE/B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC;QACvF,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;QAC3D,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACzD,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,8BAA8B,EAAE,CAAC,CAAC;QAC5F,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACvE,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;QAC3D,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACzD,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,8BAA8B,EAAE,CAAC,CAAC;QAC5F,MAAM,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACxC,2EAA2E;QAC3E,sEAAsE;QACtE,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QACzD,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,GAAG,CAAC,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1,24 +1,29 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* ConversationStore — the single source of truth for a Threadline conversation.
|
|
3
3
|
*
|
|
4
|
-
* Phase 1 of the Threadline re-assessment (THREADLINE-CONVERSATION-KEYSTONE-SPEC.md)
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* the turn count + novelty hashes must live here, on the conversation.
|
|
4
|
+
* Phase 1 of the Threadline re-assessment (THREADLINE-CONVERSATION-KEYSTONE-SPEC.md)
|
|
5
|
+
* introduced this as a server-process in-memory store. Phase 2a
|
|
6
|
+
* (THREADLINE-SINGLE-STORE-SPEC.md / CMT-497) makes it **cross-process safe** so it
|
|
7
|
+
* can be the ONE authoritative store and the legacy `ThreadResumeMap` can become a
|
|
8
|
+
* view over it.
|
|
10
9
|
*
|
|
11
|
-
* Concurrency:
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* the legacy last-writer-wins
|
|
10
|
+
* Concurrency (Phase 2a): `conversations.json` on disk is the source of truth.
|
|
11
|
+
* Every write — async `mutate()` and sync `mutateSync()` — does reload-per-op +
|
|
12
|
+
* optimistic per-record version CAS + atomic tmp-write+rename, the same
|
|
13
|
+
* cross-process-safe pattern the legacy maps used (reload-per-op) hardened with a
|
|
14
|
+
* `version` token so a same-thread race loses no update (a strict improvement over
|
|
15
|
+
* the legacy last-writer-wins). A write reads the LATEST full file immediately
|
|
16
|
+
* before committing and rewrites it with only its own record changed, so a
|
|
17
|
+
* concurrent write to a DIFFERENT thread from another process is preserved — the
|
|
18
|
+
* only residual is the microsecond window between that final re-read and the
|
|
19
|
+
* atomic rename, which matches the (accepted, never-observed-as-a-problem) legacy
|
|
20
|
+
* full-file-rewrite behavior. Reads use a very-short-TTL snapshot cache so the
|
|
21
|
+
* loop gate's hot path doesn't re-read on every call; staleness only ever causes a
|
|
22
|
+
* redundant reload on the next mutate (which always re-reads), never a lost write.
|
|
17
23
|
*
|
|
18
|
-
* Storage: {stateDir}/threadline/conversations.json
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
* mutable state it logs transitions from.
|
|
24
|
+
* Storage: {stateDir}/threadline/conversations.json. NOT relay-hosted —
|
|
25
|
+
* authoritative state stays local. The append-only SharedStateLedger remains the
|
|
26
|
+
* audit trail; this is the live mutable state it logs transitions from.
|
|
22
27
|
*/
|
|
23
28
|
/**
|
|
24
29
|
* Conversation lifecycle state. Superset of the legacy `ThreadState`
|
|
@@ -90,13 +95,18 @@ export interface Conversation {
|
|
|
90
95
|
export type ConversationMutateFn = (draft: Conversation) => Conversation | Promise<Conversation>;
|
|
91
96
|
export declare class ConversationStore {
|
|
92
97
|
private filePath;
|
|
93
|
-
|
|
94
|
-
/** Per-threadId FIFO mutate queues — serialize concurrent writers. */
|
|
98
|
+
/** Per-threadId FIFO mutate queues — serialize same-process concurrent writers. */
|
|
95
99
|
private mutateQueues;
|
|
96
100
|
private mutateRunning;
|
|
97
101
|
/** Ephemeral verified-only peer-affinity hints (peerFingerprint → hint). */
|
|
98
102
|
private affinity;
|
|
103
|
+
/** Short-TTL read snapshot cache (disk is the source of truth). */
|
|
104
|
+
private cache;
|
|
105
|
+
private cacheAt;
|
|
99
106
|
constructor(stateDir: string);
|
|
107
|
+
/** A cached snapshot of the on-disk file (reloaded after READ_CACHE_TTL_MS). */
|
|
108
|
+
private snapshot;
|
|
109
|
+
private invalidateCache;
|
|
100
110
|
/** Get a conversation by threadId. Returns null if missing or TTL-expired. */
|
|
101
111
|
get(threadId: string): Conversation | null;
|
|
102
112
|
/** True if a (non-expired) conversation exists for the threadId. */
|
|
@@ -109,6 +119,8 @@ export declare class ConversationStore {
|
|
|
109
119
|
getByContextId(contextId: string, agentIdentity: string): Conversation | null;
|
|
110
120
|
/** List active/idle conversations (not resolved/failed/archived). */
|
|
111
121
|
listActive(): Conversation[];
|
|
122
|
+
/** All non-expired (or pinned) conversations, any lifecycle state. */
|
|
123
|
+
all(): Conversation[];
|
|
112
124
|
/** Total stored conversations (for monitoring). */
|
|
113
125
|
size(): number;
|
|
114
126
|
/**
|
|
@@ -128,11 +140,25 @@ export declare class ConversationStore {
|
|
|
128
140
|
private drainMutateQueue;
|
|
129
141
|
private applyMutationWithCAS;
|
|
130
142
|
/**
|
|
131
|
-
*
|
|
132
|
-
*
|
|
133
|
-
*
|
|
143
|
+
* Synchronous single-record mutate (Phase 2a). Used by the synchronous legacy
|
|
144
|
+
* interfaces (the `ThreadResumeMap` view's `save`/`remove`/etc.). Same file
|
|
145
|
+
* version-CAS as `mutate`, but the fn is synchronous so the re-read→write
|
|
146
|
+
* window has no await and is atomic within this process. Cross-process safety
|
|
147
|
+
* is identical to `mutate` (per-record version CAS + atomic rename).
|
|
148
|
+
*
|
|
149
|
+
* The fn MAY return null to signal "delete this record".
|
|
150
|
+
*/
|
|
151
|
+
mutateSync(threadId: string, fn: (draft: Conversation) => Conversation | null): Conversation | null;
|
|
152
|
+
/** Commit a record into the freshly-read file with version+1 (LOAD-BEARING:
|
|
153
|
+
* both async and sync commit paths bump version so the CAS detects races). */
|
|
154
|
+
private commit;
|
|
155
|
+
/**
|
|
156
|
+
* Direct upsert of a full record. Used by migration / bulk import. Now does a
|
|
157
|
+
* read-merge-write so it is safe even if the file changed since construction.
|
|
134
158
|
*/
|
|
135
159
|
importDirect(conversation: Conversation): void;
|
|
160
|
+
/** Holds an in-flight importDirect batch until flush(). */
|
|
161
|
+
private pendingFile;
|
|
136
162
|
/** Persist after a batch of importDirect calls. */
|
|
137
163
|
flush(): void;
|
|
138
164
|
/** Remove a conversation. */
|
|
@@ -150,9 +176,11 @@ export declare class ConversationStore {
|
|
|
150
176
|
prune(): void;
|
|
151
177
|
private skeleton;
|
|
152
178
|
private isExpired;
|
|
153
|
-
|
|
154
|
-
private
|
|
155
|
-
|
|
156
|
-
private
|
|
179
|
+
/** Prune a conversations map in place (non-pinned expired + LRU overflow). */
|
|
180
|
+
private pruneMapInPlace;
|
|
181
|
+
/** Read + parse the on-disk store fresh (the source of truth). */
|
|
182
|
+
private readFileFresh;
|
|
183
|
+
/** Atomic write (tmp + rename) — no reader ever sees a torn file. */
|
|
184
|
+
private writeFileAtomic;
|
|
157
185
|
}
|
|
158
186
|
//# sourceMappingURL=ConversationStore.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConversationStore.d.ts","sourceRoot":"","sources":["../../src/threadline/ConversationStore.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ConversationStore.d.ts","sourceRoot":"","sources":["../../src/threadline/ConversationStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,24 +1,29 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* ConversationStore — the single source of truth for a Threadline conversation.
|
|
3
3
|
*
|
|
4
|
-
* Phase 1 of the Threadline re-assessment (THREADLINE-CONVERSATION-KEYSTONE-SPEC.md)
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* the turn count + novelty hashes must live here, on the conversation.
|
|
4
|
+
* Phase 1 of the Threadline re-assessment (THREADLINE-CONVERSATION-KEYSTONE-SPEC.md)
|
|
5
|
+
* introduced this as a server-process in-memory store. Phase 2a
|
|
6
|
+
* (THREADLINE-SINGLE-STORE-SPEC.md / CMT-497) makes it **cross-process safe** so it
|
|
7
|
+
* can be the ONE authoritative store and the legacy `ThreadResumeMap` can become a
|
|
8
|
+
* view over it.
|
|
10
9
|
*
|
|
11
|
-
* Concurrency:
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* the legacy last-writer-wins
|
|
10
|
+
* Concurrency (Phase 2a): `conversations.json` on disk is the source of truth.
|
|
11
|
+
* Every write — async `mutate()` and sync `mutateSync()` — does reload-per-op +
|
|
12
|
+
* optimistic per-record version CAS + atomic tmp-write+rename, the same
|
|
13
|
+
* cross-process-safe pattern the legacy maps used (reload-per-op) hardened with a
|
|
14
|
+
* `version` token so a same-thread race loses no update (a strict improvement over
|
|
15
|
+
* the legacy last-writer-wins). A write reads the LATEST full file immediately
|
|
16
|
+
* before committing and rewrites it with only its own record changed, so a
|
|
17
|
+
* concurrent write to a DIFFERENT thread from another process is preserved — the
|
|
18
|
+
* only residual is the microsecond window between that final re-read and the
|
|
19
|
+
* atomic rename, which matches the (accepted, never-observed-as-a-problem) legacy
|
|
20
|
+
* full-file-rewrite behavior. Reads use a very-short-TTL snapshot cache so the
|
|
21
|
+
* loop gate's hot path doesn't re-read on every call; staleness only ever causes a
|
|
22
|
+
* redundant reload on the next mutate (which always re-reads), never a lost write.
|
|
17
23
|
*
|
|
18
|
-
* Storage: {stateDir}/threadline/conversations.json
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
* mutable state it logs transitions from.
|
|
24
|
+
* Storage: {stateDir}/threadline/conversations.json. NOT relay-hosted —
|
|
25
|
+
* authoritative state stays local. The append-only SharedStateLedger remains the
|
|
26
|
+
* audit trail; this is the live mutable state it logs transitions from.
|
|
22
27
|
*/
|
|
23
28
|
import fs from 'node:fs';
|
|
24
29
|
import path from 'node:path';
|
|
@@ -31,8 +36,10 @@ const RESOLVED_GRACE_MS = 7 * 24 * 60 * 60 * 1000;
|
|
|
31
36
|
const MAX_ENTRIES = 1000;
|
|
32
37
|
/** Max depth of the per-id mutate queue. Enqueue beyond this rejects. */
|
|
33
38
|
const MUTATE_QUEUE_MAX_DEPTH = 256;
|
|
34
|
-
/** Max CAS retries when the version drifts under an apply. */
|
|
35
|
-
const MUTATE_CAS_MAX_RETRIES =
|
|
39
|
+
/** Max CAS retries when the version drifts under an apply (cross-process). */
|
|
40
|
+
const MUTATE_CAS_MAX_RETRIES = 8;
|
|
41
|
+
/** Read-snapshot cache TTL — keeps the gate's hot path off per-call disk reads. */
|
|
42
|
+
const READ_CACHE_TTL_MS = 250;
|
|
36
43
|
// ── Ephemeral verified-only peer-affinity (NOT persisted) ────────
|
|
37
44
|
//
|
|
38
45
|
// The legacy peer-affinity map is a SHORT (10-min sliding / 2-hr absolute),
|
|
@@ -44,22 +51,36 @@ const AFFINITY_ABSOLUTE_MS = 2 * 60 * 60 * 1000;
|
|
|
44
51
|
// ── Implementation ──────────────────────────────────────────────
|
|
45
52
|
export class ConversationStore {
|
|
46
53
|
filePath;
|
|
47
|
-
|
|
48
|
-
/** Per-threadId FIFO mutate queues — serialize concurrent writers. */
|
|
54
|
+
/** Per-threadId FIFO mutate queues — serialize same-process concurrent writers. */
|
|
49
55
|
mutateQueues = new Map();
|
|
50
56
|
mutateRunning = new Set();
|
|
51
57
|
/** Ephemeral verified-only peer-affinity hints (peerFingerprint → hint). */
|
|
52
58
|
affinity = new Map();
|
|
59
|
+
/** Short-TTL read snapshot cache (disk is the source of truth). */
|
|
60
|
+
cache = null;
|
|
61
|
+
cacheAt = 0;
|
|
53
62
|
constructor(stateDir) {
|
|
54
63
|
const threadlineDir = path.join(stateDir, 'threadline');
|
|
55
64
|
fs.mkdirSync(threadlineDir, { recursive: true });
|
|
56
65
|
this.filePath = path.join(threadlineDir, 'conversations.json');
|
|
57
|
-
this.store = this.loadStore();
|
|
58
66
|
}
|
|
59
|
-
// ── Reads (
|
|
67
|
+
// ── Reads (from disk, via a very-short-TTL snapshot cache) ─────
|
|
68
|
+
/** A cached snapshot of the on-disk file (reloaded after READ_CACHE_TTL_MS). */
|
|
69
|
+
snapshot() {
|
|
70
|
+
const now = Date.now();
|
|
71
|
+
if (this.cache && now - this.cacheAt < READ_CACHE_TTL_MS)
|
|
72
|
+
return this.cache;
|
|
73
|
+
this.cache = this.readFileFresh();
|
|
74
|
+
this.cacheAt = now;
|
|
75
|
+
return this.cache;
|
|
76
|
+
}
|
|
77
|
+
invalidateCache() {
|
|
78
|
+
this.cache = null;
|
|
79
|
+
this.cacheAt = 0;
|
|
80
|
+
}
|
|
60
81
|
/** Get a conversation by threadId. Returns null if missing or TTL-expired. */
|
|
61
82
|
get(threadId) {
|
|
62
|
-
const c = this.
|
|
83
|
+
const c = this.snapshot().conversations[threadId];
|
|
63
84
|
if (!c)
|
|
64
85
|
return null;
|
|
65
86
|
if (!c.pinned && this.isExpired(c))
|
|
@@ -73,7 +94,7 @@ export class ConversationStore {
|
|
|
73
94
|
/** Find conversations whose peer set includes the given fingerprint/name. */
|
|
74
95
|
getByParticipant(participant) {
|
|
75
96
|
const out = [];
|
|
76
|
-
for (const c of Object.values(this.
|
|
97
|
+
for (const c of Object.values(this.snapshot().conversations)) {
|
|
77
98
|
if (c.pinned || !this.isExpired(c)) {
|
|
78
99
|
if (c.participants.peers.includes(participant) || c.remoteAgent === participant) {
|
|
79
100
|
out.push(c);
|
|
@@ -84,7 +105,7 @@ export class ConversationStore {
|
|
|
84
105
|
}
|
|
85
106
|
/** Find the conversation bound to a Telegram topic, if any. */
|
|
86
107
|
getByTopicId(topicId) {
|
|
87
|
-
for (const c of Object.values(this.
|
|
108
|
+
for (const c of Object.values(this.snapshot().conversations)) {
|
|
88
109
|
if (c.boundTopicId === topicId && (c.pinned || !this.isExpired(c)))
|
|
89
110
|
return c;
|
|
90
111
|
}
|
|
@@ -92,7 +113,7 @@ export class ConversationStore {
|
|
|
92
113
|
}
|
|
93
114
|
/** Reverse lookup: conversation owning an A2A contextId (identity-bound). */
|
|
94
115
|
getByContextId(contextId, agentIdentity) {
|
|
95
|
-
for (const c of Object.values(this.
|
|
116
|
+
for (const c of Object.values(this.snapshot().conversations)) {
|
|
96
117
|
if (c.contextId === contextId && (c.pinned || !this.isExpired(c))) {
|
|
97
118
|
// Identity binding — prevents session smuggling (ContextThreadMap parity).
|
|
98
119
|
if (c.agentIdentity && c.agentIdentity !== agentIdentity)
|
|
@@ -105,7 +126,7 @@ export class ConversationStore {
|
|
|
105
126
|
/** List active/idle conversations (not resolved/failed/archived). */
|
|
106
127
|
listActive() {
|
|
107
128
|
const out = [];
|
|
108
|
-
for (const c of Object.values(this.
|
|
129
|
+
for (const c of Object.values(this.snapshot().conversations)) {
|
|
109
130
|
if ((c.state === 'active' || c.state === 'idle' || c.state === 'open' || c.state === 'awaiting-reply') &&
|
|
110
131
|
(c.pinned || !this.isExpired(c))) {
|
|
111
132
|
out.push(c);
|
|
@@ -113,9 +134,18 @@ export class ConversationStore {
|
|
|
113
134
|
}
|
|
114
135
|
return out;
|
|
115
136
|
}
|
|
137
|
+
/** All non-expired (or pinned) conversations, any lifecycle state. */
|
|
138
|
+
all() {
|
|
139
|
+
const out = [];
|
|
140
|
+
for (const c of Object.values(this.snapshot().conversations)) {
|
|
141
|
+
if (c.pinned || !this.isExpired(c))
|
|
142
|
+
out.push(c);
|
|
143
|
+
}
|
|
144
|
+
return out;
|
|
145
|
+
}
|
|
116
146
|
/** Total stored conversations (for monitoring). */
|
|
117
147
|
size() {
|
|
118
|
-
return Object.keys(this.
|
|
148
|
+
return Object.keys(this.snapshot().conversations).length;
|
|
119
149
|
}
|
|
120
150
|
// ── Writes (single-writer CAS) ─────────────────────────────────
|
|
121
151
|
/**
|
|
@@ -172,52 +202,105 @@ export class ConversationStore {
|
|
|
172
202
|
async applyMutationWithCAS(threadId, fn) {
|
|
173
203
|
let attempt = 0;
|
|
174
204
|
while (attempt <= MUTATE_CAS_MAX_RETRIES) {
|
|
175
|
-
const
|
|
205
|
+
const file = this.readFileFresh();
|
|
206
|
+
const current = file.conversations[threadId] ?? this.skeleton(threadId);
|
|
176
207
|
const observedVersion = current.version ?? 0;
|
|
177
208
|
const draft = { ...current, participants: { ...current.participants, peers: [...current.participants.peers] } };
|
|
178
209
|
const next = await fn(draft);
|
|
179
|
-
//
|
|
180
|
-
|
|
181
|
-
const
|
|
182
|
-
|
|
210
|
+
// Re-read fresh immediately before commit: CAS against the latest on-disk
|
|
211
|
+
// version, AND preserve any concurrent write to a DIFFERENT thread.
|
|
212
|
+
const latestFile = this.readFileFresh();
|
|
213
|
+
const latest = latestFile.conversations[threadId];
|
|
214
|
+
if (latest && (latest.version ?? 0) !== observedVersion) {
|
|
183
215
|
attempt++;
|
|
184
|
-
continue;
|
|
216
|
+
continue; // someone else mutated THIS thread — reload and retry
|
|
185
217
|
}
|
|
186
|
-
const committed =
|
|
187
|
-
...next,
|
|
188
|
-
threadId,
|
|
189
|
-
version: observedVersion + 1,
|
|
190
|
-
savedAt: new Date().toISOString(),
|
|
191
|
-
};
|
|
192
|
-
this.store.conversations[threadId] = committed;
|
|
193
|
-
this.pruneIfNeeded();
|
|
194
|
-
this.saveStore();
|
|
218
|
+
const committed = this.commit(latestFile, threadId, next, observedVersion);
|
|
195
219
|
return committed;
|
|
196
220
|
}
|
|
197
221
|
throw new Error(`ConversationStore.mutate: CAS retry budget exhausted for ${threadId} after ${MUTATE_CAS_MAX_RETRIES} retries`);
|
|
198
222
|
}
|
|
199
223
|
/**
|
|
200
|
-
*
|
|
201
|
-
*
|
|
202
|
-
*
|
|
224
|
+
* Synchronous single-record mutate (Phase 2a). Used by the synchronous legacy
|
|
225
|
+
* interfaces (the `ThreadResumeMap` view's `save`/`remove`/etc.). Same file
|
|
226
|
+
* version-CAS as `mutate`, but the fn is synchronous so the re-read→write
|
|
227
|
+
* window has no await and is atomic within this process. Cross-process safety
|
|
228
|
+
* is identical to `mutate` (per-record version CAS + atomic rename).
|
|
229
|
+
*
|
|
230
|
+
* The fn MAY return null to signal "delete this record".
|
|
231
|
+
*/
|
|
232
|
+
mutateSync(threadId, fn) {
|
|
233
|
+
let attempt = 0;
|
|
234
|
+
while (attempt <= MUTATE_CAS_MAX_RETRIES) {
|
|
235
|
+
const file = this.readFileFresh();
|
|
236
|
+
const current = file.conversations[threadId] ?? this.skeleton(threadId);
|
|
237
|
+
const observedVersion = current.version ?? 0;
|
|
238
|
+
const draft = { ...current, participants: { ...current.participants, peers: [...current.participants.peers] } };
|
|
239
|
+
const next = fn(draft);
|
|
240
|
+
const latestFile = this.readFileFresh();
|
|
241
|
+
const latest = latestFile.conversations[threadId];
|
|
242
|
+
if (latest && (latest.version ?? 0) !== observedVersion) {
|
|
243
|
+
attempt++;
|
|
244
|
+
continue;
|
|
245
|
+
}
|
|
246
|
+
if (next === null) {
|
|
247
|
+
if (latestFile.conversations[threadId]) {
|
|
248
|
+
delete latestFile.conversations[threadId];
|
|
249
|
+
this.writeFileAtomic(latestFile);
|
|
250
|
+
this.invalidateCache();
|
|
251
|
+
}
|
|
252
|
+
return null;
|
|
253
|
+
}
|
|
254
|
+
return this.commit(latestFile, threadId, next, observedVersion);
|
|
255
|
+
}
|
|
256
|
+
throw new Error(`ConversationStore.mutateSync: CAS retry budget exhausted for ${threadId} after ${MUTATE_CAS_MAX_RETRIES} retries`);
|
|
257
|
+
}
|
|
258
|
+
/** Commit a record into the freshly-read file with version+1 (LOAD-BEARING:
|
|
259
|
+
* both async and sync commit paths bump version so the CAS detects races). */
|
|
260
|
+
commit(file, threadId, next, observedVersion) {
|
|
261
|
+
const committed = {
|
|
262
|
+
...next,
|
|
263
|
+
threadId,
|
|
264
|
+
version: observedVersion + 1,
|
|
265
|
+
savedAt: new Date().toISOString(),
|
|
266
|
+
};
|
|
267
|
+
file.conversations[threadId] = committed;
|
|
268
|
+
this.pruneMapInPlace(file.conversations);
|
|
269
|
+
this.writeFileAtomic(file);
|
|
270
|
+
this.invalidateCache();
|
|
271
|
+
return committed;
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Direct upsert of a full record. Used by migration / bulk import. Now does a
|
|
275
|
+
* read-merge-write so it is safe even if the file changed since construction.
|
|
203
276
|
*/
|
|
204
277
|
importDirect(conversation) {
|
|
205
|
-
const
|
|
206
|
-
|
|
278
|
+
const file = this.pendingFile ?? this.readFileFresh();
|
|
279
|
+
const existing = file.conversations[conversation.threadId];
|
|
280
|
+
file.conversations[conversation.threadId] = {
|
|
207
281
|
...conversation,
|
|
208
282
|
version: existing ? Math.max(existing.version ?? 0, conversation.version ?? 0) : (conversation.version ?? 0),
|
|
209
283
|
savedAt: new Date().toISOString(),
|
|
210
284
|
};
|
|
285
|
+
this.pendingFile = file;
|
|
211
286
|
}
|
|
287
|
+
/** Holds an in-flight importDirect batch until flush(). */
|
|
288
|
+
pendingFile = null;
|
|
212
289
|
/** Persist after a batch of importDirect calls. */
|
|
213
290
|
flush() {
|
|
214
|
-
this.
|
|
291
|
+
if (this.pendingFile) {
|
|
292
|
+
this.writeFileAtomic(this.pendingFile);
|
|
293
|
+
this.pendingFile = null;
|
|
294
|
+
this.invalidateCache();
|
|
295
|
+
}
|
|
215
296
|
}
|
|
216
297
|
/** Remove a conversation. */
|
|
217
298
|
remove(threadId) {
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
299
|
+
const file = this.readFileFresh();
|
|
300
|
+
if (file.conversations[threadId]) {
|
|
301
|
+
delete file.conversations[threadId];
|
|
302
|
+
this.writeFileAtomic(file);
|
|
303
|
+
this.invalidateCache();
|
|
221
304
|
}
|
|
222
305
|
}
|
|
223
306
|
// ── Ephemeral verified-only peer affinity (in-memory, non-durable) ──
|
|
@@ -252,8 +335,10 @@ export class ConversationStore {
|
|
|
252
335
|
// ── Maintenance ────────────────────────────────────────────────
|
|
253
336
|
/** Prune expired + resolved-past-grace + LRU-overflow (non-pinned). */
|
|
254
337
|
prune() {
|
|
255
|
-
this.
|
|
256
|
-
this.
|
|
338
|
+
const file = this.readFileFresh();
|
|
339
|
+
this.pruneMapInPlace(file.conversations);
|
|
340
|
+
this.writeFileAtomic(file);
|
|
341
|
+
this.invalidateCache();
|
|
257
342
|
}
|
|
258
343
|
// ── Private helpers ────────────────────────────────────────────
|
|
259
344
|
skeleton(threadId) {
|
|
@@ -279,13 +364,8 @@ export class ConversationStore {
|
|
|
279
364
|
const ref = c.lastActivityAt || c.savedAt;
|
|
280
365
|
return now - new Date(ref).getTime() > MAX_AGE_MS;
|
|
281
366
|
}
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
this.pruneMap();
|
|
285
|
-
}
|
|
286
|
-
pruneMap() {
|
|
287
|
-
const map = this.store.conversations;
|
|
288
|
-
// Phase 1: drop expired / resolved-past-grace (non-pinned).
|
|
367
|
+
/** Prune a conversations map in place (non-pinned expired + LRU overflow). */
|
|
368
|
+
pruneMapInPlace(map) {
|
|
289
369
|
for (const key of Object.keys(map)) {
|
|
290
370
|
const c = map[key];
|
|
291
371
|
if (c.pinned)
|
|
@@ -293,7 +373,6 @@ export class ConversationStore {
|
|
|
293
373
|
if (this.isExpired(c))
|
|
294
374
|
delete map[key];
|
|
295
375
|
}
|
|
296
|
-
// Phase 2: LRU eviction if still over cap.
|
|
297
376
|
const keys = Object.keys(map);
|
|
298
377
|
if (keys.length <= MAX_ENTRIES)
|
|
299
378
|
return;
|
|
@@ -310,7 +389,8 @@ export class ConversationStore {
|
|
|
310
389
|
delete map[unpinned[i].key];
|
|
311
390
|
}
|
|
312
391
|
}
|
|
313
|
-
|
|
392
|
+
/** Read + parse the on-disk store fresh (the source of truth). */
|
|
393
|
+
readFileFresh() {
|
|
314
394
|
try {
|
|
315
395
|
if (fs.existsSync(this.filePath)) {
|
|
316
396
|
const data = JSON.parse(fs.readFileSync(this.filePath, 'utf-8'));
|
|
@@ -320,17 +400,18 @@ export class ConversationStore {
|
|
|
320
400
|
}
|
|
321
401
|
}
|
|
322
402
|
catch {
|
|
323
|
-
// Corrupted —
|
|
403
|
+
// Corrupted / mid-write torn read — treat as empty; the next write heals it.
|
|
324
404
|
}
|
|
325
405
|
return { version: 1, conversations: {}, lastModified: new Date().toISOString() };
|
|
326
406
|
}
|
|
327
|
-
|
|
328
|
-
|
|
407
|
+
/** Atomic write (tmp + rename) — no reader ever sees a torn file. */
|
|
408
|
+
writeFileAtomic(file) {
|
|
409
|
+
file.lastModified = new Date().toISOString();
|
|
329
410
|
try {
|
|
330
411
|
const dir = path.dirname(this.filePath);
|
|
331
412
|
fs.mkdirSync(dir, { recursive: true });
|
|
332
|
-
const tmpPath = `${this.filePath}.${process.pid}.tmp`;
|
|
333
|
-
fs.writeFileSync(tmpPath, JSON.stringify(
|
|
413
|
+
const tmpPath = `${this.filePath}.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`;
|
|
414
|
+
fs.writeFileSync(tmpPath, JSON.stringify(file, null, 2) + '\n');
|
|
334
415
|
fs.renameSync(tmpPath, this.filePath);
|
|
335
416
|
}
|
|
336
417
|
catch {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConversationStore.js","sourceRoot":"","sources":["../../src/threadline/ConversationStore.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ConversationStore.js","sourceRoot":"","sources":["../../src/threadline/ConversationStore.ts"],"names":[],"mappings":"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"}
|