@remnic/core 9.45.4 → 9.46.0
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/dist/access-admin-ops-surface.d.ts +10 -10
- package/dist/access-admin-ops-surface.js +30 -29
- package/dist/access-authorization-probe.d.ts +10 -10
- package/dist/access-authorization-probe.js +31 -30
- package/dist/access-boundary.d.ts +10 -10
- package/dist/access-boundary.js +30 -29
- package/dist/access-cli.js +91 -87
- package/dist/access-cli.js.map +1 -1
- package/dist/access-coding-context-resolution.d.ts +1 -1
- package/dist/access-extraction-force-flush.d.ts +10 -10
- package/dist/access-extraction-force-flush.js +30 -29
- package/dist/access-health-types.d.ts +1 -1
- package/dist/access-http-lcm-compaction.d.ts +10 -10
- package/dist/access-http-lifecycle-flush.d.ts +10 -10
- package/dist/access-http-offline-stream.d.ts +10 -10
- package/dist/access-http-offline-stream.js +1 -1
- package/dist/access-http-query.js +30 -29
- package/dist/access-http.d.ts +10 -11
- package/dist/access-http.js +42 -41
- package/dist/access-identity-continuity-surface.d.ts +8 -8
- package/dist/access-identity-continuity-surface.js +30 -29
- package/dist/access-lcm-surface.d.ts +10 -10
- package/dist/access-lcm-surface.js +30 -29
- package/dist/access-mcp.d.ts +10 -10
- package/dist/access-mcp.js +36 -35
- package/dist/access-memory-search-fanout.d.ts +2 -2
- package/dist/{access-namespace-preflight-CWUDwB4M.d.ts → access-namespace-preflight--H6HwN85.d.ts} +1 -1
- package/dist/access-namespace-preflight.d.ts +3 -3
- package/dist/access-namespace-preflight.js +30 -29
- package/dist/access-observe-write-surface.d.ts +10 -10
- package/dist/access-observe-write-surface.js +30 -29
- package/dist/access-offline-manifest.d.ts +8 -8
- package/dist/access-operations-batch.js +31 -30
- package/dist/access-operations.d.ts +13 -13
- package/dist/access-operations.js +35 -34
- package/dist/access-recall-concurrency.d.ts +10 -10
- package/dist/access-recall-concurrency.js +30 -29
- package/dist/access-recall-response.d.ts +10 -10
- package/dist/access-recall-response.js +30 -29
- package/dist/access-recall-surface.d.ts +10 -10
- package/dist/access-recall-surface.js +30 -29
- package/dist/access-schema.d.ts +84 -84
- package/dist/access-service-helpers.d.ts +10 -10
- package/dist/{access-service-CsU-ljFD.d.ts → access-service-loJadYd7.d.ts} +7 -7
- package/dist/access-service.d.ts +10 -10
- package/dist/access-service.js +30 -29
- package/dist/access-surface-catalog.d.ts +10 -10
- package/dist/access-wearables-meetings-surface.d.ts +3 -3
- package/dist/action-confidence.d.ts +1 -1
- package/dist/active-memory-bridge.d.ts +1 -1
- package/dist/active-recall.d.ts +1 -1
- package/dist/adapters/index.js +4 -4
- package/dist/adapters/registry.js +2 -2
- package/dist/ambient-provenance.d.ts +109 -0
- package/dist/ambient-provenance.js +22 -0
- package/dist/ambient-provenance.js.map +1 -0
- package/dist/{auto-sync-UPTUVE4X.js → auto-sync-7O6RP2RT.js} +3 -2
- package/dist/{auto-sync-UPTUVE4X.js.map → auto-sync-7O6RP2RT.js.map} +1 -1
- package/dist/behavior-learner.d.ts +1 -1
- package/dist/behavior-signals.d.ts +1 -1
- package/dist/bootstrap.d.ts +8 -8
- package/dist/briefing.d.ts +2 -2
- package/dist/briefing.js +6 -5
- package/dist/buffer-surprise-report.d.ts +1 -1
- package/dist/buffer-turn-helpers.d.ts +1 -1
- package/dist/buffer-turn-helpers.js +1 -1
- package/dist/buffer.d.ts +2 -2
- package/dist/buffer.js +5 -5
- package/dist/bulk-import/index.d.ts +3 -3
- package/dist/calibration.d.ts +1 -1
- package/dist/capabilities.d.ts +1 -1
- package/dist/{catalog-bctMURhN.d.ts → catalog-Iwbk9h5E.d.ts} +1 -1
- package/dist/causal-behavior.d.ts +1 -1
- package/dist/causal-consolidation.d.ts +1 -1
- package/dist/causal-consolidation.js +7 -6
- package/dist/causal-consolidation.js.map +1 -1
- package/dist/causal-trajectory-graph.d.ts +1 -1
- package/dist/{chunk-7RZJWZ46.js → chunk-227UFSEQ.js} +5 -5
- package/dist/{chunk-ER7W6H4T.js → chunk-2AD5SXO4.js} +5 -2
- package/dist/chunk-2AD5SXO4.js.map +1 -0
- package/dist/{chunk-XSFHWBQO.js → chunk-2DSUT7DZ.js} +10 -64
- package/dist/{chunk-XSFHWBQO.js.map → chunk-2DSUT7DZ.js.map} +1 -1
- package/dist/{chunk-DZPFMQZ7.js → chunk-3S63QIFQ.js} +1 -1
- package/dist/chunk-3S63QIFQ.js.map +1 -0
- package/dist/{chunk-UQWIKLQK.js → chunk-47J4EDGR.js} +9 -9
- package/dist/{chunk-5SNZSWWR.js → chunk-5LRDM4R7.js} +42 -42
- package/dist/{chunk-7YERSTN7.js → chunk-5R6S4DJZ.js} +7 -7
- package/dist/{chunk-C26TE27X.js → chunk-5VQPZ4GV.js} +3 -3
- package/dist/{chunk-U2VLVBBH.js → chunk-64BHFFKZ.js} +3 -3
- package/dist/{chunk-AJQ57VV3.js → chunk-6H744ZBH.js} +4 -4
- package/dist/chunk-6H744ZBH.js.map +1 -0
- package/dist/{chunk-7CITSYSH.js → chunk-7T4TOGMS.js} +2 -2
- package/dist/{chunk-ZMAYKGPN.js → chunk-7YQ6ESEA.js} +12 -41
- package/dist/chunk-7YQ6ESEA.js.map +1 -0
- package/dist/{chunk-YMAQDHQM.js → chunk-BDNL34CT.js} +2 -2
- package/dist/{chunk-GQL52GQ5.js → chunk-CDKHKZL5.js} +15 -12
- package/dist/chunk-CDKHKZL5.js.map +1 -0
- package/dist/{chunk-WGP57SR3.js → chunk-CK5KOVHW.js} +3 -2
- package/dist/{chunk-WGP57SR3.js.map → chunk-CK5KOVHW.js.map} +1 -1
- package/dist/{chunk-JH6BPLOP.js → chunk-E4FOAENZ.js} +4 -4
- package/dist/{chunk-ZFGZ6PZ2.js → chunk-FULKGK7P.js} +2 -2
- package/dist/{chunk-BGHFOD5A.js → chunk-HJ3SVHUW.js} +3 -3
- package/dist/{chunk-TYISDI6B.js → chunk-HXXTXLKA.js} +2 -2
- package/dist/{chunk-FZP32336.js → chunk-IDE5AR5W.js} +53 -31
- package/dist/chunk-IDE5AR5W.js.map +1 -0
- package/dist/{chunk-7SHJHPTY.js → chunk-ILBLZ5Y5.js} +2 -2
- package/dist/chunk-J7T4MX7P.js +131 -0
- package/dist/chunk-J7T4MX7P.js.map +1 -0
- package/dist/{chunk-DSUAAZZX.js → chunk-JFO5QZ7N.js} +2 -2
- package/dist/{chunk-EJHEWCGQ.js → chunk-KA47C7BF.js} +2 -2
- package/dist/{chunk-NUEQKLNB.js → chunk-KMWYZTIE.js} +2 -2
- package/dist/{chunk-TQ4GD737.js → chunk-L7G72WY4.js} +2 -2
- package/dist/{chunk-CLB32OHM.js → chunk-LI7OE7G6.js} +2 -2
- package/dist/{chunk-TN76AKO3.js → chunk-M2INOSTA.js} +2 -2
- package/dist/{chunk-DYVMXPCF.js → chunk-M32URQXV.js} +665 -614
- package/dist/chunk-M32URQXV.js.map +1 -0
- package/dist/{chunk-WQIHRA5F.js → chunk-N3LL5NEU.js} +2 -2
- package/dist/{chunk-HFPASSFV.js → chunk-P2OTGMTR.js} +2 -2
- package/dist/{chunk-Y7HRYCNW.js → chunk-PFJXPOD4.js} +2 -2
- package/dist/{chunk-MDISBSYA.js → chunk-PKCLQ7KM.js} +43 -143
- package/dist/chunk-PKCLQ7KM.js.map +1 -0
- package/dist/chunk-QW27DOHG.js +84 -0
- package/dist/chunk-QW27DOHG.js.map +1 -0
- package/dist/{chunk-ZI32MKDW.js → chunk-RCU25Z66.js} +32 -35
- package/dist/chunk-RCU25Z66.js.map +1 -0
- package/dist/{chunk-2QSZNTDO.js → chunk-RKNJBZ55.js} +4 -4
- package/dist/{chunk-QCECHYZL.js → chunk-RVO6TCTU.js} +6 -6
- package/dist/{chunk-D3I2MCN7.js → chunk-RVPTS4U5.js} +3 -3
- package/dist/{chunk-W3IC7QOY.js → chunk-RVYVMQK4.js} +3 -3
- package/dist/chunk-S2HLHAZ4.js +16 -0
- package/dist/chunk-S2HLHAZ4.js.map +1 -0
- package/dist/{chunk-2MRHJNWL.js → chunk-ST5IEK3H.js} +2 -2
- package/dist/{chunk-O4KMGRXE.js → chunk-SXWHN7GC.js} +2 -2
- package/dist/{chunk-KXEFRMCF.js → chunk-T6JRMVOV.js} +2 -2
- package/dist/{chunk-R5RFK3CB.js → chunk-U6JGQ37L.js} +2 -2
- package/dist/{chunk-UV72DEZD.js → chunk-UYUYZ4WY.js} +36 -10
- package/dist/chunk-UYUYZ4WY.js.map +1 -0
- package/dist/{chunk-EITZHSX6.js → chunk-V5FE3UAI.js} +2 -2
- package/dist/chunk-VL35ZFSZ.js +102 -0
- package/dist/chunk-VL35ZFSZ.js.map +1 -0
- package/dist/{chunk-NTOIP2E6.js → chunk-W2ZSNIBP.js} +2 -2
- package/dist/{chunk-QVSBTCVP.js → chunk-WHWDBTCJ.js} +2 -2
- package/dist/{chunk-5CEECY6P.js → chunk-WOC6DXP5.js} +3 -3
- package/dist/{chunk-XTAUXTDO.js → chunk-XBMJ35IP.js} +2 -2
- package/dist/{chunk-VOUOLGIP.js → chunk-YRFAYOFQ.js} +11 -13
- package/dist/chunk-YRFAYOFQ.js.map +1 -0
- package/dist/{chunk-P7NGM24P.js → chunk-YWCOJOUI.js} +2 -2
- package/dist/{chunk-6NNNURLK.js → chunk-Z54EM5YZ.js} +4 -4
- package/dist/{chunk-ULVR5KG7.js → chunk-ZDAYWJV6.js} +2 -2
- package/dist/chunk-ZDAYWJV6.js.map +1 -0
- package/dist/{cli-BBHDtG36.d.ts → cli-D_RcqXfZ.d.ts} +5 -5
- package/dist/cli.d.ts +12 -12
- package/dist/cli.js +61 -60
- package/dist/compat/checks.js +1 -1
- package/dist/compounding/engine.d.ts +2 -2
- package/dist/compounding/engine.js +6 -5
- package/dist/compounding/preference-consolidator.d.ts +1 -1
- package/dist/compression-optimizer.d.ts +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/connectors/codex-materialize-runner.d.ts +1 -1
- package/dist/connectors/codex-materialize-runner.js +6 -5
- package/dist/connectors/codex-materialize.d.ts +1 -1
- package/dist/connectors/index.d.ts +1 -1
- package/dist/connectors/index.js +6 -5
- package/dist/consolidation-provenance-check.d.ts +2 -2
- package/dist/consolidation-undo.d.ts +2 -2
- package/dist/contradiction/index.d.ts +2 -2
- package/dist/converge-config.d.ts +1 -1
- package/dist/convergence-refresh.d.ts +2 -2
- package/dist/convergence-refresh.js +8 -7
- package/dist/conversation-index/backend.d.ts +1 -1
- package/dist/conversation-index/backend.js +2 -2
- package/dist/conversation-index/chunker.d.ts +1 -1
- package/dist/conversation-index/faiss-adapter.d.ts +1 -1
- package/dist/conversation-index/indexer.d.ts +1 -1
- package/dist/conversation-index/search.d.ts +1 -1
- package/dist/corpus-watermark.d.ts +1 -1
- package/dist/corpus-watermark.js +17 -16
- package/dist/day-summary.d.ts +1 -1
- package/dist/delinearize.d.ts +1 -1
- package/dist/direct-answer-wiring.d.ts +1 -1
- package/dist/direct-answer.d.ts +1 -1
- package/dist/embedding-fallback.d.ts +1 -1
- package/dist/enrichment/index.d.ts +1 -1
- package/dist/entity-retrieval.d.ts +2 -2
- package/dist/entity-retrieval.js +6 -5
- package/dist/entity-schema.d.ts +1 -1
- package/dist/explicit-capture.d.ts +8 -8
- package/dist/external-wiki-access.d.ts +10 -10
- package/dist/external-wiki-access.js +33 -32
- package/dist/external-wiki-cli.js +4 -90
- package/dist/external-wiki-cli.js.map +1 -1
- package/dist/external-wiki-collection-registration.d.ts +1 -1
- package/dist/external-wiki-collection.d.ts +1 -1
- package/dist/external-wiki-mcp-tools.d.ts +10 -10
- package/dist/external-wiki-search.js +2 -2
- package/dist/external-wiki.d.ts +1 -5
- package/dist/external-wiki.js +1 -3
- package/dist/extraction-error-classification.d.ts +1 -1
- package/dist/extraction-faithfulness.d.ts +1 -1
- package/dist/extraction-judge-telemetry.d.ts +1 -1
- package/dist/extraction-judge-training.d.ts +1 -1
- package/dist/extraction-judge.d.ts +1 -1
- package/dist/extraction-liveness.d.ts +1 -1
- package/dist/extraction-prompt.d.ts +36 -0
- package/dist/extraction-prompt.js +16 -0
- package/dist/extraction-prompt.js.map +1 -0
- package/dist/extraction-source-grounding-rules.d.ts +1 -1
- package/dist/extraction-source-grounding.d.ts +1 -1
- package/dist/extraction.d.ts +6 -14
- package/dist/extraction.js +13 -10
- package/dist/fallback-llm.d.ts +1 -1
- package/dist/{first-start-migration-F2QJD66E.js → first-start-migration-ZSHEFEI3.js} +10 -12
- package/dist/{first-start-migration-F2QJD66E.js.map → first-start-migration-ZSHEFEI3.js.map} +1 -1
- package/dist/graph-dashboard-diff.d.ts +1 -1
- package/dist/graph-dashboard-key.d.ts +1 -1
- package/dist/graph-dashboard-parser.d.ts +1 -1
- package/dist/graph-edge-reinforcement.d.ts +1 -1
- package/dist/graph-snapshot.d.ts +1 -1
- package/dist/graph.d.ts +1 -1
- package/dist/importance.d.ts +1 -1
- package/dist/importers/index.d.ts +1 -1
- package/dist/in-flight-reads.d.ts +1 -1
- package/dist/index.d.ts +701 -697
- package/dist/index.js +133 -128
- package/dist/intent.d.ts +1 -1
- package/dist/lcm/engine.d.ts +1 -1
- package/dist/lcm/engine.js +2 -2
- package/dist/lcm/index.d.ts +1 -1
- package/dist/lcm/index.js +2 -2
- package/dist/lcm/tools.d.ts +1 -1
- package/dist/lifecycle.d.ts +1 -1
- package/dist/live-connectors-runner.d.ts +1 -1
- package/dist/local-llm.d.ts +1 -1
- package/dist/local-model-endpoint.d.ts +1 -1
- package/dist/maintenance/memory-governance.d.ts +1 -1
- package/dist/maintenance/memory-governance.js +6 -5
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -2
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +6 -5
- package/dist/maintenance/rebuild-memory-projection.d.ts +2 -2
- package/dist/maintenance/rebuild-memory-projection.js +7 -6
- package/dist/{maintenance-D2mveyCd.d.ts → maintenance-DQrL93Uu.d.ts} +3 -3
- package/dist/mcp-memory-inspector-app.d.ts +10 -10
- package/dist/memory-action-policy.d.ts +1 -1
- package/dist/memory-cache.d.ts +1 -1
- package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
- package/dist/memory-projection-store.d.ts +1 -1
- package/dist/memory-provenance.d.ts +1 -1
- package/dist/memory-snapshot.d.ts +10 -0
- package/dist/memory-snapshot.js +8 -0
- package/dist/memory-snapshot.js.map +1 -0
- package/dist/memory-worth-outcomes.d.ts +2 -2
- package/dist/models-json.d.ts +1 -1
- package/dist/namespaces/migrate.d.ts +3 -3
- package/dist/namespaces/migrate.js +16 -15
- package/dist/namespaces/principal.d.ts +1 -1
- package/dist/namespaces/search.d.ts +1 -1
- package/dist/namespaces/search.js +9 -9
- package/dist/namespaces/storage.d.ts +3 -3
- package/dist/namespaces/storage.js +6 -5
- package/dist/native-knowledge.d.ts +1 -1
- package/dist/offline-sync-impression-drain.d.ts +1 -1
- package/dist/operator-doctor-corpus.d.ts +1 -1
- package/dist/operator-doctor-corpus.js +18 -17
- package/dist/operator-doctor-replica.d.ts +1 -1
- package/dist/operator-toolkit.d.ts +3 -3
- package/dist/operator-toolkit.js +22 -21
- package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
- package/dist/orchestration/maintenance.d.ts +4 -4
- package/dist/orchestration/maintenance.js +11 -10
- package/dist/{orchestrator-DJYlwiUv.d.ts → orchestrator-LPGegii3.d.ts} +8 -8
- package/dist/orchestrator.d.ts +8 -8
- package/dist/orchestrator.js +93 -89
- package/dist/patterns-cli.d.ts +1 -1
- package/dist/{pipeline-CNjY4wk3.d.ts → pipeline-1h2GpiHP.d.ts} +1 -1
- package/dist/policy-runtime.d.ts +1 -1
- package/dist/proactive-contention.d.ts +1 -1
- package/dist/provenance.d.ts +1 -1
- package/dist/{qmd-C0UDZidt.d.ts → qmd-UdwoF71D.d.ts} +1 -1
- package/dist/qmd-preflight.d.ts +2 -2
- package/dist/qmd-recall-cache.d.ts +1 -1
- package/dist/qmd.d.ts +2 -2
- package/dist/qmd.js +4 -4
- package/dist/recall-concurrency-config.d.ts +1 -1
- package/dist/recall-disclosure-escalation.d.ts +1 -1
- package/dist/recall-explain-renderer.d.ts +1 -1
- package/dist/recall-explain-renderer.js +3 -3
- package/dist/recall-memory-map.d.ts +1 -1
- package/dist/recall-planner-llm.d.ts +1 -1
- package/dist/recall-state.d.ts +1 -1
- package/dist/recall-tag-filter.d.ts +1 -1
- package/dist/recall-timings.d.ts +1 -1
- package/dist/recall-xray-cli.d.ts +1 -1
- package/dist/recall-xray-cli.js +4 -4
- package/dist/recall-xray-renderer.d.ts +1 -1
- package/dist/recall-xray-renderer.js +3 -3
- package/dist/recall-xray.d.ts +1 -1
- package/dist/recall-xray.js +2 -2
- package/dist/reconcile/cursor.d.ts +1 -1
- package/dist/reconcile/manifest.d.ts +1 -1
- package/dist/reconcile/plan.d.ts +1 -1
- package/dist/replay/normalizers/chatgpt.d.ts +1 -1
- package/dist/replay/normalizers/claude.d.ts +1 -1
- package/dist/replay/normalizers/openclaw.d.ts +1 -1
- package/dist/replay/normalizers/shared.d.ts +1 -1
- package/dist/replay/runner.d.ts +1 -1
- package/dist/replay/types.d.ts +1 -1
- package/dist/replica-divergence.d.ts +1 -1
- package/dist/replica-peers-config.d.ts +1 -1
- package/dist/resolve-auth-token.d.ts +1 -1
- package/dist/retrieval-agents.d.ts +2 -2
- package/dist/retrieval-tiers.d.ts +1 -1
- package/dist/routing/engine.d.ts +1 -1
- package/dist/routing/store.d.ts +1 -1
- package/dist/salvage-envelope.d.ts +1 -1
- package/dist/schemas.d.ts +76 -76
- package/dist/{scope-profiles-BJzp2F5A.d.ts → scope-profiles-APjhSe-w.d.ts} +1 -1
- package/dist/sdk-compat.js.map +1 -1
- package/dist/search/embed-helper.d.ts +1 -1
- package/dist/search/factory.d.ts +1 -1
- package/dist/search/factory.js +8 -8
- package/dist/search/index.d.ts +1 -1
- package/dist/search/index.js +14 -14
- package/dist/search/lancedb-backend.d.ts +1 -1
- package/dist/search/meilisearch-backend.d.ts +1 -1
- package/dist/search/noop-backend.d.ts +1 -1
- package/dist/search/orama-backend.d.ts +1 -1
- package/dist/search/port.d.ts +1 -1
- package/dist/search/remote-backend.d.ts +1 -1
- package/dist/{semantic-consolidation-D4KAZO2G.d.ts → semantic-consolidation-CrySDbk3.d.ts} +1 -1
- package/dist/semantic-consolidation.d.ts +2 -2
- package/dist/semantic-consolidation.js +7 -6
- package/dist/semantic-rule-promotion.js +6 -5
- package/dist/semantic-rule-verifier.d.ts +1 -1
- package/dist/semantic-rule-verifier.js +6 -5
- package/dist/{service-BeDxSqE-.d.ts → service-DJ0LDyuN.d.ts} +2 -2
- package/dist/session-observer-bands.d.ts +1 -1
- package/dist/session-observer-state.d.ts +1 -1
- package/dist/shared-context/manager.d.ts +9 -9
- package/dist/signal.d.ts +1 -1
- package/dist/source-agent-qualifier.d.ts +4 -1
- package/dist/source-agent-qualifier.js +10 -9
- package/dist/{storage-DfjxusTE.d.ts → storage-y340tYKb.d.ts} +5 -2
- package/dist/storage.d.ts +2 -2
- package/dist/storage.js +5 -4
- package/dist/summarizer.d.ts +1 -1
- package/dist/summary-snapshot.d.ts +1 -1
- package/dist/temporal-supersession.d.ts +2 -2
- package/dist/temporal-timeline-recall.d.ts +1 -1
- package/dist/temporal-validity.d.ts +1 -1
- package/dist/threading.d.ts +1 -1
- package/dist/tier-migration.d.ts +2 -2
- package/dist/tier-migration.js +1 -1
- package/dist/tier-routing.d.ts +1 -1
- package/dist/topics.d.ts +1 -1
- package/dist/transcript.d.ts +1 -1
- package/dist/transfer/types.d.ts +66 -66
- package/dist/trust-score-stage.d.ts +1 -1
- package/dist/trust-score.d.ts +1 -1
- package/dist/{types-yX_FwERf.d.ts → types-D_Au9qJO.d.ts} +13 -2
- package/dist/types.d.ts +1 -1
- package/dist/types.js +1 -1
- package/dist/utility-runtime.d.ts +1 -1
- package/dist/verified-recall.js +6 -5
- package/dist/write-envelope.d.ts +1 -1
- package/package.json +2 -12
- package/src/access-http-offline-stream.ts +1 -0
- package/src/access-http.ts +0 -57
- package/src/access-operations-batch.ts +1 -1
- package/src/access-service-observe-lcm-parity.test.ts +45 -20
- package/src/access-service.ts +3 -4
- package/src/ambient-provenance.test.ts +510 -0
- package/src/ambient-provenance.ts +229 -0
- package/src/buffer-turn-helpers.ts +17 -1
- package/src/compat/checks.test.ts +45 -1
- package/src/compat/checks.ts +16 -16
- package/src/external-wiki-cli.ts +28 -20
- package/src/external-wiki-search.test.ts +68 -2
- package/src/external-wiki.ts +12 -38
- package/src/extraction-prompt.ts +142 -0
- package/src/extraction.ts +37 -148
- package/src/index.ts +1 -5
- package/src/maintenance/first-start-migration.ts +11 -11
- package/src/meetings/memory-gen.test.ts +51 -0
- package/src/meetings/memory-gen.ts +36 -8
- package/src/meetings/summary-extractor.ts +4 -2
- package/src/memory-snapshot.ts +15 -0
- package/src/orchestration/recall-internal.ts +5 -148
- package/src/orchestration/recall-profile-storage.ts +194 -0
- package/src/orchestration/recall-search-pipeline.ts +13 -182
- package/src/orchestration/recall-search-prefilter.ts +254 -0
- package/src/orchestration/session-context.ts +1 -1
- package/src/orchestrator.ts +1 -1
- package/src/sdk-compat.ts +2 -4
- package/src/source-agent-qualifier.ts +3 -0
- package/src/storage-contract/cache-coherence.test.ts +99 -0
- package/src/storage-fact-hash-index-defer.test.ts +14 -7
- package/src/storage.ts +47 -48
- package/src/testing/subjects/first-start-tier-migration.test.ts +75 -0
- package/src/testing/subjects/recall-profile-storage.test.ts +362 -0
- package/src/testing/subjects/recall-search-prefilter.test.ts +365 -0
- package/src/tier-migration.ts +10 -12
- package/src/types.ts +2 -2
- package/src/wearables/memory-gen.test.ts +82 -0
- package/src/wearables/memory-gen.ts +54 -5
- package/src/wearables/trust.ts +19 -2
- package/dist/chunk-AJQ57VV3.js.map +0 -1
- package/dist/chunk-DYVMXPCF.js.map +0 -1
- package/dist/chunk-DZPFMQZ7.js.map +0 -1
- package/dist/chunk-ER7W6H4T.js.map +0 -1
- package/dist/chunk-FZP32336.js.map +0 -1
- package/dist/chunk-GQL52GQ5.js.map +0 -1
- package/dist/chunk-MDISBSYA.js.map +0 -1
- package/dist/chunk-ULVR5KG7.js.map +0 -1
- package/dist/chunk-UV72DEZD.js.map +0 -1
- package/dist/chunk-VOUOLGIP.js.map +0 -1
- package/dist/chunk-ZI32MKDW.js.map +0 -1
- package/dist/chunk-ZMAYKGPN.js.map +0 -1
- package/dist/legacy-hook-compat.d.ts +0 -3
- package/dist/legacy-hook-compat.js +0 -36
- package/dist/legacy-hook-compat.js.map +0 -1
- package/src/legacy-hook-compat.test.ts +0 -20
- package/src/legacy-hook-compat.ts +0 -45
- /package/dist/{chunk-7RZJWZ46.js.map → chunk-227UFSEQ.js.map} +0 -0
- /package/dist/{chunk-UQWIKLQK.js.map → chunk-47J4EDGR.js.map} +0 -0
- /package/dist/{chunk-5SNZSWWR.js.map → chunk-5LRDM4R7.js.map} +0 -0
- /package/dist/{chunk-7YERSTN7.js.map → chunk-5R6S4DJZ.js.map} +0 -0
- /package/dist/{chunk-C26TE27X.js.map → chunk-5VQPZ4GV.js.map} +0 -0
- /package/dist/{chunk-U2VLVBBH.js.map → chunk-64BHFFKZ.js.map} +0 -0
- /package/dist/{chunk-7CITSYSH.js.map → chunk-7T4TOGMS.js.map} +0 -0
- /package/dist/{chunk-YMAQDHQM.js.map → chunk-BDNL34CT.js.map} +0 -0
- /package/dist/{chunk-JH6BPLOP.js.map → chunk-E4FOAENZ.js.map} +0 -0
- /package/dist/{chunk-ZFGZ6PZ2.js.map → chunk-FULKGK7P.js.map} +0 -0
- /package/dist/{chunk-BGHFOD5A.js.map → chunk-HJ3SVHUW.js.map} +0 -0
- /package/dist/{chunk-TYISDI6B.js.map → chunk-HXXTXLKA.js.map} +0 -0
- /package/dist/{chunk-7SHJHPTY.js.map → chunk-ILBLZ5Y5.js.map} +0 -0
- /package/dist/{chunk-DSUAAZZX.js.map → chunk-JFO5QZ7N.js.map} +0 -0
- /package/dist/{chunk-EJHEWCGQ.js.map → chunk-KA47C7BF.js.map} +0 -0
- /package/dist/{chunk-NUEQKLNB.js.map → chunk-KMWYZTIE.js.map} +0 -0
- /package/dist/{chunk-TQ4GD737.js.map → chunk-L7G72WY4.js.map} +0 -0
- /package/dist/{chunk-CLB32OHM.js.map → chunk-LI7OE7G6.js.map} +0 -0
- /package/dist/{chunk-TN76AKO3.js.map → chunk-M2INOSTA.js.map} +0 -0
- /package/dist/{chunk-WQIHRA5F.js.map → chunk-N3LL5NEU.js.map} +0 -0
- /package/dist/{chunk-HFPASSFV.js.map → chunk-P2OTGMTR.js.map} +0 -0
- /package/dist/{chunk-Y7HRYCNW.js.map → chunk-PFJXPOD4.js.map} +0 -0
- /package/dist/{chunk-2QSZNTDO.js.map → chunk-RKNJBZ55.js.map} +0 -0
- /package/dist/{chunk-QCECHYZL.js.map → chunk-RVO6TCTU.js.map} +0 -0
- /package/dist/{chunk-D3I2MCN7.js.map → chunk-RVPTS4U5.js.map} +0 -0
- /package/dist/{chunk-W3IC7QOY.js.map → chunk-RVYVMQK4.js.map} +0 -0
- /package/dist/{chunk-2MRHJNWL.js.map → chunk-ST5IEK3H.js.map} +0 -0
- /package/dist/{chunk-O4KMGRXE.js.map → chunk-SXWHN7GC.js.map} +0 -0
- /package/dist/{chunk-KXEFRMCF.js.map → chunk-T6JRMVOV.js.map} +0 -0
- /package/dist/{chunk-R5RFK3CB.js.map → chunk-U6JGQ37L.js.map} +0 -0
- /package/dist/{chunk-EITZHSX6.js.map → chunk-V5FE3UAI.js.map} +0 -0
- /package/dist/{chunk-NTOIP2E6.js.map → chunk-W2ZSNIBP.js.map} +0 -0
- /package/dist/{chunk-QVSBTCVP.js.map → chunk-WHWDBTCJ.js.map} +0 -0
- /package/dist/{chunk-5CEECY6P.js.map → chunk-WOC6DXP5.js.map} +0 -0
- /package/dist/{chunk-XTAUXTDO.js.map → chunk-XBMJ35IP.js.map} +0 -0
- /package/dist/{chunk-P7NGM24P.js.map → chunk-YWCOJOUI.js.map} +0 -0
- /package/dist/{chunk-6NNNURLK.js.map → chunk-Z54EM5YZ.js.map} +0 -0
|
@@ -112,9 +112,16 @@ function normalizeCatalogPath(target, config, base) {
|
|
|
112
112
|
return null;
|
|
113
113
|
}
|
|
114
114
|
const pagesDir = path.posix.normalize(config.pagesDir);
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
115
|
+
let relative;
|
|
116
|
+
if (base === "index") {
|
|
117
|
+
const baseDir = path.posix.dirname(config.indexFile);
|
|
118
|
+
const rootRelativeTarget = path.posix.normalize(path.posix.join(baseDir, withoutFragment));
|
|
119
|
+
relative = path.posix.relative(pagesDir, rootRelativeTarget);
|
|
120
|
+
} else {
|
|
121
|
+
const pagesPrefix = pagesDir === "." ? "" : `${pagesDir}/`;
|
|
122
|
+
const stripped = pagesPrefix.length > 0 && withoutFragment.startsWith(pagesPrefix) ? withoutFragment.slice(pagesPrefix.length) : withoutFragment;
|
|
123
|
+
relative = path.posix.normalize(stripped);
|
|
124
|
+
}
|
|
118
125
|
if (relative === ".." || relative.startsWith("../") || path.posix.isAbsolute(relative) || relative === "." || !relative.toLowerCase().endsWith(".md")) {
|
|
119
126
|
return null;
|
|
120
127
|
}
|
|
@@ -305,47 +312,11 @@ async function readExternalWikiPage(config, relativePath, maxBytes = DEFAULT_MAX
|
|
|
305
312
|
bytes: page.bytes
|
|
306
313
|
};
|
|
307
314
|
}
|
|
308
|
-
async function runExternalWikiCliCommand(roots, rest, io) {
|
|
309
|
-
const { searchExternalWikis } = await import("./external-wiki-search.js");
|
|
310
|
-
const query = rest.filter((a) => !a.startsWith("-")).join(" ").trim();
|
|
311
|
-
if (!query) {
|
|
312
|
-
io.stderr.write("external-wiki: provide a search query\n");
|
|
313
|
-
return 1;
|
|
314
|
-
}
|
|
315
|
-
const enabled = roots.filter((r) => r.enabled !== false);
|
|
316
|
-
if (enabled.length === 0) {
|
|
317
|
-
io.stderr.write("external-wiki: no enabled wiki roots configured\n");
|
|
318
|
-
return 1;
|
|
319
|
-
}
|
|
320
|
-
try {
|
|
321
|
-
const result = await searchExternalWikis(enabled, { query });
|
|
322
|
-
if (result.hits.length === 0) {
|
|
323
|
-
io.stdout.write("No results.\n");
|
|
324
|
-
return 0;
|
|
325
|
-
}
|
|
326
|
-
for (const hit of result.hits) {
|
|
327
|
-
io.stdout.write(`[${hit.wikiId}] ${hit.path} (score ${hit.score})
|
|
328
|
-
${hit.snippet}
|
|
329
|
-
|
|
330
|
-
`);
|
|
331
|
-
}
|
|
332
|
-
if (result.degradedWikiIds.length > 0) {
|
|
333
|
-
io.stderr.write(`Warning: degraded roots: ${result.degradedWikiIds.join(", ")}
|
|
334
|
-
`);
|
|
335
|
-
}
|
|
336
|
-
return 0;
|
|
337
|
-
} catch (error) {
|
|
338
|
-
io.stderr.write(`external-wiki: ${error instanceof Error ? error.message : "search failed"}
|
|
339
|
-
`);
|
|
340
|
-
return 1;
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
315
|
|
|
344
316
|
export {
|
|
345
317
|
validateExternalWikiLayout,
|
|
346
318
|
parseExternalWikiCatalog,
|
|
347
319
|
loadExternalWikiCatalog,
|
|
348
|
-
readExternalWikiPage
|
|
349
|
-
runExternalWikiCliCommand
|
|
320
|
+
readExternalWikiPage
|
|
350
321
|
};
|
|
351
|
-
//# sourceMappingURL=chunk-
|
|
322
|
+
//# sourceMappingURL=chunk-7YQ6ESEA.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/external-wiki.ts"],"sourcesContent":["import { constants } from \"node:fs\";\nimport { open, opendir, realpath, stat } from \"node:fs/promises\";\nimport type { FileHandle } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { ExternalWikiRoot } from \"./external-wiki-config.js\";\n\nconst DEFAULT_MAX_INDEX_BYTES = 1_048_576;\nconst DEFAULT_MAX_PAGE_BYTES = 1_048_576;\nconst DEFAULT_MAX_CATALOG_ENTRIES = 10_000;\nconst DEFAULT_MAX_DIRECTORY_DEPTH = 32;\nconst MAX_READ_BYTES = 16_777_216;\nconst MAX_CATALOG_ENTRIES = 100_000;\nconst MAX_DIRECTORY_DEPTH = 128;\nconst MIN_VISITED_ENTRIES = 100;\nconst MAX_VISITED_ENTRIES = 1_000_000;\n\nexport type { ExternalWikiRoot } from \"./external-wiki-config.js\";\n\nexport interface ExternalWikiLayout {\n rootDir: string;\n pagesDir: string;\n indexFile: string;\n indexPresent: boolean;\n rawDir?: string;\n outputsDir?: string;\n}\n\nexport interface ExternalWikiCatalogEntry {\n title: string;\n path: string;\n indexBlurb?: string;\n indexLine?: number;\n}\n\nexport interface ExternalWikiCatalog {\n wikiId: string;\n indexPresent: boolean;\n entries: ExternalWikiCatalogEntry[];\n}\n\nexport interface ExternalWikiCatalogLimits {\n maxIndexBytes?: number;\n maxEntries?: number;\n maxDepth?: number;\n}\n\nexport interface ExternalWikiPage {\n wikiId: string;\n path: string;\n title: string;\n content: string;\n bytes: number;\n}\n\nfunction assertPositiveInteger(value: number, keyName: string, maximum?: number): void {\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new Error(`${keyName} must be a positive integer`);\n }\n if (maximum !== undefined && value > maximum) {\n throw new Error(`${keyName} must be at most ${maximum}`);\n }\n}\n\nfunction isInside(baseDir: string, candidate: string): boolean {\n const relative = path.relative(baseDir, candidate);\n return relative === \"\" || (relative !== \"..\" && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative));\n}\n\nfunction resolveInside(baseDir: string, relativePath: string, keyName: string): string {\n const resolved = path.resolve(baseDir, relativePath);\n if (!isInside(baseDir, resolved) || resolved === baseDir) {\n throw new Error(`${keyName} must stay within ${baseDir}`);\n }\n return resolved;\n}\n\nasync function requireDirectory(candidate: string, rootDir: string, description: string): Promise<string> {\n let canonical: string;\n try {\n canonical = await realpath(candidate);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n throw new Error(`${description} does not exist: ${candidate}`);\n }\n throw error;\n }\n if (!isInside(rootDir, canonical)) throw new Error(`${description} escapes rootDir`);\n if (!(await stat(canonical)).isDirectory()) throw new Error(`${description} is not a directory`);\n return canonical;\n}\n\nasync function optionalDirectory(rootDir: string, name: \"raw\" | \"outputs\"): Promise<string | undefined> {\n const candidate = path.join(rootDir, name);\n let canonical: string;\n try {\n canonical = await realpath(candidate);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return undefined;\n throw error;\n }\n if (!isInside(rootDir, canonical)) throw new Error(`${name} directory escapes rootDir`);\n if (!(await stat(canonical)).isDirectory()) throw new Error(`${name} path is not a directory`);\n return canonical;\n}\n\nasync function optionalIndexFile(candidate: string, rootDir: string): Promise<string | undefined> {\n let canonical: string;\n try {\n canonical = await realpath(candidate);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return undefined;\n throw error;\n }\n if (!isInside(rootDir, canonical)) throw new Error(\"catalog index escapes rootDir\");\n if (!(await stat(canonical)).isFile()) throw new Error(\"catalog index is not a file\");\n return canonical;\n}\n\nexport async function validateExternalWikiLayout(config: ExternalWikiRoot): Promise<ExternalWikiLayout> {\n let rootDir: string;\n try {\n rootDir = await realpath(config.rootDir);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n throw new Error(`external wiki root does not exist: ${config.rootDir}`);\n }\n throw error;\n }\n if (!(await stat(rootDir)).isDirectory()) throw new Error(\"external wiki root is not a directory\");\n\n const pagesDir = await requireDirectory(\n resolveInside(rootDir, config.pagesDir, \"pages directory\"),\n rootDir,\n \"pages directory\"\n );\n const configuredIndexFile = resolveInside(rootDir, config.indexFile, \"catalog index\");\n const canonicalIndexFile = await optionalIndexFile(configuredIndexFile, rootDir);\n const [rawDir, outputsDir] = await Promise.all([\n optionalDirectory(rootDir, \"raw\"),\n optionalDirectory(rootDir, \"outputs\"),\n ]);\n\n return {\n rootDir,\n pagesDir,\n indexFile: canonicalIndexFile ?? configuredIndexFile,\n indexPresent: canonicalIndexFile !== undefined,\n ...(rawDir === undefined ? {} : { rawDir }),\n ...(outputsDir === undefined ? {} : { outputsDir }),\n };\n}\n\ntype CatalogPathBase = \"index\" | \"pages\";\n\nfunction normalizeCatalogPath(target: string, config: ExternalWikiRoot, base: CatalogPathBase): string | null {\n let decoded: string;\n try {\n decoded = decodeURIComponent(target.trim());\n } catch {\n return null;\n }\n const withoutFragment = decoded.split(/[?#]/, 1)[0] ?? \"\";\n if (\n withoutFragment.length === 0 ||\n withoutFragment.startsWith(\"/\") ||\n withoutFragment.includes(\"\\\\\") ||\n /^[a-z][a-z0-9+.-]*:/i.test(withoutFragment)\n ) {\n return null;\n }\n\n const pagesDir = path.posix.normalize(config.pagesDir);\n let relative: string;\n if (base === \"index\") {\n const baseDir = path.posix.dirname(config.indexFile);\n const rootRelativeTarget = path.posix.normalize(path.posix.join(baseDir, withoutFragment));\n relative = path.posix.relative(pagesDir, rootRelativeTarget);\n } else {\n const pagesPrefix = pagesDir === \".\" ? \"\" : `${pagesDir}/`;\n const stripped = pagesPrefix.length > 0 && withoutFragment.startsWith(pagesPrefix)\n ? withoutFragment.slice(pagesPrefix.length)\n : withoutFragment;\n relative = path.posix.normalize(stripped);\n }\n if (\n relative === \"..\" ||\n relative.startsWith(\"../\") ||\n path.posix.isAbsolute(relative) ||\n relative === \".\" ||\n !relative.toLowerCase().endsWith(\".md\")\n ) {\n return null;\n }\n return relative;\n}\n\nfunction catalogBlurb(line: string, matchEnd: number): string | undefined {\n const blurb = line\n .slice(matchEnd)\n .trim()\n .replace(/^[-:|]\\s*/, \"\")\n .trim();\n return blurb.length === 0 ? undefined : blurb;\n}\n\nexport function parseExternalWikiCatalog(\n content: string,\n config: ExternalWikiRoot,\n limits: Pick<ExternalWikiCatalogLimits, \"maxEntries\"> = {}\n): ExternalWikiCatalogEntry[] {\n const maxEntries = limits.maxEntries ?? DEFAULT_MAX_CATALOG_ENTRIES;\n assertPositiveInteger(maxEntries, \"maxEntries\", MAX_CATALOG_ENTRIES);\n const entries: ExternalWikiCatalogEntry[] = [];\n const seenPaths = new Set<string>();\n\n for (const [lineIndex, line] of content.split(/\\r?\\n/).entries()) {\n const markdownMatch = /\\[([^\\]]+)]\\(([^)\\s]+)(?:\\s+\"[^\"]*\")?\\)/.exec(line);\n const wikiMatch = /\\[\\[([^\\]|]+)(?:\\|([^\\]]+))?]]/.exec(line);\n let target: string;\n let title: string;\n let matchEnd: number;\n let pathBase: CatalogPathBase;\n if (markdownMatch) {\n title = markdownMatch[1]?.trim() ?? \"\";\n target = markdownMatch[2]?.trim() ?? \"\";\n matchEnd = (markdownMatch.index ?? 0) + markdownMatch[0].length;\n pathBase = \"index\";\n } else if (wikiMatch) {\n const wikiTarget = wikiMatch[1]?.trim() ?? \"\";\n title = wikiMatch[2]?.trim() || humanizePagePath(wikiTarget);\n target = wikiTarget.toLowerCase().endsWith(\".md\") ? wikiTarget : `${wikiTarget}.md`;\n matchEnd = (wikiMatch.index ?? 0) + wikiMatch[0].length;\n pathBase = \"pages\";\n } else {\n continue;\n }\n\n const pagePath = normalizeCatalogPath(target, config, pathBase);\n if (!pagePath || title.length === 0 || seenPaths.has(pagePath)) continue;\n if (entries.length >= maxEntries) {\n throw new Error(`catalog contains more than ${maxEntries} entries`);\n }\n seenPaths.add(pagePath);\n const indexBlurb = catalogBlurb(line, matchEnd);\n entries.push({\n title,\n path: pagePath,\n ...(indexBlurb === undefined ? {} : { indexBlurb }),\n indexLine: lineIndex + 1,\n });\n }\n return entries;\n}\n\ninterface BoundedUtf8Read {\n content: string;\n bytes: number;\n}\n\nasync function canonicalOpenedFile(handle: FileHandle, filePath: string, displayPath: string): Promise<string> {\n if (process.platform === \"linux\") {\n const descriptorPath = await realpath(`/proc/self/fd/${handle.fd}`).catch(() => undefined);\n if (descriptorPath !== undefined) return descriptorPath;\n }\n\n let canonical: string;\n try {\n canonical = await realpath(filePath);\n } catch {\n throw new Error(`${displayPath} changed while being opened`);\n }\n const [openedStat, pathStat] = await Promise.all([handle.stat(), stat(canonical)]);\n if (openedStat.dev !== pathStat.dev || openedStat.ino !== pathStat.ino) {\n throw new Error(`${displayPath} changed while being opened`);\n }\n return canonical;\n}\n\nasync function readBoundedUtf8(\n filePath: string,\n allowedRoot: string,\n maxBytes: number,\n displayPath: string\n): Promise<BoundedUtf8Read> {\n assertPositiveInteger(maxBytes, \"maxBytes\", MAX_READ_BYTES);\n const handle = await open(filePath, constants.O_RDONLY | constants.O_NOFOLLOW);\n try {\n const openedStat = await handle.stat();\n if (!openedStat.isFile()) throw new Error(`${displayPath} is not a file`);\n const canonical = await canonicalOpenedFile(handle, filePath, displayPath);\n if (!isInside(allowedRoot, canonical)) {\n throw new Error(`${displayPath} escapes configured root`);\n }\n const buffer = Buffer.allocUnsafe(maxBytes + 1);\n const { bytesRead } = await handle.read(buffer, 0, buffer.length, 0);\n if (bytesRead > maxBytes) throw new Error(`${displayPath} exceeds ${maxBytes} bytes`);\n let content: string;\n try {\n content = new TextDecoder(\"utf-8\", { fatal: true }).decode(buffer.subarray(0, bytesRead));\n } catch {\n throw new Error(`${displayPath} is not valid UTF-8`);\n }\n return { content, bytes: bytesRead };\n } finally {\n await handle.close();\n }\n}\n\nfunction humanizePagePath(pagePath: string): string {\n const stem = path.posix.basename(pagePath, path.posix.extname(pagePath));\n const words = stem.replace(/[-_]+/g, \" \").trim();\n return words.length === 0 ? stem : `${words[0]?.toUpperCase() ?? \"\"}${words.slice(1)}`;\n}\n\nasync function listMarkdownPages(\n pagesDir: string,\n maxEntries: number,\n maxDepth: number\n): Promise<ExternalWikiCatalogEntry[]> {\n assertPositiveInteger(maxEntries, \"maxEntries\", MAX_CATALOG_ENTRIES);\n assertPositiveInteger(maxDepth, \"maxDepth\", MAX_DIRECTORY_DEPTH);\n const paths: string[] = [];\n const maxVisitedEntries = Math.min(MAX_VISITED_ENTRIES, Math.max(MIN_VISITED_ENTRIES, maxEntries * 100));\n let visitedEntries = 0;\n const walk = async (directory: string, relativeDirectory: string, depth: number): Promise<void> => {\n if (depth > maxDepth) throw new Error(`pages directory exceeds maxDepth ${maxDepth}`);\n const dir = await opendir(directory);\n for await (const entry of dir) {\n visitedEntries += 1;\n if (visitedEntries > maxVisitedEntries) {\n throw new Error(`pages directory contains more than ${maxVisitedEntries} filesystem entries`);\n }\n const relativePath = relativeDirectory ? path.posix.join(relativeDirectory, entry.name) : entry.name;\n if (entry.isDirectory()) {\n await walk(path.join(directory, entry.name), relativePath, depth + 1);\n } else if (entry.isFile() && entry.name.toLowerCase().endsWith(\".md\")) {\n if (paths.length >= maxEntries) {\n throw new Error(`pages directory contains more than ${maxEntries} markdown files`);\n }\n paths.push(relativePath);\n }\n }\n };\n await walk(pagesDir, \"\", 1);\n return paths\n .sort((left, right) => left.localeCompare(right))\n .map((pagePath) => ({\n title: humanizePagePath(pagePath),\n path: pagePath,\n }));\n}\n\nfunction assertWikiEnabled(config: ExternalWikiRoot): void {\n if (!config.enabled) throw new Error(`external wiki \"${config.id}\" is disabled`);\n}\n\nexport async function loadExternalWikiCatalog(\n config: ExternalWikiRoot,\n limits: ExternalWikiCatalogLimits = {}\n): Promise<ExternalWikiCatalog> {\n assertWikiEnabled(config);\n const maxIndexBytes = limits.maxIndexBytes ?? DEFAULT_MAX_INDEX_BYTES;\n const maxEntries = limits.maxEntries ?? DEFAULT_MAX_CATALOG_ENTRIES;\n const maxDepth = limits.maxDepth ?? DEFAULT_MAX_DIRECTORY_DEPTH;\n assertPositiveInteger(maxEntries, \"maxEntries\", MAX_CATALOG_ENTRIES);\n assertPositiveInteger(maxDepth, \"maxDepth\", MAX_DIRECTORY_DEPTH);\n const layout = await validateExternalWikiLayout(config);\n const entries = layout.indexPresent\n ? parseExternalWikiCatalog(\n (await readBoundedUtf8(layout.indexFile, layout.rootDir, maxIndexBytes, config.indexFile)).content,\n config,\n { maxEntries }\n )\n : await listMarkdownPages(layout.pagesDir, maxEntries, maxDepth);\n return { wikiId: config.id, indexPresent: layout.indexPresent, entries };\n}\n\nfunction normalizePagePath(relativePath: string): string {\n if (relativePath.includes(\"\\\\\")) {\n throw new Error(\"page path must use POSIX separators\");\n }\n const normalized = path.posix.normalize(relativePath);\n if (normalized === \".\" || normalized === \"..\" || normalized.startsWith(\"../\") || normalized.startsWith(\"/\")) {\n throw new Error(\"page path must stay within the pages directory\");\n }\n if (!normalized.toLowerCase().endsWith(\".md\")) {\n throw new Error(\"page path must end in .md\");\n }\n return normalized;\n}\n\nfunction pageTitle(content: string, pagePath: string): string {\n const heading = /^#\\s+(.+?)\\s*$/m.exec(content)?.[1]?.trim();\n return heading && heading.length > 0 ? heading : humanizePagePath(pagePath);\n}\n\nexport async function readExternalWikiPage(\n config: ExternalWikiRoot,\n relativePath: string,\n maxBytes = DEFAULT_MAX_PAGE_BYTES\n): Promise<ExternalWikiPage> {\n assertWikiEnabled(config);\n const pagePath = normalizePagePath(relativePath);\n const layout = await validateExternalWikiLayout(config);\n const candidate = resolveInside(layout.pagesDir, pagePath, \"page path\");\n let canonical: string;\n try {\n canonical = await realpath(candidate);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n throw new Error(`external wiki page does not exist: ${pagePath}`);\n }\n throw error;\n }\n if (!isInside(layout.pagesDir, canonical)) {\n throw new Error(\"page path must stay within the pages directory\");\n }\n if (!(await stat(canonical)).isFile()) throw new Error(`external wiki page is not a file: ${pagePath}`);\n const page = await readBoundedUtf8(canonical, layout.pagesDir, maxBytes, pagePath);\n return {\n wikiId: config.id,\n path: pagePath,\n title: pageTitle(page.content, pagePath),\n content: page.content,\n bytes: page.bytes,\n };\n}\n"],"mappings":"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","names":[]}
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
} from "./chunk-2DQ2XREU.js";
|
|
7
7
|
import {
|
|
8
8
|
compareEntityTimestamps
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-IDE5AR5W.js";
|
|
10
10
|
import {
|
|
11
11
|
normalizeEntityName
|
|
12
12
|
} from "./chunk-YXZG5TVN.js";
|
|
@@ -862,4 +862,4 @@ export {
|
|
|
862
862
|
entityIndexVersion,
|
|
863
863
|
entityRecentTranscriptLookbackHours
|
|
864
864
|
};
|
|
865
|
-
//# sourceMappingURL=chunk-
|
|
865
|
+
//# sourceMappingURL=chunk-BDNL34CT.js.map
|
|
@@ -8,8 +8,7 @@ import {
|
|
|
8
8
|
// src/compat/checks.ts
|
|
9
9
|
import { access, readFile } from "fs/promises";
|
|
10
10
|
import path from "path";
|
|
11
|
-
var
|
|
12
|
-
var REQUIRED_HOOKS_NEW = ["before_prompt_build", "agent_end"];
|
|
11
|
+
var REQUIRED_HOOKS = ["before_prompt_build", "agent_end"];
|
|
13
12
|
var OPENCLAW_REMNIC_PLUGIN_ID = "openclaw-remnic";
|
|
14
13
|
var OPENCLAW_REMNIC_LEGACY_PLUGIN_ID = "openclaw-engram";
|
|
15
14
|
function isSafeCommandToken(command) {
|
|
@@ -578,15 +577,12 @@ async function runCompatChecks(options) {
|
|
|
578
577
|
const indexRaw = await readFile(indexPath, "utf-8");
|
|
579
578
|
const structuralSource = stripCommentsAndStrings(indexRaw);
|
|
580
579
|
const hooks = parseHookRegistrations(indexRaw);
|
|
581
|
-
const
|
|
582
|
-
const missingNew = REQUIRED_HOOKS_NEW.filter((hook) => !hooks.has(hook));
|
|
580
|
+
const missingHooks = REQUIRED_HOOKS.filter((hook) => !hooks.has(hook));
|
|
583
581
|
const hasMemoryPromptSection = hasMemoryPromptSectionRegistration(structuralSource);
|
|
584
|
-
const
|
|
585
|
-
const missingNewAdj = hasMemoryPromptSection ? missingNew.filter((h) => h !== "before_prompt_build") : missingNew;
|
|
586
|
-
const missingHooks = missingNewAdj.length <= missingLegacyAdj.length ? missingNewAdj : missingLegacyAdj;
|
|
582
|
+
const missingRequiredHooks = hasMemoryPromptSection ? missingHooks.filter((hook) => hook !== "before_prompt_build") : missingHooks;
|
|
587
583
|
const hasGatewayStartHook = hooks.has("gateway_start");
|
|
588
584
|
const hasServiceStart = hasServiceStartRegistration(structuralSource);
|
|
589
|
-
if (
|
|
585
|
+
if (missingRequiredHooks.length === 0 && (hasGatewayStartHook || hasServiceStart)) {
|
|
590
586
|
checks.push({
|
|
591
587
|
id: "hook-registration-core",
|
|
592
588
|
title: "Core hook registration",
|
|
@@ -595,18 +591,25 @@ async function runCompatChecks(options) {
|
|
|
595
591
|
});
|
|
596
592
|
} else {
|
|
597
593
|
const missingParts = [];
|
|
598
|
-
if (
|
|
599
|
-
missingParts.push(`hooks: ${
|
|
594
|
+
if (missingRequiredHooks.length > 0) {
|
|
595
|
+
missingParts.push(`hooks: ${missingRequiredHooks.join(", ")}`);
|
|
600
596
|
}
|
|
601
597
|
if (!hasGatewayStartHook && !hasServiceStart) {
|
|
602
598
|
missingParts.push("startup wiring: gateway_start hook or api.registerService({ start })");
|
|
603
599
|
}
|
|
600
|
+
const remediationParts = [];
|
|
601
|
+
if (missingRequiredHooks.length > 0) {
|
|
602
|
+
remediationParts.push(`registers ${missingRequiredHooks.join(", ")}`);
|
|
603
|
+
}
|
|
604
|
+
if (!hasGatewayStartHook && !hasServiceStart) {
|
|
605
|
+
remediationParts.push("registers gateway_start or api.registerService({ start })");
|
|
606
|
+
}
|
|
604
607
|
checks.push({
|
|
605
608
|
id: "hook-registration-core",
|
|
606
609
|
title: "Core hook registration",
|
|
607
610
|
level: "error",
|
|
608
611
|
message: `Missing expected registration(s): ${missingParts.join("; ")}`,
|
|
609
|
-
remediation:
|
|
612
|
+
remediation: `Ensure src/index.ts ${remediationParts.join(" and ")}.`
|
|
610
613
|
});
|
|
611
614
|
}
|
|
612
615
|
const cliWired = hasCliRegistration(structuralSource);
|
|
@@ -644,4 +647,4 @@ async function runCompatChecks(options) {
|
|
|
644
647
|
export {
|
|
645
648
|
runCompatChecks
|
|
646
649
|
};
|
|
647
|
-
//# sourceMappingURL=chunk-
|
|
650
|
+
//# sourceMappingURL=chunk-CDKHKZL5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/compat/checks.ts"],"sourcesContent":["import { access, readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { CompatCheckOptions, CompatCheckResult, CompatReport, CompatRunner } from \"./types.js\";\nimport { compareVersions } from \"../version-utils.js\";\nimport { launchProcess } from \"../runtime/child-process.js\";\n\nconst REQUIRED_HOOKS = [\"before_prompt_build\", \"agent_end\"];\nconst OPENCLAW_REMNIC_PLUGIN_ID = \"openclaw-remnic\";\nconst OPENCLAW_REMNIC_LEGACY_PLUGIN_ID = \"openclaw-engram\";\n\nfunction isSafeCommandToken(command: string): boolean {\n return /^[a-zA-Z0-9._-]+$/.test(command);\n}\n\nconst defaultRunner: CompatRunner = {\n async commandExists(command: string): Promise<boolean> {\n if (!isSafeCommandToken(command)) return false;\n const binary = process.platform === \"win32\" ? \"where\" : \"which\";\n const args = [command];\n return new Promise<boolean>((resolve) => {\n const child = launchProcess(binary, args, { stdio: \"ignore\" });\n child.on(\"error\", () => resolve(false));\n child.on(\"close\", (code) => resolve(code === 0));\n });\n },\n};\n\nfunction summarize(checks: CompatCheckResult[]): { ok: number; warn: number; error: number } {\n const out = { ok: 0, warn: 0, error: 0 };\n for (const check of checks) {\n out[check.level] += 1;\n }\n return out;\n}\n\nfunction stripCommentsAndStrings(source: string): string {\n const out: string[] = [];\n let i = 0;\n while (i < source.length) {\n const ch = source[i];\n const next = source[i + 1];\n\n if (ch === \"/\" && next === \"/\") {\n out.push(\" \", \" \");\n i += 2;\n while (i < source.length && source[i] !== \"\\n\") {\n out.push(\" \");\n i += 1;\n }\n continue;\n }\n\n if (ch === \"/\" && next === \"*\") {\n out.push(\" \", \" \");\n i += 2;\n while (i < source.length) {\n const c = source[i];\n const n = source[i + 1];\n out.push(c === \"\\n\" ? \"\\n\" : \" \");\n i += 1;\n if (c === \"*\" && n === \"/\") {\n out.push(\" \");\n i += 1;\n break;\n }\n }\n continue;\n }\n\n if (ch === '\"' || ch === \"'\" || ch === \"`\") {\n const quote = ch;\n out.push(\" \");\n i += 1;\n while (i < source.length) {\n const c = source[i];\n if (c === \"\\\\\") {\n out.push(\" \");\n i += 1;\n if (i < source.length) {\n out.push(source[i] === \"\\n\" ? \"\\n\" : \" \");\n i += 1;\n }\n continue;\n }\n out.push(c === \"\\n\" ? \"\\n\" : \" \");\n i += 1;\n if (c === quote) break;\n }\n continue;\n }\n\n out.push(ch);\n i += 1;\n }\n return out.join(\"\");\n}\n\nfunction parseHookRegistrations(source: string): Set<string> {\n const hooks = new Set<string>();\n let i = 0;\n\n while (i < source.length) {\n const ch = source[i];\n const next = source[i + 1];\n\n if (ch === \"/\" && next === \"/\") {\n i += 2;\n while (i < source.length && source[i] !== \"\\n\") i += 1;\n continue;\n }\n\n if (ch === \"/\" && next === \"*\") {\n i += 2;\n while (i + 1 < source.length) {\n if (source[i] === \"*\" && source[i + 1] === \"/\") {\n i += 2;\n break;\n }\n i += 1;\n }\n continue;\n }\n\n if (ch === '\"' || ch === \"'\" || ch === \"`\") {\n const quote = ch;\n i += 1;\n while (i < source.length) {\n if (source[i] === \"\\\\\") {\n i += 2;\n continue;\n }\n if (source[i] === quote) {\n i += 1;\n break;\n }\n i += 1;\n }\n continue;\n }\n\n if (source.startsWith(\"api.on\", i) && (i === 0 || !/[a-zA-Z0-9_$\\.]/.test(source[i - 1]))) {\n let j = i + \"api.on\".length;\n while (j < source.length && /\\s/.test(source[j])) j += 1;\n if (source[j] !== \"(\") {\n i += 1;\n continue;\n }\n\n j += 1;\n while (j < source.length && /\\s/.test(source[j])) j += 1;\n const quote = source[j];\n if (quote !== '\"' && quote !== \"'\") {\n i += 1;\n continue;\n }\n\n j += 1;\n const start = j;\n while (j < source.length && source[j] !== quote) {\n if (source[j] === \"\\\\\") {\n j += 2;\n } else {\n j += 1;\n }\n }\n if (j < source.length) {\n const hook = source.slice(start, j);\n if (/^[a-z_]+$/.test(hook)) hooks.add(hook);\n i = j + 1;\n continue;\n }\n }\n\n i += 1;\n }\n\n return hooks;\n}\n\nfunction hasServiceStartRegistration(source: string): boolean {\n let i = 0;\n while (i < source.length) {\n const callIndex = source.indexOf(\"api.registerService\", i);\n if (callIndex === -1) return false;\n if (callIndex > 0 && /[a-zA-Z0-9_$\\.]/.test(source[callIndex - 1])) {\n i = callIndex + 1;\n continue;\n }\n\n let cursor = callIndex + \"api.registerService\".length;\n while (cursor < source.length && /\\s/.test(source[cursor])) cursor += 1;\n if (source[cursor] !== \"(\") {\n i = callIndex + 1;\n continue;\n }\n\n cursor += 1;\n while (cursor < source.length && /\\s/.test(source[cursor])) cursor += 1;\n if (source[cursor] !== \"{\") {\n i = callIndex + 1;\n continue;\n }\n\n if (objectLiteralHasTopLevelStart(source, cursor)) return true;\n i = cursor + 1;\n }\n return false;\n}\n\nfunction objectLiteralHasTopLevelStart(source: string, objectStart: number): boolean {\n let depth = 0;\n let i = objectStart;\n while (i < source.length) {\n const ch = source[i];\n if (ch === \"{\") {\n depth += 1;\n i += 1;\n continue;\n }\n if (ch === \"}\") {\n depth -= 1;\n if (depth === 0) return false;\n i += 1;\n continue;\n }\n if (depth === 1 && source.startsWith(\"start\", i)) {\n const before = source[i - 1];\n const after = source[i + \"start\".length];\n if (\n (!before || !/[a-zA-Z0-9_$]/.test(before)) &&\n (!after || !/[a-zA-Z0-9_$]/.test(after))\n ) {\n let cursor = i + \"start\".length;\n while (cursor < source.length && /\\s/.test(source[cursor])) cursor += 1;\n if (source[cursor] === \":\" || source[cursor] === \"(\") return true;\n }\n }\n i += 1;\n }\n return false;\n}\n\nfunction hasCliRegistration(source: string): boolean {\n return /registerCli\\s*\\([^)]*\\borchestrator\\b[^)]*\\)/m.test(source);\n}\n\nfunction parseCurrentNodeVersion(raw: string): [number, number, number] | null {\n const normalized = raw.startsWith(\"v\") ? raw.slice(1) : raw;\n const match = normalized.match(/^(\\d+)\\.(\\d+)\\.(\\d+)/);\n if (!match) return null;\n return [Number(match[1]), Number(match[2]), Number(match[3])];\n}\n\ntype NodeEngineEvaluation =\n | { status: \"satisfied\" }\n | { status: \"unsatisfied\" }\n | { status: \"unsupported\"; reason: string };\n\ntype ComparatorOperator = \">\" | \">=\" | \"<\" | \"<=\" | \"=\";\n\ninterface ParsedRangeVersion {\n version: [number, number, number];\n specifiedParts: number;\n}\n\nfunction parseRangeVersion(raw: string): ParsedRangeVersion | null {\n const match = raw.trim().match(/^v?(\\d+)(?:\\.(\\d+|x|\\*))?(?:\\.(\\d+|x|\\*))?$/i);\n if (!match) return null;\n\n const minor = match[2];\n const patch = match[3];\n if (minor && /^(x|\\*)$/i.test(minor)) {\n return { version: [Number(match[1]), 0, 0], specifiedParts: 1 };\n }\n if (patch && /^(x|\\*)$/i.test(patch)) {\n return {\n version: [Number(match[1]), Number(minor ?? 0), 0],\n specifiedParts: 2,\n };\n }\n\n return {\n version: [Number(match[1]), Number(minor ?? 0), Number(patch ?? 0)],\n specifiedParts: patch ? 3 : minor ? 2 : 1,\n };\n}\n\nfunction upperBoundForPartial(\n parsed: ParsedRangeVersion,\n): [number, number, number] | null {\n if (parsed.specifiedParts === 1) {\n return [parsed.version[0] + 1, 0, 0];\n }\n if (parsed.specifiedParts === 2) {\n return [parsed.version[0], parsed.version[1] + 1, 0];\n }\n return null;\n}\n\nfunction upperBoundForCaret(\n parsed: ParsedRangeVersion,\n): [number, number, number] {\n const [major, minor, patch] = parsed.version;\n if (parsed.specifiedParts === 1) {\n return [major + 1, 0, 0];\n }\n if (major > 0) return [major + 1, 0, 0];\n if (parsed.specifiedParts === 2) {\n return [0, minor + 1, 0];\n }\n if (minor > 0) return [0, minor + 1, 0];\n return [0, 0, patch + 1];\n}\n\nfunction upperBoundForTilde(\n parsed: ParsedRangeVersion,\n): [number, number, number] {\n const [major, minor] = parsed.version;\n if (parsed.specifiedParts === 1) {\n return [major + 1, 0, 0];\n }\n return [major, minor + 1, 0];\n}\n\nfunction compareWithOperator(\n current: [number, number, number],\n operator: ComparatorOperator,\n target: [number, number, number],\n): boolean {\n const comparison = compareVersions(current, target);\n switch (operator) {\n case \">\":\n return comparison > 0;\n case \">=\":\n return comparison >= 0;\n case \"<\":\n return comparison < 0;\n case \"<=\":\n return comparison <= 0;\n case \"=\":\n return comparison === 0;\n }\n}\n\nfunction evaluateComparatorToken(\n token: string,\n current: [number, number, number],\n): NodeEngineEvaluation {\n const trimmed = token.trim();\n if (!trimmed || trimmed === \"*\" || /^x$/i.test(trimmed)) {\n return { status: \"satisfied\" };\n }\n\n const shorthand = trimmed.match(/^([~^])\\s*(.+)$/);\n if (shorthand) {\n const parsed = parseRangeVersion(shorthand[2]);\n if (!parsed) {\n return {\n status: \"unsupported\",\n reason: `unsupported node engine comparator \"${trimmed}\"`,\n };\n }\n const upper = shorthand[1] === \"^\"\n ? upperBoundForCaret(parsed)\n : upperBoundForTilde(parsed);\n return compareWithOperator(current, \">=\", parsed.version)\n && compareWithOperator(current, \"<\", upper)\n ? { status: \"satisfied\" }\n : { status: \"unsatisfied\" };\n }\n\n const comparator = trimmed.match(/^(>=|<=|>|<|=)?\\s*(.+)$/);\n if (!comparator) {\n return {\n status: \"unsupported\",\n reason: `unsupported node engine comparator \"${trimmed}\"`,\n };\n }\n const operator = (comparator[1] ?? \"=\") as ComparatorOperator;\n const parsed = parseRangeVersion(comparator[2]);\n if (!parsed) {\n return {\n status: \"unsupported\",\n reason: `unsupported node engine comparator \"${trimmed}\"`,\n };\n }\n\n if (!comparator[1]) {\n const upper = upperBoundForPartial(parsed);\n if (upper) {\n return compareWithOperator(current, \">=\", parsed.version)\n && compareWithOperator(current, \"<\", upper)\n ? { status: \"satisfied\" }\n : { status: \"unsatisfied\" };\n }\n }\n\n const partialUpper = upperBoundForPartial(parsed);\n if (partialUpper) {\n switch (operator) {\n case \"=\":\n return compareWithOperator(current, \">=\", parsed.version)\n && compareWithOperator(current, \"<\", partialUpper)\n ? { status: \"satisfied\" }\n : { status: \"unsatisfied\" };\n case \">=\":\n return compareWithOperator(current, \">=\", parsed.version)\n ? { status: \"satisfied\" }\n : { status: \"unsatisfied\" };\n case \">\":\n return compareWithOperator(current, \">=\", partialUpper)\n ? { status: \"satisfied\" }\n : { status: \"unsatisfied\" };\n case \"<=\":\n return compareWithOperator(current, \"<\", partialUpper)\n ? { status: \"satisfied\" }\n : { status: \"unsatisfied\" };\n case \"<\":\n return compareWithOperator(current, \"<\", parsed.version)\n ? { status: \"satisfied\" }\n : { status: \"unsatisfied\" };\n }\n }\n\n return compareWithOperator(current, operator, parsed.version)\n ? { status: \"satisfied\" }\n : { status: \"unsatisfied\" };\n}\n\nfunction tokenizeRangeAlternative(alternative: string): string[] {\n const tokens: string[] = [];\n let i = 0;\n\n while (i < alternative.length) {\n while (i < alternative.length && /\\s/.test(alternative[i])) i += 1;\n if (i >= alternative.length) break;\n\n let operator = \"\";\n const ch = alternative[i];\n if (ch === \">\" || ch === \"<\") {\n operator = ch;\n i += 1;\n if (alternative[i] === \"=\") {\n operator += \"=\";\n i += 1;\n }\n } else if (ch === \"=\" || ch === \"^\" || ch === \"~\") {\n operator = ch;\n i += 1;\n }\n\n while (i < alternative.length && /\\s/.test(alternative[i])) i += 1;\n const versionStart = i;\n while (i < alternative.length && !/\\s/.test(alternative[i])) i += 1;\n const version = alternative.slice(versionStart, i);\n tokens.push(`${operator}${version}`);\n }\n\n return tokens;\n}\n\nfunction evaluateHyphenRange(\n alternative: string,\n current: [number, number, number],\n): NodeEngineEvaluation | null {\n const match = alternative.match(/^(.+?)\\s+-\\s+(.+)$/);\n if (!match) return null;\n\n const lower = parseRangeVersion(match[1]);\n const upper = parseRangeVersion(match[2]);\n if (!lower || !upper) {\n return {\n status: \"unsupported\",\n reason: `unsupported node engine hyphen range \"${alternative}\"`,\n };\n }\n\n const lowerSatisfied = compareWithOperator(current, \">=\", lower.version);\n const upperBound = upperBoundForPartial(upper);\n const upperSatisfied = upperBound\n ? compareWithOperator(current, \"<\", upperBound)\n : compareWithOperator(current, \"<=\", upper.version);\n return lowerSatisfied && upperSatisfied\n ? { status: \"satisfied\" }\n : { status: \"unsatisfied\" };\n}\n\nfunction evaluateNodeEngineRange(\n rawRange: string | undefined,\n currentVersion: [number, number, number],\n): NodeEngineEvaluation {\n if (!rawRange || rawRange.trim().length === 0) {\n return { status: \"unsupported\", reason: \"missing node engine range\" };\n }\n\n const alternatives = rawRange.split(\"||\").map((part) => part.trim()).filter(Boolean);\n if (alternatives.length === 0) {\n return { status: \"unsupported\", reason: \"missing node engine range\" };\n }\n\n let firstUnsupported: string | undefined;\n let hasUnsatisfiedAlternative = false;\n for (const alternative of alternatives) {\n const hyphenResult = evaluateHyphenRange(alternative, currentVersion);\n if (hyphenResult) {\n if (hyphenResult.status === \"satisfied\") {\n return { status: \"satisfied\" };\n }\n if (hyphenResult.status === \"unsupported\") {\n firstUnsupported ??= hyphenResult.reason;\n } else {\n hasUnsatisfiedAlternative = true;\n }\n continue;\n }\n\n const tokens = tokenizeRangeAlternative(alternative).filter(Boolean);\n if (tokens.length === 0) continue;\n let alternativeSatisfied = true;\n for (const token of tokens) {\n const result = evaluateComparatorToken(token, currentVersion);\n if (result.status === \"unsupported\") {\n firstUnsupported ??= result.reason;\n alternativeSatisfied = false;\n break;\n }\n if (result.status === \"unsatisfied\") {\n hasUnsatisfiedAlternative = true;\n alternativeSatisfied = false;\n break;\n }\n }\n if (alternativeSatisfied) {\n return { status: \"satisfied\" };\n }\n }\n\n if (hasUnsatisfiedAlternative) {\n return { status: \"unsatisfied\" };\n }\n if (firstUnsupported) {\n return { status: \"unsupported\", reason: firstUnsupported };\n }\n return { status: \"unsatisfied\" };\n}\n\nfunction hasMemoryPromptSectionRegistration(source: string): boolean {\n const apiReceiver = String.raw`(?:\\bapi|\\(\\s*api\\s*\\)|\\(\\s*api\\s+as\\s+[^)]+\\)|\\(\\s*<[^>]+>\\s*api\\s*\\))`;\n return new RegExp(\n `${apiReceiver}\\\\s*\\\\??\\\\.\\\\s*registerMemoryPromptSection\\\\s*(?:\\\\?\\\\.)?\\\\s*\\\\(`,\n ).test(source);\n}\n\nexport async function runCompatChecks(options: CompatCheckOptions): Promise<CompatReport> {\n const checks: CompatCheckResult[] = [];\n const runner = options.runner ?? defaultRunner;\n const pluginJsonPath = path.join(options.repoRoot, \"openclaw.plugin.json\");\n const packageJsonPath = path.join(options.repoRoot, \"package.json\");\n const indexPath = path.join(options.repoRoot, \"src\", \"index.ts\");\n\n let pluginRaw = \"\";\n let pluginManifestPresent = false;\n try {\n pluginRaw = await readFile(pluginJsonPath, \"utf-8\");\n pluginManifestPresent = true;\n checks.push({\n id: \"plugin-manifest-present\",\n title: \"Plugin manifest present\",\n level: \"ok\",\n message: \"Found openclaw.plugin.json\",\n });\n } catch {\n checks.push({\n id: \"plugin-manifest-present\",\n title: \"Plugin manifest present\",\n level: \"error\",\n message: \"openclaw.plugin.json is missing\",\n remediation: \"Restore openclaw.plugin.json at repo root with plugin metadata.\",\n });\n }\n\n if (pluginManifestPresent) {\n try {\n const plugin = JSON.parse(pluginRaw) as { id?: string; kind?: string };\n const isValidId = plugin.id === OPENCLAW_REMNIC_PLUGIN_ID || plugin.id === OPENCLAW_REMNIC_LEGACY_PLUGIN_ID;\n if (isValidId && plugin.kind === \"memory\") {\n checks.push({\n id: \"plugin-manifest-shape\",\n title: \"Plugin manifest ID and kind\",\n level: \"ok\",\n message: \"Plugin manifest id/kind match expected values.\",\n });\n } else {\n checks.push({\n id: \"plugin-manifest-shape\",\n title: \"Plugin manifest ID and kind\",\n level: \"error\",\n message: `Unexpected manifest values (id=${String(plugin.id)}, kind=${String(plugin.kind)})`,\n remediation: `Set manifest id=${OPENCLAW_REMNIC_PLUGIN_ID} (or ${OPENCLAW_REMNIC_LEGACY_PLUGIN_ID} for the shim) and kind=memory.`,\n });\n }\n } catch {\n checks.push({\n id: \"plugin-manifest-shape\",\n title: \"Plugin manifest ID and kind\",\n level: \"error\",\n message: \"openclaw.plugin.json is not valid JSON\",\n remediation: \"Fix JSON syntax in openclaw.plugin.json.\",\n });\n }\n }\n\n let packageRaw = \"\";\n let packageJsonPresent = false;\n try {\n packageRaw = await readFile(packageJsonPath, \"utf-8\");\n packageJsonPresent = true;\n } catch {\n checks.push({\n id: \"package-json-present\",\n title: \"package.json present\",\n level: \"error\",\n message: \"package.json is missing\",\n remediation: \"Restore package.json at repo root.\",\n });\n }\n\n if (packageJsonPresent) {\n try {\n const pkg = JSON.parse(packageRaw) as {\n openclaw?: { plugin?: string; extensions?: string[] };\n engines?: { node?: string };\n };\n const pluginPathOk = pkg.openclaw?.plugin === \"./openclaw.plugin.json\";\n const extOk = Array.isArray(pkg.openclaw?.extensions)\n && pkg.openclaw?.extensions.includes(\"./dist/index.js\");\n if (pluginPathOk && extOk) {\n checks.push({\n id: \"package-openclaw-exports\",\n title: \"package.json OpenClaw export wiring\",\n level: \"ok\",\n message: \"package.json openclaw.plugin/extensions wiring looks valid.\",\n });\n } else {\n checks.push({\n id: \"package-openclaw-exports\",\n title: \"package.json OpenClaw export wiring\",\n level: \"error\",\n message: \"package.json openclaw plugin/extension wiring is missing or invalid.\",\n remediation: \"Set openclaw.plugin to ./openclaw.plugin.json and include ./dist/index.js in openclaw.extensions.\",\n });\n }\n\n const currentNode = options.currentNodeVersion ?? process.version;\n const currentVersion = parseCurrentNodeVersion(currentNode);\n const engineEvaluation: NodeEngineEvaluation = currentVersion\n ? evaluateNodeEngineRange(pkg.engines?.node, currentVersion)\n : { status: \"unsupported\", reason: \"unable to parse current Node version\" };\n if (engineEvaluation.status === \"unsupported\") {\n checks.push({\n id: \"node-version-compat\",\n title: \"Node runtime compatibility\",\n level: \"warn\",\n message: `Unable to evaluate node engine/current version: ${engineEvaluation.reason}.`,\n remediation: \"Confirm Node version meets package.json engines.node requirement.\",\n metadata: { enginesNode: pkg.engines?.node, currentNode },\n });\n } else if (engineEvaluation.status === \"satisfied\") {\n checks.push({\n id: \"node-version-compat\",\n title: \"Node runtime compatibility\",\n level: \"ok\",\n message: `Current Node ${currentNode} satisfies engines requirement ${pkg.engines?.node}.`,\n });\n } else {\n checks.push({\n id: \"node-version-compat\",\n title: \"Node runtime compatibility\",\n level: \"error\",\n message: `Current Node ${currentNode} does not satisfy engines requirement ${pkg.engines?.node}.`,\n remediation: \"Upgrade Node runtime to meet package.json engines.node minimum.\",\n });\n }\n } catch {\n checks.push({\n id: \"package-json-parse\",\n title: \"package.json parse\",\n level: \"error\",\n message: \"package.json is not valid JSON\",\n remediation: \"Fix JSON syntax in package.json.\",\n });\n }\n }\n\n try {\n await access(indexPath);\n const indexRaw = await readFile(indexPath, \"utf-8\");\n const structuralSource = stripCommentsAndStrings(indexRaw);\n const hooks = parseHookRegistrations(indexRaw);\n const missingHooks = REQUIRED_HOOKS.filter((hook) => !hooks.has(hook));\n // registerMemoryPromptSection is a valid alternative to the recall hook only\n // when it is registered on the OpenClaw plugin API object.\n const hasMemoryPromptSection = hasMemoryPromptSectionRegistration(structuralSource);\n const missingRequiredHooks = hasMemoryPromptSection\n ? missingHooks.filter((hook) => hook !== \"before_prompt_build\")\n : missingHooks;\n const hasGatewayStartHook = hooks.has(\"gateway_start\");\n const hasServiceStart = hasServiceStartRegistration(structuralSource);\n if (missingRequiredHooks.length === 0 && (hasGatewayStartHook || hasServiceStart)) {\n checks.push({\n id: \"hook-registration-core\",\n title: \"Core hook registration\",\n level: \"ok\",\n message: \"Core recall/extraction hooks and startup wiring are registered in src/index.ts.\",\n });\n } else {\n const missingParts: string[] = [];\n if (missingRequiredHooks.length > 0) {\n missingParts.push(`hooks: ${missingRequiredHooks.join(\", \")}`);\n }\n if (!hasGatewayStartHook && !hasServiceStart) {\n missingParts.push(\"startup wiring: gateway_start hook or api.registerService({ start })\");\n }\n const remediationParts: string[] = [];\n if (missingRequiredHooks.length > 0) {\n remediationParts.push(`registers ${missingRequiredHooks.join(\", \")}`);\n }\n if (!hasGatewayStartHook && !hasServiceStart) {\n remediationParts.push(\"registers gateway_start or api.registerService({ start })\");\n }\n checks.push({\n id: \"hook-registration-core\",\n title: \"Core hook registration\",\n level: \"error\",\n message: `Missing expected registration(s): ${missingParts.join(\"; \")}`,\n remediation: `Ensure src/index.ts ${remediationParts.join(\" and \")}.`,\n });\n }\n\n const cliWired = hasCliRegistration(structuralSource);\n checks.push({\n id: \"cli-registration\",\n title: \"CLI registration wiring\",\n level: cliWired ? \"ok\" : \"warn\",\n message: cliWired\n ? \"CLI registration is wired in plugin bootstrap.\"\n : \"CLI registration call not found in src/index.ts.\",\n remediation: cliWired ? undefined : \"Call registerCli(api, orchestrator) during plugin registration.\",\n });\n } catch {\n checks.push({\n id: \"hook-registration-core\",\n title: \"Core hook registration\",\n level: \"error\",\n message: \"src/index.ts is missing; cannot validate hook wiring.\",\n remediation: \"Restore src/index.ts and register required hooks.\",\n });\n }\n\n const qmdAvailable = await runner.commandExists(\"qmd\");\n checks.push({\n id: \"qmd-binary-availability\",\n title: \"QMD binary availability\",\n level: qmdAvailable ? \"ok\" : \"warn\",\n message: qmdAvailable\n ? \"qmd binary is available in PATH.\"\n : \"qmd binary is not available in PATH.\",\n remediation: qmdAvailable ? undefined : \"Install qmd or configure qmdPath in plugin config.\",\n });\n\n return {\n generatedAt: (options.now ?? new Date()).toISOString(),\n checks,\n summary: summarize(checks),\n };\n}\n"],"mappings":"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","names":["parsed"]}
|
|
@@ -49,7 +49,8 @@ async function respondOfflineSnapshotStream(response, snapshot, requestId) {
|
|
|
49
49
|
schemaVersion: snapshot.schemaVersion,
|
|
50
50
|
createdAt: snapshot.createdAt,
|
|
51
51
|
sourceId: snapshot.sourceId,
|
|
52
|
-
includeTranscripts: snapshot.includeTranscripts
|
|
52
|
+
includeTranscripts: snapshot.includeTranscripts,
|
|
53
|
+
deletions: snapshot.deletions
|
|
53
54
|
}, snapshot.files, requestId);
|
|
54
55
|
}
|
|
55
56
|
async function respondOfflineManifestStream(response, manifest, requestId) {
|
|
@@ -65,4 +66,4 @@ export {
|
|
|
65
66
|
respondOfflineSnapshotStream,
|
|
66
67
|
respondOfflineManifestStream
|
|
67
68
|
};
|
|
68
|
-
//# sourceMappingURL=chunk-
|
|
69
|
+
//# sourceMappingURL=chunk-CK5KOVHW.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/access-http-offline-stream.ts"],"sourcesContent":["import type { ServerResponse } from \"node:http\";\nimport type { OfflineSyncManifestStreamResponse } from \"./access-offline-manifest.js\";\nimport type { EngramAccessOfflineSyncSnapshotStreamResponse } from \"./access-service.js\";\n\nasync function respondOfflineNdjsonStream(\n response: ServerResponse,\n header: unknown,\n files: AsyncIterable<unknown>,\n requestId?: string,\n): Promise<void> {\n response.statusCode = 200;\n response.setHeader(\"content-type\", \"application/x-ndjson; charset=utf-8\");\n response.setHeader(\"cache-control\", \"no-store\");\n if (requestId) response.setHeader(\"x-request-id\", requestId);\n const waitForDrainOrClose = async (): Promise<boolean> => {\n const { promise, resolve, reject } = Promise.withResolvers<boolean>();\n const cleanup = () => {\n response.off(\"drain\", onDrain);\n response.off(\"close\", onClose);\n response.off(\"error\", onError);\n };\n const onDrain = () => {\n cleanup();\n resolve(true);\n };\n const onClose = () => {\n cleanup();\n resolve(false);\n };\n const onError = (error: Error) => {\n cleanup();\n reject(error);\n };\n response.once(\"drain\", onDrain);\n response.once(\"close\", onClose);\n response.once(\"error\", onError);\n return promise;\n };\n const writeLine = async (payload: unknown): Promise<boolean> => {\n if (response.destroyed || response.writableEnded) return false;\n if (response.write(`${JSON.stringify(payload)}\\n`)) return true;\n if (response.destroyed || response.writableEnded) return false;\n return waitForDrainOrClose();\n };\n if (!await writeLine(header)) return;\n for await (const file of files) {\n if (!await writeLine({ type: \"file\", file })) return;\n }\n if (!response.destroyed && !response.writableEnded) response.end();\n}\n\nexport async function respondOfflineSnapshotStream(\n response: ServerResponse,\n snapshot: EngramAccessOfflineSyncSnapshotStreamResponse,\n requestId?: string,\n): Promise<void> {\n await respondOfflineNdjsonStream(response, {\n type: \"snapshot\",\n namespace: snapshot.namespace,\n format: snapshot.format,\n schemaVersion: snapshot.schemaVersion,\n createdAt: snapshot.createdAt,\n sourceId: snapshot.sourceId,\n includeTranscripts: snapshot.includeTranscripts,\n }, snapshot.files, requestId);\n}\n\nexport async function respondOfflineManifestStream(\n response: ServerResponse,\n manifest: OfflineSyncManifestStreamResponse,\n requestId?: string,\n): Promise<void> {\n await respondOfflineNdjsonStream(response, {\n type: \"manifest\",\n namespace: manifest.namespace,\n format: manifest.format,\n schemaVersion: manifest.schemaVersion,\n }, manifest.files, requestId);\n}\n"],"mappings":";AAIA,eAAe,2BACb,UACA,QACA,OACA,WACe;AACf,WAAS,aAAa;AACtB,WAAS,UAAU,gBAAgB,qCAAqC;AACxE,WAAS,UAAU,iBAAiB,UAAU;AAC9C,MAAI,UAAW,UAAS,UAAU,gBAAgB,SAAS;AAC3D,QAAM,sBAAsB,YAA8B;AACxD,UAAM,EAAE,SAAS,SAAS,OAAO,IAAI,QAAQ,cAAuB;AACpE,UAAM,UAAU,MAAM;AACpB,eAAS,IAAI,SAAS,OAAO;AAC7B,eAAS,IAAI,SAAS,OAAO;AAC7B,eAAS,IAAI,SAAS,OAAO;AAAA,IAC/B;AACA,UAAM,UAAU,MAAM;AACpB,cAAQ;AACR,cAAQ,IAAI;AAAA,IACd;AACA,UAAM,UAAU,MAAM;AACpB,cAAQ;AACR,cAAQ,KAAK;AAAA,IACf;AACA,UAAM,UAAU,CAAC,UAAiB;AAChC,cAAQ;AACR,aAAO,KAAK;AAAA,IACd;AACA,aAAS,KAAK,SAAS,OAAO;AAC9B,aAAS,KAAK,SAAS,OAAO;AAC9B,aAAS,KAAK,SAAS,OAAO;AAC9B,WAAO;AAAA,EACT;AACA,QAAM,YAAY,OAAO,YAAuC;AAC9D,QAAI,SAAS,aAAa,SAAS,cAAe,QAAO;AACzD,QAAI,SAAS,MAAM,GAAG,KAAK,UAAU,OAAO,CAAC;AAAA,CAAI,EAAG,QAAO;AAC3D,QAAI,SAAS,aAAa,SAAS,cAAe,QAAO;AACzD,WAAO,oBAAoB;AAAA,EAC7B;AACA,MAAI,CAAC,MAAM,UAAU,MAAM,EAAG;AAC9B,mBAAiB,QAAQ,OAAO;AAC9B,QAAI,CAAC,MAAM,UAAU,EAAE,MAAM,QAAQ,KAAK,CAAC,EAAG;AAAA,EAChD;AACA,MAAI,CAAC,SAAS,aAAa,CAAC,SAAS,cAAe,UAAS,IAAI;AACnE;AAEA,eAAsB,6BACpB,UACA,UACA,WACe;AACf,QAAM,2BAA2B,UAAU;AAAA,IACzC,MAAM;AAAA,IACN,WAAW,SAAS;AAAA,IACpB,QAAQ,SAAS;AAAA,IACjB,eAAe,SAAS;AAAA,IACxB,WAAW,SAAS;AAAA,IACpB,UAAU,SAAS;AAAA,IACnB,oBAAoB,SAAS;AAAA,
|
|
1
|
+
{"version":3,"sources":["../src/access-http-offline-stream.ts"],"sourcesContent":["import type { ServerResponse } from \"node:http\";\nimport type { OfflineSyncManifestStreamResponse } from \"./access-offline-manifest.js\";\nimport type { EngramAccessOfflineSyncSnapshotStreamResponse } from \"./access-service.js\";\n\nasync function respondOfflineNdjsonStream(\n response: ServerResponse,\n header: unknown,\n files: AsyncIterable<unknown>,\n requestId?: string,\n): Promise<void> {\n response.statusCode = 200;\n response.setHeader(\"content-type\", \"application/x-ndjson; charset=utf-8\");\n response.setHeader(\"cache-control\", \"no-store\");\n if (requestId) response.setHeader(\"x-request-id\", requestId);\n const waitForDrainOrClose = async (): Promise<boolean> => {\n const { promise, resolve, reject } = Promise.withResolvers<boolean>();\n const cleanup = () => {\n response.off(\"drain\", onDrain);\n response.off(\"close\", onClose);\n response.off(\"error\", onError);\n };\n const onDrain = () => {\n cleanup();\n resolve(true);\n };\n const onClose = () => {\n cleanup();\n resolve(false);\n };\n const onError = (error: Error) => {\n cleanup();\n reject(error);\n };\n response.once(\"drain\", onDrain);\n response.once(\"close\", onClose);\n response.once(\"error\", onError);\n return promise;\n };\n const writeLine = async (payload: unknown): Promise<boolean> => {\n if (response.destroyed || response.writableEnded) return false;\n if (response.write(`${JSON.stringify(payload)}\\n`)) return true;\n if (response.destroyed || response.writableEnded) return false;\n return waitForDrainOrClose();\n };\n if (!await writeLine(header)) return;\n for await (const file of files) {\n if (!await writeLine({ type: \"file\", file })) return;\n }\n if (!response.destroyed && !response.writableEnded) response.end();\n}\n\nexport async function respondOfflineSnapshotStream(\n response: ServerResponse,\n snapshot: EngramAccessOfflineSyncSnapshotStreamResponse,\n requestId?: string,\n): Promise<void> {\n await respondOfflineNdjsonStream(response, {\n type: \"snapshot\",\n namespace: snapshot.namespace,\n format: snapshot.format,\n schemaVersion: snapshot.schemaVersion,\n createdAt: snapshot.createdAt,\n sourceId: snapshot.sourceId,\n includeTranscripts: snapshot.includeTranscripts,\n deletions: snapshot.deletions,\n }, snapshot.files, requestId);\n}\n\nexport async function respondOfflineManifestStream(\n response: ServerResponse,\n manifest: OfflineSyncManifestStreamResponse,\n requestId?: string,\n): Promise<void> {\n await respondOfflineNdjsonStream(response, {\n type: \"manifest\",\n namespace: manifest.namespace,\n format: manifest.format,\n schemaVersion: manifest.schemaVersion,\n }, manifest.files, requestId);\n}\n"],"mappings":";AAIA,eAAe,2BACb,UACA,QACA,OACA,WACe;AACf,WAAS,aAAa;AACtB,WAAS,UAAU,gBAAgB,qCAAqC;AACxE,WAAS,UAAU,iBAAiB,UAAU;AAC9C,MAAI,UAAW,UAAS,UAAU,gBAAgB,SAAS;AAC3D,QAAM,sBAAsB,YAA8B;AACxD,UAAM,EAAE,SAAS,SAAS,OAAO,IAAI,QAAQ,cAAuB;AACpE,UAAM,UAAU,MAAM;AACpB,eAAS,IAAI,SAAS,OAAO;AAC7B,eAAS,IAAI,SAAS,OAAO;AAC7B,eAAS,IAAI,SAAS,OAAO;AAAA,IAC/B;AACA,UAAM,UAAU,MAAM;AACpB,cAAQ;AACR,cAAQ,IAAI;AAAA,IACd;AACA,UAAM,UAAU,MAAM;AACpB,cAAQ;AACR,cAAQ,KAAK;AAAA,IACf;AACA,UAAM,UAAU,CAAC,UAAiB;AAChC,cAAQ;AACR,aAAO,KAAK;AAAA,IACd;AACA,aAAS,KAAK,SAAS,OAAO;AAC9B,aAAS,KAAK,SAAS,OAAO;AAC9B,aAAS,KAAK,SAAS,OAAO;AAC9B,WAAO;AAAA,EACT;AACA,QAAM,YAAY,OAAO,YAAuC;AAC9D,QAAI,SAAS,aAAa,SAAS,cAAe,QAAO;AACzD,QAAI,SAAS,MAAM,GAAG,KAAK,UAAU,OAAO,CAAC;AAAA,CAAI,EAAG,QAAO;AAC3D,QAAI,SAAS,aAAa,SAAS,cAAe,QAAO;AACzD,WAAO,oBAAoB;AAAA,EAC7B;AACA,MAAI,CAAC,MAAM,UAAU,MAAM,EAAG;AAC9B,mBAAiB,QAAQ,OAAO;AAC9B,QAAI,CAAC,MAAM,UAAU,EAAE,MAAM,QAAQ,KAAK,CAAC,EAAG;AAAA,EAChD;AACA,MAAI,CAAC,SAAS,aAAa,CAAC,SAAS,cAAe,UAAS,IAAI;AACnE;AAEA,eAAsB,6BACpB,UACA,UACA,WACe;AACf,QAAM,2BAA2B,UAAU;AAAA,IACzC,MAAM;AAAA,IACN,WAAW,SAAS;AAAA,IACpB,QAAQ,SAAS;AAAA,IACjB,eAAe,SAAS;AAAA,IACxB,WAAW,SAAS;AAAA,IACpB,UAAU,SAAS;AAAA,IACnB,oBAAoB,SAAS;AAAA,IAC7B,WAAW,SAAS;AAAA,EACtB,GAAG,SAAS,OAAO,SAAS;AAC9B;AAEA,eAAsB,6BACpB,UACA,UACA,WACe;AACf,QAAM,2BAA2B,UAAU;AAAA,IACzC,MAAM;AAAA,IACN,WAAW,SAAS;AAAA,IACpB,QAAQ,SAAS;AAAA,IACjB,eAAe,SAAS;AAAA,EAC1B,GAAG,SAAS,OAAO,SAAS;AAC9B;","names":[]}
|
|
@@ -9,14 +9,14 @@ import {
|
|
|
9
9
|
} from "./chunk-666A3MOW.js";
|
|
10
10
|
import {
|
|
11
11
|
rebuildMemoryLifecycleLedger
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-U6JGQ37L.js";
|
|
13
13
|
import {
|
|
14
14
|
planNamespaceMaintenance,
|
|
15
15
|
runNamespaceMaintenanceBatchPlan
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-ILBLZ5Y5.js";
|
|
17
17
|
import {
|
|
18
18
|
rebuildMemoryProjection
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-WOC6DXP5.js";
|
|
20
20
|
import {
|
|
21
21
|
activityDayWindow,
|
|
22
22
|
activityDigestPath,
|
|
@@ -1714,4 +1714,4 @@ export {
|
|
|
1714
1714
|
ActivitySyncScheduler,
|
|
1715
1715
|
MaintenanceScheduler
|
|
1716
1716
|
};
|
|
1717
|
-
//# sourceMappingURL=chunk-
|
|
1717
|
+
//# sourceMappingURL=chunk-E4FOAENZ.js.map
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
} from "./chunk-KSXJOC4F.js";
|
|
5
5
|
import {
|
|
6
6
|
StorageManager
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-IDE5AR5W.js";
|
|
8
8
|
import {
|
|
9
9
|
isSafeRouteNamespace
|
|
10
10
|
} from "./chunk-U3PN77QT.js";
|
|
@@ -134,4 +134,4 @@ export {
|
|
|
134
134
|
runCodexMaterialize,
|
|
135
135
|
runPostConsolidationMaterialize
|
|
136
136
|
};
|
|
137
|
-
//# sourceMappingURL=chunk-
|
|
137
|
+
//# sourceMappingURL=chunk-FULKGK7P.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
externalWikiSearchOperation
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-RVPTS4U5.js";
|
|
4
4
|
import {
|
|
5
5
|
memoryStoreRequestSchema
|
|
6
6
|
} from "./chunk-NIS256NW.js";
|
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
DELTA_SUBCOMMANDS,
|
|
11
11
|
defineOperation,
|
|
12
12
|
isCodegraphToolName
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-RCU25Z66.js";
|
|
14
14
|
import {
|
|
15
15
|
serializeMutations,
|
|
16
16
|
withHeldFileLock
|
|
@@ -1813,4 +1813,4 @@ export {
|
|
|
1813
1813
|
codegraphIngestTracesOperation,
|
|
1814
1814
|
REGISTERED_OPERATIONS
|
|
1815
1815
|
};
|
|
1816
|
-
//# sourceMappingURL=chunk-
|
|
1816
|
+
//# sourceMappingURL=chunk-HJ3SVHUW.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
StorageManager
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-IDE5AR5W.js";
|
|
4
4
|
import {
|
|
5
5
|
composeMemoryEnvelope
|
|
6
6
|
} from "./chunk-CGASUJVP.js";
|
|
@@ -546,4 +546,4 @@ export {
|
|
|
546
546
|
setSemanticRulePromotionTestHooks,
|
|
547
547
|
promoteSemanticRuleFromMemory
|
|
548
548
|
};
|
|
549
|
-
//# sourceMappingURL=chunk-
|
|
549
|
+
//# sourceMappingURL=chunk-HXXTXLKA.js.map
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
import {
|
|
2
|
+
TombstoneStore,
|
|
3
|
+
applyTombstoneResurrectionGate,
|
|
4
|
+
buildRetiredFactTombstoneInputs,
|
|
5
|
+
collectRetiredMemoriesForRebuild
|
|
6
|
+
} from "./chunk-ENTCVTQR.js";
|
|
1
7
|
import {
|
|
2
8
|
WEARABLES_DIR_NAME,
|
|
3
9
|
escapeSegmentText,
|
|
@@ -9,12 +15,6 @@ import {
|
|
|
9
15
|
unescapeSegmentText,
|
|
10
16
|
unescapeSpeakerLabel
|
|
11
17
|
} from "./chunk-UHVXE24Y.js";
|
|
12
|
-
import {
|
|
13
|
-
TombstoneStore,
|
|
14
|
-
applyTombstoneResurrectionGate,
|
|
15
|
-
buildRetiredFactTombstoneInputs,
|
|
16
|
-
collectRetiredMemoriesForRebuild
|
|
17
|
-
} from "./chunk-ENTCVTQR.js";
|
|
18
18
|
import {
|
|
19
19
|
withholdToolScopedFromSharedNamespace
|
|
20
20
|
} from "./chunk-S2V7RUCL.js";
|
|
@@ -26,7 +26,10 @@ import {
|
|
|
26
26
|
import {
|
|
27
27
|
SPECULATIVE_TTL_DAYS,
|
|
28
28
|
confidenceTier
|
|
29
|
-
} from "./chunk-
|
|
29
|
+
} from "./chunk-3S63QIFQ.js";
|
|
30
|
+
import {
|
|
31
|
+
createMemorySnapshot
|
|
32
|
+
} from "./chunk-S2HLHAZ4.js";
|
|
30
33
|
import {
|
|
31
34
|
normalizeProjectionPreview,
|
|
32
35
|
normalizeProjectionTags
|
|
@@ -35,9 +38,6 @@ import {
|
|
|
35
38
|
rewriteProjectedEntityReferences,
|
|
36
39
|
rewriteProjectedMemoryEntityReference
|
|
37
40
|
} from "./chunk-WRJVB3C2.js";
|
|
38
|
-
import {
|
|
39
|
-
rotateMarkdownFileToArchive
|
|
40
|
-
} from "./chunk-DM2T26WE.js";
|
|
41
41
|
import {
|
|
42
42
|
closeContinuityIncidentRecord,
|
|
43
43
|
createContinuityIncidentRecord,
|
|
@@ -47,6 +47,9 @@ import {
|
|
|
47
47
|
serializeContinuityIncident,
|
|
48
48
|
upsertContinuityLoopInMarkdown
|
|
49
49
|
} from "./chunk-LDXUBPMO.js";
|
|
50
|
+
import {
|
|
51
|
+
rotateMarkdownFileToArchive
|
|
52
|
+
} from "./chunk-DM2T26WE.js";
|
|
50
53
|
import {
|
|
51
54
|
parseFaithfulnessField,
|
|
52
55
|
serializeFaithfulnessFields
|
|
@@ -6471,6 +6474,7 @@ var StorageManager3 = class _StorageManager extends TombstoneBlockedCaptureIndex
|
|
|
6471
6474
|
knowledgeIndexCache = null;
|
|
6472
6475
|
artifactIndexCache = null;
|
|
6473
6476
|
projectionLedgerLagManager = new ProjectionLedgerLagManager();
|
|
6477
|
+
static loadedMemorySnapshots = /* @__PURE__ */ new WeakMap();
|
|
6474
6478
|
static KNOWLEDGE_INDEX_CACHE_TTL_MS = 6e5;
|
|
6475
6479
|
// 10 minutes (entity mutations invalidate)
|
|
6476
6480
|
/** Read by storage/memory-read-store.ts (decomposition). */
|
|
@@ -8637,6 +8641,16 @@ ${sanitized.text}
|
|
|
8637
8641
|
const threshold = typeof triggerLines === "number" ? Math.max(0, Math.floor(triggerLines)) : _StorageManager.PROFILE_MAX_LINES;
|
|
8638
8642
|
return lineCount > threshold;
|
|
8639
8643
|
}
|
|
8644
|
+
rememberMemorySnapshot(memory) {
|
|
8645
|
+
if (memory !== null && !_StorageManager.loadedMemorySnapshots.has(memory)) {
|
|
8646
|
+
_StorageManager.loadedMemorySnapshots.set(memory, createMemorySnapshot(memory));
|
|
8647
|
+
}
|
|
8648
|
+
return memory;
|
|
8649
|
+
}
|
|
8650
|
+
rememberMemorySnapshots(memories) {
|
|
8651
|
+
for (const memory of memories) this.rememberMemorySnapshot(memory);
|
|
8652
|
+
return memories;
|
|
8653
|
+
}
|
|
8640
8654
|
async readAllMemories() {
|
|
8641
8655
|
if (this.hotMemoriesCacheEnabled) {
|
|
8642
8656
|
const cached = getCachedMemories(
|
|
@@ -8645,11 +8659,11 @@ ${sanitized.text}
|
|
|
8645
8659
|
this.hotCacheKeyId(),
|
|
8646
8660
|
this.hotCacheTtlMs()
|
|
8647
8661
|
);
|
|
8648
|
-
if (cached !== null) return cached;
|
|
8662
|
+
if (cached !== null) return this.rememberMemorySnapshots(cached);
|
|
8649
8663
|
}
|
|
8650
8664
|
const keyId = this.hotCacheKeyId();
|
|
8651
8665
|
const inFlight = getInFlightRead(this.baseDir, keyId);
|
|
8652
|
-
if (inFlight) return inFlight;
|
|
8666
|
+
if (inFlight) return this.rememberMemorySnapshots(await inFlight);
|
|
8653
8667
|
const readPromise = (async () => {
|
|
8654
8668
|
const version = this.getMemoryCorpusVersion();
|
|
8655
8669
|
const memories = await this._readAllMemoriesFromDisk();
|
|
@@ -8660,7 +8674,7 @@ ${sanitized.text}
|
|
|
8660
8674
|
})();
|
|
8661
8675
|
setInFlightRead(this.baseDir, keyId, readPromise);
|
|
8662
8676
|
try {
|
|
8663
|
-
return await readPromise;
|
|
8677
|
+
return this.rememberMemorySnapshots(await readPromise);
|
|
8664
8678
|
} finally {
|
|
8665
8679
|
deleteInFlightRead(this.baseDir, keyId, readPromise);
|
|
8666
8680
|
}
|
|
@@ -8965,7 +8979,7 @@ ${sanitized.text}
|
|
|
8965
8979
|
return this.readParsedMemoriesFromPaths(filePaths, 50);
|
|
8966
8980
|
}
|
|
8967
8981
|
async readAllColdMemories() {
|
|
8968
|
-
return this.memoryReadStore.readAllColdMemories();
|
|
8982
|
+
return this.rememberMemorySnapshots(await this.memoryReadStore.readAllColdMemories());
|
|
8969
8983
|
}
|
|
8970
8984
|
/**
|
|
8971
8985
|
* Read archived memory markdown files under archive/.
|
|
@@ -9010,10 +9024,10 @@ ${sanitized.text}
|
|
|
9010
9024
|
}
|
|
9011
9025
|
};
|
|
9012
9026
|
await readDir(root);
|
|
9013
|
-
return memories;
|
|
9027
|
+
return this.rememberMemorySnapshots(memories);
|
|
9014
9028
|
}
|
|
9015
9029
|
async readMemoryByPath(filePath) {
|
|
9016
|
-
return this.memoryReadStore.readMemoryByPath(filePath);
|
|
9030
|
+
return this.rememberMemorySnapshot(await this.memoryReadStore.readMemoryByPath(filePath));
|
|
9017
9031
|
}
|
|
9018
9032
|
resolveTierRootDir(tier) {
|
|
9019
9033
|
return tier === "cold" ? path9.join(this.baseDir, "cold") : this.baseDir;
|
|
@@ -9084,36 +9098,42 @@ ${memory.content}
|
|
|
9084
9098
|
this.notifyCatalogWrite();
|
|
9085
9099
|
}
|
|
9086
9100
|
async moveMemoryToPath(memory, targetPath) {
|
|
9087
|
-
await this.withTombstoneBlockedMemoryPathLock(
|
|
9101
|
+
const changed = await this.withTombstoneBlockedMemoryPathLock(
|
|
9088
9102
|
memory.path,
|
|
9089
9103
|
async (current) => {
|
|
9104
|
+
const destination = await this.readMemoryByPath(targetPath);
|
|
9090
9105
|
if (current?.frontmatter.id !== memory.frontmatter.id) {
|
|
9106
|
+
if (current === null && destination?.frontmatter.id === memory.frontmatter.id) return false;
|
|
9107
|
+
throw new Error(`memory ${memory.frontmatter.id} changed before its tier move`);
|
|
9108
|
+
}
|
|
9109
|
+
const callerSnapshot = _StorageManager.loadedMemorySnapshots.get(memory);
|
|
9110
|
+
const currentSnapshot = createMemorySnapshot(current);
|
|
9111
|
+
if (callerSnapshot === void 0 ? current.frontmatter.updated !== memory.frontmatter.updated : currentSnapshot !== callerSnapshot) {
|
|
9091
9112
|
throw new Error(`memory ${memory.frontmatter.id} changed before its tier move`);
|
|
9092
9113
|
}
|
|
9093
|
-
const destination = await this.readMemoryByPath(targetPath);
|
|
9094
9114
|
const coordinate = tombstoneBlocked(current.frontmatter) || isQueuedReviewMemory(current) || destination !== null && tombstoneBlocked(destination.frontmatter) || isQueuedReviewMemory(destination);
|
|
9095
9115
|
const index = this.getTombstoneBlockedCaptureIndex();
|
|
9096
9116
|
const marker = coordinate ? await index.prepareWrite() : void 0;
|
|
9117
|
+
const projectedPath = toMemoryPathRel(this.baseDir, targetPath);
|
|
9097
9118
|
let durable = false;
|
|
9098
9119
|
try {
|
|
9099
9120
|
if (destination?.frontmatter.id === current.frontmatter.id) {
|
|
9100
9121
|
await this.deleteManagedStorageFile(current.path);
|
|
9101
9122
|
durable = true;
|
|
9102
9123
|
this.invalidateAllMemoriesCache();
|
|
9103
|
-
updateProjectedMemoryPath(this.baseDir, current.frontmatter.id,
|
|
9124
|
+
updateProjectedMemoryPath(this.baseDir, current.frontmatter.id, projectedPath);
|
|
9104
9125
|
} else {
|
|
9105
9126
|
await this.writeMemoryFileAtomic(targetPath, current);
|
|
9127
|
+
if (memory.frontmatter.entityRef !== current.frontmatter.entityRef) {
|
|
9128
|
+
memory.frontmatter.entityRef = current.frontmatter.entityRef;
|
|
9129
|
+
}
|
|
9106
9130
|
durable = true;
|
|
9107
9131
|
const sourcePath = path9.resolve(current.path);
|
|
9108
9132
|
const destPath = path9.resolve(targetPath);
|
|
9109
9133
|
if (sourcePath !== destPath) {
|
|
9110
9134
|
await this.deleteManagedStorageFile(current.path);
|
|
9111
9135
|
this.invalidateAllMemoriesCache();
|
|
9112
|
-
updateProjectedMemoryPath(
|
|
9113
|
-
this.baseDir,
|
|
9114
|
-
current.frontmatter.id,
|
|
9115
|
-
toMemoryPathRel(this.baseDir, targetPath)
|
|
9116
|
-
);
|
|
9136
|
+
updateProjectedMemoryPath(this.baseDir, current.frontmatter.id, projectedPath);
|
|
9117
9137
|
}
|
|
9118
9138
|
}
|
|
9119
9139
|
if (marker !== void 0) await this.rebuildTombstoneBlockedCaptureAfterInvalidation(marker);
|
|
@@ -9122,9 +9142,14 @@ ${memory.content}
|
|
|
9122
9142
|
if (marker !== void 0 && durable) index.markUntrusted();
|
|
9123
9143
|
throw error;
|
|
9124
9144
|
}
|
|
9145
|
+
return true;
|
|
9125
9146
|
},
|
|
9126
9147
|
[targetPath]
|
|
9127
9148
|
);
|
|
9149
|
+
if (this.isColdOrArchiveTierPath(memory.path) || this.isColdOrArchiveTierPath(targetPath)) {
|
|
9150
|
+
this.invalidateColdMemoriesCache();
|
|
9151
|
+
}
|
|
9152
|
+
return changed;
|
|
9128
9153
|
}
|
|
9129
9154
|
async migrateMemoryToTier(memory, targetTier) {
|
|
9130
9155
|
const targetPath = this.buildTierMemoryPath(memory, targetTier);
|
|
@@ -9133,13 +9158,10 @@ ${memory.content}
|
|
|
9133
9158
|
if (sourcePath === destPath) {
|
|
9134
9159
|
return { changed: false, targetPath };
|
|
9135
9160
|
}
|
|
9136
|
-
await this.moveMemoryToPath(memory, targetPath);
|
|
9137
|
-
|
|
9138
|
-
if (targetTier === "cold") {
|
|
9139
|
-
this.invalidateColdMemoriesCache();
|
|
9140
|
-
}
|
|
9161
|
+
const changed = await this.moveMemoryToPath(memory, targetPath);
|
|
9162
|
+
if (!changed) return { changed: false, targetPath };
|
|
9141
9163
|
this.bumpMemoryStatusVersion();
|
|
9142
|
-
return { changed
|
|
9164
|
+
return { changed, targetPath };
|
|
9143
9165
|
}
|
|
9144
9166
|
get archiveDir() {
|
|
9145
9167
|
return path9.join(this.baseDir, "archive");
|
|
@@ -10820,4 +10842,4 @@ export {
|
|
|
10820
10842
|
isValidBufferSurpriseEvent,
|
|
10821
10843
|
StorageManager3 as StorageManager
|
|
10822
10844
|
};
|
|
10823
|
-
//# sourceMappingURL=chunk-
|
|
10845
|
+
//# sourceMappingURL=chunk-IDE5AR5W.js.map
|