@jungjaehoon/mama-core 2.4.1 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +76 -239
- package/db/migrations/030-case-first-memory-substrate.sql +13 -98
- package/db/migrations/034-add-connector-event-scope-columns.sql +9 -13
- package/db/migrations/039-add-connector-event-operator-ingest-seq.sql +9 -95
- package/db/migrations/062-refresh-connector-event-sequences.sql +9 -113
- package/db/migrations/063-refresh-legacy-connector-event-updates.sql +9 -32
- package/db/migrations/067-add-connector-event-source-entity-id.sql +9 -13
- package/db/migrations/069-create-registry-nodes.sql +52 -0
- package/db/migrations/070-record-identity.sql +35 -0
- package/db/migrations/071-service-operation-origins.sql +187 -0
- package/db/migrations/072-observation-versions.sql +29 -0
- package/db/migrations/073-registry-corrections.sql +45 -0
- package/db/migrations/074-work-graph-ref-kinds.sql +39 -0
- package/db/migrations/075-agent-judgments.sql +58 -0
- package/db/migrations/076-scoped-checkpoint-bindings.sql +15 -0
- package/db/migrations/077-legacy-record-kind.sql +6 -0
- package/db/migrations/078-source-ingest-commands.sql +18 -0
- package/db/migrations/079-twin-edge-relations.sql +43 -0
- package/db/migrations/080-restore-duration-days.sql +7 -0
- package/db/migrations/081-mailbox.sql +61 -0
- package/db/migrations/082-commitments-row-id.sql +12 -0
- package/db/migrations/083-observation-is-the-evidence.sql +49 -0
- package/db/migrations/084-scope-kind-is-not-the-cores-to-list.sql +34 -0
- package/db/migrations/085-a-migration-has-a-source.sql +37 -0
- package/db/migrations/086-the-mailbox-is-generic.sql +110 -0
- package/db/migrations/087-mailbox-payload.sql +5 -0
- package/db/migrations/088-native-input-journal.sql +14 -0
- package/db/migrations/089-native-turn-receipt-lookup.sql +3 -0
- package/db/migrations/090-model-run-native-inputs.sql +29 -0
- package/db/migrations/091-native-turn-results.sql +11 -0
- package/db/migrations/092-restore-decision-fts.sql +34 -0
- package/db/migrations/093-native-turn-primary-kind.sql +14 -0
- package/db/migrations/094-commitment-run-provenance.sql +9 -0
- package/db/migrations/095-model-run-native-input-identity.sql +39 -0
- package/db/migrations/096-drop-connector-event-index-fts.sql +9 -0
- package/db/migrations/097-native-input-json-validity.sql +37 -0
- package/db/migrations/098-workflow-memory-kind.sql +105 -0
- package/dist/action-contracts.d.ts +212 -0
- package/dist/action-contracts.js +10 -0
- package/dist/api/catalog.d.ts +118 -0
- package/dist/api/catalog.js +1756 -0
- package/dist/api/dispatch.d.ts +76 -0
- package/dist/api/dispatch.js +372 -0
- package/dist/canonicalize.d.ts +2 -2
- package/dist/canonicalize.js +3 -3
- package/dist/client/client.d.ts +33 -0
- package/dist/client/client.js +123 -0
- package/dist/client/ipc.d.ts +81 -0
- package/dist/client/ipc.js +314 -0
- package/dist/db-adapter/base-adapter.d.ts +6 -66
- package/dist/db-adapter/base-adapter.js +6 -6
- package/dist/db-adapter/index.d.ts +5 -5
- package/dist/db-adapter/index.js +2 -5
- package/dist/db-adapter/node-sqlite-adapter.d.ts +85 -15
- package/dist/db-adapter/node-sqlite-adapter.js +1968 -570
- package/dist/db-manager.d.ts +53 -97
- package/dist/db-manager.js +121 -603
- package/dist/embedding/embedder.d.ts +132 -0
- package/dist/embedding/embedder.js +299 -0
- package/dist/identity/principal-repository.d.ts +2 -2
- package/dist/index.d.ts +43 -58
- package/dist/index.js +97 -145
- package/dist/{context-compile/channel-grant.d.ts → knowledge/access.d.ts} +12 -17
- package/dist/knowledge/access.js +663 -0
- package/dist/knowledge/case-errors.d.ts +31 -0
- package/dist/knowledge/case-errors.js +40 -0
- package/dist/{cases/search-rollup.d.ts → knowledge/case-search-rollup.d.ts} +5 -4
- package/dist/{cases/search-rollup.js → knowledge/case-search-rollup.js} +6 -8
- package/dist/{cases/store.d.ts → knowledge/case-store.d.ts} +3 -6
- package/dist/{cases/store.js → knowledge/case-store.js} +7 -42
- package/dist/{cases/timeline-range.d.ts → knowledge/case-timeline-range.d.ts} +3 -3
- package/dist/{cases/timeline-range.js → knowledge/case-timeline-range.js} +47 -25
- package/dist/{cases/types.d.ts → knowledge/case-types.d.ts} +8 -2
- package/dist/{cases/types.js → knowledge/case-types.js} +1 -1
- package/dist/knowledge/commitments.d.ts +188 -0
- package/dist/knowledge/commitments.js +370 -0
- package/dist/knowledge/decision-edges.d.ts +70 -0
- package/dist/knowledge/decision-edges.js +123 -0
- package/dist/{agent-graph/types.d.ts → knowledge/graph-query.d.ts} +80 -70
- package/dist/knowledge/graph-query.js +1585 -0
- package/dist/knowledge/identity.d.ts +16 -0
- package/dist/knowledge/identity.js +22 -0
- package/dist/knowledge/index.d.ts +47 -0
- package/dist/knowledge/index.js +90 -0
- package/dist/knowledge/judgments.d.ts +118 -0
- package/dist/knowledge/judgments.js +808 -0
- package/dist/knowledge/observations.d.ts +160 -0
- package/dist/knowledge/observations.js +449 -0
- package/dist/knowledge/question-type.d.ts +34 -0
- package/dist/knowledge/question-type.js +70 -0
- package/dist/{search → knowledge}/ranker-features.js +1 -1
- package/dist/{search → knowledge}/search-quality.d.ts +0 -1
- package/dist/knowledge/search.d.ts +38 -0
- package/dist/knowledge/search.js +91 -0
- package/dist/knowledge/source-ingest.d.ts +65 -0
- package/dist/knowledge/source-ingest.js +174 -0
- package/dist/{edges/types.d.ts → knowledge/twin-edge-types.d.ts} +31 -4
- package/dist/{edges/types.js → knowledge/twin-edge-types.js} +13 -2
- package/dist/knowledge/work-dates.d.ts +49 -0
- package/dist/knowledge/work-dates.js +120 -0
- package/dist/mama-api.d.ts +114 -778
- package/dist/mama-api.js +313 -2461
- package/dist/memory/api.d.ts +264 -24
- package/dist/memory/api.js +1633 -843
- package/dist/memory/bootstrap-builder.d.ts +2 -1
- package/dist/memory/bootstrap-builder.js +5 -5
- package/dist/memory/channel-summary-state-store.d.ts +3 -2
- package/dist/memory/channel-summary-state-store.js +53 -51
- package/dist/memory/channel-summary-store.d.ts +5 -3
- package/dist/memory/channel-summary-store.js +3 -8
- package/dist/memory/dashboard-read.d.ts +46 -0
- package/dist/memory/dashboard-read.js +94 -0
- package/dist/memory/event-store.d.ts +3 -3
- package/dist/memory/event-store.js +3 -10
- package/dist/memory/finding-store.d.ts +3 -2
- package/dist/memory/finding-store.js +2 -7
- package/dist/memory/graph-read.d.ts +52 -0
- package/dist/memory/graph-read.js +130 -0
- package/dist/memory/judgment-types.d.ts +394 -0
- package/dist/memory/judgment-types.js +16 -0
- package/dist/memory/provenance-audit.d.ts +5 -2
- package/dist/memory/provenance-audit.js +8 -14
- package/dist/memory/provenance-live.d.ts +141 -0
- package/dist/memory/provenance-live.js +409 -0
- package/dist/memory/provenance-query.d.ts +5 -4
- package/dist/memory/provenance-query.js +21 -29
- package/dist/memory/provenance-resolver.d.ts +191 -0
- package/dist/memory/provenance-resolver.js +155 -0
- package/dist/memory/provenance.d.ts +1 -11
- package/dist/memory/provenance.js +2 -33
- package/dist/memory/recall-sanitize.d.ts +55 -0
- package/dist/memory/recall-sanitize.js +144 -0
- package/dist/memory/secret-filter.d.ts +32 -0
- package/dist/memory/secret-filter.js +126 -0
- package/dist/memory/truth-store.d.ts +2 -1
- package/dist/memory/truth-store.js +1 -4
- package/dist/memory/types.d.ts +74 -24
- package/dist/memory/types.js +75 -5
- package/dist/memory/write-adapters.d.ts +98 -0
- package/dist/memory/write-adapters.js +242 -0
- package/dist/operations/owner-action-effects.d.ts +53 -0
- package/dist/operations/owner-action-effects.js +96 -0
- package/dist/provenance/source-ref.d.ts +1 -1
- package/dist/provenance/source-ref.js +0 -2
- package/dist/registry/corrections.d.ts +31 -0
- package/dist/registry/corrections.js +332 -0
- package/dist/registry/record-identity.d.ts +49 -0
- package/dist/registry/record-identity.js +133 -0
- package/dist/registry/store.d.ts +101 -0
- package/dist/registry/store.js +395 -0
- package/dist/registry/types.d.ts +28 -0
- package/dist/registry/types.js +5 -0
- package/dist/relevance-scorer.js +2 -2
- package/dist/runtime/agent-event-bus.d.ts +50 -0
- package/dist/runtime/agent-event-bus.js +101 -0
- package/dist/runtime/drivers/claude-cli-wrapper.d.ts +155 -0
- package/dist/runtime/drivers/claude-cli-wrapper.js +392 -0
- package/dist/runtime/drivers/cli-arg-redaction.d.ts +2 -0
- package/dist/runtime/drivers/cli-arg-redaction.js +18 -0
- package/dist/runtime/drivers/cli-secret-redaction.d.ts +17 -0
- package/dist/runtime/drivers/cli-secret-redaction.js +126 -0
- package/dist/runtime/drivers/codex-app-server-process.d.ts +277 -0
- package/dist/runtime/drivers/codex-app-server-process.js +2342 -0
- package/dist/runtime/drivers/codex-auxiliary-tools.d.ts +17 -0
- package/dist/runtime/drivers/codex-auxiliary-tools.js +267 -0
- package/dist/runtime/drivers/codex-home.d.ts +20 -0
- package/dist/runtime/drivers/codex-home.js +674 -0
- package/dist/runtime/drivers/codex-thread-registry.d.ts +63 -0
- package/dist/runtime/drivers/codex-thread-registry.js +433 -0
- package/dist/runtime/drivers/persistent-cli-adapter.d.ts +160 -0
- package/dist/runtime/drivers/persistent-cli-adapter.js +396 -0
- package/dist/runtime/drivers/persistent-cli-process.d.ts +424 -0
- package/dist/runtime/drivers/persistent-cli-process.js +1543 -0
- package/dist/runtime/drivers/types.d.ts +456 -0
- package/dist/runtime/drivers/types.js +110 -0
- package/dist/runtime/mailbox.d.ts +223 -0
- package/dist/runtime/mailbox.js +582 -0
- package/dist/runtime/model-run-store.d.ts +28 -0
- package/dist/{model-runs/store.js → runtime/model-run-store.js} +81 -41
- package/dist/{model-runs/types.d.ts → runtime/model-run-types.d.ts} +33 -4
- package/dist/{model-runs/types.js → runtime/model-run-types.js} +1 -1
- package/dist/runtime/native-effect-observer.d.ts +22 -0
- package/dist/runtime/native-effect-observer.js +103 -0
- package/dist/runtime/native-input-journal.d.ts +46 -0
- package/dist/runtime/native-input-journal.js +308 -0
- package/dist/runtime/native-prompt.d.ts +118 -0
- package/dist/runtime/native-prompt.js +496 -0
- package/dist/runtime/native-session.d.ts +10 -0
- package/dist/{agent-graph/index.js → runtime/native-session.js} +9 -6
- package/dist/runtime/native-tool-trace-observer.d.ts +5 -0
- package/dist/runtime/native-tool-trace-observer.js +65 -0
- package/dist/runtime/native-turn.d.ts +272 -0
- package/dist/runtime/native-turn.js +1041 -0
- package/dist/runtime/operations.d.ts +236 -0
- package/dist/runtime/operations.js +565 -0
- package/dist/runtime/post-tool-handler.d.ts +74 -0
- package/dist/runtime/post-tool-handler.js +137 -0
- package/dist/runtime/prompt-layers.d.ts +126 -0
- package/dist/runtime/prompt-layers.js +239 -0
- package/dist/runtime/runtime-process.d.ts +102 -0
- package/dist/runtime/runtime-process.js +206 -0
- package/dist/runtime/runtime.d.ts +278 -0
- package/dist/runtime/runtime.js +563 -0
- package/dist/runtime/session-pool.d.ts +176 -0
- package/dist/runtime/session-pool.js +369 -0
- package/dist/runtime/stimulus-payload.d.ts +5 -0
- package/dist/runtime/stimulus-payload.js +50 -0
- package/dist/runtime/subagent-bridge.d.ts +24 -0
- package/dist/{agent-graph/types.js → runtime/subagent-bridge.js} +1 -1
- package/dist/runtime/text-completion.d.ts +22 -0
- package/dist/{agent-situation/types.js → runtime/text-completion.js} +1 -1
- package/dist/runtime/token-estimator.d.ts +25 -0
- package/dist/runtime/token-estimator.js +75 -0
- package/dist/runtime/tool-trace-store.d.ts +22 -0
- package/dist/{model-runs → runtime}/tool-trace-store.js +46 -27
- package/dist/runtime/trace-summary.d.ts +5 -0
- package/dist/runtime/trace-summary.js +74 -0
- package/dist/runtime/turn-text.d.ts +23 -0
- package/dist/runtime/turn-text.js +41 -0
- package/dist/storage/database.d.ts +67 -0
- package/dist/storage/database.js +158 -0
- package/package.json +20 -34
- package/dist/agent-graph/alias-write.d.ts +0 -3
- package/dist/agent-graph/alias-write.js +0 -234
- package/dist/agent-graph/entity-resolve.d.ts +0 -3
- package/dist/agent-graph/entity-resolve.js +0 -271
- package/dist/agent-graph/errors.d.ts +0 -4
- package/dist/agent-graph/errors.js +0 -11
- package/dist/agent-graph/graph-query.d.ts +0 -5
- package/dist/agent-graph/graph-query.js +0 -360
- package/dist/agent-graph/index.d.ts +0 -6
- package/dist/agent-situation/builder.d.ts +0 -8
- package/dist/agent-situation/builder.js +0 -239
- package/dist/agent-situation/cache-key.d.ts +0 -4
- package/dist/agent-situation/cache-key.js +0 -64
- package/dist/agent-situation/index.d.ts +0 -7
- package/dist/agent-situation/index.js +0 -28
- package/dist/agent-situation/packet-store.d.ts +0 -27
- package/dist/agent-situation/packet-store.js +0 -228
- package/dist/agent-situation/ranking-policy.d.ts +0 -18
- package/dist/agent-situation/ranking-policy.js +0 -75
- package/dist/agent-situation/source-readers.d.ts +0 -52
- package/dist/agent-situation/source-readers.js +0 -300
- package/dist/agent-situation/types.d.ts +0 -195
- package/dist/cases/wiki-page-index.d.ts +0 -37
- package/dist/cases/wiki-page-index.js +0 -201
- package/dist/config-loader.d.ts +0 -68
- package/dist/config-loader.js +0 -239
- package/dist/connectors/event-index.d.ts +0 -24
- package/dist/connectors/event-index.js +0 -245
- package/dist/connectors/raw-query.d.ts +0 -40
- package/dist/connectors/raw-query.js +0 -412
- package/dist/connectors/types.d.ts +0 -117
- package/dist/connectors/types.js +0 -3
- package/dist/context-compile/boundary-defaults.d.ts +0 -12
- package/dist/context-compile/boundary-defaults.js +0 -105
- package/dist/context-compile/channel-grant.js +0 -66
- package/dist/context-compile/compiler-policy.d.ts +0 -39
- package/dist/context-compile/compiler-policy.js +0 -147
- package/dist/context-compile/compiler.d.ts +0 -18
- package/dist/context-compile/compiler.js +0 -404
- package/dist/context-compile/index.d.ts +0 -10
- package/dist/context-compile/index.js +0 -26
- package/dist/context-compile/packet-store.d.ts +0 -8
- package/dist/context-compile/packet-store.js +0 -239
- package/dist/context-compile/ref.d.ts +0 -7
- package/dist/context-compile/ref.js +0 -102
- package/dist/context-compile/source-readers.d.ts +0 -70
- package/dist/context-compile/source-readers.js +0 -840
- package/dist/context-compile/types.d.ts +0 -155
- package/dist/context-compile/types.js +0 -11
- package/dist/context-compile/visibility.d.ts +0 -21
- package/dist/context-compile/visibility.js +0 -224
- package/dist/decision-tracker.d.ts +0 -206
- package/dist/decision-tracker.js +0 -481
- package/dist/edges/ref-validation.d.ts +0 -7
- package/dist/edges/ref-validation.js +0 -321
- package/dist/edges/store.d.ts +0 -8
- package/dist/edges/store.js +0 -129
- package/dist/embedding-client.d.ts +0 -28
- package/dist/embedding-client.js +0 -53
- package/dist/embedding-server/index.d.ts +0 -67
- package/dist/embedding-server/index.js +0 -405
- package/dist/embedding-server/mobile/auth.d.ts +0 -44
- package/dist/embedding-server/mobile/auth.js +0 -150
- package/dist/embedding-server/mobile/daemon.d.ts +0 -129
- package/dist/embedding-server/mobile/daemon.js +0 -313
- package/dist/embedding-server/mobile/output-parser.d.ts +0 -115
- package/dist/embedding-server/mobile/output-parser.js +0 -241
- package/dist/embedding-server/mobile/session-api.d.ts +0 -57
- package/dist/embedding-server/mobile/session-api.js +0 -261
- package/dist/embedding-server/mobile/session-manager.d.ts +0 -138
- package/dist/embedding-server/mobile/session-manager.js +0 -378
- package/dist/embedding-server/mobile/websocket-handler.d.ts +0 -137
- package/dist/embedding-server/mobile/websocket-handler.js +0 -486
- package/dist/embeddings.d.ts +0 -68
- package/dist/embeddings.js +0 -244
- package/dist/entities/audit-metrics.d.ts +0 -68
- package/dist/entities/audit-metrics.js +0 -124
- package/dist/entities/candidate-generator.d.ts +0 -8
- package/dist/entities/candidate-generator.js +0 -24
- package/dist/entities/entity-linked-decision-counts.d.ts +0 -2
- package/dist/entities/entity-linked-decision-counts.js +0 -29
- package/dist/entities/entity-list.d.ts +0 -22
- package/dist/entities/entity-list.js +0 -3
- package/dist/entities/entity-orphan-list.d.ts +0 -17
- package/dist/entities/entity-orphan-list.js +0 -3
- package/dist/entities/entity-search.d.ts +0 -20
- package/dist/entities/entity-search.js +0 -3
- package/dist/entities/errors.d.ts +0 -55
- package/dist/entities/errors.js +0 -100
- package/dist/entities/lineage-store.d.ts +0 -28
- package/dist/entities/lineage-store.js +0 -204
- package/dist/entities/normalization.d.ts +0 -14
- package/dist/entities/normalization.js +0 -63
- package/dist/entities/policy-store.d.ts +0 -8
- package/dist/entities/policy-store.js +0 -75
- package/dist/entities/policy-types.d.ts +0 -72
- package/dist/entities/policy-types.js +0 -59
- package/dist/entities/projection.d.ts +0 -8
- package/dist/entities/projection.js +0 -82
- package/dist/entities/provenance-query.d.ts +0 -32
- package/dist/entities/provenance-query.js +0 -3
- package/dist/entities/read-identity.d.ts +0 -31
- package/dist/entities/read-identity.js +0 -264
- package/dist/entities/recall-bridge.d.ts +0 -5
- package/dist/entities/recall-bridge.js +0 -171
- package/dist/entities/resolution-engine.d.ts +0 -8
- package/dist/entities/resolution-engine.js +0 -3
- package/dist/entities/rollback-preview.d.ts +0 -35
- package/dist/entities/rollback-preview.js +0 -3
- package/dist/entities/source-locator.d.ts +0 -3
- package/dist/entities/source-locator.js +0 -32
- package/dist/entities/store.d.ts +0 -69
- package/dist/entities/store.js +0 -544
- package/dist/entities/types.d.ts +0 -166
- package/dist/entities/types.js +0 -30
- package/dist/memory/extraction-prompt.d.ts +0 -4
- package/dist/memory/extraction-prompt.js +0 -89
- package/dist/memory/scope-backfill.d.ts +0 -14
- package/dist/memory/scope-backfill.js +0 -3
- package/dist/memory/scope-store.d.ts +0 -4
- package/dist/memory/scope-store.js +0 -9
- package/dist/memory-store.d.ts +0 -87
- package/dist/memory-store.js +0 -78
- package/dist/model-runs/store.d.ts +0 -13
- package/dist/model-runs/tool-trace-store.d.ts +0 -8
- package/dist/notification-manager.d.ts +0 -7
- package/dist/notification-manager.js +0 -12
- package/dist/outcome-tracker.d.ts +0 -151
- package/dist/outcome-tracker.js +0 -271
- package/dist/query-intent.d.ts +0 -23
- package/dist/query-intent.js +0 -114
- package/dist/runtime/trusted-provenance.d.ts +0 -3
- package/dist/runtime/trusted-provenance.js +0 -6
- package/dist/search/question-type.d.ts +0 -5
- package/dist/search/question-type.js +0 -41
- package/dist/test-utils.d.ts +0 -80
- package/dist/test-utils.js +0 -218
- package/dist/tier-validator.d.ts +0 -43
- package/dist/tier-validator.js +0 -159
- package/dist/time-formatter.d.ts +0 -25
- package/dist/time-formatter.js +0 -93
- /package/dist/{search → knowledge}/feedback-store.d.ts +0 -0
- /package/dist/{search → knowledge}/feedback-store.js +0 -0
- /package/dist/{search → knowledge}/ranker-features.d.ts +0 -0
- /package/dist/{search → knowledge}/ranker-rescore.d.ts +0 -0
- /package/dist/{search → knowledge}/ranker-rescore.js +0 -0
- /package/dist/{search → knowledge}/ranker-trainer.d.ts +0 -0
- /package/dist/{search → knowledge}/ranker-trainer.js +0 -0
- /package/dist/{search → knowledge}/search-quality.js +0 -0
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* After a tool runs, turn what it wrote into memory records, bounded and deduplicated,
|
|
4
|
+
* and fire-and-forget.
|
|
5
|
+
*
|
|
6
|
+
* What is here is the mechanism: notice that an editing tool ran, find the file it
|
|
7
|
+
* touched and the content it produced, ask for candidate records, keep at most a
|
|
8
|
+
* stated number of them, skip the ones already stored, and write the rest. What a
|
|
9
|
+
* candidate *is* is not here. A candidate is vocabulary, and vocabulary belongs to
|
|
10
|
+
* the caller: it supplies the source, and it names the two tools this handler calls.
|
|
11
|
+
*
|
|
12
|
+
* With no source, the handler is inert. That is the intended resting state once the
|
|
13
|
+
* caller's own extractor is gone.
|
|
14
|
+
*/
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.PostToolHandler = void 0;
|
|
17
|
+
const DEFAULT_SAVE_LIMIT = 20;
|
|
18
|
+
class PostToolHandler {
|
|
19
|
+
executeTool;
|
|
20
|
+
enabled;
|
|
21
|
+
editTools;
|
|
22
|
+
searchTool;
|
|
23
|
+
saveTool;
|
|
24
|
+
saveLimit;
|
|
25
|
+
source;
|
|
26
|
+
constructor(executeTool, config, source = null) {
|
|
27
|
+
this.executeTool = executeTool;
|
|
28
|
+
this.enabled = config.enabled;
|
|
29
|
+
this.editTools = config.editTools;
|
|
30
|
+
this.searchTool = config.searchTool;
|
|
31
|
+
this.saveTool = config.saveTool;
|
|
32
|
+
this.saveLimit = config.saveLimit ?? DEFAULT_SAVE_LIMIT;
|
|
33
|
+
this.source = source;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Called from the tool-result path. MUST NOT be async, MUST NOT return a promise
|
|
37
|
+
* and MUST NOT throw: a memory write is not allowed to decide whether a turn
|
|
38
|
+
* continues. The task is registered so the turn can still wait for it.
|
|
39
|
+
*/
|
|
40
|
+
processInBackground(toolName, input, result, executionContext) {
|
|
41
|
+
if (!this.enabled || !this.source) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
const task = this.processAsync(toolName, input, result, executionContext);
|
|
45
|
+
executionContext?.backgroundTasks?.register(task);
|
|
46
|
+
void task.catch(() => { });
|
|
47
|
+
}
|
|
48
|
+
async processAsync(toolName, input, result, executionContext) {
|
|
49
|
+
if (!this.enabled || !this.source) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
if (!this.isEditTool(toolName)) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
const filePath = this.extractFilePath(input);
|
|
56
|
+
if (!filePath) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const content = this.extractContent(result);
|
|
60
|
+
if (!content) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const candidates = this.source.candidates(content, filePath);
|
|
64
|
+
if (candidates.length === 0) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
for (const candidate of candidates.slice(0, this.saveLimit)) {
|
|
68
|
+
const isDupe = await this.isDuplicate(candidate, executionContext);
|
|
69
|
+
if (isDupe) {
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
await this.save(candidate, executionContext);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
isEditTool(toolName) {
|
|
76
|
+
return this.editTools.some((tool) => toolName.includes(tool));
|
|
77
|
+
}
|
|
78
|
+
extractFilePath(input) {
|
|
79
|
+
if (!input || typeof input !== 'object') {
|
|
80
|
+
return undefined;
|
|
81
|
+
}
|
|
82
|
+
const obj = input;
|
|
83
|
+
const raw = obj['path'] ?? obj['file_path'] ?? obj['filePath'];
|
|
84
|
+
return typeof raw === 'string' ? raw : undefined;
|
|
85
|
+
}
|
|
86
|
+
extractContent(result) {
|
|
87
|
+
if (typeof result === 'string') {
|
|
88
|
+
return result.length > 0 ? result : undefined;
|
|
89
|
+
}
|
|
90
|
+
if (result && typeof result === 'object') {
|
|
91
|
+
const obj = result;
|
|
92
|
+
if (typeof obj['content'] === 'string' && obj['content'].length > 0) {
|
|
93
|
+
return obj['content'];
|
|
94
|
+
}
|
|
95
|
+
const serialized = JSON.stringify(result);
|
|
96
|
+
return serialized.length > 2 ? serialized : undefined;
|
|
97
|
+
}
|
|
98
|
+
return undefined;
|
|
99
|
+
}
|
|
100
|
+
async isDuplicate(candidate, executionContext) {
|
|
101
|
+
try {
|
|
102
|
+
const input = { query: candidate.topic, type: 'decision', limit: 3 };
|
|
103
|
+
const response = (await (executionContext
|
|
104
|
+
? this.executeTool(this.searchTool, input, executionContext)
|
|
105
|
+
: this.executeTool(this.searchTool, input)));
|
|
106
|
+
if (!response?.results || response.results.length === 0) {
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
return response.results.some((item) => item.topic === candidate.topic && item.decision === candidate.decision);
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
async save(candidate, executionContext) {
|
|
116
|
+
try {
|
|
117
|
+
const input = {
|
|
118
|
+
type: 'decision',
|
|
119
|
+
topic: candidate.topic,
|
|
120
|
+
decision: candidate.decision,
|
|
121
|
+
reasoning: candidate.reasoning,
|
|
122
|
+
confidence: candidate.confidence,
|
|
123
|
+
};
|
|
124
|
+
if (executionContext) {
|
|
125
|
+
await this.executeTool(this.saveTool, input, executionContext);
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
await this.executeTool(this.saveTool, input);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
// A memory write that fails must not fail the turn that produced it.
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
exports.PostToolHandler = PostToolHandler;
|
|
137
|
+
//# sourceMappingURL=post-tool-handler.js.map
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A system prompt as LAYERS, and what it costs to send them.
|
|
3
|
+
*
|
|
4
|
+
* A caller states the layers - what the agent is, what it may call, what it is
|
|
5
|
+
* recovering - and this joins them under a token budget, dropping or trimming the
|
|
6
|
+
* expendable ones first. The caller never joins or trims: doing that on the consumer
|
|
7
|
+
* side is how a prompt becomes a concatenation nobody owns.
|
|
8
|
+
*
|
|
9
|
+
* Uses js-tiktoken for accurate token counting (STORY-007).
|
|
10
|
+
*/
|
|
11
|
+
/** The three thresholds a caller may state. Defaults are the ones MAMA shipped with. */
|
|
12
|
+
export interface PromptBudget {
|
|
13
|
+
/** Warn beyond this many tokens. */
|
|
14
|
+
warnTokens?: number;
|
|
15
|
+
/** Begin truncating beyond this many tokens. */
|
|
16
|
+
truncateTokens?: number;
|
|
17
|
+
/** Anything beyond this is force-truncated. */
|
|
18
|
+
hardLimitTokens?: number;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* State the budget once, at wiring time. The thresholds are a consumer's setting;
|
|
22
|
+
* the arithmetic is not.
|
|
23
|
+
*/
|
|
24
|
+
export declare function setPromptBudget(next: PromptBudget): void;
|
|
25
|
+
/**
|
|
26
|
+
* A named layer of the system prompt with a priority level.
|
|
27
|
+
*
|
|
28
|
+
* Priority levels:
|
|
29
|
+
* - 1: CLAUDE.md (NEVER truncate)
|
|
30
|
+
* - 2: Gateway Tools (extreme truncation only)
|
|
31
|
+
* - 3: Context Prompt (regeneratable)
|
|
32
|
+
* - 4: AGENTS.md (can re-read from file)
|
|
33
|
+
* - 5: Rules (can read file on demand)
|
|
34
|
+
* - 6: Keyword Instructions (ephemeral, safe to drop)
|
|
35
|
+
*/
|
|
36
|
+
export interface PromptLayer {
|
|
37
|
+
/** Layer identifier for diagnostics */
|
|
38
|
+
name: string;
|
|
39
|
+
/** Layer content */
|
|
40
|
+
content: string;
|
|
41
|
+
/**
|
|
42
|
+
* Priority level (1 = highest / never truncate, 6 = lowest / drop first).
|
|
43
|
+
*
|
|
44
|
+
* 1 = CLAUDE.md (NEVER truncate)
|
|
45
|
+
* 2 = Gateway Tools (extreme only)
|
|
46
|
+
* 3 = Context Prompt (regeneratable)
|
|
47
|
+
* 4 = AGENTS.md (can re-read)
|
|
48
|
+
* 5 = Rules (can read file)
|
|
49
|
+
* 6 = Keyword Instructions (ephemeral)
|
|
50
|
+
*/
|
|
51
|
+
priority: number;
|
|
52
|
+
/** Host-authored opening marker paired atomically with protectedSuffix. */
|
|
53
|
+
protectedPrefix?: string;
|
|
54
|
+
/** Host-authored closing marker that must survive partial truncation. */
|
|
55
|
+
protectedSuffix?: string;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Result of a prompt size check or enforcement pass.
|
|
59
|
+
*/
|
|
60
|
+
export interface MonitorResult {
|
|
61
|
+
/** Total character count across all layers */
|
|
62
|
+
totalChars: number;
|
|
63
|
+
/** @deprecated Use totalTokens instead. This uses chars/4 heuristic. */
|
|
64
|
+
estimatedTokens: number;
|
|
65
|
+
/** Actual token count via tiktoken (or byte-length fallback) */
|
|
66
|
+
totalTokens: number;
|
|
67
|
+
/** Whether total is within the truncation threshold */
|
|
68
|
+
withinBudget: boolean;
|
|
69
|
+
/** Warning message if approaching or exceeding limits, null otherwise */
|
|
70
|
+
warning: string | null;
|
|
71
|
+
/** Names of layers that were truncated or removed */
|
|
72
|
+
truncatedLayers: string[];
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Monitors and enforces system prompt size limits using token counting.
|
|
76
|
+
*
|
|
77
|
+
* Uses a priority-based truncation strategy: layers with higher priority
|
|
78
|
+
* numbers (lower importance) are truncated first. Priority 1 layers are
|
|
79
|
+
* never truncated. Within the same priority, larger layers are truncated first.
|
|
80
|
+
*
|
|
81
|
+
* @example
|
|
82
|
+
* ```typescript
|
|
83
|
+
* const monitor = new PromptSizeMonitor();
|
|
84
|
+
* const result = monitor.check(layers);
|
|
85
|
+
* if (!result.withinBudget) {
|
|
86
|
+
* const { layers: trimmed } = monitor.enforce(layers);
|
|
87
|
+
* }
|
|
88
|
+
* ```
|
|
89
|
+
*/
|
|
90
|
+
export declare class PromptSizeMonitor {
|
|
91
|
+
/**
|
|
92
|
+
* Check prompt layers for size and return diagnostic info without modifying them.
|
|
93
|
+
*
|
|
94
|
+
* @param layers - Prompt layers to analyze
|
|
95
|
+
* @returns Monitor result with size metrics and warnings
|
|
96
|
+
*/
|
|
97
|
+
check(layers: PromptLayer[]): MonitorResult;
|
|
98
|
+
/**
|
|
99
|
+
* Enforce size limits by truncating layers in priority order.
|
|
100
|
+
*
|
|
101
|
+
* Layers with higher priority numbers (lower importance) are removed first.
|
|
102
|
+
* Within the same priority level, larger layers are removed first.
|
|
103
|
+
* Priority 1 layers are never truncated.
|
|
104
|
+
*
|
|
105
|
+
* @param layers - Prompt layers to enforce limits on
|
|
106
|
+
* @param maxTokens - Maximum allowed tokens (defaults to TRUNCATE_TOKENS)
|
|
107
|
+
* @returns Object with truncated layers array and updated monitor result
|
|
108
|
+
*/
|
|
109
|
+
enforce(layers: PromptLayer[], maxTokens?: number): {
|
|
110
|
+
layers: PromptLayer[];
|
|
111
|
+
result: MonitorResult;
|
|
112
|
+
};
|
|
113
|
+
/**
|
|
114
|
+
* @deprecated Use countTokens() from token-estimator instead.
|
|
115
|
+
* Estimate token count from character count using chars/4 heuristic.
|
|
116
|
+
*/
|
|
117
|
+
estimateTokens(chars: number): number;
|
|
118
|
+
}
|
|
119
|
+
/** How joined layers are separated. One separator, stated once. */
|
|
120
|
+
export declare const PROMPT_LAYER_SEPARATOR = "\n\n---\n\n";
|
|
121
|
+
/**
|
|
122
|
+
* Join the stated layers into one prompt, trimming the expendable ones if the budget
|
|
123
|
+
* says so. Empty layers never reach the model, and an empty list is an empty prompt.
|
|
124
|
+
*/
|
|
125
|
+
export declare function composeLayers(layers: readonly PromptLayer[], onDiagnostic?: (message: string) => void): string;
|
|
126
|
+
//# sourceMappingURL=prompt-layers.d.ts.map
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* A system prompt as LAYERS, and what it costs to send them.
|
|
4
|
+
*
|
|
5
|
+
* A caller states the layers - what the agent is, what it may call, what it is
|
|
6
|
+
* recovering - and this joins them under a token budget, dropping or trimming the
|
|
7
|
+
* expendable ones first. The caller never joins or trims: doing that on the consumer
|
|
8
|
+
* side is how a prompt becomes a concatenation nobody owns.
|
|
9
|
+
*
|
|
10
|
+
* Uses js-tiktoken for accurate token counting (STORY-007).
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.PROMPT_LAYER_SEPARATOR = exports.PromptSizeMonitor = void 0;
|
|
14
|
+
exports.setPromptBudget = setPromptBudget;
|
|
15
|
+
exports.composeLayers = composeLayers;
|
|
16
|
+
const token_estimator_js_1 = require("./token-estimator.js");
|
|
17
|
+
let budget = {
|
|
18
|
+
warnTokens: 3_750,
|
|
19
|
+
truncateTokens: 6_250,
|
|
20
|
+
hardLimitTokens: 10_000,
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* State the budget once, at wiring time. The thresholds are a consumer's setting;
|
|
24
|
+
* the arithmetic is not.
|
|
25
|
+
*/
|
|
26
|
+
function setPromptBudget(next) {
|
|
27
|
+
budget = {
|
|
28
|
+
warnTokens: next.warnTokens ?? budget.warnTokens,
|
|
29
|
+
truncateTokens: next.truncateTokens ?? budget.truncateTokens,
|
|
30
|
+
hardLimitTokens: next.hardLimitTokens ?? budget.hardLimitTokens,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/** Token count at which a warning is emitted */
|
|
34
|
+
const WARN_TOKENS = () => budget.warnTokens;
|
|
35
|
+
/** Token count at which truncation begins */
|
|
36
|
+
const TRUNCATE_TOKENS = () => budget.truncateTokens;
|
|
37
|
+
/** Absolute maximum - anything beyond is force-truncated */
|
|
38
|
+
const HARD_LIMIT_TOKENS = () => budget.hardLimitTokens;
|
|
39
|
+
/**
|
|
40
|
+
* Monitors and enforces system prompt size limits using token counting.
|
|
41
|
+
*
|
|
42
|
+
* Uses a priority-based truncation strategy: layers with higher priority
|
|
43
|
+
* numbers (lower importance) are truncated first. Priority 1 layers are
|
|
44
|
+
* never truncated. Within the same priority, larger layers are truncated first.
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* ```typescript
|
|
48
|
+
* const monitor = new PromptSizeMonitor();
|
|
49
|
+
* const result = monitor.check(layers);
|
|
50
|
+
* if (!result.withinBudget) {
|
|
51
|
+
* const { layers: trimmed } = monitor.enforce(layers);
|
|
52
|
+
* }
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
class PromptSizeMonitor {
|
|
56
|
+
/**
|
|
57
|
+
* Check prompt layers for size and return diagnostic info without modifying them.
|
|
58
|
+
*
|
|
59
|
+
* @param layers - Prompt layers to analyze
|
|
60
|
+
* @returns Monitor result with size metrics and warnings
|
|
61
|
+
*/
|
|
62
|
+
check(layers) {
|
|
63
|
+
const totalChars = layers.reduce((sum, layer) => sum + layer.content.length, 0);
|
|
64
|
+
const combined = layers.map((l) => l.content).join('');
|
|
65
|
+
const totalTokens = (0, token_estimator_js_1.countTokens)(combined);
|
|
66
|
+
const estimatedTokens = this.estimateTokens(totalChars);
|
|
67
|
+
const truncatedLayers = [];
|
|
68
|
+
let warning = null;
|
|
69
|
+
let withinBudget = true;
|
|
70
|
+
if (totalTokens > HARD_LIMIT_TOKENS()) {
|
|
71
|
+
warning =
|
|
72
|
+
`System prompt exceeds hard limit: ${totalTokens} tokens ` +
|
|
73
|
+
`(${totalChars} chars) > ${HARD_LIMIT_TOKENS()} token limit. ` +
|
|
74
|
+
`Force truncation required.`;
|
|
75
|
+
withinBudget = false;
|
|
76
|
+
}
|
|
77
|
+
else if (totalTokens > TRUNCATE_TOKENS()) {
|
|
78
|
+
warning =
|
|
79
|
+
`System prompt exceeds truncation threshold: ${totalTokens} tokens ` +
|
|
80
|
+
`(${totalChars} chars) > ${TRUNCATE_TOKENS()} token limit. ` +
|
|
81
|
+
`Truncation recommended.`;
|
|
82
|
+
withinBudget = false;
|
|
83
|
+
}
|
|
84
|
+
else if (totalTokens > WARN_TOKENS()) {
|
|
85
|
+
warning =
|
|
86
|
+
`System prompt approaching limit: ${totalTokens} tokens ` +
|
|
87
|
+
`(${totalChars} chars) > ${WARN_TOKENS()} token warning threshold.`;
|
|
88
|
+
withinBudget = true;
|
|
89
|
+
}
|
|
90
|
+
return { totalChars, estimatedTokens, totalTokens, withinBudget, warning, truncatedLayers };
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Enforce size limits by truncating layers in priority order.
|
|
94
|
+
*
|
|
95
|
+
* Layers with higher priority numbers (lower importance) are removed first.
|
|
96
|
+
* Within the same priority level, larger layers are removed first.
|
|
97
|
+
* Priority 1 layers are never truncated.
|
|
98
|
+
*
|
|
99
|
+
* @param layers - Prompt layers to enforce limits on
|
|
100
|
+
* @param maxTokens - Maximum allowed tokens (defaults to TRUNCATE_TOKENS)
|
|
101
|
+
* @returns Object with truncated layers array and updated monitor result
|
|
102
|
+
*/
|
|
103
|
+
enforce(layers, maxTokens = TRUNCATE_TOKENS()) {
|
|
104
|
+
// Count tokens per layer
|
|
105
|
+
const layerTokens = layers.map((l) => (0, token_estimator_js_1.countTokens)(l.content));
|
|
106
|
+
const totalTokens = layerTokens.reduce((sum, t) => sum + t, 0);
|
|
107
|
+
if (totalTokens <= maxTokens) {
|
|
108
|
+
const checkResult = this.check(layers);
|
|
109
|
+
return {
|
|
110
|
+
layers: [...layers],
|
|
111
|
+
result: { ...checkResult, withinBudget: totalTokens <= maxTokens },
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
// Sort candidates for truncation: highest priority number first, then largest first
|
|
115
|
+
const sortedByExpendability = layers
|
|
116
|
+
.map((layer, index) => ({ layer, index, tokens: layerTokens[index] }))
|
|
117
|
+
.filter(({ layer }) => layer.priority > 1)
|
|
118
|
+
.sort((a, b) => {
|
|
119
|
+
if (b.layer.priority !== a.layer.priority) {
|
|
120
|
+
return b.layer.priority - a.layer.priority;
|
|
121
|
+
}
|
|
122
|
+
return b.tokens - a.tokens;
|
|
123
|
+
});
|
|
124
|
+
const truncatedLayers = [];
|
|
125
|
+
const resultLayers = [...layers];
|
|
126
|
+
let currentTokens = totalTokens;
|
|
127
|
+
for (const { layer, index, tokens } of sortedByExpendability) {
|
|
128
|
+
if (currentTokens <= maxTokens) {
|
|
129
|
+
break;
|
|
130
|
+
}
|
|
131
|
+
const excess = currentTokens - maxTokens;
|
|
132
|
+
if (tokens <= excess) {
|
|
133
|
+
// Full removal
|
|
134
|
+
currentTokens -= tokens;
|
|
135
|
+
resultLayers[index] = { ...layer, content: '' };
|
|
136
|
+
truncatedLayers.push(layer.name);
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
// Partial truncation: estimate chars to remove based on layer's token density
|
|
140
|
+
const truncationMarker = `\n\n[... ${layer.name} truncated: ~${excess} tokens removed ...]`;
|
|
141
|
+
const protectedSuffix = layer.protectedSuffix && layer.content.endsWith(layer.protectedSuffix)
|
|
142
|
+
? `\n${layer.protectedSuffix}`
|
|
143
|
+
: '';
|
|
144
|
+
const protectedTail = `${truncationMarker}${protectedSuffix}`;
|
|
145
|
+
const markerTokens = (0, token_estimator_js_1.countTokens)(protectedTail);
|
|
146
|
+
const protectedPrefix = layer.protectedPrefix && layer.content.startsWith(layer.protectedPrefix)
|
|
147
|
+
? layer.protectedPrefix
|
|
148
|
+
: '';
|
|
149
|
+
const hasProtectedPair = protectedPrefix.length > 0 && protectedSuffix.length > 0;
|
|
150
|
+
const availableLayerTokens = Math.max(0, maxTokens - (currentTokens - tokens));
|
|
151
|
+
const minimumProtectedContent = `${protectedPrefix}${protectedTail}`;
|
|
152
|
+
if (markerTokens >= excess ||
|
|
153
|
+
(hasProtectedPair && (0, token_estimator_js_1.countTokens)(minimumProtectedContent) > availableLayerTokens)) {
|
|
154
|
+
// The truncation marker or atomic host marker pair cannot fit safely.
|
|
155
|
+
currentTokens -= tokens;
|
|
156
|
+
resultLayers[index] = { ...layer, content: '' };
|
|
157
|
+
truncatedLayers.push(layer.name);
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
const charsPerToken = tokens > 0 ? layer.content.length / tokens : 4;
|
|
161
|
+
const charsToRemove = Math.ceil(excess * charsPerToken);
|
|
162
|
+
const safeKeep = Math.max(0, layer.content.length - charsToRemove - protectedTail.length);
|
|
163
|
+
let newContent = layer.content.slice(0, Math.max(safeKeep, protectedPrefix.length)) + protectedTail;
|
|
164
|
+
if (hasProtectedPair && (0, token_estimator_js_1.countTokens)(newContent) > availableLayerTokens) {
|
|
165
|
+
newContent = minimumProtectedContent;
|
|
166
|
+
}
|
|
167
|
+
const newTokens = (0, token_estimator_js_1.countTokens)(newContent);
|
|
168
|
+
resultLayers[index] = {
|
|
169
|
+
...layer,
|
|
170
|
+
content: newContent,
|
|
171
|
+
};
|
|
172
|
+
currentTokens = currentTokens - tokens + newTokens;
|
|
173
|
+
truncatedLayers.push(layer.name);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
const finalLayers = resultLayers.filter((layer) => layer.content.length > 0);
|
|
178
|
+
const finalCheck = this.check(finalLayers);
|
|
179
|
+
const withinBudget = finalCheck.totalTokens <= maxTokens;
|
|
180
|
+
let warning = null;
|
|
181
|
+
if (!withinBudget) {
|
|
182
|
+
warning =
|
|
183
|
+
`System prompt still exceeds limit after truncation: ${finalCheck.totalTokens} tokens. ` +
|
|
184
|
+
`Only priority-1 layers remain.`;
|
|
185
|
+
}
|
|
186
|
+
else if (truncatedLayers.length > 0) {
|
|
187
|
+
warning =
|
|
188
|
+
`Truncated ${truncatedLayers.length} layer(s) to fit within ${maxTokens} tokens: ` +
|
|
189
|
+
`${truncatedLayers.join(', ')}.`;
|
|
190
|
+
}
|
|
191
|
+
return {
|
|
192
|
+
layers: finalLayers,
|
|
193
|
+
result: {
|
|
194
|
+
...finalCheck,
|
|
195
|
+
withinBudget,
|
|
196
|
+
warning,
|
|
197
|
+
truncatedLayers,
|
|
198
|
+
},
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* @deprecated Use countTokens() from token-estimator instead.
|
|
203
|
+
* Estimate token count from character count using chars/4 heuristic.
|
|
204
|
+
*/
|
|
205
|
+
estimateTokens(chars) {
|
|
206
|
+
return Math.ceil(chars / 4);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
exports.PromptSizeMonitor = PromptSizeMonitor;
|
|
210
|
+
/** How joined layers are separated. One separator, stated once. */
|
|
211
|
+
exports.PROMPT_LAYER_SEPARATOR = '\n\n---\n\n';
|
|
212
|
+
/**
|
|
213
|
+
* Join the stated layers into one prompt, trimming the expendable ones if the budget
|
|
214
|
+
* says so. Empty layers never reach the model, and an empty list is an empty prompt.
|
|
215
|
+
*/
|
|
216
|
+
function composeLayers(layers, onDiagnostic) {
|
|
217
|
+
const stated = layers.filter((layer) => layer.content.trim().length > 0);
|
|
218
|
+
if (stated.length === 0) {
|
|
219
|
+
return '';
|
|
220
|
+
}
|
|
221
|
+
const monitor = new PromptSizeMonitor();
|
|
222
|
+
const checkResult = monitor.check([...stated]);
|
|
223
|
+
if (checkResult.warning) {
|
|
224
|
+
onDiagnostic?.(checkResult.warning);
|
|
225
|
+
}
|
|
226
|
+
let effective = stated;
|
|
227
|
+
if (!checkResult.withinBudget) {
|
|
228
|
+
const { layers: trimmed, result } = monitor.enforce([...stated]);
|
|
229
|
+
if (result.truncatedLayers.length > 0) {
|
|
230
|
+
onDiagnostic?.(`Truncated layers: ${result.truncatedLayers.join(', ')}`);
|
|
231
|
+
}
|
|
232
|
+
effective = trimmed;
|
|
233
|
+
}
|
|
234
|
+
return effective
|
|
235
|
+
.filter((layer) => layer.content.length > 0)
|
|
236
|
+
.map((layer) => layer.content)
|
|
237
|
+
.join(exports.PROMPT_LAYER_SEPARATOR);
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=prompt-layers.js.map
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
import type { SubagentBridge, SubagentBridgeRequest } from './subagent-bridge.js';
|
|
3
|
+
import type { SubagentEvent } from './drivers/codex-app-server-process.js';
|
|
4
|
+
export type { SubagentBridge, SubagentBridgeRequest } from './subagent-bridge.js';
|
|
5
|
+
export type { SubagentEvent } from './drivers/codex-app-server-process.js';
|
|
6
|
+
import type { PromptCallbacks as ClaudePromptCallbacks, PromptResult as ClaudePromptResult } from './drivers/types.js';
|
|
7
|
+
import type { IModelRunner, RunnerMetrics, PromptOptions, SessionPolicyStatus, NativeInputReceipt } from './drivers/types.js';
|
|
8
|
+
import { type CodexAuxiliaryToolPolicy } from './drivers/codex-auxiliary-tools.js';
|
|
9
|
+
export interface AgentRuntimeProcess {
|
|
10
|
+
sendMessage(content: string, callbacks?: ClaudePromptCallbacks): Promise<ClaudePromptResult>;
|
|
11
|
+
isReady(): boolean;
|
|
12
|
+
stop(): void | Promise<void>;
|
|
13
|
+
getSessionId?(): string;
|
|
14
|
+
on(event: 'idle' | 'close' | 'error', listener: (...args: unknown[]) => void): this;
|
|
15
|
+
}
|
|
16
|
+
export interface CodexRuntimeProcessOptions {
|
|
17
|
+
defaultSessionKey?: string;
|
|
18
|
+
model?: string;
|
|
19
|
+
systemPrompt?: string;
|
|
20
|
+
cwd?: string;
|
|
21
|
+
sandbox?: 'read-only' | 'workspace-write' | 'danger-full-access';
|
|
22
|
+
requestTimeout?: number;
|
|
23
|
+
codexHome?: string;
|
|
24
|
+
isolatedHome?: string;
|
|
25
|
+
registryRoot?: string;
|
|
26
|
+
mcpConfigPath?: string;
|
|
27
|
+
command?: string;
|
|
28
|
+
/** Where this consumer's Codex CLI keeps its credential. The driver copies, never finds. */
|
|
29
|
+
authSourcePath?: string;
|
|
30
|
+
/** Managed Codex `model_reasoning_effort`; unset means the built-in default. */
|
|
31
|
+
effort?: string;
|
|
32
|
+
/** Enable the managed workspace shell; disabled unless the consumer opts in. */
|
|
33
|
+
shellTool?: boolean;
|
|
34
|
+
/** Enable live web search; disabled unless the consumer opts in. */
|
|
35
|
+
webSearch?: boolean;
|
|
36
|
+
/** Explicit shell environment overrides supplied by the consumer. */
|
|
37
|
+
shellEnvironment?: Record<string, string>;
|
|
38
|
+
/** Complete backend environment; omitted retains normal process inheritance. */
|
|
39
|
+
processEnv?: NodeJS.ProcessEnv;
|
|
40
|
+
/** Absolute credential paths the native command sandbox must not read. */
|
|
41
|
+
deniedReadPaths?: string[];
|
|
42
|
+
allowLoginShell?: boolean;
|
|
43
|
+
auxiliaryToolPolicy?: CodexAuxiliaryToolPolicy;
|
|
44
|
+
/**
|
|
45
|
+
* Root the driver keeps its files under. The caller names it: a runtime process
|
|
46
|
+
* does not know which product it is running inside.
|
|
47
|
+
*/
|
|
48
|
+
hostRootDir: string;
|
|
49
|
+
/**
|
|
50
|
+
* Host factory for a child-scoped authority (own model run, own envelope, own bridge).
|
|
51
|
+
* Forwarded verbatim: a Codex-native child outlives the parent turn and must never
|
|
52
|
+
* inherit the parent's expiring grant.
|
|
53
|
+
*/
|
|
54
|
+
createSubagentBridge?: (info: SubagentBridgeRequest) => Promise<SubagentBridge | null>;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Session-persistent Codex wrapper with the same minimal contract used by
|
|
58
|
+
* multi-agent runtime (sendMessage/isReady/stop + idle events).
|
|
59
|
+
*
|
|
60
|
+
* Implements both AgentRuntimeProcess (multi-agent) and IModelRunner (agent-loop).
|
|
61
|
+
* Uses one Codex app-server connection and multiplexes durable threads by
|
|
62
|
+
* session key. Different sessions may run concurrently; turns for the same
|
|
63
|
+
* session are serialized by CodexAppServerProcess.
|
|
64
|
+
*/
|
|
65
|
+
export declare class CodexRuntimeProcess extends EventEmitter implements AgentRuntimeProcess, IModelRunner {
|
|
66
|
+
readonly backendType: "codex";
|
|
67
|
+
/** codex app-server spawns native subagents and reports the spawn via onSubagentStart. */
|
|
68
|
+
readonly supportsNativeSubagents = true;
|
|
69
|
+
private readonly options;
|
|
70
|
+
private readonly appServer;
|
|
71
|
+
private readonly auxiliaryToolBridge;
|
|
72
|
+
private defaultSessionKey;
|
|
73
|
+
private systemPrompt;
|
|
74
|
+
private stopped;
|
|
75
|
+
private activeRequests;
|
|
76
|
+
private subagentCompletionAcceptance;
|
|
77
|
+
private subagentCompletionAcceptanceRequired;
|
|
78
|
+
private _requestCount;
|
|
79
|
+
private _failureCount;
|
|
80
|
+
private _totalLatencyMs;
|
|
81
|
+
private _lastRequestAt;
|
|
82
|
+
constructor(options: CodexRuntimeProcessOptions);
|
|
83
|
+
/** Synchronous durable acceptance of child completion, before driver cleanup. */
|
|
84
|
+
registerSubagentCompletionAcceptance(accept: (event: SubagentEvent) => void): () => void;
|
|
85
|
+
prompt(content: string, callbacks?: ClaudePromptCallbacks, options?: PromptOptions): Promise<ClaudePromptResult>;
|
|
86
|
+
steer(content: string, target: NativeInputReceipt, options?: Pick<PromptOptions, 'sessionKey' | 'sessionId'> & {
|
|
87
|
+
beforeSend?: () => void;
|
|
88
|
+
}): Promise<NativeInputReceipt>;
|
|
89
|
+
getSessionPolicyStatus(options: PromptOptions): SessionPolicyStatus;
|
|
90
|
+
resetSession(sessionId?: string, sessionKey?: string): Promise<void>;
|
|
91
|
+
sendMessage(content: string, callbacks?: ClaudePromptCallbacks): Promise<ClaudePromptResult>;
|
|
92
|
+
private execute;
|
|
93
|
+
private notifyError;
|
|
94
|
+
setSessionId(id: string): void;
|
|
95
|
+
setSystemPrompt(prompt: string): void;
|
|
96
|
+
isReady(): boolean;
|
|
97
|
+
isHealthy(): boolean;
|
|
98
|
+
getMetrics(): RunnerMetrics;
|
|
99
|
+
stop(): Promise<void>;
|
|
100
|
+
getSessionId(): string;
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=runtime-process.d.ts.map
|