@remnic/core 1.1.10 → 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-BTTNyo1i.d.ts → access-service-DDjzFALq.d.ts} +54 -5
- 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-5GCNE7CN.js → chunk-BZSQEPRW.js} +454 -140
- 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-BrEwQTnW.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 +19 -1
- package/dist/explicit-cue-recall.js +10 -4
- 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 +289 -115
- 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-6IvQ-Phj.d.ts → orchestrator-DDMPqU6R.d.ts} +10 -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/sdk-compat.d.ts +3 -2
- package/dist/sdk-compat.js.map +1 -1
- 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-5GCNE7CN.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-ERUDW6DU.js +0 -965
- package/dist/chunk-ERUDW6DU.js.map +0 -1
- package/dist/chunk-GGD5W7TB.js.map +0 -1
- package/dist/chunk-IBX3VFOM.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-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
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
// src/mcp-memory-inspector-app.ts
|
|
2
|
+
var REMNIC_CHATGPT_MEMORY_INSPECTOR_TOOL = "engram.chatgpt_memory_inspector";
|
|
3
|
+
var REMNIC_CHATGPT_MEMORY_INSPECTOR_CANONICAL_TOOL = "remnic.chatgpt_memory_inspector";
|
|
4
|
+
var REMNIC_CHATGPT_MEMORY_INSPECTOR_WIDGET_URI = "ui://remnic/memory-inspector.v1.html";
|
|
5
|
+
var REMNIC_CHATGPT_MEMORY_INSPECTOR_MIME_TYPE = "text/html;profile=mcp-app";
|
|
6
|
+
function buildChatGptMemoryInspectorActionRequest(input, recall, xray) {
|
|
7
|
+
const provenances = (xray?.results ?? []).map((result) => result.provenance ?? missingProvenance(result));
|
|
8
|
+
const request = {
|
|
9
|
+
intendedAction: `Use Remnic memory to answer: ${input.query}`,
|
|
10
|
+
risk: "medium",
|
|
11
|
+
contextReadiness: recall.count > 0 ? "sufficient" : "partial",
|
|
12
|
+
retrievedMemories: provenances.map((provenance) => ({
|
|
13
|
+
source: provenance.source,
|
|
14
|
+
created: provenance.created,
|
|
15
|
+
updated: provenance.updated,
|
|
16
|
+
scope: provenance.scope,
|
|
17
|
+
userContextScopes: provenance.userContextScopes,
|
|
18
|
+
retrievalReason: provenance.retrievalReason,
|
|
19
|
+
confidence: provenance.confidence,
|
|
20
|
+
stale: provenance.stale,
|
|
21
|
+
corrected: provenance.corrected,
|
|
22
|
+
correctionState: provenance.correctionState,
|
|
23
|
+
safeToUse: provenance.safeToUse,
|
|
24
|
+
safety: provenance.safety,
|
|
25
|
+
safetyReasons: provenance.safetyReasons
|
|
26
|
+
}))
|
|
27
|
+
};
|
|
28
|
+
const confidence = provenances.length > 0 ? average(provenances.map((provenance) => provenance.confidence ?? 0.5)) : void 0;
|
|
29
|
+
if (confidence !== void 0) request.confidence = confidence;
|
|
30
|
+
if (input.currentContextScopes !== void 0) {
|
|
31
|
+
request.currentContextScopes = input.currentContextScopes;
|
|
32
|
+
}
|
|
33
|
+
return request;
|
|
34
|
+
}
|
|
35
|
+
function buildChatGptMemoryInspectorResult(input, recall, xray, actionConfidence) {
|
|
36
|
+
const xrayUnavailable = xray === null;
|
|
37
|
+
const xrayById = /* @__PURE__ */ new Map();
|
|
38
|
+
const xrayByPath = /* @__PURE__ */ new Map();
|
|
39
|
+
for (const result of xray?.results ?? []) {
|
|
40
|
+
xrayById.set(result.memoryId, result);
|
|
41
|
+
xrayByPath.set(result.path, result);
|
|
42
|
+
}
|
|
43
|
+
const matchXrayResult = (summary) => (summary.path ? xrayByPath.get(summary.path) : void 0) ?? xrayById.get(summary.id);
|
|
44
|
+
const matchedXrayResults = recall.results.map(matchXrayResult);
|
|
45
|
+
const memories = recall.results.slice(0, 8).map((summary) => {
|
|
46
|
+
const xrayResult = matchXrayResult(summary);
|
|
47
|
+
const provenance = xrayResult?.provenance;
|
|
48
|
+
const unverified = !xrayUnavailable && provenance === void 0;
|
|
49
|
+
const blocked = provenance?.safety === "blocked";
|
|
50
|
+
const preview = xrayUnavailable ? "Preview withheld: X-ray provenance was unavailable for this recall." : unverified ? "Preview withheld: X-ray provenance was missing for this memory." : blocked ? "Preview withheld: this memory is blocked in the current context." : summary.preview;
|
|
51
|
+
return {
|
|
52
|
+
id: summary.id,
|
|
53
|
+
path: summary.path,
|
|
54
|
+
category: summary.category,
|
|
55
|
+
status: summary.status,
|
|
56
|
+
preview,
|
|
57
|
+
servedBy: xrayResult?.servedBy,
|
|
58
|
+
score: xrayResult?.scoreDecomposition.final,
|
|
59
|
+
source: provenance?.source,
|
|
60
|
+
scope: provenance?.scope,
|
|
61
|
+
retrievalReason: provenance?.retrievalReason,
|
|
62
|
+
confidence: provenance?.confidence,
|
|
63
|
+
stale: provenance?.stale,
|
|
64
|
+
corrected: provenance?.corrected,
|
|
65
|
+
safeToUse: provenance?.safeToUse ?? (unverified ? false : void 0),
|
|
66
|
+
safety: provenance?.safety ?? (unverified ? "blocked" : void 0),
|
|
67
|
+
safetyReasons: provenance?.safetyReasons ?? (unverified ? ["X-ray provenance was missing for this memory."] : []),
|
|
68
|
+
userContextScopes: provenance?.userContextScopes ?? []
|
|
69
|
+
};
|
|
70
|
+
});
|
|
71
|
+
const blockedCount = matchedXrayResults.filter((result) => result?.provenance?.safety === "blocked").length;
|
|
72
|
+
const missingProvenanceCount = xrayUnavailable ? 0 : matchedXrayResults.filter((result) => result?.provenance === void 0).length;
|
|
73
|
+
const safeRecallPreview = xrayUnavailable ? "Recall preview withheld: X-ray provenance was unavailable, so memory safety could not be verified." : blockedCount > 0 || missingProvenanceCount > 0 ? formatUnsafeRecallPreview(blockedCount, missingProvenanceCount) : truncate(recall.context, 1500);
|
|
74
|
+
const primaryMemoryId = memories[0]?.id ?? "<memory-id>";
|
|
75
|
+
return {
|
|
76
|
+
app: {
|
|
77
|
+
name: "Remnic Memory Inspector",
|
|
78
|
+
resourceUri: REMNIC_CHATGPT_MEMORY_INSPECTOR_WIDGET_URI,
|
|
79
|
+
archetype: "vanilla-widget"
|
|
80
|
+
},
|
|
81
|
+
query: recall.query || input.query,
|
|
82
|
+
...input.sessionKey ? { sessionKey: input.sessionKey } : {},
|
|
83
|
+
namespace: recall.namespace,
|
|
84
|
+
safeRecallPreview,
|
|
85
|
+
memoryCount: recall.count,
|
|
86
|
+
memoryIds: recall.memoryIds,
|
|
87
|
+
memories,
|
|
88
|
+
actionConfidence,
|
|
89
|
+
affordances: [
|
|
90
|
+
{
|
|
91
|
+
id: "why",
|
|
92
|
+
label: "Why retrieved",
|
|
93
|
+
followUpPrompt: `Explain why Remnic retrieved memory ${primaryMemoryId} for "${input.query}" using its provenance, score, safety, and retrieval reason.`
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
id: "correct",
|
|
97
|
+
label: "Correct",
|
|
98
|
+
followUpPrompt: `Help me correct memory ${primaryMemoryId}. Draft a replacement or correction and use remnic.suggestion_submit with dryRun first.`
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
id: "forget",
|
|
102
|
+
label: "Forget",
|
|
103
|
+
followUpPrompt: `Help me forget or quarantine memory ${primaryMemoryId}. Ask me to confirm before using any destructive or persistent Remnic action.`
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
id: "scope",
|
|
107
|
+
label: "Scope",
|
|
108
|
+
followUpPrompt: `Help me scope memory ${primaryMemoryId} so it is only used in the right context. Prefer a dry-run Remnic action before any persistent change.`
|
|
109
|
+
}
|
|
110
|
+
],
|
|
111
|
+
guidance: {
|
|
112
|
+
correctionTool: "remnic.suggestion_submit",
|
|
113
|
+
forgetTool: "remnic.memory_action_apply",
|
|
114
|
+
scopeTool: "remnic.memory_action_apply",
|
|
115
|
+
note: "The demo only proposes correction, forget, and scoping flows. The widget sends follow-up prompts; persistent changes still require an explicit tool call and user confirmation."
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
var REMNIC_CHATGPT_MEMORY_INSPECTOR_WIDGET_HTML = `
|
|
120
|
+
<div id="root" class="remnic-app">Loading Remnic memory inspector...</div>
|
|
121
|
+
<style>
|
|
122
|
+
:root {
|
|
123
|
+
color-scheme: light dark;
|
|
124
|
+
--bg: #f8faf8;
|
|
125
|
+
--panel: #ffffff;
|
|
126
|
+
--text: #17201b;
|
|
127
|
+
--muted: #56635b;
|
|
128
|
+
--line: #d8e0da;
|
|
129
|
+
--accent: #2f7d57;
|
|
130
|
+
--warn: #9a5b14;
|
|
131
|
+
--bad: #9c2b2b;
|
|
132
|
+
}
|
|
133
|
+
@media (prefers-color-scheme: dark) {
|
|
134
|
+
:root {
|
|
135
|
+
--bg: #101512;
|
|
136
|
+
--panel: #18201b;
|
|
137
|
+
--text: #edf4ef;
|
|
138
|
+
--muted: #a8b6ad;
|
|
139
|
+
--line: #304036;
|
|
140
|
+
--accent: #75c79a;
|
|
141
|
+
--warn: #e0ad63;
|
|
142
|
+
--bad: #f08a8a;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
body { margin: 0; background: var(--bg); color: var(--text); font: 14px/1.45 system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; }
|
|
146
|
+
.remnic-app { padding: 14px; display: grid; gap: 12px; }
|
|
147
|
+
.header, .section, .memory { background: var(--panel); border: 1px solid var(--line); border-radius: 8px; padding: 12px; }
|
|
148
|
+
.title { font-size: 16px; font-weight: 650; margin: 0; }
|
|
149
|
+
.muted { color: var(--muted); }
|
|
150
|
+
.grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); gap: 8px; }
|
|
151
|
+
.pill { display: inline-flex; align-items: center; gap: 4px; border: 1px solid var(--line); border-radius: 999px; padding: 2px 8px; margin: 2px 4px 2px 0; color: var(--muted); }
|
|
152
|
+
.safe { color: var(--accent); }
|
|
153
|
+
.review { color: var(--warn); }
|
|
154
|
+
.blocked { color: var(--bad); }
|
|
155
|
+
.memory { display: grid; gap: 8px; }
|
|
156
|
+
.memory-title { display: flex; justify-content: space-between; gap: 12px; align-items: baseline; font-weight: 650; }
|
|
157
|
+
.preview { white-space: pre-wrap; overflow-wrap: anywhere; }
|
|
158
|
+
.actions { display: flex; flex-wrap: wrap; gap: 8px; }
|
|
159
|
+
button { border: 1px solid var(--line); background: transparent; color: var(--text); border-radius: 6px; padding: 6px 9px; font: inherit; cursor: pointer; }
|
|
160
|
+
button:hover { border-color: var(--accent); }
|
|
161
|
+
pre { white-space: pre-wrap; overflow-wrap: anywhere; margin: 0; color: var(--muted); }
|
|
162
|
+
</style>
|
|
163
|
+
<script>
|
|
164
|
+
const root = document.getElementById("root");
|
|
165
|
+
|
|
166
|
+
function escapeHtml(value) {
|
|
167
|
+
return String(value ?? "").replace(/[&<>"']/g, (char) => ({
|
|
168
|
+
"&": "&",
|
|
169
|
+
"<": "<",
|
|
170
|
+
">": ">",
|
|
171
|
+
'"': """,
|
|
172
|
+
"'": "'",
|
|
173
|
+
}[char]));
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
function statusClass(value) {
|
|
177
|
+
if (value === "blocked" || value === false) return "blocked";
|
|
178
|
+
if (value === "requires-review") return "review";
|
|
179
|
+
return "safe";
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
function followUp(prompt) {
|
|
183
|
+
if (window.openai?.sendFollowUpMessage) {
|
|
184
|
+
window.openai.sendFollowUpMessage({ prompt, scrollToBottom: true });
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
window.parent.postMessage({
|
|
188
|
+
jsonrpc: "2.0",
|
|
189
|
+
method: "ui/message",
|
|
190
|
+
params: {
|
|
191
|
+
role: "user",
|
|
192
|
+
content: [{ type: "text", text: prompt }],
|
|
193
|
+
},
|
|
194
|
+
}, "*");
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
function actionButtons(actions) {
|
|
198
|
+
return (actions ?? []).map((action) =>
|
|
199
|
+
'<button type="button" data-prompt="' + escapeHtml(action.followUpPrompt) + '">' +
|
|
200
|
+
escapeHtml(action.label) +
|
|
201
|
+
'</button>'
|
|
202
|
+
).join("");
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
function render(payload) {
|
|
206
|
+
const data = payload?.structuredContent ?? payload ?? window.openai?.toolOutput ?? {};
|
|
207
|
+
const confidence = data.actionConfidence ?? {};
|
|
208
|
+
const memories = Array.isArray(data.memories) ? data.memories : [];
|
|
209
|
+
root.innerHTML = [
|
|
210
|
+
'<section class="header">',
|
|
211
|
+
'<p class="title">Remnic Memory Inspector</p>',
|
|
212
|
+
'<div class="muted">' + escapeHtml(data.query ?? "No query") + '</div>',
|
|
213
|
+
'<div class="grid">',
|
|
214
|
+
'<div><strong>Namespace</strong><br><span class="muted">' + escapeHtml(data.namespace ?? "default") + '</span></div>',
|
|
215
|
+
'<div><strong>Decision</strong><br><span class="' + statusClass(confidence.decision) + '">' + escapeHtml(confidence.decision ?? "unknown") + '</span></div>',
|
|
216
|
+
'<div><strong>Memories</strong><br><span class="muted">' + escapeHtml(data.memoryCount ?? memories.length) + '</span></div>',
|
|
217
|
+
'</div>',
|
|
218
|
+
'</section>',
|
|
219
|
+
'<section class="section">',
|
|
220
|
+
'<strong>Safe recall preview</strong>',
|
|
221
|
+
'<pre>' + escapeHtml(data.safeRecallPreview ?? "") + '</pre>',
|
|
222
|
+
'</section>',
|
|
223
|
+
'<section class="section actions">',
|
|
224
|
+
actionButtons(data.affordances),
|
|
225
|
+
'</section>',
|
|
226
|
+
memories.map((memory) => [
|
|
227
|
+
'<article class="memory">',
|
|
228
|
+
'<div class="memory-title"><span>' + escapeHtml(memory.id) + '</span><span class="' + statusClass(memory.safety) + '">' + escapeHtml(memory.safety ?? "safe") + '</span></div>',
|
|
229
|
+
'<div class="preview">' + escapeHtml(memory.preview ?? "") + '</div>',
|
|
230
|
+
'<div>',
|
|
231
|
+
'<span class="pill">source ' + escapeHtml(memory.source ?? "unknown") + '</span>',
|
|
232
|
+
'<span class="pill">scope ' + escapeHtml(memory.scope ?? "unknown") + '</span>',
|
|
233
|
+
'<span class="pill">reason ' + escapeHtml(memory.retrievalReason ?? memory.servedBy ?? "unknown") + '</span>',
|
|
234
|
+
'<span class="pill">confidence ' + escapeHtml(memory.confidence ?? "n/a") + '</span>',
|
|
235
|
+
'</div>',
|
|
236
|
+
'<div class="muted">' + escapeHtml((memory.safetyReasons ?? []).join("; ")) + '</div>',
|
|
237
|
+
'</article>',
|
|
238
|
+
].join("")).join(""),
|
|
239
|
+
].join("");
|
|
240
|
+
|
|
241
|
+
root.querySelectorAll("button[data-prompt]").forEach((button) => {
|
|
242
|
+
button.addEventListener("click", () => followUp(button.getAttribute("data-prompt") ?? ""));
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
render(window.openai?.toolOutput);
|
|
247
|
+
|
|
248
|
+
window.addEventListener("message", (event) => {
|
|
249
|
+
if (event.source !== window.parent) return;
|
|
250
|
+
const message = event.data;
|
|
251
|
+
if (!message || message.jsonrpc !== "2.0") return;
|
|
252
|
+
if (message.method === "ui/notifications/tool-result") {
|
|
253
|
+
render(message.params);
|
|
254
|
+
}
|
|
255
|
+
}, { passive: true });
|
|
256
|
+
|
|
257
|
+
window.addEventListener("openai:set_globals", (event) => {
|
|
258
|
+
render(event.detail?.globals?.toolOutput ?? window.openai?.toolOutput);
|
|
259
|
+
}, { passive: true });
|
|
260
|
+
</script>
|
|
261
|
+
`.trim();
|
|
262
|
+
function average(values) {
|
|
263
|
+
if (values.length === 0) return void 0;
|
|
264
|
+
return values.reduce((sum, value) => sum + value, 0) / values.length;
|
|
265
|
+
}
|
|
266
|
+
function missingProvenance(result) {
|
|
267
|
+
return {
|
|
268
|
+
source: "unknown",
|
|
269
|
+
scope: "unknown",
|
|
270
|
+
userContextScopes: [],
|
|
271
|
+
retrievalReason: `X-ray provenance missing for ${result.memoryId || result.path}`,
|
|
272
|
+
confidence: 0,
|
|
273
|
+
stale: false,
|
|
274
|
+
corrected: false,
|
|
275
|
+
correctionState: "none",
|
|
276
|
+
safeToUse: false,
|
|
277
|
+
safety: "blocked",
|
|
278
|
+
safetyReasons: ["X-ray provenance was missing for this memory."]
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
function formatUnsafeRecallPreview(blockedCount, missingProvenanceCount) {
|
|
282
|
+
const reasons = [];
|
|
283
|
+
if (blockedCount > 0) {
|
|
284
|
+
reasons.push(`${blockedCount} retrieved ${memoryNoun(blockedCount)} ${isAre(blockedCount)} blocked`);
|
|
285
|
+
}
|
|
286
|
+
if (missingProvenanceCount > 0) {
|
|
287
|
+
reasons.push(
|
|
288
|
+
`${missingProvenanceCount} retrieved ${memoryNoun(missingProvenanceCount)} ${isAre(missingProvenanceCount)} missing X-ray provenance`
|
|
289
|
+
);
|
|
290
|
+
}
|
|
291
|
+
return `Recall preview withheld: ${joinReasons(reasons)} in the current context.`;
|
|
292
|
+
}
|
|
293
|
+
function memoryNoun(count) {
|
|
294
|
+
return count === 1 ? "memory" : "memories";
|
|
295
|
+
}
|
|
296
|
+
function isAre(count) {
|
|
297
|
+
return count === 1 ? "is" : "are";
|
|
298
|
+
}
|
|
299
|
+
function joinReasons(reasons) {
|
|
300
|
+
if (reasons.length <= 1) return reasons[0] ?? "memory safety could not be verified";
|
|
301
|
+
return `${reasons.slice(0, -1).join(", ")} and ${reasons[reasons.length - 1]}`;
|
|
302
|
+
}
|
|
303
|
+
function truncate(value, maxChars) {
|
|
304
|
+
if (value.length <= maxChars) return value;
|
|
305
|
+
return `${value.slice(0, Math.max(0, maxChars - 3))}...`;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
export {
|
|
309
|
+
REMNIC_CHATGPT_MEMORY_INSPECTOR_TOOL,
|
|
310
|
+
REMNIC_CHATGPT_MEMORY_INSPECTOR_CANONICAL_TOOL,
|
|
311
|
+
REMNIC_CHATGPT_MEMORY_INSPECTOR_WIDGET_URI,
|
|
312
|
+
REMNIC_CHATGPT_MEMORY_INSPECTOR_MIME_TYPE,
|
|
313
|
+
buildChatGptMemoryInspectorActionRequest,
|
|
314
|
+
buildChatGptMemoryInspectorResult,
|
|
315
|
+
REMNIC_CHATGPT_MEMORY_INSPECTOR_WIDGET_HTML
|
|
316
|
+
};
|
|
317
|
+
//# sourceMappingURL=chunk-C5BCH4ZS.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/mcp-memory-inspector-app.ts"],"sourcesContent":["import type { EngramAccessRecallResponse } from \"./access-service.js\";\nimport type { ActionConfidenceRequest } from \"./access-schema.js\";\nimport type { RecallXrayResult, RecallXraySnapshot } from \"./recall-xray.js\";\nimport type { ActionConfidenceResult } from \"./action-confidence.js\";\nimport type { RetrievedMemoryProvenance } from \"./memory-provenance.js\";\n\nexport const REMNIC_CHATGPT_MEMORY_INSPECTOR_TOOL =\n \"engram.chatgpt_memory_inspector\" as const;\nexport const REMNIC_CHATGPT_MEMORY_INSPECTOR_CANONICAL_TOOL =\n \"remnic.chatgpt_memory_inspector\" as const;\nexport const REMNIC_CHATGPT_MEMORY_INSPECTOR_WIDGET_URI =\n \"ui://remnic/memory-inspector.v1.html\" as const;\nexport const REMNIC_CHATGPT_MEMORY_INSPECTOR_MIME_TYPE =\n \"text/html;profile=mcp-app\" as const;\n\nexport interface RemnicChatGptMemoryInspectorInput {\n query: string;\n sessionKey?: string;\n namespace?: string;\n currentContextScopes?: string[];\n}\n\nexport interface RemnicChatGptMemoryCard {\n id: string;\n path?: string;\n category?: string;\n status?: string;\n preview?: string;\n servedBy?: string;\n score?: number;\n source?: string;\n scope?: string;\n retrievalReason?: string;\n confidence?: number;\n stale?: boolean;\n corrected?: boolean;\n safeToUse?: boolean;\n safety?: string;\n safetyReasons: string[];\n userContextScopes: string[];\n}\n\nexport interface RemnicChatGptMemoryInspectorResult {\n app: {\n name: \"Remnic Memory Inspector\";\n resourceUri: typeof REMNIC_CHATGPT_MEMORY_INSPECTOR_WIDGET_URI;\n archetype: \"vanilla-widget\";\n };\n query: string;\n sessionKey?: string;\n namespace: string;\n safeRecallPreview: string;\n memoryCount: number;\n memoryIds: string[];\n memories: RemnicChatGptMemoryCard[];\n actionConfidence: ActionConfidenceResult;\n affordances: Array<{\n id: \"why\" | \"correct\" | \"forget\" | \"scope\";\n label: string;\n followUpPrompt: string;\n }>;\n guidance: {\n correctionTool: \"remnic.suggestion_submit\";\n forgetTool: \"remnic.memory_action_apply\";\n scopeTool: \"remnic.memory_action_apply\";\n note: string;\n };\n}\n\nexport function buildChatGptMemoryInspectorActionRequest(\n input: RemnicChatGptMemoryInspectorInput,\n recall: EngramAccessRecallResponse,\n xray: RecallXraySnapshot | null,\n): ActionConfidenceRequest {\n const provenances = (xray?.results ?? [])\n .map((result) => result.provenance ?? missingProvenance(result));\n\n const request: ActionConfidenceRequest = {\n intendedAction: `Use Remnic memory to answer: ${input.query}`,\n risk: \"medium\",\n contextReadiness: recall.count > 0 ? \"sufficient\" : \"partial\",\n retrievedMemories: provenances.map((provenance) => ({\n source: provenance.source,\n created: provenance.created,\n updated: provenance.updated,\n scope: provenance.scope,\n userContextScopes: provenance.userContextScopes,\n retrievalReason: provenance.retrievalReason,\n confidence: provenance.confidence,\n stale: provenance.stale,\n corrected: provenance.corrected,\n correctionState: provenance.correctionState,\n safeToUse: provenance.safeToUse,\n safety: provenance.safety,\n safetyReasons: provenance.safetyReasons,\n })),\n };\n const confidence = provenances.length > 0\n ? average(provenances.map((provenance) => provenance.confidence ?? 0.5))\n : undefined;\n if (confidence !== undefined) request.confidence = confidence;\n if (input.currentContextScopes !== undefined) {\n request.currentContextScopes = input.currentContextScopes;\n }\n return request;\n}\n\nexport function buildChatGptMemoryInspectorResult(\n input: RemnicChatGptMemoryInspectorInput,\n recall: EngramAccessRecallResponse,\n xray: RecallXraySnapshot | null,\n actionConfidence: ActionConfidenceResult,\n): RemnicChatGptMemoryInspectorResult {\n const xrayUnavailable = xray === null;\n const xrayById = new Map<string, RecallXrayResult>();\n const xrayByPath = new Map<string, RecallXrayResult>();\n for (const result of xray?.results ?? []) {\n xrayById.set(result.memoryId, result);\n xrayByPath.set(result.path, result);\n }\n const matchXrayResult = (summary: EngramAccessRecallResponse[\"results\"][number]) =>\n (summary.path ? xrayByPath.get(summary.path) : undefined)\n ?? xrayById.get(summary.id);\n const matchedXrayResults = recall.results.map(matchXrayResult);\n\n const memories = recall.results.slice(0, 8).map((summary) => {\n const xrayResult = matchXrayResult(summary);\n const provenance = xrayResult?.provenance;\n const unverified = !xrayUnavailable && provenance === undefined;\n const blocked = provenance?.safety === \"blocked\";\n const preview = xrayUnavailable\n ? \"Preview withheld: X-ray provenance was unavailable for this recall.\"\n : unverified\n ? \"Preview withheld: X-ray provenance was missing for this memory.\"\n : blocked\n ? \"Preview withheld: this memory is blocked in the current context.\"\n : summary.preview;\n return {\n id: summary.id,\n path: summary.path,\n category: summary.category,\n status: summary.status,\n preview,\n servedBy: xrayResult?.servedBy,\n score: xrayResult?.scoreDecomposition.final,\n source: provenance?.source,\n scope: provenance?.scope,\n retrievalReason: provenance?.retrievalReason,\n confidence: provenance?.confidence,\n stale: provenance?.stale,\n corrected: provenance?.corrected,\n safeToUse: provenance?.safeToUse ?? (unverified ? false : undefined),\n safety: provenance?.safety ?? (unverified ? \"blocked\" : undefined),\n safetyReasons: provenance?.safetyReasons\n ?? (unverified ? [\"X-ray provenance was missing for this memory.\"] : []),\n userContextScopes: provenance?.userContextScopes ?? [],\n };\n });\n const blockedCount = matchedXrayResults\n .filter((result) => result?.provenance?.safety === \"blocked\")\n .length;\n const missingProvenanceCount = xrayUnavailable\n ? 0\n : matchedXrayResults\n .filter((result) => result?.provenance === undefined)\n .length;\n const safeRecallPreview = xrayUnavailable\n ? \"Recall preview withheld: X-ray provenance was unavailable, so memory safety could not be verified.\"\n : blockedCount > 0 || missingProvenanceCount > 0\n ? formatUnsafeRecallPreview(blockedCount, missingProvenanceCount)\n : truncate(recall.context, 1_500);\n\n const primaryMemoryId = memories[0]?.id ?? \"<memory-id>\";\n return {\n app: {\n name: \"Remnic Memory Inspector\",\n resourceUri: REMNIC_CHATGPT_MEMORY_INSPECTOR_WIDGET_URI,\n archetype: \"vanilla-widget\",\n },\n query: recall.query || input.query,\n ...(input.sessionKey ? { sessionKey: input.sessionKey } : {}),\n namespace: recall.namespace,\n safeRecallPreview,\n memoryCount: recall.count,\n memoryIds: recall.memoryIds,\n memories,\n actionConfidence,\n affordances: [\n {\n id: \"why\",\n label: \"Why retrieved\",\n followUpPrompt:\n `Explain why Remnic retrieved memory ${primaryMemoryId} for \"${input.query}\" using its provenance, score, safety, and retrieval reason.`,\n },\n {\n id: \"correct\",\n label: \"Correct\",\n followUpPrompt:\n `Help me correct memory ${primaryMemoryId}. Draft a replacement or correction and use remnic.suggestion_submit with dryRun first.`,\n },\n {\n id: \"forget\",\n label: \"Forget\",\n followUpPrompt:\n `Help me forget or quarantine memory ${primaryMemoryId}. Ask me to confirm before using any destructive or persistent Remnic action.`,\n },\n {\n id: \"scope\",\n label: \"Scope\",\n followUpPrompt:\n `Help me scope memory ${primaryMemoryId} so it is only used in the right context. Prefer a dry-run Remnic action before any persistent change.`,\n },\n ],\n guidance: {\n correctionTool: \"remnic.suggestion_submit\",\n forgetTool: \"remnic.memory_action_apply\",\n scopeTool: \"remnic.memory_action_apply\",\n note:\n \"The demo only proposes correction, forget, and scoping flows. The widget sends follow-up prompts; persistent changes still require an explicit tool call and user confirmation.\",\n },\n };\n}\n\nexport const REMNIC_CHATGPT_MEMORY_INSPECTOR_WIDGET_HTML = `\n<div id=\"root\" class=\"remnic-app\">Loading Remnic memory inspector...</div>\n<style>\n :root {\n color-scheme: light dark;\n --bg: #f8faf8;\n --panel: #ffffff;\n --text: #17201b;\n --muted: #56635b;\n --line: #d8e0da;\n --accent: #2f7d57;\n --warn: #9a5b14;\n --bad: #9c2b2b;\n }\n @media (prefers-color-scheme: dark) {\n :root {\n --bg: #101512;\n --panel: #18201b;\n --text: #edf4ef;\n --muted: #a8b6ad;\n --line: #304036;\n --accent: #75c79a;\n --warn: #e0ad63;\n --bad: #f08a8a;\n }\n }\n body { margin: 0; background: var(--bg); color: var(--text); font: 14px/1.45 system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif; }\n .remnic-app { padding: 14px; display: grid; gap: 12px; }\n .header, .section, .memory { background: var(--panel); border: 1px solid var(--line); border-radius: 8px; padding: 12px; }\n .title { font-size: 16px; font-weight: 650; margin: 0; }\n .muted { color: var(--muted); }\n .grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); gap: 8px; }\n .pill { display: inline-flex; align-items: center; gap: 4px; border: 1px solid var(--line); border-radius: 999px; padding: 2px 8px; margin: 2px 4px 2px 0; color: var(--muted); }\n .safe { color: var(--accent); }\n .review { color: var(--warn); }\n .blocked { color: var(--bad); }\n .memory { display: grid; gap: 8px; }\n .memory-title { display: flex; justify-content: space-between; gap: 12px; align-items: baseline; font-weight: 650; }\n .preview { white-space: pre-wrap; overflow-wrap: anywhere; }\n .actions { display: flex; flex-wrap: wrap; gap: 8px; }\n button { border: 1px solid var(--line); background: transparent; color: var(--text); border-radius: 6px; padding: 6px 9px; font: inherit; cursor: pointer; }\n button:hover { border-color: var(--accent); }\n pre { white-space: pre-wrap; overflow-wrap: anywhere; margin: 0; color: var(--muted); }\n</style>\n<script>\n const root = document.getElementById(\"root\");\n\n function escapeHtml(value) {\n return String(value ?? \"\").replace(/[&<>\"']/g, (char) => ({\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\",\n \"'\": \"'\",\n }[char]));\n }\n\n function statusClass(value) {\n if (value === \"blocked\" || value === false) return \"blocked\";\n if (value === \"requires-review\") return \"review\";\n return \"safe\";\n }\n\n function followUp(prompt) {\n if (window.openai?.sendFollowUpMessage) {\n window.openai.sendFollowUpMessage({ prompt, scrollToBottom: true });\n return;\n }\n window.parent.postMessage({\n jsonrpc: \"2.0\",\n method: \"ui/message\",\n params: {\n role: \"user\",\n content: [{ type: \"text\", text: prompt }],\n },\n }, \"*\");\n }\n\n function actionButtons(actions) {\n return (actions ?? []).map((action) =>\n '<button type=\"button\" data-prompt=\"' + escapeHtml(action.followUpPrompt) + '\">' +\n escapeHtml(action.label) +\n '</button>'\n ).join(\"\");\n }\n\n function render(payload) {\n const data = payload?.structuredContent ?? payload ?? window.openai?.toolOutput ?? {};\n const confidence = data.actionConfidence ?? {};\n const memories = Array.isArray(data.memories) ? data.memories : [];\n root.innerHTML = [\n '<section class=\"header\">',\n '<p class=\"title\">Remnic Memory Inspector</p>',\n '<div class=\"muted\">' + escapeHtml(data.query ?? \"No query\") + '</div>',\n '<div class=\"grid\">',\n '<div><strong>Namespace</strong><br><span class=\"muted\">' + escapeHtml(data.namespace ?? \"default\") + '</span></div>',\n '<div><strong>Decision</strong><br><span class=\"' + statusClass(confidence.decision) + '\">' + escapeHtml(confidence.decision ?? \"unknown\") + '</span></div>',\n '<div><strong>Memories</strong><br><span class=\"muted\">' + escapeHtml(data.memoryCount ?? memories.length) + '</span></div>',\n '</div>',\n '</section>',\n '<section class=\"section\">',\n '<strong>Safe recall preview</strong>',\n '<pre>' + escapeHtml(data.safeRecallPreview ?? \"\") + '</pre>',\n '</section>',\n '<section class=\"section actions\">',\n actionButtons(data.affordances),\n '</section>',\n memories.map((memory) => [\n '<article class=\"memory\">',\n '<div class=\"memory-title\"><span>' + escapeHtml(memory.id) + '</span><span class=\"' + statusClass(memory.safety) + '\">' + escapeHtml(memory.safety ?? \"safe\") + '</span></div>',\n '<div class=\"preview\">' + escapeHtml(memory.preview ?? \"\") + '</div>',\n '<div>',\n '<span class=\"pill\">source ' + escapeHtml(memory.source ?? \"unknown\") + '</span>',\n '<span class=\"pill\">scope ' + escapeHtml(memory.scope ?? \"unknown\") + '</span>',\n '<span class=\"pill\">reason ' + escapeHtml(memory.retrievalReason ?? memory.servedBy ?? \"unknown\") + '</span>',\n '<span class=\"pill\">confidence ' + escapeHtml(memory.confidence ?? \"n/a\") + '</span>',\n '</div>',\n '<div class=\"muted\">' + escapeHtml((memory.safetyReasons ?? []).join(\"; \")) + '</div>',\n '</article>',\n ].join(\"\")).join(\"\"),\n ].join(\"\");\n\n root.querySelectorAll(\"button[data-prompt]\").forEach((button) => {\n button.addEventListener(\"click\", () => followUp(button.getAttribute(\"data-prompt\") ?? \"\"));\n });\n }\n\n render(window.openai?.toolOutput);\n\n window.addEventListener(\"message\", (event) => {\n if (event.source !== window.parent) return;\n const message = event.data;\n if (!message || message.jsonrpc !== \"2.0\") return;\n if (message.method === \"ui/notifications/tool-result\") {\n render(message.params);\n }\n }, { passive: true });\n\n window.addEventListener(\"openai:set_globals\", (event) => {\n render(event.detail?.globals?.toolOutput ?? window.openai?.toolOutput);\n }, { passive: true });\n</script>\n`.trim();\n\nfunction average(values: number[]): number | undefined {\n if (values.length === 0) return undefined;\n return values.reduce((sum, value) => sum + value, 0) / values.length;\n}\n\nfunction missingProvenance(result: RecallXrayResult): RetrievedMemoryProvenance {\n return {\n source: \"unknown\",\n scope: \"unknown\",\n userContextScopes: [],\n retrievalReason: `X-ray provenance missing for ${result.memoryId || result.path}`,\n confidence: 0,\n stale: false,\n corrected: false,\n correctionState: \"none\",\n safeToUse: false,\n safety: \"blocked\",\n safetyReasons: [\"X-ray provenance was missing for this memory.\"],\n };\n}\n\nfunction formatUnsafeRecallPreview(\n blockedCount: number,\n missingProvenanceCount: number,\n): string {\n const reasons: string[] = [];\n if (blockedCount > 0) {\n reasons.push(`${blockedCount} retrieved ${memoryNoun(blockedCount)} ${isAre(blockedCount)} blocked`);\n }\n if (missingProvenanceCount > 0) {\n reasons.push(\n `${missingProvenanceCount} retrieved ${memoryNoun(missingProvenanceCount)} ${isAre(missingProvenanceCount)} missing X-ray provenance`,\n );\n }\n return `Recall preview withheld: ${joinReasons(reasons)} in the current context.`;\n}\n\nfunction memoryNoun(count: number): string {\n return count === 1 ? \"memory\" : \"memories\";\n}\n\nfunction isAre(count: number): string {\n return count === 1 ? \"is\" : \"are\";\n}\n\nfunction joinReasons(reasons: string[]): string {\n if (reasons.length <= 1) return reasons[0] ?? \"memory safety could not be verified\";\n return `${reasons.slice(0, -1).join(\", \")} and ${reasons[reasons.length - 1]}`;\n}\n\nfunction truncate(value: string, maxChars: number): string {\n if (value.length <= maxChars) return value;\n return `${value.slice(0, Math.max(0, maxChars - 3))}...`;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -3,13 +3,9 @@ import {
|
|
|
3
3
|
renderExtensionsBlock,
|
|
4
4
|
resolveExtensionsRoot
|
|
5
5
|
} from "./chunk-EJI5XIBB.js";
|
|
6
|
-
import {
|
|
7
|
-
countRecallTokenOverlap,
|
|
8
|
-
normalizeRecallTokens
|
|
9
|
-
} from "./chunk-DT5TVLJE.js";
|
|
10
6
|
import {
|
|
11
7
|
StorageManager
|
|
12
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-3B6KIRBH.js";
|
|
13
9
|
import {
|
|
14
10
|
isSemanticConsolidationLlmOperator
|
|
15
11
|
} from "./chunk-G7D6GZ5J.js";
|
|
@@ -17,6 +13,10 @@ import {
|
|
|
17
13
|
readEnvVar,
|
|
18
14
|
resolveHomeDir
|
|
19
15
|
} from "./chunk-MARWOCVP.js";
|
|
16
|
+
import {
|
|
17
|
+
countRecallTokenOverlap,
|
|
18
|
+
normalizeRecallTokens
|
|
19
|
+
} from "./chunk-DT5TVLJE.js";
|
|
20
20
|
import {
|
|
21
21
|
log
|
|
22
22
|
} from "./chunk-2ODBA7MQ.js";
|
|
@@ -888,4 +888,4 @@ export {
|
|
|
888
888
|
buildExtensionsBlockForConsolidation,
|
|
889
889
|
materializeAfterSemanticConsolidation
|
|
890
890
|
};
|
|
891
|
-
//# sourceMappingURL=chunk-
|
|
891
|
+
//# sourceMappingURL=chunk-CPKTBRS2.js.map
|
|
@@ -28,6 +28,8 @@ function parseMessageParts(input, options = {}) {
|
|
|
28
28
|
return withRenderedFallback(parseAnthropicMessageParts(input, options), options);
|
|
29
29
|
case "openclaw":
|
|
30
30
|
return withRenderedFallback(parseOpenClawMessageParts(input, options), options);
|
|
31
|
+
case "pi":
|
|
32
|
+
return withRenderedFallback(parsePiMessageParts(input, options), options);
|
|
31
33
|
case "lossless-claw":
|
|
32
34
|
case "remnic":
|
|
33
35
|
return withRenderedFallback(normalizeExplicitParts(input), options);
|
|
@@ -190,6 +192,94 @@ function parseOpenClawMessageParts(input, options = {}) {
|
|
|
190
192
|
const rendered = options.allowRenderedFallback === false ? null : options.renderedContent ?? asNonEmptyString(obj.content);
|
|
191
193
|
return rendered ? withOrdinals(partsFromRenderedText(rendered)) : [];
|
|
192
194
|
}
|
|
195
|
+
function parsePiMessageParts(input, options = {}) {
|
|
196
|
+
const explicit = normalizeExplicitParts(input);
|
|
197
|
+
if (explicit.length > 0) return explicit;
|
|
198
|
+
if (!isRecord(input)) return renderedFallbackParts(options);
|
|
199
|
+
if (input.role === "bashExecution") {
|
|
200
|
+
const command = asNonEmptyString(input.command);
|
|
201
|
+
const output = asNonEmptyString(input.output);
|
|
202
|
+
const rendered = [command ? `Ran ${command}` : null, output].filter(Boolean).join("\n");
|
|
203
|
+
return withOrdinals([
|
|
204
|
+
makePart("tool_result", {
|
|
205
|
+
role: "bashExecution",
|
|
206
|
+
command,
|
|
207
|
+
output,
|
|
208
|
+
exitCode: input.exitCode ?? input.exit_code
|
|
209
|
+
}, {
|
|
210
|
+
toolName: "bashExecution",
|
|
211
|
+
filePath: firstFilePathFromObject(input) ?? firstFilePath(rendered)
|
|
212
|
+
})
|
|
213
|
+
]);
|
|
214
|
+
}
|
|
215
|
+
const topLevelType = asNonEmptyString(input.type ?? input.kind ?? input.role);
|
|
216
|
+
if (topLevelType === "toolResult" || topLevelType === "tool_result") {
|
|
217
|
+
const toolName2 = asNonEmptyString(input.name ?? input.toolName ?? input.tool_name);
|
|
218
|
+
const output = input.output ?? input.result ?? input.content;
|
|
219
|
+
const rendered = renderUnknownContent(output ?? input);
|
|
220
|
+
return withOrdinals([
|
|
221
|
+
makePart("tool_result", {
|
|
222
|
+
id: input.id ?? input.toolCallId ?? input.tool_call_id,
|
|
223
|
+
name: toolName2,
|
|
224
|
+
output: sanitizePayload(output),
|
|
225
|
+
...typeof input.isError === "boolean" ? { isError: input.isError } : {},
|
|
226
|
+
...typeof input.is_error === "boolean" ? { is_error: input.is_error } : {}
|
|
227
|
+
}, {
|
|
228
|
+
toolName: toolName2,
|
|
229
|
+
filePath: firstFilePathFromObject(input) ?? firstFilePath(rendered)
|
|
230
|
+
})
|
|
231
|
+
]);
|
|
232
|
+
}
|
|
233
|
+
const content = input.content;
|
|
234
|
+
const blocks = Array.isArray(content) ? content.filter(isRecord) : [];
|
|
235
|
+
const parts = [];
|
|
236
|
+
if (typeof content === "string") {
|
|
237
|
+
parts.push(makePart("text", { text: content }, { filePath: firstFilePath(content) }));
|
|
238
|
+
}
|
|
239
|
+
blocks.forEach((block, ordinal) => {
|
|
240
|
+
const type = asNonEmptyString(block.type ?? block.kind);
|
|
241
|
+
if (type === "text") {
|
|
242
|
+
const text = asNonEmptyString(block.text ?? block.content);
|
|
243
|
+
if (text) parts.push({ ...makePart("text", { type, text }, { filePath: firstFilePath(text) }), ordinal });
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
if (type === "toolCall" || type === "tool_call") {
|
|
247
|
+
const toolName2 = asNonEmptyString(block.name ?? block.toolName ?? block.tool_name);
|
|
248
|
+
const payload = {
|
|
249
|
+
id: block.id,
|
|
250
|
+
name: toolName2,
|
|
251
|
+
arguments: sanitizePayload(block.arguments ?? block.args ?? block.input ?? block.params)
|
|
252
|
+
};
|
|
253
|
+
parts.push({ ...classifyToolPart(toolName2, payload), ordinal });
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
if (type === "toolResult" || type === "tool_result") {
|
|
257
|
+
const rendered = renderUnknownContent(block.output ?? block.result ?? block.content ?? block);
|
|
258
|
+
parts.push({
|
|
259
|
+
...makePart("tool_result", {
|
|
260
|
+
id: block.id ?? block.toolCallId ?? block.tool_call_id,
|
|
261
|
+
name: asNonEmptyString(block.name ?? block.toolName ?? block.tool_name),
|
|
262
|
+
output: sanitizePayload(block.output ?? block.result ?? block.content),
|
|
263
|
+
...typeof block.isError === "boolean" ? { isError: block.isError } : {},
|
|
264
|
+
...typeof block.is_error === "boolean" ? { is_error: block.is_error } : {}
|
|
265
|
+
}, {
|
|
266
|
+
toolName: asNonEmptyString(block.name ?? block.toolName ?? block.tool_name),
|
|
267
|
+
filePath: firstFilePathFromObject(block) ?? firstFilePath(rendered)
|
|
268
|
+
}),
|
|
269
|
+
ordinal
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
});
|
|
273
|
+
const toolName = asNonEmptyString(input.toolName ?? input.tool_name ?? input.name);
|
|
274
|
+
if (parts.length === 0 && toolName) {
|
|
275
|
+
parts.push(classifyToolPart(toolName, {
|
|
276
|
+
name: toolName,
|
|
277
|
+
arguments: sanitizePayload(input.arguments ?? input.args ?? input.input ?? input.params),
|
|
278
|
+
output: sanitizePayload(input.output ?? input.result)
|
|
279
|
+
}));
|
|
280
|
+
}
|
|
281
|
+
return withRenderedFallback(withOrdinals(parts), options);
|
|
282
|
+
}
|
|
193
283
|
function partsFromRenderedText(text) {
|
|
194
284
|
if (text.includes("*** Begin Patch")) {
|
|
195
285
|
const paths2 = extractFilePaths(text);
|
|
@@ -208,12 +298,14 @@ function inferSourceFormat(input) {
|
|
|
208
298
|
if (input && typeof input === "object") {
|
|
209
299
|
const obj = input;
|
|
210
300
|
const explicit = asNonEmptyString(obj.sourceFormat ?? obj.source_format);
|
|
211
|
-
if (explicit === "openai" || explicit === "anthropic" || explicit === "openclaw" || explicit === "lossless-claw" || explicit === "remnic") {
|
|
301
|
+
if (explicit === "openai" || explicit === "anthropic" || explicit === "openclaw" || explicit === "pi" || explicit === "lossless-claw" || explicit === "remnic") {
|
|
212
302
|
return explicit;
|
|
213
303
|
}
|
|
214
304
|
if (Array.isArray(obj.output)) return "openai";
|
|
215
305
|
if (isOpenAiResponseItem(obj)) return "openai";
|
|
216
306
|
if (Array.isArray(obj.content) && obj.content.some(isOpenAiContentBlock)) return "openai";
|
|
307
|
+
if (isAnthropicMessageObject(obj)) return "anthropic";
|
|
308
|
+
if (isPiMessageObject(obj)) return "pi";
|
|
217
309
|
if (Array.isArray(obj.content)) return "anthropic";
|
|
218
310
|
}
|
|
219
311
|
if (Array.isArray(input)) {
|
|
@@ -223,6 +315,29 @@ function inferSourceFormat(input) {
|
|
|
223
315
|
}
|
|
224
316
|
return void 0;
|
|
225
317
|
}
|
|
318
|
+
function isPiMessageObject(obj) {
|
|
319
|
+
if (obj.role === "bashExecution") return true;
|
|
320
|
+
if (obj.role === "toolResult" || obj.role === "tool_result") return true;
|
|
321
|
+
const type = asNonEmptyString(obj.type ?? obj.kind);
|
|
322
|
+
if (type === "toolCall" || type === "tool_call" || type === "toolResult" || type === "tool_result") return true;
|
|
323
|
+
if (!Array.isArray(obj.content)) return false;
|
|
324
|
+
return obj.content.some((block) => {
|
|
325
|
+
if (!isRecord(block)) return false;
|
|
326
|
+
const blockType = asNonEmptyString(block.type ?? block.kind);
|
|
327
|
+
return blockType === "toolCall" || blockType === "tool_call" || blockType === "toolResult" || blockType === "tool_result";
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
function isAnthropicMessageObject(obj) {
|
|
331
|
+
if (isAnthropicContentBlock(obj)) return true;
|
|
332
|
+
if (!Array.isArray(obj.content)) return false;
|
|
333
|
+
return obj.content.some(isAnthropicContentBlock);
|
|
334
|
+
}
|
|
335
|
+
function isAnthropicContentBlock(value) {
|
|
336
|
+
if (!isRecord(value)) return false;
|
|
337
|
+
const type = asNonEmptyString(value.type ?? value.kind);
|
|
338
|
+
if (type === "tool_use" || type === "thinking" || type === "redacted_thinking") return true;
|
|
339
|
+
return type === "tool_result" && value.tool_use_id !== void 0;
|
|
340
|
+
}
|
|
226
341
|
function isOpenAiResponseItem(obj) {
|
|
227
342
|
const type = asNonEmptyString(obj.type ?? obj.kind);
|
|
228
343
|
return type === "message" || type === "function_call" || type === "function_call_output" || type === "reasoning" || type === "retry";
|
|
@@ -441,6 +556,7 @@ export {
|
|
|
441
556
|
parseOpenAiMessageParts,
|
|
442
557
|
parseAnthropicMessageParts,
|
|
443
558
|
parseOpenClawMessageParts,
|
|
559
|
+
parsePiMessageParts,
|
|
444
560
|
partsFromRenderedText
|
|
445
561
|
};
|
|
446
|
-
//# sourceMappingURL=chunk-
|
|
562
|
+
//# sourceMappingURL=chunk-D4GAOFF6.js.map
|