@remnic/core 10.0.72 → 10.0.74
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/access-admin-ops-surface.js +14 -14
- package/dist/access-authorization-probe.js +15 -15
- package/dist/access-boundary.js +14 -14
- package/dist/access-cli.js +51 -51
- package/dist/access-extraction-force-flush.js +14 -14
- package/dist/access-http-briefing.js +15 -15
- package/dist/access-http-query.js +16 -16
- package/dist/access-http.js +30 -30
- package/dist/access-identity-continuity-surface.js +14 -14
- package/dist/access-lcm-surface.js +14 -14
- package/dist/access-mcp.js +23 -23
- package/dist/access-namespace-preflight.js +14 -14
- package/dist/access-observe-helpers.d.ts.map +1 -1
- package/dist/access-observe-helpers.js +1 -1
- package/dist/access-observe-write-surface.js +14 -14
- package/dist/access-operations-batch.js +15 -15
- package/dist/access-operations.js +22 -22
- package/dist/access-recall-concurrency.js +14 -14
- package/dist/access-recall-response.js +14 -14
- package/dist/access-recall-surface.js +14 -14
- package/dist/access-service.js +14 -14
- package/dist/access-surface-catalog.js +16 -16
- package/dist/active-recall.js +3 -3
- package/dist/briefing.js +4 -4
- package/dist/buffer-turn-helpers.d.ts +18 -0
- package/dist/buffer-turn-helpers.d.ts.map +1 -1
- package/dist/buffer-turn-helpers.js +5 -1
- package/dist/buffer.js +2 -2
- package/dist/causal-consolidation.js +5 -5
- package/dist/{chunk-AGRMXXVA.js → chunk-2H3SITYD.js} +2 -2
- package/dist/{chunk-ZBET3W26.js → chunk-2WDFLORC.js} +2 -2
- package/dist/{chunk-S73ZVU37.js → chunk-45SFSQON.js} +2 -2
- package/dist/{chunk-OUBEJWVI.js → chunk-4KLQI3L2.js} +42 -1
- package/dist/chunk-4KLQI3L2.js.map +1 -0
- package/dist/{chunk-XPZM7GP6.js → chunk-4SOISEZ3.js} +7 -7
- package/dist/{chunk-QIOQI7QZ.js → chunk-55NKJDKX.js} +2 -2
- package/dist/{chunk-JY4LXMZR.js → chunk-5XOCAJHC.js} +2 -2
- package/dist/{chunk-IQXQ3KWR.js → chunk-62O7YWBR.js} +2 -2
- package/dist/{chunk-S37O4S6E.js → chunk-6EKP7BJW.js} +2 -2
- package/dist/{chunk-VNTQU6KB.js → chunk-7PMOCQOL.js} +8 -13
- package/dist/chunk-7PMOCQOL.js.map +1 -0
- package/dist/{chunk-U6IL4724.js → chunk-A2BH2VE2.js} +2 -2
- package/dist/{chunk-BCBY5GYZ.js → chunk-BEQU6QGW.js} +2 -2
- package/dist/{chunk-2WPWEVAH.js → chunk-CAVXVGYK.js} +2 -2
- package/dist/{chunk-UAOJVQXC.js → chunk-CU5N4RDI.js} +2 -2
- package/dist/{chunk-4PMFSYH7.js → chunk-DHQLVS7J.js} +2 -2
- package/dist/{chunk-X4DHAXFO.js → chunk-DLLQMNYQ.js} +3 -3
- package/dist/{chunk-UE5JYPU6.js → chunk-DQVT45LZ.js} +7 -7
- package/dist/{chunk-JGLZ46JS.js → chunk-DVDRKCZK.js} +2 -2
- package/dist/{chunk-2R44BBPK.js → chunk-FU2ZLXVN.js} +2 -2
- package/dist/{chunk-DC3DWF2M.js → chunk-G7I2RQ64.js} +2 -2
- package/dist/{chunk-H2X32F2K.js → chunk-GI47WZWA.js} +2 -2
- package/dist/{chunk-PJAMFIDE.js → chunk-GJOBCNST.js} +3 -3
- package/dist/{chunk-23BA3USG.js → chunk-GO2GCJ7S.js} +10 -10
- package/dist/{chunk-ZODKV27J.js → chunk-HPCWJMMQ.js} +5 -5
- package/dist/{chunk-UKQFCOGT.js → chunk-IPHIIRDN.js} +3 -3
- package/dist/chunk-IPHIIRDN.js.map +1 -0
- package/dist/{chunk-LYOCAUI6.js → chunk-IXBIL5WY.js} +3 -3
- package/dist/{chunk-WNQ3B3Q5.js → chunk-K5Y42U2P.js} +2 -2
- package/dist/{chunk-6KBCUIZP.js → chunk-KFZ3A2EA.js} +2 -2
- package/dist/{chunk-OGQGDOYK.js → chunk-KH2HB3OW.js} +2 -2
- package/dist/{chunk-ICBUTKLL.js → chunk-KPCTZB3U.js} +2 -2
- package/dist/{chunk-BTU77RB5.js → chunk-KWUMXJN7.js} +2 -2
- package/dist/{chunk-5ORJHH43.js → chunk-LC55ZXLR.js} +2 -2
- package/dist/{chunk-QUPTDKSX.js → chunk-LIGA5KHG.js} +16 -16
- package/dist/{chunk-LHMCZ6VW.js → chunk-LUXVW5UU.js} +10 -10
- package/dist/{chunk-7P5VBRBS.js → chunk-MOJ4UDA3.js} +2 -2
- package/dist/{chunk-7WFY2L5J.js → chunk-NHTEEGE4.js} +3 -3
- package/dist/{chunk-OWZXDBV4.js → chunk-OFOV6TTZ.js} +2 -2
- package/dist/{chunk-VK5HKVQ7.js → chunk-OKBGLAAI.js} +2 -2
- package/dist/{chunk-VSJ3ARFS.js → chunk-PUP7NTNB.js} +2 -2
- package/dist/{chunk-DSSTOV5M.js → chunk-Q2QPHGEC.js} +38 -21
- package/dist/chunk-Q2QPHGEC.js.map +1 -0
- package/dist/{chunk-GXAZ4Q2S.js → chunk-QYLEE4UQ.js} +2 -2
- package/dist/{chunk-AZNE2H6D.js → chunk-RQHIN3PY.js} +2 -2
- package/dist/{chunk-USX5YIKB.js → chunk-STDAR7M7.js} +5 -5
- package/dist/{chunk-LN7CWLAU.js → chunk-T64HVBAP.js} +2 -2
- package/dist/{chunk-EGKDONTC.js → chunk-UEY5TPEE.js} +9 -9
- package/dist/chunk-UEY5TPEE.js.map +1 -0
- package/dist/{chunk-YPYSC3TX.js → chunk-V33ETCF6.js} +2 -2
- package/dist/{chunk-J72ZY7NU.js → chunk-VWHWWIFS.js} +2 -2
- package/dist/{chunk-QVZZE6VH.js → chunk-WBMT3C6A.js} +3 -3
- package/dist/{chunk-N2Y6COEM.js → chunk-WPPAXTW6.js} +2 -2
- package/dist/{chunk-W4V7P5HP.js → chunk-XV7PJVQO.js} +2 -2
- package/dist/{chunk-FGGLVCHI.js → chunk-Y2ZGT4W7.js} +2 -2
- package/dist/{chunk-WYOHQJKC.js → chunk-YJX3K5LK.js} +3 -3
- package/dist/cli.js +40 -40
- package/dist/coding/export-okf-codegraph.js +3 -3
- package/dist/compounding/engine.js +5 -5
- package/dist/config.js +3 -3
- package/dist/connectors/codex-materialize-runner.js +4 -4
- package/dist/connectors/index.js +4 -4
- package/dist/convergence-refresh.js +6 -6
- package/dist/corpus-watermark.js +6 -6
- package/dist/entity-retrieval.js +4 -4
- package/dist/external-wiki-access.js +15 -15
- package/dist/extraction.js +4 -4
- package/dist/harmonic-retrieval.js +4 -4
- package/dist/index.js +51 -51
- package/dist/location/index.js +6 -6
- package/dist/maintenance/memory-governance.js +4 -4
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +4 -4
- package/dist/maintenance/rebuild-memory-projection-runner.js +6 -6
- package/dist/maintenance/rebuild-memory-projection.js +5 -5
- package/dist/memory-browse-operations.js +15 -15
- package/dist/namespaces/migrate.js +5 -5
- package/dist/namespaces/storage.js +4 -4
- package/dist/operator-doctor-corpus.js +7 -7
- package/dist/operator-toolkit.js +12 -12
- package/dist/orchestration/backlog-scheduler.js +52 -52
- package/dist/orchestration/buffer-drain-runner.js +52 -52
- package/dist/orchestration/extraction-queue-coordinator.d.ts +6 -0
- package/dist/orchestration/extraction-queue-coordinator.d.ts.map +1 -1
- package/dist/orchestration/maintenance.js +14 -14
- package/dist/orchestrator.js +51 -51
- package/dist/recall-navigation-operations.js +15 -15
- package/dist/recall-navigation.js +14 -14
- package/dist/resume-bundles.js +3 -3
- package/dist/semantic-consolidation.js +5 -5
- package/dist/semantic-rule-promotion.js +4 -4
- package/dist/semantic-rule-verifier.js +4 -4
- package/dist/source-agent-qualifier.js +4 -4
- package/dist/standup/build.js +4 -4
- package/dist/storage/buffer-drain-claims.d.ts.map +1 -1
- package/dist/storage/buffer-drain-claims.js +2 -2
- package/dist/storage/buffer-session-files.js +2 -2
- package/dist/storage.js +3 -3
- package/dist/support-passport/index.js +17 -17
- package/dist/transfer/export-okf.js +4 -4
- package/dist/verified-recall.js +4 -4
- package/dist/who-knows-cli.js +5 -5
- package/dist/who-knows.js +4 -4
- package/package.json +2 -2
- package/src/access-observe-acceptance-boundary.test.ts +24 -18
- package/src/access-observe-helpers.test.ts +72 -0
- package/src/access-observe-helpers.ts +5 -2
- package/src/access-service-observe-lcm-parity.test.ts +9 -2
- package/src/access-service-observe-scope.test.ts +8 -1
- package/src/buffer-record-snapshots.test.ts +195 -0
- package/src/buffer-turn-helpers.test.ts +205 -0
- package/src/buffer-turn-helpers.ts +62 -0
- package/src/buffer.ts +8 -8
- package/src/orchestration/extraction-queue-coordinator.ts +18 -1
- package/src/orchestrator-extraction-queue.test.ts +142 -0
- package/src/storage/buffer-drain-claims.ts +5 -11
- package/dist/chunk-DSSTOV5M.js.map +0 -1
- package/dist/chunk-EGKDONTC.js.map +0 -1
- package/dist/chunk-OUBEJWVI.js.map +0 -1
- package/dist/chunk-UKQFCOGT.js.map +0 -1
- package/dist/chunk-VNTQU6KB.js.map +0 -1
- /package/dist/{chunk-AGRMXXVA.js.map → chunk-2H3SITYD.js.map} +0 -0
- /package/dist/{chunk-ZBET3W26.js.map → chunk-2WDFLORC.js.map} +0 -0
- /package/dist/{chunk-S73ZVU37.js.map → chunk-45SFSQON.js.map} +0 -0
- /package/dist/{chunk-XPZM7GP6.js.map → chunk-4SOISEZ3.js.map} +0 -0
- /package/dist/{chunk-QIOQI7QZ.js.map → chunk-55NKJDKX.js.map} +0 -0
- /package/dist/{chunk-JY4LXMZR.js.map → chunk-5XOCAJHC.js.map} +0 -0
- /package/dist/{chunk-IQXQ3KWR.js.map → chunk-62O7YWBR.js.map} +0 -0
- /package/dist/{chunk-S37O4S6E.js.map → chunk-6EKP7BJW.js.map} +0 -0
- /package/dist/{chunk-U6IL4724.js.map → chunk-A2BH2VE2.js.map} +0 -0
- /package/dist/{chunk-BCBY5GYZ.js.map → chunk-BEQU6QGW.js.map} +0 -0
- /package/dist/{chunk-2WPWEVAH.js.map → chunk-CAVXVGYK.js.map} +0 -0
- /package/dist/{chunk-UAOJVQXC.js.map → chunk-CU5N4RDI.js.map} +0 -0
- /package/dist/{chunk-4PMFSYH7.js.map → chunk-DHQLVS7J.js.map} +0 -0
- /package/dist/{chunk-X4DHAXFO.js.map → chunk-DLLQMNYQ.js.map} +0 -0
- /package/dist/{chunk-UE5JYPU6.js.map → chunk-DQVT45LZ.js.map} +0 -0
- /package/dist/{chunk-JGLZ46JS.js.map → chunk-DVDRKCZK.js.map} +0 -0
- /package/dist/{chunk-2R44BBPK.js.map → chunk-FU2ZLXVN.js.map} +0 -0
- /package/dist/{chunk-DC3DWF2M.js.map → chunk-G7I2RQ64.js.map} +0 -0
- /package/dist/{chunk-H2X32F2K.js.map → chunk-GI47WZWA.js.map} +0 -0
- /package/dist/{chunk-PJAMFIDE.js.map → chunk-GJOBCNST.js.map} +0 -0
- /package/dist/{chunk-23BA3USG.js.map → chunk-GO2GCJ7S.js.map} +0 -0
- /package/dist/{chunk-ZODKV27J.js.map → chunk-HPCWJMMQ.js.map} +0 -0
- /package/dist/{chunk-LYOCAUI6.js.map → chunk-IXBIL5WY.js.map} +0 -0
- /package/dist/{chunk-WNQ3B3Q5.js.map → chunk-K5Y42U2P.js.map} +0 -0
- /package/dist/{chunk-6KBCUIZP.js.map → chunk-KFZ3A2EA.js.map} +0 -0
- /package/dist/{chunk-OGQGDOYK.js.map → chunk-KH2HB3OW.js.map} +0 -0
- /package/dist/{chunk-ICBUTKLL.js.map → chunk-KPCTZB3U.js.map} +0 -0
- /package/dist/{chunk-BTU77RB5.js.map → chunk-KWUMXJN7.js.map} +0 -0
- /package/dist/{chunk-5ORJHH43.js.map → chunk-LC55ZXLR.js.map} +0 -0
- /package/dist/{chunk-QUPTDKSX.js.map → chunk-LIGA5KHG.js.map} +0 -0
- /package/dist/{chunk-LHMCZ6VW.js.map → chunk-LUXVW5UU.js.map} +0 -0
- /package/dist/{chunk-7P5VBRBS.js.map → chunk-MOJ4UDA3.js.map} +0 -0
- /package/dist/{chunk-7WFY2L5J.js.map → chunk-NHTEEGE4.js.map} +0 -0
- /package/dist/{chunk-OWZXDBV4.js.map → chunk-OFOV6TTZ.js.map} +0 -0
- /package/dist/{chunk-VK5HKVQ7.js.map → chunk-OKBGLAAI.js.map} +0 -0
- /package/dist/{chunk-VSJ3ARFS.js.map → chunk-PUP7NTNB.js.map} +0 -0
- /package/dist/{chunk-GXAZ4Q2S.js.map → chunk-QYLEE4UQ.js.map} +0 -0
- /package/dist/{chunk-AZNE2H6D.js.map → chunk-RQHIN3PY.js.map} +0 -0
- /package/dist/{chunk-USX5YIKB.js.map → chunk-STDAR7M7.js.map} +0 -0
- /package/dist/{chunk-LN7CWLAU.js.map → chunk-T64HVBAP.js.map} +0 -0
- /package/dist/{chunk-YPYSC3TX.js.map → chunk-V33ETCF6.js.map} +0 -0
- /package/dist/{chunk-J72ZY7NU.js.map → chunk-VWHWWIFS.js.map} +0 -0
- /package/dist/{chunk-QVZZE6VH.js.map → chunk-WBMT3C6A.js.map} +0 -0
- /package/dist/{chunk-N2Y6COEM.js.map → chunk-WPPAXTW6.js.map} +0 -0
- /package/dist/{chunk-W4V7P5HP.js.map → chunk-XV7PJVQO.js.map} +0 -0
- /package/dist/{chunk-FGGLVCHI.js.map → chunk-Y2ZGT4W7.js.map} +0 -0
- /package/dist/{chunk-WYOHQJKC.js.map → chunk-YJX3K5LK.js.map} +0 -0
|
@@ -4,12 +4,12 @@ import {
|
|
|
4
4
|
} from "./chunk-66JOLMWS.js";
|
|
5
5
|
import {
|
|
6
6
|
buildExtensionsBlockForConsolidation
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-KFZ3A2EA.js";
|
|
8
8
|
import "./chunk-5JMAGU26.js";
|
|
9
9
|
import "./chunk-B7RWBZXW.js";
|
|
10
10
|
import {
|
|
11
11
|
runPostConsolidationMaterialize
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-BEQU6QGW.js";
|
|
13
13
|
import "./chunk-3UXOZBHV.js";
|
|
14
14
|
import "./chunk-J6GZ2254.js";
|
|
15
15
|
import "./chunk-236PXYG7.js";
|
|
@@ -18,12 +18,12 @@ import "./chunk-QDW3E4RD.js";
|
|
|
18
18
|
import {
|
|
19
19
|
resolveCausalTrajectoryStoreDir
|
|
20
20
|
} from "./chunk-6L63IN3M.js";
|
|
21
|
-
import "./chunk-
|
|
21
|
+
import "./chunk-45SFSQON.js";
|
|
22
22
|
import "./chunk-QGVCFVX6.js";
|
|
23
23
|
import "./chunk-UHVXE24Y.js";
|
|
24
24
|
import "./chunk-IGOW4TJE.js";
|
|
25
25
|
import "./chunk-G6OFEGUR.js";
|
|
26
|
-
import "./chunk-
|
|
26
|
+
import "./chunk-7PMOCQOL.js";
|
|
27
27
|
import "./chunk-JEX2JL3U.js";
|
|
28
28
|
import "./chunk-U2A56LLF.js";
|
|
29
29
|
import "./chunk-DOJBV6WR.js";
|
|
@@ -77,7 +77,7 @@ import "./chunk-IUM3VSHI.js";
|
|
|
77
77
|
import "./chunk-C64XATK7.js";
|
|
78
78
|
import "./chunk-42JKGUFJ.js";
|
|
79
79
|
import "./chunk-23G5P7TA.js";
|
|
80
|
-
import "./chunk-
|
|
80
|
+
import "./chunk-4KLQI3L2.js";
|
|
81
81
|
import {
|
|
82
82
|
FallbackLlmClient
|
|
83
83
|
} from "./chunk-AVVCPA7U.js";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
SupportPassportError,
|
|
3
3
|
getOperation
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-GO2GCJ7S.js";
|
|
5
5
|
import {
|
|
6
6
|
abortError,
|
|
7
7
|
isAbortError
|
|
@@ -499,4 +499,4 @@ export {
|
|
|
499
499
|
buildSupportPassportPublicRequestHandler,
|
|
500
500
|
composeSupportPassportExternalRequestHandlers
|
|
501
501
|
};
|
|
502
|
-
//# sourceMappingURL=chunk-
|
|
502
|
+
//# sourceMappingURL=chunk-2H3SITYD.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
NamespaceStorageRouter
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-CU5N4RDI.js";
|
|
4
4
|
import {
|
|
5
5
|
namespaceCollectionName
|
|
6
6
|
} from "./chunk-JEX2JL3U.js";
|
|
@@ -213,4 +213,4 @@ export {
|
|
|
213
213
|
verifyNamespaces,
|
|
214
214
|
runNamespaceMigration
|
|
215
215
|
};
|
|
216
|
-
//# sourceMappingURL=chunk-
|
|
216
|
+
//# sourceMappingURL=chunk-2WDFLORC.js.map
|
|
@@ -22,7 +22,7 @@ import {
|
|
|
22
22
|
} from "./chunk-IGOW4TJE.js";
|
|
23
23
|
import {
|
|
24
24
|
BufferSessionFiles
|
|
25
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-7PMOCQOL.js";
|
|
26
26
|
import {
|
|
27
27
|
normalizeQmdResultPath,
|
|
28
28
|
resolveNamespaceResultPath
|
|
@@ -11039,4 +11039,4 @@ export {
|
|
|
11039
11039
|
isValidBufferSurpriseEvent,
|
|
11040
11040
|
StorageManager3 as StorageManager
|
|
11041
11041
|
};
|
|
11042
|
-
//# sourceMappingURL=chunk-
|
|
11042
|
+
//# sourceMappingURL=chunk-45SFSQON.js.map
|
|
@@ -100,6 +100,45 @@ function bufferTurnsEqual(left, right) {
|
|
|
100
100
|
// restart-rehydrated plan must still match the pin it was accepted under.
|
|
101
101
|
left.writeNamespaceOverride === right.writeNamespaceOverride && left.principalOverride === right.principalOverride && scopeProfilePlanIdentity(left.scopeProfileWritePlan) === scopeProfilePlanIdentity(right.scopeProfileWritePlan);
|
|
102
102
|
}
|
|
103
|
+
function bufferTurnIdentityKey(turn) {
|
|
104
|
+
const opt = (value) => value === void 0 ? "undefined" : value === null ? "null" : JSON.stringify(value);
|
|
105
|
+
const optFlag = (value) => value === void 0 ? "undefined" : String(value);
|
|
106
|
+
const ctx = turn.codingContext;
|
|
107
|
+
return JSON.stringify([
|
|
108
|
+
turn.role,
|
|
109
|
+
turn.content,
|
|
110
|
+
turn.timestamp,
|
|
111
|
+
opt(turn.sessionKey),
|
|
112
|
+
opt(turn.sessionOwnerPrincipal),
|
|
113
|
+
opt(turn.logicalSessionKey),
|
|
114
|
+
turn.providerThreadId === void 0 ? "undefined" : turn.providerThreadId === null ? "null" : JSON.stringify(turn.providerThreadId),
|
|
115
|
+
opt(turn.turnFingerprint),
|
|
116
|
+
optFlag(turn.persistProcessedFingerprint),
|
|
117
|
+
opt(turn.sourceConnector),
|
|
118
|
+
opt(turn.originRole),
|
|
119
|
+
optFlag(turn.ambientCapture),
|
|
120
|
+
opt(turn.sourceValidAt),
|
|
121
|
+
optFlag(turn.acceptedCapture),
|
|
122
|
+
opt(ctx?.projectId),
|
|
123
|
+
opt(ctx?.rootPath),
|
|
124
|
+
opt(ctx?.branch),
|
|
125
|
+
opt(ctx?.defaultBranch),
|
|
126
|
+
opt(turn.writeNamespaceOverride),
|
|
127
|
+
opt(turn.principalOverride),
|
|
128
|
+
opt(turn.scopeProfileWritePlan ? scopeProfilePlanIdentity(turn.scopeProfileWritePlan) : void 0)
|
|
129
|
+
]);
|
|
130
|
+
}
|
|
131
|
+
function mergeBufferTurnsByIdentity(existing, incoming) {
|
|
132
|
+
const merged = [...existing];
|
|
133
|
+
const seen = new Set(merged.map(bufferTurnIdentityKey));
|
|
134
|
+
for (const turn of incoming) {
|
|
135
|
+
const key = bufferTurnIdentityKey(turn);
|
|
136
|
+
if (seen.has(key)) continue;
|
|
137
|
+
seen.add(key);
|
|
138
|
+
merged.push(turn);
|
|
139
|
+
}
|
|
140
|
+
return merged;
|
|
141
|
+
}
|
|
103
142
|
function selectRetainedDeferredTurns(existing, turns, max, originalTurns) {
|
|
104
143
|
const others = originalTurns === void 0 ? [] : existing.filter(
|
|
105
144
|
(turn) => !originalTurns.some((original) => bufferTurnsEqual(turn, original))
|
|
@@ -209,6 +248,8 @@ export {
|
|
|
209
248
|
subtractBufferTurns,
|
|
210
249
|
bufferEntryCounts,
|
|
211
250
|
bufferTurnsEqual,
|
|
251
|
+
bufferTurnIdentityKey,
|
|
252
|
+
mergeBufferTurnsByIdentity,
|
|
212
253
|
selectRetainedDeferredTurns,
|
|
213
254
|
hasPinnedCaptureScope,
|
|
214
255
|
scopeProfilePlanIdentity,
|
|
@@ -220,4 +261,4 @@ export {
|
|
|
220
261
|
ProbeTimeoutError,
|
|
221
262
|
probeWithTimeout
|
|
222
263
|
};
|
|
223
|
-
//# sourceMappingURL=chunk-
|
|
264
|
+
//# sourceMappingURL=chunk-4KLQI3L2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/buffer-turn-helpers.ts"],"sourcesContent":["import type { BufferEntryState, BufferState, BufferTurn } from \"./types.js\";\n\nexport interface BufferTurnOwner {\n /**\n * Server-resolved principal that owns this session at the authenticated\n * observe/write boundary. Persisted with the buffered turn so lifecycle\n * flushes do not have to infer ownership from a client-chosen session key.\n */\n sessionOwnerPrincipal?: string;\n}\n\nexport interface AmbientCaptureProvenance {\n /**\n * True when this turn's content came from an always-on ambient capture\n * device (a wearable recorder, a room microphone) and may therefore carry\n * speech the user never authored: TV, podcasts, music, overheard\n * conversation (issue #2294). Set by the ingesting subsystem, never from\n * tool arguments — extraction reads it to warn the model about media audio\n * and to clamp high-impact personal facts to the speculative tier.\n */\n ambientCapture?: boolean;\n}\n\nexport function describeError(err: unknown): string {\n if (err instanceof Error) return err.message;\n if (err === null) return \"null\";\n if (err === undefined) return \"undefined\";\n if (typeof err === \"string\") return err;\n try {\n return JSON.stringify(err);\n } catch {\n return String(err);\n }\n}\n\nexport function copyBufferTurn(turn: BufferTurn): BufferTurn {\n const copy: BufferTurn = {\n role: turn.role,\n content: turn.content,\n timestamp: turn.timestamp,\n };\n if (typeof turn.sessionKey === \"string\") copy.sessionKey = turn.sessionKey;\n if (typeof turn.logicalSessionKey === \"string\") {\n copy.logicalSessionKey = turn.logicalSessionKey;\n }\n if (turn.providerThreadId === null || typeof turn.providerThreadId === \"string\") {\n copy.providerThreadId = turn.providerThreadId;\n }\n if (typeof turn.sessionOwnerPrincipal === \"string\") {\n copy.sessionOwnerPrincipal = turn.sessionOwnerPrincipal;\n }\n if (typeof turn.turnFingerprint === \"string\") {\n copy.turnFingerprint = turn.turnFingerprint;\n }\n if (typeof turn.persistProcessedFingerprint === \"boolean\") {\n copy.persistProcessedFingerprint = turn.persistProcessedFingerprint;\n }\n if (typeof turn.sourceConnector === \"string\") {\n copy.sourceConnector = turn.sourceConnector;\n }\n if (turn.originRole === \"user\" || turn.originRole === \"assistant\" || turn.originRole === \"tool\") {\n copy.originRole = turn.originRole;\n }\n if (typeof turn.ambientCapture === \"boolean\") {\n copy.ambientCapture = turn.ambientCapture;\n }\n if (turn.sourceValidAt !== undefined) {\n copy.sourceValidAt = turn.sourceValidAt;\n }\n if (turn.parts !== undefined) {\n copy.parts = turn.parts;\n }\n if (turn.rawContent !== undefined) {\n copy.rawContent = turn.rawContent;\n }\n if (turn.sourceFormat !== undefined) {\n copy.sourceFormat = turn.sourceFormat;\n }\n // #3251 scope pins: strings copy by value; the plan object is an immutable\n // config-derived identity passed by reference.\n if (turn.writeNamespaceOverride !== undefined) {\n copy.writeNamespaceOverride = turn.writeNamespaceOverride;\n }\n if (turn.principalOverride !== undefined) {\n copy.principalOverride = turn.principalOverride;\n }\n if (turn.scopeProfileWritePlan !== undefined) {\n copy.scopeProfileWritePlan = turn.scopeProfileWritePlan;\n }\n if (turn.acceptedCapture === true) {\n copy.acceptedCapture = true;\n }\n const ctx = turn.codingContext;\n if (ctx) {\n // All four fields are identity inputs (branchScope uses branch) — copy\n // explicitly as-is; never a spread of external input.\n copy.codingContext = {\n projectId: ctx.projectId,\n branch: ctx.branch,\n rootPath: ctx.rootPath,\n defaultBranch: ctx.defaultBranch,\n };\n }\n return copy;\n}\n\n/**\n * Remove the turns that a drain already extracted (`drained`) from `turns`.\n * Identity-based (role/content/timestamp/session/...): the same comparison\n * the buffer uses to match live turns, so a stale owner can subtract exactly\n * what the drain took and keep everything else.\n */\nexport function subtractBufferTurns(turns: readonly BufferTurn[], drained: readonly BufferTurn[]): BufferTurn[] {\n if (drained.length === 0) return [...turns];\n const kept = [...turns];\n for (const gone of drained) {\n const at = kept.findIndex((live) => bufferTurnsEqual(live, gone));\n if (at >= 0) kept.splice(at, 1);\n }\n return kept;\n}\n\n/** Per-key pending counts over the IN-MEMORY buffer state (counts only — no\n * turn payloads). The claim store's answer stays authoritative for claimed\n * keys; callers must filter through `BufferDrainClaims.isClaimed` before\n * treating a count here as work. */\nexport interface BufferEntryCounts {\n turns: number;\n retainedTurns: number;\n}\n\nexport function bufferEntryCounts(state: BufferState): Map<string, BufferEntryCounts> {\n const out = new Map<string, BufferEntryCounts>();\n const entries = state.entries;\n if (!entries) return out;\n for (const [key, entry] of Object.entries(entries)) {\n out.set(key, { turns: entry.turns.length, retainedTurns: entry.retainedTurns?.length ?? 0 });\n }\n return out;\n}\n\nexport function bufferTurnsEqual(left: BufferTurn | undefined, right: BufferTurn): boolean {\n if (!left) return false;\n return (\n left.role === right.role &&\n left.content === right.content &&\n left.timestamp === right.timestamp &&\n left.sessionKey === right.sessionKey &&\n left.sessionOwnerPrincipal === right.sessionOwnerPrincipal &&\n left.logicalSessionKey === right.logicalSessionKey &&\n left.providerThreadId === right.providerThreadId &&\n left.turnFingerprint === right.turnFingerprint &&\n left.persistProcessedFingerprint === right.persistProcessedFingerprint &&\n left.sourceConnector === right.sourceConnector &&\n left.originRole === right.originRole &&\n left.ambientCapture === right.ambientCapture &&\n left.sourceValidAt === right.sourceValidAt &&\n left.acceptedCapture === right.acceptedCapture &&\n left.codingContext?.projectId === right.codingContext?.projectId &&\n left.codingContext?.rootPath === right.codingContext?.rootPath &&\n left.codingContext?.branch === right.codingContext?.branch &&\n left.codingContext?.defaultBranch === right.codingContext?.defaultBranch &&\n // #3251 scope pins compare by identity triple, not deep plan equality: a\n // restart-rehydrated plan must still match the pin it was accepted under.\n left.writeNamespaceOverride === right.writeNamespaceOverride &&\n left.principalOverride === right.principalOverride &&\n scopeProfilePlanIdentity(left.scopeProfileWritePlan) ===\n scopeProfilePlanIdentity(right.scopeProfileWritePlan)\n );\n}\n\n/**\n * Canonical identity key for a turn, injective over `bufferTurnsEqual`\n * equality classes. Every compared field is a primitive (or the #3251 plan\n * identity string), so set-membership replaces pairwise comparison and turn\n * merges run O(n + m) instead of O(n × m). JSON.stringify of a string is\n * injective (it escapes control characters), and the raw `\\u0001` sentinels\n * distinguish undefined from null — a distinction `===` makes and plain\n * stringification would lose.\n */\nexport function bufferTurnIdentityKey(turn: BufferTurn): string {\n const opt = (value: string | null | undefined): string =>\n value === undefined ? \"\\u0001undefined\" : value === null ? \"\\u0001null\" : JSON.stringify(value);\n const optFlag = (value: boolean | undefined): string =>\n value === undefined ? \"\\u0001undefined\" : String(value);\n const ctx = turn.codingContext;\n return JSON.stringify([\n turn.role,\n turn.content,\n turn.timestamp,\n opt(turn.sessionKey),\n opt(turn.sessionOwnerPrincipal),\n opt(turn.logicalSessionKey),\n turn.providerThreadId === undefined ? \"\\u0001undefined\" : turn.providerThreadId === null ? \"\\u0001null\" : JSON.stringify(turn.providerThreadId),\n opt(turn.turnFingerprint),\n optFlag(turn.persistProcessedFingerprint),\n opt(turn.sourceConnector),\n opt(turn.originRole),\n optFlag(turn.ambientCapture),\n opt(turn.sourceValidAt),\n optFlag(turn.acceptedCapture),\n opt(ctx?.projectId),\n opt(ctx?.rootPath),\n opt(ctx?.branch),\n opt(ctx?.defaultBranch),\n opt(turn.writeNamespaceOverride),\n opt(turn.principalOverride),\n opt(turn.scopeProfileWritePlan ? scopeProfilePlanIdentity(turn.scopeProfileWritePlan) : undefined),\n ]);\n}\n\n/**\n * Identity-dedupe `incoming` turns into `existing` (same contract as the\n * claim-merge `mergeTurns`): identical turns are dropped — the EXISTING\n * entry is kept — genuinely-new turns append in arrival order, and\n * duplicates within `incoming` collapse to their first occurrence. O(n + m)\n * via `bufferTurnIdentityKey` membership instead of pairwise equality.\n */\nexport function mergeBufferTurnsByIdentity(\n existing: readonly BufferTurn[],\n incoming: readonly BufferTurn[],\n): BufferTurn[] {\n const merged = [...existing];\n const seen = new Set(merged.map(bufferTurnIdentityKey));\n for (const turn of incoming) {\n const key = bufferTurnIdentityKey(turn);\n if (seen.has(key)) continue;\n seen.add(key);\n merged.push(turn);\n }\n return merged;\n}\n\n/** Replace only the processed snapshot; callers without one retain legacy whole-slot semantics. */\nexport function selectRetainedDeferredTurns(\n existing: readonly BufferTurn[],\n turns: BufferTurn[],\n max: number,\n originalTurns?: readonly BufferTurn[],\n): BufferTurn[] {\n const others = originalTurns === undefined ? [] : existing.filter(\n (turn) => !originalTurns.some((original) => bufferTurnsEqual(turn, original)),\n );\n if (!Array.isArray(turns) || max <= 0) return others;\n return [...others, ...turns.slice(-max).map(copyBufferTurn)];\n}\n\nexport function hasPinnedCaptureScope(turn: BufferTurn): boolean {\n return turn.acceptedCapture === true ||\n turn.writeNamespaceOverride !== undefined ||\n turn.scopeProfileWritePlan !== undefined;\n}\n\n/** Stable identity string for a pinned scope-profile plan (#3251). */\nexport function scopeProfilePlanIdentity(\n plan: BufferTurn[\"scopeProfileWritePlan\"],\n): string {\n if (!plan) return \"\";\n return `${plan.profileId}\\u0000${plan.writeLayer}\\u0000${plan.writeNamespace}`;\n}\n\nexport interface ExtractionScopeGroup {\n writeNamespaceOverride?: string;\n principalOverride?: string;\n scopeProfileWritePlan?: BufferTurn[\"scopeProfileWritePlan\"];\n codingContext?: BufferTurn[\"codingContext\"];\n turns: BufferTurn[];\n}\n\n/**\n * Partition extraction turns by their durable scope pins (#3251). Turns\n * captured under different namespaces / principals / scope profiles /\n * project bindings must never be extracted together — each group runs its\n * own extraction under its own scope. Native (unpinned) turns form their own\n * group and keep today's single-store routing.\n */\nexport function groupTurnsByExtractionScope(turns: BufferTurn[]): ExtractionScopeGroup[] {\n const groups = new Map<string, ExtractionScopeGroup>();\n for (const turn of turns) {\n const key = [\n turn.writeNamespaceOverride ?? \"\",\n turn.principalOverride ?? \"\",\n scopeProfilePlanIdentity(turn.scopeProfileWritePlan),\n // Accepted captures are deliberately accepted content: they must never\n // share a scope group with ordinary turns, or a group-level capture\n // policy (the explicit-mode gate, the planless-accepted null pin) is\n // applied to ordinary conversation turns because `.some(acceptedCapture)`\n // only looked at the merged group.\n turn.acceptedCapture === true ? \"accepted\" : \"\",\n turn.codingContext?.projectId ?? \"\",\n turn.codingContext?.rootPath ?? \"\",\n turn.codingContext?.branch ?? \"\",\n turn.codingContext?.defaultBranch ?? \"\",\n ].join(\"\\u0000\");\n const group = groups.get(key);\n if (group) {\n group.turns.push(turn);\n } else {\n const created: ExtractionScopeGroup = { turns: [turn] };\n if (turn.writeNamespaceOverride !== undefined) created.writeNamespaceOverride = turn.writeNamespaceOverride;\n if (turn.principalOverride !== undefined) created.principalOverride = turn.principalOverride;\n if (turn.scopeProfileWritePlan !== undefined) created.scopeProfileWritePlan = turn.scopeProfileWritePlan;\n if (turn.codingContext !== undefined) created.codingContext = turn.codingContext;\n groups.set(key, created);\n }\n }\n return [...groups.values()];\n}\n\nexport function bufferTurnArraysEqual(\n left: readonly BufferTurn[],\n right: readonly BufferTurn[],\n): boolean {\n return left.length === right.length && left.every((turn, index) => bufferTurnsEqual(turn, right[index]));\n}\n\nexport function bufferTurnArrayIsSuffixOfSnapshot(\n liveTurns: readonly BufferTurn[],\n snapshot: readonly BufferTurn[],\n): boolean {\n if (liveTurns.length === 0 || liveTurns.length > snapshot.length) {\n return false;\n }\n const offset = snapshot.length - liveTurns.length;\n return liveTurns.every((turn, index) => bufferTurnsEqual(turn, snapshot[offset + index]));\n}\n\nexport function liveTurnsFromExtractionSnapshot(\n entry: BufferEntryState,\n extractedTurns: readonly BufferTurn[],\n): readonly BufferTurn[] {\n const retainedTurns = entry.retainedTurns ?? [];\n if (\n retainedTurns.length > 0 &&\n extractedTurns.length >= retainedTurns.length &&\n retainedTurns.every((turn, index) => bufferTurnsEqual(extractedTurns[index], turn))\n ) {\n const withoutRetainedPrefix = extractedTurns.slice(retainedTurns.length);\n if (withoutRetainedPrefix.length > 0 && matchingPrefixLength(entry.turns, withoutRetainedPrefix) > 0) {\n return withoutRetainedPrefix;\n }\n }\n return extractedTurns;\n}\n\nfunction matchingPrefixLength(\n liveTurns: readonly BufferTurn[],\n extractedTurns: readonly BufferTurn[],\n): number {\n let index = 0;\n while (\n index < liveTurns.length &&\n index < extractedTurns.length &&\n bufferTurnsEqual(liveTurns[index], extractedTurns[index])\n ) {\n index += 1;\n }\n return index;\n}\n\nexport function matchingQueuedExtractionPrefixLength(\n liveTurns: readonly BufferTurn[],\n extractedTurns: readonly BufferTurn[],\n): number {\n let bestMatchedCount = 0;\n for (let start = 0; start < extractedTurns.length; start += 1) {\n const matchedCount = matchingPrefixLength(liveTurns, extractedTurns.slice(start));\n if (matchedCount > bestMatchedCount) {\n bestMatchedCount = matchedCount;\n if (bestMatchedCount === liveTurns.length) break;\n }\n }\n return bestMatchedCount;\n}\n\nexport class ProbeTimeoutError extends Error {\n constructor(timeoutMs: number) {\n super(`probe exceeded ${timeoutMs}ms`);\n this.name = \"ProbeTimeoutError\";\n }\n}\n\nexport function probeWithTimeout<T>(inflight: Promise<T>, timeoutMs: number): Promise<T> {\n let timer: NodeJS.Timeout | null = null;\n const timeout = new Promise<T>((_, reject) => {\n timer = setTimeout(() => reject(new ProbeTimeoutError(timeoutMs)), timeoutMs);\n if (typeof (timer as NodeJS.Timeout).unref === \"function\") {\n (timer as NodeJS.Timeout).unref();\n }\n });\n return Promise.race([inflight, timeout]).finally(() => {\n if (timer) clearTimeout(timer);\n });\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
PROJECTION_REBUILD_RUNNER_FLAG
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-VWHWWIFS.js";
|
|
4
4
|
import {
|
|
5
5
|
startLocationAutoSync
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-PUP7NTNB.js";
|
|
7
7
|
import {
|
|
8
8
|
ensureContradictionScanCron,
|
|
9
9
|
ensureDaySummaryCron,
|
|
@@ -18,17 +18,17 @@ import {
|
|
|
18
18
|
isIsoWeekId,
|
|
19
19
|
msUntilNextIsoWeek,
|
|
20
20
|
previousIsoWeekId
|
|
21
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-IXBIL5WY.js";
|
|
22
22
|
import {
|
|
23
23
|
rebuildMemoryLifecycleLedger
|
|
24
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-KPCTZB3U.js";
|
|
25
25
|
import {
|
|
26
26
|
planNamespaceMaintenance,
|
|
27
27
|
runNamespaceMaintenanceBatchPlan
|
|
28
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-WBMT3C6A.js";
|
|
29
29
|
import {
|
|
30
30
|
rebuildMemoryProjection
|
|
31
|
-
} from "./chunk-
|
|
31
|
+
} from "./chunk-DLLQMNYQ.js";
|
|
32
32
|
import {
|
|
33
33
|
DEFAULT_TIMELINE_CATEGORIES,
|
|
34
34
|
TIMELINE_RESERVED_IDLE,
|
|
@@ -2874,4 +2874,4 @@ export {
|
|
|
2874
2874
|
ActivitySyncScheduler,
|
|
2875
2875
|
MaintenanceScheduler
|
|
2876
2876
|
};
|
|
2877
|
-
//# sourceMappingURL=chunk-
|
|
2877
|
+
//# sourceMappingURL=chunk-4SOISEZ3.js.map
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
SupportPassportError,
|
|
3
3
|
SupportPassportOwnerCreateGrantRequestSchema,
|
|
4
4
|
getOperation
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-GO2GCJ7S.js";
|
|
6
6
|
|
|
7
7
|
// src/support-passport/access-http.ts
|
|
8
8
|
var OWNER_ROOT = "/engram/v1/support-passport";
|
|
@@ -137,4 +137,4 @@ export {
|
|
|
137
137
|
SUPPORT_PASSPORT_OWNER_HTTP_ROUTES,
|
|
138
138
|
handleSupportPassportOwnerHttp
|
|
139
139
|
};
|
|
140
|
-
//# sourceMappingURL=chunk-
|
|
140
|
+
//# sourceMappingURL=chunk-55NKJDKX.js.map
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
} from "./chunk-LXATZLSC.js";
|
|
12
12
|
import {
|
|
13
13
|
StorageManager
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-45SFSQON.js";
|
|
15
15
|
import {
|
|
16
16
|
isValidityExpiredNow
|
|
17
17
|
} from "./chunk-6CIAGZ6X.js";
|
|
@@ -416,4 +416,4 @@ export {
|
|
|
416
416
|
readProjectedHarmonicGraph,
|
|
417
417
|
searchHarmonicRetrieval
|
|
418
418
|
};
|
|
419
|
-
//# sourceMappingURL=chunk-
|
|
419
|
+
//# sourceMappingURL=chunk-5XOCAJHC.js.map
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
import {
|
|
5
5
|
computeCorpusWatermarks,
|
|
6
6
|
resolveCorpusNamespaceRoots
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-QYLEE4UQ.js";
|
|
8
8
|
|
|
9
9
|
// src/operator-doctor-corpus.ts
|
|
10
10
|
var DIGEST_PREFIX_LENGTH = 12;
|
|
@@ -78,4 +78,4 @@ export {
|
|
|
78
78
|
corpusWatermarksFromCheck,
|
|
79
79
|
summarizeCorpusAndReplica
|
|
80
80
|
};
|
|
81
|
-
//# sourceMappingURL=chunk-
|
|
81
|
+
//# sourceMappingURL=chunk-62O7YWBR.js.map
|
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
} from "./chunk-3UXOZBHV.js";
|
|
15
15
|
import {
|
|
16
16
|
StorageManager
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-45SFSQON.js";
|
|
18
18
|
import {
|
|
19
19
|
OKF_PROFILE_TYPE,
|
|
20
20
|
okfTypeForMemory
|
|
@@ -272,4 +272,4 @@ export {
|
|
|
272
272
|
exportOkfBundle,
|
|
273
273
|
firstHeading
|
|
274
274
|
};
|
|
275
|
-
//# sourceMappingURL=chunk-
|
|
275
|
+
//# sourceMappingURL=chunk-6EKP7BJW.js.map
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
2
|
bufferTurnsEqual,
|
|
3
|
+
mergeBufferTurnsByIdentity,
|
|
3
4
|
subtractBufferTurns
|
|
4
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-4KLQI3L2.js";
|
|
5
6
|
import {
|
|
6
7
|
withHeldFileLock
|
|
7
8
|
} from "./chunk-EBV6VXKF.js";
|
|
@@ -250,27 +251,21 @@ var CLAIM_LOCK_MAX_WAIT_MS = 12e4;
|
|
|
250
251
|
function emptyEntry() {
|
|
251
252
|
return { turns: [], lastExtractionAt: null, extractionCount: 0 };
|
|
252
253
|
}
|
|
253
|
-
function mergeTurns(existing, incoming
|
|
254
|
-
|
|
255
|
-
for (const turn of incoming) {
|
|
256
|
-
if (merged.some((kept) => isEqual(kept, turn))) continue;
|
|
257
|
-
merged.push(turn);
|
|
258
|
-
}
|
|
259
|
-
return merged;
|
|
254
|
+
function mergeTurns(existing, incoming) {
|
|
255
|
+
return mergeBufferTurnsByIdentity(existing, incoming);
|
|
260
256
|
}
|
|
261
257
|
function mergeEntries(claim, incoming) {
|
|
262
258
|
const entry = emptyEntry();
|
|
263
259
|
const gone = [...claim.drained ?? [], ...claim.drainedRetained ?? []];
|
|
264
260
|
entry.turns = mergeTurns(
|
|
265
261
|
subtractBufferTurns(claim.entry.turns, gone),
|
|
266
|
-
subtractBufferTurns(incoming.turns, gone)
|
|
267
|
-
bufferTurnsEqual
|
|
262
|
+
subtractBufferTurns(incoming.turns, gone)
|
|
268
263
|
);
|
|
269
264
|
const retained = [
|
|
270
265
|
...subtractBufferTurns(claim.entry.retainedTurns ?? [], gone),
|
|
271
266
|
...subtractBufferTurns(incoming.retainedTurns ?? [], gone)
|
|
272
267
|
];
|
|
273
|
-
const dedupedRetained = mergeTurns([], retained
|
|
268
|
+
const dedupedRetained = mergeTurns([], retained);
|
|
274
269
|
if (dedupedRetained.length > 0) entry.retainedTurns = dedupedRetained;
|
|
275
270
|
const stamps = [claim.entry.lastExtractionAt, incoming.lastExtractionAt].filter(
|
|
276
271
|
(value) => value !== null && value !== void 0
|
|
@@ -566,7 +561,7 @@ var BufferDrainClaims = class {
|
|
|
566
561
|
const lateRetained = (claim.entry.retainedTurns ?? []).filter(
|
|
567
562
|
(turn) => !seenRetained.some((snapshot) => bufferTurnsEqual(snapshot, turn)) && !kept(turn)
|
|
568
563
|
);
|
|
569
|
-
if (lateRetained.length > 0) next.retainedTurns = mergeTurns(entryRetained, lateRetained
|
|
564
|
+
if (lateRetained.length > 0) next.retainedTurns = mergeTurns(entryRetained, lateRetained);
|
|
570
565
|
await this.writeClaimBody(key, { ...claim, entry: next, drained, drainedRetained });
|
|
571
566
|
});
|
|
572
567
|
}
|
|
@@ -716,4 +711,4 @@ export {
|
|
|
716
711
|
legacyStateToEntries,
|
|
717
712
|
BufferSessionFiles
|
|
718
713
|
};
|
|
719
|
-
//# sourceMappingURL=chunk-
|
|
714
|
+
//# sourceMappingURL=chunk-7PMOCQOL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/storage/buffer-drain-claims.ts","../src/storage/buffer-session-files.ts"],"sourcesContent":["/**\n * Durable drain claims for the extraction buffer (`remnic buffer drain`).\n *\n * A claim is the atomic handover of one session's buffered turns from the\n * live buffer (daemon or CLI process) to a drain worker, so extraction can\n * run out of process without a live buffer owner resurrecting or losing the\n * turns. Files under `<stateDir>/buffer/drain/`:\n *\n * s-<sha256(key)>.json claim content: { key, entry, claimedAt }\n * — the turns NOT yet extracted. Renamed into\n * place from the session file (atomic on one\n * filesystem), rewritten atomically as chunks\n * drain.\n * s-<sha256(key)>.lease.json { ownerId, pid, acquiredAt, heartbeatAt,\n * leaseMs } — created with exclusive-create so\n * exactly one drainer holds a key.\n *\n * Invariants (see the buffer-drain PR for the full protocol):\n * - At every instant the claim content file holds exactly the turns whose\n * extraction is not durably finished, so a kill at any point loses\n * nothing and the next run resumes.\n * - A live buffer owner that must persist a claimed session hands its\n * in-memory entry INTO the claim (merge, identity-deduped) instead of\n * writing a session file — it can never resurrect claimed turns.\n * - Claims are idempotent: re-claiming, double-draining, and two\n * concurrent drainers are all safe (per-key mutation lock + exclusive\n * lease; the lock also fences lease takeover and progress writes).\n *\n * All content reads/writes go through the storage's secure file I/O\n * (`BufferFileIo`); only lease/existence checks touch raw paths, and claim\n * rewrites serialize on a cross-process held file lock.\n */\n\nimport { hostname } from \"node:os\";\nimport { z } from \"zod\";\nimport { existsSync } from \"node:fs\";\nimport { mkdir, readdir, rename, unlink, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { bufferSessionFileName, type BufferFileIo } from \"./buffer-session-files.js\";\nimport { bufferTurnsEqual, mergeBufferTurnsByIdentity, subtractBufferTurns } from \"../buffer-turn-helpers.js\";\nimport { log } from \"../logger.js\";\nimport { withHeldFileLock } from \"../utils/serialize-mutations.js\";\nimport type { BufferEntryState, BufferTurn } from \"../types.js\";\n\n/** Result of persisting one session's entry. */\nexport interface BufferSessionSaveOutcome {\n /** \"saved\": the session file holds the entry. \"handed_over\": the entry moved into a drain claim. */\n status: \"saved\" | \"handed_over\";\n /** Turns a drain already extracted (claim tombstone): the owner subtracts them from its copy. */\n drainedTurns?: BufferTurn[];\n}\n\nexport interface DrainLease {\n ownerId: string;\n pid: number;\n /** Host the owner runs on: a takeover may only judge liveness on that host. */\n host: string;\n acquiredAt: string;\n heartbeatAt: string;\n leaseMs: number;\n}\n\nexport interface DrainClaimFile {\n key: string;\n entry: BufferEntryState;\n claimedAt: string;\n /**\n * Turns the drain already extracted. Non-empty means the session was\n * drained and the claim is a TOMBSTONE: a live buffer owner subtracts\n * these from its (possibly stale) copy instead of writing them back, so\n * drained turns can never be resurrected.\n */\n drained?: BufferTurn[];\n /** Same tombstone for turns the drain extracted from `retainedTurns`. */\n drainedRetained?: BufferTurn[];\n}\n\nexport type ClaimFromSessionOutcome = \"claimed\" | \"empty\" | \"already_claimed\";\nexport type AdoptOutcome = \"adopted\" | \"busy\";\nexport type AckOutcome = \"acked\" | \"not_empty\" | \"busy\";\n\nexport interface DrainClaimListing {\n key: string;\n turnCount: number;\n leased: boolean;\n leaseExpired: boolean;\n}\n\n/** Lock while a claim is read-modify-written; released on settle. */\nconst CLAIM_LOCK_STALE_MS = 120_000;\nconst CLAIM_LOCK_MAX_WAIT_MS = 120_000;\n\nfunction emptyEntry(): BufferEntryState {\n return { turns: [], lastExtractionAt: null, extractionCount: 0 };\n}\n\n/** Identity-dedupe `incoming` turns into `existing` (they are the same turns a\n * live owner still held after claiming; only genuinely NEW turns append). */\nfunction mergeTurns(existing: BufferTurn[], incoming: readonly BufferTurn[]): BufferTurn[] {\n return mergeBufferTurnsByIdentity(existing, incoming);\n}\n\nfunction mergeEntries(claim: DrainClaimFile, incoming: BufferEntryState): DrainClaimFile {\n const entry = emptyEntry();\n // Turns already extracted stay out of the pending entry even when the\n // owner's incoming copy is stale and still carries them (either tombstone\n // list counts — a turn in either one left the claim for good).\n const gone = [...(claim.drained ?? []), ...(claim.drainedRetained ?? [])];\n entry.turns = mergeTurns(\n subtractBufferTurns(claim.entry.turns, gone),\n subtractBufferTurns(incoming.turns, gone),\n );\n const retained = [\n ...subtractBufferTurns(claim.entry.retainedTurns ?? [], gone),\n ...subtractBufferTurns(incoming.retainedTurns ?? [], gone),\n ];\n // SAFETY: an empty accumulator of the same element type.\n const dedupedRetained = mergeTurns([], retained);\n if (dedupedRetained.length > 0) entry.retainedTurns = dedupedRetained;\n const stamps = [claim.entry.lastExtractionAt, incoming.lastExtractionAt].filter(\n (value): value is string => value !== null && value !== undefined,\n );\n entry.lastExtractionAt = stamps.sort().at(-1) ?? null;\n entry.extractionCount = Math.max(claim.entry.extractionCount, incoming.extractionCount);\n return { ...claim, entry };\n}\n\n/**\n * Is the lease owner still running? Only decidable on the owner's host; a\n * lease from another host counts as alive (its expiry decides).\n */\nfunction isOwnerAlive(lease: DrainLease): boolean {\n if (lease.host !== hostname()) return true;\n if (!Number.isInteger(lease.pid) || lease.pid <= 0) return true;\n try {\n process.kill(lease.pid, 0);\n return true;\n } catch (err) {\n // EPERM: the process exists but belongs to another user.\n // SAFETY: the value comes from this module's own write path; the shape is checked above.\n return (err as NodeJS.ErrnoException)?.code === \"EPERM\";\n }\n}\n\nfunction isLeaseExpired(lease: DrainLease, now = Date.now()): boolean {\n const heartbeat = Date.parse(lease.heartbeatAt);\n return !Number.isFinite(heartbeat) || now - heartbeat > lease.leaseMs;\n}\n\nconst claimBodySchema = z.object({\n key: z.string().min(1),\n entry: z.object({\n turns: z.array(z.unknown()),\n retainedTurns: z.array(z.unknown()).optional(),\n lastExtractionAt: z.string().nullable().optional(),\n extractionCount: z.number().optional(),\n }).optional(),\n turns: z.array(z.unknown()).optional(),\n retainedTurns: z.array(z.unknown()).optional(),\n lastExtractionAt: z.string().nullable().optional(),\n extractionCount: z.number().optional(),\n claimedAt: z.string().optional(),\n drained: z.array(z.unknown()).optional(),\n drainedRetained: z.array(z.unknown()).optional(),\n});\n\nfunction parseBody(raw: string): DrainClaimFile | null {\n let body: z.infer<typeof claimBodySchema>;\n try {\n body = claimBodySchema.parse(JSON.parse(raw));\n } catch {\n return null;\n }\n // Two on-disk shapes, one format: a claim born from rename keeps the flat\n // session-file shape ({key, turns, ...}) until its first rewrite, which\n // nests under `entry`. Accept both.\n const source = body.entry && Array.isArray(body.entry.turns) ? body.entry : body;\n if (!Array.isArray(source.turns)) return null;\n const entry = emptyEntry();\n // SAFETY: the schema parsed these as an array of unknown; the claim file\n // is written only by this module (BufferSessionFiles.save), so the entries\n // are BufferTurn values.\n // SAFETY: the claim file is written only by this module, so the parsed\n // turn arrays hold BufferTurn values.\n // SAFETY: the value comes from this module's own write path; the shape is checked above.\n entry.turns = source.turns as BufferTurn[];\n if (source.retainedTurns) {\n // SAFETY: same boundary as the turns above (this module writes the file).\n entry.retainedTurns = source.retainedTurns as BufferTurn[];\n }\n entry.lastExtractionAt = source.lastExtractionAt ?? null;\n entry.extractionCount = Number.isFinite(source.extractionCount) ? Number(source.extractionCount) : 0;\n const claim: DrainClaimFile = {\n key: body.key,\n entry,\n claimedAt: body.claimedAt ?? new Date().toISOString(),\n };\n if (Array.isArray(body.drained)) {\n // SAFETY: same boundary as the turns above (this module writes the file).\n claim.drained = body.drained as BufferTurn[];\n }\n if (Array.isArray(body.drainedRetained)) {\n // SAFETY: same boundary as the turns above (this module writes the file).\n claim.drainedRetained = body.drainedRetained as BufferTurn[];\n }\n return claim;\n}\n\nconst leaseSchema = z.object({\n ownerId: z.string().min(1),\n pid: z.number().optional(),\n host: z.string().optional(),\n acquiredAt: z.string().optional(),\n heartbeatAt: z.string(),\n leaseMs: z.number(),\n});\n\nfunction parseLease(raw: string): DrainLease | null {\n let lease: z.infer<typeof leaseSchema>;\n try {\n lease = leaseSchema.parse(JSON.parse(raw));\n } catch {\n return null;\n }\n return {\n ownerId: lease.ownerId,\n pid: lease.pid ?? 0,\n host: lease.host ?? \"\",\n acquiredAt: lease.acquiredAt ?? lease.heartbeatAt,\n heartbeatAt: lease.heartbeatAt,\n leaseMs: lease.leaseMs,\n };\n}\n\n/** Claim bodies `listPage` may read per requested entry: bounds one scan's\n * I/O even when the directory is mostly empty tombstones. */\nconst LIST_PAGE_SCAN_FACTOR = 8;\n\nexport class BufferDrainClaims {\n constructor(\n private readonly stateDir: string,\n private readonly io: BufferFileIo,\n ) {}\n\n private get dir(): string {\n return path.join(this.stateDir, \"buffer\", \"drain\");\n }\n\n private fileFor(key: string): string {\n return path.join(this.dir, bufferSessionFileName(key));\n }\n\n private leaseFileFor(key: string): string {\n return `${this.fileFor(key)}.lease.json`;\n }\n\n private lockFileFor(key: string): string {\n return `${this.fileFor(key)}.lock`;\n }\n\n /** Sync existence check for hot-path gates (`SmartBuffer.isSessionClaimed`). */\n isClaimed(key: string): boolean {\n return existsSync(this.fileFor(key));\n }\n\n /** Test + CLI seam: the lease file path for direct inspection. */\n leasePathForTest(key: string): string {\n return this.leaseFileFor(key);\n }\n\n private async readClaimBody(key: string): Promise<DrainClaimFile | null> {\n try {\n return parseBody(await this.io.read(this.fileFor(key)));\n } catch {\n return null;\n }\n }\n\n /** The claim content for `key`, or null when the key is not claimed. */\n load(key: string): Promise<DrainClaimFile | null> {\n return this.readClaimBody(key);\n }\n\n private async writeClaimBody(key: string, claim: DrainClaimFile): Promise<void> {\n await mkdir(this.dir, { recursive: true });\n await this.io.write(this.fileFor(key), JSON.stringify({ ...claim, key }));\n }\n\n private async readLease(key: string): Promise<DrainLease | null> {\n try {\n return parseLease(await this.io.read(this.leaseFileFor(key)));\n } catch {\n return null;\n }\n }\n\n private async writeLease(key: string, lease: DrainLease): Promise<void> {\n await mkdir(this.dir, { recursive: true });\n await this.io.write(this.leaseFileFor(key), JSON.stringify(lease));\n }\n\n /**\n * Atomically move a session's persisted file into a claim. The rename is\n * the handover: after it settles the turns exist ONLY as a claim, so no\n * crash window can lose them or leave them in both places. Callers that\n * lose the race (`already_claimed`) simply skip the key.\n *\n * The whole handover runs under the claim's mutation lock, so a claim\n * create can never land on top of an existing claim (POSIX rename would\n * silently replace it) and the lease write cannot race an adopter.\n */\n async claimFromSessionFile(key: string, lease: DrainLease): Promise<ClaimFromSessionOutcome> {\n await mkdir(this.dir, { recursive: true });\n const sessionPath = path.join(this.stateDir, \"buffer\", bufferSessionFileName(key));\n if (existsSync(sessionPath)) {\n // Advisory pre-read: an empty live session belongs to its owner, not\n // the drain. A turn landing between this read and the rename is fine —\n // the rename moves whatever is there and the claim drains it.\n try {\n const seeded = parseBody(await this.io.read(sessionPath));\n if (seeded && seeded.entry.turns.length === 0 && (seeded.entry.retainedTurns?.length ?? 0) === 0) {\n return \"empty\";\n }\n } catch {\n // Unreadable live file: proceed with the rename and let the claim\n // path report it loudly, like the loader skips corrupt files.\n }\n }\n return await withHeldFileLock(\n this.lockFileFor(key),\n { staleMs: CLAIM_LOCK_STALE_MS, maxWaitMs: CLAIM_LOCK_MAX_WAIT_MS },\n async (acquired) => {\n if (!acquired) return \"already_claimed\";\n // Under the lock the claim check is authoritative: an existing claim\n // keeps its content and its lease; the session file stays with its\n // owner (their next save merges into the claim).\n if (this.isClaimed(key)) return \"already_claimed\";\n try {\n await rename(sessionPath, this.fileFor(key));\n } catch (err) {\n // The session file is gone: either it never existed, or another\n // drainer claimed it first.\n if (!existsSync(sessionPath)) {\n if (this.isClaimed(key)) return \"already_claimed\";\n return \"empty\";\n }\n throw err;\n }\n const claim = await this.readClaimBody(key);\n if (!claim || (claim.entry.turns.length === 0 && (claim.entry.retainedTurns?.length ?? 0) === 0)) {\n // Empty content: nothing to drain. Delete the moved file so the\n // empty entry keeps living with its owner, not as a stale claim.\n await unlink(this.fileFor(key)).catch(() => {});\n return \"empty\";\n }\n await this.writeLease(key, lease);\n return \"claimed\";\n },\n );\n }\n\n /**\n * Take over a claim whose lease is missing, expired, or whose owner died.\n * The whole judgement runs under the claim's mutation lock and re-reads\n * the lease inside it, so exactly one concurrent adopter wins: the loser\n * re-reads the winner's fresh lease and reports \"busy\" instead of\n * unlinking it. A lease whose owner died is taken over in the same call.\n */\n async adopt(key: string, lease: DrainLease): Promise<AdoptOutcome> {\n if (!this.isClaimed(key)) return \"busy\";\n return await withHeldFileLock(\n this.lockFileFor(key),\n { staleMs: CLAIM_LOCK_STALE_MS, maxWaitMs: CLAIM_LOCK_MAX_WAIT_MS },\n async (acquired) => {\n if (!acquired) return \"busy\";\n const existing = await this.readLease(key);\n if (existing && !isLeaseExpired(existing)) {\n if (existing.ownerId === lease.ownerId) {\n // The same drainer already holds it: renew the lease.\n await this.writeLease(key, { ...existing, heartbeatAt: new Date().toISOString(), leaseMs: lease.leaseMs });\n return \"adopted\";\n }\n if (isOwnerAlive(existing)) return \"busy\";\n // The owner died without releasing the claim (killed worker):\n // take it over now instead of waiting for the lease to expire.\n await unlink(this.leaseFileFor(key)).catch(() => {});\n } else if (existing) {\n // Expired lease: clear it before the exclusive create. We hold the\n // lock, so no concurrent adopter can interleave its own\n // unlink/create between these steps.\n await unlink(this.leaseFileFor(key)).catch(() => {});\n }\n try {\n await writeFile(this.leaseFileFor(key), JSON.stringify(lease), { flag: \"wx\" });\n } catch (err) {\n // The lease file exists: another drainer took it first.\n if (existsSync(this.leaseFileFor(key))) return \"busy\";\n throw err;\n }\n return \"adopted\";\n },\n );\n }\n\n /**\n * Merge a live owner's in-memory entry INTO the claim (the handover path a\n * buffer owner takes instead of persisting a claimed session). Serialized\n * against drainer progress writes on the same lock.\n */\n async mergeIntoClaim(key: string, incoming: BufferEntryState): Promise<void> {\n await withHeldFileLock(this.lockFileFor(key), { staleMs: CLAIM_LOCK_STALE_MS, maxWaitMs: CLAIM_LOCK_MAX_WAIT_MS }, async (acquired) => {\n if (!acquired) {\n // Never fall back to a session-file write behind a held claim lock:\n // that would resurrect claimed turns. Fail so the owner's save stays\n // pending and retries (SmartBuffer keeps pending state on failure).\n throw new Error(`buffer drain claim for ${key} is busy; retrying the save later`);\n }\n const claim = await this.readClaimBody(key);\n if (!claim) {\n // The claim vanished (acked between the isClaimed check and now):\n // nothing to hand over; the drain already owns everything.\n return;\n }\n await this.writeClaimBody(key, mergeEntries(claim, incoming));\n });\n }\n\n /** Drainer progress: replace the claim content with what is left to do.\n *\n * Fenced: `ownerId` must still match the claim's lease (checked under the\n * same lock), so a drainer that lost its lease cannot write progress that\n * would restore turns the new owner already extracted.\n *\n * `seen` is the entry the drainer LOADED (its snapshot of the claim). Only\n * turns that were in that snapshot and are absent from BOTH of the\n * drainer's lists were actually extracted and move to the tombstones — a\n * turn the drainer moved into `entry.retainedTurns` is retained for retry,\n * not extracted. Turns a live owner merged into the claim afterwards stay\n * pending. Without `seen` the pre-existing behavior is kept (every claim\n * turn missing from `entry` counts as extracted).\n */\n async writeEntry(key: string, ownerId: string, entry: BufferEntryState, seen?: BufferEntryState): Promise<void> {\n await withHeldFileLock(this.lockFileFor(key), { staleMs: CLAIM_LOCK_STALE_MS, maxWaitMs: CLAIM_LOCK_MAX_WAIT_MS }, async (acquired) => {\n if (!acquired) throw new Error(`buffer drain claim for ${key} is busy; progress write skipped`);\n const lease = await this.readLease(key);\n if (!lease || lease.ownerId !== ownerId) {\n throw new Error(`buffer drain claim for ${key} is no longer owned by ${ownerId}; progress write skipped`);\n }\n const claim = await this.readClaimBody(key);\n if (!claim) return;\n const seenTurns = seen?.turns ?? claim.entry.turns;\n const seenRetained = seen?.retainedTurns ?? claim.entry.retainedTurns ?? [];\n const entryRetained = entry.retainedTurns ?? [];\n // Still held by the drainer: in its remaining turns OR retained for retry.\n const kept = (turn: BufferTurn): boolean =>\n entry.turns.some((held) => bufferTurnsEqual(held, turn)) || entryRetained.some((held) => bufferTurnsEqual(held, turn));\n // Progress: the snapshot turns that vanished from the entry were extracted.\n const drained = [...(claim.drained ?? [])];\n for (const turn of claim.entry.turns) {\n const extracted =\n seenTurns.some((snapshot) => bufferTurnsEqual(snapshot, turn)) && !kept(turn);\n if (!extracted) continue;\n if (drained.some((gone) => bufferTurnsEqual(gone, turn))) continue;\n drained.push(turn);\n }\n const drainedRetained = [...(claim.drainedRetained ?? [])];\n for (const turn of claim.entry.retainedTurns ?? []) {\n const extracted =\n seenRetained.some((snapshot) => bufferTurnsEqual(snapshot, turn)) && !kept(turn);\n if (!extracted) continue;\n if (drained.some((gone) => bufferTurnsEqual(gone, turn)) || drainedRetained.some((gone) => bufferTurnsEqual(gone, turn))) continue;\n drainedRetained.push(turn);\n }\n // Turns merged in after the drainer loaded stay pending, in extraction\n // order behind the drainer's own remainder.\n const late = claim.entry.turns.filter(\n (turn) =>\n !seenTurns.some((snapshot) => bufferTurnsEqual(snapshot, turn)) && !kept(turn),\n );\n const next: BufferEntryState = { ...entry, turns: [...entry.turns, ...late] };\n const lateRetained = (claim.entry.retainedTurns ?? []).filter(\n (turn) =>\n !seenRetained.some((snapshot) => bufferTurnsEqual(snapshot, turn)) && !kept(turn),\n );\n if (lateRetained.length > 0) next.retainedTurns = mergeTurns(entryRetained, lateRetained);\n await this.writeClaimBody(key, { ...claim, entry: next, drained, drainedRetained });\n });\n }\n\n /** Extend the lease. \"lost\" means another drainer took the claim over.\n * Serialized on the claim lock so a stale heartbeat can never overwrite a\n * new owner's lease mid-takeover; a contended lock just skips this tick\n * (usually the drainer's own progress write holds it). */\n async heartbeat(key: string, ownerId: string, leaseMs: number): Promise<\"ok\" | \"lost\"> {\n return await withHeldFileLock(this.lockFileFor(key), { staleMs: CLAIM_LOCK_STALE_MS, maxWaitMs: CLAIM_LOCK_MAX_WAIT_MS }, async (acquired) => {\n if (!acquired) return \"ok\";\n const lease = await this.readLease(key);\n if (!lease || lease.ownerId !== ownerId) return \"lost\";\n await this.writeLease(key, { ...lease, heartbeatAt: new Date().toISOString(), leaseMs });\n return \"ok\";\n });\n }\n\n /** Give the key back (content stays; the next run resumes it). */\n async releaseLease(key: string, ownerId: string): Promise<void> {\n const lease = await this.readLease(key);\n if (!lease || lease.ownerId !== ownerId) return;\n await unlink(this.leaseFileFor(key)).catch(() => {});\n }\n\n /**\n * Finish a claim: only its owner may ack, and only when nothing is left to\n * extract. Non-empty claims stay (deferred content is never dropped here).\n */\n async ack(key: string, ownerId: string): Promise<AckOutcome> {\n const lease = await this.readLease(key);\n if (!lease || lease.ownerId !== ownerId) return \"busy\";\n const claim = await this.readClaimBody(key);\n if (!claim) {\n await unlink(this.leaseFileFor(key)).catch(() => {});\n return \"acked\";\n }\n if (claim.entry.turns.length > 0 || (claim.entry.retainedTurns?.length ?? 0) > 0) return \"not_empty\";\n // Keep the (empty) claim file as a TOMBSTONE: a live buffer owner that\n // still holds a stale copy subtracts the drained turns instead of\n // writing them back. The owner consumes the tombstone on its next save.\n await unlink(this.leaseFileFor(key)).catch(() => {});\n return \"acked\";\n }\n\n /** The turns a drain already extracted for `key` (tombstone content). */\n async drainedTurns(key: string): Promise<BufferTurn[]> {\n const claim = await this.readClaimBody(key);\n return claim?.drained ?? [];\n }\n\n /**\n * Is the drain for `key` FINISHED (acked): the claim holds extracted turns\n * and nothing pending, and the drainer dropped its lease. A claim with\n * partial progress or a live lease is still being drained — its owner must\n * merge into it, never release it.\n */\n async isDrained(key: string): Promise<boolean> {\n const claim = await this.readClaimBody(key);\n if (!claim) return false;\n if ((claim.drained?.length ?? 0) === 0 && (claim.drainedRetained?.length ?? 0) === 0) return false;\n if (claim.entry.turns.length > 0 || (claim.entry.retainedTurns?.length ?? 0) > 0) return false;\n return (await this.readLease(key)) === null;\n }\n\n /** Drop the claim file entirely (its owner consumed the tombstone). */\n async release(key: string): Promise<void> {\n await unlink(this.fileFor(key)).catch(() => {});\n await unlink(this.leaseFileFor(key)).catch(() => {});\n }\n\n /** Every claim with its lease state (CLI scan + summaries). */\n async list(): Promise<DrainClaimListing[]> {\n let names: string[];\n try {\n names = (await readdir(this.dir)).filter((name) => name.endsWith(\".json\") && !name.endsWith(\".lease.json\"));\n } catch (err) {\n // SAFETY: the value comes from this module's own write path; the shape is checked above.\n if ((err as NodeJS.ErrnoException)?.code === \"ENOENT\") return [];\n throw err;\n }\n const out: DrainClaimListing[] = [];\n for (const name of names) {\n const claim = await this.readClaimBodyByKey(name);\n if (!claim) continue;\n const lease = await this.readLease(claim.key);\n out.push({\n key: claim.key,\n turnCount: claim.entry.turns.length + (claim.entry.retainedTurns?.length ?? 0),\n leased: lease !== null,\n leaseExpired: lease !== null ? isLeaseExpired(lease) : true,\n });\n }\n return out;\n }\n\n /**\n * Paged listing for bounded periodic scans: at most `limit` claims with\n * pending turns, starting AFTER `afterName` (a raw entry name returned as\n * `nextCursor` by a previous page — file-name order is stable, so a\n * rotating cursor visits every claim fairly without ever materializing\n * the whole directory's bodies). Empty tombstones never count toward the\n * limit; the number of bodies read per call is bounded separately\n * (`LIST_PAGE_SCAN_FACTOR` per requested entry), and the cursor advances\n * past every scanned name so a long tombstone run is crossed over several\n * pages instead of starving the pending claims behind it.\n */\n async listPage(afterName: string | undefined, limit: number): Promise<{ entries: DrainClaimListing[]; nextCursor?: string }> {\n let names: string[];\n try {\n names = (await readdir(this.dir)).filter((name) => name.endsWith(\".json\") && !name.endsWith(\".lease.json\")).sort();\n } catch (err) {\n // SAFETY: readdir rejects with NodeJS system errors; only the ENOENT\n // (no claims directory yet) case maps to an empty listing.\n const errno = (err as NodeJS.ErrnoException | undefined)?.code;\n if (errno === \"ENOENT\") return { entries: [] };\n throw err;\n }\n const start = afterName === undefined ? 0 : names.findIndex((name) => name > afterName);\n const out: DrainClaimListing[] = [];\n // The cursor is the LAST CONSUMED entry name: the next page starts\n // strictly after it, so the first unconsumed name is never skipped.\n // Returning the first unconsumed name instead would make every page\n // boundary permanently skip one claim.\n let cursor: string | undefined;\n const scanBudget = Math.max(limit, 1) * LIST_PAGE_SCAN_FACTOR;\n let scanned = 0;\n for (let index = start < 0 ? names.length : start; index < names.length; index += 1) {\n if (out.length >= limit || scanned >= scanBudget) break;\n const name = names[index]!;\n scanned += 1;\n cursor = name;\n const claim = await this.readClaimBodyByKey(name);\n if (!claim) continue;\n const turnCount = claim.entry.turns.length + (claim.entry.retainedTurns?.length ?? 0);\n if (turnCount <= 0) continue;\n const lease = await this.readLease(claim.key);\n out.push({\n key: claim.key,\n turnCount,\n leased: lease !== null,\n leaseExpired: lease !== null ? isLeaseExpired(lease) : true,\n });\n }\n return { entries: out, nextCursor: cursor };\n }\n\n private async readClaimBodyByKey(name: string): Promise<DrainClaimFile | null> {\n try {\n return parseBody(await this.io.read(path.join(this.dir, name)));\n } catch (err) {\n log.debug(`buffer drain: skipping unreadable claim file ${name}: ${err instanceof Error ? err.message : String(err)}`);\n return null;\n }\n }\n}\n","import { BufferDrainClaims, type BufferSessionSaveOutcome } from \"./buffer-drain-claims.js\";\nimport { createHash } from \"node:crypto\";\nimport type { Stats } from \"node:fs\";\nimport { lstat, readdir, unlink } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { subtractBufferTurns } from \"../buffer-turn-helpers.js\";\nimport { log } from \"../logger.js\";\nimport { SecureStoreDecryptError, SecureStoreLockedError } from \"../secure-store/secure-fs.js\";\nimport type { BufferEntryState, BufferState, BufferTurn } from \"../types.js\";\n\n/** The secure-store file I/O the owning StorageManager already provides. */\nexport interface BufferFileIo {\n read(filePath: string): Promise<string>;\n write(filePath: string, content: string): Promise<void>;\n}\n\ntype FsError = NodeJS.ErrnoException;\n\nfunction isMissing(err: FsError | null): boolean {\n return err?.code === \"ENOENT\";\n}\n\nfunction asFsError(err: Error): FsError {\n return err;\n}\n\n/**\n * Case-independent, collision-free file name for a buffer key: the lowercase\n * hex SHA-256 of the key under a fixed prefix. Hex has no case and no path\n * characters, so `Session-A` and `session-a` get different names even on\n * case-insensitive filesystems, every key (short or long) lives in the same\n * naming domain, and the key itself is stored inside the file (loading never\n * inverts the hash).\n */\nexport function bufferSessionFileName(key: string): string {\n return `s-${createHash(\"sha256\").update(key).digest(\"hex\")}.json`;\n}\n\n/** Flatten a legacy BufferState into per-session entries (top-level fields\n * are the legacy mirror of the \"default\" entry). */\nexport function legacyStateToEntries(state: BufferState): Map<string, BufferEntryState> {\n const entries = new Map<string, BufferEntryState>();\n for (const [key, value] of Object.entries(state.entries ?? {})) {\n if (value && Array.isArray(value.turns)) entries.set(key, value);\n }\n if (!entries.has(\"default\")) {\n entries.set(\"default\", {\n turns: Array.isArray(state.turns) ? state.turns : [],\n lastExtractionAt: state.lastExtractionAt ?? null,\n extractionCount: Number.isFinite(state.extractionCount) ? state.extractionCount : 0,\n });\n }\n return entries;\n}\n\n/** What a per-session file contains once parsed (written only by this module). */\ninterface SessionFileBody {\n key?: string;\n turns?: BufferTurn[];\n retainedTurns?: BufferTurn[];\n lastExtractionAt?: string | null;\n extractionCount?: number;\n}\n\nfunction entryFromBody(body: SessionFileBody): { key: string; entry: BufferEntryState } | null {\n if (!body || !Array.isArray(body.turns) || (body.key?.length ?? 0) === 0) return null;\n const entry: BufferEntryState = {\n turns: body.turns,\n lastExtractionAt: body.lastExtractionAt ?? null,\n extractionCount: Number.isFinite(body.extractionCount) ? Number(body.extractionCount) : 0,\n };\n if (Array.isArray(body.retainedTurns)) entry.retainedTurns = body.retainedTurns;\n return { key: String(body.key), entry };\n}\n\n/**\n * One file per buffer session under `<stateDir>/buffer/`, so the observe hot\n * path persists only the session that changed. All writes happen under\n * SmartBuffer's serialized mutation chain (one writer per process).\n *\n * Sessions claimed by `remnic buffer drain` (see buffer-drain-claims.ts) are\n * owned by the drain: `save` hands the in-memory entry INTO the claim\n * (identity-deduped merge) instead of writing a session file, so a live\n * buffer owner can never resurrect claimed turns.\n */\nexport class BufferSessionFiles {\n private dirVerified = false;\n private readonly claimsStore: BufferDrainClaims;\n\n constructor(\n private readonly stateDir: string,\n private readonly io: BufferFileIo,\n ) {\n this.claimsStore = new BufferDrainClaims(stateDir, io);\n }\n\n /** The drain-claim store for this state dir (CLI scan + claim ops). */\n get claims(): BufferDrainClaims {\n return this.claimsStore;\n }\n\n /** Sync gate check: is this session claimed by a buffer drain? */\n isClaimed(key: string): boolean {\n return this.claimsStore.isClaimed(key);\n }\n\n private get dir(): string {\n return path.join(this.stateDir, \"buffer\");\n }\n\n private fileFor(key: string): string {\n return path.join(this.dir, bufferSessionFileName(key));\n }\n\n /**\n * Refuse a symlinked buffer directory: following it would send buffered\n * conversation data (and deletions) outside the memory root. One lstat of\n * one directory, cached after it passes, so the observe path pays nothing\n * per write; the cache is dropped on any failure.\n */\n private async assertDirSafe(): Promise<void> {\n if (this.dirVerified) return;\n let stat: Stats | null = null;\n try {\n stat = await lstat(this.dir);\n } catch (err) {\n if (!(err instanceof Error) || !isMissing(asFsError(err))) throw err;\n }\n if (stat && (stat.isSymbolicLink() || !stat.isDirectory())) {\n throw new Error(`buffer session directory must be a real directory, not a symlink or file: ${this.dir}`);\n }\n this.dirVerified = stat !== null;\n }\n\n /** Persist ONE session atomically. Compact JSON: machine-read state, and\n * pretty-printing a large buffer costs CPU and bytes on every observe.\n * A drain-claimed session is handed over instead (see class doc). */\n async save(key: string, entry: BufferEntryState): Promise<BufferSessionSaveOutcome> {\n if (this.isClaimed(key)) {\n // Consume the tombstone ONLY when the drain finished (acked: extracted\n // turns recorded, nothing pending, no lease). Partial `drained` just\n // means chunks completed — the drainer may still be running, and\n // releasing here would unlink its claim and turn its later writes into\n // no-ops.\n if (await this.claimsStore.isDrained(key)) {\n const drained = await this.claimsStore.drainedTurns(key);\n // The drain finished this session: the claim is a tombstone. Write\n // the owner's fresh remainder back as a session file (the drained\n // turns are subtracted here too, so a caller that did not subtract\n // them cannot resurrect them) and release the tombstone.\n const fresh: BufferEntryState = { ...entry, turns: subtractBufferTurns(entry.turns, drained) };\n if (entry.retainedTurns && entry.retainedTurns.length > 0) {\n fresh.retainedTurns = subtractBufferTurns(entry.retainedTurns, drained);\n if (fresh.retainedTurns.length === 0) delete fresh.retainedTurns;\n }\n await this.assertDirSafe();\n await this.io.write(this.fileFor(key), JSON.stringify({ key, ...fresh }));\n await this.claimsStore.release(key);\n return { status: \"saved\", drainedTurns: drained };\n }\n await this.claimsStore.mergeIntoClaim(key, entry);\n return { status: \"handed_over\" };\n }\n await this.assertDirSafe();\n await this.io.write(this.fileFor(key), JSON.stringify({ key, ...entry }));\n return { status: \"saved\" };\n }\n\n /** Remove one session's file. Idempotent: an absent file is fine. */\n async remove(key: string): Promise<void> {\n await this.assertDirSafe();\n try {\n await unlink(this.fileFor(key));\n } catch (err) {\n if (!(err instanceof Error) || !isMissing(asFsError(err))) throw err;\n }\n }\n\n private async listFiles(): Promise<string[]> {\n await this.assertDirSafe();\n try {\n const dirents = await readdir(this.dir, { withFileTypes: true });\n // Regular files only: a symlink inside the directory is never followed.\n return dirents.filter((d) => d.isFile() && d.name.endsWith(\".json\")).map((d) => d.name);\n } catch (err) {\n if (err instanceof Error && isMissing(asFsError(err))) return [];\n throw err;\n }\n }\n\n /** Read every per-session file. Corrupt files are skipped (and logged) so\n * one bad file cannot nuke the other sessions' buffered turns. */\n private async readAll(): Promise<{ entries: Map<string, BufferEntryState>; fileCount: number }> {\n const names = await this.listFiles();\n const entries = new Map<string, BufferEntryState>();\n for (const name of names) {\n try {\n const body: SessionFileBody = JSON.parse(await this.io.read(path.join(this.dir, name)));\n const parsed = entryFromBody(body);\n if (!parsed) throw new Error(\"invalid buffer session file shape\");\n if (entries.has(parsed.key)) {\n log.warn(`buffer: duplicate session file for key ${parsed.key} (${name}); keeping the first`);\n continue;\n }\n entries.set(parsed.key, parsed.entry);\n } catch (err) {\n // A locked store or a wrong key is not a corrupt file: reading it as empty would let\n // later saves replace the real encrypted session.\n if (err instanceof SecureStoreLockedError || err instanceof SecureStoreDecryptError) throw err;\n log.warn(`buffer: skipping unreadable per-session buffer file ${name}: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n return { entries, fileCount: names.length };\n }\n\n /**\n * Read the legacy single-file buffer.json for migration. Null when absent,\n * or unreadable while session files exist (they are authoritative; a\n * corrupt leftover must not block startup). With no session files a corrupt\n * legacy file THROWS, preserving the old contract so callers can reset it.\n */\n private async readLegacy(hasSessionFiles: boolean): Promise<BufferState | null> {\n let raw: string;\n try {\n raw = await this.io.read(path.join(this.stateDir, \"buffer.json\"));\n } catch (err) {\n if (err instanceof SecureStoreLockedError) throw err;\n if (err instanceof Error && isMissing(asFsError(err))) return null;\n throw err;\n }\n try {\n const legacy: BufferState = JSON.parse(raw);\n return legacy;\n } catch (err) {\n if (!hasSessionFiles) throw err;\n log.warn(\n `buffer: legacy buffer.json is unreadable but per-session buffer files exist; ` +\n `ignoring the legacy file (${err instanceof Error ? err.message : String(err)})`,\n );\n return null;\n }\n }\n\n /**\n * Load the whole buffer, migrating a legacy buffer.json once. A per-session\n * file that parsed wins over the legacy snapshot (a crash mid-migration\n * leaves exactly that pair); legacy entries without a usable file are\n * written out, then the legacy file is retired. Both steps are idempotent.\n */\n async load(): Promise<BufferState> {\n const { entries, fileCount } = await this.readAll();\n const legacy = await this.readLegacy(fileCount > 0);\n if (legacy !== null) {\n for (const [key, entry] of legacyStateToEntries(legacy)) {\n if (entries.has(key)) continue;\n entries.set(key, entry);\n await this.save(key, entry);\n }\n try {\n await unlink(path.join(this.stateDir, \"buffer.json\"));\n } catch (err) {\n if (!(err instanceof Error) || !isMissing(asFsError(err))) throw err;\n }\n }\n const out: NonNullable<BufferState[\"entries\"]> = Object.create(null);\n for (const [key, entry] of entries) out[key] = entry;\n const def = entries.get(\"default\");\n return {\n turns: def?.turns ?? [],\n lastExtractionAt: def?.lastExtractionAt ?? null,\n extractionCount: def?.extractionCount ?? 0,\n entries: out,\n };\n }\n\n /**\n * Reconcile the files with a WHOLE buffer state: write every entry, then\n * delete files for keys no longer present. Writes first, deletes last: a\n * crash leaves stale extra files (removed by the next reconcile) but never\n * loses sessions the state says exist. Not on the observe hot path.\n */\n async reconcile(state: BufferState): Promise<void> {\n const entries = legacyStateToEntries(state);\n const existing = await this.listFiles();\n for (const [key, entry] of entries) await this.save(key, entry);\n const live = new Set([...entries.keys()].map((key) => bufferSessionFileName(key)));\n for (const name of existing) {\n if (live.has(name)) continue;\n try {\n await unlink(path.join(this.dir, name));\n } catch (err) {\n if (!(err instanceof Error) || !isMissing(asFsError(err))) throw err;\n }\n }\n }\n}\n"],"mappings":"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","names":["readdir","unlink","path","path","unlink","readdir"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
StorageManager
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-45SFSQON.js";
|
|
4
4
|
import {
|
|
5
5
|
bumpMemoryCorpusVersionForDir
|
|
6
6
|
} from "./chunk-M5GVCJSJ.js";
|
|
@@ -769,4 +769,4 @@ export {
|
|
|
769
769
|
listMemoryGovernanceRuns,
|
|
770
770
|
readMemoryGovernanceRunArtifact
|
|
771
771
|
};
|
|
772
|
-
//# sourceMappingURL=chunk-
|
|
772
|
+
//# sourceMappingURL=chunk-A2BH2VE2.js.map
|
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
} from "./chunk-ZCUTSMR2.js";
|
|
14
14
|
import {
|
|
15
15
|
StorageManager
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-45SFSQON.js";
|
|
17
17
|
import {
|
|
18
18
|
excludeSupportPassportPrivateMemories
|
|
19
19
|
} from "./chunk-PWPIERBM.js";
|
|
@@ -134,4 +134,4 @@ export {
|
|
|
134
134
|
runCodexMaterialize,
|
|
135
135
|
runPostConsolidationMaterialize
|
|
136
136
|
};
|
|
137
|
-
//# sourceMappingURL=chunk-
|
|
137
|
+
//# sourceMappingURL=chunk-BEQU6QGW.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getOperation
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-GO2GCJ7S.js";
|
|
4
4
|
import {
|
|
5
5
|
EngramAccessInputError
|
|
6
6
|
} from "./chunk-LGEH473S.js";
|
|
@@ -22,4 +22,4 @@ async function respondBriefingHttp(options) {
|
|
|
22
22
|
export {
|
|
23
23
|
respondBriefingHttp
|
|
24
24
|
};
|
|
25
|
-
//# sourceMappingURL=chunk-
|
|
25
|
+
//# sourceMappingURL=chunk-CAVXVGYK.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
StorageManager
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-45SFSQON.js";
|
|
4
4
|
import {
|
|
5
5
|
keyring_exports,
|
|
6
6
|
secureStoreDir
|
|
@@ -416,4 +416,4 @@ export {
|
|
|
416
416
|
resolveNamespaceStorageRoot,
|
|
417
417
|
NamespaceStorageRouter
|
|
418
418
|
};
|
|
419
|
-
//# sourceMappingURL=chunk-
|
|
419
|
+
//# sourceMappingURL=chunk-CU5N4RDI.js.map
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
getOperation,
|
|
4
4
|
operationRequiresAuthorizedNamespace,
|
|
5
5
|
operationUsesPrincipalNamespace
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-GO2GCJ7S.js";
|
|
7
7
|
import {
|
|
8
8
|
assertOperationAuthorizationAllowed
|
|
9
9
|
} from "./chunk-YO2JEX2Z.js";
|
|
@@ -60,4 +60,4 @@ export {
|
|
|
60
60
|
authorizationProbeNamespaces,
|
|
61
61
|
authorizationProbeRequiresPrincipalNamespace
|
|
62
62
|
};
|
|
63
|
-
//# sourceMappingURL=chunk-
|
|
63
|
+
//# sourceMappingURL=chunk-DHQLVS7J.js.map
|
|
@@ -7,10 +7,10 @@ import {
|
|
|
7
7
|
import {
|
|
8
8
|
listMemoryGovernanceRuns,
|
|
9
9
|
readMemoryGovernanceRunArtifact
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-A2BH2VE2.js";
|
|
11
11
|
import {
|
|
12
12
|
StorageManager
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-45SFSQON.js";
|
|
14
14
|
import {
|
|
15
15
|
normalizeProjectionPreview,
|
|
16
16
|
normalizeProjectionTags
|
|
@@ -1156,4 +1156,4 @@ export {
|
|
|
1156
1156
|
verifyMemoryProjection,
|
|
1157
1157
|
repairMemoryProjection
|
|
1158
1158
|
};
|
|
1159
|
-
//# sourceMappingURL=chunk-
|
|
1159
|
+
//# sourceMappingURL=chunk-DLLQMNYQ.js.map
|