@evalops/maestro 0.10.23 → 0.10.25
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/README.md +4 -4
- package/dist/agent/agent.d.ts +2 -2
- package/dist/agent/agent.d.ts.map +1 -1
- package/dist/agent/agent.js +1 -1
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/keys.d.ts +2 -5
- package/dist/agent/keys.d.ts.map +1 -1
- package/dist/agent/keys.js +4 -5
- package/dist/agent/keys.js.map +1 -1
- package/dist/agent/modes.d.ts +2 -2
- package/dist/agent/modes.d.ts.map +1 -1
- package/dist/agent/modes.js +6 -7
- package/dist/agent/modes.js.map +1 -1
- package/dist/agent/providers/anthropic.d.ts.map +1 -1
- package/dist/agent/providers/anthropic.js +4 -4
- package/dist/agent/providers/anthropic.js.map +1 -1
- package/dist/agent/providers/google.js +1 -1
- package/dist/agent/swarm/executor.d.ts +2 -0
- package/dist/agent/swarm/executor.d.ts.map +1 -1
- package/dist/agent/swarm/executor.js +208 -35
- package/dist/agent/swarm/executor.js.map +1 -1
- package/dist/agent/swarm/types.d.ts +2 -0
- package/dist/agent/swarm/types.d.ts.map +1 -1
- package/dist/agent/swarm/types.js.map +1 -1
- package/dist/agent/tool-capability-types.d.ts +36 -0
- package/dist/agent/tool-capability-types.d.ts.map +1 -0
- package/dist/agent/tool-capability-types.js +2 -0
- package/dist/agent/tool-capability-types.js.map +1 -0
- package/dist/agent/transport/tool-execution-bridge.d.ts +13 -0
- package/dist/agent/transport/tool-execution-bridge.d.ts.map +1 -1
- package/dist/agent/transport/tool-execution-bridge.js +28 -15
- package/dist/agent/transport/tool-execution-bridge.js.map +1 -1
- package/dist/agent/transport/transport-utils.d.ts.map +1 -1
- package/dist/agent/transport/transport-utils.js +2 -3
- package/dist/agent/transport/transport-utils.js.map +1 -1
- package/dist/agent/transport.js +1 -1
- package/dist/agent/transport.js.map +1 -1
- package/dist/agent/type-guards.d.ts +1 -1
- package/dist/agent/type-guards.js +1 -1
- package/dist/agent/type-guards.js.map +1 -1
- package/dist/agent/types.d.ts +5 -3
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js +2 -2
- package/dist/agent/types.js.map +1 -1
- package/dist/app-server/daemon-lifecycle-api.d.ts +31 -0
- package/dist/app-server/daemon-lifecycle-api.d.ts.map +1 -0
- package/dist/app-server/daemon-lifecycle-api.js +259 -0
- package/dist/app-server/daemon-lifecycle-api.js.map +1 -0
- package/dist/app-server/external-agent-import-api.d.ts +30 -0
- package/dist/app-server/external-agent-import-api.d.ts.map +1 -0
- package/dist/app-server/external-agent-import-api.js +553 -0
- package/dist/app-server/external-agent-import-api.js.map +1 -0
- package/dist/app-server/host-control-api.d.ts +30 -0
- package/dist/app-server/host-control-api.d.ts.map +1 -0
- package/dist/app-server/host-control-api.js +343 -0
- package/dist/app-server/host-control-api.js.map +1 -0
- package/dist/app-server/in-process-client.d.ts +2 -2
- package/dist/app-server/in-process-client.d.ts.map +1 -1
- package/dist/app-server/in-process-client.js.map +1 -1
- package/dist/app-server/network-governance-api.d.ts +26 -0
- package/dist/app-server/network-governance-api.d.ts.map +1 -0
- package/dist/app-server/network-governance-api.js +476 -0
- package/dist/app-server/network-governance-api.js.map +1 -0
- package/dist/app-server/plugin-bundle-api.d.ts +17 -0
- package/dist/app-server/plugin-bundle-api.d.ts.map +1 -0
- package/dist/app-server/plugin-bundle-api.js +219 -0
- package/dist/app-server/plugin-bundle-api.js.map +1 -0
- package/dist/app-server/policy-control-api.d.ts +14 -0
- package/dist/app-server/policy-control-api.d.ts.map +1 -0
- package/dist/app-server/policy-control-api.js +200 -0
- package/dist/app-server/policy-control-api.js.map +1 -0
- package/dist/app-server/protocol-modes-api.d.ts +22 -0
- package/dist/app-server/protocol-modes-api.d.ts.map +1 -0
- package/dist/app-server/protocol-modes-api.js +124 -0
- package/dist/app-server/protocol-modes-api.js.map +1 -0
- package/dist/app-server/sandbox-proof-api.d.ts +21 -0
- package/dist/app-server/sandbox-proof-api.d.ts.map +1 -0
- package/dist/app-server/sandbox-proof-api.js +127 -0
- package/dist/app-server/sandbox-proof-api.js.map +1 -0
- package/dist/app-server/session-api.d.ts +93 -3
- package/dist/app-server/session-api.d.ts.map +1 -1
- package/dist/app-server/session-api.js +706 -18
- package/dist/app-server/session-api.js.map +1 -1
- package/dist/audit/logger.d.ts +1 -1
- package/dist/bootstrap/auth-setup.d.ts.map +1 -1
- package/dist/bootstrap/auth-setup.js +17 -2
- package/dist/bootstrap/auth-setup.js.map +1 -1
- package/dist/bootstrap/model-resolution-setup.d.ts.map +1 -1
- package/dist/bootstrap/model-resolution-setup.js +19 -4
- package/dist/bootstrap/model-resolution-setup.js.map +1 -1
- package/dist/cli/args.d.ts +2 -2
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +2 -2
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/commands/a2a.d.ts.map +1 -1
- package/dist/cli/commands/a2a.js +226 -14
- package/dist/cli/commands/a2a.js.map +1 -1
- package/dist/cli/commands/anthropic.d.ts +1 -1
- package/dist/cli/commands/anthropic.d.ts.map +1 -1
- package/dist/cli/commands/anthropic.js +3 -68
- package/dist/cli/commands/anthropic.js.map +1 -1
- package/dist/cli/commands/modes.js +1 -1
- package/dist/cli/commands/modes.js.map +1 -1
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +5 -7
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/rpc-mode.d.ts +1 -1
- package/dist/cli/rpc-mode.js +1 -1
- package/dist/cli/rpc-mode.js.map +1 -1
- package/dist/cli/session.js +1 -1
- package/dist/cli/session.js.map +1 -1
- package/dist/cli-tui/commands/command-catalog.d.ts.map +1 -1
- package/dist/cli-tui/commands/command-catalog.js +7 -12
- package/dist/cli-tui/commands/command-catalog.js.map +1 -1
- package/dist/cli-tui/commands/subcommands/auth-commands.d.ts +1 -1
- package/dist/cli-tui/commands/subcommands/auth-commands.d.ts.map +1 -1
- package/dist/cli-tui/commands/subcommands/auth-commands.js +4 -12
- package/dist/cli-tui/commands/subcommands/auth-commands.js.map +1 -1
- package/dist/cli-tui/custom-editor.d.ts +1 -1
- package/dist/cli-tui/custom-editor.js +2 -2
- package/dist/cli-tui/custom-editor.js.map +1 -1
- package/dist/cli-tui/oauth/oauth-flow-controller.d.ts.map +1 -1
- package/dist/cli-tui/oauth/oauth-flow-controller.js +19 -23
- package/dist/cli-tui/oauth/oauth-flow-controller.js.map +1 -1
- package/dist/cli-tui/selectors/model-selector.d.ts.map +1 -1
- package/dist/cli-tui/selectors/model-selector.js +0 -1
- package/dist/cli-tui/selectors/model-selector.js.map +1 -1
- package/dist/cli-tui/selectors/oauth-selector-view.d.ts +2 -2
- package/dist/cli-tui/selectors/oauth-selector-view.d.ts.map +1 -1
- package/dist/cli-tui/selectors/oauth-selector-view.js.map +1 -1
- package/dist/cli-tui/selectors/oauth-selector.d.ts +2 -2
- package/dist/cli-tui/selectors/oauth-selector.d.ts.map +1 -1
- package/dist/cli-tui/selectors/oauth-selector.js +3 -4
- package/dist/cli-tui/selectors/oauth-selector.js.map +1 -1
- package/dist/cli-tui/tui-renderer/mcp-events-setup.js +1 -1
- package/dist/cli-tui/tui-renderer/mcp-events-setup.js.map +1 -1
- package/dist/cli-tui/tui-renderer.js +2 -2
- package/dist/cli-tui/tui-renderer.js.map +1 -1
- package/dist/cli-tui/utils/footer-utils.d.ts +1 -1
- package/dist/cli-tui/utils/footer-utils.js +1 -1
- package/dist/cli-tui/utils/footer-utils.js.map +1 -1
- package/dist/cli.js +15156 -14232
- package/dist/commands/prompts.d.ts +1 -1
- package/dist/commands/prompts.js +1 -1
- package/dist/commands/prompts.js.map +1 -1
- package/dist/config/constants.d.ts +2 -2
- package/dist/config/constants.d.ts.map +1 -1
- package/dist/config/constants.js +2 -2
- package/dist/config/constants.js.map +1 -1
- package/dist/config/index.d.ts +1 -1
- package/dist/config/index.js +1 -1
- package/dist/config/index.js.map +1 -1
- package/dist/config/toml-config.js +3 -3
- package/dist/config/toml-config.js.map +1 -1
- package/dist/db/client.d.ts +2 -2
- package/dist/db/client.js +2 -2
- package/dist/db/client.js.map +1 -1
- package/dist/db/migrate.d.ts +1 -1
- package/dist/db/migrate.js +1 -1
- package/dist/db/migrate.js.map +1 -1
- package/dist/db/schema.d.ts +2 -2
- package/dist/db/schema.js +1 -1
- package/dist/db/schema.js.map +1 -1
- package/dist/errors/index.d.ts +2 -2
- package/dist/errors/index.js +2 -2
- package/dist/errors/index.js.map +1 -1
- package/dist/main.d.ts +4 -5
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +17 -14
- package/dist/main.js.map +1 -1
- package/dist/mcp/config.d.ts +15 -2
- package/dist/mcp/config.d.ts.map +1 -1
- package/dist/mcp/config.js +50 -26
- package/dist/mcp/config.js.map +1 -1
- package/dist/mcp/fathom-cua.d.ts.map +1 -1
- package/dist/mcp/fathom-cua.js +10 -0
- package/dist/mcp/fathom-cua.js.map +1 -1
- package/dist/mcp/manager.d.ts.map +1 -1
- package/dist/mcp/manager.js +32 -1
- package/dist/mcp/manager.js.map +1 -1
- package/dist/mcp/tool-bridge.d.ts.map +1 -1
- package/dist/mcp/tool-bridge.js +12 -3
- package/dist/mcp/tool-bridge.js.map +1 -1
- package/dist/mcp/tool-capabilities.d.ts +5 -0
- package/dist/mcp/tool-capabilities.d.ts.map +1 -0
- package/dist/mcp/tool-capabilities.js +271 -0
- package/dist/mcp/tool-capabilities.js.map +1 -0
- package/dist/mcp/types.d.ts +6 -1
- package/dist/mcp/types.d.ts.map +1 -1
- package/dist/mcp/types.js.map +1 -1
- package/dist/models/config-loader.d.ts +1 -1
- package/dist/models/factory-integration.d.ts +1 -1
- package/dist/models/factory-integration.js +1 -1
- package/dist/models/factory-integration.js.map +1 -1
- package/dist/node_modules/@evalops/contracts/dist/index.d.ts +3 -3
- package/dist/node_modules/@evalops/contracts/dist/index.js +2 -2
- package/dist/node_modules/@evalops/contracts/dist/index.js.map +1 -1
- package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.d.ts +1182 -14
- package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.d.ts.map +1 -1
- package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.js +450 -1
- package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.js.map +1 -1
- package/dist/node_modules/@evalops/contracts/package.json +1 -1
- package/dist/node_modules/@evalops/tui/package.json +1 -1
- package/dist/oauth/connectors.d.ts +2 -2
- package/dist/oauth/connectors.d.ts.map +1 -1
- package/dist/oauth/connectors.js +3 -5
- package/dist/oauth/connectors.js.map +1 -1
- package/dist/oauth/github-copilot.d.ts +1 -1
- package/dist/oauth/github-copilot.js +1 -1
- package/dist/oauth/github-copilot.js.map +1 -1
- package/dist/oauth/index.d.ts +10 -8
- package/dist/oauth/index.d.ts.map +1 -1
- package/dist/oauth/index.js +54 -31
- package/dist/oauth/index.js.map +1 -1
- package/dist/oauth/openai.d.ts +1 -1
- package/dist/oauth/openai.js +2 -2
- package/dist/oauth/openai.js.map +1 -1
- package/dist/platform/a2a-completion-audit.d.ts +41 -0
- package/dist/platform/a2a-completion-audit.d.ts.map +1 -0
- package/dist/platform/a2a-completion-audit.js +177 -0
- package/dist/platform/a2a-completion-audit.js.map +1 -0
- package/dist/platform/a2a-task-ledger.d.ts.map +1 -1
- package/dist/platform/a2a-task-ledger.js +17 -0
- package/dist/platform/a2a-task-ledger.js.map +1 -1
- package/dist/platform/a2a-telemetry-inspect.d.ts +58 -0
- package/dist/platform/a2a-telemetry-inspect.d.ts.map +1 -0
- package/dist/platform/a2a-telemetry-inspect.js +224 -0
- package/dist/platform/a2a-telemetry-inspect.js.map +1 -0
- package/dist/platform/agent-registry-client.d.ts +8 -0
- package/dist/platform/agent-registry-client.d.ts.map +1 -1
- package/dist/platform/agent-registry-client.js +9 -1
- package/dist/platform/agent-registry-client.js.map +1 -1
- package/dist/providers/api-keys.d.ts +2 -2
- package/dist/providers/api-keys.js +2 -2
- package/dist/providers/api-keys.js.map +1 -1
- package/dist/providers/auth.d.ts +3 -6
- package/dist/providers/auth.d.ts.map +1 -1
- package/dist/providers/auth.js +1 -40
- package/dist/providers/auth.js.map +1 -1
- package/dist/rpc/index.d.ts +2 -2
- package/dist/rpc/index.js +2 -2
- package/dist/rpc/index.js.map +1 -1
- package/dist/rpc/rpc-types.d.ts +1 -1
- package/dist/rpc/rpc-types.js +1 -1
- package/dist/rpc/rpc-types.js.map +1 -1
- package/dist/safety/nested-agent-guard.js +1 -1
- package/dist/safety/nested-agent-guard.js.map +1 -1
- package/dist/safety/policy.d.ts +2 -2
- package/dist/safety/policy.js +2 -2
- package/dist/safety/policy.js.map +1 -1
- package/dist/safety/validators/network-policy-validator.d.ts +8 -0
- package/dist/safety/validators/network-policy-validator.d.ts.map +1 -1
- package/dist/safety/validators/network-policy-validator.js +29 -4
- package/dist/safety/validators/network-policy-validator.js.map +1 -1
- package/dist/sandbox/local-sandbox.d.ts +1 -1
- package/dist/sandbox/local-sandbox.js +1 -1
- package/dist/sandbox/local-sandbox.js.map +1 -1
- package/dist/server/app-context.d.ts +2 -0
- package/dist/server/app-context.d.ts.map +1 -1
- package/dist/server/app-context.js.map +1 -1
- package/dist/server/handlers/attachments.d.ts.map +1 -1
- package/dist/server/handlers/attachments.js +1 -0
- package/dist/server/handlers/attachments.js.map +1 -1
- package/dist/server/handlers/models.d.ts.map +1 -1
- package/dist/server/handlers/models.js +3 -1
- package/dist/server/handlers/models.js.map +1 -1
- package/dist/server/handlers/session-attachments.d.ts.map +1 -1
- package/dist/server/handlers/session-attachments.js +2 -0
- package/dist/server/handlers/session-attachments.js.map +1 -1
- package/dist/server/handlers/sessions.js +1 -1
- package/dist/server/handlers/sessions.js.map +1 -1
- package/dist/server/handlers/status.d.ts +2 -0
- package/dist/server/handlers/status.d.ts.map +1 -1
- package/dist/server/handlers/status.js +3 -2
- package/dist/server/handlers/status.js.map +1 -1
- package/dist/server/headless-runtime-service.d.ts.map +1 -1
- package/dist/server/headless-runtime-service.js +32 -3
- package/dist/server/headless-runtime-service.js.map +1 -1
- package/dist/server/hosted-session-manager.d.ts +2 -0
- package/dist/server/hosted-session-manager.d.ts.map +1 -1
- package/dist/server/hosted-session-manager.js +9 -0
- package/dist/server/hosted-session-manager.js.map +1 -1
- package/dist/server/model-selection.d.ts.map +1 -1
- package/dist/server/model-selection.js +9 -1
- package/dist/server/model-selection.js.map +1 -1
- package/dist/server/rate-limiter.d.ts +1 -1
- package/dist/server/rate-limiter.js +1 -1
- package/dist/server/rate-limiter.js.map +1 -1
- package/dist/server/router.d.ts +2 -2
- package/dist/server/router.js.map +1 -1
- package/dist/server/session-serialization.d.ts +9 -9
- package/dist/server/session-serialization.js +15 -15
- package/dist/server/session-serialization.js.map +1 -1
- package/dist/session/manager.d.ts +5 -0
- package/dist/session/manager.d.ts.map +1 -1
- package/dist/session/manager.js +56 -8
- package/dist/session/manager.js.map +1 -1
- package/dist/session/session-catalog.d.ts +2 -0
- package/dist/session/session-catalog.d.ts.map +1 -1
- package/dist/session/session-catalog.js +6 -0
- package/dist/session/session-catalog.js.map +1 -1
- package/dist/session/session-context.d.ts +2 -0
- package/dist/session/session-context.d.ts.map +1 -1
- package/dist/session/session-context.js +15 -0
- package/dist/session/session-context.js.map +1 -1
- package/dist/session/types.d.ts +7 -0
- package/dist/session/types.d.ts.map +1 -1
- package/dist/session/types.js.map +1 -1
- package/dist/session/wire-format.generated.d.ts +1 -0
- package/dist/session/wire-format.generated.d.ts.map +1 -1
- package/dist/session/wire-format.generated.js +1 -0
- package/dist/session/wire-format.generated.js.map +1 -1
- package/dist/shared-memory/contract.d.ts +4 -4
- package/dist/shared-memory/contract.js +2 -2
- package/dist/shared-memory/contract.js.map +1 -1
- package/dist/telemetry/index.d.ts +2 -2
- package/dist/telemetry/index.d.ts.map +1 -1
- package/dist/telemetry/index.js +2 -2
- package/dist/telemetry/index.js.map +1 -1
- package/dist/telemetry/maestro-event-bus.d.ts +57 -0
- package/dist/telemetry/maestro-event-bus.d.ts.map +1 -1
- package/dist/telemetry/maestro-event-bus.js +59 -1
- package/dist/telemetry/maestro-event-bus.js.map +1 -1
- package/dist/telemetry/maestro-event-catalog.d.ts +17 -1
- package/dist/telemetry/maestro-event-catalog.d.ts.map +1 -1
- package/dist/telemetry/maestro-event-catalog.js +24 -0
- package/dist/telemetry/maestro-event-catalog.js.map +1 -1
- package/dist/telemetry/mcp-beacon.d.ts +2 -0
- package/dist/telemetry/mcp-beacon.d.ts.map +1 -1
- package/dist/telemetry/mcp-beacon.js +15 -0
- package/dist/telemetry/mcp-beacon.js.map +1 -1
- package/dist/telemetry/metrics.d.ts +62 -0
- package/dist/telemetry/metrics.d.ts.map +1 -1
- package/dist/telemetry/metrics.js +84 -0
- package/dist/telemetry/metrics.js.map +1 -1
- package/dist/telemetry.d.ts +44 -0
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +84 -2
- package/dist/telemetry.js.map +1 -1
- package/dist/theme/theme-loader.js +2 -2
- package/dist/theme/theme-loader.js.map +1 -1
- package/dist/theme/theme-schema.json +2 -2
- package/dist/theme/theme.d.ts +1 -1
- package/dist/theme/theme.js.map +1 -1
- package/dist/tools/background/task-types.d.ts +1 -1
- package/dist/tools/extract-document.d.ts +1 -0
- package/dist/tools/extract-document.d.ts.map +1 -1
- package/dist/tools/extract-document.js +2 -1
- package/dist/tools/extract-document.js.map +1 -1
- package/dist/tools/index.d.ts +55 -55
- package/dist/tools/index.js +1 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/tool-dsl.d.ts +1 -1
- package/dist/tools/tool-dsl.js +1 -1
- package/dist/tools/tool-dsl.js.map +1 -1
- package/dist/utils/document-extractor.d.ts +1 -0
- package/dist/utils/document-extractor.d.ts.map +1 -1
- package/dist/utils/document-extractor.js +320 -40
- package/dist/utils/document-extractor.js.map +1 -1
- package/dist/utils/logger.d.ts +1 -1
- package/dist/utils/logger.js +1 -1
- package/dist/utils/logger.js.map +1 -1
- package/dist/version.json +2 -2
- package/dist/web-server.d.ts +1 -1
- package/dist/web-server.d.ts.map +1 -1
- package/dist/web-server.js +12 -8
- package/dist/web-server.js.map +1 -1
- package/package.json +4 -2
- package/dist/oauth/anthropic.d.ts +0 -17
- package/dist/oauth/anthropic.d.ts.map +0 -1
- package/dist/oauth/anthropic.js +0 -81
- package/dist/oauth/anthropic.js.map +0 -1
- package/dist/providers/anthropic-auth.d.ts +0 -75
- package/dist/providers/anthropic-auth.d.ts.map +0 -1
- package/dist/providers/anthropic-auth.js +0 -221
- package/dist/providers/anthropic-auth.js.map +0 -1
package/dist/session/manager.js
CHANGED
|
@@ -292,11 +292,18 @@ export class SessionManager {
|
|
|
292
292
|
? toSessionModelMetadata(state.model)
|
|
293
293
|
: undefined);
|
|
294
294
|
const fallbackMetadata = this.resolveModelMetadata(sessionModelKey);
|
|
295
|
+
const provisionalHeaderIndex = this.fileEntries.findIndex((existing) => existing.type === "session" &&
|
|
296
|
+
existing.id === this.sessionId &&
|
|
297
|
+
existing.provisional === true);
|
|
298
|
+
const provisionalHeader = provisionalHeaderIndex >= 0
|
|
299
|
+
? this.fileEntries[provisionalHeaderIndex]
|
|
300
|
+
: undefined;
|
|
301
|
+
const timestamp = provisionalHeader?.timestamp ?? new Date().toISOString();
|
|
295
302
|
const entry = {
|
|
296
303
|
type: "session",
|
|
297
304
|
version: CURRENT_SESSION_VERSION,
|
|
298
305
|
id: this.sessionId,
|
|
299
|
-
timestamp
|
|
306
|
+
timestamp,
|
|
300
307
|
cwd: process.cwd(),
|
|
301
308
|
subject: options?.subject || undefined,
|
|
302
309
|
model: sessionModelKey,
|
|
@@ -313,9 +320,20 @@ export class SessionManager {
|
|
|
313
320
|
})),
|
|
314
321
|
};
|
|
315
322
|
this.metadataCache.apply(entry);
|
|
316
|
-
|
|
323
|
+
if (provisionalHeaderIndex >= 0) {
|
|
324
|
+
this.fileEntries[provisionalHeaderIndex] = entry;
|
|
325
|
+
}
|
|
326
|
+
else {
|
|
327
|
+
this.fileEntries.unshift(entry);
|
|
328
|
+
}
|
|
317
329
|
this.sessionInitialized = true;
|
|
318
|
-
|
|
330
|
+
if (provisionalHeaderIndex >= 0) {
|
|
331
|
+
this.rewriteSessionFile();
|
|
332
|
+
this.flushed = true;
|
|
333
|
+
}
|
|
334
|
+
else {
|
|
335
|
+
this.persistEntry(entry);
|
|
336
|
+
}
|
|
319
337
|
queueSharedMemoryUpdate({
|
|
320
338
|
sessionId: this.sessionId,
|
|
321
339
|
state: {
|
|
@@ -550,6 +568,8 @@ export class SessionManager {
|
|
|
550
568
|
meta.favorite === undefined &&
|
|
551
569
|
meta.title === undefined &&
|
|
552
570
|
meta.tags === undefined &&
|
|
571
|
+
meta.archived === undefined &&
|
|
572
|
+
meta.archivedAt === undefined &&
|
|
553
573
|
meta.appServerGoal === undefined) {
|
|
554
574
|
return;
|
|
555
575
|
}
|
|
@@ -560,6 +580,9 @@ export class SessionManager {
|
|
|
560
580
|
};
|
|
561
581
|
try {
|
|
562
582
|
appendFileSync(targetFile, `${JSON.stringify(entry)}\n`);
|
|
583
|
+
if (resolve(targetFile) === this.sessionFile) {
|
|
584
|
+
this.fileEntries.push(entry);
|
|
585
|
+
}
|
|
563
586
|
}
|
|
564
587
|
catch (error) {
|
|
565
588
|
logger.error("Failed to append session metadata", error instanceof Error ? error : new Error(String(error)));
|
|
@@ -663,6 +686,14 @@ export class SessionManager {
|
|
|
663
686
|
this.appendSessionMetaEntry(sessionPath, { tags });
|
|
664
687
|
this.syncSessionMemoryEntry(sessionPath);
|
|
665
688
|
}
|
|
689
|
+
setSessionArchived(sessionPath, archived) {
|
|
690
|
+
if (!sessionPath || !existsSync(sessionPath))
|
|
691
|
+
return;
|
|
692
|
+
this.appendSessionMetaEntry(sessionPath, {
|
|
693
|
+
archived,
|
|
694
|
+
archivedAt: archived ? new Date().toISOString() : undefined,
|
|
695
|
+
});
|
|
696
|
+
}
|
|
666
697
|
setSessionAppServerGoal(sessionPath, goal) {
|
|
667
698
|
if (!sessionPath || !existsSync(sessionPath))
|
|
668
699
|
return;
|
|
@@ -713,6 +744,9 @@ export class SessionManager {
|
|
|
713
744
|
isInitialized() {
|
|
714
745
|
return this.sessionInitialized;
|
|
715
746
|
}
|
|
747
|
+
canCreateSession() {
|
|
748
|
+
return this.enabled;
|
|
749
|
+
}
|
|
716
750
|
getSessionId() {
|
|
717
751
|
return this.sessionId;
|
|
718
752
|
}
|
|
@@ -928,12 +962,12 @@ export class SessionManager {
|
|
|
928
962
|
const entries = safeReadSessionEntries(this.sessionFile);
|
|
929
963
|
const migrated = migrateToCurrentVersion(entries);
|
|
930
964
|
this.fileEntries = entries;
|
|
931
|
-
|
|
965
|
+
const header = entries.find((e) => e.type === "session");
|
|
966
|
+
this.sessionInitialized = Boolean(header && header.provisional !== true);
|
|
932
967
|
this.rebuildIndex(entries);
|
|
933
968
|
if (migrated) {
|
|
934
969
|
this.rewriteSessionFile();
|
|
935
970
|
}
|
|
936
|
-
const header = this.getHeader();
|
|
937
971
|
this.sessionId = header?.id ?? uuidv4();
|
|
938
972
|
this.flushed = true;
|
|
939
973
|
this.metadataCache.seedFromFile(this.sessionFile);
|
|
@@ -1000,16 +1034,27 @@ export class SessionManager {
|
|
|
1000
1034
|
*/
|
|
1001
1035
|
async createSession(options) {
|
|
1002
1036
|
this.startFreshSession();
|
|
1037
|
+
const now = new Date().toISOString();
|
|
1038
|
+
const header = {
|
|
1039
|
+
type: "session",
|
|
1040
|
+
version: CURRENT_SESSION_VERSION,
|
|
1041
|
+
id: this.sessionId,
|
|
1042
|
+
timestamp: now,
|
|
1043
|
+
cwd: process.cwd(),
|
|
1044
|
+
provisional: true,
|
|
1045
|
+
};
|
|
1046
|
+
this.fileEntries.unshift(header);
|
|
1003
1047
|
if (options?.title && this.enabled) {
|
|
1004
1048
|
const entry = {
|
|
1005
1049
|
type: "session_meta",
|
|
1006
|
-
timestamp:
|
|
1050
|
+
timestamp: now,
|
|
1007
1051
|
title: options.title,
|
|
1008
1052
|
};
|
|
1009
1053
|
this.fileEntries.push(entry);
|
|
1010
|
-
this.persistEntry(entry);
|
|
1011
1054
|
}
|
|
1012
|
-
|
|
1055
|
+
this.rewriteSessionFile();
|
|
1056
|
+
this.flushed = true;
|
|
1057
|
+
this.sessionInitialized = false;
|
|
1013
1058
|
return {
|
|
1014
1059
|
id: this.sessionId,
|
|
1015
1060
|
title: options?.title,
|
|
@@ -1027,6 +1072,9 @@ export class SessionManager {
|
|
|
1027
1072
|
const entries = safeReadSessionEntries(resolvedSource);
|
|
1028
1073
|
return this.importPortableEntries(entries);
|
|
1029
1074
|
}
|
|
1075
|
+
importSessionEntries(entries) {
|
|
1076
|
+
return this.importPortableEntries([...entries]);
|
|
1077
|
+
}
|
|
1030
1078
|
importPortableSession(sourcePath) {
|
|
1031
1079
|
const resolvedSource = resolve(sourcePath);
|
|
1032
1080
|
if (!existsSync(resolvedSource)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/session/manager.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Session Manager - Conversation Persistence and Recovery\n *\n * Sessions are stored as JSONL (JSON Lines) files. Each entry is append-only and\n * may include tree metadata (id/parentId) to support branching and navigation.\n *\n * Tree entries form a conversation tree where the \"leaf\" pointer tracks the\n * active branch. The session file is append-only; branching updates the leaf\n * pointer without modifying history.\n */\n\nimport {\n\tappendFileSync,\n\texistsSync,\n\tmkdirSync,\n\treadFileSync,\n\treaddirSync,\n\tstatSync,\n\twriteFileSync,\n} from \"node:fs\";\nimport { extname, join, resolve } from \"node:path\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport type {\n\tAgentState,\n\tAppMessage,\n\tImageContent,\n\tTextContent,\n} from \"../agent/types.js\";\nimport { SESSION_CONFIG, getAgentDir } from \"../config/constants.js\";\nimport { getRegisteredModels } from \"../models/registry.js\";\nimport type { RegisteredModel } from \"../models/registry.js\";\nimport { queueSharedMemoryUpdate } from \"../shared-memory/client.js\";\nimport { recordMaestroPromptVariantSelected } from \"../telemetry/maestro-event-bus.js\";\nimport { createLogger } from \"../utils/logger.js\";\nimport { resolveEnvPath } from \"../utils/path-expansion.js\";\nimport { SessionFileWriter } from \"./file-writer.js\";\nimport {\n\tSessionMetadataCache,\n\ttype SessionModelMetadata,\n} from \"./metadata-cache.js\";\nimport {\n\tmigrateToCurrentVersion,\n\tregisterActiveSessionFile,\n\tscheduleSessionMigration,\n\tunregisterActiveSessionFile,\n} from \"./migration.js\";\nimport { sanitizeSessionScope } from \"./scope.js\";\nimport {\n\tcreateBranchedSessionFromLeaf as createBranchedSessionFromLeafFn,\n\tcreateBranchedSessionFromState as createBranchedSessionFromStateFn,\n} from \"./session-branch.js\";\nimport { SessionCatalog } from \"./session-catalog.js\";\nimport {\n\ttype SessionContextSnapshot,\n\tbuildSessionContextFromEntries,\n\tgenerateEntryId,\n\tsafeReadSessionEntries,\n} from \"./session-context.js\";\nimport { syncSessionMemory } from \"./session-memory.js\";\nimport {\n\tapplyAttachmentExtracts,\n\tsanitizeMessageForSession,\n} from \"./session-sanitize.js\";\nimport {\n\ttype AttachmentExtractedEntry,\n\ttype BranchSummaryEntry,\n\tCURRENT_SESSION_VERSION,\n\ttype CompactionEntry,\n\ttype CustomEntry,\n\ttype CustomMessageEntry,\n\ttype LabelEntry,\n\ttype ModelChangeEntry,\n\ttype SessionEntry,\n\ttype SessionHeaderEntry,\n\ttype SessionMessageEntry,\n\ttype SessionMessagesView,\n\ttype SessionMetaEntry,\n\ttype SessionMetadata,\n\ttype SessionSummary,\n\ttype SessionTreeEntry,\n\ttype SessionTreeNode,\n\ttype ThinkingLevelChangeEntry,\n\tgetPersistedSessionPromptContextManifest,\n\tisSessionTreeEntry,\n\ttryParseSessionEntry,\n} from \"./types.js\";\n\nexport interface SessionManagerOptions {\n\t/** Override the base session directory (before per-cwd scoping). */\n\tsessionDir?: string;\n\t/** Optional scope key (e.g., auth subject) for per-user session isolation. */\n\tsessionScope?: string;\n}\n\nconst logger = createLogger(\"session-manager\");\nconst PORTABLE_SESSION_EXPORT_FORMAT = \"maestro-session-export.v1\";\n\ninterface PortableSessionBundle {\n\tformat: string;\n\texportedAt: string;\n\tsessionId?: string;\n\tentries?: SessionEntry[];\n\tsessions?: PortableSessionExportSession[];\n}\n\nexport interface PortableSessionExportSession {\n\tsessionId: string;\n\tparentSessionId?: string;\n\tsessionFile: string;\n\tentries?: SessionEntry[];\n}\n\nexport interface PortableSessionImportResult {\n\tsessionFile: string;\n\tsessionId: string;\n\timportedCount: number;\n}\n\ninterface PortableSessionExportRecord {\n\tsessionId: string;\n\tsessionFile: string;\n\ttimestamp: string;\n\tparentSessionId?: string;\n\tparentSessionFile?: string;\n}\n\n// Re-export SessionModelMetadata for backward compatibility\nexport type { SessionModelMetadata } from \"./metadata-cache.js\";\n\nexport type {\n\tAttachmentExtractedEntry,\n\tBranchSummaryEntry,\n\tCompactionEntry,\n\tSessionHeaderEntry,\n\tSessionMessageEntry,\n\tSessionMetaEntry,\n\tSessionMigrationState,\n\tSessionToolInfo,\n\tSessionTreeEntry,\n\tSessionTreeNode,\n} from \"./types.js\";\n\nexport {\n\tgetMigrationState,\n\tregisterActiveSessionFile,\n\tresetMigrationState,\n\trunSessionMigration,\n\tscheduleSessionMigration,\n\tunregisterActiveSessionFile,\n} from \"./migration.js\";\n\nexport function toSessionModelMetadata(\n\tmodel: RegisteredModel,\n): SessionModelMetadata {\n\treturn {\n\t\tprovider: model.provider,\n\t\tmodelId: model.id,\n\t\tproviderName: model.providerName,\n\t\tname: model.name,\n\t\tbaseUrl: model.baseUrl,\n\t\treasoning: model.reasoning,\n\t\tcontextWindow: model.contextWindow,\n\t\tmaxTokens: model.maxTokens,\n\t\tsource: model.source,\n\t};\n}\n\nfunction findRegisteredModel(modelKey: string): RegisteredModel | undefined {\n\tconst [provider, modelId] = modelKey.split(\"/\");\n\tif (!provider || !modelId) {\n\t\treturn undefined;\n\t}\n\treturn getRegisteredModels().find(\n\t\t(entry) => entry.provider === provider && entry.id === modelId,\n\t);\n}\n\n/**\n * Main session management class.\n */\nexport class SessionManager {\n\t/** Unique identifier for this session (UUID v4) */\n\tprivate sessionId!: string;\n\t/** Absolute path to the session JSONL file */\n\tprivate sessionFile!: string;\n\t/** Directory containing all session files for current project */\n\tprivate sessionDir: string;\n\t/** Optional scope for per-user session isolation */\n\tprivate sessionScope?: string;\n\t/** Optional override for base session directory */\n\tprivate sessionDirOverride?: string;\n\t/** Whether session persistence is enabled (disabled by --no-session) */\n\tprivate enabled = true;\n\t/** Whether the session header has been written */\n\tprivate sessionInitialized = false;\n\t/** Buffered file writer for efficient I/O */\n\tprivate writer?: SessionFileWriter;\n\t/** Snapshot of agent state for recovery purposes */\n\tprivate _agentSnapshot?: AgentState;\n\t/** Metadata for the last used model */\n\tprivate lastModelMetadata?: SessionModelMetadata;\n\t/** Cache for current model/thinking level */\n\tprivate metadataCache = new SessionMetadataCache();\n\tprivate readonly catalog: SessionCatalog;\n\n\tprivate fileEntries: SessionEntry[] = [];\n\tprivate byId: Map<string, SessionTreeEntry> = new Map();\n\tprivate labelsById: Map<string, string> = new Map();\n\tprivate leafId: string | null = null;\n\tprivate flushed = false;\n\tprivate _hasAssistantMessage = false;\n\n\t/**\n\t * Creates a new SessionManager.\n\t *\n\t * @param continueSession - If true, loads the most recently modified session\n\t * @param customSessionPath - Optional specific session file to load\n\t * @param options - Optional session directory/scope overrides\n\t */\n\tconstructor(\n\t\tcontinueSession = false,\n\t\tcustomSessionPath?: string,\n\t\toptions: SessionManagerOptions = {},\n\t) {\n\t\tthis.sessionScope = options.sessionScope;\n\t\tthis.sessionDirOverride = options.sessionDir;\n\t\tthis.sessionDir = this.getSessionDirectory();\n\t\tthis.catalog = new SessionCatalog({\n\t\t\tsessionDir: this.sessionDir,\n\t\t\tbeforeRead: () => this.writer?.flushSync(),\n\t\t\tgetCurrentSessionId: () => this.sessionId,\n\t\t});\n\n\t\tif (customSessionPath) {\n\t\t\t// Use custom session file path\n\t\t\tthis.sessionFile = resolve(customSessionPath);\n\t\t\tthis.setSessionFile(this.sessionFile);\n\t\t} else if (continueSession) {\n\t\t\tconst mostRecent = this.findMostRecentlyModifiedSession();\n\t\t\tif (mostRecent) {\n\t\t\t\tthis.sessionFile = mostRecent;\n\t\t\t\tthis.setSessionFile(this.sessionFile);\n\t\t\t} else {\n\t\t\t\tthis.initNewSession();\n\t\t\t}\n\t\t} else {\n\t\t\tthis.initNewSession();\n\t\t}\n\n\t\tthis.initializeWriter();\n\t\tif (this.sessionInitialized) {\n\t\t\tthis.metadataCache.seedFromFile(this.sessionFile);\n\t\t}\n\t}\n\n\t/** Disable session saving (for --no-session mode) */\n\tdisable() {\n\t\tthis.enabled = false;\n\t\t// Unregister session file before disabling\n\t\tif (this.sessionFile) {\n\t\t\tunregisterActiveSessionFile(this.sessionFile);\n\t\t}\n\t\tthis.writer?.flushSync();\n\t\tthis.writer?.dispose();\n\t\tthis.writer = undefined;\n\t\tthis.fileEntries = [];\n\t\tthis.byId.clear();\n\t\tthis.labelsById.clear();\n\t\tthis.leafId = null;\n\t}\n\n\tprivate initializeWriter(): void {\n\t\tif (!this.enabled) {\n\t\t\tthis.writer = undefined;\n\t\t\treturn;\n\t\t}\n\t\tthis.writer = new SessionFileWriter(this.sessionFile);\n\t}\n\n\tprivate getSessionDirectory(): string {\n\t\tconst cwd = process.cwd();\n\t\tconst safePath = `--${cwd.replace(/^[/\\\\]/, \"\").replace(/[/\\\\:]/g, \"-\")}--`;\n\n\t\tconst baseOverride =\n\t\t\tresolveEnvPath(this.sessionDirOverride) ??\n\t\t\tresolveEnvPath(process.env.MAESTRO_SESSION_DIR);\n\t\tconst baseDir =\n\t\t\tbaseOverride ??\n\t\t\tSESSION_CONFIG.DEFAULT_DIR ??\n\t\t\tjoin(getAgentDir(), \"sessions\");\n\n\t\tconst scope = this.sessionScope\n\t\t\t? sanitizeSessionScope(this.sessionScope)\n\t\t\t: \"\";\n\t\tconst sessionDir = scope\n\t\t\t? join(baseDir, scope, safePath)\n\t\t\t: join(baseDir, safePath);\n\t\tif (!existsSync(sessionDir)) {\n\t\t\tmkdirSync(sessionDir, { recursive: true });\n\t\t}\n\t\treturn sessionDir;\n\t}\n\n\tprivate initNewSession(): void {\n\t\tthis.sessionId = uuidv4();\n\t\tconst timestamp = new Date().toISOString().replace(/[:.]/g, \"-\");\n\t\tthis.sessionFile = join(\n\t\t\tthis.sessionDir,\n\t\t\t`${timestamp}_${this.sessionId}.jsonl`,\n\t\t);\n\t\t// Register new session file to prevent migration race conditions\n\t\tregisterActiveSessionFile(this.sessionFile);\n\t\tthis.fileEntries = [];\n\t\tthis.byId.clear();\n\t\tthis.labelsById.clear();\n\t\tthis.leafId = null;\n\t\tthis.flushed = false;\n\t\tthis._hasAssistantMessage = false;\n\t\tthis.sessionInitialized = false;\n\t\tthis.metadataCache.reset();\n\t}\n\n\tstartFreshSession(): void {\n\t\tif (!this.enabled) {\n\t\t\treturn;\n\t\t}\n\t\tthis.writer?.flushSync();\n\t\tthis.writer?.dispose();\n\t\tthis.writer = undefined;\n\t\tthis._agentSnapshot = undefined;\n\t\tthis.lastModelMetadata = undefined;\n\t\t// Unregister old session file before creating new one\n\t\tif (this.sessionFile) {\n\t\t\tunregisterActiveSessionFile(this.sessionFile);\n\t\t}\n\t\tthis.initNewSession();\n\t\tthis.initializeWriter();\n\t}\n\n\t/**\n\t * Reset session state for /clear command - clears pending messages and starts new session\n\t */\n\treset(): void {\n\t\tthis.writer?.flushSync();\n\t\tthis.writer?.dispose();\n\t\tthis.writer = undefined;\n\n\t\t// Unregister old session file before creating new one\n\t\tif (this.sessionFile) {\n\t\t\tunregisterActiveSessionFile(this.sessionFile);\n\t\t}\n\n\t\tthis.fileEntries = [];\n\t\tthis.byId.clear();\n\t\tthis.labelsById.clear();\n\t\tthis.leafId = null;\n\t\tthis.flushed = false;\n\t\tthis._hasAssistantMessage = false;\n\t\tthis.sessionInitialized = false;\n\t\tthis.metadataCache.reset();\n\t\tthis._agentSnapshot = undefined;\n\t\tthis.lastModelMetadata = undefined;\n\n\t\tthis.initNewSession();\n\t\tthis.initializeWriter();\n\t}\n\n\tprivate findMostRecentlyModifiedSession(): string | null {\n\t\ttry {\n\t\t\tconst files = readdirSync(this.sessionDir)\n\t\t\t\t.filter((f) => f.endsWith(\".jsonl\"))\n\t\t\t\t.map((f) => ({\n\t\t\t\t\tpath: join(this.sessionDir, f),\n\t\t\t\t\tmtime: statSync(join(this.sessionDir, f)).mtime,\n\t\t\t\t}))\n\t\t\t\t.sort((a, b) => b.mtime.getTime() - a.mtime.getTime());\n\n\t\t\treturn files[0]?.path || null;\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate rebuildIndex(entries: SessionEntry[]): void {\n\t\tthis.byId.clear();\n\t\tthis.labelsById.clear();\n\t\tthis.leafId = null;\n\t\tthis._hasAssistantMessage = false;\n\n\t\tfor (const entry of entries) {\n\t\t\tif (!isSessionTreeEntry(entry)) continue;\n\t\t\tthis.byId.set(entry.id, entry);\n\t\t\tthis.leafId = entry.id;\n\t\t\tif (entry.type === \"label\") {\n\t\t\t\tif (entry.label) {\n\t\t\t\t\tthis.labelsById.set(entry.targetId, entry.label);\n\t\t\t\t} else {\n\t\t\t\t\tthis.labelsById.delete(entry.targetId);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (entry.type === \"message\" && entry.message.role === \"assistant\") {\n\t\t\t\tthis._hasAssistantMessage = true;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate rewriteSessionFile(): void {\n\t\tif (!this.enabled || !this.sessionFile) return;\n\t\tconst content = `${this.fileEntries.map((e) => JSON.stringify(e)).join(\"\\n\")}\\n`;\n\t\twriteFileSync(this.sessionFile, content);\n\t}\n\n\tprivate persistEntry(entry: SessionEntry): void {\n\t\tif (!this.enabled || !this.writer || !this.sessionFile) return;\n\t\tif (!this.sessionInitialized) return;\n\n\t\tif (!this.flushed) {\n\t\t\tfor (const e of this.fileEntries) {\n\t\t\t\tthis.writer.write(e);\n\t\t\t}\n\t\t\tthis.writer.flushSync();\n\t\t\tthis.flushed = true;\n\t\t\treturn;\n\t\t}\n\n\t\tthis.writer.write(entry);\n\t}\n\n\tprivate appendTreeEntry(entry: SessionTreeEntry): void {\n\t\tthis.fileEntries.push(entry);\n\t\tthis.byId.set(entry.id, entry);\n\t\tthis.leafId = entry.id;\n\t\tif (entry.type === \"label\") {\n\t\t\tif (entry.label) {\n\t\t\t\tthis.labelsById.set(entry.targetId, entry.label);\n\t\t\t} else {\n\t\t\t\tthis.labelsById.delete(entry.targetId);\n\t\t\t}\n\t\t}\n\t\tif (entry.type === \"message\" && entry.message.role === \"assistant\") {\n\t\t\tthis._hasAssistantMessage = true;\n\t\t}\n\t\tthis.persistEntry(entry);\n\t}\n\n\tprivate createTreeEntryId(): string {\n\t\treturn generateEntryId(this.byId);\n\t}\n\n\tstartSession(state: AgentState, options?: { subject?: string }): void {\n\t\tif (!this.enabled || this.sessionInitialized) return;\n\n\t\tconst modelKeyFromState = `${state.model.provider}/${state.model.id}`;\n\t\tconst latestModelChange = this.getLatestModelChange();\n\t\tconst latestThinkingLevel = this.getLatestThinkingLevel();\n\t\tconst sessionModelKey = latestModelChange?.model ?? modelKeyFromState;\n\t\tconst primaryMetadata =\n\t\t\tlatestModelChange?.modelMetadata ??\n\t\t\t(sessionModelKey === modelKeyFromState\n\t\t\t\t? toSessionModelMetadata(state.model as RegisteredModel)\n\t\t\t\t: undefined);\n\t\tconst fallbackMetadata = this.resolveModelMetadata(sessionModelKey);\n\t\tconst entry: SessionHeaderEntry = {\n\t\t\ttype: \"session\",\n\t\t\tversion: CURRENT_SESSION_VERSION,\n\t\t\tid: this.sessionId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tcwd: process.cwd(),\n\t\t\tsubject: options?.subject || undefined,\n\t\t\tmodel: sessionModelKey,\n\t\t\tmodelMetadata: primaryMetadata ?? fallbackMetadata,\n\t\t\tthinkingLevel: latestThinkingLevel ?? state.thinkingLevel,\n\t\t\tsystemPrompt: state.systemPrompt,\n\t\t\tpromptMetadata: state.promptMetadata,\n\t\t\tpromptContextManifest: getPersistedSessionPromptContextManifest(state),\n\t\t\tunifiedContextManifest: state.unifiedContextManifest,\n\t\t\ttools: state.tools.map((tool) => ({\n\t\t\t\tname: tool.name,\n\t\t\t\tlabel: tool.label,\n\t\t\t\tdescription: tool.description,\n\t\t\t})),\n\t\t};\n\t\tthis.metadataCache.apply(entry);\n\t\tthis.fileEntries.unshift(entry);\n\t\tthis.sessionInitialized = true;\n\n\t\tthis.persistEntry(entry);\n\n\t\tqueueSharedMemoryUpdate({\n\t\t\tsessionId: this.sessionId,\n\t\t\tstate: {\n\t\t\t\tsessionId: this.sessionId,\n\t\t\t\tcwd: process.cwd(),\n\t\t\t\tmodel: sessionModelKey,\n\t\t\t\tupdatedAt: entry.timestamp,\n\t\t\t\tsource: \"maestro\",\n\t\t\t},\n\t\t\tevent: {\n\t\t\t\ttype: \"maestro.session.started\",\n\t\t\t\tpayload: {\n\t\t\t\t\tsessionId: this.sessionId,\n\t\t\t\t\tmodel: sessionModelKey,\n\t\t\t\t\ttimestamp: entry.timestamp,\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\tif (state.promptMetadata) {\n\t\t\trecordMaestroPromptVariantSelected({\n\t\t\t\tprompt_metadata: state.promptMetadata,\n\t\t\t\tcorrelation: {\n\t\t\t\t\tsession_id: this.sessionId,\n\t\t\t\t},\n\t\t\t\tselected_at: entry.timestamp,\n\t\t\t});\n\t\t}\n\n\t\t// Auto-prune old sessions in the background (non-blocking)\n\t\tif (\n\t\t\tSESSION_CONFIG.MAX_SESSIONS > 0 ||\n\t\t\tSESSION_CONFIG.MAX_SESSION_AGE_DAYS > 0\n\t\t) {\n\t\t\tsetTimeout(() => {\n\t\t\t\ttry {\n\t\t\t\t\tconst result = this.pruneSessions();\n\t\t\t\t\tif (result.removed > 0) {\n\t\t\t\t\t\tlogger.debug(\"Auto-pruned sessions\", result);\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger.error(\n\t\t\t\t\t\t\"Session auto-prune failed\",\n\t\t\t\t\t\terror instanceof Error ? error : undefined,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}, 5000);\n\t\t}\n\t}\n\n\tsaveMessage(message: AppMessage): void {\n\t\tif (!this.enabled) return;\n\t\tconst sanitizedMessage = sanitizeMessageForSession(message);\n\t\tconst entry: SessionMessageEntry = {\n\t\t\ttype: \"message\",\n\t\t\tid: this.createTreeEntryId(),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tmessage: sanitizedMessage,\n\t\t};\n\n\t\tthis.appendTreeEntry(entry);\n\n\t\tqueueSharedMemoryUpdate({\n\t\t\tsessionId: this.sessionId,\n\t\t\tstate: {\n\t\t\t\tsessionId: this.sessionId,\n\t\t\t\tupdatedAt: entry.timestamp,\n\t\t\t\tlastMessageId: entry.id,\n\t\t\t\tlastMessageRole: message.role,\n\t\t\t\tsource: \"maestro\",\n\t\t\t},\n\t\t\tevent: {\n\t\t\t\ttype: \"maestro.message.saved\",\n\t\t\t\tpayload: {\n\t\t\t\t\tsessionId: this.sessionId,\n\t\t\t\t\tmessageId: entry.id,\n\t\t\t\t\trole: message.role,\n\t\t\t\t\ttimestamp: entry.timestamp,\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\t}\n\n\tsaveThinkingLevelChange(thinkingLevel: string): void {\n\t\tif (!this.enabled) return;\n\t\tconst entry: ThinkingLevelChangeEntry = {\n\t\t\ttype: \"thinking_level_change\",\n\t\t\tid: this.createTreeEntryId(),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tthinkingLevel,\n\t\t};\n\t\tthis.metadataCache.apply(entry);\n\n\t\tthis.appendTreeEntry(entry);\n\t}\n\n\tsaveModelChange(model: string, metadata?: SessionModelMetadata): void {\n\t\tif (!this.enabled) return;\n\t\tconst entry: ModelChangeEntry = {\n\t\t\ttype: \"model_change\",\n\t\t\tid: this.createTreeEntryId(),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tmodel,\n\t\t\tmodelMetadata: metadata,\n\t\t};\n\t\tthis.metadataCache.apply(entry);\n\n\t\tthis.appendTreeEntry(entry);\n\t}\n\n\tappendCustomEntry(customType: string, data?: unknown): void {\n\t\tif (!this.enabled) return;\n\t\tconst entry: CustomEntry = {\n\t\t\ttype: \"custom\",\n\t\t\tcustomType,\n\t\t\tdata,\n\t\t\tid: this.createTreeEntryId(),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t};\n\t\tthis.appendTreeEntry(entry);\n\t}\n\n\tappendCustomMessageEntry<T = unknown>(\n\t\tcustomType: string,\n\t\tcontent: string | (TextContent | ImageContent)[],\n\t\tdisplay: boolean,\n\t\tdetails?: T,\n\t): void {\n\t\tif (!this.enabled) return;\n\t\tconst entry: CustomMessageEntry<T> = {\n\t\t\ttype: \"custom_message\",\n\t\t\tcustomType,\n\t\t\tcontent,\n\t\t\tdisplay,\n\t\t\tdetails,\n\t\t\tid: this.createTreeEntryId(),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t};\n\t\tthis.appendTreeEntry(entry);\n\t}\n\n\tappendBranchSummary(\n\t\tsummary: string,\n\t\toptions?: { fromId?: string; details?: unknown; fromHook?: boolean },\n\t): void {\n\t\tif (!this.enabled) return;\n\t\tconst fromId = options?.fromId ?? this.leafId ?? \"root\";\n\t\tconst entry: BranchSummaryEntry = {\n\t\t\ttype: \"branch_summary\",\n\t\t\tid: this.createTreeEntryId(),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tfromId,\n\t\t\tsummary,\n\t\t\tdetails: options?.details,\n\t\t\tfromHook: options?.fromHook,\n\t\t};\n\t\tthis.appendTreeEntry(entry);\n\t}\n\n\tappendLabel(targetId: string, label: string | undefined): void {\n\t\tif (!this.byId.has(targetId)) {\n\t\t\tthrow new Error(`Entry ${targetId} not found`);\n\t\t}\n\t\tconst entry: LabelEntry = {\n\t\t\ttype: \"label\",\n\t\t\tid: this.createTreeEntryId(),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\ttargetId,\n\t\t\tlabel,\n\t\t};\n\t\tthis.appendTreeEntry(entry);\n\t}\n\n\t/**\n\t * Save a compaction event to the session file.\n\t */\n\tsaveCompaction(\n\t\tsummary: string,\n\t\tfirstKeptEntryIndex: number,\n\t\ttokensBefore: number,\n\t\toptions?: {\n\t\t\tauto?: boolean;\n\t\t\tcustomInstructions?: string;\n\t\t\tfirstKeptEntryId?: string;\n\t\t},\n\t): void {\n\t\tif (!this.enabled) return;\n\t\tconst context = this.buildSessionContext();\n\t\tconst resolvedEntry = options?.firstKeptEntryId\n\t\t\t? this.getEntry(options.firstKeptEntryId)\n\t\t\t: undefined;\n\t\tconst targetEntry =\n\t\t\tresolvedEntry ?? context.messageEntries[firstKeptEntryIndex];\n\t\tconst fallbackEntry = this.getEntries()[0];\n\t\tconst firstKeptEntryId =\n\t\t\ttargetEntry?.id ?? this.leafId ?? fallbackEntry?.id;\n\t\tif (!firstKeptEntryId) {\n\t\t\tlogger.warn(\"Failed to resolve compaction cut point; skipping save\");\n\t\t\treturn;\n\t\t}\n\t\tconst entry: CompactionEntry = {\n\t\t\ttype: \"compaction\",\n\t\t\tid: this.createTreeEntryId(),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tsummary,\n\t\t\tfirstKeptEntryId,\n\t\t\ttokensBefore,\n\t\t\tauto: options?.auto,\n\t\t\tcustomInstructions: options?.customInstructions,\n\t\t};\n\n\t\tthis.appendTreeEntry(entry);\n\t\tthis.writer?.flushSync();\n\t}\n\n\t/**\n\t * Find the most recent compaction entry in the current session.\n\t */\n\tfindLatestCompaction(): CompactionEntry | null {\n\t\tfor (let i = this.fileEntries.length - 1; i >= 0; i--) {\n\t\t\tconst entry = this.fileEntries[i]!;\n\t\t\tif (entry.type === \"compaction\") {\n\t\t\t\treturn entry as CompactionEntry;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate getLatestThinkingLevel(): string | undefined {\n\t\tfor (let i = this.fileEntries.length - 1; i >= 0; i--) {\n\t\t\tconst entry = this.fileEntries[i]!;\n\t\t\tif (entry.type === \"thinking_level_change\") {\n\t\t\t\treturn entry.thinkingLevel;\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tprivate getLatestModelChange(): ModelChangeEntry | undefined {\n\t\tfor (let i = this.fileEntries.length - 1; i >= 0; i--) {\n\t\t\tconst entry = this.fileEntries[i]!;\n\t\t\tif (entry.type === \"model_change\") {\n\t\t\t\treturn entry as ModelChangeEntry;\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tprivate resolveModelMetadata(\n\t\tmodelKey: string,\n\t): SessionModelMetadata | undefined {\n\t\tconst registered = findRegisteredModel(modelKey);\n\t\treturn registered ? toSessionModelMetadata(registered) : undefined;\n\t}\n\n\tprivate appendSessionMetaEntry(\n\t\ttargetFile: string,\n\t\tmeta: {\n\t\t\tsummary?: string;\n\t\t\tresumeSummary?: string;\n\t\t\tmemoryExtractionHash?: string;\n\t\t\tfavorite?: boolean;\n\t\t\ttitle?: string;\n\t\t\ttags?: string[];\n\t\t\tappServerGoal?: SessionMetaEntry[\"appServerGoal\"];\n\t\t},\n\t): void {\n\t\tif (!existsSync(targetFile)) return;\n\t\tif (\n\t\t\tmeta.summary === undefined &&\n\t\t\tmeta.resumeSummary === undefined &&\n\t\t\tmeta.memoryExtractionHash === undefined &&\n\t\t\tmeta.favorite === undefined &&\n\t\t\tmeta.title === undefined &&\n\t\t\tmeta.tags === undefined &&\n\t\t\tmeta.appServerGoal === undefined\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tconst entry: SessionMetaEntry = {\n\t\t\ttype: \"session_meta\",\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t...meta,\n\t\t};\n\t\ttry {\n\t\t\tappendFileSync(targetFile, `${JSON.stringify(entry)}\\n`);\n\t\t} catch (error) {\n\t\t\tlogger.error(\n\t\t\t\t\"Failed to append session metadata\",\n\t\t\t\terror instanceof Error ? error : new Error(String(error)),\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate appendAttachmentExtractEntry(\n\t\ttargetFile: string,\n\t\tpayload: { attachmentId: string; extractedText: string },\n\t): AttachmentExtractedEntry | null {\n\t\tif (!existsSync(targetFile)) return null;\n\t\tif (!payload.attachmentId || !payload.extractedText) return null;\n\t\tconst entry: AttachmentExtractedEntry = {\n\t\t\ttype: \"attachment_extract\",\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tattachmentId: payload.attachmentId,\n\t\t\textractedText: payload.extractedText,\n\t\t};\n\t\ttry {\n\t\t\tappendFileSync(targetFile, `${JSON.stringify(entry)}\\n`);\n\t\t\treturn entry;\n\t\t} catch (error) {\n\t\t\tlogger.error(\n\t\t\t\t\"Failed to append attachment extraction\",\n\t\t\t\terror instanceof Error ? error : new Error(String(error)),\n\t\t\t);\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * Persist extracted attachment text as an append-only cache entry.\n\t */\n\tsaveAttachmentExtraction(\n\t\tsessionPath: string,\n\t\tattachmentId: string,\n\t\ttext: string,\n\t): void {\n\t\tif (!sessionPath || !existsSync(sessionPath)) return;\n\t\tconst entry = this.appendAttachmentExtractEntry(sessionPath, {\n\t\t\tattachmentId,\n\t\t\textractedText: text,\n\t\t});\n\t\tif (entry && sessionPath === this.sessionFile) {\n\t\t\tthis.fileEntries.push(entry);\n\t\t}\n\t}\n\n\tsaveSessionSummary(summary: string, sessionPath?: string): void {\n\t\tconst trimmed = summary.trim();\n\t\tif (!trimmed) return;\n\t\tconst target = sessionPath ?? this.sessionFile;\n\t\tif (!target || !existsSync(target)) return;\n\t\tthis.appendSessionMetaEntry(target, { summary: trimmed });\n\t\tthis.syncSessionMemoryEntry(target);\n\t\tif (target === this.sessionFile) {\n\t\t\tqueueSharedMemoryUpdate({\n\t\t\t\tsessionId: this.sessionId,\n\t\t\t\tstate: {\n\t\t\t\t\tsessionId: this.sessionId,\n\t\t\t\t\tupdatedAt: new Date().toISOString(),\n\t\t\t\t\tsummary: trimmed,\n\t\t\t\t\tsource: \"maestro\",\n\t\t\t\t},\n\t\t\t\tevent: {\n\t\t\t\t\ttype: \"maestro.session.summary\",\n\t\t\t\t\tpayload: {\n\t\t\t\t\t\tsessionId: this.sessionId,\n\t\t\t\t\t\tlength: trimmed.length,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t}\n\n\tsaveSessionResumeSummary(summary: string, sessionPath?: string): void {\n\t\tconst trimmed = summary.trim();\n\t\tif (!trimmed) return;\n\t\tconst target = sessionPath ?? this.sessionFile;\n\t\tif (!target || !existsSync(target)) return;\n\t\tthis.appendSessionMetaEntry(target, { resumeSummary: trimmed });\n\t\tthis.syncSessionMemoryEntry(target);\n\t}\n\n\tsaveSessionMemoryExtractionHash(hash: string, sessionPath?: string): void {\n\t\tconst trimmed = hash.trim();\n\t\tif (!trimmed) return;\n\t\tconst target = sessionPath ?? this.sessionFile;\n\t\tif (!target || !existsSync(target)) return;\n\t\tthis.appendSessionMetaEntry(target, { memoryExtractionHash: trimmed });\n\t}\n\n\tsetSessionFavorite(sessionPath: string, favorite: boolean): void {\n\t\tif (!sessionPath || !existsSync(sessionPath)) return;\n\t\tthis.appendSessionMetaEntry(sessionPath, { favorite });\n\t}\n\n\tsetSessionTitle(sessionPath: string, title: string): void {\n\t\tif (!sessionPath || !existsSync(sessionPath)) return;\n\t\tthis.appendSessionMetaEntry(sessionPath, { title });\n\t\tthis.syncSessionMemoryEntry(sessionPath);\n\t}\n\n\tsetSessionTags(sessionPath: string, tags: string[]): void {\n\t\tif (!sessionPath || !existsSync(sessionPath)) return;\n\t\tthis.appendSessionMetaEntry(sessionPath, { tags });\n\t\tthis.syncSessionMemoryEntry(sessionPath);\n\t}\n\n\tsetSessionAppServerGoal(\n\t\tsessionPath: string,\n\t\tgoal: NonNullable<SessionMetaEntry[\"appServerGoal\"]> | null,\n\t): void {\n\t\tif (!sessionPath || !existsSync(sessionPath)) return;\n\t\tthis.appendSessionMetaEntry(sessionPath, { appServerGoal: goal });\n\t}\n\n\tprivate syncSessionMemoryEntry(sessionPath: string): void {\n\t\ttry {\n\t\t\tsyncSessionMemory(sessionPath);\n\t\t} catch (error) {\n\t\t\tlogger.warn(\"Failed to sync session memory\", {\n\t\t\t\tsessionPath,\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t});\n\t\t}\n\t}\n\n\tbuildSessionContext(\n\t\tleafId: string | null = this.leafId,\n\t): SessionContextSnapshot {\n\t\treturn buildSessionContextFromEntries(this.fileEntries, {\n\t\t\tleafId,\n\t\t\tbyId: this.byId,\n\t\t\theader: this.getHeader(),\n\t\t});\n\t}\n\n\tloadMessages(): AppMessage[] {\n\t\tconst context = this.buildSessionContext();\n\t\tconst extractedById = new Map<string, string>();\n\t\tfor (const entry of this.fileEntries) {\n\t\t\tif (entry.type === \"attachment_extract\") {\n\t\t\t\tif (entry.attachmentId && entry.extractedText) {\n\t\t\t\t\textractedById.set(entry.attachmentId, entry.extractedText);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (extractedById.size === 0) return context.messages;\n\t\treturn context.messages.map((message) =>\n\t\t\tapplyAttachmentExtracts(message, extractedById),\n\t\t);\n\t}\n\n\tloadThinkingLevel(): string {\n\t\treturn this.buildSessionContext().thinkingLevel;\n\t}\n\n\tloadModel(): string | null {\n\t\treturn this.buildSessionContext().model;\n\t}\n\n\tloadModelMetadata(): SessionModelMetadata | undefined {\n\t\tconst context = this.buildSessionContext();\n\t\treturn context.modelMetadata ?? this.lastModelMetadata;\n\t}\n\n\tisInitialized(): boolean {\n\t\treturn this.sessionInitialized;\n\t}\n\n\tgetSessionId(): string {\n\t\treturn this.sessionId;\n\t}\n\n\tgetSessionFile(): string {\n\t\treturn this.sessionFile;\n\t}\n\n\tgetPortableSessionBundle(): {\n\t\tselectedSessionId: string;\n\t\tsessions: PortableSessionExportSession[];\n\t} {\n\t\tconst records = this.buildPortableSessionRecords();\n\t\tconst byFile = new Map(\n\t\t\trecords.map((record) => [resolve(record.sessionFile), record]),\n\t\t);\n\t\tconst selected = byFile.get(resolve(this.sessionFile));\n\t\tif (!selected) {\n\t\t\treturn {\n\t\t\t\tselectedSessionId: this.sessionId,\n\t\t\t\tsessions: [\n\t\t\t\t\t{\n\t\t\t\t\t\tsessionId: this.sessionId,\n\t\t\t\t\t\tsessionFile: this.sessionFile,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\n\t\t}\n\n\t\tconst byId = new Map(records.map((record) => [record.sessionId, record]));\n\t\tconst parentToChildren = new Map<string, PortableSessionExportRecord[]>();\n\t\tfor (const record of records) {\n\t\t\tif (!record.parentSessionId) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst children = parentToChildren.get(record.parentSessionId) ?? [];\n\t\t\tchildren.push(record);\n\t\t\tparentToChildren.set(record.parentSessionId, children);\n\t\t}\n\t\tfor (const children of parentToChildren.values()) {\n\t\t\tchildren.sort((a, b) => a.timestamp.localeCompare(b.timestamp));\n\t\t}\n\n\t\tlet root = selected;\n\t\tconst visited = new Set<string>();\n\t\twhile (root.parentSessionId && !visited.has(root.sessionId)) {\n\t\t\tvisited.add(root.sessionId);\n\t\t\tconst parent = byId.get(root.parentSessionId);\n\t\t\tif (!parent) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\troot = parent;\n\t\t}\n\n\t\tconst ordered: PortableSessionExportSession[] = [];\n\t\tconst queue: PortableSessionExportRecord[] = [root];\n\t\tconst enqueued = new Set<string>([root.sessionId]);\n\t\twhile (queue.length > 0) {\n\t\t\tconst current = queue.shift();\n\t\t\tif (!current) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tordered.push({\n\t\t\t\tsessionId: current.sessionId,\n\t\t\t\tparentSessionId: current.parentSessionId,\n\t\t\t\tsessionFile: current.sessionFile,\n\t\t\t});\n\t\t\tfor (const child of parentToChildren.get(current.sessionId) ?? []) {\n\t\t\t\tif (enqueued.has(child.sessionId)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tenqueued.add(child.sessionId);\n\t\t\t\tqueue.push(child);\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tselectedSessionId: selected.sessionId,\n\t\t\tsessions: ordered,\n\t\t};\n\t}\n\n\tgetLeafId(): string | null {\n\t\treturn this.leafId;\n\t}\n\n\tgetLeafEntry(): SessionTreeEntry | undefined {\n\t\treturn this.leafId ? this.byId.get(this.leafId) : undefined;\n\t}\n\n\tgetEntry(id: string): SessionTreeEntry | undefined {\n\t\treturn this.byId.get(id);\n\t}\n\n\tgetLabel(id: string): string | undefined {\n\t\treturn this.labelsById.get(id);\n\t}\n\n\tgetChildren(parentId: string): SessionTreeEntry[] {\n\t\tconst children: SessionTreeEntry[] = [];\n\t\tfor (const entry of this.byId.values()) {\n\t\t\tif (entry.parentId === parentId) {\n\t\t\t\tchildren.push(entry);\n\t\t\t}\n\t\t}\n\t\treturn children;\n\t}\n\n\tgetBranch(fromId?: string | null): SessionTreeEntry[] {\n\t\tconst path: SessionTreeEntry[] = [];\n\t\tconst startId = fromId ?? this.leafId;\n\t\tlet current = startId ? this.byId.get(startId) : undefined;\n\t\twhile (current) {\n\t\t\tpath.unshift(current);\n\t\t\tcurrent = current.parentId ? this.byId.get(current.parentId) : undefined;\n\t\t}\n\t\treturn path;\n\t}\n\n\tgetEntries(): SessionTreeEntry[] {\n\t\treturn this.fileEntries.filter(isSessionTreeEntry);\n\t}\n\n\tgetHeader(): SessionHeaderEntry | null {\n\t\tconst header = this.fileEntries.find((e) => e.type === \"session\");\n\t\treturn header ? (header as SessionHeaderEntry) : null;\n\t}\n\n\tgetTree(): SessionTreeNode[] {\n\t\tconst entries = this.getEntries();\n\t\tconst nodeMap = new Map<string, SessionTreeNode>();\n\t\tconst roots: SessionTreeNode[] = [];\n\n\t\tfor (const entry of entries) {\n\t\t\tconst label = this.labelsById.get(entry.id);\n\t\t\tnodeMap.set(entry.id, { entry, children: [], label });\n\t\t}\n\n\t\tfor (const entry of entries) {\n\t\t\tconst node = nodeMap.get(entry.id);\n\t\t\tif (!node) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (entry.parentId === null || entry.parentId === entry.id) {\n\t\t\t\troots.push(node);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst parent = nodeMap.get(entry.parentId);\n\t\t\tif (parent) {\n\t\t\t\tparent.children.push(node);\n\t\t\t} else {\n\t\t\t\troots.push(node);\n\t\t\t}\n\t\t}\n\n\t\tconst stack: SessionTreeNode[] = [...roots];\n\t\twhile (stack.length > 0) {\n\t\t\tconst node = stack.pop();\n\t\t\tif (!node) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tnode.children.sort(\n\t\t\t\t(a, b) =>\n\t\t\t\t\tnew Date(a.entry.timestamp).getTime() -\n\t\t\t\t\tnew Date(b.entry.timestamp).getTime(),\n\t\t\t);\n\t\t\tstack.push(...node.children);\n\t\t}\n\n\t\treturn roots;\n\t}\n\n\tbranch(branchFromId: string): void {\n\t\tif (!this.byId.has(branchFromId)) {\n\t\t\tthrow new Error(`Entry ${branchFromId} not found`);\n\t\t}\n\t\tthis.leafId = branchFromId;\n\t}\n\n\tbranchWithSummary(\n\t\tbranchFromId: string | null,\n\t\tsummary: string,\n\t\toptions?: { fromId?: string; details?: unknown; fromHook?: boolean },\n\t): string {\n\t\tif (branchFromId !== null && !this.byId.has(branchFromId)) {\n\t\t\tthrow new Error(`Entry ${branchFromId} not found`);\n\t\t}\n\t\tthis.leafId = branchFromId;\n\t\tconst entry: BranchSummaryEntry = {\n\t\t\ttype: \"branch_summary\",\n\t\t\tid: this.createTreeEntryId(),\n\t\t\tparentId: branchFromId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tfromId: options?.fromId ?? branchFromId ?? \"root\",\n\t\t\tsummary,\n\t\t\tdetails: options?.details,\n\t\t\tfromHook: options?.fromHook,\n\t\t};\n\t\tthis.appendTreeEntry(entry);\n\t\treturn entry.id;\n\t}\n\n\tresetLeaf(): void {\n\t\tthis.leafId = null;\n\t}\n\n\tupdateSnapshot(state: AgentState, metadata?: SessionModelMetadata): void {\n\t\tthis._agentSnapshot = state;\n\t\tif (metadata) {\n\t\t\tthis.lastModelMetadata = metadata;\n\t\t}\n\t}\n\n\tasync flush(): Promise<void> {\n\t\tawait this.writer?.flush();\n\t}\n\n\t/**\n\t * Load all sessions for the current directory with metadata\n\t */\n\tloadAllSessions(): SessionMetadata[] {\n\t\treturn this.catalog.loadAllSessions();\n\t}\n\n\tgetSessionFileById(sessionId: string): string | null {\n\t\treturn this.catalog.getSessionFileById(sessionId);\n\t}\n\n\tasync loadEntries(sessionId: string): Promise<SessionEntry[] | null> {\n\t\tconst sessionFile = this.getSessionFileById(sessionId);\n\t\tif (!sessionFile) {\n\t\t\treturn null;\n\t\t}\n\t\treturn safeReadSessionEntries(sessionFile);\n\t}\n\n\t/**\n\t * Set the session file to an existing session\n\t */\n\tsetSessionFile(path: string): void {\n\t\t// Unregister old session file before disposing writer\n\t\tif (this.sessionFile) {\n\t\t\tunregisterActiveSessionFile(this.sessionFile);\n\t\t}\n\t\tthis.writer?.flushSync();\n\t\tthis.writer?.dispose();\n\n\t\tthis.sessionFile = resolve(path);\n\t\t// Register new session file to prevent migration race conditions\n\t\tregisterActiveSessionFile(this.sessionFile);\n\t\tscheduleSessionMigration();\n\n\t\tif (existsSync(this.sessionFile)) {\n\t\t\tconst entries = safeReadSessionEntries(this.sessionFile);\n\t\t\tconst migrated = migrateToCurrentVersion(entries);\n\t\t\tthis.fileEntries = entries;\n\t\t\tthis.sessionInitialized = entries.some((e) => e.type === \"session\");\n\t\t\tthis.rebuildIndex(entries);\n\t\t\tif (migrated) {\n\t\t\t\tthis.rewriteSessionFile();\n\t\t\t}\n\t\t\tconst header = this.getHeader();\n\t\t\tthis.sessionId = header?.id ?? uuidv4();\n\t\t\tthis.flushed = true;\n\t\t\tthis.metadataCache.seedFromFile(this.sessionFile);\n\t\t} else {\n\t\t\t// Unregister the non-existent path before initNewSession registers a new one\n\t\t\tunregisterActiveSessionFile(this.sessionFile);\n\t\t\tthis.initNewSession();\n\t\t}\n\t\tthis.initializeWriter();\n\t}\n\n\t/**\n\t * Check if we should initialize the session based on message history.\n\t * Session is initialized once we have at least 1 user message.\n\t */\n\tshouldInitializeSession(messages: AppMessage[]): boolean {\n\t\tif (this.sessionInitialized) return false;\n\n\t\tconst userMessages = messages.filter((m) => m.role === \"user\");\n\t\treturn userMessages.length >= 1;\n\t}\n\n\t/**\n\t * Create a branched session from a specific message index.\n\t * Returns the new session file path.\n\t * @param state - Current agent state\n\t * @param branchFromIndex - Index of the last message to include in the branch (exclusive)\n\t */\n\tcreateBranchedSession(state: AgentState, branchFromIndex: number): string;\n\t/**\n\t * Create a branched session from a specific tree entry id.\n\t */\n\tcreateBranchedSession(leafId: string): string;\n\tcreateBranchedSession(\n\t\tstateOrLeafId: AgentState | string,\n\t\tbranchFromIndex?: number,\n\t): string {\n\t\tif (typeof stateOrLeafId === \"string\") {\n\t\t\treturn this.createBranchedSessionFromLeaf(stateOrLeafId);\n\t\t}\n\t\tif (typeof branchFromIndex !== \"number\") {\n\t\t\tthrow new Error(\n\t\t\t\t\"branchFromIndex is required when branching from AgentState\",\n\t\t\t);\n\t\t}\n\t\treturn this.createBranchedSessionFromState(stateOrLeafId, branchFromIndex);\n\t}\n\n\tprivate createBranchedSessionFromLeaf(leafId: string): string {\n\t\treturn createBranchedSessionFromLeafFn(leafId, {\n\t\t\tsessionDir: this.sessionDir,\n\t\t\tsessionId: this.sessionId,\n\t\t\tsessionFile: this.sessionFile,\n\t\t\tbranch: this.getBranch(leafId),\n\t\t\tcontext: this.buildSessionContext(leafId),\n\t\t\theader: this.getHeader(),\n\t\t\tlabelsById: this.labelsById,\n\t\t});\n\t}\n\n\tprivate createBranchedSessionFromState(\n\t\tstate: AgentState,\n\t\tbranchFromIndex: number,\n\t): string {\n\t\treturn createBranchedSessionFromStateFn(state, branchFromIndex, {\n\t\t\tsessionDir: this.sessionDir,\n\t\t\tsessionId: this.sessionId,\n\t\t\tsessionFile: this.sessionFile,\n\t\t\tlastModelMetadata: this.lastModelMetadata,\n\t\t});\n\t}\n\n\t/**\n\t * List all sessions in the session directory\n\t */\n\tasync listSessions(options?: {\n\t\tlimit?: number;\n\t\toffset?: number;\n\t}): Promise<SessionSummary[]> {\n\t\treturn this.catalog.listSessions(options);\n\t}\n\n\t/**\n\t * Load a session by ID\n\t */\n\tasync loadSession(\n\t\tsessionId: string,\n\t\toptions: { messagesView?: SessionMessagesView } = {},\n\t): Promise<{\n\t\tid: string;\n\t\tsubject?: string;\n\t\ttitle?: string;\n\t\tsummary?: string;\n\t\tresumeSummary?: string;\n\t\tmessages: AppMessage[];\n\t\tcreatedAt: string;\n\t\tupdatedAt: string;\n\t\tmessageCount: number;\n\t\tfavorite: boolean;\n\t\ttags?: string[];\n\t\tmessagesView: SessionMessagesView;\n\t} | null> {\n\t\treturn this.catalog.loadSession(sessionId, options);\n\t}\n\n\t/**\n\t * Create a new session\n\t */\n\tasync createSession(options?: { title?: string }): Promise<{\n\t\tid: string;\n\t\ttitle?: string;\n\t\tresumeSummary?: string;\n\t\tmessages: AppMessage[];\n\t\tcreatedAt: string;\n\t\tupdatedAt: string;\n\t\tmessageCount: number;\n\t}> {\n\t\tthis.startFreshSession();\n\n\t\tif (options?.title && this.enabled) {\n\t\t\tconst entry: SessionMetaEntry = {\n\t\t\t\ttype: \"session_meta\",\n\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\ttitle: options.title,\n\t\t\t};\n\t\t\tthis.fileEntries.push(entry);\n\t\t\tthis.persistEntry(entry);\n\t\t}\n\n\t\tconst now = new Date().toISOString();\n\t\treturn {\n\t\t\tid: this.sessionId,\n\t\t\ttitle: options?.title,\n\t\t\tmessages: [],\n\t\t\tcreatedAt: now,\n\t\t\tupdatedAt: now,\n\t\t\tmessageCount: 0,\n\t\t};\n\t}\n\n\timportSessionJsonl(sourcePath: string): PortableSessionImportResult {\n\t\tconst resolvedSource = resolve(sourcePath);\n\t\tif (!existsSync(resolvedSource)) {\n\t\t\tthrow new Error(`Session file not found: ${resolvedSource}`);\n\t\t}\n\n\t\tconst entries = safeReadSessionEntries(resolvedSource);\n\t\treturn this.importPortableEntries(entries);\n\t}\n\n\timportPortableSession(sourcePath: string): {\n\t\tsessionFile: string;\n\t\tsessionId: string;\n\t\timportedCount: number;\n\t} {\n\t\tconst resolvedSource = resolve(sourcePath);\n\t\tif (!existsSync(resolvedSource)) {\n\t\t\tthrow new Error(`Session file not found: ${resolvedSource}`);\n\t\t}\n\n\t\tconst extension = extname(resolvedSource).toLowerCase();\n\t\tif (extension === \".json\") {\n\t\t\tconst portableExport = this.readPortableJsonExport(resolvedSource);\n\t\t\tif (portableExport.sessions?.length) {\n\t\t\t\treturn this.importPortableSessionBundle(portableExport);\n\t\t\t}\n\t\t\tif (portableExport.entries) {\n\t\t\t\treturn this.importPortableEntries(portableExport.entries);\n\t\t\t}\n\t\t\tthrow new Error(\n\t\t\t\t\"Portable session export is missing both entries and sessions.\",\n\t\t\t);\n\t\t}\n\n\t\tconst entries = safeReadSessionEntries(resolvedSource);\n\t\treturn this.importPortableEntries(entries);\n\t}\n\n\t/**\n\t * Delete a session\n\t */\n\tasync deleteSession(sessionId: string): Promise<void> {\n\t\tthis.catalog.deleteSession(sessionId);\n\t}\n\n\t/**\n\t * Prune old sessions based on configured limits.\n\t * Removes sessions that exceed MAX_SESSIONS count or MAX_SESSION_AGE_DAYS.\n\t * Favorites are never pruned.\n\t * Returns the number of sessions removed.\n\t */\n\tpruneSessions(): { removed: number; errors: number } {\n\t\treturn this.catalog.pruneSessions();\n\t}\n\n\tprivate importPortableEntries(\n\t\tentries: SessionEntry[],\n\t): PortableSessionImportResult {\n\t\tmigrateToCurrentVersion(entries);\n\t\tif (entries.length === 0) {\n\t\t\tthrow new Error(\"Imported session file is empty or unreadable.\");\n\t\t}\n\n\t\tconst headerIndex = entries.findIndex((entry) => entry.type === \"session\");\n\t\tif (headerIndex < 0) {\n\t\t\tthrow new Error(\"Imported session file is missing a session header.\");\n\t\t}\n\n\t\tconst header = entries[headerIndex] as SessionHeaderEntry;\n\t\tlet sessionId = header.id?.trim() || uuidv4();\n\t\tif (this.catalog.getSessionFileById(sessionId)) {\n\t\t\tsessionId = uuidv4();\n\t\t}\n\n\t\tconst timestamp = new Date().toISOString().replace(/[:.]/g, \"-\");\n\t\tconst targetFile = join(this.sessionDir, `${timestamp}_${sessionId}.jsonl`);\n\t\tconst importedHeader: SessionHeaderEntry = {\n\t\t\t...header,\n\t\t\tid: sessionId,\n\t\t\tsubject: undefined,\n\t\t};\n\t\tconst importedEntries = entries.map((entry, index) =>\n\t\t\tindex === headerIndex ? importedHeader : entry,\n\t\t);\n\n\t\twriteFileSync(\n\t\t\ttargetFile,\n\t\t\t`${importedEntries.map((entry) => JSON.stringify(entry)).join(\"\\n\")}\\n`,\n\t\t\t\"utf8\",\n\t\t);\n\n\t\treturn {\n\t\t\tsessionFile: targetFile,\n\t\t\tsessionId,\n\t\t\timportedCount: 1,\n\t\t};\n\t}\n\n\tprivate importPortableSessionBundle(\n\t\tportableExport: PortableSessionBundle,\n\t): PortableSessionImportResult {\n\t\tconst sessions = portableExport.sessions;\n\t\tif (!sessions?.length) {\n\t\t\tthrow new Error(\"Portable session export is missing bundled sessions.\");\n\t\t}\n\n\t\tconst pending = new Map(\n\t\t\tsessions.map((session) => [session.sessionId, session]),\n\t\t);\n\t\tconst importedIds = new Map<string, string>();\n\t\tconst importedFiles = new Map<string, string>();\n\t\tconst ordered: PortableSessionExportSession[] = [];\n\n\t\twhile (pending.size > 0) {\n\t\t\tlet progressed = false;\n\t\t\tfor (const [sessionId, session] of pending) {\n\t\t\t\tif (session.parentSessionId && pending.has(session.parentSessionId)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tordered.push(session);\n\t\t\t\tpending.delete(sessionId);\n\t\t\t\tprogressed = true;\n\t\t\t}\n\t\t\tif (!progressed) {\n\t\t\t\tordered.push(...pending.values());\n\t\t\t\tpending.clear();\n\t\t\t}\n\t\t}\n\n\t\tfor (const session of ordered) {\n\t\t\tconst entries = session.entries ? [...session.entries] : [];\n\t\t\tmigrateToCurrentVersion(entries);\n\t\t\tif (entries.length === 0) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Bundled session ${session.sessionId} is empty or unreadable.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst headerIndex = entries.findIndex(\n\t\t\t\t(entry) => entry.type === \"session\",\n\t\t\t);\n\t\t\tif (headerIndex < 0) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Bundled session ${session.sessionId} is missing a session header.`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst header = entries[headerIndex] as SessionHeaderEntry;\n\t\t\tlet importedSessionId = header.id?.trim() || uuidv4();\n\t\t\tif (this.catalog.getSessionFileById(importedSessionId)) {\n\t\t\t\timportedSessionId = uuidv4();\n\t\t\t}\n\t\t\tconst timestamp = new Date().toISOString().replace(/[:.]/g, \"-\");\n\t\t\tconst targetFile = join(\n\t\t\t\tthis.sessionDir,\n\t\t\t\t`${timestamp}_${importedSessionId}.jsonl`,\n\t\t\t);\n\t\t\tconst importedParentSessionId = session.parentSessionId\n\t\t\t\t? importedIds.get(session.parentSessionId)\n\t\t\t\t: undefined;\n\t\t\tconst importedHeader: SessionHeaderEntry = {\n\t\t\t\t...header,\n\t\t\t\tid: importedSessionId,\n\t\t\t\tsubject: undefined,\n\t\t\t\tparentSession: importedParentSessionId,\n\t\t\t\tbranchedFrom: session.parentSessionId\n\t\t\t\t\t? importedFiles.get(session.parentSessionId)\n\t\t\t\t\t: undefined,\n\t\t\t};\n\t\t\tconst importedEntries = entries.map((entry, index) =>\n\t\t\t\tindex === headerIndex ? importedHeader : entry,\n\t\t\t);\n\n\t\t\twriteFileSync(\n\t\t\t\ttargetFile,\n\t\t\t\t`${importedEntries.map((entry) => JSON.stringify(entry)).join(\"\\n\")}\\n`,\n\t\t\t\t\"utf8\",\n\t\t\t);\n\t\t\timportedIds.set(session.sessionId, importedSessionId);\n\t\t\timportedFiles.set(session.sessionId, targetFile);\n\t\t}\n\n\t\tconst selectedSourceSessionId =\n\t\t\tportableExport.sessionId ?? sessions[0]?.sessionId;\n\t\tconst selectedSessionId =\n\t\t\t(selectedSourceSessionId\n\t\t\t\t? importedIds.get(selectedSourceSessionId)\n\t\t\t\t: undefined) ?? importedIds.get(sessions[0]!.sessionId)!;\n\t\tconst selectedSessionFile =\n\t\t\timportedFiles.get(selectedSourceSessionId ?? sessions[0]!.sessionId) ??\n\t\t\timportedFiles.get(sessions[0]!.sessionId)!;\n\n\t\treturn {\n\t\t\tsessionFile: selectedSessionFile,\n\t\t\tsessionId: selectedSessionId,\n\t\t\timportedCount: ordered.length,\n\t\t};\n\t}\n\n\tprivate readPortableJsonExport(sourcePath: string): PortableSessionBundle {\n\t\tlet parsed: unknown;\n\t\ttry {\n\t\t\tparsed = JSON.parse(readFileSync(sourcePath, \"utf8\"));\n\t\t} catch (error) {\n\t\t\tthrow new Error(\n\t\t\t\t`Portable session export is not valid JSON: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t);\n\t\t}\n\n\t\tif (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n\t\t\tthrow new Error(\"Portable session export must be a JSON object.\");\n\t\t}\n\n\t\tconst portableExport = parsed as {\n\t\t\tformat?: unknown;\n\t\t\tsessionId?: unknown;\n\t\t\tentries?: unknown;\n\t\t\tsessions?: unknown;\n\t\t};\n\t\tconst format =\n\t\t\ttypeof portableExport.format === \"string\"\n\t\t\t\t? portableExport.format\n\t\t\t\t: undefined;\n\t\tif (format !== PORTABLE_SESSION_EXPORT_FORMAT) {\n\t\t\tthrow new Error(\n\t\t\t\t`Portable session export format must be ${PORTABLE_SESSION_EXPORT_FORMAT}.`,\n\t\t\t);\n\t\t}\n\n\t\tconst parseEntries = (entries: unknown[], path: string): SessionEntry[] =>\n\t\t\tentries.map((entry, index) => {\n\t\t\t\tconst parsedEntry = tryParseSessionEntry(JSON.stringify(entry));\n\t\t\t\tif (!parsedEntry) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`${path} contains an invalid entry at index ${index}.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn parsedEntry;\n\t\t\t});\n\n\t\tconst entries = Array.isArray(portableExport.entries)\n\t\t\t? parseEntries(portableExport.entries, \"Portable session export\")\n\t\t\t: undefined;\n\t\tconst sessions = Array.isArray(portableExport.sessions)\n\t\t\t? portableExport.sessions.map((session, index) => {\n\t\t\t\t\tif (\n\t\t\t\t\t\t!session ||\n\t\t\t\t\t\ttypeof session !== \"object\" ||\n\t\t\t\t\t\tArray.isArray(session)\n\t\t\t\t\t) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Portable session export contains an invalid bundled session at index ${index}.`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tconst parsedSession = session as {\n\t\t\t\t\t\tsessionId?: unknown;\n\t\t\t\t\t\tparentSessionId?: unknown;\n\t\t\t\t\t\tentries?: unknown;\n\t\t\t\t\t};\n\t\t\t\t\tif (typeof parsedSession.sessionId !== \"string\") {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Portable session export is missing a sessionId for bundled session ${index}.`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tif (!Array.isArray(parsedSession.entries)) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Portable session export is missing entries for bundled session ${parsedSession.sessionId}.`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsessionId: parsedSession.sessionId,\n\t\t\t\t\t\tparentSessionId:\n\t\t\t\t\t\t\ttypeof parsedSession.parentSessionId === \"string\"\n\t\t\t\t\t\t\t\t? parsedSession.parentSessionId\n\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\tsessionFile: join(\n\t\t\t\t\t\t\tthis.sessionDir,\n\t\t\t\t\t\t\t`${parsedSession.sessionId}.jsonl`,\n\t\t\t\t\t\t),\n\t\t\t\t\t\tentries: parseEntries(\n\t\t\t\t\t\t\tparsedSession.entries,\n\t\t\t\t\t\t\t`Bundled session ${parsedSession.sessionId}`,\n\t\t\t\t\t\t),\n\t\t\t\t\t} satisfies PortableSessionExportSession;\n\t\t\t\t})\n\t\t\t: undefined;\n\n\t\tif (!entries && !sessions?.length) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Portable session export is missing both entries and bundled sessions.\",\n\t\t\t);\n\t\t}\n\n\t\treturn {\n\t\t\tformat,\n\t\t\texportedAt:\n\t\t\t\ttypeof (portableExport as { exportedAt?: unknown }).exportedAt ===\n\t\t\t\t\"string\"\n\t\t\t\t\t? (portableExport as { exportedAt: string }).exportedAt\n\t\t\t\t\t: new Date().toISOString(),\n\t\t\tsessionId:\n\t\t\t\ttypeof portableExport.sessionId === \"string\"\n\t\t\t\t\t? portableExport.sessionId\n\t\t\t\t\t: undefined,\n\t\t\tentries,\n\t\t\tsessions,\n\t\t};\n\t}\n\n\tprivate buildPortableSessionRecords(): PortableSessionExportRecord[] {\n\t\tconst records: PortableSessionExportRecord[] = [];\n\t\tconst filePaths = readdirSync(this.sessionDir)\n\t\t\t.filter((fileName) => fileName.endsWith(\".jsonl\"))\n\t\t\t.map((fileName) => resolve(join(this.sessionDir, fileName)));\n\n\t\tfor (const filePath of filePaths) {\n\t\t\tconst entries = safeReadSessionEntries(filePath);\n\t\t\tconst header = entries.find((entry) => entry.type === \"session\") as\n\t\t\t\t| SessionHeaderEntry\n\t\t\t\t| undefined;\n\t\t\tif (!header?.id) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\trecords.push({\n\t\t\t\tsessionId: header.id,\n\t\t\t\tsessionFile: filePath,\n\t\t\t\ttimestamp: header.timestamp,\n\t\t\t\tparentSessionId: header.parentSession,\n\t\t\t\tparentSessionFile: header.branchedFrom\n\t\t\t\t\t? resolve(header.branchedFrom)\n\t\t\t\t\t: undefined,\n\t\t\t});\n\t\t}\n\n\t\tconst byPath = new Map(\n\t\t\trecords.map((record) => [resolve(record.sessionFile), record]),\n\t\t);\n\t\tfor (const record of records) {\n\t\t\tif (!record.parentSessionId && record.parentSessionFile) {\n\t\t\t\trecord.parentSessionId = byPath.get(\n\t\t\t\t\tresolve(record.parentSessionFile),\n\t\t\t\t)?.sessionId;\n\t\t\t}\n\t\t}\n\n\t\trecords.sort((a, b) => a.timestamp.localeCompare(b.timestamp));\n\t\treturn records;\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/session/manager.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Session Manager - Conversation Persistence and Recovery\n *\n * Sessions are stored as JSONL (JSON Lines) files. Each entry is append-only and\n * may include tree metadata (id/parentId) to support branching and navigation.\n *\n * Tree entries form a conversation tree where the \"leaf\" pointer tracks the\n * active branch. The session file is append-only; branching updates the leaf\n * pointer without modifying history.\n */\n\nimport {\n\tappendFileSync,\n\texistsSync,\n\tmkdirSync,\n\treadFileSync,\n\treaddirSync,\n\tstatSync,\n\twriteFileSync,\n} from \"node:fs\";\nimport { extname, join, resolve } from \"node:path\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport type {\n\tAgentState,\n\tAppMessage,\n\tImageContent,\n\tTextContent,\n} from \"../agent/types.js\";\nimport { SESSION_CONFIG, getAgentDir } from \"../config/constants.js\";\nimport { getRegisteredModels } from \"../models/registry.js\";\nimport type { RegisteredModel } from \"../models/registry.js\";\nimport { queueSharedMemoryUpdate } from \"../shared-memory/client.js\";\nimport { recordMaestroPromptVariantSelected } from \"../telemetry/maestro-event-bus.js\";\nimport { createLogger } from \"../utils/logger.js\";\nimport { resolveEnvPath } from \"../utils/path-expansion.js\";\nimport { SessionFileWriter } from \"./file-writer.js\";\nimport {\n\tSessionMetadataCache,\n\ttype SessionModelMetadata,\n} from \"./metadata-cache.js\";\nimport {\n\tmigrateToCurrentVersion,\n\tregisterActiveSessionFile,\n\tscheduleSessionMigration,\n\tunregisterActiveSessionFile,\n} from \"./migration.js\";\nimport { sanitizeSessionScope } from \"./scope.js\";\nimport {\n\tcreateBranchedSessionFromLeaf as createBranchedSessionFromLeafFn,\n\tcreateBranchedSessionFromState as createBranchedSessionFromStateFn,\n} from \"./session-branch.js\";\nimport { SessionCatalog } from \"./session-catalog.js\";\nimport {\n\ttype SessionContextSnapshot,\n\tbuildSessionContextFromEntries,\n\tgenerateEntryId,\n\tsafeReadSessionEntries,\n} from \"./session-context.js\";\nimport { syncSessionMemory } from \"./session-memory.js\";\nimport {\n\tapplyAttachmentExtracts,\n\tsanitizeMessageForSession,\n} from \"./session-sanitize.js\";\nimport {\n\ttype AttachmentExtractedEntry,\n\ttype BranchSummaryEntry,\n\tCURRENT_SESSION_VERSION,\n\ttype CompactionEntry,\n\ttype CustomEntry,\n\ttype CustomMessageEntry,\n\ttype LabelEntry,\n\ttype ModelChangeEntry,\n\ttype SessionEntry,\n\ttype SessionHeaderEntry,\n\ttype SessionMessageEntry,\n\ttype SessionMessagesView,\n\ttype SessionMetaEntry,\n\ttype SessionMetadata,\n\ttype SessionSummary,\n\ttype SessionTreeEntry,\n\ttype SessionTreeNode,\n\ttype ThinkingLevelChangeEntry,\n\tgetPersistedSessionPromptContextManifest,\n\tisSessionTreeEntry,\n\ttryParseSessionEntry,\n} from \"./types.js\";\n\nexport interface SessionManagerOptions {\n\t/** Override the base session directory (before per-cwd scoping). */\n\tsessionDir?: string;\n\t/** Optional scope key (e.g., auth subject) for per-user session isolation. */\n\tsessionScope?: string;\n}\n\nconst logger = createLogger(\"session-manager\");\nconst PORTABLE_SESSION_EXPORT_FORMAT = \"maestro-session-export.v1\";\n\ninterface PortableSessionBundle {\n\tformat: string;\n\texportedAt: string;\n\tsessionId?: string;\n\tentries?: SessionEntry[];\n\tsessions?: PortableSessionExportSession[];\n}\n\nexport interface PortableSessionExportSession {\n\tsessionId: string;\n\tparentSessionId?: string;\n\tsessionFile: string;\n\tentries?: SessionEntry[];\n}\n\nexport interface PortableSessionImportResult {\n\tsessionFile: string;\n\tsessionId: string;\n\timportedCount: number;\n}\n\ninterface PortableSessionExportRecord {\n\tsessionId: string;\n\tsessionFile: string;\n\ttimestamp: string;\n\tparentSessionId?: string;\n\tparentSessionFile?: string;\n}\n\n// Re-export SessionModelMetadata for backward compatibility\nexport type { SessionModelMetadata } from \"./metadata-cache.js\";\n\nexport type {\n\tAttachmentExtractedEntry,\n\tBranchSummaryEntry,\n\tCompactionEntry,\n\tSessionHeaderEntry,\n\tSessionMessageEntry,\n\tSessionMetaEntry,\n\tSessionMigrationState,\n\tSessionToolInfo,\n\tSessionTreeEntry,\n\tSessionTreeNode,\n} from \"./types.js\";\n\nexport {\n\tgetMigrationState,\n\tregisterActiveSessionFile,\n\tresetMigrationState,\n\trunSessionMigration,\n\tscheduleSessionMigration,\n\tunregisterActiveSessionFile,\n} from \"./migration.js\";\n\nexport function toSessionModelMetadata(\n\tmodel: RegisteredModel,\n): SessionModelMetadata {\n\treturn {\n\t\tprovider: model.provider,\n\t\tmodelId: model.id,\n\t\tproviderName: model.providerName,\n\t\tname: model.name,\n\t\tbaseUrl: model.baseUrl,\n\t\treasoning: model.reasoning,\n\t\tcontextWindow: model.contextWindow,\n\t\tmaxTokens: model.maxTokens,\n\t\tsource: model.source,\n\t};\n}\n\nfunction findRegisteredModel(modelKey: string): RegisteredModel | undefined {\n\tconst [provider, modelId] = modelKey.split(\"/\");\n\tif (!provider || !modelId) {\n\t\treturn undefined;\n\t}\n\treturn getRegisteredModels().find(\n\t\t(entry) => entry.provider === provider && entry.id === modelId,\n\t);\n}\n\n/**\n * Main session management class.\n */\nexport class SessionManager {\n\t/** Unique identifier for this session (UUID v4) */\n\tprivate sessionId!: string;\n\t/** Absolute path to the session JSONL file */\n\tprivate sessionFile!: string;\n\t/** Directory containing all session files for current project */\n\tprivate sessionDir: string;\n\t/** Optional scope for per-user session isolation */\n\tprivate sessionScope?: string;\n\t/** Optional override for base session directory */\n\tprivate sessionDirOverride?: string;\n\t/** Whether session persistence is enabled (disabled by --no-session) */\n\tprivate enabled = true;\n\t/** Whether the session header has been written */\n\tprivate sessionInitialized = false;\n\t/** Buffered file writer for efficient I/O */\n\tprivate writer?: SessionFileWriter;\n\t/** Snapshot of agent state for recovery purposes */\n\tprivate _agentSnapshot?: AgentState;\n\t/** Metadata for the last used model */\n\tprivate lastModelMetadata?: SessionModelMetadata;\n\t/** Cache for current model/thinking level */\n\tprivate metadataCache = new SessionMetadataCache();\n\tprivate readonly catalog: SessionCatalog;\n\n\tprivate fileEntries: SessionEntry[] = [];\n\tprivate byId: Map<string, SessionTreeEntry> = new Map();\n\tprivate labelsById: Map<string, string> = new Map();\n\tprivate leafId: string | null = null;\n\tprivate flushed = false;\n\tprivate _hasAssistantMessage = false;\n\n\t/**\n\t * Creates a new SessionManager.\n\t *\n\t * @param continueSession - If true, loads the most recently modified session\n\t * @param customSessionPath - Optional specific session file to load\n\t * @param options - Optional session directory/scope overrides\n\t */\n\tconstructor(\n\t\tcontinueSession = false,\n\t\tcustomSessionPath?: string,\n\t\toptions: SessionManagerOptions = {},\n\t) {\n\t\tthis.sessionScope = options.sessionScope;\n\t\tthis.sessionDirOverride = options.sessionDir;\n\t\tthis.sessionDir = this.getSessionDirectory();\n\t\tthis.catalog = new SessionCatalog({\n\t\t\tsessionDir: this.sessionDir,\n\t\t\tbeforeRead: () => this.writer?.flushSync(),\n\t\t\tgetCurrentSessionId: () => this.sessionId,\n\t\t});\n\n\t\tif (customSessionPath) {\n\t\t\t// Use custom session file path\n\t\t\tthis.sessionFile = resolve(customSessionPath);\n\t\t\tthis.setSessionFile(this.sessionFile);\n\t\t} else if (continueSession) {\n\t\t\tconst mostRecent = this.findMostRecentlyModifiedSession();\n\t\t\tif (mostRecent) {\n\t\t\t\tthis.sessionFile = mostRecent;\n\t\t\t\tthis.setSessionFile(this.sessionFile);\n\t\t\t} else {\n\t\t\t\tthis.initNewSession();\n\t\t\t}\n\t\t} else {\n\t\t\tthis.initNewSession();\n\t\t}\n\n\t\tthis.initializeWriter();\n\t\tif (this.sessionInitialized) {\n\t\t\tthis.metadataCache.seedFromFile(this.sessionFile);\n\t\t}\n\t}\n\n\t/** Disable session saving (for --no-session mode) */\n\tdisable() {\n\t\tthis.enabled = false;\n\t\t// Unregister session file before disabling\n\t\tif (this.sessionFile) {\n\t\t\tunregisterActiveSessionFile(this.sessionFile);\n\t\t}\n\t\tthis.writer?.flushSync();\n\t\tthis.writer?.dispose();\n\t\tthis.writer = undefined;\n\t\tthis.fileEntries = [];\n\t\tthis.byId.clear();\n\t\tthis.labelsById.clear();\n\t\tthis.leafId = null;\n\t}\n\n\tprivate initializeWriter(): void {\n\t\tif (!this.enabled) {\n\t\t\tthis.writer = undefined;\n\t\t\treturn;\n\t\t}\n\t\tthis.writer = new SessionFileWriter(this.sessionFile);\n\t}\n\n\tprivate getSessionDirectory(): string {\n\t\tconst cwd = process.cwd();\n\t\tconst safePath = `--${cwd.replace(/^[/\\\\]/, \"\").replace(/[/\\\\:]/g, \"-\")}--`;\n\n\t\tconst baseOverride =\n\t\t\tresolveEnvPath(this.sessionDirOverride) ??\n\t\t\tresolveEnvPath(process.env.MAESTRO_SESSION_DIR);\n\t\tconst baseDir =\n\t\t\tbaseOverride ??\n\t\t\tSESSION_CONFIG.DEFAULT_DIR ??\n\t\t\tjoin(getAgentDir(), \"sessions\");\n\n\t\tconst scope = this.sessionScope\n\t\t\t? sanitizeSessionScope(this.sessionScope)\n\t\t\t: \"\";\n\t\tconst sessionDir = scope\n\t\t\t? join(baseDir, scope, safePath)\n\t\t\t: join(baseDir, safePath);\n\t\tif (!existsSync(sessionDir)) {\n\t\t\tmkdirSync(sessionDir, { recursive: true });\n\t\t}\n\t\treturn sessionDir;\n\t}\n\n\tprivate initNewSession(): void {\n\t\tthis.sessionId = uuidv4();\n\t\tconst timestamp = new Date().toISOString().replace(/[:.]/g, \"-\");\n\t\tthis.sessionFile = join(\n\t\t\tthis.sessionDir,\n\t\t\t`${timestamp}_${this.sessionId}.jsonl`,\n\t\t);\n\t\t// Register new session file to prevent migration race conditions\n\t\tregisterActiveSessionFile(this.sessionFile);\n\t\tthis.fileEntries = [];\n\t\tthis.byId.clear();\n\t\tthis.labelsById.clear();\n\t\tthis.leafId = null;\n\t\tthis.flushed = false;\n\t\tthis._hasAssistantMessage = false;\n\t\tthis.sessionInitialized = false;\n\t\tthis.metadataCache.reset();\n\t}\n\n\tstartFreshSession(): void {\n\t\tif (!this.enabled) {\n\t\t\treturn;\n\t\t}\n\t\tthis.writer?.flushSync();\n\t\tthis.writer?.dispose();\n\t\tthis.writer = undefined;\n\t\tthis._agentSnapshot = undefined;\n\t\tthis.lastModelMetadata = undefined;\n\t\t// Unregister old session file before creating new one\n\t\tif (this.sessionFile) {\n\t\t\tunregisterActiveSessionFile(this.sessionFile);\n\t\t}\n\t\tthis.initNewSession();\n\t\tthis.initializeWriter();\n\t}\n\n\t/**\n\t * Reset session state for /clear command - clears pending messages and starts new session\n\t */\n\treset(): void {\n\t\tthis.writer?.flushSync();\n\t\tthis.writer?.dispose();\n\t\tthis.writer = undefined;\n\n\t\t// Unregister old session file before creating new one\n\t\tif (this.sessionFile) {\n\t\t\tunregisterActiveSessionFile(this.sessionFile);\n\t\t}\n\n\t\tthis.fileEntries = [];\n\t\tthis.byId.clear();\n\t\tthis.labelsById.clear();\n\t\tthis.leafId = null;\n\t\tthis.flushed = false;\n\t\tthis._hasAssistantMessage = false;\n\t\tthis.sessionInitialized = false;\n\t\tthis.metadataCache.reset();\n\t\tthis._agentSnapshot = undefined;\n\t\tthis.lastModelMetadata = undefined;\n\n\t\tthis.initNewSession();\n\t\tthis.initializeWriter();\n\t}\n\n\tprivate findMostRecentlyModifiedSession(): string | null {\n\t\ttry {\n\t\t\tconst files = readdirSync(this.sessionDir)\n\t\t\t\t.filter((f) => f.endsWith(\".jsonl\"))\n\t\t\t\t.map((f) => ({\n\t\t\t\t\tpath: join(this.sessionDir, f),\n\t\t\t\t\tmtime: statSync(join(this.sessionDir, f)).mtime,\n\t\t\t\t}))\n\t\t\t\t.sort((a, b) => b.mtime.getTime() - a.mtime.getTime());\n\n\t\t\treturn files[0]?.path || null;\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate rebuildIndex(entries: SessionEntry[]): void {\n\t\tthis.byId.clear();\n\t\tthis.labelsById.clear();\n\t\tthis.leafId = null;\n\t\tthis._hasAssistantMessage = false;\n\n\t\tfor (const entry of entries) {\n\t\t\tif (!isSessionTreeEntry(entry)) continue;\n\t\t\tthis.byId.set(entry.id, entry);\n\t\t\tthis.leafId = entry.id;\n\t\t\tif (entry.type === \"label\") {\n\t\t\t\tif (entry.label) {\n\t\t\t\t\tthis.labelsById.set(entry.targetId, entry.label);\n\t\t\t\t} else {\n\t\t\t\t\tthis.labelsById.delete(entry.targetId);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (entry.type === \"message\" && entry.message.role === \"assistant\") {\n\t\t\t\tthis._hasAssistantMessage = true;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate rewriteSessionFile(): void {\n\t\tif (!this.enabled || !this.sessionFile) return;\n\t\tconst content = `${this.fileEntries.map((e) => JSON.stringify(e)).join(\"\\n\")}\\n`;\n\t\twriteFileSync(this.sessionFile, content);\n\t}\n\n\tprivate persistEntry(entry: SessionEntry): void {\n\t\tif (!this.enabled || !this.writer || !this.sessionFile) return;\n\t\tif (!this.sessionInitialized) return;\n\n\t\tif (!this.flushed) {\n\t\t\tfor (const e of this.fileEntries) {\n\t\t\t\tthis.writer.write(e);\n\t\t\t}\n\t\t\tthis.writer.flushSync();\n\t\t\tthis.flushed = true;\n\t\t\treturn;\n\t\t}\n\n\t\tthis.writer.write(entry);\n\t}\n\n\tprivate appendTreeEntry(entry: SessionTreeEntry): void {\n\t\tthis.fileEntries.push(entry);\n\t\tthis.byId.set(entry.id, entry);\n\t\tthis.leafId = entry.id;\n\t\tif (entry.type === \"label\") {\n\t\t\tif (entry.label) {\n\t\t\t\tthis.labelsById.set(entry.targetId, entry.label);\n\t\t\t} else {\n\t\t\t\tthis.labelsById.delete(entry.targetId);\n\t\t\t}\n\t\t}\n\t\tif (entry.type === \"message\" && entry.message.role === \"assistant\") {\n\t\t\tthis._hasAssistantMessage = true;\n\t\t}\n\t\tthis.persistEntry(entry);\n\t}\n\n\tprivate createTreeEntryId(): string {\n\t\treturn generateEntryId(this.byId);\n\t}\n\n\tstartSession(state: AgentState, options?: { subject?: string }): void {\n\t\tif (!this.enabled || this.sessionInitialized) return;\n\n\t\tconst modelKeyFromState = `${state.model.provider}/${state.model.id}`;\n\t\tconst latestModelChange = this.getLatestModelChange();\n\t\tconst latestThinkingLevel = this.getLatestThinkingLevel();\n\t\tconst sessionModelKey = latestModelChange?.model ?? modelKeyFromState;\n\t\tconst primaryMetadata =\n\t\t\tlatestModelChange?.modelMetadata ??\n\t\t\t(sessionModelKey === modelKeyFromState\n\t\t\t\t? toSessionModelMetadata(state.model as RegisteredModel)\n\t\t\t\t: undefined);\n\t\tconst fallbackMetadata = this.resolveModelMetadata(sessionModelKey);\n\t\tconst provisionalHeaderIndex = this.fileEntries.findIndex(\n\t\t\t(existing) =>\n\t\t\t\texisting.type === \"session\" &&\n\t\t\t\texisting.id === this.sessionId &&\n\t\t\t\texisting.provisional === true,\n\t\t);\n\t\tconst provisionalHeader =\n\t\t\tprovisionalHeaderIndex >= 0\n\t\t\t\t? (this.fileEntries[provisionalHeaderIndex] as SessionHeaderEntry)\n\t\t\t\t: undefined;\n\t\tconst timestamp = provisionalHeader?.timestamp ?? new Date().toISOString();\n\t\tconst entry: SessionHeaderEntry = {\n\t\t\ttype: \"session\",\n\t\t\tversion: CURRENT_SESSION_VERSION,\n\t\t\tid: this.sessionId,\n\t\t\ttimestamp,\n\t\t\tcwd: process.cwd(),\n\t\t\tsubject: options?.subject || undefined,\n\t\t\tmodel: sessionModelKey,\n\t\t\tmodelMetadata: primaryMetadata ?? fallbackMetadata,\n\t\t\tthinkingLevel: latestThinkingLevel ?? state.thinkingLevel,\n\t\t\tsystemPrompt: state.systemPrompt,\n\t\t\tpromptMetadata: state.promptMetadata,\n\t\t\tpromptContextManifest: getPersistedSessionPromptContextManifest(state),\n\t\t\tunifiedContextManifest: state.unifiedContextManifest,\n\t\t\ttools: state.tools.map((tool) => ({\n\t\t\t\tname: tool.name,\n\t\t\t\tlabel: tool.label,\n\t\t\t\tdescription: tool.description,\n\t\t\t})),\n\t\t};\n\t\tthis.metadataCache.apply(entry);\n\t\tif (provisionalHeaderIndex >= 0) {\n\t\t\tthis.fileEntries[provisionalHeaderIndex] = entry;\n\t\t} else {\n\t\t\tthis.fileEntries.unshift(entry);\n\t\t}\n\t\tthis.sessionInitialized = true;\n\n\t\tif (provisionalHeaderIndex >= 0) {\n\t\t\tthis.rewriteSessionFile();\n\t\t\tthis.flushed = true;\n\t\t} else {\n\t\t\tthis.persistEntry(entry);\n\t\t}\n\n\t\tqueueSharedMemoryUpdate({\n\t\t\tsessionId: this.sessionId,\n\t\t\tstate: {\n\t\t\t\tsessionId: this.sessionId,\n\t\t\t\tcwd: process.cwd(),\n\t\t\t\tmodel: sessionModelKey,\n\t\t\t\tupdatedAt: entry.timestamp,\n\t\t\t\tsource: \"maestro\",\n\t\t\t},\n\t\t\tevent: {\n\t\t\t\ttype: \"maestro.session.started\",\n\t\t\t\tpayload: {\n\t\t\t\t\tsessionId: this.sessionId,\n\t\t\t\t\tmodel: sessionModelKey,\n\t\t\t\t\ttimestamp: entry.timestamp,\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\tif (state.promptMetadata) {\n\t\t\trecordMaestroPromptVariantSelected({\n\t\t\t\tprompt_metadata: state.promptMetadata,\n\t\t\t\tcorrelation: {\n\t\t\t\t\tsession_id: this.sessionId,\n\t\t\t\t},\n\t\t\t\tselected_at: entry.timestamp,\n\t\t\t});\n\t\t}\n\n\t\t// Auto-prune old sessions in the background (non-blocking)\n\t\tif (\n\t\t\tSESSION_CONFIG.MAX_SESSIONS > 0 ||\n\t\t\tSESSION_CONFIG.MAX_SESSION_AGE_DAYS > 0\n\t\t) {\n\t\t\tsetTimeout(() => {\n\t\t\t\ttry {\n\t\t\t\t\tconst result = this.pruneSessions();\n\t\t\t\t\tif (result.removed > 0) {\n\t\t\t\t\t\tlogger.debug(\"Auto-pruned sessions\", result);\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger.error(\n\t\t\t\t\t\t\"Session auto-prune failed\",\n\t\t\t\t\t\terror instanceof Error ? error : undefined,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}, 5000);\n\t\t}\n\t}\n\n\tsaveMessage(message: AppMessage): void {\n\t\tif (!this.enabled) return;\n\t\tconst sanitizedMessage = sanitizeMessageForSession(message);\n\t\tconst entry: SessionMessageEntry = {\n\t\t\ttype: \"message\",\n\t\t\tid: this.createTreeEntryId(),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tmessage: sanitizedMessage,\n\t\t};\n\n\t\tthis.appendTreeEntry(entry);\n\n\t\tqueueSharedMemoryUpdate({\n\t\t\tsessionId: this.sessionId,\n\t\t\tstate: {\n\t\t\t\tsessionId: this.sessionId,\n\t\t\t\tupdatedAt: entry.timestamp,\n\t\t\t\tlastMessageId: entry.id,\n\t\t\t\tlastMessageRole: message.role,\n\t\t\t\tsource: \"maestro\",\n\t\t\t},\n\t\t\tevent: {\n\t\t\t\ttype: \"maestro.message.saved\",\n\t\t\t\tpayload: {\n\t\t\t\t\tsessionId: this.sessionId,\n\t\t\t\t\tmessageId: entry.id,\n\t\t\t\t\trole: message.role,\n\t\t\t\t\ttimestamp: entry.timestamp,\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\t}\n\n\tsaveThinkingLevelChange(thinkingLevel: string): void {\n\t\tif (!this.enabled) return;\n\t\tconst entry: ThinkingLevelChangeEntry = {\n\t\t\ttype: \"thinking_level_change\",\n\t\t\tid: this.createTreeEntryId(),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tthinkingLevel,\n\t\t};\n\t\tthis.metadataCache.apply(entry);\n\n\t\tthis.appendTreeEntry(entry);\n\t}\n\n\tsaveModelChange(model: string, metadata?: SessionModelMetadata): void {\n\t\tif (!this.enabled) return;\n\t\tconst entry: ModelChangeEntry = {\n\t\t\ttype: \"model_change\",\n\t\t\tid: this.createTreeEntryId(),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tmodel,\n\t\t\tmodelMetadata: metadata,\n\t\t};\n\t\tthis.metadataCache.apply(entry);\n\n\t\tthis.appendTreeEntry(entry);\n\t}\n\n\tappendCustomEntry(customType: string, data?: unknown): void {\n\t\tif (!this.enabled) return;\n\t\tconst entry: CustomEntry = {\n\t\t\ttype: \"custom\",\n\t\t\tcustomType,\n\t\t\tdata,\n\t\t\tid: this.createTreeEntryId(),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t};\n\t\tthis.appendTreeEntry(entry);\n\t}\n\n\tappendCustomMessageEntry<T = unknown>(\n\t\tcustomType: string,\n\t\tcontent: string | (TextContent | ImageContent)[],\n\t\tdisplay: boolean,\n\t\tdetails?: T,\n\t): void {\n\t\tif (!this.enabled) return;\n\t\tconst entry: CustomMessageEntry<T> = {\n\t\t\ttype: \"custom_message\",\n\t\t\tcustomType,\n\t\t\tcontent,\n\t\t\tdisplay,\n\t\t\tdetails,\n\t\t\tid: this.createTreeEntryId(),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t};\n\t\tthis.appendTreeEntry(entry);\n\t}\n\n\tappendBranchSummary(\n\t\tsummary: string,\n\t\toptions?: { fromId?: string; details?: unknown; fromHook?: boolean },\n\t): void {\n\t\tif (!this.enabled) return;\n\t\tconst fromId = options?.fromId ?? this.leafId ?? \"root\";\n\t\tconst entry: BranchSummaryEntry = {\n\t\t\ttype: \"branch_summary\",\n\t\t\tid: this.createTreeEntryId(),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tfromId,\n\t\t\tsummary,\n\t\t\tdetails: options?.details,\n\t\t\tfromHook: options?.fromHook,\n\t\t};\n\t\tthis.appendTreeEntry(entry);\n\t}\n\n\tappendLabel(targetId: string, label: string | undefined): void {\n\t\tif (!this.byId.has(targetId)) {\n\t\t\tthrow new Error(`Entry ${targetId} not found`);\n\t\t}\n\t\tconst entry: LabelEntry = {\n\t\t\ttype: \"label\",\n\t\t\tid: this.createTreeEntryId(),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\ttargetId,\n\t\t\tlabel,\n\t\t};\n\t\tthis.appendTreeEntry(entry);\n\t}\n\n\t/**\n\t * Save a compaction event to the session file.\n\t */\n\tsaveCompaction(\n\t\tsummary: string,\n\t\tfirstKeptEntryIndex: number,\n\t\ttokensBefore: number,\n\t\toptions?: {\n\t\t\tauto?: boolean;\n\t\t\tcustomInstructions?: string;\n\t\t\tfirstKeptEntryId?: string;\n\t\t},\n\t): void {\n\t\tif (!this.enabled) return;\n\t\tconst context = this.buildSessionContext();\n\t\tconst resolvedEntry = options?.firstKeptEntryId\n\t\t\t? this.getEntry(options.firstKeptEntryId)\n\t\t\t: undefined;\n\t\tconst targetEntry =\n\t\t\tresolvedEntry ?? context.messageEntries[firstKeptEntryIndex];\n\t\tconst fallbackEntry = this.getEntries()[0];\n\t\tconst firstKeptEntryId =\n\t\t\ttargetEntry?.id ?? this.leafId ?? fallbackEntry?.id;\n\t\tif (!firstKeptEntryId) {\n\t\t\tlogger.warn(\"Failed to resolve compaction cut point; skipping save\");\n\t\t\treturn;\n\t\t}\n\t\tconst entry: CompactionEntry = {\n\t\t\ttype: \"compaction\",\n\t\t\tid: this.createTreeEntryId(),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tsummary,\n\t\t\tfirstKeptEntryId,\n\t\t\ttokensBefore,\n\t\t\tauto: options?.auto,\n\t\t\tcustomInstructions: options?.customInstructions,\n\t\t};\n\n\t\tthis.appendTreeEntry(entry);\n\t\tthis.writer?.flushSync();\n\t}\n\n\t/**\n\t * Find the most recent compaction entry in the current session.\n\t */\n\tfindLatestCompaction(): CompactionEntry | null {\n\t\tfor (let i = this.fileEntries.length - 1; i >= 0; i--) {\n\t\t\tconst entry = this.fileEntries[i]!;\n\t\t\tif (entry.type === \"compaction\") {\n\t\t\t\treturn entry as CompactionEntry;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate getLatestThinkingLevel(): string | undefined {\n\t\tfor (let i = this.fileEntries.length - 1; i >= 0; i--) {\n\t\t\tconst entry = this.fileEntries[i]!;\n\t\t\tif (entry.type === \"thinking_level_change\") {\n\t\t\t\treturn entry.thinkingLevel;\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tprivate getLatestModelChange(): ModelChangeEntry | undefined {\n\t\tfor (let i = this.fileEntries.length - 1; i >= 0; i--) {\n\t\t\tconst entry = this.fileEntries[i]!;\n\t\t\tif (entry.type === \"model_change\") {\n\t\t\t\treturn entry as ModelChangeEntry;\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tprivate resolveModelMetadata(\n\t\tmodelKey: string,\n\t): SessionModelMetadata | undefined {\n\t\tconst registered = findRegisteredModel(modelKey);\n\t\treturn registered ? toSessionModelMetadata(registered) : undefined;\n\t}\n\n\tprivate appendSessionMetaEntry(\n\t\ttargetFile: string,\n\t\tmeta: {\n\t\t\tsummary?: string;\n\t\t\tresumeSummary?: string;\n\t\t\tmemoryExtractionHash?: string;\n\t\t\tfavorite?: boolean;\n\t\t\ttitle?: string;\n\t\t\ttags?: string[];\n\t\t\tarchived?: boolean;\n\t\t\tarchivedAt?: string;\n\t\t\tappServerGoal?: SessionMetaEntry[\"appServerGoal\"];\n\t\t},\n\t): void {\n\t\tif (!existsSync(targetFile)) return;\n\t\tif (\n\t\t\tmeta.summary === undefined &&\n\t\t\tmeta.resumeSummary === undefined &&\n\t\t\tmeta.memoryExtractionHash === undefined &&\n\t\t\tmeta.favorite === undefined &&\n\t\t\tmeta.title === undefined &&\n\t\t\tmeta.tags === undefined &&\n\t\t\tmeta.archived === undefined &&\n\t\t\tmeta.archivedAt === undefined &&\n\t\t\tmeta.appServerGoal === undefined\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tconst entry: SessionMetaEntry = {\n\t\t\ttype: \"session_meta\",\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t...meta,\n\t\t};\n\t\ttry {\n\t\t\tappendFileSync(targetFile, `${JSON.stringify(entry)}\\n`);\n\t\t\tif (resolve(targetFile) === this.sessionFile) {\n\t\t\t\tthis.fileEntries.push(entry);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tlogger.error(\n\t\t\t\t\"Failed to append session metadata\",\n\t\t\t\terror instanceof Error ? error : new Error(String(error)),\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate appendAttachmentExtractEntry(\n\t\ttargetFile: string,\n\t\tpayload: { attachmentId: string; extractedText: string },\n\t): AttachmentExtractedEntry | null {\n\t\tif (!existsSync(targetFile)) return null;\n\t\tif (!payload.attachmentId || !payload.extractedText) return null;\n\t\tconst entry: AttachmentExtractedEntry = {\n\t\t\ttype: \"attachment_extract\",\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tattachmentId: payload.attachmentId,\n\t\t\textractedText: payload.extractedText,\n\t\t};\n\t\ttry {\n\t\t\tappendFileSync(targetFile, `${JSON.stringify(entry)}\\n`);\n\t\t\treturn entry;\n\t\t} catch (error) {\n\t\t\tlogger.error(\n\t\t\t\t\"Failed to append attachment extraction\",\n\t\t\t\terror instanceof Error ? error : new Error(String(error)),\n\t\t\t);\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * Persist extracted attachment text as an append-only cache entry.\n\t */\n\tsaveAttachmentExtraction(\n\t\tsessionPath: string,\n\t\tattachmentId: string,\n\t\ttext: string,\n\t): void {\n\t\tif (!sessionPath || !existsSync(sessionPath)) return;\n\t\tconst entry = this.appendAttachmentExtractEntry(sessionPath, {\n\t\t\tattachmentId,\n\t\t\textractedText: text,\n\t\t});\n\t\tif (entry && sessionPath === this.sessionFile) {\n\t\t\tthis.fileEntries.push(entry);\n\t\t}\n\t}\n\n\tsaveSessionSummary(summary: string, sessionPath?: string): void {\n\t\tconst trimmed = summary.trim();\n\t\tif (!trimmed) return;\n\t\tconst target = sessionPath ?? this.sessionFile;\n\t\tif (!target || !existsSync(target)) return;\n\t\tthis.appendSessionMetaEntry(target, { summary: trimmed });\n\t\tthis.syncSessionMemoryEntry(target);\n\t\tif (target === this.sessionFile) {\n\t\t\tqueueSharedMemoryUpdate({\n\t\t\t\tsessionId: this.sessionId,\n\t\t\t\tstate: {\n\t\t\t\t\tsessionId: this.sessionId,\n\t\t\t\t\tupdatedAt: new Date().toISOString(),\n\t\t\t\t\tsummary: trimmed,\n\t\t\t\t\tsource: \"maestro\",\n\t\t\t\t},\n\t\t\t\tevent: {\n\t\t\t\t\ttype: \"maestro.session.summary\",\n\t\t\t\t\tpayload: {\n\t\t\t\t\t\tsessionId: this.sessionId,\n\t\t\t\t\t\tlength: trimmed.length,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t}\n\n\tsaveSessionResumeSummary(summary: string, sessionPath?: string): void {\n\t\tconst trimmed = summary.trim();\n\t\tif (!trimmed) return;\n\t\tconst target = sessionPath ?? this.sessionFile;\n\t\tif (!target || !existsSync(target)) return;\n\t\tthis.appendSessionMetaEntry(target, { resumeSummary: trimmed });\n\t\tthis.syncSessionMemoryEntry(target);\n\t}\n\n\tsaveSessionMemoryExtractionHash(hash: string, sessionPath?: string): void {\n\t\tconst trimmed = hash.trim();\n\t\tif (!trimmed) return;\n\t\tconst target = sessionPath ?? this.sessionFile;\n\t\tif (!target || !existsSync(target)) return;\n\t\tthis.appendSessionMetaEntry(target, { memoryExtractionHash: trimmed });\n\t}\n\n\tsetSessionFavorite(sessionPath: string, favorite: boolean): void {\n\t\tif (!sessionPath || !existsSync(sessionPath)) return;\n\t\tthis.appendSessionMetaEntry(sessionPath, { favorite });\n\t}\n\n\tsetSessionTitle(sessionPath: string, title: string): void {\n\t\tif (!sessionPath || !existsSync(sessionPath)) return;\n\t\tthis.appendSessionMetaEntry(sessionPath, { title });\n\t\tthis.syncSessionMemoryEntry(sessionPath);\n\t}\n\n\tsetSessionTags(sessionPath: string, tags: string[]): void {\n\t\tif (!sessionPath || !existsSync(sessionPath)) return;\n\t\tthis.appendSessionMetaEntry(sessionPath, { tags });\n\t\tthis.syncSessionMemoryEntry(sessionPath);\n\t}\n\n\tsetSessionArchived(sessionPath: string, archived: boolean): void {\n\t\tif (!sessionPath || !existsSync(sessionPath)) return;\n\t\tthis.appendSessionMetaEntry(sessionPath, {\n\t\t\tarchived,\n\t\t\tarchivedAt: archived ? new Date().toISOString() : undefined,\n\t\t});\n\t}\n\n\tsetSessionAppServerGoal(\n\t\tsessionPath: string,\n\t\tgoal: NonNullable<SessionMetaEntry[\"appServerGoal\"]> | null,\n\t): void {\n\t\tif (!sessionPath || !existsSync(sessionPath)) return;\n\t\tthis.appendSessionMetaEntry(sessionPath, { appServerGoal: goal });\n\t}\n\n\tprivate syncSessionMemoryEntry(sessionPath: string): void {\n\t\ttry {\n\t\t\tsyncSessionMemory(sessionPath);\n\t\t} catch (error) {\n\t\t\tlogger.warn(\"Failed to sync session memory\", {\n\t\t\t\tsessionPath,\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t});\n\t\t}\n\t}\n\n\tbuildSessionContext(\n\t\tleafId: string | null = this.leafId,\n\t): SessionContextSnapshot {\n\t\treturn buildSessionContextFromEntries(this.fileEntries, {\n\t\t\tleafId,\n\t\t\tbyId: this.byId,\n\t\t\theader: this.getHeader(),\n\t\t});\n\t}\n\n\tloadMessages(): AppMessage[] {\n\t\tconst context = this.buildSessionContext();\n\t\tconst extractedById = new Map<string, string>();\n\t\tfor (const entry of this.fileEntries) {\n\t\t\tif (entry.type === \"attachment_extract\") {\n\t\t\t\tif (entry.attachmentId && entry.extractedText) {\n\t\t\t\t\textractedById.set(entry.attachmentId, entry.extractedText);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (extractedById.size === 0) return context.messages;\n\t\treturn context.messages.map((message) =>\n\t\t\tapplyAttachmentExtracts(message, extractedById),\n\t\t);\n\t}\n\n\tloadThinkingLevel(): string {\n\t\treturn this.buildSessionContext().thinkingLevel;\n\t}\n\n\tloadModel(): string | null {\n\t\treturn this.buildSessionContext().model;\n\t}\n\n\tloadModelMetadata(): SessionModelMetadata | undefined {\n\t\tconst context = this.buildSessionContext();\n\t\treturn context.modelMetadata ?? this.lastModelMetadata;\n\t}\n\n\tisInitialized(): boolean {\n\t\treturn this.sessionInitialized;\n\t}\n\n\tcanCreateSession(): boolean {\n\t\treturn this.enabled;\n\t}\n\n\tgetSessionId(): string {\n\t\treturn this.sessionId;\n\t}\n\n\tgetSessionFile(): string {\n\t\treturn this.sessionFile;\n\t}\n\n\tgetPortableSessionBundle(): {\n\t\tselectedSessionId: string;\n\t\tsessions: PortableSessionExportSession[];\n\t} {\n\t\tconst records = this.buildPortableSessionRecords();\n\t\tconst byFile = new Map(\n\t\t\trecords.map((record) => [resolve(record.sessionFile), record]),\n\t\t);\n\t\tconst selected = byFile.get(resolve(this.sessionFile));\n\t\tif (!selected) {\n\t\t\treturn {\n\t\t\t\tselectedSessionId: this.sessionId,\n\t\t\t\tsessions: [\n\t\t\t\t\t{\n\t\t\t\t\t\tsessionId: this.sessionId,\n\t\t\t\t\t\tsessionFile: this.sessionFile,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\n\t\t}\n\n\t\tconst byId = new Map(records.map((record) => [record.sessionId, record]));\n\t\tconst parentToChildren = new Map<string, PortableSessionExportRecord[]>();\n\t\tfor (const record of records) {\n\t\t\tif (!record.parentSessionId) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst children = parentToChildren.get(record.parentSessionId) ?? [];\n\t\t\tchildren.push(record);\n\t\t\tparentToChildren.set(record.parentSessionId, children);\n\t\t}\n\t\tfor (const children of parentToChildren.values()) {\n\t\t\tchildren.sort((a, b) => a.timestamp.localeCompare(b.timestamp));\n\t\t}\n\n\t\tlet root = selected;\n\t\tconst visited = new Set<string>();\n\t\twhile (root.parentSessionId && !visited.has(root.sessionId)) {\n\t\t\tvisited.add(root.sessionId);\n\t\t\tconst parent = byId.get(root.parentSessionId);\n\t\t\tif (!parent) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\troot = parent;\n\t\t}\n\n\t\tconst ordered: PortableSessionExportSession[] = [];\n\t\tconst queue: PortableSessionExportRecord[] = [root];\n\t\tconst enqueued = new Set<string>([root.sessionId]);\n\t\twhile (queue.length > 0) {\n\t\t\tconst current = queue.shift();\n\t\t\tif (!current) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tordered.push({\n\t\t\t\tsessionId: current.sessionId,\n\t\t\t\tparentSessionId: current.parentSessionId,\n\t\t\t\tsessionFile: current.sessionFile,\n\t\t\t});\n\t\t\tfor (const child of parentToChildren.get(current.sessionId) ?? []) {\n\t\t\t\tif (enqueued.has(child.sessionId)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tenqueued.add(child.sessionId);\n\t\t\t\tqueue.push(child);\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tselectedSessionId: selected.sessionId,\n\t\t\tsessions: ordered,\n\t\t};\n\t}\n\n\tgetLeafId(): string | null {\n\t\treturn this.leafId;\n\t}\n\n\tgetLeafEntry(): SessionTreeEntry | undefined {\n\t\treturn this.leafId ? this.byId.get(this.leafId) : undefined;\n\t}\n\n\tgetEntry(id: string): SessionTreeEntry | undefined {\n\t\treturn this.byId.get(id);\n\t}\n\n\tgetLabel(id: string): string | undefined {\n\t\treturn this.labelsById.get(id);\n\t}\n\n\tgetChildren(parentId: string): SessionTreeEntry[] {\n\t\tconst children: SessionTreeEntry[] = [];\n\t\tfor (const entry of this.byId.values()) {\n\t\t\tif (entry.parentId === parentId) {\n\t\t\t\tchildren.push(entry);\n\t\t\t}\n\t\t}\n\t\treturn children;\n\t}\n\n\tgetBranch(fromId?: string | null): SessionTreeEntry[] {\n\t\tconst path: SessionTreeEntry[] = [];\n\t\tconst startId = fromId ?? this.leafId;\n\t\tlet current = startId ? this.byId.get(startId) : undefined;\n\t\twhile (current) {\n\t\t\tpath.unshift(current);\n\t\t\tcurrent = current.parentId ? this.byId.get(current.parentId) : undefined;\n\t\t}\n\t\treturn path;\n\t}\n\n\tgetEntries(): SessionTreeEntry[] {\n\t\treturn this.fileEntries.filter(isSessionTreeEntry);\n\t}\n\n\tgetHeader(): SessionHeaderEntry | null {\n\t\tconst header = this.fileEntries.find((e) => e.type === \"session\");\n\t\treturn header ? (header as SessionHeaderEntry) : null;\n\t}\n\n\tgetTree(): SessionTreeNode[] {\n\t\tconst entries = this.getEntries();\n\t\tconst nodeMap = new Map<string, SessionTreeNode>();\n\t\tconst roots: SessionTreeNode[] = [];\n\n\t\tfor (const entry of entries) {\n\t\t\tconst label = this.labelsById.get(entry.id);\n\t\t\tnodeMap.set(entry.id, { entry, children: [], label });\n\t\t}\n\n\t\tfor (const entry of entries) {\n\t\t\tconst node = nodeMap.get(entry.id);\n\t\t\tif (!node) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (entry.parentId === null || entry.parentId === entry.id) {\n\t\t\t\troots.push(node);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst parent = nodeMap.get(entry.parentId);\n\t\t\tif (parent) {\n\t\t\t\tparent.children.push(node);\n\t\t\t} else {\n\t\t\t\troots.push(node);\n\t\t\t}\n\t\t}\n\n\t\tconst stack: SessionTreeNode[] = [...roots];\n\t\twhile (stack.length > 0) {\n\t\t\tconst node = stack.pop();\n\t\t\tif (!node) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tnode.children.sort(\n\t\t\t\t(a, b) =>\n\t\t\t\t\tnew Date(a.entry.timestamp).getTime() -\n\t\t\t\t\tnew Date(b.entry.timestamp).getTime(),\n\t\t\t);\n\t\t\tstack.push(...node.children);\n\t\t}\n\n\t\treturn roots;\n\t}\n\n\tbranch(branchFromId: string): void {\n\t\tif (!this.byId.has(branchFromId)) {\n\t\t\tthrow new Error(`Entry ${branchFromId} not found`);\n\t\t}\n\t\tthis.leafId = branchFromId;\n\t}\n\n\tbranchWithSummary(\n\t\tbranchFromId: string | null,\n\t\tsummary: string,\n\t\toptions?: { fromId?: string; details?: unknown; fromHook?: boolean },\n\t): string {\n\t\tif (branchFromId !== null && !this.byId.has(branchFromId)) {\n\t\t\tthrow new Error(`Entry ${branchFromId} not found`);\n\t\t}\n\t\tthis.leafId = branchFromId;\n\t\tconst entry: BranchSummaryEntry = {\n\t\t\ttype: \"branch_summary\",\n\t\t\tid: this.createTreeEntryId(),\n\t\t\tparentId: branchFromId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tfromId: options?.fromId ?? branchFromId ?? \"root\",\n\t\t\tsummary,\n\t\t\tdetails: options?.details,\n\t\t\tfromHook: options?.fromHook,\n\t\t};\n\t\tthis.appendTreeEntry(entry);\n\t\treturn entry.id;\n\t}\n\n\tresetLeaf(): void {\n\t\tthis.leafId = null;\n\t}\n\n\tupdateSnapshot(state: AgentState, metadata?: SessionModelMetadata): void {\n\t\tthis._agentSnapshot = state;\n\t\tif (metadata) {\n\t\t\tthis.lastModelMetadata = metadata;\n\t\t}\n\t}\n\n\tasync flush(): Promise<void> {\n\t\tawait this.writer?.flush();\n\t}\n\n\t/**\n\t * Load all sessions for the current directory with metadata\n\t */\n\tloadAllSessions(): SessionMetadata[] {\n\t\treturn this.catalog.loadAllSessions();\n\t}\n\n\tgetSessionFileById(sessionId: string): string | null {\n\t\treturn this.catalog.getSessionFileById(sessionId);\n\t}\n\n\tasync loadEntries(sessionId: string): Promise<SessionEntry[] | null> {\n\t\tconst sessionFile = this.getSessionFileById(sessionId);\n\t\tif (!sessionFile) {\n\t\t\treturn null;\n\t\t}\n\t\treturn safeReadSessionEntries(sessionFile);\n\t}\n\n\t/**\n\t * Set the session file to an existing session\n\t */\n\tsetSessionFile(path: string): void {\n\t\t// Unregister old session file before disposing writer\n\t\tif (this.sessionFile) {\n\t\t\tunregisterActiveSessionFile(this.sessionFile);\n\t\t}\n\t\tthis.writer?.flushSync();\n\t\tthis.writer?.dispose();\n\n\t\tthis.sessionFile = resolve(path);\n\t\t// Register new session file to prevent migration race conditions\n\t\tregisterActiveSessionFile(this.sessionFile);\n\t\tscheduleSessionMigration();\n\n\t\tif (existsSync(this.sessionFile)) {\n\t\t\tconst entries = safeReadSessionEntries(this.sessionFile);\n\t\t\tconst migrated = migrateToCurrentVersion(entries);\n\t\t\tthis.fileEntries = entries;\n\t\t\tconst header = entries.find((e) => e.type === \"session\") as\n\t\t\t\t| SessionHeaderEntry\n\t\t\t\t| undefined;\n\t\t\tthis.sessionInitialized = Boolean(header && header.provisional !== true);\n\t\t\tthis.rebuildIndex(entries);\n\t\t\tif (migrated) {\n\t\t\t\tthis.rewriteSessionFile();\n\t\t\t}\n\t\t\tthis.sessionId = header?.id ?? uuidv4();\n\t\t\tthis.flushed = true;\n\t\t\tthis.metadataCache.seedFromFile(this.sessionFile);\n\t\t} else {\n\t\t\t// Unregister the non-existent path before initNewSession registers a new one\n\t\t\tunregisterActiveSessionFile(this.sessionFile);\n\t\t\tthis.initNewSession();\n\t\t}\n\t\tthis.initializeWriter();\n\t}\n\n\t/**\n\t * Check if we should initialize the session based on message history.\n\t * Session is initialized once we have at least 1 user message.\n\t */\n\tshouldInitializeSession(messages: AppMessage[]): boolean {\n\t\tif (this.sessionInitialized) return false;\n\n\t\tconst userMessages = messages.filter((m) => m.role === \"user\");\n\t\treturn userMessages.length >= 1;\n\t}\n\n\t/**\n\t * Create a branched session from a specific message index.\n\t * Returns the new session file path.\n\t * @param state - Current agent state\n\t * @param branchFromIndex - Index of the last message to include in the branch (exclusive)\n\t */\n\tcreateBranchedSession(state: AgentState, branchFromIndex: number): string;\n\t/**\n\t * Create a branched session from a specific tree entry id.\n\t */\n\tcreateBranchedSession(leafId: string): string;\n\tcreateBranchedSession(\n\t\tstateOrLeafId: AgentState | string,\n\t\tbranchFromIndex?: number,\n\t): string {\n\t\tif (typeof stateOrLeafId === \"string\") {\n\t\t\treturn this.createBranchedSessionFromLeaf(stateOrLeafId);\n\t\t}\n\t\tif (typeof branchFromIndex !== \"number\") {\n\t\t\tthrow new Error(\n\t\t\t\t\"branchFromIndex is required when branching from AgentState\",\n\t\t\t);\n\t\t}\n\t\treturn this.createBranchedSessionFromState(stateOrLeafId, branchFromIndex);\n\t}\n\n\tprivate createBranchedSessionFromLeaf(leafId: string): string {\n\t\treturn createBranchedSessionFromLeafFn(leafId, {\n\t\t\tsessionDir: this.sessionDir,\n\t\t\tsessionId: this.sessionId,\n\t\t\tsessionFile: this.sessionFile,\n\t\t\tbranch: this.getBranch(leafId),\n\t\t\tcontext: this.buildSessionContext(leafId),\n\t\t\theader: this.getHeader(),\n\t\t\tlabelsById: this.labelsById,\n\t\t});\n\t}\n\n\tprivate createBranchedSessionFromState(\n\t\tstate: AgentState,\n\t\tbranchFromIndex: number,\n\t): string {\n\t\treturn createBranchedSessionFromStateFn(state, branchFromIndex, {\n\t\t\tsessionDir: this.sessionDir,\n\t\t\tsessionId: this.sessionId,\n\t\t\tsessionFile: this.sessionFile,\n\t\t\tlastModelMetadata: this.lastModelMetadata,\n\t\t});\n\t}\n\n\t/**\n\t * List all sessions in the session directory\n\t */\n\tasync listSessions(options?: {\n\t\tlimit?: number;\n\t\toffset?: number;\n\t}): Promise<SessionSummary[]> {\n\t\treturn this.catalog.listSessions(options);\n\t}\n\n\t/**\n\t * Load a session by ID\n\t */\n\tasync loadSession(\n\t\tsessionId: string,\n\t\toptions: { messagesView?: SessionMessagesView } = {},\n\t): Promise<{\n\t\tid: string;\n\t\tsubject?: string;\n\t\ttitle?: string;\n\t\tsummary?: string;\n\t\tresumeSummary?: string;\n\t\tmessages: AppMessage[];\n\t\tcreatedAt: string;\n\t\tupdatedAt: string;\n\t\tmessageCount: number;\n\t\tfavorite: boolean;\n\t\ttags?: string[];\n\t\tarchived?: boolean;\n\t\tarchivedAt?: string;\n\t\tmessagesView: SessionMessagesView;\n\t} | null> {\n\t\treturn this.catalog.loadSession(sessionId, options);\n\t}\n\n\t/**\n\t * Create a new session\n\t */\n\tasync createSession(options?: { title?: string }): Promise<{\n\t\tid: string;\n\t\ttitle?: string;\n\t\tresumeSummary?: string;\n\t\tmessages: AppMessage[];\n\t\tcreatedAt: string;\n\t\tupdatedAt: string;\n\t\tmessageCount: number;\n\t}> {\n\t\tthis.startFreshSession();\n\t\tconst now = new Date().toISOString();\n\t\tconst header: SessionHeaderEntry = {\n\t\t\ttype: \"session\",\n\t\t\tversion: CURRENT_SESSION_VERSION,\n\t\t\tid: this.sessionId,\n\t\t\ttimestamp: now,\n\t\t\tcwd: process.cwd(),\n\t\t\tprovisional: true,\n\t\t};\n\t\tthis.fileEntries.unshift(header);\n\n\t\tif (options?.title && this.enabled) {\n\t\t\tconst entry: SessionMetaEntry = {\n\t\t\t\ttype: \"session_meta\",\n\t\t\t\ttimestamp: now,\n\t\t\t\ttitle: options.title,\n\t\t\t};\n\t\t\tthis.fileEntries.push(entry);\n\t\t}\n\t\tthis.rewriteSessionFile();\n\t\tthis.flushed = true;\n\t\tthis.sessionInitialized = false;\n\n\t\treturn {\n\t\t\tid: this.sessionId,\n\t\t\ttitle: options?.title,\n\t\t\tmessages: [],\n\t\t\tcreatedAt: now,\n\t\t\tupdatedAt: now,\n\t\t\tmessageCount: 0,\n\t\t};\n\t}\n\n\timportSessionJsonl(sourcePath: string): PortableSessionImportResult {\n\t\tconst resolvedSource = resolve(sourcePath);\n\t\tif (!existsSync(resolvedSource)) {\n\t\t\tthrow new Error(`Session file not found: ${resolvedSource}`);\n\t\t}\n\n\t\tconst entries = safeReadSessionEntries(resolvedSource);\n\t\treturn this.importPortableEntries(entries);\n\t}\n\n\timportSessionEntries(entries: SessionEntry[]): PortableSessionImportResult {\n\t\treturn this.importPortableEntries([...entries]);\n\t}\n\n\timportPortableSession(sourcePath: string): {\n\t\tsessionFile: string;\n\t\tsessionId: string;\n\t\timportedCount: number;\n\t} {\n\t\tconst resolvedSource = resolve(sourcePath);\n\t\tif (!existsSync(resolvedSource)) {\n\t\t\tthrow new Error(`Session file not found: ${resolvedSource}`);\n\t\t}\n\n\t\tconst extension = extname(resolvedSource).toLowerCase();\n\t\tif (extension === \".json\") {\n\t\t\tconst portableExport = this.readPortableJsonExport(resolvedSource);\n\t\t\tif (portableExport.sessions?.length) {\n\t\t\t\treturn this.importPortableSessionBundle(portableExport);\n\t\t\t}\n\t\t\tif (portableExport.entries) {\n\t\t\t\treturn this.importPortableEntries(portableExport.entries);\n\t\t\t}\n\t\t\tthrow new Error(\n\t\t\t\t\"Portable session export is missing both entries and sessions.\",\n\t\t\t);\n\t\t}\n\n\t\tconst entries = safeReadSessionEntries(resolvedSource);\n\t\treturn this.importPortableEntries(entries);\n\t}\n\n\t/**\n\t * Delete a session\n\t */\n\tasync deleteSession(sessionId: string): Promise<void> {\n\t\tthis.catalog.deleteSession(sessionId);\n\t}\n\n\t/**\n\t * Prune old sessions based on configured limits.\n\t * Removes sessions that exceed MAX_SESSIONS count or MAX_SESSION_AGE_DAYS.\n\t * Favorites are never pruned.\n\t * Returns the number of sessions removed.\n\t */\n\tpruneSessions(): { removed: number; errors: number } {\n\t\treturn this.catalog.pruneSessions();\n\t}\n\n\tprivate importPortableEntries(\n\t\tentries: SessionEntry[],\n\t): PortableSessionImportResult {\n\t\tmigrateToCurrentVersion(entries);\n\t\tif (entries.length === 0) {\n\t\t\tthrow new Error(\"Imported session file is empty or unreadable.\");\n\t\t}\n\n\t\tconst headerIndex = entries.findIndex((entry) => entry.type === \"session\");\n\t\tif (headerIndex < 0) {\n\t\t\tthrow new Error(\"Imported session file is missing a session header.\");\n\t\t}\n\n\t\tconst header = entries[headerIndex] as SessionHeaderEntry;\n\t\tlet sessionId = header.id?.trim() || uuidv4();\n\t\tif (this.catalog.getSessionFileById(sessionId)) {\n\t\t\tsessionId = uuidv4();\n\t\t}\n\n\t\tconst timestamp = new Date().toISOString().replace(/[:.]/g, \"-\");\n\t\tconst targetFile = join(this.sessionDir, `${timestamp}_${sessionId}.jsonl`);\n\t\tconst importedHeader: SessionHeaderEntry = {\n\t\t\t...header,\n\t\t\tid: sessionId,\n\t\t\tsubject: undefined,\n\t\t};\n\t\tconst importedEntries = entries.map((entry, index) =>\n\t\t\tindex === headerIndex ? importedHeader : entry,\n\t\t);\n\n\t\twriteFileSync(\n\t\t\ttargetFile,\n\t\t\t`${importedEntries.map((entry) => JSON.stringify(entry)).join(\"\\n\")}\\n`,\n\t\t\t\"utf8\",\n\t\t);\n\n\t\treturn {\n\t\t\tsessionFile: targetFile,\n\t\t\tsessionId,\n\t\t\timportedCount: 1,\n\t\t};\n\t}\n\n\tprivate importPortableSessionBundle(\n\t\tportableExport: PortableSessionBundle,\n\t): PortableSessionImportResult {\n\t\tconst sessions = portableExport.sessions;\n\t\tif (!sessions?.length) {\n\t\t\tthrow new Error(\"Portable session export is missing bundled sessions.\");\n\t\t}\n\n\t\tconst pending = new Map(\n\t\t\tsessions.map((session) => [session.sessionId, session]),\n\t\t);\n\t\tconst importedIds = new Map<string, string>();\n\t\tconst importedFiles = new Map<string, string>();\n\t\tconst ordered: PortableSessionExportSession[] = [];\n\n\t\twhile (pending.size > 0) {\n\t\t\tlet progressed = false;\n\t\t\tfor (const [sessionId, session] of pending) {\n\t\t\t\tif (session.parentSessionId && pending.has(session.parentSessionId)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tordered.push(session);\n\t\t\t\tpending.delete(sessionId);\n\t\t\t\tprogressed = true;\n\t\t\t}\n\t\t\tif (!progressed) {\n\t\t\t\tordered.push(...pending.values());\n\t\t\t\tpending.clear();\n\t\t\t}\n\t\t}\n\n\t\tfor (const session of ordered) {\n\t\t\tconst entries = session.entries ? [...session.entries] : [];\n\t\t\tmigrateToCurrentVersion(entries);\n\t\t\tif (entries.length === 0) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Bundled session ${session.sessionId} is empty or unreadable.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst headerIndex = entries.findIndex(\n\t\t\t\t(entry) => entry.type === \"session\",\n\t\t\t);\n\t\t\tif (headerIndex < 0) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Bundled session ${session.sessionId} is missing a session header.`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst header = entries[headerIndex] as SessionHeaderEntry;\n\t\t\tlet importedSessionId = header.id?.trim() || uuidv4();\n\t\t\tif (this.catalog.getSessionFileById(importedSessionId)) {\n\t\t\t\timportedSessionId = uuidv4();\n\t\t\t}\n\t\t\tconst timestamp = new Date().toISOString().replace(/[:.]/g, \"-\");\n\t\t\tconst targetFile = join(\n\t\t\t\tthis.sessionDir,\n\t\t\t\t`${timestamp}_${importedSessionId}.jsonl`,\n\t\t\t);\n\t\t\tconst importedParentSessionId = session.parentSessionId\n\t\t\t\t? importedIds.get(session.parentSessionId)\n\t\t\t\t: undefined;\n\t\t\tconst importedHeader: SessionHeaderEntry = {\n\t\t\t\t...header,\n\t\t\t\tid: importedSessionId,\n\t\t\t\tsubject: undefined,\n\t\t\t\tparentSession: importedParentSessionId,\n\t\t\t\tbranchedFrom: session.parentSessionId\n\t\t\t\t\t? importedFiles.get(session.parentSessionId)\n\t\t\t\t\t: undefined,\n\t\t\t};\n\t\t\tconst importedEntries = entries.map((entry, index) =>\n\t\t\t\tindex === headerIndex ? importedHeader : entry,\n\t\t\t);\n\n\t\t\twriteFileSync(\n\t\t\t\ttargetFile,\n\t\t\t\t`${importedEntries.map((entry) => JSON.stringify(entry)).join(\"\\n\")}\\n`,\n\t\t\t\t\"utf8\",\n\t\t\t);\n\t\t\timportedIds.set(session.sessionId, importedSessionId);\n\t\t\timportedFiles.set(session.sessionId, targetFile);\n\t\t}\n\n\t\tconst selectedSourceSessionId =\n\t\t\tportableExport.sessionId ?? sessions[0]?.sessionId;\n\t\tconst selectedSessionId =\n\t\t\t(selectedSourceSessionId\n\t\t\t\t? importedIds.get(selectedSourceSessionId)\n\t\t\t\t: undefined) ?? importedIds.get(sessions[0]!.sessionId)!;\n\t\tconst selectedSessionFile =\n\t\t\timportedFiles.get(selectedSourceSessionId ?? sessions[0]!.sessionId) ??\n\t\t\timportedFiles.get(sessions[0]!.sessionId)!;\n\n\t\treturn {\n\t\t\tsessionFile: selectedSessionFile,\n\t\t\tsessionId: selectedSessionId,\n\t\t\timportedCount: ordered.length,\n\t\t};\n\t}\n\n\tprivate readPortableJsonExport(sourcePath: string): PortableSessionBundle {\n\t\tlet parsed: unknown;\n\t\ttry {\n\t\t\tparsed = JSON.parse(readFileSync(sourcePath, \"utf8\"));\n\t\t} catch (error) {\n\t\t\tthrow new Error(\n\t\t\t\t`Portable session export is not valid JSON: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t);\n\t\t}\n\n\t\tif (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n\t\t\tthrow new Error(\"Portable session export must be a JSON object.\");\n\t\t}\n\n\t\tconst portableExport = parsed as {\n\t\t\tformat?: unknown;\n\t\t\tsessionId?: unknown;\n\t\t\tentries?: unknown;\n\t\t\tsessions?: unknown;\n\t\t};\n\t\tconst format =\n\t\t\ttypeof portableExport.format === \"string\"\n\t\t\t\t? portableExport.format\n\t\t\t\t: undefined;\n\t\tif (format !== PORTABLE_SESSION_EXPORT_FORMAT) {\n\t\t\tthrow new Error(\n\t\t\t\t`Portable session export format must be ${PORTABLE_SESSION_EXPORT_FORMAT}.`,\n\t\t\t);\n\t\t}\n\n\t\tconst parseEntries = (entries: unknown[], path: string): SessionEntry[] =>\n\t\t\tentries.map((entry, index) => {\n\t\t\t\tconst parsedEntry = tryParseSessionEntry(JSON.stringify(entry));\n\t\t\t\tif (!parsedEntry) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`${path} contains an invalid entry at index ${index}.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn parsedEntry;\n\t\t\t});\n\n\t\tconst entries = Array.isArray(portableExport.entries)\n\t\t\t? parseEntries(portableExport.entries, \"Portable session export\")\n\t\t\t: undefined;\n\t\tconst sessions = Array.isArray(portableExport.sessions)\n\t\t\t? portableExport.sessions.map((session, index) => {\n\t\t\t\t\tif (\n\t\t\t\t\t\t!session ||\n\t\t\t\t\t\ttypeof session !== \"object\" ||\n\t\t\t\t\t\tArray.isArray(session)\n\t\t\t\t\t) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Portable session export contains an invalid bundled session at index ${index}.`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tconst parsedSession = session as {\n\t\t\t\t\t\tsessionId?: unknown;\n\t\t\t\t\t\tparentSessionId?: unknown;\n\t\t\t\t\t\tentries?: unknown;\n\t\t\t\t\t};\n\t\t\t\t\tif (typeof parsedSession.sessionId !== \"string\") {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Portable session export is missing a sessionId for bundled session ${index}.`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tif (!Array.isArray(parsedSession.entries)) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Portable session export is missing entries for bundled session ${parsedSession.sessionId}.`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsessionId: parsedSession.sessionId,\n\t\t\t\t\t\tparentSessionId:\n\t\t\t\t\t\t\ttypeof parsedSession.parentSessionId === \"string\"\n\t\t\t\t\t\t\t\t? parsedSession.parentSessionId\n\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\tsessionFile: join(\n\t\t\t\t\t\t\tthis.sessionDir,\n\t\t\t\t\t\t\t`${parsedSession.sessionId}.jsonl`,\n\t\t\t\t\t\t),\n\t\t\t\t\t\tentries: parseEntries(\n\t\t\t\t\t\t\tparsedSession.entries,\n\t\t\t\t\t\t\t`Bundled session ${parsedSession.sessionId}`,\n\t\t\t\t\t\t),\n\t\t\t\t\t} satisfies PortableSessionExportSession;\n\t\t\t\t})\n\t\t\t: undefined;\n\n\t\tif (!entries && !sessions?.length) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Portable session export is missing both entries and bundled sessions.\",\n\t\t\t);\n\t\t}\n\n\t\treturn {\n\t\t\tformat,\n\t\t\texportedAt:\n\t\t\t\ttypeof (portableExport as { exportedAt?: unknown }).exportedAt ===\n\t\t\t\t\"string\"\n\t\t\t\t\t? (portableExport as { exportedAt: string }).exportedAt\n\t\t\t\t\t: new Date().toISOString(),\n\t\t\tsessionId:\n\t\t\t\ttypeof portableExport.sessionId === \"string\"\n\t\t\t\t\t? portableExport.sessionId\n\t\t\t\t\t: undefined,\n\t\t\tentries,\n\t\t\tsessions,\n\t\t};\n\t}\n\n\tprivate buildPortableSessionRecords(): PortableSessionExportRecord[] {\n\t\tconst records: PortableSessionExportRecord[] = [];\n\t\tconst filePaths = readdirSync(this.sessionDir)\n\t\t\t.filter((fileName) => fileName.endsWith(\".jsonl\"))\n\t\t\t.map((fileName) => resolve(join(this.sessionDir, fileName)));\n\n\t\tfor (const filePath of filePaths) {\n\t\t\tconst entries = safeReadSessionEntries(filePath);\n\t\t\tconst header = entries.find((entry) => entry.type === \"session\") as\n\t\t\t\t| SessionHeaderEntry\n\t\t\t\t| undefined;\n\t\t\tif (!header?.id) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\trecords.push({\n\t\t\t\tsessionId: header.id,\n\t\t\t\tsessionFile: filePath,\n\t\t\t\ttimestamp: header.timestamp,\n\t\t\t\tparentSessionId: header.parentSession,\n\t\t\t\tparentSessionFile: header.branchedFrom\n\t\t\t\t\t? resolve(header.branchedFrom)\n\t\t\t\t\t: undefined,\n\t\t\t});\n\t\t}\n\n\t\tconst byPath = new Map(\n\t\t\trecords.map((record) => [resolve(record.sessionFile), record]),\n\t\t);\n\t\tfor (const record of records) {\n\t\t\tif (!record.parentSessionId && record.parentSessionFile) {\n\t\t\t\trecord.parentSessionId = byPath.get(\n\t\t\t\t\tresolve(record.parentSessionFile),\n\t\t\t\t)?.sessionId;\n\t\t\t}\n\t\t}\n\n\t\trecords.sort((a, b) => a.timestamp.localeCompare(b.timestamp));\n\t\treturn records;\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-catalog.d.ts","sourceRoot":"","sources":["../../src/session/session-catalog.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAQpD,OAAO,KAAK,EACX,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,MAAM,YAAY,CAAC;AAIpB,KAAK,qBAAqB,GAAG;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,mBAAmB,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;CAC/C,CAAC;AAQF,MAAM,WAAW,iBAAiB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,YAAY,EAAE,mBAAmB,CAAC;CAClC;AAaD,qBAAa,cAAc;IACd,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,qBAAqB;IAE3D,eAAe,IAAI,eAAe,EAAE;
|
|
1
|
+
{"version":3,"file":"session-catalog.d.ts","sourceRoot":"","sources":["../../src/session/session-catalog.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAQpD,OAAO,KAAK,EACX,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,MAAM,YAAY,CAAC;AAIpB,KAAK,qBAAqB,GAAG;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,mBAAmB,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;CAC/C,CAAC;AAQF,MAAM,WAAW,iBAAiB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,mBAAmB,CAAC;CAClC;AAaD,qBAAa,cAAc;IACd,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,qBAAqB;IAE3D,eAAe,IAAI,eAAe,EAAE;IA4DpC,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAOpD,YAAY,CAAC,OAAO,CAAC,EAAE;QACtB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,cAAc,EAAE;IAwCpB,WAAW,CACV,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;QAAE,YAAY,CAAC,EAAE,mBAAmB,CAAA;KAAO,GAClD,iBAAiB,GAAG,IAAI;IAoC3B,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAStC,aAAa,IAAI;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;CAiDpD"}
|