@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,82 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.projectEntityToRecallSummary = projectEntityToRecallSummary;
|
|
4
|
-
const errors_js_1 = require("./errors.js");
|
|
5
|
-
function formatTimelineEventForRecall(latestEvent) {
|
|
6
|
-
if (!latestEvent) {
|
|
7
|
-
return null;
|
|
8
|
-
}
|
|
9
|
-
const parts = [];
|
|
10
|
-
const eventType = latestEvent.event_type.trim();
|
|
11
|
-
const summary = latestEvent.summary.trim();
|
|
12
|
-
const details = latestEvent.details?.trim() ?? '';
|
|
13
|
-
if (eventType.length > 0) {
|
|
14
|
-
parts.push(eventType);
|
|
15
|
-
}
|
|
16
|
-
if (summary.length > 0) {
|
|
17
|
-
parts.push(summary);
|
|
18
|
-
}
|
|
19
|
-
if (details.length > 0 && details !== summary) {
|
|
20
|
-
try {
|
|
21
|
-
const parsed = JSON.parse(details);
|
|
22
|
-
if (parsed && typeof parsed === 'object') {
|
|
23
|
-
parts.push(JSON.stringify(parsed));
|
|
24
|
-
}
|
|
25
|
-
else {
|
|
26
|
-
parts.push(details);
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
catch {
|
|
30
|
-
parts.push(details);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
return parts.length > 0 ? parts.join('\n') : null;
|
|
34
|
-
}
|
|
35
|
-
function assertNoCircularMerge(node, options) {
|
|
36
|
-
if (!options?.nodeLookup) {
|
|
37
|
-
return;
|
|
38
|
-
}
|
|
39
|
-
const seen = new Set();
|
|
40
|
-
let current = options.nodeLookup[node.id] ?? node;
|
|
41
|
-
while (current?.merged_into) {
|
|
42
|
-
if (seen.has(current.id)) {
|
|
43
|
-
throw new errors_js_1.EntityLabelMissingError({
|
|
44
|
-
entity_id: node.id,
|
|
45
|
-
reason: 'circular_merged_into_chain',
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
seen.add(current.id);
|
|
49
|
-
current = options.nodeLookup[current.merged_into];
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
function projectEntityToRecallSummary(node, aliases, latestEvent, options) {
|
|
53
|
-
if (!node.preferred_label.trim()) {
|
|
54
|
-
throw new errors_js_1.EntityLabelMissingError({
|
|
55
|
-
entity_id: node.id,
|
|
56
|
-
reason: 'missing_preferred_label',
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
assertNoCircularMerge(node, options);
|
|
60
|
-
const aliasText = aliases.map((alias) => alias.label).join(', ');
|
|
61
|
-
const detailParts = [formatTimelineEventForRecall(latestEvent), aliasText].filter((value) => Boolean(value));
|
|
62
|
-
const scopeKind = node.scope_kind ?? 'global';
|
|
63
|
-
const scopeId = node.scope_kind === null ? 'global' : (node.scope_id ?? 'global');
|
|
64
|
-
return {
|
|
65
|
-
id: node.id,
|
|
66
|
-
topic: `entity/${node.id}`,
|
|
67
|
-
kind: 'fact',
|
|
68
|
-
summary: node.preferred_label,
|
|
69
|
-
details: detailParts.join('\n'),
|
|
70
|
-
confidence: 0.9,
|
|
71
|
-
status: 'active',
|
|
72
|
-
scopes: [{ kind: scopeKind, id: scopeId }],
|
|
73
|
-
source: {
|
|
74
|
-
package: 'mama-core',
|
|
75
|
-
source_type: 'entity_canonical',
|
|
76
|
-
project_id: node.scope_id ?? undefined,
|
|
77
|
-
},
|
|
78
|
-
created_at: node.created_at,
|
|
79
|
-
updated_at: node.updated_at,
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
|
-
//# sourceMappingURL=projection.js.map
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { type SourceLocatorKind } from './source-locator.js';
|
|
2
|
-
import type { MemoryRecord } from '../memory/types.js';
|
|
3
|
-
export interface ProvenanceObservationSummary {
|
|
4
|
-
id: string;
|
|
5
|
-
observation_type: string;
|
|
6
|
-
entity_kind_hint: string | null;
|
|
7
|
-
surface_form: string;
|
|
8
|
-
normalized_form: string;
|
|
9
|
-
lang: string | null;
|
|
10
|
-
script: string | null;
|
|
11
|
-
context_summary: string | null;
|
|
12
|
-
scope_kind: string;
|
|
13
|
-
scope_id: string | null;
|
|
14
|
-
extractor_version: string;
|
|
15
|
-
embedding_model_version: string | null;
|
|
16
|
-
source_connector: string;
|
|
17
|
-
source_locator: string | null;
|
|
18
|
-
source_locator_kind: SourceLocatorKind;
|
|
19
|
-
source_raw_record_id: string;
|
|
20
|
-
created_at: number;
|
|
21
|
-
}
|
|
22
|
-
export interface MemoryProvenanceResult {
|
|
23
|
-
status: 'legacy' | 'manual' | 'dropped' | 'resolved';
|
|
24
|
-
memory: MemoryRecord;
|
|
25
|
-
observations: ProvenanceObservationSummary[];
|
|
26
|
-
audit: {
|
|
27
|
-
event_type: 'provenance.empty_batch' | 'provenance.link_write_failed';
|
|
28
|
-
reason: string | null;
|
|
29
|
-
created_at: number;
|
|
30
|
-
} | null;
|
|
31
|
-
}
|
|
32
|
-
//# sourceMappingURL=provenance-query.d.ts.map
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import type { MemoryRecord } from '../memory/types.js';
|
|
2
|
-
export interface CanonicalReadEntity {
|
|
3
|
-
id: string;
|
|
4
|
-
label: string;
|
|
5
|
-
kind: string;
|
|
6
|
-
}
|
|
7
|
-
export type ReadIdentity = {
|
|
8
|
-
kind: 'canonical';
|
|
9
|
-
entities: CanonicalReadEntity[];
|
|
10
|
-
primaryEntity: CanonicalReadEntity;
|
|
11
|
-
legacyTopic: string | null;
|
|
12
|
-
shadowConflict: boolean;
|
|
13
|
-
displaySubject?: string | null;
|
|
14
|
-
displayTopic?: string | null;
|
|
15
|
-
displaySuffix?: string | null;
|
|
16
|
-
} | {
|
|
17
|
-
kind: 'topic';
|
|
18
|
-
topic: string;
|
|
19
|
-
displaySubject?: string | null;
|
|
20
|
-
displayTopic?: string | null;
|
|
21
|
-
displaySuffix?: string | null;
|
|
22
|
-
} | {
|
|
23
|
-
kind: 'raw';
|
|
24
|
-
label: string;
|
|
25
|
-
displaySubject?: string | null;
|
|
26
|
-
displayTopic?: string | null;
|
|
27
|
-
displaySuffix?: string | null;
|
|
28
|
-
};
|
|
29
|
-
export declare function resolveReadIdentity(record: Pick<MemoryRecord, 'topic' | 'summary'>, entities: CanonicalReadEntity[]): ReadIdentity;
|
|
30
|
-
export declare function loadDecisionReadIdentityIndex(decisionIds: string[]): Promise<Map<string, CanonicalReadEntity[]>>;
|
|
31
|
-
//# sourceMappingURL=read-identity.d.ts.map
|
|
@@ -1,264 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.resolveReadIdentity = resolveReadIdentity;
|
|
4
|
-
exports.loadDecisionReadIdentityIndex = loadDecisionReadIdentityIndex;
|
|
5
|
-
const db_manager_js_1 = require("../db-manager.js");
|
|
6
|
-
function normalizeText(value) {
|
|
7
|
-
return value.normalize('NFKC').trim().replace(/\s+/gu, ' ').toLowerCase();
|
|
8
|
-
}
|
|
9
|
-
function normalizeLooseText(value) {
|
|
10
|
-
return normalizeText(value ?? '')
|
|
11
|
-
.replace(/[_-]+/gu, ' ')
|
|
12
|
-
.replace(/[^\p{Letter}\p{Number}\s/]+/gu, ' ')
|
|
13
|
-
.replace(/\s+/gu, ' ')
|
|
14
|
-
.trim();
|
|
15
|
-
}
|
|
16
|
-
function humanizeTopicSegment(segment) {
|
|
17
|
-
return segment.normalize('NFKC').replace(/[_]+/gu, ' ').replace(/\s+/gu, ' ').trim();
|
|
18
|
-
}
|
|
19
|
-
function humanizeTopicLabel(topic) {
|
|
20
|
-
if (typeof topic !== 'string') {
|
|
21
|
-
return null;
|
|
22
|
-
}
|
|
23
|
-
const segments = topic
|
|
24
|
-
.split('/')
|
|
25
|
-
.map((segment) => humanizeTopicSegment(segment))
|
|
26
|
-
.filter((segment) => segment.length > 0);
|
|
27
|
-
if (segments.length === 0) {
|
|
28
|
-
const fallback = humanizeTopicSegment(topic);
|
|
29
|
-
return fallback.length > 0 ? fallback : null;
|
|
30
|
-
}
|
|
31
|
-
return segments.join(' / ');
|
|
32
|
-
}
|
|
33
|
-
function hasProjectishSignal(label) {
|
|
34
|
-
return /(?:案件|相談|窓|民泊|project|room|board|launch|client|feedback|delivery)/iu.test(label ?? '');
|
|
35
|
-
}
|
|
36
|
-
function looksLikeMachineGeneratedLabel(label) {
|
|
37
|
-
return /^(slack|chatwork|telegram|line|kakao)(:|$)/iu.test(label ?? '');
|
|
38
|
-
}
|
|
39
|
-
function looksLikeParticipantLabel(label) {
|
|
40
|
-
if (!label) {
|
|
41
|
-
return false;
|
|
42
|
-
}
|
|
43
|
-
const trimmed = label.trim();
|
|
44
|
-
if (/^(kagemusha|system)$/iu.test(trimmed)) {
|
|
45
|
-
return true;
|
|
46
|
-
}
|
|
47
|
-
if (hasProjectishSignal(trimmed)) {
|
|
48
|
-
return false;
|
|
49
|
-
}
|
|
50
|
-
if (/[·,]/u.test(trimmed)) {
|
|
51
|
-
return true;
|
|
52
|
-
}
|
|
53
|
-
if (trimmed.length === 0 || trimmed.length > 20) {
|
|
54
|
-
return false;
|
|
55
|
-
}
|
|
56
|
-
if (/[A-Za-z0-9]/u.test(trimmed)) {
|
|
57
|
-
return false;
|
|
58
|
-
}
|
|
59
|
-
return /^[\p{Script=Hangul}\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}\s()]+$/u.test(trimmed);
|
|
60
|
-
}
|
|
61
|
-
function hasNonEmptyTopic(record) {
|
|
62
|
-
return typeof record.topic === 'string' && record.topic.trim().length > 0;
|
|
63
|
-
}
|
|
64
|
-
function sortCanonicalReadEntities(entities) {
|
|
65
|
-
return [...entities].sort((left, right) => {
|
|
66
|
-
if (left.kind !== right.kind) {
|
|
67
|
-
return left.kind.localeCompare(right.kind);
|
|
68
|
-
}
|
|
69
|
-
if (left.label !== right.label) {
|
|
70
|
-
return left.label.localeCompare(right.label);
|
|
71
|
-
}
|
|
72
|
-
return left.id.localeCompare(right.id);
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
function hasShadowConflict(record, primaryEntity) {
|
|
76
|
-
if (!hasNonEmptyTopic(record)) {
|
|
77
|
-
return false;
|
|
78
|
-
}
|
|
79
|
-
const summary = normalizeText(record.summary ?? '');
|
|
80
|
-
const label = normalizeText(primaryEntity.label);
|
|
81
|
-
if (!summary || !label) {
|
|
82
|
-
return false;
|
|
83
|
-
}
|
|
84
|
-
if (summary === label) {
|
|
85
|
-
return false;
|
|
86
|
-
}
|
|
87
|
-
if (summary.includes(label) || label.includes(summary)) {
|
|
88
|
-
return false;
|
|
89
|
-
}
|
|
90
|
-
return true;
|
|
91
|
-
}
|
|
92
|
-
function getLegacyTopic(record) {
|
|
93
|
-
return hasNonEmptyTopic(record) ? record.topic.trim() : null;
|
|
94
|
-
}
|
|
95
|
-
function getLegacyNamespace(record) {
|
|
96
|
-
const legacyTopic = getLegacyTopic(record);
|
|
97
|
-
if (!legacyTopic) {
|
|
98
|
-
return null;
|
|
99
|
-
}
|
|
100
|
-
const humanized = humanizeTopicSegment(legacyTopic.split('/')[0] ?? '');
|
|
101
|
-
if (normalizeLooseText(humanized) === 'entity') {
|
|
102
|
-
return null;
|
|
103
|
-
}
|
|
104
|
-
return humanized || null;
|
|
105
|
-
}
|
|
106
|
-
function selectDisplayEntity(entities, primaryEntity) {
|
|
107
|
-
return (entities.find((entity) => ['project', 'work_item', 'organization'].includes(entity.kind)) ??
|
|
108
|
-
primaryEntity);
|
|
109
|
-
}
|
|
110
|
-
function buildDisplaySubject(record, entities, primaryEntity) {
|
|
111
|
-
const preferredEntity = selectDisplayEntity(entities, primaryEntity);
|
|
112
|
-
const preferredLabel = preferredEntity.label?.trim();
|
|
113
|
-
const legacyNamespace = getLegacyNamespace(record);
|
|
114
|
-
const summary = record.summary?.trim();
|
|
115
|
-
if (summary && typeof record.topic === 'string' && record.topic.startsWith('entity/')) {
|
|
116
|
-
return summary;
|
|
117
|
-
}
|
|
118
|
-
if (legacyNamespace &&
|
|
119
|
-
preferredLabel &&
|
|
120
|
-
normalizeLooseText(preferredLabel) !== normalizeLooseText(legacyNamespace) &&
|
|
121
|
-
(looksLikeMachineGeneratedLabel(preferredLabel) || looksLikeParticipantLabel(preferredLabel))) {
|
|
122
|
-
return legacyNamespace;
|
|
123
|
-
}
|
|
124
|
-
if (preferredLabel && !looksLikeMachineGeneratedLabel(preferredLabel)) {
|
|
125
|
-
return preferredLabel;
|
|
126
|
-
}
|
|
127
|
-
if (legacyNamespace) {
|
|
128
|
-
return legacyNamespace;
|
|
129
|
-
}
|
|
130
|
-
return summary || humanizeTopicLabel(getLegacyTopic(record)) || preferredLabel || null;
|
|
131
|
-
}
|
|
132
|
-
function buildDisplayTopic(record, entities, primaryEntity) {
|
|
133
|
-
const summary = record.summary?.trim();
|
|
134
|
-
if (summary && typeof record.topic === 'string' && record.topic.startsWith('entity/')) {
|
|
135
|
-
return summary;
|
|
136
|
-
}
|
|
137
|
-
const preferredEntity = selectDisplayEntity(entities, primaryEntity);
|
|
138
|
-
const subjectLabel = preferredEntity.kind !== 'person' && preferredEntity.label.trim().length > 0
|
|
139
|
-
? preferredEntity.label.trim()
|
|
140
|
-
: '';
|
|
141
|
-
const humanizedTopic = humanizeTopicLabel(getLegacyTopic(record));
|
|
142
|
-
if (!subjectLabel) {
|
|
143
|
-
return humanizedTopic || summary || null;
|
|
144
|
-
}
|
|
145
|
-
if (!humanizedTopic) {
|
|
146
|
-
return subjectLabel;
|
|
147
|
-
}
|
|
148
|
-
const normalizedSubject = normalizeLooseText(subjectLabel);
|
|
149
|
-
const normalizedTopic = normalizeLooseText(humanizedTopic);
|
|
150
|
-
const tokens = normalizedTopic.split(' ').filter((token) => token.length > 0);
|
|
151
|
-
const genericTokens = new Set(['spine', 'fb', 'fix', 'pdf', 'sd', 'ex', 'ar', 'r18', 'sp']);
|
|
152
|
-
const informativeTokens = tokens.filter((token) => !genericTokens.has(token) && !/^\d+$/u.test(token) && token.length > 1);
|
|
153
|
-
const lowSignalTopic = normalizedTopic.length === 0 || informativeTokens.length === 0;
|
|
154
|
-
if (lowSignalTopic || normalizedTopic === normalizedSubject) {
|
|
155
|
-
return subjectLabel;
|
|
156
|
-
}
|
|
157
|
-
return humanizedTopic;
|
|
158
|
-
}
|
|
159
|
-
function buildDisplaySuffix(record, entities, primaryEntity) {
|
|
160
|
-
const displaySubject = buildDisplaySubject(record, entities, primaryEntity);
|
|
161
|
-
const displayTopic = buildDisplayTopic(record, entities, primaryEntity);
|
|
162
|
-
if (!displaySubject || !displayTopic) {
|
|
163
|
-
return null;
|
|
164
|
-
}
|
|
165
|
-
const normalizedSubject = normalizeLooseText(displaySubject);
|
|
166
|
-
const normalizedTopic = normalizeLooseText(displayTopic);
|
|
167
|
-
if (!normalizedTopic || normalizedTopic === normalizedSubject) {
|
|
168
|
-
return null;
|
|
169
|
-
}
|
|
170
|
-
const subjectParts = displaySubject
|
|
171
|
-
.split('/')
|
|
172
|
-
.map((part) => part.trim())
|
|
173
|
-
.filter(Boolean);
|
|
174
|
-
const topicParts = displayTopic
|
|
175
|
-
.split('/')
|
|
176
|
-
.map((part) => part.trim())
|
|
177
|
-
.filter(Boolean);
|
|
178
|
-
if (topicParts.length > 1 && subjectParts.length > 0) {
|
|
179
|
-
const firstTopicPart = topicParts[0] ?? '';
|
|
180
|
-
const firstSubjectPart = subjectParts[subjectParts.length - 1] ?? '';
|
|
181
|
-
if (normalizeLooseText(firstTopicPart) === normalizeLooseText(firstSubjectPart)) {
|
|
182
|
-
const suffix = topicParts.slice(1).join(' / ').trim();
|
|
183
|
-
return suffix.length > 0 ? suffix : null;
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
return displayTopic;
|
|
187
|
-
}
|
|
188
|
-
function resolveReadIdentity(record, entities) {
|
|
189
|
-
if (entities.length > 0) {
|
|
190
|
-
const sortedEntities = sortCanonicalReadEntities(entities);
|
|
191
|
-
const primaryEntity = sortedEntities[0];
|
|
192
|
-
return {
|
|
193
|
-
kind: 'canonical',
|
|
194
|
-
entities: sortedEntities,
|
|
195
|
-
primaryEntity,
|
|
196
|
-
legacyTopic: getLegacyTopic(record),
|
|
197
|
-
shadowConflict: hasShadowConflict(record, primaryEntity),
|
|
198
|
-
displaySubject: buildDisplaySubject(record, sortedEntities, primaryEntity),
|
|
199
|
-
displayTopic: buildDisplayTopic(record, sortedEntities, primaryEntity),
|
|
200
|
-
displaySuffix: buildDisplaySuffix(record, sortedEntities, primaryEntity),
|
|
201
|
-
};
|
|
202
|
-
}
|
|
203
|
-
if (hasNonEmptyTopic(record)) {
|
|
204
|
-
return {
|
|
205
|
-
kind: 'topic',
|
|
206
|
-
topic: record.topic.trim(),
|
|
207
|
-
displaySubject: null,
|
|
208
|
-
displayTopic: humanizeTopicLabel(record.topic),
|
|
209
|
-
displaySuffix: null,
|
|
210
|
-
};
|
|
211
|
-
}
|
|
212
|
-
return {
|
|
213
|
-
kind: 'raw',
|
|
214
|
-
label: record.summary.trim() || '<unknown>',
|
|
215
|
-
displaySubject: null,
|
|
216
|
-
displayTopic: record.summary.trim() || '<unknown>',
|
|
217
|
-
displaySuffix: null,
|
|
218
|
-
};
|
|
219
|
-
}
|
|
220
|
-
async function loadDecisionReadIdentityIndex(decisionIds) {
|
|
221
|
-
await (0, db_manager_js_1.initDB)();
|
|
222
|
-
const uniqueDecisionIds = Array.from(new Set(decisionIds
|
|
223
|
-
.filter((decisionId) => typeof decisionId === 'string')
|
|
224
|
-
.map((decisionId) => decisionId.trim())
|
|
225
|
-
.filter((decisionId) => decisionId.length > 0)));
|
|
226
|
-
const index = new Map();
|
|
227
|
-
if (uniqueDecisionIds.length === 0) {
|
|
228
|
-
return index;
|
|
229
|
-
}
|
|
230
|
-
const placeholders = uniqueDecisionIds.map(() => '?').join(', ');
|
|
231
|
-
const rows = (0, db_manager_js_1.getAdapter)()
|
|
232
|
-
.prepare(`
|
|
233
|
-
SELECT
|
|
234
|
-
des.decision_id,
|
|
235
|
-
n.id AS entity_id,
|
|
236
|
-
n.preferred_label AS entity_label,
|
|
237
|
-
n.kind AS entity_kind
|
|
238
|
-
FROM decision_entity_sources des
|
|
239
|
-
JOIN entity_lineage_links l
|
|
240
|
-
ON l.entity_observation_id = des.entity_observation_id
|
|
241
|
-
AND l.status = 'active'
|
|
242
|
-
JOIN entity_nodes n
|
|
243
|
-
ON n.id = l.canonical_entity_id
|
|
244
|
-
WHERE des.decision_id IN (${placeholders})
|
|
245
|
-
AND n.status = 'active'
|
|
246
|
-
AND n.merged_into IS NULL
|
|
247
|
-
GROUP BY des.decision_id, n.id, n.preferred_label, n.kind
|
|
248
|
-
`)
|
|
249
|
-
.all(...uniqueDecisionIds);
|
|
250
|
-
for (const row of rows) {
|
|
251
|
-
const existing = index.get(row.decision_id) ?? [];
|
|
252
|
-
existing.push({
|
|
253
|
-
id: row.entity_id,
|
|
254
|
-
label: row.entity_label,
|
|
255
|
-
kind: row.entity_kind,
|
|
256
|
-
});
|
|
257
|
-
index.set(row.decision_id, existing);
|
|
258
|
-
}
|
|
259
|
-
for (const [decisionId, entities] of index.entries()) {
|
|
260
|
-
index.set(decisionId, sortCanonicalReadEntities(entities));
|
|
261
|
-
}
|
|
262
|
-
return index;
|
|
263
|
-
}
|
|
264
|
-
//# sourceMappingURL=read-identity.js.map
|
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.queryCanonicalEntities = queryCanonicalEntities;
|
|
4
|
-
const db_manager_js_1 = require("../db-manager.js");
|
|
5
|
-
const projection_js_1 = require("./projection.js");
|
|
6
|
-
const read_identity_js_1 = require("./read-identity.js");
|
|
7
|
-
const store_js_1 = require("./store.js");
|
|
8
|
-
function mapNode(row) {
|
|
9
|
-
return {
|
|
10
|
-
id: String(row.id),
|
|
11
|
-
kind: row.kind,
|
|
12
|
-
preferred_label: String(row.preferred_label),
|
|
13
|
-
status: row.status,
|
|
14
|
-
scope_kind: typeof row.scope_kind === 'string' ? row.scope_kind : null,
|
|
15
|
-
scope_id: typeof row.scope_id === 'string' ? row.scope_id : null,
|
|
16
|
-
merged_into: typeof row.merged_into === 'string' ? row.merged_into : null,
|
|
17
|
-
created_at: Number(row.created_at),
|
|
18
|
-
updated_at: Number(row.updated_at),
|
|
19
|
-
};
|
|
20
|
-
}
|
|
21
|
-
function mapAlias(row) {
|
|
22
|
-
return {
|
|
23
|
-
id: String(row.id),
|
|
24
|
-
entity_id: String(row.entity_id),
|
|
25
|
-
label: String(row.label),
|
|
26
|
-
normalized_label: String(row.normalized_label),
|
|
27
|
-
lang: typeof row.lang === 'string' ? row.lang : null,
|
|
28
|
-
script: typeof row.script === 'string' ? row.script : null,
|
|
29
|
-
label_type: row.label_type,
|
|
30
|
-
source_type: String(row.source_type),
|
|
31
|
-
source_ref: typeof row.source_ref === 'string' ? row.source_ref : null,
|
|
32
|
-
confidence: typeof row.confidence === 'number' ? row.confidence : null,
|
|
33
|
-
status: row.status,
|
|
34
|
-
created_at: Number(row.created_at),
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
function mapTimeline(row) {
|
|
38
|
-
return {
|
|
39
|
-
id: String(row.id),
|
|
40
|
-
entity_id: String(row.entity_id),
|
|
41
|
-
event_type: String(row.event_type),
|
|
42
|
-
valid_from: typeof row.valid_from === 'number' ? row.valid_from : null,
|
|
43
|
-
valid_to: typeof row.valid_to === 'number' ? row.valid_to : null,
|
|
44
|
-
observed_at: typeof row.observed_at === 'number' ? row.observed_at : null,
|
|
45
|
-
source_ref: typeof row.source_ref === 'string' ? row.source_ref : null,
|
|
46
|
-
summary: String(row.summary),
|
|
47
|
-
details: typeof row.details === 'string' ? row.details : null,
|
|
48
|
-
created_at: Number(row.created_at),
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
function escapeLikeQuery(query) {
|
|
52
|
-
return query.replace(/[\\%_]/g, '\\$&');
|
|
53
|
-
}
|
|
54
|
-
async function queryCanonicalEntities(query, scopes, options = {}) {
|
|
55
|
-
await (0, db_manager_js_1.initDB)();
|
|
56
|
-
const adapter = (0, db_manager_js_1.getAdapter)();
|
|
57
|
-
const escapedQuery = escapeLikeQuery(query);
|
|
58
|
-
// Match aliases and labels regardless of whether the owning node is merged,
|
|
59
|
-
// then chain-walk each match to its canonical terminal. Without this,
|
|
60
|
-
// searching by the old name of a merged entity returns nothing because the
|
|
61
|
-
// filter `n.status='active' AND n.merged_into IS NULL` would drop the
|
|
62
|
-
// source row. Matches the read-time chain-walking approach in the canonical
|
|
63
|
-
// entity ontology implementation plan.
|
|
64
|
-
const matchedRows = adapter
|
|
65
|
-
.prepare(`
|
|
66
|
-
SELECT DISTINCT n.id AS matched_id
|
|
67
|
-
FROM entity_nodes n
|
|
68
|
-
LEFT JOIN entity_aliases a ON a.entity_id = n.id
|
|
69
|
-
LEFT JOIN entity_lineage_links l ON l.canonical_entity_id = n.id AND l.status = 'active'
|
|
70
|
-
LEFT JOIN entity_observations o ON o.id = l.entity_observation_id
|
|
71
|
-
WHERE (
|
|
72
|
-
lower(n.preferred_label) LIKE '%' || lower(?) || '%' ESCAPE '\\'
|
|
73
|
-
OR lower(COALESCE(a.label, '')) LIKE '%' || lower(?) || '%' ESCAPE '\\'
|
|
74
|
-
OR lower(COALESCE(o.surface_form, '')) LIKE '%' || lower(?) || '%' ESCAPE '\\'
|
|
75
|
-
)
|
|
76
|
-
`)
|
|
77
|
-
.all(escapedQuery, escapedQuery, escapedQuery);
|
|
78
|
-
const canonicalIdSet = new Set();
|
|
79
|
-
for (const match of matchedRows) {
|
|
80
|
-
try {
|
|
81
|
-
canonicalIdSet.add((0, store_js_1.resolveCanonicalEntityId)(adapter, match.matched_id));
|
|
82
|
-
}
|
|
83
|
-
catch (err) {
|
|
84
|
-
// Cycle or missing node — skip this match rather than poison the whole
|
|
85
|
-
// recall. Merge integrity errors are surfaced elsewhere (the review
|
|
86
|
-
// handler 409 path) where the user can actually act on them.
|
|
87
|
-
if (!(err instanceof store_js_1.EntityMergeError)) {
|
|
88
|
-
throw err;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
if (canonicalIdSet.size === 0) {
|
|
93
|
-
return [];
|
|
94
|
-
}
|
|
95
|
-
const canonicalIds = Array.from(canonicalIdSet);
|
|
96
|
-
const placeholders = canonicalIds.map(() => '?').join(', ');
|
|
97
|
-
const rows = adapter
|
|
98
|
-
.prepare(`
|
|
99
|
-
SELECT *
|
|
100
|
-
FROM entity_nodes
|
|
101
|
-
WHERE id IN (${placeholders})
|
|
102
|
-
AND status = 'active'
|
|
103
|
-
AND merged_into IS NULL
|
|
104
|
-
ORDER BY updated_at DESC
|
|
105
|
-
`)
|
|
106
|
-
.all(...canonicalIds);
|
|
107
|
-
const scopedRows = scopes.length === 0
|
|
108
|
-
? rows
|
|
109
|
-
: rows.filter((row) =>
|
|
110
|
-
// Fix 2 part B (P0): globally-scoped entities are not bound to
|
|
111
|
-
// any narrower scope and must surface in every scoped query.
|
|
112
|
-
// Without this passthrough, switching person observations from
|
|
113
|
-
// channel-scope to global-scope (Fix 2 part A in
|
|
114
|
-
// history-extractor.ts) would make persons invisible to scoped
|
|
115
|
-
// recall callers, breaking the time-travel use case the fix is
|
|
116
|
-
// meant to enable. scope_id is intentionally not compared for
|
|
117
|
-
// globals — the global predicate is `scope_kind='global'` alone.
|
|
118
|
-
row.scope_kind === 'global' ||
|
|
119
|
-
scopes.some((scope) => scope.kind === row.scope_kind && row.scope_id === scope.id));
|
|
120
|
-
const limitedRows = scopedRows.slice(0, options.limit ?? 10);
|
|
121
|
-
const nodeLookup = Object.fromEntries(limitedRows.map((row) => [String(row.id), mapNode(row)]));
|
|
122
|
-
const entityIds = limitedRows.map((row) => String(row.id));
|
|
123
|
-
const aliasesByEntity = new Map();
|
|
124
|
-
const latestTimelineByEntity = new Map();
|
|
125
|
-
if (entityIds.length > 0) {
|
|
126
|
-
const placeholders = entityIds.map(() => '?').join(', ');
|
|
127
|
-
const aliasRows = adapter
|
|
128
|
-
.prepare(`
|
|
129
|
-
SELECT * FROM entity_aliases
|
|
130
|
-
WHERE entity_id IN (${placeholders})
|
|
131
|
-
ORDER BY entity_id ASC, created_at ASC
|
|
132
|
-
`)
|
|
133
|
-
.all(...entityIds);
|
|
134
|
-
for (const row of aliasRows) {
|
|
135
|
-
const alias = mapAlias(row);
|
|
136
|
-
const existing = aliasesByEntity.get(alias.entity_id) ?? [];
|
|
137
|
-
existing.push(alias);
|
|
138
|
-
aliasesByEntity.set(alias.entity_id, existing);
|
|
139
|
-
}
|
|
140
|
-
const timelineRows = adapter
|
|
141
|
-
.prepare(`
|
|
142
|
-
SELECT *
|
|
143
|
-
FROM (
|
|
144
|
-
SELECT *,
|
|
145
|
-
ROW_NUMBER() OVER (
|
|
146
|
-
PARTITION BY entity_id
|
|
147
|
-
ORDER BY COALESCE(observed_at, created_at) DESC
|
|
148
|
-
) AS row_num
|
|
149
|
-
FROM entity_timeline_events
|
|
150
|
-
WHERE entity_id IN (${placeholders})
|
|
151
|
-
)
|
|
152
|
-
WHERE row_num = 1
|
|
153
|
-
`)
|
|
154
|
-
.all(...entityIds);
|
|
155
|
-
for (const row of timelineRows) {
|
|
156
|
-
const timeline = mapTimeline(row);
|
|
157
|
-
latestTimelineByEntity.set(timeline.entity_id, timeline);
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
const result = [];
|
|
161
|
-
for (const row of limitedRows) {
|
|
162
|
-
const node = mapNode(row);
|
|
163
|
-
const projected = (0, projection_js_1.projectEntityToRecallSummary)(node, aliasesByEntity.get(node.id) ?? [], latestTimelineByEntity.get(node.id) ?? null, { nodeLookup });
|
|
164
|
-
projected.read_identity = (0, read_identity_js_1.resolveReadIdentity)(projected, [
|
|
165
|
-
{ id: node.id, label: node.preferred_label, kind: node.kind },
|
|
166
|
-
]);
|
|
167
|
-
result.push(projected);
|
|
168
|
-
}
|
|
169
|
-
return result;
|
|
170
|
-
}
|
|
171
|
-
//# sourceMappingURL=recall-bridge.js.map
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import type { EntityMergeAction, EntityResolutionCandidate } from './types.js';
|
|
2
|
-
export interface ResolutionDecision {
|
|
3
|
-
candidate: EntityResolutionCandidate;
|
|
4
|
-
decision: 'auto_merge' | 'review';
|
|
5
|
-
reason: string;
|
|
6
|
-
actions: EntityMergeAction[];
|
|
7
|
-
}
|
|
8
|
-
//# sourceMappingURL=resolution-engine.d.ts.map
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
export interface RollbackPreviewInput {
|
|
2
|
-
entityId: string;
|
|
3
|
-
mergeActionId?: string;
|
|
4
|
-
observationId?: string;
|
|
5
|
-
maxAffectedRows?: number;
|
|
6
|
-
}
|
|
7
|
-
export interface RollbackPreviewEntityChange {
|
|
8
|
-
entity_id: string;
|
|
9
|
-
label: string;
|
|
10
|
-
status_after: 'active' | 'merged';
|
|
11
|
-
active_lineage_after: number;
|
|
12
|
-
summary: string;
|
|
13
|
-
}
|
|
14
|
-
export interface RollbackPreviewMemoryChange {
|
|
15
|
-
id: string;
|
|
16
|
-
topic: string;
|
|
17
|
-
summary: string;
|
|
18
|
-
created_at: number;
|
|
19
|
-
}
|
|
20
|
-
export interface RollbackPreviewMetricMovement {
|
|
21
|
-
metric: 'false_merge_rate' | 'projection_fragmentation_rate';
|
|
22
|
-
direction: 'increase' | 'decrease';
|
|
23
|
-
reason: string;
|
|
24
|
-
}
|
|
25
|
-
export interface RollbackPreviewResult {
|
|
26
|
-
entity_id: string;
|
|
27
|
-
merge_action_id: string | null;
|
|
28
|
-
preview_unavailable: boolean;
|
|
29
|
-
history_incomplete: boolean;
|
|
30
|
-
truncated: boolean;
|
|
31
|
-
changed_entities: RollbackPreviewEntityChange[];
|
|
32
|
-
changed_memories: RollbackPreviewMemoryChange[];
|
|
33
|
-
metric_movement: RollbackPreviewMetricMovement[];
|
|
34
|
-
}
|
|
35
|
-
//# sourceMappingURL=rollback-preview.d.ts.map
|