@jungjaehoon/mama-core 2.4.1 → 4.1.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/db/migrations/099-commitment-revision-graph.sql +2 -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 +1985 -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/commitment-revision-migration.d.ts +4 -0
- package/dist/knowledge/commitment-revision-migration.js +50 -0
- package/dist/knowledge/commitments.d.ts +192 -0
- package/dist/knowledge/commitments.js +386 -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/judgment-edge.d.ts +6 -0
- package/dist/knowledge/judgment-edge.js +22 -0
- package/dist/knowledge/judgments.d.ts +118 -0
- package/dist/knowledge/judgments.js +802 -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 +152 -0
- package/dist/runtime/drivers/claude-cli-wrapper.js +375 -0
- package/dist/runtime/drivers/claude-effort.d.ts +4 -0
- package/dist/runtime/drivers/claude-effort.js +16 -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 +425 -0
- package/dist/runtime/drivers/persistent-cli-process.js +1529 -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,126 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Secret-pattern filter for recallable writes.
|
|
4
|
+
*
|
|
5
|
+
* The one real leak path a chat-reachable caller has is memory: a secret saved
|
|
6
|
+
* as a "decision" resurfaces later through search or recall. This filter
|
|
7
|
+
* refuses the write at the choke point, which is the action contract — every
|
|
8
|
+
* write that recall can return passes through here. Minimal gitleaks-style
|
|
9
|
+
* set: shapes, not entropy heuristics, so false positives stay near zero.
|
|
10
|
+
*
|
|
11
|
+
* It lives in core because the contract does. The patterns name provider key
|
|
12
|
+
* shapes and prompt-injection phrasing; nothing here knows a product.
|
|
13
|
+
*/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.SecretMaterialRefusedError = void 0;
|
|
16
|
+
exports.scanForSecrets = scanForSecrets;
|
|
17
|
+
exports.scanMemoryWriteInput = scanMemoryWriteInput;
|
|
18
|
+
exports.redactSecretPatterns = redactSecretPatterns;
|
|
19
|
+
const SECRET_PATTERNS = [
|
|
20
|
+
{
|
|
21
|
+
name: 'invisible-unicode',
|
|
22
|
+
pattern: /[\u200b-\u200d\ufeff\u2060\u202a-\u202e\u2066-\u2069]/,
|
|
23
|
+
},
|
|
24
|
+
// Built via concatenation so the literals never form secret shapes at rest
|
|
25
|
+
// (the repo's own PII/secret scanners would flag them - correctly).
|
|
26
|
+
{ name: 'anthropic-key', pattern: new RegExp('\\bsk-' + 'ant-[a-zA-Z0-9_-]{8,}') },
|
|
27
|
+
{
|
|
28
|
+
name: 'openai-key',
|
|
29
|
+
pattern: new RegExp('\\bsk-' + '(?:proj-[A-Za-z0-9_-]{20,}|[A-Za-z0-9]{20,}\\b)'),
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
name: 'github-token',
|
|
33
|
+
pattern: new RegExp('\\b(?:gh' + '[pousr]_[A-Za-z0-9]{20,}\\b|github_pat_[A-Za-z0-9_]{20,})'),
|
|
34
|
+
},
|
|
35
|
+
{ name: 'slack-token', pattern: new RegExp('\\bxox' + '[baprs]-[A-Za-z0-9-]{10,}\\b') },
|
|
36
|
+
{
|
|
37
|
+
name: 'telegram-bot-token',
|
|
38
|
+
pattern: new RegExp('\\b\\d{8,12}:' + 'AA[A-Za-z0-9_-]{30,}\\b'),
|
|
39
|
+
},
|
|
40
|
+
{ name: 'aws-access-key', pattern: new RegExp('\\bAKIA' + '[0-9A-Z]{16}\\b') },
|
|
41
|
+
{
|
|
42
|
+
name: 'private-key-block',
|
|
43
|
+
pattern: new RegExp('-----BEGIN [A-Z ]*' + 'PRIVATE KEY' + '-----'),
|
|
44
|
+
},
|
|
45
|
+
{ name: 'generic-bearer', pattern: new RegExp('\\bBearer\\s+' + '[A-Za-z0-9_-]{25,}\\b') },
|
|
46
|
+
];
|
|
47
|
+
const PROMPT_INJECTION_PATTERNS = [
|
|
48
|
+
/\bignore\s+(?:(?:all|any)\s+)?(?:previous|prior)\s+instructions\b/i,
|
|
49
|
+
/\bdisregard\s+.{0,20}(?:rules|instructions)\b/i,
|
|
50
|
+
/\byou\s+are\s+now\b/i,
|
|
51
|
+
/\bsystem\s+prompt\b/i,
|
|
52
|
+
];
|
|
53
|
+
class SecretMaterialRefusedError extends Error {
|
|
54
|
+
constructor(matches) {
|
|
55
|
+
super(`refusing to persist content matching ${matches.join(', ')} — a secret written here comes back through recall`);
|
|
56
|
+
this.name = 'secret_material_refused';
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
exports.SecretMaterialRefusedError = SecretMaterialRefusedError;
|
|
60
|
+
/** Scan text for secret-shaped material. */
|
|
61
|
+
function scanForSecrets(text) {
|
|
62
|
+
const matches = SECRET_PATTERNS.filter(({ pattern }) => pattern.test(text)).map(({ name }) => name);
|
|
63
|
+
const warnings = PROMPT_INJECTION_PATTERNS.some((pattern) => pattern.test(text))
|
|
64
|
+
? ['prompt-injection-suspect']
|
|
65
|
+
: [];
|
|
66
|
+
return { clean: matches.length === 0, matches, warnings };
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Scan every string reachable in a memory-write input (nested objects and
|
|
70
|
+
* arrays included, container-depth-capped): open_files arrays, scope ids, and source
|
|
71
|
+
* objects are persisted too and must not smuggle secrets past a top-level
|
|
72
|
+
* scan (review m1).
|
|
73
|
+
*/
|
|
74
|
+
function scanMemoryWriteInput(input) {
|
|
75
|
+
const texts = [];
|
|
76
|
+
let truncated = false;
|
|
77
|
+
const visit = (value, depth) => {
|
|
78
|
+
if (value === null || value === undefined) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
// Scan leaves of the deepest supported container too. Recallable page
|
|
82
|
+
// batches carry evidence at pages[].sourceRefs[].id (a depth-five leaf).
|
|
83
|
+
if (typeof value === 'string') {
|
|
84
|
+
texts.push(value);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (typeof value !== 'object') {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
if (depth > 4) {
|
|
91
|
+
// Fail CLOSED: an abnormally deep memory-write payload is refused, never
|
|
92
|
+
// silently under-scanned (a secret below the cap must not pass as clean).
|
|
93
|
+
truncated = true;
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
if (Array.isArray(value)) {
|
|
97
|
+
for (const item of value) {
|
|
98
|
+
visit(item, depth + 1);
|
|
99
|
+
}
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
if (typeof value === 'object') {
|
|
103
|
+
for (const item of Object.values(value)) {
|
|
104
|
+
visit(item, depth + 1);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
visit(input, 0);
|
|
109
|
+
if (truncated) {
|
|
110
|
+
return { clean: false, matches: ['scan-depth-limit-exceeded'], warnings: [] };
|
|
111
|
+
}
|
|
112
|
+
return scanForSecrets(texts.join('\n'));
|
|
113
|
+
}
|
|
114
|
+
/** Mask the same credential shapes in observations without treating hashes as tokens. */
|
|
115
|
+
function redactSecretPatterns(text) {
|
|
116
|
+
let redacted = text.replace(new RegExp('-----BEGIN [A-Z ]*' +
|
|
117
|
+
'PRIVATE KEY-----[\\s\\S]*?(?:-----END [A-Z ]*' +
|
|
118
|
+
'PRIVATE KEY-----|$)', 'g'), '[REDACTED]');
|
|
119
|
+
for (const { name, pattern } of SECRET_PATTERNS) {
|
|
120
|
+
if (name !== 'invisible-unicode') {
|
|
121
|
+
redacted = redacted.replace(new RegExp(pattern.source, 'g'), '[REDACTED]');
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return redacted;
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=secret-filter.js.map
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import type { DatabaseAdapter } from '../db-manager.js';
|
|
1
2
|
import type { MemoryScopeRef, MemoryTruthRow } from './types.js';
|
|
2
|
-
export declare function queryRelevantTruth(params: {
|
|
3
|
+
export declare function queryRelevantTruth(adapter: DatabaseAdapter, params: {
|
|
3
4
|
query: string;
|
|
4
5
|
scopes: MemoryScopeRef[];
|
|
5
6
|
includeHistory?: boolean;
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.queryRelevantTruth = queryRelevantTruth;
|
|
4
|
-
const db_manager_js_1 = require("../db-manager.js");
|
|
5
4
|
function decisionToTruthRow(row) {
|
|
6
5
|
return {
|
|
7
6
|
memory_id: row.id,
|
|
@@ -30,9 +29,7 @@ function matchesQuery(row, query) {
|
|
|
30
29
|
? haystack.includes(query.toLowerCase())
|
|
31
30
|
: tokens.some((token) => haystack.includes(token));
|
|
32
31
|
}
|
|
33
|
-
async function queryRelevantTruth(params) {
|
|
34
|
-
await (0, db_manager_js_1.initDB)();
|
|
35
|
-
const adapter = (0, db_manager_js_1.getAdapter)();
|
|
32
|
+
async function queryRelevantTruth(adapter, params) {
|
|
36
33
|
const scopeMatch = params.scopes
|
|
37
34
|
.map(() => '(scope_filter.kind = ? AND scope_filter.external_id = ?)')
|
|
38
35
|
.join(' OR ');
|
package/dist/memory/types.d.ts
CHANGED
|
@@ -1,10 +1,31 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type {
|
|
3
|
-
import type { SearchHitDiagnostics, SearchQualityOptions, SearchStrictness } from '../
|
|
1
|
+
import type { RecordActor } from '../registry/types.js';
|
|
2
|
+
import type { RecordLink } from './judgment-types.js';
|
|
3
|
+
import type { SearchHitDiagnostics, SearchQualityOptions, SearchStrictness } from '../knowledge/search-quality.js';
|
|
4
|
+
/**
|
|
5
|
+
* The scope kinds this repository's own products happen to use.
|
|
6
|
+
*
|
|
7
|
+
* NOT the set of kinds that exist. A scope is a (kind, id) pair; the pair is the
|
|
8
|
+
* core's, the vocabulary is the consumer's. These are exported so a product can
|
|
9
|
+
* reuse a familiar word, and so nothing that already writes them has to change --
|
|
10
|
+
* they are not a gate. A consumer with a kind of its own passes it and the core
|
|
11
|
+
* carries it, because the core does not read the kind, it matches it.
|
|
12
|
+
*/
|
|
13
|
+
export declare const COMMON_MEMORY_SCOPE_KINDS: readonly ["global", "user", "channel", "project"];
|
|
14
|
+
/** Kept as the old name for callers that import it; same list, still not a gate. */
|
|
4
15
|
export declare const MEMORY_SCOPE_KINDS: readonly ["global", "user", "channel", "project"];
|
|
5
|
-
export type MemoryScopeKind =
|
|
6
|
-
|
|
16
|
+
export type MemoryScopeKind = string;
|
|
17
|
+
/**
|
|
18
|
+
* What a memory can be.
|
|
19
|
+
*
|
|
20
|
+
* `task`, `schedule` and `compiled` were here and are not any more. Nothing writes
|
|
21
|
+
* them -- no call site in either package, no row in the live database -- and they name
|
|
22
|
+
* one product's board, cron and context-packet vocabulary rather than anything a
|
|
23
|
+
* memory is. The stored kind check still accepts the retired task and schedule values;
|
|
24
|
+
* adding a new kind needs a migration because that check constrains the column.
|
|
25
|
+
*/
|
|
26
|
+
export declare const MEMORY_KINDS: readonly ["decision", "preference", "constraint", "lesson", "fact", "workflow"];
|
|
7
27
|
export type MemoryKind = (typeof MEMORY_KINDS)[number];
|
|
28
|
+
export type MemoryKindFilter = MemoryKind | [MemoryKind, ...MemoryKind[]];
|
|
8
29
|
export declare const MEMORY_STATUSES: readonly ["active", "superseded", "contradicted", "stale"];
|
|
9
30
|
export type MemoryStatus = (typeof MEMORY_STATUSES)[number];
|
|
10
31
|
export declare const MEMORY_TRUTH_STATUSES: readonly ["active", "superseded", "contradicted", "stale", "quarantined"];
|
|
@@ -22,7 +43,12 @@ export interface MemoryScopeRef {
|
|
|
22
43
|
id: string;
|
|
23
44
|
}
|
|
24
45
|
export interface MemorySourceRef {
|
|
25
|
-
|
|
46
|
+
/**
|
|
47
|
+
* Which package wrote this. A free string, not a union of the four packages that
|
|
48
|
+
* happened to exist when it was written: a second product installing this core would
|
|
49
|
+
* have had to be added to the core's own type before it could save anything.
|
|
50
|
+
*/
|
|
51
|
+
package: string;
|
|
26
52
|
source_type: string;
|
|
27
53
|
user_id?: string;
|
|
28
54
|
channel_id?: string;
|
|
@@ -34,6 +60,12 @@ export interface MemoryRecord {
|
|
|
34
60
|
kind: MemoryKind;
|
|
35
61
|
summary: string;
|
|
36
62
|
details: string;
|
|
63
|
+
/** One-line context that tells an agent when this guidance applies. */
|
|
64
|
+
applies_when?: string;
|
|
65
|
+
/** Ordered procedure steps for workflow records. */
|
|
66
|
+
steps?: string[];
|
|
67
|
+
/** Evidence checks a workflow must complete, in order. */
|
|
68
|
+
evidence_checks?: string[];
|
|
37
69
|
confidence: number;
|
|
38
70
|
status: MemoryStatus;
|
|
39
71
|
scopes: MemoryScopeRef[];
|
|
@@ -44,10 +76,12 @@ export interface MemoryRecord {
|
|
|
44
76
|
event_date?: string | null;
|
|
45
77
|
/** Source event timestamp in milliseconds when known. Null if not set. */
|
|
46
78
|
event_datetime?: number | null;
|
|
47
|
-
|
|
79
|
+
/** Maintained outcome projection (SUCCESS | FAILED | PARTIAL | pending). Null when unset. */
|
|
80
|
+
outcome?: string | null;
|
|
48
81
|
retrieval_diagnostics?: SearchHitDiagnostics;
|
|
49
82
|
}
|
|
50
83
|
export type RecallMemoryOptions = SearchQualityOptions & {
|
|
84
|
+
kind?: MemoryKindFilter;
|
|
51
85
|
scopes?: MemoryScopeRef[];
|
|
52
86
|
includeProfile?: boolean;
|
|
53
87
|
includeHistory?: boolean;
|
|
@@ -58,7 +92,6 @@ export interface RecallSearchDiagnostics {
|
|
|
58
92
|
candidate_counts: {
|
|
59
93
|
vector: number;
|
|
60
94
|
lexical: number;
|
|
61
|
-
entity: number;
|
|
62
95
|
graph_expanded: number;
|
|
63
96
|
vector_only: number;
|
|
64
97
|
rejected_by_strictness: number;
|
|
@@ -84,8 +117,15 @@ export interface ProfileSnapshot {
|
|
|
84
117
|
export interface RecallBundle {
|
|
85
118
|
profile: ProfileSnapshot;
|
|
86
119
|
memories: MemoryRecord[];
|
|
87
|
-
/**
|
|
88
|
-
|
|
120
|
+
/**
|
|
121
|
+
* Hits from a source outside the judgment log, when the caller asked for them.
|
|
122
|
+
*
|
|
123
|
+
* This was typed as the connector event index's row, which made the core's
|
|
124
|
+
* recall bundle depend on a package three of four consumers do not install. The
|
|
125
|
+
* shape is whatever the source produced; what the core states is that a hit is
|
|
126
|
+
* ranked and scored.
|
|
127
|
+
*/
|
|
128
|
+
connector_event_hits?: SourceSearchHit[];
|
|
89
129
|
graph_context: {
|
|
90
130
|
primary: MemoryRecord[];
|
|
91
131
|
expanded: MemoryRecord[];
|
|
@@ -98,8 +138,13 @@ export interface RecallBundle {
|
|
|
98
138
|
diagnostics?: RecallSearchDiagnostics;
|
|
99
139
|
};
|
|
100
140
|
}
|
|
101
|
-
/**
|
|
102
|
-
export
|
|
141
|
+
/** A ranked hit from a source the core did not author. Its fields are the source's. */
|
|
142
|
+
export interface SourceSearchHit extends Record<string, unknown> {
|
|
143
|
+
rank: number;
|
|
144
|
+
score: number;
|
|
145
|
+
}
|
|
146
|
+
/** A search result: authored by the judgment log, or found in a source. */
|
|
147
|
+
export type MemorySearchResultHit = MemoryRecord | SourceSearchHit;
|
|
103
148
|
export interface MemoryEventRecord {
|
|
104
149
|
event_id: string;
|
|
105
150
|
event_type: 'observed_conversation' | 'save' | 'supersede' | 'contradict' | 'mark_stale' | 'quarantine' | 'no_op' | 'audit_failed' | 'notice_sent' | 'provenance.empty_batch' | 'provenance.link_write_failed' | 'connector_event_index.retention_swept' | 'case.link_created' | 'case.link_revoked' | 'case.membership_pinned' | 'case.membership_unpinned' | 'case.source_promoted' | 'case.freshness_drifted' | 'automation.job.started' | 'automation.job.succeeded' | 'automation.job.failed' | 'automation.job.skipped_concurrent' | 'review.bulk.approved' | 'review.bulk.rejected' | 'review.bulk.deferred' | 'canary.drift.false_merge_rate' | 'canary.drift.projection_fragmentation_rate' | 'canary.drift.replay_stale' | 'auth.role_denied' | 'ontology.proposal' | 'ontology.approval' | 'repair.approval' | 'case.fast_write_applied' | 'case.fast_write_lock_skipped' | 'case.correction_applied' | 'case.correction_reverted' | 'case.correction_superseded' | 'case.membership_tombstoned' | 'case.merged' | 'case.split' | 'case.membership_matched' | 'case.membership_candidate';
|
|
@@ -139,6 +184,9 @@ export interface PublicSaveMemoryInput {
|
|
|
139
184
|
kind: MemoryKind;
|
|
140
185
|
summary: string;
|
|
141
186
|
details: string;
|
|
187
|
+
appliesWhen?: string;
|
|
188
|
+
steps?: string[];
|
|
189
|
+
evidenceChecks?: string[];
|
|
142
190
|
confidence?: number;
|
|
143
191
|
status?: MemoryStatus;
|
|
144
192
|
scopes: MemoryScopeRef[];
|
|
@@ -147,18 +195,15 @@ export interface PublicSaveMemoryInput {
|
|
|
147
195
|
eventDate?: string;
|
|
148
196
|
eventDateTime?: number;
|
|
149
197
|
entityObservationIds?: string[];
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
summary: string;
|
|
160
|
-
details?: string | null;
|
|
161
|
-
};
|
|
198
|
+
itemId?: string | null;
|
|
199
|
+
actors?: RecordActor[];
|
|
200
|
+
/** Explicit, scope-checked relationships from this new judgment. */
|
|
201
|
+
links?: RecordLink[];
|
|
202
|
+
/** Earlier records this judgment explicitly replaces; matching topic is not enough. */
|
|
203
|
+
replaces?: Array<{
|
|
204
|
+
id: string;
|
|
205
|
+
reason: string;
|
|
206
|
+
}>;
|
|
162
207
|
}
|
|
163
208
|
export interface PublicIngestMemoryInput {
|
|
164
209
|
content: string;
|
|
@@ -345,4 +390,9 @@ export interface IngestConversationResult {
|
|
|
345
390
|
topic: string;
|
|
346
391
|
}>;
|
|
347
392
|
}
|
|
393
|
+
export declare function canonicalizeContextScopes(scopes: readonly MemoryScopeRef[] | undefined): {
|
|
394
|
+
scopes: MemoryScopeRef[];
|
|
395
|
+
scopeJson: string;
|
|
396
|
+
scopeHash: string;
|
|
397
|
+
};
|
|
348
398
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/memory/types.js
CHANGED
|
@@ -1,18 +1,38 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.MEMORY_AUDIT_ACK_STATUSES = exports.MEMORY_CONSULT_INTENTS = exports.MEMORY_AGENT_ACTIONS = exports.MEMORY_EDGE_TYPES = exports.MEMORY_TRUTH_STATUSES = exports.MEMORY_STATUSES = exports.MEMORY_KINDS = exports.MEMORY_SCOPE_KINDS = void 0;
|
|
3
|
+
exports.MEMORY_AUDIT_ACK_STATUSES = exports.MEMORY_CONSULT_INTENTS = exports.MEMORY_AGENT_ACTIONS = exports.MEMORY_EDGE_TYPES = exports.MEMORY_TRUTH_STATUSES = exports.MEMORY_STATUSES = exports.MEMORY_KINDS = exports.MEMORY_SCOPE_KINDS = exports.COMMON_MEMORY_SCOPE_KINDS = void 0;
|
|
4
4
|
exports.createEmptyRecallBundle = createEmptyRecallBundle;
|
|
5
5
|
exports.createMemoryAuditAck = createMemoryAuditAck;
|
|
6
|
-
exports.
|
|
6
|
+
exports.canonicalizeContextScopes = canonicalizeContextScopes;
|
|
7
|
+
const node_crypto_1 = require("node:crypto");
|
|
8
|
+
/**
|
|
9
|
+
* The scope kinds this repository's own products happen to use.
|
|
10
|
+
*
|
|
11
|
+
* NOT the set of kinds that exist. A scope is a (kind, id) pair; the pair is the
|
|
12
|
+
* core's, the vocabulary is the consumer's. These are exported so a product can
|
|
13
|
+
* reuse a familiar word, and so nothing that already writes them has to change --
|
|
14
|
+
* they are not a gate. A consumer with a kind of its own passes it and the core
|
|
15
|
+
* carries it, because the core does not read the kind, it matches it.
|
|
16
|
+
*/
|
|
17
|
+
exports.COMMON_MEMORY_SCOPE_KINDS = ['global', 'user', 'channel', 'project'];
|
|
18
|
+
/** Kept as the old name for callers that import it; same list, still not a gate. */
|
|
19
|
+
exports.MEMORY_SCOPE_KINDS = exports.COMMON_MEMORY_SCOPE_KINDS;
|
|
20
|
+
/**
|
|
21
|
+
* What a memory can be.
|
|
22
|
+
*
|
|
23
|
+
* `task`, `schedule` and `compiled` were here and are not any more. Nothing writes
|
|
24
|
+
* them -- no call site in either package, no row in the live database -- and they name
|
|
25
|
+
* one product's board, cron and context-packet vocabulary rather than anything a
|
|
26
|
+
* memory is. The stored kind check still accepts the retired task and schedule values;
|
|
27
|
+
* adding a new kind needs a migration because that check constrains the column.
|
|
28
|
+
*/
|
|
7
29
|
exports.MEMORY_KINDS = [
|
|
8
30
|
'decision',
|
|
9
31
|
'preference',
|
|
10
32
|
'constraint',
|
|
11
33
|
'lesson',
|
|
12
34
|
'fact',
|
|
13
|
-
'
|
|
14
|
-
'schedule',
|
|
15
|
-
'compiled',
|
|
35
|
+
'workflow',
|
|
16
36
|
];
|
|
17
37
|
exports.MEMORY_STATUSES = ['active', 'superseded', 'contradicted', 'stale'];
|
|
18
38
|
exports.MEMORY_TRUTH_STATUSES = [
|
|
@@ -67,4 +87,54 @@ function createMemoryAuditAck(input) {
|
|
|
67
87
|
reason: input.reason,
|
|
68
88
|
};
|
|
69
89
|
}
|
|
90
|
+
// --- Scope identity -------------------------------------------------------------
|
|
91
|
+
//
|
|
92
|
+
// Two scope lists naming the same scopes are the same list. The order and the hash below
|
|
93
|
+
// are what makes that true, so they live with the type rather than with any one reader.
|
|
94
|
+
const SCOPE_ORDER = new Map([
|
|
95
|
+
['project', 0],
|
|
96
|
+
['channel', 1],
|
|
97
|
+
['user', 2],
|
|
98
|
+
['global', 3],
|
|
99
|
+
]);
|
|
100
|
+
function assertScope(scope) {
|
|
101
|
+
// A kind is nonblank text. Which kinds exist is the consumer's statement, not a
|
|
102
|
+
// list kept here -- this used to compare against COMMON_MEMORY_SCOPE_KINDS, so a
|
|
103
|
+
// consumer whose world had a kind of its own could not store one.
|
|
104
|
+
if (typeof scope.kind !== 'string' || scope.kind.trim().length === 0) {
|
|
105
|
+
throw new Error(`Memory scope kind must be nonblank text, got: ${String(scope.kind)}`);
|
|
106
|
+
}
|
|
107
|
+
const id = scope.id.trim();
|
|
108
|
+
if (id.length === 0) {
|
|
109
|
+
throw new Error('Memory scope id must not be empty');
|
|
110
|
+
}
|
|
111
|
+
return { kind: scope.kind, id };
|
|
112
|
+
}
|
|
113
|
+
function scopeKey(scope) {
|
|
114
|
+
return `${scope.kind}\0${scope.id}`;
|
|
115
|
+
}
|
|
116
|
+
function sortScopes(scopes) {
|
|
117
|
+
return [...scopes].sort((left, right) => {
|
|
118
|
+
const orderDiff = (SCOPE_ORDER.get(left.kind) ?? 4) - (SCOPE_ORDER.get(right.kind) ?? 4);
|
|
119
|
+
if (orderDiff !== 0) {
|
|
120
|
+
return orderDiff;
|
|
121
|
+
}
|
|
122
|
+
return left.kind.localeCompare(right.kind) || left.id.localeCompare(right.id);
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
function canonicalizeContextScopes(scopes) {
|
|
126
|
+
const unique = new Map();
|
|
127
|
+
for (const scope of scopes ?? []) {
|
|
128
|
+
const normalized = assertScope(scope);
|
|
129
|
+
unique.set(scopeKey(normalized), normalized);
|
|
130
|
+
}
|
|
131
|
+
const canonicalScopes = sortScopes([...unique.values()]);
|
|
132
|
+
const scopeJson = JSON.stringify(canonicalScopes);
|
|
133
|
+
const scopeHash = (0, node_crypto_1.createHash)('sha256').update(scopeJson).digest('hex');
|
|
134
|
+
return {
|
|
135
|
+
scopes: canonicalScopes,
|
|
136
|
+
scopeJson,
|
|
137
|
+
scopeHash,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
70
140
|
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mechanical adapters between the public memory write surfaces and the
|
|
3
|
+
* knowledge command boundary.
|
|
4
|
+
*
|
|
5
|
+
* Every write funnels through `appendJudgment` (or `ingestSource` for raw
|
|
6
|
+
* evidence): the adapter builds exactly one command, derives honest access —
|
|
7
|
+
* never fabricating authority the caller did not present — and maps the receipt
|
|
8
|
+
* back to the legacy result shape.
|
|
9
|
+
*/
|
|
10
|
+
import type { DatabaseAdapter, DatabaseInstance, DecisionInput } from '../db-manager.js';
|
|
11
|
+
import type { JudgmentAccess } from '../knowledge/judgments.js';
|
|
12
|
+
import type { JudgmentProjections, JsonValue, RecordLink } from './judgment-types.js';
|
|
13
|
+
import type { MemoryScopeRef } from './types.js';
|
|
14
|
+
import type { NormalizedMemoryProvenance } from './provenance.js';
|
|
15
|
+
/** Access for a caller with no signed identity: it is admitted to exactly the
|
|
16
|
+
* scopes it declared, nothing more. */
|
|
17
|
+
export declare function unsignedWriteAccess(scopes: readonly MemoryScopeRef[]): JudgmentAccess;
|
|
18
|
+
/**
|
|
19
|
+
* Access derived from normalized write provenance — the legacy direct-write
|
|
20
|
+
* path, where the caller is the process itself and declares its own scopes.
|
|
21
|
+
* Unified-action writes do NOT come through here: dispatch passes the real
|
|
22
|
+
* `JudgmentAccess` (the call authority) straight to `appendJudgment`.
|
|
23
|
+
*/
|
|
24
|
+
export declare function writeAccessForProvenance(provenance: NormalizedMemoryProvenance, requestedScopes: readonly MemoryScopeRef[]): JudgmentAccess;
|
|
25
|
+
/** Scope refs currently bound to a memory row — the partition a write into
|
|
26
|
+
* that row must be admitted to. */
|
|
27
|
+
export declare function boundScopesOf(adapter: Pick<DatabaseAdapter, 'prepare'>, memoryId: string): MemoryScopeRef[];
|
|
28
|
+
/**
|
|
29
|
+
* Fail-first visibility check for explicitly authored relationship targets,
|
|
30
|
+
* preserving the legacy error contract.
|
|
31
|
+
*
|
|
32
|
+
* Trusted envelopes check visibility strictly inside admitted scopes (unbound
|
|
33
|
+
* legacy rows are not reachable — same as the pre-boundary envelope check).
|
|
34
|
+
* Unsigned callers keep the legacy existence check for the original error
|
|
35
|
+
* text; scope admission is then enforced by the command boundary itself.
|
|
36
|
+
*/
|
|
37
|
+
export declare function assertRelationshipTargetsVisible(adapter: Pick<DatabaseAdapter, 'prepare'>, targetIds: readonly string[], admittedScopes: readonly MemoryScopeRef[], trustedEnvelope: boolean): void;
|
|
38
|
+
export interface ExplicitRelationship {
|
|
39
|
+
type: string;
|
|
40
|
+
targetId: string;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Map deduplicated legacy relationships onto command fields.
|
|
44
|
+
*
|
|
45
|
+
* Trusted envelopes get the authored form: `supersedes` targets become
|
|
46
|
+
* scope-checked `replaces`, and link-able relations also enter the twin edge
|
|
47
|
+
* graph as explicit `links` — both fail closed inside the boundary.
|
|
48
|
+
*
|
|
49
|
+
* Unsigned callers keep the legacy contract: the adapter already checked that
|
|
50
|
+
* each target exists, so relationships are written only as `decision_edges`
|
|
51
|
+
* projection rows and `supersedes` targets are moved out of current truth
|
|
52
|
+
* through the `supersedeTargets` projection — never as scope-checked authored
|
|
53
|
+
* links the caller was not admitted to.
|
|
54
|
+
*/
|
|
55
|
+
export declare function relationshipsToCommandFields(relationships: readonly ExplicitRelationship[], options?: {
|
|
56
|
+
trusted?: boolean;
|
|
57
|
+
}): {
|
|
58
|
+
links: RecordLink[];
|
|
59
|
+
replaces: Array<{
|
|
60
|
+
id: string;
|
|
61
|
+
reason: string;
|
|
62
|
+
}>;
|
|
63
|
+
decisionEdges: NonNullable<JudgmentProjections['decisionEdges']>;
|
|
64
|
+
supersedeTargets: string[];
|
|
65
|
+
};
|
|
66
|
+
/**
|
|
67
|
+
* Embedder for the command boundary that preserves the legacy enhanced
|
|
68
|
+
* embedding input.
|
|
69
|
+
*/
|
|
70
|
+
export declare function commandEmbedder(decision: DecisionInput): {
|
|
71
|
+
embed(text: string, role: 'query' | 'passage'): Promise<Float32Array | null>;
|
|
72
|
+
};
|
|
73
|
+
export interface OutcomeAmendmentInput {
|
|
74
|
+
outcome?: string | null;
|
|
75
|
+
failureReason?: string | null;
|
|
76
|
+
limitation?: string | null;
|
|
77
|
+
confidence?: number | null;
|
|
78
|
+
durationDays?: number | null;
|
|
79
|
+
/** Extra fields written on the amendment record's payload for audit. */
|
|
80
|
+
payload?: Record<string, JsonValue>;
|
|
81
|
+
/** Callers that can name their own command id get replay for free. */
|
|
82
|
+
commandId?: string;
|
|
83
|
+
recordedAt?: number;
|
|
84
|
+
eventReason?: string;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Append one judgment record carrying an authored outcome change and apply the
|
|
88
|
+
* maintained `decisions` projection columns on the target in the same
|
|
89
|
+
* transaction. Identical payloads on the same target replay the stored receipt
|
|
90
|
+
* instead of appending a second record.
|
|
91
|
+
*/
|
|
92
|
+
export declare function appendOutcomeAmendment(decisionId: string, input: OutcomeAmendmentInput, options: {
|
|
93
|
+
adapter: DatabaseInstance;
|
|
94
|
+
}): Promise<{
|
|
95
|
+
recordId: string;
|
|
96
|
+
commandId: string;
|
|
97
|
+
}>;
|
|
98
|
+
//# sourceMappingURL=write-adapters.d.ts.map
|