@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.
Files changed (299) hide show
  1. package/README.md +3 -3
  2. package/dist/access-cli.js +67 -59
  3. package/dist/access-cli.js.map +1 -1
  4. package/dist/access-http.d.ts +7 -4
  5. package/dist/access-http.js +30 -26
  6. package/dist/access-mcp.d.ts +9 -4
  7. package/dist/access-mcp.js +29 -25
  8. package/dist/access-schema.d.ts +188 -8
  9. package/dist/access-schema.js +12 -3
  10. package/dist/{access-service-BTTNyo1i.d.ts → access-service-DDjzFALq.d.ts} +54 -5
  11. package/dist/access-service.d.ts +7 -4
  12. package/dist/access-service.js +26 -23
  13. package/dist/action-confidence.d.ts +83 -0
  14. package/dist/action-confidence.js +22 -0
  15. package/dist/active-memory-bridge.d.ts +1 -1
  16. package/dist/active-recall.d.ts +1 -1
  17. package/dist/behavior-learner.d.ts +1 -1
  18. package/dist/behavior-signals.d.ts +1 -1
  19. package/dist/bootstrap.d.ts +4 -2
  20. package/dist/briefing.d.ts +1 -1
  21. package/dist/briefing.js +5 -5
  22. package/dist/buffer-surprise-report.d.ts +1 -1
  23. package/dist/buffer.d.ts +1 -1
  24. package/dist/calibration.d.ts +1 -1
  25. package/dist/calibration.js +4 -4
  26. package/dist/{capsule-export-LLEVB2RG.js → capsule-export-7QNCBZOQ.js} +3 -3
  27. package/dist/{capsule-import-UW45R2MZ.js → capsule-import-EPBHD2EN.js} +3 -3
  28. package/dist/causal-behavior.d.ts +1 -1
  29. package/dist/causal-consolidation.d.ts +1 -1
  30. package/dist/causal-consolidation.js +11 -11
  31. package/dist/{chunk-VQXK37XA.js → chunk-23ZZK64Y.js} +1 -1
  32. package/dist/chunk-23ZZK64Y.js.map +1 -0
  33. package/dist/{chunk-HJYHRE4S.js → chunk-242S3I2A.js} +2 -2
  34. package/dist/{chunk-MCC6KDQF.js → chunk-3B6KIRBH.js} +131 -13
  35. package/dist/chunk-3B6KIRBH.js.map +1 -0
  36. package/dist/chunk-4RA3C3EV.js +60 -0
  37. package/dist/chunk-4RA3C3EV.js.map +1 -0
  38. package/dist/{chunk-EYNQTST2.js → chunk-4YM32CRU.js} +4 -4
  39. package/dist/{chunk-6AUUAZEX.js → chunk-5NXIJZFX.js} +38 -8
  40. package/dist/chunk-5NXIJZFX.js.map +1 -0
  41. package/dist/chunk-6NKAQ74D.js +2237 -0
  42. package/dist/chunk-6NKAQ74D.js.map +1 -0
  43. package/dist/{chunk-PHNGXFQ6.js → chunk-7V22HTMD.js} +3 -3
  44. package/dist/{chunk-363MWCD3.js → chunk-7ZM3BFKK.js} +84 -62
  45. package/dist/chunk-7ZM3BFKK.js.map +1 -0
  46. package/dist/chunk-AC5LO7IU.js +308 -0
  47. package/dist/chunk-AC5LO7IU.js.map +1 -0
  48. package/dist/chunk-AH2JUU6X.js +336 -0
  49. package/dist/chunk-AH2JUU6X.js.map +1 -0
  50. package/dist/{chunk-VX2IUQFE.js → chunk-AQJNPMOA.js} +41 -11
  51. package/dist/chunk-AQJNPMOA.js.map +1 -0
  52. package/dist/{chunk-P73JTV34.js → chunk-BBE34QBJ.js} +4 -4
  53. package/dist/{chunk-5GCNE7CN.js → chunk-BZSQEPRW.js} +454 -140
  54. package/dist/chunk-BZSQEPRW.js.map +1 -0
  55. package/dist/chunk-C5BCH4ZS.js +317 -0
  56. package/dist/chunk-C5BCH4ZS.js.map +1 -0
  57. package/dist/{chunk-C5HUWVH2.js → chunk-CPKTBRS2.js} +6 -6
  58. package/dist/{chunk-IBX3VFOM.js → chunk-D4GAOFF6.js} +118 -2
  59. package/dist/chunk-D4GAOFF6.js.map +1 -0
  60. package/dist/chunk-DB5A3NHS.js +906 -0
  61. package/dist/chunk-DB5A3NHS.js.map +1 -0
  62. package/dist/{chunk-I6BQZSML.js → chunk-DZZPC36E.js} +10 -10
  63. package/dist/{chunk-O4XJUPSF.js → chunk-E2UCDP5S.js} +39 -2
  64. package/dist/chunk-E2UCDP5S.js.map +1 -0
  65. package/dist/{chunk-SRBJUAMP.js → chunk-FMEBPEAO.js} +11 -67
  66. package/dist/chunk-FMEBPEAO.js.map +1 -0
  67. package/dist/{chunk-4DXC6HQQ.js → chunk-FQDPCE3I.js} +5 -5
  68. package/dist/{chunk-NN3LPQ5D.js → chunk-HELQZFZO.js} +155 -16
  69. package/dist/chunk-HELQZFZO.js.map +1 -0
  70. package/dist/{chunk-57QNCUEZ.js → chunk-HL5LRPNA.js} +2 -2
  71. package/dist/{chunk-VTU2B4VF.js → chunk-HQZVVSVB.js} +2 -1
  72. package/dist/chunk-HQZVVSVB.js.map +1 -0
  73. package/dist/{chunk-6Z6UH6TK.js → chunk-HY3L4WKC.js} +69 -3
  74. package/dist/chunk-HY3L4WKC.js.map +1 -0
  75. package/dist/{chunk-QIGOEM65.js → chunk-IB3BFHGN.js} +5 -5
  76. package/dist/{chunk-RXTFCYQF.js → chunk-JESOB2HO.js} +6 -6
  77. package/dist/{chunk-2YMTO4ZJ.js → chunk-JKDVIE52.js} +9 -2
  78. package/dist/chunk-JKDVIE52.js.map +1 -0
  79. package/dist/{chunk-WGK4VHGP.js → chunk-MNU6ZBWT.js} +302 -140
  80. package/dist/chunk-MNU6ZBWT.js.map +1 -0
  81. package/dist/chunk-OAZ5MFUB.js +4124 -0
  82. package/dist/chunk-OAZ5MFUB.js.map +1 -0
  83. package/dist/{chunk-ZTSE2ZJ6.js → chunk-OIGNEXKZ.js} +50 -3
  84. package/dist/chunk-OIGNEXKZ.js.map +1 -0
  85. package/dist/chunk-OZKZ2TRP.js +3729 -0
  86. package/dist/chunk-OZKZ2TRP.js.map +1 -0
  87. package/dist/{chunk-GGD5W7TB.js → chunk-PD6O7AXF.js} +7 -2
  88. package/dist/chunk-PD6O7AXF.js.map +1 -0
  89. package/dist/{chunk-S3IP6R6K.js → chunk-PH4C2U43.js} +23 -3
  90. package/dist/chunk-PH4C2U43.js.map +1 -0
  91. package/dist/chunk-PYPOFEMK.js +294 -0
  92. package/dist/chunk-PYPOFEMK.js.map +1 -0
  93. package/dist/{chunk-EQINRHYR.js → chunk-QDZ2RLEC.js} +243 -7
  94. package/dist/chunk-QDZ2RLEC.js.map +1 -0
  95. package/dist/{chunk-KWBPHZUU.js → chunk-RK6F44Y6.js} +3 -2
  96. package/dist/chunk-RK6F44Y6.js.map +1 -0
  97. package/dist/{chunk-36CTNQY7.js → chunk-RVPLBATS.js} +42 -10
  98. package/dist/chunk-RVPLBATS.js.map +1 -0
  99. package/dist/chunk-SOAU2OE2.js +125 -0
  100. package/dist/chunk-SOAU2OE2.js.map +1 -0
  101. package/dist/{chunk-A4ACKWIW.js → chunk-U5JMRGKX.js} +55 -4
  102. package/dist/chunk-U5JMRGKX.js.map +1 -0
  103. package/dist/{chunk-LIO5X3CM.js → chunk-UVMUAWVT.js} +2 -2
  104. package/dist/chunk-VWT3F4IV.js +2161 -0
  105. package/dist/chunk-VWT3F4IV.js.map +1 -0
  106. package/dist/{chunk-PB5KW5PL.js → chunk-WEJG4TB5.js} +6 -6
  107. package/dist/{chunk-KBYWQWSB.js → chunk-X7HPGUVG.js} +2 -2
  108. package/dist/{chunk-Y5KDIOKF.js → chunk-XAMBKFQS.js} +383 -9
  109. package/dist/chunk-XAMBKFQS.js.map +1 -0
  110. package/dist/{chunk-ZL4S7ARC.js → chunk-Y3VMVTYX.js} +3 -3
  111. package/dist/{chunk-Z5S5HNGY.js → chunk-ZG7PTKBK.js} +21 -5
  112. package/dist/chunk-ZG7PTKBK.js.map +1 -0
  113. package/dist/{chunk-6XA7UN4Z.js → chunk-ZNQN6ZTA.js} +2 -2
  114. package/dist/{chunk-WTFWLUSX.js → chunk-ZVTKDVVM.js} +2 -2
  115. package/dist/{cli-BrEwQTnW.d.ts → cli-BR8KpIU0.d.ts} +2 -2
  116. package/dist/cli.d.ts +7 -4
  117. package/dist/cli.js +44 -40
  118. package/dist/codex-cli-fallback.d.ts +1 -0
  119. package/dist/codex-cli-fallback.js +1 -1
  120. package/dist/compression-optimizer.d.ts +1 -1
  121. package/dist/config.d.ts +1 -1
  122. package/dist/config.js +1 -1
  123. package/dist/consolidation-provenance-check.d.ts +1 -1
  124. package/dist/consolidation-undo.d.ts +1 -1
  125. package/dist/{contradiction-scan-3Z6YW7YA.js → contradiction-scan-QTXAMBUA.js} +3 -2
  126. package/dist/contradiction-scan-QTXAMBUA.js.map +1 -0
  127. package/dist/day-summary.d.ts +1 -1
  128. package/dist/delinearize.d.ts +1 -1
  129. package/dist/direct-answer-wiring.d.ts +1 -1
  130. package/dist/direct-answer-wiring.js +1 -1
  131. package/dist/direct-answer.d.ts +1 -1
  132. package/dist/embedding-fallback.d.ts +1 -1
  133. package/dist/{engine-FOC3IJLA.js → engine-35M5BKQ7.js} +7 -7
  134. package/dist/entity-retrieval.d.ts +1 -1
  135. package/dist/entity-retrieval.js +5 -5
  136. package/dist/entity-schema.d.ts +1 -1
  137. package/dist/event-order-recall.d.ts +17 -0
  138. package/dist/event-order-recall.js +11 -0
  139. package/dist/event-order-recall.js.map +1 -0
  140. package/dist/evidence-pack.d.ts +3 -1
  141. package/dist/evidence-pack.js +5 -3
  142. package/dist/explicit-capture.d.ts +4 -2
  143. package/dist/explicit-cue-recall.d.ts +19 -1
  144. package/dist/explicit-cue-recall.js +10 -4
  145. package/dist/extraction-judge-telemetry.d.ts +1 -1
  146. package/dist/extraction-judge-training.d.ts +1 -1
  147. package/dist/extraction-judge.d.ts +1 -1
  148. package/dist/extraction.d.ts +1 -1
  149. package/dist/extraction.js +8 -7
  150. package/dist/fallback-llm.d.ts +2 -1
  151. package/dist/fallback-llm.js +4 -4
  152. package/dist/focused-list-recall.d.ts +17 -0
  153. package/dist/focused-list-recall.js +11 -0
  154. package/dist/focused-list-recall.js.map +1 -0
  155. package/dist/identity-continuity.d.ts +1 -1
  156. package/dist/importance.d.ts +1 -1
  157. package/dist/{index-1qIcnbG1.d.ts → index-DJ9QWMw-.d.ts} +3 -2
  158. package/dist/index.d.ts +49 -12
  159. package/dist/index.js +289 -115
  160. package/dist/index.js.map +1 -1
  161. package/dist/intent.d.ts +1 -1
  162. package/dist/intent.js +1 -1
  163. package/dist/lifecycle.d.ts +1 -1
  164. package/dist/live-connectors-runner.d.ts +1 -1
  165. package/dist/local-llm.d.ts +8 -4
  166. package/dist/local-llm.js +1 -1
  167. package/dist/mcp-memory-inspector-app.d.ts +106 -0
  168. package/dist/mcp-memory-inspector-app.js +20 -0
  169. package/dist/mcp-memory-inspector-app.js.map +1 -0
  170. package/dist/memory-action-policy.d.ts +1 -1
  171. package/dist/memory-cache.d.ts +1 -1
  172. package/dist/{memory-governance-F3QOJGEY.js → memory-governance-IMPQZXFC.js} +7 -7
  173. package/dist/memory-governance-IMPQZXFC.js.map +1 -0
  174. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  175. package/dist/memory-projection-store.d.ts +1 -1
  176. package/dist/memory-provenance.d.ts +57 -0
  177. package/dist/memory-provenance.js +13 -0
  178. package/dist/memory-provenance.js.map +1 -0
  179. package/dist/memory-worth-outcomes.d.ts +1 -1
  180. package/dist/models-json.d.ts +1 -1
  181. package/dist/native-knowledge.d.ts +1 -1
  182. package/dist/objective-state-writers.d.ts +1 -1
  183. package/dist/objective-state-writers.js +2 -2
  184. package/dist/operator-toolkit.d.ts +1 -1
  185. package/dist/operator-toolkit.js +11 -11
  186. package/dist/{orchestrator-6IvQ-Phj.d.ts → orchestrator-DDMPqU6R.d.ts} +10 -1
  187. package/dist/orchestrator.d.ts +4 -2
  188. package/dist/orchestrator.js +53 -46
  189. package/dist/patterns-cli.d.ts +1 -1
  190. package/dist/policy-runtime.d.ts +1 -1
  191. package/dist/qmd-recall-cache.d.ts +1 -1
  192. package/dist/qmd.d.ts +1 -1
  193. package/dist/recall-disclosure-escalation.d.ts +1 -1
  194. package/dist/recall-explain-renderer.d.ts +3 -1
  195. package/dist/recall-explain-renderer.js +5 -3
  196. package/dist/recall-state.d.ts +1 -1
  197. package/dist/recall-tag-filter.d.ts +3 -1
  198. package/dist/recall-xray-cli.d.ts +3 -1
  199. package/dist/recall-xray-cli.js +6 -4
  200. package/dist/recall-xray-renderer.d.ts +3 -1
  201. package/dist/recall-xray-renderer.js +5 -3
  202. package/dist/recall-xray.d.ts +8 -1
  203. package/dist/recall-xray.js +4 -2
  204. package/dist/resolve-auth-token.d.ts +1 -1
  205. package/dist/resolve-provider-secret.js +1 -1
  206. package/dist/response-guidance-recall.d.ts +18 -0
  207. package/dist/response-guidance-recall.js +11 -0
  208. package/dist/response-guidance-recall.js.map +1 -0
  209. package/dist/resume-bundles.js +3 -3
  210. package/dist/retrieval-agents.d.ts +1 -1
  211. package/dist/retrieval-tiers.d.ts +1 -1
  212. package/dist/sdk-compat.d.ts +3 -2
  213. package/dist/sdk-compat.js.map +1 -1
  214. package/dist/semantic-consolidation.d.ts +1 -1
  215. package/dist/semantic-consolidation.js +6 -6
  216. package/dist/semantic-rule-promotion.js +5 -5
  217. package/dist/semantic-rule-verifier.d.ts +1 -1
  218. package/dist/semantic-rule-verifier.js +6 -6
  219. package/dist/session-observer-bands.d.ts +1 -1
  220. package/dist/session-observer-state.d.ts +1 -1
  221. package/dist/signal.d.ts +1 -1
  222. package/dist/storage.d.ts +3 -1
  223. package/dist/storage.js +4 -4
  224. package/dist/summarizer.d.ts +1 -1
  225. package/dist/summarizer.js +6 -6
  226. package/dist/summary-snapshot.d.ts +1 -1
  227. package/dist/targeted-fact-recall.d.ts +17 -0
  228. package/dist/targeted-fact-recall.js +11 -0
  229. package/dist/targeted-fact-recall.js.map +1 -0
  230. package/dist/telemetry-transcript.d.ts +7 -0
  231. package/dist/telemetry-transcript.js +16 -0
  232. package/dist/telemetry-transcript.js.map +1 -0
  233. package/dist/temporal-supersession.d.ts +1 -1
  234. package/dist/temporal-supersession.js +2 -1
  235. package/dist/temporal-validity.d.ts +1 -1
  236. package/dist/threading.d.ts +1 -1
  237. package/dist/tier-migration.d.ts +1 -1
  238. package/dist/tier-routing.d.ts +1 -1
  239. package/dist/tokens.js +1 -1
  240. package/dist/topics.d.ts +1 -1
  241. package/dist/transcript.d.ts +1 -1
  242. package/dist/trust-zones.d.ts +3 -2
  243. package/dist/trust-zones.js +1 -1
  244. package/dist/types.d.ts +60 -2
  245. package/dist/types.js +1 -1
  246. package/dist/user-model.d.ts +37 -0
  247. package/dist/user-model.js +28 -0
  248. package/dist/user-model.js.map +1 -0
  249. package/dist/utility-runtime.d.ts +1 -1
  250. package/dist/verified-recall.js +6 -6
  251. package/package.json +1 -1
  252. package/dist/chunk-2YMTO4ZJ.js.map +0 -1
  253. package/dist/chunk-363MWCD3.js.map +0 -1
  254. package/dist/chunk-36CTNQY7.js.map +0 -1
  255. package/dist/chunk-5GCNE7CN.js.map +0 -1
  256. package/dist/chunk-6AUUAZEX.js.map +0 -1
  257. package/dist/chunk-6Z6UH6TK.js.map +0 -1
  258. package/dist/chunk-74WWN7ZW.js +0 -82
  259. package/dist/chunk-74WWN7ZW.js.map +0 -1
  260. package/dist/chunk-A4ACKWIW.js.map +0 -1
  261. package/dist/chunk-EQINRHYR.js.map +0 -1
  262. package/dist/chunk-ERUDW6DU.js +0 -965
  263. package/dist/chunk-ERUDW6DU.js.map +0 -1
  264. package/dist/chunk-GGD5W7TB.js.map +0 -1
  265. package/dist/chunk-IBX3VFOM.js.map +0 -1
  266. package/dist/chunk-KWBPHZUU.js.map +0 -1
  267. package/dist/chunk-MCC6KDQF.js.map +0 -1
  268. package/dist/chunk-NN3LPQ5D.js.map +0 -1
  269. package/dist/chunk-O4XJUPSF.js.map +0 -1
  270. package/dist/chunk-S3IP6R6K.js.map +0 -1
  271. package/dist/chunk-SRBJUAMP.js.map +0 -1
  272. package/dist/chunk-VQXK37XA.js.map +0 -1
  273. package/dist/chunk-VTU2B4VF.js.map +0 -1
  274. package/dist/chunk-VX2IUQFE.js.map +0 -1
  275. package/dist/chunk-WGK4VHGP.js.map +0 -1
  276. package/dist/chunk-Y5KDIOKF.js.map +0 -1
  277. package/dist/chunk-Z5S5HNGY.js.map +0 -1
  278. package/dist/chunk-ZTSE2ZJ6.js.map +0 -1
  279. package/dist/contradiction-scan-3Z6YW7YA.js.map +0 -1
  280. /package/dist/{capsule-export-LLEVB2RG.js.map → action-confidence.js.map} +0 -0
  281. /package/dist/{capsule-import-UW45R2MZ.js.map → capsule-export-7QNCBZOQ.js.map} +0 -0
  282. /package/dist/{engine-FOC3IJLA.js.map → capsule-import-EPBHD2EN.js.map} +0 -0
  283. /package/dist/{chunk-HJYHRE4S.js.map → chunk-242S3I2A.js.map} +0 -0
  284. /package/dist/{chunk-EYNQTST2.js.map → chunk-4YM32CRU.js.map} +0 -0
  285. /package/dist/{chunk-PHNGXFQ6.js.map → chunk-7V22HTMD.js.map} +0 -0
  286. /package/dist/{chunk-P73JTV34.js.map → chunk-BBE34QBJ.js.map} +0 -0
  287. /package/dist/{chunk-C5HUWVH2.js.map → chunk-CPKTBRS2.js.map} +0 -0
  288. /package/dist/{chunk-I6BQZSML.js.map → chunk-DZZPC36E.js.map} +0 -0
  289. /package/dist/{chunk-4DXC6HQQ.js.map → chunk-FQDPCE3I.js.map} +0 -0
  290. /package/dist/{chunk-57QNCUEZ.js.map → chunk-HL5LRPNA.js.map} +0 -0
  291. /package/dist/{chunk-QIGOEM65.js.map → chunk-IB3BFHGN.js.map} +0 -0
  292. /package/dist/{chunk-RXTFCYQF.js.map → chunk-JESOB2HO.js.map} +0 -0
  293. /package/dist/{chunk-LIO5X3CM.js.map → chunk-UVMUAWVT.js.map} +0 -0
  294. /package/dist/{chunk-PB5KW5PL.js.map → chunk-WEJG4TB5.js.map} +0 -0
  295. /package/dist/{chunk-KBYWQWSB.js.map → chunk-X7HPGUVG.js.map} +0 -0
  296. /package/dist/{chunk-ZL4S7ARC.js.map → chunk-Y3VMVTYX.js.map} +0 -0
  297. /package/dist/{chunk-6XA7UN4Z.js.map → chunk-ZNQN6ZTA.js.map} +0 -0
  298. /package/dist/{chunk-WTFWLUSX.js.map → chunk-ZVTKDVVM.js.map} +0 -0
  299. /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
+ "&": "&amp;",
169
+ "<": "&lt;",
170
+ ">": "&gt;",
171
+ '"': "&quot;",
172
+ "'": "&#39;",
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 \"&\": \"&amp;\",\n \"<\": \"&lt;\",\n \">\": \"&gt;\",\n '\"': \"&quot;\",\n \"'\": \"&#39;\",\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-MCC6KDQF.js";
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-C5HUWVH2.js.map
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-IBX3VFOM.js.map
562
+ //# sourceMappingURL=chunk-D4GAOFF6.js.map