@evalops/maestro 0.10.22 → 0.10.24
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 +15171 -14298
- 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/artifacts.d.ts +58 -0
- package/dist/node_modules/@evalops/contracts/dist/artifacts.d.ts.map +1 -0
- package/dist/node_modules/@evalops/contracts/dist/artifacts.js +191 -0
- package/dist/node_modules/@evalops/contracts/dist/artifacts.js.map +1 -0
- package/dist/node_modules/@evalops/contracts/dist/headless-protocol-schemas.generated.d.ts +10 -10
- package/dist/node_modules/@evalops/contracts/dist/index.d.ts +4 -3
- package/dist/node_modules/@evalops/contracts/dist/index.d.ts.map +1 -1
- package/dist/node_modules/@evalops/contracts/dist/index.js +3 -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/dist/runtime-app-server.d.ts +1 -1
- package/dist/node_modules/@evalops/contracts/dist/runtime-server-request.d.ts +3 -3
- 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-artifacts.d.ts.map +1 -1
- package/dist/server/handlers/session-artifacts.js +13 -74
- package/dist/server/handlers/session-artifacts.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
|
@@ -51,6 +51,8 @@ export class SessionCatalog {
|
|
|
51
51
|
memoryExtractionHash: info.memoryExtractionHash,
|
|
52
52
|
favorite: info.favorite,
|
|
53
53
|
tags: info.tags,
|
|
54
|
+
archived: info.archived,
|
|
55
|
+
archivedAt: info.archivedAt,
|
|
54
56
|
allMessagesText: info.allMessagesText,
|
|
55
57
|
});
|
|
56
58
|
}
|
|
@@ -97,6 +99,8 @@ export class SessionCatalog {
|
|
|
97
99
|
messageCount: info.messageCount,
|
|
98
100
|
favorite: info.favorite,
|
|
99
101
|
tags: info.tags,
|
|
102
|
+
archived: info.archived,
|
|
103
|
+
archivedAt: info.archivedAt,
|
|
100
104
|
});
|
|
101
105
|
}
|
|
102
106
|
catch {
|
|
@@ -133,6 +137,8 @@ export class SessionCatalog {
|
|
|
133
137
|
messageCount: info.messageCount,
|
|
134
138
|
favorite: info.favorite,
|
|
135
139
|
tags: info.tags,
|
|
140
|
+
archived: info.archived,
|
|
141
|
+
archivedAt: info.archivedAt,
|
|
136
142
|
messagesView: info.messagesView,
|
|
137
143
|
};
|
|
138
144
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-catalog.js","sourceRoot":"","sources":["../../src/session/session-catalog.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Stats, readdirSync, statSync, unlinkSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { AppMessage } from \"../agent/types.js\";\nimport { SESSION_CONFIG } from \"../config/constants.js\";\nimport { createLogger } from \"../utils/logger.js\";\nimport { scheduleSessionMigration } from \"./migration.js\";\nimport {\n\tbuildSessionFileInfo,\n\tsafeReadSessionEntries,\n} from \"./session-context.js\";\nimport type {\n\tSessionMessagesView,\n\tSessionMetadata,\n\tSessionSummary,\n} from \"./types.js\";\n\nconst logger = createLogger(\"session-catalog\");\n\ntype SessionCatalogOptions = {\n\tsessionDir: string;\n\tbeforeRead?: () => void;\n\tgetCurrentSessionId?: () => string | undefined;\n};\n\ntype SessionFileEntry = {\n\tfilePath: string;\n\tmodifiedAt: Date;\n\tstats: Stats;\n};\n\nexport interface LoadedSessionData {\n\tid: string;\n\tsubject?: string;\n\ttitle?: string;\n\tsummary?: string;\n\tresumeSummary?: string;\n\tmemoryExtractionHash?: string;\n\tmessages: AppMessage[];\n\tcreatedAt: string;\n\tupdatedAt: string;\n\tmessageCount: number;\n\tfavorite: boolean;\n\ttags?: string[];\n\tmessagesView: SessionMessagesView;\n}\n\nfunction getSortedSessionFiles(sessionDir: string): SessionFileEntry[] {\n\treturn readdirSync(sessionDir)\n\t\t.filter((fileName) => fileName.endsWith(\".jsonl\"))\n\t\t.map((fileName) => {\n\t\t\tconst filePath = join(sessionDir, fileName);\n\t\t\tconst stats: Stats = statSync(filePath);\n\t\t\treturn { filePath, modifiedAt: stats.mtime, stats };\n\t\t})\n\t\t.sort((a, b) => b.modifiedAt.getTime() - a.modifiedAt.getTime());\n}\n\nexport class SessionCatalog {\n\tconstructor(private readonly options: SessionCatalogOptions) {}\n\n\tloadAllSessions(): SessionMetadata[] {\n\t\tthis.options.beforeRead?.();\n\t\tscheduleSessionMigration();\n\t\tconst sessions: SessionMetadata[] = [];\n\n\t\ttry {\n\t\t\tconst files = getSortedSessionFiles(this.options.sessionDir);\n\n\t\t\tfor (const fileEntry of files) {\n\t\t\t\tconst { filePath, stats } = fileEntry;\n\t\t\t\ttry {\n\t\t\t\t\tconst entries = safeReadSessionEntries(filePath, (error) => {\n\t\t\t\t\t\tlogger.error(\n\t\t\t\t\t\t\t`Failed to read session file ${filePath}`,\n\t\t\t\t\t\t\terror instanceof Error ? error : undefined,\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\t\t\t\t\tconst info = buildSessionFileInfo(entries, stats);\n\t\t\t\t\tif (!info) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tconst derivedSummary =\n\t\t\t\t\t\tinfo.summary || info.firstMessage || \"(no summary)\";\n\n\t\t\t\t\tsessions.push({\n\t\t\t\t\t\tpath: filePath,\n\t\t\t\t\t\tid: info.id,\n\t\t\t\t\t\tsubject: info.subject,\n\t\t\t\t\t\ttitle: info.title,\n\t\t\t\t\t\tcreated: info.created,\n\t\t\t\t\t\tmodified: stats.mtime,\n\t\t\t\t\t\tsize: stats.size,\n\t\t\t\t\t\tmessageCount: info.messageCount,\n\t\t\t\t\t\tfirstMessage: info.firstMessage || \"(no messages)\",\n\t\t\t\t\t\tsummary: derivedSummary,\n\t\t\t\t\t\tresumeSummary: info.resumeSummary,\n\t\t\t\t\t\tmemoryExtractionHash: info.memoryExtractionHash,\n\t\t\t\t\t\tfavorite: info.favorite,\n\t\t\t\t\t\ttags: info.tags,\n\t\t\t\t\t\tallMessagesText: info.allMessagesText,\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`Failed to process session file ${filePath}`,\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}\n\t\t} catch (error) {\n\t\t\tlogger.error(\n\t\t\t\t\"Failed to load sessions\",\n\t\t\t\terror instanceof Error ? error : undefined,\n\t\t\t);\n\t\t}\n\n\t\treturn sessions;\n\t}\n\n\tgetSessionFileById(sessionId: string): string | null {\n\t\tconst match = this.loadAllSessions().find(\n\t\t\t(session) => session.id === sessionId,\n\t\t);\n\t\treturn match?.path ?? null;\n\t}\n\n\tlistSessions(options?: {\n\t\tlimit?: number;\n\t\toffset?: number;\n\t}): SessionSummary[] {\n\t\tthis.options.beforeRead?.();\n\t\tconst sessions: SessionSummary[] = [];\n\t\tconst sortedFiles = getSortedSessionFiles(this.options.sessionDir);\n\t\tconst offset = Math.max(0, options?.offset ?? 0);\n\t\tconst limit = Math.max(1, options?.limit ?? sortedFiles.length);\n\n\t\tfor (const [index, entry] of sortedFiles.entries()) {\n\t\t\tif (index < offset) continue;\n\t\t\tif (sessions.length >= limit) break;\n\t\t\tconst { filePath, stats } = entry;\n\n\t\t\ttry {\n\t\t\t\tconst entries = safeReadSessionEntries(filePath);\n\t\t\t\tconst info = buildSessionFileInfo(entries, stats);\n\t\t\t\tif (!info) continue;\n\n\t\t\t\tsessions.push({\n\t\t\t\t\tid: info.id,\n\t\t\t\t\tsubject: info.subject,\n\t\t\t\t\ttitle: info.title ?? info.summary,\n\t\t\t\t\tsummary: info.summary || info.firstMessage || undefined,\n\t\t\t\t\tresumeSummary: info.resumeSummary,\n\t\t\t\t\tmemoryExtractionHash: info.memoryExtractionHash,\n\t\t\t\t\tcreatedAt: info.created.toISOString(),\n\t\t\t\t\tupdatedAt: stats.mtime.toISOString(),\n\t\t\t\t\tmessageCount: info.messageCount,\n\t\t\t\t\tfavorite: info.favorite,\n\t\t\t\t\ttags: info.tags,\n\t\t\t\t});\n\t\t\t} catch {\n\t\t\t\t// Skip files that can't be read\n\t\t\t}\n\t\t}\n\n\t\treturn sessions;\n\t}\n\n\tloadSession(\n\t\tsessionId: string,\n\t\toptions: { messagesView?: SessionMessagesView } = {},\n\t): LoadedSessionData | null {\n\t\tthis.options.beforeRead?.();\n\t\tconst sessionFile = this.getSessionFileById(sessionId);\n\t\tif (!sessionFile) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst stats = statSync(sessionFile);\n\t\tconst entries = safeReadSessionEntries(sessionFile);\n\t\tconst info = buildSessionFileInfo(entries, stats, {\n\t\t\tmessagesView: options.messagesView,\n\t\t});\n\t\tif (!info) {\n\t\t\treturn null;\n\t\t}\n\t\tconst derivedSummary = info.summary || info.firstMessage || \"(no summary)\";\n\n\t\treturn {\n\t\t\tid: info.id,\n\t\t\tsubject: info.subject,\n\t\t\ttitle: info.title ?? info.summary,\n\t\t\tsummary: derivedSummary,\n\t\t\tresumeSummary: info.resumeSummary,\n\t\t\tmemoryExtractionHash: info.memoryExtractionHash,\n\t\t\tmessages: info.messages,\n\t\t\tcreatedAt: info.created.toISOString(),\n\t\t\tupdatedAt: stats.mtime.toISOString(),\n\t\t\tmessageCount: info.messageCount,\n\t\t\tfavorite: info.favorite,\n\t\t\ttags: info.tags,\n\t\t\tmessagesView: info.messagesView,\n\t\t};\n\t}\n\n\tdeleteSession(sessionId: string): void {\n\t\tconst sessionFile = this.getSessionFileById(sessionId);\n\t\tif (!sessionFile) {\n\t\t\tthrow new Error(`Session ${sessionId} not found`);\n\t\t}\n\n\t\tunlinkSync(sessionFile);\n\t}\n\n\tpruneSessions(): { removed: number; errors: number } {\n\t\tconst maxSessions = SESSION_CONFIG.MAX_SESSIONS;\n\t\tconst maxAgeDays = SESSION_CONFIG.MAX_SESSION_AGE_DAYS;\n\n\t\tif (maxSessions <= 0 && maxAgeDays <= 0) {\n\t\t\treturn { removed: 0, errors: 0 };\n\t\t}\n\n\t\tconst sessions = this.loadAllSessions();\n\t\tconst currentSessionId = this.options.getCurrentSessionId?.();\n\t\tconst now = Date.now();\n\t\tconst maxAgeMs = maxAgeDays > 0 ? maxAgeDays * 24 * 60 * 60 * 1000 : 0;\n\t\tconst toRemove: SessionMetadata[] = [];\n\n\t\tif (maxAgeMs > 0) {\n\t\t\tfor (const session of sessions) {\n\t\t\t\tif (session.favorite) continue;\n\t\t\t\tif (session.id === currentSessionId) continue;\n\t\t\t\tif (now - session.modified.getTime() > maxAgeMs) {\n\t\t\t\t\ttoRemove.push(session);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (maxSessions > 0) {\n\t\t\tconst eligible = sessions.filter(\n\t\t\t\t(session) =>\n\t\t\t\t\t!session.favorite &&\n\t\t\t\t\tsession.id !== currentSessionId &&\n\t\t\t\t\t!toRemove.some((removedSession) => removedSession.id === session.id),\n\t\t\t);\n\t\t\tif (eligible.length > maxSessions) {\n\t\t\t\ttoRemove.push(...eligible.slice(maxSessions));\n\t\t\t}\n\t\t}\n\n\t\tlet removed = 0;\n\t\tlet errors = 0;\n\t\tfor (const session of toRemove) {\n\t\t\ttry {\n\t\t\t\tunlinkSync(session.path);\n\t\t\t\tremoved++;\n\t\t\t} catch {\n\t\t\t\terrors++;\n\t\t\t}\n\t\t}\n\n\t\treturn { removed, errors };\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"session-catalog.js","sourceRoot":"","sources":["../../src/session/session-catalog.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Stats, readdirSync, statSync, unlinkSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { AppMessage } from \"../agent/types.js\";\nimport { SESSION_CONFIG } from \"../config/constants.js\";\nimport { createLogger } from \"../utils/logger.js\";\nimport { scheduleSessionMigration } from \"./migration.js\";\nimport {\n\tbuildSessionFileInfo,\n\tsafeReadSessionEntries,\n} from \"./session-context.js\";\nimport type {\n\tSessionMessagesView,\n\tSessionMetadata,\n\tSessionSummary,\n} from \"./types.js\";\n\nconst logger = createLogger(\"session-catalog\");\n\ntype SessionCatalogOptions = {\n\tsessionDir: string;\n\tbeforeRead?: () => void;\n\tgetCurrentSessionId?: () => string | undefined;\n};\n\ntype SessionFileEntry = {\n\tfilePath: string;\n\tmodifiedAt: Date;\n\tstats: Stats;\n};\n\nexport interface LoadedSessionData {\n\tid: string;\n\tsubject?: string;\n\ttitle?: string;\n\tsummary?: string;\n\tresumeSummary?: string;\n\tmemoryExtractionHash?: string;\n\tmessages: AppMessage[];\n\tcreatedAt: string;\n\tupdatedAt: string;\n\tmessageCount: number;\n\tfavorite: boolean;\n\ttags?: string[];\n\tarchived?: boolean;\n\tarchivedAt?: string;\n\tmessagesView: SessionMessagesView;\n}\n\nfunction getSortedSessionFiles(sessionDir: string): SessionFileEntry[] {\n\treturn readdirSync(sessionDir)\n\t\t.filter((fileName) => fileName.endsWith(\".jsonl\"))\n\t\t.map((fileName) => {\n\t\t\tconst filePath = join(sessionDir, fileName);\n\t\t\tconst stats: Stats = statSync(filePath);\n\t\t\treturn { filePath, modifiedAt: stats.mtime, stats };\n\t\t})\n\t\t.sort((a, b) => b.modifiedAt.getTime() - a.modifiedAt.getTime());\n}\n\nexport class SessionCatalog {\n\tconstructor(private readonly options: SessionCatalogOptions) {}\n\n\tloadAllSessions(): SessionMetadata[] {\n\t\tthis.options.beforeRead?.();\n\t\tscheduleSessionMigration();\n\t\tconst sessions: SessionMetadata[] = [];\n\n\t\ttry {\n\t\t\tconst files = getSortedSessionFiles(this.options.sessionDir);\n\n\t\t\tfor (const fileEntry of files) {\n\t\t\t\tconst { filePath, stats } = fileEntry;\n\t\t\t\ttry {\n\t\t\t\t\tconst entries = safeReadSessionEntries(filePath, (error) => {\n\t\t\t\t\t\tlogger.error(\n\t\t\t\t\t\t\t`Failed to read session file ${filePath}`,\n\t\t\t\t\t\t\terror instanceof Error ? error : undefined,\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\t\t\t\t\tconst info = buildSessionFileInfo(entries, stats);\n\t\t\t\t\tif (!info) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tconst derivedSummary =\n\t\t\t\t\t\tinfo.summary || info.firstMessage || \"(no summary)\";\n\n\t\t\t\t\tsessions.push({\n\t\t\t\t\t\tpath: filePath,\n\t\t\t\t\t\tid: info.id,\n\t\t\t\t\t\tsubject: info.subject,\n\t\t\t\t\t\ttitle: info.title,\n\t\t\t\t\t\tcreated: info.created,\n\t\t\t\t\t\tmodified: stats.mtime,\n\t\t\t\t\t\tsize: stats.size,\n\t\t\t\t\t\tmessageCount: info.messageCount,\n\t\t\t\t\t\tfirstMessage: info.firstMessage || \"(no messages)\",\n\t\t\t\t\t\tsummary: derivedSummary,\n\t\t\t\t\t\tresumeSummary: info.resumeSummary,\n\t\t\t\t\t\tmemoryExtractionHash: info.memoryExtractionHash,\n\t\t\t\t\t\tfavorite: info.favorite,\n\t\t\t\t\t\ttags: info.tags,\n\t\t\t\t\t\tarchived: info.archived,\n\t\t\t\t\t\tarchivedAt: info.archivedAt,\n\t\t\t\t\t\tallMessagesText: info.allMessagesText,\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`Failed to process session file ${filePath}`,\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}\n\t\t} catch (error) {\n\t\t\tlogger.error(\n\t\t\t\t\"Failed to load sessions\",\n\t\t\t\terror instanceof Error ? error : undefined,\n\t\t\t);\n\t\t}\n\n\t\treturn sessions;\n\t}\n\n\tgetSessionFileById(sessionId: string): string | null {\n\t\tconst match = this.loadAllSessions().find(\n\t\t\t(session) => session.id === sessionId,\n\t\t);\n\t\treturn match?.path ?? null;\n\t}\n\n\tlistSessions(options?: {\n\t\tlimit?: number;\n\t\toffset?: number;\n\t}): SessionSummary[] {\n\t\tthis.options.beforeRead?.();\n\t\tconst sessions: SessionSummary[] = [];\n\t\tconst sortedFiles = getSortedSessionFiles(this.options.sessionDir);\n\t\tconst offset = Math.max(0, options?.offset ?? 0);\n\t\tconst limit = Math.max(1, options?.limit ?? sortedFiles.length);\n\n\t\tfor (const [index, entry] of sortedFiles.entries()) {\n\t\t\tif (index < offset) continue;\n\t\t\tif (sessions.length >= limit) break;\n\t\t\tconst { filePath, stats } = entry;\n\n\t\t\ttry {\n\t\t\t\tconst entries = safeReadSessionEntries(filePath);\n\t\t\t\tconst info = buildSessionFileInfo(entries, stats);\n\t\t\t\tif (!info) continue;\n\n\t\t\t\tsessions.push({\n\t\t\t\t\tid: info.id,\n\t\t\t\t\tsubject: info.subject,\n\t\t\t\t\ttitle: info.title ?? info.summary,\n\t\t\t\t\tsummary: info.summary || info.firstMessage || undefined,\n\t\t\t\t\tresumeSummary: info.resumeSummary,\n\t\t\t\t\tmemoryExtractionHash: info.memoryExtractionHash,\n\t\t\t\t\tcreatedAt: info.created.toISOString(),\n\t\t\t\t\tupdatedAt: stats.mtime.toISOString(),\n\t\t\t\t\tmessageCount: info.messageCount,\n\t\t\t\t\tfavorite: info.favorite,\n\t\t\t\t\ttags: info.tags,\n\t\t\t\t\tarchived: info.archived,\n\t\t\t\t\tarchivedAt: info.archivedAt,\n\t\t\t\t});\n\t\t\t} catch {\n\t\t\t\t// Skip files that can't be read\n\t\t\t}\n\t\t}\n\n\t\treturn sessions;\n\t}\n\n\tloadSession(\n\t\tsessionId: string,\n\t\toptions: { messagesView?: SessionMessagesView } = {},\n\t): LoadedSessionData | null {\n\t\tthis.options.beforeRead?.();\n\t\tconst sessionFile = this.getSessionFileById(sessionId);\n\t\tif (!sessionFile) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst stats = statSync(sessionFile);\n\t\tconst entries = safeReadSessionEntries(sessionFile);\n\t\tconst info = buildSessionFileInfo(entries, stats, {\n\t\t\tmessagesView: options.messagesView,\n\t\t});\n\t\tif (!info) {\n\t\t\treturn null;\n\t\t}\n\t\tconst derivedSummary = info.summary || info.firstMessage || \"(no summary)\";\n\n\t\treturn {\n\t\t\tid: info.id,\n\t\t\tsubject: info.subject,\n\t\t\ttitle: info.title ?? info.summary,\n\t\t\tsummary: derivedSummary,\n\t\t\tresumeSummary: info.resumeSummary,\n\t\t\tmemoryExtractionHash: info.memoryExtractionHash,\n\t\t\tmessages: info.messages,\n\t\t\tcreatedAt: info.created.toISOString(),\n\t\t\tupdatedAt: stats.mtime.toISOString(),\n\t\t\tmessageCount: info.messageCount,\n\t\t\tfavorite: info.favorite,\n\t\t\ttags: info.tags,\n\t\t\tarchived: info.archived,\n\t\t\tarchivedAt: info.archivedAt,\n\t\t\tmessagesView: info.messagesView,\n\t\t};\n\t}\n\n\tdeleteSession(sessionId: string): void {\n\t\tconst sessionFile = this.getSessionFileById(sessionId);\n\t\tif (!sessionFile) {\n\t\t\tthrow new Error(`Session ${sessionId} not found`);\n\t\t}\n\n\t\tunlinkSync(sessionFile);\n\t}\n\n\tpruneSessions(): { removed: number; errors: number } {\n\t\tconst maxSessions = SESSION_CONFIG.MAX_SESSIONS;\n\t\tconst maxAgeDays = SESSION_CONFIG.MAX_SESSION_AGE_DAYS;\n\n\t\tif (maxSessions <= 0 && maxAgeDays <= 0) {\n\t\t\treturn { removed: 0, errors: 0 };\n\t\t}\n\n\t\tconst sessions = this.loadAllSessions();\n\t\tconst currentSessionId = this.options.getCurrentSessionId?.();\n\t\tconst now = Date.now();\n\t\tconst maxAgeMs = maxAgeDays > 0 ? maxAgeDays * 24 * 60 * 60 * 1000 : 0;\n\t\tconst toRemove: SessionMetadata[] = [];\n\n\t\tif (maxAgeMs > 0) {\n\t\t\tfor (const session of sessions) {\n\t\t\t\tif (session.favorite) continue;\n\t\t\t\tif (session.id === currentSessionId) continue;\n\t\t\t\tif (now - session.modified.getTime() > maxAgeMs) {\n\t\t\t\t\ttoRemove.push(session);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (maxSessions > 0) {\n\t\t\tconst eligible = sessions.filter(\n\t\t\t\t(session) =>\n\t\t\t\t\t!session.favorite &&\n\t\t\t\t\tsession.id !== currentSessionId &&\n\t\t\t\t\t!toRemove.some((removedSession) => removedSession.id === session.id),\n\t\t\t);\n\t\t\tif (eligible.length > maxSessions) {\n\t\t\t\ttoRemove.push(...eligible.slice(maxSessions));\n\t\t\t}\n\t\t}\n\n\t\tlet removed = 0;\n\t\tlet errors = 0;\n\t\tfor (const session of toRemove) {\n\t\t\ttry {\n\t\t\t\tunlinkSync(session.path);\n\t\t\t\tremoved++;\n\t\t\t} catch {\n\t\t\t\terrors++;\n\t\t\t}\n\t\t}\n\n\t\treturn { removed, errors };\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-context.d.ts","sourceRoot":"","sources":["../../src/session/session-context.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AASrC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAMpD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAGhE,OAAO,KAAK,EAEX,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,MAAM,YAAY,CAAC;AAOpB,MAAM,WAAW,eAAe;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,IAAI,CAAC;IACd,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,mBAAmB,CAAC;CAClC;AAED,MAAM,WAAW,sBAAsB;IACtC,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,cAAc,EAAE,gBAAgB,EAAE,CAAC;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,aAAa,CAAC,EAAE,oBAAoB,CAAC;CACrC;AAMD,wBAAgB,sBAAsB,CACrC,OAAO,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GACjD,MAAM,CAWR;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAEtE;AAMD,wBAAgB,eAAe,CAAC,QAAQ,EAAE;IACzC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;CACzB,GAAG,MAAM,CAQT;AAMD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,EAAE,CAiBnE;AAED,wBAAgB,sBAAsB,CACrC,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAChC,YAAY,EAAE,CAOhB;AAMD,wBAAgB,8BAA8B,CAC7C,OAAO,EAAE,YAAY,EAAE,EACvB,OAAO,CAAC,EAAE;IACT,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,IAAI,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACrC,MAAM,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;CACnC,GACC,sBAAsB,CAgJxB;AAED,wBAAgB,4BAA4B,CAC3C,QAAQ,EAAE,UAAU,EAAE,EACtB,IAAI,GAAE,mBAA4B,GAChC,UAAU,EAAE,CAiBd;AAMD,wBAAgB,oBAAoB,CACnC,OAAO,EAAE,YAAY,EAAE,EACvB,KAAK,EAAE,KAAK,EACZ,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,mBAAmB,CAAA;CAAO,GAClD,eAAe,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"session-context.d.ts","sourceRoot":"","sources":["../../src/session/session-context.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AASrC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAMpD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAGhE,OAAO,KAAK,EAEX,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,MAAM,YAAY,CAAC;AAOpB,MAAM,WAAW,eAAe;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,IAAI,CAAC;IACd,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,mBAAmB,CAAC;CAClC;AAED,MAAM,WAAW,sBAAsB;IACtC,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,cAAc,EAAE,gBAAgB,EAAE,CAAC;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,aAAa,CAAC,EAAE,oBAAoB,CAAC;CACrC;AAMD,wBAAgB,sBAAsB,CACrC,OAAO,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GACjD,MAAM,CAWR;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAEtE;AAMD,wBAAgB,eAAe,CAAC,QAAQ,EAAE;IACzC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;CACzB,GAAG,MAAM,CAQT;AAMD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,EAAE,CAiBnE;AAED,wBAAgB,sBAAsB,CACrC,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAChC,YAAY,EAAE,CAOhB;AAMD,wBAAgB,8BAA8B,CAC7C,OAAO,EAAE,YAAY,EAAE,EACvB,OAAO,CAAC,EAAE;IACT,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,IAAI,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACrC,MAAM,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;CACnC,GACC,sBAAsB,CAgJxB;AAED,wBAAgB,4BAA4B,CAC3C,QAAQ,EAAE,UAAU,EAAE,EACtB,IAAI,GAAE,mBAA4B,GAChC,UAAU,EAAE,CAiBd;AAMD,wBAAgB,oBAAoB,CACnC,OAAO,EAAE,YAAY,EAAE,EACvB,KAAK,EAAE,KAAK,EACZ,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,mBAAmB,CAAA;CAAO,GAClD,eAAe,GAAG,IAAI,CAqJxB"}
|
|
@@ -218,6 +218,8 @@ export function buildSessionFileInfo(entries, stats, options = {}) {
|
|
|
218
218
|
let title;
|
|
219
219
|
let tags;
|
|
220
220
|
let favorite = false;
|
|
221
|
+
let archived = false;
|
|
222
|
+
let archivedAt;
|
|
221
223
|
const extractedById = new Map();
|
|
222
224
|
for (const entry of entries) {
|
|
223
225
|
switch (entry.type) {
|
|
@@ -259,6 +261,15 @@ export function buildSessionFileInfo(entries, stats, options = {}) {
|
|
|
259
261
|
if (typeof entry.favorite === "boolean") {
|
|
260
262
|
favorite = entry.favorite;
|
|
261
263
|
}
|
|
264
|
+
if (typeof entry.archived === "boolean") {
|
|
265
|
+
archived = entry.archived;
|
|
266
|
+
archivedAt =
|
|
267
|
+
entry.archived &&
|
|
268
|
+
typeof entry.archivedAt === "string" &&
|
|
269
|
+
entry.archivedAt.trim()
|
|
270
|
+
? entry.archivedAt
|
|
271
|
+
: undefined;
|
|
272
|
+
}
|
|
262
273
|
break;
|
|
263
274
|
default:
|
|
264
275
|
break;
|
|
@@ -280,6 +291,8 @@ export function buildSessionFileInfo(entries, stats, options = {}) {
|
|
|
280
291
|
title,
|
|
281
292
|
tags,
|
|
282
293
|
favorite,
|
|
294
|
+
archived,
|
|
295
|
+
archivedAt,
|
|
283
296
|
firstMessage: "",
|
|
284
297
|
allMessagesText: "",
|
|
285
298
|
messagesView,
|
|
@@ -312,6 +325,8 @@ export function buildSessionFileInfo(entries, stats, options = {}) {
|
|
|
312
325
|
title,
|
|
313
326
|
tags,
|
|
314
327
|
favorite,
|
|
328
|
+
archived,
|
|
329
|
+
archivedAt,
|
|
315
330
|
firstMessage,
|
|
316
331
|
allMessagesText,
|
|
317
332
|
messagesView,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-context.js","sourceRoot":"","sources":["../../src/session/session-context.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Session Context Rebuilding\n * Pure functions for reconstructing conversation context from session entries.\n * Handles tree traversal, compaction, attachment normalization, and metadata extraction.\n */\n\nimport type { Stats } from \"node:fs\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport { isDecoratedCompactionSummaryMessage } from \"../agent/compaction.js\";\nimport {\n\tcreateBranchSummaryMessage,\n\tcreateCompactionSummaryMessage,\n\tcreateHookMessage,\n} from \"../agent/custom-messages.js\";\nimport type { AppMessage } from \"../agent/types.js\";\nimport {\n\tbuildConversationModel,\n\tisRenderableUserMessage,\n\trenderMessageToPlainText,\n} from \"../conversation/render-model.js\";\nimport type { SessionModelMetadata } from \"./metadata-cache.js\";\nimport { migrateToCurrentVersion } from \"./migration.js\";\nimport { applyAttachmentExtracts } from \"./session-sanitize.js\";\nimport type {\n\tCompactionEntry,\n\tSessionEntry,\n\tSessionHeaderEntry,\n\tSessionMessagesView,\n\tSessionTreeEntry,\n} from \"./types.js\";\nimport { isSessionTreeEntry, tryParseSessionEntry } from \"./types.js\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface SessionFileInfo {\n\tid: string;\n\tcwd?: string;\n\tsubject?: string;\n\tcreated: Date;\n\tmessages: AppMessage[];\n\tmessageCount: number;\n\tsummary?: string;\n\tresumeSummary?: string;\n\tmemoryExtractionHash?: string;\n\ttitle?: string;\n\ttags?: string[];\n\tfavorite: boolean;\n\tfirstMessage: string;\n\tallMessagesText: string;\n\tmessagesView: SessionMessagesView;\n}\n\nexport interface SessionContextSnapshot {\n\tmessages: AppMessage[];\n\tmessageEntries: SessionTreeEntry[];\n\tthinkingLevel: string;\n\tmodel: string | null;\n\tmodelMetadata?: SessionModelMetadata;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Text Helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function extractTextFromContent(\n\tcontent: string | { type: string; text?: string }[],\n): string {\n\tif (typeof content === \"string\") return content;\n\tif (Array.isArray(content)) {\n\t\treturn content\n\t\t\t.filter(\n\t\t\t\t(block) => block.type === \"text\" && typeof block.text === \"string\",\n\t\t\t)\n\t\t\t.map((block) => block.text)\n\t\t\t.join(\" \");\n\t}\n\treturn \"\";\n}\n\nexport function isLikelyCompactionSummary(message: AppMessage): boolean {\n\treturn isDecoratedCompactionSummaryMessage(message);\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Entry ID Generation\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function generateEntryId(existing: {\n\thas(id: string): boolean;\n}): string {\n\tfor (let i = 0; i < 100; i++) {\n\t\tconst id = uuidv4().slice(0, 8);\n\t\tif (!existing.has(id)) {\n\t\t\treturn id;\n\t\t}\n\t}\n\treturn uuidv4();\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Entry Parsing\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function readSessionEntries(filePath: string): SessionEntry[] {\n\tif (!existsSync(filePath)) {\n\t\treturn [];\n\t}\n\tconst contents = readFileSync(filePath, \"utf8\").trim();\n\tif (!contents) {\n\t\treturn [];\n\t}\n\n\tconst entries: SessionEntry[] = [];\n\tfor (const line of contents.split(\"\\n\")) {\n\t\tconst entry = tryParseSessionEntry(line);\n\t\tif (entry) {\n\t\t\tentries.push(entry);\n\t\t}\n\t}\n\treturn entries;\n}\n\nexport function safeReadSessionEntries(\n\tfilePath: string,\n\tonError?: (error: unknown) => void,\n): SessionEntry[] {\n\ttry {\n\t\treturn readSessionEntries(filePath);\n\t} catch (error) {\n\t\tonError?.(error);\n\t\treturn [];\n\t}\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Context Rebuilding\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function buildSessionContextFromEntries(\n\tentries: SessionEntry[],\n\toptions?: {\n\t\tleafId?: string | null;\n\t\tbyId?: Map<string, SessionTreeEntry>;\n\t\theader?: SessionHeaderEntry | null;\n\t},\n): SessionContextSnapshot {\n\tconst treeEntries = entries.filter(isSessionTreeEntry);\n\tconst byId = options?.byId ?? new Map<string, SessionTreeEntry>();\n\tif (!options?.byId) {\n\t\tfor (const entry of treeEntries) {\n\t\t\tbyId.set(entry.id, entry);\n\t\t}\n\t}\n\n\tconst header =\n\t\toptions?.header ??\n\t\t(entries.find((e) => e.type === \"session\") as SessionHeaderEntry | null);\n\tlet thinkingLevel = header?.thinkingLevel ?? \"off\";\n\tlet model = header?.model ?? null;\n\tlet modelMetadata = header?.modelMetadata;\n\n\tif (options?.leafId === null) {\n\t\treturn {\n\t\t\tmessages: [],\n\t\t\tmessageEntries: [],\n\t\t\tthinkingLevel,\n\t\t\tmodel,\n\t\t\tmodelMetadata,\n\t\t};\n\t}\n\n\tlet leaf: SessionTreeEntry | undefined;\n\tif (options?.leafId) {\n\t\tleaf = byId.get(options.leafId);\n\t}\n\tif (!leaf) {\n\t\tleaf = treeEntries[treeEntries.length - 1];\n\t}\n\n\tif (!leaf) {\n\t\treturn {\n\t\t\tmessages: [],\n\t\t\tmessageEntries: [],\n\t\t\tthinkingLevel,\n\t\t\tmodel,\n\t\t\tmodelMetadata,\n\t\t};\n\t}\n\n\tconst path: SessionTreeEntry[] = [];\n\tlet current: SessionTreeEntry | undefined = leaf;\n\twhile (current) {\n\t\tpath.unshift(current);\n\t\tcurrent = current.parentId ? byId.get(current.parentId) : undefined;\n\t}\n\n\tlet compaction: CompactionEntry | null = null;\n\tfor (const entry of path) {\n\t\tif (entry.type === \"thinking_level_change\") {\n\t\t\tthinkingLevel = entry.thinkingLevel;\n\t\t} else if (entry.type === \"model_change\") {\n\t\t\tmodel = entry.model;\n\t\t\tif (entry.modelMetadata) {\n\t\t\t\tmodelMetadata = entry.modelMetadata;\n\t\t\t}\n\t\t} else if (entry.type === \"message\" && entry.message.role === \"assistant\") {\n\t\t\tmodel = `${entry.message.provider}/${entry.message.model}`;\n\t\t} else if (entry.type === \"compaction\") {\n\t\t\tcompaction = entry;\n\t\t}\n\t}\n\n\tconst messages: AppMessage[] = [];\n\tconst messageEntries: SessionTreeEntry[] = [];\n\n\tconst appendMessage = (entry: SessionTreeEntry) => {\n\t\tif (entry.type === \"message\") {\n\t\t\tmessages.push(entry.message);\n\t\t\tmessageEntries.push(entry);\n\t\t\treturn;\n\t\t}\n\t\tif (entry.type === \"custom_message\") {\n\t\t\tmessages.push(\n\t\t\t\tcreateHookMessage(\n\t\t\t\t\tentry.customType,\n\t\t\t\t\tentry.content,\n\t\t\t\t\tentry.display,\n\t\t\t\t\tentry.details,\n\t\t\t\t\tentry.timestamp,\n\t\t\t\t),\n\t\t\t);\n\t\t\tmessageEntries.push(entry);\n\t\t\treturn;\n\t\t}\n\t\tif (entry.type === \"branch_summary\" && entry.summary) {\n\t\t\tmessages.push(\n\t\t\t\tcreateBranchSummaryMessage(\n\t\t\t\t\tentry.summary,\n\t\t\t\t\tentry.fromId,\n\t\t\t\t\tentry.timestamp,\n\t\t\t\t),\n\t\t\t);\n\t\t\tmessageEntries.push(entry);\n\t\t}\n\t};\n\n\tif (compaction) {\n\t\tconst compactionIdx = path.findIndex(\n\t\t\t(entry) => entry.type === \"compaction\" && entry.id === compaction.id,\n\t\t);\n\t\tconst hasStoredSummary = path\n\t\t\t.slice(compactionIdx + 1)\n\t\t\t.some(\n\t\t\t\t(entry) =>\n\t\t\t\t\tentry.type === \"message\" && isLikelyCompactionSummary(entry.message),\n\t\t\t);\n\n\t\tif (!hasStoredSummary) {\n\t\t\tmessages.push(\n\t\t\t\tcreateCompactionSummaryMessage(\n\t\t\t\t\tcompaction.summary,\n\t\t\t\t\tcompaction.tokensBefore,\n\t\t\t\t\tcompaction.timestamp,\n\t\t\t\t),\n\t\t\t);\n\t\t\tmessageEntries.push(compaction);\n\t\t}\n\n\t\tlet foundFirstKept = false;\n\t\tfor (let i = 0; i < compactionIdx; i++) {\n\t\t\tconst entry = path[i]!;\n\t\t\tif (entry.id === compaction.firstKeptEntryId) {\n\t\t\t\tfoundFirstKept = true;\n\t\t\t}\n\t\t\tif (foundFirstKept) {\n\t\t\t\tappendMessage(entry);\n\t\t\t}\n\t\t}\n\n\t\tfor (let i = compactionIdx + 1; i < path.length; i++) {\n\t\t\tappendMessage(path[i]!);\n\t\t}\n\t} else {\n\t\tfor (const entry of path) {\n\t\t\tappendMessage(entry);\n\t\t}\n\t}\n\n\treturn { messages, messageEntries, thinkingLevel, model, modelMetadata };\n}\n\nexport function selectSessionMessagesForView(\n\tmessages: AppMessage[],\n\tview: SessionMessagesView = \"full\",\n): AppMessage[] {\n\tif (view === \"notLoaded\") {\n\t\treturn [];\n\t}\n\tif (view === \"full\" || messages.length <= 2) {\n\t\treturn messages;\n\t}\n\tconst firstUser = messages.find((message) => message.role === \"user\");\n\tconst lastMessage = messages.at(-1);\n\tconst selected: AppMessage[] = [];\n\tif (firstUser) {\n\t\tselected.push(firstUser);\n\t}\n\tif (lastMessage && lastMessage !== firstUser) {\n\t\tselected.push(lastMessage);\n\t}\n\treturn selected.length > 0 ? selected : messages.slice(0, 1);\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Session File Info\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function buildSessionFileInfo(\n\tentries: SessionEntry[],\n\tstats: Stats,\n\toptions: { messagesView?: SessionMessagesView } = {},\n): SessionFileInfo | null {\n\tif (entries.length === 0) {\n\t\treturn null;\n\t}\n\tmigrateToCurrentVersion(entries);\n\n\tlet sessionId = \"\";\n\tlet cwd: string | undefined;\n\tlet subject: string | undefined;\n\tlet created = stats.birthtime;\n\tlet summary: string | undefined;\n\tlet resumeSummary: string | undefined;\n\tlet memoryExtractionHash: string | undefined;\n\tlet title: string | undefined;\n\tlet tags: string[] | undefined;\n\tlet favorite = false;\n\tconst extractedById = new Map<string, string>();\n\n\tfor (const entry of entries) {\n\t\tswitch (entry.type) {\n\t\t\tcase \"session\":\n\t\t\t\tif (!sessionId) {\n\t\t\t\t\tsessionId = entry.id;\n\t\t\t\t\tcreated = new Date(entry.timestamp);\n\t\t\t\t}\n\t\t\t\tif (typeof entry.cwd === \"string\" && entry.cwd.trim()) {\n\t\t\t\t\tcwd = entry.cwd;\n\t\t\t\t}\n\t\t\t\tif (typeof entry.subject === \"string\" && entry.subject) {\n\t\t\t\t\tsubject = entry.subject;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"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\tbreak;\n\t\t\tcase \"session_meta\":\n\t\t\t\tif (typeof entry.summary === \"string\" && entry.summary.trim()) {\n\t\t\t\t\tsummary = entry.summary;\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\ttypeof entry.resumeSummary === \"string\" &&\n\t\t\t\t\tentry.resumeSummary.trim()\n\t\t\t\t) {\n\t\t\t\t\tresumeSummary = entry.resumeSummary;\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\ttypeof entry.memoryExtractionHash === \"string\" &&\n\t\t\t\t\tentry.memoryExtractionHash.trim()\n\t\t\t\t) {\n\t\t\t\t\tmemoryExtractionHash = entry.memoryExtractionHash;\n\t\t\t\t}\n\t\t\t\tif (typeof entry.title === \"string\" && entry.title.trim()) {\n\t\t\t\t\ttitle = entry.title;\n\t\t\t\t}\n\t\t\t\tif (Array.isArray(entry.tags)) {\n\t\t\t\t\ttags = entry.tags;\n\t\t\t\t}\n\t\t\t\tif (typeof entry.favorite === \"boolean\") {\n\t\t\t\t\tfavorite = entry.favorite;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tconst messageCount = entries.filter(\n\t\t(entry) => entry.type === \"message\",\n\t).length;\n\tconst messagesView = options.messagesView ?? \"full\";\n\n\tif (messagesView === \"notLoaded\") {\n\t\treturn {\n\t\t\tid: sessionId || \"unknown\",\n\t\t\tcwd,\n\t\t\tsubject,\n\t\t\tcreated,\n\t\t\tmessages: [],\n\t\t\tmessageCount,\n\t\t\tsummary,\n\t\t\tresumeSummary,\n\t\t\tmemoryExtractionHash,\n\t\t\ttitle,\n\t\t\ttags,\n\t\t\tfavorite,\n\t\t\tfirstMessage: \"\",\n\t\t\tallMessagesText: \"\",\n\t\t\tmessagesView,\n\t\t};\n\t}\n\n\tconst context = buildSessionContextFromEntries(entries);\n\n\tconst normalizedMessages = extractedById.size\n\t\t? context.messages.map((message) =>\n\t\t\t\tapplyAttachmentExtracts(message, extractedById),\n\t\t\t)\n\t\t: context.messages;\n\tconst selectedMessages = selectSessionMessagesForView(\n\t\tnormalizedMessages,\n\t\tmessagesView,\n\t);\n\n\tconst renderables = buildConversationModel(selectedMessages);\n\tconst firstRenderableUser = renderables.find((renderable) =>\n\t\tisRenderableUserMessage(renderable),\n\t);\n\tconst firstMessage = firstRenderableUser\n\t\t? renderMessageToPlainText(firstRenderableUser)\n\t\t: \"\";\n\tconst allMessagesText = renderables\n\t\t.map((renderable) => renderMessageToPlainText(renderable))\n\t\t.filter(Boolean)\n\t\t.join(\" \");\n\n\treturn {\n\t\tid: sessionId || \"unknown\",\n\t\tcwd,\n\t\tsubject,\n\t\tcreated,\n\t\tmessages: selectedMessages,\n\t\tmessageCount,\n\t\tsummary,\n\t\tresumeSummary,\n\t\tmemoryExtractionHash,\n\t\ttitle,\n\t\ttags,\n\t\tfavorite,\n\t\tfirstMessage,\n\t\tallMessagesText,\n\t\tmessagesView,\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"session-context.js","sourceRoot":"","sources":["../../src/session/session-context.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Session Context Rebuilding\n * Pure functions for reconstructing conversation context from session entries.\n * Handles tree traversal, compaction, attachment normalization, and metadata extraction.\n */\n\nimport type { Stats } from \"node:fs\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport { isDecoratedCompactionSummaryMessage } from \"../agent/compaction.js\";\nimport {\n\tcreateBranchSummaryMessage,\n\tcreateCompactionSummaryMessage,\n\tcreateHookMessage,\n} from \"../agent/custom-messages.js\";\nimport type { AppMessage } from \"../agent/types.js\";\nimport {\n\tbuildConversationModel,\n\tisRenderableUserMessage,\n\trenderMessageToPlainText,\n} from \"../conversation/render-model.js\";\nimport type { SessionModelMetadata } from \"./metadata-cache.js\";\nimport { migrateToCurrentVersion } from \"./migration.js\";\nimport { applyAttachmentExtracts } from \"./session-sanitize.js\";\nimport type {\n\tCompactionEntry,\n\tSessionEntry,\n\tSessionHeaderEntry,\n\tSessionMessagesView,\n\tSessionTreeEntry,\n} from \"./types.js\";\nimport { isSessionTreeEntry, tryParseSessionEntry } from \"./types.js\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface SessionFileInfo {\n\tid: string;\n\tcwd?: string;\n\tsubject?: string;\n\tcreated: Date;\n\tmessages: AppMessage[];\n\tmessageCount: number;\n\tsummary?: string;\n\tresumeSummary?: string;\n\tmemoryExtractionHash?: string;\n\ttitle?: string;\n\ttags?: string[];\n\tfavorite: boolean;\n\tarchived: boolean;\n\tarchivedAt?: string;\n\tfirstMessage: string;\n\tallMessagesText: string;\n\tmessagesView: SessionMessagesView;\n}\n\nexport interface SessionContextSnapshot {\n\tmessages: AppMessage[];\n\tmessageEntries: SessionTreeEntry[];\n\tthinkingLevel: string;\n\tmodel: string | null;\n\tmodelMetadata?: SessionModelMetadata;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Text Helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function extractTextFromContent(\n\tcontent: string | { type: string; text?: string }[],\n): string {\n\tif (typeof content === \"string\") return content;\n\tif (Array.isArray(content)) {\n\t\treturn content\n\t\t\t.filter(\n\t\t\t\t(block) => block.type === \"text\" && typeof block.text === \"string\",\n\t\t\t)\n\t\t\t.map((block) => block.text)\n\t\t\t.join(\" \");\n\t}\n\treturn \"\";\n}\n\nexport function isLikelyCompactionSummary(message: AppMessage): boolean {\n\treturn isDecoratedCompactionSummaryMessage(message);\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Entry ID Generation\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function generateEntryId(existing: {\n\thas(id: string): boolean;\n}): string {\n\tfor (let i = 0; i < 100; i++) {\n\t\tconst id = uuidv4().slice(0, 8);\n\t\tif (!existing.has(id)) {\n\t\t\treturn id;\n\t\t}\n\t}\n\treturn uuidv4();\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Entry Parsing\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function readSessionEntries(filePath: string): SessionEntry[] {\n\tif (!existsSync(filePath)) {\n\t\treturn [];\n\t}\n\tconst contents = readFileSync(filePath, \"utf8\").trim();\n\tif (!contents) {\n\t\treturn [];\n\t}\n\n\tconst entries: SessionEntry[] = [];\n\tfor (const line of contents.split(\"\\n\")) {\n\t\tconst entry = tryParseSessionEntry(line);\n\t\tif (entry) {\n\t\t\tentries.push(entry);\n\t\t}\n\t}\n\treturn entries;\n}\n\nexport function safeReadSessionEntries(\n\tfilePath: string,\n\tonError?: (error: unknown) => void,\n): SessionEntry[] {\n\ttry {\n\t\treturn readSessionEntries(filePath);\n\t} catch (error) {\n\t\tonError?.(error);\n\t\treturn [];\n\t}\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Context Rebuilding\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function buildSessionContextFromEntries(\n\tentries: SessionEntry[],\n\toptions?: {\n\t\tleafId?: string | null;\n\t\tbyId?: Map<string, SessionTreeEntry>;\n\t\theader?: SessionHeaderEntry | null;\n\t},\n): SessionContextSnapshot {\n\tconst treeEntries = entries.filter(isSessionTreeEntry);\n\tconst byId = options?.byId ?? new Map<string, SessionTreeEntry>();\n\tif (!options?.byId) {\n\t\tfor (const entry of treeEntries) {\n\t\t\tbyId.set(entry.id, entry);\n\t\t}\n\t}\n\n\tconst header =\n\t\toptions?.header ??\n\t\t(entries.find((e) => e.type === \"session\") as SessionHeaderEntry | null);\n\tlet thinkingLevel = header?.thinkingLevel ?? \"off\";\n\tlet model = header?.model ?? null;\n\tlet modelMetadata = header?.modelMetadata;\n\n\tif (options?.leafId === null) {\n\t\treturn {\n\t\t\tmessages: [],\n\t\t\tmessageEntries: [],\n\t\t\tthinkingLevel,\n\t\t\tmodel,\n\t\t\tmodelMetadata,\n\t\t};\n\t}\n\n\tlet leaf: SessionTreeEntry | undefined;\n\tif (options?.leafId) {\n\t\tleaf = byId.get(options.leafId);\n\t}\n\tif (!leaf) {\n\t\tleaf = treeEntries[treeEntries.length - 1];\n\t}\n\n\tif (!leaf) {\n\t\treturn {\n\t\t\tmessages: [],\n\t\t\tmessageEntries: [],\n\t\t\tthinkingLevel,\n\t\t\tmodel,\n\t\t\tmodelMetadata,\n\t\t};\n\t}\n\n\tconst path: SessionTreeEntry[] = [];\n\tlet current: SessionTreeEntry | undefined = leaf;\n\twhile (current) {\n\t\tpath.unshift(current);\n\t\tcurrent = current.parentId ? byId.get(current.parentId) : undefined;\n\t}\n\n\tlet compaction: CompactionEntry | null = null;\n\tfor (const entry of path) {\n\t\tif (entry.type === \"thinking_level_change\") {\n\t\t\tthinkingLevel = entry.thinkingLevel;\n\t\t} else if (entry.type === \"model_change\") {\n\t\t\tmodel = entry.model;\n\t\t\tif (entry.modelMetadata) {\n\t\t\t\tmodelMetadata = entry.modelMetadata;\n\t\t\t}\n\t\t} else if (entry.type === \"message\" && entry.message.role === \"assistant\") {\n\t\t\tmodel = `${entry.message.provider}/${entry.message.model}`;\n\t\t} else if (entry.type === \"compaction\") {\n\t\t\tcompaction = entry;\n\t\t}\n\t}\n\n\tconst messages: AppMessage[] = [];\n\tconst messageEntries: SessionTreeEntry[] = [];\n\n\tconst appendMessage = (entry: SessionTreeEntry) => {\n\t\tif (entry.type === \"message\") {\n\t\t\tmessages.push(entry.message);\n\t\t\tmessageEntries.push(entry);\n\t\t\treturn;\n\t\t}\n\t\tif (entry.type === \"custom_message\") {\n\t\t\tmessages.push(\n\t\t\t\tcreateHookMessage(\n\t\t\t\t\tentry.customType,\n\t\t\t\t\tentry.content,\n\t\t\t\t\tentry.display,\n\t\t\t\t\tentry.details,\n\t\t\t\t\tentry.timestamp,\n\t\t\t\t),\n\t\t\t);\n\t\t\tmessageEntries.push(entry);\n\t\t\treturn;\n\t\t}\n\t\tif (entry.type === \"branch_summary\" && entry.summary) {\n\t\t\tmessages.push(\n\t\t\t\tcreateBranchSummaryMessage(\n\t\t\t\t\tentry.summary,\n\t\t\t\t\tentry.fromId,\n\t\t\t\t\tentry.timestamp,\n\t\t\t\t),\n\t\t\t);\n\t\t\tmessageEntries.push(entry);\n\t\t}\n\t};\n\n\tif (compaction) {\n\t\tconst compactionIdx = path.findIndex(\n\t\t\t(entry) => entry.type === \"compaction\" && entry.id === compaction.id,\n\t\t);\n\t\tconst hasStoredSummary = path\n\t\t\t.slice(compactionIdx + 1)\n\t\t\t.some(\n\t\t\t\t(entry) =>\n\t\t\t\t\tentry.type === \"message\" && isLikelyCompactionSummary(entry.message),\n\t\t\t);\n\n\t\tif (!hasStoredSummary) {\n\t\t\tmessages.push(\n\t\t\t\tcreateCompactionSummaryMessage(\n\t\t\t\t\tcompaction.summary,\n\t\t\t\t\tcompaction.tokensBefore,\n\t\t\t\t\tcompaction.timestamp,\n\t\t\t\t),\n\t\t\t);\n\t\t\tmessageEntries.push(compaction);\n\t\t}\n\n\t\tlet foundFirstKept = false;\n\t\tfor (let i = 0; i < compactionIdx; i++) {\n\t\t\tconst entry = path[i]!;\n\t\t\tif (entry.id === compaction.firstKeptEntryId) {\n\t\t\t\tfoundFirstKept = true;\n\t\t\t}\n\t\t\tif (foundFirstKept) {\n\t\t\t\tappendMessage(entry);\n\t\t\t}\n\t\t}\n\n\t\tfor (let i = compactionIdx + 1; i < path.length; i++) {\n\t\t\tappendMessage(path[i]!);\n\t\t}\n\t} else {\n\t\tfor (const entry of path) {\n\t\t\tappendMessage(entry);\n\t\t}\n\t}\n\n\treturn { messages, messageEntries, thinkingLevel, model, modelMetadata };\n}\n\nexport function selectSessionMessagesForView(\n\tmessages: AppMessage[],\n\tview: SessionMessagesView = \"full\",\n): AppMessage[] {\n\tif (view === \"notLoaded\") {\n\t\treturn [];\n\t}\n\tif (view === \"full\" || messages.length <= 2) {\n\t\treturn messages;\n\t}\n\tconst firstUser = messages.find((message) => message.role === \"user\");\n\tconst lastMessage = messages.at(-1);\n\tconst selected: AppMessage[] = [];\n\tif (firstUser) {\n\t\tselected.push(firstUser);\n\t}\n\tif (lastMessage && lastMessage !== firstUser) {\n\t\tselected.push(lastMessage);\n\t}\n\treturn selected.length > 0 ? selected : messages.slice(0, 1);\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Session File Info\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function buildSessionFileInfo(\n\tentries: SessionEntry[],\n\tstats: Stats,\n\toptions: { messagesView?: SessionMessagesView } = {},\n): SessionFileInfo | null {\n\tif (entries.length === 0) {\n\t\treturn null;\n\t}\n\tmigrateToCurrentVersion(entries);\n\n\tlet sessionId = \"\";\n\tlet cwd: string | undefined;\n\tlet subject: string | undefined;\n\tlet created = stats.birthtime;\n\tlet summary: string | undefined;\n\tlet resumeSummary: string | undefined;\n\tlet memoryExtractionHash: string | undefined;\n\tlet title: string | undefined;\n\tlet tags: string[] | undefined;\n\tlet favorite = false;\n\tlet archived = false;\n\tlet archivedAt: string | undefined;\n\tconst extractedById = new Map<string, string>();\n\n\tfor (const entry of entries) {\n\t\tswitch (entry.type) {\n\t\t\tcase \"session\":\n\t\t\t\tif (!sessionId) {\n\t\t\t\t\tsessionId = entry.id;\n\t\t\t\t\tcreated = new Date(entry.timestamp);\n\t\t\t\t}\n\t\t\t\tif (typeof entry.cwd === \"string\" && entry.cwd.trim()) {\n\t\t\t\t\tcwd = entry.cwd;\n\t\t\t\t}\n\t\t\t\tif (typeof entry.subject === \"string\" && entry.subject) {\n\t\t\t\t\tsubject = entry.subject;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"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\tbreak;\n\t\t\tcase \"session_meta\":\n\t\t\t\tif (typeof entry.summary === \"string\" && entry.summary.trim()) {\n\t\t\t\t\tsummary = entry.summary;\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\ttypeof entry.resumeSummary === \"string\" &&\n\t\t\t\t\tentry.resumeSummary.trim()\n\t\t\t\t) {\n\t\t\t\t\tresumeSummary = entry.resumeSummary;\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\ttypeof entry.memoryExtractionHash === \"string\" &&\n\t\t\t\t\tentry.memoryExtractionHash.trim()\n\t\t\t\t) {\n\t\t\t\t\tmemoryExtractionHash = entry.memoryExtractionHash;\n\t\t\t\t}\n\t\t\t\tif (typeof entry.title === \"string\" && entry.title.trim()) {\n\t\t\t\t\ttitle = entry.title;\n\t\t\t\t}\n\t\t\t\tif (Array.isArray(entry.tags)) {\n\t\t\t\t\ttags = entry.tags;\n\t\t\t\t}\n\t\t\t\tif (typeof entry.favorite === \"boolean\") {\n\t\t\t\t\tfavorite = entry.favorite;\n\t\t\t\t}\n\t\t\t\tif (typeof entry.archived === \"boolean\") {\n\t\t\t\t\tarchived = entry.archived;\n\t\t\t\t\tarchivedAt =\n\t\t\t\t\t\tentry.archived &&\n\t\t\t\t\t\ttypeof entry.archivedAt === \"string\" &&\n\t\t\t\t\t\tentry.archivedAt.trim()\n\t\t\t\t\t\t\t? entry.archivedAt\n\t\t\t\t\t\t\t: undefined;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tconst messageCount = entries.filter(\n\t\t(entry) => entry.type === \"message\",\n\t).length;\n\tconst messagesView = options.messagesView ?? \"full\";\n\n\tif (messagesView === \"notLoaded\") {\n\t\treturn {\n\t\t\tid: sessionId || \"unknown\",\n\t\t\tcwd,\n\t\t\tsubject,\n\t\t\tcreated,\n\t\t\tmessages: [],\n\t\t\tmessageCount,\n\t\t\tsummary,\n\t\t\tresumeSummary,\n\t\t\tmemoryExtractionHash,\n\t\t\ttitle,\n\t\t\ttags,\n\t\t\tfavorite,\n\t\t\tarchived,\n\t\t\tarchivedAt,\n\t\t\tfirstMessage: \"\",\n\t\t\tallMessagesText: \"\",\n\t\t\tmessagesView,\n\t\t};\n\t}\n\n\tconst context = buildSessionContextFromEntries(entries);\n\n\tconst normalizedMessages = extractedById.size\n\t\t? context.messages.map((message) =>\n\t\t\t\tapplyAttachmentExtracts(message, extractedById),\n\t\t\t)\n\t\t: context.messages;\n\tconst selectedMessages = selectSessionMessagesForView(\n\t\tnormalizedMessages,\n\t\tmessagesView,\n\t);\n\n\tconst renderables = buildConversationModel(selectedMessages);\n\tconst firstRenderableUser = renderables.find((renderable) =>\n\t\tisRenderableUserMessage(renderable),\n\t);\n\tconst firstMessage = firstRenderableUser\n\t\t? renderMessageToPlainText(firstRenderableUser)\n\t\t: \"\";\n\tconst allMessagesText = renderables\n\t\t.map((renderable) => renderMessageToPlainText(renderable))\n\t\t.filter(Boolean)\n\t\t.join(\" \");\n\n\treturn {\n\t\tid: sessionId || \"unknown\",\n\t\tcwd,\n\t\tsubject,\n\t\tcreated,\n\t\tmessages: selectedMessages,\n\t\tmessageCount,\n\t\tsummary,\n\t\tresumeSummary,\n\t\tmemoryExtractionHash,\n\t\ttitle,\n\t\ttags,\n\t\tfavorite,\n\t\tarchived,\n\t\tarchivedAt,\n\t\tfirstMessage,\n\t\tallMessagesText,\n\t\tmessagesView,\n\t};\n}\n"]}
|
package/dist/session/types.d.ts
CHANGED
|
@@ -25,6 +25,7 @@ export interface SessionHeaderEntry {
|
|
|
25
25
|
id: string;
|
|
26
26
|
timestamp: string;
|
|
27
27
|
cwd: string;
|
|
28
|
+
provisional?: boolean;
|
|
28
29
|
subject?: string;
|
|
29
30
|
model?: string;
|
|
30
31
|
modelMetadata?: SessionModelMetadata;
|
|
@@ -72,6 +73,8 @@ export interface SessionMetaEntry {
|
|
|
72
73
|
favorite?: boolean;
|
|
73
74
|
title?: string;
|
|
74
75
|
tags?: string[];
|
|
76
|
+
archived?: boolean;
|
|
77
|
+
archivedAt?: string;
|
|
75
78
|
appServerGoal?: {
|
|
76
79
|
objective: string;
|
|
77
80
|
status: "active" | "complete" | "cancelled";
|
|
@@ -138,6 +141,8 @@ export interface SessionMetadata {
|
|
|
138
141
|
memoryExtractionHash?: string;
|
|
139
142
|
favorite: boolean;
|
|
140
143
|
tags?: string[];
|
|
144
|
+
archived?: boolean;
|
|
145
|
+
archivedAt?: string;
|
|
141
146
|
allMessagesText: string;
|
|
142
147
|
}
|
|
143
148
|
export type SessionMessagesView = "full" | "summary" | "notLoaded";
|
|
@@ -153,6 +158,8 @@ export interface SessionSummary {
|
|
|
153
158
|
messageCount: number;
|
|
154
159
|
favorite: boolean;
|
|
155
160
|
tags?: string[];
|
|
161
|
+
archived?: boolean;
|
|
162
|
+
archivedAt?: string;
|
|
156
163
|
}
|
|
157
164
|
/**
|
|
158
165
|
* Tracks the state of session migrations across the session directory.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/session/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/session/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/session/types.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/session/types.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC;AAwCzC,SAAS,mCAAmC,CAC3C,MAMY;IAEZ,OAAO,CACN,MAAM,EAAE,qBAAqB,IAAI,MAAM,EAAE,sBAAsB,EAAE,WAAW,CAC5E,CAAC;AACH,CAAC;AAED,MAAM,UAAU,wCAAwC,CACvD,MAMY;IAEZ,OAAO,MAAM,EAAE,sBAAsB;QACpC,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,mCAAmC,CAAC,MAAM,CAAC,CAAC;AAChD,CAAC;AA8KD,OAAO,EACN,qBAAqB,EACrB,wBAAwB,EACxB,iBAAiB,EACjB,mCAAmC,EACnC,oBAAoB,GACpB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,UAAU,oBAAoB,CACnC,KAAmB;IAEnB,OAAO,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,kBAAkB,CACjC,KAAmB;IAEnB,OAAO,CACN,KAAK,CAAC,IAAI,KAAK,SAAS;QACxB,KAAK,CAAC,IAAI,KAAK,cAAc;QAC7B,KAAK,CAAC,IAAI,KAAK,oBAAoB,CACnC,CAAC;AACH,CAAC","sourcesContent":["import type { AppMessage, ImageContent, TextContent } from \"../agent/types.js\";\nimport type { PromptProjectDocManifest } from \"../config/index.js\";\nimport type { UnifiedContextManifest } from \"../context/manifest-types.js\";\nimport type { PromptMetadata } from \"../prompts/types.js\";\n\nexport const CURRENT_SESSION_VERSION = 2;\n\nexport interface SessionModelMetadata {\n\tprovider: string;\n\tmodelId: string;\n\tproviderName?: string;\n\tname?: string;\n\tbaseUrl?: string;\n\treasoning?: boolean;\n\tcontextWindow?: number;\n\tmaxTokens?: number;\n\tsource?: \"builtin\" | \"custom\";\n}\n\nexport interface SessionToolInfo {\n\tname: string;\n\tlabel?: string;\n\tdescription?: string;\n}\n\nexport interface SessionHeaderEntry {\n\ttype: \"session\";\n\tversion?: number;\n\tid: string;\n\ttimestamp: string;\n\tcwd: string;\n\tprovisional?: boolean;\n\tsubject?: string;\n\tmodel?: string;\n\tmodelMetadata?: SessionModelMetadata;\n\tthinkingLevel?: string;\n\tsystemPrompt?: string;\n\tpromptMetadata?: PromptMetadata;\n\tpromptContextManifest?: PromptProjectDocManifest;\n\tunifiedContextManifest?: UnifiedContextManifest;\n\ttools?: SessionToolInfo[];\n\tbranchedFrom?: string;\n\tparentSession?: string;\n}\n\nfunction resolveSessionPromptContextManifest(\n\theader:\n\t\t| Pick<\n\t\t\t\tSessionHeaderEntry,\n\t\t\t\t\"promptContextManifest\" | \"unifiedContextManifest\"\n\t\t >\n\t\t| null\n\t\t| undefined,\n): PromptProjectDocManifest | undefined {\n\treturn (\n\t\theader?.promptContextManifest ?? header?.unifiedContextManifest?.projectDocs\n\t);\n}\n\nexport function getPersistedSessionPromptContextManifest(\n\theader:\n\t\t| Pick<\n\t\t\t\tSessionHeaderEntry,\n\t\t\t\t\"promptContextManifest\" | \"unifiedContextManifest\"\n\t\t >\n\t\t| null\n\t\t| undefined,\n): PromptProjectDocManifest | undefined {\n\treturn header?.unifiedContextManifest\n\t\t? undefined\n\t\t: resolveSessionPromptContextManifest(header);\n}\n\nexport interface SessionEntryBase {\n\ttype: string;\n\tid: string;\n\tparentId: string | null;\n\ttimestamp: string;\n}\n\nexport interface SessionMessageEntry extends SessionEntryBase {\n\ttype: \"message\";\n\tmessage: AppMessage;\n}\n\nexport interface AttachmentExtractedEntry {\n\ttype: \"attachment_extract\";\n\ttimestamp: string;\n\tattachmentId: string;\n\textractedText: string;\n}\n\nexport interface ThinkingLevelChangeEntry extends SessionEntryBase {\n\ttype: \"thinking_level_change\";\n\tthinkingLevel: string;\n}\n\nexport interface ModelChangeEntry extends SessionEntryBase {\n\ttype: \"model_change\";\n\tmodel: string;\n\tmodelMetadata?: SessionModelMetadata;\n}\n\nexport interface SessionMetaEntry {\n\ttype: \"session_meta\";\n\ttimestamp: string;\n\tsummary?: string;\n\tresumeSummary?: string;\n\tmemoryExtractionHash?: string;\n\tfavorite?: boolean;\n\ttitle?: string;\n\ttags?: string[];\n\tarchived?: boolean;\n\tarchivedAt?: string;\n\tappServerGoal?: {\n\t\tobjective: string;\n\t\tstatus: \"active\" | \"complete\" | \"cancelled\";\n\t\ttokenBudget?: number;\n\t\tcreatedAt: string;\n\t\tupdatedAt: string;\n\t} | null;\n}\n\nexport interface CompactionEntry<T = unknown> extends SessionEntryBase {\n\ttype: \"compaction\";\n\tsummary: string;\n\tfirstKeptEntryId: string;\n\ttokensBefore: number;\n\tdetails?: T;\n\tfromHook?: boolean;\n\tauto?: boolean;\n\tcustomInstructions?: string;\n\t/** Legacy compaction index (v1 sessions). */\n\tfirstKeptEntryIndex?: number;\n}\n\nexport interface BranchSummaryEntry<T = unknown> extends SessionEntryBase {\n\ttype: \"branch_summary\";\n\tfromId: string;\n\tsummary: string;\n\tdetails?: T;\n\tfromHook?: boolean;\n}\n\nexport interface CustomEntry<T = unknown> extends SessionEntryBase {\n\ttype: \"custom\";\n\tcustomType: string;\n\tdata?: T;\n}\n\nexport interface CustomMessageEntry<T = unknown> extends SessionEntryBase {\n\ttype: \"custom_message\";\n\tcustomType: string;\n\tcontent: string | (TextContent | ImageContent)[];\n\tdetails?: T;\n\tdisplay: boolean;\n}\n\nexport interface LabelEntry extends SessionEntryBase {\n\ttype: \"label\";\n\ttargetId: string;\n\tlabel: string | undefined;\n}\n\nexport type SessionTreeEntry =\n\t| SessionMessageEntry\n\t| ThinkingLevelChangeEntry\n\t| ModelChangeEntry\n\t| CompactionEntry\n\t| BranchSummaryEntry\n\t| CustomEntry\n\t| CustomMessageEntry\n\t| LabelEntry;\n\nexport type SessionEntry =\n\t| SessionHeaderEntry\n\t| SessionTreeEntry\n\t| SessionMetaEntry\n\t| AttachmentExtractedEntry;\n\nexport interface SessionTreeNode {\n\tentry: SessionTreeEntry;\n\tchildren: SessionTreeNode[];\n\tlabel?: string;\n}\n\nexport interface SessionMetadata {\n\tpath: string;\n\tid: string;\n\tsubject?: string;\n\ttitle?: string;\n\tcreated: Date;\n\tmodified: Date;\n\tsize: number;\n\tmessageCount: number;\n\tfirstMessage: string;\n\tsummary: string;\n\tresumeSummary?: string;\n\tmemoryExtractionHash?: string;\n\tfavorite: boolean;\n\ttags?: string[];\n\tarchived?: boolean;\n\tarchivedAt?: string;\n\tallMessagesText: string;\n}\n\nexport type SessionMessagesView = \"full\" | \"summary\" | \"notLoaded\";\n\nexport interface SessionSummary {\n\tid: string;\n\tsubject?: string;\n\ttitle?: string;\n\tsummary?: string;\n\tresumeSummary?: string;\n\tmemoryExtractionHash?: string;\n\tcreatedAt: string;\n\tupdatedAt: string;\n\tmessageCount: number;\n\tfavorite: boolean;\n\ttags?: string[];\n\tarchived?: boolean;\n\tarchivedAt?: string;\n}\n\n/**\n * Tracks the state of session migrations across the session directory.\n * Persisted to disk to avoid re-running migrations on every startup.\n */\nexport interface SessionMigrationState {\n\t/** Migration version that was run */\n\tversion: number;\n\t/** ISO timestamp of when migration last ran */\n\tlastRun: string;\n\t/** Number of sessions successfully migrated */\n\tsuccesses: number;\n\t/** Number of sessions that failed migration */\n\tfailures: number;\n\t/** Number of sessions that required normalization */\n\tnormalized: number;\n\t/** Number of sessions skipped (already up to date) */\n\tskipped: number;\n\t/** Total sessions processed */\n\ttotal: number;\n}\n\nexport {\n\tnormalizeSessionEntry,\n\tnormalizeStopReasonValue,\n\tparseSessionEntry,\n\tisSessionWireCompactionContextEntry,\n\ttryParseSessionEntry,\n} from \"./wire-format.js\";\n\nexport function isSessionHeaderEntry(\n\tentry: SessionEntry,\n): entry is SessionHeaderEntry {\n\treturn entry.type === \"session\";\n}\n\nexport function isSessionTreeEntry(\n\tentry: SessionEntry,\n): entry is SessionTreeEntry {\n\treturn (\n\t\tentry.type !== \"session\" &&\n\t\tentry.type !== \"session_meta\" &&\n\t\tentry.type !== \"attachment_extract\"\n\t);\n}\n"]}
|
|
@@ -32,6 +32,7 @@ export declare const sessionWireFieldAliases: {
|
|
|
32
32
|
readonly sessionMeta: {
|
|
33
33
|
readonly resume_summary: "resumeSummary";
|
|
34
34
|
readonly memory_extraction_hash: "memoryExtractionHash";
|
|
35
|
+
readonly archived_at: "archivedAt";
|
|
35
36
|
};
|
|
36
37
|
readonly attachmentExtract: {
|
|
37
38
|
readonly attachment_id: "attachmentId";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wire-format.generated.d.ts","sourceRoot":"","sources":["../../src/session/wire-format.generated.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,wBAAwB,EAAG,wBAAiC,CAAC;AAE1E,eAAO,MAAM,8BAA8B,6OAiBjC,CAAC;AAEX,eAAO,MAAM,4BAA4B;;;;;;CAM/B,CAAC;AAEX,eAAO,MAAM,uBAAuB
|
|
1
|
+
{"version":3,"file":"wire-format.generated.d.ts","sourceRoot":"","sources":["../../src/session/wire-format.generated.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,wBAAwB,EAAG,wBAAiC,CAAC;AAE1E,eAAO,MAAM,8BAA8B,6OAiBjC,CAAC;AAEX,eAAO,MAAM,4BAA4B;;;;;;CAM/B,CAAC;AAEX,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4D1B,CAAC;AAEX,eAAO,MAAM,kCAAkC;;CAErC,CAAC;AAEX,eAAO,MAAM,mCAAmC;;;;;;;;CAQtC,CAAC;AAEX,eAAO,MAAM,sCAAsC,0DAIzC,CAAC;AAEX,eAAO,MAAM,gDAAgD,yBAEnD,CAAC;AAaX,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAErE;AAED,wBAAgB,oCAAoC,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzE;AAED,wBAAgB,sCAAsC,CAAC,IAAI,EAAE,MAAM;;;;;cAElE;AAED,wBAAgB,uCAAuC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAI7E;AAED,wBAAgB,0CAA0C,CACzD,IAAI,EAAE,MAAM,GACV,OAAO,CAIT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wire-format.generated.js","sourceRoot":"","sources":["../../src/session/wire-format.generated.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,wBAAwB,GAAG,wBAAiC,CAAC;AAE1E,MAAM,CAAC,MAAM,8BAA8B,GAAG;IAC7C,MAAM;IACN,SAAS;IACT,IAAI;IACJ,WAAW;IACX,KAAK;IACL,SAAS;IACT,OAAO;IACP,eAAe;IACf,eAAe;IACf,cAAc;IACd,gBAAgB;IAChB,uBAAuB;IACvB,wBAAwB;IACxB,OAAO;IACP,cAAc;IACd,eAAe;CACN,CAAC;AAEX,MAAM,CAAC,MAAM,4BAA4B,GAAG;IAC3C,QAAQ,EAAE,SAAS;IACnB,UAAU,EAAE,SAAS;IACrB,UAAU,EAAE,QAAQ;IACpB,QAAQ,EAAE,MAAM;IAChB,aAAa,EAAE,MAAM;CACZ,CAAC;AAEX,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACtC,aAAa,EAAE;QACd,QAAQ,EAAE,SAAS;QACnB,aAAa,EAAE,cAAc;QAC7B,QAAQ,EAAE,SAAS;QACnB,cAAc,EAAE,eAAe;QAC/B,UAAU,EAAE,WAAW;KACvB;IACD,OAAO,EAAE;QACR,cAAc,EAAE,eAAe;QAC/B,cAAc,EAAE,eAAe;QAC/B,aAAa,EAAE,cAAc;QAC7B,eAAe,EAAE,gBAAgB;QACjC,uBAAuB,EAAE,uBAAuB;QAChD,wBAAwB,EAAE,wBAAwB;QAClD,aAAa,EAAE,cAAc;QAC7B,cAAc,EAAE,eAAe;KAC/B;IACD,WAAW,EAAE;QACZ,cAAc,EAAE,eAAe;QAC/B,sBAAsB,EAAE,sBAAsB;
|
|
1
|
+
{"version":3,"file":"wire-format.generated.js","sourceRoot":"","sources":["../../src/session/wire-format.generated.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Auto-generated by `scripts/session-wire-format-codegen.mjs`.\n * Do not edit manually; update `src/session/wire-format.manifest.json` instead.\n */\n\nexport const sessionWireFormatVersion = \"session-wire-format.v1\" as const;\n\nexport const sessionWireSessionHeaderFields = [\n\t\"type\",\n\t\"version\",\n\t\"id\",\n\t\"timestamp\",\n\t\"cwd\",\n\t\"subject\",\n\t\"model\",\n\t\"modelMetadata\",\n\t\"thinkingLevel\",\n\t\"systemPrompt\",\n\t\"promptMetadata\",\n\t\"promptContextManifest\",\n\t\"unifiedContextManifest\",\n\t\"tools\",\n\t\"branchedFrom\",\n\t\"parentSession\",\n] as const;\n\nexport const sessionWireStopReasonAliases = {\n\ttool_use: \"toolUse\",\n\ttool_calls: \"toolUse\",\n\tmax_tokens: \"length\",\n\tend_turn: \"stop\",\n\tstop_sequence: \"stop\",\n} as const;\n\nexport const sessionWireFieldAliases = {\n\tmodelMetadata: {\n\t\tmodel_id: \"modelId\",\n\t\tprovider_name: \"providerName\",\n\t\tbase_url: \"baseUrl\",\n\t\tcontext_window: \"contextWindow\",\n\t\tmax_tokens: \"maxTokens\",\n\t},\n\tsession: {\n\t\tmodel_metadata: \"modelMetadata\",\n\t\tthinking_level: \"thinkingLevel\",\n\t\tsystem_prompt: \"systemPrompt\",\n\t\tprompt_metadata: \"promptMetadata\",\n\t\tprompt_context_manifest: \"promptContextManifest\",\n\t\tunified_context_manifest: \"unifiedContextManifest\",\n\t\tbranched_from: \"branchedFrom\",\n\t\tparent_session: \"parentSession\",\n\t},\n\tsessionMeta: {\n\t\tresume_summary: \"resumeSummary\",\n\t\tmemory_extraction_hash: \"memoryExtractionHash\",\n\t\tarchived_at: \"archivedAt\",\n\t},\n\tattachmentExtract: {\n\t\tattachment_id: \"attachmentId\",\n\t\textracted_text: \"extractedText\",\n\t},\n\tassistantMessage: {\n\t\tstop_reason: \"stopReason\",\n\t},\n\ttoolResultMessage: {\n\t\ttool_call_id: \"toolCallId\",\n\t\ttool_name: \"toolName\",\n\t\tis_error: \"isError\",\n\t},\n\tthinkingLevelChange: {\n\t\tthinking_level: \"thinkingLevel\",\n\t},\n\tmodelChange: {\n\t\tmodel_metadata: \"modelMetadata\",\n\t},\n\tcompaction: {\n\t\tfirst_kept_entry_id: \"firstKeptEntryId\",\n\t\tfirst_kept_entry_index: \"firstKeptEntryIndex\",\n\t\ttokens_before: \"tokensBefore\",\n\t\tcustom_instructions: \"customInstructions\",\n\t},\n\tbranchSummary: {\n\t\tfrom_id: \"fromId\",\n\t\tfrom_hook: \"fromHook\",\n\t},\n\tcustom: {\n\t\tcustom_type: \"customType\",\n\t},\n\tcustomMessage: {\n\t\tcustom_type: \"customType\",\n\t},\n\tlabel: {\n\t\ttarget_id: \"targetId\",\n\t},\n} as const;\n\nexport const sessionWireContentBlockTypeAliases = {\n\ttool_call: \"toolCall\",\n} as const;\n\nexport const sessionWireContentBlockFieldAliases = {\n\ttoolCall: {\n\t\targs: \"arguments\",\n\t},\n\tthinking: {\n\t\ttext: \"thinking\",\n\t\tsignature: \"thinkingSignature\",\n\t},\n} as const;\n\nexport const sessionWireCompactionContextEntryTypes = [\n\t\"message\",\n\t\"custom_message\",\n\t\"branch_summary\",\n] as const;\n\nexport const sessionWireCompactionContextExcludedMessageRoles = [\n\t\"toolResult\",\n] as const;\n\ntype SessionWireAliasSource = Readonly<Record<string, unknown>>;\n\nfunction getSessionWireAlias<T extends SessionWireAliasSource>(\n\taliases: T,\n\tkey: string,\n): T[keyof T] | undefined {\n\treturn Object.prototype.hasOwnProperty.call(aliases, key)\n\t\t? aliases[key as keyof T]\n\t\t: undefined;\n}\n\nexport function canonicalSessionWireStopReason(reason: string): string {\n\treturn getSessionWireAlias(sessionWireStopReasonAliases, reason) ?? reason;\n}\n\nexport function canonicalSessionWireContentBlockType(type: string): string {\n\treturn getSessionWireAlias(sessionWireContentBlockTypeAliases, type) ?? type;\n}\n\nexport function getSessionWireContentBlockFieldAliases(type: string) {\n\treturn getSessionWireAlias(sessionWireContentBlockFieldAliases, type);\n}\n\nexport function isSessionWireCompactionContextEntryType(type: string): boolean {\n\treturn sessionWireCompactionContextEntryTypes.includes(\n\t\ttype as (typeof sessionWireCompactionContextEntryTypes)[number],\n\t);\n}\n\nexport function isSessionWireCompactionExcludedMessageRole(\n\trole: string,\n): boolean {\n\treturn sessionWireCompactionContextExcludedMessageRoles.includes(\n\t\trole as (typeof sessionWireCompactionContextExcludedMessageRoles)[number],\n\t);\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Shared Memory Contract v1
|
|
3
3
|
*
|
|
4
|
-
* This file defines the contract between
|
|
4
|
+
* This file defines the contract between Maestro and Conductor for
|
|
5
5
|
* shared memory synchronization. Both projects should implement
|
|
6
6
|
* compatible types to ensure interoperability.
|
|
7
7
|
*
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
export declare const SHARED_MEMORY_SCHEMA_VERSION = 1;
|
|
12
12
|
/**
|
|
13
13
|
* Unified error codes for shared memory operations.
|
|
14
|
-
* Both
|
|
14
|
+
* Both Maestro and Conductor should use these codes for consistent error handling.
|
|
15
15
|
*/
|
|
16
16
|
export declare enum SharedMemoryErrorCode {
|
|
17
17
|
NETWORK_TIMEOUT = "SM1001",
|
|
@@ -72,7 +72,7 @@ export interface SharedMemoryEvent {
|
|
|
72
72
|
actor?: SharedMemorySource;
|
|
73
73
|
}
|
|
74
74
|
/**
|
|
75
|
-
* Base state fields that both
|
|
75
|
+
* Base state fields that both Maestro and Conductor share.
|
|
76
76
|
*/
|
|
77
77
|
export interface SharedMemoryStateBase {
|
|
78
78
|
/** Session identifier */
|
|
@@ -85,7 +85,7 @@ export interface SharedMemoryStateBase {
|
|
|
85
85
|
updatedAt?: string;
|
|
86
86
|
}
|
|
87
87
|
/**
|
|
88
|
-
*
|
|
88
|
+
* Maestro-specific state fields.
|
|
89
89
|
*/
|
|
90
90
|
export interface ComposerState extends SharedMemoryStateBase {
|
|
91
91
|
source: "maestro";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Shared Memory Contract v1
|
|
3
3
|
*
|
|
4
|
-
* This file defines the contract between
|
|
4
|
+
* This file defines the contract between Maestro and Conductor for
|
|
5
5
|
* shared memory synchronization. Both projects should implement
|
|
6
6
|
* compatible types to ensure interoperability.
|
|
7
7
|
*
|
|
@@ -17,7 +17,7 @@ export const SHARED_MEMORY_SCHEMA_VERSION = 1;
|
|
|
17
17
|
// =============================================================================
|
|
18
18
|
/**
|
|
19
19
|
* Unified error codes for shared memory operations.
|
|
20
|
-
* Both
|
|
20
|
+
* Both Maestro and Conductor should use these codes for consistent error handling.
|
|
21
21
|
*/
|
|
22
22
|
export var SharedMemoryErrorCode;
|
|
23
23
|
(function (SharedMemoryErrorCode) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../../src/shared-memory/contract.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Shared Memory Contract v1\n *\n * This file defines the contract between Composer and Conductor for\n * shared memory synchronization. Both projects should implement\n * compatible types to ensure interoperability.\n *\n * Schema Version: 1\n * Last Updated: 2026-01-15\n */\n\n// =============================================================================\n// Schema Version\n// =============================================================================\n\nexport const SHARED_MEMORY_SCHEMA_VERSION = 1;\n\n// =============================================================================\n// Error Codes\n// =============================================================================\n\n/**\n * Unified error codes for shared memory operations.\n * Both Composer and Conductor should use these codes for consistent error handling.\n */\nexport enum SharedMemoryErrorCode {\n\t// Network errors (1xxx)\n\tNETWORK_TIMEOUT = \"SM1001\",\n\tNETWORK_UNREACHABLE = \"SM1002\",\n\tNETWORK_ABORTED = \"SM1003\",\n\n\t// Authentication errors (2xxx)\n\tAUTH_MISSING = \"SM2001\",\n\tAUTH_INVALID = \"SM2002\",\n\tAUTH_EXPIRED = \"SM2003\",\n\tAUTH_FORBIDDEN = \"SM2004\",\n\n\t// Request errors (3xxx)\n\tREQUEST_TOO_LARGE = \"SM3001\",\n\tREQUEST_INVALID_FORMAT = \"SM3002\",\n\tREQUEST_RATE_LIMITED = \"SM3003\",\n\tREQUEST_UNSUPPORTED_ENCODING = \"SM3004\",\n\tREQUEST_METHOD_NOT_ALLOWED = \"SM3005\",\n\n\t// Server errors (4xxx)\n\tSERVER_ERROR = \"SM4001\",\n\tSERVER_UNAVAILABLE = \"SM4002\",\n\tSERVER_ENDPOINT_NOT_FOUND = \"SM4003\",\n\n\t// Data errors (5xxx)\n\tDATA_SERIALIZATION_FAILED = \"SM5001\",\n\tDATA_DESERIALIZATION_FAILED = \"SM5002\",\n\tDATA_VALIDATION_FAILED = \"SM5003\",\n\tDATA_TRUNCATED = \"SM5004\",\n\n\t// Session errors (6xxx)\n\tSESSION_NOT_FOUND = \"SM6001\",\n\tSESSION_CONFLICT = \"SM6002\",\n\tSESSION_INVALID = \"SM6003\",\n}\n\n/**\n * Map HTTP status codes to SharedMemoryErrorCode\n */\nexport function httpStatusToErrorCode(status: number): SharedMemoryErrorCode {\n\tswitch (status) {\n\t\tcase 401:\n\t\t\treturn SharedMemoryErrorCode.AUTH_INVALID;\n\t\tcase 403:\n\t\t\treturn SharedMemoryErrorCode.AUTH_FORBIDDEN;\n\t\tcase 404:\n\t\t\treturn SharedMemoryErrorCode.SERVER_ENDPOINT_NOT_FOUND;\n\t\tcase 405:\n\t\t\treturn SharedMemoryErrorCode.REQUEST_METHOD_NOT_ALLOWED;\n\t\tcase 413:\n\t\t\treturn SharedMemoryErrorCode.REQUEST_TOO_LARGE;\n\t\tcase 415:\n\t\t\treturn SharedMemoryErrorCode.REQUEST_UNSUPPORTED_ENCODING;\n\t\tcase 429:\n\t\t\treturn SharedMemoryErrorCode.REQUEST_RATE_LIMITED;\n\t\tcase 500:\n\t\tcase 502:\n\t\tcase 503:\n\t\tcase 504:\n\t\t\treturn SharedMemoryErrorCode.SERVER_ERROR;\n\t\tdefault:\n\t\t\treturn SharedMemoryErrorCode.SERVER_ERROR;\n\t}\n}\n\n// =============================================================================\n// Source Identifiers\n// =============================================================================\n\nexport type SharedMemorySource = \"maestro\" | \"conductor\";\n\n// =============================================================================\n// Capabilities Contract\n// =============================================================================\n\nexport interface SharedMemoryCapabilities {\n\t/** Whether the /sync endpoint is supported */\n\tsupportsSync: boolean;\n\t/** Whether gzip Content-Encoding is supported */\n\tsupportsGzip: boolean;\n\t/** Maximum request body size in bytes */\n\tmaxBodyBytes: number;\n\t/** Maximum events per batch request */\n\tmaxEventsBatch: number;\n\t/** Maximum payload size per event in bytes */\n\tmaxEventPayloadBytes: number;\n\t/** Maximum length of event type string */\n\tmaxEventTypeLength: number;\n\t/** Maximum length of event ID string */\n\tmaxEventIdLength: number;\n}\n\nexport const DEFAULT_CAPABILITIES: SharedMemoryCapabilities = {\n\tsupportsSync: true,\n\tsupportsGzip: true,\n\tmaxBodyBytes: 256 * 1024,\n\tmaxEventsBatch: 25,\n\tmaxEventPayloadBytes: 32 * 1024,\n\tmaxEventTypeLength: 128,\n\tmaxEventIdLength: 128,\n};\n\n// =============================================================================\n// Event Contract\n// =============================================================================\n\nexport interface SharedMemoryEvent {\n\t/** Event type identifier (e.g., \"maestro.session.started\") */\n\ttype: string;\n\t/** Event payload data */\n\tpayload?: Record<string, unknown>;\n\t/** Optional tags for filtering/categorization */\n\ttags?: string[];\n\t/** Unique event identifier */\n\tid?: string;\n\t/** Actor that generated the event */\n\tactor?: SharedMemorySource;\n}\n\n// =============================================================================\n// State Contract\n// =============================================================================\n\n/**\n * Base state fields that both Composer and Conductor share.\n */\nexport interface SharedMemoryStateBase {\n\t/** Session identifier */\n\tsessionId: string;\n\t/** Source that last updated the state */\n\tsource: SharedMemorySource;\n\t/** Instance identifier (unique per process/tab) */\n\tinstanceId: string;\n\t/** ISO timestamp of last update */\n\tupdatedAt?: string;\n}\n\n/**\n * Composer-specific state fields.\n */\nexport interface ComposerState extends SharedMemoryStateBase {\n\tsource: \"maestro\";\n\t/** Current working directory */\n\tcwd?: string;\n\t/** Active model identifier */\n\tmodel?: string;\n\t/** Last message ID */\n\tlastMessageId?: string;\n\t/** Last message role */\n\tlastMessageRole?: string;\n\t/** Session summary */\n\tsummary?: string;\n}\n\n/**\n * Conductor-specific state fields.\n */\nexport interface ConductorState extends SharedMemoryStateBase {\n\tsource: \"conductor\";\n\t/** Session title */\n\ttitle?: string;\n\t/** Active model */\n\tmodel?: string | null;\n\t/** Message count */\n\tmessageCount?: number;\n\t/** Preview text */\n\tpreview?: string;\n\t/** Last modified timestamp */\n\tlastModified?: string;\n}\n\n// =============================================================================\n// Sync Request Contract\n// =============================================================================\n\nexport interface SharedMemorySyncRequest {\n\t/** State updates keyed by source */\n\tstate?: {\n\t\tmaestro?: ComposerState;\n\t\tconductor?: ConductorState;\n\t};\n\t/** Events to append */\n\tevents?: SharedMemoryEvent[];\n\t/** Queue statistics for monitoring */\n\tstats?: SharedMemoryQueueStats;\n}\n\n// =============================================================================\n// Queue Statistics Contract\n// =============================================================================\n\nexport interface SharedMemoryQueueStats {\n\t/** Number of states that were trimmed to fit size limits */\n\ttrimmed_states: number;\n\t/** Number of events that were trimmed to fit size limits */\n\ttrimmed_events: number;\n\t/** Number of states that were dropped (couldn't be sent) */\n\tdropped_states: number;\n\t/** Number of events that were dropped (couldn't be sent) */\n\tdropped_events: number;\n\t/** Number of batch splits due to size limits */\n\tbatch_splits: number;\n\t/** Number of gzip-compressed requests */\n\tgzip_requests: number;\n\t/** ISO timestamp of last successful send */\n\tlast_sent_at: string;\n\t/** Source that generated these stats */\n\tsource: SharedMemorySource;\n\t/** Instance identifier */\n\tinstance_id: string;\n}\n\n// =============================================================================\n// Persisted Queue Contract\n// =============================================================================\n\nexport interface PersistedQueueEntry<TState> {\n\tstate: TState | null;\n\tevents: SharedMemoryEvent[];\n\tupdatedAt: number;\n}\n\nexport interface PersistedQueue<TState> {\n\t/** Schema version for migration */\n\tversion: typeof SHARED_MEMORY_SCHEMA_VERSION;\n\t/** When the queue was last persisted */\n\tupdatedAt: number;\n\t/** Pending sessions by key */\n\tsessions: Record<string, PersistedQueueEntry<TState>>;\n\t/** Queue statistics */\n\tstats: {\n\t\ttrimmedStates: number;\n\t\ttrimmedEvents: number;\n\t\tdroppedStates: number;\n\t\tdroppedEvents: number;\n\t\tbatchSplits: number;\n\t\tgzipRequests: number;\n\t\tlastSentAt: string | null;\n\t};\n}\n\n// =============================================================================\n// Configuration Constants\n// =============================================================================\n\nexport const SHARED_MEMORY_CONFIG = {\n\t/** Delay before flushing pending updates (ms) */\n\tFLUSH_DELAY_MS: 150,\n\t/** Request timeout (ms) */\n\tREQUEST_TIMEOUT_MS: 5000,\n\t/** Maximum pending events per session */\n\tMAX_PENDING_EVENTS: 50,\n\t/** Maximum backoff delay for retries (ms) */\n\tMAX_BACKOFF_MS: 5000,\n\t/** Default events per batch */\n\tDEFAULT_EVENTS_PER_BATCH: 25,\n\t/** Target max body size (with safety margin) */\n\tTARGET_MAX_BODY_BYTES: 220 * 1024,\n\t/** Maximum string length before truncation */\n\tMAX_STRING_LENGTH: 4000,\n\t/** Maximum array length before truncation */\n\tMAX_ARRAY_LENGTH: 50,\n\t/** Debounce delay for persisting queue (ms) */\n\tPERSIST_DEBOUNCE_MS: 300,\n\t/** TTL for persisted queue entries (ms) */\n\tPERSIST_TTL_MS: 24 * 60 * 60 * 1000,\n\t/** TTL for capabilities cache (ms) */\n\tCAPABILITIES_TTL_MS: 5 * 60 * 1000,\n} as const;\n\n// =============================================================================\n// Event Type Conventions\n// =============================================================================\n\n/**\n * Standard event type prefixes for each source.\n * Events should follow the pattern: {source}.{category}.{action}\n *\n * Examples:\n * - maestro.session.started\n * - maestro.message.saved\n * - conductor.tool.executed\n * - conductor.session.updated\n */\nexport const EVENT_TYPE_PREFIXES = {\n\tMAESTRO: \"maestro.\",\n\tCONDUCTOR: \"conductor.\",\n} as const;\n\n// =============================================================================\n// Type Guards\n// =============================================================================\n\nexport function isComposerState(\n\tstate: SharedMemoryStateBase,\n): state is ComposerState {\n\treturn state.source === \"maestro\";\n}\n\nexport function isConductorState(\n\tstate: SharedMemoryStateBase,\n): state is ConductorState {\n\treturn state.source === \"conductor\";\n}\n\nexport function isValidEventType(type: string): boolean {\n\tconst trimmed = type.trim();\n\tif (!trimmed) return false;\n\tif (trimmed.length > DEFAULT_CAPABILITIES.maxEventTypeLength) return false;\n\treturn true;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../../src/shared-memory/contract.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Shared Memory Contract v1\n *\n * This file defines the contract between Maestro and Conductor for\n * shared memory synchronization. Both projects should implement\n * compatible types to ensure interoperability.\n *\n * Schema Version: 1\n * Last Updated: 2026-01-15\n */\n\n// =============================================================================\n// Schema Version\n// =============================================================================\n\nexport const SHARED_MEMORY_SCHEMA_VERSION = 1;\n\n// =============================================================================\n// Error Codes\n// =============================================================================\n\n/**\n * Unified error codes for shared memory operations.\n * Both Maestro and Conductor should use these codes for consistent error handling.\n */\nexport enum SharedMemoryErrorCode {\n\t// Network errors (1xxx)\n\tNETWORK_TIMEOUT = \"SM1001\",\n\tNETWORK_UNREACHABLE = \"SM1002\",\n\tNETWORK_ABORTED = \"SM1003\",\n\n\t// Authentication errors (2xxx)\n\tAUTH_MISSING = \"SM2001\",\n\tAUTH_INVALID = \"SM2002\",\n\tAUTH_EXPIRED = \"SM2003\",\n\tAUTH_FORBIDDEN = \"SM2004\",\n\n\t// Request errors (3xxx)\n\tREQUEST_TOO_LARGE = \"SM3001\",\n\tREQUEST_INVALID_FORMAT = \"SM3002\",\n\tREQUEST_RATE_LIMITED = \"SM3003\",\n\tREQUEST_UNSUPPORTED_ENCODING = \"SM3004\",\n\tREQUEST_METHOD_NOT_ALLOWED = \"SM3005\",\n\n\t// Server errors (4xxx)\n\tSERVER_ERROR = \"SM4001\",\n\tSERVER_UNAVAILABLE = \"SM4002\",\n\tSERVER_ENDPOINT_NOT_FOUND = \"SM4003\",\n\n\t// Data errors (5xxx)\n\tDATA_SERIALIZATION_FAILED = \"SM5001\",\n\tDATA_DESERIALIZATION_FAILED = \"SM5002\",\n\tDATA_VALIDATION_FAILED = \"SM5003\",\n\tDATA_TRUNCATED = \"SM5004\",\n\n\t// Session errors (6xxx)\n\tSESSION_NOT_FOUND = \"SM6001\",\n\tSESSION_CONFLICT = \"SM6002\",\n\tSESSION_INVALID = \"SM6003\",\n}\n\n/**\n * Map HTTP status codes to SharedMemoryErrorCode\n */\nexport function httpStatusToErrorCode(status: number): SharedMemoryErrorCode {\n\tswitch (status) {\n\t\tcase 401:\n\t\t\treturn SharedMemoryErrorCode.AUTH_INVALID;\n\t\tcase 403:\n\t\t\treturn SharedMemoryErrorCode.AUTH_FORBIDDEN;\n\t\tcase 404:\n\t\t\treturn SharedMemoryErrorCode.SERVER_ENDPOINT_NOT_FOUND;\n\t\tcase 405:\n\t\t\treturn SharedMemoryErrorCode.REQUEST_METHOD_NOT_ALLOWED;\n\t\tcase 413:\n\t\t\treturn SharedMemoryErrorCode.REQUEST_TOO_LARGE;\n\t\tcase 415:\n\t\t\treturn SharedMemoryErrorCode.REQUEST_UNSUPPORTED_ENCODING;\n\t\tcase 429:\n\t\t\treturn SharedMemoryErrorCode.REQUEST_RATE_LIMITED;\n\t\tcase 500:\n\t\tcase 502:\n\t\tcase 503:\n\t\tcase 504:\n\t\t\treturn SharedMemoryErrorCode.SERVER_ERROR;\n\t\tdefault:\n\t\t\treturn SharedMemoryErrorCode.SERVER_ERROR;\n\t}\n}\n\n// =============================================================================\n// Source Identifiers\n// =============================================================================\n\nexport type SharedMemorySource = \"maestro\" | \"conductor\";\n\n// =============================================================================\n// Capabilities Contract\n// =============================================================================\n\nexport interface SharedMemoryCapabilities {\n\t/** Whether the /sync endpoint is supported */\n\tsupportsSync: boolean;\n\t/** Whether gzip Content-Encoding is supported */\n\tsupportsGzip: boolean;\n\t/** Maximum request body size in bytes */\n\tmaxBodyBytes: number;\n\t/** Maximum events per batch request */\n\tmaxEventsBatch: number;\n\t/** Maximum payload size per event in bytes */\n\tmaxEventPayloadBytes: number;\n\t/** Maximum length of event type string */\n\tmaxEventTypeLength: number;\n\t/** Maximum length of event ID string */\n\tmaxEventIdLength: number;\n}\n\nexport const DEFAULT_CAPABILITIES: SharedMemoryCapabilities = {\n\tsupportsSync: true,\n\tsupportsGzip: true,\n\tmaxBodyBytes: 256 * 1024,\n\tmaxEventsBatch: 25,\n\tmaxEventPayloadBytes: 32 * 1024,\n\tmaxEventTypeLength: 128,\n\tmaxEventIdLength: 128,\n};\n\n// =============================================================================\n// Event Contract\n// =============================================================================\n\nexport interface SharedMemoryEvent {\n\t/** Event type identifier (e.g., \"maestro.session.started\") */\n\ttype: string;\n\t/** Event payload data */\n\tpayload?: Record<string, unknown>;\n\t/** Optional tags for filtering/categorization */\n\ttags?: string[];\n\t/** Unique event identifier */\n\tid?: string;\n\t/** Actor that generated the event */\n\tactor?: SharedMemorySource;\n}\n\n// =============================================================================\n// State Contract\n// =============================================================================\n\n/**\n * Base state fields that both Maestro and Conductor share.\n */\nexport interface SharedMemoryStateBase {\n\t/** Session identifier */\n\tsessionId: string;\n\t/** Source that last updated the state */\n\tsource: SharedMemorySource;\n\t/** Instance identifier (unique per process/tab) */\n\tinstanceId: string;\n\t/** ISO timestamp of last update */\n\tupdatedAt?: string;\n}\n\n/**\n * Maestro-specific state fields.\n */\nexport interface ComposerState extends SharedMemoryStateBase {\n\tsource: \"maestro\";\n\t/** Current working directory */\n\tcwd?: string;\n\t/** Active model identifier */\n\tmodel?: string;\n\t/** Last message ID */\n\tlastMessageId?: string;\n\t/** Last message role */\n\tlastMessageRole?: string;\n\t/** Session summary */\n\tsummary?: string;\n}\n\n/**\n * Conductor-specific state fields.\n */\nexport interface ConductorState extends SharedMemoryStateBase {\n\tsource: \"conductor\";\n\t/** Session title */\n\ttitle?: string;\n\t/** Active model */\n\tmodel?: string | null;\n\t/** Message count */\n\tmessageCount?: number;\n\t/** Preview text */\n\tpreview?: string;\n\t/** Last modified timestamp */\n\tlastModified?: string;\n}\n\n// =============================================================================\n// Sync Request Contract\n// =============================================================================\n\nexport interface SharedMemorySyncRequest {\n\t/** State updates keyed by source */\n\tstate?: {\n\t\tmaestro?: ComposerState;\n\t\tconductor?: ConductorState;\n\t};\n\t/** Events to append */\n\tevents?: SharedMemoryEvent[];\n\t/** Queue statistics for monitoring */\n\tstats?: SharedMemoryQueueStats;\n}\n\n// =============================================================================\n// Queue Statistics Contract\n// =============================================================================\n\nexport interface SharedMemoryQueueStats {\n\t/** Number of states that were trimmed to fit size limits */\n\ttrimmed_states: number;\n\t/** Number of events that were trimmed to fit size limits */\n\ttrimmed_events: number;\n\t/** Number of states that were dropped (couldn't be sent) */\n\tdropped_states: number;\n\t/** Number of events that were dropped (couldn't be sent) */\n\tdropped_events: number;\n\t/** Number of batch splits due to size limits */\n\tbatch_splits: number;\n\t/** Number of gzip-compressed requests */\n\tgzip_requests: number;\n\t/** ISO timestamp of last successful send */\n\tlast_sent_at: string;\n\t/** Source that generated these stats */\n\tsource: SharedMemorySource;\n\t/** Instance identifier */\n\tinstance_id: string;\n}\n\n// =============================================================================\n// Persisted Queue Contract\n// =============================================================================\n\nexport interface PersistedQueueEntry<TState> {\n\tstate: TState | null;\n\tevents: SharedMemoryEvent[];\n\tupdatedAt: number;\n}\n\nexport interface PersistedQueue<TState> {\n\t/** Schema version for migration */\n\tversion: typeof SHARED_MEMORY_SCHEMA_VERSION;\n\t/** When the queue was last persisted */\n\tupdatedAt: number;\n\t/** Pending sessions by key */\n\tsessions: Record<string, PersistedQueueEntry<TState>>;\n\t/** Queue statistics */\n\tstats: {\n\t\ttrimmedStates: number;\n\t\ttrimmedEvents: number;\n\t\tdroppedStates: number;\n\t\tdroppedEvents: number;\n\t\tbatchSplits: number;\n\t\tgzipRequests: number;\n\t\tlastSentAt: string | null;\n\t};\n}\n\n// =============================================================================\n// Configuration Constants\n// =============================================================================\n\nexport const SHARED_MEMORY_CONFIG = {\n\t/** Delay before flushing pending updates (ms) */\n\tFLUSH_DELAY_MS: 150,\n\t/** Request timeout (ms) */\n\tREQUEST_TIMEOUT_MS: 5000,\n\t/** Maximum pending events per session */\n\tMAX_PENDING_EVENTS: 50,\n\t/** Maximum backoff delay for retries (ms) */\n\tMAX_BACKOFF_MS: 5000,\n\t/** Default events per batch */\n\tDEFAULT_EVENTS_PER_BATCH: 25,\n\t/** Target max body size (with safety margin) */\n\tTARGET_MAX_BODY_BYTES: 220 * 1024,\n\t/** Maximum string length before truncation */\n\tMAX_STRING_LENGTH: 4000,\n\t/** Maximum array length before truncation */\n\tMAX_ARRAY_LENGTH: 50,\n\t/** Debounce delay for persisting queue (ms) */\n\tPERSIST_DEBOUNCE_MS: 300,\n\t/** TTL for persisted queue entries (ms) */\n\tPERSIST_TTL_MS: 24 * 60 * 60 * 1000,\n\t/** TTL for capabilities cache (ms) */\n\tCAPABILITIES_TTL_MS: 5 * 60 * 1000,\n} as const;\n\n// =============================================================================\n// Event Type Conventions\n// =============================================================================\n\n/**\n * Standard event type prefixes for each source.\n * Events should follow the pattern: {source}.{category}.{action}\n *\n * Examples:\n * - maestro.session.started\n * - maestro.message.saved\n * - conductor.tool.executed\n * - conductor.session.updated\n */\nexport const EVENT_TYPE_PREFIXES = {\n\tMAESTRO: \"maestro.\",\n\tCONDUCTOR: \"conductor.\",\n} as const;\n\n// =============================================================================\n// Type Guards\n// =============================================================================\n\nexport function isComposerState(\n\tstate: SharedMemoryStateBase,\n): state is ComposerState {\n\treturn state.source === \"maestro\";\n}\n\nexport function isConductorState(\n\tstate: SharedMemoryStateBase,\n): state is ConductorState {\n\treturn state.source === \"conductor\";\n}\n\nexport function isValidEventType(type: string): boolean {\n\tconst trimmed = type.trim();\n\tif (!trimmed) return false;\n\tif (trimmed.length > DEFAULT_CAPABILITIES.maxEventTypeLength) return false;\n\treturn true;\n}\n"]}
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Centralized telemetry exports including wide events pattern.
|
|
5
5
|
*/
|
|
6
|
-
export { recordTelemetry, recordToolExecution, recordEvaluationResult, recordLoaderStage, recordSseSkip, logToolFailure, recordBackgroundTaskEvent, recordApiRequest, recordBusinessMetric, recordSessionStart, recordSessionDuration, recordTokenUsage, recordCost, recordCompaction, recordModelSwitch, recordSubagentDispatch, recordSandboxViolation, getTelemetryStatus, setTelemetryRuntimeOverride, getBackgroundTaskHistory, type TelemetryStatus, type ApiRequestTelemetry, type ToolExecutionTelemetry, type EvaluationTelemetry, type LoaderStageTelemetry, type SseTelemetry, type BackgroundTaskTelemetry, type BusinessMetricTelemetry, type SandboxViolationTelemetry, type SubagentDispatchTelemetry, } from "../telemetry.js";
|
|
6
|
+
export { recordTelemetry, recordToolExecution, recordEvaluationResult, recordLoaderStage, recordSseSkip, logToolFailure, recordBackgroundTaskEvent, recordApiRequest, recordBusinessMetric, recordSessionStart, recordSessionDuration, recordTokenUsage, recordCost, recordCompaction, recordModelSwitch, recordSubagentDispatch, recordA2ADelegationTelemetry, recordA2APeerExclusionTelemetry, recordA2APolicyDenialTelemetry, recordSandboxViolation, getTelemetryStatus, setTelemetryRuntimeOverride, getBackgroundTaskHistory, type TelemetryStatus, type ApiRequestTelemetry, type ToolExecutionTelemetry, type EvaluationTelemetry, type LoaderStageTelemetry, type SseTelemetry, type BackgroundTaskTelemetry, type BusinessMetricTelemetry, type SandboxViolationTelemetry, type SubagentDispatchTelemetry, type A2ADelegationTelemetryInput, type A2ADelegationTelemetryPhase, } from "../telemetry.js";
|
|
7
7
|
export { MAESTRO_BUS_EVENT_CATALOG, MAESTRO_BUS_EVENT_TYPES, MaestroBusEventType, getMaestroBusEventCatalogEntry, isMaestroBusEventType, listMaestroBusEventCatalog, type MaestroBusEventCatalogEntry, type MaestroBusEventCategory, } from "./maestro-event-catalog.js";
|
|
8
|
-
export { buildMaestroCloudEvent, closeMaestroEventBusTransport, getMaestroEventBusStatus, maestroCorrelationToChronicleMetadata, publishMaestroCloudEvent, publishMaestroCloudEventStrict, recordMaestroApprovalHit, recordMaestroEvalScored, recordMaestroFirewallBlock, recordMaestroLearnedContext, recordMaestroPromptVariantSelected, recordMaestroSessionEvent, recordMaestroSkillInvoked, recordMaestroSkillOutcome, recordMaestroSubagentDispatch, recordMaestroToolCallAttempt, recordMaestroToolCallCompleted, resolveMaestroEventBusConfig, setMaestroEventBusTransportForTests, type ApprovalHitEventData, type EvalScoredEventData, type FirewallBlockEventData, type MaestroCloudEvent, type MaestroCloseReason, type MaestroCorrelation, type MaestroDecisionMode, type MaestroEventBusConfig, type MaestroEventBusStatus, type MaestroEventBusTransport, type MaestroLearnedContextEventData, type MaestroLearnedContextEvidence, type MaestroPrincipal, type MaestroRuntimeMode, type MaestroSessionEventData, type MaestroSessionState, type MaestroSkillOutcomeProtoStatus, type MaestroSkillOutcomeStatus, type MaestroSurface, type MaestroToolCallStatus, type PublishMaestroEventOptions, type RecordMaestroApprovalHitInput, type RecordMaestroEvalScoredInput, type RecordMaestroFirewallBlockInput, type RecordMaestroLearnedContextInput, type RecordMaestroPromptVariantSelectedInput, type PromptVariantSelectedEventData, type RecordMaestroSkillInvokedInput, type RecordMaestroSkillOutcomeInput, type RecordMaestroSubagentDispatchInput, type RecordMaestroToolCallAttemptInput, type RecordMaestroToolCallCompletedInput, type SandboxViolationEventData, type SkillInvocationEventData, type SkillOutcomeEventData, type SubagentDispatchEventData, type ToolCallAttemptEventData, type ToolCallResultEventData, } from "./maestro-event-bus.js";
|
|
8
|
+
export { buildMaestroCloudEvent, closeMaestroEventBusTransport, getMaestroEventBusStatus, hashA2AEndpointUrl, maestroCorrelationToChronicleMetadata, publishMaestroCloudEvent, publishMaestroCloudEventStrict, recordMaestroA2ADelegationEvent, recordMaestroApprovalHit, recordMaestroEvalScored, recordMaestroFirewallBlock, recordMaestroLearnedContext, recordMaestroPromptVariantSelected, recordMaestroSessionEvent, recordMaestroSkillInvoked, recordMaestroSkillOutcome, recordMaestroSubagentDispatch, recordMaestroToolCallAttempt, recordMaestroToolCallCompleted, resolveMaestroEventBusConfig, setMaestroEventBusTransportForTests, type ApprovalHitEventData, type EvalScoredEventData, type FirewallBlockEventData, type MaestroA2ADelegationEventData, type MaestroCloudEvent, type MaestroCloseReason, type MaestroCorrelation, type MaestroDecisionMode, type MaestroEventBusConfig, type MaestroEventBusStatus, type MaestroEventBusTransport, type MaestroLearnedContextEventData, type MaestroLearnedContextEvidence, type MaestroPrincipal, type MaestroRuntimeMode, type MaestroSessionEventData, type MaestroSessionState, type MaestroSkillOutcomeProtoStatus, type MaestroSkillOutcomeStatus, type MaestroSurface, type MaestroToolCallStatus, type PublishMaestroEventOptions, type RecordMaestroA2ADelegationEventInput, type RecordMaestroApprovalHitInput, type RecordMaestroEvalScoredInput, type RecordMaestroFirewallBlockInput, type RecordMaestroLearnedContextInput, type RecordMaestroPromptVariantSelectedInput, type PromptVariantSelectedEventData, type RecordMaestroSkillInvokedInput, type RecordMaestroSkillOutcomeInput, type RecordMaestroSubagentDispatchInput, type RecordMaestroToolCallAttemptInput, type RecordMaestroToolCallCompletedInput, type SandboxViolationEventData, type SkillInvocationEventData, type SkillOutcomeEventData, type SubagentDispatchEventData, type ToolCallAttemptEventData, type ToolCallResultEventData, } from "./maestro-event-bus.js";
|
|
9
9
|
export { CANONICAL_MAESTRO_PUBLISHER_CONFORMANCE_FIXTURE_NAME, buildCanonicalMaestroPublisherConformanceFixture, canonicalMaestroPublisherConformanceFixtureJson, type BuildMaestroPublisherConformanceFixtureOptions, type MaestroPublisherConformanceFixture, type MaestroPublisherConformanceFixtureEvent, } from "./maestro-publisher-conformance-fixture.js";
|
|
10
10
|
export { CANONICAL_MAESTRO_PLATFORM_REPLAY_FIXTURE_NAME, buildCanonicalMaestroPlatformReplayFixture, canonicalMaestroPlatformReplayFixtureJson, type MaestroPlatformReplayFixture, type MaestroPlatformReplayFixtureEvent, } from "./maestro-platform-replay-fixture.js";
|
|
11
11
|
export { buildAgentOperatingPlaneContext, buildAgentOperatingPlaneCorrelation, buildAgentOperatingPlaneMetadata, type AgentOperatingPlaneContext, type AgentOperatingPlaneContextInput, type AgentOperatingPlaneCorrelationInput, type AgentOperatingPlaneDataClassification, type AgentOperatingPlaneMetadataInput, type AgentOperatingPlaneRetentionClass, } from "./agent-operating-plane-context.js";
|