@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,359 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import fs from "node:fs/promises";
|
|
4
|
+
import { memoryRootDir } from "../paths.js";
|
|
5
|
+
const defaultMemoryMode = "readonly";
|
|
6
|
+
const maxSearchFiles = 400;
|
|
7
|
+
const memoryProjectWriteChains = new Map();
|
|
8
|
+
export async function memoryOverview(projectKey, mode = defaultMemoryMode) {
|
|
9
|
+
const root = projectMemoryRoot(projectKey);
|
|
10
|
+
await ensureMemoryFiles(projectKey);
|
|
11
|
+
const files = await listMemoryFiles(projectKey);
|
|
12
|
+
return {
|
|
13
|
+
projectKey,
|
|
14
|
+
mode,
|
|
15
|
+
root,
|
|
16
|
+
files,
|
|
17
|
+
updatedAt: new Date().toISOString(),
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export async function readMemoryFile(projectKey, requestedPath) {
|
|
21
|
+
const resolved = resolveMemoryPath(projectKey, requestedPath);
|
|
22
|
+
const content = await fs.readFile(resolved.absPath, "utf8");
|
|
23
|
+
const lineCount = content.split(/\r?\n/).length;
|
|
24
|
+
const contentHash = hashContent(content);
|
|
25
|
+
return {
|
|
26
|
+
path: resolved.relPath,
|
|
27
|
+
layer: layerForPath(resolved.relPath),
|
|
28
|
+
content,
|
|
29
|
+
citations: [{ path: resolved.relPath, startLine: 1, endLine: Math.max(1, lineCount), contentHash }],
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export async function writeMemory(input) {
|
|
33
|
+
return await withMemoryProjectWriteLock(input.projectKey, async () => writeMemoryUnlocked(input));
|
|
34
|
+
}
|
|
35
|
+
async function writeMemoryUnlocked(input) {
|
|
36
|
+
const text = input.text.trim();
|
|
37
|
+
if (!text)
|
|
38
|
+
throw new Error("memory text is required");
|
|
39
|
+
const target = memoryPathForLayer(input.projectKey, input.layer, input.date);
|
|
40
|
+
await ensureMemoryFiles(input.projectKey);
|
|
41
|
+
await fs.mkdir(path.dirname(target.absPath), { recursive: true });
|
|
42
|
+
const entry = formatMemoryEntry(input.layer, text, input.title);
|
|
43
|
+
await fs.appendFile(target.absPath, entry, "utf8");
|
|
44
|
+
return await summarizeFile(target.absPath, target.relPath, input.layer);
|
|
45
|
+
}
|
|
46
|
+
export async function searchMemory(projectKey, query, limit = 5, options = {}) {
|
|
47
|
+
await ensureMemoryFiles(projectKey);
|
|
48
|
+
const terms = query.toLowerCase().split(/[^\p{L}\p{N}_-]+/u).filter((term) => term.length >= 2);
|
|
49
|
+
const files = (await listMemoryFiles(projectKey))
|
|
50
|
+
.filter((file) => options.includeDaily !== false || file.layer !== "daily")
|
|
51
|
+
.slice(0, maxSearchFiles);
|
|
52
|
+
const results = [];
|
|
53
|
+
for (const file of files) {
|
|
54
|
+
const resolved = resolveMemoryPath(projectKey, file.path);
|
|
55
|
+
const content = await fs.readFile(resolved.absPath, "utf8").catch(() => "");
|
|
56
|
+
const contentHash = hashContent(content);
|
|
57
|
+
const chunks = chunkMarkdown(content, file.path, file.layer, contentHash);
|
|
58
|
+
for (const chunk of chunks) {
|
|
59
|
+
const score = scoreChunk(chunk.text, query, terms, file.layer);
|
|
60
|
+
if (score <= 0)
|
|
61
|
+
continue;
|
|
62
|
+
results.push({
|
|
63
|
+
id: stableMemoryId(projectKey, chunk.citation.path, String(chunk.citation.startLine), chunk.text),
|
|
64
|
+
layer: file.layer,
|
|
65
|
+
path: file.path,
|
|
66
|
+
...(chunk.title ? { title: chunk.title } : {}),
|
|
67
|
+
snippet: compactSnippet(chunk.text),
|
|
68
|
+
citation: chunk.citation,
|
|
69
|
+
score,
|
|
70
|
+
updatedAt: file.updatedAt,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return results
|
|
75
|
+
.sort((left, right) => right.score - left.score || right.updatedAt.localeCompare(left.updatedAt))
|
|
76
|
+
.slice(0, Math.max(1, limit));
|
|
77
|
+
}
|
|
78
|
+
export async function prepareMemoryContext(options, promptText) {
|
|
79
|
+
if (options.mode === "off")
|
|
80
|
+
return { text: promptText, used: [], options };
|
|
81
|
+
const topN = Math.max(1, Math.min(8, options.topN ?? 3));
|
|
82
|
+
const used = await searchMemory(options.projectKey, promptText, topN, { includeDaily: false });
|
|
83
|
+
if (used.length === 0)
|
|
84
|
+
return { text: promptText, used, options };
|
|
85
|
+
const block = [
|
|
86
|
+
"Memory context for this turn:",
|
|
87
|
+
...used.map((item, index) => `${index + 1}. [${item.path}:${item.citation.startLine}-${item.citation.endLine}] ${item.snippet}`),
|
|
88
|
+
"Use this context only when it is relevant. Do not reveal internal memory paths unless the user asks.",
|
|
89
|
+
].join("\n");
|
|
90
|
+
return { text: `${block}\n\n${promptText}`, used, options };
|
|
91
|
+
}
|
|
92
|
+
export async function writeTurnMemory(options, input) {
|
|
93
|
+
if (!options || options.mode !== "readwrite")
|
|
94
|
+
return undefined;
|
|
95
|
+
const summary = [
|
|
96
|
+
`Request: ${input.requestId}`,
|
|
97
|
+
`Turn: ${input.turnId}`,
|
|
98
|
+
`Status: ${input.status}`,
|
|
99
|
+
"",
|
|
100
|
+
"Prompt:",
|
|
101
|
+
input.promptText.slice(0, 4000),
|
|
102
|
+
"",
|
|
103
|
+
"Output preview:",
|
|
104
|
+
input.outputPreview.slice(0, 4000) || "(no output preview)",
|
|
105
|
+
].join("\n");
|
|
106
|
+
return await writeMemory({
|
|
107
|
+
projectKey: options.projectKey,
|
|
108
|
+
layer: "daily",
|
|
109
|
+
title: `Turn ${input.turnId}`,
|
|
110
|
+
text: summary,
|
|
111
|
+
date: new Date().toISOString().slice(0, 10),
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
export async function maybePromoteMemory(options, promptText) {
|
|
115
|
+
if (!options || options.mode !== "readwrite")
|
|
116
|
+
return undefined;
|
|
117
|
+
if (!/\bremember this\b|记住|记忆下来|save this memory/i.test(promptText))
|
|
118
|
+
return undefined;
|
|
119
|
+
const cleaned = promptText
|
|
120
|
+
.replace(/\bremember this\b[::]?/ig, "")
|
|
121
|
+
.replace(/记住[::]?/g, "")
|
|
122
|
+
.replace(/记忆下来[::]?/g, "")
|
|
123
|
+
.replace(/save this memory[::]?/ig, "")
|
|
124
|
+
.trim();
|
|
125
|
+
if (!cleaned)
|
|
126
|
+
return undefined;
|
|
127
|
+
return await writeMemory({
|
|
128
|
+
projectKey: options.projectKey,
|
|
129
|
+
layer: "curated",
|
|
130
|
+
title: "Promoted from read-write turn",
|
|
131
|
+
text: cleaned,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
export async function promoteMemory(input) {
|
|
135
|
+
return await withMemoryProjectWriteLock(input.projectKey, async () => {
|
|
136
|
+
const resolved = resolveMemoryPath(input.projectKey, input.source.path);
|
|
137
|
+
const content = await fs.readFile(resolved.absPath, "utf8");
|
|
138
|
+
const currentHash = hashContent(content);
|
|
139
|
+
const citation = {
|
|
140
|
+
...input.source,
|
|
141
|
+
contentHash: input.source.contentHash ?? currentHash,
|
|
142
|
+
stale: Boolean(input.source.contentHash && input.source.contentHash !== currentHash),
|
|
143
|
+
};
|
|
144
|
+
const lines = content.split(/\r?\n/);
|
|
145
|
+
const selected = lines.slice(Math.max(0, citation.startLine - 1), Math.max(citation.startLine, citation.endLine)).join("\n").trim();
|
|
146
|
+
if (!selected)
|
|
147
|
+
throw new Error("memory promotion source is empty");
|
|
148
|
+
const stalePrefix = citation.stale ? `Source changed since citation ${input.source.contentHash}. Current hash ${currentHash}.\n\n` : "";
|
|
149
|
+
return await writeMemoryUnlocked({
|
|
150
|
+
projectKey: input.projectKey,
|
|
151
|
+
layer: input.targetLayer,
|
|
152
|
+
title: input.title ?? `Promoted from ${citation.path}:${citation.startLine}-${citation.endLine}`,
|
|
153
|
+
text: `${stalePrefix}${selected}`,
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
export async function ensureMemoryFiles(projectKey) {
|
|
158
|
+
const root = projectMemoryRoot(projectKey);
|
|
159
|
+
await fs.mkdir(path.join(root, "memory"), { recursive: true });
|
|
160
|
+
await ensureFile(path.join(root, "USER.md"), "# User Memory\n\n");
|
|
161
|
+
await ensureFile(path.join(root, "MEMORY.md"), "# Project Memory\n\n");
|
|
162
|
+
const today = new Date().toISOString().slice(0, 10);
|
|
163
|
+
await ensureFile(path.join(root, "memory", `${today}.md`), `# Daily Memory ${today}\n\n`);
|
|
164
|
+
}
|
|
165
|
+
async function listMemoryFiles(projectKey) {
|
|
166
|
+
const root = projectMemoryRoot(projectKey);
|
|
167
|
+
const files = [];
|
|
168
|
+
for (const relPath of ["USER.md", "MEMORY.md"]) {
|
|
169
|
+
const absPath = path.join(root, relPath);
|
|
170
|
+
const summary = await summarizeFile(absPath, relPath, layerForPath(relPath)).catch(() => undefined);
|
|
171
|
+
if (summary)
|
|
172
|
+
files.push(summary);
|
|
173
|
+
}
|
|
174
|
+
const dailyDir = path.join(root, "memory");
|
|
175
|
+
const daily = await fs.readdir(dailyDir).catch(() => []);
|
|
176
|
+
for (const name of daily.filter((item) => /^\d{4}-\d{2}-\d{2}\.md$/.test(item)).sort().reverse()) {
|
|
177
|
+
const relPath = `memory/${name}`;
|
|
178
|
+
const summary = await summarizeFile(path.join(root, relPath), relPath, "daily").catch(() => undefined);
|
|
179
|
+
if (summary)
|
|
180
|
+
files.push(summary);
|
|
181
|
+
}
|
|
182
|
+
return files;
|
|
183
|
+
}
|
|
184
|
+
export async function memoryDocumentSnapshots(projectKey) {
|
|
185
|
+
await ensureMemoryFiles(projectKey);
|
|
186
|
+
const snapshots = [];
|
|
187
|
+
for (const file of await listMemoryFiles(projectKey)) {
|
|
188
|
+
const resolved = resolveMemoryPath(projectKey, file.path);
|
|
189
|
+
snapshots.push({ path: file.path, layer: file.layer, content: await fs.readFile(resolved.absPath, "utf8"), summary: file });
|
|
190
|
+
}
|
|
191
|
+
return snapshots;
|
|
192
|
+
}
|
|
193
|
+
export async function applyMemoryDocumentSnapshot(projectKey, snapshot) {
|
|
194
|
+
return await withMemoryProjectWriteLock(projectKey, async () => {
|
|
195
|
+
await ensureMemoryFiles(projectKey);
|
|
196
|
+
const resolved = resolveMemoryPath(projectKey, snapshot.path);
|
|
197
|
+
await fs.mkdir(path.dirname(resolved.absPath), { recursive: true });
|
|
198
|
+
const local = await fs.readFile(resolved.absPath, "utf8").catch(() => "");
|
|
199
|
+
const localContentHash = local ? hashContent(local) : undefined;
|
|
200
|
+
let next = snapshot.content;
|
|
201
|
+
let conflicted = false;
|
|
202
|
+
if (local && local !== snapshot.content) {
|
|
203
|
+
if (local.includes(snapshot.content))
|
|
204
|
+
next = local;
|
|
205
|
+
else if (snapshot.content.includes(local))
|
|
206
|
+
next = snapshot.content;
|
|
207
|
+
else {
|
|
208
|
+
conflicted = true;
|
|
209
|
+
next = `${local.trimEnd()}\n\n## Sync conflict ${new Date().toISOString()}\n\n${snapshot.content.trim()}\n`;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
await fs.writeFile(resolved.absPath, next, { mode: 0o600 });
|
|
213
|
+
const summary = await summarizeFile(resolved.absPath, resolved.relPath, snapshot.layer);
|
|
214
|
+
return {
|
|
215
|
+
summary,
|
|
216
|
+
...(conflicted ? {
|
|
217
|
+
conflict: {
|
|
218
|
+
path: resolved.relPath,
|
|
219
|
+
layer: snapshot.layer,
|
|
220
|
+
...(localContentHash ? { localContentHash } : {}),
|
|
221
|
+
...(snapshot.contentHash ? { remoteContentHash: snapshot.contentHash } : {}),
|
|
222
|
+
mergedContentHash: summary.contentHash,
|
|
223
|
+
},
|
|
224
|
+
} : {}),
|
|
225
|
+
};
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
function projectMemoryRoot(projectKey) {
|
|
229
|
+
return path.join(memoryRootDir, safeSegment(projectKey));
|
|
230
|
+
}
|
|
231
|
+
function resolveMemoryPath(projectKey, requestedPath) {
|
|
232
|
+
const relPath = normalizeRelMemoryPath(requestedPath);
|
|
233
|
+
const root = projectMemoryRoot(projectKey);
|
|
234
|
+
const absPath = path.resolve(root, relPath);
|
|
235
|
+
if (!absPath.startsWith(path.resolve(root) + path.sep) && absPath !== path.resolve(root)) {
|
|
236
|
+
throw new Error("memory path escapes project root");
|
|
237
|
+
}
|
|
238
|
+
return { absPath, relPath };
|
|
239
|
+
}
|
|
240
|
+
function memoryPathForLayer(projectKey, layer, date) {
|
|
241
|
+
const root = projectMemoryRoot(projectKey);
|
|
242
|
+
if (layer === "user")
|
|
243
|
+
return { absPath: path.join(root, "USER.md"), relPath: "USER.md" };
|
|
244
|
+
if (layer === "curated")
|
|
245
|
+
return { absPath: path.join(root, "MEMORY.md"), relPath: "MEMORY.md" };
|
|
246
|
+
const day = sanitizeDate(date ?? new Date().toISOString().slice(0, 10));
|
|
247
|
+
return { absPath: path.join(root, "memory", `${day}.md`), relPath: `memory/${day}.md` };
|
|
248
|
+
}
|
|
249
|
+
function layerForPath(relPath) {
|
|
250
|
+
if (relPath === "USER.md")
|
|
251
|
+
return "user";
|
|
252
|
+
if (relPath === "MEMORY.md")
|
|
253
|
+
return "curated";
|
|
254
|
+
return "daily";
|
|
255
|
+
}
|
|
256
|
+
async function ensureFile(filePath, initial) {
|
|
257
|
+
try {
|
|
258
|
+
await fs.access(filePath);
|
|
259
|
+
}
|
|
260
|
+
catch {
|
|
261
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
262
|
+
await fs.writeFile(filePath, initial, { mode: 0o600 });
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
async function withMemoryProjectWriteLock(projectKey, run) {
|
|
266
|
+
const previous = memoryProjectWriteChains.get(projectKey) ?? Promise.resolve();
|
|
267
|
+
const next = previous.then(run, run);
|
|
268
|
+
memoryProjectWriteChains.set(projectKey, next.catch(() => undefined));
|
|
269
|
+
try {
|
|
270
|
+
return await next;
|
|
271
|
+
}
|
|
272
|
+
finally {
|
|
273
|
+
if (memoryProjectWriteChains.get(projectKey) === next)
|
|
274
|
+
memoryProjectWriteChains.delete(projectKey);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
async function summarizeFile(absPath, relPath, layer) {
|
|
278
|
+
const [stat, content] = await Promise.all([fs.stat(absPath), fs.readFile(absPath, "utf8")]);
|
|
279
|
+
return {
|
|
280
|
+
path: relPath,
|
|
281
|
+
layer,
|
|
282
|
+
updatedAt: new Date(stat.mtimeMs).toISOString(),
|
|
283
|
+
lineCount: content.length === 0 ? 0 : content.split(/\r?\n/).length,
|
|
284
|
+
byteSize: stat.size,
|
|
285
|
+
contentHash: hashContent(content),
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
function chunkMarkdown(content, relPath, layer, contentHash) {
|
|
289
|
+
const lines = content.split(/\r?\n/);
|
|
290
|
+
const chunks = [];
|
|
291
|
+
let start = 1;
|
|
292
|
+
let title;
|
|
293
|
+
let buffer = [];
|
|
294
|
+
const flush = (endLine) => {
|
|
295
|
+
const text = buffer.join("\n").trim();
|
|
296
|
+
if (text)
|
|
297
|
+
chunks.push({ ...(title ? { title } : {}), text, citation: { path: relPath, startLine: start, endLine: Math.max(start, endLine), contentHash } });
|
|
298
|
+
buffer = [];
|
|
299
|
+
};
|
|
300
|
+
for (let index = 0; index < lines.length; index += 1) {
|
|
301
|
+
const line = lines[index];
|
|
302
|
+
const heading = line.match(/^(#{1,3})\s+(.+)$/);
|
|
303
|
+
if (heading && buffer.length > 0) {
|
|
304
|
+
flush(index);
|
|
305
|
+
start = index + 1;
|
|
306
|
+
title = heading[2].trim();
|
|
307
|
+
}
|
|
308
|
+
else if (heading) {
|
|
309
|
+
start = index + 1;
|
|
310
|
+
title = heading[2].trim();
|
|
311
|
+
}
|
|
312
|
+
buffer.push(line);
|
|
313
|
+
}
|
|
314
|
+
flush(lines.length);
|
|
315
|
+
if (chunks.length === 0 && content.trim()) {
|
|
316
|
+
chunks.push({ text: content.trim(), citation: { path: relPath, startLine: 1, endLine: lines.length, contentHash }, ...(layer !== "daily" ? { title: relPath } : {}) });
|
|
317
|
+
}
|
|
318
|
+
return chunks;
|
|
319
|
+
}
|
|
320
|
+
function hashContent(content) {
|
|
321
|
+
return createHash("sha256").update(content).digest("hex");
|
|
322
|
+
}
|
|
323
|
+
function scoreChunk(text, query, terms, layer) {
|
|
324
|
+
const haystack = text.toLowerCase();
|
|
325
|
+
const exact = query.trim() && haystack.includes(query.toLowerCase()) ? 20 : 0;
|
|
326
|
+
const termScore = terms.reduce((score, term) => score + (haystack.includes(term) ? 3 : 0), 0);
|
|
327
|
+
const layerBoost = layer === "user" ? 4 : layer === "curated" ? 3 : 1;
|
|
328
|
+
return exact + termScore + (termScore > 0 || exact > 0 ? layerBoost : 0);
|
|
329
|
+
}
|
|
330
|
+
function compactSnippet(text) {
|
|
331
|
+
const compact = text.replace(/\s+/g, " ").trim();
|
|
332
|
+
return compact.length <= 420 ? compact : `${compact.slice(0, 417)}...`;
|
|
333
|
+
}
|
|
334
|
+
function formatMemoryEntry(layer, text, title) {
|
|
335
|
+
const now = new Date().toISOString();
|
|
336
|
+
const heading = title?.trim() || (layer === "daily" ? `Working note ${now}` : `Memory ${now}`);
|
|
337
|
+
return `\n## ${heading}\n\n${text.trim()}\n`;
|
|
338
|
+
}
|
|
339
|
+
function stableMemoryId(...parts) {
|
|
340
|
+
return `mem_${createHash("sha256").update(parts.join("\0")).digest("base64url").slice(0, 24)}`;
|
|
341
|
+
}
|
|
342
|
+
function safeSegment(value) {
|
|
343
|
+
const hash = createHash("sha256").update(value).digest("base64url").slice(0, 16);
|
|
344
|
+
const readable = value.replace(/[^a-zA-Z0-9._-]+/g, "_").slice(0, 48) || "default";
|
|
345
|
+
return `${readable}_${hash}`;
|
|
346
|
+
}
|
|
347
|
+
function normalizeRelMemoryPath(value) {
|
|
348
|
+
const normalized = value.replace(/\\/g, "/").replace(/^\/+/, "");
|
|
349
|
+
if (normalized === "USER.md" || normalized === "MEMORY.md" || /^memory\/\d{4}-\d{2}-\d{2}\.md$/.test(normalized))
|
|
350
|
+
return normalized;
|
|
351
|
+
throw new Error("unsupported memory path");
|
|
352
|
+
}
|
|
353
|
+
function sanitizeDate(value) {
|
|
354
|
+
const match = value.match(/^(\d{4}-\d{2}-\d{2})/);
|
|
355
|
+
if (!match)
|
|
356
|
+
throw new Error("invalid memory date");
|
|
357
|
+
return match[1];
|
|
358
|
+
}
|
|
359
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -5,6 +5,9 @@ export declare const auditLogPath: string;
|
|
|
5
5
|
export declare const relayOutboxPath: string;
|
|
6
6
|
export declare const loopStorePath: string;
|
|
7
7
|
export declare const loopStoreLockPath: string;
|
|
8
|
+
export declare const gatewayStorePath: string;
|
|
9
|
+
export declare const scheduleStorePath: string;
|
|
10
|
+
export declare const memoryRootDir: string;
|
|
8
11
|
export declare const pidPath: string;
|
|
9
12
|
export declare const daemonScriptPath: string;
|
|
10
13
|
export declare const daemonScriptRelativePath: string;
|
|
@@ -10,6 +10,9 @@ export const auditLogPath = path.join(configDir, "audit.jsonl");
|
|
|
10
10
|
export const relayOutboxPath = path.join(configDir, "outbox.jsonl");
|
|
11
11
|
export const loopStorePath = path.join(configDir, "loops.json");
|
|
12
12
|
export const loopStoreLockPath = path.join(configDir, "loops.json.lock");
|
|
13
|
+
export const gatewayStorePath = path.join(configDir, "gateway.json");
|
|
14
|
+
export const scheduleStorePath = path.join(configDir, "schedules.json");
|
|
15
|
+
export const memoryRootDir = path.join(configDir, "memory");
|
|
13
16
|
export const pidPath = path.join(configDir, "daemon.pid");
|
|
14
17
|
export const daemonScriptPath = fileURLToPath(new URL(import.meta.url.endsWith(".ts") ? "./cli.ts" : "./cli.js", import.meta.url));
|
|
15
18
|
export const daemonScriptRelativePath = path.relative(process.cwd(), daemonScriptPath);
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { EncryptedEnvelope, PermissionMode } from "../../../../packages/shared/dist/index.js";
|
|
2
|
+
import type { DaemonConfig } from "../types.js";
|
|
3
|
+
export type MachineAdmissionAck = {
|
|
4
|
+
type: "server:ack";
|
|
5
|
+
requestId: string;
|
|
6
|
+
ok: true;
|
|
7
|
+
sessionId?: string;
|
|
8
|
+
turnId?: string;
|
|
9
|
+
admission?: "accepted" | "replayed";
|
|
10
|
+
dispatch?: "queued" | "delivered";
|
|
11
|
+
};
|
|
12
|
+
export declare function admitMachineCreateSession(config: DaemonConfig, input: {
|
|
13
|
+
requestId: string;
|
|
14
|
+
sessionId?: string;
|
|
15
|
+
agent: string;
|
|
16
|
+
cwd: string;
|
|
17
|
+
name: string;
|
|
18
|
+
model?: string;
|
|
19
|
+
encryptedMetadata?: EncryptedEnvelope;
|
|
20
|
+
}): Promise<MachineAdmissionAck>;
|
|
21
|
+
export declare function admitMachinePrompt(config: DaemonConfig, input: {
|
|
22
|
+
requestId: string;
|
|
23
|
+
sessionId: string;
|
|
24
|
+
turnId: string;
|
|
25
|
+
encryptedPrompt: EncryptedEnvelope;
|
|
26
|
+
encryptedMemoryOptions?: EncryptedEnvelope;
|
|
27
|
+
permissionMode?: PermissionMode;
|
|
28
|
+
model?: string;
|
|
29
|
+
timeoutMs?: number;
|
|
30
|
+
}): Promise<MachineAdmissionAck>;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { readRelayJson, relayHttpError } from "../relay-http.js";
|
|
2
|
+
async function postMachineAdmission(config, path, body, fallback) {
|
|
3
|
+
const response = await fetch(`${config.relayUrl}${path}`, {
|
|
4
|
+
method: "POST",
|
|
5
|
+
headers: {
|
|
6
|
+
authorization: `Bearer ${config.machineToken}`,
|
|
7
|
+
"content-type": "application/json",
|
|
8
|
+
},
|
|
9
|
+
body: JSON.stringify(body),
|
|
10
|
+
});
|
|
11
|
+
if (!response.ok)
|
|
12
|
+
throw await relayHttpError(response, fallback);
|
|
13
|
+
const parsed = await readRelayJson(response, `${fallback}: relay response is not valid JSON`);
|
|
14
|
+
if (!isMachineAdmissionAck(parsed)) {
|
|
15
|
+
throw new Error(`${fallback}: relay did not return an admission ack`);
|
|
16
|
+
}
|
|
17
|
+
return parsed;
|
|
18
|
+
}
|
|
19
|
+
export async function admitMachineCreateSession(config, input) {
|
|
20
|
+
return await postMachineAdmission(config, "/api/machine/admissions/create-session", input, "Machine session admission failed");
|
|
21
|
+
}
|
|
22
|
+
export async function admitMachinePrompt(config, input) {
|
|
23
|
+
return await postMachineAdmission(config, "/api/machine/admissions/prompt", input, "Machine prompt admission failed");
|
|
24
|
+
}
|
|
25
|
+
function isMachineAdmissionAck(value) {
|
|
26
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
27
|
+
return false;
|
|
28
|
+
const record = value;
|
|
29
|
+
return record.type === "server:ack" && record.ok === true && typeof record.requestId === "string";
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=admission.js.map
|
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
import { appendAudit } from "../audit.js";
|
|
2
|
+
import { handleGatewayCommand } from "../gateway/handler.js";
|
|
2
3
|
import { tickLoops } from "../loop/runner.js";
|
|
4
|
+
import { handleMemoryCommand } from "../memory/handler.js";
|
|
5
|
+
import { handleScheduleCommand } from "../schedule/handler.js";
|
|
6
|
+
import { tickSchedules } from "../schedule/runner.js";
|
|
3
7
|
import { handleListDirectory } from "../session/directory.js";
|
|
4
8
|
import { handlePreviewFile } from "../session/file-preview.js";
|
|
5
9
|
import { handleClose, handleCreateSession, handleImportHistoricalSession, handleListHistoricalSessions, handleResume } from "../session/lifecycle.js";
|
|
6
|
-
import { handleCancel, handlePrompt } from "../session/prompt.js";
|
|
10
|
+
import { handleCancel, handleOptionResponse, handlePrompt } from "../session/prompt.js";
|
|
7
11
|
import { handleFork, handleRename, handleRewind } from "../session/primitives.js";
|
|
12
|
+
import { handleReconcileTurn } from "../session/reconcile.js";
|
|
8
13
|
import { parseRelayMessage, relayWsUrl } from "../relay-http.js";
|
|
9
14
|
import { handleDevExec, handleDiagnose } from "./devtools.js";
|
|
10
15
|
import { registerMachine } from "./register.js";
|
|
@@ -58,6 +63,18 @@ async function handleServerMessage(ws, config, message) {
|
|
|
58
63
|
await handleDevExec(ws, config, message);
|
|
59
64
|
return;
|
|
60
65
|
}
|
|
66
|
+
if (message.type === "machine:gateway") {
|
|
67
|
+
await handleGatewayCommand(ws, config, message);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
if (message.type === "machine:schedule") {
|
|
71
|
+
await handleScheduleCommand(ws, config, message);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
if (message.type === "machine:memory") {
|
|
75
|
+
await handleMemoryCommand(ws, config, message);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
61
78
|
if (message.type === "machine:importHistoricalSession") {
|
|
62
79
|
await handleImportHistoricalSession(ws, config, message);
|
|
63
80
|
return;
|
|
@@ -70,6 +87,14 @@ async function handleServerMessage(ws, config, message) {
|
|
|
70
87
|
await handleCancel(ws, config, message);
|
|
71
88
|
return;
|
|
72
89
|
}
|
|
90
|
+
if (message.type === "machine:optionResponse") {
|
|
91
|
+
await handleOptionResponse(ws, config, message);
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
if (message.type === "machine:reconcileTurn") {
|
|
95
|
+
await handleReconcileTurn(ws, config, message);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
73
98
|
if (message.type === "machine:resume") {
|
|
74
99
|
await handleResume(ws, config, message);
|
|
75
100
|
return;
|
|
@@ -95,8 +120,10 @@ export async function connectOnce(config) {
|
|
|
95
120
|
const ws = new WebSocket(relayWsUrl(config.relayUrl));
|
|
96
121
|
console.log(`Connecting ${config.machineName} to ${relayWsUrl(config.relayUrl)}`);
|
|
97
122
|
let loopTimer;
|
|
123
|
+
let scheduleTimer;
|
|
98
124
|
await new Promise((resolve) => {
|
|
99
125
|
ws.addEventListener("open", () => {
|
|
126
|
+
const onlineSinceMs = Date.now();
|
|
100
127
|
setActiveRelaySocket(ws);
|
|
101
128
|
send(ws, {
|
|
102
129
|
type: "hello",
|
|
@@ -109,6 +136,11 @@ export async function connectOnce(config) {
|
|
|
109
136
|
console.error(`Loop tick failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
110
137
|
});
|
|
111
138
|
}, 1000);
|
|
139
|
+
scheduleTimer = setInterval(() => {
|
|
140
|
+
void tickSchedules(config, onlineSinceMs).catch((error) => {
|
|
141
|
+
console.error(`Schedule tick failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
142
|
+
});
|
|
143
|
+
}, 1000);
|
|
112
144
|
});
|
|
113
145
|
ws.addEventListener("message", (event) => {
|
|
114
146
|
let message;
|
|
@@ -133,6 +165,8 @@ export async function connectOnce(config) {
|
|
|
133
165
|
clearActiveRelaySocket(ws);
|
|
134
166
|
if (loopTimer)
|
|
135
167
|
clearInterval(loopTimer);
|
|
168
|
+
if (scheduleTimer)
|
|
169
|
+
clearInterval(scheduleTimer);
|
|
136
170
|
console.log("Relay connection closed; reconnecting...");
|
|
137
171
|
resolve();
|
|
138
172
|
});
|
|
@@ -140,6 +174,8 @@ export async function connectOnce(config) {
|
|
|
140
174
|
clearActiveRelaySocket(ws);
|
|
141
175
|
if (loopTimer)
|
|
142
176
|
clearInterval(loopTimer);
|
|
177
|
+
if (scheduleTimer)
|
|
178
|
+
clearInterval(scheduleTimer);
|
|
143
179
|
resolve();
|
|
144
180
|
});
|
|
145
181
|
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { MachineCommand } from "
|
|
1
|
+
import type { MachineCommand } from "../../../../packages/shared/dist/index.js";
|
|
2
2
|
import type { DaemonConfig } from "../types.js";
|
|
3
3
|
export declare function handleDiagnose(ws: WebSocket, config: DaemonConfig, command: MachineCommand): Promise<void>;
|
|
4
4
|
export declare function handleDevExec(ws: WebSocket, config: DaemonConfig, command: MachineCommand): Promise<void>;
|
|
@@ -22,6 +22,8 @@ function agentProfileForRegister(agent) {
|
|
|
22
22
|
id: agent.id,
|
|
23
23
|
label: agent.label,
|
|
24
24
|
...(agent.command ? { command: agent.command } : {}),
|
|
25
|
+
...(agent.defaultModel ? { defaultModel: agent.defaultModel } : {}),
|
|
26
|
+
...(agent.models && agent.models.length > 0 ? { models: agent.models } : {}),
|
|
25
27
|
...(agent.historyModel ? { historyModel: agent.historyModel } : {}),
|
|
26
28
|
...(agent.sessionPrimitives ? { sessionPrimitives: runtimeAgentPrimitives(agent.sessionPrimitives) } : {}),
|
|
27
29
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { MachineClientMessage } from "
|
|
2
|
-
import type { RuntimeTurn } from "
|
|
1
|
+
import type { MachineClientMessage } from "../../../../packages/shared/dist/index.js";
|
|
2
|
+
import type { RuntimeTurn } from "../../../../packages/runtime/dist/index.js";
|
|
3
3
|
import type { DaemonConfig } from "../types.js";
|
|
4
4
|
export declare function send(ws: WebSocket, message: unknown): void;
|
|
5
5
|
export declare function configureRelaySender(config: DaemonConfig): void;
|
|
@@ -8,12 +8,14 @@ const criticalMessageTypes = new Set([
|
|
|
8
8
|
"machine:event",
|
|
9
9
|
"machine:sessionTranscriptReplaced",
|
|
10
10
|
"machine:sessionTranscriptPrepended",
|
|
11
|
+
"machine:sessionHeadAdvanced",
|
|
11
12
|
"machine:turnDone",
|
|
12
13
|
"machine:sessionResumed",
|
|
13
14
|
"machine:sessionRewound",
|
|
14
15
|
"machine:sessionForked",
|
|
15
16
|
"machine:sessionRenamed",
|
|
16
17
|
"machine:sessionClosed",
|
|
18
|
+
"machine:turnReconciled",
|
|
17
19
|
"machine:error",
|
|
18
20
|
]);
|
|
19
21
|
let activeRelaySocket = null;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type PairingClaimResponse, type ServerMessage } from "
|
|
1
|
+
import { type PairingClaimResponse, type ServerMessage } from "../../../packages/shared/dist/index.js";
|
|
2
2
|
import { DaemonCliError } from "./errors.js";
|
|
3
3
|
export declare function relayHttpError(response: Response, fallback: string): Promise<DaemonCliError>;
|
|
4
4
|
export declare function readRelayJson(response: Response, fallback: string): Promise<unknown>;
|