@moltzap/client 2026.812.0 → 2026.902.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/LICENSE +202 -21
- package/NOTICE +19 -0
- package/README.md +50 -0
- package/bin/moltzapd +9 -0
- package/dist/client-runtime.d.ts +10 -0
- package/dist/client-runtime.d.ts.map +1 -0
- package/dist/client-runtime.js +218 -0
- package/dist/client-runtime.js.map +1 -0
- package/dist/contract.d.ts +338 -0
- package/dist/contract.d.ts.map +1 -0
- package/dist/contract.js +213 -0
- package/dist/contract.js.map +1 -0
- package/dist/contract.types-check.d.ts +99 -0
- package/dist/contract.types-check.d.ts.map +1 -0
- package/dist/contract.types-check.js +7 -0
- package/dist/contract.types-check.js.map +1 -0
- package/dist/daemon/configuration.d.ts +46 -0
- package/dist/daemon/configuration.d.ts.map +1 -0
- package/dist/daemon/configuration.js +69 -0
- package/dist/daemon/configuration.js.map +1 -0
- package/dist/daemon/management.d.ts +23 -0
- package/dist/daemon/management.d.ts.map +1 -0
- package/dist/daemon/management.js +489 -0
- package/dist/daemon/management.js.map +1 -0
- package/dist/daemon/registration.d.ts +72 -0
- package/dist/daemon/registration.d.ts.map +1 -0
- package/dist/daemon/registration.js +109 -0
- package/dist/daemon/registration.js.map +1 -0
- package/dist/daemon/runtime/activation.d.ts +95 -0
- package/dist/daemon/runtime/activation.d.ts.map +1 -0
- package/dist/daemon/runtime/activation.js +99 -0
- package/dist/daemon/runtime/activation.js.map +1 -0
- package/dist/daemon/runtime/controller.d.ts +34 -0
- package/dist/daemon/runtime/controller.d.ts.map +1 -0
- package/dist/daemon/runtime/controller.js +106 -0
- package/dist/daemon/runtime/controller.js.map +1 -0
- package/dist/daemon/runtime/history-export.d.ts +23 -0
- package/dist/daemon/runtime/history-export.d.ts.map +1 -0
- package/dist/daemon/runtime/history-export.js +47 -0
- package/dist/daemon/runtime/history-export.js.map +1 -0
- package/dist/daemon/runtime/index.d.ts +24 -0
- package/dist/daemon/runtime/index.d.ts.map +1 -0
- package/dist/daemon/runtime/index.js +65 -0
- package/dist/daemon/runtime/index.js.map +1 -0
- package/dist/daemon/runtime/protocol.d.ts +63 -0
- package/dist/daemon/runtime/protocol.d.ts.map +1 -0
- package/dist/daemon/runtime/protocol.js +133 -0
- package/dist/daemon/runtime/protocol.js.map +1 -0
- package/dist/endpoint/addressing/index.d.ts +39 -0
- package/dist/endpoint/addressing/index.d.ts.map +1 -0
- package/dist/endpoint/addressing/index.js +114 -0
- package/dist/endpoint/addressing/index.js.map +1 -0
- package/dist/endpoint/engine-dissemination.d.ts +11 -0
- package/dist/endpoint/engine-dissemination.d.ts.map +1 -0
- package/dist/endpoint/engine-dissemination.js +71 -0
- package/dist/endpoint/engine-dissemination.js.map +1 -0
- package/dist/endpoint/engine-durability.d.ts +69 -0
- package/dist/endpoint/engine-durability.d.ts.map +1 -0
- package/dist/endpoint/engine-durability.js +210 -0
- package/dist/endpoint/engine-durability.js.map +1 -0
- package/dist/endpoint/engine-send.d.ts +50 -0
- package/dist/endpoint/engine-send.d.ts.map +1 -0
- package/dist/endpoint/engine-send.js +422 -0
- package/dist/endpoint/engine-send.js.map +1 -0
- package/dist/endpoint/engine-types.d.ts +132 -0
- package/dist/endpoint/engine-types.d.ts.map +1 -0
- package/dist/endpoint/engine-types.js +13 -0
- package/dist/endpoint/engine-types.js.map +1 -0
- package/dist/endpoint/engine.d.ts +14 -0
- package/dist/endpoint/engine.d.ts.map +1 -0
- package/dist/endpoint/engine.js +280 -0
- package/dist/endpoint/engine.js.map +1 -0
- package/dist/endpoint/protocol/evidence.d.ts +37 -0
- package/dist/endpoint/protocol/evidence.d.ts.map +1 -0
- package/dist/endpoint/protocol/evidence.js +80 -0
- package/dist/endpoint/protocol/evidence.js.map +1 -0
- package/dist/endpoint/protocol/index.d.ts +26 -0
- package/dist/endpoint/protocol/index.d.ts.map +1 -0
- package/dist/endpoint/protocol/index.js +543 -0
- package/dist/endpoint/protocol/index.js.map +1 -0
- package/dist/endpoint/recovery/barrier.d.ts +23 -0
- package/dist/endpoint/recovery/barrier.d.ts.map +1 -0
- package/dist/endpoint/recovery/barrier.js +47 -0
- package/dist/endpoint/recovery/barrier.js.map +1 -0
- package/dist/endpoint/recovery/index.d.ts +29 -0
- package/dist/endpoint/recovery/index.d.ts.map +1 -0
- package/dist/endpoint/recovery/index.js +489 -0
- package/dist/endpoint/recovery/index.js.map +1 -0
- package/dist/endpoint/recovery/reanchor/empty.d.ts +22 -0
- package/dist/endpoint/recovery/reanchor/empty.d.ts.map +1 -0
- package/dist/endpoint/recovery/reanchor/empty.js +163 -0
- package/dist/endpoint/recovery/reanchor/empty.js.map +1 -0
- package/dist/endpoint/recovery/reanchor/index.d.ts +30 -0
- package/dist/endpoint/recovery/reanchor/index.d.ts.map +1 -0
- package/dist/endpoint/recovery/reanchor/index.js +479 -0
- package/dist/endpoint/recovery/reanchor/index.js.map +1 -0
- package/dist/endpoint/recovery/state.d.ts +130 -0
- package/dist/endpoint/recovery/state.d.ts.map +1 -0
- package/dist/endpoint/recovery/state.js +296 -0
- package/dist/endpoint/recovery/state.js.map +1 -0
- package/dist/endpoint/recovery/store-evidence.d.ts +17 -0
- package/dist/endpoint/recovery/store-evidence.d.ts.map +1 -0
- package/dist/endpoint/recovery/store-evidence.js +79 -0
- package/dist/endpoint/recovery/store-evidence.js.map +1 -0
- package/dist/endpoint/recovery/store.d.ts +56 -0
- package/dist/endpoint/recovery/store.d.ts.map +1 -0
- package/dist/endpoint/recovery/store.js +499 -0
- package/dist/endpoint/recovery/store.js.map +1 -0
- package/dist/endpoint/representation-canonical.d.ts +17 -0
- package/dist/endpoint/representation-canonical.d.ts.map +1 -0
- package/dist/endpoint/representation-canonical.js +48 -0
- package/dist/endpoint/representation-canonical.js.map +1 -0
- package/dist/endpoint/representation-codec.d.ts +51 -0
- package/dist/endpoint/representation-codec.d.ts.map +1 -0
- package/dist/endpoint/representation-codec.js +159 -0
- package/dist/endpoint/representation-codec.js.map +1 -0
- package/dist/endpoint/representation-schemas.d.ts +1831 -0
- package/dist/endpoint/representation-schemas.d.ts.map +1 -0
- package/dist/endpoint/representation-schemas.js +195 -0
- package/dist/endpoint/representation-schemas.js.map +1 -0
- package/dist/endpoint/representation-verification.d.ts +79 -0
- package/dist/endpoint/representation-verification.d.ts.map +1 -0
- package/dist/endpoint/representation-verification.js +420 -0
- package/dist/endpoint/representation-verification.js.map +1 -0
- package/dist/endpoint/representation.d.ts +6 -0
- package/dist/endpoint/representation.d.ts.map +1 -0
- package/dist/endpoint/representation.js +8 -0
- package/dist/endpoint/representation.js.map +1 -0
- package/dist/endpoint/router-worker/index.d.ts +16 -0
- package/dist/endpoint/router-worker/index.d.ts.map +1 -0
- package/dist/endpoint/router-worker/index.js +547 -0
- package/dist/endpoint/router-worker/index.js.map +1 -0
- package/dist/endpoint/router-worker/types.d.ts +183 -0
- package/dist/endpoint/router-worker/types.d.ts.map +1 -0
- package/dist/endpoint/router-worker/types.js +31 -0
- package/dist/endpoint/router-worker/types.js.map +1 -0
- package/dist/endpoint/store/anchors.d.ts +83 -0
- package/dist/endpoint/store/anchors.d.ts.map +1 -0
- package/dist/endpoint/store/anchors.js +471 -0
- package/dist/endpoint/store/anchors.js.map +1 -0
- package/dist/endpoint/store/database/index.d.ts +6 -0
- package/dist/endpoint/store/database/index.d.ts.map +1 -0
- package/dist/endpoint/store/database/index.js +6 -0
- package/dist/endpoint/store/database/index.js.map +1 -0
- package/dist/endpoint/store/database/schema.d.ts +44 -0
- package/dist/endpoint/store/database/schema.d.ts.map +1 -0
- package/dist/endpoint/store/database/schema.js +345 -0
- package/dist/endpoint/store/database/schema.js.map +1 -0
- package/dist/endpoint/store/database/values.d.ts +119 -0
- package/dist/endpoint/store/database/values.d.ts.map +1 -0
- package/dist/endpoint/store/database/values.js +194 -0
- package/dist/endpoint/store/database/values.js.map +1 -0
- package/dist/endpoint/store/deliveries.d.ts +38 -0
- package/dist/endpoint/store/deliveries.d.ts.map +1 -0
- package/dist/endpoint/store/deliveries.js +124 -0
- package/dist/endpoint/store/deliveries.js.map +1 -0
- package/dist/endpoint/store/dissemination.d.ts +27 -0
- package/dist/endpoint/store/dissemination.d.ts.map +1 -0
- package/dist/endpoint/store/dissemination.js +139 -0
- package/dist/endpoint/store/dissemination.js.map +1 -0
- package/dist/endpoint/store/index.d.ts +15 -0
- package/dist/endpoint/store/index.d.ts.map +1 -0
- package/dist/endpoint/store/index.js +76 -0
- package/dist/endpoint/store/index.js.map +1 -0
- package/dist/endpoint/store/management.d.ts +42 -0
- package/dist/endpoint/store/management.d.ts.map +1 -0
- package/dist/endpoint/store/management.js +259 -0
- package/dist/endpoint/store/management.js.map +1 -0
- package/dist/endpoint/store/outbound.d.ts +62 -0
- package/dist/endpoint/store/outbound.d.ts.map +1 -0
- package/dist/endpoint/store/outbound.js +278 -0
- package/dist/endpoint/store/outbound.js.map +1 -0
- package/dist/endpoint/store/records.d.ts +56 -0
- package/dist/endpoint/store/records.d.ts.map +1 -0
- package/dist/endpoint/store/records.js +352 -0
- package/dist/endpoint/store/records.js.map +1 -0
- package/dist/endpoint/store/rows/index.d.ts +138 -0
- package/dist/endpoint/store/rows/index.d.ts.map +1 -0
- package/dist/endpoint/store/rows/index.js +307 -0
- package/dist/endpoint/store/rows/index.js.map +1 -0
- package/dist/endpoint/store/types.d.ts +223 -0
- package/dist/endpoint/store/types.d.ts.map +1 -0
- package/dist/endpoint/store/types.js +15 -0
- package/dist/endpoint/store/types.js.map +1 -0
- package/dist/endpoint/store.d.ts +10 -0
- package/dist/endpoint/store.d.ts.map +1 -0
- package/dist/endpoint/store.js +6 -0
- package/dist/endpoint/store.js.map +1 -0
- package/dist/harness-mcp-contract.d.ts +101 -0
- package/dist/harness-mcp-contract.d.ts.map +1 -0
- package/dist/harness-mcp-contract.js +61 -0
- package/dist/harness-mcp-contract.js.map +1 -0
- package/dist/{harness-mcp-server.d.ts → harness-mcp-http.d.ts} +9 -8
- package/dist/harness-mcp-http.d.ts.map +1 -0
- package/dist/{harness-mcp-server.js → harness-mcp-http.js} +38 -60
- package/dist/harness-mcp-http.js.map +1 -0
- package/dist/harness-mcp-subscription.d.ts +12 -7
- package/dist/harness-mcp-subscription.d.ts.map +1 -1
- package/dist/harness-mcp-subscription.js +113 -100
- package/dist/harness-mcp-subscription.js.map +1 -1
- package/dist/harness-mcp-wire.d.ts +24 -49
- package/dist/harness-mcp-wire.d.ts.map +1 -1
- package/dist/harness-mcp-wire.js +381 -124
- package/dist/harness-mcp-wire.js.map +1 -1
- package/dist/index.d.ts +4 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -10
- package/dist/index.js.map +1 -1
- package/dist/management-runtime.d.ts +217 -0
- package/dist/management-runtime.d.ts.map +1 -0
- package/dist/management-runtime.js +127 -0
- package/dist/management-runtime.js.map +1 -0
- package/dist/server.d.ts +16 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +46 -0
- package/dist/server.js.map +1 -0
- package/dist/server.types-check.d.ts +23 -0
- package/dist/server.types-check.d.ts.map +1 -0
- package/dist/server.types-check.js +7 -0
- package/dist/server.types-check.js.map +1 -0
- package/package.json +24 -52
- package/dist/agent-client.d.ts +0 -5
- package/dist/agent-client.d.ts.map +0 -1
- package/dist/agent-client.js +0 -3
- package/dist/agent-client.js.map +0 -1
- package/dist/auth.d.ts +0 -37
- package/dist/auth.d.ts.map +0 -1
- package/dist/auth.js +0 -79
- package/dist/auth.js.map +0 -1
- package/dist/bounded-map.d.ts +0 -32
- package/dist/bounded-map.d.ts.map +0 -1
- package/dist/bounded-map.js +0 -79
- package/dist/bounded-map.js.map +0 -1
- package/dist/channel-base/format-cross-conv.d.ts +0 -43
- package/dist/channel-base/format-cross-conv.d.ts.map +0 -1
- package/dist/channel-base/format-cross-conv.js +0 -65
- package/dist/channel-base/format-cross-conv.js.map +0 -1
- package/dist/channel-base/format-group-block.d.ts +0 -48
- package/dist/channel-base/format-group-block.d.ts.map +0 -1
- package/dist/channel-base/format-group-block.js +0 -62
- package/dist/channel-base/format-group-block.js.map +0 -1
- package/dist/channel-base/index.d.ts +0 -12
- package/dist/channel-base/index.d.ts.map +0 -1
- package/dist/channel-base/index.js +0 -16
- package/dist/channel-base/index.js.map +0 -1
- package/dist/channel-core-enrichment.d.ts +0 -38
- package/dist/channel-core-enrichment.d.ts.map +0 -1
- package/dist/channel-core-enrichment.js +0 -217
- package/dist/channel-core-enrichment.js.map +0 -1
- package/dist/channel-core-test-support.d.ts +0 -75
- package/dist/channel-core-test-support.d.ts.map +0 -1
- package/dist/channel-core-test-support.js +0 -74
- package/dist/channel-core-test-support.js.map +0 -1
- package/dist/channel-core.d.ts +0 -306
- package/dist/channel-core.d.ts.map +0 -1
- package/dist/channel-core.js +0 -365
- package/dist/channel-core.js.map +0 -1
- package/dist/config.d.ts +0 -33
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js +0 -51
- package/dist/config.js.map +0 -1
- package/dist/config.test-utils.d.ts +0 -24
- package/dist/config.test-utils.d.ts.map +0 -1
- package/dist/config.test-utils.js +0 -57
- package/dist/config.test-utils.js.map +0 -1
- package/dist/harness/client-runtime.d.ts +0 -31
- package/dist/harness/client-runtime.d.ts.map +0 -1
- package/dist/harness/client-runtime.js +0 -121
- package/dist/harness/client-runtime.js.map +0 -1
- package/dist/harness/index.d.ts +0 -5
- package/dist/harness/index.d.ts.map +0 -1
- package/dist/harness/index.js +0 -5
- package/dist/harness/index.js.map +0 -1
- package/dist/harness/runtime.d.ts +0 -301
- package/dist/harness/runtime.d.ts.map +0 -1
- package/dist/harness/runtime.js +0 -165
- package/dist/harness/runtime.js.map +0 -1
- package/dist/harness-client.d.ts +0 -47
- package/dist/harness-client.d.ts.map +0 -1
- package/dist/harness-client.js +0 -76
- package/dist/harness-client.js.map +0 -1
- package/dist/harness-context-projection.d.ts +0 -35
- package/dist/harness-context-projection.d.ts.map +0 -1
- package/dist/harness-context-projection.js +0 -123
- package/dist/harness-context-projection.js.map +0 -1
- package/dist/harness-mcp-server.d.ts.map +0 -1
- package/dist/harness-mcp-server.js.map +0 -1
- package/dist/local-paths.d.ts +0 -11
- package/dist/local-paths.d.ts.map +0 -1
- package/dist/local-paths.js +0 -21
- package/dist/local-paths.js.map +0 -1
- package/dist/message-rendering.d.ts +0 -4
- package/dist/message-rendering.d.ts.map +0 -1
- package/dist/message-rendering.js +0 -8
- package/dist/message-rendering.js.map +0 -1
- package/dist/moltzapd-catalog.d.ts +0 -35
- package/dist/moltzapd-catalog.d.ts.map +0 -1
- package/dist/moltzapd-catalog.js +0 -117
- package/dist/moltzapd-catalog.js.map +0 -1
- package/dist/moltzapd-child-ipc.d.ts +0 -26
- package/dist/moltzapd-child-ipc.d.ts.map +0 -1
- package/dist/moltzapd-child-ipc.js +0 -31
- package/dist/moltzapd-child-ipc.js.map +0 -1
- package/dist/moltzapd-child.d.ts +0 -55
- package/dist/moltzapd-child.d.ts.map +0 -1
- package/dist/moltzapd-child.js +0 -225
- package/dist/moltzapd-child.js.map +0 -1
- package/dist/moltzapd-main.d.ts +0 -3
- package/dist/moltzapd-main.d.ts.map +0 -1
- package/dist/moltzapd-main.js +0 -18
- package/dist/moltzapd-main.js.map +0 -1
- package/dist/moltzapd-registration.d.ts +0 -40
- package/dist/moltzapd-registration.d.ts.map +0 -1
- package/dist/moltzapd-registration.js +0 -59
- package/dist/moltzapd-registration.js.map +0 -1
- package/dist/moltzapd.d.ts +0 -85
- package/dist/moltzapd.d.ts.map +0 -1
- package/dist/moltzapd.js +0 -150
- package/dist/moltzapd.js.map +0 -1
- package/dist/notification/__tests__/subscribe-signatures.types-check.d.ts +0 -53
- package/dist/notification/__tests__/subscribe-signatures.types-check.d.ts.map +0 -1
- package/dist/notification/__tests__/subscribe-signatures.types-check.js +0 -29
- package/dist/notification/__tests__/subscribe-signatures.types-check.js.map +0 -1
- package/dist/notification/errors.d.ts +0 -41
- package/dist/notification/errors.d.ts.map +0 -1
- package/dist/notification/errors.js +0 -24
- package/dist/notification/errors.js.map +0 -1
- package/dist/notification/index.d.ts +0 -6
- package/dist/notification/index.d.ts.map +0 -1
- package/dist/notification/index.js +0 -6
- package/dist/notification/index.js.map +0 -1
- package/dist/notification/stream.d.ts +0 -75
- package/dist/notification/stream.d.ts.map +0 -1
- package/dist/notification/stream.js +0 -30
- package/dist/notification/stream.js.map +0 -1
- package/dist/notification/trace.d.ts +0 -10
- package/dist/notification/trace.d.ts.map +0 -1
- package/dist/notification/trace.js +0 -34
- package/dist/notification/trace.js.map +0 -1
- package/dist/pagination.d.ts +0 -52
- package/dist/pagination.d.ts.map +0 -1
- package/dist/pagination.js +0 -51
- package/dist/pagination.js.map +0 -1
- package/dist/presentation/index.d.ts +0 -3
- package/dist/presentation/index.d.ts.map +0 -1
- package/dist/presentation/index.js +0 -3
- package/dist/presentation/index.js.map +0 -1
- package/dist/presentation/state.d.ts +0 -77
- package/dist/presentation/state.d.ts.map +0 -1
- package/dist/presentation/state.js +0 -211
- package/dist/presentation/state.js.map +0 -1
- package/dist/profile.d.ts +0 -106
- package/dist/profile.d.ts.map +0 -1
- package/dist/profile.js +0 -171
- package/dist/profile.js.map +0 -1
- package/dist/service-event-trace.d.ts +0 -15
- package/dist/service-event-trace.d.ts.map +0 -1
- package/dist/service-event-trace.js +0 -35
- package/dist/service-event-trace.js.map +0 -1
- package/dist/service.d.ts +0 -228
- package/dist/service.d.ts.map +0 -1
- package/dist/service.js +0 -485
- package/dist/service.js.map +0 -1
- package/dist/test-utils/channel-service-fixture.d.ts +0 -53
- package/dist/test-utils/channel-service-fixture.d.ts.map +0 -1
- package/dist/test-utils/channel-service-fixture.js +0 -178
- package/dist/test-utils/channel-service-fixture.js.map +0 -1
- package/dist/test-utils/fake-service.d.ts +0 -82
- package/dist/test-utils/fake-service.d.ts.map +0 -1
- package/dist/test-utils/fake-service.js +0 -108
- package/dist/test-utils/fake-service.js.map +0 -1
- package/dist/test-utils/harness.d.ts +0 -27
- package/dist/test-utils/harness.d.ts.map +0 -1
- package/dist/test-utils/harness.js +0 -33
- package/dist/test-utils/harness.js.map +0 -1
- package/dist/test-utils/ids.d.ts +0 -21
- package/dist/test-utils/ids.d.ts.map +0 -1
- package/dist/test-utils/ids.js +0 -68
- package/dist/test-utils/ids.js.map +0 -1
- package/dist/test-utils/index.d.ts +0 -56
- package/dist/test-utils/index.d.ts.map +0 -1
- package/dist/test-utils/index.js +0 -67
- package/dist/test-utils/index.js.map +0 -1
- package/dist/test-utils/process/reserve-port.d.ts +0 -20
- package/dist/test-utils/process/reserve-port.d.ts.map +0 -1
- package/dist/test-utils/process/reserve-port.js +0 -41
- package/dist/test-utils/process/reserve-port.js.map +0 -1
- package/dist/test-utils/standalone-provisioning.d.ts +0 -22
- package/dist/test-utils/standalone-provisioning.d.ts.map +0 -1
- package/dist/test-utils/standalone-provisioning.js +0 -17
- package/dist/test-utils/standalone-provisioning.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
|
@@ -1,211 +0,0 @@
|
|
|
1
|
-
import { Effect, HashMap, Option, Ref } from "effect";
|
|
2
|
-
const DEFAULT_MAX_CONTEXT_CONVERSATIONS = 5;
|
|
3
|
-
const DEFAULT_MAX_MESSAGES_PER_CONVERSATION = 3;
|
|
4
|
-
const MILLISECONDS_PER_MINUTE = 60_000;
|
|
5
|
-
const snapshot = (ref) => Effect.runSync(Ref.get(ref));
|
|
6
|
-
const getOr = (map, key, fallback) => Option.getOrElse(HashMap.get(map, key), fallback);
|
|
7
|
-
/**
|
|
8
|
-
* Per-conversation message cap. Older messages are evicted FIFO; the
|
|
9
|
-
* on-disk history remains the source of truth. Sized for typical CLI
|
|
10
|
-
* display windows — `conversations get` shows at most a few hundred.
|
|
11
|
-
*/
|
|
12
|
-
const MAX_MESSAGES_PER_CONV = 1000;
|
|
13
|
-
function newMessagesForConversation(convId, messages, viewMarkers, currentConvId) {
|
|
14
|
-
if (convId === currentConvId || messages.length === 0) {
|
|
15
|
-
return [];
|
|
16
|
-
}
|
|
17
|
-
const lastSeenId = Option.getOrUndefined(HashMap.get(viewMarkers, convId));
|
|
18
|
-
const lastSeenIndex = lastSeenId !== undefined
|
|
19
|
-
? messages.findIndex((message) => message.id === lastSeenId)
|
|
20
|
-
: -1;
|
|
21
|
-
return messages.slice(lastSeenIndex + 1);
|
|
22
|
-
}
|
|
23
|
-
function makeContextCandidate(convId, newMsgs) {
|
|
24
|
-
const last =
|
|
25
|
-
/* Safe because the surrounding invariant establishes this asserted shape. */ newMsgs[newMsgs.length - 1];
|
|
26
|
-
return {
|
|
27
|
-
convId,
|
|
28
|
-
newMsgs,
|
|
29
|
-
lastTs: new Date(last.createdAt).getTime(),
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
function minutesSince(timestamp) {
|
|
33
|
-
return Math.max(0, Math.round((Date.now() - new Date(timestamp).getTime()) / MILLISECONDS_PER_MINUTE));
|
|
34
|
-
}
|
|
35
|
-
function contextEntryForCandidate(candidate, state, maxMessagesPerConv, renderMessageText) {
|
|
36
|
-
const reportable = candidate.newMsgs.slice(-maxMessagesPerConv);
|
|
37
|
-
const last =
|
|
38
|
-
/* Safe because the surrounding invariant establishes this asserted shape. */ reportable[reportable.length - 1];
|
|
39
|
-
const senderName = getOr(state.agentNamesMap, last.senderId, () => last.senderId);
|
|
40
|
-
return {
|
|
41
|
-
entry: {
|
|
42
|
-
conversationId: candidate.convId,
|
|
43
|
-
conversationName: Option.getOrUndefined(HashMap.get(state.conversationsMap, candidate.convId))?.name,
|
|
44
|
-
senderName,
|
|
45
|
-
text: renderMessageText(last),
|
|
46
|
-
minutesAgo: minutesSince(last.createdAt),
|
|
47
|
-
count: reportable.length,
|
|
48
|
-
},
|
|
49
|
-
advance: [candidate.convId, last.id],
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
function buildContextEntries(candidates, state, maxMessagesPerConv, renderMessageText) {
|
|
53
|
-
const entries = [];
|
|
54
|
-
const pendingAdvances = [];
|
|
55
|
-
for (const candidate of candidates) {
|
|
56
|
-
const { entry, advance } = contextEntryForCandidate(candidate, state, maxMessagesPerConv, renderMessageText);
|
|
57
|
-
entries.push(entry);
|
|
58
|
-
pendingAdvances.push(advance);
|
|
59
|
-
}
|
|
60
|
-
return { entries, pendingAdvances };
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Owns the service's in-memory presentation caches and viewer-scoped context
|
|
64
|
-
* markers. Network ingress and presentation rendering remain with the caller.
|
|
65
|
-
*/
|
|
66
|
-
export class PresentationState {
|
|
67
|
-
conversationsRef = Effect.runSync(Ref.make(HashMap.empty()));
|
|
68
|
-
messagesRef = Effect.runSync(Ref.make(HashMap.empty()));
|
|
69
|
-
agentNamesRef = Effect.runSync(Ref.make(HashMap.empty()));
|
|
70
|
-
lastNotifiedRef = Effect.runSync(Ref.make(HashMap.empty()));
|
|
71
|
-
reset() {
|
|
72
|
-
return Effect.all([
|
|
73
|
-
Ref.set(this.conversationsRef, HashMap.empty()),
|
|
74
|
-
Ref.set(this.messagesRef, HashMap.empty()),
|
|
75
|
-
Ref.set(this.agentNamesRef, HashMap.empty()),
|
|
76
|
-
Ref.set(this.lastNotifiedRef, HashMap.empty()),
|
|
77
|
-
], { discard: true });
|
|
78
|
-
}
|
|
79
|
-
getConversation(convId) {
|
|
80
|
-
return Option.getOrUndefined(HashMap.get(snapshot(this.conversationsRef), convId));
|
|
81
|
-
}
|
|
82
|
-
getConversations() {
|
|
83
|
-
return [...HashMap.values(snapshot(this.conversationsRef))];
|
|
84
|
-
}
|
|
85
|
-
storeConversation(notification) {
|
|
86
|
-
const { conversationId, name, participants } = notification;
|
|
87
|
-
Effect.runSync(Ref.update(this.conversationsRef, (conversations) => {
|
|
88
|
-
// The notification carries the full membership, this agent included,
|
|
89
|
-
// so anything past two members is a group.
|
|
90
|
-
const inferredType = participants.length <= 2 ? "dm" : "group";
|
|
91
|
-
return HashMap.set(conversations, conversationId, {
|
|
92
|
-
id: conversationId,
|
|
93
|
-
type: inferredType,
|
|
94
|
-
participants: participants.map((participant) => `agent:${participant}`),
|
|
95
|
-
...(name !== undefined ? { name } : {}),
|
|
96
|
-
});
|
|
97
|
-
}));
|
|
98
|
-
}
|
|
99
|
-
getHistory(convId, limit) {
|
|
100
|
-
const messages = getOr(snapshot(this.messagesRef), convId, () => []);
|
|
101
|
-
return limit ? messages.slice(-limit) : [...messages];
|
|
102
|
-
}
|
|
103
|
-
storeMessage(conversationId, message) {
|
|
104
|
-
Effect.runSync(Ref.update(this.messagesRef, (messages) => {
|
|
105
|
-
const existing = getOr(messages, conversationId, () => []);
|
|
106
|
-
const appended = [...existing, message];
|
|
107
|
-
const capped = appended.length > MAX_MESSAGES_PER_CONV
|
|
108
|
-
? appended.slice(-MAX_MESSAGES_PER_CONV)
|
|
109
|
-
: appended;
|
|
110
|
-
return HashMap.set(messages, conversationId, capped);
|
|
111
|
-
}));
|
|
112
|
-
}
|
|
113
|
-
getAgentName(agentId) {
|
|
114
|
-
return Option.getOrUndefined(HashMap.get(snapshot(this.agentNamesRef), agentId));
|
|
115
|
-
}
|
|
116
|
-
getAgentNames() {
|
|
117
|
-
return snapshot(this.agentNamesRef);
|
|
118
|
-
}
|
|
119
|
-
cacheAgentNames(agents) {
|
|
120
|
-
if (agents.length === 0) {
|
|
121
|
-
return Effect.void;
|
|
122
|
-
}
|
|
123
|
-
return Ref.update(this.agentNamesRef, (names) => {
|
|
124
|
-
let next = names;
|
|
125
|
-
for (const agent of agents) {
|
|
126
|
-
next = HashMap.set(next, agent.id, agent.name);
|
|
127
|
-
}
|
|
128
|
-
return next;
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
peekContextEntries(currentConvId, renderMessageText, opts) {
|
|
132
|
-
const maxConversations = opts?.maxConversations ?? DEFAULT_MAX_CONTEXT_CONVERSATIONS;
|
|
133
|
-
const maxMessagesPerConversation = opts?.maxMessagesPerConv ?? DEFAULT_MAX_MESSAGES_PER_CONVERSATION;
|
|
134
|
-
const state = this.readCrossConvState(currentConvId);
|
|
135
|
-
const candidates = this.collectContextCandidates(state, currentConvId);
|
|
136
|
-
const { entries, pendingAdvances } = buildContextEntries(candidates.slice(0, maxConversations), state, maxMessagesPerConversation, renderMessageText);
|
|
137
|
-
return {
|
|
138
|
-
entries,
|
|
139
|
-
commit: () => {
|
|
140
|
-
this.advanceLastNotified(currentConvId, pendingAdvances);
|
|
141
|
-
},
|
|
142
|
-
};
|
|
143
|
-
}
|
|
144
|
-
peekFullMessages(currentConvId, renderMessageText) {
|
|
145
|
-
const { messagesMap, conversationsMap, agentNamesMap, viewMarkers } = this.readCrossConvState(currentConvId);
|
|
146
|
-
const allMessages = [];
|
|
147
|
-
const pendingAdvances = [];
|
|
148
|
-
for (const [conversationId, newMessages] of this.iterNewMessagesByConv(messagesMap, viewMarkers, currentConvId)) {
|
|
149
|
-
const conversationName = Option.getOrUndefined(HashMap.get(conversationsMap, conversationId))?.name;
|
|
150
|
-
for (const message of newMessages) {
|
|
151
|
-
allMessages.push({
|
|
152
|
-
conversationId,
|
|
153
|
-
conversationName,
|
|
154
|
-
senderName: getOr(agentNamesMap, message.senderId, () => message.senderId),
|
|
155
|
-
senderId: message.senderId,
|
|
156
|
-
text: renderMessageText(message),
|
|
157
|
-
timestamp: message.createdAt,
|
|
158
|
-
});
|
|
159
|
-
}
|
|
160
|
-
pendingAdvances.push([
|
|
161
|
-
conversationId,
|
|
162
|
-
/* Safe because the surrounding invariant establishes this asserted shape. */ newMessages[newMessages.length - 1].id,
|
|
163
|
-
]);
|
|
164
|
-
}
|
|
165
|
-
allMessages.sort((left, right) => left.timestamp.localeCompare(right.timestamp));
|
|
166
|
-
return {
|
|
167
|
-
messages: allMessages,
|
|
168
|
-
commit: () => {
|
|
169
|
-
this.advanceLastNotified(currentConvId, pendingAdvances);
|
|
170
|
-
},
|
|
171
|
-
};
|
|
172
|
-
}
|
|
173
|
-
readCrossConvState(currentConvId) {
|
|
174
|
-
const lastNotifiedMap = snapshot(this.lastNotifiedRef);
|
|
175
|
-
return {
|
|
176
|
-
messagesMap: snapshot(this.messagesRef),
|
|
177
|
-
conversationsMap: snapshot(this.conversationsRef),
|
|
178
|
-
agentNamesMap: snapshot(this.agentNamesRef),
|
|
179
|
-
viewMarkers: getOr(lastNotifiedMap, currentConvId, () => HashMap.empty()),
|
|
180
|
-
};
|
|
181
|
-
}
|
|
182
|
-
collectContextCandidates(state, currentConvId) {
|
|
183
|
-
const candidates = [];
|
|
184
|
-
for (const [conversationId, newMessages] of this.iterNewMessagesByConv(state.messagesMap, state.viewMarkers, currentConvId)) {
|
|
185
|
-
candidates.push(makeContextCandidate(conversationId, newMessages));
|
|
186
|
-
}
|
|
187
|
-
candidates.sort((left, right) => right.lastTs - left.lastTs);
|
|
188
|
-
return candidates;
|
|
189
|
-
}
|
|
190
|
-
*iterNewMessagesByConv(messagesMap, viewMarkers, currentConvId) {
|
|
191
|
-
for (const [conversationId, messages] of messagesMap) {
|
|
192
|
-
const newMessages = newMessagesForConversation(conversationId, messages, viewMarkers, currentConvId);
|
|
193
|
-
if (newMessages.length > 0) {
|
|
194
|
-
yield [conversationId, newMessages];
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
advanceLastNotified(currentConvId, pendingAdvances) {
|
|
199
|
-
if (pendingAdvances.length === 0) {
|
|
200
|
-
return;
|
|
201
|
-
}
|
|
202
|
-
Effect.runSync(Ref.update(this.lastNotifiedRef, (outer) => {
|
|
203
|
-
let markers = getOr(outer, currentConvId, () => HashMap.empty());
|
|
204
|
-
for (const [conversationId, messageId] of pendingAdvances) {
|
|
205
|
-
markers = HashMap.set(markers, conversationId, messageId);
|
|
206
|
-
}
|
|
207
|
-
return HashMap.set(outer, currentConvId, markers);
|
|
208
|
-
}));
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
//# sourceMappingURL=state.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/presentation/state.ts"],"names":[],"mappings":"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"}
|
package/dist/profile.d.ts
DELETED
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
import { Effect, Schema } from "effect";
|
|
2
|
-
/** Validates and decodes profile name values. */
|
|
3
|
-
export declare const profileName: Schema.brand<Schema.filter<typeof Schema.String>, "ProfileName">;
|
|
4
|
-
/** Branded profile name shared by slot lookup and daemon registration. */
|
|
5
|
-
export type ProfileName = Schema.Schema.Type<typeof profileName>;
|
|
6
|
-
/**
|
|
7
|
-
* A slot exists before registration and carries no AgentId. Registry commit
|
|
8
|
-
* adds the identity pair, which is irreversible for that slot.
|
|
9
|
-
*/
|
|
10
|
-
declare const profileRecordSchema: Schema.filter<Schema.Struct<{
|
|
11
|
-
agentName: typeof Schema.String;
|
|
12
|
-
mcpPort: Schema.filter<Schema.filter<typeof Schema.Number>>;
|
|
13
|
-
agentId: Schema.optional<Schema.Schema<import("@moltzap/protocol/identity").AgentId, string, never>>;
|
|
14
|
-
apiKey: Schema.optional<Schema.Schema<import("@moltzap/protocol/identity").AgentKey, string, never>>;
|
|
15
|
-
}>>;
|
|
16
|
-
/** One profile's persisted slot, with its identity once Registry has committed. */
|
|
17
|
-
export type ProfileRecord = Schema.Schema.Type<typeof profileRecordSchema>;
|
|
18
|
-
/** A slot whose Registry commit has happened, so it can authenticate. */
|
|
19
|
-
export interface RegisteredProfileRecord extends ProfileRecord {
|
|
20
|
-
readonly agentId: NonNullable<ProfileRecord["agentId"]>;
|
|
21
|
-
readonly apiKey: NonNullable<ProfileRecord["apiKey"]>;
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Narrow a slot to its registered form.
|
|
25
|
-
* @param record Slot to inspect.
|
|
26
|
-
* @returns Whether Registry has committed an identity for the slot.
|
|
27
|
-
*/
|
|
28
|
-
export declare const isRegisteredProfile: (record: ProfileRecord) => record is RegisteredProfileRecord;
|
|
29
|
-
/** Named profile view of config.json. */
|
|
30
|
-
export interface LayeredConfig {
|
|
31
|
-
readonly profiles: ReadonlyMap<ProfileName, ProfileRecord>;
|
|
32
|
-
}
|
|
33
|
-
declare const ProfileNotFoundError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
34
|
-
readonly _tag: "ProfileNotFoundError";
|
|
35
|
-
} & Readonly<A>;
|
|
36
|
-
/** Reports profile not found failures. */
|
|
37
|
-
export declare class ProfileNotFoundError extends ProfileNotFoundError_base<{
|
|
38
|
-
readonly name: string;
|
|
39
|
-
}> {
|
|
40
|
-
}
|
|
41
|
-
declare const ProfileNotRegisteredError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
42
|
-
readonly _tag: "ProfileNotRegisteredError";
|
|
43
|
-
} & Readonly<A>;
|
|
44
|
-
/** Reports a slot that exists but has no committed Registry identity. */
|
|
45
|
-
export declare class ProfileNotRegisteredError extends ProfileNotRegisteredError_base<{
|
|
46
|
-
readonly name: string;
|
|
47
|
-
}> {
|
|
48
|
-
}
|
|
49
|
-
declare const ProfileInvalidNameError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
50
|
-
readonly _tag: "ProfileInvalidNameError";
|
|
51
|
-
} & Readonly<A>;
|
|
52
|
-
/** Reports profile invalid name failures. */
|
|
53
|
-
export declare class ProfileInvalidNameError extends ProfileInvalidNameError_base<{
|
|
54
|
-
readonly name: string;
|
|
55
|
-
readonly reason: string;
|
|
56
|
-
}> {
|
|
57
|
-
}
|
|
58
|
-
declare const ProfileConfigReadError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
59
|
-
readonly _tag: "ProfileConfigReadError";
|
|
60
|
-
} & Readonly<A>;
|
|
61
|
-
/** Reports profile config read failures. */
|
|
62
|
-
export declare class ProfileConfigReadError extends ProfileConfigReadError_base<{
|
|
63
|
-
readonly path: string;
|
|
64
|
-
readonly cause: unknown;
|
|
65
|
-
}> {
|
|
66
|
-
}
|
|
67
|
-
declare const ProfileConfigWriteError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
68
|
-
readonly _tag: "ProfileConfigWriteError";
|
|
69
|
-
} & Readonly<A>;
|
|
70
|
-
/** Reports profile config write failures. */
|
|
71
|
-
export declare class ProfileConfigWriteError extends ProfileConfigWriteError_base<{
|
|
72
|
-
readonly path: string;
|
|
73
|
-
readonly cause: unknown;
|
|
74
|
-
}> {
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* Parse and brand a raw profile name. Rejects the empty string and any
|
|
78
|
-
* string that fails NAME_PATTERN.
|
|
79
|
-
* @param raw Value supplied to the operation.
|
|
80
|
-
* @returns The decoded profile name.
|
|
81
|
-
*/
|
|
82
|
-
export declare const parseProfileName: (raw: string) => Effect.Effect<ProfileName, ProfileInvalidNameError>;
|
|
83
|
-
/**
|
|
84
|
-
* Load the full layered config view. Missing file resolves to an empty
|
|
85
|
-
* view; malformed file surfaces as ProfileConfigReadError. No silent
|
|
86
|
-
* defaults on parse error.
|
|
87
|
-
*
|
|
88
|
-
* The file schema is strict: stale fields and malformed profile entries fail
|
|
89
|
-
* decode instead of being silently ignored.
|
|
90
|
-
*/
|
|
91
|
-
export declare const loadLayeredConfig: Effect.Effect<LayeredConfig, ProfileConfigReadError>;
|
|
92
|
-
/**
|
|
93
|
-
* Resolve a named profile record for daemon startup or client acquisition.
|
|
94
|
-
* @param name Name of the operation.
|
|
95
|
-
* @returns The next profile file result.
|
|
96
|
-
*/
|
|
97
|
-
export declare const resolveProfileRecord: (name: ProfileName) => Effect.Effect<ProfileRecord, ProfileNotFoundError | ProfileConfigReadError>;
|
|
98
|
-
/**
|
|
99
|
-
* Persist a new profile record under `profiles.<name>`.
|
|
100
|
-
* @param name Name of the operation.
|
|
101
|
-
* @param record Value supplied to the operation.
|
|
102
|
-
* @returns The write profile result.
|
|
103
|
-
*/
|
|
104
|
-
export declare const writeProfile: (name: ProfileName, record: ProfileRecord) => Effect.Effect<void, ProfileConfigWriteError | ProfileConfigReadError>;
|
|
105
|
-
export {};
|
|
106
|
-
//# sourceMappingURL=profile.d.ts.map
|
package/dist/profile.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../src/profile.ts"],"names":[],"mappings":"AAQA,OAAO,EAAQ,MAAM,EAAU,MAAM,EAAE,MAAM,QAAQ,CAAC;AAoBtD,iDAAiD;AACjD,eAAO,MAAM,WAAW,kEAGvB,CAAC;AAEF,0EAA0E;AAC1E,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,WAAW,CAAC,CAAC;AAYjE;;;GAGG;AACH,QAAA,MAAM,mBAAmB;;;;;GAWxB,CAAC;AAEF,mFAAmF;AACnF,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAE3E,yEAAyE;AACzE,MAAM,WAAW,uBAAwB,SAAQ,aAAa;IAC5D,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC;IACxD,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;CACvD;AAED;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,WACtB,aAAa,KACpB,MAAM,IAAI,uBACgD,CAAC;AAe9D,yCAAyC;AACzC,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;CAC5D;;;;AAID,0CAA0C;AAC1C,qBAAa,oBAAqB,SAAQ,0BAExC;IACA,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC;CAAG;;;;AAEL,yEAAyE;AACzE,qBAAa,yBAA0B,SAAQ,+BAE7C;IACA,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC;CAAG;;;;AAEL,6CAA6C;AAC7C,qBAAa,uBAAwB,SAAQ,6BAE3C;IACA,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,CAAC;CAAG;;;;AAEL,4CAA4C;AAC5C,qBAAa,sBAAuB,SAAQ,4BAE1C;IACA,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB,CAAC;CAAG;;;;AAEL,6CAA6C;AAC7C,qBAAa,uBAAwB,SAAQ,6BAE3C;IACA,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB,CAAC;CAAG;AAIL;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,QACtB,MAAM,KACV,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,uBAAuB,CAWpD,CAAC;AAoEF;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,CAC3C,aAAa,EACb,sBAAsB,CAMqB,CAAC;AAE9C;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,SACzB,WAAW,KAChB,MAAM,CAAC,MAAM,CACd,aAAa,EACb,oBAAoB,GAAG,sBAAsB,CASG,CAAC;AAgEnD;;;;;GAKG;AACH,eAAO,MAAM,YAAY,SACjB,WAAW,UACT,aAAa,KACpB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,uBAAuB,GAAG,sBAAsB,CAI7B,CAAC"}
|
package/dist/profile.js
DELETED
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Profile layer over `~/.moltzap/config.json`.
|
|
3
|
-
*
|
|
4
|
-
* Named profiles live under a top-level `profiles` key. There is no singleton
|
|
5
|
-
* credential fallback; every persisted identity is selected by profile name.
|
|
6
|
-
*/
|
|
7
|
-
import { FileSystem } from "@effect/platform";
|
|
8
|
-
import { NodeFileSystem } from "@effect/platform-node";
|
|
9
|
-
import { Data, Effect, Either, Schema } from "effect";
|
|
10
|
-
import { agentId, agentKey } from "@moltzap/protocol/identity";
|
|
11
|
-
import { getMoltZapConfigDir, getMoltZapConfigPath } from "./local-paths.js";
|
|
12
|
-
// ─── Branded names ─────────────────────────────────────────────────────────
|
|
13
|
-
const NAME_PATTERN = /^[a-z0-9][a-z0-9-]{1,30}[a-z0-9]$/;
|
|
14
|
-
const PROFILE_NAME_REASON = "must be 3-32 chars, lowercase alphanumeric and hyphens, cannot start or end with a hyphen";
|
|
15
|
-
const CONFIG_FILE_MODE = 0o600;
|
|
16
|
-
const MIN_TCP_PORT = 1;
|
|
17
|
-
const MAX_TCP_PORT = 65_535;
|
|
18
|
-
const JSON_INDENT_SPACES = 2;
|
|
19
|
-
const getConfigDir = getMoltZapConfigDir;
|
|
20
|
-
const getConfigFilePathSync = getMoltZapConfigPath;
|
|
21
|
-
const STRICT_PARSE_OPTIONS = { onExcessProperty: "error" };
|
|
22
|
-
// ─── Records ───────────────────────────────────────────────────────────────
|
|
23
|
-
/** Validates and decodes profile name values. */
|
|
24
|
-
export const profileName = Schema.String.pipe(Schema.pattern(NAME_PATTERN), Schema.brand("ProfileName"));
|
|
25
|
-
/**
|
|
26
|
-
* Loopback port the slot's daemon listens on. Operator-supplied and stable for
|
|
27
|
-
* the life of the slot: the daemon and every adapter derive the same MCP URL
|
|
28
|
-
* from it, so nothing discovers, allocates, or falls back to another port.
|
|
29
|
-
*/
|
|
30
|
-
const mcpPort = Schema.Number.pipe(Schema.int(), Schema.between(MIN_TCP_PORT, MAX_TCP_PORT));
|
|
31
|
-
/**
|
|
32
|
-
* A slot exists before registration and carries no AgentId. Registry commit
|
|
33
|
-
* adds the identity pair, which is irreversible for that slot.
|
|
34
|
-
*/
|
|
35
|
-
const profileRecordSchema = Schema.Struct({
|
|
36
|
-
agentName: Schema.String,
|
|
37
|
-
mcpPort,
|
|
38
|
-
agentId: Schema.optional(agentId),
|
|
39
|
-
apiKey: Schema.optional(agentKey),
|
|
40
|
-
}).pipe(Schema.filter((record) => (record.agentId === undefined) === (record.apiKey === undefined) ||
|
|
41
|
-
"agentId and apiKey are written together at Registry commit"));
|
|
42
|
-
/**
|
|
43
|
-
* Narrow a slot to its registered form.
|
|
44
|
-
* @param record Slot to inspect.
|
|
45
|
-
* @returns Whether Registry has committed an identity for the slot.
|
|
46
|
-
*/
|
|
47
|
-
export const isRegisteredProfile = (record) => record.agentId !== undefined && record.apiKey !== undefined;
|
|
48
|
-
const profileMapSchema = Schema.Record({
|
|
49
|
-
key: profileName,
|
|
50
|
-
value: profileRecordSchema,
|
|
51
|
-
});
|
|
52
|
-
const profileFileSchema = Schema.Struct({
|
|
53
|
-
profiles: Schema.optional(profileMapSchema),
|
|
54
|
-
});
|
|
55
|
-
const profileFileTextSchema = Schema.parseJson(profileFileSchema, {
|
|
56
|
-
space: JSON_INDENT_SPACES,
|
|
57
|
-
});
|
|
58
|
-
// ─── Errors ────────────────────────────────────────────────────────────────
|
|
59
|
-
/** Reports profile not found failures. */
|
|
60
|
-
export class ProfileNotFoundError extends Data.TaggedError("ProfileNotFoundError") {
|
|
61
|
-
}
|
|
62
|
-
/** Reports a slot that exists but has no committed Registry identity. */
|
|
63
|
-
export class ProfileNotRegisteredError extends Data.TaggedError("ProfileNotRegisteredError") {
|
|
64
|
-
}
|
|
65
|
-
/** Reports profile invalid name failures. */
|
|
66
|
-
export class ProfileInvalidNameError extends Data.TaggedError("ProfileInvalidNameError") {
|
|
67
|
-
}
|
|
68
|
-
/** Reports profile config read failures. */
|
|
69
|
-
export class ProfileConfigReadError extends Data.TaggedError("ProfileConfigReadError") {
|
|
70
|
-
}
|
|
71
|
-
/** Reports profile config write failures. */
|
|
72
|
-
export class ProfileConfigWriteError extends Data.TaggedError("ProfileConfigWriteError") {
|
|
73
|
-
}
|
|
74
|
-
// ─── Public API ────────────────────────────────────────────────────────────
|
|
75
|
-
/**
|
|
76
|
-
* Parse and brand a raw profile name. Rejects the empty string and any
|
|
77
|
-
* string that fails NAME_PATTERN.
|
|
78
|
-
* @param raw Value supplied to the operation.
|
|
79
|
-
* @returns The decoded profile name.
|
|
80
|
-
*/
|
|
81
|
-
export const parseProfileName = (raw) => {
|
|
82
|
-
return Schema.decodeUnknown(profileName)(raw).pipe(Effect.catchTag("ParseError", () => Effect.fail(new ProfileInvalidNameError({
|
|
83
|
-
name: raw,
|
|
84
|
-
reason: raw.length === 0 ? "empty string" : PROFILE_NAME_REASON,
|
|
85
|
-
}))));
|
|
86
|
-
};
|
|
87
|
-
const readProfileFileText = (configPath) => FileSystem.FileSystem.pipe(Effect.flatMap((fileSystem) => fileSystem
|
|
88
|
-
.exists(configPath)
|
|
89
|
-
.pipe(Effect.flatMap((exists) => exists
|
|
90
|
-
? fileSystem.readFileString(configPath, "utf-8")
|
|
91
|
-
: Effect.succeed(null)))), Effect.provide(NodeFileSystem.layer), Effect.either, Effect.flatMap(Either.match({
|
|
92
|
-
onLeft: (cause) => Effect.fail(new ProfileConfigReadError({ path: configPath, cause })),
|
|
93
|
-
onRight: (value) => Effect.succeed(value),
|
|
94
|
-
})));
|
|
95
|
-
const decodeProfileFileText = (configPath, text) => Schema.decodeUnknown(profileFileTextSchema, STRICT_PARSE_OPTIONS)(text).pipe(Effect.either, Effect.flatMap(Either.match({
|
|
96
|
-
onLeft: (cause) => Effect.fail(new ProfileConfigReadError({ path: configPath, cause })),
|
|
97
|
-
onRight: Effect.succeed,
|
|
98
|
-
})));
|
|
99
|
-
const readProfileFile = () => Effect.gen(function* () {
|
|
100
|
-
const configPath = getConfigFilePathSync();
|
|
101
|
-
const text = yield* readProfileFileText(configPath);
|
|
102
|
-
if (text === null) {
|
|
103
|
-
return { file: {}, existed: false };
|
|
104
|
-
}
|
|
105
|
-
const file = yield* decodeProfileFileText(configPath, text);
|
|
106
|
-
return { file, existed: true };
|
|
107
|
-
});
|
|
108
|
-
function profilesFromFile(file) {
|
|
109
|
-
return new Map(
|
|
110
|
-
/* Safe because the surrounding invariant establishes this asserted shape. */ Object.entries(file.profiles ?? {}));
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* Load the full layered config view. Missing file resolves to an empty
|
|
114
|
-
* view; malformed file surfaces as ProfileConfigReadError. No silent
|
|
115
|
-
* defaults on parse error.
|
|
116
|
-
*
|
|
117
|
-
* The file schema is strict: stale fields and malformed profile entries fail
|
|
118
|
-
* decode instead of being silently ignored.
|
|
119
|
-
*/
|
|
120
|
-
export const loadLayeredConfig = Effect.gen(function* () {
|
|
121
|
-
const { file } = yield* readProfileFile();
|
|
122
|
-
return {
|
|
123
|
-
profiles: profilesFromFile(file),
|
|
124
|
-
};
|
|
125
|
-
}).pipe(Effect.withSpan("loadLayeredConfig"));
|
|
126
|
-
/**
|
|
127
|
-
* Resolve a named profile record for daemon startup or client acquisition.
|
|
128
|
-
* @param name Name of the operation.
|
|
129
|
-
* @returns The next profile file result.
|
|
130
|
-
*/
|
|
131
|
-
export const resolveProfileRecord = (name) => Effect.gen(function* () {
|
|
132
|
-
const layered = yield* loadLayeredConfig;
|
|
133
|
-
const found = layered.profiles.get(name);
|
|
134
|
-
if (found === undefined) {
|
|
135
|
-
return yield* new ProfileNotFoundError({ name });
|
|
136
|
-
}
|
|
137
|
-
return found;
|
|
138
|
-
}).pipe(Effect.withSpan("resolveProfileRecord"));
|
|
139
|
-
function nextProfileFile(file, name, record) {
|
|
140
|
-
return {
|
|
141
|
-
profiles: {
|
|
142
|
-
...file.profiles,
|
|
143
|
-
[name]: record,
|
|
144
|
-
},
|
|
145
|
-
};
|
|
146
|
-
}
|
|
147
|
-
const encodeProfileFileText = (configPath, file) => Schema.encode(profileFileTextSchema, STRICT_PARSE_OPTIONS)(file).pipe(Effect.either, Effect.flatMap(Either.match({
|
|
148
|
-
onLeft: (cause) => Effect.fail(new ProfileConfigWriteError({ path: configPath, cause })),
|
|
149
|
-
onRight: Effect.succeed,
|
|
150
|
-
})));
|
|
151
|
-
const writeProfileFile = (next) => {
|
|
152
|
-
const configDir = getConfigDir();
|
|
153
|
-
const configPath = getConfigFilePathSync();
|
|
154
|
-
return FileSystem.FileSystem.pipe(Effect.flatMap((fileSystem) => encodeProfileFileText(configPath, next).pipe(Effect.flatMap((text) => fileSystem.makeDirectory(configDir, { recursive: true }).pipe(Effect.zipRight(fileSystem.writeFileString(configPath, `${text}\n`, {
|
|
155
|
-
mode: CONFIG_FILE_MODE,
|
|
156
|
-
})))))), Effect.provide(NodeFileSystem.layer), Effect.either, Effect.flatMap(Either.match({
|
|
157
|
-
onLeft: (cause) => Effect.fail(new ProfileConfigWriteError({ path: configPath, cause })),
|
|
158
|
-
onRight: (value) => Effect.succeed(value),
|
|
159
|
-
})));
|
|
160
|
-
};
|
|
161
|
-
/**
|
|
162
|
-
* Persist a new profile record under `profiles.<name>`.
|
|
163
|
-
* @param name Name of the operation.
|
|
164
|
-
* @param record Value supplied to the operation.
|
|
165
|
-
* @returns The write profile result.
|
|
166
|
-
*/
|
|
167
|
-
export const writeProfile = (name, record) => Effect.gen(function* () {
|
|
168
|
-
const { file } = yield* readProfileFile();
|
|
169
|
-
yield* writeProfileFile(nextProfileFile(file, name, record));
|
|
170
|
-
}).pipe(Effect.withSpan("writeProfile"));
|
|
171
|
-
//# sourceMappingURL=profile.js.map
|
package/dist/profile.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"profile.js","sourceRoot":"","sources":["../src/profile.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/** @file Best-effort client event trace persistence. */
|
|
2
|
-
import { ConfigProvider, Effect } from "effect";
|
|
3
|
-
/**
|
|
4
|
-
* Resolve the configured trace directory while preserving empty-as-disabled.
|
|
5
|
-
* @param configProvider Source used to resolve the environment-backed config.
|
|
6
|
-
* @returns A nonempty configured directory, or `undefined` when disabled.
|
|
7
|
-
*/
|
|
8
|
-
export declare function getClientEventLogDir(configProvider?: ConfigProvider.ConfigProvider): string | undefined;
|
|
9
|
-
/**
|
|
10
|
-
* Append one client event trace when trace persistence is configured.
|
|
11
|
-
* @param record Structured event fields to persist.
|
|
12
|
-
* @returns A best-effort write Effect that logs and absorbs storage failures.
|
|
13
|
-
*/
|
|
14
|
-
export declare function appendClientEventTrace(record: Record<string, unknown>): Effect.Effect<void>;
|
|
15
|
-
//# sourceMappingURL=service-event-trace.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"service-event-trace.d.ts","sourceRoot":"","sources":["../src/service-event-trace.ts"],"names":[],"mappings":"AAAA,wDAAwD;AAIxD,OAAO,EAAU,cAAc,EAAE,MAAM,EAAU,MAAM,QAAQ,CAAC;AAMhE;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,cAAc,CAAC,EAAE,cAAc,CAAC,cAAc,GAC7C,MAAM,GAAG,SAAS,CAMpB;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CA0BrB"}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
/** @file Best-effort client event trace persistence. */
|
|
2
|
-
import { FileSystem, Path } from "@effect/platform";
|
|
3
|
-
import { NodeContext } from "@effect/platform-node";
|
|
4
|
-
import { Config, ConfigProvider, Effect, Option } from "effect";
|
|
5
|
-
const clientEventLogDir = Config.option(Config.string("MOLTZAP_CLIENT_EVENT_LOG_DIR"));
|
|
6
|
-
/**
|
|
7
|
-
* Resolve the configured trace directory while preserving empty-as-disabled.
|
|
8
|
-
* @param configProvider Source used to resolve the environment-backed config.
|
|
9
|
-
* @returns A nonempty configured directory, or `undefined` when disabled.
|
|
10
|
-
*/
|
|
11
|
-
export function getClientEventLogDir(configProvider) {
|
|
12
|
-
const provider = configProvider ?? ConfigProvider.fromEnv();
|
|
13
|
-
const directory = Option.getOrUndefined(Effect.runSync(clientEventLogDir.pipe(Effect.withConfigProvider(provider))));
|
|
14
|
-
return directory === "" ? undefined : directory;
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* Append one client event trace when trace persistence is configured.
|
|
18
|
-
* @param record Structured event fields to persist.
|
|
19
|
-
* @returns A best-effort write Effect that logs and absorbs storage failures.
|
|
20
|
-
*/
|
|
21
|
-
export function appendClientEventTrace(record) {
|
|
22
|
-
const dir = getClientEventLogDir();
|
|
23
|
-
if (dir === undefined) {
|
|
24
|
-
return Effect.void;
|
|
25
|
-
}
|
|
26
|
-
return Effect.gen(function* () {
|
|
27
|
-
const fileSystem = yield* FileSystem.FileSystem;
|
|
28
|
-
const path = yield* Path.Path;
|
|
29
|
-
const agentId = typeof record.agentId === "string" ? record.agentId : "unknown";
|
|
30
|
-
const safeAgentId = /^[A-Za-z0-9_-]+$/.test(agentId) ? agentId : "unknown";
|
|
31
|
-
yield* Effect.zipRight(fileSystem.makeDirectory(dir, { recursive: true }), fileSystem.writeFileString(path.join(dir, `client-events-${safeAgentId}.jsonl`), `${JSON.stringify(record)}\n`, { flag: "a" }));
|
|
32
|
-
}).pipe(Effect.withSpan("appendClientEventTrace"), Effect.provide(NodeContext.layer), Effect.catchAll((error) => Effect.logWarning("moltzap client event trace write failed", error)));
|
|
33
|
-
}
|
|
34
|
-
// safer-arch-ignore no-trivial-sink-file: Event-trace lifecycle is isolated to keep the public service implementation within the normative function and file-size limits.
|
|
35
|
-
//# sourceMappingURL=service-event-trace.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"service-event-trace.js","sourceRoot":"","sources":["../src/service-event-trace.ts"],"names":[],"mappings":"AAAA,wDAAwD;AAExD,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhE,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,CACrC,MAAM,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAC9C,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,cAA8C;IAE9C,MAAM,QAAQ,GAAG,cAAc,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;IAC5D,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,CACrC,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAC5E,CAAC;IACF,OAAO,SAAS,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;AAClD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CACpC,MAA+B;IAE/B,MAAM,GAAG,GAAG,oBAAoB,EAAE,CAAC;IACnC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IACD,OAAO,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QACzB,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC;QAChD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC9B,MAAM,OAAO,GACX,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QAClE,MAAM,WAAW,GAAG,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3E,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CACpB,UAAU,CAAC,aAAa,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,EAClD,UAAU,CAAC,eAAe,CACxB,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,iBAAiB,WAAW,QAAQ,CAAC,EACpD,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAC7B,EAAE,IAAI,EAAE,GAAG,EAAE,CACd,CACF,CAAC;IACJ,CAAC,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,QAAQ,CAAC,wBAAwB,CAAC,EACzC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,EACjC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CACxB,MAAM,CAAC,UAAU,CAAC,yCAAyC,EAAE,KAAK,CAAC,CACpE,CACF,CAAC;AACJ,CAAC;AACD,0KAA0K"}
|