@cydm/happy-elves 0.1.0-beta.31 → 0.1.0-beta.310
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/apps/cli/dist/commands/app.js +10 -0
- package/apps/cli/dist/commands/daemon.js +92 -4
- package/apps/cli/dist/commands/gateway.d.ts +2 -0
- package/apps/cli/dist/commands/gateway.js +429 -0
- package/apps/cli/dist/commands/lib/args.js +49 -0
- package/apps/cli/dist/commands/lib/bootstrap-daemon.d.ts +2 -2
- package/apps/cli/dist/commands/lib/bootstrap-daemon.js +2 -2
- package/apps/cli/dist/commands/lib/doctor.d.ts +11 -0
- package/apps/cli/dist/commands/lib/doctor.js +276 -11
- package/apps/cli/dist/commands/lib/gateway-store.d.ts +38 -0
- package/apps/cli/dist/commands/lib/gateway-store.js +33 -0
- package/apps/cli/dist/commands/lib/index.d.ts +4 -2
- package/apps/cli/dist/commands/lib/index.js +2 -0
- package/apps/cli/dist/commands/lib/json.d.ts +2 -2
- package/apps/cli/dist/commands/lib/json.js +5 -2
- package/apps/cli/dist/commands/lib/local-daemon.d.ts +1 -0
- package/apps/cli/dist/commands/lib/local-daemon.js +14 -0
- package/apps/cli/dist/commands/lib/paths.d.ts +2 -0
- package/apps/cli/dist/commands/lib/paths.js +2 -0
- package/apps/cli/dist/commands/lib/relay-db-audit.d.ts +37 -0
- package/apps/cli/dist/commands/lib/relay-db-audit.js +300 -0
- package/apps/cli/dist/commands/lib/relay-http.d.ts +1 -1
- package/apps/cli/dist/commands/lib/scope.d.ts +1 -1
- package/apps/cli/dist/commands/lib/session-output.d.ts +15 -1
- package/apps/cli/dist/commands/lib/session-output.js +214 -6
- package/apps/cli/dist/commands/lib/session-view.d.ts +2 -2
- package/apps/cli/dist/commands/lib/status.js +5 -1
- package/apps/cli/dist/commands/lib/types.d.ts +4 -2
- package/apps/cli/dist/commands/lib/usage.js +123 -10
- package/apps/cli/dist/commands/lib/workspace.d.ts +2 -2
- package/apps/cli/dist/commands/lib/workspace.js +63 -10
- package/apps/cli/dist/commands/machine.js +50 -9
- package/apps/cli/dist/commands/memory.d.ts +2 -0
- package/apps/cli/dist/commands/memory.js +179 -0
- package/apps/cli/dist/commands/relay.js +29 -2
- package/apps/cli/dist/commands/release.d.ts +2 -0
- package/apps/cli/dist/commands/release.js +197 -0
- package/apps/cli/dist/commands/remote.js +10 -2
- package/apps/cli/dist/commands/schedule.d.ts +2 -0
- package/apps/cli/dist/commands/schedule.js +273 -0
- package/apps/cli/dist/commands/session.js +517 -5
- package/apps/cli/dist/commands/turn.js +225 -9
- package/apps/cli/dist/commands/workspace.d.ts +2 -0
- package/apps/cli/dist/commands/workspace.js +68 -0
- package/apps/cli/package.json +6 -0
- package/apps/daemon/dist/gateway/adapters.d.ts +38 -0
- package/apps/daemon/dist/gateway/adapters.js +2 -0
- package/apps/daemon/dist/gateway/feishu.d.ts +65 -0
- package/apps/daemon/dist/gateway/feishu.js +493 -0
- package/apps/daemon/dist/gateway/format.d.ts +2 -0
- package/apps/daemon/dist/gateway/format.js +19 -0
- package/apps/daemon/dist/gateway/handler.d.ts +7 -0
- package/apps/daemon/dist/gateway/handler.js +151 -0
- package/apps/daemon/dist/gateway/runtime.d.ts +33 -0
- package/apps/daemon/dist/gateway/runtime.js +850 -0
- package/apps/daemon/dist/gateway/store.d.ts +92 -0
- package/apps/daemon/dist/gateway/store.js +268 -0
- package/apps/daemon/dist/memory/handler.d.ts +7 -0
- package/apps/daemon/dist/memory/handler.js +105 -0
- package/apps/daemon/dist/memory/manager.d.ts +44 -0
- package/apps/daemon/dist/memory/manager.js +359 -0
- package/apps/daemon/dist/paths.d.ts +3 -0
- package/apps/daemon/dist/paths.js +3 -0
- package/apps/daemon/dist/relay/admission.d.ts +30 -0
- package/apps/daemon/dist/relay/admission.js +31 -0
- package/apps/daemon/dist/relay/connection.js +37 -1
- package/apps/daemon/dist/relay/devtools.d.ts +1 -1
- package/apps/daemon/dist/relay/register.js +2 -0
- package/apps/daemon/dist/relay/send.d.ts +2 -2
- package/apps/daemon/dist/relay/send.js +2 -0
- package/apps/daemon/dist/relay-http.d.ts +1 -1
- package/apps/daemon/dist/runtime/external-provider.d.ts +1 -1
- package/apps/daemon/dist/runtime/external-provider.js +187 -17
- package/apps/daemon/dist/runtime.d.ts +1 -2
- package/apps/daemon/dist/runtime.js +0 -3
- package/apps/daemon/dist/schedule/handler.d.ts +9 -0
- package/apps/daemon/dist/schedule/handler.js +148 -0
- package/apps/daemon/dist/schedule/runner.d.ts +21 -0
- package/apps/daemon/dist/schedule/runner.js +547 -0
- package/apps/daemon/dist/schedule/store.d.ts +9 -0
- package/apps/daemon/dist/schedule/store.js +143 -0
- package/apps/daemon/dist/session/create-session.d.ts +1 -1
- package/apps/daemon/dist/session/directory.d.ts +1 -1
- package/apps/daemon/dist/session/events.d.ts +15 -2
- package/apps/daemon/dist/session/events.js +76 -24
- package/apps/daemon/dist/session/file-preview.d.ts +1 -1
- package/apps/daemon/dist/session/lifecycle.d.ts +26 -3
- package/apps/daemon/dist/session/lifecycle.js +161 -22
- package/apps/daemon/dist/session/metadata.d.ts +2 -2
- package/apps/daemon/dist/session/metadata.js +42 -1
- package/apps/daemon/dist/session/primitives.d.ts +1 -1
- package/apps/daemon/dist/session/primitives.js +37 -6
- package/apps/daemon/dist/session/prompt.d.ts +28 -1
- package/apps/daemon/dist/session/prompt.js +340 -5
- package/apps/daemon/dist/session/reconcile.d.ts +3 -0
- package/apps/daemon/dist/session/reconcile.js +235 -0
- package/apps/daemon/dist/session/runtime-handle.d.ts +1 -1
- package/apps/daemon/dist/start.js +5 -1
- package/apps/daemon/dist/state.d.ts +2 -2
- package/apps/daemon/dist/turn-coordinator.d.ts +1 -0
- package/apps/daemon/dist/turn-coordinator.js +4 -0
- package/apps/daemon/dist/types.d.ts +16 -1
- package/apps/daemon/package.json +3 -25
- package/apps/relay/dist/connections.d.ts +2 -0
- package/apps/relay/dist/controller-handlers.d.ts +42 -2
- package/apps/relay/dist/controller-handlers.js +349 -37
- package/apps/relay/dist/db.js +296 -2
- package/apps/relay/dist/errors.d.ts +2 -1
- package/apps/relay/dist/errors.js +3 -1
- package/apps/relay/dist/http-routes.js +659 -33
- package/apps/relay/dist/http-schemas.d.ts +156 -0
- package/apps/relay/dist/http-schemas.js +85 -0
- package/apps/relay/dist/index.js +31 -1
- package/apps/relay/dist/machine-handlers.d.ts +15 -7
- package/apps/relay/dist/machine-handlers.js +567 -27
- package/apps/relay/dist/projections.d.ts +1 -1
- package/apps/relay/dist/projections.js +13 -0
- package/apps/relay/dist/relay-context.d.ts +41 -3
- package/apps/relay/dist/relay-context.js +244 -19
- package/apps/relay/dist/repositories.d.ts +2 -2
- package/apps/relay/dist/repositories.js +28 -1
- package/apps/relay/dist/runtime-bindings.d.ts +25 -0
- package/apps/relay/dist/runtime-bindings.js +49 -0
- package/apps/relay/dist/scope.d.ts +1 -1
- package/apps/relay/dist/types.d.ts +71 -1
- package/apps/relay/dist/websocket.js +2 -0
- package/package.json +5 -11
- package/packages/agent-sdk/dist/index.d.ts +80 -0
- package/packages/agent-sdk/dist/index.js +16 -0
- package/packages/client/dist/account.d.ts +35 -2
- package/packages/client/dist/account.js +98 -1
- package/packages/client/dist/client.d.ts +59 -6
- package/packages/client/dist/client.js +312 -58
- package/packages/client/dist/index.d.ts +1 -1
- package/packages/client/dist/parsers.d.ts +28 -2
- package/packages/client/dist/parsers.js +167 -0
- package/packages/client/dist/transport.d.ts +21 -1
- package/packages/client/dist/transport.js +69 -6
- package/packages/client/dist/types.d.ts +177 -1
- package/packages/client/dist/validation.d.ts +1 -1
- package/packages/runtime/dist/index.d.ts +66 -0
- package/packages/runtime-acpx/dist/index.d.ts +1 -1
- package/packages/runtime-acpx/dist/index.js +8 -0
- package/packages/runtime-cli/dist/claude-history.d.ts +1 -2
- package/packages/runtime-cli/dist/claude-history.js +0 -3
- package/packages/runtime-cli/dist/claude-session-store.d.ts +0 -1
- package/packages/runtime-cli/dist/claude-session-store.js +1 -1
- package/packages/runtime-cli/dist/claude-turn.d.ts +2 -1
- package/packages/runtime-cli/dist/claude-turn.js +29 -9
- package/packages/runtime-cli/dist/codex-app-server.d.ts +8 -3
- package/packages/runtime-cli/dist/codex-app-server.js +122 -25
- package/packages/runtime-cli/dist/codex-history.d.ts +1 -2
- package/packages/runtime-cli/dist/codex-history.js +11 -5
- package/packages/runtime-cli/dist/codex-protocol.d.ts +2 -2
- package/packages/runtime-cli/dist/codex-protocol.js +4 -4
- package/packages/runtime-cli/dist/history-merge.d.ts +1 -1
- package/packages/runtime-cli/dist/index.d.ts +1 -1
- package/packages/runtime-cli/dist/index.js +108 -2
- package/packages/runtime-cli/dist/permissions.d.ts +1 -1
- package/packages/runtime-cli/dist/session-store.d.ts +2 -1
- package/packages/runtime-cli/dist/session-store.js +9 -8
- package/packages/shared/dist/index.d.ts +2 -0
- package/packages/shared/dist/index.js +2 -0
- package/packages/shared/dist/protocol-schemas.d.ts +1077 -0
- package/packages/shared/dist/protocol-schemas.js +273 -0
- package/packages/shared/dist/protocol-types.d.ts +371 -3
- package/packages/shared/dist/protocol.d.ts +181 -2
- package/packages/shared/dist/protocol.js +197 -1
- package/packages/shared/dist/session-tags.d.ts +12 -0
- package/packages/shared/dist/session-tags.js +50 -0
- package/apps/cli/dist/commands/account.js.map +0 -1
- package/apps/cli/dist/commands/app.js.map +0 -1
- package/apps/cli/dist/commands/collect.js.map +0 -1
- package/apps/cli/dist/commands/command.js.map +0 -1
- package/apps/cli/dist/commands/config.js.map +0 -1
- package/apps/cli/dist/commands/daemon.js.map +0 -1
- package/apps/cli/dist/commands/lib/args.js.map +0 -1
- package/apps/cli/dist/commands/lib/audit.js.map +0 -1
- package/apps/cli/dist/commands/lib/bootstrap-config.js.map +0 -1
- package/apps/cli/dist/commands/lib/bootstrap-daemon.js.map +0 -1
- package/apps/cli/dist/commands/lib/bootstrap-output.js.map +0 -1
- package/apps/cli/dist/commands/lib/bootstrap.js.map +0 -1
- package/apps/cli/dist/commands/lib/config.js.map +0 -1
- package/apps/cli/dist/commands/lib/doctor.js.map +0 -1
- package/apps/cli/dist/commands/lib/exit.js.map +0 -1
- package/apps/cli/dist/commands/lib/index.js.map +0 -1
- package/apps/cli/dist/commands/lib/json.js.map +0 -1
- package/apps/cli/dist/commands/lib/local-daemon.js.map +0 -1
- package/apps/cli/dist/commands/lib/loop-store.js.map +0 -1
- package/apps/cli/dist/commands/lib/paths.js.map +0 -1
- package/apps/cli/dist/commands/lib/relay-http.js.map +0 -1
- package/apps/cli/dist/commands/lib/scope.js.map +0 -1
- package/apps/cli/dist/commands/lib/session-output.js.map +0 -1
- package/apps/cli/dist/commands/lib/session-view.js.map +0 -1
- package/apps/cli/dist/commands/lib/status.js.map +0 -1
- package/apps/cli/dist/commands/lib/types.js.map +0 -1
- package/apps/cli/dist/commands/lib/usage.js.map +0 -1
- package/apps/cli/dist/commands/lib/workspace.js.map +0 -1
- package/apps/cli/dist/commands/loop.js.map +0 -1
- package/apps/cli/dist/commands/machine.js.map +0 -1
- package/apps/cli/dist/commands/relay.js.map +0 -1
- package/apps/cli/dist/commands/remote.js.map +0 -1
- package/apps/cli/dist/commands/session.js.map +0 -1
- package/apps/cli/dist/commands/token.js.map +0 -1
- package/apps/cli/dist/commands/turn.js.map +0 -1
- package/apps/cli/dist/errors.js.map +0 -1
- package/apps/cli/dist/index.js.map +0 -1
- package/apps/daemon/dist/app.js.map +0 -1
- package/apps/daemon/dist/args.js.map +0 -1
- package/apps/daemon/dist/audit.js.map +0 -1
- package/apps/daemon/dist/cli.js.map +0 -1
- package/apps/daemon/dist/config.js.map +0 -1
- package/apps/daemon/dist/errors.js.map +0 -1
- package/apps/daemon/dist/loop/runner.js.map +0 -1
- package/apps/daemon/dist/loop/store.js.map +0 -1
- package/apps/daemon/dist/pair.js.map +0 -1
- package/apps/daemon/dist/paths.js.map +0 -1
- package/apps/daemon/dist/process.js.map +0 -1
- package/apps/daemon/dist/relay/connection.js.map +0 -1
- package/apps/daemon/dist/relay/devtools.js.map +0 -1
- package/apps/daemon/dist/relay/register.js.map +0 -1
- package/apps/daemon/dist/relay/send.js.map +0 -1
- package/apps/daemon/dist/relay-http.js.map +0 -1
- package/apps/daemon/dist/runtime/external-provider.js.map +0 -1
- package/apps/daemon/dist/runtime.js.map +0 -1
- package/apps/daemon/dist/session/create-session.js.map +0 -1
- package/apps/daemon/dist/session/directory.js.map +0 -1
- package/apps/daemon/dist/session/events.js.map +0 -1
- package/apps/daemon/dist/session/file-preview.js.map +0 -1
- package/apps/daemon/dist/session/lifecycle.js.map +0 -1
- package/apps/daemon/dist/session/metadata.js.map +0 -1
- package/apps/daemon/dist/session/primitives.js.map +0 -1
- package/apps/daemon/dist/session/prompt.js.map +0 -1
- package/apps/daemon/dist/session/runtime-handle.js.map +0 -1
- package/apps/daemon/dist/start.js.map +0 -1
- package/apps/daemon/dist/state.js.map +0 -1
- package/apps/daemon/dist/turn-coordinator.js.map +0 -1
- package/apps/daemon/dist/types.js.map +0 -1
- package/apps/daemon/dist/utils.js.map +0 -1
- package/apps/relay/dist/auth.js.map +0 -1
- package/apps/relay/dist/connections.js.map +0 -1
- package/apps/relay/dist/controller-handlers.js.map +0 -1
- package/apps/relay/dist/db.js.map +0 -1
- package/apps/relay/dist/errors.js.map +0 -1
- package/apps/relay/dist/http-routes.js.map +0 -1
- package/apps/relay/dist/http-schemas.js.map +0 -1
- package/apps/relay/dist/index.js.map +0 -1
- package/apps/relay/dist/machine-handlers.js.map +0 -1
- package/apps/relay/dist/projections.js.map +0 -1
- package/apps/relay/dist/relay-context.js.map +0 -1
- package/apps/relay/dist/repositories.js.map +0 -1
- package/apps/relay/dist/retention.js.map +0 -1
- package/apps/relay/dist/scope.js.map +0 -1
- package/apps/relay/dist/security.js.map +0 -1
- package/apps/relay/dist/types.js.map +0 -1
- package/apps/relay/dist/websocket.js.map +0 -1
- package/apps/relay/package.json +0 -29
- package/packages/agent-sdk/dist/index.d.ts.map +0 -1
- package/packages/agent-sdk/dist/index.js.map +0 -1
- package/packages/agent-sdk/package.json +0 -20
- package/packages/client/dist/account.d.ts.map +0 -1
- package/packages/client/dist/account.js.map +0 -1
- package/packages/client/dist/client.d.ts.map +0 -1
- package/packages/client/dist/client.js.map +0 -1
- package/packages/client/dist/errors.d.ts.map +0 -1
- package/packages/client/dist/errors.js.map +0 -1
- package/packages/client/dist/http.d.ts.map +0 -1
- package/packages/client/dist/http.js.map +0 -1
- package/packages/client/dist/index.d.ts.map +0 -1
- package/packages/client/dist/index.js.map +0 -1
- package/packages/client/dist/parsers.d.ts.map +0 -1
- package/packages/client/dist/parsers.js.map +0 -1
- package/packages/client/dist/transport.d.ts.map +0 -1
- package/packages/client/dist/transport.js.map +0 -1
- package/packages/client/dist/types.d.ts.map +0 -1
- package/packages/client/dist/types.js.map +0 -1
- package/packages/client/dist/validation.d.ts.map +0 -1
- package/packages/client/dist/validation.js.map +0 -1
- package/packages/client/package.json +0 -22
- package/packages/pie-provider/dist/index.d.ts.map +0 -1
- package/packages/pie-provider/dist/index.js.map +0 -1
- package/packages/pie-provider/package.json +0 -26
- package/packages/runtime/dist/index.d.ts.map +0 -1
- package/packages/runtime/dist/index.js.map +0 -1
- package/packages/runtime/package.json +0 -19
- package/packages/runtime-acpx/dist/index.d.ts.map +0 -1
- package/packages/runtime-acpx/dist/index.js.map +0 -1
- package/packages/runtime-acpx/package.json +0 -23
- package/packages/runtime-cli/dist/async-queue.d.ts.map +0 -1
- package/packages/runtime-cli/dist/async-queue.js.map +0 -1
- package/packages/runtime-cli/dist/claude-history.d.ts.map +0 -1
- package/packages/runtime-cli/dist/claude-history.js.map +0 -1
- package/packages/runtime-cli/dist/claude-json.d.ts.map +0 -1
- package/packages/runtime-cli/dist/claude-json.js.map +0 -1
- package/packages/runtime-cli/dist/claude-rename.d.ts.map +0 -1
- package/packages/runtime-cli/dist/claude-rename.js.map +0 -1
- package/packages/runtime-cli/dist/claude-session-store.d.ts.map +0 -1
- package/packages/runtime-cli/dist/claude-session-store.js.map +0 -1
- package/packages/runtime-cli/dist/claude-turn.d.ts.map +0 -1
- package/packages/runtime-cli/dist/claude-turn.js.map +0 -1
- package/packages/runtime-cli/dist/codex-app-server.d.ts.map +0 -1
- package/packages/runtime-cli/dist/codex-app-server.js.map +0 -1
- package/packages/runtime-cli/dist/codex-approvals.d.ts.map +0 -1
- package/packages/runtime-cli/dist/codex-approvals.js.map +0 -1
- package/packages/runtime-cli/dist/codex-history.d.ts.map +0 -1
- package/packages/runtime-cli/dist/codex-history.js.map +0 -1
- package/packages/runtime-cli/dist/codex-json-rpc.d.ts.map +0 -1
- package/packages/runtime-cli/dist/codex-json-rpc.js.map +0 -1
- package/packages/runtime-cli/dist/codex-lifecycle.d.ts.map +0 -1
- package/packages/runtime-cli/dist/codex-lifecycle.js.map +0 -1
- package/packages/runtime-cli/dist/codex-protocol.d.ts.map +0 -1
- package/packages/runtime-cli/dist/codex-protocol.js.map +0 -1
- package/packages/runtime-cli/dist/command-resolver.d.ts.map +0 -1
- package/packages/runtime-cli/dist/command-resolver.js.map +0 -1
- package/packages/runtime-cli/dist/history-merge.d.ts.map +0 -1
- package/packages/runtime-cli/dist/history-merge.js.map +0 -1
- package/packages/runtime-cli/dist/index.d.ts.map +0 -1
- package/packages/runtime-cli/dist/index.js.map +0 -1
- package/packages/runtime-cli/dist/permissions.d.ts.map +0 -1
- package/packages/runtime-cli/dist/permissions.js.map +0 -1
- package/packages/runtime-cli/dist/session-store.d.ts.map +0 -1
- package/packages/runtime-cli/dist/session-store.js.map +0 -1
- package/packages/runtime-cli/package.json +0 -22
- package/packages/shared/dist/args.d.ts.map +0 -1
- package/packages/shared/dist/args.js.map +0 -1
- package/packages/shared/dist/crypto.d.ts.map +0 -1
- package/packages/shared/dist/crypto.js.map +0 -1
- package/packages/shared/dist/ids.d.ts.map +0 -1
- package/packages/shared/dist/ids.js.map +0 -1
- package/packages/shared/dist/index.d.ts.map +0 -1
- package/packages/shared/dist/index.js.map +0 -1
- package/packages/shared/dist/protocol-schemas.d.ts.map +0 -1
- package/packages/shared/dist/protocol-schemas.js.map +0 -1
- package/packages/shared/dist/protocol-types.d.ts.map +0 -1
- package/packages/shared/dist/protocol-types.js.map +0 -1
- package/packages/shared/dist/protocol.d.ts.map +0 -1
- package/packages/shared/dist/protocol.js.map +0 -1
- package/packages/shared/dist/session-name.d.ts.map +0 -1
- package/packages/shared/dist/session-name.js.map +0 -1
- package/packages/shared/dist/session-state.d.ts.map +0 -1
- package/packages/shared/dist/session-state.js.map +0 -1
- package/packages/shared/package.json +0 -24
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import type { GatewayChannelInput, GatewayChannelDomain, GatewayChannelPublic, GatewayChannelType, GatewayDestination, GatewayEventPayload, GatewayInboundMode, GatewayLastDeliveredMessage, GatewayLastMessageRef, GatewayProcessingReactionConfig } from "../../../../packages/shared/dist/index.js";
|
|
2
|
+
export type GatewayChannelConfig = {
|
|
3
|
+
id: string;
|
|
4
|
+
type: GatewayChannelType;
|
|
5
|
+
enabled: boolean;
|
|
6
|
+
domain?: GatewayChannelDomain;
|
|
7
|
+
appId?: string;
|
|
8
|
+
appSecret?: string;
|
|
9
|
+
inboundMode: GatewayInboundMode;
|
|
10
|
+
processingReaction: GatewayProcessingReactionConfig;
|
|
11
|
+
targetMachineId?: string;
|
|
12
|
+
targetSessionId?: string;
|
|
13
|
+
targetCwd?: string;
|
|
14
|
+
defaultAgent: string;
|
|
15
|
+
defaultModel?: string;
|
|
16
|
+
allowAnySender?: boolean;
|
|
17
|
+
allowedChatIds?: string[];
|
|
18
|
+
allowedSenderIds?: string[];
|
|
19
|
+
localToken?: string;
|
|
20
|
+
localSecret?: string;
|
|
21
|
+
lastError?: string;
|
|
22
|
+
lastReceived?: GatewayLastMessageRef;
|
|
23
|
+
lastAdmitted?: GatewayLastMessageRef;
|
|
24
|
+
lastReplied?: GatewayLastMessageRef;
|
|
25
|
+
lastDeliveredMessage?: GatewayLastDeliveredMessage;
|
|
26
|
+
createdAt: string;
|
|
27
|
+
updatedAt: string;
|
|
28
|
+
};
|
|
29
|
+
export type GatewayConversationMapping = {
|
|
30
|
+
channelId: string;
|
|
31
|
+
externalConversationId: string;
|
|
32
|
+
sessionId: string;
|
|
33
|
+
createRequestId: string;
|
|
34
|
+
createdAt: string;
|
|
35
|
+
updatedAt: string;
|
|
36
|
+
};
|
|
37
|
+
export type GatewayQueuedMessage = {
|
|
38
|
+
channelId: string;
|
|
39
|
+
externalConversationId: string;
|
|
40
|
+
externalMessageId: string;
|
|
41
|
+
sessionId: string;
|
|
42
|
+
requestId: string;
|
|
43
|
+
turnId: string;
|
|
44
|
+
text: string;
|
|
45
|
+
destination?: GatewayDestination;
|
|
46
|
+
senderPlatformUserId?: string;
|
|
47
|
+
senderDisplayName?: string;
|
|
48
|
+
queuedAt: string;
|
|
49
|
+
updatedAt: string;
|
|
50
|
+
};
|
|
51
|
+
export type GatewayPendingReply = {
|
|
52
|
+
channelId: string;
|
|
53
|
+
externalConversationId: string;
|
|
54
|
+
externalMessageId: string;
|
|
55
|
+
sessionId: string;
|
|
56
|
+
requestId: string;
|
|
57
|
+
turnId: string;
|
|
58
|
+
deliveryId: string;
|
|
59
|
+
destination?: GatewayDestination;
|
|
60
|
+
payload?: GatewayEventPayload;
|
|
61
|
+
status: "pending" | "delivered";
|
|
62
|
+
attempts: number;
|
|
63
|
+
platformMessageId?: string;
|
|
64
|
+
lastError?: string;
|
|
65
|
+
nextAttemptAt?: string;
|
|
66
|
+
createdAt: string;
|
|
67
|
+
updatedAt: string;
|
|
68
|
+
};
|
|
69
|
+
type GatewayReplyHistory = {
|
|
70
|
+
channelId: string;
|
|
71
|
+
externalConversationId: string;
|
|
72
|
+
externalMessageId: string;
|
|
73
|
+
sessionId?: string;
|
|
74
|
+
requestId?: string;
|
|
75
|
+
turnId?: string;
|
|
76
|
+
deliveryId: string;
|
|
77
|
+
platformMessageId?: string;
|
|
78
|
+
repliedAt: string;
|
|
79
|
+
};
|
|
80
|
+
export type GatewayStore = {
|
|
81
|
+
version: 1;
|
|
82
|
+
channels: GatewayChannelConfig[];
|
|
83
|
+
mappings: GatewayConversationMapping[];
|
|
84
|
+
queue: GatewayQueuedMessage[];
|
|
85
|
+
pendingReplies: GatewayPendingReply[];
|
|
86
|
+
replyHistory: GatewayReplyHistory[];
|
|
87
|
+
};
|
|
88
|
+
export declare function readGatewayStore(): Promise<GatewayStore>;
|
|
89
|
+
export declare function updateGatewayStore(update: (store: GatewayStore) => GatewayStore | Promise<GatewayStore>): Promise<GatewayStore>;
|
|
90
|
+
export declare function publicGatewayChannel(channel: GatewayChannelConfig, listening?: boolean): GatewayChannelPublic;
|
|
91
|
+
export declare function upsertGatewayChannel(current: GatewayStore, input: GatewayChannelInput, defaultMachineId: string): GatewayStore;
|
|
92
|
+
export {};
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import fs from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { configDir, gatewayStorePath } from "../paths.js";
|
|
5
|
+
function emptyGatewayStore() {
|
|
6
|
+
return { version: 1, channels: [], mappings: [], queue: [], pendingReplies: [], replyHistory: [] };
|
|
7
|
+
}
|
|
8
|
+
export async function readGatewayStore() {
|
|
9
|
+
let store;
|
|
10
|
+
try {
|
|
11
|
+
const parsed = JSON.parse(await fs.readFile(gatewayStorePath, "utf8"));
|
|
12
|
+
if (parsed.version !== 1 || !Array.isArray(parsed.channels) || !Array.isArray(parsed.mappings))
|
|
13
|
+
return await mergeLegacyGatewayStore(emptyGatewayStore());
|
|
14
|
+
store = {
|
|
15
|
+
version: 1,
|
|
16
|
+
channels: parsed.channels.map(normalizeGatewayChannel),
|
|
17
|
+
mappings: parsed.mappings,
|
|
18
|
+
queue: Array.isArray(parsed.queue) ? parsed.queue : [],
|
|
19
|
+
pendingReplies: Array.isArray(parsed.pendingReplies) ? parsed.pendingReplies : [],
|
|
20
|
+
replyHistory: Array.isArray(parsed.replyHistory) ? parsed.replyHistory : [],
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
if (error.code === "ENOENT")
|
|
25
|
+
return await mergeLegacyGatewayStore(emptyGatewayStore());
|
|
26
|
+
throw error;
|
|
27
|
+
}
|
|
28
|
+
return await mergeLegacyGatewayStore(store);
|
|
29
|
+
}
|
|
30
|
+
async function writeGatewayStore(store) {
|
|
31
|
+
await fs.mkdir(configDir, { recursive: true });
|
|
32
|
+
const tmpPath = `${gatewayStorePath}.${process.pid}.${Date.now()}.tmp`;
|
|
33
|
+
await fs.writeFile(tmpPath, `${JSON.stringify(store, null, 2)}\n`, { mode: 0o600 });
|
|
34
|
+
await fs.rename(tmpPath, gatewayStorePath);
|
|
35
|
+
await fs.chmod(gatewayStorePath, 0o600);
|
|
36
|
+
}
|
|
37
|
+
let gatewayStoreUpdateChain = Promise.resolve();
|
|
38
|
+
export async function updateGatewayStore(update) {
|
|
39
|
+
const run = gatewayStoreUpdateChain.then(async () => {
|
|
40
|
+
const current = await readGatewayStore();
|
|
41
|
+
const next = await update(current);
|
|
42
|
+
await writeGatewayStore(next);
|
|
43
|
+
return next;
|
|
44
|
+
});
|
|
45
|
+
gatewayStoreUpdateChain = run.catch(() => undefined);
|
|
46
|
+
return await run;
|
|
47
|
+
}
|
|
48
|
+
export function publicGatewayChannel(channel, listening = false) {
|
|
49
|
+
return {
|
|
50
|
+
id: channel.id,
|
|
51
|
+
type: channel.type,
|
|
52
|
+
enabled: channel.enabled,
|
|
53
|
+
domain: channel.domain,
|
|
54
|
+
inboundMode: channel.inboundMode,
|
|
55
|
+
processingReaction: channel.processingReaction,
|
|
56
|
+
targetMachineId: channel.targetMachineId,
|
|
57
|
+
targetSessionId: channel.targetSessionId,
|
|
58
|
+
targetCwd: channel.targetCwd,
|
|
59
|
+
defaultAgent: channel.defaultAgent,
|
|
60
|
+
defaultModel: channel.defaultModel,
|
|
61
|
+
allowAnySender: channel.allowAnySender,
|
|
62
|
+
allowedChatIds: channel.allowedChatIds,
|
|
63
|
+
allowedSenderIds: channel.allowedSenderIds,
|
|
64
|
+
hasAppId: Boolean(channel.appId),
|
|
65
|
+
hasAppSecret: Boolean(channel.appSecret),
|
|
66
|
+
hasLocalToken: Boolean(channel.localToken),
|
|
67
|
+
hasLocalSecret: Boolean(channel.localSecret),
|
|
68
|
+
listening,
|
|
69
|
+
lastError: channel.lastError,
|
|
70
|
+
lastReceived: channel.lastReceived,
|
|
71
|
+
lastAdmitted: channel.lastAdmitted,
|
|
72
|
+
lastReplied: channel.lastReplied,
|
|
73
|
+
lastDeliveredMessage: channel.lastDeliveredMessage,
|
|
74
|
+
createdAt: channel.createdAt,
|
|
75
|
+
updatedAt: channel.updatedAt,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
export function upsertGatewayChannel(current, input, defaultMachineId) {
|
|
79
|
+
const id = input.id ?? input.type;
|
|
80
|
+
const existing = current.channels.find((channel) => channel.id === id);
|
|
81
|
+
const now = new Date().toISOString();
|
|
82
|
+
const channel = {
|
|
83
|
+
...(existing ?? { createdAt: now }),
|
|
84
|
+
id,
|
|
85
|
+
type: input.type,
|
|
86
|
+
enabled: input.enabled ?? existing?.enabled ?? true,
|
|
87
|
+
domain: input.domain ?? existing?.domain ?? "feishu",
|
|
88
|
+
appId: input.appId ?? existing?.appId,
|
|
89
|
+
appSecret: input.appSecret ?? existing?.appSecret,
|
|
90
|
+
inboundMode: input.inboundMode ?? existing?.inboundMode ?? "mention",
|
|
91
|
+
processingReaction: {
|
|
92
|
+
enabled: input.processingReaction?.enabled ?? existing?.processingReaction?.enabled ?? true,
|
|
93
|
+
emojiType: input.processingReaction?.emojiType ?? existing?.processingReaction?.emojiType ?? "Typing",
|
|
94
|
+
},
|
|
95
|
+
targetMachineId: input.targetMachineId ?? existing?.targetMachineId ?? defaultMachineId,
|
|
96
|
+
targetSessionId: input.targetSessionId ?? existing?.targetSessionId,
|
|
97
|
+
targetCwd: input.targetCwd ?? existing?.targetCwd,
|
|
98
|
+
defaultAgent: input.defaultAgent ?? existing?.defaultAgent ?? "codex",
|
|
99
|
+
defaultModel: input.defaultModel ?? existing?.defaultModel,
|
|
100
|
+
allowAnySender: input.allowAnySender ?? existing?.allowAnySender ?? true,
|
|
101
|
+
allowedChatIds: input.allowedChatIds ?? existing?.allowedChatIds,
|
|
102
|
+
allowedSenderIds: input.allowedSenderIds ?? existing?.allowedSenderIds,
|
|
103
|
+
localToken: input.type === "lark" ? undefined : input.localToken ?? existing?.localToken,
|
|
104
|
+
localSecret: input.type === "lark" ? undefined : input.localSecret ?? existing?.localSecret,
|
|
105
|
+
lastError: existing?.lastError,
|
|
106
|
+
lastReceived: existing?.lastReceived,
|
|
107
|
+
lastAdmitted: existing?.lastAdmitted,
|
|
108
|
+
lastReplied: existing?.lastReplied,
|
|
109
|
+
lastDeliveredMessage: existing?.lastDeliveredMessage,
|
|
110
|
+
updatedAt: now,
|
|
111
|
+
};
|
|
112
|
+
return {
|
|
113
|
+
...current,
|
|
114
|
+
channels: [channel, ...current.channels.filter((item) => item.id !== id)],
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
function normalizeGatewayChannel(channel) {
|
|
118
|
+
return {
|
|
119
|
+
...channel,
|
|
120
|
+
localToken: channel.type === "lark" ? undefined : channel.localToken,
|
|
121
|
+
localSecret: channel.type === "lark" ? undefined : channel.localSecret,
|
|
122
|
+
inboundMode: channel.inboundMode ?? "mention",
|
|
123
|
+
processingReaction: channel.processingReaction ?? { enabled: true, emojiType: "Typing" },
|
|
124
|
+
allowAnySender: channel.allowAnySender ?? true,
|
|
125
|
+
allowedChatIds: Array.isArray(channel.allowedChatIds) ? channel.allowedChatIds.filter(Boolean) : undefined,
|
|
126
|
+
allowedSenderIds: Array.isArray(channel.allowedSenderIds) ? channel.allowedSenderIds.filter(Boolean) : undefined,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
async function mergeLegacyGatewayStore(store) {
|
|
130
|
+
const legacy = await readLegacyGatewayStore();
|
|
131
|
+
if (!legacy)
|
|
132
|
+
return store;
|
|
133
|
+
let changed = false;
|
|
134
|
+
let channels = store.channels;
|
|
135
|
+
for (const legacyChannel of legacy.channels) {
|
|
136
|
+
if (channels.some((channel) => channel.id === legacyChannel.id))
|
|
137
|
+
continue;
|
|
138
|
+
if (channels.some((channel) => channel.type === "lark" && channel.enabled && channel.appId === legacyChannel.appId))
|
|
139
|
+
continue;
|
|
140
|
+
channels = [legacyChannel, ...channels];
|
|
141
|
+
changed = true;
|
|
142
|
+
}
|
|
143
|
+
const channelIds = new Set(channels.map((channel) => channel.id));
|
|
144
|
+
let mappings = store.mappings;
|
|
145
|
+
for (const legacyMapping of legacy.mappings) {
|
|
146
|
+
if (!channelIds.has(legacyMapping.channelId))
|
|
147
|
+
continue;
|
|
148
|
+
if (mappings.some((mapping) => mapping.channelId === legacyMapping.channelId
|
|
149
|
+
&& mapping.externalConversationId === legacyMapping.externalConversationId))
|
|
150
|
+
continue;
|
|
151
|
+
mappings = [legacyMapping, ...mappings];
|
|
152
|
+
changed = true;
|
|
153
|
+
}
|
|
154
|
+
if (!changed)
|
|
155
|
+
return store;
|
|
156
|
+
const next = { ...store, channels, mappings };
|
|
157
|
+
await writeGatewayStore(next);
|
|
158
|
+
return next;
|
|
159
|
+
}
|
|
160
|
+
async function readLegacyGatewayStore() {
|
|
161
|
+
const legacyConfig = await readJsonFile(path.join(configDir, "gateways.json"));
|
|
162
|
+
const legacyGateways = Array.isArray(legacyConfig?.gateways) ? legacyConfig.gateways : [];
|
|
163
|
+
if (legacyGateways.length === 0)
|
|
164
|
+
return undefined;
|
|
165
|
+
const legacyState = await readJsonFile(path.join(configDir, "gateway-state.json"));
|
|
166
|
+
const legacyBindings = Array.isArray(legacyState?.bindings) ? legacyState.bindings : [];
|
|
167
|
+
const channels = legacyGateways
|
|
168
|
+
.map(legacyChannelFromRecord)
|
|
169
|
+
.filter((channel) => Boolean(channel));
|
|
170
|
+
const channelIds = new Set(channels.map((channel) => channel.id));
|
|
171
|
+
const mappings = legacyBindings
|
|
172
|
+
.map(legacyMappingFromRecord)
|
|
173
|
+
.filter((mapping) => mapping !== undefined && channelIds.has(mapping.channelId));
|
|
174
|
+
return channels.length > 0 || mappings.length > 0 ? { channels, mappings } : undefined;
|
|
175
|
+
}
|
|
176
|
+
async function readJsonFile(filePath) {
|
|
177
|
+
try {
|
|
178
|
+
const parsed = JSON.parse(await fs.readFile(filePath, "utf8"));
|
|
179
|
+
return isRecord(parsed) ? parsed : undefined;
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
if (error.code === "ENOENT")
|
|
183
|
+
return undefined;
|
|
184
|
+
throw error;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
function legacyChannelFromRecord(value) {
|
|
188
|
+
const record = isRecord(value) ? value : undefined;
|
|
189
|
+
if (!record)
|
|
190
|
+
return undefined;
|
|
191
|
+
const platform = stringField(record, "platform");
|
|
192
|
+
if (platform !== "feishu" && platform !== "lark")
|
|
193
|
+
return undefined;
|
|
194
|
+
const id = stringField(record, "id");
|
|
195
|
+
if (!id)
|
|
196
|
+
return undefined;
|
|
197
|
+
const identities = Array.isArray(record.identities) ? record.identities.filter(isRecord) : [];
|
|
198
|
+
const allowedSenderIds = uniqueStrings(identities.map((identity) => stringField(identity, "platformUserId")));
|
|
199
|
+
const allowAnySender = booleanField(record, "allowAllUsers") ?? allowedSenderIds.length === 0;
|
|
200
|
+
const createdAt = legacyIsoDate(record.createdAt);
|
|
201
|
+
const updatedAt = legacyIsoDate(record.updatedAt, createdAt);
|
|
202
|
+
return normalizeGatewayChannel({
|
|
203
|
+
id,
|
|
204
|
+
type: "lark",
|
|
205
|
+
enabled: booleanField(record, "enabled") ?? true,
|
|
206
|
+
domain: gatewayDomain(stringField(record, "domain") ?? platform),
|
|
207
|
+
appId: stringField(record, "appId"),
|
|
208
|
+
appSecret: stringField(record, "appSecret"),
|
|
209
|
+
inboundMode: booleanField(record, "requireMention") === false ? "all" : "mention",
|
|
210
|
+
processingReaction: { enabled: true, emojiType: "Typing" },
|
|
211
|
+
targetCwd: stringField(record, "defaultCwd"),
|
|
212
|
+
defaultAgent: stringField(record, "defaultAgent") ?? "codex",
|
|
213
|
+
allowAnySender,
|
|
214
|
+
allowedSenderIds: allowAnySender ? undefined : allowedSenderIds,
|
|
215
|
+
createdAt,
|
|
216
|
+
updatedAt,
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
function legacyMappingFromRecord(value) {
|
|
220
|
+
const record = isRecord(value) ? value : undefined;
|
|
221
|
+
if (!record)
|
|
222
|
+
return undefined;
|
|
223
|
+
const channelId = stringField(record, "gatewayId");
|
|
224
|
+
const platformChatId = stringField(record, "platformChatId");
|
|
225
|
+
const sessionId = stringField(record, "sessionId");
|
|
226
|
+
if (!channelId || !platformChatId || !sessionId)
|
|
227
|
+
return undefined;
|
|
228
|
+
const contextKind = stringField(record, "contextKind");
|
|
229
|
+
const contextKey = stringField(record, "contextKey");
|
|
230
|
+
const externalConversationId = contextKind === "thread" && contextKey
|
|
231
|
+
? `${platformChatId}:thread:${contextKey}`
|
|
232
|
+
: `${platformChatId}:main`;
|
|
233
|
+
const createdAt = legacyIsoDate(record.createdAt);
|
|
234
|
+
return {
|
|
235
|
+
channelId,
|
|
236
|
+
externalConversationId,
|
|
237
|
+
sessionId,
|
|
238
|
+
createRequestId: stableLegacyGatewayId("gw_create", channelId, externalConversationId),
|
|
239
|
+
createdAt,
|
|
240
|
+
updatedAt: legacyIsoDate(record.updatedAt, createdAt),
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
function stableLegacyGatewayId(prefix, ...parts) {
|
|
244
|
+
return `${prefix}_${createHash("sha256").update(parts.join("\0")).digest("base64url").slice(0, 32)}`;
|
|
245
|
+
}
|
|
246
|
+
function gatewayDomain(value) {
|
|
247
|
+
return value === "lark" ? "lark" : "feishu";
|
|
248
|
+
}
|
|
249
|
+
function legacyIsoDate(value, fallback = new Date().toISOString()) {
|
|
250
|
+
const numeric = typeof value === "number" ? value : typeof value === "string" ? Number(value) : NaN;
|
|
251
|
+
const date = Number.isFinite(numeric) ? new Date(numeric) : new Date(fallback);
|
|
252
|
+
return Number.isFinite(date.getTime()) ? date.toISOString() : new Date().toISOString();
|
|
253
|
+
}
|
|
254
|
+
function uniqueStrings(values) {
|
|
255
|
+
return Array.from(new Set(values.map((value) => value?.trim()).filter((value) => Boolean(value))));
|
|
256
|
+
}
|
|
257
|
+
function stringField(record, key) {
|
|
258
|
+
const value = record[key];
|
|
259
|
+
return typeof value === "string" && value.trim() ? value.trim() : undefined;
|
|
260
|
+
}
|
|
261
|
+
function booleanField(record, key) {
|
|
262
|
+
const value = record[key];
|
|
263
|
+
return typeof value === "boolean" ? value : undefined;
|
|
264
|
+
}
|
|
265
|
+
function isRecord(value) {
|
|
266
|
+
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
267
|
+
}
|
|
268
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type MachineCommand } from "../../../../packages/shared/dist/index.js";
|
|
2
|
+
import type { DaemonConfig } from "../types.js";
|
|
3
|
+
type MemoryCommand = Extract<MachineCommand, {
|
|
4
|
+
type: "machine:memory";
|
|
5
|
+
}>;
|
|
6
|
+
export declare function handleMemoryCommand(ws: WebSocket, config: DaemonConfig, command: MemoryCommand): Promise<void>;
|
|
7
|
+
export {};
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { decryptJson, encryptJson } from "../../../../packages/shared/dist/index.js";
|
|
3
|
+
import { claimCommandRequest, sendCommandResponse } from "../relay/send.js";
|
|
4
|
+
import { applyMemoryDocumentSnapshot, ensureMemoryFiles, memoryDocumentSnapshots, memoryOverview, promoteMemory, readMemoryFile, searchMemory, writeMemory, } from "./manager.js";
|
|
5
|
+
export async function handleMemoryCommand(ws, config, command) {
|
|
6
|
+
if (!claimCommandRequest(ws, command.requestId))
|
|
7
|
+
return;
|
|
8
|
+
const result = await executeMemoryCommand(config, command);
|
|
9
|
+
await sendCommandResponse(ws, {
|
|
10
|
+
type: "machine:memoryResult",
|
|
11
|
+
requestId: command.requestId,
|
|
12
|
+
machineId: config.machineId,
|
|
13
|
+
result,
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
async function executeMemoryCommand(config, command) {
|
|
17
|
+
const projectKey = command.projectKey ?? command.write?.projectKey ?? command.promote?.projectKey;
|
|
18
|
+
if (!projectKey)
|
|
19
|
+
throw new Error("memory projectKey is required");
|
|
20
|
+
if (command.action === "overview" || command.action === "status") {
|
|
21
|
+
return { action: command.action, overview: await memoryOverview(projectKey, command.mode ?? "readonly"), mode: command.mode ?? "readonly" };
|
|
22
|
+
}
|
|
23
|
+
if (command.action === "read") {
|
|
24
|
+
if (!command.path)
|
|
25
|
+
throw new Error("memory read requires path");
|
|
26
|
+
const read = await readMemoryFile(projectKey, command.path);
|
|
27
|
+
return { action: "read", ...read };
|
|
28
|
+
}
|
|
29
|
+
if (command.action === "search") {
|
|
30
|
+
const query = command.query ?? "";
|
|
31
|
+
const results = query.trim() ? await searchMemory(projectKey, query, command.limit ?? 5) : [];
|
|
32
|
+
return { action: "search", results };
|
|
33
|
+
}
|
|
34
|
+
if (command.action === "reindex") {
|
|
35
|
+
await ensureMemoryFiles(projectKey);
|
|
36
|
+
return { action: "reindex", overview: await memoryOverview(projectKey, command.mode ?? "readonly") };
|
|
37
|
+
}
|
|
38
|
+
if (command.action === "write") {
|
|
39
|
+
if (!command.write)
|
|
40
|
+
throw new Error("memory write requires write payload");
|
|
41
|
+
const written = await writeMemory(command.write);
|
|
42
|
+
return { action: "write", written, path: written.path, layer: written.layer };
|
|
43
|
+
}
|
|
44
|
+
if (command.action === "promote") {
|
|
45
|
+
if (!command.promote)
|
|
46
|
+
throw new Error("memory promote requires promote payload");
|
|
47
|
+
const promoted = await promoteMemory(command.promote);
|
|
48
|
+
return { action: "promote", promoted, written: promoted, path: promoted.path, layer: promoted.layer };
|
|
49
|
+
}
|
|
50
|
+
if (command.action === "sync") {
|
|
51
|
+
const conflicts = await syncMemoryDocuments(config, projectKey);
|
|
52
|
+
return { action: "sync", overview: await memoryOverview(projectKey, command.mode ?? "readonly"), conflicts, syncedAt: new Date().toISOString() };
|
|
53
|
+
}
|
|
54
|
+
throw new Error(`Unsupported memory action: ${command.action}`);
|
|
55
|
+
}
|
|
56
|
+
async function syncMemoryDocuments(config, projectKey) {
|
|
57
|
+
const conflicts = [];
|
|
58
|
+
const remote = await fetch(`${config.relayUrl}/api/machine/memory-documents?projectKey=${encodeURIComponent(projectKey)}`, {
|
|
59
|
+
headers: { authorization: `Bearer ${config.machineToken}` },
|
|
60
|
+
});
|
|
61
|
+
if (remote.ok) {
|
|
62
|
+
const body = await remote.json();
|
|
63
|
+
for (const document of body.documents ?? []) {
|
|
64
|
+
if (!document.encryptedDocument)
|
|
65
|
+
continue;
|
|
66
|
+
const payload = await decryptJson(config.accountSecret, document.encryptedDocument);
|
|
67
|
+
if (typeof payload.path === "string" && typeof payload.content === "string" && isMemoryLayer(payload.layer)) {
|
|
68
|
+
const applied = await applyMemoryDocumentSnapshot(projectKey, payload);
|
|
69
|
+
if (applied.conflict)
|
|
70
|
+
conflicts.push(applied.conflict);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
for (const snapshot of await memoryDocumentSnapshots(projectKey)) {
|
|
75
|
+
const encryptedDocument = await encryptJson(config.accountSecret, `memory-doc:${projectKey}:${snapshot.path}`, {
|
|
76
|
+
path: snapshot.path,
|
|
77
|
+
layer: snapshot.layer,
|
|
78
|
+
content: snapshot.content,
|
|
79
|
+
updatedAt: snapshot.summary.updatedAt,
|
|
80
|
+
contentHash: snapshot.summary.contentHash,
|
|
81
|
+
});
|
|
82
|
+
const response = await fetch(`${config.relayUrl}/api/machine/memory-documents`, {
|
|
83
|
+
method: "POST",
|
|
84
|
+
headers: {
|
|
85
|
+
authorization: `Bearer ${config.machineToken}`,
|
|
86
|
+
"content-type": "application/json",
|
|
87
|
+
},
|
|
88
|
+
body: JSON.stringify({
|
|
89
|
+
id: memoryDocumentId(projectKey, snapshot.path),
|
|
90
|
+
projectKey,
|
|
91
|
+
encryptedDocument,
|
|
92
|
+
}),
|
|
93
|
+
});
|
|
94
|
+
if (!response.ok)
|
|
95
|
+
throw new Error(`memory document sync failed: ${response.status}`);
|
|
96
|
+
}
|
|
97
|
+
return conflicts;
|
|
98
|
+
}
|
|
99
|
+
function memoryDocumentId(projectKey, path) {
|
|
100
|
+
return `memdoc_${createHash("sha256").update(`${projectKey}\0${path}`).digest("base64url").slice(0, 32)}`;
|
|
101
|
+
}
|
|
102
|
+
function isMemoryLayer(value) {
|
|
103
|
+
return value === "user" || value === "curated" || value === "daily";
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=handler.js.map
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { MemoryCitation, MemoryFileSummary, MemoryLayer, MemoryMode, MemoryOverview, MemoryPromoteInput, MemorySearchResult, MemorySyncConflict, MemoryTurnOptions, MemoryWriteInput } from "../../../../packages/shared/dist/index.js";
|
|
2
|
+
export type PreparedMemoryContext = {
|
|
3
|
+
text: string;
|
|
4
|
+
used: MemorySearchResult[];
|
|
5
|
+
options: MemoryTurnOptions;
|
|
6
|
+
};
|
|
7
|
+
export declare function memoryOverview(projectKey: string, mode?: MemoryMode): Promise<MemoryOverview>;
|
|
8
|
+
export declare function readMemoryFile(projectKey: string, requestedPath: string): Promise<{
|
|
9
|
+
path: string;
|
|
10
|
+
layer: MemoryLayer;
|
|
11
|
+
content: string;
|
|
12
|
+
citations: MemoryCitation[];
|
|
13
|
+
}>;
|
|
14
|
+
export declare function writeMemory(input: MemoryWriteInput): Promise<MemoryFileSummary>;
|
|
15
|
+
export declare function searchMemory(projectKey: string, query: string, limit?: number, options?: {
|
|
16
|
+
includeDaily?: boolean;
|
|
17
|
+
}): Promise<MemorySearchResult[]>;
|
|
18
|
+
export declare function prepareMemoryContext(options: MemoryTurnOptions, promptText: string): Promise<PreparedMemoryContext>;
|
|
19
|
+
export declare function writeTurnMemory(options: MemoryTurnOptions | undefined, input: {
|
|
20
|
+
promptText: string;
|
|
21
|
+
outputPreview: string;
|
|
22
|
+
requestId: string;
|
|
23
|
+
turnId: string;
|
|
24
|
+
status: string;
|
|
25
|
+
}): Promise<MemoryFileSummary | undefined>;
|
|
26
|
+
export declare function maybePromoteMemory(options: MemoryTurnOptions | undefined, promptText: string): Promise<MemoryFileSummary | undefined>;
|
|
27
|
+
export declare function promoteMemory(input: MemoryPromoteInput): Promise<MemoryFileSummary>;
|
|
28
|
+
export declare function ensureMemoryFiles(projectKey: string): Promise<void>;
|
|
29
|
+
export declare function memoryDocumentSnapshots(projectKey: string): Promise<Array<{
|
|
30
|
+
path: string;
|
|
31
|
+
layer: MemoryLayer;
|
|
32
|
+
content: string;
|
|
33
|
+
summary: MemoryFileSummary;
|
|
34
|
+
}>>;
|
|
35
|
+
export declare function applyMemoryDocumentSnapshot(projectKey: string, snapshot: {
|
|
36
|
+
path: string;
|
|
37
|
+
layer: MemoryLayer;
|
|
38
|
+
content: string;
|
|
39
|
+
updatedAt?: string;
|
|
40
|
+
contentHash?: string;
|
|
41
|
+
}): Promise<{
|
|
42
|
+
summary: MemoryFileSummary;
|
|
43
|
+
conflict?: MemorySyncConflict;
|
|
44
|
+
}>;
|