@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,24 @@
|
|
|
1
|
+
import { r as SqliteDatabaseLike } from "../../../sqlite-runtime-L_ywirTm.js";
|
|
2
|
+
import { JsonObject } from "@snoai/observability";
|
|
3
|
+
//#region src/engine/telemetry/memory-telemetry-observability.d.ts
|
|
4
|
+
export interface MemoryTelemetryObserveEmitInput {
|
|
5
|
+
eventType: "memory.telemetry";
|
|
6
|
+
payload: JsonObject;
|
|
7
|
+
}
|
|
8
|
+
export interface MemoryTelemetryObserveSink {
|
|
9
|
+
tryEmit(input: MemoryTelemetryObserveEmitInput): boolean | Promise<boolean>;
|
|
10
|
+
}
|
|
11
|
+
export interface ForwardMemoryTelemetryToObserveOptions {
|
|
12
|
+
sqlite: SqliteDatabaseLike;
|
|
13
|
+
observe: MemoryTelemetryObserveSink;
|
|
14
|
+
sink?: string;
|
|
15
|
+
batchSize?: number;
|
|
16
|
+
nowMs?: number;
|
|
17
|
+
}
|
|
18
|
+
export interface MemoryTelemetryObserveForwardResult {
|
|
19
|
+
status: "idle" | "forwarded" | "failed";
|
|
20
|
+
forwarded: number;
|
|
21
|
+
lastEventId: number;
|
|
22
|
+
}
|
|
23
|
+
export declare function forwardMemoryTelemetryToObserve(options: ForwardMemoryTelemetryToObserveOptions): Promise<MemoryTelemetryObserveForwardResult>;
|
|
24
|
+
//#endregion
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { isMemoryTelemetryEventType } from "./memory-telemetry-types.js";
|
|
2
|
+
//#region src/engine/telemetry/memory-telemetry-observability.ts
|
|
3
|
+
const DEFAULT_SINK = "sno-observe";
|
|
4
|
+
const MAX_BATCH_SIZE = 50;
|
|
5
|
+
async function forwardMemoryTelemetryToObserve(options) {
|
|
6
|
+
const sink = normalizeSink(options.sink);
|
|
7
|
+
const lastEventId = readWatermark(options.sqlite, sink);
|
|
8
|
+
const rows = readRows(options.sqlite, lastEventId, normalizeBatchSize(options.batchSize));
|
|
9
|
+
if (rows.length === 0) return {
|
|
10
|
+
status: "idle",
|
|
11
|
+
forwarded: 0,
|
|
12
|
+
lastEventId
|
|
13
|
+
};
|
|
14
|
+
const firstRow = rows[0];
|
|
15
|
+
const lastRow = rows[rows.length - 1];
|
|
16
|
+
if (!firstRow || !lastRow) return {
|
|
17
|
+
status: "idle",
|
|
18
|
+
forwarded: 0,
|
|
19
|
+
lastEventId
|
|
20
|
+
};
|
|
21
|
+
const nextEventId = lastRow.id;
|
|
22
|
+
const payload = buildPayload(rows, firstRow.id, nextEventId);
|
|
23
|
+
try {
|
|
24
|
+
if (!await options.observe.tryEmit({
|
|
25
|
+
eventType: "memory.telemetry",
|
|
26
|
+
payload
|
|
27
|
+
})) return {
|
|
28
|
+
status: "failed",
|
|
29
|
+
forwarded: 0,
|
|
30
|
+
lastEventId
|
|
31
|
+
};
|
|
32
|
+
writeWatermark(options.sqlite, sink, nextEventId, options.nowMs ?? Date.now());
|
|
33
|
+
return {
|
|
34
|
+
status: "forwarded",
|
|
35
|
+
forwarded: rows.length,
|
|
36
|
+
lastEventId: nextEventId
|
|
37
|
+
};
|
|
38
|
+
} catch {
|
|
39
|
+
return {
|
|
40
|
+
status: "failed",
|
|
41
|
+
forwarded: 0,
|
|
42
|
+
lastEventId
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function readWatermark(sqlite, sink) {
|
|
47
|
+
const row = sqlite.prepare("SELECT last_event_id FROM nodix_memory_telemetry_sync_state WHERE sink = ?").get(sink);
|
|
48
|
+
return typeof row?.last_event_id === "number" ? row.last_event_id : 0;
|
|
49
|
+
}
|
|
50
|
+
function readRows(sqlite, lastEventId, batchSize) {
|
|
51
|
+
return sqlite.prepare(`SELECT id, event_type, fact_id, memory_kind, timestamp_ms, session_uuid, turn_id,
|
|
52
|
+
agent_id, project_id, content_hash, retrieval_rank, retrieval_score,
|
|
53
|
+
consolidation_epoch_id, metadata_json
|
|
54
|
+
FROM nodix_memory_events
|
|
55
|
+
WHERE id > ?
|
|
56
|
+
ORDER BY id ASC
|
|
57
|
+
LIMIT ?`).all(lastEventId, batchSize);
|
|
58
|
+
}
|
|
59
|
+
function buildPayload(rows, firstEventId, lastEventId) {
|
|
60
|
+
const eventTypes = {};
|
|
61
|
+
const events = rows.map((row) => {
|
|
62
|
+
const eventType = parseEventType(row.event_type);
|
|
63
|
+
eventTypes[eventType] = typeof eventTypes[eventType] === "number" ? eventTypes[eventType] + 1 : 1;
|
|
64
|
+
return sanitizeEvent(row, eventType);
|
|
65
|
+
});
|
|
66
|
+
return {
|
|
67
|
+
sync_kind: "memory_events",
|
|
68
|
+
first_event_id: firstEventId,
|
|
69
|
+
last_event_id: lastEventId,
|
|
70
|
+
event_count: events.length,
|
|
71
|
+
event_types: eventTypes,
|
|
72
|
+
events
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
function sanitizeEvent(row, eventType) {
|
|
76
|
+
const event = {
|
|
77
|
+
event_id: row.id,
|
|
78
|
+
event_type: eventType,
|
|
79
|
+
timestamp_ms: row.timestamp_ms,
|
|
80
|
+
agent_id: row.agent_id
|
|
81
|
+
};
|
|
82
|
+
addString(event, "fact_id", row.fact_id);
|
|
83
|
+
addString(event, "memory_kind", row.memory_kind);
|
|
84
|
+
addString(event, "session_uuid", row.session_uuid);
|
|
85
|
+
addString(event, "turn_id", row.turn_id);
|
|
86
|
+
addString(event, "project_id", row.project_id);
|
|
87
|
+
addString(event, "content_hash", row.content_hash);
|
|
88
|
+
addNumber(event, "retrieval_rank", row.retrieval_rank);
|
|
89
|
+
addNumber(event, "retrieval_score", row.retrieval_score);
|
|
90
|
+
addString(event, "consolidation_epoch_id", row.consolidation_epoch_id);
|
|
91
|
+
addString(event, "status", readMetadataString(row.metadata_json, "status"));
|
|
92
|
+
if (eventType === "inject") addString(event, "source_agent_id", readMetadataString(row.metadata_json, "source_agent_id"));
|
|
93
|
+
return event;
|
|
94
|
+
}
|
|
95
|
+
function readMetadataString(metadataJson, key) {
|
|
96
|
+
if (!metadataJson) return null;
|
|
97
|
+
try {
|
|
98
|
+
const parsed = JSON.parse(metadataJson);
|
|
99
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) return null;
|
|
100
|
+
const value = parsed[key];
|
|
101
|
+
return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
|
|
102
|
+
} catch {
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
function writeWatermark(sqlite, sink, lastEventId, updatedAtMs) {
|
|
107
|
+
sqlite.prepare(`INSERT INTO nodix_memory_telemetry_sync_state (sink, last_event_id, updated_at_ms)
|
|
108
|
+
VALUES (?, ?, ?)
|
|
109
|
+
ON CONFLICT(sink) DO UPDATE SET
|
|
110
|
+
last_event_id = excluded.last_event_id,
|
|
111
|
+
updated_at_ms = excluded.updated_at_ms
|
|
112
|
+
WHERE excluded.last_event_id > nodix_memory_telemetry_sync_state.last_event_id`).run(sink, lastEventId, updatedAtMs);
|
|
113
|
+
}
|
|
114
|
+
function parseEventType(value) {
|
|
115
|
+
if (isMemoryTelemetryEventType(value)) return value;
|
|
116
|
+
throw new Error(`unknown memory telemetry event type: ${value}`);
|
|
117
|
+
}
|
|
118
|
+
function normalizeSink(value) {
|
|
119
|
+
if (typeof value === "string" && value.trim().length > 0) return value.trim();
|
|
120
|
+
return DEFAULT_SINK;
|
|
121
|
+
}
|
|
122
|
+
function normalizeBatchSize(value) {
|
|
123
|
+
if (!Number.isFinite(value)) return MAX_BATCH_SIZE;
|
|
124
|
+
return Math.max(1, Math.min(MAX_BATCH_SIZE, Math.floor(Number(value))));
|
|
125
|
+
}
|
|
126
|
+
function addString(target, key, value) {
|
|
127
|
+
if (typeof value === "string" && value.trim().length > 0) target[key] = value.trim();
|
|
128
|
+
}
|
|
129
|
+
function addNumber(target, key, value) {
|
|
130
|
+
if (typeof value === "number" && Number.isFinite(value)) target[key] = value;
|
|
131
|
+
}
|
|
132
|
+
//#endregion
|
|
133
|
+
export { forwardMemoryTelemetryToObserve };
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { a as MemoryTelemetryUsageSummary, i as MemoryTelemetryUsageOutboxOptions, n as MemoryTelemetryUsageInput, r as MemoryTelemetryUsageOutbox, t as MemoryTelemetryFlushResult } from "../../../memory-telemetry-outbox-ddTdImt7.js";
|
|
2
|
+
export { MemoryTelemetryFlushResult, MemoryTelemetryUsageInput, MemoryTelemetryUsageOutbox, MemoryTelemetryUsageOutboxOptions, MemoryTelemetryUsageSummary };
|
|
@@ -0,0 +1,443 @@
|
|
|
1
|
+
import "../../../signed-registry-constants-yq3DlG3B.js";
|
|
2
|
+
import { t as validateMemoryTelemetryMetadata } from "../../../memory-telemetry-metadata-CA7W8tK6.js";
|
|
3
|
+
import { t as recordMemoryTelemetryIncident } from "../../../memory-telemetry-incidents-BWA9kcZx.js";
|
|
4
|
+
import { createLogger, privateLogReference } from "@snoai/utils/logger";
|
|
5
|
+
//#region src/engine/telemetry/memory-telemetry-outbox.ts
|
|
6
|
+
const DEFAULT_USAGE_OUTBOX_BATCH_SIZE = 50;
|
|
7
|
+
const USAGE_OUTBOX_CLAIM_LEASE_MS = 6e4;
|
|
8
|
+
const activeFlushes = /* @__PURE__ */ new Map();
|
|
9
|
+
const log = createLogger("sno-station-mem:usage-outbox");
|
|
10
|
+
var MemoryTelemetryUsageOutbox = class {
|
|
11
|
+
sqlite;
|
|
12
|
+
dbPath;
|
|
13
|
+
agentId;
|
|
14
|
+
batchSize;
|
|
15
|
+
insertUsageStatement;
|
|
16
|
+
constructor(options) {
|
|
17
|
+
this.sqlite = options.sqlite;
|
|
18
|
+
this.dbPath = options.dbPath;
|
|
19
|
+
this.agentId = options.agentId ?? "sno-mem-claw";
|
|
20
|
+
this.batchSize = options.batchSize ?? DEFAULT_USAGE_OUTBOX_BATCH_SIZE;
|
|
21
|
+
this.insertUsageStatement = this.sqlite.prepare(`INSERT INTO nodix_memory_usage_outbox
|
|
22
|
+
(event_type, payload_json, accepted_at_ms, status, attempt_count)
|
|
23
|
+
VALUES (?, ?, ?, 'pending', 0)`);
|
|
24
|
+
}
|
|
25
|
+
acceptUsage(input) {
|
|
26
|
+
const payload = normalizeUsageInput(input, this.agentId);
|
|
27
|
+
this.insertUsageStatement.run(payload.event_type, JSON.stringify(payload), Date.now());
|
|
28
|
+
}
|
|
29
|
+
tryAcceptUsage(input) {
|
|
30
|
+
try {
|
|
31
|
+
this.acceptUsage(input);
|
|
32
|
+
return true;
|
|
33
|
+
} catch (error) {
|
|
34
|
+
let incidentPersisted = false;
|
|
35
|
+
try {
|
|
36
|
+
recordMemoryTelemetryIncident(this.sqlite, {
|
|
37
|
+
incidentType: "memory_usage_outbox_accept_failed",
|
|
38
|
+
severity: "error",
|
|
39
|
+
message: "memory telemetry usage accept failed",
|
|
40
|
+
payload: {
|
|
41
|
+
event_type: input.eventType,
|
|
42
|
+
fact_id: input.factId,
|
|
43
|
+
error_code: "usage_accept_failed",
|
|
44
|
+
retry_state: "not_counted"
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
incidentPersisted = true;
|
|
48
|
+
} catch {}
|
|
49
|
+
log.warn("Memory usage queue acceptance failed", {
|
|
50
|
+
outcome: "failed",
|
|
51
|
+
error,
|
|
52
|
+
accepted_count: 0,
|
|
53
|
+
incident_persisted: incidentPersisted,
|
|
54
|
+
memory_id: input.factId,
|
|
55
|
+
operation: input.eventType,
|
|
56
|
+
store_reference: privateLogReference(this.dbPath)
|
|
57
|
+
}, {
|
|
58
|
+
event_name: "memory.usage.accept.failed",
|
|
59
|
+
file: "packages/memory/src/engine/telemetry/memory-telemetry-outbox.ts",
|
|
60
|
+
function: "MemoryTelemetryUsageOutbox.tryAcceptUsage",
|
|
61
|
+
site_id: "memory.usage.accept.failed"
|
|
62
|
+
});
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
usageSummary(factId) {
|
|
67
|
+
const committedRecall = this.countCommitted(factId, "recall");
|
|
68
|
+
const committedInject = this.countCommitted(factId, "inject");
|
|
69
|
+
const pendingRecall = this.countPending(factId, "recall");
|
|
70
|
+
const pendingInject = this.countPending(factId, "inject");
|
|
71
|
+
return {
|
|
72
|
+
recall: committedRecall + pendingRecall,
|
|
73
|
+
inject: committedInject + pendingInject,
|
|
74
|
+
pendingRecall,
|
|
75
|
+
pendingInject,
|
|
76
|
+
committedRecall,
|
|
77
|
+
committedInject
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
flushPending(batchSize = this.batchSize) {
|
|
81
|
+
const started = performance.now();
|
|
82
|
+
let rows;
|
|
83
|
+
try {
|
|
84
|
+
rows = this.claimFlushRows(batchSize);
|
|
85
|
+
} catch (error) {
|
|
86
|
+
log.warn("Memory usage queue claim failed", {
|
|
87
|
+
error,
|
|
88
|
+
outcome: "failed",
|
|
89
|
+
committed_count: 0,
|
|
90
|
+
duration_ms: performance.now() - started,
|
|
91
|
+
store_reference: privateLogReference(this.dbPath)
|
|
92
|
+
}, {
|
|
93
|
+
event_name: "memory.usage.flush.failed",
|
|
94
|
+
file: "packages/memory/src/engine/telemetry/memory-telemetry-outbox.ts",
|
|
95
|
+
function: "MemoryTelemetryUsageOutbox.flushPending",
|
|
96
|
+
site_id: "memory.usage.flush.claim_failed"
|
|
97
|
+
});
|
|
98
|
+
throw error;
|
|
99
|
+
}
|
|
100
|
+
if (rows.length === 0) {
|
|
101
|
+
log.debug("Memory usage queue has no pending rows", {
|
|
102
|
+
outcome: "empty_success",
|
|
103
|
+
selected_count: 0,
|
|
104
|
+
committed_count: 0,
|
|
105
|
+
duration_ms: performance.now() - started
|
|
106
|
+
}, {
|
|
107
|
+
event_name: "memory.usage.flush.completed",
|
|
108
|
+
file: "packages/memory/src/engine/telemetry/memory-telemetry-outbox.ts",
|
|
109
|
+
function: "MemoryTelemetryUsageOutbox.flushPending",
|
|
110
|
+
site_id: "memory.usage.flush.empty"
|
|
111
|
+
});
|
|
112
|
+
return {
|
|
113
|
+
selected: 0,
|
|
114
|
+
inserted: 0,
|
|
115
|
+
deleted: 0,
|
|
116
|
+
failed: 0
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
let inserted = 0;
|
|
120
|
+
let deleted = 0;
|
|
121
|
+
let failed = 0;
|
|
122
|
+
const quarantined = [];
|
|
123
|
+
let failingRow;
|
|
124
|
+
try {
|
|
125
|
+
this.sqlite.transaction(() => {
|
|
126
|
+
for (const row of rows) try {
|
|
127
|
+
const payload = this.parseValidatedPayload(row);
|
|
128
|
+
if (this.deleteClaimedRow(row) !== 1) continue;
|
|
129
|
+
this.insertEvent(row, payload);
|
|
130
|
+
deleted += 1;
|
|
131
|
+
inserted += 1;
|
|
132
|
+
} catch (error) {
|
|
133
|
+
if (error instanceof PermanentUsageOutboxRowError) {
|
|
134
|
+
const message = safeErrorMessage(error);
|
|
135
|
+
if (this.quarantineClaimedRow(row, message) === 1) {
|
|
136
|
+
failed += 1;
|
|
137
|
+
quarantined.push({
|
|
138
|
+
row,
|
|
139
|
+
message
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
failingRow = row;
|
|
145
|
+
throw error;
|
|
146
|
+
}
|
|
147
|
+
}).immediate();
|
|
148
|
+
} catch (error) {
|
|
149
|
+
inserted = 0;
|
|
150
|
+
deleted = 0;
|
|
151
|
+
failed = 0;
|
|
152
|
+
log.warn("Memory usage queue flush rolled back", {
|
|
153
|
+
error,
|
|
154
|
+
outcome: "failed",
|
|
155
|
+
selected_count: rows.length,
|
|
156
|
+
committed_count: 0,
|
|
157
|
+
deleted_count: 0,
|
|
158
|
+
quarantined_count: 0,
|
|
159
|
+
duration_ms: performance.now() - started,
|
|
160
|
+
store_reference: privateLogReference(this.dbPath)
|
|
161
|
+
}, {
|
|
162
|
+
event_name: "memory.usage.flush.failed",
|
|
163
|
+
file: "packages/memory/src/engine/telemetry/memory-telemetry-outbox.ts",
|
|
164
|
+
function: "MemoryTelemetryUsageOutbox.flushPending",
|
|
165
|
+
site_id: "memory.usage.flush.rollback"
|
|
166
|
+
});
|
|
167
|
+
if (failingRow) this.markRowsFailed([failingRow], safeErrorMessage(error));
|
|
168
|
+
throw error;
|
|
169
|
+
}
|
|
170
|
+
for (const entry of quarantined) this.recordQuarantineIncident(entry.row, entry.message);
|
|
171
|
+
log.info("Memory usage queue flush completed", {
|
|
172
|
+
outcome: failed > 0 ? "partial" : "success",
|
|
173
|
+
selected_count: rows.length,
|
|
174
|
+
committed_count: inserted,
|
|
175
|
+
deleted_count: deleted,
|
|
176
|
+
quarantined_count: failed,
|
|
177
|
+
duration_ms: performance.now() - started,
|
|
178
|
+
store_reference: privateLogReference(this.dbPath)
|
|
179
|
+
}, {
|
|
180
|
+
event_name: "memory.usage.flush.completed",
|
|
181
|
+
file: "packages/memory/src/engine/telemetry/memory-telemetry-outbox.ts",
|
|
182
|
+
function: "MemoryTelemetryUsageOutbox.flushPending",
|
|
183
|
+
site_id: "memory.usage.flush.completed"
|
|
184
|
+
});
|
|
185
|
+
return {
|
|
186
|
+
selected: rows.length,
|
|
187
|
+
inserted,
|
|
188
|
+
deleted,
|
|
189
|
+
failed
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Bounded catch-up drain: flush batches until a pass claims zero rows or the
|
|
194
|
+
* time budget is exhausted. Used by the hourly maintenance tick and shutdown so
|
|
195
|
+
* a historical backlog drains across passes without monopolizing the writer.
|
|
196
|
+
*/
|
|
197
|
+
drainPending(budgetMs = 3e4) {
|
|
198
|
+
const startedAt = Date.now();
|
|
199
|
+
const totals = {
|
|
200
|
+
selected: 0,
|
|
201
|
+
inserted: 0,
|
|
202
|
+
deleted: 0,
|
|
203
|
+
failed: 0
|
|
204
|
+
};
|
|
205
|
+
while (Date.now() - startedAt < budgetMs) {
|
|
206
|
+
const pass = this.flushPending();
|
|
207
|
+
totals.selected += pass.selected;
|
|
208
|
+
totals.inserted += pass.inserted;
|
|
209
|
+
totals.deleted += pass.deleted;
|
|
210
|
+
totals.failed += pass.failed;
|
|
211
|
+
if (pass.selected === 0) break;
|
|
212
|
+
}
|
|
213
|
+
return totals;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Deletes quarantined rows older than the cutoff. Portable batched shape
|
|
217
|
+
* (`DELETE ... LIMIT` is a compile-option extension — never assume it).
|
|
218
|
+
*/
|
|
219
|
+
pruneQuarantined(cutoffMs) {
|
|
220
|
+
let pruned = 0;
|
|
221
|
+
while (true) {
|
|
222
|
+
const changes = this.sqlite.prepare(`DELETE FROM nodix_memory_usage_outbox
|
|
223
|
+
WHERE id IN (
|
|
224
|
+
SELECT id FROM nodix_memory_usage_outbox
|
|
225
|
+
WHERE status = 'quarantined' AND accepted_at_ms < ?
|
|
226
|
+
LIMIT 5000
|
|
227
|
+
)`).run(cutoffMs).changes ?? 0;
|
|
228
|
+
pruned += changes;
|
|
229
|
+
if (changes === 0) break;
|
|
230
|
+
}
|
|
231
|
+
return pruned;
|
|
232
|
+
}
|
|
233
|
+
flushPendingAsync(batchSize = this.batchSize) {
|
|
234
|
+
const active = activeFlushes.get(this.dbPath);
|
|
235
|
+
if (active) return active;
|
|
236
|
+
const promise = Promise.resolve().then(() => this.flushPending(batchSize)).finally(() => {
|
|
237
|
+
if (activeFlushes.get(this.dbPath) === promise) activeFlushes.delete(this.dbPath);
|
|
238
|
+
});
|
|
239
|
+
activeFlushes.set(this.dbPath, promise);
|
|
240
|
+
return promise;
|
|
241
|
+
}
|
|
242
|
+
countCommitted(factId, eventType) {
|
|
243
|
+
return this.sqlite.prepare("SELECT COUNT(*) AS count FROM nodix_memory_events WHERE fact_id = ? AND event_type = ?").get(factId, eventType).count;
|
|
244
|
+
}
|
|
245
|
+
countPending(factId, eventType) {
|
|
246
|
+
return this.sqlite.prepare(`SELECT COUNT(*) AS count
|
|
247
|
+
FROM nodix_memory_usage_outbox
|
|
248
|
+
WHERE event_type = ?
|
|
249
|
+
AND status IN ('pending', 'failed', 'flushing')
|
|
250
|
+
AND json_extract(payload_json, '$.fact_id') = ?`).get(eventType, factId).count;
|
|
251
|
+
}
|
|
252
|
+
claimFlushRows(batchSize) {
|
|
253
|
+
const now = Date.now();
|
|
254
|
+
const claimExpiresAt = now + USAGE_OUTBOX_CLAIM_LEASE_MS;
|
|
255
|
+
return this.sqlite.transaction(() => {
|
|
256
|
+
const candidates = this.readFlushCandidates(batchSize, now);
|
|
257
|
+
const claimed = [];
|
|
258
|
+
for (const row of candidates) if (this.claimRow(row.id, now, claimExpiresAt) === 1) claimed.push({
|
|
259
|
+
...row,
|
|
260
|
+
claim_expires_at_ms: claimExpiresAt
|
|
261
|
+
});
|
|
262
|
+
return claimed;
|
|
263
|
+
}).immediate();
|
|
264
|
+
}
|
|
265
|
+
readFlushCandidates(batchSize, now) {
|
|
266
|
+
return this.sqlite.prepare(`SELECT id, event_type, payload_json, accepted_at_ms, status
|
|
267
|
+
FROM nodix_memory_usage_outbox
|
|
268
|
+
WHERE (
|
|
269
|
+
status IN ('pending', 'failed')
|
|
270
|
+
AND (next_attempt_ms IS NULL OR next_attempt_ms <= ?)
|
|
271
|
+
)
|
|
272
|
+
OR (
|
|
273
|
+
status = 'flushing'
|
|
274
|
+
AND next_attempt_ms IS NOT NULL
|
|
275
|
+
AND next_attempt_ms <= ?
|
|
276
|
+
)
|
|
277
|
+
ORDER BY id ASC
|
|
278
|
+
LIMIT ?`).all(now, now, batchSize);
|
|
279
|
+
}
|
|
280
|
+
claimRow(id, now, claimExpiresAt) {
|
|
281
|
+
return this.sqlite.prepare(`UPDATE nodix_memory_usage_outbox
|
|
282
|
+
SET status = 'flushing',
|
|
283
|
+
last_error = NULL,
|
|
284
|
+
next_attempt_ms = ?
|
|
285
|
+
WHERE id = ?
|
|
286
|
+
AND (
|
|
287
|
+
(
|
|
288
|
+
status IN ('pending', 'failed')
|
|
289
|
+
AND (next_attempt_ms IS NULL OR next_attempt_ms <= ?)
|
|
290
|
+
)
|
|
291
|
+
OR (
|
|
292
|
+
status = 'flushing'
|
|
293
|
+
AND next_attempt_ms IS NOT NULL
|
|
294
|
+
AND next_attempt_ms <= ?
|
|
295
|
+
)
|
|
296
|
+
)`).run(claimExpiresAt, id, now, now).changes ?? 0;
|
|
297
|
+
}
|
|
298
|
+
/** Parses and validates a claimed row; throws PermanentUsageOutboxRowError on bad payloads. */
|
|
299
|
+
parseValidatedPayload(row) {
|
|
300
|
+
const payload = parseUsagePayload(row);
|
|
301
|
+
try {
|
|
302
|
+
return {
|
|
303
|
+
...payload,
|
|
304
|
+
metadata_json: validateMemoryTelemetryMetadata(payload.event_type, payload.metadata_json)
|
|
305
|
+
};
|
|
306
|
+
} catch (error) {
|
|
307
|
+
if (error instanceof PermanentUsageOutboxRowError) throw error;
|
|
308
|
+
throw new PermanentUsageOutboxRowError(`nodix_memory_usage_outbox row ${row.id} has invalid metadata_json: ${safeErrorMessage(error)}`);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
insertEvent(row, payload) {
|
|
312
|
+
const metadata = payload.metadata_json;
|
|
313
|
+
this.sqlite.prepare(`INSERT INTO nodix_memory_events
|
|
314
|
+
(event_type, fact_id, memory_kind, timestamp_ms, agent_id, project_id,
|
|
315
|
+
session_uuid, turn_id, retrieval_rank, retrieval_score, metadata_json)
|
|
316
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(payload.event_type, payload.fact_id, payload.memory_kind, row.accepted_at_ms, payload.agent_id ?? this.agentId, payload.project_id, payload.session_uuid, payload.turn_id, payload.retrieval_rank, payload.retrieval_score, JSON.stringify(metadata));
|
|
317
|
+
}
|
|
318
|
+
deleteClaimedRow(row) {
|
|
319
|
+
return this.sqlite.prepare(`DELETE FROM nodix_memory_usage_outbox
|
|
320
|
+
WHERE id = ?
|
|
321
|
+
AND status = 'flushing'
|
|
322
|
+
AND next_attempt_ms = ?`).run(row.id, row.claim_expires_at_ms).changes ?? 0;
|
|
323
|
+
}
|
|
324
|
+
markRowsFailed(rows, lastError) {
|
|
325
|
+
let changed = 0;
|
|
326
|
+
for (const row of rows) {
|
|
327
|
+
const result = this.sqlite.prepare(`UPDATE nodix_memory_usage_outbox
|
|
328
|
+
SET status = 'failed',
|
|
329
|
+
attempt_count = attempt_count + 1,
|
|
330
|
+
last_error = ?,
|
|
331
|
+
next_attempt_ms = NULL
|
|
332
|
+
WHERE id = ?
|
|
333
|
+
AND status = 'flushing'
|
|
334
|
+
AND next_attempt_ms = ?`).run(lastError, row.id, row.claim_expires_at_ms);
|
|
335
|
+
changed += result.changes ?? 0;
|
|
336
|
+
}
|
|
337
|
+
return changed;
|
|
338
|
+
}
|
|
339
|
+
quarantineClaimedRow(row, lastError) {
|
|
340
|
+
return this.sqlite.prepare(`UPDATE nodix_memory_usage_outbox
|
|
341
|
+
SET status = 'quarantined',
|
|
342
|
+
attempt_count = attempt_count + 1,
|
|
343
|
+
last_error = ?,
|
|
344
|
+
next_attempt_ms = NULL
|
|
345
|
+
WHERE id = ?
|
|
346
|
+
AND status = 'flushing'
|
|
347
|
+
AND next_attempt_ms = ?`).run(lastError, row.id, row.claim_expires_at_ms).changes ?? 0;
|
|
348
|
+
}
|
|
349
|
+
recordQuarantineIncident(row, lastError) {
|
|
350
|
+
try {
|
|
351
|
+
recordMemoryTelemetryIncident(this.sqlite, {
|
|
352
|
+
incidentType: "memory_usage_outbox_quarantined",
|
|
353
|
+
severity: "error",
|
|
354
|
+
message: "memory telemetry usage outbox row quarantined",
|
|
355
|
+
payload: {
|
|
356
|
+
row_id: row.id,
|
|
357
|
+
event_type: row.event_type,
|
|
358
|
+
error_code: "usage_outbox_invalid_payload",
|
|
359
|
+
retry_state: "quarantined",
|
|
360
|
+
last_error: lastError
|
|
361
|
+
}
|
|
362
|
+
});
|
|
363
|
+
} catch {}
|
|
364
|
+
}
|
|
365
|
+
};
|
|
366
|
+
function normalizeUsageInput(input, defaultAgentId) {
|
|
367
|
+
if (input.eventType !== "recall" && input.eventType !== "inject") throw new Error(`Unsupported memory telemetry usage event type: ${String(input.eventType)}`);
|
|
368
|
+
if (input.factId.trim().length === 0) throw new Error("memory telemetry usage requires factId");
|
|
369
|
+
if (input.memoryKind.trim().length === 0) throw new Error("memory telemetry usage requires memoryKind");
|
|
370
|
+
if (input.projectId.trim().length === 0) throw new Error("memory telemetry usage requires projectId");
|
|
371
|
+
const metadata = validateMemoryTelemetryMetadata(input.eventType, input.metadata);
|
|
372
|
+
return {
|
|
373
|
+
event_type: input.eventType,
|
|
374
|
+
fact_id: input.factId,
|
|
375
|
+
memory_kind: input.memoryKind,
|
|
376
|
+
project_id: input.projectId,
|
|
377
|
+
agent_id: input.agentId ?? defaultAgentId,
|
|
378
|
+
session_uuid: input.sessionUuid ?? null,
|
|
379
|
+
turn_id: input.turnId ?? null,
|
|
380
|
+
retrieval_rank: input.retrievalRank ?? null,
|
|
381
|
+
retrieval_score: input.retrievalScore ?? null,
|
|
382
|
+
metadata_json: metadata
|
|
383
|
+
};
|
|
384
|
+
}
|
|
385
|
+
function parseUsagePayload(row) {
|
|
386
|
+
let parsed;
|
|
387
|
+
try {
|
|
388
|
+
parsed = JSON.parse(row.payload_json);
|
|
389
|
+
} catch (error) {
|
|
390
|
+
throw new PermanentUsageOutboxRowError(`nodix_memory_usage_outbox row ${row.id} has invalid payload_json: ${safeErrorMessage(error)}`);
|
|
391
|
+
}
|
|
392
|
+
if (!isRecord(parsed)) throw new PermanentUsageOutboxRowError(`nodix_memory_usage_outbox row ${row.id} has invalid payload`);
|
|
393
|
+
if (parsed.event_type !== row.event_type) throw new PermanentUsageOutboxRowError(`nodix_memory_usage_outbox row ${row.id} event type drifted`);
|
|
394
|
+
return {
|
|
395
|
+
event_type: parseUsageEventType(parsed.event_type, row.id),
|
|
396
|
+
fact_id: parseRequiredString(parsed.fact_id, "fact_id", row.id),
|
|
397
|
+
memory_kind: parseRequiredString(parsed.memory_kind, "memory_kind", row.id),
|
|
398
|
+
project_id: parseRequiredString(parsed.project_id, "project_id", row.id),
|
|
399
|
+
agent_id: parseNullableString(parsed.agent_id, "agent_id", row.id),
|
|
400
|
+
session_uuid: parseNullableString(parsed.session_uuid, "session_uuid", row.id),
|
|
401
|
+
turn_id: parseNullableString(parsed.turn_id, "turn_id", row.id),
|
|
402
|
+
retrieval_rank: parseNullableNumber(parsed.retrieval_rank, "retrieval_rank", row.id),
|
|
403
|
+
retrieval_score: parseNullableNumber(parsed.retrieval_score, "retrieval_score", row.id),
|
|
404
|
+
metadata_json: parseMetadata(parsed.metadata_json, row.id)
|
|
405
|
+
};
|
|
406
|
+
}
|
|
407
|
+
function parseUsageEventType(value, rowId) {
|
|
408
|
+
if (value === "recall" || value === "inject") return value;
|
|
409
|
+
throw new PermanentUsageOutboxRowError(`nodix_memory_usage_outbox row ${rowId} has invalid event_type`);
|
|
410
|
+
}
|
|
411
|
+
function parseRequiredString(value, field, rowId) {
|
|
412
|
+
if (typeof value === "string" && value.trim().length > 0) return value;
|
|
413
|
+
throw new PermanentUsageOutboxRowError(`nodix_memory_usage_outbox row ${rowId} has invalid ${field}`);
|
|
414
|
+
}
|
|
415
|
+
function parseNullableString(value, field, rowId) {
|
|
416
|
+
if (value === null) return null;
|
|
417
|
+
if (typeof value === "string") return value;
|
|
418
|
+
throw new PermanentUsageOutboxRowError(`nodix_memory_usage_outbox row ${rowId} has invalid ${field}`);
|
|
419
|
+
}
|
|
420
|
+
function parseNullableNumber(value, field, rowId) {
|
|
421
|
+
if (value === null) return null;
|
|
422
|
+
if (typeof value === "number" && Number.isFinite(value)) return value;
|
|
423
|
+
throw new PermanentUsageOutboxRowError(`nodix_memory_usage_outbox row ${rowId} has invalid ${field}`);
|
|
424
|
+
}
|
|
425
|
+
function parseMetadata(value, rowId) {
|
|
426
|
+
if (isRecord(value)) return value;
|
|
427
|
+
throw new PermanentUsageOutboxRowError(`nodix_memory_usage_outbox row ${rowId} has invalid metadata_json`);
|
|
428
|
+
}
|
|
429
|
+
var PermanentUsageOutboxRowError = class extends Error {
|
|
430
|
+
constructor(message) {
|
|
431
|
+
super(message);
|
|
432
|
+
this.name = "PermanentUsageOutboxRowError";
|
|
433
|
+
}
|
|
434
|
+
};
|
|
435
|
+
function isRecord(value) {
|
|
436
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
437
|
+
}
|
|
438
|
+
function safeErrorMessage(error) {
|
|
439
|
+
if (error instanceof Error && error.message.trim().length > 0) return error.message.slice(0, 500);
|
|
440
|
+
return "memory telemetry usage flush failed";
|
|
441
|
+
}
|
|
442
|
+
//#endregion
|
|
443
|
+
export { MemoryTelemetryUsageOutbox };
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { a as MemoryTelemetryMetadata, i as MemoryTelemetryEventType, n as MEMORY_TELEMETRY_EVENT_TYPES, o as MemoryTelemetryReceiptStatus, r as MemoryTelemetryDeleteReason, s as isMemoryTelemetryEventType, t as MEMORY_TELEMETRY_DELETE_REASONS } from "../../../memory-telemetry-types-CufVmrCs.js";
|
|
2
|
+
export { MEMORY_TELEMETRY_DELETE_REASONS, MEMORY_TELEMETRY_EVENT_TYPES, MemoryTelemetryDeleteReason, MemoryTelemetryEventType, MemoryTelemetryMetadata, MemoryTelemetryReceiptStatus, isMemoryTelemetryEventType };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
//#region src/engine/telemetry/memory-telemetry-types.ts
|
|
2
|
+
const MEMORY_TELEMETRY_EVENT_TYPES = [
|
|
3
|
+
"create",
|
|
4
|
+
"update",
|
|
5
|
+
"recall",
|
|
6
|
+
"supersede",
|
|
7
|
+
"delete",
|
|
8
|
+
"inject",
|
|
9
|
+
"epoch_boundary",
|
|
10
|
+
"purge"
|
|
11
|
+
];
|
|
12
|
+
const MEMORY_TELEMETRY_DELETE_REASONS = {
|
|
13
|
+
admin: "admin_delete",
|
|
14
|
+
cli: "cli_delete",
|
|
15
|
+
memoryForget: "memory_forget"
|
|
16
|
+
};
|
|
17
|
+
function isMemoryTelemetryEventType(value) {
|
|
18
|
+
return typeof value === "string" && MEMORY_TELEMETRY_EVENT_TYPES.includes(value);
|
|
19
|
+
}
|
|
20
|
+
//#endregion
|
|
21
|
+
export { MEMORY_TELEMETRY_DELETE_REASONS, MEMORY_TELEMETRY_EVENT_TYPES, isMemoryTelemetryEventType };
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { t as ObserveLogger } from "../../../best-effort-BPZSzKk0.js";
|
|
2
|
+
import { t as EmitInput } from "../../../adapter-B7Jox9-6.js";
|
|
3
|
+
import { EventLane, EventType, JsonObject } from "@snoai/observability";
|
|
4
|
+
//#region src/engine/telemetry/observe-ledger.d.ts
|
|
5
|
+
export interface ObserveLedgerRow {
|
|
6
|
+
ts_ms: number;
|
|
7
|
+
event_type: EventType;
|
|
8
|
+
lane: EventLane;
|
|
9
|
+
project_id?: string;
|
|
10
|
+
payload: JsonObject;
|
|
11
|
+
}
|
|
12
|
+
interface LedgerObserve {
|
|
13
|
+
tryEmit(input: EmitInput): boolean | Promise<boolean>;
|
|
14
|
+
emitError?(kind: string, error: unknown): void | Promise<void>;
|
|
15
|
+
readonly logger?: ObserveLogger | undefined;
|
|
16
|
+
}
|
|
17
|
+
interface ForwardResult {
|
|
18
|
+
status: "idle" | "forwarded" | "failed";
|
|
19
|
+
forwarded: number;
|
|
20
|
+
offset: number;
|
|
21
|
+
}
|
|
22
|
+
export declare function observeLedgerPath(profileDir: string): string;
|
|
23
|
+
export declare function observeLedgerSyncedPath(profileDir: string): string;
|
|
24
|
+
export declare function appendObserveLedgerRows(profileDir: string, rows: readonly ObserveLedgerRow[]): void;
|
|
25
|
+
export declare function forwardObserveLedger(options: {
|
|
26
|
+
profileDir: string;
|
|
27
|
+
observe: LedgerObserve;
|
|
28
|
+
batchSize?: number;
|
|
29
|
+
}): Promise<ForwardResult>;
|
|
30
|
+
//#endregion
|