@jungjaehoon/mama-core 2.4.1 → 4.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +76 -239
- package/db/migrations/030-case-first-memory-substrate.sql +13 -98
- package/db/migrations/034-add-connector-event-scope-columns.sql +9 -13
- package/db/migrations/039-add-connector-event-operator-ingest-seq.sql +9 -95
- package/db/migrations/062-refresh-connector-event-sequences.sql +9 -113
- package/db/migrations/063-refresh-legacy-connector-event-updates.sql +9 -32
- package/db/migrations/067-add-connector-event-source-entity-id.sql +9 -13
- package/db/migrations/069-create-registry-nodes.sql +52 -0
- package/db/migrations/070-record-identity.sql +35 -0
- package/db/migrations/071-service-operation-origins.sql +187 -0
- package/db/migrations/072-observation-versions.sql +29 -0
- package/db/migrations/073-registry-corrections.sql +45 -0
- package/db/migrations/074-work-graph-ref-kinds.sql +39 -0
- package/db/migrations/075-agent-judgments.sql +58 -0
- package/db/migrations/076-scoped-checkpoint-bindings.sql +15 -0
- package/db/migrations/077-legacy-record-kind.sql +6 -0
- package/db/migrations/078-source-ingest-commands.sql +18 -0
- package/db/migrations/079-twin-edge-relations.sql +43 -0
- package/db/migrations/080-restore-duration-days.sql +7 -0
- package/db/migrations/081-mailbox.sql +61 -0
- package/db/migrations/082-commitments-row-id.sql +12 -0
- package/db/migrations/083-observation-is-the-evidence.sql +49 -0
- package/db/migrations/084-scope-kind-is-not-the-cores-to-list.sql +34 -0
- package/db/migrations/085-a-migration-has-a-source.sql +37 -0
- package/db/migrations/086-the-mailbox-is-generic.sql +110 -0
- package/db/migrations/087-mailbox-payload.sql +5 -0
- package/db/migrations/088-native-input-journal.sql +14 -0
- package/db/migrations/089-native-turn-receipt-lookup.sql +3 -0
- package/db/migrations/090-model-run-native-inputs.sql +29 -0
- package/db/migrations/091-native-turn-results.sql +11 -0
- package/db/migrations/092-restore-decision-fts.sql +34 -0
- package/db/migrations/093-native-turn-primary-kind.sql +14 -0
- package/db/migrations/094-commitment-run-provenance.sql +9 -0
- package/db/migrations/095-model-run-native-input-identity.sql +39 -0
- package/db/migrations/096-drop-connector-event-index-fts.sql +9 -0
- package/db/migrations/097-native-input-json-validity.sql +37 -0
- package/db/migrations/098-workflow-memory-kind.sql +105 -0
- package/db/migrations/099-commitment-revision-graph.sql +2 -0
- package/dist/action-contracts.d.ts +212 -0
- package/dist/action-contracts.js +10 -0
- package/dist/api/catalog.d.ts +118 -0
- package/dist/api/catalog.js +1756 -0
- package/dist/api/dispatch.d.ts +76 -0
- package/dist/api/dispatch.js +372 -0
- package/dist/canonicalize.d.ts +2 -2
- package/dist/canonicalize.js +3 -3
- package/dist/client/client.d.ts +33 -0
- package/dist/client/client.js +123 -0
- package/dist/client/ipc.d.ts +81 -0
- package/dist/client/ipc.js +314 -0
- package/dist/db-adapter/base-adapter.d.ts +6 -66
- package/dist/db-adapter/base-adapter.js +6 -6
- package/dist/db-adapter/index.d.ts +5 -5
- package/dist/db-adapter/index.js +2 -5
- package/dist/db-adapter/node-sqlite-adapter.d.ts +85 -15
- package/dist/db-adapter/node-sqlite-adapter.js +1985 -570
- package/dist/db-manager.d.ts +53 -97
- package/dist/db-manager.js +121 -603
- package/dist/embedding/embedder.d.ts +132 -0
- package/dist/embedding/embedder.js +299 -0
- package/dist/identity/principal-repository.d.ts +2 -2
- package/dist/index.d.ts +43 -58
- package/dist/index.js +97 -145
- package/dist/{context-compile/channel-grant.d.ts → knowledge/access.d.ts} +12 -17
- package/dist/knowledge/access.js +663 -0
- package/dist/knowledge/case-errors.d.ts +31 -0
- package/dist/knowledge/case-errors.js +40 -0
- package/dist/{cases/search-rollup.d.ts → knowledge/case-search-rollup.d.ts} +5 -4
- package/dist/{cases/search-rollup.js → knowledge/case-search-rollup.js} +6 -8
- package/dist/{cases/store.d.ts → knowledge/case-store.d.ts} +3 -6
- package/dist/{cases/store.js → knowledge/case-store.js} +7 -42
- package/dist/{cases/timeline-range.d.ts → knowledge/case-timeline-range.d.ts} +3 -3
- package/dist/{cases/timeline-range.js → knowledge/case-timeline-range.js} +47 -25
- package/dist/{cases/types.d.ts → knowledge/case-types.d.ts} +8 -2
- package/dist/{cases/types.js → knowledge/case-types.js} +1 -1
- package/dist/knowledge/commitment-revision-migration.d.ts +4 -0
- package/dist/knowledge/commitment-revision-migration.js +50 -0
- package/dist/knowledge/commitments.d.ts +192 -0
- package/dist/knowledge/commitments.js +386 -0
- package/dist/knowledge/decision-edges.d.ts +70 -0
- package/dist/knowledge/decision-edges.js +123 -0
- package/dist/{agent-graph/types.d.ts → knowledge/graph-query.d.ts} +80 -70
- package/dist/knowledge/graph-query.js +1585 -0
- package/dist/knowledge/identity.d.ts +16 -0
- package/dist/knowledge/identity.js +22 -0
- package/dist/knowledge/index.d.ts +47 -0
- package/dist/knowledge/index.js +90 -0
- package/dist/knowledge/judgment-edge.d.ts +6 -0
- package/dist/knowledge/judgment-edge.js +22 -0
- package/dist/knowledge/judgments.d.ts +118 -0
- package/dist/knowledge/judgments.js +802 -0
- package/dist/knowledge/observations.d.ts +160 -0
- package/dist/knowledge/observations.js +449 -0
- package/dist/knowledge/question-type.d.ts +34 -0
- package/dist/knowledge/question-type.js +70 -0
- package/dist/{search → knowledge}/ranker-features.js +1 -1
- package/dist/{search → knowledge}/search-quality.d.ts +0 -1
- package/dist/knowledge/search.d.ts +38 -0
- package/dist/knowledge/search.js +91 -0
- package/dist/knowledge/source-ingest.d.ts +65 -0
- package/dist/knowledge/source-ingest.js +174 -0
- package/dist/{edges/types.d.ts → knowledge/twin-edge-types.d.ts} +31 -4
- package/dist/{edges/types.js → knowledge/twin-edge-types.js} +13 -2
- package/dist/knowledge/work-dates.d.ts +49 -0
- package/dist/knowledge/work-dates.js +120 -0
- package/dist/mama-api.d.ts +114 -778
- package/dist/mama-api.js +313 -2461
- package/dist/memory/api.d.ts +264 -24
- package/dist/memory/api.js +1633 -843
- package/dist/memory/bootstrap-builder.d.ts +2 -1
- package/dist/memory/bootstrap-builder.js +5 -5
- package/dist/memory/channel-summary-state-store.d.ts +3 -2
- package/dist/memory/channel-summary-state-store.js +53 -51
- package/dist/memory/channel-summary-store.d.ts +5 -3
- package/dist/memory/channel-summary-store.js +3 -8
- package/dist/memory/dashboard-read.d.ts +46 -0
- package/dist/memory/dashboard-read.js +94 -0
- package/dist/memory/event-store.d.ts +3 -3
- package/dist/memory/event-store.js +3 -10
- package/dist/memory/finding-store.d.ts +3 -2
- package/dist/memory/finding-store.js +2 -7
- package/dist/memory/graph-read.d.ts +52 -0
- package/dist/memory/graph-read.js +130 -0
- package/dist/memory/judgment-types.d.ts +394 -0
- package/dist/memory/judgment-types.js +16 -0
- package/dist/memory/provenance-audit.d.ts +5 -2
- package/dist/memory/provenance-audit.js +8 -14
- package/dist/memory/provenance-live.d.ts +141 -0
- package/dist/memory/provenance-live.js +409 -0
- package/dist/memory/provenance-query.d.ts +5 -4
- package/dist/memory/provenance-query.js +21 -29
- package/dist/memory/provenance-resolver.d.ts +191 -0
- package/dist/memory/provenance-resolver.js +155 -0
- package/dist/memory/provenance.d.ts +1 -11
- package/dist/memory/provenance.js +2 -33
- package/dist/memory/recall-sanitize.d.ts +55 -0
- package/dist/memory/recall-sanitize.js +144 -0
- package/dist/memory/secret-filter.d.ts +32 -0
- package/dist/memory/secret-filter.js +126 -0
- package/dist/memory/truth-store.d.ts +2 -1
- package/dist/memory/truth-store.js +1 -4
- package/dist/memory/types.d.ts +74 -24
- package/dist/memory/types.js +75 -5
- package/dist/memory/write-adapters.d.ts +98 -0
- package/dist/memory/write-adapters.js +242 -0
- package/dist/operations/owner-action-effects.d.ts +53 -0
- package/dist/operations/owner-action-effects.js +96 -0
- package/dist/provenance/source-ref.d.ts +1 -1
- package/dist/provenance/source-ref.js +0 -2
- package/dist/registry/corrections.d.ts +31 -0
- package/dist/registry/corrections.js +332 -0
- package/dist/registry/record-identity.d.ts +49 -0
- package/dist/registry/record-identity.js +133 -0
- package/dist/registry/store.d.ts +101 -0
- package/dist/registry/store.js +395 -0
- package/dist/registry/types.d.ts +28 -0
- package/dist/registry/types.js +5 -0
- package/dist/relevance-scorer.js +2 -2
- package/dist/runtime/agent-event-bus.d.ts +50 -0
- package/dist/runtime/agent-event-bus.js +101 -0
- package/dist/runtime/drivers/claude-cli-wrapper.d.ts +152 -0
- package/dist/runtime/drivers/claude-cli-wrapper.js +375 -0
- package/dist/runtime/drivers/claude-effort.d.ts +4 -0
- package/dist/runtime/drivers/claude-effort.js +16 -0
- package/dist/runtime/drivers/cli-arg-redaction.d.ts +2 -0
- package/dist/runtime/drivers/cli-arg-redaction.js +18 -0
- package/dist/runtime/drivers/cli-secret-redaction.d.ts +17 -0
- package/dist/runtime/drivers/cli-secret-redaction.js +126 -0
- package/dist/runtime/drivers/codex-app-server-process.d.ts +277 -0
- package/dist/runtime/drivers/codex-app-server-process.js +2342 -0
- package/dist/runtime/drivers/codex-auxiliary-tools.d.ts +17 -0
- package/dist/runtime/drivers/codex-auxiliary-tools.js +267 -0
- package/dist/runtime/drivers/codex-home.d.ts +20 -0
- package/dist/runtime/drivers/codex-home.js +674 -0
- package/dist/runtime/drivers/codex-thread-registry.d.ts +63 -0
- package/dist/runtime/drivers/codex-thread-registry.js +433 -0
- package/dist/runtime/drivers/persistent-cli-adapter.d.ts +160 -0
- package/dist/runtime/drivers/persistent-cli-adapter.js +396 -0
- package/dist/runtime/drivers/persistent-cli-process.d.ts +425 -0
- package/dist/runtime/drivers/persistent-cli-process.js +1529 -0
- package/dist/runtime/drivers/types.d.ts +456 -0
- package/dist/runtime/drivers/types.js +110 -0
- package/dist/runtime/mailbox.d.ts +223 -0
- package/dist/runtime/mailbox.js +582 -0
- package/dist/runtime/model-run-store.d.ts +28 -0
- package/dist/{model-runs/store.js → runtime/model-run-store.js} +81 -41
- package/dist/{model-runs/types.d.ts → runtime/model-run-types.d.ts} +33 -4
- package/dist/{model-runs/types.js → runtime/model-run-types.js} +1 -1
- package/dist/runtime/native-effect-observer.d.ts +22 -0
- package/dist/runtime/native-effect-observer.js +103 -0
- package/dist/runtime/native-input-journal.d.ts +46 -0
- package/dist/runtime/native-input-journal.js +308 -0
- package/dist/runtime/native-prompt.d.ts +118 -0
- package/dist/runtime/native-prompt.js +496 -0
- package/dist/runtime/native-session.d.ts +10 -0
- package/dist/{agent-graph/index.js → runtime/native-session.js} +9 -6
- package/dist/runtime/native-tool-trace-observer.d.ts +5 -0
- package/dist/runtime/native-tool-trace-observer.js +65 -0
- package/dist/runtime/native-turn.d.ts +272 -0
- package/dist/runtime/native-turn.js +1041 -0
- package/dist/runtime/operations.d.ts +236 -0
- package/dist/runtime/operations.js +565 -0
- package/dist/runtime/post-tool-handler.d.ts +74 -0
- package/dist/runtime/post-tool-handler.js +137 -0
- package/dist/runtime/prompt-layers.d.ts +126 -0
- package/dist/runtime/prompt-layers.js +239 -0
- package/dist/runtime/runtime-process.d.ts +102 -0
- package/dist/runtime/runtime-process.js +206 -0
- package/dist/runtime/runtime.d.ts +278 -0
- package/dist/runtime/runtime.js +563 -0
- package/dist/runtime/session-pool.d.ts +176 -0
- package/dist/runtime/session-pool.js +369 -0
- package/dist/runtime/stimulus-payload.d.ts +5 -0
- package/dist/runtime/stimulus-payload.js +50 -0
- package/dist/runtime/subagent-bridge.d.ts +24 -0
- package/dist/{agent-graph/types.js → runtime/subagent-bridge.js} +1 -1
- package/dist/runtime/text-completion.d.ts +22 -0
- package/dist/{agent-situation/types.js → runtime/text-completion.js} +1 -1
- package/dist/runtime/token-estimator.d.ts +25 -0
- package/dist/runtime/token-estimator.js +75 -0
- package/dist/runtime/tool-trace-store.d.ts +22 -0
- package/dist/{model-runs → runtime}/tool-trace-store.js +46 -27
- package/dist/runtime/trace-summary.d.ts +5 -0
- package/dist/runtime/trace-summary.js +74 -0
- package/dist/runtime/turn-text.d.ts +23 -0
- package/dist/runtime/turn-text.js +41 -0
- package/dist/storage/database.d.ts +67 -0
- package/dist/storage/database.js +158 -0
- package/package.json +20 -34
- package/dist/agent-graph/alias-write.d.ts +0 -3
- package/dist/agent-graph/alias-write.js +0 -234
- package/dist/agent-graph/entity-resolve.d.ts +0 -3
- package/dist/agent-graph/entity-resolve.js +0 -271
- package/dist/agent-graph/errors.d.ts +0 -4
- package/dist/agent-graph/errors.js +0 -11
- package/dist/agent-graph/graph-query.d.ts +0 -5
- package/dist/agent-graph/graph-query.js +0 -360
- package/dist/agent-graph/index.d.ts +0 -6
- package/dist/agent-situation/builder.d.ts +0 -8
- package/dist/agent-situation/builder.js +0 -239
- package/dist/agent-situation/cache-key.d.ts +0 -4
- package/dist/agent-situation/cache-key.js +0 -64
- package/dist/agent-situation/index.d.ts +0 -7
- package/dist/agent-situation/index.js +0 -28
- package/dist/agent-situation/packet-store.d.ts +0 -27
- package/dist/agent-situation/packet-store.js +0 -228
- package/dist/agent-situation/ranking-policy.d.ts +0 -18
- package/dist/agent-situation/ranking-policy.js +0 -75
- package/dist/agent-situation/source-readers.d.ts +0 -52
- package/dist/agent-situation/source-readers.js +0 -300
- package/dist/agent-situation/types.d.ts +0 -195
- package/dist/cases/wiki-page-index.d.ts +0 -37
- package/dist/cases/wiki-page-index.js +0 -201
- package/dist/config-loader.d.ts +0 -68
- package/dist/config-loader.js +0 -239
- package/dist/connectors/event-index.d.ts +0 -24
- package/dist/connectors/event-index.js +0 -245
- package/dist/connectors/raw-query.d.ts +0 -40
- package/dist/connectors/raw-query.js +0 -412
- package/dist/connectors/types.d.ts +0 -117
- package/dist/connectors/types.js +0 -3
- package/dist/context-compile/boundary-defaults.d.ts +0 -12
- package/dist/context-compile/boundary-defaults.js +0 -105
- package/dist/context-compile/channel-grant.js +0 -66
- package/dist/context-compile/compiler-policy.d.ts +0 -39
- package/dist/context-compile/compiler-policy.js +0 -147
- package/dist/context-compile/compiler.d.ts +0 -18
- package/dist/context-compile/compiler.js +0 -404
- package/dist/context-compile/index.d.ts +0 -10
- package/dist/context-compile/index.js +0 -26
- package/dist/context-compile/packet-store.d.ts +0 -8
- package/dist/context-compile/packet-store.js +0 -239
- package/dist/context-compile/ref.d.ts +0 -7
- package/dist/context-compile/ref.js +0 -102
- package/dist/context-compile/source-readers.d.ts +0 -70
- package/dist/context-compile/source-readers.js +0 -840
- package/dist/context-compile/types.d.ts +0 -155
- package/dist/context-compile/types.js +0 -11
- package/dist/context-compile/visibility.d.ts +0 -21
- package/dist/context-compile/visibility.js +0 -224
- package/dist/decision-tracker.d.ts +0 -206
- package/dist/decision-tracker.js +0 -481
- package/dist/edges/ref-validation.d.ts +0 -7
- package/dist/edges/ref-validation.js +0 -321
- package/dist/edges/store.d.ts +0 -8
- package/dist/edges/store.js +0 -129
- package/dist/embedding-client.d.ts +0 -28
- package/dist/embedding-client.js +0 -53
- package/dist/embedding-server/index.d.ts +0 -67
- package/dist/embedding-server/index.js +0 -405
- package/dist/embedding-server/mobile/auth.d.ts +0 -44
- package/dist/embedding-server/mobile/auth.js +0 -150
- package/dist/embedding-server/mobile/daemon.d.ts +0 -129
- package/dist/embedding-server/mobile/daemon.js +0 -313
- package/dist/embedding-server/mobile/output-parser.d.ts +0 -115
- package/dist/embedding-server/mobile/output-parser.js +0 -241
- package/dist/embedding-server/mobile/session-api.d.ts +0 -57
- package/dist/embedding-server/mobile/session-api.js +0 -261
- package/dist/embedding-server/mobile/session-manager.d.ts +0 -138
- package/dist/embedding-server/mobile/session-manager.js +0 -378
- package/dist/embedding-server/mobile/websocket-handler.d.ts +0 -137
- package/dist/embedding-server/mobile/websocket-handler.js +0 -486
- package/dist/embeddings.d.ts +0 -68
- package/dist/embeddings.js +0 -244
- package/dist/entities/audit-metrics.d.ts +0 -68
- package/dist/entities/audit-metrics.js +0 -124
- package/dist/entities/candidate-generator.d.ts +0 -8
- package/dist/entities/candidate-generator.js +0 -24
- package/dist/entities/entity-linked-decision-counts.d.ts +0 -2
- package/dist/entities/entity-linked-decision-counts.js +0 -29
- package/dist/entities/entity-list.d.ts +0 -22
- package/dist/entities/entity-list.js +0 -3
- package/dist/entities/entity-orphan-list.d.ts +0 -17
- package/dist/entities/entity-orphan-list.js +0 -3
- package/dist/entities/entity-search.d.ts +0 -20
- package/dist/entities/entity-search.js +0 -3
- package/dist/entities/errors.d.ts +0 -55
- package/dist/entities/errors.js +0 -100
- package/dist/entities/lineage-store.d.ts +0 -28
- package/dist/entities/lineage-store.js +0 -204
- package/dist/entities/normalization.d.ts +0 -14
- package/dist/entities/normalization.js +0 -63
- package/dist/entities/policy-store.d.ts +0 -8
- package/dist/entities/policy-store.js +0 -75
- package/dist/entities/policy-types.d.ts +0 -72
- package/dist/entities/policy-types.js +0 -59
- package/dist/entities/projection.d.ts +0 -8
- package/dist/entities/projection.js +0 -82
- package/dist/entities/provenance-query.d.ts +0 -32
- package/dist/entities/provenance-query.js +0 -3
- package/dist/entities/read-identity.d.ts +0 -31
- package/dist/entities/read-identity.js +0 -264
- package/dist/entities/recall-bridge.d.ts +0 -5
- package/dist/entities/recall-bridge.js +0 -171
- package/dist/entities/resolution-engine.d.ts +0 -8
- package/dist/entities/resolution-engine.js +0 -3
- package/dist/entities/rollback-preview.d.ts +0 -35
- package/dist/entities/rollback-preview.js +0 -3
- package/dist/entities/source-locator.d.ts +0 -3
- package/dist/entities/source-locator.js +0 -32
- package/dist/entities/store.d.ts +0 -69
- package/dist/entities/store.js +0 -544
- package/dist/entities/types.d.ts +0 -166
- package/dist/entities/types.js +0 -30
- package/dist/memory/extraction-prompt.d.ts +0 -4
- package/dist/memory/extraction-prompt.js +0 -89
- package/dist/memory/scope-backfill.d.ts +0 -14
- package/dist/memory/scope-backfill.js +0 -3
- package/dist/memory/scope-store.d.ts +0 -4
- package/dist/memory/scope-store.js +0 -9
- package/dist/memory-store.d.ts +0 -87
- package/dist/memory-store.js +0 -78
- package/dist/model-runs/store.d.ts +0 -13
- package/dist/model-runs/tool-trace-store.d.ts +0 -8
- package/dist/notification-manager.d.ts +0 -7
- package/dist/notification-manager.js +0 -12
- package/dist/outcome-tracker.d.ts +0 -151
- package/dist/outcome-tracker.js +0 -271
- package/dist/query-intent.d.ts +0 -23
- package/dist/query-intent.js +0 -114
- package/dist/runtime/trusted-provenance.d.ts +0 -3
- package/dist/runtime/trusted-provenance.js +0 -6
- package/dist/search/question-type.d.ts +0 -5
- package/dist/search/question-type.js +0 -41
- package/dist/test-utils.d.ts +0 -80
- package/dist/test-utils.js +0 -218
- package/dist/tier-validator.d.ts +0 -43
- package/dist/tier-validator.js +0 -159
- package/dist/time-formatter.d.ts +0 -25
- package/dist/time-formatter.js +0 -93
- /package/dist/{search → knowledge}/feedback-store.d.ts +0 -0
- /package/dist/{search → knowledge}/feedback-store.js +0 -0
- /package/dist/{search → knowledge}/ranker-features.d.ts +0 -0
- /package/dist/{search → knowledge}/ranker-rescore.d.ts +0 -0
- /package/dist/{search → knowledge}/ranker-rescore.js +0 -0
- /package/dist/{search → knowledge}/ranker-trainer.d.ts +0 -0
- /package/dist/{search → knowledge}/ranker-trainer.js +0 -0
- /package/dist/{search → knowledge}/search-quality.js +0 -0
|
@@ -1,486 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* @fileoverview WebSocket Handler - MessageRouter-based real-time communication
|
|
4
|
-
* @module mobile/websocket-handler
|
|
5
|
-
* @version 2.0.0
|
|
6
|
-
*
|
|
7
|
-
* Handles WebSocket connections for mobile clients, using MessageRouter
|
|
8
|
-
* for unified message processing (same as Discord/Slack gateways).
|
|
9
|
-
*
|
|
10
|
-
* @example
|
|
11
|
-
* import { createWebSocketHandler } from './websocket-handler';
|
|
12
|
-
* const wsHandler = createWebSocketHandler({
|
|
13
|
-
* httpServer,
|
|
14
|
-
* messageRouter,
|
|
15
|
-
* sessionStore,
|
|
16
|
-
* authToken: process.env.MAMA_AUTH_TOKEN
|
|
17
|
-
* });
|
|
18
|
-
*/
|
|
19
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
20
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
21
|
-
};
|
|
22
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
-
exports.WebSocketHandler = void 0;
|
|
24
|
-
exports.createWebSocketHandler = createWebSocketHandler;
|
|
25
|
-
const ws_1 = require("ws");
|
|
26
|
-
const auth_js_1 = require("./auth.js");
|
|
27
|
-
const promises_1 = __importDefault(require("fs/promises"));
|
|
28
|
-
const path_1 = __importDefault(require("path"));
|
|
29
|
-
const os_1 = __importDefault(require("os"));
|
|
30
|
-
const debug_logger_js_1 = require("../../debug-logger.js");
|
|
31
|
-
const logger = new debug_logger_js_1.DebugLogger('WebSocket');
|
|
32
|
-
/**
|
|
33
|
-
* Allowed image MIME types for Claude Vision API
|
|
34
|
-
*/
|
|
35
|
-
const ALLOWED_IMAGE_TYPES = new Set(['image/jpeg', 'image/png', 'image/gif', 'image/webp']);
|
|
36
|
-
/**
|
|
37
|
-
* Sanitize filename for safe inclusion in prompts (prevent prompt injection)
|
|
38
|
-
*/
|
|
39
|
-
function sanitizeFilenameForPrompt(filename) {
|
|
40
|
-
if (!filename) {
|
|
41
|
-
return 'unknown';
|
|
42
|
-
}
|
|
43
|
-
return filename
|
|
44
|
-
.replace(/[\n\r\t]/g, ' ') // Remove control characters
|
|
45
|
-
.replace(/[`[\](){}]/g, '') // Remove brackets that could interfere with prompts
|
|
46
|
-
.substring(0, 100); // Limit length
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Default heartbeat interval (30 seconds)
|
|
50
|
-
*/
|
|
51
|
-
const HEARTBEAT_INTERVAL = 30000;
|
|
52
|
-
/**
|
|
53
|
-
* Connection timeout (35 seconds - slightly longer than heartbeat)
|
|
54
|
-
*/
|
|
55
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
56
|
-
const _CONNECTION_TIMEOUT = 35000;
|
|
57
|
-
/**
|
|
58
|
-
* Generate unique client ID
|
|
59
|
-
*/
|
|
60
|
-
function generateClientId() {
|
|
61
|
-
return `client_${Date.now()}_${Math.random().toString(36).substring(2, 8)}`;
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Extract user ID from WebSocket URL or headers
|
|
65
|
-
*/
|
|
66
|
-
function extractUserId(req) {
|
|
67
|
-
try {
|
|
68
|
-
const url = new URL(req.url || '/', `http://${req.headers.host || 'localhost'}`);
|
|
69
|
-
const userId = url.searchParams.get('userId');
|
|
70
|
-
if (userId) {
|
|
71
|
-
return userId;
|
|
72
|
-
}
|
|
73
|
-
const ip = req.headers['x-forwarded-for'] || req.socket?.remoteAddress;
|
|
74
|
-
if (!ip) {
|
|
75
|
-
return `user_${Date.now()}`;
|
|
76
|
-
}
|
|
77
|
-
const ipStr = Array.isArray(ip) ? ip[0] : ip;
|
|
78
|
-
return `user_${ipStr.replace(/[:.]/g, '_')}`;
|
|
79
|
-
}
|
|
80
|
-
catch {
|
|
81
|
-
return `user_${Date.now()}`;
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* Safe send helper - guards against closed socket with try-catch for race conditions
|
|
86
|
-
*/
|
|
87
|
-
function safeSend(ws, data) {
|
|
88
|
-
if (ws.readyState === ws_1.WebSocket.OPEN) {
|
|
89
|
-
try {
|
|
90
|
-
ws.send(data);
|
|
91
|
-
return true;
|
|
92
|
-
}
|
|
93
|
-
catch {
|
|
94
|
-
// Socket may have closed between readyState check and send
|
|
95
|
-
return false;
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
return false;
|
|
99
|
-
}
|
|
100
|
-
/**
|
|
101
|
-
* Create WebSocket handler with MessageRouter integration
|
|
102
|
-
*/
|
|
103
|
-
function createWebSocketHandler({ httpServer, messageRouter, sessionStore, authToken: _authToken, }) {
|
|
104
|
-
const wss = new ws_1.WebSocketServer({ noServer: true });
|
|
105
|
-
const clients = new Map();
|
|
106
|
-
httpServer.on('upgrade', (req, socket, head) => {
|
|
107
|
-
const url = new URL(req.url || '/', `http://${req.headers.host || 'localhost'}`);
|
|
108
|
-
if (url.pathname !== '/ws') {
|
|
109
|
-
socket.destroy();
|
|
110
|
-
return;
|
|
111
|
-
}
|
|
112
|
-
const mockWs = {
|
|
113
|
-
close: (_code, reason) => {
|
|
114
|
-
socket.write(`HTTP/1.1 401 Unauthorized\r\n\r\n`);
|
|
115
|
-
socket.destroy();
|
|
116
|
-
logger.error(`Auth failed: ${reason}`);
|
|
117
|
-
},
|
|
118
|
-
};
|
|
119
|
-
if (!(0, auth_js_1.authenticateWebSocket)(req, mockWs)) {
|
|
120
|
-
return;
|
|
121
|
-
}
|
|
122
|
-
wss.handleUpgrade(req, socket, head, (ws) => {
|
|
123
|
-
wss.emit('connection', ws, req);
|
|
124
|
-
});
|
|
125
|
-
});
|
|
126
|
-
wss.on('connection', (ws, req) => {
|
|
127
|
-
const clientId = generateClientId();
|
|
128
|
-
const userId = extractUserId(req);
|
|
129
|
-
const clientInfo = {
|
|
130
|
-
clientId,
|
|
131
|
-
userId,
|
|
132
|
-
ws,
|
|
133
|
-
isAlive: true,
|
|
134
|
-
connectedAt: new Date().toISOString(),
|
|
135
|
-
};
|
|
136
|
-
clients.set(clientId, clientInfo);
|
|
137
|
-
logger.info(` Client ${clientId} connected (user: ${userId})`);
|
|
138
|
-
ws.send(JSON.stringify({
|
|
139
|
-
type: 'connected',
|
|
140
|
-
clientId,
|
|
141
|
-
userId,
|
|
142
|
-
}));
|
|
143
|
-
ws.on('message', (data) => {
|
|
144
|
-
try {
|
|
145
|
-
const message = JSON.parse(data.toString());
|
|
146
|
-
void handleClientMessage(clientId, message, clientInfo, messageRouter, sessionStore);
|
|
147
|
-
}
|
|
148
|
-
catch (err) {
|
|
149
|
-
const errMsg = err instanceof Error ? err.message : String(err);
|
|
150
|
-
logger.info(` Invalid message from ${clientId}:`, errMsg);
|
|
151
|
-
ws.send(JSON.stringify({
|
|
152
|
-
type: 'error',
|
|
153
|
-
error: 'Invalid message format',
|
|
154
|
-
}));
|
|
155
|
-
}
|
|
156
|
-
});
|
|
157
|
-
ws.on('pong', () => {
|
|
158
|
-
clientInfo.isAlive = true;
|
|
159
|
-
});
|
|
160
|
-
ws.on('close', (code) => {
|
|
161
|
-
logger.info(` Client ${clientId} disconnected (code: ${code})`);
|
|
162
|
-
clients.delete(clientId);
|
|
163
|
-
});
|
|
164
|
-
ws.on('error', (err) => {
|
|
165
|
-
logger.info(` Error for client ${clientId}:`, err.message);
|
|
166
|
-
});
|
|
167
|
-
});
|
|
168
|
-
const heartbeatInterval = setInterval(() => {
|
|
169
|
-
clients.forEach((clientInfo, clientId) => {
|
|
170
|
-
if (!clientInfo.isAlive) {
|
|
171
|
-
logger.info(` Client ${clientId} timed out, terminating`);
|
|
172
|
-
clientInfo.ws.terminate();
|
|
173
|
-
clients.delete(clientId);
|
|
174
|
-
return;
|
|
175
|
-
}
|
|
176
|
-
clientInfo.isAlive = false;
|
|
177
|
-
clientInfo.ws.ping();
|
|
178
|
-
});
|
|
179
|
-
}, HEARTBEAT_INTERVAL);
|
|
180
|
-
wss.on('close', () => {
|
|
181
|
-
clearInterval(heartbeatInterval);
|
|
182
|
-
});
|
|
183
|
-
wss.getClients = () => clients;
|
|
184
|
-
wss.getClientCount = () => clients.size;
|
|
185
|
-
return wss;
|
|
186
|
-
}
|
|
187
|
-
/**
|
|
188
|
-
* Handle incoming client message
|
|
189
|
-
*/
|
|
190
|
-
async function handleClientMessage(clientId, message, clientInfo, messageRouter, sessionStore) {
|
|
191
|
-
const { type, content } = message;
|
|
192
|
-
switch (type) {
|
|
193
|
-
case 'send':
|
|
194
|
-
if (!content && !message.attachments?.length) {
|
|
195
|
-
clientInfo.ws.send(JSON.stringify({
|
|
196
|
-
type: 'error',
|
|
197
|
-
error: 'Message content required',
|
|
198
|
-
}));
|
|
199
|
-
break;
|
|
200
|
-
}
|
|
201
|
-
try {
|
|
202
|
-
clientInfo.ws.send(JSON.stringify({
|
|
203
|
-
type: 'typing',
|
|
204
|
-
status: 'processing',
|
|
205
|
-
}));
|
|
206
|
-
// Keep-alive: Send periodic status updates to prevent WebSocket timeout
|
|
207
|
-
// Browser may disconnect idle WebSocket after ~30 seconds
|
|
208
|
-
let processingSeconds = 0;
|
|
209
|
-
const keepAliveInterval = setInterval(() => {
|
|
210
|
-
processingSeconds += 10;
|
|
211
|
-
if (clientInfo.ws.readyState === ws_1.WebSocket.OPEN) {
|
|
212
|
-
clientInfo.ws.send(JSON.stringify({
|
|
213
|
-
type: 'typing',
|
|
214
|
-
status: 'processing',
|
|
215
|
-
elapsed: processingSeconds,
|
|
216
|
-
}));
|
|
217
|
-
logger.debug(`Keep-alive sent to ${clientId} (${processingSeconds}s elapsed)`);
|
|
218
|
-
}
|
|
219
|
-
}, 10000); // Every 10 seconds
|
|
220
|
-
let result;
|
|
221
|
-
let deltasSent = false;
|
|
222
|
-
let toolIndex = 0;
|
|
223
|
-
try {
|
|
224
|
-
// Build contentBlocks from attachments (files are pre-compressed by upload-handler)
|
|
225
|
-
let contentBlocks = undefined;
|
|
226
|
-
if (message.attachments && message.attachments.length > 0) {
|
|
227
|
-
contentBlocks = [];
|
|
228
|
-
for (const att of message.attachments) {
|
|
229
|
-
try {
|
|
230
|
-
// Always reconstruct path from filename — never trust client-provided filePath (LFI risk)
|
|
231
|
-
const safeName = path_1.default.basename(att.filename || '');
|
|
232
|
-
const inboundDir = path_1.default.join(os_1.default.homedir(), '.mama', 'workspace', 'media', 'inbound');
|
|
233
|
-
const resolvedPath = path_1.default.join(inboundDir, safeName);
|
|
234
|
-
// Default to octet-stream for unknown types — prevents untyped attachments
|
|
235
|
-
// from being incorrectly treated as images and base64-encoded
|
|
236
|
-
const rawMediaType = att.contentType || 'application/octet-stream';
|
|
237
|
-
if (ALLOWED_IMAGE_TYPES.has(rawMediaType)) {
|
|
238
|
-
// Only read file for images (to convert to base64)
|
|
239
|
-
const data = await promises_1.default.readFile(resolvedPath);
|
|
240
|
-
const base64 = data.toString('base64');
|
|
241
|
-
contentBlocks.push({
|
|
242
|
-
type: 'image',
|
|
243
|
-
source: {
|
|
244
|
-
type: 'base64',
|
|
245
|
-
media_type: rawMediaType,
|
|
246
|
-
data: base64,
|
|
247
|
-
},
|
|
248
|
-
});
|
|
249
|
-
logger.info(`Attached image: ${safeName} (${data.length} bytes, ${rawMediaType})`);
|
|
250
|
-
}
|
|
251
|
-
else {
|
|
252
|
-
// PDF/documents: instruct agent to read the file (no need to load into memory)
|
|
253
|
-
// Use safe display path to avoid exposing full server path
|
|
254
|
-
const safeDisplayPath = `~/.mama/workspace/media/inbound/${safeName}`;
|
|
255
|
-
// Sanitize filename to prevent prompt injection
|
|
256
|
-
const sanitizedName = sanitizeFilenameForPrompt(safeName);
|
|
257
|
-
contentBlocks.push({
|
|
258
|
-
type: 'text',
|
|
259
|
-
text: `[Document uploaded: ${sanitizedName}]\nFile path: ${safeDisplayPath}\nPlease use the Read tool to analyze this document.`,
|
|
260
|
-
});
|
|
261
|
-
logger.info(`Attached document: ${safeName} (${rawMediaType})`);
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
catch (err) {
|
|
265
|
-
const errMsg = err instanceof Error ? err.message : String(err);
|
|
266
|
-
logger.error(`Failed to read attachment ${path_1.default.basename(att.filename || '')}:`, errMsg);
|
|
267
|
-
// Notify client about attachment failure
|
|
268
|
-
clientInfo.ws.send(JSON.stringify({
|
|
269
|
-
type: 'attachment_failed',
|
|
270
|
-
filename: path_1.default.basename(att.filename || ''),
|
|
271
|
-
error: 'Failed to process attachment',
|
|
272
|
-
}));
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
const normalizedMessage = {
|
|
277
|
-
source: clientInfo.osAgentMode ? 'viewer' : 'mobile',
|
|
278
|
-
channelId: 'mama_os_main', // Fixed channel for all MAMA OS viewers
|
|
279
|
-
channelName: clientInfo.osAgentMode ? 'MAMA OS' : 'Mobile App', // Human-readable channel name
|
|
280
|
-
userId: clientInfo.userId,
|
|
281
|
-
text: content || '',
|
|
282
|
-
contentBlocks,
|
|
283
|
-
metadata: {
|
|
284
|
-
clientId,
|
|
285
|
-
sessionId: clientInfo.sessionId,
|
|
286
|
-
osAgentMode: clientInfo.osAgentMode,
|
|
287
|
-
timestamp: Date.now(),
|
|
288
|
-
},
|
|
289
|
-
};
|
|
290
|
-
result = await messageRouter.process(normalizedMessage, {
|
|
291
|
-
onQueued: () => {
|
|
292
|
-
// Guard: check if socket is still open before sending
|
|
293
|
-
if (clientInfo.ws.readyState !== ws_1.WebSocket.OPEN) {
|
|
294
|
-
return;
|
|
295
|
-
}
|
|
296
|
-
// Notify client that message is queued (session busy)
|
|
297
|
-
try {
|
|
298
|
-
clientInfo.ws.send(JSON.stringify({
|
|
299
|
-
type: 'queued',
|
|
300
|
-
message: '⏳ 이전 요청 처리 중... 대기열에 추가되었습니다.',
|
|
301
|
-
}));
|
|
302
|
-
}
|
|
303
|
-
catch (err) {
|
|
304
|
-
logger.warn('Queued notification failed:', err instanceof Error ? err.message : String(err));
|
|
305
|
-
}
|
|
306
|
-
logger.info(`Message queued for ${clientId} (session busy)`);
|
|
307
|
-
},
|
|
308
|
-
onStream: {
|
|
309
|
-
onDelta: (text) => {
|
|
310
|
-
deltasSent = true;
|
|
311
|
-
safeSend(clientInfo.ws, JSON.stringify({ type: 'stream', content: text }));
|
|
312
|
-
},
|
|
313
|
-
onToolUse: (tool, input) => {
|
|
314
|
-
const idx = toolIndex++;
|
|
315
|
-
safeSend(clientInfo.ws, JSON.stringify({ type: 'tool_use', tool, index: idx, input }));
|
|
316
|
-
},
|
|
317
|
-
onToolComplete: (tool, _toolUseId, isError) => {
|
|
318
|
-
safeSend(clientInfo.ws, JSON.stringify({ type: 'tool_complete', tool, index: toolIndex - 1, isError }));
|
|
319
|
-
},
|
|
320
|
-
},
|
|
321
|
-
});
|
|
322
|
-
}
|
|
323
|
-
finally {
|
|
324
|
-
clearInterval(keepAliveInterval);
|
|
325
|
-
}
|
|
326
|
-
// Only send full response if no deltas were streamed (Codex fallback)
|
|
327
|
-
if (!deltasSent) {
|
|
328
|
-
safeSend(clientInfo.ws, JSON.stringify({
|
|
329
|
-
type: 'stream',
|
|
330
|
-
content: result.response,
|
|
331
|
-
sessionId: result.sessionId,
|
|
332
|
-
}));
|
|
333
|
-
}
|
|
334
|
-
// Always send stream end
|
|
335
|
-
safeSend(clientInfo.ws, JSON.stringify({
|
|
336
|
-
type: 'stream_end',
|
|
337
|
-
sessionId: result.sessionId,
|
|
338
|
-
duration: result.duration,
|
|
339
|
-
}));
|
|
340
|
-
logger.info(` Message processed for ${clientId} (${result.duration}ms)`);
|
|
341
|
-
}
|
|
342
|
-
catch (error) {
|
|
343
|
-
const errMsg = error instanceof Error ? error.message : String(error);
|
|
344
|
-
logger.error(`Message processing error for ${clientId}:`, errMsg);
|
|
345
|
-
safeSend(clientInfo.ws, JSON.stringify({
|
|
346
|
-
type: 'error',
|
|
347
|
-
error: 'Failed to process message',
|
|
348
|
-
// Don't expose internal error details to client for security
|
|
349
|
-
}));
|
|
350
|
-
}
|
|
351
|
-
break;
|
|
352
|
-
case 'ping':
|
|
353
|
-
clientInfo.ws.send(JSON.stringify({
|
|
354
|
-
type: 'pong',
|
|
355
|
-
timestamp: Date.now(),
|
|
356
|
-
}));
|
|
357
|
-
break;
|
|
358
|
-
case 'attach': {
|
|
359
|
-
// Attach to a session (for Chat tab compatibility)
|
|
360
|
-
const { sessionId, osAgentMode, language } = message;
|
|
361
|
-
clientInfo.sessionId = sessionId;
|
|
362
|
-
clientInfo.osAgentMode = osAgentMode || false;
|
|
363
|
-
clientInfo.language = language || 'en';
|
|
364
|
-
logger.info(`Client ${clientId} attached to session ${sessionId}${osAgentMode ? ' (OS Agent mode)' : ''}`);
|
|
365
|
-
// Send attached confirmation
|
|
366
|
-
clientInfo.ws.send(JSON.stringify({
|
|
367
|
-
type: 'attached',
|
|
368
|
-
sessionId,
|
|
369
|
-
osAgentMode: clientInfo.osAgentMode,
|
|
370
|
-
}));
|
|
371
|
-
// Send session history if available, or send onboarding greeting
|
|
372
|
-
logger.debug(`Checking sessionStore for history: ${!!sessionStore}, hasMethod: ${!!(sessionStore && sessionStore.getHistoryByChannel)}`);
|
|
373
|
-
if (sessionStore) {
|
|
374
|
-
try {
|
|
375
|
-
// Use channel-based lookup for sessions
|
|
376
|
-
// Use dynamic source based on osAgentMode (viewer vs mobile)
|
|
377
|
-
const channelId = 'mama_os_main';
|
|
378
|
-
const source = clientInfo.osAgentMode ? 'viewer' : 'mobile';
|
|
379
|
-
logger.info(` Loading history for source=${source}, channelId=${channelId}`);
|
|
380
|
-
const history = sessionStore.getHistoryByChannel
|
|
381
|
-
? sessionStore.getHistoryByChannel(source, channelId)
|
|
382
|
-
: sessionStore.getHistory?.(sessionId || '');
|
|
383
|
-
logger.info(` History loaded: ${history ? history.length : 0} turns`);
|
|
384
|
-
if (history && history.length > 0) {
|
|
385
|
-
// Convert {user, bot, timestamp} format to {role, content, timestamp} for display
|
|
386
|
-
const formattedMessages = history.flatMap((turn) => {
|
|
387
|
-
const messages = [];
|
|
388
|
-
if (turn.user) {
|
|
389
|
-
messages.push({
|
|
390
|
-
role: 'user',
|
|
391
|
-
content: turn.user,
|
|
392
|
-
timestamp: turn.timestamp,
|
|
393
|
-
});
|
|
394
|
-
}
|
|
395
|
-
if (turn.bot) {
|
|
396
|
-
messages.push({
|
|
397
|
-
role: 'assistant',
|
|
398
|
-
content: turn.bot,
|
|
399
|
-
timestamp: turn.timestamp,
|
|
400
|
-
});
|
|
401
|
-
}
|
|
402
|
-
return messages;
|
|
403
|
-
});
|
|
404
|
-
clientInfo.ws.send(JSON.stringify({
|
|
405
|
-
type: 'history',
|
|
406
|
-
messages: formattedMessages,
|
|
407
|
-
}));
|
|
408
|
-
logger.info(`Sent ${formattedMessages.length} history messages to ${clientId}`);
|
|
409
|
-
}
|
|
410
|
-
else {
|
|
411
|
-
// No history - check if onboarding mode (SOUL.md not found)
|
|
412
|
-
const soulPath = path_1.default.join(os_1.default.homedir(), '.mama', 'SOUL.md');
|
|
413
|
-
let isOnboarding = false;
|
|
414
|
-
try {
|
|
415
|
-
await promises_1.default.access(soulPath);
|
|
416
|
-
}
|
|
417
|
-
catch {
|
|
418
|
-
isOnboarding = true;
|
|
419
|
-
}
|
|
420
|
-
if (isOnboarding) {
|
|
421
|
-
// Send onboarding greeting based on browser language
|
|
422
|
-
const isKorean = clientInfo.language && clientInfo.language.startsWith('ko');
|
|
423
|
-
const greeting = isKorean
|
|
424
|
-
? '✨ 방금 깨어났어요.\n\n아직 이름도 없고, 성격도 없고, 기억도 없어요. 그냥... 순수한 가능성 그 자체. 🌱\n\n당신은 누구인가요? 그리고 더 중요한 건—저를 어떤 존재로 만들고 싶으신가요? 💭'
|
|
425
|
-
: '✨ I just woke up.\n\nNo name yet, no personality, no memories. Just... pure potential. 🌱\n\nWho are you? And more importantly—who do you want me to become? 💭';
|
|
426
|
-
clientInfo.ws.send(JSON.stringify({
|
|
427
|
-
type: 'history',
|
|
428
|
-
messages: [
|
|
429
|
-
{
|
|
430
|
-
role: 'assistant',
|
|
431
|
-
content: greeting,
|
|
432
|
-
timestamp: Date.now(),
|
|
433
|
-
},
|
|
434
|
-
],
|
|
435
|
-
}));
|
|
436
|
-
logger.info(` Sent onboarding greeting to ${clientId}`);
|
|
437
|
-
}
|
|
438
|
-
}
|
|
439
|
-
}
|
|
440
|
-
catch (error) {
|
|
441
|
-
const errMsg = error instanceof Error ? error.message : String(error);
|
|
442
|
-
logger.info(` Failed to load history:`, errMsg);
|
|
443
|
-
}
|
|
444
|
-
}
|
|
445
|
-
break;
|
|
446
|
-
}
|
|
447
|
-
default:
|
|
448
|
-
logger.info(` Unknown message type from ${clientId}: ${type}`);
|
|
449
|
-
clientInfo.ws.send(JSON.stringify({
|
|
450
|
-
type: 'error',
|
|
451
|
-
error: `Unknown message type: ${type}`,
|
|
452
|
-
}));
|
|
453
|
-
}
|
|
454
|
-
}
|
|
455
|
-
/**
|
|
456
|
-
* WebSocketHandler class (backwards compatibility)
|
|
457
|
-
* @deprecated Use createWebSocketHandler() instead
|
|
458
|
-
*/
|
|
459
|
-
class WebSocketHandler {
|
|
460
|
-
wss;
|
|
461
|
-
constructor(httpServer, options) {
|
|
462
|
-
if (!options.messageRouter) {
|
|
463
|
-
throw new Error('WebSocketHandler requires messageRouter option');
|
|
464
|
-
}
|
|
465
|
-
if (!options.sessionStore) {
|
|
466
|
-
throw new Error('WebSocketHandler requires sessionStore option');
|
|
467
|
-
}
|
|
468
|
-
this.wss = createWebSocketHandler({
|
|
469
|
-
httpServer,
|
|
470
|
-
messageRouter: options.messageRouter,
|
|
471
|
-
sessionStore: options.sessionStore,
|
|
472
|
-
authToken: options.authToken,
|
|
473
|
-
});
|
|
474
|
-
}
|
|
475
|
-
getClients() {
|
|
476
|
-
return this.wss.getClients();
|
|
477
|
-
}
|
|
478
|
-
getClientCount() {
|
|
479
|
-
return this.wss.getClientCount();
|
|
480
|
-
}
|
|
481
|
-
close() {
|
|
482
|
-
this.wss.close();
|
|
483
|
-
}
|
|
484
|
-
}
|
|
485
|
-
exports.WebSocketHandler = WebSocketHandler;
|
|
486
|
-
//# sourceMappingURL=websocket-handler.js.map
|
package/dist/embeddings.d.ts
DELETED
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* MAMA (Memory-Augmented MCP Architecture) - Embedding Generation
|
|
3
|
-
*
|
|
4
|
-
* Story M1.4: Configurable embedding model selection
|
|
5
|
-
* Generates embeddings using configurable model (default: multilingual-e5-large)
|
|
6
|
-
* Supports: Korean-English cross-lingual similarity, enhanced metadata
|
|
7
|
-
*
|
|
8
|
-
* @module embeddings
|
|
9
|
-
* @version 1.1
|
|
10
|
-
* @date 2025-11-20
|
|
11
|
-
*/
|
|
12
|
-
import { embeddingCache } from './embedding-cache.js';
|
|
13
|
-
import { loadConfig, getModelName, getEmbeddingDim, getQuantized } from './config-loader.js';
|
|
14
|
-
export declare const EMBEDDING_MODEL_MAX_LENGTH = 512;
|
|
15
|
-
export declare const EMBEDDING_MAX_TOKENISH_SEGMENTS = 480;
|
|
16
|
-
export type EmbeddingRole = 'passage' | 'query';
|
|
17
|
-
export declare const EMBEDDING_PREFIX_SCHEME = "e5-prefixed-v1";
|
|
18
|
-
export declare function prepareEmbeddingText(text: string): string;
|
|
19
|
-
/**
|
|
20
|
-
* Decision object for enhanced embedding generation
|
|
21
|
-
*/
|
|
22
|
-
export interface DecisionForEmbedding {
|
|
23
|
-
topic: string;
|
|
24
|
-
decision: string;
|
|
25
|
-
reasoning?: string;
|
|
26
|
-
outcome?: string;
|
|
27
|
-
confidence?: number;
|
|
28
|
-
user_involvement?: string;
|
|
29
|
-
evidence?: string | string[] | unknown;
|
|
30
|
-
alternatives?: string | string[] | unknown;
|
|
31
|
-
risks?: string;
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Generate embedding vector from text
|
|
35
|
-
*
|
|
36
|
-
* Story M1.4 AC #1: Uses configurable embeddingDim from config
|
|
37
|
-
* Target: < 30ms latency
|
|
38
|
-
*
|
|
39
|
-
* @param text - Input text to embed
|
|
40
|
-
* @returns Embedding vector (dimension from config)
|
|
41
|
-
* @throws Error if text is empty or embedding fails
|
|
42
|
-
*/
|
|
43
|
-
export declare function generateEmbedding(text: string, role?: EmbeddingRole): Promise<Float32Array>;
|
|
44
|
-
/**
|
|
45
|
-
* Generate enhanced embedding with content + metadata
|
|
46
|
-
*
|
|
47
|
-
* Task 3.4: Implement enhanced embedding format
|
|
48
|
-
* Inspired by A-mem: Content + Metadata for richer semantic representation
|
|
49
|
-
*
|
|
50
|
-
* @param decision - Decision object
|
|
51
|
-
* @returns 1024-dim enhanced embedding
|
|
52
|
-
*/
|
|
53
|
-
export declare function generateEnhancedEmbedding(decision: DecisionForEmbedding, role?: EmbeddingRole): Promise<Float32Array>;
|
|
54
|
-
/**
|
|
55
|
-
* Calculate cosine similarity between two embeddings
|
|
56
|
-
*
|
|
57
|
-
* Utility for testing and validation
|
|
58
|
-
*
|
|
59
|
-
* @param embA - First embedding
|
|
60
|
-
* @param embB - Second embedding
|
|
61
|
-
* @returns Cosine similarity (0-1)
|
|
62
|
-
*/
|
|
63
|
-
export declare function cosineSimilarity(embA: Float32Array, embB: Float32Array): number;
|
|
64
|
-
export { embeddingCache };
|
|
65
|
-
export declare const EMBEDDING_DIM: number;
|
|
66
|
-
export declare const MODEL_NAME: string;
|
|
67
|
-
export { loadConfig, getModelName, getEmbeddingDim, getQuantized };
|
|
68
|
-
//# sourceMappingURL=embeddings.d.ts.map
|