@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,396 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Persistent CLI Adapter - Wraps PersistentClaudeProcess with ClaudeCLIWrapper interface
|
|
4
|
+
*
|
|
5
|
+
* WHY THIS EXISTS:
|
|
6
|
+
* - PersistentClaudeProcess uses stream-json for efficient multi-turn conversations
|
|
7
|
+
* - AgentLoop expects ClaudeCLIWrapper interface (prompt, setSessionId, setSystemPrompt)
|
|
8
|
+
* - This adapter bridges the two, enabling drop-in replacement
|
|
9
|
+
*
|
|
10
|
+
* KEY OPTIMIZATION:
|
|
11
|
+
* - Tool results sent via stdin (tool_result message)
|
|
12
|
+
* - Claude context preserved without re-sending full history
|
|
13
|
+
* - System prompt sent only once at process start
|
|
14
|
+
*/
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.PersistentCLIAdapter = void 0;
|
|
17
|
+
exports.createPersistentCLIAdapter = createPersistentCLIAdapter;
|
|
18
|
+
const events_1 = require("events");
|
|
19
|
+
const persistent_cli_process_js_1 = require("./persistent-cli-process.js");
|
|
20
|
+
const types_js_1 = require("./types.js");
|
|
21
|
+
/**
|
|
22
|
+
* PersistentCLIAdapter - Drop-in replacement for ClaudeCLIWrapper
|
|
23
|
+
*
|
|
24
|
+
* Implements the same interface but uses persistent CLI processes under the hood.
|
|
25
|
+
* This enables efficient multi-turn conversations without re-sending system prompts.
|
|
26
|
+
*/
|
|
27
|
+
class PersistentCLIAdapter extends events_1.EventEmitter {
|
|
28
|
+
backendType = 'claude';
|
|
29
|
+
/**
|
|
30
|
+
* The CLI's own delegation: `Agent` with `run_in_background: true`. The parent stream
|
|
31
|
+
* carries the spawn (`system/task_started` plus the launch tool_result that names the
|
|
32
|
+
* child), the child's tool calls, its final text, and the completion notification, so a
|
|
33
|
+
* spawn IS observable - PersistentClaudeProcess maps them and this adapter re-emits them
|
|
34
|
+
* as `subagent` events with the same shape the Codex runner uses.
|
|
35
|
+
*/
|
|
36
|
+
supportsNativeSubagents = true;
|
|
37
|
+
options;
|
|
38
|
+
processPool;
|
|
39
|
+
channelKey;
|
|
40
|
+
currentProcess = null;
|
|
41
|
+
currentProcessChannelKey = null;
|
|
42
|
+
pendingToolResults = new Map();
|
|
43
|
+
lastToolUseBlocks = [];
|
|
44
|
+
/** Processes whose subagent stream events are already wired to this adapter. */
|
|
45
|
+
wiredProcesses = new WeakSet();
|
|
46
|
+
initializedProcesses = new WeakSet();
|
|
47
|
+
// ─── Metrics tracking ───
|
|
48
|
+
_requestCount = 0;
|
|
49
|
+
_failureCount = 0;
|
|
50
|
+
_totalLatencyMs = 0;
|
|
51
|
+
_lastRequestAt = null;
|
|
52
|
+
constructor(options) {
|
|
53
|
+
super();
|
|
54
|
+
this.options = { ...options };
|
|
55
|
+
this.channelKey = options.sessionId || 'default';
|
|
56
|
+
this.processPool = new persistent_cli_process_js_1.PersistentProcessPool({
|
|
57
|
+
workspaceDir: options.workspaceDir,
|
|
58
|
+
model: options.model,
|
|
59
|
+
systemPrompt: options.systemPrompt,
|
|
60
|
+
mcpConfigPath: options.mcpConfigPath,
|
|
61
|
+
dangerouslySkipPermissions: options.dangerouslySkipPermissions,
|
|
62
|
+
permissionMode: options.permissionMode,
|
|
63
|
+
env: options.env,
|
|
64
|
+
processEnv: options.processEnv,
|
|
65
|
+
useGatewayTools: options.useGatewayTools,
|
|
66
|
+
requestTimeout: options.requestTimeout,
|
|
67
|
+
tools: options.tools,
|
|
68
|
+
// Adaptive thinking effort (agent.effort) reaches the CLI as --effort.
|
|
69
|
+
effort: options.effort,
|
|
70
|
+
pluginDir: options.pluginDir,
|
|
71
|
+
allowedTools: options.allowedTools,
|
|
72
|
+
disallowedTools: options.disallowedTools,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Send a prompt to Claude
|
|
77
|
+
*
|
|
78
|
+
* This method:
|
|
79
|
+
* 1. Gets or creates a persistent process for this channel
|
|
80
|
+
* 2. Sends the message via stdin
|
|
81
|
+
* 3. Parses the response from stdout
|
|
82
|
+
* 4. Returns PromptResult compatible with ClaudeCLIWrapper
|
|
83
|
+
*/
|
|
84
|
+
async prompt(content, callbacks, options) {
|
|
85
|
+
// Get or create process for this channel
|
|
86
|
+
// NOTE: Do NOT pass sessionId to the process opts. The pool generates fresh randomUUID()
|
|
87
|
+
// for --session-id. Passing the SessionPool UUID would cause Claude CLI to reload disk
|
|
88
|
+
// history on process restart, leading to "Prompt is too long" errors when accumulated
|
|
89
|
+
// context exceeds the window. options.sessionId is the pool ROUTING key only.
|
|
90
|
+
const channelKey = options?.sessionId ?? options?.sessionKey ?? this.channelKey;
|
|
91
|
+
const proc = await this.processPool.getProcess(channelKey, {
|
|
92
|
+
model: options?.model || this.options.model,
|
|
93
|
+
systemPrompt: options?.systemPrompt ?? this.options.systemPrompt,
|
|
94
|
+
dangerouslySkipPermissions: this.options.dangerouslySkipPermissions,
|
|
95
|
+
permissionMode: this.options.permissionMode,
|
|
96
|
+
useGatewayTools: this.options.useGatewayTools,
|
|
97
|
+
allowedTools: options?.allowedTools || this.options.allowedTools,
|
|
98
|
+
disallowedTools: options?.disallowedTools || this.options.disallowedTools,
|
|
99
|
+
// Per-call role projection of the CLI builtin set; '' is a real grant
|
|
100
|
+
// (no builtins), so only nullish falls back to the pool default.
|
|
101
|
+
tools: options?.tools ?? this.options.tools,
|
|
102
|
+
// Coalesce to the adapter default so an absent per-call value never nulls
|
|
103
|
+
// out the pool's construction-time requestTimeout (chat runs keep it).
|
|
104
|
+
requestTimeout: options?.requestTimeout ?? this.options.requestTimeout,
|
|
105
|
+
policyFingerprint: options?.sessionPolicyFingerprint,
|
|
106
|
+
env: { ...this.options.env, MAMA_HOOK_FEATURES: 'rules,agents' },
|
|
107
|
+
});
|
|
108
|
+
// Keep the legacy accessor pointing at the most recent process, but NEVER
|
|
109
|
+
// dereference this.currentProcess inside prompt() - concurrent calls race it.
|
|
110
|
+
this.currentProcess = proc;
|
|
111
|
+
this.currentProcessChannelKey = channelKey;
|
|
112
|
+
this.wireSubagentEvents(proc, channelKey);
|
|
113
|
+
// Pending tool results belong to the legacy single-channel path; only flush
|
|
114
|
+
// them when this call routes to that same channel - flushing them into an
|
|
115
|
+
// arbitrary per-call session would misdeliver them.
|
|
116
|
+
if (channelKey === this.channelKey && this.pendingToolResults.size > 0) {
|
|
117
|
+
// Verify the process is still alive before sending stale tool results
|
|
118
|
+
// If the process was replaced (e.g., crashed and restarted), pending results are invalid
|
|
119
|
+
if (!proc.isAlive()) {
|
|
120
|
+
console.warn(`[PersistentAdapter] Process not alive, discarding ${this.pendingToolResults.size} pending tool results`);
|
|
121
|
+
this.pendingToolResults.clear();
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
// Send tool results before the new message
|
|
125
|
+
for (const [toolUseId, { result, isError }] of this.pendingToolResults) {
|
|
126
|
+
try {
|
|
127
|
+
console.log(`[PersistentAdapter] Sending pending tool_result: ${toolUseId}`);
|
|
128
|
+
await proc.sendToolResult(toolUseId, result, isError);
|
|
129
|
+
}
|
|
130
|
+
catch (err) {
|
|
131
|
+
console.error(`[PersistentAdapter] Failed to send tool_result ${toolUseId}:`, err);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
this.pendingToolResults.clear();
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
// Send the user message with metrics tracking
|
|
138
|
+
const startTime = Date.now();
|
|
139
|
+
this._requestCount++;
|
|
140
|
+
this._lastRequestAt = startTime;
|
|
141
|
+
let latencyRecorded = false;
|
|
142
|
+
const recordLatency = () => {
|
|
143
|
+
if (!latencyRecorded) {
|
|
144
|
+
latencyRecorded = true;
|
|
145
|
+
this._totalLatencyMs += Date.now() - startTime;
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
try {
|
|
149
|
+
let prompt = content;
|
|
150
|
+
if (options?.preparePrompt) {
|
|
151
|
+
try {
|
|
152
|
+
prompt = await options.preparePrompt({
|
|
153
|
+
sessionId: proc.getSessionId(),
|
|
154
|
+
isNewSession: !this.initializedProcesses.has(proc),
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
if (!this.initializedProcesses.has(proc))
|
|
159
|
+
this.processPool.retireProcess(channelKey, proc);
|
|
160
|
+
throw error;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// sendMessage can start a dead process for legacy callers. A prepared turn
|
|
164
|
+
// must instead rebuild its context for the replacement before dispatch.
|
|
165
|
+
if (!proc.isAlive())
|
|
166
|
+
throw new types_js_1.NativeSessionUnavailableError('Claude process died while preparing input');
|
|
167
|
+
const result = await proc.sendMessage(prompt, {
|
|
168
|
+
...callbacks,
|
|
169
|
+
onAccepted: (receipt) => {
|
|
170
|
+
this.initializedProcesses.add(proc);
|
|
171
|
+
callbacks?.onAccepted?.(receipt);
|
|
172
|
+
},
|
|
173
|
+
}, options?.nativeInputId);
|
|
174
|
+
this.initializedProcesses.add(proc);
|
|
175
|
+
recordLatency();
|
|
176
|
+
// Track tool use blocks for potential tool result sending
|
|
177
|
+
this.lastToolUseBlocks = result.toolUseBlocks || [];
|
|
178
|
+
return result;
|
|
179
|
+
}
|
|
180
|
+
catch (err) {
|
|
181
|
+
this._failureCount++;
|
|
182
|
+
recordLatency();
|
|
183
|
+
if (err instanceof types_js_1.ClaudeToolStreamProtocolError) {
|
|
184
|
+
this.processPool.retireProcess(channelKey, proc);
|
|
185
|
+
}
|
|
186
|
+
throw err;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
// ─── Native background Agent (delegation) observation ────────────────────
|
|
190
|
+
/**
|
|
191
|
+
* Re-emit one process's background-Agent stream events as runner-level events.
|
|
192
|
+
*
|
|
193
|
+
* `subagent` carries the SAME shape the Codex runner emits, so
|
|
194
|
+
* `attachSubagentWake` works unchanged. A completion the CLI answered with its own
|
|
195
|
+
* follow-up turn is emitted as `subagentObserved` instead: that turn IS the owner
|
|
196
|
+
* reacting, and a host wake on top of it would be a second turn for one child.
|
|
197
|
+
*/
|
|
198
|
+
wireSubagentEvents(proc, channelKey) {
|
|
199
|
+
if (this.wiredProcesses.has(proc))
|
|
200
|
+
return;
|
|
201
|
+
// Structural test doubles stand in for the pooled process and carry neither the emitter
|
|
202
|
+
// nor the background-agent accessor. Nothing to observe there.
|
|
203
|
+
if (typeof proc.on !== 'function' ||
|
|
204
|
+
typeof proc.hasLiveBackgroundAgents !== 'function') {
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
this.wiredProcesses.add(proc);
|
|
208
|
+
proc.on('subagent', (event) => {
|
|
209
|
+
const translated = {
|
|
210
|
+
kind: event.kind,
|
|
211
|
+
sessionKey: channelKey,
|
|
212
|
+
parentThreadId: proc.getSessionId(),
|
|
213
|
+
agentThreadId: event.agentThreadId,
|
|
214
|
+
agentPath: event.agentPath,
|
|
215
|
+
...(event.status ? { status: event.status } : {}),
|
|
216
|
+
...(event.finalText ? { finalText: event.finalText } : {}),
|
|
217
|
+
};
|
|
218
|
+
if (event.kind === 'completed') {
|
|
219
|
+
if (!event.wakeRequired) {
|
|
220
|
+
console.log(`[PersistentAdapter] subagent ${event.agentThreadId} finished; the CLI's own ` +
|
|
221
|
+
'turn carries the wake');
|
|
222
|
+
this.emit('subagentObserved', translated);
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
this.emit('subagent', translated);
|
|
227
|
+
});
|
|
228
|
+
proc.on('autonomousTurn', (event) => {
|
|
229
|
+
this.emit('autonomousTurn', { ...event, sessionKey: channelKey });
|
|
230
|
+
});
|
|
231
|
+
proc.on('autonomousTurnResult', (event) => {
|
|
232
|
+
this.emit('autonomousTurnResult', { ...event, sessionKey: channelKey });
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Send a tool result back to Claude
|
|
237
|
+
*
|
|
238
|
+
* This is a new method not in ClaudeCLIWrapper that enables efficient tool loops.
|
|
239
|
+
* Instead of rebuilding the full history, we send just the tool result.
|
|
240
|
+
*/
|
|
241
|
+
async sendToolResult(toolUseId, result, isError = false, callbacks) {
|
|
242
|
+
if (!this.currentProcess || !this.currentProcess.isAlive()) {
|
|
243
|
+
throw new Error('No active process to send tool result to');
|
|
244
|
+
}
|
|
245
|
+
return this.currentProcess.sendToolResult(toolUseId, result, isError, callbacks);
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Queue a tool result to be sent with the next message
|
|
249
|
+
*
|
|
250
|
+
* Use this when you want to collect multiple tool results before continuing.
|
|
251
|
+
*/
|
|
252
|
+
queueToolResult(toolUseId, result, isError = false) {
|
|
253
|
+
this.pendingToolResults.set(toolUseId, { result, isError });
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Check if there are pending tool results
|
|
257
|
+
*/
|
|
258
|
+
hasPendingToolResults() {
|
|
259
|
+
return this.pendingToolResults.size > 0;
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Get the last tool use blocks from the most recent response
|
|
263
|
+
*/
|
|
264
|
+
getLastToolUseBlocks() {
|
|
265
|
+
return this.lastToolUseBlocks;
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Get current session ID
|
|
269
|
+
*/
|
|
270
|
+
getSessionId() {
|
|
271
|
+
return this.options.sessionId || this.channelKey;
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Create a new session (creates new process)
|
|
275
|
+
*/
|
|
276
|
+
resetSession(sessionId = this.channelKey) {
|
|
277
|
+
this.processPool.stopProcess(sessionId);
|
|
278
|
+
if (this.currentProcessChannelKey === sessionId) {
|
|
279
|
+
this.currentProcess = null;
|
|
280
|
+
this.currentProcessChannelKey = null;
|
|
281
|
+
this.lastToolUseBlocks = [];
|
|
282
|
+
}
|
|
283
|
+
if (sessionId === this.channelKey) {
|
|
284
|
+
this.pendingToolResults.clear();
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Set session ID (for channel-specific conversations)
|
|
289
|
+
*
|
|
290
|
+
* Note: This creates a new channel key, effectively switching channels.
|
|
291
|
+
* The old process is kept alive for potential reuse.
|
|
292
|
+
* Callers should use resetSession() if the old process is no longer needed to avoid orphan processes.
|
|
293
|
+
*
|
|
294
|
+
* @deprecated - per-call sessionId via prompt() options; this mutates shared adapter state
|
|
295
|
+
*/
|
|
296
|
+
setSessionId(sessionId) {
|
|
297
|
+
this.options.sessionId = sessionId;
|
|
298
|
+
this.channelKey = sessionId;
|
|
299
|
+
// Don't stop the old process - it might be reused
|
|
300
|
+
this.currentProcess = null;
|
|
301
|
+
this.currentProcessChannelKey = null;
|
|
302
|
+
this.pendingToolResults.clear();
|
|
303
|
+
this.lastToolUseBlocks = [];
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Set system prompt
|
|
307
|
+
*
|
|
308
|
+
* IMPORTANT: This only affects new processes. Existing processes keep their prompt.
|
|
309
|
+
* To apply a new system prompt, call resetSession() after setSystemPrompt().
|
|
310
|
+
*
|
|
311
|
+
* @deprecated - mutates shared spawn state; pass systemPrompt per prompt() call
|
|
312
|
+
*/
|
|
313
|
+
setSystemPrompt(prompt) {
|
|
314
|
+
this.options.systemPrompt = prompt;
|
|
315
|
+
// Note: Existing process is NOT updated
|
|
316
|
+
// This matches ClaudeCLIWrapper behavior (system prompt is per-process)
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Get current options (for debugging)
|
|
320
|
+
*/
|
|
321
|
+
getOptions() {
|
|
322
|
+
return { ...this.options };
|
|
323
|
+
}
|
|
324
|
+
getSessionPolicyStatus(options) {
|
|
325
|
+
const channelKey = options.sessionId ?? options.sessionKey ?? this.channelKey;
|
|
326
|
+
return this.processPool.getSessionPolicyStatus(channelKey, options.sessionPolicyFingerprint);
|
|
327
|
+
}
|
|
328
|
+
// ─── IModelRunner implementation ─────────────────────────────────────────
|
|
329
|
+
/**
|
|
330
|
+
* Check if the adapter has a live process ready to accept prompts.
|
|
331
|
+
*/
|
|
332
|
+
isHealthy() {
|
|
333
|
+
if (!this.currentProcess)
|
|
334
|
+
return true; // no process yet = can create on demand
|
|
335
|
+
return this.currentProcess.isAlive();
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Collect runtime metrics.
|
|
339
|
+
*/
|
|
340
|
+
getMetrics() {
|
|
341
|
+
return {
|
|
342
|
+
requestCount: this._requestCount,
|
|
343
|
+
failureCount: this._failureCount,
|
|
344
|
+
avgLatencyMs: this._requestCount > 0 ? Math.round(this._totalLatencyMs / this._requestCount) : 0,
|
|
345
|
+
lastRequestAt: this._lastRequestAt,
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Gracefully stop all processes (IModelRunner.stop).
|
|
350
|
+
*/
|
|
351
|
+
stop() {
|
|
352
|
+
this.stopAll();
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Stop all processes (cleanup) — legacy name, delegates to stop().
|
|
356
|
+
*/
|
|
357
|
+
stopAll() {
|
|
358
|
+
this.processPool.stopAll();
|
|
359
|
+
this.currentProcess = null;
|
|
360
|
+
this.currentProcessChannelKey = null;
|
|
361
|
+
this.pendingToolResults.clear();
|
|
362
|
+
this.lastToolUseBlocks = [];
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Check if the adapter is in persistent mode (always true for this adapter)
|
|
366
|
+
*/
|
|
367
|
+
isPersistent() {
|
|
368
|
+
return true;
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* Get the current process state
|
|
372
|
+
*/
|
|
373
|
+
getProcessState() {
|
|
374
|
+
return this.currentProcess?.getState() || 'no_process';
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Get number of active processes in the pool
|
|
378
|
+
*/
|
|
379
|
+
getActiveProcessCount() {
|
|
380
|
+
return this.processPool.getActiveCount();
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
exports.PersistentCLIAdapter = PersistentCLIAdapter;
|
|
384
|
+
/**
|
|
385
|
+
* Factory function to create a ClaudeCLIWrapper-compatible adapter
|
|
386
|
+
*
|
|
387
|
+
* Usage:
|
|
388
|
+
* const wrapper = createPersistentCLIAdapter({ sessionId: 'discord-channel-123' });
|
|
389
|
+
* const result = await wrapper.prompt('Hello!');
|
|
390
|
+
*
|
|
391
|
+
* Each adapter instance maintains its own process pool. Processes are not shared across adapter instances.
|
|
392
|
+
*/
|
|
393
|
+
function createPersistentCLIAdapter(options) {
|
|
394
|
+
return new PersistentCLIAdapter(options);
|
|
395
|
+
}
|
|
396
|
+
//# sourceMappingURL=persistent-cli-adapter.js.map
|