@snoai/memory 0.0.0-stage → 1.0.1
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/LICENSE +176 -0
- package/README.md +33 -2
- package/config/b-profile-section-registry.json +118 -0
- package/config/llm/compiled/2026-05-19T230932Z/manifest.json +25 -0
- package/config/llm/compiled/2026-05-19T230932Z/registry-root.json +67 -0
- package/config/llm/compiled/2026-05-19T230932Z/resolved/mem_claw/openai_gpt_5_nano.json +5 -0
- package/config/llm/compiled/2026-05-19T230932Z/resolved/mem_claw/openrouter_auto.json +5 -0
- package/config/llm/compiled/2026-05-19T230932Z/resolved/mem_claw/sno_ai_extract.json +5 -0
- package/config/llm/compiled/2026-05-19T230932Z/source/mem_claw/openai_gpt_5_nano.mda +24 -0
- package/config/llm/compiled/2026-05-19T230932Z/source/mem_claw/openrouter_auto.mda +24 -0
- package/config/llm/compiled/2026-05-19T230932Z/source/mem_claw/sno_ai_extract.mda +24 -0
- package/config/llm/compiled/2026-07-21T001311Z/manifest.json +43 -0
- package/config/llm/compiled/2026-07-21T001311Z/registry-root.json +97 -0
- package/config/llm/compiled/2026-07-21T001311Z/resolved/mem_claw/openai_gpt_5_nano.json +5 -0
- package/config/llm/compiled/2026-07-21T001311Z/resolved/mem_claw/openrouter_auto.json +5 -0
- package/config/llm/compiled/2026-07-21T001311Z/resolved/mem_claw/sno_ai_extract.json +5 -0
- package/config/llm/compiled/2026-07-21T001311Z/resolved/mem_claw/sno_conflict_verdict.json +10 -0
- package/config/llm/compiled/2026-07-21T001311Z/resolved/mem_claw/sno_extract_chat.json +10 -0
- package/config/llm/compiled/2026-07-21T001311Z/resolved/mem_claw/sno_extract_profile.json +10 -0
- package/config/llm/compiled/2026-07-21T001311Z/source/mem_claw/openai_gpt_5_nano.mda +24 -0
- package/config/llm/compiled/2026-07-21T001311Z/source/mem_claw/openrouter_auto.mda +24 -0
- package/config/llm/compiled/2026-07-21T001311Z/source/mem_claw/sno_ai_extract.mda +24 -0
- package/config/llm/compiled/2026-07-21T001311Z/source/mem_claw/sno_conflict_verdict.mda +27 -0
- package/config/llm/compiled/2026-07-21T001311Z/source/mem_claw/sno_extract_chat.mda +27 -0
- package/config/llm/compiled/2026-07-21T001311Z/source/mem_claw/sno_extract_profile.mda +27 -0
- package/config/llm/compiled/2026-08-29T060335Z/manifest.json +43 -0
- package/config/llm/compiled/2026-08-29T060335Z/registry-root.json +97 -0
- package/config/llm/compiled/2026-08-29T060335Z/resolved/mem_claw/openai_gpt_5_nano.json +5 -0
- package/config/llm/compiled/2026-08-29T060335Z/resolved/mem_claw/openrouter_auto.json +5 -0
- package/config/llm/compiled/2026-08-29T060335Z/resolved/mem_claw/sno_ai_extract.json +5 -0
- package/config/llm/compiled/2026-08-29T060335Z/resolved/mem_claw/sno_conflict_verdict.json +10 -0
- package/config/llm/compiled/2026-08-29T060335Z/resolved/mem_claw/sno_extract_chat.json +10 -0
- package/config/llm/compiled/2026-08-29T060335Z/resolved/mem_claw/sno_extract_profile.json +10 -0
- package/config/llm/compiled/2026-08-29T060335Z/source/mem_claw/openai_gpt_5_nano.mda +24 -0
- package/config/llm/compiled/2026-08-29T060335Z/source/mem_claw/openrouter_auto.mda +24 -0
- package/config/llm/compiled/2026-08-29T060335Z/source/mem_claw/sno_ai_extract.mda +24 -0
- package/config/llm/compiled/2026-08-29T060335Z/source/mem_claw/sno_conflict_verdict.mda +27 -0
- package/config/llm/compiled/2026-08-29T060335Z/source/mem_claw/sno_extract_chat.mda +27 -0
- package/config/llm/compiled/2026-08-29T060335Z/source/mem_claw/sno_extract_profile.mda +27 -0
- package/config/llm/compiled/2026-09-04T004828Z/manifest.json +43 -0
- package/config/llm/compiled/2026-09-04T004828Z/registry-root.json +97 -0
- package/config/llm/compiled/2026-09-04T004828Z/resolved/mem_claw/openai_gpt_5_nano.json +5 -0
- package/config/llm/compiled/2026-09-04T004828Z/resolved/mem_claw/openrouter_auto.json +5 -0
- package/config/llm/compiled/2026-09-04T004828Z/resolved/mem_claw/sno_ai_extract.json +5 -0
- package/config/llm/compiled/2026-09-04T004828Z/resolved/mem_claw/sno_conflict_verdict.json +10 -0
- package/config/llm/compiled/2026-09-04T004828Z/resolved/mem_claw/sno_extract_chat.json +10 -0
- package/config/llm/compiled/2026-09-04T004828Z/resolved/mem_claw/sno_extract_profile.json +10 -0
- package/config/llm/compiled/2026-09-04T004828Z/source/mem_claw/openai_gpt_5_nano.mda +24 -0
- package/config/llm/compiled/2026-09-04T004828Z/source/mem_claw/openrouter_auto.mda +24 -0
- package/config/llm/compiled/2026-09-04T004828Z/source/mem_claw/sno_ai_extract.mda +24 -0
- package/config/llm/compiled/2026-09-04T004828Z/source/mem_claw/sno_conflict_verdict.mda +27 -0
- package/config/llm/compiled/2026-09-04T004828Z/source/mem_claw/sno_extract_chat.mda +27 -0
- package/config/llm/compiled/2026-09-04T004828Z/source/mem_claw/sno_extract_profile.mda +27 -0
- package/config/llm/current.json +4 -0
- package/config/llm/source/mem_claw/openai_gpt_5_nano.mda +24 -0
- package/config/llm/source/mem_claw/openrouter_auto.mda +24 -0
- package/config/llm/source/mem_claw/sno_ai_extract.mda +24 -0
- package/config/llm/source/mem_claw/sno_conflict_verdict.mda +27 -0
- package/config/llm/source/mem_claw/sno_extract_chat.mda +27 -0
- package/config/llm/source/mem_claw/sno_extract_profile.mda +27 -0
- package/config/llm.trust.json +37 -0
- package/dist/_types-CUKHSRkS.d.ts +103 -0
- package/dist/access-tracker-BbEvEocb.d.ts +110 -0
- package/dist/adapter-B7Jox9-6.d.ts +69 -0
- package/dist/adapter-XaRHZWZ2.js +333 -0
- package/dist/agent-llm-port-5oXgBpzJ.d.ts +53 -0
- package/dist/all-resources-BQK2ugjB.js +6379 -0
- package/dist/all-resources-Dij6l5h0.d.ts +18 -0
- package/dist/ambient-learning-text-normalizer-CxjATmMp.js +170 -0
- package/dist/ambient-learning-text-normalizer-_fH3LeuK.d.ts +10 -0
- package/dist/atomic-extraction-reply-BJ9XV_9s.js +863 -0
- package/dist/atomic-extraction-skill-CcXmuCqL.js +56 -0
- package/dist/atomic-memory-extraction-C5rmogoY.js +3605 -0
- package/dist/atomic-memory-extraction-d9EG-4ti.d.ts +327 -0
- package/dist/b-profile-section-dictionary-provider-BHkoNqgk.js +1812 -0
- package/dist/b-profile-section-dictionary-provider-BxbksLj3.d.ts +62 -0
- package/dist/best-effort-BPZSzKk0.d.ts +9 -0
- package/dist/calendar-instruction-CzqZbAPG.js +194 -0
- package/dist/capture-policy-detector-CxbHPkMX.d.ts +53 -0
- package/dist/capture-policy-detector-DaMfy9CZ.js +357 -0
- package/dist/classifier-DnbbtwTS.d.ts +272 -0
- package/dist/client.d.ts +34 -0
- package/dist/client.js +306 -0
- package/dist/coding-skin.d.ts +51 -0
- package/dist/coding-skin.js +55 -0
- package/dist/config-CL90qYva.js +2576 -0
- package/dist/connection-3IVXpuPE.d.ts +391 -0
- package/dist/connection-C9YD5sgm.js +297 -0
- package/dist/daily-log-generator-CH_KuWHs.js +469 -0
- package/dist/daily-log-generator-CsQPHl4A.d.ts +73 -0
- package/dist/daily-spend-estimator-DiwzBlo1.d.ts +8 -0
- package/dist/data-bootstrap-Bl3lthzE.d.ts +30 -0
- package/dist/data-bootstrap-P8sie9WA.js +172 -0
- package/dist/data-paths-C7sNdqvP.d.ts +22 -0
- package/dist/derived-suppression-cache-CI0durYx.d.ts +36 -0
- package/dist/diagnostic-encoder.d.ts +6 -0
- package/dist/diagnostic-encoder.js +29 -0
- package/dist/embedding-provider-client-Q_hJonK9.js +294 -0
- package/dist/embedding-provider-client-vynZMuit.d.ts +94 -0
- package/dist/entry-metadata-parser-BIVSMCIk.js +20 -0
- package/dist/error-D-wb-rZw.js +23 -0
- package/dist/error-signals-D8_3vYu4.d.ts +28 -0
- package/dist/error-signals-lMH2uAdV.js +134 -0
- package/dist/errors-CeVRxf9V.d.ts +49 -0
- package/dist/extraction-text-sanitizer-B_AhIecT.d.ts +32 -0
- package/dist/i18n-text-DbD6Qify.d.ts +13 -0
- package/dist/index-0aqS8pVF.d.ts +351 -0
- package/dist/index-BO4RU_mc.d.ts +650 -0
- package/dist/index-DL8AVj0Z.d.ts +571 -0
- package/dist/index.d.ts +65 -0
- package/dist/index.js +1201 -0
- package/dist/intent-analyzer-B5XVrWwe.d.ts +28 -0
- package/dist/internal/config/index.d.ts +2 -0
- package/dist/internal/config/index.js +581 -0
- package/dist/internal/config/plugin-config-schema.d.ts +2 -0
- package/dist/internal/config/plugin-config-schema.js +2 -0
- package/dist/internal/config/product-mode.d.ts +2 -0
- package/dist/internal/config/product-mode.js +36 -0
- package/dist/internal/config/settings.d.ts +2 -0
- package/dist/internal/config/settings.js +265 -0
- package/dist/internal/config/skill-categories.d.ts +4 -0
- package/dist/internal/config/skill-categories.js +68 -0
- package/dist/internal/config/skin-defaults.d.ts +6 -0
- package/dist/internal/config/skin-defaults.js +6 -0
- package/dist/internal/contract/discovery.d.ts +10 -0
- package/dist/internal/contract/discovery.js +53 -0
- package/dist/internal/contract/profile.d.ts +2 -0
- package/dist/internal/contract/profile.js +44 -0
- package/dist/internal/contract/routes.d.ts +2 -0
- package/dist/internal/contract/routes.js +62 -0
- package/dist/internal/engine/bindings/memory-cli-shared.d.ts +47 -0
- package/dist/internal/engine/bindings/memory-cli-shared.js +84 -0
- package/dist/internal/engine/bindings/memory-forget-tool.d.ts +5 -0
- package/dist/internal/engine/bindings/memory-forget-tool.js +66 -0
- package/dist/internal/engine/bindings/memory-list-tool.d.ts +5 -0
- package/dist/internal/engine/bindings/memory-list-tool.js +57 -0
- package/dist/internal/engine/bindings/memory-recall-tool.d.ts +10 -0
- package/dist/internal/engine/bindings/memory-recall-tool.js +283 -0
- package/dist/internal/engine/bindings/memory-reflection-resolve-tool.d.ts +5 -0
- package/dist/internal/engine/bindings/memory-reflection-resolve-tool.js +150 -0
- package/dist/internal/engine/bindings/memory-stats-tool.d.ts +5 -0
- package/dist/internal/engine/bindings/memory-stats-tool.js +43 -0
- package/dist/internal/engine/bindings/memory-store-tool.d.ts +5 -0
- package/dist/internal/engine/bindings/memory-store-tool.js +165 -0
- package/dist/internal/engine/bindings/memory-tool-access.d.ts +16 -0
- package/dist/internal/engine/bindings/memory-tool-access.js +46 -0
- package/dist/internal/engine/bindings/memory-tool-formatting.d.ts +62 -0
- package/dist/internal/engine/bindings/memory-tool-formatting.js +106 -0
- package/dist/internal/engine/bindings/memory-tool-results.d.ts +8 -0
- package/dist/internal/engine/bindings/memory-tool-results.js +41 -0
- package/dist/internal/engine/bindings/memory-tool-schemas.d.ts +109 -0
- package/dist/internal/engine/bindings/memory-tool-schemas.js +75 -0
- package/dist/internal/engine/bindings/memory-update-tool.d.ts +5 -0
- package/dist/internal/engine/bindings/memory-update-tool.js +127 -0
- package/dist/internal/engine/bindings/sno-station-mem-ambient-learning-hook.d.ts +14 -0
- package/dist/internal/engine/bindings/sno-station-mem-ambient-learning-hook.js +248 -0
- package/dist/internal/engine/bindings/sno-station-mem-auto-recall-hook.d.ts +12 -0
- package/dist/internal/engine/bindings/sno-station-mem-auto-recall-hook.js +324 -0
- package/dist/internal/engine/bindings/sno-station-mem-hook-types.d.ts +56 -0
- package/dist/internal/engine/bindings/sno-station-mem-hook-types.js +1 -0
- package/dist/internal/engine/bindings/sno-station-mem-insight-distill-factory.d.ts +14 -0
- package/dist/internal/engine/bindings/sno-station-mem-insight-distill-factory.js +119 -0
- package/dist/internal/engine/bindings/sno-station-mem-message-transcript.d.ts +52 -0
- package/dist/internal/engine/bindings/sno-station-mem-message-transcript.js +145 -0
- package/dist/internal/engine/bindings/sno-station-mem-reset-hook.d.ts +10 -0
- package/dist/internal/engine/bindings/sno-station-mem-reset-hook.js +9 -0
- package/dist/internal/engine/bindings/sno-station-mem-runtime-mode.d.ts +36 -0
- package/dist/internal/engine/bindings/sno-station-mem-runtime-mode.js +104 -0
- package/dist/internal/engine/bindings/sno-station-mem-session-state.d.ts +10 -0
- package/dist/internal/engine/bindings/sno-station-mem-session-state.js +27 -0
- package/dist/internal/engine/eval/trace.d.ts +2 -0
- package/dist/internal/engine/eval/trace.js +151 -0
- package/dist/internal/engine/extraction/ambient-learning-text-normalizer.d.ts +2 -0
- package/dist/internal/engine/extraction/ambient-learning-text-normalizer.js +2 -0
- package/dist/internal/engine/extraction/atomic-memory-extraction.d.ts +2 -0
- package/dist/internal/engine/extraction/atomic-memory-extraction.js +2 -0
- package/dist/internal/engine/extraction/b-profile-section-dictionary-provider.d.ts +2 -0
- package/dist/internal/engine/extraction/b-profile-section-dictionary-provider.js +2 -0
- package/dist/internal/engine/extraction/b-profile-section-rekey.d.ts +49 -0
- package/dist/internal/engine/extraction/b-profile-section-rekey.js +730 -0
- package/dist/internal/engine/extraction/capture-policy-detector.d.ts +2 -0
- package/dist/internal/engine/extraction/capture-policy-detector.js +2 -0
- package/dist/internal/engine/extraction/embedding-provider-client.d.ts +2 -0
- package/dist/internal/engine/extraction/embedding-provider-client.js +2 -0
- package/dist/internal/engine/extraction/extraction-text-sanitizer.d.ts +2 -0
- package/dist/internal/engine/extraction/extraction-text-sanitizer.js +114 -0
- package/dist/internal/engine/extraction/memory-metadata-codec.d.ts +3 -0
- package/dist/internal/engine/extraction/memory-metadata-codec.js +2 -0
- package/dist/internal/engine/extraction/memory-temporality-classifier.d.ts +2 -0
- package/dist/internal/engine/extraction/memory-temporality-classifier.js +2 -0
- package/dist/internal/engine/i18n/all-resources.d.ts +2 -0
- package/dist/internal/engine/i18n/all-resources.js +2 -0
- package/dist/internal/engine/i18n/locales.d.ts +2 -0
- package/dist/internal/engine/i18n/locales.js +19 -0
- package/dist/internal/engine/i18n/res/_types.d.ts +2 -0
- package/dist/internal/engine/i18n/res/_types.js +11 -0
- package/dist/internal/engine/observability/adapter.d.ts +2 -0
- package/dist/internal/engine/observability/adapter.js +2 -0
- package/dist/internal/engine/observability/best-effort.d.ts +2 -0
- package/dist/internal/engine/observability/best-effort.js +41 -0
- package/dist/internal/engine/observability/early-diagnostics.js +2 -0
- package/dist/internal/engine/observability/memory-snapshot.d.ts +2 -0
- package/dist/internal/engine/observability/memory-snapshot.js +44 -0
- package/dist/internal/engine/observability/observable-embedder.d.ts +2 -0
- package/dist/internal/engine/observability/observable-embedder.js +43 -0
- package/dist/internal/engine/observability/observable-llm-client.d.ts +2 -0
- package/dist/internal/engine/observability/observable-llm-client.js +98 -0
- package/dist/internal/engine/observability/observable-memory-store.d.ts +2 -0
- package/dist/internal/engine/observability/observable-memory-store.js +701 -0
- package/dist/internal/engine/observability/observable-retriever.d.ts +2 -0
- package/dist/internal/engine/observability/observable-retriever.js +95 -0
- package/dist/internal/engine/observability/runtime-diagnostics.d.ts +13 -0
- package/dist/internal/engine/observability/runtime-diagnostics.js +96 -0
- package/dist/internal/engine/observability/session-registry.d.ts +2 -0
- package/dist/internal/engine/observability/session-registry.js +58 -0
- package/dist/internal/engine/observability/version-metadata.d.ts +7 -0
- package/dist/internal/engine/observability/version-metadata.js +59 -0
- package/dist/internal/engine/operations/daily-spend-estimator.d.ts +2 -0
- package/dist/internal/engine/operations/daily-spend-estimator.js +97 -0
- package/dist/internal/engine/operations/learning-file-maintenance.d.ts +2 -0
- package/dist/internal/engine/operations/learning-file-maintenance.js +255 -0
- package/dist/internal/engine/operations/memory-tier-promoter.d.ts +2 -0
- package/dist/internal/engine/operations/memory-tier-promoter.js +95 -0
- package/dist/internal/engine/operations/runtime-audit-log.d.ts +3 -0
- package/dist/internal/engine/operations/runtime-audit-log.js +3 -0
- package/dist/internal/engine/provider/canonical-memory-corpus.d.ts +38 -0
- package/dist/internal/engine/provider/canonical-memory-corpus.js +253 -0
- package/dist/internal/engine/provider/provider-registration.d.ts +39 -0
- package/dist/internal/engine/provider/provider-registration.js +2 -0
- package/dist/internal/engine/provider/provider-row-renderer.d.ts +7 -0
- package/dist/internal/engine/provider/provider-row-renderer.js +53 -0
- package/dist/internal/engine/provider/provider-types.d.ts +2 -0
- package/dist/internal/engine/provider/provider-types.js +1 -0
- package/dist/internal/engine/reflection/daily-log-generator.d.ts +2 -0
- package/dist/internal/engine/reflection/daily-log-generator.js +2 -0
- package/dist/internal/engine/reflection/reflection-command-hooks.d.ts +2 -0
- package/dist/internal/engine/reflection/reflection-command-hooks.js +2 -0
- package/dist/internal/engine/reflection/reflection-deps.d.ts +2 -0
- package/dist/internal/engine/reflection/reflection-deps.js +1 -0
- package/dist/internal/engine/reflection/reflection-embedded-generator.d.ts +2 -0
- package/dist/internal/engine/reflection/reflection-embedded-generator.js +2 -0
- package/dist/internal/engine/reflection/reflection-injection-hooks.d.ts +2 -0
- package/dist/internal/engine/reflection/reflection-injection-hooks.js +219 -0
- package/dist/internal/engine/reflection/reflection-lifecycle-hooks.d.ts +2 -0
- package/dist/internal/engine/reflection/reflection-lifecycle-hooks.js +63 -0
- package/dist/internal/engine/reflection/strategy-hook-runner.d.ts +4 -0
- package/dist/internal/engine/reflection/strategy-hook-runner.js +3 -0
- package/dist/internal/engine/rem/classifier.d.ts +2 -0
- package/dist/internal/engine/rem/classifier.js +180 -0
- package/dist/internal/engine/rem/index.d.ts +4 -0
- package/dist/internal/engine/rem/index.js +2551 -0
- package/dist/internal/engine/rem/types.d.ts +2 -0
- package/dist/internal/engine/rem/types.js +40 -0
- package/dist/internal/engine/retrieval/access-tracker.d.ts +2 -0
- package/dist/internal/engine/retrieval/access-tracker.js +314 -0
- package/dist/internal/engine/retrieval/intent-analyzer.d.ts +2 -0
- package/dist/internal/engine/retrieval/intent-analyzer.js +27 -0
- package/dist/internal/engine/retrieval/retrieval-gate.d.ts +2 -0
- package/dist/internal/engine/retrieval/retrieval-gate.js +47 -0
- package/dist/internal/engine/retrieval/retriever.d.ts +2 -0
- package/dist/internal/engine/retrieval/retriever.js +2 -0
- package/dist/internal/engine/security/memory-scope-policy.d.ts +2 -0
- package/dist/internal/engine/security/memory-scope-policy.js +2 -0
- package/dist/internal/engine/security/redact.d.ts +2 -0
- package/dist/internal/engine/security/redact.js +34 -0
- package/dist/internal/engine/security/scopes.d.ts +3 -0
- package/dist/internal/engine/security/scopes.js +3 -0
- package/dist/internal/engine/shared/errors.d.ts +2 -0
- package/dist/internal/engine/shared/errors.js +66 -0
- package/dist/internal/engine/shared/i18n-text.d.ts +2 -0
- package/dist/internal/engine/shared/i18n-text.js +58 -0
- package/dist/internal/engine/shared/iso-date-time.d.ts +16 -0
- package/dist/internal/engine/shared/iso-date-time.js +40 -0
- package/dist/internal/engine/shared/lru.d.ts +2 -0
- package/dist/internal/engine/shared/lru.js +30 -0
- package/dist/internal/engine/shared/memory-kind-policy.d.ts +2 -0
- package/dist/internal/engine/shared/memory-kind-policy.js +64 -0
- package/dist/internal/engine/shared/paths.d.ts +3 -0
- package/dist/internal/engine/shared/paths.js +2 -0
- package/dist/internal/engine/shared/types.d.ts +3 -0
- package/dist/internal/engine/shared/types.js +25 -0
- package/dist/internal/engine/shared/utils.d.ts +2 -0
- package/dist/internal/engine/shared/utils.js +175 -0
- package/dist/internal/engine/telemetry/memory-telemetry-api.d.ts +134 -0
- package/dist/internal/engine/telemetry/memory-telemetry-api.js +730 -0
- package/dist/internal/engine/telemetry/memory-telemetry-observability.d.ts +24 -0
- package/dist/internal/engine/telemetry/memory-telemetry-observability.js +133 -0
- package/dist/internal/engine/telemetry/memory-telemetry-outbox.d.ts +2 -0
- package/dist/internal/engine/telemetry/memory-telemetry-outbox.js +443 -0
- package/dist/internal/engine/telemetry/memory-telemetry-types.d.ts +2 -0
- package/dist/internal/engine/telemetry/memory-telemetry-types.js +21 -0
- package/dist/internal/engine/telemetry/observe-ledger.d.ts +30 -0
- package/dist/internal/engine/telemetry/observe-ledger.js +111 -0
- package/dist/internal/model/agent-llm-port.d.ts +2 -0
- package/dist/internal/model/agent-llm-port.js +1 -0
- package/dist/internal/model/llm-client.d.ts +3 -0
- package/dist/internal/model/llm-client.js +3 -0
- package/dist/internal/model/llm-failure.d.ts +26 -0
- package/dist/internal/model/llm-failure.js +63 -0
- package/dist/internal/model/llm-mode-routing.d.ts +22 -0
- package/dist/internal/model/llm-mode-routing.js +37 -0
- package/dist/internal/store/atomic-memory-cutover-sql.d.ts +13 -0
- package/dist/internal/store/atomic-memory-cutover-sql.js +237 -0
- package/dist/internal/store/connection.d.ts +2 -0
- package/dist/internal/store/connection.js +2 -0
- package/dist/internal/store/data-bootstrap.d.ts +2 -0
- package/dist/internal/store/data-bootstrap.js +2 -0
- package/dist/internal/store/data-paths.d.ts +2 -0
- package/dist/internal/store/data-paths.js +65 -0
- package/dist/internal/store/maintenance.d.ts +75 -0
- package/dist/internal/store/maintenance.js +1401 -0
- package/dist/internal/store/memory-kinds-cutover-migrator.d.ts +28 -0
- package/dist/internal/store/memory-kinds-cutover-migrator.js +415 -0
- package/dist/internal/store/migrations.d.ts +27 -0
- package/dist/internal/store/migrations.js +201 -0
- package/dist/internal/store/sqlite-runtime.d.ts +2 -0
- package/dist/internal/store/sqlite-runtime.js +109 -0
- package/dist/internal/store/store.d.ts +3 -0
- package/dist/internal/store/store.js +2 -0
- package/dist/learning-file-maintenance-9b-Ut6Kv.d.ts +30 -0
- package/dist/llm-client-BSYUAcUb.js +1374 -0
- package/dist/llm-client-DOTSGzhe.d.ts +51 -0
- package/dist/locales-JxGmkG6t.d.ts +7 -0
- package/dist/log-site-catalog.generated-BMKWj-Nx.js +2321 -0
- package/dist/log-site-catalog.json +1 -0
- package/dist/lru-DyoaTyIs.d.ts +14 -0
- package/dist/memdump.d.ts +52 -0
- package/dist/memdump.js +163 -0
- package/dist/memory-entry-projector-DHo8jH10.js +1015 -0
- package/dist/memory-kind-policy-BiuRjSJc.d.ts +23 -0
- package/dist/memory-metadata-codec-DL1sbJiN.js +577 -0
- package/dist/memory-metadata-codec-DUvsYe_X.d.ts +68 -0
- package/dist/memory-runtime-DqUS4cWi.js +19459 -0
- package/dist/memory-scope-policy-1gg5QlWZ.d.ts +67 -0
- package/dist/memory-scope-policy-DICSCURA.js +283 -0
- package/dist/memory-snapshot-CqY1BUUA.d.ts +16 -0
- package/dist/memory-source-order-YMRoeDLd.js +134 -0
- package/dist/memory-store-base-CQ_bHlYA.d.ts +1094 -0
- package/dist/memory-store-shared-DqpWJXZZ.js +158 -0
- package/dist/memory-store-write-validation-B_hDG2zf.js +243 -0
- package/dist/memory-telemetry-incidents-BWA9kcZx.js +8 -0
- package/dist/memory-telemetry-metadata-CA7W8tK6.js +77 -0
- package/dist/memory-telemetry-outbox-ddTdImt7.d.ts +74 -0
- package/dist/memory-telemetry-receipts-MAJecvXQ.d.ts +34 -0
- package/dist/memory-telemetry-receipts-YsxbwOAf.js +91 -0
- package/dist/memory-telemetry-types-CufVmrCs.d.ts +14 -0
- package/dist/memory-temporality-classifier-BUjXG5o7.js +184 -0
- package/dist/memory-temporality-classifier-Brht5jyK.d.ts +43 -0
- package/dist/memory-tier-promoter-CqGxCkue.d.ts +43 -0
- package/dist/memory-tool-dependencies-CatGzI9R.d.ts +14 -0
- package/dist/memory-tool-dependencies-DjUoelnm.js +19 -0
- package/dist/model-call-table-CspopkBg.js +563 -0
- package/dist/model-reply-text-CKopStP2.js +334 -0
- package/dist/observable-embedder-CNNe9gkg.d.ts +17 -0
- package/dist/observable-llm-client-CRuKlefQ.d.ts +21 -0
- package/dist/observable-memory-store-CnGDpOY5.d.ts +73 -0
- package/dist/observable-retriever-Cooc62Qw.d.ts +23 -0
- package/dist/operation-cancellation-CTKWwNHk.js +81 -0
- package/dist/paths-qVF-5uBq.d.ts +1 -0
- package/dist/plugin-config-schema-C0UUbOmG.d.ts +413 -0
- package/dist/plugin-config-schema-YJLyIIcJ.js +361 -0
- package/dist/profile-TWPJ_myr.d.ts +13 -0
- package/dist/profile-section-writer-BhGKPBjw.js +2149 -0
- package/dist/provider-registration-CF1tg8Xy.js +721 -0
- package/dist/provider-runtime-types-DFhtdA6d.d.ts +134 -0
- package/dist/provider-types-CZGm6v88.d.ts +23 -0
- package/dist/redact-BTIZcHQL.d.ts +5 -0
- package/dist/reflection-command-hooks-ClUl-iv6.js +644 -0
- package/dist/reflection-command-hooks-G1-dI2Av.d.ts +32 -0
- package/dist/reflection-deps-Ccm2Jf5W.d.ts +19 -0
- package/dist/reflection-embedded-generator-BRvqV5N-.js +130 -0
- package/dist/reflection-embedded-generator-kfQfKEYV.d.ts +14 -0
- package/dist/reflection-injection-hooks-CS_uhjoD.d.ts +43 -0
- package/dist/reflection-lifecycle-hooks-CRSpUdLi.d.ts +27 -0
- package/dist/relation-dictionary-Cev1kyLe.js +4248 -0
- package/dist/release-download.d.ts +8 -0
- package/dist/release-download.js +32 -0
- package/dist/relevant-memories-context-m8nuFZcM.js +23 -0
- package/dist/rem-batch-executor-Dg2HgROM.js +2 -0
- package/dist/rem-batch-executor-DuC4nYyf.js +31640 -0
- package/dist/rem-consumer-retrieval-CR0dtcHR.js +246 -0
- package/dist/rem-trigger-Hn6od8IV.js +730 -0
- package/dist/resolver-Dy-hnjCR.js +103 -0
- package/dist/results-C3ZLroMb.js +140 -0
- package/dist/retrieval-gate-Bx2Zg7jD.d.ts +31 -0
- package/dist/retriever-Dxss5fRv.d.ts +469 -0
- package/dist/retriever-ZoLvPRHq.js +1757 -0
- package/dist/rolldown-runtime-D7D4PA-g.js +13 -0
- package/dist/routes-DLHT__Ay.js +60 -0
- package/dist/runtime-audit-log-BCeujlEp.js +430 -0
- package/dist/runtime-audit-log-zpQiR9HT.d.ts +149 -0
- package/dist/scopes-CSOn6zdd.js +71 -0
- package/dist/scopes-CtrY-YQ3.d.ts +23 -0
- package/dist/server-CSvxchqg.js +1412 -0
- package/dist/session-registry-DBoE7AvZ.d.ts +14 -0
- package/dist/sidecar/main.d.ts +1 -0
- package/dist/sidecar/main.js +56 -0
- package/dist/signed-registry-constants-Bv0fgZ8Q.d.ts +12 -0
- package/dist/signed-registry-constants-yq3DlG3B.js +82 -0
- package/dist/sno-station-mem-runtime-dependencies-CoWqUMbK.js +30 -0
- package/dist/sno-station-mem-runtime-dependencies-DHESIuPn.d.ts +31 -0
- package/dist/sqlite-runtime-L_ywirTm.d.ts +58 -0
- package/dist/store-C8sUTssE.d.ts +27 -0
- package/dist/store-nPql26YM.js +5830 -0
- package/dist/strategy-hook-runner-Bxy851Xx.d.ts +16 -0
- package/dist/strategy-hook-runner-Djify5Rw.js +110 -0
- package/dist/token-counter-BD1f48Km.js +73 -0
- package/dist/trace-C1JxMfs-.d.ts +86 -0
- package/dist/types-CWdhXLxr.d.ts +477 -0
- package/dist/types-pVomjzqR.d.ts +132 -0
- package/dist/unplaced-candidate-migration-CbQHzcEM.js +940 -0
- package/dist/utils-Ctb9aevJ.d.ts +34 -0
- package/drizzle/0000_initial.sql +10 -0
- package/drizzle/0001_virtual_tables.sql +34 -0
- package/drizzle/0002_add_indexes.sql +11 -0
- package/drizzle/0003_content_hash_lookup_index.sql +2 -0
- package/drizzle/0004_chunk_swap.sql +60 -0
- package/drizzle/0005_drop_legacy_vec_fts.sql +10 -0
- package/drizzle/0006_fts_simple.sql +45 -0
- package/drizzle/0007_restore_simple_fts.sql +40 -0
- package/drizzle/0008_widen_memory_hash_unique_index.sql +4 -0
- package/drizzle/0009_memory_telemetry.sql +109 -0
- package/drizzle/0010_provider_mappings.sql +27 -0
- package/drizzle/0011_db_optimization.sql +82 -0
- package/drizzle/0012_b_profile_lanes.sql +9 -0
- package/drizzle/0013_extraction_timestamps.sql +6 -0
- package/drizzle/0014_extraction_timestamp_source.sql +3 -0
- package/drizzle/0015_task_lifecycle_state.sql +101 -0
- package/drizzle/0016_task_lifecycle_legacy_migration.sql +144 -0
- package/drizzle/0017_unplaced_candidates.sql +15 -0
- package/drizzle/0018_rem_batch_chassis.sql +71 -0
- package/drizzle/0019_profile_recovery_entries.sql +17 -0
- package/drizzle/0020_rem_scan_retry_progress.down.sql +14 -0
- package/drizzle/0020_rem_scan_retry_progress.sql +24 -0
- package/drizzle/0021_rem_two_facet_storage.down.sql +14 -0
- package/drizzle/0021_rem_two_facet_storage.sql +42 -0
- package/drizzle/0022_rem_facet_chunk_versions.down.sql +4 -0
- package/drizzle/0022_rem_facet_chunk_versions.sql +4 -0
- package/drizzle/0023_rem_defect_ledger.sql +40 -0
- package/drizzle/0024_rem_unbuilt_foundations.down.sql +13 -0
- package/drizzle/0024_rem_unbuilt_foundations.sql +65 -0
- package/drizzle/0025_rem_journal_operation_constraint.sql +28 -0
- package/drizzle/0026_rem_journal_detail.sql +1 -0
- package/drizzle/0027_legacy_nodix_namespace.sql +3 -0
- package/drizzle/0028_memory_timezone.sql +23 -0
- package/drizzle/0029_rem_write_hash_symmetry.sql +17 -0
- package/drizzle/0030_atomic_memory_additive.sql +105 -0
- package/drizzle/0031_atomic_extraction_ledger.sql +23 -0
- package/drizzle/0032_atomic_memory_entities.sql +12 -0
- package/drizzle/0033_todo_own_store.sql +99 -0
- package/drizzle/meta/0000_snapshot.json +87 -0
- package/drizzle/meta/_journal.json +244 -0
- package/generated/rem-operations.json +1 -0
- package/package.json +126 -4
- package/scripts/download-simple-tokenizer.mjs +254 -0
- package/settings.default.json +243 -0
- package/skills/extract-atomic-memory/SKILL.md +298 -0
- package/skills/extract-atomic-memory/references/account-for-turns.md +9 -0
- package/skills/extract-atomic-memory/references/calendar-meaning.md +64 -0
- package/skills/extract-atomic-memory/references/capture.md +120 -0
- package/skills/extract-atomic-memory/references/enrichment.md +92 -0
- package/skills/extract-atomic-memory/references/missing-durable-half.md +6 -0
- package/skills/extract-atomic-memory/references/progress-classification.md +21 -0
- package/skills/extract-atomic-memory/references/resolve-subject.md +19 -0
- package/skills/extract-atomic-memory/references/surrounding-context.md +10 -0
- package/skills/extract-atomic-memory/references/user-subject-guard.md +29 -0
- package/skills/judge-group-closure/SKILL.md +25 -0
- package/skills/judge-rem-memory-updates/SKILL.md +56 -0
- package/skills/judge-rem-memory-updates/agents/openai.yaml +4 -0
- package/skills/judge-retired-position/SKILL.md +25 -0
- package/skills/judge-task-lifecycle/SKILL.md +45 -0
- package/skills/key-state-attribute/SKILL.md +16 -0
- package/skills/resolve-entity-identity/SKILL.md +24 -0
- package/skills/resolve-relative-time/SKILL.md +22 -0
- package/sqlite-extensions/LICENSE-simple-tokenizer +28 -0
- package/sqlite-extensions/LICENSE-sqlite-vec +21 -0
- package/sqlite-extensions/linux-arm64/vec0.so +0 -0
- package/sqlite-extensions/linux-x64/vec0.so +0 -0
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { clampInt } from "../shared/utils.js";
|
|
2
|
+
import "../../../memory-tool-dependencies-DjUoelnm.js";
|
|
3
|
+
import { assertAccessibleScopeForTool, isScopeAccessibleForTool, resolveReadableScopesForTool } from "./memory-tool-access.js";
|
|
4
|
+
import { makeResult, runWithAudit } from "./memory-tool-results.js";
|
|
5
|
+
import { t as parseReflectionMetadata } from "../../../entry-metadata-parser-BIVSMCIk.js";
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
//#region src/engine/bindings/memory-reflection-resolve-tool.ts
|
|
8
|
+
/** @file memory-reflection-resolve-tool.ts
|
|
9
|
+
* @purpose Registers the memory_reflection_resolve tool.
|
|
10
|
+
* @boundary Marks reflection items resolved so they stop participating in reflection recall.
|
|
11
|
+
*/
|
|
12
|
+
const REFLECTION_ITEM_TYPE = "memory-reflection-item";
|
|
13
|
+
/** Bounded scan ceiling for query-mode candidate discovery. */
|
|
14
|
+
const REFLECTION_SCAN_LIMIT = 240;
|
|
15
|
+
const resolveParamsSchema = z.object({
|
|
16
|
+
memoryId: z.string().trim().min(1).optional(),
|
|
17
|
+
query: z.string().trim().min(1).optional(),
|
|
18
|
+
scope: z.string().optional(),
|
|
19
|
+
dryRun: z.boolean().optional(),
|
|
20
|
+
note: z.string().optional(),
|
|
21
|
+
limit: z.number().int().optional()
|
|
22
|
+
});
|
|
23
|
+
function isUnresolvedReflectionItem(entry) {
|
|
24
|
+
const metadata = parseReflectionMetadata(entry.metadata);
|
|
25
|
+
return metadata.type === REFLECTION_ITEM_TYPE && metadata.resolvedAt === void 0;
|
|
26
|
+
}
|
|
27
|
+
function describeCandidate(entry) {
|
|
28
|
+
const metadata = parseReflectionMetadata(entry.metadata);
|
|
29
|
+
return {
|
|
30
|
+
id: entry.id,
|
|
31
|
+
itemKind: typeof metadata.itemKind === "string" ? metadata.itemKind : "item",
|
|
32
|
+
scope: entry.projectId,
|
|
33
|
+
text: entry.text.replace(/\s+/g, " ").trim().slice(0, 180)
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/** Lexical relevance: count of distinct query tokens present in the entry text. */
|
|
37
|
+
function lexicalScore(text, queryTokens) {
|
|
38
|
+
const lower = text.toLowerCase();
|
|
39
|
+
let score = 0;
|
|
40
|
+
for (const token of queryTokens) if (lower.includes(token)) score += 1;
|
|
41
|
+
return score;
|
|
42
|
+
}
|
|
43
|
+
async function resolveById(ctx, access, memoryId, options) {
|
|
44
|
+
const entry = ctx.store.getById(memoryId);
|
|
45
|
+
if (!entry) return makeResult(`Memory not found: ${memoryId}`, {
|
|
46
|
+
error: "not_found",
|
|
47
|
+
memoryId
|
|
48
|
+
}, true);
|
|
49
|
+
const metadata = parseReflectionMetadata(entry.metadata);
|
|
50
|
+
if (metadata.type !== REFLECTION_ITEM_TYPE) return makeResult(`Memory ${entry.id} is not a reflection item.`, {
|
|
51
|
+
error: "not_reflection_item",
|
|
52
|
+
memoryId: entry.id
|
|
53
|
+
}, true);
|
|
54
|
+
if (!isScopeAccessibleForTool(ctx.scopePolicy, entry.projectId, access)) return makeResult(`Access denied to scope: ${entry.projectId}`, {
|
|
55
|
+
error: "scope_access_denied",
|
|
56
|
+
scope: entry.projectId
|
|
57
|
+
}, true);
|
|
58
|
+
if (options.dryRun) {
|
|
59
|
+
if (metadata.resolvedAt !== void 0) return makeResult(`Reflection item already resolved: ${entry.id}`, {
|
|
60
|
+
action: "already_resolved",
|
|
61
|
+
memoryId: entry.id
|
|
62
|
+
});
|
|
63
|
+
return makeResult(`Reflection resolve preview (no changes): ${entry.id}`, {
|
|
64
|
+
action: "preview",
|
|
65
|
+
candidate: describeCandidate(entry)
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
switch (await ctx.store.resolveReflectionItem(entry.id, {
|
|
69
|
+
writerAuthority: "offline-family",
|
|
70
|
+
resolvedAt: Date.now(),
|
|
71
|
+
...access.agentId ? { resolvedBy: access.agentId } : {},
|
|
72
|
+
...options.note ? { note: options.note } : {}
|
|
73
|
+
})) {
|
|
74
|
+
case "resolved":
|
|
75
|
+
ctx.clearReflectionSliceCache?.();
|
|
76
|
+
return makeResult(`Resolved reflection item: ${entry.id}`, {
|
|
77
|
+
action: "resolved",
|
|
78
|
+
memoryId: entry.id
|
|
79
|
+
});
|
|
80
|
+
case "already_resolved": return makeResult(`Reflection item already resolved: ${entry.id}`, {
|
|
81
|
+
action: "already_resolved",
|
|
82
|
+
memoryId: entry.id
|
|
83
|
+
});
|
|
84
|
+
case "not_found": return makeResult(`Memory not found: ${entry.id}`, {
|
|
85
|
+
error: "not_found",
|
|
86
|
+
memoryId: entry.id
|
|
87
|
+
}, true);
|
|
88
|
+
case "not_reflection_item": return makeResult(`Memory ${entry.id} is not a reflection item.`, {
|
|
89
|
+
error: "not_reflection_item",
|
|
90
|
+
memoryId: entry.id
|
|
91
|
+
}, true);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
async function resolveByQuery(ctx, access, query, options) {
|
|
95
|
+
if (options.projectIdFilter.length === 0) return makeResult("No accessible scopes.", {
|
|
96
|
+
action: "preview",
|
|
97
|
+
candidates: []
|
|
98
|
+
});
|
|
99
|
+
const unresolved = (await ctx.store.listReflectionItems({
|
|
100
|
+
projectIdFilter: options.projectIdFilter,
|
|
101
|
+
limit: REFLECTION_SCAN_LIMIT,
|
|
102
|
+
unresolvedOnly: true
|
|
103
|
+
})).filter(isUnresolvedReflectionItem);
|
|
104
|
+
if (unresolved.length === 0) return makeResult("No unresolved reflection items found.", {
|
|
105
|
+
action: "preview",
|
|
106
|
+
candidates: []
|
|
107
|
+
});
|
|
108
|
+
const queryTokens = query.toLowerCase().split(/[^\p{L}\p{N}]+/u).filter(Boolean);
|
|
109
|
+
const ranked = unresolved.map((entry, index) => ({
|
|
110
|
+
entry,
|
|
111
|
+
index,
|
|
112
|
+
score: lexicalScore(entry.text, queryTokens)
|
|
113
|
+
})).sort((a, b) => b.score - a.score || a.index - b.index).slice(0, options.limit).map((ranking) => ranking.entry);
|
|
114
|
+
if (options.dryRun) return makeResult(`Reflection resolve preview: ${ranked.length} unresolved item(s). No changes made.`, {
|
|
115
|
+
action: "preview",
|
|
116
|
+
candidates: ranked.map((entry) => describeCandidate(entry))
|
|
117
|
+
});
|
|
118
|
+
const resolvedIds = [];
|
|
119
|
+
for (const entry of ranked) if (await ctx.store.resolveReflectionItem(entry.id, {
|
|
120
|
+
writerAuthority: "offline-family",
|
|
121
|
+
resolvedAt: Date.now(),
|
|
122
|
+
...access.agentId ? { resolvedBy: access.agentId } : {},
|
|
123
|
+
...options.note ? { note: options.note } : {}
|
|
124
|
+
}) === "resolved") resolvedIds.push(entry.id);
|
|
125
|
+
if (resolvedIds.length > 0) ctx.clearReflectionSliceCache?.();
|
|
126
|
+
return makeResult(`Resolved ${resolvedIds.length} reflection item(s).`, {
|
|
127
|
+
action: "resolved",
|
|
128
|
+
resolvedIds
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
async function executeMemoryReflectionResolveTool(ctx, access, _toolCallId, params) {
|
|
132
|
+
return runWithAudit(ctx, "memory_reflection_resolve", void 0, async () => {
|
|
133
|
+
const parsed = resolveParamsSchema.parse(params);
|
|
134
|
+
if (!parsed.memoryId && !parsed.query) return makeResult("Provide memoryId or query.", { error: "missing_selector" }, true);
|
|
135
|
+
if (parsed.memoryId && parsed.query) return makeResult("Provide only one of memoryId or query.", { error: "ambiguous_selector" }, true);
|
|
136
|
+
if (parsed.memoryId) return resolveById(ctx, access, parsed.memoryId, {
|
|
137
|
+
dryRun: parsed.dryRun ?? false,
|
|
138
|
+
note: parsed.note
|
|
139
|
+
});
|
|
140
|
+
const scopeFilter = parsed.scope ? [assertAccessibleScopeForTool(ctx.scopePolicy, parsed.scope, access)] : resolveReadableScopesForTool(ctx.scopePolicy, access);
|
|
141
|
+
return resolveByQuery(ctx, access, parsed.query ?? "", {
|
|
142
|
+
projectIdFilter: scopeFilter,
|
|
143
|
+
dryRun: parsed.dryRun ?? true,
|
|
144
|
+
note: parsed.note,
|
|
145
|
+
limit: clampInt(parsed.limit ?? 5, 1, 20)
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
//#endregion
|
|
150
|
+
export { executeMemoryReflectionResolveTool };
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { resolveAgentAccess } from "./memory-tool-access.js";
|
|
2
|
+
import { ToolContext, ToolResult } from "./memory-tool-schemas.js";
|
|
3
|
+
//#region src/engine/bindings/memory-stats-tool.d.ts
|
|
4
|
+
export declare function executeMemoryStatsTool(ctx: ToolContext, access: ReturnType<typeof resolveAgentAccess>, _toolCallId: unknown, params: unknown): Promise<ToolResult>;
|
|
5
|
+
//#endregion
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { i as isSystemBypassId } from "../../../memory-scope-policy-DICSCURA.js";
|
|
2
|
+
import { readEstimatedSpendToday } from "../operations/daily-spend-estimator.js";
|
|
3
|
+
import "../../../memory-tool-dependencies-DjUoelnm.js";
|
|
4
|
+
import { assertAccessibleScopeForTool, getStoreScopeFilterForTool, resolveReadableScopesForTool } from "./memory-tool-access.js";
|
|
5
|
+
import { makeResult, runWithAudit } from "./memory-tool-results.js";
|
|
6
|
+
import { statsParamsSchema } from "./memory-tool-schemas.js";
|
|
7
|
+
//#region src/engine/bindings/memory-stats-tool.ts
|
|
8
|
+
/** @file memory-stats-tool.ts
|
|
9
|
+
* @purpose Registers the memory_stats tool.
|
|
10
|
+
* @boundary One host tool registration and its handler logic.
|
|
11
|
+
*/
|
|
12
|
+
async function executeMemoryStatsTool(ctx, access, _toolCallId, params) {
|
|
13
|
+
return runWithAudit(ctx, "memory_stats", void 0, async () => {
|
|
14
|
+
const parsed = statsParamsSchema.parse(params);
|
|
15
|
+
const requestedScopes = parsed.scope ? assertAccessibleScopeForTool(ctx.scopePolicy, parsed.scope, access) : resolveReadableScopesForTool(ctx.scopePolicy, access);
|
|
16
|
+
const scopeFilter = Array.isArray(requestedScopes) ? requestedScopes : [requestedScopes];
|
|
17
|
+
const useUnfiltered = !parsed.scope && isSystemBypassId(access.agentId) && getStoreScopeFilterForTool(ctx.scopePolicy, access) === void 0;
|
|
18
|
+
let total = 0;
|
|
19
|
+
const projectBreakdown = {};
|
|
20
|
+
const categoryBreakdown = {};
|
|
21
|
+
if (useUnfiltered) {
|
|
22
|
+
const allStats = await ctx.store.stats();
|
|
23
|
+
total = allStats.total;
|
|
24
|
+
Object.assign(projectBreakdown, allStats.projectBreakdown);
|
|
25
|
+
Object.assign(categoryBreakdown, allStats.categoryBreakdown);
|
|
26
|
+
} else for (const scope of scopeFilter) {
|
|
27
|
+
const scoped = await ctx.store.stats(scope);
|
|
28
|
+
total += scoped.total;
|
|
29
|
+
for (const [key, value] of Object.entries(scoped.projectBreakdown)) projectBreakdown[key] = (projectBreakdown[key] ?? 0) + value;
|
|
30
|
+
for (const [key, value] of Object.entries(scoped.categoryBreakdown)) categoryBreakdown[key] = (categoryBreakdown[key] ?? 0) + value;
|
|
31
|
+
}
|
|
32
|
+
const estimatedSpendTodayUsd = await readEstimatedSpendToday(ctx.stateDir);
|
|
33
|
+
const payload = {
|
|
34
|
+
total,
|
|
35
|
+
scopeBreakdown: projectBreakdown,
|
|
36
|
+
categoryBreakdown,
|
|
37
|
+
estimatedSpendTodayUsd
|
|
38
|
+
};
|
|
39
|
+
return makeResult(JSON.stringify(payload), payload);
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
//#endregion
|
|
43
|
+
export { executeMemoryStatsTool };
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { resolveAgentAccess } from "./memory-tool-access.js";
|
|
2
|
+
import { ToolContext, ToolResult } from "./memory-tool-schemas.js";
|
|
3
|
+
//#region src/engine/bindings/memory-store-tool.d.ts
|
|
4
|
+
export declare function executeMemoryStoreTool(ctx: ToolContext, access: ReturnType<typeof resolveAgentAccess>, _toolCallId: unknown, params: unknown): Promise<ToolResult>;
|
|
5
|
+
//#endregion
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { DEFAULT_IMPORTANCE } from "../../config/index.js";
|
|
2
|
+
import "../i18n/locales.js";
|
|
3
|
+
import { normalizeCategory } from "../shared/types.js";
|
|
4
|
+
import { clamp01, stableHash } from "../shared/utils.js";
|
|
5
|
+
import { a as detectCategory } from "../../../capture-policy-detector-DaMfy9CZ.js";
|
|
6
|
+
import { stripEnvelopeMetadata } from "../extraction/extraction-text-sanitizer.js";
|
|
7
|
+
import { a as serializeIntervalMetadata, o as resolveMemoryDate } from "../../../memory-temporality-classifier-BUjXG5o7.js";
|
|
8
|
+
import { t as appendAuditEntry } from "../../../runtime-audit-log-BCeujlEp.js";
|
|
9
|
+
import "../../../memory-tool-dependencies-DjUoelnm.js";
|
|
10
|
+
import { assertAccessibleScopeForTool, getDefaultScopeForTool } from "./memory-tool-access.js";
|
|
11
|
+
import { makeResult, runWithAudit } from "./memory-tool-results.js";
|
|
12
|
+
import { storeParamsSchema } from "./memory-tool-schemas.js";
|
|
13
|
+
import { n as createRetireByNameRunBudget, r as runProfileSectionUpdate } from "../../../profile-section-writer-BhGKPBjw.js";
|
|
14
|
+
//#region src/engine/bindings/memory-store-tool.ts
|
|
15
|
+
/** @file memory-store-tool.ts
|
|
16
|
+
* @purpose Registers the memory_store tool.
|
|
17
|
+
* @boundary One host tool registration and its handler logic.
|
|
18
|
+
*/
|
|
19
|
+
function resolveStoreScope(parsed, ctx, access) {
|
|
20
|
+
if (parsed.scope) return assertAccessibleScopeForTool(ctx.scopePolicy, parsed.scope, access);
|
|
21
|
+
return getDefaultScopeForTool(ctx.scopePolicy, access);
|
|
22
|
+
}
|
|
23
|
+
function auditEnvelopeStrip(ctx, original, stripped) {
|
|
24
|
+
if (stripped.length === original.length) return;
|
|
25
|
+
appendAuditEntry(ctx.stateDir, {
|
|
26
|
+
event: "envelope_strip",
|
|
27
|
+
tool: "memory_store",
|
|
28
|
+
resultStatus: "ok",
|
|
29
|
+
decision: "stripped",
|
|
30
|
+
details: {
|
|
31
|
+
beforeChars: original.length,
|
|
32
|
+
afterChars: stripped.length
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
function rejectContentIfNeeded(stripped) {
|
|
37
|
+
if (stripped.trim()) return void 0;
|
|
38
|
+
return makeResult("Skipped: content is purely envelope metadata with no extractable memory.", { resultStatus: "skipped" });
|
|
39
|
+
}
|
|
40
|
+
function resolveStoreCategory(parsed, stripped, ctx) {
|
|
41
|
+
const explicitCategory = parsed.category ? normalizeCategory(parsed.category) : void 0;
|
|
42
|
+
if (explicitCategory) return explicitCategory;
|
|
43
|
+
const detectedCategory = detectCategory(stripped, { explicitLocale: ctx.language });
|
|
44
|
+
if (detectedCategory === "lesson") return "episodic";
|
|
45
|
+
if (detectedCategory) return detectedCategory;
|
|
46
|
+
appendAuditEntry(ctx.stateDir, {
|
|
47
|
+
event: "tool_call",
|
|
48
|
+
tool: "memory_store",
|
|
49
|
+
resultStatus: "ok",
|
|
50
|
+
decision: "category_fallback_episodic",
|
|
51
|
+
details: { chars: stripped.length }
|
|
52
|
+
});
|
|
53
|
+
return "episodic";
|
|
54
|
+
}
|
|
55
|
+
function buildStoreMetadata(parsed, category, dateResolution) {
|
|
56
|
+
const callerValidFrom = normalizeCallerValidFrom(parsed.metadata?.["valid_from"]);
|
|
57
|
+
const temporalMetadata = serializeIntervalMetadata(category, dateResolution.interval);
|
|
58
|
+
return {
|
|
59
|
+
...parsed.metadata ?? {},
|
|
60
|
+
source: "manual",
|
|
61
|
+
memory_category: category,
|
|
62
|
+
...temporalMetadata,
|
|
63
|
+
...callerValidFrom === void 0 ? {} : { valid_from: callerValidFrom }
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
function normalizeCallerValidFrom(value) {
|
|
67
|
+
if (typeof value === "number") return Number.isFinite(value) && value > 0 ? Math.floor(value) : void 0;
|
|
68
|
+
if (typeof value !== "string" || value.trim().length === 0) return void 0;
|
|
69
|
+
const trimmed = value.trim();
|
|
70
|
+
const numeric = Number(trimmed);
|
|
71
|
+
const parsed = Number.isFinite(numeric) ? numeric : Date.parse(trimmed);
|
|
72
|
+
return Number.isFinite(parsed) && parsed > 0 ? Math.floor(parsed) : void 0;
|
|
73
|
+
}
|
|
74
|
+
function metadataStringValue(metadata, key) {
|
|
75
|
+
const value = metadata?.[key];
|
|
76
|
+
return typeof value === "string" && value.trim() ? value.trim() : void 0;
|
|
77
|
+
}
|
|
78
|
+
async function executeMemoryStore(ctx, access, params) {
|
|
79
|
+
const parsed = storeParamsSchema.parse(params);
|
|
80
|
+
const scope = resolveStoreScope(parsed, ctx, access);
|
|
81
|
+
const importance = clamp01(parsed.importance ?? .7, DEFAULT_IMPORTANCE);
|
|
82
|
+
const stripped = stripEnvelopeMetadata(parsed.content);
|
|
83
|
+
auditEnvelopeStrip(ctx, parsed.content, stripped);
|
|
84
|
+
const rejected = rejectContentIfNeeded(stripped);
|
|
85
|
+
if (rejected) return rejected;
|
|
86
|
+
const category = resolveStoreCategory(parsed, stripped, ctx);
|
|
87
|
+
if (!category) return makeResult("Skipped: content has no unambiguous memory category.", { resultStatus: "skipped" });
|
|
88
|
+
const hash = stableHash(stripped);
|
|
89
|
+
const duplicate = ctx.store.findByContentHash(hash, scope);
|
|
90
|
+
if (duplicate) return makeResult(`Memory already exists: ${duplicate.id}`, {
|
|
91
|
+
id: duplicate.id,
|
|
92
|
+
scope
|
|
93
|
+
});
|
|
94
|
+
if (category === "profile") {
|
|
95
|
+
const sectionName = metadataStringValue(parsed.metadata, "section_name");
|
|
96
|
+
if (!sectionName) return makeResult("Rejected: memory_store profile writes require metadata.section_name.", {
|
|
97
|
+
resultStatus: "rejected",
|
|
98
|
+
category
|
|
99
|
+
}, true);
|
|
100
|
+
const at = ctx.sessionTimestamp ?? Date.now();
|
|
101
|
+
const callerValidFrom = normalizeCallerValidFrom(parsed.metadata?.["valid_from"]);
|
|
102
|
+
const retireByNameBudget = createRetireByNameRunBudget(6e4);
|
|
103
|
+
const result = await runProfileSectionUpdate({
|
|
104
|
+
scope,
|
|
105
|
+
sectionName,
|
|
106
|
+
topic: metadataStringValue(parsed.metadata, "topic"),
|
|
107
|
+
newAssertion: stripped,
|
|
108
|
+
evidence: stripped,
|
|
109
|
+
source: {
|
|
110
|
+
source: "manual",
|
|
111
|
+
messageId: `manual:${hash}`,
|
|
112
|
+
agentId: access.agentId
|
|
113
|
+
},
|
|
114
|
+
...callerValidFrom === void 0 ? {} : { metadataPatch: { valid_from: callerValidFrom } },
|
|
115
|
+
store: ctx.store,
|
|
116
|
+
...ctx.profileToolLlm ? { llm: ctx.profileToolLlm } : {},
|
|
117
|
+
...ctx.llmRouting ? { routing: ctx.llmRouting } : {},
|
|
118
|
+
at,
|
|
119
|
+
timeoutMs: 6e4,
|
|
120
|
+
retireByNameBudget
|
|
121
|
+
});
|
|
122
|
+
if (!result.rowId) return makeResult("Rejected: profile memory was not stored because the active-task assertion could not be applied.", {
|
|
123
|
+
resultStatus: "rejected",
|
|
124
|
+
category,
|
|
125
|
+
profileOutcome: result.outcome
|
|
126
|
+
}, true);
|
|
127
|
+
return makeResult(`Stored profile memory ${result.rowId}`, {
|
|
128
|
+
id: result.rowId,
|
|
129
|
+
scope,
|
|
130
|
+
category,
|
|
131
|
+
profileOutcome: result.outcome
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
const dateResolution = await resolveMemoryDate({
|
|
135
|
+
text: stripped,
|
|
136
|
+
sessionTimestamp: ctx.sessionTimestamp,
|
|
137
|
+
sessionTimezone: ctx.sessionTimezone,
|
|
138
|
+
locale: ctx.language ?? "en",
|
|
139
|
+
llm: ctx.profileToolLlm,
|
|
140
|
+
routing: ctx.llmRouting
|
|
141
|
+
});
|
|
142
|
+
const stored = await ctx.store.store({
|
|
143
|
+
offlineFamily: true,
|
|
144
|
+
text: stripped,
|
|
145
|
+
category,
|
|
146
|
+
projectId: scope,
|
|
147
|
+
importance,
|
|
148
|
+
metadata: JSON.stringify({
|
|
149
|
+
...buildStoreMetadata(parsed, category, dateResolution),
|
|
150
|
+
writer_agent_id: access.agentId
|
|
151
|
+
}),
|
|
152
|
+
...dateResolution.timestamp === void 0 ? {} : { timestamp: dateResolution.timestamp },
|
|
153
|
+
timezone: dateResolution.timezone
|
|
154
|
+
});
|
|
155
|
+
return makeResult(`Stored memory ${stored.id}`, {
|
|
156
|
+
id: stored.id,
|
|
157
|
+
scope,
|
|
158
|
+
category: stored.category
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
async function executeMemoryStoreTool(ctx, access, _toolCallId, params) {
|
|
162
|
+
return runWithAudit(ctx, "memory_store", void 0, () => executeMemoryStore(ctx, access, params));
|
|
163
|
+
}
|
|
164
|
+
//#endregion
|
|
165
|
+
export { executeMemoryStoreTool };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { t as MemoryScopePolicy } from "../../../memory-scope-policy-1gg5QlWZ.js";
|
|
2
|
+
import "../../../memory-tool-dependencies-CatGzI9R.js";
|
|
3
|
+
//#region src/engine/bindings/memory-tool-access.d.ts
|
|
4
|
+
export declare function assertAccessibleScope(scopePolicy: MemoryScopePolicy, scope: string, agentId?: string): string;
|
|
5
|
+
export declare function resolveAgentId(runtimeAgentId: unknown, fallback?: string): string | undefined;
|
|
6
|
+
export type ResolvedAgentAccess = {
|
|
7
|
+
agentId?: string;
|
|
8
|
+
};
|
|
9
|
+
export declare function resolveAgentAccess(runtimeAgentId: unknown, fallback?: string): ResolvedAgentAccess;
|
|
10
|
+
export declare function hasMissingToolIdentity(access: ResolvedAgentAccess): boolean;
|
|
11
|
+
export declare function assertAccessibleScopeForTool(scopePolicy: MemoryScopePolicy, scope: string, access: ResolvedAgentAccess): string;
|
|
12
|
+
export declare function resolveReadableScopesForTool(scopePolicy: MemoryScopePolicy, access: ResolvedAgentAccess): string[];
|
|
13
|
+
export declare function isScopeAccessibleForTool(scopePolicy: MemoryScopePolicy, scope: string, access: ResolvedAgentAccess): boolean;
|
|
14
|
+
export declare function getDefaultScopeForTool(scopePolicy: MemoryScopePolicy, access: ResolvedAgentAccess): string;
|
|
15
|
+
export declare function getStoreScopeFilterForTool(scopePolicy: MemoryScopePolicy, access: ResolvedAgentAccess): string[] | undefined;
|
|
16
|
+
//#endregion
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { SnoStationMemError } from "../shared/errors.js";
|
|
2
|
+
import "../../../memory-tool-dependencies-DjUoelnm.js";
|
|
3
|
+
//#region src/engine/bindings/memory-tool-access.ts
|
|
4
|
+
function assertAccessibleScope(scopePolicy, scope, agentId) {
|
|
5
|
+
const normalized = scope.trim();
|
|
6
|
+
if (!scopePolicy.validateScope(normalized) || !scopePolicy.isAccessible(normalized, agentId)) throw new SnoStationMemError("invalid_scope", `Scope not accessible: ${normalized}`);
|
|
7
|
+
return normalized;
|
|
8
|
+
}
|
|
9
|
+
function resolveAgentId(runtimeAgentId, fallback) {
|
|
10
|
+
/** Treats literal "undefined" as absent because some host contexts serialize missing ids. */
|
|
11
|
+
const normalize = (value) => {
|
|
12
|
+
if (typeof value !== "string") return void 0;
|
|
13
|
+
const normalized = value.trim();
|
|
14
|
+
if (!normalized || normalized === "undefined") return;
|
|
15
|
+
return normalized;
|
|
16
|
+
};
|
|
17
|
+
return normalize(runtimeAgentId) ?? normalize(fallback);
|
|
18
|
+
}
|
|
19
|
+
function resolveAgentAccess(runtimeAgentId, fallback) {
|
|
20
|
+
return { agentId: resolveAgentId(runtimeAgentId, fallback) };
|
|
21
|
+
}
|
|
22
|
+
function hasMissingToolIdentity(access) {
|
|
23
|
+
return access.agentId === void 0;
|
|
24
|
+
}
|
|
25
|
+
function assertAccessibleScopeForTool(scopePolicy, scope, access) {
|
|
26
|
+
if (hasMissingToolIdentity(access)) throw new SnoStationMemError("invalid_scope", `Scope not accessible: ${scope.trim()}`);
|
|
27
|
+
return assertAccessibleScope(scopePolicy, scope, access.agentId);
|
|
28
|
+
}
|
|
29
|
+
function resolveReadableScopesForTool(scopePolicy, access) {
|
|
30
|
+
if (hasMissingToolIdentity(access)) return [];
|
|
31
|
+
return scopePolicy.resolveAgentScopes(access.agentId);
|
|
32
|
+
}
|
|
33
|
+
function isScopeAccessibleForTool(scopePolicy, scope, access) {
|
|
34
|
+
if (hasMissingToolIdentity(access)) return false;
|
|
35
|
+
return scopePolicy.isAccessible(scope, access.agentId);
|
|
36
|
+
}
|
|
37
|
+
function getDefaultScopeForTool(scopePolicy, access) {
|
|
38
|
+
if (hasMissingToolIdentity(access)) throw new SnoStationMemError("invalid_scope", "No accessible scope available for memory_store.");
|
|
39
|
+
return assertAccessibleScope(scopePolicy, scopePolicy.getDefaultScope(access.agentId), access.agentId);
|
|
40
|
+
}
|
|
41
|
+
function getStoreScopeFilterForTool(scopePolicy, access) {
|
|
42
|
+
if (hasMissingToolIdentity(access)) return [];
|
|
43
|
+
return scopePolicy.getScopeFilter?.(access.agentId);
|
|
44
|
+
}
|
|
45
|
+
//#endregion
|
|
46
|
+
export { assertAccessibleScope, assertAccessibleScopeForTool, getDefaultScopeForTool, getStoreScopeFilterForTool, hasMissingToolIdentity, isScopeAccessibleForTool, resolveAgentAccess, resolveAgentId, resolveReadableScopesForTool };
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
//#region src/engine/bindings/memory-tool-formatting.d.ts
|
|
2
|
+
export declare function sanitizeRecalledText(text: string): string;
|
|
3
|
+
export declare function safeParseMetadata(raw: string): unknown;
|
|
4
|
+
export declare function parseEntryMetadata(entry: {
|
|
5
|
+
metadata?: string;
|
|
6
|
+
}): Record<string, unknown>;
|
|
7
|
+
/**
|
|
8
|
+
* Display the resolved event precision; unresolved text never inherits a record timestamp.
|
|
9
|
+
*
|
|
10
|
+
* Keyed on whether the claim has a resolved date, never on `kind`. `kind` records where a memory
|
|
11
|
+
* is kept — an event that is over, or a fact that stands — and a dated plan, intention or
|
|
12
|
+
* commitment is `standing` by the extraction contract while carrying a date the engine resolved
|
|
13
|
+
* from the speaker's own words. Gating on `kind` hid those dates from every reader: measured
|
|
14
|
+
* 2026-09-20 over 1,993 re-extracted rows, 77 held a resolved `temporal_date` that no model was
|
|
15
|
+
* ever shown, among them "Jon is getting ready for a dance competition near him next month"
|
|
16
|
+
* resolved to 2023-03.
|
|
17
|
+
*/
|
|
18
|
+
export declare function episodicEventDate(entry: {
|
|
19
|
+
metadata?: string;
|
|
20
|
+
}): string | undefined;
|
|
21
|
+
/**
|
|
22
|
+
* The sentence a row was written from, exactly as it was said.
|
|
23
|
+
*
|
|
24
|
+
* A row's `text` is what the extractor made of that sentence, and extraction paraphrases: asked
|
|
25
|
+
* what a poster said, a row reading "posters full of pride and strength" cannot answer "Trans
|
|
26
|
+
* Lives Matter" even though the turn contained it, and asked how someone described a dancer, a row
|
|
27
|
+
* reading "talented and passionate" cannot answer "graceful". Both wordings are already in the
|
|
28
|
+
* store beside the paraphrase; until 2026-09-15 only the paraphrase was ever shown to a model.
|
|
29
|
+
*
|
|
30
|
+
* Absent for a row written from a shared photo, and for anything rewritten by a maintenance wave.
|
|
31
|
+
*/
|
|
32
|
+
export declare function sourceQuote(entry: {
|
|
33
|
+
metadata?: string;
|
|
34
|
+
}): string | undefined;
|
|
35
|
+
/**
|
|
36
|
+
* The calendar day a row was said: the session moment it was extracted in, the anchor every
|
|
37
|
+
* relative date resolved against. A row with no session moment (rewritten by a maintenance wave,
|
|
38
|
+
* or written before source order existed) makes no claim about when it was said — its row
|
|
39
|
+
* timestamp is when it was written, which is not the same day.
|
|
40
|
+
*/
|
|
41
|
+
export declare function saidOnDate(entry: {
|
|
42
|
+
metadata?: string;
|
|
43
|
+
}): string | undefined;
|
|
44
|
+
export declare function isReflectionEntry(entry: {
|
|
45
|
+
category: string;
|
|
46
|
+
metadata?: string;
|
|
47
|
+
}): boolean;
|
|
48
|
+
export declare function getDisplayCategoryTag(entry: {
|
|
49
|
+
category: string;
|
|
50
|
+
projectId: string;
|
|
51
|
+
metadata?: string;
|
|
52
|
+
}): string;
|
|
53
|
+
export declare function serializeMemory(entry: {
|
|
54
|
+
id: string;
|
|
55
|
+
text: string;
|
|
56
|
+
category: string;
|
|
57
|
+
projectId: string;
|
|
58
|
+
importance: number;
|
|
59
|
+
timestamp: number;
|
|
60
|
+
metadata: string;
|
|
61
|
+
}): Record<string, unknown>;
|
|
62
|
+
//#endregion
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { normalizeIsoDateTimeString } from "../shared/iso-date-time.js";
|
|
2
|
+
import { stripHtmlTags, stripRoleLabelPrefix } from "../shared/i18n-text.js";
|
|
3
|
+
import { i as isCalendarLabel } from "../../../calendar-instruction-CzqZbAPG.js";
|
|
4
|
+
import { sanitizeContentIngress } from "@snoai/content-sanitizer";
|
|
5
|
+
//#region src/engine/bindings/memory-tool-formatting.ts
|
|
6
|
+
/** @file memory-tool-formatting.ts
|
|
7
|
+
* @purpose Converts memory entries into safe user-visible tool output.
|
|
8
|
+
* @boundary Metadata parsing, recalled-text sanitization, and serialization only.
|
|
9
|
+
*/
|
|
10
|
+
function sanitizeRecalledText(text) {
|
|
11
|
+
const projected = sanitizeContentIngress({
|
|
12
|
+
source: "generic-text",
|
|
13
|
+
content: text
|
|
14
|
+
}).projections.plainText;
|
|
15
|
+
return stripRoleLabelPrefix(stripHtmlTags(projected));
|
|
16
|
+
}
|
|
17
|
+
function safeParseMetadata(raw) {
|
|
18
|
+
try {
|
|
19
|
+
return JSON.parse(raw);
|
|
20
|
+
} catch {
|
|
21
|
+
return { _invalidMetadata: raw };
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function parseEntryMetadata(entry) {
|
|
25
|
+
if (!entry.metadata) return {};
|
|
26
|
+
try {
|
|
27
|
+
const parsed = JSON.parse(entry.metadata);
|
|
28
|
+
return parsed && typeof parsed === "object" ? parsed : {};
|
|
29
|
+
} catch {
|
|
30
|
+
return {};
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Display the resolved event precision; unresolved text never inherits a record timestamp.
|
|
35
|
+
*
|
|
36
|
+
* Keyed on whether the claim has a resolved date, never on `kind`. `kind` records where a memory
|
|
37
|
+
* is kept — an event that is over, or a fact that stands — and a dated plan, intention or
|
|
38
|
+
* commitment is `standing` by the extraction contract while carrying a date the engine resolved
|
|
39
|
+
* from the speaker's own words. Gating on `kind` hid those dates from every reader: measured
|
|
40
|
+
* 2026-09-20 over 1,993 re-extracted rows, 77 held a resolved `temporal_date` that no model was
|
|
41
|
+
* ever shown, among them "Jon is getting ready for a dance competition near him next month"
|
|
42
|
+
* resolved to 2023-03.
|
|
43
|
+
*/
|
|
44
|
+
function episodicEventDate(entry) {
|
|
45
|
+
const metadata = parseEntryMetadata(entry);
|
|
46
|
+
if (metadata.temporal_resolution_status === "unresolved" || metadata.temporal_resolution_status === "static") return void 0;
|
|
47
|
+
if (isCalendarLabel(metadata.temporal_date, metadata.temporal_precision)) return metadata.temporal_date;
|
|
48
|
+
const eventAt = metadata.event_at;
|
|
49
|
+
const iso = normalizeIsoDateTimeString(eventAt);
|
|
50
|
+
if (iso !== void 0) return iso.slice(0, 10);
|
|
51
|
+
if (typeof eventAt === "number") {
|
|
52
|
+
const date = new Date(eventAt);
|
|
53
|
+
if (Number.isFinite(date.getTime())) return date.toISOString().slice(0, 10);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* The sentence a row was written from, exactly as it was said.
|
|
58
|
+
*
|
|
59
|
+
* A row's `text` is what the extractor made of that sentence, and extraction paraphrases: asked
|
|
60
|
+
* what a poster said, a row reading "posters full of pride and strength" cannot answer "Trans
|
|
61
|
+
* Lives Matter" even though the turn contained it, and asked how someone described a dancer, a row
|
|
62
|
+
* reading "talented and passionate" cannot answer "graceful". Both wordings are already in the
|
|
63
|
+
* store beside the paraphrase; until 2026-09-15 only the paraphrase was ever shown to a model.
|
|
64
|
+
*
|
|
65
|
+
* Absent for a row written from a shared photo, and for anything rewritten by a maintenance wave.
|
|
66
|
+
*/
|
|
67
|
+
function sourceQuote(entry) {
|
|
68
|
+
const span = parseEntryMetadata(entry).source_span;
|
|
69
|
+
if (!span || typeof span !== "object") return void 0;
|
|
70
|
+
const quote = span.quote;
|
|
71
|
+
return typeof quote === "string" && quote.trim().length > 0 ? quote : void 0;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* The calendar day a row was said: the session moment it was extracted in, the anchor every
|
|
75
|
+
* relative date resolved against. A row with no session moment (rewritten by a maintenance wave,
|
|
76
|
+
* or written before source order existed) makes no claim about when it was said — its row
|
|
77
|
+
* timestamp is when it was written, which is not the same day.
|
|
78
|
+
*/
|
|
79
|
+
function saidOnDate(entry) {
|
|
80
|
+
const order = parseEntryMetadata(entry).source_order;
|
|
81
|
+
const moment = order && typeof order === "object" ? order.session_moment : void 0;
|
|
82
|
+
if (typeof moment !== "number") return void 0;
|
|
83
|
+
const date = new Date(moment);
|
|
84
|
+
return Number.isFinite(date.getTime()) ? date.toISOString().slice(0, 10) : void 0;
|
|
85
|
+
}
|
|
86
|
+
function isReflectionEntry(entry) {
|
|
87
|
+
const metadata = parseEntryMetadata(entry);
|
|
88
|
+
return metadata.type === "memory-reflection" || metadata.type === "memory-reflection-event" || metadata.type === "memory-reflection-item" || metadata.type === "memory-reflection-mapped";
|
|
89
|
+
}
|
|
90
|
+
function getDisplayCategoryTag(entry) {
|
|
91
|
+
if (isReflectionEntry(entry)) return `reflection:${entry.projectId}`;
|
|
92
|
+
return `${entry.category}:${entry.projectId}`;
|
|
93
|
+
}
|
|
94
|
+
function serializeMemory(entry) {
|
|
95
|
+
return {
|
|
96
|
+
id: entry.id,
|
|
97
|
+
text: sanitizeRecalledText(entry.text),
|
|
98
|
+
category: getDisplayCategoryTag(entry),
|
|
99
|
+
rawCategory: entry.category,
|
|
100
|
+
scope: entry.projectId,
|
|
101
|
+
importance: entry.importance,
|
|
102
|
+
timestamp: new Date(entry.timestamp).toISOString()
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
//#endregion
|
|
106
|
+
export { episodicEventDate, getDisplayCategoryTag, isReflectionEntry, parseEntryMetadata, safeParseMetadata, saidOnDate, sanitizeRecalledText, serializeMemory, sourceQuote };
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { i as SnoStationMemError } from "../../../errors-CeVRxf9V.js";
|
|
2
|
+
import "../../../memory-tool-dependencies-CatGzI9R.js";
|
|
3
|
+
import { ToolContext, ToolResult } from "./memory-tool-schemas.js";
|
|
4
|
+
//#region src/engine/bindings/memory-tool-results.d.ts
|
|
5
|
+
export declare function makeResult(text: string, details: Record<string, unknown>, isError?: boolean): ToolResult;
|
|
6
|
+
export declare function normalizeError(error: unknown): SnoStationMemError;
|
|
7
|
+
export declare function runWithAudit(_ctx: ToolContext, _tool: string, _scope: string | undefined, run: () => Promise<ToolResult>): Promise<ToolResult>;
|
|
8
|
+
//#endregion
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { RetrievalError, SnoStationMemError } from "../shared/errors.js";
|
|
2
|
+
import { n as z } from "../../../memory-tool-dependencies-DjUoelnm.js";
|
|
3
|
+
import { createLogger } from "@snoai/utils/logger";
|
|
4
|
+
//#region src/engine/bindings/memory-tool-results.ts
|
|
5
|
+
/** @file memory-tool-results.ts
|
|
6
|
+
* @purpose Normalizes tool success, audit, and error envelopes.
|
|
7
|
+
* @boundary Result construction and error conversion only.
|
|
8
|
+
*/
|
|
9
|
+
const log = createLogger("sno-station-mem:memory-tools");
|
|
10
|
+
function makeResult(text, details, isError = false) {
|
|
11
|
+
if (isError) log.error("Memory operation failed; later requests remain available", { cause: text }, {
|
|
12
|
+
event_name: "memory.tool.operation.failed",
|
|
13
|
+
file: "packages/memory/src/engine/bindings/memory-tool-results.ts",
|
|
14
|
+
function: "makeResult",
|
|
15
|
+
site_id: "memory.tool.operation.failed"
|
|
16
|
+
});
|
|
17
|
+
return {
|
|
18
|
+
...isError ? { isError: true } : {},
|
|
19
|
+
content: [{
|
|
20
|
+
type: "text",
|
|
21
|
+
text
|
|
22
|
+
}],
|
|
23
|
+
details
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function normalizeError(error) {
|
|
27
|
+
if (error instanceof SnoStationMemError) return error;
|
|
28
|
+
if (error instanceof z.ZodError) return new RetrievalError(error.issues.map((issue) => issue.message).join(", "), error);
|
|
29
|
+
if (error instanceof Error) return new SnoStationMemError("unknown_error", error.message, error);
|
|
30
|
+
return new SnoStationMemError("unknown_error", String(error));
|
|
31
|
+
}
|
|
32
|
+
async function runWithAudit(_ctx, _tool, _scope, run) {
|
|
33
|
+
try {
|
|
34
|
+
return await run();
|
|
35
|
+
} catch (error) {
|
|
36
|
+
const normalized = normalizeError(error);
|
|
37
|
+
return makeResult(normalized.message, { errorCode: normalized.code }, true);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//#endregion
|
|
41
|
+
export { makeResult, normalizeError, runWithAudit };
|