@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
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { normalizeSessionName } from "../../../../packages/shared/dist/index.js";
|
|
1
|
+
import { normalizeSessionName, normalizeSessionTags } from "../../../../packages/shared/dist/index.js";
|
|
2
2
|
import { appendAudit } from "../audit.js";
|
|
3
3
|
import { getRuntime } from "../runtime.js";
|
|
4
4
|
import { sessions } from "../state.js";
|
|
5
5
|
import { claimCommandRequest, sendCommandResponse } from "../relay/send.js";
|
|
6
6
|
import { createSessionFailureAuditEvent, createSessionFailureResponse } from "./create-session.js";
|
|
7
|
-
import { emitHistoricalEvents, emitRuntimeTailEvents, emitTranscriptPrepended, emitTranscriptReplacement } from "./events.js";
|
|
7
|
+
import { emitHistoricalEvents, emitRuntimeTailEvents, emitSessionHeadAdvanced, emitTranscriptPrepended, emitTranscriptReplacement, latestCompletedHistoricalHead, } from "./events.js";
|
|
8
8
|
import { commandSessionMetadata, encryptedSessionMetadata, sessionFallbackFromCommand } from "./metadata.js";
|
|
9
9
|
const historicalBackfillEventLimit = 200;
|
|
10
10
|
export async function handleCreateSession(ws, config, command) {
|
|
@@ -15,6 +15,8 @@ export async function handleCreateSession(ws, config, command) {
|
|
|
15
15
|
const cwd = command.cwd || process.cwd();
|
|
16
16
|
try {
|
|
17
17
|
const metadata = await commandSessionMetadata(config, command.encryptedMetadata);
|
|
18
|
+
const model = modelFromCommand(command.model ?? metadata?.model);
|
|
19
|
+
const tags = normalizeSessionTags(metadata?.tags);
|
|
18
20
|
const runtime = getRuntime(cwd);
|
|
19
21
|
let handle = await runtime.ensureSession({
|
|
20
22
|
sessionKey: command.sessionId,
|
|
@@ -22,6 +24,7 @@ export async function handleCreateSession(ws, config, command) {
|
|
|
22
24
|
mode: "persistent",
|
|
23
25
|
cwd,
|
|
24
26
|
permissionMode: metadata?.permissionMode,
|
|
27
|
+
model,
|
|
25
28
|
});
|
|
26
29
|
let providerName;
|
|
27
30
|
const requestedRuntimeName = metadata?.requestedRuntimeName;
|
|
@@ -39,6 +42,8 @@ export async function handleCreateSession(ws, config, command) {
|
|
|
39
42
|
agent: command.agent,
|
|
40
43
|
cwd,
|
|
41
44
|
name: providerName ?? command.name,
|
|
45
|
+
...(model ? { model } : {}),
|
|
46
|
+
...(tags.length > 0 ? { tags } : {}),
|
|
42
47
|
handle,
|
|
43
48
|
};
|
|
44
49
|
sessions.set(command.sessionId, state);
|
|
@@ -53,6 +58,7 @@ export async function handleCreateSession(ws, config, command) {
|
|
|
53
58
|
agent: command.agent,
|
|
54
59
|
cwd,
|
|
55
60
|
name: state.name,
|
|
61
|
+
model,
|
|
56
62
|
requestedRuntimeName: requestedRuntimeName ? true : undefined,
|
|
57
63
|
runtime: {
|
|
58
64
|
acpxRecordId: handle.acpxRecordId,
|
|
@@ -66,6 +72,7 @@ export async function handleCreateSession(ws, config, command) {
|
|
|
66
72
|
requestId: command.requestId,
|
|
67
73
|
sessionId: command.sessionId,
|
|
68
74
|
...(providerName ? { name: providerName } : {}),
|
|
75
|
+
...runtimeIdentityProjection(state),
|
|
69
76
|
encryptedMetadata: await encryptedSessionMetadata(config, command.sessionId, state, {
|
|
70
77
|
emptyRuntimeSession: true,
|
|
71
78
|
...(providerName ? { providerName, renamedAt: new Date().toISOString() } : {}),
|
|
@@ -78,6 +85,9 @@ export async function handleCreateSession(ws, config, command) {
|
|
|
78
85
|
await sendCommandResponse(ws, createSessionFailureResponse(command, error));
|
|
79
86
|
}
|
|
80
87
|
}
|
|
88
|
+
function modelFromCommand(value) {
|
|
89
|
+
return typeof value === "string" && value.trim() ? value.trim() : undefined;
|
|
90
|
+
}
|
|
81
91
|
export async function handleImportHistoricalSession(ws, config, command) {
|
|
82
92
|
if (command.type !== "machine:importHistoricalSession")
|
|
83
93
|
return;
|
|
@@ -92,6 +102,7 @@ export async function handleImportHistoricalSession(ws, config, command) {
|
|
|
92
102
|
resumeSessionId: command.runtimeSessionId,
|
|
93
103
|
cwd,
|
|
94
104
|
});
|
|
105
|
+
assertImportedRuntimeHandleMatches(command.runtimeSessionId, handle);
|
|
95
106
|
const state = {
|
|
96
107
|
sessionId: command.sessionId,
|
|
97
108
|
agent: command.agent,
|
|
@@ -136,6 +147,7 @@ export async function handleImportHistoricalSession(ws, config, command) {
|
|
|
136
147
|
type: "machine:sessionReady",
|
|
137
148
|
requestId: command.requestId,
|
|
138
149
|
sessionId: command.sessionId,
|
|
150
|
+
...runtimeIdentityProjection(backfilledState, command.runtimeSessionId),
|
|
139
151
|
encryptedMetadata: await encryptedSessionMetadata(config, command.sessionId, backfilledState, {
|
|
140
152
|
...importedMetadataBase,
|
|
141
153
|
...historicalBackfillMetadata(backfill),
|
|
@@ -246,12 +258,19 @@ function historicalSessionPage(value) {
|
|
|
246
258
|
return { sessions: value };
|
|
247
259
|
return value;
|
|
248
260
|
}
|
|
249
|
-
export async function resumeSession(ws, config, sessionId, requestId, fallback, announceSuccess = true) {
|
|
261
|
+
export async function resumeSession(ws, config, sessionId, requestId, fallback, announceSuccess = true, syncDirection = "auto") {
|
|
250
262
|
const existing = sessions.get(sessionId);
|
|
251
263
|
if (existing) {
|
|
252
|
-
const
|
|
264
|
+
const hydratedExisting = fallback?.tags && fallback.tags.length > 0
|
|
265
|
+
? { ...existing, tags: fallback.tags }
|
|
266
|
+
: existing;
|
|
267
|
+
if (hydratedExisting !== existing)
|
|
268
|
+
sessions.set(sessionId, hydratedExisting);
|
|
269
|
+
const refreshed = await refreshRuntimeSessionName(hydratedExisting);
|
|
253
270
|
const nameChanged = refreshed.name !== existing.name;
|
|
254
|
-
const backfill = await backfillHistoricalEvents(ws, config, refreshed, undefined, refreshed.historicalBackfill ?? fallback?.historicalBackfill
|
|
271
|
+
const backfill = await backfillHistoricalEvents(ws, config, refreshed, undefined, refreshed.historicalBackfill ?? fallback?.historicalBackfill, {
|
|
272
|
+
direction: syncDirection,
|
|
273
|
+
});
|
|
255
274
|
const resumed = withHistoricalBackfill(refreshed, backfill);
|
|
256
275
|
sessions.set(sessionId, resumed);
|
|
257
276
|
await appendAudit({
|
|
@@ -274,6 +293,7 @@ export async function resumeSession(ws, config, sessionId, requestId, fallback,
|
|
|
274
293
|
requestId,
|
|
275
294
|
sessionId,
|
|
276
295
|
...(nameChanged ? { name: resumed.name } : {}),
|
|
296
|
+
...runtimeIdentityProjection(resumed),
|
|
277
297
|
encryptedMetadata: await encryptedSessionMetadata(config, sessionId, resumed, {
|
|
278
298
|
resumedAt: new Date().toISOString(),
|
|
279
299
|
...historicalBackfillMetadata(backfill),
|
|
@@ -298,10 +318,19 @@ export async function resumeSession(ws, config, sessionId, requestId, fallback,
|
|
|
298
318
|
cwd,
|
|
299
319
|
restartableEmptySession: fallback?.emptyRuntimeSession === true,
|
|
300
320
|
});
|
|
301
|
-
const state = await refreshRuntimeSessionName({
|
|
321
|
+
const state = await refreshRuntimeSessionName({
|
|
322
|
+
sessionId,
|
|
323
|
+
agent,
|
|
324
|
+
cwd,
|
|
325
|
+
name,
|
|
326
|
+
...(fallback?.tags && fallback.tags.length > 0 ? { tags: fallback.tags } : {}),
|
|
327
|
+
handle,
|
|
328
|
+
});
|
|
302
329
|
sessions.set(sessionId, state);
|
|
303
330
|
const nameChanged = state.name !== name;
|
|
304
|
-
const backfill = await backfillHistoricalEvents(ws, config, state, resumeSessionId, fallback?.historicalBackfill
|
|
331
|
+
const backfill = await backfillHistoricalEvents(ws, config, state, resumeSessionId, fallback?.historicalBackfill, {
|
|
332
|
+
direction: syncDirection,
|
|
333
|
+
});
|
|
305
334
|
const resumed = withHistoricalBackfill(state, backfill);
|
|
306
335
|
sessions.set(sessionId, resumed);
|
|
307
336
|
await appendAudit({
|
|
@@ -324,6 +353,7 @@ export async function resumeSession(ws, config, sessionId, requestId, fallback,
|
|
|
324
353
|
requestId,
|
|
325
354
|
sessionId,
|
|
326
355
|
...(nameChanged ? { name: resumed.name } : {}),
|
|
356
|
+
...runtimeIdentityProjection(resumed, resumeSessionId),
|
|
327
357
|
encryptedMetadata: await encryptedSessionMetadata(config, sessionId, resumed, {
|
|
328
358
|
resumedAt: new Date().toISOString(),
|
|
329
359
|
...historicalBackfillMetadata(backfill),
|
|
@@ -421,6 +451,49 @@ function runtimeHandleFromFallback(sessionId, agent, cwd, fallback) {
|
|
|
421
451
|
externalHandle: runtime.externalHandle,
|
|
422
452
|
};
|
|
423
453
|
}
|
|
454
|
+
function assertImportedRuntimeHandleMatches(runtimeSessionId, handle) {
|
|
455
|
+
const ids = runtimeHandleSessionIds(handle);
|
|
456
|
+
if (ids.has(runtimeSessionId))
|
|
457
|
+
return;
|
|
458
|
+
const actual = [...ids].join(", ") || "none";
|
|
459
|
+
throw new Error(`Runtime import returned a different session handle: requested ${runtimeSessionId}, got ${actual}`);
|
|
460
|
+
}
|
|
461
|
+
function runtimeHandleSessionIds(handle) {
|
|
462
|
+
const ids = new Set();
|
|
463
|
+
addRuntimeHandleSessionId(ids, handle.acpxRecordId);
|
|
464
|
+
addRuntimeHandleSessionId(ids, handle.backendSessionId);
|
|
465
|
+
addRuntimeHandleSessionId(ids, handle.agentSessionId);
|
|
466
|
+
addRuntimeHandleSessionId(ids, handle.externalHandle?.sessionId);
|
|
467
|
+
return ids;
|
|
468
|
+
}
|
|
469
|
+
function addRuntimeHandleSessionId(ids, value) {
|
|
470
|
+
if (typeof value === "string" && value.trim().length > 0)
|
|
471
|
+
ids.add(value);
|
|
472
|
+
}
|
|
473
|
+
function runtimeIdentityProjection(session, explicitRuntimeSessionId) {
|
|
474
|
+
const ids = runtimeSessionIdsForState(session, explicitRuntimeSessionId);
|
|
475
|
+
return {
|
|
476
|
+
...(ids[0] ? { runtimeSessionId: ids[0] } : {}),
|
|
477
|
+
...(ids.length > 0 ? { runtimeSessionIds: ids } : {}),
|
|
478
|
+
};
|
|
479
|
+
}
|
|
480
|
+
function runtimeSessionIdsForState(session, explicitRuntimeSessionId) {
|
|
481
|
+
const ids = new Set();
|
|
482
|
+
addRuntimeSessionId(ids, explicitRuntimeSessionId);
|
|
483
|
+
addRuntimeSessionId(ids, session.handle.backendSessionId);
|
|
484
|
+
addRuntimeSessionId(ids, session.handle.agentSessionId);
|
|
485
|
+
addRuntimeSessionId(ids, session.handle.acpxRecordId);
|
|
486
|
+
addRuntimeSessionId(ids, session.handle.externalHandle?.sessionId);
|
|
487
|
+
return [...ids];
|
|
488
|
+
}
|
|
489
|
+
function addRuntimeSessionId(ids, value) {
|
|
490
|
+
if (typeof value !== "string")
|
|
491
|
+
return;
|
|
492
|
+
const id = value.trim();
|
|
493
|
+
if (!id || id.startsWith("event:"))
|
|
494
|
+
return;
|
|
495
|
+
ids.add(id);
|
|
496
|
+
}
|
|
424
497
|
export function usesAuthoritativeTranscript(session) {
|
|
425
498
|
const runtime = getRuntime(session.cwd);
|
|
426
499
|
const listAgents = "listAgents" in runtime && typeof runtime.listAgents === "function" ? runtime.listAgents : undefined;
|
|
@@ -441,8 +514,10 @@ export async function replaceAuthoritativeTranscript(ws, config, session, runtim
|
|
|
441
514
|
}
|
|
442
515
|
const result = authoritativeBackfillResult(page);
|
|
443
516
|
await emitTranscriptReplacement(ws, config, session.sessionId, page.events, {
|
|
517
|
+
requestId: input.requestId,
|
|
444
518
|
currentHead: input.currentHead ?? page.currentHead,
|
|
445
519
|
lastTurnId: input.lastTurnId ?? page.lastTurnId,
|
|
520
|
+
replacementKind: input.replacementKind,
|
|
446
521
|
status: input.status,
|
|
447
522
|
hasMoreBefore: page.hasMoreBefore,
|
|
448
523
|
nextBefore: page.nextBefore,
|
|
@@ -527,7 +602,7 @@ async function backfillHistoricalEvents(ws, config, session, runtimeSessionId =
|
|
|
527
602
|
if (!runtimeSessionId)
|
|
528
603
|
return completedBackfillResult(0);
|
|
529
604
|
if (usesAuthoritativeTranscript(session)) {
|
|
530
|
-
if (previousBackfill?.status === "partial" && previousBackfill.providerCursor) {
|
|
605
|
+
if ((options.direction ?? "auto") === "older" && previousBackfill?.status === "partial" && previousBackfill.providerCursor) {
|
|
531
606
|
return await prependAuthoritativeTranscript(ws, config, session, runtimeSessionId, previousBackfill, { strict: options.strict });
|
|
532
607
|
}
|
|
533
608
|
return await replaceAuthoritativeTranscript(ws, config, session, runtimeSessionId, { strict: options.strict });
|
|
@@ -549,26 +624,58 @@ async function backfillHistoricalEvents(ws, config, session, runtimeSessionId =
|
|
|
549
624
|
throw error;
|
|
550
625
|
historicalEvents = [];
|
|
551
626
|
}
|
|
552
|
-
const
|
|
627
|
+
const direction = options.direction ?? "auto";
|
|
628
|
+
const plan = planAppendOnlyHistoricalBackfill(historicalEvents, previousBackfill, direction);
|
|
629
|
+
const tailWindow = plan.tailWindow;
|
|
553
630
|
if (tailWindow.events.length > 0) {
|
|
554
631
|
await emitRuntimeTailEvents(ws, config, session.sessionId, tailWindow.events, tailWindow.startIndex);
|
|
555
632
|
}
|
|
556
|
-
const
|
|
557
|
-
const olderWindow = historicalEventsWindowByTurn(historicalEvents, cursor, historicalBackfillEventLimit);
|
|
633
|
+
const olderWindow = plan.olderWindow;
|
|
558
634
|
if (olderWindow.events.length > 0) {
|
|
559
635
|
await emitHistoricalEvents(ws, config, session.sessionId, olderWindow.events, olderWindow.startIndex);
|
|
560
636
|
}
|
|
561
|
-
const
|
|
562
|
-
|
|
637
|
+
const computedHead = direction === "older" && previousBackfill
|
|
638
|
+
? previousBackfill.head
|
|
639
|
+
: latestCompletedHistoricalHead(session.sessionId, historicalEvents, {
|
|
640
|
+
...(previousBackfill?.totalEvents !== undefined && previousBackfill.head === undefined
|
|
641
|
+
? { preferTailBasisForExistingEvents: true }
|
|
642
|
+
: {}),
|
|
643
|
+
...(previousBackfill?.totalEvents !== undefined ? { previousTotalEvents: previousBackfill.totalEvents } : {}),
|
|
644
|
+
...(tailWindow.events.length > 0 ? { tailStartIndex: tailWindow.startIndex } : {}),
|
|
645
|
+
});
|
|
646
|
+
const head = direction === "older" && previousBackfill
|
|
647
|
+
? previousBackfill.head
|
|
648
|
+
: preferPersistedHistoricalHeadBasis(computedHead, previousBackfill?.head);
|
|
649
|
+
const result = {
|
|
563
650
|
emittedEvents: tailWindow.events.length + olderWindow.events.length,
|
|
564
651
|
availableEvents: historicalEvents.length,
|
|
565
|
-
cursor:
|
|
652
|
+
cursor: plan.cursor,
|
|
566
653
|
olderBackfilledEvents: olderWindow.events.length,
|
|
567
|
-
status,
|
|
654
|
+
status: plan.status,
|
|
568
655
|
tailRepairedEvents: tailWindow.events.length,
|
|
569
656
|
totalEvents: historicalEvents.length,
|
|
570
|
-
truncated:
|
|
657
|
+
truncated: plan.truncated,
|
|
658
|
+
...(head ? { head } : {}),
|
|
571
659
|
};
|
|
660
|
+
if (head) {
|
|
661
|
+
const backfilledSession = withHistoricalBackfill(session, result);
|
|
662
|
+
await emitSessionHeadAdvanced(ws, session.sessionId, head, await encryptedSessionMetadata(config, session.sessionId, backfilledSession, {
|
|
663
|
+
...historicalBackfillMetadata(result),
|
|
664
|
+
historicalBackfilledAt: new Date().toISOString(),
|
|
665
|
+
}), "completed");
|
|
666
|
+
}
|
|
667
|
+
return result;
|
|
668
|
+
}
|
|
669
|
+
function preferPersistedHistoricalHeadBasis(computed, persisted) {
|
|
670
|
+
if (!computed || !persisted)
|
|
671
|
+
return computed;
|
|
672
|
+
if (computed.currentHead === persisted.currentHead &&
|
|
673
|
+
computed.lastTurnId === persisted.lastTurnId &&
|
|
674
|
+
computed.basis.turnId === persisted.basis.turnId &&
|
|
675
|
+
computed.basis.turnSeq === persisted.basis.turnSeq) {
|
|
676
|
+
return persisted;
|
|
677
|
+
}
|
|
678
|
+
return computed;
|
|
572
679
|
}
|
|
573
680
|
function completedBackfillResult(totalEvents) {
|
|
574
681
|
return {
|
|
@@ -589,6 +696,23 @@ function normalizedBackfillCursor(previousBackfill, totalEvents) {
|
|
|
589
696
|
return 0;
|
|
590
697
|
return Math.max(0, Math.min(previousBackfill.cursor, totalEvents));
|
|
591
698
|
}
|
|
699
|
+
export function planAppendOnlyHistoricalBackfill(historicalEvents, previousBackfill, direction = "auto", maxEvents = historicalBackfillEventLimit) {
|
|
700
|
+
const tailWindow = direction === "latest" || direction === "auto"
|
|
701
|
+
? historicalTailWindowByTurn(historicalEvents, previousBackfill?.totalEvents)
|
|
702
|
+
: { events: [], startIndex: historicalEvents.length };
|
|
703
|
+
const cursor = normalizedBackfillCursor(previousBackfill, historicalEvents.length);
|
|
704
|
+
const olderWindow = direction === "older" || direction === "auto" || previousBackfill === undefined
|
|
705
|
+
? historicalEventsWindowByTurn(historicalEvents, cursor, maxEvents)
|
|
706
|
+
: { events: [], nextCursor: cursor, startIndex: cursor };
|
|
707
|
+
const status = olderWindow.nextCursor > 0 ? "partial" : "completed";
|
|
708
|
+
return {
|
|
709
|
+
cursor: olderWindow.nextCursor,
|
|
710
|
+
olderWindow,
|
|
711
|
+
status,
|
|
712
|
+
tailWindow,
|
|
713
|
+
truncated: status === "partial",
|
|
714
|
+
};
|
|
715
|
+
}
|
|
592
716
|
function historicalTailWindowByTurn(events, previousTotalEvents) {
|
|
593
717
|
if (previousTotalEvents === undefined || events.length <= previousTotalEvents) {
|
|
594
718
|
return { events: [], startIndex: events.length };
|
|
@@ -645,6 +769,7 @@ function withHistoricalBackfill(session, backfill) {
|
|
|
645
769
|
...session,
|
|
646
770
|
historicalBackfill: {
|
|
647
771
|
cursor: backfill.cursor,
|
|
772
|
+
...(backfill.head ? { head: backfill.head } : {}),
|
|
648
773
|
providerCursor: backfill.providerCursor,
|
|
649
774
|
status: backfill.status,
|
|
650
775
|
totalEvents: backfill.totalEvents,
|
|
@@ -661,6 +786,8 @@ function historicalBackfillMetadata(backfill) {
|
|
|
661
786
|
backfilledEvents: backfill.emittedEvents,
|
|
662
787
|
historicalOlderBackfilledEvents: backfill.olderBackfilledEvents,
|
|
663
788
|
historicalTailRepairedEvents: backfill.tailRepairedEvents,
|
|
789
|
+
historicalHead: backfill.head,
|
|
790
|
+
runtimeCurrentEventCount: backfill.totalEvents,
|
|
664
791
|
availableHistoricalEvents: backfill.availableEvents,
|
|
665
792
|
truncatedHistoricalBackfill: backfill.truncated,
|
|
666
793
|
};
|
|
@@ -670,7 +797,7 @@ export async function handleResume(ws, config, command) {
|
|
|
670
797
|
return;
|
|
671
798
|
if (!claimCommandRequest(ws, command.requestId))
|
|
672
799
|
return;
|
|
673
|
-
await resumeSession(ws, config, command.sessionId, command.requestId, await sessionFallbackFromCommand(config, command));
|
|
800
|
+
await resumeSession(ws, config, command.sessionId, command.requestId, await sessionFallbackFromCommand(config, command), true, command.syncDirection ?? "auto");
|
|
674
801
|
}
|
|
675
802
|
export async function handleClose(ws, config, command) {
|
|
676
803
|
if (command.type !== "machine:close")
|
|
@@ -679,11 +806,22 @@ export async function handleClose(ws, config, command) {
|
|
|
679
806
|
return;
|
|
680
807
|
const session = sessions.get(command.sessionId);
|
|
681
808
|
const fallback = session ? undefined : await sessionFallbackFromCommand(config, command);
|
|
809
|
+
const fallbackHandle = fallback ? runtimeHandleFromFallback(command.sessionId, fallback.agent, fallback.cwd, fallback) : undefined;
|
|
810
|
+
const sessionForClose = session ?? (fallback && fallbackHandle
|
|
811
|
+
? {
|
|
812
|
+
sessionId: command.sessionId,
|
|
813
|
+
agent: fallback.agent,
|
|
814
|
+
cwd: fallback.cwd,
|
|
815
|
+
name: fallback.name,
|
|
816
|
+
handle: fallbackHandle,
|
|
817
|
+
historicalBackfill: fallback.historicalBackfill,
|
|
818
|
+
}
|
|
819
|
+
: undefined);
|
|
682
820
|
let runtimeCloseError;
|
|
683
|
-
if (
|
|
821
|
+
if (sessionForClose) {
|
|
684
822
|
try {
|
|
685
|
-
await getRuntime(
|
|
686
|
-
handle:
|
|
823
|
+
await getRuntime(sessionForClose.cwd).close({
|
|
824
|
+
handle: sessionForClose.handle,
|
|
687
825
|
reason: command.reason ?? "closed by controller",
|
|
688
826
|
});
|
|
689
827
|
}
|
|
@@ -702,8 +840,9 @@ export async function handleClose(ws, config, command) {
|
|
|
702
840
|
requestId: command.requestId,
|
|
703
841
|
reason: command.reason,
|
|
704
842
|
loaded: Boolean(session),
|
|
705
|
-
|
|
706
|
-
|
|
843
|
+
...(!session && fallbackHandle ? { runtimeHandleFallback: true } : {}),
|
|
844
|
+
agent: sessionForClose?.agent ?? fallback?.agent,
|
|
845
|
+
cwd: sessionForClose?.cwd ?? fallback?.cwd,
|
|
707
846
|
runtimeCloseError,
|
|
708
847
|
},
|
|
709
848
|
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { type EncryptedEnvelope, type MachineCommand } from "
|
|
1
|
+
import { type EncryptedEnvelope, type MachineCommand } from "../../../../packages/shared/dist/index.js";
|
|
2
2
|
import type { DaemonConfig, SessionFallback, SessionMetadata, SessionState } from "../types.js";
|
|
3
|
-
export declare function encryptedSessionMetadata(config: DaemonConfig, sessionId: string, state: Pick<SessionState, "agent" | "cwd" | "name" | "handle">, extra: Record<string, unknown>): Promise<EncryptedEnvelope>;
|
|
3
|
+
export declare function encryptedSessionMetadata(config: DaemonConfig, sessionId: string, state: Pick<SessionState, "agent" | "cwd" | "name" | "handle" | "model" | "tags">, extra: Record<string, unknown>): Promise<EncryptedEnvelope>;
|
|
4
4
|
export declare function commandSessionMetadata(config: DaemonConfig, encryptedMetadata?: EncryptedEnvelope): Promise<SessionMetadata | undefined>;
|
|
5
5
|
export declare function sessionFallbackFromCommand(config: DaemonConfig, command: Extract<MachineCommand, {
|
|
6
6
|
type: "machine:prompt" | "machine:resume" | "machine:rewind" | "machine:fork" | "machine:renameSession" | "machine:close";
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import { decryptJson, encryptJson } from "../../../../packages/shared/dist/index.js";
|
|
1
|
+
import { decryptJson, encryptJson, normalizeSessionTags, sessionTagKeys } from "../../../../packages/shared/dist/index.js";
|
|
2
2
|
export function encryptedSessionMetadata(config, sessionId, state, extra) {
|
|
3
3
|
return encryptJson(config.accountSecret, `session:${sessionId}:metadata`, {
|
|
4
4
|
agent: state.agent,
|
|
5
5
|
cwd: state.cwd,
|
|
6
6
|
name: state.name,
|
|
7
|
+
...(state.model ? { model: state.model } : {}),
|
|
8
|
+
...(state.tags && state.tags.length > 0 ? { tags: state.tags, tagKeys: sessionTagKeys(state.tags) } : {}),
|
|
7
9
|
runtime: {
|
|
8
10
|
backend: state.handle.backend,
|
|
9
11
|
runtimeSessionName: state.handle.runtimeSessionName,
|
|
@@ -32,10 +34,13 @@ export async function sessionFallbackFromCommand(config, command) {
|
|
|
32
34
|
return undefined;
|
|
33
35
|
try {
|
|
34
36
|
const metadata = await decryptJson(config.accountSecret, encryptedMetadata);
|
|
37
|
+
const tags = safeSessionTags(metadata.tags);
|
|
35
38
|
return {
|
|
36
39
|
agent: metadata.agent ?? "codex",
|
|
37
40
|
cwd: metadata.cwd || process.cwd(),
|
|
38
41
|
name: metadata.name ?? command.sessionId,
|
|
42
|
+
...(typeof metadata.model === "string" && metadata.model.trim() ? { model: metadata.model.trim() } : {}),
|
|
43
|
+
...(tags.length > 0 ? { tags } : {}),
|
|
39
44
|
emptyRuntimeSession: metadata.emptyRuntimeSession === true,
|
|
40
45
|
historicalBackfill: historicalBackfillStateFromMetadata(metadata),
|
|
41
46
|
runtime: metadata.runtime,
|
|
@@ -45,6 +50,14 @@ export async function sessionFallbackFromCommand(config, command) {
|
|
|
45
50
|
return undefined;
|
|
46
51
|
}
|
|
47
52
|
}
|
|
53
|
+
function safeSessionTags(value) {
|
|
54
|
+
try {
|
|
55
|
+
return normalizeSessionTags(Array.isArray(value) ? value : undefined);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return [];
|
|
59
|
+
}
|
|
60
|
+
}
|
|
48
61
|
function historicalBackfillStateFromMetadata(metadata) {
|
|
49
62
|
const status = historicalBackfillStatus(metadata.historicalBackfillStatus ?? metadata.historicalBackfill);
|
|
50
63
|
const totalEvents = nonNegativeInteger(metadata.historicalBackfillTotalEvents ?? metadata.availableHistoricalEvents);
|
|
@@ -52,6 +65,7 @@ function historicalBackfillStateFromMetadata(metadata) {
|
|
|
52
65
|
if (status && totalEvents !== undefined && cursor !== undefined) {
|
|
53
66
|
return {
|
|
54
67
|
cursor: Math.min(cursor, totalEvents),
|
|
68
|
+
...(historicalHeadStateFromMetadata(metadata) ? { head: historicalHeadStateFromMetadata(metadata) } : {}),
|
|
55
69
|
...(typeof metadata.historicalBackfillProviderCursor === "string" ? { providerCursor: metadata.historicalBackfillProviderCursor } : {}),
|
|
56
70
|
status,
|
|
57
71
|
totalEvents,
|
|
@@ -60,6 +74,7 @@ function historicalBackfillStateFromMetadata(metadata) {
|
|
|
60
74
|
if (status === "completed") {
|
|
61
75
|
return {
|
|
62
76
|
cursor: 0,
|
|
77
|
+
...(historicalHeadStateFromMetadata(metadata) ? { head: historicalHeadStateFromMetadata(metadata) } : {}),
|
|
63
78
|
...(typeof metadata.historicalBackfillProviderCursor === "string" ? { providerCursor: metadata.historicalBackfillProviderCursor } : {}),
|
|
64
79
|
status: "completed",
|
|
65
80
|
totalEvents: totalEvents ?? 0,
|
|
@@ -70,6 +85,7 @@ function historicalBackfillStateFromMetadata(metadata) {
|
|
|
70
85
|
if (totalEvents !== undefined && backfilledEvents !== undefined) {
|
|
71
86
|
return {
|
|
72
87
|
cursor: Math.max(0, totalEvents - backfilledEvents),
|
|
88
|
+
...(historicalHeadStateFromMetadata(metadata) ? { head: historicalHeadStateFromMetadata(metadata) } : {}),
|
|
73
89
|
...(typeof metadata.historicalBackfillProviderCursor === "string" ? { providerCursor: metadata.historicalBackfillProviderCursor } : {}),
|
|
74
90
|
status: "partial",
|
|
75
91
|
totalEvents,
|
|
@@ -78,6 +94,31 @@ function historicalBackfillStateFromMetadata(metadata) {
|
|
|
78
94
|
}
|
|
79
95
|
return undefined;
|
|
80
96
|
}
|
|
97
|
+
function historicalHeadStateFromMetadata(metadata) {
|
|
98
|
+
const head = metadata.historicalHead;
|
|
99
|
+
if (!head || typeof head !== "object")
|
|
100
|
+
return undefined;
|
|
101
|
+
const basis = head.basis;
|
|
102
|
+
if (typeof head.currentHead !== "string" ||
|
|
103
|
+
typeof head.lastTurnId !== "string" ||
|
|
104
|
+
!basis ||
|
|
105
|
+
typeof basis !== "object" ||
|
|
106
|
+
typeof basis.turnId !== "string" ||
|
|
107
|
+
typeof basis.eventMessageId !== "string" ||
|
|
108
|
+
!Number.isInteger(basis.turnSeq)) {
|
|
109
|
+
return undefined;
|
|
110
|
+
}
|
|
111
|
+
return {
|
|
112
|
+
currentHead: head.currentHead,
|
|
113
|
+
lastTurnId: head.lastTurnId,
|
|
114
|
+
basis: {
|
|
115
|
+
turnId: basis.turnId,
|
|
116
|
+
eventMessageId: basis.eventMessageId,
|
|
117
|
+
turnSeq: basis.turnSeq,
|
|
118
|
+
...(typeof basis.occurredAt === "number" ? { occurredAt: basis.occurredAt } : {}),
|
|
119
|
+
},
|
|
120
|
+
};
|
|
121
|
+
}
|
|
81
122
|
function historicalBackfillStatus(value) {
|
|
82
123
|
return value === "partial" || value === "completed" ? value : undefined;
|
|
83
124
|
}
|
|
@@ -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 handleRewind(ws: WebSocket, config: DaemonConfig, command: MachineCommand): Promise<void>;
|
|
4
4
|
export declare function handleFork(ws: WebSocket, config: DaemonConfig, command: MachineCommand): Promise<void>;
|
|
@@ -54,9 +54,10 @@ export async function handleRewind(ws, config, command) {
|
|
|
54
54
|
return;
|
|
55
55
|
if (!claimCommandRequest(ws, command.requestId))
|
|
56
56
|
return;
|
|
57
|
-
|
|
57
|
+
let session = sessions.get(command.sessionId) ?? (await resumeSession(ws, config, command.sessionId, command.requestId, await sessionFallbackFromCommand(config, command), false));
|
|
58
58
|
if (!session)
|
|
59
59
|
return;
|
|
60
|
+
session = await hydrateSessionTagsFromCommand(config, command, session);
|
|
60
61
|
const runtimeWithPrimitives = getRuntime(session.cwd);
|
|
61
62
|
if (typeof runtimeWithPrimitives.rewindSession !== "function") {
|
|
62
63
|
await emitCapabilityUnavailable(ws, config, command, "session.rewind", true);
|
|
@@ -113,7 +114,11 @@ export async function handleRewind(ws, config, command) {
|
|
|
113
114
|
});
|
|
114
115
|
if (usesAuthoritativeTranscript(nextSession)) {
|
|
115
116
|
try {
|
|
116
|
-
const backfill = await replaceAuthoritativeTranscript(ws, config, nextSession, undefined,
|
|
117
|
+
const backfill = await replaceAuthoritativeTranscript(ws, config, nextSession, undefined, {
|
|
118
|
+
...head,
|
|
119
|
+
replacementKind: "command",
|
|
120
|
+
requestId: command.requestId,
|
|
121
|
+
});
|
|
117
122
|
sessions.set(command.sessionId, {
|
|
118
123
|
...nextSession,
|
|
119
124
|
historicalBackfill: {
|
|
@@ -218,14 +223,16 @@ export async function handleFork(ws, config, command) {
|
|
|
218
223
|
});
|
|
219
224
|
return;
|
|
220
225
|
}
|
|
226
|
+
const sourceMetadata = await commandSessionMetadata(config, command.sourceEncryptedMetadata);
|
|
227
|
+
const targetMetadata = await commandSessionMetadata(config, command.encryptedMetadata);
|
|
221
228
|
const forkState = {
|
|
222
229
|
sessionId: command.targetSessionId,
|
|
223
230
|
agent: source.agent,
|
|
224
231
|
cwd: source.cwd,
|
|
225
232
|
name: command.name,
|
|
233
|
+
...(targetMetadata?.tags && targetMetadata.tags.length > 0 ? { tags: targetMetadata.tags } : {}),
|
|
226
234
|
handle: forkHandle,
|
|
227
235
|
};
|
|
228
|
-
const sourceMetadata = await commandSessionMetadata(config, command.sourceEncryptedMetadata);
|
|
229
236
|
sessions.set(command.targetSessionId, forkState);
|
|
230
237
|
await appendAudit({
|
|
231
238
|
sessionId: command.sessionId,
|
|
@@ -241,6 +248,7 @@ export async function handleFork(ws, config, command) {
|
|
|
241
248
|
...primitiveRuntimeEvidence(source.handle, forkState.handle),
|
|
242
249
|
},
|
|
243
250
|
});
|
|
251
|
+
const authoritativeForkTranscript = usesAuthoritativeTranscript(forkState);
|
|
244
252
|
await sendCommandResponse(ws, {
|
|
245
253
|
type: "machine:sessionForked",
|
|
246
254
|
requestId: command.requestId,
|
|
@@ -248,6 +256,7 @@ export async function handleFork(ws, config, command) {
|
|
|
248
256
|
sourceCheckpointId,
|
|
249
257
|
sessionId: command.targetSessionId,
|
|
250
258
|
name: command.name,
|
|
259
|
+
...(authoritativeForkTranscript ? { transcriptPending: true } : {}),
|
|
251
260
|
encryptedMetadata: await encryptedSessionMetadata(config, command.targetSessionId, forkState, {
|
|
252
261
|
forkedAt: new Date().toISOString(),
|
|
253
262
|
importedFromRuntimeSessionId: sourceMetadata?.importedFromRuntimeSessionId,
|
|
@@ -256,10 +265,15 @@ export async function handleFork(ws, config, command) {
|
|
|
256
265
|
sourceCheckpointId,
|
|
257
266
|
}),
|
|
258
267
|
});
|
|
259
|
-
if (
|
|
268
|
+
if (authoritativeForkTranscript) {
|
|
260
269
|
try {
|
|
261
270
|
const targetHead = primitiveResultHead(result);
|
|
262
|
-
const backfill = await replaceAuthoritativeTranscript(ws, config, forkState, undefined,
|
|
271
|
+
const backfill = await replaceAuthoritativeTranscript(ws, config, forkState, undefined, {
|
|
272
|
+
...targetHead,
|
|
273
|
+
replacementKind: "command",
|
|
274
|
+
requestId: command.requestId,
|
|
275
|
+
status: "completed",
|
|
276
|
+
});
|
|
263
277
|
sessions.set(command.targetSessionId, {
|
|
264
278
|
...forkState,
|
|
265
279
|
historicalBackfill: {
|
|
@@ -279,6 +293,14 @@ export async function handleFork(ws, config, command) {
|
|
|
279
293
|
summary: `Failed to refresh fork target transcript ${command.targetSessionId}`,
|
|
280
294
|
evidence: { requestId: command.requestId, sourceSessionId: command.sessionId, error: error instanceof Error ? error.message : String(error) },
|
|
281
295
|
});
|
|
296
|
+
await sendCommandResponse(ws, {
|
|
297
|
+
type: "machine:error",
|
|
298
|
+
requestId: command.requestId,
|
|
299
|
+
sessionId: command.targetSessionId,
|
|
300
|
+
code: "SESSION_TRANSCRIPT_REPLACE_FAILED",
|
|
301
|
+
capability: "session.history",
|
|
302
|
+
message: error instanceof Error ? error.message : String(error),
|
|
303
|
+
});
|
|
282
304
|
}
|
|
283
305
|
}
|
|
284
306
|
}
|
|
@@ -304,9 +326,10 @@ export async function handleRename(ws, config, command) {
|
|
|
304
326
|
});
|
|
305
327
|
return;
|
|
306
328
|
}
|
|
307
|
-
|
|
329
|
+
let session = sessions.get(command.sessionId) ?? (await resumeSession(ws, config, command.sessionId, command.requestId, await sessionFallbackFromCommand(config, command), false));
|
|
308
330
|
if (!session)
|
|
309
331
|
return;
|
|
332
|
+
session = await hydrateSessionTagsFromCommand(config, command, session);
|
|
310
333
|
const runtimeWithPrimitives = getRuntime(session.cwd);
|
|
311
334
|
if (typeof runtimeWithPrimitives.renameSession !== "function") {
|
|
312
335
|
await emitCapabilityUnavailable(ws, config, command, "session.rename", true);
|
|
@@ -370,6 +393,14 @@ function capabilityUnavailableEvidence(command) {
|
|
|
370
393
|
return { requestId: command.requestId, nameLength: command.name.length };
|
|
371
394
|
return { requestId: command.requestId, from: command.from, targetSessionId: command.targetSessionId, name: command.name };
|
|
372
395
|
}
|
|
396
|
+
async function hydrateSessionTagsFromCommand(config, command, session) {
|
|
397
|
+
const metadata = await commandSessionMetadata(config, command.encryptedMetadata);
|
|
398
|
+
if (!metadata?.tags || metadata.tags.length === 0)
|
|
399
|
+
return session;
|
|
400
|
+
const next = { ...session, tags: metadata.tags };
|
|
401
|
+
sessions.set(session.sessionId, next);
|
|
402
|
+
return next;
|
|
403
|
+
}
|
|
373
404
|
function primitiveRuntimeEvidence(previous, next) {
|
|
374
405
|
return {
|
|
375
406
|
runtime: {
|
|
@@ -1,4 +1,31 @@
|
|
|
1
|
-
import { type MachineCommand } from "
|
|
1
|
+
import { type MachineCommand } from "../../../../packages/shared/dist/index.js";
|
|
2
2
|
import type { DaemonConfig } from "../types.js";
|
|
3
|
+
type PromptCommand = Extract<MachineCommand, {
|
|
4
|
+
type: "machine:prompt";
|
|
5
|
+
}>;
|
|
6
|
+
type PromptExecutionPhase = "decrypt-prompt" | "prepare-attachments" | "decrypt-memory-options" | "prepare-memory-context" | "emit-submitted" | "emit-memory-status" | "start-turn" | "attach-turn" | "audit-turn-start" | "stream-turn" | "await-turn-result" | "write-memory" | "refresh-runtime-metadata" | "emit-terminal" | "refresh-authoritative-transcript" | "send-turn-done" | "terminal-hooks";
|
|
3
7
|
export declare function handlePrompt(ws: WebSocket, config: DaemonConfig, command: MachineCommand): Promise<void>;
|
|
8
|
+
export declare function handleOptionResponse(ws: WebSocket, config: DaemonConfig, command: MachineCommand): Promise<void>;
|
|
9
|
+
export declare function promptFailureResponse(command: PromptCommand, phase: PromptExecutionPhase, error: unknown): {
|
|
10
|
+
type: "machine:error";
|
|
11
|
+
requestId: string;
|
|
12
|
+
sessionId: string;
|
|
13
|
+
code: string;
|
|
14
|
+
message: string;
|
|
15
|
+
};
|
|
16
|
+
export declare function promptFailureAuditEvent(config: Pick<DaemonConfig, "machineId">, command: PromptCommand, phase: PromptExecutionPhase, error: unknown): {
|
|
17
|
+
sessionId: string;
|
|
18
|
+
machineId: string;
|
|
19
|
+
actor: "system";
|
|
20
|
+
action: string;
|
|
21
|
+
summary: string;
|
|
22
|
+
evidence: {
|
|
23
|
+
requestId: string;
|
|
24
|
+
turnId: string;
|
|
25
|
+
code: string;
|
|
26
|
+
phase: PromptExecutionPhase;
|
|
27
|
+
message: string;
|
|
28
|
+
};
|
|
29
|
+
};
|
|
4
30
|
export declare function handleCancel(ws: WebSocket, config: DaemonConfig, command: MachineCommand): Promise<void>;
|
|
31
|
+
export {};
|