@jungjaehoon/mama-core 2.4.1 → 4.0.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/README.md +76 -239
- package/db/migrations/030-case-first-memory-substrate.sql +13 -98
- package/db/migrations/034-add-connector-event-scope-columns.sql +9 -13
- package/db/migrations/039-add-connector-event-operator-ingest-seq.sql +9 -95
- package/db/migrations/062-refresh-connector-event-sequences.sql +9 -113
- package/db/migrations/063-refresh-legacy-connector-event-updates.sql +9 -32
- package/db/migrations/067-add-connector-event-source-entity-id.sql +9 -13
- package/db/migrations/069-create-registry-nodes.sql +52 -0
- package/db/migrations/070-record-identity.sql +35 -0
- package/db/migrations/071-service-operation-origins.sql +187 -0
- package/db/migrations/072-observation-versions.sql +29 -0
- package/db/migrations/073-registry-corrections.sql +45 -0
- package/db/migrations/074-work-graph-ref-kinds.sql +39 -0
- package/db/migrations/075-agent-judgments.sql +58 -0
- package/db/migrations/076-scoped-checkpoint-bindings.sql +15 -0
- package/db/migrations/077-legacy-record-kind.sql +6 -0
- package/db/migrations/078-source-ingest-commands.sql +18 -0
- package/db/migrations/079-twin-edge-relations.sql +43 -0
- package/db/migrations/080-restore-duration-days.sql +7 -0
- package/db/migrations/081-mailbox.sql +61 -0
- package/db/migrations/082-commitments-row-id.sql +12 -0
- package/db/migrations/083-observation-is-the-evidence.sql +49 -0
- package/db/migrations/084-scope-kind-is-not-the-cores-to-list.sql +34 -0
- package/db/migrations/085-a-migration-has-a-source.sql +37 -0
- package/db/migrations/086-the-mailbox-is-generic.sql +110 -0
- package/db/migrations/087-mailbox-payload.sql +5 -0
- package/db/migrations/088-native-input-journal.sql +14 -0
- package/db/migrations/089-native-turn-receipt-lookup.sql +3 -0
- package/db/migrations/090-model-run-native-inputs.sql +29 -0
- package/db/migrations/091-native-turn-results.sql +11 -0
- package/db/migrations/092-restore-decision-fts.sql +34 -0
- package/db/migrations/093-native-turn-primary-kind.sql +14 -0
- package/db/migrations/094-commitment-run-provenance.sql +9 -0
- package/db/migrations/095-model-run-native-input-identity.sql +39 -0
- package/db/migrations/096-drop-connector-event-index-fts.sql +9 -0
- package/db/migrations/097-native-input-json-validity.sql +37 -0
- package/db/migrations/098-workflow-memory-kind.sql +105 -0
- package/dist/action-contracts.d.ts +212 -0
- package/dist/action-contracts.js +10 -0
- package/dist/api/catalog.d.ts +118 -0
- package/dist/api/catalog.js +1756 -0
- package/dist/api/dispatch.d.ts +76 -0
- package/dist/api/dispatch.js +372 -0
- package/dist/canonicalize.d.ts +2 -2
- package/dist/canonicalize.js +3 -3
- package/dist/client/client.d.ts +33 -0
- package/dist/client/client.js +123 -0
- package/dist/client/ipc.d.ts +81 -0
- package/dist/client/ipc.js +314 -0
- package/dist/db-adapter/base-adapter.d.ts +6 -66
- package/dist/db-adapter/base-adapter.js +6 -6
- package/dist/db-adapter/index.d.ts +5 -5
- package/dist/db-adapter/index.js +2 -5
- package/dist/db-adapter/node-sqlite-adapter.d.ts +85 -15
- package/dist/db-adapter/node-sqlite-adapter.js +1968 -570
- package/dist/db-manager.d.ts +53 -97
- package/dist/db-manager.js +121 -603
- package/dist/embedding/embedder.d.ts +132 -0
- package/dist/embedding/embedder.js +299 -0
- package/dist/identity/principal-repository.d.ts +2 -2
- package/dist/index.d.ts +43 -58
- package/dist/index.js +97 -145
- package/dist/{context-compile/channel-grant.d.ts → knowledge/access.d.ts} +12 -17
- package/dist/knowledge/access.js +663 -0
- package/dist/knowledge/case-errors.d.ts +31 -0
- package/dist/knowledge/case-errors.js +40 -0
- package/dist/{cases/search-rollup.d.ts → knowledge/case-search-rollup.d.ts} +5 -4
- package/dist/{cases/search-rollup.js → knowledge/case-search-rollup.js} +6 -8
- package/dist/{cases/store.d.ts → knowledge/case-store.d.ts} +3 -6
- package/dist/{cases/store.js → knowledge/case-store.js} +7 -42
- package/dist/{cases/timeline-range.d.ts → knowledge/case-timeline-range.d.ts} +3 -3
- package/dist/{cases/timeline-range.js → knowledge/case-timeline-range.js} +47 -25
- package/dist/{cases/types.d.ts → knowledge/case-types.d.ts} +8 -2
- package/dist/{cases/types.js → knowledge/case-types.js} +1 -1
- package/dist/knowledge/commitments.d.ts +188 -0
- package/dist/knowledge/commitments.js +370 -0
- package/dist/knowledge/decision-edges.d.ts +70 -0
- package/dist/knowledge/decision-edges.js +123 -0
- package/dist/{agent-graph/types.d.ts → knowledge/graph-query.d.ts} +80 -70
- package/dist/knowledge/graph-query.js +1585 -0
- package/dist/knowledge/identity.d.ts +16 -0
- package/dist/knowledge/identity.js +22 -0
- package/dist/knowledge/index.d.ts +47 -0
- package/dist/knowledge/index.js +90 -0
- package/dist/knowledge/judgments.d.ts +118 -0
- package/dist/knowledge/judgments.js +808 -0
- package/dist/knowledge/observations.d.ts +160 -0
- package/dist/knowledge/observations.js +449 -0
- package/dist/knowledge/question-type.d.ts +34 -0
- package/dist/knowledge/question-type.js +70 -0
- package/dist/{search → knowledge}/ranker-features.js +1 -1
- package/dist/{search → knowledge}/search-quality.d.ts +0 -1
- package/dist/knowledge/search.d.ts +38 -0
- package/dist/knowledge/search.js +91 -0
- package/dist/knowledge/source-ingest.d.ts +65 -0
- package/dist/knowledge/source-ingest.js +174 -0
- package/dist/{edges/types.d.ts → knowledge/twin-edge-types.d.ts} +31 -4
- package/dist/{edges/types.js → knowledge/twin-edge-types.js} +13 -2
- package/dist/knowledge/work-dates.d.ts +49 -0
- package/dist/knowledge/work-dates.js +120 -0
- package/dist/mama-api.d.ts +114 -778
- package/dist/mama-api.js +313 -2461
- package/dist/memory/api.d.ts +264 -24
- package/dist/memory/api.js +1633 -843
- package/dist/memory/bootstrap-builder.d.ts +2 -1
- package/dist/memory/bootstrap-builder.js +5 -5
- package/dist/memory/channel-summary-state-store.d.ts +3 -2
- package/dist/memory/channel-summary-state-store.js +53 -51
- package/dist/memory/channel-summary-store.d.ts +5 -3
- package/dist/memory/channel-summary-store.js +3 -8
- package/dist/memory/dashboard-read.d.ts +46 -0
- package/dist/memory/dashboard-read.js +94 -0
- package/dist/memory/event-store.d.ts +3 -3
- package/dist/memory/event-store.js +3 -10
- package/dist/memory/finding-store.d.ts +3 -2
- package/dist/memory/finding-store.js +2 -7
- package/dist/memory/graph-read.d.ts +52 -0
- package/dist/memory/graph-read.js +130 -0
- package/dist/memory/judgment-types.d.ts +394 -0
- package/dist/memory/judgment-types.js +16 -0
- package/dist/memory/provenance-audit.d.ts +5 -2
- package/dist/memory/provenance-audit.js +8 -14
- package/dist/memory/provenance-live.d.ts +141 -0
- package/dist/memory/provenance-live.js +409 -0
- package/dist/memory/provenance-query.d.ts +5 -4
- package/dist/memory/provenance-query.js +21 -29
- package/dist/memory/provenance-resolver.d.ts +191 -0
- package/dist/memory/provenance-resolver.js +155 -0
- package/dist/memory/provenance.d.ts +1 -11
- package/dist/memory/provenance.js +2 -33
- package/dist/memory/recall-sanitize.d.ts +55 -0
- package/dist/memory/recall-sanitize.js +144 -0
- package/dist/memory/secret-filter.d.ts +32 -0
- package/dist/memory/secret-filter.js +126 -0
- package/dist/memory/truth-store.d.ts +2 -1
- package/dist/memory/truth-store.js +1 -4
- package/dist/memory/types.d.ts +74 -24
- package/dist/memory/types.js +75 -5
- package/dist/memory/write-adapters.d.ts +98 -0
- package/dist/memory/write-adapters.js +242 -0
- package/dist/operations/owner-action-effects.d.ts +53 -0
- package/dist/operations/owner-action-effects.js +96 -0
- package/dist/provenance/source-ref.d.ts +1 -1
- package/dist/provenance/source-ref.js +0 -2
- package/dist/registry/corrections.d.ts +31 -0
- package/dist/registry/corrections.js +332 -0
- package/dist/registry/record-identity.d.ts +49 -0
- package/dist/registry/record-identity.js +133 -0
- package/dist/registry/store.d.ts +101 -0
- package/dist/registry/store.js +395 -0
- package/dist/registry/types.d.ts +28 -0
- package/dist/registry/types.js +5 -0
- package/dist/relevance-scorer.js +2 -2
- package/dist/runtime/agent-event-bus.d.ts +50 -0
- package/dist/runtime/agent-event-bus.js +101 -0
- package/dist/runtime/drivers/claude-cli-wrapper.d.ts +155 -0
- package/dist/runtime/drivers/claude-cli-wrapper.js +392 -0
- package/dist/runtime/drivers/cli-arg-redaction.d.ts +2 -0
- package/dist/runtime/drivers/cli-arg-redaction.js +18 -0
- package/dist/runtime/drivers/cli-secret-redaction.d.ts +17 -0
- package/dist/runtime/drivers/cli-secret-redaction.js +126 -0
- package/dist/runtime/drivers/codex-app-server-process.d.ts +277 -0
- package/dist/runtime/drivers/codex-app-server-process.js +2342 -0
- package/dist/runtime/drivers/codex-auxiliary-tools.d.ts +17 -0
- package/dist/runtime/drivers/codex-auxiliary-tools.js +267 -0
- package/dist/runtime/drivers/codex-home.d.ts +20 -0
- package/dist/runtime/drivers/codex-home.js +674 -0
- package/dist/runtime/drivers/codex-thread-registry.d.ts +63 -0
- package/dist/runtime/drivers/codex-thread-registry.js +433 -0
- package/dist/runtime/drivers/persistent-cli-adapter.d.ts +160 -0
- package/dist/runtime/drivers/persistent-cli-adapter.js +396 -0
- package/dist/runtime/drivers/persistent-cli-process.d.ts +424 -0
- package/dist/runtime/drivers/persistent-cli-process.js +1543 -0
- package/dist/runtime/drivers/types.d.ts +456 -0
- package/dist/runtime/drivers/types.js +110 -0
- package/dist/runtime/mailbox.d.ts +223 -0
- package/dist/runtime/mailbox.js +582 -0
- package/dist/runtime/model-run-store.d.ts +28 -0
- package/dist/{model-runs/store.js → runtime/model-run-store.js} +81 -41
- package/dist/{model-runs/types.d.ts → runtime/model-run-types.d.ts} +33 -4
- package/dist/{model-runs/types.js → runtime/model-run-types.js} +1 -1
- package/dist/runtime/native-effect-observer.d.ts +22 -0
- package/dist/runtime/native-effect-observer.js +103 -0
- package/dist/runtime/native-input-journal.d.ts +46 -0
- package/dist/runtime/native-input-journal.js +308 -0
- package/dist/runtime/native-prompt.d.ts +118 -0
- package/dist/runtime/native-prompt.js +496 -0
- package/dist/runtime/native-session.d.ts +10 -0
- package/dist/{agent-graph/index.js → runtime/native-session.js} +9 -6
- package/dist/runtime/native-tool-trace-observer.d.ts +5 -0
- package/dist/runtime/native-tool-trace-observer.js +65 -0
- package/dist/runtime/native-turn.d.ts +272 -0
- package/dist/runtime/native-turn.js +1041 -0
- package/dist/runtime/operations.d.ts +236 -0
- package/dist/runtime/operations.js +565 -0
- package/dist/runtime/post-tool-handler.d.ts +74 -0
- package/dist/runtime/post-tool-handler.js +137 -0
- package/dist/runtime/prompt-layers.d.ts +126 -0
- package/dist/runtime/prompt-layers.js +239 -0
- package/dist/runtime/runtime-process.d.ts +102 -0
- package/dist/runtime/runtime-process.js +206 -0
- package/dist/runtime/runtime.d.ts +278 -0
- package/dist/runtime/runtime.js +563 -0
- package/dist/runtime/session-pool.d.ts +176 -0
- package/dist/runtime/session-pool.js +369 -0
- package/dist/runtime/stimulus-payload.d.ts +5 -0
- package/dist/runtime/stimulus-payload.js +50 -0
- package/dist/runtime/subagent-bridge.d.ts +24 -0
- package/dist/{agent-graph/types.js → runtime/subagent-bridge.js} +1 -1
- package/dist/runtime/text-completion.d.ts +22 -0
- package/dist/{agent-situation/types.js → runtime/text-completion.js} +1 -1
- package/dist/runtime/token-estimator.d.ts +25 -0
- package/dist/runtime/token-estimator.js +75 -0
- package/dist/runtime/tool-trace-store.d.ts +22 -0
- package/dist/{model-runs → runtime}/tool-trace-store.js +46 -27
- package/dist/runtime/trace-summary.d.ts +5 -0
- package/dist/runtime/trace-summary.js +74 -0
- package/dist/runtime/turn-text.d.ts +23 -0
- package/dist/runtime/turn-text.js +41 -0
- package/dist/storage/database.d.ts +67 -0
- package/dist/storage/database.js +158 -0
- package/package.json +20 -34
- package/dist/agent-graph/alias-write.d.ts +0 -3
- package/dist/agent-graph/alias-write.js +0 -234
- package/dist/agent-graph/entity-resolve.d.ts +0 -3
- package/dist/agent-graph/entity-resolve.js +0 -271
- package/dist/agent-graph/errors.d.ts +0 -4
- package/dist/agent-graph/errors.js +0 -11
- package/dist/agent-graph/graph-query.d.ts +0 -5
- package/dist/agent-graph/graph-query.js +0 -360
- package/dist/agent-graph/index.d.ts +0 -6
- package/dist/agent-situation/builder.d.ts +0 -8
- package/dist/agent-situation/builder.js +0 -239
- package/dist/agent-situation/cache-key.d.ts +0 -4
- package/dist/agent-situation/cache-key.js +0 -64
- package/dist/agent-situation/index.d.ts +0 -7
- package/dist/agent-situation/index.js +0 -28
- package/dist/agent-situation/packet-store.d.ts +0 -27
- package/dist/agent-situation/packet-store.js +0 -228
- package/dist/agent-situation/ranking-policy.d.ts +0 -18
- package/dist/agent-situation/ranking-policy.js +0 -75
- package/dist/agent-situation/source-readers.d.ts +0 -52
- package/dist/agent-situation/source-readers.js +0 -300
- package/dist/agent-situation/types.d.ts +0 -195
- package/dist/cases/wiki-page-index.d.ts +0 -37
- package/dist/cases/wiki-page-index.js +0 -201
- package/dist/config-loader.d.ts +0 -68
- package/dist/config-loader.js +0 -239
- package/dist/connectors/event-index.d.ts +0 -24
- package/dist/connectors/event-index.js +0 -245
- package/dist/connectors/raw-query.d.ts +0 -40
- package/dist/connectors/raw-query.js +0 -412
- package/dist/connectors/types.d.ts +0 -117
- package/dist/connectors/types.js +0 -3
- package/dist/context-compile/boundary-defaults.d.ts +0 -12
- package/dist/context-compile/boundary-defaults.js +0 -105
- package/dist/context-compile/channel-grant.js +0 -66
- package/dist/context-compile/compiler-policy.d.ts +0 -39
- package/dist/context-compile/compiler-policy.js +0 -147
- package/dist/context-compile/compiler.d.ts +0 -18
- package/dist/context-compile/compiler.js +0 -404
- package/dist/context-compile/index.d.ts +0 -10
- package/dist/context-compile/index.js +0 -26
- package/dist/context-compile/packet-store.d.ts +0 -8
- package/dist/context-compile/packet-store.js +0 -239
- package/dist/context-compile/ref.d.ts +0 -7
- package/dist/context-compile/ref.js +0 -102
- package/dist/context-compile/source-readers.d.ts +0 -70
- package/dist/context-compile/source-readers.js +0 -840
- package/dist/context-compile/types.d.ts +0 -155
- package/dist/context-compile/types.js +0 -11
- package/dist/context-compile/visibility.d.ts +0 -21
- package/dist/context-compile/visibility.js +0 -224
- package/dist/decision-tracker.d.ts +0 -206
- package/dist/decision-tracker.js +0 -481
- package/dist/edges/ref-validation.d.ts +0 -7
- package/dist/edges/ref-validation.js +0 -321
- package/dist/edges/store.d.ts +0 -8
- package/dist/edges/store.js +0 -129
- package/dist/embedding-client.d.ts +0 -28
- package/dist/embedding-client.js +0 -53
- package/dist/embedding-server/index.d.ts +0 -67
- package/dist/embedding-server/index.js +0 -405
- package/dist/embedding-server/mobile/auth.d.ts +0 -44
- package/dist/embedding-server/mobile/auth.js +0 -150
- package/dist/embedding-server/mobile/daemon.d.ts +0 -129
- package/dist/embedding-server/mobile/daemon.js +0 -313
- package/dist/embedding-server/mobile/output-parser.d.ts +0 -115
- package/dist/embedding-server/mobile/output-parser.js +0 -241
- package/dist/embedding-server/mobile/session-api.d.ts +0 -57
- package/dist/embedding-server/mobile/session-api.js +0 -261
- package/dist/embedding-server/mobile/session-manager.d.ts +0 -138
- package/dist/embedding-server/mobile/session-manager.js +0 -378
- package/dist/embedding-server/mobile/websocket-handler.d.ts +0 -137
- package/dist/embedding-server/mobile/websocket-handler.js +0 -486
- package/dist/embeddings.d.ts +0 -68
- package/dist/embeddings.js +0 -244
- package/dist/entities/audit-metrics.d.ts +0 -68
- package/dist/entities/audit-metrics.js +0 -124
- package/dist/entities/candidate-generator.d.ts +0 -8
- package/dist/entities/candidate-generator.js +0 -24
- package/dist/entities/entity-linked-decision-counts.d.ts +0 -2
- package/dist/entities/entity-linked-decision-counts.js +0 -29
- package/dist/entities/entity-list.d.ts +0 -22
- package/dist/entities/entity-list.js +0 -3
- package/dist/entities/entity-orphan-list.d.ts +0 -17
- package/dist/entities/entity-orphan-list.js +0 -3
- package/dist/entities/entity-search.d.ts +0 -20
- package/dist/entities/entity-search.js +0 -3
- package/dist/entities/errors.d.ts +0 -55
- package/dist/entities/errors.js +0 -100
- package/dist/entities/lineage-store.d.ts +0 -28
- package/dist/entities/lineage-store.js +0 -204
- package/dist/entities/normalization.d.ts +0 -14
- package/dist/entities/normalization.js +0 -63
- package/dist/entities/policy-store.d.ts +0 -8
- package/dist/entities/policy-store.js +0 -75
- package/dist/entities/policy-types.d.ts +0 -72
- package/dist/entities/policy-types.js +0 -59
- package/dist/entities/projection.d.ts +0 -8
- package/dist/entities/projection.js +0 -82
- package/dist/entities/provenance-query.d.ts +0 -32
- package/dist/entities/provenance-query.js +0 -3
- package/dist/entities/read-identity.d.ts +0 -31
- package/dist/entities/read-identity.js +0 -264
- package/dist/entities/recall-bridge.d.ts +0 -5
- package/dist/entities/recall-bridge.js +0 -171
- package/dist/entities/resolution-engine.d.ts +0 -8
- package/dist/entities/resolution-engine.js +0 -3
- package/dist/entities/rollback-preview.d.ts +0 -35
- package/dist/entities/rollback-preview.js +0 -3
- package/dist/entities/source-locator.d.ts +0 -3
- package/dist/entities/source-locator.js +0 -32
- package/dist/entities/store.d.ts +0 -69
- package/dist/entities/store.js +0 -544
- package/dist/entities/types.d.ts +0 -166
- package/dist/entities/types.js +0 -30
- package/dist/memory/extraction-prompt.d.ts +0 -4
- package/dist/memory/extraction-prompt.js +0 -89
- package/dist/memory/scope-backfill.d.ts +0 -14
- package/dist/memory/scope-backfill.js +0 -3
- package/dist/memory/scope-store.d.ts +0 -4
- package/dist/memory/scope-store.js +0 -9
- package/dist/memory-store.d.ts +0 -87
- package/dist/memory-store.js +0 -78
- package/dist/model-runs/store.d.ts +0 -13
- package/dist/model-runs/tool-trace-store.d.ts +0 -8
- package/dist/notification-manager.d.ts +0 -7
- package/dist/notification-manager.js +0 -12
- package/dist/outcome-tracker.d.ts +0 -151
- package/dist/outcome-tracker.js +0 -271
- package/dist/query-intent.d.ts +0 -23
- package/dist/query-intent.js +0 -114
- package/dist/runtime/trusted-provenance.d.ts +0 -3
- package/dist/runtime/trusted-provenance.js +0 -6
- package/dist/search/question-type.d.ts +0 -5
- package/dist/search/question-type.js +0 -41
- package/dist/test-utils.d.ts +0 -80
- package/dist/test-utils.js +0 -218
- package/dist/tier-validator.d.ts +0 -43
- package/dist/tier-validator.js +0 -159
- package/dist/time-formatter.d.ts +0 -25
- package/dist/time-formatter.js +0 -93
- /package/dist/{search → knowledge}/feedback-store.d.ts +0 -0
- /package/dist/{search → knowledge}/feedback-store.js +0 -0
- /package/dist/{search → knowledge}/ranker-features.d.ts +0 -0
- /package/dist/{search → knowledge}/ranker-rescore.d.ts +0 -0
- /package/dist/{search → knowledge}/ranker-rescore.js +0 -0
- /package/dist/{search → knowledge}/ranker-trainer.d.ts +0 -0
- /package/dist/{search → knowledge}/ranker-trainer.js +0 -0
- /package/dist/{search → knowledge}/search-quality.js +0 -0
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OBSERVATION_COLUMNS = void 0;
|
|
4
|
+
exports.parseSourceRef = parseSourceRef;
|
|
5
|
+
exports.isEventVisibleNow = isEventVisibleNow;
|
|
6
|
+
exports.toIndexedEvent = toIndexedEvent;
|
|
7
|
+
exports.isMessageRefVisible = isMessageRefVisible;
|
|
8
|
+
exports.resolveMemoryProvenanceLive = resolveMemoryProvenanceLive;
|
|
9
|
+
const access_js_1 = require("../knowledge/access.js");
|
|
10
|
+
const provenance_query_js_1 = require("./provenance-query.js");
|
|
11
|
+
const provenance_resolver_js_1 = require("./provenance-resolver.js");
|
|
12
|
+
/** The columns the predicate needs. Shared so a test reads exactly what production does. */
|
|
13
|
+
/**
|
|
14
|
+
* The evidence columns, read from observations under the names the resolver uses.
|
|
15
|
+
*
|
|
16
|
+
* This selected them from the connector event index, which is how "what does this
|
|
17
|
+
* memory rest on" came to require the connector package. An observation is what a
|
|
18
|
+
* judgment rests on, and it is the core's own table.
|
|
19
|
+
*/
|
|
20
|
+
exports.OBSERVATION_COLUMNS = `observation_id AS event_index_id, source AS source_connector,
|
|
21
|
+
source_id, channel, body AS content, observed_at, source_at,
|
|
22
|
+
memory_scope_kind, memory_scope_id, project_id, tenant_id`;
|
|
23
|
+
/**
|
|
24
|
+
* Statuses every memory read path excludes (source-readers.ts:293, and recall's own
|
|
25
|
+
* history exclusion). Mirrored so a citation cannot present a retired record as current.
|
|
26
|
+
*/
|
|
27
|
+
const RETIRED_MEMORY_STATUSES = new Set(['superseded', 'quarantined', 'contradicted', 'stale']);
|
|
28
|
+
/**
|
|
29
|
+
* Parse a stored source ref into what it actually is.
|
|
30
|
+
*
|
|
31
|
+
* The shapes here were measured, not guessed. Of the source refs on this machine 13,403
|
|
32
|
+
* are `memory:`, 1,748 are `envelope:`, 9 are `message:` and none are `raw:`. An earlier
|
|
33
|
+
* version of this parser understood only `raw:` and reported every real memory as
|
|
34
|
+
* `unsupported_ref` - a tool that was wired, callable, and answered nothing.
|
|
35
|
+
*/
|
|
36
|
+
function parseSourceRef(ref) {
|
|
37
|
+
const separator = ref.indexOf(':');
|
|
38
|
+
if (separator <= 0 || separator === ref.length - 1) {
|
|
39
|
+
return { kind: 'unsupported' };
|
|
40
|
+
}
|
|
41
|
+
const prefix = ref.slice(0, separator);
|
|
42
|
+
const rest = ref.slice(separator + 1);
|
|
43
|
+
if (prefix === 'memory' || prefix === 'envelope' || prefix === 'message') {
|
|
44
|
+
return { kind: prefix, id: rest };
|
|
45
|
+
}
|
|
46
|
+
if (prefix !== 'raw') {
|
|
47
|
+
return { kind: 'unsupported' };
|
|
48
|
+
}
|
|
49
|
+
// `raw:<connector>:<event_index_id>`. Split on the FIRST colon of the remainder so a
|
|
50
|
+
// colon inside the id cannot shift the boundary.
|
|
51
|
+
const inner = rest.indexOf(':');
|
|
52
|
+
if (inner <= 0 || inner === rest.length - 1) {
|
|
53
|
+
return { kind: 'unsupported' };
|
|
54
|
+
}
|
|
55
|
+
return { kind: 'raw', connector: rest.slice(0, inner), eventIndexId: rest.slice(inner + 1) };
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* The time bound, shared by both branches.
|
|
59
|
+
*
|
|
60
|
+
* An event with no timestamp at all cannot satisfy a bound the reader applies to a
|
|
61
|
+
* COALESCE of two columns, so it is excluded whenever one is set.
|
|
62
|
+
*/
|
|
63
|
+
function isWithinObservedWindow(event, options) {
|
|
64
|
+
const min = options.minObservedMs ?? null;
|
|
65
|
+
const max = options.maxObservedMs ?? null;
|
|
66
|
+
if (min === null && max === null)
|
|
67
|
+
return true;
|
|
68
|
+
const observedMs = event.observedAt === null ? null : Date.parse(event.observedAt);
|
|
69
|
+
if (observedMs === null || Number.isNaN(observedMs))
|
|
70
|
+
return false;
|
|
71
|
+
return (min === null || observedMs >= min) && (max === null || observedMs <= max);
|
|
72
|
+
}
|
|
73
|
+
function isWithinSourceWindow(event, maxSourceMs) {
|
|
74
|
+
if (maxSourceMs === undefined || maxSourceMs === null)
|
|
75
|
+
return true;
|
|
76
|
+
if (!Number.isSafeInteger(maxSourceMs) || maxSourceMs < 0) {
|
|
77
|
+
throw new Error('Provenance source ceiling must be a nonnegative epoch-millisecond integer');
|
|
78
|
+
}
|
|
79
|
+
if (event.sourceAt === null || event.sourceAt === undefined)
|
|
80
|
+
return false;
|
|
81
|
+
const sourceMs = Date.parse(event.sourceAt);
|
|
82
|
+
return Number.isFinite(sourceMs) && sourceMs <= maxSourceMs;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Whether an event may be shown under the authority active now.
|
|
86
|
+
*
|
|
87
|
+
* When a channel grant is supplied this DELEGATES to the shared rule rather than copying
|
|
88
|
+
* it. The previous version copied the reader clause for clause and said so in a comment,
|
|
89
|
+
* which held until the reader changed - then the copy silently became a different rule
|
|
90
|
+
* that refused excerpts for the very events the reader was citing. The differential test
|
|
91
|
+
* meant to catch that kept passing, because its fixtures never set a grant.
|
|
92
|
+
*
|
|
93
|
+
* "A shared predicate would be better than a faithful copy" is what the old comment here
|
|
94
|
+
* said. It was right.
|
|
95
|
+
*
|
|
96
|
+
* Without a grant the pre-grant rule still applies, so callers that have not been given
|
|
97
|
+
* one behave exactly as before.
|
|
98
|
+
*/
|
|
99
|
+
function isEventVisibleNow(event, options) {
|
|
100
|
+
const { scopes, connectors } = options;
|
|
101
|
+
if (options.wideConnectors?.includes(event.connector) && connectors.includes(event.connector)) {
|
|
102
|
+
return (isWithinSourceWindow(event, options.maxSourceMs) && isWithinObservedWindow(event, options));
|
|
103
|
+
}
|
|
104
|
+
if (options.channels) {
|
|
105
|
+
return ((0, access_js_1.isChannelGranted)(event.connector, event.channel, options.channels) &&
|
|
106
|
+
isWithinSourceWindow(event, options.maxSourceMs) &&
|
|
107
|
+
isWithinObservedWindow(event, options));
|
|
108
|
+
}
|
|
109
|
+
const projectIds = options.projectIds ?? [];
|
|
110
|
+
const tenantId = options.tenantId ?? null;
|
|
111
|
+
// The reader's own guard: no connectors or no scopes means no raw events at all.
|
|
112
|
+
if (connectors.length === 0 || scopes.length === 0) {
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
if (!connectors.includes(event.connector)) {
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
const hasGlobalSystemScope = scopes.some((scope) => scope.kind === 'global' && scope.id === 'system');
|
|
119
|
+
const hasScopedVisibility = scopes.some((scope) => !(scope.kind === 'global' && scope.id === 'system')) ||
|
|
120
|
+
projectIds.length > 0 ||
|
|
121
|
+
Boolean(tenantId);
|
|
122
|
+
const includesLegacyGlobalSystem = hasGlobalSystemScope && !hasScopedVisibility;
|
|
123
|
+
if (projectIds.length > 0) {
|
|
124
|
+
const projectMatches = (event.projectId !== null &&
|
|
125
|
+
event.projectId !== undefined &&
|
|
126
|
+
projectIds.includes(event.projectId)) ||
|
|
127
|
+
(includesLegacyGlobalSystem && (event.projectId ?? null) === null);
|
|
128
|
+
if (!projectMatches) {
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
if (tenantId) {
|
|
133
|
+
const tenantMatches = event.tenantId === tenantId ||
|
|
134
|
+
(includesLegacyGlobalSystem && (event.tenantId ?? null) === null);
|
|
135
|
+
if (!tenantMatches) {
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
if (!isWithinSourceWindow(event, options.maxSourceMs) ||
|
|
140
|
+
!isWithinObservedWindow(event, options)) {
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
const scope = event.memoryScope ?? null;
|
|
144
|
+
if (!scope) {
|
|
145
|
+
return includesLegacyGlobalSystem;
|
|
146
|
+
}
|
|
147
|
+
return scopes.some((active) => active.kind === scope.kind &&
|
|
148
|
+
(active.id === scope.id ||
|
|
149
|
+
// Rows written before the global/system alignment carry id 'global'.
|
|
150
|
+
(active.kind === 'global' && active.id === 'system' && scope.id === 'global')));
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* One column to epoch ms, with SQL's notion of "absent" and no other.
|
|
154
|
+
*
|
|
155
|
+
* `COALESCE` falls through on NULL and nothing else, so 0 and negative values are
|
|
156
|
+
* PRESENT to the reader. Treating them as missing - which this did, by requiring
|
|
157
|
+
* `value > 0` - made the mapper judge a different instant than the query: a row with
|
|
158
|
+
* `event_datetime = 0` compared as 0 in SQL and as its source timestamp here. The
|
|
159
|
+
* differential caught it the moment it was routed through the production mapper.
|
|
160
|
+
*
|
|
161
|
+
* The non-numeric string branch is DEFENSIVE, not faithful: SQLite orders a TEXT value
|
|
162
|
+
* above every INTEGER regardless of what it spells, so SQL would exclude such a row from
|
|
163
|
+
* any upper bound while `Date.parse` gives it a real instant. Unreachable - both columns
|
|
164
|
+
* are INTEGER-affinity, the write path passes a number, and all 30,671 live rows store
|
|
165
|
+
* integers - but it is a divergence if it ever runs, and better named than implied.
|
|
166
|
+
*/
|
|
167
|
+
function toEpochMs(value) {
|
|
168
|
+
if (typeof value === 'number') {
|
|
169
|
+
return Number.isFinite(value) ? value : null;
|
|
170
|
+
}
|
|
171
|
+
// better-sqlite3 returns bigint when safeIntegers is on. Nothing enables it today, but
|
|
172
|
+
// without this arm flipping that flag would null every timestamp and silently disable
|
|
173
|
+
// the time clamp entirely.
|
|
174
|
+
if (typeof value === 'bigint') {
|
|
175
|
+
return Number(value);
|
|
176
|
+
}
|
|
177
|
+
if (typeof value === 'string' && value.trim().length > 0) {
|
|
178
|
+
const numeric = Number(value);
|
|
179
|
+
if (Number.isFinite(numeric)) {
|
|
180
|
+
return numeric;
|
|
181
|
+
}
|
|
182
|
+
const parsed = Date.parse(value);
|
|
183
|
+
return Number.isNaN(parsed) ? null : parsed;
|
|
184
|
+
}
|
|
185
|
+
return null;
|
|
186
|
+
}
|
|
187
|
+
function coalesceObservedAt(eventDatetime, sourceTimestampMs) {
|
|
188
|
+
const ms = toEpochMs(eventDatetime) ?? toEpochMs(sourceTimestampMs);
|
|
189
|
+
return ms === null ? null : new Date(ms).toISOString();
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Row to the struct the predicate judges.
|
|
193
|
+
*
|
|
194
|
+
* Exported because it is the layer BELOW the predicate, and a differential that
|
|
195
|
+
* hand-builds its own struct proves the predicate mirrors the reader while leaving this
|
|
196
|
+
* mapping unjudged - which is where a scope-column coercion bug already lived once.
|
|
197
|
+
*/
|
|
198
|
+
function toIndexedEvent(row) {
|
|
199
|
+
const scopeKind = typeof row.memory_scope_kind === 'string' ? row.memory_scope_kind : null;
|
|
200
|
+
const scopeId = typeof row.memory_scope_id === 'string' ? row.memory_scope_id : null;
|
|
201
|
+
// Only a row with BOTH columns null is unscoped, because that is the only row the
|
|
202
|
+
// reader's `IS NULL AND IS NULL` clause matches. Collapsing a half-populated or
|
|
203
|
+
// empty-string row to "unscoped" would hand it the legacy allowance the reader denies.
|
|
204
|
+
const unscoped = scopeKind === null && scopeId === null;
|
|
205
|
+
return {
|
|
206
|
+
connector: String(row.source_connector ?? ''),
|
|
207
|
+
eventIndexId: String(row.event_index_id ?? ''),
|
|
208
|
+
sourceId: String(row.source_id ?? ''),
|
|
209
|
+
channel: typeof row.channel === 'string' ? row.channel : null,
|
|
210
|
+
// The capture instant first, the event's own time second -- the same order the
|
|
211
|
+
// raw reader's COALESCE uses, and pinned against it by a differential test.
|
|
212
|
+
observedAt: coalesceObservedAt(row.observed_at, row.source_at),
|
|
213
|
+
sourceAt: (() => {
|
|
214
|
+
const sourceMs = toEpochMs(row.source_at);
|
|
215
|
+
return sourceMs === null ? null : new Date(sourceMs).toISOString();
|
|
216
|
+
})(),
|
|
217
|
+
content: typeof row.content === 'string' ? row.content : '',
|
|
218
|
+
memoryScope: unscoped ? null : { kind: scopeKind ?? '', id: scopeId ?? '' },
|
|
219
|
+
projectId: typeof row.project_id === 'string' ? row.project_id : null,
|
|
220
|
+
tenantId: typeof row.tenant_id === 'string' ? row.tenant_id : null,
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
function stringOrNull(value) {
|
|
224
|
+
return typeof value === 'string' && value.trim().length > 0 ? value : null;
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Fetch a memory's provenance under the scopes active now.
|
|
228
|
+
*
|
|
229
|
+
* Two lookups on purpose. The first is scope-strict. Only if that finds nothing do we ask
|
|
230
|
+
* again admitting records with no scope bindings, and a record that appears only on the
|
|
231
|
+
* second pass is reported as legacy rather than as support. A memory that appears on
|
|
232
|
+
* neither is reported as unknown - never as "exists but withheld", which would confirm
|
|
233
|
+
* the existence of something outside the caller's scope.
|
|
234
|
+
*/
|
|
235
|
+
async function lookupWithLegacyFallback(adapter, memoryId, scopes) {
|
|
236
|
+
const scoped = await (0, provenance_query_js_1.getMemoryProvenance)(adapter, memoryId, { scopes });
|
|
237
|
+
if (scoped) {
|
|
238
|
+
return { record: scoped, legacy: false };
|
|
239
|
+
}
|
|
240
|
+
const unbound = await (0, provenance_query_js_1.getMemoryProvenance)(adapter, memoryId, {
|
|
241
|
+
scopes,
|
|
242
|
+
includeLegacyUnscoped: true,
|
|
243
|
+
});
|
|
244
|
+
return unbound ? { record: unbound, legacy: true } : null;
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* The stored record's status. `getMemoryProvenance` selects it nowhere, so this is a
|
|
248
|
+
* separate read rather than a field that was there all along - which is precisely why the
|
|
249
|
+
* status filter had no counterpart on this path for four review rounds.
|
|
250
|
+
*/
|
|
251
|
+
async function loadRetirement(adapter, memoryId) {
|
|
252
|
+
const row = adapter
|
|
253
|
+
.prepare(`SELECT status, superseded_by FROM decisions WHERE id = ? LIMIT 1`)
|
|
254
|
+
.get(memoryId);
|
|
255
|
+
const status = typeof row?.status === 'string' ? row.status : null;
|
|
256
|
+
const supersededBy = typeof row?.superseded_by === 'string' ? row.superseded_by : null;
|
|
257
|
+
return {
|
|
258
|
+
status,
|
|
259
|
+
// Either signal retires it: the reader filters on status, and recall additionally
|
|
260
|
+
// requires `superseded_by IS NULL`.
|
|
261
|
+
retired: (status !== null && RETIRED_MEMORY_STATUSES.has(status)) || supersededBy !== null,
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
async function loadRecord(adapter, memoryId, scopes) {
|
|
265
|
+
const found = await lookupWithLegacyFallback(adapter, memoryId, scopes);
|
|
266
|
+
if (!found) {
|
|
267
|
+
return null;
|
|
268
|
+
}
|
|
269
|
+
const record = found.record;
|
|
270
|
+
const retirement = await loadRetirement(adapter, record.memory_id);
|
|
271
|
+
const provenance = record.provenance;
|
|
272
|
+
const sourceRefs = record.source_refs.map(parseSourceRef);
|
|
273
|
+
// The judgment writer stores agent-chosen derived_from evidence in the
|
|
274
|
+
// canonical graph. Compact run provenance alone may name only the input that
|
|
275
|
+
// woke the agent; it must not hide those exact observed supports.
|
|
276
|
+
const seenObservations = new Set(sourceRefs.flatMap((ref) => (ref.kind === 'raw' ? [ref.eventIndexId] : [])));
|
|
277
|
+
const links = adapter
|
|
278
|
+
.prepare(`SELECT object_id FROM twin_edges
|
|
279
|
+
WHERE subject_kind='memory' AND subject_id=?
|
|
280
|
+
AND edge_type='derived_from' AND object_kind='observation'
|
|
281
|
+
ORDER BY created_at, edge_id`)
|
|
282
|
+
.all(memoryId);
|
|
283
|
+
for (const link of links) {
|
|
284
|
+
if (seenObservations.has(link.object_id))
|
|
285
|
+
continue;
|
|
286
|
+
seenObservations.add(link.object_id);
|
|
287
|
+
sourceRefs.push({ kind: 'observation', observationId: link.object_id });
|
|
288
|
+
}
|
|
289
|
+
return {
|
|
290
|
+
status: retirement.status,
|
|
291
|
+
retired: retirement.retired,
|
|
292
|
+
modelRunId: record.model_run_id,
|
|
293
|
+
contextPacketId: stringOrNull(provenance?.context_packet_id),
|
|
294
|
+
sourceRefs,
|
|
295
|
+
legacyUnscoped: found.legacy,
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Which supporting memories the caller may see, resolved up front.
|
|
300
|
+
*
|
|
301
|
+
* The pure resolver checks visibility synchronously, so this pre-answers it for the
|
|
302
|
+
* memory refs a record carries - typically a handful, up to fifty in the live corpus,
|
|
303
|
+
* and up to two lookups each, so ~100 serial round trips at the tail. Bounded and off
|
|
304
|
+
* the hot path (agent-invoked, not per-turn); the second lookup fires only for an
|
|
305
|
+
* ancestor with no scope bindings, of which the live corpus has two. Worth replacing
|
|
306
|
+
* with one bindings query if a memory ever carries hundreds of ancestors.
|
|
307
|
+
* Uses the SAME two-pass gate as the record itself, legacy pass included: an ancestor
|
|
308
|
+
* with no scope bindings is admitted exactly where an unbound record is, rather than
|
|
309
|
+
* reported out of scope because the second pass was skipped. An earlier docstring
|
|
310
|
+
* claimed that parity without the code doing it.
|
|
311
|
+
*/
|
|
312
|
+
async function resolveVisibleMemoryRefs(adapter, record, scopes) {
|
|
313
|
+
const visible = new Set();
|
|
314
|
+
if (!record) {
|
|
315
|
+
return visible;
|
|
316
|
+
}
|
|
317
|
+
const ids = new Set(record.sourceRefs.flatMap((ref) => (ref.kind === 'memory' ? [ref.id] : [])));
|
|
318
|
+
for (const id of ids) {
|
|
319
|
+
if (await lookupWithLegacyFallback(adapter, id, scopes)) {
|
|
320
|
+
visible.add(id);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
return visible;
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Whether a message ref may be named.
|
|
327
|
+
*
|
|
328
|
+
* `sourceMessageRef` is built as `source:channelId:turnId` (message-router.ts), and a
|
|
329
|
+
* channel scope id as `source:channelId` (scope-context.ts) - so a ref belongs to a
|
|
330
|
+
* caller's channel exactly when an active channel scope is its prefix. Compared as a
|
|
331
|
+
* prefix rather than parsed, because a turn id can itself contain a colon
|
|
332
|
+
* (`generated:<uuid>`) and splitting on the last one would silently mis-attribute it.
|
|
333
|
+
*
|
|
334
|
+
* This matters beyond tidiness: every memory carrying such a ref is also bound to
|
|
335
|
+
* global:system, which every caller holds, so an unchecked ref handed a private channel
|
|
336
|
+
* identifier to any agent that could read the memory at all.
|
|
337
|
+
*/
|
|
338
|
+
function isMessageRefVisible(ref, scopes) {
|
|
339
|
+
return scopes.some((scope) => scope.kind === 'channel' && ref.startsWith(`${scope.id}:`));
|
|
340
|
+
}
|
|
341
|
+
// Known limit, stated rather than discovered: the channel id space is not prefix-free.
|
|
342
|
+
// Real channel ids already contain colons, so a channel `S:X` produces refs that a caller
|
|
343
|
+
// scoped to `S` matches. Nothing in the ref format distinguishes "channel S, turn X:99"
|
|
344
|
+
// from "channel S:X, turn 99", so this cannot be resolved by parsing harder - it would
|
|
345
|
+
// take a delimiter the writer does not use. There are no such colliding pairs in the live
|
|
346
|
+
// scope table, so the guarantee holds on today's data rather than structurally.
|
|
347
|
+
/** Resolve one memory's support against the live index and the scopes active now. */
|
|
348
|
+
async function resolveMemoryProvenanceLive(adapter, memoryId, options) {
|
|
349
|
+
const record = await loadRecord(adapter, memoryId, options.scopes);
|
|
350
|
+
const visibleMemoryRefs = await resolveVisibleMemoryRefs(adapter, record, options.scopes);
|
|
351
|
+
const statement = adapter.prepare(`SELECT ${exports.OBSERVATION_COLUMNS}
|
|
352
|
+
FROM observation_versions
|
|
353
|
+
WHERE observation_id = ?
|
|
354
|
+
LIMIT 1`);
|
|
355
|
+
const ownInput = options.principalId
|
|
356
|
+
? adapter.prepare(`SELECT 1 FROM mailbox_inputs
|
|
357
|
+
WHERE stimulus_id=? AND principal_id=? AND kind IN ('scheduled','source_delta','native_event')
|
|
358
|
+
LIMIT 1`)
|
|
359
|
+
: null;
|
|
360
|
+
return (0, provenance_resolver_js_1.resolveMemoryProvenance)(memoryId, {
|
|
361
|
+
lookupMemoryProvenance: () => record,
|
|
362
|
+
lookupEvent: (connector, eventIndexId) => {
|
|
363
|
+
const row = statement.get(eventIndexId);
|
|
364
|
+
if (!row) {
|
|
365
|
+
return null;
|
|
366
|
+
}
|
|
367
|
+
const event = toIndexedEvent(row);
|
|
368
|
+
// The id is a hash of connector plus source id, so a connector mismatch means the
|
|
369
|
+
// ref was rewritten rather than that the event moved. Treat it as gone, not as data.
|
|
370
|
+
return event.connector === connector ? event : null;
|
|
371
|
+
},
|
|
372
|
+
lookupObservation: (observationId) => {
|
|
373
|
+
const row = statement.get(observationId);
|
|
374
|
+
return row ? toIndexedEvent(row) : null;
|
|
375
|
+
},
|
|
376
|
+
...(options.redact === undefined ? {} : { redact: options.redact }),
|
|
377
|
+
isSupportVisible: (support) => {
|
|
378
|
+
if (support.kind === 'memory') {
|
|
379
|
+
return visibleMemoryRefs.has(support.id);
|
|
380
|
+
}
|
|
381
|
+
if (support.kind === 'message') {
|
|
382
|
+
return (isMessageRefVisible(support.id, options.scopes) ||
|
|
383
|
+
Boolean(ownInput?.get(support.id, options.principalId)));
|
|
384
|
+
}
|
|
385
|
+
// Envelope hashes are emitted. The reason is NOT that the hash is inert - it is a
|
|
386
|
+
// lookup key into GET /api/memory/provenance, which serves unscoped results by
|
|
387
|
+
// hash and explicitly refuses scope filters (memory-provenance-handler.ts:26-33).
|
|
388
|
+
// What makes it safe is that the route sits behind requireAdminAuth
|
|
389
|
+
// (api/index.ts:215) and no role holding mama_provenance has an admin token or a
|
|
390
|
+
// shell. That is an access control in another file, so if this tool is ever
|
|
391
|
+
// granted to a role with either, revisit this line - the hash stops being safe
|
|
392
|
+
// before anything here changes.
|
|
393
|
+
return true;
|
|
394
|
+
},
|
|
395
|
+
isVisible: (event) => isEventVisibleNow(event, {
|
|
396
|
+
scopes: options.scopes,
|
|
397
|
+
connectors: options.connectors,
|
|
398
|
+
...(options.wideConnectors ? { wideConnectors: options.wideConnectors } : {}),
|
|
399
|
+
...(options.channels ? { channels: options.channels } : {}),
|
|
400
|
+
...(options.projectIds === undefined ? {} : { projectIds: options.projectIds }),
|
|
401
|
+
tenantId: options.tenantId ?? null,
|
|
402
|
+
minObservedMs: options.minObservedMs ?? null,
|
|
403
|
+
maxObservedMs: options.maxObservedMs ?? null,
|
|
404
|
+
maxSourceMs: options.maxSourceMs ?? null,
|
|
405
|
+
}),
|
|
406
|
+
...(options.excerptChars === undefined ? {} : { excerptChars: options.excerptChars }),
|
|
407
|
+
});
|
|
408
|
+
}
|
|
409
|
+
//# sourceMappingURL=provenance-live.js.map
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
+
import type { DatabaseAdapter } from '../db-manager.js';
|
|
1
2
|
import type { MemoryProvenanceRecord, MemoryScopeRef } from './types.js';
|
|
2
3
|
export interface MemoryProvenanceQueryOptions {
|
|
3
4
|
scopes?: MemoryScopeRef[];
|
|
4
5
|
includeLegacyUnscoped?: boolean;
|
|
5
6
|
limit?: number;
|
|
6
7
|
}
|
|
7
|
-
export declare function getMemoryProvenance(memoryId: string, options?: MemoryProvenanceQueryOptions): Promise<MemoryProvenanceRecord | null>;
|
|
8
|
-
export declare function listMemoriesByEnvelopeHash(envelopeHash: string, options?: MemoryProvenanceQueryOptions): Promise<MemoryProvenanceRecord[]>;
|
|
9
|
-
export declare function listMemoriesByGatewayCallId(gatewayCallId: string, options?: MemoryProvenanceQueryOptions): Promise<MemoryProvenanceRecord[]>;
|
|
10
|
-
export declare function listMemoriesByModelRunId(modelRunId: string, options?: MemoryProvenanceQueryOptions): Promise<MemoryProvenanceRecord[]>;
|
|
8
|
+
export declare function getMemoryProvenance(adapter: DatabaseAdapter, memoryId: string, options?: MemoryProvenanceQueryOptions): Promise<MemoryProvenanceRecord | null>;
|
|
9
|
+
export declare function listMemoriesByEnvelopeHash(adapter: DatabaseAdapter, envelopeHash: string, options?: MemoryProvenanceQueryOptions): Promise<MemoryProvenanceRecord[]>;
|
|
10
|
+
export declare function listMemoriesByGatewayCallId(adapter: DatabaseAdapter, gatewayCallId: string, options?: MemoryProvenanceQueryOptions): Promise<MemoryProvenanceRecord[]>;
|
|
11
|
+
export declare function listMemoriesByModelRunId(adapter: DatabaseAdapter, modelRunId: string, options?: MemoryProvenanceQueryOptions): Promise<MemoryProvenanceRecord[]>;
|
|
11
12
|
//# sourceMappingURL=provenance-query.d.ts.map
|
|
@@ -4,11 +4,8 @@ exports.getMemoryProvenance = getMemoryProvenance;
|
|
|
4
4
|
exports.listMemoriesByEnvelopeHash = listMemoriesByEnvelopeHash;
|
|
5
5
|
exports.listMemoriesByGatewayCallId = listMemoriesByGatewayCallId;
|
|
6
6
|
exports.listMemoriesByModelRunId = listMemoriesByModelRunId;
|
|
7
|
-
const db_manager_js_1 = require("../db-manager.js");
|
|
8
7
|
const event_store_js_1 = require("./event-store.js");
|
|
9
|
-
async function getMemoryProvenance(memoryId, options = {}) {
|
|
10
|
-
await (0, db_manager_js_1.initDB)();
|
|
11
|
-
const adapter = (0, db_manager_js_1.getAdapter)();
|
|
8
|
+
async function getMemoryProvenance(adapter, memoryId, options = {}) {
|
|
12
9
|
const row = adapter
|
|
13
10
|
.prepare(`
|
|
14
11
|
SELECT id, agent_id, model_run_id, envelope_hash, gateway_call_id,
|
|
@@ -17,25 +14,23 @@ async function getMemoryProvenance(memoryId, options = {}) {
|
|
|
17
14
|
WHERE id = ?
|
|
18
15
|
`)
|
|
19
16
|
.get(memoryId);
|
|
20
|
-
if (!row || !(await isVisibleMemory(row.id, options))) {
|
|
17
|
+
if (!row || !(await isVisibleMemory(adapter, row.id, options))) {
|
|
21
18
|
return null;
|
|
22
19
|
}
|
|
23
|
-
return toProvenanceRecord(row);
|
|
20
|
+
return toProvenanceRecord(adapter, row);
|
|
24
21
|
}
|
|
25
|
-
async function listMemoriesByEnvelopeHash(envelopeHash, options = {}) {
|
|
26
|
-
return listMemoriesByColumn('envelope_hash', envelopeHash, options);
|
|
22
|
+
async function listMemoriesByEnvelopeHash(adapter, envelopeHash, options = {}) {
|
|
23
|
+
return listMemoriesByColumn(adapter, 'envelope_hash', envelopeHash, options);
|
|
27
24
|
}
|
|
28
|
-
async function listMemoriesByGatewayCallId(gatewayCallId, options = {}) {
|
|
29
|
-
return listMemoriesByColumn('gateway_call_id', gatewayCallId, options);
|
|
25
|
+
async function listMemoriesByGatewayCallId(adapter, gatewayCallId, options = {}) {
|
|
26
|
+
return listMemoriesByColumn(adapter, 'gateway_call_id', gatewayCallId, options);
|
|
30
27
|
}
|
|
31
|
-
async function listMemoriesByModelRunId(modelRunId, options = {}) {
|
|
32
|
-
return listMemoriesByColumn('model_run_id', modelRunId, options);
|
|
28
|
+
async function listMemoriesByModelRunId(adapter, modelRunId, options = {}) {
|
|
29
|
+
return listMemoriesByColumn(adapter, 'model_run_id', modelRunId, options);
|
|
33
30
|
}
|
|
34
|
-
async function listMemoriesByColumn(column, value, options) {
|
|
35
|
-
await (0, db_manager_js_1.initDB)();
|
|
36
|
-
const adapter = (0, db_manager_js_1.getAdapter)();
|
|
31
|
+
async function listMemoriesByColumn(adapter, column, value, options) {
|
|
37
32
|
const limit = normalizeLimit(options.limit);
|
|
38
|
-
const visibility = buildVisibilityPredicate(options);
|
|
33
|
+
const visibility = buildVisibilityPredicate(adapter, options);
|
|
39
34
|
const rows = adapter
|
|
40
35
|
.prepare(`
|
|
41
36
|
SELECT d.id, d.agent_id, d.model_run_id, d.envelope_hash, d.gateway_call_id,
|
|
@@ -48,15 +43,15 @@ async function listMemoriesByColumn(column, value, options) {
|
|
|
48
43
|
.all(value, ...visibility.params, limit);
|
|
49
44
|
const records = [];
|
|
50
45
|
for (const row of rows) {
|
|
51
|
-
records.push(await toProvenanceRecord(row));
|
|
46
|
+
records.push(await toProvenanceRecord(adapter, row));
|
|
52
47
|
}
|
|
53
48
|
return records;
|
|
54
49
|
}
|
|
55
|
-
function buildVisibilityPredicate(options) {
|
|
50
|
+
function buildVisibilityPredicate(adapter, options) {
|
|
56
51
|
if (!hasScopeFilter(options)) {
|
|
57
52
|
return { sql: '', params: [] };
|
|
58
53
|
}
|
|
59
|
-
const scopeIds = resolveMemoryScopeIds(options.scopes);
|
|
54
|
+
const scopeIds = resolveMemoryScopeIds(adapter, options.scopes);
|
|
60
55
|
const legacyUnscopedPredicate = `
|
|
61
56
|
NOT EXISTS (
|
|
62
57
|
SELECT 1
|
|
@@ -89,18 +84,18 @@ function buildVisibilityPredicate(options) {
|
|
|
89
84
|
function hasScopeFilter(options) {
|
|
90
85
|
return Array.isArray(options.scopes) && options.scopes.length > 0;
|
|
91
86
|
}
|
|
92
|
-
function resolveMemoryScopeIds(scopes) {
|
|
87
|
+
function resolveMemoryScopeIds(adapter, scopes) {
|
|
93
88
|
const scopeIds = [];
|
|
94
89
|
for (const scope of scopes) {
|
|
95
|
-
const scopeId = resolveMemoryScopeId(scope.kind, scope.id);
|
|
90
|
+
const scopeId = resolveMemoryScopeId(adapter, scope.kind, scope.id);
|
|
96
91
|
if (scopeId) {
|
|
97
92
|
scopeIds.push(scopeId);
|
|
98
93
|
}
|
|
99
94
|
}
|
|
100
95
|
return scopeIds;
|
|
101
96
|
}
|
|
102
|
-
async function toProvenanceRecord(row) {
|
|
103
|
-
const events = await (0, event_store_js_1.listMemoryEventsForMemory)(row.id);
|
|
97
|
+
async function toProvenanceRecord(adapter, row) {
|
|
98
|
+
const events = await (0, event_store_js_1.listMemoryEventsForMemory)(adapter, row.id);
|
|
104
99
|
return {
|
|
105
100
|
memory_id: row.id,
|
|
106
101
|
agent_id: row.agent_id,
|
|
@@ -112,13 +107,11 @@ async function toProvenanceRecord(row) {
|
|
|
112
107
|
latest_event: events[0],
|
|
113
108
|
};
|
|
114
109
|
}
|
|
115
|
-
async function isVisibleMemory(memoryId, options) {
|
|
110
|
+
async function isVisibleMemory(adapter, memoryId, options) {
|
|
116
111
|
if (!hasScopeFilter(options)) {
|
|
117
112
|
return true;
|
|
118
113
|
}
|
|
119
|
-
|
|
120
|
-
const adapter = (0, db_manager_js_1.getAdapter)();
|
|
121
|
-
const scopeIds = resolveMemoryScopeIds(options.scopes);
|
|
114
|
+
const scopeIds = resolveMemoryScopeIds(adapter, options.scopes);
|
|
122
115
|
const bindingCount = adapter
|
|
123
116
|
.prepare(`
|
|
124
117
|
SELECT COUNT(*) as count
|
|
@@ -144,8 +137,7 @@ async function isVisibleMemory(memoryId, options) {
|
|
|
144
137
|
.get(memoryId, ...scopeIds);
|
|
145
138
|
return row?.visible === 1;
|
|
146
139
|
}
|
|
147
|
-
function resolveMemoryScopeId(kind, externalId) {
|
|
148
|
-
const adapter = (0, db_manager_js_1.getAdapter)();
|
|
140
|
+
function resolveMemoryScopeId(adapter, kind, externalId) {
|
|
149
141
|
const row = adapter
|
|
150
142
|
.prepare(`
|
|
151
143
|
SELECT id
|