@jungjaehoon/mama-core 2.4.1 → 4.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +76 -239
- package/db/migrations/030-case-first-memory-substrate.sql +13 -98
- package/db/migrations/034-add-connector-event-scope-columns.sql +9 -13
- package/db/migrations/039-add-connector-event-operator-ingest-seq.sql +9 -95
- package/db/migrations/062-refresh-connector-event-sequences.sql +9 -113
- package/db/migrations/063-refresh-legacy-connector-event-updates.sql +9 -32
- package/db/migrations/067-add-connector-event-source-entity-id.sql +9 -13
- package/db/migrations/069-create-registry-nodes.sql +52 -0
- package/db/migrations/070-record-identity.sql +35 -0
- package/db/migrations/071-service-operation-origins.sql +187 -0
- package/db/migrations/072-observation-versions.sql +29 -0
- package/db/migrations/073-registry-corrections.sql +45 -0
- package/db/migrations/074-work-graph-ref-kinds.sql +39 -0
- package/db/migrations/075-agent-judgments.sql +58 -0
- package/db/migrations/076-scoped-checkpoint-bindings.sql +15 -0
- package/db/migrations/077-legacy-record-kind.sql +6 -0
- package/db/migrations/078-source-ingest-commands.sql +18 -0
- package/db/migrations/079-twin-edge-relations.sql +43 -0
- package/db/migrations/080-restore-duration-days.sql +7 -0
- package/db/migrations/081-mailbox.sql +61 -0
- package/db/migrations/082-commitments-row-id.sql +12 -0
- package/db/migrations/083-observation-is-the-evidence.sql +49 -0
- package/db/migrations/084-scope-kind-is-not-the-cores-to-list.sql +34 -0
- package/db/migrations/085-a-migration-has-a-source.sql +37 -0
- package/db/migrations/086-the-mailbox-is-generic.sql +110 -0
- package/db/migrations/087-mailbox-payload.sql +5 -0
- package/db/migrations/088-native-input-journal.sql +14 -0
- package/db/migrations/089-native-turn-receipt-lookup.sql +3 -0
- package/db/migrations/090-model-run-native-inputs.sql +29 -0
- package/db/migrations/091-native-turn-results.sql +11 -0
- package/db/migrations/092-restore-decision-fts.sql +34 -0
- package/db/migrations/093-native-turn-primary-kind.sql +14 -0
- package/db/migrations/094-commitment-run-provenance.sql +9 -0
- package/db/migrations/095-model-run-native-input-identity.sql +39 -0
- package/db/migrations/096-drop-connector-event-index-fts.sql +9 -0
- package/db/migrations/097-native-input-json-validity.sql +37 -0
- package/db/migrations/098-workflow-memory-kind.sql +105 -0
- package/db/migrations/099-commitment-revision-graph.sql +2 -0
- package/dist/action-contracts.d.ts +212 -0
- package/dist/action-contracts.js +10 -0
- package/dist/api/catalog.d.ts +118 -0
- package/dist/api/catalog.js +1756 -0
- package/dist/api/dispatch.d.ts +76 -0
- package/dist/api/dispatch.js +372 -0
- package/dist/canonicalize.d.ts +2 -2
- package/dist/canonicalize.js +3 -3
- package/dist/client/client.d.ts +33 -0
- package/dist/client/client.js +123 -0
- package/dist/client/ipc.d.ts +81 -0
- package/dist/client/ipc.js +314 -0
- package/dist/db-adapter/base-adapter.d.ts +6 -66
- package/dist/db-adapter/base-adapter.js +6 -6
- package/dist/db-adapter/index.d.ts +5 -5
- package/dist/db-adapter/index.js +2 -5
- package/dist/db-adapter/node-sqlite-adapter.d.ts +85 -15
- package/dist/db-adapter/node-sqlite-adapter.js +1985 -570
- package/dist/db-manager.d.ts +53 -97
- package/dist/db-manager.js +121 -603
- package/dist/embedding/embedder.d.ts +132 -0
- package/dist/embedding/embedder.js +299 -0
- package/dist/identity/principal-repository.d.ts +2 -2
- package/dist/index.d.ts +43 -58
- package/dist/index.js +97 -145
- package/dist/{context-compile/channel-grant.d.ts → knowledge/access.d.ts} +12 -17
- package/dist/knowledge/access.js +663 -0
- package/dist/knowledge/case-errors.d.ts +31 -0
- package/dist/knowledge/case-errors.js +40 -0
- package/dist/{cases/search-rollup.d.ts → knowledge/case-search-rollup.d.ts} +5 -4
- package/dist/{cases/search-rollup.js → knowledge/case-search-rollup.js} +6 -8
- package/dist/{cases/store.d.ts → knowledge/case-store.d.ts} +3 -6
- package/dist/{cases/store.js → knowledge/case-store.js} +7 -42
- package/dist/{cases/timeline-range.d.ts → knowledge/case-timeline-range.d.ts} +3 -3
- package/dist/{cases/timeline-range.js → knowledge/case-timeline-range.js} +47 -25
- package/dist/{cases/types.d.ts → knowledge/case-types.d.ts} +8 -2
- package/dist/{cases/types.js → knowledge/case-types.js} +1 -1
- package/dist/knowledge/commitment-revision-migration.d.ts +4 -0
- package/dist/knowledge/commitment-revision-migration.js +50 -0
- package/dist/knowledge/commitments.d.ts +192 -0
- package/dist/knowledge/commitments.js +386 -0
- package/dist/knowledge/decision-edges.d.ts +70 -0
- package/dist/knowledge/decision-edges.js +123 -0
- package/dist/{agent-graph/types.d.ts → knowledge/graph-query.d.ts} +80 -70
- package/dist/knowledge/graph-query.js +1585 -0
- package/dist/knowledge/identity.d.ts +16 -0
- package/dist/knowledge/identity.js +22 -0
- package/dist/knowledge/index.d.ts +47 -0
- package/dist/knowledge/index.js +90 -0
- package/dist/knowledge/judgment-edge.d.ts +6 -0
- package/dist/knowledge/judgment-edge.js +22 -0
- package/dist/knowledge/judgments.d.ts +118 -0
- package/dist/knowledge/judgments.js +802 -0
- package/dist/knowledge/observations.d.ts +160 -0
- package/dist/knowledge/observations.js +449 -0
- package/dist/knowledge/question-type.d.ts +34 -0
- package/dist/knowledge/question-type.js +70 -0
- package/dist/{search → knowledge}/ranker-features.js +1 -1
- package/dist/{search → knowledge}/search-quality.d.ts +0 -1
- package/dist/knowledge/search.d.ts +38 -0
- package/dist/knowledge/search.js +91 -0
- package/dist/knowledge/source-ingest.d.ts +65 -0
- package/dist/knowledge/source-ingest.js +174 -0
- package/dist/{edges/types.d.ts → knowledge/twin-edge-types.d.ts} +31 -4
- package/dist/{edges/types.js → knowledge/twin-edge-types.js} +13 -2
- package/dist/knowledge/work-dates.d.ts +49 -0
- package/dist/knowledge/work-dates.js +120 -0
- package/dist/mama-api.d.ts +114 -778
- package/dist/mama-api.js +313 -2461
- package/dist/memory/api.d.ts +264 -24
- package/dist/memory/api.js +1633 -843
- package/dist/memory/bootstrap-builder.d.ts +2 -1
- package/dist/memory/bootstrap-builder.js +5 -5
- package/dist/memory/channel-summary-state-store.d.ts +3 -2
- package/dist/memory/channel-summary-state-store.js +53 -51
- package/dist/memory/channel-summary-store.d.ts +5 -3
- package/dist/memory/channel-summary-store.js +3 -8
- package/dist/memory/dashboard-read.d.ts +46 -0
- package/dist/memory/dashboard-read.js +94 -0
- package/dist/memory/event-store.d.ts +3 -3
- package/dist/memory/event-store.js +3 -10
- package/dist/memory/finding-store.d.ts +3 -2
- package/dist/memory/finding-store.js +2 -7
- package/dist/memory/graph-read.d.ts +52 -0
- package/dist/memory/graph-read.js +130 -0
- package/dist/memory/judgment-types.d.ts +394 -0
- package/dist/memory/judgment-types.js +16 -0
- package/dist/memory/provenance-audit.d.ts +5 -2
- package/dist/memory/provenance-audit.js +8 -14
- package/dist/memory/provenance-live.d.ts +141 -0
- package/dist/memory/provenance-live.js +409 -0
- package/dist/memory/provenance-query.d.ts +5 -4
- package/dist/memory/provenance-query.js +21 -29
- package/dist/memory/provenance-resolver.d.ts +191 -0
- package/dist/memory/provenance-resolver.js +155 -0
- package/dist/memory/provenance.d.ts +1 -11
- package/dist/memory/provenance.js +2 -33
- package/dist/memory/recall-sanitize.d.ts +55 -0
- package/dist/memory/recall-sanitize.js +144 -0
- package/dist/memory/secret-filter.d.ts +32 -0
- package/dist/memory/secret-filter.js +126 -0
- package/dist/memory/truth-store.d.ts +2 -1
- package/dist/memory/truth-store.js +1 -4
- package/dist/memory/types.d.ts +74 -24
- package/dist/memory/types.js +75 -5
- package/dist/memory/write-adapters.d.ts +98 -0
- package/dist/memory/write-adapters.js +242 -0
- package/dist/operations/owner-action-effects.d.ts +53 -0
- package/dist/operations/owner-action-effects.js +96 -0
- package/dist/provenance/source-ref.d.ts +1 -1
- package/dist/provenance/source-ref.js +0 -2
- package/dist/registry/corrections.d.ts +31 -0
- package/dist/registry/corrections.js +332 -0
- package/dist/registry/record-identity.d.ts +49 -0
- package/dist/registry/record-identity.js +133 -0
- package/dist/registry/store.d.ts +101 -0
- package/dist/registry/store.js +395 -0
- package/dist/registry/types.d.ts +28 -0
- package/dist/registry/types.js +5 -0
- package/dist/relevance-scorer.js +2 -2
- package/dist/runtime/agent-event-bus.d.ts +50 -0
- package/dist/runtime/agent-event-bus.js +101 -0
- package/dist/runtime/drivers/claude-cli-wrapper.d.ts +152 -0
- package/dist/runtime/drivers/claude-cli-wrapper.js +375 -0
- package/dist/runtime/drivers/claude-effort.d.ts +4 -0
- package/dist/runtime/drivers/claude-effort.js +16 -0
- package/dist/runtime/drivers/cli-arg-redaction.d.ts +2 -0
- package/dist/runtime/drivers/cli-arg-redaction.js +18 -0
- package/dist/runtime/drivers/cli-secret-redaction.d.ts +17 -0
- package/dist/runtime/drivers/cli-secret-redaction.js +126 -0
- package/dist/runtime/drivers/codex-app-server-process.d.ts +277 -0
- package/dist/runtime/drivers/codex-app-server-process.js +2342 -0
- package/dist/runtime/drivers/codex-auxiliary-tools.d.ts +17 -0
- package/dist/runtime/drivers/codex-auxiliary-tools.js +267 -0
- package/dist/runtime/drivers/codex-home.d.ts +20 -0
- package/dist/runtime/drivers/codex-home.js +674 -0
- package/dist/runtime/drivers/codex-thread-registry.d.ts +63 -0
- package/dist/runtime/drivers/codex-thread-registry.js +433 -0
- package/dist/runtime/drivers/persistent-cli-adapter.d.ts +160 -0
- package/dist/runtime/drivers/persistent-cli-adapter.js +396 -0
- package/dist/runtime/drivers/persistent-cli-process.d.ts +425 -0
- package/dist/runtime/drivers/persistent-cli-process.js +1529 -0
- package/dist/runtime/drivers/types.d.ts +456 -0
- package/dist/runtime/drivers/types.js +110 -0
- package/dist/runtime/mailbox.d.ts +223 -0
- package/dist/runtime/mailbox.js +582 -0
- package/dist/runtime/model-run-store.d.ts +28 -0
- package/dist/{model-runs/store.js → runtime/model-run-store.js} +81 -41
- package/dist/{model-runs/types.d.ts → runtime/model-run-types.d.ts} +33 -4
- package/dist/{model-runs/types.js → runtime/model-run-types.js} +1 -1
- package/dist/runtime/native-effect-observer.d.ts +22 -0
- package/dist/runtime/native-effect-observer.js +103 -0
- package/dist/runtime/native-input-journal.d.ts +46 -0
- package/dist/runtime/native-input-journal.js +308 -0
- package/dist/runtime/native-prompt.d.ts +118 -0
- package/dist/runtime/native-prompt.js +496 -0
- package/dist/runtime/native-session.d.ts +10 -0
- package/dist/{agent-graph/index.js → runtime/native-session.js} +9 -6
- package/dist/runtime/native-tool-trace-observer.d.ts +5 -0
- package/dist/runtime/native-tool-trace-observer.js +65 -0
- package/dist/runtime/native-turn.d.ts +272 -0
- package/dist/runtime/native-turn.js +1041 -0
- package/dist/runtime/operations.d.ts +236 -0
- package/dist/runtime/operations.js +565 -0
- package/dist/runtime/post-tool-handler.d.ts +74 -0
- package/dist/runtime/post-tool-handler.js +137 -0
- package/dist/runtime/prompt-layers.d.ts +126 -0
- package/dist/runtime/prompt-layers.js +239 -0
- package/dist/runtime/runtime-process.d.ts +102 -0
- package/dist/runtime/runtime-process.js +206 -0
- package/dist/runtime/runtime.d.ts +278 -0
- package/dist/runtime/runtime.js +563 -0
- package/dist/runtime/session-pool.d.ts +176 -0
- package/dist/runtime/session-pool.js +369 -0
- package/dist/runtime/stimulus-payload.d.ts +5 -0
- package/dist/runtime/stimulus-payload.js +50 -0
- package/dist/runtime/subagent-bridge.d.ts +24 -0
- package/dist/{agent-graph/types.js → runtime/subagent-bridge.js} +1 -1
- package/dist/runtime/text-completion.d.ts +22 -0
- package/dist/{agent-situation/types.js → runtime/text-completion.js} +1 -1
- package/dist/runtime/token-estimator.d.ts +25 -0
- package/dist/runtime/token-estimator.js +75 -0
- package/dist/runtime/tool-trace-store.d.ts +22 -0
- package/dist/{model-runs → runtime}/tool-trace-store.js +46 -27
- package/dist/runtime/trace-summary.d.ts +5 -0
- package/dist/runtime/trace-summary.js +74 -0
- package/dist/runtime/turn-text.d.ts +23 -0
- package/dist/runtime/turn-text.js +41 -0
- package/dist/storage/database.d.ts +67 -0
- package/dist/storage/database.js +158 -0
- package/package.json +20 -34
- package/dist/agent-graph/alias-write.d.ts +0 -3
- package/dist/agent-graph/alias-write.js +0 -234
- package/dist/agent-graph/entity-resolve.d.ts +0 -3
- package/dist/agent-graph/entity-resolve.js +0 -271
- package/dist/agent-graph/errors.d.ts +0 -4
- package/dist/agent-graph/errors.js +0 -11
- package/dist/agent-graph/graph-query.d.ts +0 -5
- package/dist/agent-graph/graph-query.js +0 -360
- package/dist/agent-graph/index.d.ts +0 -6
- package/dist/agent-situation/builder.d.ts +0 -8
- package/dist/agent-situation/builder.js +0 -239
- package/dist/agent-situation/cache-key.d.ts +0 -4
- package/dist/agent-situation/cache-key.js +0 -64
- package/dist/agent-situation/index.d.ts +0 -7
- package/dist/agent-situation/index.js +0 -28
- package/dist/agent-situation/packet-store.d.ts +0 -27
- package/dist/agent-situation/packet-store.js +0 -228
- package/dist/agent-situation/ranking-policy.d.ts +0 -18
- package/dist/agent-situation/ranking-policy.js +0 -75
- package/dist/agent-situation/source-readers.d.ts +0 -52
- package/dist/agent-situation/source-readers.js +0 -300
- package/dist/agent-situation/types.d.ts +0 -195
- package/dist/cases/wiki-page-index.d.ts +0 -37
- package/dist/cases/wiki-page-index.js +0 -201
- package/dist/config-loader.d.ts +0 -68
- package/dist/config-loader.js +0 -239
- package/dist/connectors/event-index.d.ts +0 -24
- package/dist/connectors/event-index.js +0 -245
- package/dist/connectors/raw-query.d.ts +0 -40
- package/dist/connectors/raw-query.js +0 -412
- package/dist/connectors/types.d.ts +0 -117
- package/dist/connectors/types.js +0 -3
- package/dist/context-compile/boundary-defaults.d.ts +0 -12
- package/dist/context-compile/boundary-defaults.js +0 -105
- package/dist/context-compile/channel-grant.js +0 -66
- package/dist/context-compile/compiler-policy.d.ts +0 -39
- package/dist/context-compile/compiler-policy.js +0 -147
- package/dist/context-compile/compiler.d.ts +0 -18
- package/dist/context-compile/compiler.js +0 -404
- package/dist/context-compile/index.d.ts +0 -10
- package/dist/context-compile/index.js +0 -26
- package/dist/context-compile/packet-store.d.ts +0 -8
- package/dist/context-compile/packet-store.js +0 -239
- package/dist/context-compile/ref.d.ts +0 -7
- package/dist/context-compile/ref.js +0 -102
- package/dist/context-compile/source-readers.d.ts +0 -70
- package/dist/context-compile/source-readers.js +0 -840
- package/dist/context-compile/types.d.ts +0 -155
- package/dist/context-compile/types.js +0 -11
- package/dist/context-compile/visibility.d.ts +0 -21
- package/dist/context-compile/visibility.js +0 -224
- package/dist/decision-tracker.d.ts +0 -206
- package/dist/decision-tracker.js +0 -481
- package/dist/edges/ref-validation.d.ts +0 -7
- package/dist/edges/ref-validation.js +0 -321
- package/dist/edges/store.d.ts +0 -8
- package/dist/edges/store.js +0 -129
- package/dist/embedding-client.d.ts +0 -28
- package/dist/embedding-client.js +0 -53
- package/dist/embedding-server/index.d.ts +0 -67
- package/dist/embedding-server/index.js +0 -405
- package/dist/embedding-server/mobile/auth.d.ts +0 -44
- package/dist/embedding-server/mobile/auth.js +0 -150
- package/dist/embedding-server/mobile/daemon.d.ts +0 -129
- package/dist/embedding-server/mobile/daemon.js +0 -313
- package/dist/embedding-server/mobile/output-parser.d.ts +0 -115
- package/dist/embedding-server/mobile/output-parser.js +0 -241
- package/dist/embedding-server/mobile/session-api.d.ts +0 -57
- package/dist/embedding-server/mobile/session-api.js +0 -261
- package/dist/embedding-server/mobile/session-manager.d.ts +0 -138
- package/dist/embedding-server/mobile/session-manager.js +0 -378
- package/dist/embedding-server/mobile/websocket-handler.d.ts +0 -137
- package/dist/embedding-server/mobile/websocket-handler.js +0 -486
- package/dist/embeddings.d.ts +0 -68
- package/dist/embeddings.js +0 -244
- package/dist/entities/audit-metrics.d.ts +0 -68
- package/dist/entities/audit-metrics.js +0 -124
- package/dist/entities/candidate-generator.d.ts +0 -8
- package/dist/entities/candidate-generator.js +0 -24
- package/dist/entities/entity-linked-decision-counts.d.ts +0 -2
- package/dist/entities/entity-linked-decision-counts.js +0 -29
- package/dist/entities/entity-list.d.ts +0 -22
- package/dist/entities/entity-list.js +0 -3
- package/dist/entities/entity-orphan-list.d.ts +0 -17
- package/dist/entities/entity-orphan-list.js +0 -3
- package/dist/entities/entity-search.d.ts +0 -20
- package/dist/entities/entity-search.js +0 -3
- package/dist/entities/errors.d.ts +0 -55
- package/dist/entities/errors.js +0 -100
- package/dist/entities/lineage-store.d.ts +0 -28
- package/dist/entities/lineage-store.js +0 -204
- package/dist/entities/normalization.d.ts +0 -14
- package/dist/entities/normalization.js +0 -63
- package/dist/entities/policy-store.d.ts +0 -8
- package/dist/entities/policy-store.js +0 -75
- package/dist/entities/policy-types.d.ts +0 -72
- package/dist/entities/policy-types.js +0 -59
- package/dist/entities/projection.d.ts +0 -8
- package/dist/entities/projection.js +0 -82
- package/dist/entities/provenance-query.d.ts +0 -32
- package/dist/entities/provenance-query.js +0 -3
- package/dist/entities/read-identity.d.ts +0 -31
- package/dist/entities/read-identity.js +0 -264
- package/dist/entities/recall-bridge.d.ts +0 -5
- package/dist/entities/recall-bridge.js +0 -171
- package/dist/entities/resolution-engine.d.ts +0 -8
- package/dist/entities/resolution-engine.js +0 -3
- package/dist/entities/rollback-preview.d.ts +0 -35
- package/dist/entities/rollback-preview.js +0 -3
- package/dist/entities/source-locator.d.ts +0 -3
- package/dist/entities/source-locator.js +0 -32
- package/dist/entities/store.d.ts +0 -69
- package/dist/entities/store.js +0 -544
- package/dist/entities/types.d.ts +0 -166
- package/dist/entities/types.js +0 -30
- package/dist/memory/extraction-prompt.d.ts +0 -4
- package/dist/memory/extraction-prompt.js +0 -89
- package/dist/memory/scope-backfill.d.ts +0 -14
- package/dist/memory/scope-backfill.js +0 -3
- package/dist/memory/scope-store.d.ts +0 -4
- package/dist/memory/scope-store.js +0 -9
- package/dist/memory-store.d.ts +0 -87
- package/dist/memory-store.js +0 -78
- package/dist/model-runs/store.d.ts +0 -13
- package/dist/model-runs/tool-trace-store.d.ts +0 -8
- package/dist/notification-manager.d.ts +0 -7
- package/dist/notification-manager.js +0 -12
- package/dist/outcome-tracker.d.ts +0 -151
- package/dist/outcome-tracker.js +0 -271
- package/dist/query-intent.d.ts +0 -23
- package/dist/query-intent.js +0 -114
- package/dist/runtime/trusted-provenance.d.ts +0 -3
- package/dist/runtime/trusted-provenance.js +0 -6
- package/dist/search/question-type.d.ts +0 -5
- package/dist/search/question-type.js +0 -41
- package/dist/test-utils.d.ts +0 -80
- package/dist/test-utils.js +0 -218
- package/dist/tier-validator.d.ts +0 -43
- package/dist/tier-validator.js +0 -159
- package/dist/time-formatter.d.ts +0 -25
- package/dist/time-formatter.js +0 -93
- /package/dist/{search → knowledge}/feedback-store.d.ts +0 -0
- /package/dist/{search → knowledge}/feedback-store.js +0 -0
- /package/dist/{search → knowledge}/ranker-features.d.ts +0 -0
- /package/dist/{search → knowledge}/ranker-rescore.d.ts +0 -0
- /package/dist/{search → knowledge}/ranker-rescore.js +0 -0
- /package/dist/{search → knowledge}/ranker-trainer.d.ts +0 -0
- /package/dist/{search → knowledge}/ranker-trainer.js +0 -0
- /package/dist/{search → knowledge}/search-quality.js +0 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* TokenEstimator — singleton wrapper around js-tiktoken (cl100k_base).
|
|
4
|
+
*
|
|
5
|
+
* Provides accurate token counting for Korean + English text.
|
|
6
|
+
* Falls back to byte-length heuristic if WASM init fails or during loading.
|
|
7
|
+
*
|
|
8
|
+
* Uses dynamic import to avoid blocking vitest fork initialization.
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.initTokenEstimator = initTokenEstimator;
|
|
12
|
+
exports.countTokens = countTokens;
|
|
13
|
+
exports.resetTokenEstimator = resetTokenEstimator;
|
|
14
|
+
exports.forceFallbackMode = forceFallbackMode;
|
|
15
|
+
let _encoder = null;
|
|
16
|
+
let _initFailed = false;
|
|
17
|
+
let _initPromise = null;
|
|
18
|
+
/**
|
|
19
|
+
* Initialize the encoder asynchronously. Safe to call multiple times.
|
|
20
|
+
*/
|
|
21
|
+
async function initTokenEstimator() {
|
|
22
|
+
if (_encoder || _initFailed)
|
|
23
|
+
return;
|
|
24
|
+
if (_initPromise)
|
|
25
|
+
return _initPromise;
|
|
26
|
+
_initPromise = (async () => {
|
|
27
|
+
try {
|
|
28
|
+
const { encodingForModel } = await import('js-tiktoken');
|
|
29
|
+
_encoder = encodingForModel('gpt-4o');
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
_initFailed = true;
|
|
33
|
+
}
|
|
34
|
+
})();
|
|
35
|
+
return _initPromise;
|
|
36
|
+
}
|
|
37
|
+
function getEncoder() {
|
|
38
|
+
if (!_encoder && !_initFailed && !_initPromise) {
|
|
39
|
+
// Fire-and-forget init on first sync access
|
|
40
|
+
initTokenEstimator().catch(() => { });
|
|
41
|
+
}
|
|
42
|
+
return _encoder;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Byte-length fallback: ~0.4 tokens per byte (empirical for mixed CJK+Latin).
|
|
46
|
+
*/
|
|
47
|
+
function fallbackCount(text) {
|
|
48
|
+
return Math.ceil(Buffer.byteLength(text, 'utf-8') * 0.4);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Count tokens in text. Uses js-tiktoken if available, else byte fallback.
|
|
52
|
+
*/
|
|
53
|
+
function countTokens(text) {
|
|
54
|
+
const enc = getEncoder();
|
|
55
|
+
if (enc) {
|
|
56
|
+
return enc.encode(text).length;
|
|
57
|
+
}
|
|
58
|
+
return fallbackCount(text);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Reset singleton state (for testing).
|
|
62
|
+
*/
|
|
63
|
+
function resetTokenEstimator() {
|
|
64
|
+
_encoder = null;
|
|
65
|
+
_initFailed = false;
|
|
66
|
+
_initPromise = null;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Force fallback mode (for testing).
|
|
70
|
+
*/
|
|
71
|
+
function forceFallbackMode() {
|
|
72
|
+
_encoder = null;
|
|
73
|
+
_initFailed = true;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=token-estimator.js.map
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { DatabaseAdapter } from '../db-manager.js';
|
|
2
|
+
import type { AppendToolTraceInput, AppendOperationToolTraceInput, ToolTraceRecord, ToolTraceScope, ListToolTracesInput, ToolTracePage } from './model-run-types.js';
|
|
3
|
+
type ToolTraceAdapter = Pick<DatabaseAdapter, 'prepare'>;
|
|
4
|
+
/** Model-backed append. `model_run_id` is required and validated as before. */
|
|
5
|
+
export declare function appendToolTrace(adapter: ToolTraceAdapter, input: AppendToolTraceInput): Promise<ToolTraceRecord>;
|
|
6
|
+
/**
|
|
7
|
+
* Service/CLI operation append. Records a truthful operation trace anchored by a
|
|
8
|
+
* nonempty `operation_id` and `actor_principal_id`. No `model_runs` row is
|
|
9
|
+
* created or required.
|
|
10
|
+
*
|
|
11
|
+
* `model_run_id` is optional causal provenance: when a real completed model run
|
|
12
|
+
* caused this operation observation it is stored (the DB `model_runs` FK rejects
|
|
13
|
+
* an invalid reference); absent, it stays NULL. It never authorizes execution.
|
|
14
|
+
*/
|
|
15
|
+
export declare function appendOperationToolTrace(adapter: ToolTraceAdapter, input: AppendOperationToolTraceInput): ToolTraceRecord;
|
|
16
|
+
export declare function listToolTracesForRun(adapter: ToolTraceAdapter, modelRunId: string): Promise<ToolTraceRecord[]>;
|
|
17
|
+
/** Access is exact host-derived scope; knowing a trace ID never grants access. */
|
|
18
|
+
export declare function readToolTrace(adapter: ToolTraceAdapter, traceId: string, scope: ToolTraceScope): Promise<ToolTraceRecord | null>;
|
|
19
|
+
/** Bounded metadata discovery; detailed evidence is read explicitly by trace ID. */
|
|
20
|
+
export declare function listToolTraces(adapter: ToolTraceAdapter, input: ListToolTracesInput): Promise<ToolTracePage>;
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=tool-trace-store.d.ts.map
|
|
@@ -4,11 +4,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.appendToolTrace = appendToolTrace;
|
|
7
|
+
exports.appendOperationToolTrace = appendOperationToolTrace;
|
|
7
8
|
exports.listToolTracesForRun = listToolTracesForRun;
|
|
8
9
|
exports.readToolTrace = readToolTrace;
|
|
9
10
|
exports.listToolTraces = listToolTraces;
|
|
10
11
|
const node_crypto_1 = __importDefault(require("node:crypto"));
|
|
11
|
-
const db_manager_js_1 = require("../db-manager.js");
|
|
12
12
|
function traceId() {
|
|
13
13
|
return `tr_${node_crypto_1.default.randomUUID().replace(/-/g, '')}`;
|
|
14
14
|
}
|
|
@@ -77,7 +77,10 @@ function mapToolTraceRow(row) {
|
|
|
77
77
|
project_id: nullableString(row.project_id),
|
|
78
78
|
channel_id: nullableString(row.channel_id),
|
|
79
79
|
trace_id: requiredString(row.trace_id, 'trace_id'),
|
|
80
|
-
|
|
80
|
+
// NULL for operation-origin rows; legacy/model-backed rows keep their id.
|
|
81
|
+
model_run_id: nullableString(row.model_run_id),
|
|
82
|
+
operation_id: nullableString(row.operation_id),
|
|
83
|
+
actor_principal_id: nullableString(row.actor_principal_id),
|
|
81
84
|
gateway_call_id: nullableString(row.gateway_call_id),
|
|
82
85
|
tool_name: requiredString(row.tool_name, 'tool_name'),
|
|
83
86
|
input_summary: nullableString(row.input_summary),
|
|
@@ -89,17 +92,15 @@ function mapToolTraceRow(row) {
|
|
|
89
92
|
created_at: requiredInteger(row.created_at, 'created_at'),
|
|
90
93
|
};
|
|
91
94
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
95
|
+
/** Columns selected for every full trace read; kept in one place so operation-origin rows are never joined away. */
|
|
96
|
+
const TOOL_TRACE_COLUMNS = `trace_id, model_run_id, operation_id, actor_principal_id, gateway_call_id, tool_name, input_summary,
|
|
97
|
+
output_summary, execution_status, duration_ms, envelope_hash, failure_code,
|
|
98
|
+
created_at, diagnostic_json, evidence_json, catalog_revision, owner_scope, project_id, channel_id`;
|
|
96
99
|
function selectToolTrace(adapter, id) {
|
|
97
100
|
const row = adapter
|
|
98
101
|
.prepare(`
|
|
99
102
|
SELECT
|
|
100
|
-
|
|
101
|
-
output_summary, execution_status, duration_ms, envelope_hash, failure_code,
|
|
102
|
-
created_at, diagnostic_json, evidence_json, catalog_revision, owner_scope, project_id, channel_id
|
|
103
|
+
${TOOL_TRACE_COLUMNS}
|
|
103
104
|
FROM tool_traces
|
|
104
105
|
WHERE trace_id = ?
|
|
105
106
|
`)
|
|
@@ -109,32 +110,52 @@ function selectToolTrace(adapter, id) {
|
|
|
109
110
|
}
|
|
110
111
|
return mapToolTraceRow(row);
|
|
111
112
|
}
|
|
112
|
-
|
|
113
|
-
const adapter = await initializedAdapter();
|
|
114
|
-
const id = nullableString(input.trace_id) ?? traceId();
|
|
115
|
-
const modelRunId = requiredString(input.model_run_id, 'model_run_id');
|
|
116
|
-
const toolName = requiredString(input.tool_name, 'tool_name');
|
|
113
|
+
function insertToolTraceRow(adapter, id, origin, input) {
|
|
117
114
|
adapter
|
|
118
115
|
.prepare(`
|
|
119
116
|
INSERT INTO tool_traces (
|
|
120
|
-
trace_id, model_run_id, gateway_call_id, tool_name, input_summary,
|
|
117
|
+
trace_id, model_run_id, operation_id, actor_principal_id, gateway_call_id, tool_name, input_summary,
|
|
121
118
|
output_summary, execution_status, duration_ms, envelope_hash, failure_code,
|
|
122
119
|
created_at, diagnostic_json, evidence_json, catalog_revision, owner_scope, project_id, channel_id
|
|
123
120
|
)
|
|
124
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
121
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
125
122
|
`)
|
|
126
|
-
.run(id,
|
|
123
|
+
.run(id, origin.model_run_id, origin.operation_id, origin.actor_principal_id, nullableString(input.gateway_call_id), requiredString(input.tool_name, 'tool_name'), nullableString(input.input_summary), nullableString(input.output_summary), nullableString(input.execution_status), normalizeDuration(input.duration_ms), nullableString(input.envelope_hash), nullableString(input.failure_code), normalizeTimestamp(input.created_at), nullableJsonObject(input.diagnostic_json, 'diagnostic_json'), nullableJsonObject(input.evidence_json, 'evidence_json'), nullableString(input.catalog_revision), nullableString(input.owner_scope), nullableString(input.project_id), nullableString(input.channel_id));
|
|
124
|
+
}
|
|
125
|
+
/** Model-backed append. `model_run_id` is required and validated as before. */
|
|
126
|
+
async function appendToolTrace(adapter, input) {
|
|
127
|
+
const id = nullableString(input.trace_id) ?? traceId();
|
|
128
|
+
const modelRunId = requiredString(input.model_run_id, 'model_run_id');
|
|
129
|
+
insertToolTraceRow(adapter, id, { model_run_id: modelRunId, operation_id: null, actor_principal_id: null }, input);
|
|
127
130
|
return selectToolTrace(adapter, id);
|
|
128
131
|
}
|
|
129
|
-
|
|
130
|
-
|
|
132
|
+
/**
|
|
133
|
+
* Service/CLI operation append. Records a truthful operation trace anchored by a
|
|
134
|
+
* nonempty `operation_id` and `actor_principal_id`. No `model_runs` row is
|
|
135
|
+
* created or required.
|
|
136
|
+
*
|
|
137
|
+
* `model_run_id` is optional causal provenance: when a real completed model run
|
|
138
|
+
* caused this operation observation it is stored (the DB `model_runs` FK rejects
|
|
139
|
+
* an invalid reference); absent, it stays NULL. It never authorizes execution.
|
|
140
|
+
*/
|
|
141
|
+
function appendOperationToolTrace(adapter, input) {
|
|
142
|
+
const id = nullableString(input.trace_id) ?? traceId();
|
|
143
|
+
const operationId = requiredString(input.operation_id, 'operation_id');
|
|
144
|
+
const actorPrincipalId = requiredString(input.actor_principal_id, 'actor_principal_id');
|
|
145
|
+
const causalModelRunId = nullableString(input.model_run_id);
|
|
146
|
+
insertToolTraceRow(adapter, id, {
|
|
147
|
+
model_run_id: causalModelRunId,
|
|
148
|
+
operation_id: operationId,
|
|
149
|
+
actor_principal_id: actorPrincipalId,
|
|
150
|
+
}, input);
|
|
151
|
+
return selectToolTrace(adapter, id);
|
|
152
|
+
}
|
|
153
|
+
async function listToolTracesForRun(adapter, modelRunId) {
|
|
131
154
|
const id = requiredString(modelRunId, 'model_run_id');
|
|
132
155
|
const rows = adapter
|
|
133
156
|
.prepare(`
|
|
134
157
|
SELECT
|
|
135
|
-
|
|
136
|
-
output_summary, execution_status, duration_ms, envelope_hash, failure_code,
|
|
137
|
-
created_at, diagnostic_json, evidence_json, catalog_revision, owner_scope, project_id, channel_id
|
|
158
|
+
${TOOL_TRACE_COLUMNS}
|
|
138
159
|
FROM tool_traces
|
|
139
160
|
WHERE model_run_id = ?
|
|
140
161
|
ORDER BY created_at DESC, rowid DESC
|
|
@@ -155,18 +176,17 @@ function scopedWhere(scope) {
|
|
|
155
176
|
return { clauses, values };
|
|
156
177
|
}
|
|
157
178
|
/** Access is exact host-derived scope; knowing a trace ID never grants access. */
|
|
158
|
-
async function readToolTrace(traceId, scope) {
|
|
179
|
+
async function readToolTrace(adapter, traceId, scope) {
|
|
159
180
|
const { clauses, values } = scopedWhere(scope);
|
|
160
181
|
clauses.push('trace_id = ?');
|
|
161
182
|
values.push(requiredString(traceId, 'trace_id'));
|
|
162
|
-
const adapter = await initializedAdapter();
|
|
163
183
|
const row = adapter
|
|
164
184
|
.prepare(`SELECT * FROM tool_traces WHERE ${clauses.join(' AND ')}`)
|
|
165
185
|
.get(...values);
|
|
166
186
|
return row ? mapToolTraceRow(row) : null;
|
|
167
187
|
}
|
|
168
188
|
/** Bounded metadata discovery; detailed evidence is read explicitly by trace ID. */
|
|
169
|
-
async function listToolTraces(input) {
|
|
189
|
+
async function listToolTraces(adapter, input) {
|
|
170
190
|
const { clauses, values } = scopedWhere(input);
|
|
171
191
|
if (input.evidence_only !== undefined && typeof input.evidence_only !== 'boolean') {
|
|
172
192
|
throw new Error('tool_traces.evidence_only must be a boolean');
|
|
@@ -205,9 +225,8 @@ async function listToolTraces(input) {
|
|
|
205
225
|
clauses.push('(created_at < ? OR (created_at = ? AND trace_id < ?))');
|
|
206
226
|
values.push(cursorCreatedAt, cursorCreatedAt, cursorTraceId);
|
|
207
227
|
}
|
|
208
|
-
const adapter = await initializedAdapter();
|
|
209
228
|
const rows = adapter
|
|
210
|
-
.prepare(`SELECT trace_id, model_run_id, gateway_call_id, tool_name,
|
|
229
|
+
.prepare(`SELECT trace_id, model_run_id, operation_id, actor_principal_id, gateway_call_id, tool_name,
|
|
211
230
|
input_summary, output_summary, execution_status, duration_ms, envelope_hash, failure_code,
|
|
212
231
|
created_at, diagnostic_json, NULL AS evidence_json, catalog_revision, owner_scope, project_id, channel_id
|
|
213
232
|
FROM tool_traces WHERE ${clauses.join(' AND ')}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Shared raw diagnostic redaction; callers choose their own output bounds. */
|
|
2
|
+
export declare function redactTraceText(value: string): string;
|
|
3
|
+
/** Bounded diagnostics only: never mutate the executed input or stored evidence. */
|
|
4
|
+
export declare function traceSummary(value: unknown): string | null;
|
|
5
|
+
//# sourceMappingURL=trace-summary.d.ts.map
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.redactTraceText = redactTraceText;
|
|
4
|
+
exports.traceSummary = traceSummary;
|
|
5
|
+
const secret_filter_js_1 = require("../memory/secret-filter.js");
|
|
6
|
+
const SECRET_FIELD = /(?:authorization|credential|password|passwd|secret|token|api[_-]?key|private[_-]?key)/i;
|
|
7
|
+
const SECRET_ASSIGNMENT = /\b([\w-]*(?:token|secret|password|passwd|credential|api[_-]?key|private[_-]?key)[\w-]*(?:\\?["'])?\s*[=:]\s*)(?:\\"[^\r\n]*?\\"|"[^"\n]*"|'[^'\n]*'|[^\s,;&}\]]+)/gi;
|
|
8
|
+
/** Shared raw diagnostic redaction; callers choose their own output bounds. */
|
|
9
|
+
function redactTraceText(value) {
|
|
10
|
+
return (0, secret_filter_js_1.redactSecretPatterns)(value)
|
|
11
|
+
.replace(/\beyJ[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+\b/g, '[REDACTED]')
|
|
12
|
+
.replace(/https?:\/\/[^\s<>"']+/gi, (raw) => {
|
|
13
|
+
try {
|
|
14
|
+
const url = new URL(raw);
|
|
15
|
+
if (url.username || url.password) {
|
|
16
|
+
url.username = '[REDACTED]';
|
|
17
|
+
url.password = '';
|
|
18
|
+
}
|
|
19
|
+
for (const key of [...url.searchParams.keys()]) {
|
|
20
|
+
if (SECRET_FIELD.test(key))
|
|
21
|
+
url.searchParams.set(key, '[REDACTED]');
|
|
22
|
+
}
|
|
23
|
+
// URL fragments are not sent to servers and do not help diagnose tool execution.
|
|
24
|
+
url.hash = '';
|
|
25
|
+
return url.toString();
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return '[INVALID-URL]';
|
|
29
|
+
}
|
|
30
|
+
})
|
|
31
|
+
.replace(/(--[\w-]*(?:token|secret|password|passwd|credential|api[_-]?key|private[_-]?key)[\w-]*\s+)(?:"[^"\n]*"|'[^'\n]*'|[^\s,;&}\]]+)/gi, '$1[REDACTED]')
|
|
32
|
+
.replace(SECRET_ASSIGNMENT, '$1[REDACTED]')
|
|
33
|
+
.replace(/\b(Authorization["']?\s*[:=]\s*["']?)(?:(?:Bearer|Basic)\s+)?[^\s,"';]+/gi, '$1[REDACTED]');
|
|
34
|
+
}
|
|
35
|
+
/** Bounded diagnostics only: never mutate the executed input or stored evidence. */
|
|
36
|
+
function traceSummary(value) {
|
|
37
|
+
if (value === undefined)
|
|
38
|
+
return null;
|
|
39
|
+
const seen = new WeakSet();
|
|
40
|
+
let remaining = 4_000;
|
|
41
|
+
const text = (value) => {
|
|
42
|
+
const safe = redactTraceText(value);
|
|
43
|
+
const result = safe.slice(0, Math.max(0, remaining));
|
|
44
|
+
remaining -= result.length;
|
|
45
|
+
return result;
|
|
46
|
+
};
|
|
47
|
+
const visit = (item, depth) => {
|
|
48
|
+
if (remaining <= 0 || depth > 6)
|
|
49
|
+
return '[TRUNCATED]';
|
|
50
|
+
if (typeof item === 'string')
|
|
51
|
+
return text(item);
|
|
52
|
+
if (!item || typeof item !== 'object')
|
|
53
|
+
return item;
|
|
54
|
+
if (seen.has(item))
|
|
55
|
+
return '[CIRCULAR]';
|
|
56
|
+
seen.add(item);
|
|
57
|
+
if (Array.isArray(item))
|
|
58
|
+
return item.slice(0, 40).map((entry) => visit(entry, depth + 1));
|
|
59
|
+
return Object.fromEntries(Object.entries(item)
|
|
60
|
+
.slice(0, 40)
|
|
61
|
+
.map(([key, entry]) => [
|
|
62
|
+
text(key),
|
|
63
|
+
SECRET_FIELD.test(key) ? '[REDACTED]' : visit(entry, depth + 1),
|
|
64
|
+
]));
|
|
65
|
+
};
|
|
66
|
+
try {
|
|
67
|
+
const serialized = JSON.stringify(visit(value, 0)) ?? '';
|
|
68
|
+
return serialized.length <= 4_000 ? serialized : `${serialized.slice(0, 3_997)}...`;
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return '[UNSERIALIZABLE]';
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=trace-summary.js.map
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reading and writing a turn's text, with nothing in it that knows which product
|
|
3
|
+
* the turn belongs to.
|
|
4
|
+
*
|
|
5
|
+
* These five were methods on the product's loop class only because they were written
|
|
6
|
+
* there. None of them reads any state on that class; the one that needed to know the
|
|
7
|
+
* backend takes it as an argument. They come out first so that what remains of the
|
|
8
|
+
* turn body is the part that actually holds state.
|
|
9
|
+
*/
|
|
10
|
+
import type { BackendType, ContentBlock, Message, PromptResult } from './drivers/types.js';
|
|
11
|
+
/** The text blocks of one content array, joined. */
|
|
12
|
+
export declare function extractTextFromContent(content: ContentBlock[]): string;
|
|
13
|
+
/** The last assistant message's text, or empty when the history holds none. */
|
|
14
|
+
export declare function extractTextResponse(history: Message[]): string;
|
|
15
|
+
/**
|
|
16
|
+
* Tokens a turn counts against the run budget.
|
|
17
|
+
*
|
|
18
|
+
* One backend reports cache reads and cache creation outside input_tokens; the other
|
|
19
|
+
* reports input tokens inclusive of cached ones. Adding cache reads for the second
|
|
20
|
+
* doubled every count in 0.44.0, where a 2.8M turn read as 5.5M and was stopped.
|
|
21
|
+
*/
|
|
22
|
+
export declare function countBudgetTokens(usage: PromptResult['usage'], backend: BackendType): number;
|
|
23
|
+
//# sourceMappingURL=turn-text.d.ts.map
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.extractTextFromContent = extractTextFromContent;
|
|
4
|
+
exports.extractTextResponse = extractTextResponse;
|
|
5
|
+
exports.countBudgetTokens = countBudgetTokens;
|
|
6
|
+
/** The text blocks of one content array, joined. */
|
|
7
|
+
function extractTextFromContent(content) {
|
|
8
|
+
return content
|
|
9
|
+
.filter((block) => block.type === 'text')
|
|
10
|
+
.map((block) => block.text)
|
|
11
|
+
.join('\n');
|
|
12
|
+
}
|
|
13
|
+
/** The last assistant message's text, or empty when the history holds none. */
|
|
14
|
+
function extractTextResponse(history) {
|
|
15
|
+
for (let i = history.length - 1; i >= 0; i--) {
|
|
16
|
+
const message = history[i];
|
|
17
|
+
if (message.role === 'assistant') {
|
|
18
|
+
const content = message.content;
|
|
19
|
+
if (typeof content === 'string') {
|
|
20
|
+
return content;
|
|
21
|
+
}
|
|
22
|
+
return extractTextFromContent(content);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return '';
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Tokens a turn counts against the run budget.
|
|
29
|
+
*
|
|
30
|
+
* One backend reports cache reads and cache creation outside input_tokens; the other
|
|
31
|
+
* reports input tokens inclusive of cached ones. Adding cache reads for the second
|
|
32
|
+
* doubled every count in 0.44.0, where a 2.8M turn read as 5.5M and was stopped.
|
|
33
|
+
*/
|
|
34
|
+
function countBudgetTokens(usage, backend) {
|
|
35
|
+
const base = usage.input_tokens + usage.output_tokens;
|
|
36
|
+
if (backend === 'codex') {
|
|
37
|
+
return base;
|
|
38
|
+
}
|
|
39
|
+
return base + (usage.cache_creation_input_tokens ?? 0) + (usage.cache_read_input_tokens ?? 0);
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=turn-text.js.map
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database lifetime.
|
|
3
|
+
*
|
|
4
|
+
* `openDatabase` returns a handle to one database. It does not register itself
|
|
5
|
+
* anywhere, so two calls give two independent databases and a caller always
|
|
6
|
+
* knows which one it holds. `db-manager.ts` keeps a single handle for the
|
|
7
|
+
* callers that still reach for a module-level connection; nothing here depends
|
|
8
|
+
* on that handle existing.
|
|
9
|
+
*
|
|
10
|
+
* @module storage/database
|
|
11
|
+
*/
|
|
12
|
+
import type { DatabaseInstance } from '../db-manager.js';
|
|
13
|
+
/** Migrations ship beside the compiled output, two levels up from `dist/storage`. */
|
|
14
|
+
export declare const MIGRATIONS_DIR: string;
|
|
15
|
+
export interface OpenDatabaseOptions {
|
|
16
|
+
/** Where to open. Falls back to the adapter's own resolution when omitted. */
|
|
17
|
+
path?: string;
|
|
18
|
+
/** Directory holding the core's migration files. Defaults to the shipped one. */
|
|
19
|
+
migrationsDir?: string;
|
|
20
|
+
/**
|
|
21
|
+
* Migrations this consumer brings of its own, run after the core's.
|
|
22
|
+
*
|
|
23
|
+
* A package that needs a table has somewhere to put it other than inside the
|
|
24
|
+
* core. Each source namespaces its own version numbers, so the core's next
|
|
25
|
+
* number is not spoken for by somebody else.
|
|
26
|
+
*/
|
|
27
|
+
migrations?: ReadonlyArray<{
|
|
28
|
+
name: string;
|
|
29
|
+
dir: string;
|
|
30
|
+
}>;
|
|
31
|
+
}
|
|
32
|
+
export interface DatabaseHandle {
|
|
33
|
+
adapter: DatabaseInstance;
|
|
34
|
+
/** The value `connect()` returned, for callers that still need the raw driver. */
|
|
35
|
+
connection: unknown;
|
|
36
|
+
/** Where this handle actually opened, or a description when the adapter cannot say. */
|
|
37
|
+
dbPath: string;
|
|
38
|
+
close: () => Promise<void>;
|
|
39
|
+
}
|
|
40
|
+
export declare function isTestMode(): boolean;
|
|
41
|
+
/**
|
|
42
|
+
* Declare where this product's live database is, as a resolved absolute path.
|
|
43
|
+
* Call once, before opening anything.
|
|
44
|
+
*/
|
|
45
|
+
export declare function declareProductionDatabasePath(value: string): void;
|
|
46
|
+
/** Test seam: forget what was declared. */
|
|
47
|
+
export declare function clearProductionDatabasePaths(): void;
|
|
48
|
+
/**
|
|
49
|
+
* Refuse, in a test process, to open a database nobody named or one a product
|
|
50
|
+
* declared as live.
|
|
51
|
+
*
|
|
52
|
+
* This used to compare against one hard-coded path, `~/.claude/mama-memory.db`, which
|
|
53
|
+
* meant the core held a product's data location in order to protect it. The rule is
|
|
54
|
+
* the same and says no product's name: a test that did not state where it wanted to
|
|
55
|
+
* write is about to write somewhere it did not choose, and that failure surfaces far
|
|
56
|
+
* from its cause.
|
|
57
|
+
*/
|
|
58
|
+
export declare function assertTestProcessIsNotUsingRealDb(effectivePath?: string, effectivePathSource?: string): void;
|
|
59
|
+
export declare function resolveAdapterDbPath(adapter: DatabaseInstance): string | undefined;
|
|
60
|
+
/**
|
|
61
|
+
* Open one database: connect, migrate, and verify the embedding scheme.
|
|
62
|
+
*
|
|
63
|
+
* Throws if any step fails. Nothing partially opened is returned, so a caller
|
|
64
|
+
* that receives a handle holds a migrated database it can use.
|
|
65
|
+
*/
|
|
66
|
+
export declare function openDatabase(options?: OpenDatabaseOptions): Promise<DatabaseHandle>;
|
|
67
|
+
//# sourceMappingURL=database.d.ts.map
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Database lifetime.
|
|
4
|
+
*
|
|
5
|
+
* `openDatabase` returns a handle to one database. It does not register itself
|
|
6
|
+
* anywhere, so two calls give two independent databases and a caller always
|
|
7
|
+
* knows which one it holds. `db-manager.ts` keeps a single handle for the
|
|
8
|
+
* callers that still reach for a module-level connection; nothing here depends
|
|
9
|
+
* on that handle existing.
|
|
10
|
+
*
|
|
11
|
+
* @module storage/database
|
|
12
|
+
*/
|
|
13
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.MIGRATIONS_DIR = void 0;
|
|
18
|
+
exports.isTestMode = isTestMode;
|
|
19
|
+
exports.declareProductionDatabasePath = declareProductionDatabasePath;
|
|
20
|
+
exports.clearProductionDatabasePaths = clearProductionDatabasePaths;
|
|
21
|
+
exports.assertTestProcessIsNotUsingRealDb = assertTestProcessIsNotUsingRealDb;
|
|
22
|
+
exports.resolveAdapterDbPath = resolveAdapterDbPath;
|
|
23
|
+
exports.openDatabase = openDatabase;
|
|
24
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
25
|
+
const index_js_1 = require("../db-adapter/index.js");
|
|
26
|
+
const db_manager_js_1 = require("../db-manager.js");
|
|
27
|
+
const debug_logger_js_1 = require("../debug-logger.js");
|
|
28
|
+
const progress_indicator_js_1 = require("../progress-indicator.js");
|
|
29
|
+
/** Migrations ship beside the compiled output, two levels up from `dist/storage`. */
|
|
30
|
+
exports.MIGRATIONS_DIR = node_path_1.default.join(__dirname, '..', '..', 'db', 'migrations');
|
|
31
|
+
function isTestMode() {
|
|
32
|
+
return Boolean(process.env.MAMA_TEST_MODE || process.env.VITEST || process.env.NODE_ENV === 'test');
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* A path a consumer states must already be resolved.
|
|
36
|
+
*
|
|
37
|
+
* The core used to expand `~` and `${HOME}` itself, which made it the thing that
|
|
38
|
+
* decides what home means. Two consumers with different homes then got the same
|
|
39
|
+
* answer from a library neither of them configured. Expansion belongs to whoever owns
|
|
40
|
+
* the home directory; this only refuses to guess.
|
|
41
|
+
*/
|
|
42
|
+
function requireResolvedPath(value, source) {
|
|
43
|
+
if (value === '~' || value.startsWith('~/') || value.includes('${HOME}')) {
|
|
44
|
+
throw new Error(`[db-boundary] ${source} is not a resolved path (${value}). ` +
|
|
45
|
+
'Expand it where the home directory is known and state the result.');
|
|
46
|
+
}
|
|
47
|
+
return node_path_1.default.resolve(value);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Databases a product has declared as its live one.
|
|
51
|
+
*
|
|
52
|
+
* The core used to hold one such path itself, `~/.claude/mama-memory.db`, which meant
|
|
53
|
+
* a shared library knew where one product kept its data in order to protect it. Each
|
|
54
|
+
* product declares its own now, and the guard below refuses all of them.
|
|
55
|
+
*/
|
|
56
|
+
const productionDatabasePaths = new Set();
|
|
57
|
+
/**
|
|
58
|
+
* Declare where this product's live database is, as a resolved absolute path.
|
|
59
|
+
* Call once, before opening anything.
|
|
60
|
+
*/
|
|
61
|
+
function declareProductionDatabasePath(value) {
|
|
62
|
+
productionDatabasePaths.add(requireResolvedPath(value, 'the declared production database path'));
|
|
63
|
+
}
|
|
64
|
+
/** Test seam: forget what was declared. */
|
|
65
|
+
function clearProductionDatabasePaths() {
|
|
66
|
+
productionDatabasePaths.clear();
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Refuse, in a test process, to open a database nobody named or one a product
|
|
70
|
+
* declared as live.
|
|
71
|
+
*
|
|
72
|
+
* This used to compare against one hard-coded path, `~/.claude/mama-memory.db`, which
|
|
73
|
+
* meant the core held a product's data location in order to protect it. The rule is
|
|
74
|
+
* the same and says no product's name: a test that did not state where it wanted to
|
|
75
|
+
* write is about to write somewhere it did not choose, and that failure surfaces far
|
|
76
|
+
* from its cause.
|
|
77
|
+
*/
|
|
78
|
+
function assertTestProcessIsNotUsingRealDb(effectivePath, effectivePathSource = 'adapter') {
|
|
79
|
+
if (!isTestMode()) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const configuredPaths = [
|
|
83
|
+
{ name: 'MAMA_DB_PATH', value: process.env.MAMA_DB_PATH },
|
|
84
|
+
{ name: 'MAMA_DATABASE_PATH', value: process.env.MAMA_DATABASE_PATH },
|
|
85
|
+
];
|
|
86
|
+
if (effectivePath) {
|
|
87
|
+
configuredPaths.push({ name: effectivePathSource, value: effectivePath });
|
|
88
|
+
}
|
|
89
|
+
const named = configuredPaths.find((configuredPath) => Boolean(configuredPath.value));
|
|
90
|
+
if (!named) {
|
|
91
|
+
throw new Error('[db-boundary] Refusing to open an unnamed database from a test process. ' +
|
|
92
|
+
'Set MAMA_DB_PATH to a temporary path first.');
|
|
93
|
+
}
|
|
94
|
+
for (const configuredPath of configuredPaths) {
|
|
95
|
+
if (!configuredPath.value) {
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
const resolvedPath = requireResolvedPath(configuredPath.value, configuredPath.name);
|
|
99
|
+
if (productionDatabasePaths.has(resolvedPath)) {
|
|
100
|
+
throw new Error(`[db-boundary] Refusing to open the live database ${resolvedPath} ` +
|
|
101
|
+
`from a test process (${configuredPath.name}=${configuredPath.value}). ` +
|
|
102
|
+
'Set MAMA_DB_PATH to a temporary path first.');
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
function resolveAdapterDbPath(adapter) {
|
|
107
|
+
if (typeof adapter.getDbPath === 'function') {
|
|
108
|
+
return adapter.getDbPath();
|
|
109
|
+
}
|
|
110
|
+
return adapter.dbPath;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Open one database: connect, migrate, and verify the embedding scheme.
|
|
114
|
+
*
|
|
115
|
+
* Throws if any step fails. Nothing partially opened is returned, so a caller
|
|
116
|
+
* that receives a handle holds a migrated database it can use.
|
|
117
|
+
*/
|
|
118
|
+
async function openDatabase(options = {}) {
|
|
119
|
+
assertTestProcessIsNotUsingRealDb(options.path, 'openDatabase({ path })');
|
|
120
|
+
(0, progress_indicator_js_1.logSearching)('Initializing database...');
|
|
121
|
+
const adapter = (0, index_js_1.createAdapter)(options.path ? { dbPath: options.path } : {});
|
|
122
|
+
assertTestProcessIsNotUsingRealDb(resolveAdapterDbPath(adapter), 'adapter.getDbPath()');
|
|
123
|
+
let connection;
|
|
124
|
+
try {
|
|
125
|
+
connection = await adapter.connect();
|
|
126
|
+
await adapter.runMigrations([
|
|
127
|
+
{ name: 'core', dir: options.migrationsDir ?? exports.MIGRATIONS_DIR },
|
|
128
|
+
...(options.migrations ?? []),
|
|
129
|
+
]);
|
|
130
|
+
// New tables and rows exist only after migrations run.
|
|
131
|
+
if (typeof adapter.reloadVectorCache === 'function') {
|
|
132
|
+
adapter.reloadVectorCache();
|
|
133
|
+
}
|
|
134
|
+
// Fail loud on legacy vectors meeting current code.
|
|
135
|
+
(0, db_manager_js_1.assertEmbeddingSchemeCurrent)(adapter);
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
try {
|
|
139
|
+
adapter.disconnect();
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
// The open already failed; a disconnect error would only mask it.
|
|
143
|
+
}
|
|
144
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
145
|
+
throw new Error(`Failed to initialize database: ${message}`);
|
|
146
|
+
}
|
|
147
|
+
(0, debug_logger_js_1.info)(`[storage/database] Database opened (${adapter.constructor.name})`);
|
|
148
|
+
(0, progress_indicator_js_1.logComplete)('Database ready');
|
|
149
|
+
return {
|
|
150
|
+
adapter,
|
|
151
|
+
connection,
|
|
152
|
+
dbPath: resolveAdapterDbPath(adapter) ?? `${adapter.constructor.name} (path unavailable)`,
|
|
153
|
+
close: async () => {
|
|
154
|
+
await adapter.disconnect();
|
|
155
|
+
},
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=database.js.map
|