@geminixiang/mikan 1.0.0-beta.53 → 1.0.0-beta.55
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 +29 -0
- package/README.md +3 -2
- package/dist/adapters/commands/admin.d.ts.map +1 -0
- package/dist/{commands → adapters/commands}/admin.js +4 -8
- package/dist/adapters/commands/admin.js.map +1 -0
- package/dist/adapters/commands/login.d.ts.map +1 -0
- package/dist/adapters/commands/login.js +166 -0
- package/dist/adapters/commands/login.js.map +1 -0
- package/dist/adapters/commands/manifest.d.ts.map +1 -0
- package/dist/{commands → adapters/commands}/manifest.js +0 -7
- package/dist/adapters/commands/manifest.js.map +1 -0
- package/dist/{commands → adapters/commands}/model.d.ts +6 -0
- package/dist/adapters/commands/model.d.ts.map +1 -0
- package/dist/{commands → adapters/commands}/model.js +56 -44
- package/dist/adapters/commands/model.js.map +1 -0
- package/dist/adapters/commands/new.d.ts.map +1 -0
- package/dist/{commands → adapters/commands}/new.js +7 -8
- package/dist/adapters/commands/new.js.map +1 -0
- package/dist/adapters/commands/registry.d.ts.map +1 -0
- package/dist/{commands → adapters/commands}/registry.js +1 -3
- package/dist/adapters/commands/registry.js.map +1 -0
- package/dist/adapters/commands/sandbox.d.ts.map +1 -0
- package/dist/{commands → adapters/commands}/sandbox.js +22 -21
- package/dist/adapters/commands/sandbox.js.map +1 -0
- package/dist/adapters/commands/session-view.d.ts.map +1 -0
- package/dist/{commands → adapters/commands}/session-view.js +8 -11
- package/dist/adapters/commands/session-view.js.map +1 -0
- package/dist/{commands → adapters/commands}/types.d.ts +6 -6
- package/dist/adapters/commands/types.d.ts.map +1 -0
- package/dist/adapters/commands/types.js.map +1 -0
- package/dist/adapters/commands/utils.d.ts +14 -0
- package/dist/adapters/commands/utils.d.ts.map +1 -0
- package/dist/{commands → adapters/commands}/utils.js +18 -1
- package/dist/adapters/commands/utils.js.map +1 -0
- package/dist/adapters/discord/bot.d.ts.map +1 -1
- package/dist/adapters/discord/bot.js +4 -5
- package/dist/adapters/discord/bot.js.map +1 -1
- package/dist/adapters/github/bot.d.ts.map +1 -1
- package/dist/adapters/github/bot.js +3 -4
- package/dist/adapters/github/bot.js.map +1 -1
- package/dist/adapters/github/client.d.ts.map +1 -1
- package/dist/adapters/github/client.js +5 -18
- package/dist/adapters/github/client.js.map +1 -1
- package/dist/adapters/github/tool-pack.d.ts +1 -1
- package/dist/adapters/github/tool-pack.d.ts.map +1 -1
- package/dist/adapters/github/tool-pack.js.map +1 -1
- package/dist/adapters/github/tools/checks.js +1 -1
- package/dist/adapters/github/tools/checks.js.map +1 -1
- package/dist/adapters/github/tools/issue.js +1 -1
- package/dist/adapters/github/tools/issue.js.map +1 -1
- package/dist/adapters/github/tools/pr.js +1 -1
- package/dist/adapters/github/tools/pr.js.map +1 -1
- package/dist/adapters/github/tools/read.d.ts.map +1 -1
- package/dist/adapters/github/tools/read.js +53 -53
- package/dist/adapters/github/tools/read.js.map +1 -1
- package/dist/adapters/github/tools/review-reply.js +1 -1
- package/dist/adapters/github/tools/review-reply.js.map +1 -1
- package/dist/adapters/github/tools/sync.js +1 -1
- package/dist/adapters/github/tools/sync.js.map +1 -1
- package/dist/adapters/intake.d.ts +1 -1
- package/dist/adapters/intake.d.ts.map +1 -1
- package/dist/adapters/intake.js +2 -6
- package/dist/adapters/intake.js.map +1 -1
- package/dist/adapters/markdown-tables.d.ts +0 -13
- package/dist/adapters/markdown-tables.d.ts.map +1 -1
- package/dist/adapters/markdown-tables.js +26 -38
- package/dist/adapters/markdown-tables.js.map +1 -1
- package/dist/adapters/shared.js +1 -1
- package/dist/adapters/shared.js.map +1 -1
- package/dist/adapters/slack/bot.d.ts +7 -4
- package/dist/adapters/slack/bot.d.ts.map +1 -1
- package/dist/adapters/slack/bot.js +104 -122
- package/dist/adapters/slack/bot.js.map +1 -1
- package/dist/adapters/slack/response-lifecycle.d.ts.map +1 -1
- package/dist/adapters/slack/response-lifecycle.js +33 -25
- package/dist/adapters/slack/response-lifecycle.js.map +1 -1
- package/dist/adapters/slack/tool-pack.d.ts +1 -1
- package/dist/adapters/slack/tool-pack.d.ts.map +1 -1
- package/dist/adapters/slack/tool-pack.js.map +1 -1
- package/dist/adapters/slack/update-diagnostics.d.ts.map +1 -1
- package/dist/adapters/slack/update-diagnostics.js +8 -24
- package/dist/adapters/slack/update-diagnostics.js.map +1 -1
- package/dist/adapters/telegram/bot.d.ts.map +1 -1
- package/dist/adapters/telegram/bot.js +3 -4
- package/dist/adapters/telegram/bot.js.map +1 -1
- package/dist/adapters/types.d.ts +2 -4
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/adapters/types.js.map +1 -1
- package/dist/{web → adapters/web}/admin/portal.d.ts +3 -3
- package/dist/adapters/web/admin/portal.d.ts.map +1 -0
- package/dist/{web → adapters/web}/admin/portal.js +535 -709
- package/dist/adapters/web/admin/portal.js.map +1 -0
- package/dist/{web → adapters/web}/admin/provider-models.d.ts +1 -1
- package/dist/adapters/web/admin/provider-models.d.ts.map +1 -0
- package/dist/adapters/web/admin/provider-models.js.map +1 -0
- package/dist/{web → adapters/web}/admin/types.d.ts +5 -5
- package/dist/adapters/web/admin/types.d.ts.map +1 -0
- package/dist/adapters/web/admin/types.js.map +1 -0
- package/dist/adapters/web/login/oauth.d.ts.map +1 -0
- package/dist/{web → adapters/web}/login/oauth.js +50 -54
- package/dist/adapters/web/login/oauth.js.map +1 -0
- package/dist/{web → adapters/web}/login/portal.d.ts +2 -2
- package/dist/adapters/web/login/portal.d.ts.map +1 -0
- package/dist/{web → adapters/web}/login/portal.js +6 -6
- package/dist/adapters/web/login/portal.js.map +1 -0
- package/dist/{web → adapters/web}/login/types.d.ts +1 -1
- package/dist/adapters/web/login/types.d.ts.map +1 -0
- package/dist/adapters/web/login/types.js.map +1 -0
- package/dist/{web → adapters/web}/portal-shell.d.ts +2 -2
- package/dist/adapters/web/portal-shell.d.ts.map +1 -0
- package/dist/{web → adapters/web}/portal-shell.js +2 -2
- package/dist/adapters/web/portal-shell.js.map +1 -0
- package/dist/{web → adapters/web}/server.d.ts +5 -5
- package/dist/adapters/web/server.d.ts.map +1 -0
- package/dist/{web → adapters/web}/server.js +4 -7
- package/dist/adapters/web/server.js.map +1 -0
- package/dist/adapters/web/session-view/portal.d.ts.map +1 -0
- package/dist/{web → adapters/web}/session-view/portal.js +9 -9
- package/dist/adapters/web/session-view/portal.js.map +1 -0
- package/dist/{web → adapters/web}/session-view/types.d.ts +3 -3
- package/dist/adapters/web/session-view/types.d.ts.map +1 -0
- package/dist/adapters/web/session-view/types.js.map +1 -0
- package/dist/adapters/web/token-store.d.ts.map +1 -0
- package/dist/adapters/web/token-store.js.map +1 -0
- package/dist/adapters/web/types.d.ts.map +1 -0
- package/dist/adapters/web/types.js.map +1 -0
- package/dist/cli/arg-grammar.d.ts +24 -0
- package/dist/cli/arg-grammar.d.ts.map +1 -1
- package/dist/cli/arg-grammar.js +39 -8
- package/dist/cli/arg-grammar.js.map +1 -1
- package/dist/cli/boot.d.ts.map +1 -1
- package/dist/cli/boot.js +48 -62
- package/dist/cli/boot.js.map +1 -1
- package/dist/cli/download.d.ts.map +1 -1
- package/dist/cli/download.js +51 -54
- package/dist/cli/download.js.map +1 -1
- package/dist/cli/office.d.ts.map +1 -1
- package/dist/cli/office.js +9 -26
- package/dist/cli/office.js.map +1 -1
- package/dist/cli/onboard.d.ts.map +1 -1
- package/dist/cli/onboard.js +15 -11
- package/dist/cli/onboard.js.map +1 -1
- package/dist/cli/sessions.d.ts.map +1 -1
- package/dist/cli/sessions.js +49 -52
- package/dist/cli/sessions.js.map +1 -1
- package/dist/config.d.ts +4 -28
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +7 -112
- package/dist/config.js.map +1 -1
- package/dist/dream/index.d.ts.map +1 -1
- package/dist/dream/index.js +8 -2
- package/dist/dream/index.js.map +1 -1
- package/dist/dream/types.d.ts +1 -1
- package/dist/dream/types.d.ts.map +1 -1
- package/dist/dream/types.js.map +1 -1
- package/dist/env-manifest.d.ts +2 -0
- package/dist/env-manifest.d.ts.map +1 -1
- package/dist/env-manifest.js +29 -8
- package/dist/env-manifest.js.map +1 -1
- package/dist/events/index.d.ts +150 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/{harness/event-format.js → events/index.js} +80 -2
- package/dist/events/index.js.map +1 -0
- package/dist/{events.d.ts → events/watcher.d.ts} +4 -4
- package/dist/events/watcher.d.ts.map +1 -0
- package/dist/{events.js → events/watcher.js} +8 -8
- package/dist/events/watcher.js.map +1 -0
- package/dist/file-guards.d.ts.map +1 -0
- package/dist/file-guards.js.map +1 -0
- package/dist/harness/execution-env.d.ts +19 -0
- package/dist/harness/execution-env.d.ts.map +1 -0
- package/dist/harness/execution-env.js +262 -0
- package/dist/harness/execution-env.js.map +1 -0
- package/dist/harness/execution-resolver.d.ts +25 -0
- package/dist/harness/execution-resolver.d.ts.map +1 -0
- package/dist/{execution-resolver.js → harness/execution-resolver.js} +12 -21
- package/dist/harness/execution-resolver.js.map +1 -0
- package/dist/harness/index.d.ts +9 -9
- package/dist/harness/index.d.ts.map +1 -1
- package/dist/harness/index.js +8 -8
- package/dist/harness/index.js.map +1 -1
- package/dist/harness/mcp.d.ts +38 -0
- package/dist/harness/mcp.d.ts.map +1 -0
- package/dist/{mcp/loader.js → harness/mcp.js} +155 -6
- package/dist/harness/mcp.js.map +1 -0
- package/dist/harness/models.js +1 -1
- package/dist/harness/models.js.map +1 -1
- package/dist/harness/open-connector.d.ts.map +1 -0
- package/dist/{mcp → harness}/open-connector.js +1 -1
- package/dist/harness/open-connector.js.map +1 -0
- package/dist/{agent → harness}/presenter.d.ts +2 -9
- package/dist/harness/presenter.d.ts.map +1 -0
- package/dist/{agent → harness}/presenter.js +170 -146
- package/dist/harness/presenter.js.map +1 -0
- package/dist/{agent → harness}/prompt.d.ts +10 -3
- package/dist/harness/prompt.d.ts.map +1 -0
- package/dist/{agent → harness}/prompt.js +137 -41
- package/dist/harness/prompt.js.map +1 -0
- package/dist/harness/runner.d.ts +2 -109
- package/dist/harness/runner.d.ts.map +1 -1
- package/dist/harness/runner.js +499 -467
- package/dist/harness/runner.js.map +1 -1
- package/dist/harness/session.d.ts +119 -0
- package/dist/harness/session.d.ts.map +1 -0
- package/dist/harness/session.js +561 -0
- package/dist/harness/session.js.map +1 -0
- package/dist/harness/skills.d.ts +10 -2
- package/dist/harness/skills.d.ts.map +1 -1
- package/dist/harness/skills.js +62 -39
- package/dist/harness/skills.js.map +1 -1
- package/dist/harness/{subagent-runner.d.ts → subagent.d.ts} +25 -6
- package/dist/harness/subagent.d.ts.map +1 -0
- package/dist/harness/{subagent-runner.js → subagent.js} +106 -54
- package/dist/harness/subagent.js.map +1 -0
- package/dist/harness/tools/attach.d.ts.map +1 -0
- package/dist/harness/tools/attach.js.map +1 -0
- package/dist/{tools → harness/tools}/event.d.ts +3 -32
- package/dist/harness/tools/event.d.ts.map +1 -0
- package/dist/harness/tools/event.js +178 -0
- package/dist/harness/tools/event.js.map +1 -0
- package/dist/harness/tools/generate-image.d.ts.map +1 -0
- package/dist/harness/tools/generate-image.js.map +1 -0
- package/dist/harness/tools/host-fn-tool.d.ts.map +1 -0
- package/dist/harness/tools/host-fn-tool.js.map +1 -0
- package/dist/{tools → harness/tools}/index.d.ts +5 -6
- package/dist/harness/tools/index.d.ts.map +1 -0
- package/dist/{tools → harness/tools}/index.js +12 -16
- package/dist/harness/tools/index.js.map +1 -0
- package/dist/harness/tools/pi-tools.d.ts +18 -0
- package/dist/harness/tools/pi-tools.d.ts.map +1 -0
- package/dist/harness/tools/pi-tools.js +84 -0
- package/dist/harness/tools/pi-tools.js.map +1 -0
- package/dist/harness/tools/react.d.ts.map +1 -0
- package/dist/harness/tools/react.js.map +1 -0
- package/dist/{tools → harness/tools}/sandbox.d.ts +2 -2
- package/dist/harness/tools/sandbox.d.ts.map +1 -0
- package/dist/{tools → harness/tools}/sandbox.js +1 -1
- package/dist/harness/tools/sandbox.js.map +1 -0
- package/dist/{tools → harness/tools}/subagent.d.ts +28 -1
- package/dist/harness/tools/subagent.d.ts.map +1 -0
- package/dist/{tools → harness/tools}/subagent.js +218 -2
- package/dist/harness/tools/subagent.js.map +1 -0
- package/dist/{tools → harness/tools}/types.d.ts +0 -33
- package/dist/harness/tools/types.d.ts.map +1 -0
- package/dist/harness/tools/types.js.map +1 -0
- package/dist/harness/types.d.ts +180 -97
- package/dist/harness/types.d.ts.map +1 -1
- package/dist/harness/types.js +1 -1
- package/dist/harness/types.js.map +1 -1
- package/dist/index.d.ts +12 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -6
- package/dist/index.js.map +1 -1
- package/dist/main.js +10 -12
- package/dist/main.js.map +1 -1
- package/dist/observability/index.d.ts +33 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +256 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/instrument.js +7 -1
- package/dist/observability/instrument.js.map +1 -1
- package/dist/observability/otel.d.ts +10 -0
- package/dist/observability/otel.d.ts.map +1 -0
- package/dist/observability/otel.js +183 -0
- package/dist/observability/otel.js.map +1 -0
- package/dist/observability/sentry.d.ts +22 -5
- package/dist/observability/sentry.d.ts.map +1 -1
- package/dist/observability/sentry.js +68 -23
- package/dist/observability/sentry.js.map +1 -1
- package/dist/observability/types.d.ts +6 -2
- package/dist/observability/types.d.ts.map +1 -1
- package/dist/observability/types.js.map +1 -1
- package/dist/office/index.d.ts +2 -3
- package/dist/office/index.d.ts.map +1 -1
- package/dist/office/index.js +172 -140
- package/dist/office/index.js.map +1 -1
- package/dist/{workspace-projection/index.d.ts → office/projection.d.ts} +2 -2
- package/dist/office/projection.d.ts.map +1 -0
- package/dist/{workspace-projection/index.js → office/projection.js} +2 -2
- package/dist/office/projection.js.map +1 -0
- package/dist/office/types.d.ts +29 -2
- package/dist/office/types.d.ts.map +1 -1
- package/dist/office/types.js.map +1 -1
- package/dist/process-lifecycle.d.ts +1 -1
- package/dist/process-lifecycle.d.ts.map +1 -1
- package/dist/process-lifecycle.js +3 -3
- package/dist/process-lifecycle.js.map +1 -1
- package/dist/runtime/conversation-runtime.d.ts.map +1 -1
- package/dist/runtime/conversation-runtime.js +106 -107
- package/dist/runtime/conversation-runtime.js.map +1 -1
- package/dist/runtime/session-lifecycle.d.ts +10 -0
- package/dist/runtime/session-lifecycle.d.ts.map +1 -1
- package/dist/runtime/session-lifecycle.js +42 -24
- package/dist/runtime/session-lifecycle.js.map +1 -1
- package/dist/runtime/types.d.ts +3 -3
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/runtime/types.js.map +1 -1
- package/dist/sandbox/cloudflare.d.ts +1 -0
- package/dist/sandbox/cloudflare.d.ts.map +1 -1
- package/dist/sandbox/cloudflare.js +41 -50
- package/dist/sandbox/cloudflare.js.map +1 -1
- package/dist/sandbox/container.d.ts.map +1 -1
- package/dist/sandbox/container.js +7 -4
- package/dist/sandbox/container.js.map +1 -1
- package/dist/sandbox/host.d.ts.map +1 -1
- package/dist/sandbox/host.js +27 -35
- package/dist/sandbox/host.js.map +1 -1
- package/dist/sandbox/index.d.ts.map +1 -1
- package/dist/sandbox/index.js +8 -15
- package/dist/sandbox/index.js.map +1 -1
- package/dist/{provisioner.d.ts → sandbox/provisioner.d.ts} +2 -2
- package/dist/sandbox/provisioner.d.ts.map +1 -0
- package/dist/{provisioner.js → sandbox/provisioner.js} +3 -3
- package/dist/sandbox/provisioner.js.map +1 -0
- package/dist/sandbox/types.d.ts +2 -0
- 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 +14 -0
- package/dist/sandbox/utils.js.map +1 -1
- package/dist/sessions/chat-history-sync.d.ts.map +1 -1
- package/dist/sessions/chat-history-sync.js +72 -62
- package/dist/sessions/chat-history-sync.js.map +1 -1
- package/dist/sessions/migrate-common.d.ts +43 -0
- package/dist/sessions/migrate-common.d.ts.map +1 -0
- package/dist/sessions/migrate-common.js +99 -0
- package/dist/sessions/migrate-common.js.map +1 -0
- package/dist/sessions/migrate-pi-084.d.ts.map +1 -1
- package/dist/sessions/migrate-pi-084.js +152 -203
- package/dist/sessions/migrate-pi-084.js.map +1 -1
- package/dist/sessions/migrate-v3.d.ts +5 -0
- package/dist/sessions/migrate-v3.d.ts.map +1 -1
- package/dist/sessions/migrate-v3.js +161 -209
- package/dist/sessions/migrate-v3.js.map +1 -1
- package/dist/{harness → sessions}/session-store.d.ts +12 -1
- package/dist/sessions/session-store.d.ts.map +1 -0
- package/dist/{harness → sessions}/session-store.js +74 -35
- package/dist/sessions/session-store.js.map +1 -0
- package/dist/sessions/store.d.ts +1 -1
- package/dist/sessions/store.d.ts.map +1 -1
- package/dist/sessions/store.js +18 -17
- package/dist/sessions/store.js.map +1 -1
- package/dist/sessions/types.d.ts +40 -1
- package/dist/sessions/types.d.ts.map +1 -1
- package/dist/sessions/types.js +1 -1
- package/dist/sessions/types.js.map +1 -1
- package/dist/types.d.ts +7 -99
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/vault/index.d.ts.map +1 -1
- package/dist/vault/index.js +70 -53
- package/dist/vault/index.js.map +1 -1
- package/package.json +10 -4
- package/dist/adapters/slack/tools/attach.d.ts.map +0 -1
- package/dist/adapters/slack/tools/attach.js.map +0 -1
- package/dist/agent/catalog.d.ts +0 -22
- package/dist/agent/catalog.d.ts.map +0 -1
- package/dist/agent/catalog.js +0 -104
- package/dist/agent/catalog.js.map +0 -1
- package/dist/agent/execution.d.ts +0 -25
- package/dist/agent/execution.d.ts.map +0 -1
- package/dist/agent/execution.js +0 -171
- package/dist/agent/execution.js.map +0 -1
- package/dist/agent/presenter.d.ts.map +0 -1
- package/dist/agent/presenter.js.map +0 -1
- package/dist/agent/prompt.d.ts.map +0 -1
- package/dist/agent/prompt.js.map +0 -1
- package/dist/agent/runner.d.ts +0 -3
- package/dist/agent/runner.d.ts.map +0 -1
- package/dist/agent/runner.js +0 -452
- package/dist/agent/runner.js.map +0 -1
- package/dist/agent/types.d.ts +0 -101
- package/dist/agent/types.d.ts.map +0 -1
- package/dist/agent/types.js +0 -3
- package/dist/agent/types.js.map +0 -1
- package/dist/agent-events.d.ts +0 -6
- package/dist/agent-events.d.ts.map +0 -1
- package/dist/agent-events.js +0 -44
- package/dist/agent-events.js.map +0 -1
- package/dist/commands/admin.d.ts.map +0 -1
- package/dist/commands/admin.js.map +0 -1
- package/dist/commands/auto-reply.d.ts +0 -8
- package/dist/commands/auto-reply.d.ts.map +0 -1
- package/dist/commands/auto-reply.js +0 -65
- package/dist/commands/auto-reply.js.map +0 -1
- package/dist/commands/login.d.ts.map +0 -1
- package/dist/commands/login.js +0 -158
- package/dist/commands/login.js.map +0 -1
- package/dist/commands/manifest.d.ts.map +0 -1
- package/dist/commands/manifest.js.map +0 -1
- package/dist/commands/model.d.ts.map +0 -1
- package/dist/commands/model.js.map +0 -1
- package/dist/commands/new.d.ts.map +0 -1
- package/dist/commands/new.js.map +0 -1
- package/dist/commands/registry.d.ts.map +0 -1
- package/dist/commands/registry.js.map +0 -1
- package/dist/commands/sandbox.d.ts.map +0 -1
- package/dist/commands/sandbox.js.map +0 -1
- package/dist/commands/session-view.d.ts.map +0 -1
- package/dist/commands/session-view.js.map +0 -1
- package/dist/commands/types.d.ts.map +0 -1
- package/dist/commands/types.js.map +0 -1
- package/dist/commands/utils.d.ts +0 -11
- package/dist/commands/utils.d.ts.map +0 -1
- package/dist/commands/utils.js.map +0 -1
- package/dist/events.d.ts.map +0 -1
- package/dist/events.js.map +0 -1
- package/dist/execution-resolver.d.ts +0 -27
- package/dist/execution-resolver.d.ts.map +0 -1
- package/dist/execution-resolver.js.map +0 -1
- package/dist/harness/event-format.d.ts +0 -33
- package/dist/harness/event-format.d.ts.map +0 -1
- package/dist/harness/event-format.js.map +0 -1
- package/dist/harness/session-store.d.ts.map +0 -1
- package/dist/harness/session-store.js.map +0 -1
- package/dist/harness/settings.d.ts +0 -29
- package/dist/harness/settings.d.ts.map +0 -1
- package/dist/harness/settings.js +0 -40
- package/dist/harness/settings.js.map +0 -1
- package/dist/harness/subagent-runner.d.ts.map +0 -1
- package/dist/harness/subagent-runner.js.map +0 -1
- package/dist/harness/subagent-slots.d.ts +0 -28
- package/dist/harness/subagent-slots.d.ts.map +0 -1
- package/dist/harness/subagent-slots.js +0 -72
- package/dist/harness/subagent-slots.js.map +0 -1
- package/dist/harness/usage.d.ts +0 -11
- package/dist/harness/usage.d.ts.map +0 -1
- package/dist/harness/usage.js +0 -38
- package/dist/harness/usage.js.map +0 -1
- package/dist/mcp/catalog.d.ts +0 -5
- package/dist/mcp/catalog.d.ts.map +0 -1
- package/dist/mcp/catalog.js +0 -68
- package/dist/mcp/catalog.js.map +0 -1
- package/dist/mcp/loader.d.ts +0 -12
- package/dist/mcp/loader.d.ts.map +0 -1
- package/dist/mcp/loader.js.map +0 -1
- package/dist/mcp/open-connector.d.ts.map +0 -1
- package/dist/mcp/open-connector.js.map +0 -1
- package/dist/mcp/types.d.ts +0 -66
- package/dist/mcp/types.d.ts.map +0 -1
- package/dist/mcp/types.js.map +0 -1
- package/dist/packages/index.d.ts +0 -169
- package/dist/packages/index.d.ts.map +0 -1
- package/dist/packages/index.js +0 -721
- package/dist/packages/index.js.map +0 -1
- package/dist/packages/types.d.ts +0 -100
- package/dist/packages/types.d.ts.map +0 -1
- package/dist/packages/types.js.map +0 -1
- package/dist/provisioner.d.ts.map +0 -1
- package/dist/provisioner.js.map +0 -1
- package/dist/subagent-progress.d.ts +0 -39
- package/dist/subagent-progress.d.ts.map +0 -1
- package/dist/subagent-progress.js +0 -225
- package/dist/subagent-progress.js.map +0 -1
- package/dist/tools/bash.d.ts +0 -12
- package/dist/tools/bash.d.ts.map +0 -1
- package/dist/tools/bash.js +0 -80
- package/dist/tools/bash.js.map +0 -1
- package/dist/tools/edit.d.ts +0 -11
- package/dist/tools/edit.d.ts.map +0 -1
- package/dist/tools/edit.js +0 -132
- package/dist/tools/edit.js.map +0 -1
- package/dist/tools/event.d.ts.map +0 -1
- package/dist/tools/event.js +0 -255
- package/dist/tools/event.js.map +0 -1
- package/dist/tools/generate-image.d.ts.map +0 -1
- package/dist/tools/generate-image.js.map +0 -1
- package/dist/tools/host-fn-tool.d.ts.map +0 -1
- package/dist/tools/host-fn-tool.js.map +0 -1
- package/dist/tools/index.d.ts.map +0 -1
- package/dist/tools/index.js.map +0 -1
- package/dist/tools/react.d.ts.map +0 -1
- package/dist/tools/react.js.map +0 -1
- package/dist/tools/read.d.ts +0 -12
- package/dist/tools/read.d.ts.map +0 -1
- package/dist/tools/read.js +0 -140
- package/dist/tools/read.js.map +0 -1
- package/dist/tools/sandbox.d.ts.map +0 -1
- package/dist/tools/sandbox.js.map +0 -1
- package/dist/tools/subagent.d.ts.map +0 -1
- package/dist/tools/subagent.js.map +0 -1
- package/dist/tools/types.d.ts.map +0 -1
- package/dist/tools/types.js.map +0 -1
- package/dist/tools/write.d.ts +0 -10
- package/dist/tools/write.d.ts.map +0 -1
- package/dist/tools/write.js +0 -23
- package/dist/tools/write.js.map +0 -1
- package/dist/trigger.d.ts +0 -23
- package/dist/trigger.d.ts.map +0 -1
- package/dist/trigger.js +0 -97
- package/dist/trigger.js.map +0 -1
- package/dist/utils/file-guards.d.ts.map +0 -1
- package/dist/utils/file-guards.js.map +0 -1
- package/dist/web/admin/portal.d.ts.map +0 -1
- package/dist/web/admin/portal.js.map +0 -1
- package/dist/web/admin/provider-models.d.ts.map +0 -1
- package/dist/web/admin/provider-models.js.map +0 -1
- package/dist/web/admin/types.d.ts.map +0 -1
- package/dist/web/admin/types.js.map +0 -1
- package/dist/web/login/oauth.d.ts.map +0 -1
- package/dist/web/login/oauth.js.map +0 -1
- package/dist/web/login/portal.d.ts.map +0 -1
- package/dist/web/login/portal.js.map +0 -1
- package/dist/web/login/types.d.ts.map +0 -1
- package/dist/web/login/types.js.map +0 -1
- package/dist/web/portal-shell.d.ts.map +0 -1
- package/dist/web/portal-shell.js.map +0 -1
- package/dist/web/server.d.ts.map +0 -1
- package/dist/web/server.js.map +0 -1
- package/dist/web/session-view/portal.d.ts.map +0 -1
- package/dist/web/session-view/portal.js.map +0 -1
- package/dist/web/session-view/types.d.ts.map +0 -1
- package/dist/web/session-view/types.js +0 -2
- package/dist/web/session-view/types.js.map +0 -1
- package/dist/web/token-store.d.ts.map +0 -1
- package/dist/web/token-store.js.map +0 -1
- package/dist/web/types.d.ts.map +0 -1
- package/dist/web/types.js +0 -2
- package/dist/web/types.js.map +0 -1
- package/dist/workspace-projection/index.d.ts.map +0 -1
- package/dist/workspace-projection/index.js.map +0 -1
- package/dist/workspace-projection/types.d.ts +0 -29
- package/dist/workspace-projection/types.d.ts.map +0 -1
- package/dist/workspace-projection/types.js +0 -2
- package/dist/workspace-projection/types.js.map +0 -1
- /package/dist/{commands → adapters/commands}/admin.d.ts +0 -0
- /package/dist/{commands → adapters/commands}/login.d.ts +0 -0
- /package/dist/{commands → adapters/commands}/manifest.d.ts +0 -0
- /package/dist/{commands → adapters/commands}/new.d.ts +0 -0
- /package/dist/{commands → adapters/commands}/registry.d.ts +0 -0
- /package/dist/{commands → adapters/commands}/sandbox.d.ts +0 -0
- /package/dist/{commands → adapters/commands}/session-view.d.ts +0 -0
- /package/dist/{commands → adapters/commands}/types.js +0 -0
- /package/dist/{web → adapters/web}/admin/provider-models.js +0 -0
- /package/dist/{mcp → adapters/web/admin}/types.js +0 -0
- /package/dist/{web → adapters/web}/login/oauth.d.ts +0 -0
- /package/dist/{packages → adapters/web/login}/types.js +0 -0
- /package/dist/{web → adapters/web}/session-view/portal.d.ts +0 -0
- /package/dist/{tools → adapters/web/session-view}/types.js +0 -0
- /package/dist/{web → adapters/web}/token-store.d.ts +0 -0
- /package/dist/{web → adapters/web}/token-store.js +0 -0
- /package/dist/{web → adapters/web}/types.d.ts +0 -0
- /package/dist/{web/admin → adapters/web}/types.js +0 -0
- /package/dist/{utils/file-guards.d.ts → file-guards.d.ts} +0 -0
- /package/dist/{utils/file-guards.js → file-guards.js} +0 -0
- /package/dist/{mcp → harness}/open-connector.d.ts +0 -0
- /package/dist/{adapters/slack → harness}/tools/attach.d.ts +0 -0
- /package/dist/{adapters/slack → harness}/tools/attach.js +0 -0
- /package/dist/{tools → harness/tools}/generate-image.d.ts +0 -0
- /package/dist/{tools → harness/tools}/generate-image.js +0 -0
- /package/dist/{tools → harness/tools}/host-fn-tool.d.ts +0 -0
- /package/dist/{tools → harness/tools}/host-fn-tool.js +0 -0
- /package/dist/{tools → harness/tools}/react.d.ts +0 -0
- /package/dist/{tools → harness/tools}/react.js +0 -0
- /package/dist/{web/login → harness/tools}/types.js +0 -0
package/dist/office/index.js
CHANGED
|
@@ -11,7 +11,7 @@ import * as log from "../log.js";
|
|
|
11
11
|
import { parseGithubConversationId } from "../adapters/github/ids.js";
|
|
12
12
|
import { legacyConversationCredentialKey } from "../sandbox/identity.js";
|
|
13
13
|
import { migrateConversationVaultKeys } from "../vault/index.js";
|
|
14
|
-
import { atomicWritePrivateFile, isRecord, readTextFileIfExists } from "../
|
|
14
|
+
import { atomicWritePrivateFile, isRecord, readTextFileIfExists } from "../file-guards.js";
|
|
15
15
|
// ── Office identity (address & keys) ──────────────────────────────────────────
|
|
16
16
|
const OFFICE_KEY_VERSION = "v1";
|
|
17
17
|
const OFFICE_KEY_DOMAIN = "office-address-v1";
|
|
@@ -47,20 +47,18 @@ export function assertPlatformName(value) {
|
|
|
47
47
|
throw new Error(`Unsupported platform: ${JSON.stringify(value)}`);
|
|
48
48
|
return value;
|
|
49
49
|
}
|
|
50
|
+
/** Path separators and the C0/C1 control ranges are never allowed in an id. */
|
|
51
|
+
function isUnsafeConversationIdChar(character) {
|
|
52
|
+
const code = character.codePointAt(0) ?? 0;
|
|
53
|
+
return character === "/" || character === "\\" || code <= 0x1f || (code >= 0x7f && code <= 0x9f);
|
|
54
|
+
}
|
|
50
55
|
/** Validate a raw platform conversation identifier before it enters storage. */
|
|
51
56
|
export function assertConversationId(value) {
|
|
52
57
|
if (value.length === 0 || value === "." || value === "..") {
|
|
53
58
|
throw new Error("Conversation id must be non-empty and not a path marker");
|
|
54
59
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
if (character === "/" ||
|
|
58
|
-
character === "\\" ||
|
|
59
|
-
code === 0 ||
|
|
60
|
-
code <= 0x1f ||
|
|
61
|
-
(code >= 0x7f && code <= 0x9f)) {
|
|
62
|
-
throw new Error("Conversation id must not contain path separators or control characters");
|
|
63
|
-
}
|
|
60
|
+
if ([...value].some(isUnsafeConversationIdChar)) {
|
|
61
|
+
throw new Error("Conversation id must not contain path separators or control characters");
|
|
64
62
|
}
|
|
65
63
|
return value;
|
|
66
64
|
}
|
|
@@ -85,9 +83,8 @@ export function officeDir(workspaceRoot, address) {
|
|
|
85
83
|
/**
|
|
86
84
|
* Resolve the host-only state directory for an office.
|
|
87
85
|
*
|
|
88
|
-
*
|
|
89
|
-
*
|
|
90
|
-
* `Office` value (which exposes the same path as `stateDir`).
|
|
86
|
+
* Settings and migration callers that only hold a `stateDir` string use this
|
|
87
|
+
* when no materialized `Office` value is available.
|
|
91
88
|
*/
|
|
92
89
|
export function officeStateDir(stateDir, address) {
|
|
93
90
|
return join(stateDir, "conversations", officeKey(address));
|
|
@@ -552,14 +549,16 @@ function parseOfficeRecord(value, path) {
|
|
|
552
549
|
recordedAt: value.recordedAt,
|
|
553
550
|
});
|
|
554
551
|
}
|
|
555
|
-
function
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
typeof value.
|
|
560
|
-
typeof value.
|
|
561
|
-
|
|
562
|
-
|
|
552
|
+
function hasMigrationStrings(value) {
|
|
553
|
+
return (typeof value.rawConversationId === "string" &&
|
|
554
|
+
typeof value.sourceDir === "string" &&
|
|
555
|
+
typeof value.workspaceRoot === "string" &&
|
|
556
|
+
typeof value.status === "string" &&
|
|
557
|
+
typeof value.updatedAt === "string");
|
|
558
|
+
}
|
|
559
|
+
/** Validate the fields every stored migration record must carry. */
|
|
560
|
+
function parseMigrationFields(value, path) {
|
|
561
|
+
if (!hasMigrationStrings(value)) {
|
|
563
562
|
throw new Error(`Invalid office migration fields in ${path}`);
|
|
564
563
|
}
|
|
565
564
|
assertConversationId(value.rawConversationId);
|
|
@@ -570,44 +569,66 @@ function parseRecord(value, path, enabledPlatforms) {
|
|
|
570
569
|
if (!MIGRATION_STATUSES.has(value.status)) {
|
|
571
570
|
throw new Error(`Invalid office migration status in ${path}`);
|
|
572
571
|
}
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
572
|
+
return {
|
|
573
|
+
rawConversationId: value.rawConversationId,
|
|
574
|
+
sourceDir: value.sourceDir,
|
|
575
|
+
workspaceRoot: value.workspaceRoot,
|
|
576
|
+
status: value.status,
|
|
577
|
+
updatedAt: value.updatedAt,
|
|
578
|
+
};
|
|
579
|
+
}
|
|
580
|
+
/**
|
|
581
|
+
* Ownership rules by status: `needs-owner` must carry neither owner nor
|
|
582
|
+
* target, `failed` may carry either, every other status must carry both.
|
|
583
|
+
*/
|
|
584
|
+
function assertOwnershipMatchesStatus(status, ownerPlatform, targetDir, path) {
|
|
585
|
+
const owned = ownerPlatform !== undefined;
|
|
586
|
+
const targeted = targetDir !== undefined;
|
|
587
|
+
if (status === "needs-owner" && (owned || targeted)) {
|
|
580
588
|
throw new Error(`Needs-owner migration cannot have an owner or target in ${path}`);
|
|
581
589
|
}
|
|
582
|
-
if (
|
|
583
|
-
value.status !== "failed" &&
|
|
584
|
-
(ownerPlatform === undefined || targetDir === undefined)) {
|
|
590
|
+
if (status !== "needs-owner" && status !== "failed" && !(owned && targeted)) {
|
|
585
591
|
throw new Error(`Prepared office migration is missing ownership in ${path}`);
|
|
586
592
|
}
|
|
587
|
-
if (
|
|
593
|
+
if (!owned && targeted) {
|
|
588
594
|
throw new Error(`Office migration target has no owner in ${path}`);
|
|
589
595
|
}
|
|
596
|
+
}
|
|
597
|
+
function parseRecord(value, path, enabledPlatforms) {
|
|
598
|
+
if (!isRecord(value))
|
|
599
|
+
throw new Error(`Invalid office migration record in ${path}`);
|
|
600
|
+
const fields = parseMigrationFields(value, path);
|
|
601
|
+
const ownerPlatform = optionalPlatform(value.ownerPlatform);
|
|
602
|
+
const targetDir = optionalString(value.targetDir);
|
|
603
|
+
const error = optionalString(value.error);
|
|
604
|
+
if (ownerPlatform !== undefined && !enabledPlatforms.includes(ownerPlatform)) {
|
|
605
|
+
throw new Error(`Office migration owner is not enabled in ${path}`);
|
|
606
|
+
}
|
|
607
|
+
assertOwnershipMatchesStatus(fields.status, ownerPlatform, targetDir, path);
|
|
590
608
|
const expectedTargetDir = ownerPlatform
|
|
591
|
-
? officeDir(
|
|
609
|
+
? officeDir(fields.workspaceRoot, {
|
|
592
610
|
platform: ownerPlatform,
|
|
593
|
-
conversationId:
|
|
611
|
+
conversationId: fields.rawConversationId,
|
|
594
612
|
})
|
|
595
613
|
: undefined;
|
|
596
614
|
if (targetDir !== expectedTargetDir) {
|
|
597
615
|
throw new Error(`Office migration target does not match its office address in ${path}`);
|
|
598
616
|
}
|
|
599
|
-
if (
|
|
617
|
+
if (fields.status === "failed" && !error) {
|
|
600
618
|
throw new Error(`Failed office migration is missing an error in ${path}`);
|
|
601
619
|
}
|
|
620
|
+
return buildMigrationRecord(fields, ownerPlatform, expectedTargetDir, error);
|
|
621
|
+
}
|
|
622
|
+
function buildMigrationRecord(fields, ownerPlatform, targetDir, error) {
|
|
602
623
|
return makeRecord({
|
|
603
|
-
rawConversationId:
|
|
604
|
-
sourceDir:
|
|
605
|
-
workspaceRoot:
|
|
624
|
+
rawConversationId: fields.rawConversationId,
|
|
625
|
+
sourceDir: fields.sourceDir,
|
|
626
|
+
workspaceRoot: fields.workspaceRoot,
|
|
606
627
|
...(ownerPlatform ? { ownerPlatform } : {}),
|
|
607
|
-
...(
|
|
608
|
-
status:
|
|
628
|
+
...(targetDir ? { targetDir } : {}),
|
|
629
|
+
status: fields.status,
|
|
609
630
|
...(error ? { error } : {}),
|
|
610
|
-
updatedAt:
|
|
631
|
+
updatedAt: fields.updatedAt,
|
|
611
632
|
});
|
|
612
633
|
}
|
|
613
634
|
function optionalPlatform(value) {
|
|
@@ -652,51 +673,44 @@ function assertRegularDirectory(path, label) {
|
|
|
652
673
|
throw new Error(`${label} must be a regular directory: ${path}`);
|
|
653
674
|
}
|
|
654
675
|
}
|
|
655
|
-
|
|
676
|
+
/** `lstat` that reports a missing path as undefined; other errors still throw. */
|
|
677
|
+
function lstatIfExists(path) {
|
|
656
678
|
try {
|
|
657
|
-
|
|
658
|
-
if (stat.isSymbolicLink() || !stat.isFile()) {
|
|
659
|
-
throw new Error(`Office registry must be a regular file: ${path}`);
|
|
660
|
-
}
|
|
679
|
+
return lstatSync(path);
|
|
661
680
|
}
|
|
662
681
|
catch (error) {
|
|
663
682
|
if (isErrno(error, "ENOENT"))
|
|
664
|
-
return;
|
|
683
|
+
return undefined;
|
|
665
684
|
throw error;
|
|
666
685
|
}
|
|
667
686
|
}
|
|
668
|
-
function
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
throw new Error(`${label} must be a regular directory: ${path}`);
|
|
673
|
-
}
|
|
687
|
+
function assertRegistryFileSafe(path) {
|
|
688
|
+
const stat = lstatIfExists(path);
|
|
689
|
+
if (stat && (stat.isSymbolicLink() || !stat.isFile())) {
|
|
690
|
+
throw new Error(`Office registry must be a regular file: ${path}`);
|
|
674
691
|
}
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
692
|
+
}
|
|
693
|
+
function assertPathIfPresent(path, label) {
|
|
694
|
+
const stat = lstatIfExists(path);
|
|
695
|
+
if (stat && (stat.isSymbolicLink() || !stat.isDirectory())) {
|
|
696
|
+
throw new Error(`${label} must be a regular directory: ${path}`);
|
|
679
697
|
}
|
|
680
698
|
}
|
|
681
699
|
function assertPathAbsent(path, label) {
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
}
|
|
685
|
-
catch (error) {
|
|
686
|
-
if (isErrno(error, "ENOENT"))
|
|
687
|
-
return;
|
|
688
|
-
throw error;
|
|
689
|
-
}
|
|
690
|
-
throw new Error(`${label} must be absent: ${path}`);
|
|
700
|
+
if (lstatIfExists(path))
|
|
701
|
+
throw new Error(`${label} must be absent: ${path}`);
|
|
691
702
|
}
|
|
692
703
|
function pathExists(path) {
|
|
704
|
+
return lstatIfExists(path) !== undefined;
|
|
705
|
+
}
|
|
706
|
+
/** Create the lock directory and stamp it with our token, unwinding on failure. */
|
|
707
|
+
function claimRegistryLock(lockPath, token) {
|
|
708
|
+
mkdirSync(lockPath, { mode: 0o700 });
|
|
693
709
|
try {
|
|
694
|
-
|
|
695
|
-
return true;
|
|
710
|
+
writeFileSync(join(lockPath, "owner"), `${token}\n`, { mode: 0o600 });
|
|
696
711
|
}
|
|
697
712
|
catch (error) {
|
|
698
|
-
|
|
699
|
-
return false;
|
|
713
|
+
rmSync(lockPath, { recursive: true, force: true });
|
|
700
714
|
throw error;
|
|
701
715
|
}
|
|
702
716
|
}
|
|
@@ -705,30 +719,30 @@ function acquireRegistryLease(lockPath, timeoutMs) {
|
|
|
705
719
|
const token = `${process.pid}:${randomBytes(8).toString("hex")}`;
|
|
706
720
|
for (;;) {
|
|
707
721
|
try {
|
|
708
|
-
|
|
709
|
-
try {
|
|
710
|
-
writeFileSync(join(lockPath, "owner"), `${token}\n`, { mode: 0o600 });
|
|
711
|
-
}
|
|
712
|
-
catch (error) {
|
|
713
|
-
rmSync(lockPath, { recursive: true, force: true });
|
|
714
|
-
throw error;
|
|
715
|
-
}
|
|
722
|
+
claimRegistryLock(lockPath, token);
|
|
716
723
|
return () => releaseRegistryLease(lockPath, token);
|
|
717
724
|
}
|
|
718
725
|
catch (error) {
|
|
719
|
-
|
|
720
|
-
throw error;
|
|
721
|
-
if (registryLockIsStale(lockPath)) {
|
|
722
|
-
rmSync(lockPath, { recursive: true, force: true });
|
|
723
|
-
continue;
|
|
724
|
-
}
|
|
725
|
-
if (Date.now() >= deadline) {
|
|
726
|
-
throw new Error(`Timed out acquiring office registry lock: ${lockPath}`, { cause: error });
|
|
727
|
-
}
|
|
728
|
-
sleepSync(REGISTRY_LOCK_RETRY_MS);
|
|
726
|
+
awaitFreeRegistryLock(lockPath, deadline, error);
|
|
729
727
|
}
|
|
730
728
|
}
|
|
731
729
|
}
|
|
730
|
+
/**
|
|
731
|
+
* Handle one failed lock attempt: rethrow anything but a held lock, clear a
|
|
732
|
+
* stale lock so the next attempt wins, else wait until the deadline passes.
|
|
733
|
+
*/
|
|
734
|
+
function awaitFreeRegistryLock(lockPath, deadline, error) {
|
|
735
|
+
if (!isErrno(error, "EEXIST"))
|
|
736
|
+
throw error;
|
|
737
|
+
if (registryLockIsStale(lockPath)) {
|
|
738
|
+
rmSync(lockPath, { recursive: true, force: true });
|
|
739
|
+
return;
|
|
740
|
+
}
|
|
741
|
+
if (Date.now() >= deadline) {
|
|
742
|
+
throw new Error(`Timed out acquiring office registry lock: ${lockPath}`, { cause: error });
|
|
743
|
+
}
|
|
744
|
+
sleepSync(REGISTRY_LOCK_RETRY_MS);
|
|
745
|
+
}
|
|
732
746
|
function releaseRegistryLease(lockPath, token) {
|
|
733
747
|
try {
|
|
734
748
|
if (readFileSync(join(lockPath, "owner"), "utf8").trim() === token) {
|
|
@@ -866,41 +880,51 @@ function recoverInterruptedMoves(registry, summary) {
|
|
|
866
880
|
for (const record of registry.getState().migrations) {
|
|
867
881
|
if (record.status !== "moving")
|
|
868
882
|
continue;
|
|
869
|
-
const
|
|
870
|
-
if (
|
|
871
|
-
registry.markFailed(record.rawConversationId,
|
|
872
|
-
continue;
|
|
873
|
-
}
|
|
874
|
-
const sourceExists = pathExists(record.sourceDir);
|
|
875
|
-
const targetExists = pathExists(targetDir);
|
|
876
|
-
if (sourceExists && targetExists) {
|
|
877
|
-
registry.markFailed(record.rawConversationId, "Both legacy source and office target exist; merge them manually");
|
|
878
|
-
continue;
|
|
879
|
-
}
|
|
880
|
-
if (!sourceExists && !targetExists) {
|
|
881
|
-
registry.markFailed(record.rawConversationId, "Neither legacy source nor office target exists");
|
|
883
|
+
const failure = finishInterruptedMove(record);
|
|
884
|
+
if (failure) {
|
|
885
|
+
registry.markFailed(record.rawConversationId, failure);
|
|
882
886
|
continue;
|
|
883
887
|
}
|
|
884
|
-
if (sourceExists)
|
|
885
|
-
renameSync(record.sourceDir, targetDir);
|
|
886
888
|
registry.markCommitted(record.rawConversationId);
|
|
887
889
|
recordMigratedOffice(registry, record);
|
|
888
890
|
summary.recovered.push(record.rawConversationId);
|
|
889
891
|
log.logInfo(`[office] Recovered interrupted migration: ${record.rawConversationId}`);
|
|
890
892
|
}
|
|
891
893
|
}
|
|
894
|
+
/** Complete one interrupted rename; returns the failure reason when it cannot. */
|
|
895
|
+
function finishInterruptedMove(record) {
|
|
896
|
+
const targetDir = record.targetDir;
|
|
897
|
+
if (!targetDir)
|
|
898
|
+
return "Moving record has no target directory";
|
|
899
|
+
const sourceExists = pathExists(record.sourceDir);
|
|
900
|
+
const targetExists = pathExists(targetDir);
|
|
901
|
+
if (sourceExists && targetExists) {
|
|
902
|
+
return "Both legacy source and office target exist; merge them manually";
|
|
903
|
+
}
|
|
904
|
+
if (!sourceExists && !targetExists)
|
|
905
|
+
return "Neither legacy source nor office target exists";
|
|
906
|
+
if (sourceExists)
|
|
907
|
+
renameSync(record.sourceDir, targetDir);
|
|
908
|
+
return undefined;
|
|
909
|
+
}
|
|
910
|
+
/**
|
|
911
|
+
* A legacy directory is claimable unless it already failed (reported via
|
|
912
|
+
* summary.failed). One that reappears after a committed move is a different
|
|
913
|
+
* (or resurrected) office the runtime can no longer see, so refusing to boot
|
|
914
|
+
* beats silently ignoring its data.
|
|
915
|
+
*/
|
|
916
|
+
function isClaimableLegacyDir(registry, workspaceRoot, rawConversationId) {
|
|
917
|
+
const existing = registry.getMigration(rawConversationId);
|
|
918
|
+
if (existing?.status === "committed") {
|
|
919
|
+
throw new Error(`Legacy office directory reappeared after migration: ${join(workspaceRoot, rawConversationId)}`);
|
|
920
|
+
}
|
|
921
|
+
return existing?.status !== "failed";
|
|
922
|
+
}
|
|
892
923
|
/** Scan the workspace root and move every claimable legacy office directory. */
|
|
893
924
|
function claimAndMoveLegacyDirs(registry, workspaceRoot, summary) {
|
|
894
925
|
for (const rawConversationId of listLegacyOfficeDirs(workspaceRoot)) {
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
// The move already happened; a raw-id dir with this name reappearing
|
|
898
|
-
// afterwards is a different (or resurrected) office the runtime can no
|
|
899
|
-
// longer see. Refusing to boot beats silently ignoring its data.
|
|
900
|
-
throw new Error(`Legacy office directory reappeared after migration: ${join(workspaceRoot, rawConversationId)}`);
|
|
901
|
-
}
|
|
902
|
-
if (existing?.status === "failed")
|
|
903
|
-
continue; // reported via summary.failed
|
|
926
|
+
if (!isClaimableLegacyDir(registry, workspaceRoot, rawConversationId))
|
|
927
|
+
continue;
|
|
904
928
|
const record = registry.prepareLegacyMigration({
|
|
905
929
|
rawConversationId,
|
|
906
930
|
sourceDir: join(workspaceRoot, rawConversationId),
|
|
@@ -963,26 +987,27 @@ function recordMigratedOffice(registry, record) {
|
|
|
963
987
|
* are (an operator can still claim one explicitly via `mikan office claim`).
|
|
964
988
|
*/
|
|
965
989
|
function listLegacyOfficeDirs(workspaceRoot) {
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
log.logInfo(`[office] Skipping non-office workspace directory (no log.jsonl or sessions/): ${entry.name}`);
|
|
981
|
-
continue;
|
|
982
|
-
}
|
|
983
|
-
candidates.push(entry.name);
|
|
990
|
+
return readdirSync(workspaceRoot, { withFileTypes: true })
|
|
991
|
+
.filter((entry) => isLegacyOfficeDir(workspaceRoot, entry))
|
|
992
|
+
.map((entry) => entry.name)
|
|
993
|
+
.toSorted();
|
|
994
|
+
}
|
|
995
|
+
function isLegacyOfficeDir(workspaceRoot, entry) {
|
|
996
|
+
if (entry.name.startsWith("."))
|
|
997
|
+
return false;
|
|
998
|
+
if (RESERVED_WORKSPACE_NAMES.has(entry.name))
|
|
999
|
+
return false;
|
|
1000
|
+
if (isOfficeKey(entry.name))
|
|
1001
|
+
return false;
|
|
1002
|
+
if (entry.isSymbolicLink()) {
|
|
1003
|
+
throw new Error(`Workspace entry must not be a symlink: ${join(workspaceRoot, entry.name)}`);
|
|
984
1004
|
}
|
|
985
|
-
|
|
1005
|
+
if (!entry.isDirectory())
|
|
1006
|
+
return false;
|
|
1007
|
+
if (looksLikeConversationOffice(join(workspaceRoot, entry.name)))
|
|
1008
|
+
return true;
|
|
1009
|
+
log.logInfo(`[office] Skipping non-office workspace directory (no log.jsonl or sessions/): ${entry.name}`);
|
|
1010
|
+
return false;
|
|
986
1011
|
}
|
|
987
1012
|
function looksLikeConversationOffice(dir) {
|
|
988
1013
|
return existsSync(join(dir, "log.jsonl")) || existsSync(join(dir, "sessions"));
|
|
@@ -993,17 +1018,24 @@ export function formatUnmigratedOfficesError(summary) {
|
|
|
993
1018
|
if (summary.unowned.length > 0) {
|
|
994
1019
|
lines.push("", "These legacy conversation directories have no owning platform (several", "platforms are enabled, so ownership cannot be inferred):", ...summary.unowned.map((id) => ` - ${id}`), "", "Assign each one with:", " mikan office claim <conversationId> <platform>");
|
|
995
1020
|
}
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1021
|
+
lines.push(...conflictSection(summary.failed, [
|
|
1022
|
+
"These migrations previously failed and need manual repair (see",
|
|
1023
|
+
"office-registry.json in the state dir for each error):",
|
|
1024
|
+
]), ...conflictSection(summary.vaultConflicts, [
|
|
1025
|
+
"These conversations have credentials under both the legacy and the",
|
|
1026
|
+
"office-key vault directory; merge them manually under <state-dir>/vaults:",
|
|
1027
|
+
]), ...conflictSection(summary.stateDirConflicts, [
|
|
1028
|
+
"These conversations have host state under both the legacy and the",
|
|
1029
|
+
"office-key directory; merge them manually under <state-dir>/conversations:",
|
|
1030
|
+
]));
|
|
1005
1031
|
return lines.join("\n");
|
|
1006
1032
|
}
|
|
1033
|
+
/** One blank-separated "these need manual work" block, empty when nothing does. */
|
|
1034
|
+
function conflictSection(ids, explanation) {
|
|
1035
|
+
if (ids.length === 0)
|
|
1036
|
+
return [];
|
|
1037
|
+
return ["", ...explanation, ...ids.map((id) => ` - ${id}`)];
|
|
1038
|
+
}
|
|
1007
1039
|
/**
|
|
1008
1040
|
* Bind-spec translator for the container layout migration: rewrites every
|
|
1009
1041
|
* host path the office migration renamed — workspace dirs, per-conversation
|