@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
|
@@ -1,321 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.assertTwinRefsVisible = assertTwinRefsVisible;
|
|
4
|
-
exports.listVisibleTwinEdgesForRefs = listVisibleTwinEdgesForRefs;
|
|
5
|
-
const store_js_1 = require("./store.js");
|
|
6
|
-
const channel_grant_js_1 = require("../context-compile/channel-grant.js");
|
|
7
|
-
const TABLE_COLUMN_PRAGMAS = {
|
|
8
|
-
decisions: 'PRAGMA table_info(decisions)',
|
|
9
|
-
case_truth: 'PRAGMA table_info(case_truth)',
|
|
10
|
-
};
|
|
11
|
-
const tableColumnCache = new WeakMap();
|
|
12
|
-
// Keep memory-truth quarantine semantics excluded for legacy/backcompat rows even though the
|
|
13
|
-
// current decisions.status CHECK only admits superseded/contradicted/stale terminal states.
|
|
14
|
-
const EXCLUDED_MEMORY_STATUSES = new Set(['superseded', 'quarantined', 'contradicted', 'stale']);
|
|
15
|
-
function scopeKey(scope) {
|
|
16
|
-
return `${scope.kind}\0${scope.id}`;
|
|
17
|
-
}
|
|
18
|
-
function hasScopes(scopes) {
|
|
19
|
-
return Array.isArray(scopes) && scopes.length > 0;
|
|
20
|
-
}
|
|
21
|
-
function hasProjectRefs(projectRefs) {
|
|
22
|
-
return Array.isArray(projectRefs) && projectRefs.length > 0;
|
|
23
|
-
}
|
|
24
|
-
function asOfMs(visibility) {
|
|
25
|
-
return typeof visibility.asOfMs === 'number' ? visibility.asOfMs : null;
|
|
26
|
-
}
|
|
27
|
-
function startMs(visibility) {
|
|
28
|
-
return typeof visibility.startMs === 'number' ? visibility.startMs : null;
|
|
29
|
-
}
|
|
30
|
-
function isWithinVisibilityTime(value, visibility) {
|
|
31
|
-
const start = startMs(visibility);
|
|
32
|
-
const asOf = asOfMs(visibility);
|
|
33
|
-
if (start === null && asOf === null) {
|
|
34
|
-
return true;
|
|
35
|
-
}
|
|
36
|
-
return (typeof value === 'number' &&
|
|
37
|
-
(start === null || value >= start) &&
|
|
38
|
-
(asOf === null || value <= asOf));
|
|
39
|
-
}
|
|
40
|
-
function parseTimestamp(value) {
|
|
41
|
-
if (typeof value === 'number' && Number.isFinite(value)) {
|
|
42
|
-
return Math.floor(value);
|
|
43
|
-
}
|
|
44
|
-
if (typeof value === 'string') {
|
|
45
|
-
const trimmed = value.trim();
|
|
46
|
-
if (trimmed.length === 0) {
|
|
47
|
-
return null;
|
|
48
|
-
}
|
|
49
|
-
const numeric = Number(trimmed);
|
|
50
|
-
if (Number.isFinite(numeric)) {
|
|
51
|
-
return Math.floor(numeric);
|
|
52
|
-
}
|
|
53
|
-
const parsed = Date.parse(trimmed);
|
|
54
|
-
return Number.isFinite(parsed) ? parsed : null;
|
|
55
|
-
}
|
|
56
|
-
return null;
|
|
57
|
-
}
|
|
58
|
-
function tableColumns(adapter, table) {
|
|
59
|
-
const pragma = TABLE_COLUMN_PRAGMAS[table];
|
|
60
|
-
if (!pragma) {
|
|
61
|
-
throw new Error(`Unsupported table for column introspection: ${table}`);
|
|
62
|
-
}
|
|
63
|
-
let adapterCache = tableColumnCache.get(adapter);
|
|
64
|
-
if (!adapterCache) {
|
|
65
|
-
adapterCache = new Map();
|
|
66
|
-
tableColumnCache.set(adapter, adapterCache);
|
|
67
|
-
}
|
|
68
|
-
const cached = adapterCache.get(table);
|
|
69
|
-
if (cached) {
|
|
70
|
-
return cached;
|
|
71
|
-
}
|
|
72
|
-
const rows = adapter.prepare(pragma).all();
|
|
73
|
-
const columns = new Set(rows.map((row) => row.name));
|
|
74
|
-
adapterCache.set(table, columns);
|
|
75
|
-
return columns;
|
|
76
|
-
}
|
|
77
|
-
function isMemoryVisible(adapter, id, visibility) {
|
|
78
|
-
const columns = tableColumns(adapter, 'decisions');
|
|
79
|
-
const statusSelect = columns.has('status') ? 'status' : 'NULL AS status';
|
|
80
|
-
const supersededBySelect = columns.has('superseded_by')
|
|
81
|
-
? 'superseded_by'
|
|
82
|
-
: 'NULL AS superseded_by';
|
|
83
|
-
const row = adapter
|
|
84
|
-
.prepare(`
|
|
85
|
-
SELECT created_at, event_datetime, ${statusSelect}, ${supersededBySelect}
|
|
86
|
-
FROM decisions
|
|
87
|
-
WHERE id = ?
|
|
88
|
-
LIMIT 1
|
|
89
|
-
`)
|
|
90
|
-
.get(id);
|
|
91
|
-
if (!row) {
|
|
92
|
-
return false;
|
|
93
|
-
}
|
|
94
|
-
const status = typeof row.status === 'string' ? row.status : 'active';
|
|
95
|
-
if (EXCLUDED_MEMORY_STATUSES.has(status) ||
|
|
96
|
-
(typeof row.superseded_by === 'string' && row.superseded_by.length > 0)) {
|
|
97
|
-
return false;
|
|
98
|
-
}
|
|
99
|
-
if (!isWithinVisibilityTime(row.event_datetime ?? row.created_at, visibility)) {
|
|
100
|
-
return false;
|
|
101
|
-
}
|
|
102
|
-
const scopes = visibility.scopes;
|
|
103
|
-
if (!hasScopes(scopes)) {
|
|
104
|
-
return true;
|
|
105
|
-
}
|
|
106
|
-
const scopeClauses = scopes.map(() => '(ms.kind = ? AND ms.external_id = ?)').join(' OR ');
|
|
107
|
-
const params = scopes.flatMap((scope) => [scope.kind, scope.id]);
|
|
108
|
-
const bindingRow = adapter
|
|
109
|
-
.prepare(`
|
|
110
|
-
SELECT 1 AS ok
|
|
111
|
-
FROM memory_scope_bindings msb
|
|
112
|
-
JOIN memory_scopes ms ON ms.id = msb.scope_id
|
|
113
|
-
WHERE msb.memory_id = ?
|
|
114
|
-
AND (${scopeClauses})
|
|
115
|
-
LIMIT 1
|
|
116
|
-
`)
|
|
117
|
-
.get(id, ...params);
|
|
118
|
-
if (bindingRow?.ok) {
|
|
119
|
-
return true;
|
|
120
|
-
}
|
|
121
|
-
if (columns.has('memory_scope_kind') && columns.has('memory_scope_id')) {
|
|
122
|
-
const row = adapter
|
|
123
|
-
.prepare(`
|
|
124
|
-
SELECT 1 AS ok
|
|
125
|
-
FROM decisions
|
|
126
|
-
WHERE id = ?
|
|
127
|
-
AND (${scopes.map(() => '(memory_scope_kind = ? AND memory_scope_id = ?)').join(' OR ')})
|
|
128
|
-
LIMIT 1
|
|
129
|
-
`)
|
|
130
|
-
.get(id, ...params);
|
|
131
|
-
return Boolean(row?.ok);
|
|
132
|
-
}
|
|
133
|
-
return false;
|
|
134
|
-
}
|
|
135
|
-
function parseCaseScopeRefs(scopeRefs) {
|
|
136
|
-
if (typeof scopeRefs !== 'string' || scopeRefs.length === 0) {
|
|
137
|
-
return [];
|
|
138
|
-
}
|
|
139
|
-
try {
|
|
140
|
-
const parsed = JSON.parse(scopeRefs);
|
|
141
|
-
if (!Array.isArray(parsed)) {
|
|
142
|
-
return [];
|
|
143
|
-
}
|
|
144
|
-
return parsed.filter((item) => item !== null &&
|
|
145
|
-
typeof item === 'object' &&
|
|
146
|
-
typeof item.kind === 'string' &&
|
|
147
|
-
typeof item.id === 'string');
|
|
148
|
-
}
|
|
149
|
-
catch {
|
|
150
|
-
return [];
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
function isCaseVisible(adapter, id, visibility) {
|
|
154
|
-
const row = adapter.prepare('SELECT * FROM case_truth WHERE case_id = ? LIMIT 1').get(id);
|
|
155
|
-
if (!row) {
|
|
156
|
-
return false;
|
|
157
|
-
}
|
|
158
|
-
const timestamp = parseTimestamp(row.last_activity_at) ?? parseTimestamp(row.updated_at);
|
|
159
|
-
if (!isWithinVisibilityTime(timestamp, visibility)) {
|
|
160
|
-
return false;
|
|
161
|
-
}
|
|
162
|
-
const scopes = visibility.scopes;
|
|
163
|
-
if (!hasScopes(scopes)) {
|
|
164
|
-
return true;
|
|
165
|
-
}
|
|
166
|
-
const requested = new Set(scopes.map(scopeKey));
|
|
167
|
-
const scopeRefs = parseCaseScopeRefs(row.scope_refs);
|
|
168
|
-
if (scopeRefs.some((scope) => requested.has(scopeKey(scope)))) {
|
|
169
|
-
return true;
|
|
170
|
-
}
|
|
171
|
-
const columns = tableColumns(adapter, 'case_truth');
|
|
172
|
-
if (columns.has('memory_scope_kind') && columns.has('memory_scope_id')) {
|
|
173
|
-
return scopes.some((scope) => row.memory_scope_kind === scope.kind && row.memory_scope_id === scope.id);
|
|
174
|
-
}
|
|
175
|
-
return false;
|
|
176
|
-
}
|
|
177
|
-
/**
|
|
178
|
-
* The time bound, shared by both branches so a grant cannot skip it.
|
|
179
|
-
*
|
|
180
|
-
* DELIBERATELY STRICTER THAN THE READER, and a review flagged the difference as a
|
|
181
|
-
* divergence between two delegates of one rule. It is not. A row with no usable timestamp
|
|
182
|
-
* is refused here even when no bound is set, while the reader - whose clause is on
|
|
183
|
-
* `COALESCE(event_datetime, source_timestamp_ms)` - leaves such a row alone when there is
|
|
184
|
-
* no bound to apply.
|
|
185
|
-
*
|
|
186
|
-
* The direction is what makes it correct: this gate guards refs reached INDIRECTLY, through
|
|
187
|
-
* a seed the caller named or an edge the graph walked. Refusing what cannot be shown to sit
|
|
188
|
-
* inside any window keeps the indirect path no wider than the direct one, which is the
|
|
189
|
-
* invariant the whole design rests on. Relaxing it to match the reader would have made
|
|
190
|
-
* citation reach further than reading for exactly the rows whose position in time is
|
|
191
|
-
* unknown. `fails closed for raw endpoints with blank timestamps` states the intent.
|
|
192
|
-
*/
|
|
193
|
-
function isRawWithinTime(row, visibility) {
|
|
194
|
-
const rawTs = row.event_datetime ?? row.source_timestamp_ms;
|
|
195
|
-
if (rawTs === null || rawTs === undefined || (typeof rawTs === 'string' && rawTs.trim() === '')) {
|
|
196
|
-
return false;
|
|
197
|
-
}
|
|
198
|
-
const eventTsMs = parseTimestamp(rawTs);
|
|
199
|
-
return eventTsMs !== null && eventTsMs >= 0 && isWithinVisibilityTime(eventTsMs, visibility);
|
|
200
|
-
}
|
|
201
|
-
function isRawVisible(adapter, id, visibility) {
|
|
202
|
-
const row = adapter
|
|
203
|
-
.prepare('SELECT * FROM connector_event_index WHERE event_index_id = ? LIMIT 1')
|
|
204
|
-
.get(id);
|
|
205
|
-
if (!row) {
|
|
206
|
-
return false;
|
|
207
|
-
}
|
|
208
|
-
if (Array.isArray(visibility.connectors) &&
|
|
209
|
-
!visibility.connectors.includes(String(row.source_connector))) {
|
|
210
|
-
return false;
|
|
211
|
-
}
|
|
212
|
-
// The grant decides, and it decides the same way here as in the reader - one rule, taken
|
|
213
|
-
// from one place. The scope/project/tenant clauses below are the pre-grant rule and are
|
|
214
|
-
// skipped when a grant is present, exactly as the reader skips them, because applying
|
|
215
|
-
// both would make a cited ref satisfy a stricter test than a read one.
|
|
216
|
-
if (visibility.channels) {
|
|
217
|
-
return ((0, channel_grant_js_1.isChannelGranted)(String(row.source_connector), typeof row.channel === 'string' ? row.channel : null, visibility.channels) && isRawWithinTime(row, visibility));
|
|
218
|
-
}
|
|
219
|
-
if (hasProjectRefs(visibility.projectRefs) &&
|
|
220
|
-
!visibility.projectRefs.some((project) => project.id === row.project_id)) {
|
|
221
|
-
return false;
|
|
222
|
-
}
|
|
223
|
-
if (typeof visibility.tenantId === 'string' &&
|
|
224
|
-
visibility.tenantId.length > 0 &&
|
|
225
|
-
row.tenant_id !== visibility.tenantId) {
|
|
226
|
-
return false;
|
|
227
|
-
}
|
|
228
|
-
if (!isRawWithinTime(row, visibility)) {
|
|
229
|
-
return false;
|
|
230
|
-
}
|
|
231
|
-
if (!hasScopes(visibility.scopes)) {
|
|
232
|
-
return true;
|
|
233
|
-
}
|
|
234
|
-
return visibility.scopes.some((scope) => row.memory_scope_kind === scope.kind && row.memory_scope_id === scope.id);
|
|
235
|
-
}
|
|
236
|
-
function isEntityVisible(adapter, id, visibility) {
|
|
237
|
-
const row = adapter
|
|
238
|
-
.prepare('SELECT scope_kind, scope_id, created_at FROM entity_nodes WHERE id = ? AND status = ? LIMIT 1')
|
|
239
|
-
.get(id, 'active');
|
|
240
|
-
if (!row) {
|
|
241
|
-
return false;
|
|
242
|
-
}
|
|
243
|
-
if (!isWithinVisibilityTime(row.created_at, visibility)) {
|
|
244
|
-
return false;
|
|
245
|
-
}
|
|
246
|
-
const scopes = visibility.scopes;
|
|
247
|
-
if (!hasScopes(scopes)) {
|
|
248
|
-
return true;
|
|
249
|
-
}
|
|
250
|
-
return scopes.some((scope) => row.scope_kind === scope.kind && row.scope_id === scope.id);
|
|
251
|
-
}
|
|
252
|
-
function isTwinRefVisible(adapter, ref, visibility, visitedEdges, edgeCache) {
|
|
253
|
-
if (ref.kind === 'entity') {
|
|
254
|
-
return isEntityVisible(adapter, ref.id, visibility);
|
|
255
|
-
}
|
|
256
|
-
if (ref.kind === 'report') {
|
|
257
|
-
return !hasScopes(visibility.scopes);
|
|
258
|
-
}
|
|
259
|
-
if (ref.kind === 'memory') {
|
|
260
|
-
return isMemoryVisible(adapter, ref.id, visibility);
|
|
261
|
-
}
|
|
262
|
-
if (ref.kind === 'case') {
|
|
263
|
-
return isCaseVisible(adapter, ref.id, visibility);
|
|
264
|
-
}
|
|
265
|
-
if (ref.kind === 'raw') {
|
|
266
|
-
return isRawVisible(adapter, ref.id, visibility);
|
|
267
|
-
}
|
|
268
|
-
if (visitedEdges.has(ref.id)) {
|
|
269
|
-
return false;
|
|
270
|
-
}
|
|
271
|
-
let edge = edgeCache.get(ref.id);
|
|
272
|
-
if (edge === undefined) {
|
|
273
|
-
edge = (0, store_js_1.getTwinEdge)(adapter, ref.id);
|
|
274
|
-
edgeCache.set(ref.id, edge);
|
|
275
|
-
}
|
|
276
|
-
if (!edge) {
|
|
277
|
-
return false;
|
|
278
|
-
}
|
|
279
|
-
if (!isWithinVisibilityTime(edge.created_at, visibility)) {
|
|
280
|
-
return false;
|
|
281
|
-
}
|
|
282
|
-
const pathWithCurrent = new Set(visitedEdges);
|
|
283
|
-
pathWithCurrent.add(ref.id);
|
|
284
|
-
return (isTwinRefVisible(adapter, edge.subject_ref, visibility, new Set(pathWithCurrent), edgeCache) &&
|
|
285
|
-
isTwinRefVisible(adapter, edge.object_ref, visibility, new Set(pathWithCurrent), edgeCache));
|
|
286
|
-
}
|
|
287
|
-
function assertTwinRefsVisible(adapter, refs, visibility = {}) {
|
|
288
|
-
const edgeCache = new Map();
|
|
289
|
-
for (const ref of refs) {
|
|
290
|
-
if (!isTwinRefVisible(adapter, ref, visibility, new Set(), edgeCache)) {
|
|
291
|
-
throw new Error(`Twin ref is not visible to requested visibility: ${ref.kind}:${ref.id}`);
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
function listVisibleTwinEdgesForRefs(adapter, refs, options = {}) {
|
|
296
|
-
const edgeCache = new Map();
|
|
297
|
-
const edgeTypes = normalizeEdgeTypes(options.edgeTypes);
|
|
298
|
-
const edges = (0, store_js_1.listTwinEdgesForRefs)(adapter, refs).filter((edge) => (edgeTypes.size === 0 || edgeTypes.has(edge.edge_type)) &&
|
|
299
|
-
(typeof options.startMs !== 'number' || edge.created_at >= options.startMs) &&
|
|
300
|
-
(typeof options.asOfMs !== 'number' || edge.created_at <= options.asOfMs) &&
|
|
301
|
-
isTwinRefVisible(adapter, edge.subject_ref, options, new Set(), edgeCache) &&
|
|
302
|
-
isTwinRefVisible(adapter, edge.object_ref, options, new Set(), edgeCache));
|
|
303
|
-
const limit = typeof options.limit === 'number' && Number.isFinite(options.limit)
|
|
304
|
-
? Math.max(0, Math.floor(options.limit))
|
|
305
|
-
: null;
|
|
306
|
-
const sortedEdges = [...edges].sort((left, right) => {
|
|
307
|
-
const createdDiff = right.created_at - left.created_at;
|
|
308
|
-
return createdDiff !== 0 ? createdDiff : left.edge_id.localeCompare(right.edge_id);
|
|
309
|
-
});
|
|
310
|
-
if (limit === null) {
|
|
311
|
-
return sortedEdges;
|
|
312
|
-
}
|
|
313
|
-
return sortedEdges.slice(0, limit);
|
|
314
|
-
}
|
|
315
|
-
function normalizeEdgeTypes(edgeTypes) {
|
|
316
|
-
if (!Array.isArray(edgeTypes) || edgeTypes.length === 0) {
|
|
317
|
-
return new Set();
|
|
318
|
-
}
|
|
319
|
-
return new Set(edgeTypes);
|
|
320
|
-
}
|
|
321
|
-
//# sourceMappingURL=ref-validation.js.map
|
package/dist/edges/store.d.ts
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import type { DatabaseAdapter } from '../db-manager.js';
|
|
2
|
-
import { type TwinEdgeRecord, type TwinRef } from './types.js';
|
|
3
|
-
type TwinEdgeReadAdapter = Pick<DatabaseAdapter, 'prepare'>;
|
|
4
|
-
export declare function mapTwinEdgeRow(row: Record<string, unknown>): TwinEdgeRecord;
|
|
5
|
-
export declare function getTwinEdge(adapter: TwinEdgeReadAdapter, edgeId: string): TwinEdgeRecord | null;
|
|
6
|
-
export declare function listTwinEdgesForRefs(adapter: TwinEdgeReadAdapter, refs: readonly TwinRef[]): TwinEdgeRecord[];
|
|
7
|
-
export {};
|
|
8
|
-
//# sourceMappingURL=store.d.ts.map
|
package/dist/edges/store.js
DELETED
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.mapTwinEdgeRow = mapTwinEdgeRow;
|
|
4
|
-
exports.getTwinEdge = getTwinEdge;
|
|
5
|
-
exports.listTwinEdgesForRefs = listTwinEdgesForRefs;
|
|
6
|
-
const types_js_1 = require("./types.js");
|
|
7
|
-
const EDGE_TYPE_SET = new Set(types_js_1.TWIN_EDGE_TYPES);
|
|
8
|
-
const REF_KIND_SET = new Set(types_js_1.TWIN_REF_KINDS);
|
|
9
|
-
const SOURCE_SET = new Set(types_js_1.TWIN_EDGE_SOURCES);
|
|
10
|
-
function nullableString(value) {
|
|
11
|
-
return typeof value === 'string' && value.length > 0 ? value : null;
|
|
12
|
-
}
|
|
13
|
-
function requireNonEmptyString(value, field) {
|
|
14
|
-
if (typeof value !== 'string' || value.length === 0) {
|
|
15
|
-
throw new Error(`twin_edges.${field} must be a non-empty string`);
|
|
16
|
-
}
|
|
17
|
-
return value;
|
|
18
|
-
}
|
|
19
|
-
function normalizeEdgeType(value) {
|
|
20
|
-
if (typeof value === 'string' && EDGE_TYPE_SET.has(value)) {
|
|
21
|
-
return value;
|
|
22
|
-
}
|
|
23
|
-
throw new Error(`Unsupported twin edge type: ${String(value)}`);
|
|
24
|
-
}
|
|
25
|
-
function normalizeSource(value) {
|
|
26
|
-
if (typeof value === 'string' && SOURCE_SET.has(value)) {
|
|
27
|
-
return value;
|
|
28
|
-
}
|
|
29
|
-
throw new Error(`Unsupported twin edge source: ${String(value)}`);
|
|
30
|
-
}
|
|
31
|
-
function normalizeRef(ref, field) {
|
|
32
|
-
if (!ref || typeof ref !== 'object') {
|
|
33
|
-
throw new Error(`${field} must be a TwinRef`);
|
|
34
|
-
}
|
|
35
|
-
if (!REF_KIND_SET.has(ref.kind)) {
|
|
36
|
-
throw new Error(`${field}.kind is unsupported: ${String(ref.kind)}`);
|
|
37
|
-
}
|
|
38
|
-
return {
|
|
39
|
-
kind: ref.kind,
|
|
40
|
-
id: requireNonEmptyString(ref.id, `${field}.id`),
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
function parseJsonField(value, field, edgeId) {
|
|
44
|
-
if (value === null || value === undefined) {
|
|
45
|
-
return null;
|
|
46
|
-
}
|
|
47
|
-
const text = String(value);
|
|
48
|
-
if (text.length === 0) {
|
|
49
|
-
return null;
|
|
50
|
-
}
|
|
51
|
-
try {
|
|
52
|
-
return JSON.parse(text);
|
|
53
|
-
}
|
|
54
|
-
catch (error) {
|
|
55
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
56
|
-
throw new Error(`Invalid twin_edges.${field} for ${edgeId}: ${message}`);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
function toBuffer(value) {
|
|
60
|
-
if (Buffer.isBuffer(value)) {
|
|
61
|
-
return value;
|
|
62
|
-
}
|
|
63
|
-
if (value instanceof Uint8Array) {
|
|
64
|
-
return Buffer.from(value);
|
|
65
|
-
}
|
|
66
|
-
throw new Error('twin_edges.content_hash must be a 32-byte Buffer');
|
|
67
|
-
}
|
|
68
|
-
function mapTwinEdgeRow(row) {
|
|
69
|
-
const edgeId = String(row.edge_id);
|
|
70
|
-
return {
|
|
71
|
-
edge_id: edgeId,
|
|
72
|
-
edge_type: normalizeEdgeType(row.edge_type),
|
|
73
|
-
subject_ref: {
|
|
74
|
-
kind: String(row.subject_kind),
|
|
75
|
-
id: String(row.subject_id),
|
|
76
|
-
},
|
|
77
|
-
object_ref: {
|
|
78
|
-
kind: String(row.object_kind),
|
|
79
|
-
id: String(row.object_id),
|
|
80
|
-
},
|
|
81
|
-
relation_attrs_json: nullableString(row.relation_attrs_json),
|
|
82
|
-
relation_attrs: parseJsonField(row.relation_attrs_json, 'relation_attrs_json', edgeId),
|
|
83
|
-
confidence: Number(row.confidence),
|
|
84
|
-
source: normalizeSource(row.source),
|
|
85
|
-
agent_id: nullableString(row.agent_id),
|
|
86
|
-
model_run_id: nullableString(row.model_run_id),
|
|
87
|
-
envelope_hash: nullableString(row.envelope_hash),
|
|
88
|
-
human_actor_id: nullableString(row.human_actor_id),
|
|
89
|
-
human_actor_role: nullableString(row.human_actor_role),
|
|
90
|
-
authority_scope_json: nullableString(row.authority_scope_json),
|
|
91
|
-
authority_scope: parseJsonField(row.authority_scope_json, 'authority_scope_json', edgeId),
|
|
92
|
-
reason_classification: nullableString(row.reason_classification),
|
|
93
|
-
reason_text: nullableString(row.reason_text),
|
|
94
|
-
evidence_refs_json: nullableString(row.evidence_refs_json),
|
|
95
|
-
evidence_refs: parseJsonField(row.evidence_refs_json, 'evidence_refs_json', edgeId),
|
|
96
|
-
request_idempotency_key: nullableString(row.request_idempotency_key),
|
|
97
|
-
edge_idempotency_key: nullableString(row.edge_idempotency_key),
|
|
98
|
-
content_hash: toBuffer(row.content_hash),
|
|
99
|
-
created_at: Number(row.created_at),
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
function getTwinEdge(adapter, edgeId) {
|
|
103
|
-
const row = adapter.prepare('SELECT * FROM twin_edges WHERE edge_id = ?').get(edgeId);
|
|
104
|
-
return row ? mapTwinEdgeRow(row) : null;
|
|
105
|
-
}
|
|
106
|
-
function listTwinEdgesForRefs(adapter, refs) {
|
|
107
|
-
const normalizedRefs = refs.map((ref, index) => normalizeRef(ref, `refs[${index}]`));
|
|
108
|
-
if (normalizedRefs.length === 0) {
|
|
109
|
-
return [];
|
|
110
|
-
}
|
|
111
|
-
const clauses = [];
|
|
112
|
-
const params = [];
|
|
113
|
-
for (const ref of normalizedRefs) {
|
|
114
|
-
clauses.push('(subject_kind = ? AND subject_id = ?)');
|
|
115
|
-
params.push(ref.kind, ref.id);
|
|
116
|
-
clauses.push('(object_kind = ? AND object_id = ?)');
|
|
117
|
-
params.push(ref.kind, ref.id);
|
|
118
|
-
}
|
|
119
|
-
const rows = adapter
|
|
120
|
-
.prepare(`
|
|
121
|
-
SELECT *
|
|
122
|
-
FROM twin_edges
|
|
123
|
-
WHERE ${clauses.join(' OR ')}
|
|
124
|
-
ORDER BY created_at ASC, edge_id ASC
|
|
125
|
-
`)
|
|
126
|
-
.all(...params);
|
|
127
|
-
return rows.map(mapTwinEdgeRow);
|
|
128
|
-
}
|
|
129
|
-
//# sourceMappingURL=store.js.map
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* MAMA Embedding Client
|
|
3
|
-
*
|
|
4
|
-
* HTTP client for the embedding server running in MCP server.
|
|
5
|
-
* Used by hooks for fast embedding generation.
|
|
6
|
-
*
|
|
7
|
-
* Features:
|
|
8
|
-
* - Auto-discovery via port file
|
|
9
|
-
* - Timeout handling
|
|
10
|
-
* - Fallback to local embedding when server unavailable
|
|
11
|
-
*
|
|
12
|
-
* @module embedding-client
|
|
13
|
-
*/
|
|
14
|
-
export declare const DEFAULT_PORT: number;
|
|
15
|
-
export declare const HOST = "127.0.0.1";
|
|
16
|
-
export declare const TIMEOUT_MS = 500;
|
|
17
|
-
export declare const PORT_FILE: string;
|
|
18
|
-
export interface ServerStatus {
|
|
19
|
-
status: string;
|
|
20
|
-
model?: string;
|
|
21
|
-
dimension?: number;
|
|
22
|
-
uptime?: number;
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Get server port from port file or default
|
|
26
|
-
*/
|
|
27
|
-
export declare function getServerPort(): number;
|
|
28
|
-
//# sourceMappingURL=embedding-client.d.ts.map
|
package/dist/embedding-client.js
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* MAMA Embedding Client
|
|
4
|
-
*
|
|
5
|
-
* HTTP client for the embedding server running in MCP server.
|
|
6
|
-
* Used by hooks for fast embedding generation.
|
|
7
|
-
*
|
|
8
|
-
* Features:
|
|
9
|
-
* - Auto-discovery via port file
|
|
10
|
-
* - Timeout handling
|
|
11
|
-
* - Fallback to local embedding when server unavailable
|
|
12
|
-
*
|
|
13
|
-
* @module embedding-client
|
|
14
|
-
*/
|
|
15
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
16
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
17
|
-
};
|
|
18
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
-
exports.PORT_FILE = exports.TIMEOUT_MS = exports.HOST = exports.DEFAULT_PORT = void 0;
|
|
20
|
-
exports.getServerPort = getServerPort;
|
|
21
|
-
const fs_1 = __importDefault(require("fs"));
|
|
22
|
-
const path_1 = __importDefault(require("path"));
|
|
23
|
-
function resolveConfiguredPort() {
|
|
24
|
-
const rawPort = process.env.MAMA_EMBEDDING_PORT || process.env.MAMA_HTTP_PORT || '';
|
|
25
|
-
const parsedPort = parseInt(rawPort, 10);
|
|
26
|
-
if (Number.isInteger(parsedPort) && parsedPort > 0 && parsedPort < 65536) {
|
|
27
|
-
return parsedPort;
|
|
28
|
-
}
|
|
29
|
-
return 3849;
|
|
30
|
-
}
|
|
31
|
-
// Configuration
|
|
32
|
-
exports.DEFAULT_PORT = resolveConfiguredPort();
|
|
33
|
-
exports.HOST = '127.0.0.1';
|
|
34
|
-
exports.TIMEOUT_MS = 500; // 500ms timeout for fast response
|
|
35
|
-
exports.PORT_FILE = path_1.default.join(process.env.HOME || '/tmp', '.mama-embedding-port');
|
|
36
|
-
/**
|
|
37
|
-
* Get server port from port file or default
|
|
38
|
-
*/
|
|
39
|
-
function getServerPort() {
|
|
40
|
-
try {
|
|
41
|
-
if (fs_1.default.existsSync(exports.PORT_FILE)) {
|
|
42
|
-
const port = parseInt(fs_1.default.readFileSync(exports.PORT_FILE, 'utf8').trim(), 10);
|
|
43
|
-
if (port > 0 && port < 65536) {
|
|
44
|
-
return port;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
catch {
|
|
49
|
-
// Ignore errors, use default
|
|
50
|
-
}
|
|
51
|
-
return exports.DEFAULT_PORT;
|
|
52
|
-
}
|
|
53
|
-
//# sourceMappingURL=embedding-client.js.map
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* MAMA Embedding HTTP Server
|
|
3
|
-
*
|
|
4
|
-
* HTTP API for embedding generation, integrated with MCP server.
|
|
5
|
-
* Provides fast embedding access for Claude Code hooks.
|
|
6
|
-
*
|
|
7
|
-
* Features:
|
|
8
|
-
* - Model stays loaded in memory (singleton)
|
|
9
|
-
* - HTTP API at localhost:${MAMA_EMBEDDING_PORT || MAMA_HTTP_PORT || 3849}
|
|
10
|
-
* - Health check endpoint
|
|
11
|
-
* - Shared model with MCP server
|
|
12
|
-
*
|
|
13
|
-
* @module embedding-http-server
|
|
14
|
-
*/
|
|
15
|
-
import type { IncomingMessage, ServerResponse, Server as HTTPServer } from 'http';
|
|
16
|
-
export declare const SHUTDOWN_TOKEN: string;
|
|
17
|
-
import type { EmbeddingRole } from '../embeddings.js';
|
|
18
|
-
export declare const DEFAULT_PORT: number;
|
|
19
|
-
export declare const HOST = "127.0.0.1";
|
|
20
|
-
export declare const PORT_FILE: string;
|
|
21
|
-
/**
|
|
22
|
-
* Request handler type
|
|
23
|
-
*/
|
|
24
|
-
type RequestHandler = (req: IncomingMessage, res: ServerResponse) => Promise<boolean>;
|
|
25
|
-
/**
|
|
26
|
-
* MessageRouter interface
|
|
27
|
-
*/
|
|
28
|
-
interface MessageRouter {
|
|
29
|
-
process(message: unknown): Promise<unknown>;
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* SessionStore interface
|
|
33
|
-
*/
|
|
34
|
-
interface SessionStore {
|
|
35
|
-
getHistory?(sessionId: string): unknown[];
|
|
36
|
-
getHistoryByChannel?(source: string, channelId: string): unknown[];
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Server options
|
|
40
|
-
*/
|
|
41
|
-
export interface ServerOptions {
|
|
42
|
-
messageRouter?: MessageRouter;
|
|
43
|
-
sessionStore?: SessionStore;
|
|
44
|
-
graphHandler?: RequestHandler;
|
|
45
|
-
}
|
|
46
|
-
export declare function resolveEmbeddingRole(raw: unknown): EmbeddingRole;
|
|
47
|
-
/**
|
|
48
|
-
* Clean up port file on exit
|
|
49
|
-
*/
|
|
50
|
-
export declare function cleanupPortFile(): void;
|
|
51
|
-
/**
|
|
52
|
-
* Start the HTTP embedding server
|
|
53
|
-
*
|
|
54
|
-
* @param port - Port to listen on (default: DEFAULT_PORT)
|
|
55
|
-
* @returns HTTP server instance
|
|
56
|
-
*/
|
|
57
|
-
export declare function startEmbeddingServer(port?: number, options?: ServerOptions): Promise<HTTPServer | null>;
|
|
58
|
-
/**
|
|
59
|
-
* Pre-warm the embedding model
|
|
60
|
-
*/
|
|
61
|
-
export declare function warmModel(): Promise<{
|
|
62
|
-
success: boolean;
|
|
63
|
-
latency?: number;
|
|
64
|
-
error?: string;
|
|
65
|
-
}>;
|
|
66
|
-
export {};
|
|
67
|
-
//# sourceMappingURL=index.d.ts.map
|