@moltzap/client 2026.811.0 → 2026.812.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/dist/channel-base/index.d.ts +4 -4
- package/dist/channel-base/index.d.ts.map +1 -1
- package/dist/channel-base/index.js +6 -3
- package/dist/channel-base/index.js.map +1 -1
- package/dist/channel-core-enrichment.d.ts +24 -0
- package/dist/channel-core-enrichment.d.ts.map +1 -1
- package/dist/channel-core-enrichment.js +94 -20
- package/dist/channel-core-enrichment.js.map +1 -1
- package/dist/channel-core.d.ts +3 -1
- package/dist/channel-core.d.ts.map +1 -1
- package/dist/channel-core.js +2 -0
- package/dist/channel-core.js.map +1 -1
- package/dist/config.d.ts +2 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +7 -1
- package/dist/config.js.map +1 -1
- package/dist/config.test-utils.d.ts +6 -0
- package/dist/config.test-utils.d.ts.map +1 -1
- package/dist/config.test-utils.js +5 -1
- package/dist/config.test-utils.js.map +1 -1
- package/dist/harness/client-runtime.d.ts +12 -5
- package/dist/harness/client-runtime.d.ts.map +1 -1
- package/dist/harness/client-runtime.js +16 -2
- package/dist/harness/client-runtime.js.map +1 -1
- package/dist/harness/index.d.ts +2 -2
- package/dist/harness/index.d.ts.map +1 -1
- package/dist/harness/index.js +2 -2
- package/dist/harness/index.js.map +1 -1
- package/dist/harness/runtime.d.ts +152 -0
- package/dist/harness/runtime.d.ts.map +1 -1
- package/dist/harness/runtime.js +99 -2
- package/dist/harness/runtime.js.map +1 -1
- package/dist/harness-client.d.ts +17 -13
- package/dist/harness-client.d.ts.map +1 -1
- package/dist/harness-client.js +59 -4
- package/dist/harness-client.js.map +1 -1
- package/dist/harness-context-projection.d.ts +35 -0
- package/dist/harness-context-projection.d.ts.map +1 -0
- package/dist/harness-context-projection.js +123 -0
- package/dist/harness-context-projection.js.map +1 -0
- package/dist/harness-mcp-server.d.ts +1 -2
- package/dist/harness-mcp-server.d.ts.map +1 -1
- package/dist/harness-mcp-server.js +11 -17
- package/dist/harness-mcp-server.js.map +1 -1
- package/dist/harness-mcp-wire.d.ts +47 -15
- package/dist/harness-mcp-wire.d.ts.map +1 -1
- package/dist/harness-mcp-wire.js +93 -37
- package/dist/harness-mcp-wire.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/local-paths.d.ts +0 -11
- package/dist/local-paths.d.ts.map +1 -1
- package/dist/local-paths.js +0 -12
- package/dist/local-paths.js.map +1 -1
- package/dist/moltzapd-catalog.d.ts +35 -0
- package/dist/moltzapd-catalog.d.ts.map +1 -0
- package/dist/moltzapd-catalog.js +117 -0
- package/dist/moltzapd-catalog.js.map +1 -0
- package/dist/moltzapd-child-ipc.d.ts +26 -0
- package/dist/moltzapd-child-ipc.d.ts.map +1 -0
- package/dist/moltzapd-child-ipc.js +31 -0
- package/dist/moltzapd-child-ipc.js.map +1 -0
- package/dist/moltzapd-child.d.ts +55 -0
- package/dist/moltzapd-child.d.ts.map +1 -0
- package/dist/moltzapd-child.js +225 -0
- package/dist/moltzapd-child.js.map +1 -0
- package/dist/moltzapd-main.d.ts +3 -0
- package/dist/moltzapd-main.d.ts.map +1 -0
- package/dist/moltzapd-main.js +18 -0
- package/dist/moltzapd-main.js.map +1 -0
- package/dist/moltzapd-registration.d.ts +40 -0
- package/dist/moltzapd-registration.d.ts.map +1 -0
- package/dist/moltzapd-registration.js +59 -0
- package/dist/moltzapd-registration.js.map +1 -0
- package/dist/moltzapd.d.ts +56 -9
- package/dist/moltzapd.d.ts.map +1 -1
- package/dist/moltzapd.js +108 -36
- package/dist/moltzapd.js.map +1 -1
- package/dist/notification/trace.d.ts +10 -0
- package/dist/notification/trace.d.ts.map +1 -0
- package/dist/notification/trace.js +34 -0
- package/dist/notification/trace.js.map +1 -0
- package/dist/presentation/index.d.ts +3 -0
- package/dist/presentation/index.d.ts.map +1 -0
- package/dist/presentation/index.js +3 -0
- package/dist/presentation/index.js.map +1 -0
- package/dist/presentation/state.d.ts +77 -0
- package/dist/presentation/state.d.ts.map +1 -0
- package/dist/presentation/state.js +211 -0
- package/dist/presentation/state.js.map +1 -0
- package/dist/profile.d.ts +30 -28
- package/dist/profile.d.ts.map +1 -1
- package/dist/profile.js +28 -20
- package/dist/profile.js.map +1 -1
- package/dist/service.d.ts +8 -79
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +29 -333
- package/dist/service.js.map +1 -1
- package/dist/test-utils/fake-service.d.ts +3 -5
- package/dist/test-utils/fake-service.d.ts.map +1 -1
- package/dist/test-utils/fake-service.js +12 -12
- package/dist/test-utils/fake-service.js.map +1 -1
- package/dist/test-utils/index.d.ts +2 -0
- package/dist/test-utils/index.d.ts.map +1 -1
- package/dist/test-utils/index.js +2 -0
- package/dist/test-utils/index.js.map +1 -1
- package/dist/test-utils/process/reserve-port.d.ts +20 -0
- package/dist/test-utils/process/reserve-port.d.ts.map +1 -0
- package/dist/test-utils/process/reserve-port.js +41 -0
- package/dist/test-utils/process/reserve-port.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +32 -6
- package/dist/cli/adapters.d.ts +0 -21
- package/dist/cli/adapters.d.ts.map +0 -1
- package/dist/cli/adapters.js +0 -111
- package/dist/cli/adapters.js.map +0 -1
- package/dist/cli/commands/agents.d.ts +0 -11
- package/dist/cli/commands/agents.d.ts.map +0 -1
- package/dist/cli/commands/agents.js +0 -27
- package/dist/cli/commands/agents.js.map +0 -1
- package/dist/cli/commands/conversations.d.ts +0 -18
- package/dist/cli/commands/conversations.d.ts.map +0 -1
- package/dist/cli/commands/conversations.js +0 -33
- package/dist/cli/commands/conversations.js.map +0 -1
- package/dist/cli/commands/messages.d.ts +0 -41
- package/dist/cli/commands/messages.d.ts.map +0 -1
- package/dist/cli/commands/messages.js +0 -39
- package/dist/cli/commands/messages.js.map +0 -1
- package/dist/cli/commands/register.d.ts +0 -46
- package/dist/cli/commands/register.d.ts.map +0 -1
- package/dist/cli/commands/register.js +0 -103
- package/dist/cli/commands/register.js.map +0 -1
- package/dist/cli/commands/send.d.ts +0 -53
- package/dist/cli/commands/send.d.ts.map +0 -1
- package/dist/cli/commands/send.js +0 -57
- package/dist/cli/commands/send.js.map +0 -1
- package/dist/cli/commands/start.d.ts +0 -34
- package/dist/cli/commands/start.d.ts.map +0 -1
- package/dist/cli/commands/start.js +0 -59
- package/dist/cli/commands/start.js.map +0 -1
- package/dist/cli/commands/status.d.ts +0 -7
- package/dist/cli/commands/status.d.ts.map +0 -1
- package/dist/cli/commands/status.js +0 -16
- package/dist/cli/commands/status.js.map +0 -1
- package/dist/cli/commands/test-transport.d.ts +0 -28
- package/dist/cli/commands/test-transport.d.ts.map +0 -1
- package/dist/cli/commands/test-transport.js +0 -40
- package/dist/cli/commands/test-transport.js.map +0 -1
- package/dist/cli/index.d.ts +0 -3
- package/dist/cli/index.d.ts.map +0 -1
- package/dist/cli/index.js +0 -105
- package/dist/cli/index.js.map +0 -1
- package/dist/cli/output.d.ts +0 -14
- package/dist/cli/output.d.ts.map +0 -1
- package/dist/cli/output.js +0 -19
- package/dist/cli/output.js.map +0 -1
- package/dist/cli/socket-client.d.ts +0 -28
- package/dist/cli/socket-client.d.ts.map +0 -1
- package/dist/cli/socket-client.js +0 -63
- package/dist/cli/socket-client.js.map +0 -1
- package/dist/cli/transport.d.ts +0 -132
- package/dist/cli/transport.d.ts.map +0 -1
- package/dist/cli/transport.js +0 -127
- package/dist/cli/transport.js.map +0 -1
- package/dist/local-daemon-rpc.d.ts +0 -1170
- package/dist/local-daemon-rpc.d.ts.map +0 -1
- package/dist/local-daemon-rpc.js +0 -178
- package/dist/local-daemon-rpc.js.map +0 -1
- package/dist/local-history.d.ts +0 -75
- package/dist/local-history.d.ts.map +0 -1
- package/dist/local-history.js +0 -82
- package/dist/local-history.js.map +0 -1
- package/dist/local-socket-server.d.ts +0 -33
- package/dist/local-socket-server.d.ts.map +0 -1
- package/dist/local-socket-server.js +0 -100
- package/dist/local-socket-server.js.map +0 -1
- package/dist/refs.d.ts +0 -18
- package/dist/refs.d.ts.map +0 -1
- package/dist/refs.js +0 -18
- package/dist/refs.js.map +0 -1
- package/dist/service-helpers.d.ts +0 -55
- package/dist/service-helpers.d.ts.map +0 -1
- package/dist/service-helpers.js +0 -108
- package/dist/service-helpers.js.map +0 -1
- package/dist/service-local-daemon.d.ts +0 -32
- package/dist/service-local-daemon.d.ts.map +0 -1
- package/dist/service-local-daemon.js +0 -153
- package/dist/service-local-daemon.js.map +0 -1
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registry commit for a profile slot that has no identity yet.
|
|
3
|
+
*
|
|
4
|
+
* Registration is non-idempotent: the server generates the key and
|
|
5
|
+
* `agents.name` is unique, so a lost response requires a new agent name rather
|
|
6
|
+
* than a retry.
|
|
7
|
+
*/
|
|
8
|
+
import { Effect } from "effect";
|
|
9
|
+
import { type RegisterAgentError } from "./auth.js";
|
|
10
|
+
import { type ServiceConfigError } from "./config.js";
|
|
11
|
+
import type { HarnessRegisterInput, HarnessRegisterResult } from "./harness/index.js";
|
|
12
|
+
import type { DaemonPhaseState } from "./moltzapd-catalog.js";
|
|
13
|
+
import { type ProfileName, type ProfileRecord } from "./profile.js";
|
|
14
|
+
import type { ServiceRpcError } from "./service.js";
|
|
15
|
+
/** The Registry call, the server address lookup, and the slot write. */
|
|
16
|
+
export type CommitError = RegisterAgentError | ServiceConfigError | Error;
|
|
17
|
+
/** A commit plus the activation it triggers. */
|
|
18
|
+
export type RegistrationError = CommitError | ServiceRpcError;
|
|
19
|
+
interface RegisterHandlerInput {
|
|
20
|
+
readonly name: ProfileName;
|
|
21
|
+
readonly record: ProfileRecord;
|
|
22
|
+
readonly phase: DaemonPhaseState;
|
|
23
|
+
readonly activation: Effect.Semaphore;
|
|
24
|
+
readonly activate: () => Effect.Effect<void, ServiceConfigError | ServiceRpcError>;
|
|
25
|
+
readonly onCatalogChanged: () => void;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Builds the `register` tool handler for a slot catalog.
|
|
29
|
+
* @param input Slot identity, phase holder, and the activation to run on commit.
|
|
30
|
+
* @param input.name Profile name owning the slot.
|
|
31
|
+
* @param input.record Slot record the commit writes back into.
|
|
32
|
+
* @param input.phase Current catalog state.
|
|
33
|
+
* @param input.activation Serializes commit with the activation it triggers.
|
|
34
|
+
* @param input.activate Transition to the active catalog.
|
|
35
|
+
* @param input.onCatalogChanged Announces the new catalog to open subscribers.
|
|
36
|
+
* @returns The registration handler.
|
|
37
|
+
*/
|
|
38
|
+
export declare const makeRegisterHandler: ({ name, record, phase, activation, activate, onCatalogChanged, }: RegisterHandlerInput) => (payload: HarnessRegisterInput) => Effect.Effect<HarnessRegisterResult, RegistrationError>;
|
|
39
|
+
export {};
|
|
40
|
+
//# sourceMappingURL=moltzapd-registration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"moltzapd-registration.d.ts","sourceRoot":"","sources":["../src/moltzapd-registration.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAiB,KAAK,kBAAkB,EAAE,MAAM,WAAW,CAAC;AACnE,OAAO,EAA4B,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,KAAK,EACV,oBAAoB,EACpB,qBAAqB,EACtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,aAAa,EACnB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD,wEAAwE;AACxE,MAAM,MAAM,WAAW,GAAG,kBAAkB,GAAG,kBAAkB,GAAG,KAAK,CAAC;AAE1E,gDAAgD;AAChD,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG,eAAe,CAAC;AAyC9D,UAAU,oBAAoB;IAC5B,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAC;IACjC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,MAAM,MAAM,CAAC,MAAM,CACpC,IAAI,EACJ,kBAAkB,GAAG,eAAe,CACrC,CAAC;IACF,QAAQ,CAAC,gBAAgB,EAAE,MAAM,IAAI,CAAC;CACvC;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,mBAAmB,qEAQ3B,oBAAoB,eAEZ,oBAAoB,KAC5B,MAAM,CAAC,MAAM,CAAC,qBAAqB,EAAE,iBAAiB,CAgBtD,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registry commit for a profile slot that has no identity yet.
|
|
3
|
+
*
|
|
4
|
+
* Registration is non-idempotent: the server generates the key and
|
|
5
|
+
* `agents.name` is unique, so a lost response requires a new agent name rather
|
|
6
|
+
* than a retry.
|
|
7
|
+
*/
|
|
8
|
+
import { Effect } from "effect";
|
|
9
|
+
import { registerAgent } from "./auth.js";
|
|
10
|
+
import { getHttpUrl, getServerUrl } from "./config.js";
|
|
11
|
+
import { writeProfile, } from "./profile.js";
|
|
12
|
+
const commitRegistration = ({ name, record, payload, }) => Effect.gen(function* () {
|
|
13
|
+
const httpUrl = yield* getHttpUrl;
|
|
14
|
+
const serverUrl = yield* getServerUrl;
|
|
15
|
+
const result = yield* registerAgent(httpUrl, record.agentName, {
|
|
16
|
+
...(payload.inviteCode === undefined
|
|
17
|
+
? {}
|
|
18
|
+
: { inviteCode: payload.inviteCode }),
|
|
19
|
+
...(payload.description === undefined
|
|
20
|
+
? {}
|
|
21
|
+
: { description: payload.description }),
|
|
22
|
+
});
|
|
23
|
+
// The slot keeps its name and port; commit only adds the identity pair.
|
|
24
|
+
yield* writeProfile(name, {
|
|
25
|
+
...record,
|
|
26
|
+
agentId: result.agentId,
|
|
27
|
+
apiKey: result.apiKey,
|
|
28
|
+
});
|
|
29
|
+
// The key stays on disk. Callers get the identity and where to reach it.
|
|
30
|
+
return {
|
|
31
|
+
agentId: result.agentId,
|
|
32
|
+
agentName: record.agentName,
|
|
33
|
+
serverUrl,
|
|
34
|
+
};
|
|
35
|
+
}).pipe(Effect.withSpan("moltzapd.register"));
|
|
36
|
+
/**
|
|
37
|
+
* Builds the `register` tool handler for a slot catalog.
|
|
38
|
+
* @param input Slot identity, phase holder, and the activation to run on commit.
|
|
39
|
+
* @param input.name Profile name owning the slot.
|
|
40
|
+
* @param input.record Slot record the commit writes back into.
|
|
41
|
+
* @param input.phase Current catalog state.
|
|
42
|
+
* @param input.activation Serializes commit with the activation it triggers.
|
|
43
|
+
* @param input.activate Transition to the active catalog.
|
|
44
|
+
* @param input.onCatalogChanged Announces the new catalog to open subscribers.
|
|
45
|
+
* @returns The registration handler.
|
|
46
|
+
*/
|
|
47
|
+
export const makeRegisterHandler = ({ name, record, phase, activation, activate, onCatalogChanged, }) => (payload) => activation.withPermits(1)(Effect.gen(function* () {
|
|
48
|
+
if (phase.read().kind === "active") {
|
|
49
|
+
// eslint-disable-next-line agent-code-guard/effect-error-erasure -- Local MCP validation stays on the established broad Error boundary without adding a portable protocol error.
|
|
50
|
+
return yield* Effect.fail(new Error("This profile slot already has an agent identity"));
|
|
51
|
+
}
|
|
52
|
+
const result = yield* commitRegistration({ name, record, payload });
|
|
53
|
+
yield* activate();
|
|
54
|
+
// Clients holding an open subscription learn the catalog changed; any
|
|
55
|
+
// later tools/list re-reads the phase regardless.
|
|
56
|
+
onCatalogChanged();
|
|
57
|
+
return result;
|
|
58
|
+
}).pipe(Effect.withSpan("makeRegisterHandler")));
|
|
59
|
+
//# sourceMappingURL=moltzapd-registration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"moltzapd-registration.js","sourceRoot":"","sources":["../src/moltzapd-registration.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,aAAa,EAA2B,MAAM,WAAW,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,YAAY,EAA2B,MAAM,aAAa,CAAC;AAMhF,OAAO,EACL,YAAY,GAGb,MAAM,cAAc,CAAC;AAetB,MAAM,kBAAkB,GAAG,CAAC,EAC1B,IAAI,EACJ,MAAM,EACN,OAAO,GACiB,EAGxB,EAAE,CACF,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC;IAClC,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,YAAY,CAAC;IACtC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,SAAS,EAAE;QAC7D,GAAG,CAAC,OAAO,CAAC,UAAU,KAAK,SAAS;YAClC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC;QACvC,GAAG,CAAC,OAAO,CAAC,WAAW,KAAK,SAAS;YACnC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC;KAC1C,CAAC,CAAC;IACH,wEAAwE;IACxE,KAAK,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE;QACxB,GAAG,MAAM;QACT,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CAAC,CAAC;IACH,yEAAyE;IACzE,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,SAAS;KACV,CAAC;AACJ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,CAAC;AAchD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAC9B,CAAC,EACC,IAAI,EACJ,MAAM,EACN,KAAK,EACL,UAAU,EACV,QAAQ,EACR,gBAAgB,GACK,EAAE,EAAE,CAC3B,CACE,OAA6B,EAC4B,EAAE,CAC3D,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CACvB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACnC,iLAAiL;QACjL,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CACvB,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAC7D,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,kBAAkB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IACpE,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;IAClB,sEAAsE;IACtE,kDAAkD;IAClD,gBAAgB,EAAE,CAAC;IACnB,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC,CAChD,CAAC"}
|
package/dist/moltzapd.d.ts
CHANGED
|
@@ -4,35 +4,82 @@ import { type ServiceRpcError } from "./service.js";
|
|
|
4
4
|
import type { ServiceConfigError } from "./config.js";
|
|
5
5
|
interface MoltzapdOptions {
|
|
6
6
|
readonly profileName: string;
|
|
7
|
-
readonly port: number;
|
|
8
7
|
}
|
|
9
8
|
type MoltzapdServer = Effect.Effect.Success<ReturnType<typeof acquireHarnessMcpHttpServer>>;
|
|
9
|
+
/** Everything composing and running the daemon can fail with. */
|
|
10
|
+
type DaemonError = Error | ServiceConfigError | ServiceRpcError;
|
|
11
|
+
interface DaemonResourceScopes {
|
|
12
|
+
readonly activationScope: Scope.CloseableScope;
|
|
13
|
+
readonly daemonScope: Scope.CloseableScope;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Creates the daemon's nested resource owners. The activation scope is
|
|
17
|
+
* registered before the listener, so sequential LIFO shutdown closes the MCP
|
|
18
|
+
* listener before disconnecting the active channel core.
|
|
19
|
+
* @param parentScope Scope that owns the complete daemon lifetime.
|
|
20
|
+
* @returns Separate owners for the listener and activation resources.
|
|
21
|
+
* @internal
|
|
22
|
+
*/
|
|
23
|
+
export declare const makeDaemonResourceScopes: (parentScope: Scope.Scope) => Effect.Effect<DaemonResourceScopes>;
|
|
10
24
|
/**
|
|
11
|
-
*
|
|
12
|
-
*
|
|
25
|
+
* Runs one activation attempt in a child of the daemon scope.
|
|
26
|
+
*
|
|
27
|
+
* A successful attempt remains owned by the daemon. A failed or interrupted
|
|
28
|
+
* attempt closes completely before its error reaches the caller, so a later
|
|
29
|
+
* attempt cannot overlap a partial service, core, or network connection.
|
|
30
|
+
*
|
|
31
|
+
* @param daemonScope Scope owning a successful activation.
|
|
32
|
+
* @param attempt Scoped resources acquired by one activation attempt.
|
|
33
|
+
* @returns The attempt result after failed resources have been released.
|
|
34
|
+
* @internal
|
|
35
|
+
*/
|
|
36
|
+
export declare const runScopedActivationAttempt: <A, E>(daemonScope: Scope.Scope, attempt: Effect.Effect<A, E, Scope.Scope>) => Effect.Effect<A, E>;
|
|
37
|
+
/**
|
|
38
|
+
* Owns one profile slot's loopback MCP listener for the lifetime of the
|
|
39
|
+
* caller's scope, plus the service, channel core, and network connection once
|
|
40
|
+
* that slot carries a Registry identity.
|
|
13
41
|
*
|
|
14
42
|
* ```mermaid
|
|
15
43
|
* sequenceDiagram
|
|
16
44
|
* participant process as moltzapd
|
|
45
|
+
* participant mcp as MCP listener
|
|
17
46
|
* participant service as MoltZapService
|
|
18
47
|
* participant core as MoltZapChannelCore
|
|
19
|
-
* participant mcp as MCP listener
|
|
20
48
|
*
|
|
49
|
+
* process->>mcp: listen(slot port) with the slot catalog
|
|
50
|
+
* alt slot has no identity
|
|
51
|
+
* mcp->>process: tools/call register
|
|
52
|
+
* process->>process: commit identity into the slot
|
|
53
|
+
* end
|
|
21
54
|
* process->>service: make(profileName)
|
|
22
55
|
* process->>core: construct(service)
|
|
23
56
|
* process->>core: install raw turn publisher
|
|
24
|
-
* process->>mcp: listen(port)
|
|
25
57
|
* process->>core: connect()
|
|
58
|
+
* process->>mcp: serve the active catalog
|
|
26
59
|
* Note over core,mcp: Scope release closes MCP before disconnecting the core
|
|
27
60
|
* ```
|
|
28
61
|
*
|
|
29
|
-
* The
|
|
30
|
-
*
|
|
62
|
+
* The slot itself carries the listener port, so no caller supplies one, and the
|
|
63
|
+
* listener binds before the identity exists — an unregistered slot is reachable
|
|
64
|
+
* at the same fixed `/mcp` URL as a registered one.
|
|
31
65
|
*
|
|
32
|
-
* @param options Existing profile name
|
|
66
|
+
* @param options Existing profile name owning this daemon.
|
|
33
67
|
* @returns The scoped loopback HTTP listener.
|
|
34
68
|
* @internal
|
|
35
69
|
*/
|
|
36
|
-
export declare const acquireMoltzapd: (options: MoltzapdOptions) => Effect.Effect<MoltzapdServer,
|
|
70
|
+
export declare const acquireMoltzapd: (options: MoltzapdOptions) => Effect.Effect<MoltzapdServer, DaemonError, Scope.Scope>;
|
|
71
|
+
/**
|
|
72
|
+
* Runs one agent daemon until the process runtime interrupts it.
|
|
73
|
+
*
|
|
74
|
+
* The process scope owns both the loopback MCP listener and the sole network
|
|
75
|
+
* connection. Interrupting the returned Effect closes the listener before
|
|
76
|
+
* disconnecting the agent transport.
|
|
77
|
+
*
|
|
78
|
+
* @param options Existing named profile owning this daemon.
|
|
79
|
+
* @param readySignal Effect that tells a supervising process this daemon owns
|
|
80
|
+
* its listener and, for a registered profile, its network connection.
|
|
81
|
+
* @returns A non-terminating daemon Effect whose scope closes on interruption.
|
|
82
|
+
*/
|
|
83
|
+
export declare const runMoltzapd: (options: MoltzapdOptions, readySignal: Effect.Effect<unknown, Error>) => Effect.Effect<never, DaemonError>;
|
|
37
84
|
export {};
|
|
38
85
|
//# sourceMappingURL=moltzapd.d.ts.map
|
package/dist/moltzapd.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"moltzapd.d.ts","sourceRoot":"","sources":["../src/moltzapd.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAA2B,KAAK,EAAE,MAAM,QAAQ,CAAC;AAIhE,OAAO,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"moltzapd.d.ts","sourceRoot":"","sources":["../src/moltzapd.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAA2B,KAAK,EAAE,MAAM,QAAQ,CAAC;AAIhE,OAAO,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AActE,OAAO,EAAkB,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AACpE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtD,UAAU,eAAe;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAOD,KAAK,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CACzC,UAAU,CAAC,OAAO,2BAA2B,CAAC,CAC/C,CAAC;AAEF,iEAAiE;AACjE,KAAK,WAAW,GAAG,KAAK,GAAG,kBAAkB,GAAG,eAAe,CAAC;AA+BhE,UAAU,oBAAoB;IAC5B,QAAQ,CAAC,eAAe,EAAE,KAAK,CAAC,cAAc,CAAC;IAC/C,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,cAAc,CAAC;CAC5C;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,wBAAwB,gBACtB,KAAK,CAAC,KAAK,KACvB,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAWiB,CAAC;AAEvD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,0BAA0B,GAAI,CAAC,EAAE,CAAC,eAChC,KAAK,CAAC,KAAK,WACf,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,KACxC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAakC,CAAC;AA+DxD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,eAAO,MAAM,eAAe,YACjB,eAAe,KACvB,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,WAAW,EAAE,KAAK,CAAC,KAAK,CAaZ,CAAC;AAE9C;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,WAAW,YACb,eAAe,eACX,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,KACzC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,WAAW,CAMK,CAAC"}
|
package/dist/moltzapd.js
CHANGED
|
@@ -2,22 +2,16 @@ import { Effect, ExecutionStrategy, Exit, Scope } from "effect";
|
|
|
2
2
|
import packageJson from "../package.json" with { type: "json" };
|
|
3
3
|
import { MoltZapChannelCore } from "./channel-core.js";
|
|
4
4
|
import { acquireHarnessMcpHttpServer } from "./harness-mcp-server.js";
|
|
5
|
-
import {
|
|
5
|
+
import { makeHarnessMcpHttpHandler } from "./harness-mcp-wire.js";
|
|
6
|
+
import { makeActiveTools, makeDaemonPhaseState, slotStatusHandler, } from "./moltzapd-catalog.js";
|
|
7
|
+
import { makeRegisterHandler } from "./moltzapd-registration.js";
|
|
8
|
+
import { isRegisteredProfile, parseProfileName, resolveProfileRecord, } from "./profile.js";
|
|
6
9
|
import { MoltZapService } from "./service.js";
|
|
7
10
|
const MCP_IMPLEMENTATION = {
|
|
8
11
|
name: "moltzapd",
|
|
9
12
|
version: packageJson.version,
|
|
10
13
|
};
|
|
11
|
-
const
|
|
12
|
-
...(service.ownAgentId === undefined
|
|
13
|
-
? {}
|
|
14
|
-
: { agentId: service.ownAgentId }),
|
|
15
|
-
connected: core.isConnected(),
|
|
16
|
-
conversations: service.getConversations().length,
|
|
17
|
-
});
|
|
18
|
-
const acquireCore = (service) =>
|
|
19
|
-
// eslint-disable-next-line agent-code-guard/acquire-release-requires-scope -- the process scope owns the sole core and its network connection
|
|
20
|
-
Effect.acquireRelease(Effect.sync(() => new MoltZapChannelCore({ service })), (core) => core.disconnect());
|
|
14
|
+
const acquireCore = (service) => Effect.acquireRelease(Effect.sync(() => new MoltZapChannelCore({ service })), (core) => core.disconnect());
|
|
21
15
|
const installTurnPublisher = (core, publish) => {
|
|
22
16
|
core.onRawInbound((messages) => Effect.sync(() => {
|
|
23
17
|
const first = messages[0];
|
|
@@ -28,51 +22,129 @@ const installTurnPublisher = (core, publish) => {
|
|
|
28
22
|
}));
|
|
29
23
|
};
|
|
30
24
|
/**
|
|
31
|
-
*
|
|
32
|
-
*
|
|
25
|
+
* Creates the daemon's nested resource owners. The activation scope is
|
|
26
|
+
* registered before the listener, so sequential LIFO shutdown closes the MCP
|
|
27
|
+
* listener before disconnecting the active channel core.
|
|
28
|
+
* @param parentScope Scope that owns the complete daemon lifetime.
|
|
29
|
+
* @returns Separate owners for the listener and activation resources.
|
|
30
|
+
* @internal
|
|
31
|
+
*/
|
|
32
|
+
export const makeDaemonResourceScopes = (parentScope) => Effect.gen(function* () {
|
|
33
|
+
const daemonScope = yield* Scope.fork(parentScope, ExecutionStrategy.sequential);
|
|
34
|
+
const activationScope = yield* Scope.fork(daemonScope, ExecutionStrategy.sequential);
|
|
35
|
+
return { activationScope, daemonScope };
|
|
36
|
+
}).pipe(Effect.withSpan("makeDaemonResourceScopes"));
|
|
37
|
+
/**
|
|
38
|
+
* Runs one activation attempt in a child of the daemon scope.
|
|
39
|
+
*
|
|
40
|
+
* A successful attempt remains owned by the daemon. A failed or interrupted
|
|
41
|
+
* attempt closes completely before its error reaches the caller, so a later
|
|
42
|
+
* attempt cannot overlap a partial service, core, or network connection.
|
|
43
|
+
*
|
|
44
|
+
* @param daemonScope Scope owning a successful activation.
|
|
45
|
+
* @param attempt Scoped resources acquired by one activation attempt.
|
|
46
|
+
* @returns The attempt result after failed resources have been released.
|
|
47
|
+
* @internal
|
|
48
|
+
*/
|
|
49
|
+
export const runScopedActivationAttempt = (daemonScope, attempt) => Effect.uninterruptibleMask((restore) => Effect.gen(function* () {
|
|
50
|
+
const attemptScope = yield* Scope.fork(daemonScope, ExecutionStrategy.sequential);
|
|
51
|
+
return yield* restore(attempt.pipe(Scope.extend(attemptScope))).pipe(Effect.onExit((exit) => Exit.isSuccess(exit) ? Effect.void : Scope.close(attemptScope, exit)));
|
|
52
|
+
})).pipe(Effect.withSpan("runScopedActivationAttempt"));
|
|
53
|
+
// Builds the transition from a committed slot to a serving agent. Each attempt
|
|
54
|
+
// has its own child scope so a failed startup cannot leak partial resources
|
|
55
|
+
// into the daemon lifetime.
|
|
56
|
+
const makeActivator = ({ profileName, phase, activationScope }) => (publish) => runScopedActivationAttempt(activationScope, Effect.gen(function* () {
|
|
57
|
+
const service = yield* MoltZapService.make(profileName);
|
|
58
|
+
const core = yield* acquireCore(service);
|
|
59
|
+
installTurnPublisher(core, publish);
|
|
60
|
+
yield* core.connect();
|
|
61
|
+
phase.setActive(makeActiveTools(service, core));
|
|
62
|
+
}));
|
|
63
|
+
// Binds the slot's listener, then activates if the slot already carries an
|
|
64
|
+
// identity. The listener comes first either way: registration has to be
|
|
65
|
+
// reachable on a daemon that cannot yet build a service.
|
|
66
|
+
const serveProfileSlot = (profileName, activationScope) => Effect.gen(function* () {
|
|
67
|
+
const name = yield* parseProfileName(profileName);
|
|
68
|
+
const record = yield* resolveProfileRecord(name);
|
|
69
|
+
const phase = makeDaemonPhaseState();
|
|
70
|
+
// Registration and initial activation share one transition lock so a live
|
|
71
|
+
// listener cannot begin another registration during startup.
|
|
72
|
+
const activation = yield* Effect.makeSemaphore(1);
|
|
73
|
+
const activate = makeActivator({ profileName, phase, activationScope });
|
|
74
|
+
const handler = makeHarnessMcpHttpHandler({
|
|
75
|
+
implementation: MCP_IMPLEMENTATION,
|
|
76
|
+
phase: phase.read,
|
|
77
|
+
slotStatus: slotStatusHandler,
|
|
78
|
+
register: makeRegisterHandler({
|
|
79
|
+
name,
|
|
80
|
+
record,
|
|
81
|
+
phase,
|
|
82
|
+
activation,
|
|
83
|
+
activate: () => activate(handler.publish),
|
|
84
|
+
onCatalogChanged: () => {
|
|
85
|
+
handler.notify.toolsChanged();
|
|
86
|
+
},
|
|
87
|
+
}),
|
|
88
|
+
});
|
|
89
|
+
const server = yield* acquireHarnessMcpHttpServer({
|
|
90
|
+
port: record.mcpPort,
|
|
91
|
+
handler,
|
|
92
|
+
});
|
|
93
|
+
if (isRegisteredProfile(record)) {
|
|
94
|
+
yield* activation.withPermits(1)(activate(handler.publish));
|
|
95
|
+
}
|
|
96
|
+
return server;
|
|
97
|
+
});
|
|
98
|
+
/**
|
|
99
|
+
* Owns one profile slot's loopback MCP listener for the lifetime of the
|
|
100
|
+
* caller's scope, plus the service, channel core, and network connection once
|
|
101
|
+
* that slot carries a Registry identity.
|
|
33
102
|
*
|
|
34
103
|
* ```mermaid
|
|
35
104
|
* sequenceDiagram
|
|
36
105
|
* participant process as moltzapd
|
|
106
|
+
* participant mcp as MCP listener
|
|
37
107
|
* participant service as MoltZapService
|
|
38
108
|
* participant core as MoltZapChannelCore
|
|
39
|
-
* participant mcp as MCP listener
|
|
40
109
|
*
|
|
110
|
+
* process->>mcp: listen(slot port) with the slot catalog
|
|
111
|
+
* alt slot has no identity
|
|
112
|
+
* mcp->>process: tools/call register
|
|
113
|
+
* process->>process: commit identity into the slot
|
|
114
|
+
* end
|
|
41
115
|
* process->>service: make(profileName)
|
|
42
116
|
* process->>core: construct(service)
|
|
43
117
|
* process->>core: install raw turn publisher
|
|
44
|
-
* process->>mcp: listen(port)
|
|
45
118
|
* process->>core: connect()
|
|
119
|
+
* process->>mcp: serve the active catalog
|
|
46
120
|
* Note over core,mcp: Scope release closes MCP before disconnecting the core
|
|
47
121
|
* ```
|
|
48
122
|
*
|
|
49
|
-
* The
|
|
50
|
-
*
|
|
123
|
+
* The slot itself carries the listener port, so no caller supplies one, and the
|
|
124
|
+
* listener binds before the identity exists — an unregistered slot is reachable
|
|
125
|
+
* at the same fixed `/mcp` URL as a registered one.
|
|
51
126
|
*
|
|
52
|
-
* @param options Existing profile name
|
|
127
|
+
* @param options Existing profile name owning this daemon.
|
|
53
128
|
* @returns The scoped loopback HTTP listener.
|
|
54
129
|
* @internal
|
|
55
130
|
*/
|
|
56
131
|
export const acquireMoltzapd = (options) => Effect.gen(function* () {
|
|
57
132
|
const parentScope = yield* Effect.scope;
|
|
58
|
-
const daemonScope = yield*
|
|
59
|
-
const acquire =
|
|
60
|
-
const service = yield* MoltZapService.make(options.profileName);
|
|
61
|
-
const core = yield* acquireCore(service);
|
|
62
|
-
const handlers = makeHarnessMcpHttpHandlers({
|
|
63
|
-
implementation: MCP_IMPLEMENTATION,
|
|
64
|
-
reply: core.sendReply.bind(core),
|
|
65
|
-
status: makeStatusHandler(service, core),
|
|
66
|
-
});
|
|
67
|
-
installTurnPublisher(core, handlers.active.publish);
|
|
68
|
-
const server = yield* acquireHarnessMcpHttpServer({
|
|
69
|
-
port: options.port,
|
|
70
|
-
registrationHandler: handlers.registration,
|
|
71
|
-
harnessHandler: handlers.active,
|
|
72
|
-
});
|
|
73
|
-
yield* core.connect();
|
|
74
|
-
return server;
|
|
75
|
-
}).pipe(Scope.extend(daemonScope));
|
|
133
|
+
const { activationScope, daemonScope } = yield* makeDaemonResourceScopes(parentScope);
|
|
134
|
+
const acquire = serveProfileSlot(options.profileName, activationScope).pipe(Scope.extend(daemonScope));
|
|
76
135
|
return yield* acquire.pipe(Effect.onExit((exit) => Exit.isSuccess(exit) ? Effect.void : Scope.close(daemonScope, exit)));
|
|
77
136
|
}).pipe(Effect.withSpan("acquireMoltzapd"));
|
|
137
|
+
/**
|
|
138
|
+
* Runs one agent daemon until the process runtime interrupts it.
|
|
139
|
+
*
|
|
140
|
+
* The process scope owns both the loopback MCP listener and the sole network
|
|
141
|
+
* connection. Interrupting the returned Effect closes the listener before
|
|
142
|
+
* disconnecting the agent transport.
|
|
143
|
+
*
|
|
144
|
+
* @param options Existing named profile owning this daemon.
|
|
145
|
+
* @param readySignal Effect that tells a supervising process this daemon owns
|
|
146
|
+
* its listener and, for a registered profile, its network connection.
|
|
147
|
+
* @returns A non-terminating daemon Effect whose scope closes on interruption.
|
|
148
|
+
*/
|
|
149
|
+
export const runMoltzapd = (options, readySignal) => Effect.scoped(acquireMoltzapd(options).pipe(Effect.zipRight(readySignal), Effect.zipRight(Effect.never))).pipe(Effect.withSpan("runMoltzapd"));
|
|
78
150
|
//# sourceMappingURL=moltzapd.js.map
|
package/dist/moltzapd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"moltzapd.js","sourceRoot":"","sources":["../src/moltzapd.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAChE,OAAO,WAAW,MAAM,iBAAiB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,OAAO,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"moltzapd.js","sourceRoot":"","sources":["../src/moltzapd.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { NotificationDelivery } from "@moltzap/protocol/rpc";
|
|
2
|
+
import type { AnyNotificationDefinition } from "@moltzap/protocol/socket/catalog";
|
|
3
|
+
/**
|
|
4
|
+
* Builds the stable diagnostic projection for one inbound notification.
|
|
5
|
+
* @param notification Notification delivered by the active socket client.
|
|
6
|
+
* @param agentId Agent receiving the notification when identity is available.
|
|
7
|
+
* @returns A JSON-safe trace record.
|
|
8
|
+
*/
|
|
9
|
+
export declare function notificationTraceRecord(notification: NotificationDelivery<AnyNotificationDefinition>, agentId?: string): Record<string, unknown>;
|
|
10
|
+
//# sourceMappingURL=trace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../../src/notification/trace.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AA8BlF;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,oBAAoB,CAAC,yBAAyB,CAAC,EAC7D,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAkBzB"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
const isPlainRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
2
|
+
const recordOrEmpty = (value) => isPlainRecord(value) ? value : {};
|
|
3
|
+
const recordProperty = (record, key) => {
|
|
4
|
+
const value = record[key];
|
|
5
|
+
return isPlainRecord(value) ? value : undefined;
|
|
6
|
+
};
|
|
7
|
+
const stringProperty = (record, key) => {
|
|
8
|
+
const value = record[key];
|
|
9
|
+
return typeof value === "string" ? value : undefined;
|
|
10
|
+
};
|
|
11
|
+
const traceConversationId = (conversation, fallback) => conversation === undefined ? fallback : (conversation.id ?? fallback);
|
|
12
|
+
/**
|
|
13
|
+
* Builds the stable diagnostic projection for one inbound notification.
|
|
14
|
+
* @param notification Notification delivered by the active socket client.
|
|
15
|
+
* @param agentId Agent receiving the notification when identity is available.
|
|
16
|
+
* @returns A JSON-safe trace record.
|
|
17
|
+
*/
|
|
18
|
+
export function notificationTraceRecord(notification, agentId) {
|
|
19
|
+
const params = recordOrEmpty(notification.params);
|
|
20
|
+
const message = recordProperty(params, "message");
|
|
21
|
+
const conversation = recordProperty(params, "conversation");
|
|
22
|
+
const notificationConversationId = stringProperty(params, "conversationId");
|
|
23
|
+
return {
|
|
24
|
+
ts: new Date().toISOString(),
|
|
25
|
+
agentId: agentId ?? "unknown",
|
|
26
|
+
notification: notification.method,
|
|
27
|
+
messageId: message?.id,
|
|
28
|
+
messageConversationId: message?.conversationId,
|
|
29
|
+
messageSenderId: message?.senderId,
|
|
30
|
+
conversationId: traceConversationId(conversation, notificationConversationId),
|
|
31
|
+
conversationName: conversation?.name,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=trace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace.js","sourceRoot":"","sources":["../../src/notification/trace.ts"],"names":[],"mappings":"AAGA,MAAM,aAAa,GAAG,CAAC,KAAc,EAAoC,EAAE,CACzE,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAEvE,MAAM,aAAa,GAAG,CAAC,KAAc,EAA2B,EAAE,CAChE,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAEpC,MAAM,cAAc,GAAG,CACrB,MAA+B,EAC/B,GAAW,EAC0B,EAAE;IACvC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAClD,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CACrB,MAA+B,EAC/B,GAAW,EACS,EAAE;IACtB,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAC1B,YAAsC,EACtC,QAAiB,EACR,EAAE,CACX,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,IAAI,QAAQ,CAAC,CAAC;AAExE;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CACrC,YAA6D,EAC7D,OAAgB;IAEhB,MAAM,MAAM,GAAG,aAAa,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAClD,MAAM,YAAY,GAAG,cAAc,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC5D,MAAM,0BAA0B,GAAG,cAAc,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC5E,OAAO;QACL,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAC5B,OAAO,EAAE,OAAO,IAAI,SAAS;QAC7B,YAAY,EAAE,YAAY,CAAC,MAAM;QACjC,SAAS,EAAE,OAAO,EAAE,EAAE;QACtB,qBAAqB,EAAE,OAAO,EAAE,cAAc;QAC9C,eAAe,EAAE,OAAO,EAAE,QAAQ;QAClC,cAAc,EAAE,mBAAmB,CACjC,YAAY,EACZ,0BAA0B,CAC3B;QACD,gBAAgB,EAAE,YAAY,EAAE,IAAI;KACrC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/presentation/index.ts"],"names":[],"mappings":"AAAA,gBAAgB;AAChB,OAAO,EACL,iBAAiB,EACjB,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,GACtB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/presentation/index.ts"],"names":[],"mappings":"AAAA,gBAAgB;AAChB,OAAO,EACL,iBAAiB,GAIlB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import type { ConversationCreatedNotification } from "@moltzap/protocol/conversation";
|
|
2
|
+
import type { Message } from "@moltzap/protocol/message";
|
|
3
|
+
import { Effect, HashMap } from "effect";
|
|
4
|
+
/** Describes conversation meta. */
|
|
5
|
+
export interface ConversationMeta {
|
|
6
|
+
id: string;
|
|
7
|
+
type: string;
|
|
8
|
+
name?: string;
|
|
9
|
+
participants: string[];
|
|
10
|
+
}
|
|
11
|
+
/** Structured summary of recent activity in one other conversation. */
|
|
12
|
+
export interface CrossConversationEntry {
|
|
13
|
+
conversationId: string;
|
|
14
|
+
conversationName?: string;
|
|
15
|
+
senderName: string;
|
|
16
|
+
text: string;
|
|
17
|
+
minutesAgo: number;
|
|
18
|
+
/** Messages in this summary (capped by maxMessagesPerConv). */
|
|
19
|
+
count: number;
|
|
20
|
+
}
|
|
21
|
+
/** Full message from another conversation, used by peekFullMessages(). */
|
|
22
|
+
export interface CrossConvMessage {
|
|
23
|
+
conversationId: string;
|
|
24
|
+
conversationName?: string;
|
|
25
|
+
senderName: string;
|
|
26
|
+
senderId: string;
|
|
27
|
+
text: string;
|
|
28
|
+
timestamp: string;
|
|
29
|
+
}
|
|
30
|
+
/** Immutable snapshots used while selecting cross-conversation context. */
|
|
31
|
+
export interface CrossConvState {
|
|
32
|
+
readonly messagesMap: HashMap.HashMap<string, readonly Message[]>;
|
|
33
|
+
readonly conversationsMap: HashMap.HashMap<string, ConversationMeta>;
|
|
34
|
+
readonly agentNamesMap: HashMap.HashMap<string, string>;
|
|
35
|
+
readonly viewMarkers: HashMap.HashMap<string, string>;
|
|
36
|
+
}
|
|
37
|
+
type MessageTextRenderer = (message: Message) => string;
|
|
38
|
+
interface AgentName {
|
|
39
|
+
readonly id: string;
|
|
40
|
+
readonly name: string;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Owns the service's in-memory presentation caches and viewer-scoped context
|
|
44
|
+
* markers. Network ingress and presentation rendering remain with the caller.
|
|
45
|
+
*/
|
|
46
|
+
export declare class PresentationState {
|
|
47
|
+
private readonly conversationsRef;
|
|
48
|
+
private readonly messagesRef;
|
|
49
|
+
private readonly agentNamesRef;
|
|
50
|
+
private readonly lastNotifiedRef;
|
|
51
|
+
reset(): Effect.Effect<void>;
|
|
52
|
+
getConversation(convId: string): ConversationMeta | undefined;
|
|
53
|
+
getConversations(): ConversationMeta[];
|
|
54
|
+
storeConversation(notification: ConversationCreatedNotification): void;
|
|
55
|
+
getHistory(convId: string, limit: number): Message[];
|
|
56
|
+
storeMessage(conversationId: string, message: Message): void;
|
|
57
|
+
getAgentName(agentId: string): string | undefined;
|
|
58
|
+
getAgentNames(): HashMap.HashMap<string, string>;
|
|
59
|
+
cacheAgentNames(agents: readonly AgentName[]): Effect.Effect<void>;
|
|
60
|
+
peekContextEntries(currentConvId: string, renderMessageText: MessageTextRenderer, opts: {
|
|
61
|
+
maxConversations?: number;
|
|
62
|
+
maxMessagesPerConv?: number;
|
|
63
|
+
}): {
|
|
64
|
+
entries: CrossConversationEntry[];
|
|
65
|
+
commit: () => void;
|
|
66
|
+
};
|
|
67
|
+
peekFullMessages(currentConvId: string, renderMessageText: MessageTextRenderer): {
|
|
68
|
+
messages: CrossConvMessage[];
|
|
69
|
+
commit: () => void;
|
|
70
|
+
};
|
|
71
|
+
private readCrossConvState;
|
|
72
|
+
private collectContextCandidates;
|
|
73
|
+
private iterNewMessagesByConv;
|
|
74
|
+
private advanceLastNotified;
|
|
75
|
+
}
|
|
76
|
+
export {};
|
|
77
|
+
//# sourceMappingURL=state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/presentation/state.ts"],"names":[],"mappings":"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"}
|