@geminixiang/mikan 1.0.0-beta.44 → 1.0.0-beta.46
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/CHANGELOG.md +32 -0
- package/README.md +12 -19
- package/dist/adapter.d.ts +1 -1
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js.map +1 -1
- package/dist/adapters/discord/bot.d.ts +3 -1
- package/dist/adapters/discord/bot.d.ts.map +1 -1
- package/dist/adapters/discord/bot.js +143 -141
- package/dist/adapters/discord/bot.js.map +1 -1
- package/dist/adapters/discord/context.d.ts +2 -8
- package/dist/adapters/discord/context.d.ts.map +1 -1
- package/dist/adapters/discord/context.js +1 -1
- package/dist/adapters/discord/context.js.map +1 -1
- package/dist/adapters/discord/format.d.ts.map +1 -1
- package/dist/adapters/discord/format.js +2 -4
- package/dist/adapters/discord/format.js.map +1 -1
- package/dist/adapters/github/bot.d.ts.map +1 -1
- package/dist/adapters/github/bot.js +1 -4
- package/dist/adapters/github/bot.js.map +1 -1
- package/dist/adapters/github/context.d.ts +2 -9
- package/dist/adapters/github/context.d.ts.map +1 -1
- package/dist/adapters/github/context.js.map +1 -1
- package/dist/adapters/github/github-ops.d.ts +4 -17
- package/dist/adapters/github/github-ops.d.ts.map +1 -1
- package/dist/adapters/github/github-ops.js +17 -86
- package/dist/adapters/github/github-ops.js.map +1 -1
- package/dist/adapters/github/tool-pack.d.ts.map +1 -1
- package/dist/adapters/github/tool-pack.js +0 -1
- package/dist/adapters/github/tool-pack.js.map +1 -1
- package/dist/adapters/github/tools/checks.d.ts +0 -1
- package/dist/adapters/github/tools/checks.d.ts.map +1 -1
- package/dist/adapters/github/tools/checks.js +3 -22
- package/dist/adapters/github/tools/checks.js.map +1 -1
- package/dist/adapters/github/types.d.ts +0 -33
- package/dist/adapters/github/types.d.ts.map +1 -1
- package/dist/adapters/github/types.js.map +1 -1
- package/dist/adapters/progressive-renderer.d.ts.map +1 -1
- package/dist/adapters/progressive-renderer.js +311 -318
- package/dist/adapters/progressive-renderer.js.map +1 -1
- package/dist/adapters/slack/blocks.d.ts.map +1 -1
- package/dist/adapters/slack/blocks.js +1 -4
- package/dist/adapters/slack/blocks.js.map +1 -1
- package/dist/adapters/slack/bot.d.ts +12 -0
- package/dist/adapters/slack/bot.d.ts.map +1 -1
- package/dist/adapters/slack/bot.js +158 -178
- package/dist/adapters/slack/bot.js.map +1 -1
- package/dist/adapters/slack/context.d.ts +2 -8
- package/dist/adapters/slack/context.d.ts.map +1 -1
- package/dist/adapters/slack/context.js +1 -1
- package/dist/adapters/slack/context.js.map +1 -1
- package/dist/adapters/slack/response-lifecycle.d.ts.map +1 -1
- package/dist/adapters/slack/response-lifecycle.js +135 -123
- package/dist/adapters/slack/response-lifecycle.js.map +1 -1
- package/dist/adapters/slack/stream-limits.d.ts +1 -1
- package/dist/adapters/slack/stream-limits.js +1 -1
- package/dist/adapters/slack/stream-limits.js.map +1 -1
- package/dist/adapters/slack/types.d.ts +4 -0
- package/dist/adapters/slack/types.d.ts.map +1 -1
- package/dist/adapters/slack/types.js.map +1 -1
- package/dist/adapters/telegram/context.d.ts +2 -8
- package/dist/adapters/telegram/context.d.ts.map +1 -1
- package/dist/adapters/telegram/context.js +1 -2
- package/dist/adapters/telegram/context.js.map +1 -1
- package/dist/adapters/types.d.ts +11 -5
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/adapters/types.js.map +1 -1
- package/dist/agent/catalog.d.ts +6 -18
- package/dist/agent/catalog.d.ts.map +1 -1
- package/dist/agent/catalog.js +19 -155
- package/dist/agent/catalog.js.map +1 -1
- package/dist/agent/execution.d.ts +0 -7
- package/dist/agent/execution.d.ts.map +1 -1
- package/dist/agent/execution.js +23 -21
- package/dist/agent/execution.js.map +1 -1
- package/dist/agent/presenter.d.ts +7 -9
- package/dist/agent/presenter.d.ts.map +1 -1
- package/dist/agent/presenter.js +355 -357
- package/dist/agent/presenter.js.map +1 -1
- package/dist/agent/prompt.d.ts +5 -12
- package/dist/agent/prompt.d.ts.map +1 -1
- package/dist/agent/prompt.js +56 -81
- package/dist/agent/prompt.js.map +1 -1
- package/dist/agent/runner.d.ts +0 -7
- package/dist/agent/runner.d.ts.map +1 -1
- package/dist/agent/runner.js +255 -308
- package/dist/agent/runner.js.map +1 -1
- package/dist/agent/types.d.ts +21 -17
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js +0 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/cli/boot.d.ts.map +1 -1
- package/dist/cli/boot.js +7 -10
- package/dist/cli/boot.js.map +1 -1
- package/dist/cli/onboard.d.ts +10 -0
- package/dist/cli/onboard.d.ts.map +1 -0
- package/dist/cli/onboard.js +237 -0
- package/dist/cli/onboard.js.map +1 -0
- package/dist/cli/types.d.ts +8 -3
- package/dist/cli/types.d.ts.map +1 -1
- package/dist/cli/types.js.map +1 -1
- package/dist/commands/auto-reply.d.ts.map +1 -1
- package/dist/commands/auto-reply.js +5 -12
- package/dist/commands/auto-reply.js.map +1 -1
- package/dist/commands/manifest.d.ts.map +1 -1
- package/dist/commands/manifest.js +9 -16
- package/dist/commands/manifest.js.map +1 -1
- package/dist/commands/new.d.ts.map +1 -1
- package/dist/commands/new.js +15 -10
- package/dist/commands/new.js.map +1 -1
- package/dist/commands/registry.d.ts.map +1 -1
- package/dist/commands/registry.js +0 -2
- package/dist/commands/registry.js.map +1 -1
- package/dist/commands/sandbox.d.ts.map +1 -1
- package/dist/commands/sandbox.js +89 -70
- package/dist/commands/sandbox.js.map +1 -1
- package/dist/commands/session-view.js +9 -2
- package/dist/commands/session-view.js.map +1 -1
- package/dist/commands/types.d.ts +4 -3
- package/dist/commands/types.d.ts.map +1 -1
- package/dist/commands/types.js.map +1 -1
- package/dist/config.d.ts +13 -17
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +39 -37
- package/dist/config.js.map +1 -1
- package/dist/dream/index.d.ts +20 -0
- package/dist/dream/index.d.ts.map +1 -0
- package/dist/dream/index.js +253 -0
- package/dist/dream/index.js.map +1 -0
- package/dist/dream/types.d.ts +30 -0
- package/dist/dream/types.d.ts.map +1 -0
- package/dist/dream/types.js.map +1 -0
- package/dist/env-manifest.d.ts.map +1 -1
- package/dist/env-manifest.js +2 -34
- package/dist/env-manifest.js.map +1 -1
- package/dist/execution-resolver.d.ts +9 -2
- package/dist/execution-resolver.d.ts.map +1 -1
- package/dist/execution-resolver.js +26 -27
- package/dist/execution-resolver.js.map +1 -1
- package/dist/harness/event-format.d.ts +1 -2
- package/dist/harness/event-format.d.ts.map +1 -1
- package/dist/harness/event-format.js +9 -15
- package/dist/harness/event-format.js.map +1 -1
- package/dist/harness/index.d.ts +1 -7
- package/dist/harness/index.d.ts.map +1 -1
- package/dist/harness/index.js +0 -4
- package/dist/harness/index.js.map +1 -1
- package/dist/harness/models.d.ts.map +1 -1
- package/dist/harness/models.js +15 -35
- package/dist/harness/models.js.map +1 -1
- package/dist/harness/runner.d.ts +7 -16
- package/dist/harness/runner.d.ts.map +1 -1
- package/dist/harness/runner.js +13 -131
- package/dist/harness/runner.js.map +1 -1
- package/dist/harness/session-store.d.ts +1 -1
- package/dist/harness/session-store.d.ts.map +1 -1
- package/dist/harness/session-store.js +1 -1
- package/dist/harness/session-store.js.map +1 -1
- package/dist/harness/subagent-runner.d.ts +2 -2
- package/dist/harness/subagent-runner.d.ts.map +1 -1
- package/dist/harness/subagent-runner.js +157 -162
- package/dist/harness/subagent-runner.js.map +1 -1
- package/dist/harness/types.d.ts +1 -13
- package/dist/harness/types.d.ts.map +1 -1
- package/dist/harness/types.js.map +1 -1
- package/dist/index.d.ts +3 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -5
- package/dist/index.js.map +1 -1
- package/dist/main.js +31 -212
- package/dist/main.js.map +1 -1
- package/dist/mcp/catalog.d.ts +5 -0
- package/dist/mcp/catalog.d.ts.map +1 -0
- package/dist/mcp/catalog.js +135 -0
- package/dist/mcp/catalog.js.map +1 -0
- package/dist/mcp/loader.d.ts.map +1 -1
- package/dist/mcp/loader.js +3 -6
- package/dist/mcp/loader.js.map +1 -1
- package/dist/mcp/types.d.ts +22 -0
- package/dist/mcp/types.d.ts.map +1 -1
- package/dist/mcp/types.js.map +1 -1
- package/dist/office/index.d.ts +136 -8
- package/dist/office/index.d.ts.map +1 -1
- package/dist/office/index.js +1050 -9
- package/dist/office/index.js.map +1 -1
- package/dist/office/types.d.ts +19 -1
- package/dist/office/types.d.ts.map +1 -1
- package/dist/office/types.js.map +1 -1
- package/dist/packages/index.d.ts +168 -5
- package/dist/packages/index.d.ts.map +1 -1
- package/dist/packages/index.js +749 -5
- package/dist/packages/index.js.map +1 -1
- package/dist/packages/types.d.ts +1 -5
- package/dist/packages/types.d.ts.map +1 -1
- package/dist/packages/types.js.map +1 -1
- package/dist/provisioner.d.ts +2 -9
- package/dist/provisioner.d.ts.map +1 -1
- package/dist/provisioner.js +3 -12
- package/dist/provisioner.js.map +1 -1
- package/dist/runtime/conversation-runtime.d.ts.map +1 -1
- package/dist/runtime/conversation-runtime.js +117 -380
- package/dist/runtime/conversation-runtime.js.map +1 -1
- package/dist/runtime/session-lifecycle.d.ts +32 -18
- package/dist/runtime/session-lifecycle.d.ts.map +1 -1
- package/dist/runtime/session-lifecycle.js +159 -46
- package/dist/runtime/session-lifecycle.js.map +1 -1
- package/dist/runtime/types.d.ts +4 -26
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/runtime/types.js.map +1 -1
- package/dist/sandbox/cloudflare.d.ts.map +1 -1
- package/dist/sandbox/cloudflare.js +2 -3
- package/dist/sandbox/cloudflare.js.map +1 -1
- package/dist/sandbox/container.d.ts +0 -1
- package/dist/sandbox/container.d.ts.map +1 -1
- package/dist/sandbox/container.js +2 -3
- package/dist/sandbox/container.js.map +1 -1
- package/dist/sandbox/host.d.ts.map +1 -1
- package/dist/sandbox/host.js +4 -2
- package/dist/sandbox/host.js.map +1 -1
- package/dist/sandbox/identity.d.ts +10 -19
- package/dist/sandbox/identity.d.ts.map +1 -1
- package/dist/sandbox/identity.js +8 -8
- package/dist/sandbox/identity.js.map +1 -1
- package/dist/sandbox/index.d.ts +7 -10
- package/dist/sandbox/index.d.ts.map +1 -1
- package/dist/sandbox/index.js +45 -16
- package/dist/sandbox/index.js.map +1 -1
- package/dist/sandbox/types.d.ts +13 -45
- package/dist/sandbox/types.d.ts.map +1 -1
- package/dist/sandbox/types.js.map +1 -1
- package/dist/sandbox/utils.d.ts +5 -0
- package/dist/sandbox/utils.d.ts.map +1 -1
- package/dist/sandbox/utils.js +10 -0
- package/dist/sandbox/utils.js.map +1 -1
- package/dist/sessions/chat-history-sync.d.ts +1 -3
- package/dist/sessions/chat-history-sync.d.ts.map +1 -1
- package/dist/sessions/chat-history-sync.js +58 -11
- package/dist/sessions/chat-history-sync.js.map +1 -1
- package/dist/sessions/migrate-v3.d.ts +2 -5
- package/dist/sessions/migrate-v3.d.ts.map +1 -1
- package/dist/sessions/migrate-v3.js +34 -4
- package/dist/sessions/migrate-v3.js.map +1 -1
- package/dist/sessions/store.d.ts +5 -6
- package/dist/sessions/store.d.ts.map +1 -1
- package/dist/sessions/store.js +62 -2
- package/dist/sessions/store.js.map +1 -1
- package/dist/sessions/types.d.ts +9 -0
- package/dist/sessions/types.d.ts.map +1 -1
- package/dist/sessions/types.js.map +1 -1
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js +2 -10
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/read.js +2 -2
- package/dist/tools/read.js.map +1 -1
- package/dist/tools/sandbox.d.ts.map +1 -1
- package/dist/tools/sandbox.js +2 -3
- package/dist/tools/sandbox.js.map +1 -1
- package/dist/tools/subagent.d.ts +1 -1
- package/dist/tools/subagent.js.map +1 -1
- package/dist/types.d.ts +38 -127
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/vault/index.d.ts +9 -2
- package/dist/vault/index.d.ts.map +1 -1
- package/dist/vault/index.js +29 -5
- package/dist/vault/index.js.map +1 -1
- package/dist/web/admin/portal.d.ts +12 -1
- package/dist/web/admin/portal.d.ts.map +1 -1
- package/dist/web/admin/portal.js +437 -422
- package/dist/web/admin/portal.js.map +1 -1
- package/dist/web/admin/types.d.ts +2 -2
- package/dist/web/admin/types.d.ts.map +1 -1
- package/dist/web/admin/types.js.map +1 -1
- package/dist/web/login/portal.d.ts +7 -1
- package/dist/web/login/portal.d.ts.map +1 -1
- package/dist/web/login/portal.js +143 -78
- package/dist/web/login/portal.js.map +1 -1
- package/dist/web/portal-shell.d.ts +1 -0
- package/dist/web/portal-shell.d.ts.map +1 -1
- package/dist/web/portal-shell.js +12 -1
- package/dist/web/portal-shell.js.map +1 -1
- package/dist/web/server.d.ts +3 -3
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js.map +1 -1
- package/dist/web/session-view/portal.d.ts +8 -1
- package/dist/web/session-view/portal.d.ts.map +1 -1
- package/dist/web/session-view/portal.js +609 -132
- package/dist/web/session-view/portal.js.map +1 -1
- package/dist/web/session-view/types.d.ts +8 -0
- package/dist/web/session-view/types.d.ts.map +1 -1
- package/dist/web/session-view/types.js.map +1 -1
- package/dist/workspace-projection/index.d.ts +14 -2
- package/dist/workspace-projection/index.d.ts.map +1 -1
- package/dist/workspace-projection/index.js +102 -14
- package/dist/workspace-projection/index.js.map +1 -1
- package/dist/workspace-projection/types.d.ts +14 -1
- package/dist/workspace-projection/types.d.ts.map +1 -1
- package/dist/workspace-projection/types.js.map +1 -1
- package/package.json +3 -5
- package/dist/adapters/github/cloudbuild.d.ts +0 -19
- package/dist/adapters/github/cloudbuild.d.ts.map +0 -1
- package/dist/adapters/github/cloudbuild.js +0 -71
- package/dist/adapters/github/cloudbuild.js.map +0 -1
- package/dist/adapters/github/gcp-auth.d.ts +0 -28
- package/dist/adapters/github/gcp-auth.d.ts.map +0 -1
- package/dist/adapters/github/gcp-auth.js +0 -196
- package/dist/adapters/github/gcp-auth.js.map +0 -1
- package/dist/agent/index.d.ts +0 -9
- package/dist/agent/index.d.ts.map +0 -1
- package/dist/agent/index.js +0 -8
- package/dist/agent/index.js.map +0 -1
- package/dist/cli/ext-dev.d.ts +0 -2
- package/dist/cli/ext-dev.d.ts.map +0 -1
- package/dist/cli/ext-dev.js +0 -188
- package/dist/cli/ext-dev.js.map +0 -1
- package/dist/cli/ext.d.ts +0 -2
- package/dist/cli/ext.d.ts.map +0 -1
- package/dist/cli/ext.js +0 -324
- package/dist/cli/ext.js.map +0 -1
- package/dist/commands/extensions.d.ts +0 -26
- package/dist/commands/extensions.d.ts.map +0 -1
- package/dist/commands/extensions.js +0 -103
- package/dist/commands/extensions.js.map +0 -1
- package/dist/extension-schedules.d.ts +0 -31
- package/dist/extension-schedules.d.ts.map +0 -1
- package/dist/extension-schedules.js +0 -229
- package/dist/extension-schedules.js.map +0 -1
- package/dist/harness/auth.d.ts +0 -17
- package/dist/harness/auth.d.ts.map +0 -1
- package/dist/harness/auth.js +0 -92
- package/dist/harness/auth.js.map +0 -1
- package/dist/harness/extensions/loader.d.ts +0 -40
- package/dist/harness/extensions/loader.d.ts.map +0 -1
- package/dist/harness/extensions/loader.js +0 -723
- package/dist/harness/extensions/loader.js.map +0 -1
- package/dist/harness/extensions/registry.d.ts +0 -155
- package/dist/harness/extensions/registry.d.ts.map +0 -1
- package/dist/harness/extensions/registry.js +0 -420
- package/dist/harness/extensions/registry.js.map +0 -1
- package/dist/harness/extensions/types.d.ts +0 -665
- package/dist/harness/extensions/types.d.ts.map +0 -1
- package/dist/harness/extensions/types.js.map +0 -1
- package/dist/office/address.d.ts +0 -31
- package/dist/office/address.d.ts.map +0 -1
- package/dist/office/address.js +0 -113
- package/dist/office/address.js.map +0 -1
- package/dist/office/layout.d.ts +0 -27
- package/dist/office/layout.d.ts.map +0 -1
- package/dist/office/layout.js +0 -97
- package/dist/office/layout.js.map +0 -1
- package/dist/office/migration.d.ts +0 -44
- package/dist/office/migration.d.ts.map +0 -1
- package/dist/office/migration.js +0 -255
- package/dist/office/migration.js.map +0 -1
- package/dist/office/registry.d.ts +0 -75
- package/dist/office/registry.d.ts.map +0 -1
- package/dist/office/registry.js +0 -646
- package/dist/office/registry.js.map +0 -1
- package/dist/packages/admin.d.ts +0 -17
- package/dist/packages/admin.d.ts.map +0 -1
- package/dist/packages/admin.js +0 -98
- package/dist/packages/admin.js.map +0 -1
- package/dist/packages/inspect.d.ts +0 -11
- package/dist/packages/inspect.d.ts.map +0 -1
- package/dist/packages/inspect.js +0 -98
- package/dist/packages/inspect.js.map +0 -1
- package/dist/packages/materialize.d.ts +0 -40
- package/dist/packages/materialize.d.ts.map +0 -1
- package/dist/packages/materialize.js +0 -297
- package/dist/packages/materialize.js.map +0 -1
- package/dist/packages/resolve.d.ts +0 -25
- package/dist/packages/resolve.d.ts.map +0 -1
- package/dist/packages/resolve.js +0 -208
- package/dist/packages/resolve.js.map +0 -1
- package/dist/packages/source.d.ts +0 -39
- package/dist/packages/source.d.ts.map +0 -1
- package/dist/packages/source.js +0 -189
- package/dist/packages/source.js.map +0 -1
- package/dist/sandbox/errors.d.ts +0 -6
- package/dist/sandbox/errors.d.ts.map +0 -1
- package/dist/sandbox/errors.js +0 -11
- package/dist/sandbox/errors.js.map +0 -1
- package/dist/sandbox/firecracker.d.ts +0 -18
- package/dist/sandbox/firecracker.d.ts.map +0 -1
- package/dist/sandbox/firecracker.js +0 -223
- package/dist/sandbox/firecracker.js.map +0 -1
- package/dist/sandbox/gondolin.d.ts +0 -57
- package/dist/sandbox/gondolin.d.ts.map +0 -1
- package/dist/sandbox/gondolin.js +0 -764
- package/dist/sandbox/gondolin.js.map +0 -1
- package/dist/sandbox/image.d.ts +0 -3
- package/dist/sandbox/image.d.ts.map +0 -1
- package/dist/sandbox/image.js +0 -29
- package/dist/sandbox/image.js.map +0 -1
- package/dist/sessions/conversation-log.d.ts +0 -9
- package/dist/sessions/conversation-log.d.ts.map +0 -1
- package/dist/sessions/conversation-log.js +0 -50
- package/dist/sessions/conversation-log.js.map +0 -1
- package/dist/sessions/rotation.d.ts +0 -2
- package/dist/sessions/rotation.d.ts.map +0 -1
- package/dist/sessions/rotation.js +0 -41
- package/dist/sessions/rotation.js.map +0 -1
- package/dist/vault/disabled.d.ts +0 -9
- package/dist/vault/disabled.d.ts.map +0 -1
- package/dist/vault/disabled.js +0 -25
- package/dist/vault/disabled.js.map +0 -1
- package/dist/web/admin/store.d.ts +0 -13
- package/dist/web/admin/store.d.ts.map +0 -1
- package/dist/web/admin/store.js +0 -14
- package/dist/web/admin/store.js.map +0 -1
- package/dist/web/login/store.d.ts +0 -8
- package/dist/web/login/store.d.ts.map +0 -1
- package/dist/web/login/store.js +0 -15
- package/dist/web/login/store.js.map +0 -1
- package/dist/web/session-view/service.d.ts +0 -6
- package/dist/web/session-view/service.d.ts.map +0 -1
- package/dist/web/session-view/service.js +0 -517
- package/dist/web/session-view/service.js.map +0 -1
- package/dist/web/session-view/store.d.ts +0 -8
- package/dist/web/session-view/store.d.ts.map +0 -1
- package/dist/web/session-view/store.js +0 -15
- package/dist/web/session-view/store.js.map +0 -1
- /package/dist/{harness/extensions → dream}/types.js +0 -0
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { createRunner } from "../agent/runner.js";
|
|
2
|
+
import { commitOfficeDream, generateMemoryAnchor, prepareOfficeDream } from "../dream/index.js";
|
|
3
3
|
import { MikanModels } from "../harness/index.js";
|
|
4
4
|
import { defaultCommandHandlers, dispatchCommand } from "../commands/registry.js";
|
|
5
5
|
import { isPrivateConversation } from "../commands/utils.js";
|
|
6
6
|
import * as log from "../log.js";
|
|
7
7
|
import { addLifecycleBreadcrumb, applyRunScope, createRunAttributionAttributes, registerTraceAttribution, reportUserFacingError, } from "../observability/sentry.js";
|
|
8
8
|
import { ChatHistorySync, hasMaterializedChatSession, waitForThreadSessionBootstrap, } from "../sessions/chat-history-sync.js";
|
|
9
|
-
import { shouldRotateTopLevelSession } from "../sessions/
|
|
9
|
+
import { shouldRotateTopLevelSession } from "../sessions/store.js";
|
|
10
10
|
import { getThreadSessionFile, resolveChannelSessionFile, tryResolveThreadSession, } from "../sessions/store.js";
|
|
11
|
-
import { assertSessionKeyBelongsToConversation, deriveSessionKey,
|
|
11
|
+
import { assertSessionKeyBelongsToConversation, deriveSessionKey, } from "../sessions/session-key.js";
|
|
12
12
|
import { formatNothingRunning, formatStopped, formatStopping } from "../platform-messages.js";
|
|
13
13
|
import * as Sentry from "@sentry/node";
|
|
14
14
|
import { getUnresolvedSandboxPathContext } from "../sandbox/index.js";
|
|
15
|
-
import { disabledVaultManager } from "../vault/
|
|
15
|
+
import { disabledVaultManager } from "../vault/index.js";
|
|
16
16
|
import { SessionLifecycle } from "./session-lifecycle.js";
|
|
17
17
|
/**
|
|
18
18
|
* Placeholder token store for embedders that run without the web portal.
|
|
@@ -38,11 +38,7 @@ class ConversationRuntimeImpl {
|
|
|
38
38
|
constructor(options) {
|
|
39
39
|
this.options = options;
|
|
40
40
|
this.sessions = new SessionLifecycle();
|
|
41
|
-
this.inFlightRuns = new Set();
|
|
42
|
-
this.sessionDreamSettlements = new Set();
|
|
43
41
|
this.chatSessionManager = new ChatHistorySync();
|
|
44
|
-
this.globalRunnerGeneration = 0;
|
|
45
|
-
this.conversationRunnerGenerations = new Map();
|
|
46
42
|
this.isShuttingDown = false;
|
|
47
43
|
this.resolvedModels = options.models ?? MikanModels.create();
|
|
48
44
|
this.commandServices = {
|
|
@@ -57,7 +53,7 @@ class ConversationRuntimeImpl {
|
|
|
57
53
|
this.commandHandlers = options.commandHandlers ?? defaultCommandHandlers(this.resolvedModels);
|
|
58
54
|
}
|
|
59
55
|
isRunning(address, sessionKey) {
|
|
60
|
-
return this.sessions.
|
|
56
|
+
return this.sessions.get(address, sessionKey)?.running === true;
|
|
61
57
|
}
|
|
62
58
|
getRunningSessions() {
|
|
63
59
|
const sessions = [];
|
|
@@ -75,6 +71,18 @@ class ConversationRuntimeImpl {
|
|
|
75
71
|
}
|
|
76
72
|
return sessions;
|
|
77
73
|
}
|
|
74
|
+
async runDream(address, now = new Date()) {
|
|
75
|
+
return this.sessions.runConversationMaintenance(address, async () => {
|
|
76
|
+
const office = this.options.workspace.office(address);
|
|
77
|
+
const plan = await prepareOfficeDream(office, now);
|
|
78
|
+
if (!plan)
|
|
79
|
+
return false;
|
|
80
|
+
const memory = await generateMemoryAnchor(office, plan, this.resolvedModels);
|
|
81
|
+
commitOfficeDream(office, plan, memory);
|
|
82
|
+
log.logInfo(`[${address.conversationId}] Dream updated the Memory anchor`);
|
|
83
|
+
return true;
|
|
84
|
+
});
|
|
85
|
+
}
|
|
78
86
|
async handleStop(address, sessionKey, bot) {
|
|
79
87
|
assertSessionKeyBelongsToConversation(sessionKey, address.conversationId);
|
|
80
88
|
const state = this.sessions.get(address, sessionKey);
|
|
@@ -96,9 +104,7 @@ class ConversationRuntimeImpl {
|
|
|
96
104
|
state.runner.abort();
|
|
97
105
|
}
|
|
98
106
|
}
|
|
99
|
-
async handleNewCommand(sessionKey, conversationId, bot, message,
|
|
100
|
-
// The message's address is the authority; the raw id is still passed for
|
|
101
|
-
// filesystem layout, so a disagreement must fail loudly, not pick one.
|
|
107
|
+
async handleNewCommand({ sessionKey, conversationId, bot, message, }) {
|
|
102
108
|
const address = message.address;
|
|
103
109
|
if (conversationId !== address.conversationId) {
|
|
104
110
|
throw new Error(`Conversation id ${JSON.stringify(conversationId)} does not match office ` +
|
|
@@ -106,116 +112,20 @@ class ConversationRuntimeImpl {
|
|
|
106
112
|
}
|
|
107
113
|
assertSessionKeyBelongsToConversation(sessionKey, address.conversationId);
|
|
108
114
|
const activeState = this.sessions.get(address, sessionKey);
|
|
109
|
-
if (activeState?.
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
await activeSettlement;
|
|
114
|
-
return;
|
|
115
|
-
}
|
|
116
|
-
activeState.stopRequested = true;
|
|
117
|
-
activeState.runner.abort();
|
|
118
|
-
await activeSettlement;
|
|
119
|
-
}
|
|
120
|
-
const state = await this.getOrCreateState({
|
|
121
|
-
address,
|
|
122
|
-
conversationId,
|
|
123
|
-
sessionKey,
|
|
124
|
-
conversationKind: message.conversationKind,
|
|
125
|
-
});
|
|
126
|
-
// Scope resolution only materializes; the Session Dream below reads the
|
|
127
|
-
// session, so bring it up to date with the log first.
|
|
128
|
-
await state.runner.syncChatHistory(message.id);
|
|
129
|
-
if (state.running ||
|
|
130
|
-
(state.runSettlement && this.sessionDreamSettlements.has(state.runSettlement))) {
|
|
131
|
-
const activeSettlement = state.runSettlement;
|
|
132
|
-
if (activeSettlement && this.sessionDreamSettlements.has(activeSettlement)) {
|
|
133
|
-
await activeSettlement;
|
|
134
|
-
return;
|
|
115
|
+
if (activeState?.runSettlement) {
|
|
116
|
+
if (activeState.running) {
|
|
117
|
+
activeState.stopRequested = true;
|
|
118
|
+
activeState.runner.abort();
|
|
135
119
|
}
|
|
136
|
-
|
|
137
|
-
state.runner.abort();
|
|
138
|
-
await activeSettlement;
|
|
139
|
-
return this.handleNewCommand(sessionKey, conversationId, bot, message, responder, platform);
|
|
120
|
+
await activeState.runSettlement;
|
|
140
121
|
}
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
try {
|
|
144
|
-
await responder.setWorking(true);
|
|
145
|
-
working = true;
|
|
146
|
-
const result = await this.dreamSessionMemory(state, message, platform);
|
|
147
|
-
if (!result.success) {
|
|
148
|
-
const detail = result.errorMessage ? ` ${result.errorMessage}` : "";
|
|
149
|
-
await responder.respondDiagnostic(`Could not preserve memory, so the current conversation was not reset.${detail}`, { style: "error" });
|
|
150
|
-
return;
|
|
151
|
-
}
|
|
152
|
-
await responder.setWorking(false);
|
|
153
|
-
working = false;
|
|
154
|
-
await this.resetSession(state, bot);
|
|
155
|
-
}
|
|
156
|
-
finally {
|
|
157
|
-
if (working)
|
|
158
|
-
await responder.setWorking(false);
|
|
159
|
-
}
|
|
122
|
+
await this.sessions.runConversationMaintenance(address, async () => {
|
|
123
|
+
await this.resetSession(address, sessionKey, bot);
|
|
160
124
|
});
|
|
161
|
-
void dreamSettlement
|
|
162
|
-
.catch((err) => {
|
|
163
|
-
reportUserFacingError(err, {
|
|
164
|
-
domain: "mikan",
|
|
165
|
-
surface: "session_dream",
|
|
166
|
-
operation: "run_new_command_in_background",
|
|
167
|
-
});
|
|
168
|
-
})
|
|
169
|
-
.finally(() => this.finishSessionDream(state, dreamSettlement));
|
|
170
|
-
}
|
|
171
|
-
startSessionDream(state, dream, markRunning = true) {
|
|
172
|
-
if (markRunning) {
|
|
173
|
-
state.running = true;
|
|
174
|
-
state.stopRequested = false;
|
|
175
|
-
state.startedAt = Date.now();
|
|
176
|
-
state.lastActivityAt = Date.now();
|
|
177
|
-
}
|
|
178
|
-
const settlement = Promise.resolve().then(dream);
|
|
179
|
-
state.runSettlement = settlement;
|
|
180
|
-
this.sessionDreamSettlements.add(settlement);
|
|
181
|
-
this.inFlightRuns.add(settlement);
|
|
182
|
-
return settlement;
|
|
183
|
-
}
|
|
184
|
-
finishSessionDream(state, settlement) {
|
|
185
|
-
this.sessionDreamSettlements.delete(settlement);
|
|
186
|
-
this.inFlightRuns.delete(settlement);
|
|
187
|
-
if (state.runSettlement !== settlement)
|
|
188
|
-
return;
|
|
189
|
-
state.runSettlement = undefined;
|
|
190
|
-
state.running = false;
|
|
191
|
-
state.startedAt = 0;
|
|
192
|
-
state.lastAccessedAt = Date.now();
|
|
193
|
-
this.sessions.onSettlement(state.address);
|
|
194
|
-
this.sessions.evictIdle();
|
|
195
|
-
}
|
|
196
|
-
async dreamSessionMemory(state, message, platform) {
|
|
197
|
-
try {
|
|
198
|
-
const result = await state.runner.dreamSessionMemory(message, platform);
|
|
199
|
-
// Only a clean stop means the dream finished its work. Everything else —
|
|
200
|
-
// budget abort, length cutoff, error, blocked — leaves memory unwritten,
|
|
201
|
-
// and treating it as success resets the session and loses it silently.
|
|
202
|
-
// Listed as a whitelist so a new stop reason fails safe.
|
|
203
|
-
if (result.stopReason !== "stop") {
|
|
204
|
-
return {
|
|
205
|
-
success: false,
|
|
206
|
-
errorMessage: result.errorMessage ?? `Session Dream stopped early (${result.stopReason})`,
|
|
207
|
-
};
|
|
208
|
-
}
|
|
209
|
-
return { success: true };
|
|
210
|
-
}
|
|
211
|
-
catch (err) {
|
|
212
|
-
return { success: false, errorMessage: err instanceof Error ? err.message : String(err) };
|
|
213
|
-
}
|
|
214
125
|
}
|
|
215
126
|
scheduleSharedSessionRotation({ event, bot, context }, sessionKey) {
|
|
216
127
|
const { address, conversationId } = event;
|
|
217
|
-
|
|
218
|
-
if (message.conversationKind !== "shared" || sessionKey !== conversationId)
|
|
128
|
+
if (context.message.conversationKind !== "shared" || sessionKey !== conversationId)
|
|
219
129
|
return false;
|
|
220
130
|
const conversationDir = this.options.workspace.office(address).dir;
|
|
221
131
|
const currentSession = resolveChannelSessionFile(conversationDir);
|
|
@@ -228,51 +138,26 @@ class ConversationRuntimeImpl {
|
|
|
228
138
|
await this.runSession({ event, bot, context }, true);
|
|
229
139
|
return;
|
|
230
140
|
}
|
|
231
|
-
const
|
|
232
|
-
|
|
233
|
-
|
|
141
|
+
const runtimeCwd = runtimeCwdForSandbox(this.options.sandbox, this.options.workspace, address);
|
|
142
|
+
await this.chatSessionManager.resetSession({
|
|
143
|
+
conversationDir,
|
|
234
144
|
sessionKey,
|
|
235
|
-
|
|
236
|
-
currentMessageId: message.id,
|
|
145
|
+
cwd: runtimeCwd,
|
|
237
146
|
});
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
await state.runner.syncChatHistory(message.id);
|
|
241
|
-
const dreamSettlement = this.startSessionDream(state, async () => {
|
|
242
|
-
const result = await this.dreamSessionMemory(state, message, platform);
|
|
243
|
-
if (!result.success) {
|
|
244
|
-
const detail = result.errorMessage ? `: ${result.errorMessage}` : "";
|
|
245
|
-
log.logWarning(`[${conversationId}] Automatic Session Dream failed${detail}`);
|
|
246
|
-
return;
|
|
247
|
-
}
|
|
248
|
-
const runtimeCwd = runtimeCwdForSandbox(this.options.sandbox, this.options.workspace, address);
|
|
249
|
-
await this.chatSessionManager.resetSession({
|
|
250
|
-
conversationDir,
|
|
251
|
-
sessionKey,
|
|
252
|
-
cwd: runtimeCwd,
|
|
253
|
-
});
|
|
254
|
-
await this.sessions.discardAndWait(address, sessionKey);
|
|
255
|
-
log.logInfo(`[${conversationId}] Session Dream completed; rotated session: ${sessionKey}`);
|
|
256
|
-
}, false);
|
|
257
|
-
try {
|
|
258
|
-
await dreamSettlement;
|
|
259
|
-
}
|
|
260
|
-
finally {
|
|
261
|
-
this.finishSessionDream(state, dreamSettlement);
|
|
262
|
-
}
|
|
147
|
+
await this.sessions.discardAndWait(address, sessionKey);
|
|
148
|
+
log.logInfo(`[${conversationId}] Rotated session: ${sessionKey}`);
|
|
263
149
|
await this.runSession({ event, bot, context }, true);
|
|
264
150
|
})
|
|
265
151
|
.catch((err) => {
|
|
266
152
|
reportUserFacingError(err, {
|
|
267
153
|
domain: "mikan",
|
|
268
|
-
surface: "
|
|
154
|
+
surface: "session_rotation",
|
|
269
155
|
operation: "rotate_shared_session_in_background",
|
|
270
156
|
});
|
|
271
157
|
});
|
|
272
158
|
return true;
|
|
273
159
|
}
|
|
274
|
-
async resetSession(
|
|
275
|
-
const { address, sessionKey } = state;
|
|
160
|
+
async resetSession(address, sessionKey, bot) {
|
|
276
161
|
const conversationId = address.conversationId;
|
|
277
162
|
const conversationDir = this.options.workspace.office(address).dir;
|
|
278
163
|
const runtimeCwd = runtimeCwdForSandbox(this.options.sandbox, this.options.workspace, address);
|
|
@@ -285,75 +170,6 @@ class ConversationRuntimeImpl {
|
|
|
285
170
|
const sessionKey = deriveSessionKey(event);
|
|
286
171
|
await this.sessions.enqueue(event.address, sessionKey, () => this.runSession({ event, bot, context }));
|
|
287
172
|
}
|
|
288
|
-
/**
|
|
289
|
-
* Dispatch an extension-owned interactive block action: materialize the
|
|
290
|
-
* conversation's harness instance (activating its extensions) and run the
|
|
291
|
-
* matching onAction handler — deterministic, no agent run. Serialized on
|
|
292
|
-
* the session queue so rapid interactions (votes) never interleave.
|
|
293
|
-
*/
|
|
294
|
-
async handleExtensionAction(params) {
|
|
295
|
-
if (this.isShuttingDown)
|
|
296
|
-
return false;
|
|
297
|
-
const { address, sessionKey, conversationKind, slug, action } = params;
|
|
298
|
-
const conversationId = address.conversationId;
|
|
299
|
-
let consumed = false;
|
|
300
|
-
await this.sessions.enqueue(address, sessionKey, async () => {
|
|
301
|
-
try {
|
|
302
|
-
const state = await this.getOrCreateState({
|
|
303
|
-
address,
|
|
304
|
-
conversationId,
|
|
305
|
-
sessionKey,
|
|
306
|
-
currentMessageId: action.messageTs ?? sessionKey,
|
|
307
|
-
conversationKind,
|
|
308
|
-
});
|
|
309
|
-
consumed = await state.runner.tryExtensionAction(slug, action);
|
|
310
|
-
if (consumed)
|
|
311
|
-
state.lastAccessedAt = Date.now();
|
|
312
|
-
}
|
|
313
|
-
catch (err) {
|
|
314
|
-
log.logWarning(`[${conversationId}] Extension action dispatch failed (${slug}:${action.actionId})`, err instanceof Error ? err.message : String(err));
|
|
315
|
-
}
|
|
316
|
-
});
|
|
317
|
-
return consumed;
|
|
318
|
-
}
|
|
319
|
-
/**
|
|
320
|
-
* Dispatch a fired extension callback schedule: materialize the
|
|
321
|
-
* conversation's harness instance (activating its extensions) and run the
|
|
322
|
-
* matching `onCallback` handler — deterministic, no agent run, no model
|
|
323
|
-
* call. Serialized on the session queue so fires never interleave with
|
|
324
|
-
* block actions or runs in the same conversation.
|
|
325
|
-
*/
|
|
326
|
-
async handleExtensionScheduleCallback(fire) {
|
|
327
|
-
if (this.isShuttingDown)
|
|
328
|
-
return false;
|
|
329
|
-
const address = createOfficeAddress(fire.platform, fire.conversationId);
|
|
330
|
-
const conversationId = fire.conversationId;
|
|
331
|
-
// Schedules belong to the conversation, not a thread: use the top-level
|
|
332
|
-
// session scope, like the schedules that fire agent runs.
|
|
333
|
-
const sessionKey = conversationId;
|
|
334
|
-
let consumed = false;
|
|
335
|
-
await this.sessions.enqueue(address, sessionKey, async () => {
|
|
336
|
-
try {
|
|
337
|
-
const state = await this.getOrCreateState({
|
|
338
|
-
address,
|
|
339
|
-
conversationId,
|
|
340
|
-
sessionKey,
|
|
341
|
-
currentMessageId: `extsched:${fire.slug}.${fire.scheduleName}`,
|
|
342
|
-
conversationKind: inferConversationKind(fire.platform, conversationId),
|
|
343
|
-
});
|
|
344
|
-
consumed = await state.runner.tryExtensionScheduleCallback(fire.slug, fire.callback, {
|
|
345
|
-
scheduleName: fire.scheduleName,
|
|
346
|
-
...(fire.args !== undefined ? { args: fire.args } : {}),
|
|
347
|
-
});
|
|
348
|
-
if (consumed)
|
|
349
|
-
state.lastAccessedAt = Date.now();
|
|
350
|
-
}
|
|
351
|
-
catch (err) {
|
|
352
|
-
log.logWarning(`[${conversationId}] Extension schedule dispatch failed (${fire.slug}.${fire.scheduleName} → ${fire.callback})`, err instanceof Error ? err.message : String(err));
|
|
353
|
-
}
|
|
354
|
-
});
|
|
355
|
-
return consumed;
|
|
356
|
-
}
|
|
357
173
|
async runSession({ event, bot, context }, skipRotation = false) {
|
|
358
174
|
const conversationId = event.conversationId;
|
|
359
175
|
if (this.isShuttingDown) {
|
|
@@ -361,24 +177,8 @@ class ConversationRuntimeImpl {
|
|
|
361
177
|
return;
|
|
362
178
|
}
|
|
363
179
|
const sessionKey = deriveSessionKey(event);
|
|
364
|
-
if (!skipRotation) {
|
|
365
|
-
|
|
366
|
-
const handledCommand = await dispatchCommand(this.commandHandlers, {
|
|
367
|
-
bot,
|
|
368
|
-
responder: context.responder,
|
|
369
|
-
platform: context.platform.name,
|
|
370
|
-
address: event.address,
|
|
371
|
-
platformUserId: event.user,
|
|
372
|
-
platformUserName: context.message.userName,
|
|
373
|
-
conversationId,
|
|
374
|
-
vaultConversationId: event.vaultConversationId,
|
|
375
|
-
sessionKey,
|
|
376
|
-
commandText: event.text,
|
|
377
|
-
privateConversation,
|
|
378
|
-
services: this.commandServices,
|
|
379
|
-
});
|
|
380
|
-
if (handledCommand)
|
|
381
|
-
return;
|
|
180
|
+
if (!skipRotation && (await this.dispatchSessionCommand({ event, bot, context }, sessionKey))) {
|
|
181
|
+
return;
|
|
382
182
|
}
|
|
383
183
|
const address = event.address;
|
|
384
184
|
const activeSettlement = this.sessions.get(address, sessionKey)?.runSettlement;
|
|
@@ -394,42 +194,19 @@ class ConversationRuntimeImpl {
|
|
|
394
194
|
: await this.sessions.acquireConversationWork(address);
|
|
395
195
|
try {
|
|
396
196
|
const conversationDir = this.options.workspace.office(address).dir;
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
sessionKey,
|
|
400
|
-
hasThreadSession: () => hasMaterializedChatSession({ conversationDir, sessionKey }),
|
|
401
|
-
isParentRunning: () => this.sessions.get(address, conversationId)?.running === true,
|
|
402
|
-
});
|
|
403
|
-
if (waitedForParent) {
|
|
404
|
-
log.logInfo(`[${conversationId}] Delayed thread bootstrap until parent session sealed: ${sessionKey}`);
|
|
405
|
-
}
|
|
406
|
-
let state;
|
|
197
|
+
await this.waitForParentSession(address, sessionKey, conversationDir);
|
|
198
|
+
let lease;
|
|
407
199
|
try {
|
|
408
|
-
|
|
200
|
+
lease = await this.acquireState({
|
|
409
201
|
address,
|
|
410
|
-
conversationId,
|
|
411
202
|
sessionKey,
|
|
412
203
|
currentMessageId: event.ts,
|
|
413
|
-
conversationKind: event.conversationKind,
|
|
414
204
|
});
|
|
205
|
+
const { state } = lease;
|
|
415
206
|
await state.runner.syncChatHistory(event.ts);
|
|
416
|
-
// Extension-contributed commands: deterministic dispatch, no agent run.
|
|
417
|
-
// Built-in commands already had their chance above, so extensions can
|
|
418
|
-
// never shadow them; unmatched text falls through to the agent.
|
|
419
|
-
//
|
|
420
|
-
// Where the platform eats the slash before we ever see it, the leading
|
|
421
|
-
// name alone is enough — otherwise those commands would be unreachable
|
|
422
|
-
// rather than merely awkward.
|
|
423
|
-
const bareName = context.platform.bareExtensionCommands === true;
|
|
424
|
-
if (bareName || event.text.trim().startsWith("/")) {
|
|
425
|
-
const handled = await state.runner.tryExtensionCommand(context.message, context.responder, { bareName });
|
|
426
|
-
if (handled) {
|
|
427
|
-
state.lastAccessedAt = Date.now();
|
|
428
|
-
return;
|
|
429
|
-
}
|
|
430
|
-
}
|
|
431
207
|
}
|
|
432
208
|
catch (err) {
|
|
209
|
+
lease?.release();
|
|
433
210
|
reportUserFacingError(err, {
|
|
434
211
|
domain: "mikan",
|
|
435
212
|
surface: "session_setup",
|
|
@@ -446,12 +223,9 @@ class ConversationRuntimeImpl {
|
|
|
446
223
|
});
|
|
447
224
|
throw err;
|
|
448
225
|
}
|
|
449
|
-
state
|
|
450
|
-
state.stopRequested = false;
|
|
451
|
-
state.startedAt = Date.now();
|
|
452
|
-
state.lastActivityAt = Date.now();
|
|
226
|
+
const { state } = lease;
|
|
453
227
|
log.logInfo(`[${conversationId}] Starting run: ${event.text.substring(0, 50)}`);
|
|
454
|
-
const runPromise = (async () => {
|
|
228
|
+
const runPromise = this.sessions.settle(state, async () => {
|
|
455
229
|
try {
|
|
456
230
|
const result = await this.runWithInstrumentation(context, { conversationId, sessionKey, startedAt: state.startedAt }, async () => {
|
|
457
231
|
await context.responder.setTyping(true);
|
|
@@ -474,29 +248,45 @@ class ConversationRuntimeImpl {
|
|
|
474
248
|
}
|
|
475
249
|
}
|
|
476
250
|
finally {
|
|
477
|
-
|
|
478
|
-
state.lastAccessedAt = Date.now();
|
|
479
|
-
Sentry.metrics.gauge("agent.sessions.active", this.inFlightRuns.size - 1);
|
|
251
|
+
Sentry.metrics.gauge("agent.sessions.active", this.sessions.settlementCount() - 1);
|
|
480
252
|
}
|
|
481
|
-
})
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
try {
|
|
486
|
-
await runPromise;
|
|
487
|
-
}
|
|
488
|
-
finally {
|
|
489
|
-
this.inFlightRuns.delete(runPromise);
|
|
490
|
-
if (state.runSettlement === runPromise)
|
|
491
|
-
state.runSettlement = undefined;
|
|
492
|
-
this.sessions.onSettlement(address);
|
|
493
|
-
this.sessions.evictIdle();
|
|
494
|
-
}
|
|
253
|
+
});
|
|
254
|
+
lease.release();
|
|
255
|
+
Sentry.metrics.gauge("agent.sessions.active", this.sessions.settlementCount());
|
|
256
|
+
await runPromise;
|
|
495
257
|
}
|
|
496
258
|
finally {
|
|
497
259
|
releaseConversationWork();
|
|
498
260
|
}
|
|
499
261
|
}
|
|
262
|
+
async waitForParentSession(address, sessionKey, conversationDir) {
|
|
263
|
+
const conversationId = address.conversationId;
|
|
264
|
+
const waited = await waitForThreadSessionBootstrap({
|
|
265
|
+
parentSessionKey: conversationId,
|
|
266
|
+
sessionKey,
|
|
267
|
+
hasThreadSession: () => hasMaterializedChatSession({ conversationDir, sessionKey }),
|
|
268
|
+
isParentRunning: () => this.sessions.get(address, conversationId)?.running === true,
|
|
269
|
+
});
|
|
270
|
+
if (waited) {
|
|
271
|
+
log.logInfo(`[${conversationId}] Delayed thread bootstrap until parent session sealed: ${sessionKey}`);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
async dispatchSessionCommand({ event, bot, context }, sessionKey) {
|
|
275
|
+
return dispatchCommand(this.commandHandlers, {
|
|
276
|
+
bot,
|
|
277
|
+
responder: context.responder,
|
|
278
|
+
platform: context.platform.name,
|
|
279
|
+
address: event.address,
|
|
280
|
+
platformUserId: event.user,
|
|
281
|
+
platformUserName: context.message.userName,
|
|
282
|
+
conversationId: event.conversationId,
|
|
283
|
+
vaultConversationId: event.vaultConversationId,
|
|
284
|
+
sessionKey,
|
|
285
|
+
commandText: event.text,
|
|
286
|
+
privateConversation: isPrivateConversation(event),
|
|
287
|
+
services: this.commandServices,
|
|
288
|
+
});
|
|
289
|
+
}
|
|
500
290
|
async runWithInstrumentation(context, meta, body) {
|
|
501
291
|
const { conversationId, sessionKey, startedAt } = meta;
|
|
502
292
|
const { message, platform } = context;
|
|
@@ -579,92 +369,57 @@ class ConversationRuntimeImpl {
|
|
|
579
369
|
}));
|
|
580
370
|
}
|
|
581
371
|
switchConversationModel(address, _provider, _model) {
|
|
582
|
-
this.
|
|
583
|
-
return this.clearOffice(address, "Model switched");
|
|
372
|
+
return this.invalidateOffice(address, "Model switched");
|
|
584
373
|
}
|
|
585
374
|
refreshConversationEnvironment(address) {
|
|
586
|
-
this.
|
|
587
|
-
return this.clearOffice(address, "Environment refreshed");
|
|
375
|
+
return this.invalidateOffice(address, "Environment refreshed");
|
|
588
376
|
}
|
|
589
377
|
refreshAllConversations() {
|
|
590
|
-
this.
|
|
591
|
-
const
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
}
|
|
378
|
+
const offices = this.sessions.offices();
|
|
379
|
+
const result = this.sessions.invalidateAll();
|
|
380
|
+
const busyKeys = new Set(result.busy.map((address) => `${address.platform}:${address.conversationId}`));
|
|
381
|
+
for (const address of offices) {
|
|
382
|
+
if (busyKeys.has(`${address.platform}:${address.conversationId}`))
|
|
383
|
+
continue;
|
|
384
|
+
log.logInfo(`[${address.conversationId}] Global settings changed; cleared cached session runners`);
|
|
597
385
|
}
|
|
598
|
-
return
|
|
386
|
+
return result;
|
|
599
387
|
}
|
|
600
|
-
|
|
601
|
-
const cleared = this.sessions.
|
|
388
|
+
invalidateOffice(address, reason) {
|
|
389
|
+
const cleared = this.sessions.invalidateConversation(address);
|
|
602
390
|
if (cleared) {
|
|
603
391
|
log.logInfo(`[${address.conversationId}] ${reason}; cleared cached session runners`);
|
|
604
392
|
}
|
|
605
393
|
return cleared;
|
|
606
394
|
}
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
sessionView: this.options.sessionViewTokenStore
|
|
626
|
-
? {
|
|
627
|
-
tokenStore: this.options.sessionViewTokenStore,
|
|
628
|
-
portalBaseUrl: this.options.portalBaseUrl,
|
|
629
|
-
}
|
|
630
|
-
: undefined,
|
|
631
|
-
platformNotifier: this.options.platformNotifier,
|
|
632
|
-
platformReactor: this.options.platformReactor,
|
|
633
|
-
platformUploader: this.options.platformUploader,
|
|
634
|
-
platformBlockKit: this.options.platformBlockKit,
|
|
635
|
-
platformDmOpener: this.options.platformDmOpener,
|
|
636
|
-
platformHistoryFetcher: this.options.platformHistoryFetcher,
|
|
637
|
-
platformUserLister: this.options.platformUserLister,
|
|
638
|
-
extensionScheduleEngine: this.options.extensionScheduleEngine,
|
|
639
|
-
platformToolPackFactories: this.options.platformToolPackFactories,
|
|
640
|
-
models: this.resolvedModels,
|
|
641
|
-
});
|
|
642
|
-
if (generation === this.runnerGeneration(options.address))
|
|
643
|
-
return runner;
|
|
644
|
-
await runner.dispose();
|
|
645
|
-
}
|
|
646
|
-
}
|
|
647
|
-
async getOrCreateState(options) {
|
|
648
|
-
return this.sessions.transition(options.address, options.sessionKey, () => this.getOrCreateStateExclusive(options));
|
|
395
|
+
async createCurrentRunner(options, sessionScope) {
|
|
396
|
+
return createRunner({
|
|
397
|
+
sandboxConfig: this.options.sandbox,
|
|
398
|
+
sessionKey: options.sessionKey,
|
|
399
|
+
office: this.options.workspace.office(options.address),
|
|
400
|
+
sessionScope,
|
|
401
|
+
vaultManager: this.options.vaultManager,
|
|
402
|
+
provisioner: this.options.provisioner,
|
|
403
|
+
resourceController: this.options.resourceController,
|
|
404
|
+
sessionView: this.options.sessionViewTokenStore
|
|
405
|
+
? {
|
|
406
|
+
tokenStore: this.options.sessionViewTokenStore,
|
|
407
|
+
portalBaseUrl: this.options.portalBaseUrl,
|
|
408
|
+
}
|
|
409
|
+
: undefined,
|
|
410
|
+
platformToolPackFactories: this.options.platformToolPackFactories,
|
|
411
|
+
models: this.resolvedModels,
|
|
412
|
+
});
|
|
649
413
|
}
|
|
650
|
-
|
|
651
|
-
const { address, sessionKey
|
|
652
|
-
await this.sessions.waitForClose(address, sessionKey);
|
|
653
|
-
const existing = this.sessions.get(address, sessionKey);
|
|
654
|
-
// A cached runner is the sole writable pi v4 session handle for its file:
|
|
655
|
-
// reuse it before scope resolution can open the same path a second time.
|
|
414
|
+
acquireState(options) {
|
|
415
|
+
const { address, sessionKey } = options;
|
|
656
416
|
const conversationDir = this.options.workspace.office(address).dir;
|
|
657
|
-
|
|
417
|
+
return this.sessions.acquire(address, sessionKey, () => sessionKey === address.conversationId
|
|
658
418
|
? resolveChannelSessionFile(conversationDir)
|
|
659
|
-
: tryResolveThreadSession(getThreadSessionFile(conversationDir, sessionKey));
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
}
|
|
664
|
-
if (existing?.running)
|
|
665
|
-
return existing;
|
|
666
|
-
if (existing)
|
|
667
|
-
await this.sessions.discardAndWait(address, sessionKey);
|
|
419
|
+
: tryResolveThreadSession(getThreadSessionFile(conversationDir, sessionKey)), () => this.materializeState(options, conversationDir));
|
|
420
|
+
}
|
|
421
|
+
async materializeState(options, conversationDir) {
|
|
422
|
+
const { address, sessionKey, currentMessageId } = options;
|
|
668
423
|
const runtimeCwd = runtimeCwdForSandbox(this.options.sandbox, this.options.workspace, address);
|
|
669
424
|
const sessionScope = await this.chatSessionManager.resolveSessionScope({
|
|
670
425
|
conversationDir,
|
|
@@ -672,41 +427,23 @@ class ConversationRuntimeImpl {
|
|
|
672
427
|
cwd: runtimeCwd,
|
|
673
428
|
currentMessageId,
|
|
674
429
|
});
|
|
675
|
-
|
|
430
|
+
return {
|
|
676
431
|
address,
|
|
677
432
|
sessionKey,
|
|
678
433
|
running: false,
|
|
679
|
-
runner: await this.createCurrentRunner(options,
|
|
434
|
+
runner: await this.createCurrentRunner(options, sessionScope),
|
|
680
435
|
stopRequested: false,
|
|
681
436
|
lastAccessedAt: Date.now(),
|
|
682
437
|
sessionFile: sessionScope.contextFile,
|
|
683
438
|
startedAt: 0,
|
|
684
439
|
};
|
|
685
|
-
this.sessions.set(state);
|
|
686
|
-
return state;
|
|
687
440
|
}
|
|
688
441
|
async shutdown(timeoutMs = 30_000) {
|
|
689
442
|
if (this.isShuttingDown)
|
|
690
443
|
return;
|
|
691
444
|
this.isShuttingDown = true;
|
|
692
445
|
log.logInfo("Shutting down gracefully...");
|
|
693
|
-
|
|
694
|
-
while (this.inFlightRuns.size > 0 && Date.now() < timeout) {
|
|
695
|
-
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
696
|
-
}
|
|
697
|
-
if (this.inFlightRuns.size > 0) {
|
|
698
|
-
log.logWarning(`Aborting ${this.inFlightRuns.size} runs after shutdown timeout`, `${timeoutMs}ms`);
|
|
699
|
-
for (const state of this.sessions.runningStates())
|
|
700
|
-
state.runner.abort();
|
|
701
|
-
const closeDeadline = Date.now() + 5_000;
|
|
702
|
-
while (this.inFlightRuns.size > 0 && Date.now() < closeDeadline) {
|
|
703
|
-
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
704
|
-
}
|
|
705
|
-
if (this.inFlightRuns.size > 0) {
|
|
706
|
-
throw new Error(`Shutdown could not settle ${this.inFlightRuns.size} aborted runs within 5000ms`);
|
|
707
|
-
}
|
|
708
|
-
}
|
|
709
|
-
await this.sessions.closeAll();
|
|
446
|
+
await this.sessions.shutdown(timeoutMs);
|
|
710
447
|
}
|
|
711
448
|
}
|
|
712
449
|
//# sourceMappingURL=conversation-runtime.js.map
|