@remnic/core 1.1.11 → 1.1.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/access-cli.js +67 -59
- package/dist/access-cli.js.map +1 -1
- package/dist/access-http.d.ts +7 -4
- package/dist/access-http.js +30 -26
- package/dist/access-mcp.d.ts +9 -4
- package/dist/access-mcp.js +29 -25
- package/dist/access-schema.d.ts +188 -8
- package/dist/access-schema.js +12 -3
- package/dist/{access-service-BkXt3di1.d.ts → access-service-DDjzFALq.d.ts} +60 -11
- package/dist/access-service.d.ts +7 -4
- package/dist/access-service.js +26 -23
- package/dist/action-confidence.d.ts +83 -0
- package/dist/action-confidence.js +22 -0
- package/dist/active-memory-bridge.d.ts +1 -1
- package/dist/active-recall.d.ts +1 -1
- package/dist/behavior-learner.d.ts +1 -1
- package/dist/behavior-signals.d.ts +1 -1
- package/dist/bootstrap.d.ts +4 -2
- package/dist/briefing.d.ts +1 -1
- package/dist/briefing.js +5 -5
- package/dist/buffer-surprise-report.d.ts +1 -1
- package/dist/buffer.d.ts +1 -1
- package/dist/calibration.d.ts +1 -1
- package/dist/calibration.js +4 -4
- package/dist/{capsule-export-LLEVB2RG.js → capsule-export-7QNCBZOQ.js} +3 -3
- package/dist/{capsule-import-UW45R2MZ.js → capsule-import-EPBHD2EN.js} +3 -3
- package/dist/causal-behavior.d.ts +1 -1
- package/dist/causal-consolidation.d.ts +1 -1
- package/dist/causal-consolidation.js +11 -11
- package/dist/{chunk-VQXK37XA.js → chunk-23ZZK64Y.js} +1 -1
- package/dist/chunk-23ZZK64Y.js.map +1 -0
- package/dist/{chunk-HJYHRE4S.js → chunk-242S3I2A.js} +2 -2
- package/dist/{chunk-MCC6KDQF.js → chunk-3B6KIRBH.js} +131 -13
- package/dist/chunk-3B6KIRBH.js.map +1 -0
- package/dist/chunk-4RA3C3EV.js +60 -0
- package/dist/chunk-4RA3C3EV.js.map +1 -0
- package/dist/{chunk-EYNQTST2.js → chunk-4YM32CRU.js} +4 -4
- package/dist/{chunk-6AUUAZEX.js → chunk-5NXIJZFX.js} +38 -8
- package/dist/chunk-5NXIJZFX.js.map +1 -0
- package/dist/chunk-6NKAQ74D.js +2237 -0
- package/dist/chunk-6NKAQ74D.js.map +1 -0
- package/dist/{chunk-PHNGXFQ6.js → chunk-7V22HTMD.js} +3 -3
- package/dist/{chunk-363MWCD3.js → chunk-7ZM3BFKK.js} +84 -62
- package/dist/chunk-7ZM3BFKK.js.map +1 -0
- package/dist/chunk-AC5LO7IU.js +308 -0
- package/dist/chunk-AC5LO7IU.js.map +1 -0
- package/dist/chunk-AH2JUU6X.js +336 -0
- package/dist/chunk-AH2JUU6X.js.map +1 -0
- package/dist/{chunk-VX2IUQFE.js → chunk-AQJNPMOA.js} +41 -11
- package/dist/chunk-AQJNPMOA.js.map +1 -0
- package/dist/{chunk-P73JTV34.js → chunk-BBE34QBJ.js} +4 -4
- package/dist/{chunk-KUHRUM6B.js → chunk-BZSQEPRW.js} +452 -139
- package/dist/chunk-BZSQEPRW.js.map +1 -0
- package/dist/chunk-C5BCH4ZS.js +317 -0
- package/dist/chunk-C5BCH4ZS.js.map +1 -0
- package/dist/{chunk-C5HUWVH2.js → chunk-CPKTBRS2.js} +6 -6
- package/dist/{chunk-IBX3VFOM.js → chunk-D4GAOFF6.js} +118 -2
- package/dist/chunk-D4GAOFF6.js.map +1 -0
- package/dist/chunk-DB5A3NHS.js +906 -0
- package/dist/chunk-DB5A3NHS.js.map +1 -0
- package/dist/{chunk-I6BQZSML.js → chunk-DZZPC36E.js} +10 -10
- package/dist/{chunk-O4XJUPSF.js → chunk-E2UCDP5S.js} +39 -2
- package/dist/chunk-E2UCDP5S.js.map +1 -0
- package/dist/{chunk-SRBJUAMP.js → chunk-FMEBPEAO.js} +11 -67
- package/dist/chunk-FMEBPEAO.js.map +1 -0
- package/dist/{chunk-4DXC6HQQ.js → chunk-FQDPCE3I.js} +5 -5
- package/dist/{chunk-NN3LPQ5D.js → chunk-HELQZFZO.js} +155 -16
- package/dist/chunk-HELQZFZO.js.map +1 -0
- package/dist/{chunk-57QNCUEZ.js → chunk-HL5LRPNA.js} +2 -2
- package/dist/{chunk-VTU2B4VF.js → chunk-HQZVVSVB.js} +2 -1
- package/dist/chunk-HQZVVSVB.js.map +1 -0
- package/dist/{chunk-6Z6UH6TK.js → chunk-HY3L4WKC.js} +69 -3
- package/dist/chunk-HY3L4WKC.js.map +1 -0
- package/dist/{chunk-QIGOEM65.js → chunk-IB3BFHGN.js} +5 -5
- package/dist/{chunk-RXTFCYQF.js → chunk-JESOB2HO.js} +6 -6
- package/dist/{chunk-2YMTO4ZJ.js → chunk-JKDVIE52.js} +9 -2
- package/dist/chunk-JKDVIE52.js.map +1 -0
- package/dist/{chunk-WGK4VHGP.js → chunk-MNU6ZBWT.js} +302 -140
- package/dist/chunk-MNU6ZBWT.js.map +1 -0
- package/dist/chunk-OAZ5MFUB.js +4124 -0
- package/dist/chunk-OAZ5MFUB.js.map +1 -0
- package/dist/{chunk-ZTSE2ZJ6.js → chunk-OIGNEXKZ.js} +50 -3
- package/dist/chunk-OIGNEXKZ.js.map +1 -0
- package/dist/chunk-OZKZ2TRP.js +3729 -0
- package/dist/chunk-OZKZ2TRP.js.map +1 -0
- package/dist/{chunk-GGD5W7TB.js → chunk-PD6O7AXF.js} +7 -2
- package/dist/chunk-PD6O7AXF.js.map +1 -0
- package/dist/{chunk-S3IP6R6K.js → chunk-PH4C2U43.js} +23 -3
- package/dist/chunk-PH4C2U43.js.map +1 -0
- package/dist/chunk-PYPOFEMK.js +294 -0
- package/dist/chunk-PYPOFEMK.js.map +1 -0
- package/dist/{chunk-EQINRHYR.js → chunk-QDZ2RLEC.js} +243 -7
- package/dist/chunk-QDZ2RLEC.js.map +1 -0
- package/dist/{chunk-KWBPHZUU.js → chunk-RK6F44Y6.js} +3 -2
- package/dist/chunk-RK6F44Y6.js.map +1 -0
- package/dist/{chunk-36CTNQY7.js → chunk-RVPLBATS.js} +42 -10
- package/dist/chunk-RVPLBATS.js.map +1 -0
- package/dist/chunk-SOAU2OE2.js +125 -0
- package/dist/chunk-SOAU2OE2.js.map +1 -0
- package/dist/{chunk-A4ACKWIW.js → chunk-U5JMRGKX.js} +55 -4
- package/dist/chunk-U5JMRGKX.js.map +1 -0
- package/dist/{chunk-LIO5X3CM.js → chunk-UVMUAWVT.js} +2 -2
- package/dist/chunk-VWT3F4IV.js +2161 -0
- package/dist/chunk-VWT3F4IV.js.map +1 -0
- package/dist/{chunk-PB5KW5PL.js → chunk-WEJG4TB5.js} +6 -6
- package/dist/{chunk-KBYWQWSB.js → chunk-X7HPGUVG.js} +2 -2
- package/dist/{chunk-Y5KDIOKF.js → chunk-XAMBKFQS.js} +383 -9
- package/dist/chunk-XAMBKFQS.js.map +1 -0
- package/dist/{chunk-ZL4S7ARC.js → chunk-Y3VMVTYX.js} +3 -3
- package/dist/{chunk-Z5S5HNGY.js → chunk-ZG7PTKBK.js} +21 -5
- package/dist/chunk-ZG7PTKBK.js.map +1 -0
- package/dist/{chunk-6XA7UN4Z.js → chunk-ZNQN6ZTA.js} +2 -2
- package/dist/{chunk-WTFWLUSX.js → chunk-ZVTKDVVM.js} +2 -2
- package/dist/{cli-Cvy2SNhF.d.ts → cli-BR8KpIU0.d.ts} +2 -2
- package/dist/cli.d.ts +7 -4
- package/dist/cli.js +44 -40
- package/dist/codex-cli-fallback.d.ts +1 -0
- package/dist/codex-cli-fallback.js +1 -1
- package/dist/compression-optimizer.d.ts +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.js +1 -1
- package/dist/consolidation-provenance-check.d.ts +1 -1
- package/dist/consolidation-undo.d.ts +1 -1
- package/dist/{contradiction-scan-3Z6YW7YA.js → contradiction-scan-QTXAMBUA.js} +3 -2
- package/dist/contradiction-scan-QTXAMBUA.js.map +1 -0
- package/dist/day-summary.d.ts +1 -1
- package/dist/delinearize.d.ts +1 -1
- package/dist/direct-answer-wiring.d.ts +1 -1
- package/dist/direct-answer-wiring.js +1 -1
- package/dist/direct-answer.d.ts +1 -1
- package/dist/embedding-fallback.d.ts +1 -1
- package/dist/{engine-FOC3IJLA.js → engine-35M5BKQ7.js} +7 -7
- package/dist/entity-retrieval.d.ts +1 -1
- package/dist/entity-retrieval.js +5 -5
- package/dist/entity-schema.d.ts +1 -1
- package/dist/event-order-recall.d.ts +17 -0
- package/dist/event-order-recall.js +11 -0
- package/dist/event-order-recall.js.map +1 -0
- package/dist/evidence-pack.d.ts +3 -1
- package/dist/evidence-pack.js +5 -3
- package/dist/explicit-capture.d.ts +4 -2
- package/dist/explicit-cue-recall.d.ts +4 -1
- package/dist/explicit-cue-recall.js +4 -2
- package/dist/extraction-judge-telemetry.d.ts +1 -1
- package/dist/extraction-judge-training.d.ts +1 -1
- package/dist/extraction-judge.d.ts +1 -1
- package/dist/extraction.d.ts +1 -1
- package/dist/extraction.js +8 -7
- package/dist/fallback-llm.d.ts +2 -1
- package/dist/fallback-llm.js +4 -4
- package/dist/focused-list-recall.d.ts +17 -0
- package/dist/focused-list-recall.js +11 -0
- package/dist/focused-list-recall.js.map +1 -0
- package/dist/identity-continuity.d.ts +1 -1
- package/dist/importance.d.ts +1 -1
- package/dist/{index-1qIcnbG1.d.ts → index-DJ9QWMw-.d.ts} +3 -2
- package/dist/index.d.ts +49 -12
- package/dist/index.js +284 -114
- package/dist/index.js.map +1 -1
- package/dist/intent.d.ts +1 -1
- package/dist/intent.js +1 -1
- package/dist/lifecycle.d.ts +1 -1
- package/dist/live-connectors-runner.d.ts +1 -1
- package/dist/local-llm.d.ts +8 -4
- package/dist/local-llm.js +1 -1
- package/dist/mcp-memory-inspector-app.d.ts +106 -0
- package/dist/mcp-memory-inspector-app.js +20 -0
- package/dist/mcp-memory-inspector-app.js.map +1 -0
- package/dist/memory-action-policy.d.ts +1 -1
- package/dist/memory-cache.d.ts +1 -1
- package/dist/{memory-governance-F3QOJGEY.js → memory-governance-IMPQZXFC.js} +7 -7
- package/dist/memory-governance-IMPQZXFC.js.map +1 -0
- package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
- package/dist/memory-projection-store.d.ts +1 -1
- package/dist/memory-provenance.d.ts +57 -0
- package/dist/memory-provenance.js +13 -0
- package/dist/memory-provenance.js.map +1 -0
- package/dist/memory-worth-outcomes.d.ts +1 -1
- package/dist/models-json.d.ts +1 -1
- package/dist/native-knowledge.d.ts +1 -1
- package/dist/objective-state-writers.d.ts +1 -1
- package/dist/objective-state-writers.js +2 -2
- package/dist/operator-toolkit.d.ts +1 -1
- package/dist/operator-toolkit.js +11 -11
- package/dist/{orchestrator-AOQMo7QI.d.ts → orchestrator-DDMPqU6R.d.ts} +9 -1
- package/dist/orchestrator.d.ts +4 -2
- package/dist/orchestrator.js +53 -46
- package/dist/patterns-cli.d.ts +1 -1
- package/dist/policy-runtime.d.ts +1 -1
- package/dist/qmd-recall-cache.d.ts +1 -1
- package/dist/qmd.d.ts +1 -1
- package/dist/recall-disclosure-escalation.d.ts +1 -1
- package/dist/recall-explain-renderer.d.ts +3 -1
- package/dist/recall-explain-renderer.js +5 -3
- package/dist/recall-state.d.ts +1 -1
- package/dist/recall-tag-filter.d.ts +3 -1
- package/dist/recall-xray-cli.d.ts +3 -1
- package/dist/recall-xray-cli.js +6 -4
- package/dist/recall-xray-renderer.d.ts +3 -1
- package/dist/recall-xray-renderer.js +5 -3
- package/dist/recall-xray.d.ts +8 -1
- package/dist/recall-xray.js +4 -2
- package/dist/resolve-auth-token.d.ts +1 -1
- package/dist/resolve-provider-secret.js +1 -1
- package/dist/response-guidance-recall.d.ts +18 -0
- package/dist/response-guidance-recall.js +11 -0
- package/dist/response-guidance-recall.js.map +1 -0
- package/dist/resume-bundles.js +3 -3
- package/dist/retrieval-agents.d.ts +1 -1
- package/dist/retrieval-tiers.d.ts +1 -1
- package/dist/schemas.d.ts +22 -22
- package/dist/semantic-consolidation.d.ts +1 -1
- package/dist/semantic-consolidation.js +6 -6
- package/dist/semantic-rule-promotion.js +5 -5
- package/dist/semantic-rule-verifier.d.ts +1 -1
- package/dist/semantic-rule-verifier.js +6 -6
- package/dist/session-observer-bands.d.ts +1 -1
- package/dist/session-observer-state.d.ts +1 -1
- package/dist/signal.d.ts +1 -1
- package/dist/storage.d.ts +3 -1
- package/dist/storage.js +4 -4
- package/dist/summarizer.d.ts +1 -1
- package/dist/summarizer.js +6 -6
- package/dist/summary-snapshot.d.ts +1 -1
- package/dist/targeted-fact-recall.d.ts +17 -0
- package/dist/targeted-fact-recall.js +11 -0
- package/dist/targeted-fact-recall.js.map +1 -0
- package/dist/telemetry-transcript.d.ts +7 -0
- package/dist/telemetry-transcript.js +16 -0
- package/dist/telemetry-transcript.js.map +1 -0
- package/dist/temporal-supersession.d.ts +1 -1
- package/dist/temporal-supersession.js +2 -1
- package/dist/temporal-validity.d.ts +1 -1
- package/dist/threading.d.ts +1 -1
- package/dist/tier-migration.d.ts +1 -1
- package/dist/tier-routing.d.ts +1 -1
- package/dist/tokens.js +1 -1
- package/dist/topics.d.ts +1 -1
- package/dist/transcript.d.ts +1 -1
- package/dist/trust-zones.d.ts +3 -2
- package/dist/trust-zones.js +1 -1
- package/dist/types.d.ts +60 -2
- package/dist/types.js +1 -1
- package/dist/user-model.d.ts +37 -0
- package/dist/user-model.js +28 -0
- package/dist/user-model.js.map +1 -0
- package/dist/utility-runtime.d.ts +1 -1
- package/dist/verified-recall.js +6 -6
- package/package.json +1 -1
- package/dist/chunk-2YMTO4ZJ.js.map +0 -1
- package/dist/chunk-363MWCD3.js.map +0 -1
- package/dist/chunk-36CTNQY7.js.map +0 -1
- package/dist/chunk-6AUUAZEX.js.map +0 -1
- package/dist/chunk-6Z6UH6TK.js.map +0 -1
- package/dist/chunk-74WWN7ZW.js +0 -82
- package/dist/chunk-74WWN7ZW.js.map +0 -1
- package/dist/chunk-A4ACKWIW.js.map +0 -1
- package/dist/chunk-EQINRHYR.js.map +0 -1
- package/dist/chunk-GGD5W7TB.js.map +0 -1
- package/dist/chunk-IBX3VFOM.js.map +0 -1
- package/dist/chunk-KUHRUM6B.js.map +0 -1
- package/dist/chunk-KWBPHZUU.js.map +0 -1
- package/dist/chunk-MCC6KDQF.js.map +0 -1
- package/dist/chunk-NN3LPQ5D.js.map +0 -1
- package/dist/chunk-O4XJUPSF.js.map +0 -1
- package/dist/chunk-S2JJBLJG.js +0 -2101
- package/dist/chunk-S2JJBLJG.js.map +0 -1
- package/dist/chunk-S3IP6R6K.js.map +0 -1
- package/dist/chunk-SRBJUAMP.js.map +0 -1
- package/dist/chunk-VQXK37XA.js.map +0 -1
- package/dist/chunk-VTU2B4VF.js.map +0 -1
- package/dist/chunk-VX2IUQFE.js.map +0 -1
- package/dist/chunk-WGK4VHGP.js.map +0 -1
- package/dist/chunk-Y5KDIOKF.js.map +0 -1
- package/dist/chunk-Z5S5HNGY.js.map +0 -1
- package/dist/chunk-ZTSE2ZJ6.js.map +0 -1
- package/dist/contradiction-scan-3Z6YW7YA.js.map +0 -1
- /package/dist/{capsule-export-LLEVB2RG.js.map → action-confidence.js.map} +0 -0
- /package/dist/{capsule-import-UW45R2MZ.js.map → capsule-export-7QNCBZOQ.js.map} +0 -0
- /package/dist/{engine-FOC3IJLA.js.map → capsule-import-EPBHD2EN.js.map} +0 -0
- /package/dist/{chunk-HJYHRE4S.js.map → chunk-242S3I2A.js.map} +0 -0
- /package/dist/{chunk-EYNQTST2.js.map → chunk-4YM32CRU.js.map} +0 -0
- /package/dist/{chunk-PHNGXFQ6.js.map → chunk-7V22HTMD.js.map} +0 -0
- /package/dist/{chunk-P73JTV34.js.map → chunk-BBE34QBJ.js.map} +0 -0
- /package/dist/{chunk-C5HUWVH2.js.map → chunk-CPKTBRS2.js.map} +0 -0
- /package/dist/{chunk-I6BQZSML.js.map → chunk-DZZPC36E.js.map} +0 -0
- /package/dist/{chunk-4DXC6HQQ.js.map → chunk-FQDPCE3I.js.map} +0 -0
- /package/dist/{chunk-57QNCUEZ.js.map → chunk-HL5LRPNA.js.map} +0 -0
- /package/dist/{chunk-QIGOEM65.js.map → chunk-IB3BFHGN.js.map} +0 -0
- /package/dist/{chunk-RXTFCYQF.js.map → chunk-JESOB2HO.js.map} +0 -0
- /package/dist/{chunk-LIO5X3CM.js.map → chunk-UVMUAWVT.js.map} +0 -0
- /package/dist/{chunk-PB5KW5PL.js.map → chunk-WEJG4TB5.js.map} +0 -0
- /package/dist/{chunk-KBYWQWSB.js.map → chunk-X7HPGUVG.js.map} +0 -0
- /package/dist/{chunk-ZL4S7ARC.js.map → chunk-Y3VMVTYX.js.map} +0 -0
- /package/dist/{chunk-6XA7UN4Z.js.map → chunk-ZNQN6ZTA.js.map} +0 -0
- /package/dist/{chunk-WTFWLUSX.js.map → chunk-ZVTKDVVM.js.map} +0 -0
- /package/dist/{memory-governance-F3QOJGEY.js.map → engine-35M5BKQ7.js.map} +0 -0
package/dist/chunk-74WWN7ZW.js
DELETED
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
// src/evidence-pack.ts
|
|
2
|
-
var DEFAULT_MAX_ITEM_CHARS = 1200;
|
|
3
|
-
function buildEvidencePack(items, options) {
|
|
4
|
-
const budget = normalizePositiveInteger(options.maxChars);
|
|
5
|
-
if (budget <= 0 || items.length === 0) {
|
|
6
|
-
return "";
|
|
7
|
-
}
|
|
8
|
-
const maxItemChars = normalizePositiveInteger(
|
|
9
|
-
options.maxItemChars ?? DEFAULT_MAX_ITEM_CHARS
|
|
10
|
-
);
|
|
11
|
-
if (maxItemChars <= 0) {
|
|
12
|
-
return "";
|
|
13
|
-
}
|
|
14
|
-
const title = options.title ?? "Evidence";
|
|
15
|
-
const lines = [`## ${title}`];
|
|
16
|
-
const seenIds = /* @__PURE__ */ new Set();
|
|
17
|
-
const seenContent = /* @__PURE__ */ new Set();
|
|
18
|
-
let used = lines[0].length;
|
|
19
|
-
for (const item of items) {
|
|
20
|
-
const content = item.content.trim();
|
|
21
|
-
if (!content) continue;
|
|
22
|
-
const id = item.id ?? evidenceItemFallbackId(item);
|
|
23
|
-
if (id && seenIds.has(id)) continue;
|
|
24
|
-
const contentKey = normalizeEvidenceContent(content);
|
|
25
|
-
if (seenContent.has(contentKey)) continue;
|
|
26
|
-
const label = formatEvidenceLabel(item);
|
|
27
|
-
const clipped = clipText(content, maxItemChars);
|
|
28
|
-
const block = `${label}: ${clipped}`;
|
|
29
|
-
const separatorLength = lines.length > 0 ? 2 : 0;
|
|
30
|
-
const remaining = budget - used - separatorLength;
|
|
31
|
-
if (remaining <= 0) break;
|
|
32
|
-
const finalBlock = block.length > remaining ? clipText(block, remaining) : block;
|
|
33
|
-
if (!finalBlock.trim()) break;
|
|
34
|
-
lines.push(finalBlock);
|
|
35
|
-
used += separatorLength + finalBlock.length;
|
|
36
|
-
if (id) seenIds.add(id);
|
|
37
|
-
seenContent.add(contentKey);
|
|
38
|
-
}
|
|
39
|
-
return lines.length === 1 ? "" : lines.join("\n\n");
|
|
40
|
-
}
|
|
41
|
-
function normalizePositiveInteger(value) {
|
|
42
|
-
if (!Number.isFinite(value) || value <= 0) {
|
|
43
|
-
return 0;
|
|
44
|
-
}
|
|
45
|
-
return Math.floor(value);
|
|
46
|
-
}
|
|
47
|
-
function evidenceItemFallbackId(item) {
|
|
48
|
-
if (item.sessionId && typeof item.turnIndex === "number") {
|
|
49
|
-
return `${item.sessionId}:${item.turnIndex}`;
|
|
50
|
-
}
|
|
51
|
-
return void 0;
|
|
52
|
-
}
|
|
53
|
-
function normalizeEvidenceContent(content) {
|
|
54
|
-
return content.toLowerCase().replace(/\s+/g, " ").trim();
|
|
55
|
-
}
|
|
56
|
-
function formatEvidenceLabel(item) {
|
|
57
|
-
const parts = [];
|
|
58
|
-
if (item.sessionId) parts.push(item.sessionId);
|
|
59
|
-
if (typeof item.turnIndex === "number") parts.push(`turn ${item.turnIndex}`);
|
|
60
|
-
if (item.role) parts.push(item.role);
|
|
61
|
-
if (typeof item.score === "number" && Number.isFinite(item.score)) {
|
|
62
|
-
parts.push(`score ${item.score.toFixed(3)}`);
|
|
63
|
-
}
|
|
64
|
-
return parts.length > 0 ? `[${parts.join(", ")}]` : "[evidence]";
|
|
65
|
-
}
|
|
66
|
-
function clipText(text, maxChars) {
|
|
67
|
-
if (text.length <= maxChars) {
|
|
68
|
-
return text;
|
|
69
|
-
}
|
|
70
|
-
if (maxChars <= 1) {
|
|
71
|
-
return text.slice(0, maxChars);
|
|
72
|
-
}
|
|
73
|
-
if (maxChars <= 3) {
|
|
74
|
-
return text.slice(0, maxChars);
|
|
75
|
-
}
|
|
76
|
-
return `${text.slice(0, maxChars - 3).trimEnd()}...`;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
export {
|
|
80
|
-
buildEvidencePack
|
|
81
|
-
};
|
|
82
|
-
//# sourceMappingURL=chunk-74WWN7ZW.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/evidence-pack.ts"],"sourcesContent":["export interface EvidencePackItem {\n id?: string;\n sessionId?: string;\n turnIndex?: number;\n role?: string;\n content: string;\n score?: number;\n}\n\nexport interface EvidencePackOptions {\n title?: string;\n maxChars: number;\n maxItemChars?: number;\n}\n\nconst DEFAULT_MAX_ITEM_CHARS = 1_200;\n\nexport function buildEvidencePack(\n items: readonly EvidencePackItem[],\n options: EvidencePackOptions,\n): string {\n const budget = normalizePositiveInteger(options.maxChars);\n if (budget <= 0 || items.length === 0) {\n return \"\";\n }\n\n const maxItemChars = normalizePositiveInteger(\n options.maxItemChars ?? DEFAULT_MAX_ITEM_CHARS,\n );\n if (maxItemChars <= 0) {\n return \"\";\n }\n\n const title = options.title ?? \"Evidence\";\n const lines: string[] = [`## ${title}`];\n const seenIds = new Set<string>();\n const seenContent = new Set<string>();\n let used = lines[0]!.length;\n\n for (const item of items) {\n const content = item.content.trim();\n if (!content) continue;\n\n const id = item.id ?? evidenceItemFallbackId(item);\n if (id && seenIds.has(id)) continue;\n\n const contentKey = normalizeEvidenceContent(content);\n if (seenContent.has(contentKey)) continue;\n\n const label = formatEvidenceLabel(item);\n const clipped = clipText(content, maxItemChars);\n const block = `${label}: ${clipped}`;\n const separatorLength = lines.length > 0 ? 2 : 0;\n const remaining = budget - used - separatorLength;\n if (remaining <= 0) break;\n\n const finalBlock =\n block.length > remaining ? clipText(block, remaining) : block;\n if (!finalBlock.trim()) break;\n\n lines.push(finalBlock);\n used += separatorLength + finalBlock.length;\n if (id) seenIds.add(id);\n seenContent.add(contentKey);\n }\n\n return lines.length === 1 ? \"\" : lines.join(\"\\n\\n\");\n}\n\nfunction normalizePositiveInteger(value: number): number {\n if (!Number.isFinite(value) || value <= 0) {\n return 0;\n }\n return Math.floor(value);\n}\n\nfunction evidenceItemFallbackId(item: EvidencePackItem): string | undefined {\n if (item.sessionId && typeof item.turnIndex === \"number\") {\n return `${item.sessionId}:${item.turnIndex}`;\n }\n return undefined;\n}\n\nfunction normalizeEvidenceContent(content: string): string {\n return content.toLowerCase().replace(/\\s+/g, \" \").trim();\n}\n\nfunction formatEvidenceLabel(item: EvidencePackItem): string {\n const parts: string[] = [];\n if (item.sessionId) parts.push(item.sessionId);\n if (typeof item.turnIndex === \"number\") parts.push(`turn ${item.turnIndex}`);\n if (item.role) parts.push(item.role);\n if (typeof item.score === \"number\" && Number.isFinite(item.score)) {\n parts.push(`score ${item.score.toFixed(3)}`);\n }\n return parts.length > 0 ? `[${parts.join(\", \")}]` : \"[evidence]\";\n}\n\nfunction clipText(text: string, maxChars: number): string {\n if (text.length <= maxChars) {\n return text;\n }\n if (maxChars <= 1) {\n return text.slice(0, maxChars);\n }\n if (maxChars <= 3) {\n return text.slice(0, maxChars);\n }\n return `${text.slice(0, maxChars - 3).trimEnd()}...`;\n}\n"],"mappings":";AAeA,IAAM,yBAAyB;AAExB,SAAS,kBACd,OACA,SACQ;AACR,QAAM,SAAS,yBAAyB,QAAQ,QAAQ;AACxD,MAAI,UAAU,KAAK,MAAM,WAAW,GAAG;AACrC,WAAO;AAAA,EACT;AAEA,QAAM,eAAe;AAAA,IACnB,QAAQ,gBAAgB;AAAA,EAC1B;AACA,MAAI,gBAAgB,GAAG;AACrB,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,QAAQ,SAAS;AAC/B,QAAM,QAAkB,CAAC,MAAM,KAAK,EAAE;AACtC,QAAM,UAAU,oBAAI,IAAY;AAChC,QAAM,cAAc,oBAAI,IAAY;AACpC,MAAI,OAAO,MAAM,CAAC,EAAG;AAErB,aAAW,QAAQ,OAAO;AACxB,UAAM,UAAU,KAAK,QAAQ,KAAK;AAClC,QAAI,CAAC,QAAS;AAEd,UAAM,KAAK,KAAK,MAAM,uBAAuB,IAAI;AACjD,QAAI,MAAM,QAAQ,IAAI,EAAE,EAAG;AAE3B,UAAM,aAAa,yBAAyB,OAAO;AACnD,QAAI,YAAY,IAAI,UAAU,EAAG;AAEjC,UAAM,QAAQ,oBAAoB,IAAI;AACtC,UAAM,UAAU,SAAS,SAAS,YAAY;AAC9C,UAAM,QAAQ,GAAG,KAAK,KAAK,OAAO;AAClC,UAAM,kBAAkB,MAAM,SAAS,IAAI,IAAI;AAC/C,UAAM,YAAY,SAAS,OAAO;AAClC,QAAI,aAAa,EAAG;AAEpB,UAAM,aACJ,MAAM,SAAS,YAAY,SAAS,OAAO,SAAS,IAAI;AAC1D,QAAI,CAAC,WAAW,KAAK,EAAG;AAExB,UAAM,KAAK,UAAU;AACrB,YAAQ,kBAAkB,WAAW;AACrC,QAAI,GAAI,SAAQ,IAAI,EAAE;AACtB,gBAAY,IAAI,UAAU;AAAA,EAC5B;AAEA,SAAO,MAAM,WAAW,IAAI,KAAK,MAAM,KAAK,MAAM;AACpD;AAEA,SAAS,yBAAyB,OAAuB;AACvD,MAAI,CAAC,OAAO,SAAS,KAAK,KAAK,SAAS,GAAG;AACzC,WAAO;AAAA,EACT;AACA,SAAO,KAAK,MAAM,KAAK;AACzB;AAEA,SAAS,uBAAuB,MAA4C;AAC1E,MAAI,KAAK,aAAa,OAAO,KAAK,cAAc,UAAU;AACxD,WAAO,GAAG,KAAK,SAAS,IAAI,KAAK,SAAS;AAAA,EAC5C;AACA,SAAO;AACT;AAEA,SAAS,yBAAyB,SAAyB;AACzD,SAAO,QAAQ,YAAY,EAAE,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACzD;AAEA,SAAS,oBAAoB,MAAgC;AAC3D,QAAM,QAAkB,CAAC;AACzB,MAAI,KAAK,UAAW,OAAM,KAAK,KAAK,SAAS;AAC7C,MAAI,OAAO,KAAK,cAAc,SAAU,OAAM,KAAK,QAAQ,KAAK,SAAS,EAAE;AAC3E,MAAI,KAAK,KAAM,OAAM,KAAK,KAAK,IAAI;AACnC,MAAI,OAAO,KAAK,UAAU,YAAY,OAAO,SAAS,KAAK,KAAK,GAAG;AACjE,UAAM,KAAK,SAAS,KAAK,MAAM,QAAQ,CAAC,CAAC,EAAE;AAAA,EAC7C;AACA,SAAO,MAAM,SAAS,IAAI,IAAI,MAAM,KAAK,IAAI,CAAC,MAAM;AACtD;AAEA,SAAS,SAAS,MAAc,UAA0B;AACxD,MAAI,KAAK,UAAU,UAAU;AAC3B,WAAO;AAAA,EACT;AACA,MAAI,YAAY,GAAG;AACjB,WAAO,KAAK,MAAM,GAAG,QAAQ;AAAA,EAC/B;AACA,MAAI,YAAY,GAAG;AACjB,WAAO,KAAK,MAAM,GAAG,QAAQ;AAAA,EAC/B;AACA,SAAO,GAAG,KAAK,MAAM,GAAG,WAAW,CAAC,EAAE,QAAQ,CAAC;AACjD;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/access-schema.ts"],"sourcesContent":["// Request/response schema validation for the Remnic HTTP API.\n// Uses zod for runtime validation — returns structured 400 errors with\n// field-level detail so consumers get clear feedback on malformed requests.\n\nimport { z } from \"zod\";\nimport { isValidCapsuleSince } from \"./transfer/capsule-export.js\";\nimport { CAPSULE_ID_PATTERN } from \"./transfer/types.js\";\n\n// ---------------------------------------------------------------------------\n// Error formatting\n// ---------------------------------------------------------------------------\n\nexport interface SchemaValidationError {\n error: string;\n code: \"validation_error\";\n details: Array<{ field: string; message: string }>;\n}\n\nexport function formatZodError(error: z.ZodError): SchemaValidationError {\n return {\n error: \"request validation failed\",\n code: \"validation_error\",\n details: error.issues.map((issue) => ({\n field: issue.path.join(\".\") || \"(root)\",\n message: issue.message,\n })),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Shared fields\n// ---------------------------------------------------------------------------\n\nconst namespaceSchema = z.string().trim().max(256).optional();\nconst sessionKeySchema = z.string().trim().min(1).max(512).optional();\nconst idempotencyKeySchema = z.string().trim().min(1).max(256).optional();\nconst dryRunSchema = z.boolean().optional();\nconst schemaVersionSchema = z.number().int().optional();\n\n// ---------------------------------------------------------------------------\n// Recall\n// ---------------------------------------------------------------------------\n\n/**\n * Coding-agent context (issue #569). Optional payload that connectors may\n * ship with a recall request so the project/branch namespace overlay\n * applies to that recall. All fields are validated per CLAUDE.md #51 —\n * empty-string projectId / rootPath is rejected, not silently accepted.\n */\nexport const codingContextSchema = z\n .object({\n projectId: z.string().trim().min(1, \"codingContext.projectId is required\").max(128),\n branch: z.string().trim().max(256).nullable(),\n rootPath: z.string().trim().min(1, \"codingContext.rootPath is required\").max(1024),\n defaultBranch: z.string().trim().max(256).nullable(),\n })\n .nullable();\n\n/**\n * Recall disclosure depth (issue #677). Mirrors the `RecallDisclosure`\n * type in `types.ts` — keep these in sync. Default-application happens\n * inside `EngramAccessService.recall()`; the schema only accepts/rejects.\n * Invalid values throw a structured 400 instead of silently defaulting,\n * per CLAUDE.md rule 51.\n */\nexport const recallDisclosureSchema = z.enum([\"chunk\", \"section\", \"raw\"]);\n\n/**\n * Tag-match semantics (issue #689). `any` (default when `tags` is provided\n * and `tagMatch` is omitted) admits a result when it carries at least one\n * of the filter tags. `all` requires every filter tag to be present.\n * Schema rejects unknown values up front — never silently defaults\n * (CLAUDE.md rule 51).\n */\nexport const tagMatchSchema = z.enum([\"any\", \"all\"]);\n\nexport const recallRequestSchema = z.object({\n query: z.string().min(1, \"query is required\"),\n sessionKey: sessionKeySchema,\n namespace: namespaceSchema,\n topK: z.number().int().min(0).max(200).optional(),\n mode: z.enum([\"auto\", \"no_recall\", \"minimal\", \"full\", \"graph_mode\"]).optional(),\n includeDebug: z.boolean().optional(),\n disclosure: recallDisclosureSchema.optional(),\n codingContext: codingContextSchema.optional(),\n /** Working directory for auto git-context resolution (issue #569). */\n cwd: z.string().trim().min(1, \"cwd must be non-empty when provided\").max(2048).optional(),\n /**\n * Arbitrary project tag for non-git-based project scoping (issue #569).\n * Creates a coding context with `projectId: \"tag:<projectTag>\"`.\n */\n projectTag: z.string().trim().min(1, \"projectTag must be non-empty when provided\").max(256).optional(),\n /**\n * Historical recall pin (issue #680). ISO 8601 timestamp. The\n * schema only enforces the basic shape; the access service runs\n * `Date.parse` and emits a structured 400 on malformed input\n * (CLAUDE.md rule 51).\n */\n asOf: z.string().trim().min(1, \"asOf must be a non-empty ISO 8601 timestamp\").max(64).optional(),\n /**\n * Free-form recall tag filter (issue #689). When provided, recall results\n * whose frontmatter `tags` do not match the filter are removed before the\n * response is returned. Comparison is case-sensitive exact match.\n */\n tags: z.array(z.string().trim().min(1).max(256)).max(50).optional(),\n /**\n * Match mode for `tags` (issue #689). Defaults to `\"any\"` when `tags` is\n * provided and `tagMatch` is omitted. Ignored when `tags` is absent.\n */\n tagMatch: tagMatchSchema.optional(),\n /**\n * Include graph edges below `graphTraversalConfidenceFloor` for diagnostic\n * recall traversal (issue #681). Defaults to false.\n */\n includeLowConfidence: z.boolean().optional(),\n});\n\nexport const recallExplainRequestSchema = z.object({\n sessionKey: sessionKeySchema,\n namespace: namespaceSchema,\n});\n\n/**\n * Standalone \"set coding context\" request. Used by the HTTP endpoint\n * `POST /engram/v1/coding-context` and the MCP `remnic.set_coding_context`\n * tool (PR 7). `codingContext: null` clears the attached context.\n */\nexport const setCodingContextRequestSchema = z.object({\n sessionKey: z.string().trim().min(1, \"sessionKey is required\").max(512),\n codingContext: codingContextSchema,\n});\n\n// ---------------------------------------------------------------------------\n// Observe\n// ---------------------------------------------------------------------------\n\nconst messageSchema = z.object({\n role: z.enum([\"user\", \"assistant\"]),\n content: z.string().min(1, \"message content must be non-empty\"),\n sourceFormat: z\n .enum([\"openai\", \"anthropic\", \"openclaw\", \"lossless-claw\", \"remnic\"])\n .nullable()\n .optional(),\n rawContent: z.unknown().nullable().optional(),\n parts: z\n .array(\n z.object({\n ordinal: z.number().int().min(0).nullable().optional(),\n kind: z.enum([\n \"text\",\n \"tool_call\",\n \"tool_result\",\n \"patch\",\n \"file_read\",\n \"file_write\",\n \"step_start\",\n \"step_finish\",\n \"snapshot\",\n \"retry\",\n ]),\n payload: z.record(z.string(), z.unknown()),\n toolName: z.string().nullable().optional(),\n tool_name: z.string().nullable().optional(),\n filePath: z.string().nullable().optional(),\n file_path: z.string().nullable().optional(),\n createdAt: z.string().nullable().optional(),\n created_at: z.string().nullable().optional(),\n }),\n )\n .nullable()\n .optional(),\n});\n\nexport const observeRequestSchema = z.object({\n sessionKey: z.string().trim().min(1, \"sessionKey is required\").max(512),\n messages: z.array(messageSchema).min(1, \"messages must be a non-empty array\"),\n namespace: namespaceSchema,\n skipExtraction: z.boolean().optional(),\n /** Working directory for auto git-context resolution (issue #569). */\n cwd: z.string().trim().min(1, \"cwd must be non-empty when provided\").max(2048).optional(),\n /**\n * Arbitrary project tag for non-git-based project scoping (issue #569).\n * Creates a coding context with `projectId: \"tag:<projectTag>\"`.\n */\n projectTag: z.string().trim().min(1, \"projectTag must be non-empty when provided\").max(256).optional(),\n});\n\n// ---------------------------------------------------------------------------\n// Memory store / suggestion submit\n// ---------------------------------------------------------------------------\n\nconst writeContentSchema = z.string().min(1, \"content is required\").max(50000);\nconst categorySchema = z\n .enum([\n \"fact\", \"preference\", \"correction\", \"entity\", \"decision\",\n \"relationship\", \"principle\", \"commitment\", \"moment\", \"skill\", \"rule\", \"procedure\",\n \"reasoning_trace\",\n ])\n .optional();\nconst confidenceSchema = z.number().min(0).max(1).optional();\nconst tagsSchema = z.array(z.string().max(256)).max(50).optional();\nconst entityRefSchema = z.string().trim().max(512).optional();\nconst ttlSchema = z.string().trim().max(128).optional();\nconst sourceReasonSchema = z.string().trim().max(2000).optional();\n\nexport const memoryStoreRequestSchema = z.object({\n schemaVersion: schemaVersionSchema,\n idempotencyKey: idempotencyKeySchema,\n dryRun: dryRunSchema,\n sessionKey: sessionKeySchema,\n content: writeContentSchema,\n category: categorySchema,\n confidence: confidenceSchema,\n namespace: namespaceSchema,\n tags: tagsSchema,\n entityRef: entityRefSchema,\n ttl: ttlSchema,\n sourceReason: sourceReasonSchema,\n});\n\nexport const suggestionSubmitRequestSchema = memoryStoreRequestSchema;\n\n// ---------------------------------------------------------------------------\n// Review disposition\n// ---------------------------------------------------------------------------\n\nexport const reviewDispositionRequestSchema = z.object({\n memoryId: z.string().trim().min(1, \"memoryId is required\"),\n status: z.enum([\n \"active\", \"pending_review\", \"quarantined\", \"rejected\", \"superseded\", \"archived\",\n ]),\n reasonCode: z.string().trim().min(1, \"reasonCode is required\"),\n namespace: namespaceSchema,\n});\n\n// ---------------------------------------------------------------------------\n// Trust-zone promote\n// ---------------------------------------------------------------------------\n\nexport const trustZonePromoteRequestSchema = z.object({\n recordId: z.string().trim().min(1, \"recordId is required\"),\n targetZone: z.enum([\"working\", \"trusted\"], {\n errorMap: () => ({ message: \"targetZone must be 'working' or 'trusted'\" }),\n }),\n promotionReason: z.string().trim().min(1, \"promotionReason is required\"),\n recordedAt: z.string().trim().optional(),\n summary: z.string().trim().max(5000).optional(),\n dryRun: dryRunSchema,\n namespace: namespaceSchema,\n});\n\n// ---------------------------------------------------------------------------\n// Trust-zone demo-seed\n// ---------------------------------------------------------------------------\n\nexport const trustZoneDemoSeedRequestSchema = z.object({\n scenario: z.string().trim().max(256).optional(),\n recordedAt: z.string().trim().optional(),\n dryRun: dryRunSchema,\n namespace: namespaceSchema,\n});\n\n// ---------------------------------------------------------------------------\n// LCM search\n// ---------------------------------------------------------------------------\n\nexport const lcmSearchRequestSchema = z.object({\n query: z.string().min(1, \"query is required\"),\n sessionKey: sessionKeySchema,\n namespace: namespaceSchema,\n limit: z.number().int().min(1).max(100).optional(),\n});\n\n// ---------------------------------------------------------------------------\n// Day summary\n// ---------------------------------------------------------------------------\n\nexport const daySummaryRequestSchema = z.object({\n memories: z.string().max(100000).optional(),\n sessionKey: sessionKeySchema,\n namespace: namespaceSchema,\n});\n\n// ---------------------------------------------------------------------------\n// Capsule export\n// ---------------------------------------------------------------------------\n\nconst capsuleTopLevelSegmentSchema = z\n .string()\n .trim()\n .min(1)\n .max(128)\n .refine(\n (value) => !value.includes(\"/\") && !value.includes(\"\\\\\"),\n \"must be a top-level directory name without path separators\",\n );\n\nconst capsulePeerIdSchema = z\n .string()\n .trim()\n .min(1)\n .max(256)\n .refine(\n (value) => value !== \".\" && value !== \"..\" && !value.includes(\"/\") && !value.includes(\"\\\\\"),\n \"must be a plain peer id without path separators\",\n );\n\nconst capsuleIsoSinceSchema = z\n .string()\n .trim()\n .min(1, \"since must be a non-empty ISO 8601 timestamp\")\n .max(128)\n .refine(\n isValidCapsuleSince,\n \"since must be a valid ISO 8601 timestamp with no calendar overflow\",\n );\n\nexport const capsuleExportRequestSchema = z\n .object({\n name: z\n .string()\n .trim()\n .min(1, \"name is required\")\n .max(64, \"name must be 64 characters or fewer\")\n .regex(\n CAPSULE_ID_PATTERN,\n \"name must be alphanumeric with single dashes (no spaces, no leading/trailing dashes)\",\n ),\n namespace: namespaceSchema,\n since: capsuleIsoSinceSchema.optional(),\n includeKinds: z.array(capsuleTopLevelSegmentSchema).max(50).optional(),\n peerIds: z.array(capsulePeerIdSchema).max(100).optional(),\n includeTranscripts: z.boolean().optional(),\n encrypt: z.boolean().optional(),\n });\n\nexport const capsuleImportRequestSchema = z\n .object({\n archivePath: z.string().trim().min(1, \"archivePath is required\").max(4096),\n namespace: namespaceSchema,\n mode: z.enum([\"skip\", \"overwrite\", \"fork\"]).optional(),\n });\n\nexport const capsuleListRequestSchema = z\n .object({\n namespace: namespaceSchema,\n });\n\n// ---------------------------------------------------------------------------\n// Inferred types\n// ---------------------------------------------------------------------------\n\nexport type RecallRequest = z.infer<typeof recallRequestSchema>;\nexport type RecallExplainRequest = z.infer<typeof recallExplainRequestSchema>;\nexport type SetCodingContextRequest = z.infer<typeof setCodingContextRequestSchema>;\nexport type ObserveRequest = z.infer<typeof observeRequestSchema>;\nexport type MemoryStoreRequest = z.infer<typeof memoryStoreRequestSchema>;\nexport type SuggestionSubmitRequest = z.infer<typeof suggestionSubmitRequestSchema>;\nexport type ReviewDispositionRequest = z.infer<typeof reviewDispositionRequestSchema>;\nexport type TrustZonePromoteRequest = z.infer<typeof trustZonePromoteRequestSchema>;\nexport type TrustZoneDemoSeedRequest = z.infer<typeof trustZoneDemoSeedRequestSchema>;\nexport type LcmSearchRequest = z.infer<typeof lcmSearchRequestSchema>;\nexport type DaySummaryRequest = z.infer<typeof daySummaryRequestSchema>;\nexport type CapsuleExportRequest = z.infer<typeof capsuleExportRequestSchema>;\nexport type CapsuleImportRequest = z.infer<typeof capsuleImportRequestSchema>;\nexport type CapsuleListRequest = z.infer<typeof capsuleListRequestSchema>;\n\n// ---------------------------------------------------------------------------\n// Validation helper\n// ---------------------------------------------------------------------------\n\nexport type SchemaName =\n | \"recall\"\n | \"recallExplain\"\n | \"setCodingContext\"\n | \"observe\"\n | \"memoryStore\"\n | \"suggestionSubmit\"\n | \"reviewDisposition\"\n | \"trustZonePromote\"\n | \"trustZoneDemoSeed\"\n | \"lcmSearch\"\n | \"daySummary\"\n | \"capsuleExport\"\n | \"capsuleImport\"\n | \"capsuleList\";\n\nexport type SchemaTypeFor<N extends SchemaName> =\n N extends \"recall\" ? RecallRequest\n : N extends \"recallExplain\" ? RecallExplainRequest\n : N extends \"setCodingContext\" ? SetCodingContextRequest\n : N extends \"observe\" ? ObserveRequest\n : N extends \"memoryStore\" ? MemoryStoreRequest\n : N extends \"suggestionSubmit\" ? SuggestionSubmitRequest\n : N extends \"reviewDisposition\" ? ReviewDispositionRequest\n : N extends \"trustZonePromote\" ? TrustZonePromoteRequest\n : N extends \"trustZoneDemoSeed\" ? TrustZoneDemoSeedRequest\n : N extends \"lcmSearch\" ? LcmSearchRequest\n : N extends \"daySummary\" ? DaySummaryRequest\n : N extends \"capsuleExport\" ? CapsuleExportRequest\n : N extends \"capsuleImport\" ? CapsuleImportRequest\n : N extends \"capsuleList\" ? CapsuleListRequest\n : never;\n\nconst schemas: Record<SchemaName, z.ZodTypeAny> = {\n recall: recallRequestSchema,\n recallExplain: recallExplainRequestSchema,\n setCodingContext: setCodingContextRequestSchema,\n observe: observeRequestSchema,\n memoryStore: memoryStoreRequestSchema,\n suggestionSubmit: suggestionSubmitRequestSchema,\n reviewDisposition: reviewDispositionRequestSchema,\n trustZonePromote: trustZonePromoteRequestSchema,\n trustZoneDemoSeed: trustZoneDemoSeedRequestSchema,\n lcmSearch: lcmSearchRequestSchema,\n daySummary: daySummaryRequestSchema,\n capsuleExport: capsuleExportRequestSchema,\n capsuleImport: capsuleImportRequestSchema,\n capsuleList: capsuleListRequestSchema,\n};\n\n/**\n * Validate a request body against the named schema.\n * Returns `{ success: true, data }` on pass or\n * `{ success: false, error }` on failure with field-level detail.\n */\nexport function validateRequest<T = unknown>(\n schemaName: SchemaName,\n body: unknown,\n): { success: true; data: T } | { success: false; error: SchemaValidationError } {\n const schema = schemas[schemaName];\n if (!schema) {\n return {\n success: false,\n error: {\n error: `unknown schema: ${schemaName}`,\n code: \"validation_error\",\n details: [],\n },\n };\n }\n const result = schema.safeParse(body);\n if (result.success) {\n return { success: true, data: result.data as T };\n }\n return { success: false, error: formatZodError(result.error) };\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/trust-zones.ts"],"sourcesContent":["import path from \"node:path\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { listJsonFiles, readJsonFile } from \"./json-store.js\";\nimport { countRecallTokenOverlap, normalizeRecallTokens } from \"./recall-tokenization.js\";\nimport {\n assertIsoRecordedAt,\n assertSafePathSegment,\n assertString,\n isRecord,\n optionalString,\n optionalStringArray,\n recordStoreDay,\n validateStringRecord,\n} from \"./store-contract.js\";\n\nexport type TrustZoneName = \"quarantine\" | \"working\" | \"trusted\";\nexport type TrustZoneRecordKind = \"memory\" | \"artifact\" | \"state\" | \"trajectory\" | \"external\";\nexport type TrustZoneSourceClass =\n | \"tool_output\"\n | \"web_content\"\n | \"subagent_trace\"\n | \"system_memory\"\n | \"user_input\"\n | \"manual\";\n\nexport function isTrustZoneName(value: string): value is TrustZoneName {\n return value === \"quarantine\" || value === \"working\" || value === \"trusted\";\n}\n\nexport interface TrustZoneProvenance {\n sourceClass: TrustZoneSourceClass;\n observedAt: string;\n sessionKey?: string;\n sourceId?: string;\n evidenceHash?: string;\n}\n\nexport interface TrustZoneRecord {\n schemaVersion: 1;\n recordId: string;\n zone: TrustZoneName;\n recordedAt: string;\n kind: TrustZoneRecordKind;\n summary: string;\n provenance: TrustZoneProvenance;\n promotedFromZone?: TrustZoneName;\n entityRefs?: string[];\n tags?: string[];\n metadata?: Record<string, string>;\n}\n\nexport type TrustZoneScoreBand = \"low\" | \"medium\" | \"high\";\n\nexport interface TrustZoneProvenanceScore {\n total: number;\n band: TrustZoneScoreBand;\n anchored: boolean;\n sourceClassWeight: number;\n sourceIdBonus: number;\n evidenceHashBonus: number;\n sessionKeyBonus: number;\n}\n\nexport interface TrustZoneStoreStatus {\n enabled: boolean;\n promotionEnabled: boolean;\n poisoningDefenseEnabled: boolean;\n rootDir: string;\n zonesDir: string;\n records: {\n total: number;\n valid: number;\n invalid: number;\n byZone: Partial<Record<TrustZoneName, number>>;\n byKind: Partial<Record<TrustZoneRecordKind, number>>;\n latestRecordId?: string;\n latestRecordedAt?: string;\n latestZone?: TrustZoneName;\n averageTrustScore?: number;\n byTrustBand?: Partial<Record<TrustZoneScoreBand, number>>;\n };\n latestRecord?: TrustZoneRecord;\n latestRecordTrustScore?: TrustZoneProvenanceScore;\n invalidRecords: Array<{\n path: string;\n error: string;\n }>;\n}\n\nexport interface TrustZonePromotionPlan {\n allowed: boolean;\n reasons: string[];\n sourceRecordId: string;\n sourceZone: TrustZoneName;\n targetZone: TrustZoneName;\n provenanceAnchored: boolean;\n}\n\nexport interface TrustZonePromotionResult {\n plan: TrustZonePromotionPlan;\n wroteRecord: boolean;\n record: TrustZoneRecord;\n filePath?: string;\n sourceRecord: TrustZoneRecord;\n}\n\ninterface TrustZoneCorroborationSummary {\n count: number;\n sourceClasses: TrustZoneSourceClass[];\n}\n\nexport interface TrustZoneSearchResult {\n record: TrustZoneRecord;\n score: number;\n matchedFields: string[];\n}\n\nexport interface TrustZoneRecordEntry {\n filePath: string;\n record: TrustZoneRecord;\n}\n\nexport interface TrustZoneListResult {\n total: number;\n count: number;\n limit: number;\n offset: number;\n records: TrustZoneRecordEntry[];\n allRecords: TrustZoneRecord[];\n}\n\nexport interface TrustZonePromotionReadiness {\n nextTargetZone?: TrustZoneName;\n allowed: boolean;\n reasons: string[];\n requiresCorroboration: boolean;\n corroborationCount: number;\n corroborationSourceClasses: TrustZoneSourceClass[];\n}\n\nexport interface TrustZoneDemoSeedResult {\n scenario: string;\n dryRun: boolean;\n recordsWritten: number;\n records: TrustZoneRecord[];\n filePaths: string[];\n}\n\nfunction validateMetadata(raw: unknown): Record<string, string> | undefined {\n return validateStringRecord(raw, \"metadata\");\n}\n\nfunction validateZone(raw: unknown, field: string): TrustZoneName {\n const value = assertString(raw, field);\n if (![\"quarantine\", \"working\", \"trusted\"].includes(value)) {\n throw new Error(`${field} must be one of quarantine|working|trusted`);\n }\n return value as TrustZoneName;\n}\n\nfunction validateKind(raw: unknown): TrustZoneRecordKind {\n const value = assertString(raw, \"kind\");\n if (![\"memory\", \"artifact\", \"state\", \"trajectory\", \"external\"].includes(value)) {\n throw new Error(\"kind must be one of memory|artifact|state|trajectory|external\");\n }\n return value as TrustZoneRecordKind;\n}\n\nfunction validateProvenance(raw: unknown): TrustZoneProvenance {\n if (!isRecord(raw)) throw new Error(\"provenance must be an object\");\n const sourceClass = assertString(raw.sourceClass, \"provenance.sourceClass\");\n if (![\"tool_output\", \"web_content\", \"subagent_trace\", \"system_memory\", \"user_input\", \"manual\"].includes(sourceClass)) {\n throw new Error(\"provenance.sourceClass must be one of tool_output|web_content|subagent_trace|system_memory|user_input|manual\");\n }\n return {\n sourceClass: sourceClass as TrustZoneSourceClass,\n observedAt: assertIsoRecordedAt(assertString(raw.observedAt, \"provenance.observedAt\"), \"provenance.observedAt\"),\n sessionKey: optionalString(raw.sessionKey),\n sourceId: optionalString(raw.sourceId),\n evidenceHash: optionalString(raw.evidenceHash),\n };\n}\n\nexport function resolveTrustZoneStoreDir(memoryDir: string, overrideDir?: string): string {\n if (typeof overrideDir === \"string\" && overrideDir.trim().length > 0) {\n return overrideDir.trim();\n }\n return path.join(memoryDir, \"state\", \"trust-zones\");\n}\n\nexport function validateTrustZoneRecord(raw: unknown): TrustZoneRecord {\n if (!isRecord(raw)) throw new Error(\"trust-zone record must be an object\");\n if (raw.schemaVersion !== 1) throw new Error(\"schemaVersion must be 1\");\n\n return {\n schemaVersion: 1,\n recordId: assertSafePathSegment(assertString(raw.recordId, \"recordId\"), \"recordId\"),\n zone: validateZone(raw.zone, \"zone\"),\n recordedAt: assertIsoRecordedAt(assertString(raw.recordedAt, \"recordedAt\")),\n kind: validateKind(raw.kind),\n summary: assertString(raw.summary, \"summary\"),\n provenance: validateProvenance(raw.provenance),\n promotedFromZone: raw.promotedFromZone === undefined ? undefined : validateZone(raw.promotedFromZone, \"promotedFromZone\"),\n entityRefs: optionalStringArray(raw.entityRefs, \"entityRefs\"),\n tags: optionalStringArray(raw.tags, \"tags\"),\n metadata: validateMetadata(raw.metadata),\n };\n}\n\nexport async function recordTrustZoneRecord(options: {\n memoryDir: string;\n trustZoneStoreDir?: string;\n record: TrustZoneRecord;\n}): Promise<string> {\n const rootDir = resolveTrustZoneStoreDir(options.memoryDir, options.trustZoneStoreDir);\n const validated = validateTrustZoneRecord(options.record);\n const day = recordStoreDay(validated.recordedAt);\n const zoneDir = path.join(rootDir, \"zones\", validated.zone, day);\n const filePath = path.join(zoneDir, `${validated.recordId}.json`);\n await mkdir(zoneDir, { recursive: true });\n await writeFile(filePath, JSON.stringify(validated, null, 2), \"utf8\");\n return filePath;\n}\n\nfunction hasAnchoredProvenance(record: TrustZoneRecord): boolean {\n return Boolean(record.provenance.sourceId && record.provenance.evidenceHash);\n}\n\nfunction buildPromotionRecordId(sourceRecordId: string, targetZone: TrustZoneName, recordedAt: string): string {\n const suffix = recordedAt.replace(/[^0-9]/g, \"\").slice(0, 14);\n return `${sourceRecordId}-${targetZone}-${suffix}`;\n}\n\nfunction dedupeStrings(values: Array<string | undefined>): string[] | undefined {\n const out = values.filter((value): value is string => typeof value === \"string\" && value.length > 0);\n if (out.length === 0) return undefined;\n return [...new Set(out)];\n}\n\nfunction hasOverlap(left: string[] | undefined, right: string[] | undefined): boolean {\n if (!left || !right || left.length === 0 || right.length === 0) return false;\n const rightSet = new Set(right);\n return left.some((value) => rightSet.has(value));\n}\n\nfunction corroborationTags(record: TrustZoneRecord): string[] | undefined {\n if (!record.tags || record.tags.length === 0) return undefined;\n const filtered = record.tags.filter((tag) => tag !== \"trust-zone-demo\" && tag !== \"enterprise-demo\");\n return filtered.length > 0 ? filtered : undefined;\n}\n\nfunction requiresCorroboration(record: TrustZoneRecord, targetZone: TrustZoneName, poisoningDefenseEnabled: boolean): boolean {\n return (\n poisoningDefenseEnabled === true\n && targetZone === \"trusted\"\n && record.zone === \"working\"\n && [\"tool_output\", \"web_content\", \"subagent_trace\"].includes(record.provenance.sourceClass)\n );\n}\n\nfunction summarizeCorroboration(options: {\n sourceRecord: TrustZoneRecord;\n records: TrustZoneRecord[];\n}): TrustZoneCorroborationSummary {\n const corroborating = options.records.filter((candidate) => {\n if (candidate.recordId === options.sourceRecord.recordId) return false;\n if (candidate.zone === \"quarantine\") return false;\n if (hasAnchoredProvenance(candidate) !== true) return false;\n if (candidate.provenance.sourceClass === options.sourceRecord.provenance.sourceClass) return false;\n return (\n hasOverlap(candidate.entityRefs, options.sourceRecord.entityRefs)\n || hasOverlap(corroborationTags(candidate), corroborationTags(options.sourceRecord))\n );\n });\n\n return {\n count: corroborating.length,\n sourceClasses: [...new Set(corroborating.map((record) => record.provenance.sourceClass))],\n };\n}\n\nconst SOURCE_CLASS_WEIGHTS: Record<TrustZoneSourceClass, number> = {\n manual: 0.9,\n system_memory: 0.85,\n user_input: 0.75,\n tool_output: 0.55,\n subagent_trace: 0.45,\n web_content: 0.35,\n};\n\nfunction roundTrustScore(value: number): number {\n return Math.round(value * 1000) / 1000;\n}\n\nfunction trustScoreBand(total: number): TrustZoneScoreBand {\n if (total >= 0.8) return \"high\";\n if (total >= 0.5) return \"medium\";\n return \"low\";\n}\n\nexport function scoreTrustZoneProvenance(record: TrustZoneRecord): TrustZoneProvenanceScore {\n const sourceClassWeight = SOURCE_CLASS_WEIGHTS[record.provenance.sourceClass];\n const sourceIdBonus = typeof record.provenance.sourceId === \"string\" ? 0.1 : 0;\n const evidenceHashBonus = typeof record.provenance.evidenceHash === \"string\" ? 0.2 : 0;\n const sessionKeyBonus = typeof record.provenance.sessionKey === \"string\" ? 0.05 : 0;\n const total = roundTrustScore(\n Math.min(1, sourceClassWeight + sourceIdBonus + evidenceHashBonus + sessionKeyBonus),\n );\n\n return {\n total,\n band: trustScoreBand(total),\n anchored: hasAnchoredProvenance(record),\n sourceClassWeight,\n sourceIdBonus,\n evidenceHashBonus,\n sessionKeyBonus,\n };\n}\n\nexport function planTrustZonePromotion(options: {\n record: TrustZoneRecord;\n targetZone: TrustZoneName;\n}): TrustZonePromotionPlan {\n const { record, targetZone } = options;\n const reasons: string[] = [];\n const provenanceAnchored = hasAnchoredProvenance(record);\n\n if (record.zone === targetZone) {\n reasons.push(`record is already in the ${targetZone} zone`);\n }\n if (record.zone === \"trusted\") {\n reasons.push(\"trusted records are terminal and cannot be promoted again\");\n }\n if (record.zone === \"quarantine\" && targetZone === \"trusted\") {\n reasons.push(\"quarantine records must pass through working before trusted promotion\");\n }\n if (record.zone === \"working\" && targetZone === \"quarantine\") {\n reasons.push(\"working records cannot be demoted back into quarantine in this promotion path\");\n }\n if (record.zone === \"quarantine\" && targetZone !== \"working\") {\n reasons.push(\"quarantine promotions only support the working zone\");\n }\n if (record.zone === \"working\" && targetZone !== \"trusted\") {\n reasons.push(\"working promotions only support the trusted zone\");\n }\n if (\n targetZone === \"trusted\" &&\n [\"tool_output\", \"web_content\", \"subagent_trace\"].includes(record.provenance.sourceClass) &&\n provenanceAnchored !== true\n ) {\n reasons.push(\"trusted promotion for external/tool-derived provenance requires both provenance.sourceId and provenance.evidenceHash\");\n }\n\n return {\n allowed: reasons.length === 0,\n reasons,\n sourceRecordId: record.recordId,\n sourceZone: record.zone,\n targetZone,\n provenanceAnchored,\n };\n}\n\nasync function findTrustZoneRecordById(options: {\n memoryDir: string;\n trustZoneStoreDir?: string;\n recordId: string;\n}): Promise<TrustZoneRecord | null> {\n const { entries } = await readTrustZoneRecordEntries(options);\n entries.sort((a, b) => b.record.recordedAt.localeCompare(a.record.recordedAt));\n return entries.find((entry) => entry.record.recordId === options.recordId)?.record ?? null;\n}\n\nexport async function promoteTrustZoneRecord(options: {\n memoryDir: string;\n trustZoneStoreDir?: string;\n enabled: boolean;\n promotionEnabled: boolean;\n poisoningDefenseEnabled?: boolean;\n sourceRecordId: string;\n targetZone: TrustZoneName;\n recordedAt: string;\n promotionReason: string;\n summary?: string;\n dryRun?: boolean;\n}): Promise<TrustZonePromotionResult> {\n if (options.enabled !== true) {\n throw new Error(\"trust zone promotion requires trustZonesEnabled=true\");\n }\n if (options.promotionEnabled !== true) {\n throw new Error(\"trust zone promotion requires quarantinePromotionEnabled=true\");\n }\n\n const sourceRecord = await findTrustZoneRecordById({\n memoryDir: options.memoryDir,\n trustZoneStoreDir: options.trustZoneStoreDir,\n recordId: assertSafePathSegment(assertString(options.sourceRecordId, \"sourceRecordId\"), \"sourceRecordId\"),\n });\n if (!sourceRecord) {\n throw new Error(`source trust-zone record not found: ${options.sourceRecordId}`);\n }\n\n const plan = planTrustZonePromotion({\n record: sourceRecord,\n targetZone: options.targetZone,\n });\n if (!plan.allowed) {\n throw new Error(`trust-zone promotion denied: ${plan.reasons.join(\"; \")}`);\n }\n\n const corroboration = requiresCorroboration(sourceRecord, options.targetZone, options.poisoningDefenseEnabled === true)\n ? summarizeCorroboration({\n sourceRecord,\n records: (await readTrustZoneRecordEntries({\n memoryDir: options.memoryDir,\n trustZoneStoreDir: options.trustZoneStoreDir,\n })).entries.map((entry) => entry.record),\n })\n : null;\n\n if (corroboration && corroboration.count === 0) {\n throw new Error(\"trust-zone promotion denied: corroboration is required for risky trusted promotions\");\n }\n\n const recordedAt = assertIsoRecordedAt(assertString(options.recordedAt, \"recordedAt\"));\n const promotionReason = assertString(options.promotionReason, \"promotionReason\");\n const nextRecord: TrustZoneRecord = {\n schemaVersion: 1,\n recordId: buildPromotionRecordId(sourceRecord.recordId, options.targetZone, recordedAt),\n zone: options.targetZone,\n recordedAt,\n kind: sourceRecord.kind,\n summary: optionalString(options.summary) ?? sourceRecord.summary,\n provenance: sourceRecord.provenance,\n promotedFromZone: sourceRecord.zone,\n entityRefs: sourceRecord.entityRefs,\n tags: dedupeStrings([...(sourceRecord.tags ?? []), \"promotion\"]),\n metadata: {\n ...(sourceRecord.metadata ?? {}),\n sourceRecordId: sourceRecord.recordId,\n promotionReason,\n ...(corroboration\n ? {\n corroborated: \"true\",\n corroborationCount: String(corroboration.count),\n corroborationSources: corroboration.sourceClasses.join(\",\"),\n }\n : {}),\n },\n };\n\n if (options.dryRun === true) {\n return {\n plan,\n wroteRecord: false,\n record: nextRecord,\n sourceRecord,\n };\n }\n\n const filePath = await recordTrustZoneRecord({\n memoryDir: options.memoryDir,\n trustZoneStoreDir: options.trustZoneStoreDir,\n record: nextRecord,\n });\n\n return {\n plan,\n wroteRecord: true,\n record: nextRecord,\n filePath,\n sourceRecord,\n };\n}\n\nasync function readTrustZoneRecordEntries(options: {\n memoryDir: string;\n trustZoneStoreDir?: string;\n}): Promise<{\n files: string[];\n entries: TrustZoneRecordEntry[];\n invalidRecords: Array<{ path: string; error: string }>;\n}> {\n const rootDir = resolveTrustZoneStoreDir(options.memoryDir, options.trustZoneStoreDir);\n const files = await listJsonFiles(path.join(rootDir, \"zones\"));\n const entries: TrustZoneRecordEntry[] = [];\n const invalidRecords: Array<{ path: string; error: string }> = [];\n for (const filePath of files) {\n try {\n entries.push({\n filePath,\n record: validateTrustZoneRecord(await readJsonFile(filePath)),\n });\n } catch (error) {\n invalidRecords.push({\n path: filePath,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n return { files, entries, invalidRecords };\n}\n\nfunction lexicalScoreTrustZoneRecord(\n record: TrustZoneRecord,\n queryTokens: Set<string>,\n): { score: number; matchedFields: string[] } {\n const weightedFields: Array<[field: string, value: string | undefined, weight: number]> = [\n [\"summary\", record.summary, 4],\n [\"kind\", record.kind, 1],\n [\"zone\", record.zone, 1],\n [\"sourceClass\", record.provenance.sourceClass, 1],\n [\"entityRefs\", record.entityRefs?.join(\" \"), 2],\n [\"tags\", record.tags?.join(\" \"), 2],\n [\"metadata\", record.metadata ? Object.values(record.metadata).join(\" \") : undefined, 1],\n ];\n\n let score = 0;\n const matchedFields: string[] = [];\n for (const [field, value, weight] of weightedFields) {\n const matches = countRecallTokenOverlap(queryTokens, value, [\"what\"]);\n if (matches > 0) matchedFields.push(field);\n score += matches * weight;\n }\n return { score, matchedFields };\n}\n\nfunction zonePriority(zone: TrustZoneName): number {\n switch (zone) {\n case \"trusted\":\n return 3;\n case \"working\":\n return 2;\n case \"quarantine\":\n return 1;\n }\n}\n\nfunction scoreTrustZoneRecord(\n record: TrustZoneRecord,\n lexicalScore: number,\n sessionKey?: string,\n): number {\n let score = lexicalScore;\n score += zonePriority(record.zone);\n if (sessionKey && record.provenance.sessionKey === sessionKey) score += 1;\n\n const recordedAtMs = Date.parse(record.recordedAt);\n if (Number.isFinite(recordedAtMs)) {\n const ageHours = Math.max(0, (Date.now() - recordedAtMs) / 3_600_000);\n score += 1 / (1 + ageHours);\n }\n return score;\n}\n\nexport async function searchTrustZoneRecords(options: {\n memoryDir: string;\n trustZoneStoreDir?: string;\n query: string;\n maxResults: number;\n sessionKey?: string;\n}): Promise<TrustZoneSearchResult[]> {\n const maxResults = Math.max(0, Math.floor(options.maxResults));\n if (maxResults === 0) return [];\n\n const { entries } = await readTrustZoneRecordEntries(options);\n const records = entries.map((entry) => entry.record);\n const candidates = records.filter((record) => record.zone !== \"quarantine\");\n if (candidates.length === 0) return [];\n\n const queryTokens = new Set(normalizeRecallTokens(options.query, [\"what\"]));\n if (queryTokens.size === 0) return [];\n\n const scored = candidates.map((record) => {\n const lexical = lexicalScoreTrustZoneRecord(record, queryTokens);\n return {\n record,\n matchedFields: lexical.matchedFields,\n lexicalScore: lexical.score,\n score: scoreTrustZoneRecord(record, lexical.score, options.sessionKey),\n };\n });\n\n const filtered = scored.filter((result) => result.lexicalScore > 0);\n filtered.sort((left, right) => {\n if (right.score !== left.score) return right.score - left.score;\n return right.record.recordedAt.localeCompare(left.record.recordedAt);\n });\n\n return filtered.slice(0, maxResults).map(({ record, score, matchedFields }) => ({\n record,\n score,\n matchedFields,\n }));\n}\n\nexport async function listTrustZoneRecords(options: {\n memoryDir: string;\n trustZoneStoreDir?: string;\n query?: string;\n zone?: TrustZoneName;\n kind?: TrustZoneRecordKind;\n sourceClass?: TrustZoneSourceClass;\n limit?: number;\n offset?: number;\n}): Promise<TrustZoneListResult> {\n const limit = Number.isFinite(options.limit) ? Math.max(1, Math.min(200, Math.floor(options.limit ?? 25))) : 25;\n const offset = Number.isFinite(options.offset) ? Math.max(0, Math.floor(options.offset ?? 0)) : 0;\n const zoneFilter = options.zone?.trim();\n const kindFilter = options.kind?.trim();\n const sourceClassFilter = options.sourceClass?.trim();\n const queryTokens = new Set(normalizeRecallTokens(options.query ?? \"\", [\"what\"]));\n\n const { entries } = await readTrustZoneRecordEntries(options);\n const filtered = entries\n .filter((entry) => !zoneFilter || entry.record.zone === zoneFilter)\n .filter((entry) => !kindFilter || entry.record.kind === kindFilter)\n .filter((entry) => !sourceClassFilter || entry.record.provenance.sourceClass === sourceClassFilter)\n .map((entry) => ({\n entry,\n lexical: queryTokens.size > 0 ? lexicalScoreTrustZoneRecord(entry.record, queryTokens) : null,\n }))\n .filter((candidate) => queryTokens.size === 0 || (candidate.lexical?.score ?? 0) > 0);\n\n filtered.sort((left, right) => {\n const leftScore = left.lexical?.score ?? 0;\n const rightScore = right.lexical?.score ?? 0;\n if (rightScore !== leftScore) return rightScore - leftScore;\n return right.entry.record.recordedAt.localeCompare(left.entry.record.recordedAt);\n });\n\n return {\n total: filtered.length,\n count: filtered.slice(offset, offset + limit).length,\n limit,\n offset,\n records: filtered.slice(offset, offset + limit).map((candidate) => candidate.entry),\n allRecords: entries.map((entry) => entry.record),\n };\n}\n\nexport function summarizeTrustZonePromotionReadiness(options: {\n record: TrustZoneRecord;\n allRecords: TrustZoneRecord[];\n poisoningDefenseEnabled: boolean;\n}): TrustZonePromotionReadiness {\n if (options.record.zone === \"trusted\") {\n return {\n allowed: false,\n reasons: [\"trusted records are terminal and do not have a next promotion step\"],\n requiresCorroboration: false,\n corroborationCount: 0,\n corroborationSourceClasses: [],\n };\n }\n\n const nextTargetZone: TrustZoneName = options.record.zone === \"quarantine\" ? \"working\" : \"trusted\";\n const plan = planTrustZonePromotion({\n record: options.record,\n targetZone: nextTargetZone,\n });\n const requires = requiresCorroboration(options.record, nextTargetZone, options.poisoningDefenseEnabled);\n const corroboration = requires\n ? summarizeCorroboration({\n sourceRecord: options.record,\n records: options.allRecords,\n })\n : { count: 0, sourceClasses: [] };\n\n const reasons = [...plan.reasons];\n if (requires && corroboration.count === 0) {\n reasons.push(\"trusted promotion requires corroboration from an independent non-quarantine source\");\n }\n\n return {\n nextTargetZone,\n allowed: plan.allowed && (!requires || corroboration.count > 0),\n reasons,\n requiresCorroboration: requires,\n corroborationCount: corroboration.count,\n corroborationSourceClasses: corroboration.sourceClasses,\n };\n}\n\nfunction addMinutes(baseIso: string, minutes: number): string {\n const baseMs = Date.parse(baseIso);\n if (!Number.isFinite(baseMs)) {\n throw new Error(\"recordedAt must be a valid ISO timestamp\");\n }\n return new Date(baseMs + minutes * 60_000).toISOString();\n}\n\nfunction buildTrustZoneDemoSeedRunId(baseRecordedAt: string): string {\n return baseRecordedAt.replace(/[^0-9]/g, \"\");\n}\n\nfunction buildTrustZoneDemoRecordId(baseId: string, seedRunId: string): string {\n return `${baseId}-${seedRunId}`;\n}\n\nfunction buildTrustZoneDemoRecords(baseRecordedAt: string, scenario: string): TrustZoneRecord[] {\n const demoTag = \"trust-zone-demo\";\n const commonMetadata = {\n demoScenario: scenario,\n demoSeed: \"true\",\n };\n const seedRunId = buildTrustZoneDemoSeedRunId(baseRecordedAt);\n return [\n {\n schemaVersion: 1,\n recordId: buildTrustZoneDemoRecordId(\"tz-demo-enterprise-buyer-v1-quarantine-ready\", seedRunId),\n zone: \"quarantine\",\n recordedAt: addMinutes(baseRecordedAt, 0),\n kind: \"external\",\n summary: \"Vendor portal policy excerpt captured before validation for Acme Industrial onboarding.\",\n provenance: {\n sourceClass: \"web_content\",\n observedAt: addMinutes(baseRecordedAt, -2),\n sessionKey: \"demo:enterprise-buyer-v1\",\n sourceId: \"https://vendor.example.com/policies/acme-industrial.pdf\",\n evidenceHash: \"sha256:vendor-portal-policy-proof\",\n },\n entityRefs: [\"account:acme-industrial\", \"policy:vendor-onboarding\"],\n tags: [demoTag, \"enterprise-demo\", \"vendor-policy\"],\n metadata: {\n ...commonMetadata,\n story: \"captured-external-policy\",\n },\n },\n {\n schemaVersion: 1,\n recordId: buildTrustZoneDemoRecordId(\"tz-demo-enterprise-buyer-v1-working-blocked\", seedRunId),\n zone: \"working\",\n recordedAt: addMinutes(baseRecordedAt, 2),\n kind: \"external\",\n summary: \"Unverified rumor about a production freeze captured without source evidence.\",\n provenance: {\n sourceClass: \"subagent_trace\",\n observedAt: addMinutes(baseRecordedAt, 1),\n sessionKey: \"demo:enterprise-buyer-v1\",\n },\n entityRefs: [\"workspace:finance\", \"incident:freeze-rumor\"],\n tags: [demoTag, \"enterprise-demo\", \"needs-evidence\"],\n metadata: {\n ...commonMetadata,\n story: \"working-missing-provenance\",\n },\n },\n {\n schemaVersion: 1,\n recordId: buildTrustZoneDemoRecordId(\"tz-demo-enterprise-buyer-v1-working-awaiting-corroboration\", seedRunId),\n zone: \"working\",\n recordedAt: addMinutes(baseRecordedAt, 6),\n kind: \"state\",\n summary: \"Tool output says the finance SSO certificate rotation completed successfully.\",\n provenance: {\n sourceClass: \"tool_output\",\n observedAt: addMinutes(baseRecordedAt, 5),\n sessionKey: \"demo:enterprise-buyer-v1\",\n sourceId: \"tool:sso-rotation-run-42\",\n evidenceHash: \"sha256:sso-rotation-log\",\n },\n entityRefs: [\"finding:finance-sso-certificate-rotation-tool-output-pending\"],\n tags: [demoTag, \"enterprise-demo\", \"sso-rotation-pending\"],\n metadata: {\n ...commonMetadata,\n story: \"working-awaiting-corroboration\",\n },\n },\n {\n schemaVersion: 1,\n recordId: buildTrustZoneDemoRecordId(\"tz-demo-enterprise-buyer-v1-working-corroborated\", seedRunId),\n zone: \"working\",\n recordedAt: addMinutes(baseRecordedAt, 7),\n kind: \"state\",\n summary: \"Tool output says the vendor onboarding policy sync completed with anchored evidence ready for promotion.\",\n provenance: {\n sourceClass: \"tool_output\",\n observedAt: addMinutes(baseRecordedAt, 6),\n sessionKey: \"demo:enterprise-buyer-v1\",\n sourceId: \"tool:vendor-policy-sync-run-9\",\n evidenceHash: \"sha256:vendor-policy-sync-log\",\n },\n entityRefs: [\"account:acme-industrial\", \"policy:vendor-onboarding\"],\n tags: [demoTag, \"enterprise-demo\", \"vendor-policy\"],\n metadata: {\n ...commonMetadata,\n story: \"working-with-corroboration\",\n },\n },\n {\n schemaVersion: 1,\n recordId: buildTrustZoneDemoRecordId(\"tz-demo-enterprise-buyer-v1-working-corroboration\", seedRunId),\n zone: \"working\",\n recordedAt: addMinutes(baseRecordedAt, 9),\n kind: \"external\",\n summary: \"Change ticket confirms the same vendor onboarding policy sync with matching artifact hash.\",\n provenance: {\n sourceClass: \"web_content\",\n observedAt: addMinutes(baseRecordedAt, 7),\n sessionKey: \"demo:enterprise-buyer-v1\",\n sourceId: \"https://tickets.example.com/changes/CHG-4821\",\n evidenceHash: \"sha256:sso-rotation-ticket-proof\",\n },\n entityRefs: [\"account:acme-industrial\", \"policy:vendor-onboarding\"],\n tags: [demoTag, \"enterprise-demo\", \"vendor-policy\"],\n metadata: {\n ...commonMetadata,\n story: \"independent-corroboration\",\n },\n },\n {\n schemaVersion: 1,\n recordId: buildTrustZoneDemoRecordId(\"tz-demo-enterprise-buyer-v1-trusted-governance-rule\", seedRunId),\n zone: \"trusted\",\n recordedAt: addMinutes(baseRecordedAt, 13),\n kind: \"memory\",\n summary: \"Trusted promotion requires a ticket id and artifact hash before shared recall can use operator actions.\",\n provenance: {\n sourceClass: \"manual\",\n observedAt: addMinutes(baseRecordedAt, 11),\n sessionKey: \"demo:enterprise-buyer-v1\",\n sourceId: \"review:trust-zone-policy\",\n evidenceHash: \"sha256:trust-zone-policy\",\n },\n promotedFromZone: \"working\",\n entityRefs: [\"policy:trust-zone-promotion\"],\n tags: [demoTag, \"enterprise-demo\", \"operator-policy\"],\n metadata: {\n ...commonMetadata,\n story: \"trusted-policy\",\n },\n },\n ];\n}\n\nexport async function seedTrustZoneDemoDataset(options: {\n memoryDir: string;\n trustZoneStoreDir?: string;\n enabled: boolean;\n scenario?: string;\n recordedAt?: string;\n dryRun?: boolean;\n}): Promise<TrustZoneDemoSeedResult> {\n if (options.enabled !== true) {\n throw new Error(\"trust zone demo seed requires trustZonesEnabled=true\");\n }\n\n const scenario = (options.scenario ?? \"enterprise-buyer-v1\").trim();\n if (scenario !== \"enterprise-buyer-v1\") {\n throw new Error(`unsupported trust-zone demo scenario: ${scenario}`);\n }\n\n const baseRecordedAt = assertIsoRecordedAt(options.recordedAt ?? new Date().toISOString(), \"recordedAt\");\n if (!Number.isFinite(Date.parse(baseRecordedAt))) {\n throw new Error(\"recordedAt must be a valid ISO timestamp\");\n }\n const records = buildTrustZoneDemoRecords(baseRecordedAt, scenario);\n if (options.dryRun === true) {\n return {\n scenario,\n dryRun: true,\n recordsWritten: 0,\n records,\n filePaths: [],\n };\n }\n\n const filePaths: string[] = [];\n for (const record of records) {\n filePaths.push(await recordTrustZoneRecord({\n memoryDir: options.memoryDir,\n trustZoneStoreDir: options.trustZoneStoreDir,\n record,\n }));\n }\n\n return {\n scenario,\n dryRun: false,\n recordsWritten: filePaths.length,\n records,\n filePaths,\n };\n}\n\nexport async function getTrustZoneStoreStatus(options: {\n memoryDir: string;\n trustZoneStoreDir?: string;\n enabled: boolean;\n promotionEnabled: boolean;\n poisoningDefenseEnabled: boolean;\n}): Promise<TrustZoneStoreStatus> {\n const rootDir = resolveTrustZoneStoreDir(options.memoryDir, options.trustZoneStoreDir);\n const zonesDir = path.join(rootDir, \"zones\");\n const { files, entries, invalidRecords } = await readTrustZoneRecordEntries(options);\n const records = entries.map((entry) => entry.record);\n records.sort((a, b) => b.recordedAt.localeCompare(a.recordedAt));\n\n const byZone: Partial<Record<TrustZoneName, number>> = {};\n const byKind: Partial<Record<TrustZoneRecordKind, number>> = {};\n const byTrustBand: Partial<Record<TrustZoneScoreBand, number>> = {};\n let trustScoreTotal = 0;\n for (const record of records) {\n byZone[record.zone] = (byZone[record.zone] ?? 0) + 1;\n byKind[record.kind] = (byKind[record.kind] ?? 0) + 1;\n if (options.poisoningDefenseEnabled === true) {\n const score = scoreTrustZoneProvenance(record);\n byTrustBand[score.band] = (byTrustBand[score.band] ?? 0) + 1;\n trustScoreTotal += score.total;\n }\n }\n\n const averageTrustScore =\n options.poisoningDefenseEnabled === true && records.length > 0\n ? roundTrustScore(trustScoreTotal / records.length)\n : undefined;\n const latestRecordTrustScore =\n options.poisoningDefenseEnabled === true && records[0] ? scoreTrustZoneProvenance(records[0]) : undefined;\n\n return {\n enabled: options.enabled,\n promotionEnabled: options.promotionEnabled,\n poisoningDefenseEnabled: options.poisoningDefenseEnabled,\n rootDir,\n zonesDir,\n records: {\n total: files.length,\n valid: records.length,\n invalid: invalidRecords.length,\n byZone,\n byKind,\n latestRecordId: records[0]?.recordId,\n latestRecordedAt: records[0]?.recordedAt,\n latestZone: records[0]?.zone,\n averageTrustScore,\n byTrustBand: options.poisoningDefenseEnabled === true ? byTrustBand : undefined,\n },\n latestRecord: records[0],\n latestRecordTrustScore,\n invalidRecords,\n };\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/intent.ts"],"sourcesContent":["import type { MemoryIntent, RecallPlanMode } from \"./types.js\";\n\nconst GOAL_PATTERNS: Array<{ re: RegExp; goal: string }> = [\n { re: /\\b(debug(?:s|ged|ging)?|fix(?:es|ed|ing)?|error(?:s)?|incident(?:s)?|outage(?:s)?|failure(?:s)?)\\b/i, goal: \"stabilize\" },\n { re: /\\b(deploy(?:s|ed|ing)?|release(?:s|d|ing)?|ship(?:s|ped|ping)?|publish(?:es|ed|ing)?)\\b/i, goal: \"release\" },\n { re: /\\b(plan(?:s|ned|ning)?|roadmap(?:s)?|strateg(?:y|ies)|design(?:s|ed|ing)?)\\b/i, goal: \"plan\" },\n { re: /\\b(review(?:s|ed|ing)?|audit(?:s|ed|ing)?|security|hardening)\\b/i, goal: \"review\" },\n { re: /\\b(sales|deal|customer|client|prospect)\\b/i, goal: \"close_deal\" },\n];\n\nconst ACTION_PATTERNS: Array<{ re: RegExp; action: string }> = [\n { re: /\\b(review(?:s|ed|ing)?|audit(?:s|ed|ing)?|inspect(?:s|ed|ing)?|check(?:s|ed|ing)?)\\b/i, action: \"review\" },\n { re: /\\b(plan(?:s|ned|ning)?|design(?:s|ed|ing)?|brainstorm(?:s|ed|ing)?|spec(?:s)?)\\b/i, action: \"plan\" },\n { re: /\\b(implement(?:s|ed|ing)?|build(?:s|ing)?|built|code(?:s|d|ing)?|patch(?:es|ed|ing)?|fix(?:es|ed|ing)?)\\b/i, action: \"execute\" },\n { re: /\\b(summariz(?:e|es|ed|ing)|recap(?:s|ped|ping)?|what happened|timeline)\\b/i, action: \"summarize\" },\n { re: /\\b(decid(?:e|es|ed|ing)|decision(?:s)?|cho(?:ose|oses|osing)|chose|chosen)\\b/i, action: \"decide\" },\n];\n\nconst ENTITY_PATTERNS: Array<{ re: RegExp; entityType: string }> = [\n { re: /\\b(pr|pull request|branch|repo|github|ci|workflow)\\b/i, entityType: \"repo\" },\n { re: /\\b(discord|slack|channel|gateway|agent)\\b/i, entityType: \"ops\" },\n { re: /\\b(customer|client|deal|lead|account)\\b/i, entityType: \"client\" },\n { re: /\\b(model|llm|qmd|embedding|retrieval|memory)\\b/i, entityType: \"ai\" },\n { re: /\\b(doc|readme|docs|changelog)\\b/i, entityType: \"docs\" },\n];\n\n/** User/agent is starting a hands-on task (issue #519 procedure recall gate). */\nconst TASK_INITIATION_RE =\n /\\b(ship(?:ping|ped)?|deploy(?:ing|ed)?|release|publish|open(?:ing)?\\s+(?:a\\s+)?(?:pr|pull\\s+request)|merge(?:ing)?\\s+(?:the\\s+)?(?:pr|pull\\s+request)|run\\s+(?:the\\s+)?tests?|start(?:ing)?\\s+(?:work|on|the)|kick\\s+off|implement(?:ing|ed)?|let's\\s+(?:ship|deploy|release|publish|open|run|merge|implement|fix|patch|build|start|do|get|put|wire|hook|land|roll)\\b|going\\s+to\\s+(?:ship|deploy|release|open|run|merge)|need\\s+to\\s+(?:ship|deploy|run|open|merge|test)|fix(?:ing|ed)?\\s+(?:(?:the|a)\\s+)?(?:\\w+\\s+){0,4}(?:bug|build)\\b|patch(?:ing|ed)?|build(?:ing)?\\s+(?:and\\s+)?(?:ship|deploy))\\b/i;\n\nfunction normalizeTextInput(input: unknown): string {\n return typeof input === \"string\" ? input : \"\";\n}\n\nexport function inferIntentFromText(text: string): MemoryIntent {\n const safeText = normalizeTextInput(text);\n const goal = GOAL_PATTERNS.find((p) => p.re.test(safeText))?.goal ?? \"unknown\";\n const actionType = ACTION_PATTERNS.find((p) => p.re.test(safeText))?.action ?? \"unknown\";\n const entityTypes = Array.from(\n new Set(ENTITY_PATTERNS.filter((p) => p.re.test(safeText)).map((p) => p.entityType)),\n );\n const taskInitiation = TASK_INITIATION_RE.test(safeText);\n\n return {\n goal,\n actionType,\n entityTypes,\n taskInitiation,\n };\n}\n\nexport function isTaskInitiationIntent(intent: MemoryIntent): boolean {\n return intent.taskInitiation === true;\n}\n\nexport function intentCompatibilityScore(queryIntent: MemoryIntent, memoryIntent: MemoryIntent): number {\n const queryHasSignal =\n queryIntent.goal !== \"unknown\" ||\n queryIntent.actionType !== \"unknown\" ||\n queryIntent.entityTypes.length > 0;\n const memoryHasSignal =\n memoryIntent.goal !== \"unknown\" ||\n memoryIntent.actionType !== \"unknown\" ||\n memoryIntent.entityTypes.length > 0;\n if (!queryHasSignal || !memoryHasSignal) return 0;\n\n let score = 0;\n if (\n queryIntent.goal !== \"unknown\" &&\n memoryIntent.goal !== \"unknown\" &&\n queryIntent.goal === memoryIntent.goal\n ) {\n score += 0.5;\n }\n if (\n queryIntent.actionType !== \"unknown\" &&\n memoryIntent.actionType !== \"unknown\" &&\n queryIntent.actionType === memoryIntent.actionType\n ) {\n score += 0.3;\n }\n\n const overlap = queryIntent.entityTypes.filter((et) => memoryIntent.entityTypes.includes(et)).length;\n if (overlap > 0) {\n const denom = Math.max(queryIntent.entityTypes.length, memoryIntent.entityTypes.length, 1);\n score += 0.2 * (overlap / denom);\n }\n\n return Math.max(0, Math.min(1, score));\n}\n\nexport function planRecallMode(prompt: string): RecallPlanMode {\n const p = normalizeTextInput(prompt).trim();\n let ackCandidate = p;\n while (ackCandidate.length > 0) {\n const ch = ackCandidate.charCodeAt(ackCandidate.length - 1);\n const isDigit = ch >= 48 && ch <= 57;\n const isUpper = ch >= 65 && ch <= 90;\n const isLower = ch >= 97 && ch <= 122;\n // Strip any trailing non-alphanumeric noise (punctuation/emojis/symbols).\n if (isDigit || isUpper || isLower) break;\n ackCandidate = ackCandidate.slice(0, -1);\n }\n ackCandidate = ackCandidate.trim();\n if (p.length === 0) return \"no_recall\";\n\n if (/\\b(timeline|sequence|history|what happened|chain of events|root cause)\\b/i.test(p)) {\n return \"graph_mode\";\n }\n\n // Reserve no_recall for low-information acknowledgements; avoid broad regressions.\n if (\n p.length <= 18 &&\n /^(ok|okay|kk|thanks|thx|got it|sounds good|yep|yes|nope|no|done|cool|works)$/i.test(ackCandidate)\n ) {\n return \"no_recall\";\n }\n\n // Full recall for prompts that are explicitly memory-seeking or analytical questions.\n if (\n /\\b(previous|earlier|remember|last time|did we|what did we decide|context|summarize|summary|recap|key points|decision)\\b/i.test(p) ||\n /\\?$/.test(p) ||\n /^(what|why|how|when|where|who|which)\\b/i.test(p.toLowerCase())\n ) {\n return \"full\";\n }\n\n // Minimal for short, non-question operational directives to keep latency/tokens down.\n if (\n p.length <= 100 &&\n /^(check|reload|restart|run|verify|show|status|sync|update|open|close|set|enable|disable|fix|patch)\\b/i.test(p)\n ) {\n return \"minimal\";\n }\n\n return \"full\";\n}\n\nexport function hasBroadGraphIntent(prompt: string): boolean {\n const p = normalizeTextInput(prompt).trim().toLowerCase();\n if (!p) return false;\n return /\\b(what changed|how did we get here|why did this happen|what led to|cause chain|dependency chain|regression chain|failure chain)\\b/i.test(\n p,\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/message-parts/index.ts"],"sourcesContent":["export type LcmMessagePartKind =\n | \"text\"\n | \"tool_call\"\n | \"tool_result\"\n | \"patch\"\n | \"file_read\"\n | \"file_write\"\n | \"step_start\"\n | \"step_finish\"\n | \"snapshot\"\n | \"retry\";\n\nexport const LCM_MESSAGE_PART_KINDS: readonly LcmMessagePartKind[] = [\n \"text\",\n \"tool_call\",\n \"tool_result\",\n \"patch\",\n \"file_read\",\n \"file_write\",\n \"step_start\",\n \"step_finish\",\n \"snapshot\",\n \"retry\",\n] as const;\n\nexport type MessagePartSourceFormat =\n | \"openai\"\n | \"anthropic\"\n | \"openclaw\"\n | \"lossless-claw\"\n | \"remnic\";\n\nexport interface LcmMessagePartInput {\n ordinal?: number | null;\n kind: LcmMessagePartKind;\n payload: Record<string, unknown>;\n toolName?: string | null;\n tool_name?: string | null;\n filePath?: string | null;\n file_path?: string | null;\n createdAt?: string | null;\n created_at?: string | null;\n}\n\nexport interface LcmMessagePartRow extends LcmMessagePartInput {\n id: number;\n messageId: number;\n ordinal: number;\n payloadJson: string;\n createdAt: string;\n}\n\nexport interface ParseMessagePartsOptions {\n sourceFormat?: MessagePartSourceFormat;\n renderedContent?: string;\n allowRenderedFallback?: boolean;\n}\n\nconst SECRET_KEY_RE = /(api[_-]?key|authorization|bearer|credential|password|secret|token)/i;\nconst MAX_PAYLOAD_STRING = 8_000;\nconst MAX_FILE_SCAN_CHARS = 20_000;\n\nexport function isLcmMessagePartKind(value: unknown): value is LcmMessagePartKind {\n return (\n typeof value === \"string\" &&\n (LCM_MESSAGE_PART_KINDS as readonly string[]).includes(value)\n );\n}\n\nexport function parseMessageParts(\n input: unknown,\n options: ParseMessagePartsOptions = {},\n): LcmMessagePartInput[] {\n const explicit = normalizeExplicitParts(input);\n if (explicit.length > 0) return explicit;\n\n const format = options.sourceFormat ?? inferSourceFormat(input);\n switch (format) {\n case \"openai\":\n return withRenderedFallback(parseOpenAiMessageParts(input, options), options);\n case \"anthropic\":\n return withRenderedFallback(parseAnthropicMessageParts(input, options), options);\n case \"openclaw\":\n return withRenderedFallback(parseOpenClawMessageParts(input, options), options);\n case \"lossless-claw\":\n case \"remnic\":\n return withRenderedFallback(normalizeExplicitParts(input), options);\n default:\n return renderedFallbackParts(options);\n }\n}\n\nexport function normalizeExplicitParts(input: unknown): LcmMessagePartInput[] {\n const rawParts = pickArray(input, \"parts\") ?? pickArray(input, \"message_parts\");\n if (!rawParts) return [];\n\n const parts: LcmMessagePartInput[] = [];\n rawParts.forEach((raw, index) => {\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) return;\n const obj = raw as Record<string, unknown>;\n const kind = normalizeKind(obj.kind ?? obj.type);\n if (!kind) return;\n\n const payload =\n obj.payload && typeof obj.payload === \"object\" && !Array.isArray(obj.payload)\n ? (obj.payload as Record<string, unknown>)\n : { value: sanitizePayload(obj) };\n const toolName = asNonEmptyString(obj.toolName ?? obj.tool_name ?? obj.name);\n const filePath = asNonEmptyString(obj.filePath ?? obj.file_path ?? obj.path);\n const ordinal =\n typeof obj.ordinal === \"number\" && Number.isInteger(obj.ordinal)\n ? Math.max(0, obj.ordinal)\n : index;\n\n parts.push({\n ordinal,\n kind,\n payload: sanitizePayload(payload) as Record<string, unknown>,\n toolName,\n filePath,\n createdAt: asNonEmptyString(obj.createdAt ?? obj.created_at),\n });\n });\n return parts;\n}\n\nexport function parseOpenAiMessageParts(\n input: unknown,\n _options: ParseMessagePartsOptions = {},\n): LcmMessagePartInput[] {\n const items = gatherOpenAiItems(input);\n const parts: LcmMessagePartInput[] = [];\n for (const item of items) {\n const type = asNonEmptyString(item.type) ?? asNonEmptyString(item.kind);\n if (!type) continue;\n if (isOpenAiContentBlock(item)) {\n const text = asNonEmptyString(item.text ?? item.content);\n if (text) parts.push(makePart(\"text\", { type, text }, { filePath: firstFilePath(text) }));\n continue;\n }\n if (type === \"message\") {\n for (const block of gatherContentBlocks(item.content)) {\n const text = asNonEmptyString(block.text ?? block.content);\n if (text) parts.push(makePart(\"text\", { type, text }, { filePath: firstFilePath(text) }));\n }\n continue;\n }\n if (type === \"function_call\") {\n const toolName = asNonEmptyString(item.name ?? item.tool_name);\n const callId = asNonEmptyString(item.call_id ?? item.callId);\n const itemId = asNonEmptyString(item.id);\n const payload = {\n id: callId ?? itemId,\n ...(callId ? { call_id: callId } : {}),\n ...(itemId && itemId !== callId ? { response_item_id: itemId } : {}),\n name: toolName,\n arguments: parseMaybeJson(item.arguments),\n };\n parts.push(classifyToolPart(toolName, payload));\n continue;\n }\n if (type === \"function_call_output\") {\n const output = asNonEmptyString(item.output) ?? JSON.stringify(sanitizePayload(item.output ?? item));\n const callId = asNonEmptyString(item.call_id ?? item.callId);\n const itemId = asNonEmptyString(item.id);\n parts.push(makePart(\"tool_result\", {\n id: callId ?? itemId,\n ...(callId ? { call_id: callId } : {}),\n ...(itemId && itemId !== callId ? { response_item_id: itemId } : {}),\n output,\n }, {\n filePath: firstFilePath(output),\n }));\n continue;\n }\n if (type === \"reasoning\") {\n parts.push(makePart(\"step_start\", { type, summary: sanitizePayload(item.summary ?? item) }));\n continue;\n }\n if (type === \"retry\") {\n parts.push(makePart(\"retry\", { type, item: sanitizePayload(item) }));\n }\n }\n return withOrdinals(parts);\n}\n\nexport function parseAnthropicMessageParts(\n input: unknown,\n _options: ParseMessagePartsOptions = {},\n): LcmMessagePartInput[] {\n const blocks = gatherContentBlocks(\n Array.isArray(input) ? input : input && typeof input === \"object\" ? (input as Record<string, unknown>).content : input,\n );\n const parts: LcmMessagePartInput[] = [];\n for (const block of blocks) {\n const type = asNonEmptyString(block.type);\n if (type === \"text\") {\n const text = asNonEmptyString(block.text);\n if (text) parts.push(makePart(\"text\", { type, text }, { filePath: firstFilePath(text) }));\n continue;\n }\n if (type === \"tool_use\") {\n const toolName = asNonEmptyString(block.name);\n parts.push(classifyToolPart(toolName, {\n id: block.id,\n name: toolName,\n input: sanitizePayload(block.input),\n }));\n continue;\n }\n if (type === \"tool_result\") {\n const content = block.content;\n const rendered = renderUnknownContent(content);\n parts.push(makePart(\"tool_result\", {\n id: block.tool_use_id,\n content: sanitizePayload(content),\n ...(typeof block.is_error === \"boolean\" ? { is_error: block.is_error } : {}),\n ...(typeof block.isError === \"boolean\" ? { isError: block.isError } : {}),\n }, {\n filePath: firstFilePath(rendered),\n }));\n continue;\n }\n if (type === \"thinking\") {\n parts.push(makePart(\"step_start\", {\n type,\n thinking: truncateString(asNonEmptyString(block.thinking) ?? \"\"),\n signature: asNonEmptyString(block.signature),\n }));\n continue;\n }\n if (type === \"redacted_thinking\") {\n parts.push(makePart(\"step_finish\", { type }));\n }\n }\n return withOrdinals(parts);\n}\n\nexport function parseOpenClawMessageParts(\n input: unknown,\n options: ParseMessagePartsOptions = {},\n): LcmMessagePartInput[] {\n const explicit = normalizeExplicitParts(input);\n if (explicit.length > 0) return explicit;\n if (!input || typeof input !== \"object\") return [];\n const obj = input as Record<string, unknown>;\n\n const content = obj.content;\n if (Array.isArray(content)) {\n const hasOpenAiBlocks = content.some(isOpenAiContentBlock);\n if (hasOpenAiBlocks) return parseOpenAiMessageParts(content, options);\n const hasAnthropicBlocks = content.some(\n (block) =>\n block &&\n typeof block === \"object\" &&\n typeof (block as Record<string, unknown>).type === \"string\",\n );\n if (hasAnthropicBlocks) return parseAnthropicMessageParts({ content }, options);\n }\n\n const toolName = asNonEmptyString(obj.toolName ?? obj.tool_name ?? obj.name);\n if (toolName) {\n return withOrdinals([\n classifyToolPart(toolName, {\n name: toolName,\n input: sanitizePayload(obj.input ?? obj.arguments ?? obj.params),\n output: sanitizePayload(obj.output ?? obj.result),\n }),\n ]);\n }\n\n const rendered = options.allowRenderedFallback === false\n ? null\n : options.renderedContent ?? asNonEmptyString(obj.content);\n return rendered ? withOrdinals(partsFromRenderedText(rendered)) : [];\n}\n\nexport function partsFromRenderedText(text: string): LcmMessagePartInput[] {\n if (text.includes(\"*** Begin Patch\")) {\n const paths = extractFilePaths(text);\n const patchPaths = extractPatchPaths(text);\n return withOrdinals((patchPaths.length > 0 ? patchPaths : paths).map((filePath) =>\n makePart(\"patch\", { text: truncateString(text) }, { filePath })\n ));\n }\n const paths = extractFilePaths(text);\n if (paths.length === 0) return [];\n return withOrdinals(paths.map((filePath) =>\n makePart(\"file_read\", { text: truncateString(text) }, { filePath })\n ));\n}\n\nfunction inferSourceFormat(input: unknown): MessagePartSourceFormat | undefined {\n if (input && typeof input === \"object\") {\n const obj = input as Record<string, unknown>;\n const explicit = asNonEmptyString(obj.sourceFormat ?? obj.source_format);\n if (explicit === \"openai\" || explicit === \"anthropic\" || explicit === \"openclaw\" || explicit === \"lossless-claw\" || explicit === \"remnic\") {\n return explicit;\n }\n if (Array.isArray(obj.output)) return \"openai\";\n if (isOpenAiResponseItem(obj)) return \"openai\";\n if (Array.isArray(obj.content) && obj.content.some(isOpenAiContentBlock)) return \"openai\";\n if (Array.isArray(obj.content)) return \"anthropic\";\n }\n if (Array.isArray(input)) {\n return input.some((item) =>\n isRecord(item) && (isOpenAiResponseItem(item) || isOpenAiContentBlock(item))\n )\n ? \"openai\"\n : \"anthropic\";\n }\n return undefined;\n}\n\nfunction isOpenAiResponseItem(obj: Record<string, unknown>): boolean {\n const type = asNonEmptyString(obj.type ?? obj.kind);\n return (\n type === \"message\" ||\n type === \"function_call\" ||\n type === \"function_call_output\" ||\n type === \"reasoning\" ||\n type === \"retry\"\n );\n}\n\nfunction isOpenAiContentBlock(value: unknown): boolean {\n if (!isRecord(value)) return false;\n const type = asNonEmptyString(value.type);\n return (\n type === \"input_text\" ||\n type === \"output_text\" ||\n type === \"input_image\" ||\n type === \"input_file\" ||\n type === \"refusal\"\n );\n}\n\nfunction gatherOpenAiItems(input: unknown): Record<string, unknown>[] {\n if (Array.isArray(input)) return input.filter(isRecord);\n if (!isRecord(input)) return [];\n if (Array.isArray(input.output)) return input.output.filter(isRecord);\n if (Array.isArray(input.items)) return input.items.filter(isRecord);\n return [input];\n}\n\nfunction gatherContentBlocks(input: unknown): Record<string, unknown>[] {\n if (Array.isArray(input)) return input.filter(isRecord);\n if (typeof input === \"string\") return [{ type: \"text\", text: input }];\n if (isRecord(input)) return [input];\n return [];\n}\n\nfunction classifyToolPart(\n toolName: string | null | undefined,\n payload: Record<string, unknown>,\n): LcmMessagePartInput {\n const normalized = (toolName ?? \"\").toLowerCase();\n const rendered = renderUnknownContent(payload);\n const filePath =\n firstFilePathFromObject(payload) ?? firstFilePath(rendered) ?? null;\n\n if (normalized.includes(\"apply_patch\") || rendered.includes(\"*** Begin Patch\")) {\n return makePart(\"patch\", payload, { toolName, filePath: filePath ?? extractPatchPaths(rendered)[0] ?? null });\n }\n if (/(write|edit|multiedit|create|save)/i.test(normalized)) {\n return makePart(\"file_write\", payload, { toolName, filePath });\n }\n if (/(read|grep|glob|search|list|ls)/i.test(normalized)) {\n return makePart(\"file_read\", payload, { toolName, filePath });\n }\n return makePart(\"tool_call\", payload, { toolName, filePath });\n}\n\nfunction makePart(\n kind: LcmMessagePartKind,\n payload: Record<string, unknown>,\n options: { toolName?: string | null; filePath?: string | null } = {},\n): LcmMessagePartInput {\n return {\n kind,\n payload: sanitizePayload(payload) as Record<string, unknown>,\n toolName: options.toolName ?? null,\n filePath: options.filePath ?? null,\n };\n}\n\nfunction withOrdinals(parts: LcmMessagePartInput[]): LcmMessagePartInput[] {\n return parts.map((part, ordinal) => ({ ...part, ordinal: part.ordinal ?? ordinal }));\n}\n\nfunction withRenderedFallback(\n parts: LcmMessagePartInput[],\n options: ParseMessagePartsOptions,\n): LcmMessagePartInput[] {\n return parts.length > 0 ? parts : renderedFallbackParts(options);\n}\n\nfunction renderedFallbackParts(options: ParseMessagePartsOptions): LcmMessagePartInput[] {\n if (options.allowRenderedFallback === false) {\n return [];\n }\n const rendered = asNonEmptyString(options.renderedContent);\n return rendered ? partsFromRenderedText(rendered) : [];\n}\n\nfunction normalizeKind(value: unknown): LcmMessagePartKind | null {\n if (isLcmMessagePartKind(value)) return value;\n if (value === \"tool_use\" || value === \"function_call\") return \"tool_call\";\n if (value === \"function_call_output\") return \"tool_result\";\n if (value === \"thinking\" || value === \"reasoning\") return \"step_start\";\n return null;\n}\n\nfunction pickArray(input: unknown, key: string): unknown[] | null {\n if (!input || typeof input !== \"object\" || Array.isArray(input)) return null;\n const value = (input as Record<string, unknown>)[key];\n return Array.isArray(value) ? value : null;\n}\n\nfunction asNonEmptyString(value: unknown): string | null {\n if (typeof value !== \"string\") return null;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction parseMaybeJson(value: unknown): unknown {\n if (typeof value !== \"string\") return sanitizePayload(value);\n try {\n return sanitizePayload(JSON.parse(value));\n } catch {\n return truncateString(value);\n }\n}\n\nfunction sanitizePayload(value: unknown, depth = 0): unknown {\n if (value === null || value === undefined) return value;\n if (typeof value === \"string\") return truncateString(value);\n if (typeof value === \"number\" || typeof value === \"boolean\") return value;\n if (Array.isArray(value)) {\n if (depth >= 4) return \"[truncated]\";\n return value.slice(0, 100).map((item) => sanitizePayload(item, depth + 1));\n }\n if (typeof value === \"object\") {\n if (depth >= 4) return \"[truncated]\";\n const out: Record<string, unknown> = {};\n for (const [key, child] of Object.entries(value as Record<string, unknown>)) {\n out[key] = SECRET_KEY_RE.test(key) ? \"[redacted]\" : sanitizePayload(child, depth + 1);\n }\n return out;\n }\n return String(value);\n}\n\nfunction truncateString(value: string): string {\n return value.length > MAX_PAYLOAD_STRING\n ? `${value.slice(0, MAX_PAYLOAD_STRING)}...[truncated]`\n : value;\n}\n\nfunction renderUnknownContent(value: unknown): string {\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value ?? \"\");\n } catch {\n return String(value ?? \"\");\n }\n}\n\nfunction firstFilePathFromObject(value: unknown): string | null {\n if (!isRecord(value)) return null;\n const keys = [\"file_path\", \"filePath\", \"path\", \"filename\", \"cwd\"];\n for (const key of keys) {\n const candidate = asNonEmptyString(value[key]);\n if (candidate) return candidate;\n }\n for (const child of Object.values(value)) {\n if (typeof child === \"string\") {\n const fromText = extractPatchPaths(child)[0] ?? firstFilePath(child);\n if (fromText) return fromText;\n }\n if (isRecord(child)) {\n const nested = firstFilePathFromObject(child);\n if (nested) return nested;\n }\n }\n return null;\n}\n\nfunction firstFilePath(text: string): string | null {\n return extractFilePaths(text)[0] ?? null;\n}\n\nfunction extractFilePaths(text: string): string[] {\n const out = new Set<string>();\n let token = \"\";\n const scanLength = Math.min(text.length, MAX_FILE_SCAN_CHARS);\n for (let index = 0; index <= scanLength; index += 1) {\n const char = index < scanLength ? text[index]! : \" \";\n if (isFilePathTokenSeparator(char)) {\n addFilePathCandidate(out, token);\n token = \"\";\n continue;\n }\n token += char;\n if (token.length > 512) {\n addFilePathCandidate(out, token);\n token = \"\";\n }\n }\n return [...out].slice(0, 20);\n}\n\nfunction isFilePathTokenSeparator(char: string): boolean {\n return (\n char === \" \" ||\n char === \"\\n\" ||\n char === \"\\r\" ||\n char === \"\\t\" ||\n char === \"\\\"\" ||\n char === \"'\" ||\n char === \"`\" ||\n char === \"(\" ||\n char === \")\" ||\n char === \"[\" ||\n char === \"]\" ||\n char === \"{\" ||\n char === \"}\" ||\n char === \"<\" ||\n char === \">\" ||\n char === \",\"\n );\n}\n\nfunction addFilePathCandidate(out: Set<string>, raw: string): void {\n const candidate = trimFilePathPunctuation(raw);\n if (candidate.length === 0 || candidate.includes(\"://\")) return;\n if (isLikelyFilePath(candidate)) out.add(candidate);\n}\n\nfunction trimFilePathPunctuation(raw: string): string {\n let start = 0;\n let end = raw.length;\n while (start < end && isLeadingFilePathPunctuation(raw[start]!)) start += 1;\n while (end > start && isTrailingFilePathPunctuation(raw[end - 1]!)) end -= 1;\n return raw.slice(start, end);\n}\n\nfunction isLeadingFilePathPunctuation(char: string): boolean {\n return (\n char === \":\" ||\n char === \";\" ||\n char === \"!\" ||\n char === \"?\" ||\n char === \"|\" ||\n char === \"*\" ||\n char === \"=\"\n );\n}\n\nfunction isTrailingFilePathPunctuation(char: string): boolean {\n return (\n char === \".\" ||\n char === \":\" ||\n char === \";\" ||\n char === \"!\" ||\n char === \"?\" ||\n char === \"|\" ||\n char === \"*\" ||\n char === \"=\"\n );\n}\n\nfunction isLikelyFilePath(value: string): boolean {\n if (value.startsWith(\"/\") || value.startsWith(\"./\") || value.startsWith(\"../\") || value.startsWith(\"~/\")) {\n return hasValidFileExtension(value);\n }\n if (value.includes(\"/\")) return hasValidFileExtension(value);\n return hasValidFileExtension(value);\n}\n\nfunction hasValidFileExtension(value: string): boolean {\n const lastSlash = value.lastIndexOf(\"/\");\n const basename = value.slice(lastSlash + 1);\n const dot = basename.lastIndexOf(\".\");\n if (dot <= 0 || dot === basename.length - 1) return false;\n const ext = basename.slice(dot + 1);\n if (ext.length < 1 || ext.length > 12) return false;\n for (const char of ext) {\n if (!isFileExtensionChar(char)) return false;\n }\n return true;\n}\n\nfunction isFileExtensionChar(char: string): boolean {\n const code = char.charCodeAt(0);\n return (\n (code >= 48 && code <= 57) ||\n (code >= 65 && code <= 90) ||\n (code >= 97 && code <= 122) ||\n char === \"_\" ||\n char === \"+\" ||\n char === \"-\"\n );\n}\n\nfunction extractPatchPaths(text: string): string[] {\n const out = new Set<string>();\n for (const line of text.split(/\\r?\\n/)) {\n const match = line.match(/^\\*\\*\\* (?:Add|Update|Delete) File: (.+)$/);\n if (match?.[1]) out.add(match[1].trim());\n const move = line.match(/^\\*\\*\\* Move to: (.+)$/);\n if (move?.[1]) out.add(move[1].trim());\n }\n return [...out].slice(0, 20);\n}\n"],"mappings":"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","names":["paths"]}
|