@geminixiang/mikan 1.0.0-beta.76 → 1.0.0-beta.77
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 +20 -0
- package/dist/adapters/commands/login.d.ts.map +1 -1
- package/dist/adapters/commands/login.js +0 -9
- package/dist/adapters/commands/login.js.map +1 -1
- package/dist/adapters/commands/manifest.d.ts +0 -19
- package/dist/adapters/commands/manifest.d.ts.map +1 -1
- package/dist/adapters/commands/manifest.js +0 -34
- package/dist/adapters/commands/manifest.js.map +1 -1
- package/dist/adapters/commands/model.d.ts +0 -5
- package/dist/adapters/commands/model.d.ts.map +1 -1
- package/dist/adapters/commands/model.js +0 -5
- package/dist/adapters/commands/model.js.map +1 -1
- package/dist/adapters/commands/new.d.ts.map +1 -1
- package/dist/adapters/commands/new.js +0 -2
- package/dist/adapters/commands/new.js.map +1 -1
- package/dist/adapters/commands/registry.d.ts +0 -1
- package/dist/adapters/commands/registry.d.ts.map +1 -1
- package/dist/adapters/commands/registry.js +0 -8
- package/dist/adapters/commands/registry.js.map +1 -1
- package/dist/adapters/commands/session-view.d.ts.map +1 -1
- package/dist/adapters/commands/session-view.js +0 -2
- package/dist/adapters/commands/session-view.js.map +1 -1
- package/dist/adapters/commands/types.d.ts +0 -29
- package/dist/adapters/commands/types.d.ts.map +1 -1
- package/dist/adapters/commands/types.js.map +1 -1
- package/dist/adapters/commands/utils.d.ts +0 -3
- package/dist/adapters/commands/utils.d.ts.map +1 -1
- package/dist/adapters/commands/utils.js +0 -3
- package/dist/adapters/commands/utils.js.map +1 -1
- package/dist/adapters/discord/bot.d.ts +0 -4
- package/dist/adapters/discord/bot.d.ts.map +1 -1
- package/dist/adapters/discord/bot.js +5 -41
- package/dist/adapters/discord/bot.js.map +1 -1
- package/dist/adapters/discord/components.d.ts +0 -23
- package/dist/adapters/discord/components.d.ts.map +1 -1
- package/dist/adapters/discord/components.js +0 -23
- package/dist/adapters/discord/components.js.map +1 -1
- package/dist/adapters/discord/context.d.ts.map +1 -1
- package/dist/adapters/discord/context.js +1 -11
- package/dist/adapters/discord/context.js.map +1 -1
- package/dist/adapters/discord/format.d.ts +0 -1
- package/dist/adapters/discord/format.d.ts.map +1 -1
- package/dist/adapters/discord/format.js +0 -37
- package/dist/adapters/discord/format.js.map +1 -1
- package/dist/adapters/github/bot.d.ts +0 -44
- package/dist/adapters/github/bot.d.ts.map +1 -1
- package/dist/adapters/github/bot.js +1 -120
- package/dist/adapters/github/bot.js.map +1 -1
- package/dist/adapters/github/client.d.ts +0 -57
- package/dist/adapters/github/client.d.ts.map +1 -1
- package/dist/adapters/github/client.js +0 -59
- package/dist/adapters/github/client.js.map +1 -1
- package/dist/adapters/github/context.d.ts.map +1 -1
- package/dist/adapters/github/context.js +1 -8
- package/dist/adapters/github/context.js.map +1 -1
- package/dist/adapters/github/github-ops.d.ts +0 -55
- package/dist/adapters/github/github-ops.d.ts.map +1 -1
- package/dist/adapters/github/github-ops.js +0 -59
- package/dist/adapters/github/github-ops.js.map +1 -1
- package/dist/adapters/github/ids.d.ts +0 -27
- package/dist/adapters/github/ids.d.ts.map +1 -1
- package/dist/adapters/github/ids.js +0 -29
- package/dist/adapters/github/ids.js.map +1 -1
- package/dist/adapters/github/repo.d.ts +0 -25
- package/dist/adapters/github/repo.d.ts.map +1 -1
- package/dist/adapters/github/repo.js +0 -49
- package/dist/adapters/github/repo.js.map +1 -1
- package/dist/adapters/github/tool-pack.d.ts +0 -10
- package/dist/adapters/github/tool-pack.d.ts.map +1 -1
- package/dist/adapters/github/tool-pack.js +0 -10
- package/dist/adapters/github/tool-pack.js.map +1 -1
- package/dist/adapters/github/tools/checks.d.ts +0 -6
- package/dist/adapters/github/tools/checks.d.ts.map +1 -1
- package/dist/adapters/github/tools/checks.js +0 -7
- package/dist/adapters/github/tools/checks.js.map +1 -1
- package/dist/adapters/github/tools/issue.d.ts +0 -5
- package/dist/adapters/github/tools/issue.d.ts.map +1 -1
- package/dist/adapters/github/tools/issue.js +0 -5
- package/dist/adapters/github/tools/issue.js.map +1 -1
- package/dist/adapters/github/tools/pr.d.ts +0 -7
- package/dist/adapters/github/tools/pr.d.ts.map +1 -1
- package/dist/adapters/github/tools/pr.js +0 -7
- package/dist/adapters/github/tools/pr.js.map +1 -1
- package/dist/adapters/github/tools/read.d.ts +0 -6
- package/dist/adapters/github/tools/read.d.ts.map +1 -1
- package/dist/adapters/github/tools/read.js +0 -8
- package/dist/adapters/github/tools/read.js.map +1 -1
- package/dist/adapters/github/tools/review-reply.d.ts +0 -5
- package/dist/adapters/github/tools/review-reply.d.ts.map +1 -1
- package/dist/adapters/github/tools/review-reply.js +0 -5
- package/dist/adapters/github/tools/review-reply.js.map +1 -1
- package/dist/adapters/github/tools/sync.d.ts +0 -6
- package/dist/adapters/github/tools/sync.d.ts.map +1 -1
- package/dist/adapters/github/tools/sync.js +0 -6
- package/dist/adapters/github/tools/sync.js.map +1 -1
- package/dist/adapters/github/types.d.ts +0 -88
- package/dist/adapters/github/types.d.ts.map +1 -1
- package/dist/adapters/github/types.js.map +1 -1
- package/dist/adapters/github/webhook.d.ts +0 -13
- package/dist/adapters/github/webhook.d.ts.map +1 -1
- package/dist/adapters/github/webhook.js +0 -16
- package/dist/adapters/github/webhook.js.map +1 -1
- package/dist/adapters/index.d.ts +3 -4
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +4 -4
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/intake.d.ts +0 -17
- package/dist/adapters/intake.d.ts.map +1 -1
- package/dist/adapters/intake.js +6 -32
- package/dist/adapters/intake.js.map +1 -1
- package/dist/adapters/markdown-tables.d.ts +0 -10
- package/dist/adapters/markdown-tables.d.ts.map +1 -1
- package/dist/adapters/markdown-tables.js +1 -42
- package/dist/adapters/markdown-tables.js.map +1 -1
- package/dist/adapters/progressive-renderer.d.ts.map +1 -1
- package/dist/adapters/progressive-renderer.js +3 -25
- package/dist/adapters/progressive-renderer.js.map +1 -1
- package/dist/adapters/shared.d.ts +0 -57
- package/dist/adapters/shared.d.ts.map +1 -1
- package/dist/adapters/shared.js +0 -71
- package/dist/adapters/shared.js.map +1 -1
- package/dist/adapters/slack/assistant.d.ts +0 -49
- package/dist/adapters/slack/assistant.d.ts.map +1 -1
- package/dist/adapters/slack/assistant.js +0 -97
- package/dist/adapters/slack/assistant.js.map +1 -1
- package/dist/adapters/slack/auto-reply-context.d.ts +0 -7
- package/dist/adapters/slack/auto-reply-context.d.ts.map +1 -1
- package/dist/adapters/slack/auto-reply-context.js +0 -7
- package/dist/adapters/slack/auto-reply-context.js.map +1 -1
- package/dist/adapters/slack/blocks.d.ts +0 -9
- package/dist/adapters/slack/blocks.d.ts.map +1 -1
- package/dist/adapters/slack/blocks.js +0 -20
- package/dist/adapters/slack/blocks.js.map +1 -1
- package/dist/adapters/slack/bot.d.ts +0 -116
- package/dist/adapters/slack/bot.d.ts.map +1 -1
- package/dist/adapters/slack/bot.js +7 -231
- package/dist/adapters/slack/bot.js.map +1 -1
- package/dist/adapters/slack/context.d.ts.map +1 -1
- package/dist/adapters/slack/context.js +1 -3
- package/dist/adapters/slack/context.js.map +1 -1
- package/dist/adapters/slack/jev-context.d.ts +0 -13
- package/dist/adapters/slack/jev-context.d.ts.map +1 -1
- package/dist/adapters/slack/jev-context.js +0 -12
- package/dist/adapters/slack/jev-context.js.map +1 -1
- package/dist/adapters/slack/markdown.d.ts +0 -1
- package/dist/adapters/slack/markdown.d.ts.map +1 -1
- package/dist/adapters/slack/markdown.js +0 -5
- package/dist/adapters/slack/markdown.js.map +1 -1
- package/dist/adapters/slack/persona.d.ts +0 -9
- package/dist/adapters/slack/persona.d.ts.map +1 -1
- package/dist/adapters/slack/persona.js +0 -9
- package/dist/adapters/slack/persona.js.map +1 -1
- package/dist/adapters/slack/response-lifecycle.d.ts.map +1 -1
- package/dist/adapters/slack/response-lifecycle.js +1 -45
- package/dist/adapters/slack/response-lifecycle.js.map +1 -1
- package/dist/adapters/slack/session.d.ts +2 -1
- package/dist/adapters/slack/session.d.ts.map +1 -1
- package/dist/adapters/slack/session.js +2 -2
- package/dist/adapters/slack/session.js.map +1 -1
- package/dist/adapters/slack/stream-limits.d.ts +0 -25
- package/dist/adapters/slack/stream-limits.d.ts.map +1 -1
- package/dist/adapters/slack/stream-limits.js +0 -34
- package/dist/adapters/slack/stream-limits.js.map +1 -1
- package/dist/adapters/slack/task-intent.d.ts +0 -13
- package/dist/adapters/slack/task-intent.d.ts.map +1 -1
- package/dist/adapters/slack/task-intent.js +0 -7
- package/dist/adapters/slack/task-intent.js.map +1 -1
- package/dist/adapters/slack/task-status.d.ts +0 -1
- package/dist/adapters/slack/task-status.d.ts.map +1 -1
- package/dist/adapters/slack/task-status.js +1 -9
- package/dist/adapters/slack/task-status.js.map +1 -1
- package/dist/adapters/slack/tool-pack.d.ts +0 -6
- package/dist/adapters/slack/tool-pack.d.ts.map +1 -1
- package/dist/adapters/slack/tool-pack.js +0 -6
- package/dist/adapters/slack/tool-pack.js.map +1 -1
- package/dist/adapters/slack/tools/blockkit.d.ts.map +1 -1
- package/dist/adapters/slack/tools/blockkit.js +0 -11
- package/dist/adapters/slack/tools/blockkit.js.map +1 -1
- package/dist/adapters/slack/types.d.ts +0 -19
- package/dist/adapters/slack/types.d.ts.map +1 -1
- package/dist/adapters/slack/types.js.map +1 -1
- package/dist/adapters/slack/update-diagnostics.d.ts +0 -1
- package/dist/adapters/slack/update-diagnostics.d.ts.map +1 -1
- package/dist/adapters/slack/update-diagnostics.js +1 -7
- package/dist/adapters/slack/update-diagnostics.js.map +1 -1
- package/dist/adapters/telegram/bot.d.ts +0 -6
- package/dist/adapters/telegram/bot.d.ts.map +1 -1
- package/dist/adapters/telegram/bot.js +1 -50
- package/dist/adapters/telegram/bot.js.map +1 -1
- package/dist/adapters/telegram/context.d.ts.map +1 -1
- package/dist/adapters/telegram/context.js +1 -8
- package/dist/adapters/telegram/context.js.map +1 -1
- package/dist/adapters/types.d.ts +0 -57
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/adapters/types.js.map +1 -1
- package/dist/adapters/web/admin/client-assets.d.ts +4 -0
- package/dist/adapters/web/admin/client-assets.d.ts.map +1 -0
- package/dist/adapters/web/admin/client-assets.js +1765 -0
- package/dist/adapters/web/admin/client-assets.js.map +1 -0
- package/dist/adapters/web/admin/portal.d.ts +0 -10
- package/dist/adapters/web/admin/portal.d.ts.map +1 -1
- package/dist/adapters/web/admin/portal.js +6 -1909
- package/dist/adapters/web/admin/portal.js.map +1 -1
- package/dist/adapters/web/admin/types.d.ts +0 -3
- package/dist/adapters/web/admin/types.d.ts.map +1 -1
- package/dist/adapters/web/admin/types.js.map +1 -1
- package/dist/adapters/web/login/oauth.d.ts.map +1 -1
- package/dist/adapters/web/login/oauth.js +0 -5
- package/dist/adapters/web/login/oauth.js.map +1 -1
- package/dist/adapters/web/login/portal.d.ts +0 -10
- package/dist/adapters/web/login/portal.d.ts.map +1 -1
- package/dist/adapters/web/login/portal.js +1 -35
- package/dist/adapters/web/login/portal.js.map +1 -1
- package/dist/adapters/web/login/types.d.ts +0 -5
- package/dist/adapters/web/login/types.d.ts.map +1 -1
- package/dist/adapters/web/login/types.js.map +1 -1
- package/dist/adapters/web/portal-shell.d.ts +0 -12
- package/dist/adapters/web/portal-shell.d.ts.map +1 -1
- package/dist/adapters/web/portal-shell.js +8 -25
- package/dist/adapters/web/portal-shell.js.map +1 -1
- package/dist/adapters/web/server.d.ts +0 -1
- package/dist/adapters/web/server.d.ts.map +1 -1
- package/dist/adapters/web/server.js +0 -2
- package/dist/adapters/web/server.js.map +1 -1
- package/dist/adapters/web/session-view/portal.d.ts.map +1 -1
- package/dist/adapters/web/session-view/portal.js +13 -24
- package/dist/adapters/web/session-view/portal.js.map +1 -1
- package/dist/adapters/web/session-view/types.d.ts.map +1 -1
- package/dist/adapters/web/session-view/types.js.map +1 -1
- package/dist/adapters/web/token-store.d.ts +0 -2
- package/dist/adapters/web/token-store.d.ts.map +1 -1
- package/dist/adapters/web/token-store.js +0 -2
- package/dist/adapters/web/token-store.js.map +1 -1
- package/dist/cli/arg-grammar.d.ts +0 -3
- package/dist/cli/arg-grammar.d.ts.map +1 -1
- package/dist/cli/arg-grammar.js +0 -3
- package/dist/cli/arg-grammar.js.map +1 -1
- package/dist/cli/boot.d.ts.map +1 -1
- package/dist/cli/boot.js +0 -11
- package/dist/cli/boot.js.map +1 -1
- package/dist/cli/download.d.ts.map +1 -1
- package/dist/cli/download.js +2 -6
- package/dist/cli/download.js.map +1 -1
- package/dist/cli/office.d.ts.map +1 -1
- package/dist/cli/office.js +0 -31
- package/dist/cli/office.js.map +1 -1
- package/dist/cli/onboard.d.ts +0 -2
- package/dist/cli/onboard.d.ts.map +1 -1
- package/dist/cli/onboard.js +0 -30
- package/dist/cli/onboard.js.map +1 -1
- package/dist/cli/process-lifecycle.d.ts +0 -5
- package/dist/cli/process-lifecycle.d.ts.map +1 -1
- package/dist/cli/process-lifecycle.js +0 -6
- package/dist/cli/process-lifecycle.js.map +1 -1
- package/dist/cli/sessions.d.ts.map +1 -1
- package/dist/cli/sessions.js +0 -11
- package/dist/cli/sessions.js.map +1 -1
- package/dist/cli/types.d.ts +0 -5
- package/dist/cli/types.d.ts.map +1 -1
- package/dist/cli/types.js.map +1 -1
- package/dist/dream/index.js +0 -2
- package/dist/dream/index.js.map +1 -1
- package/dist/env-manifest.d.ts +0 -21
- package/dist/env-manifest.d.ts.map +1 -1
- package/dist/env-manifest.js +0 -11
- package/dist/env-manifest.js.map +1 -1
- package/dist/events/index.d.ts +0 -51
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js +0 -42
- package/dist/events/index.js.map +1 -1
- package/dist/events/scheduler.d.ts +0 -8
- package/dist/events/scheduler.d.ts.map +1 -1
- package/dist/events/scheduler.js +0 -8
- package/dist/events/scheduler.js.map +1 -1
- package/dist/file-guards.d.ts +0 -15
- package/dist/file-guards.d.ts.map +1 -1
- package/dist/file-guards.js +2 -26
- package/dist/file-guards.js.map +1 -1
- package/dist/harness/execution-env.d.ts +0 -15
- package/dist/harness/execution-env.d.ts.map +1 -1
- package/dist/harness/execution-env.js +4 -55
- package/dist/harness/execution-env.js.map +1 -1
- package/dist/harness/http.d.ts +0 -12
- package/dist/harness/http.d.ts.map +1 -1
- package/dist/harness/http.js +0 -34
- package/dist/harness/http.js.map +1 -1
- package/dist/harness/index.d.ts +0 -7
- package/dist/harness/index.d.ts.map +1 -1
- package/dist/harness/index.js +0 -7
- package/dist/harness/index.js.map +1 -1
- package/dist/harness/jev.d.ts +0 -28
- package/dist/harness/jev.d.ts.map +1 -1
- package/dist/harness/jev.js +0 -45
- package/dist/harness/jev.js.map +1 -1
- package/dist/harness/mcp.d.ts +0 -19
- package/dist/harness/mcp.d.ts.map +1 -1
- package/dist/harness/mcp.js +0 -34
- package/dist/harness/mcp.js.map +1 -1
- package/dist/harness/models.d.ts +0 -19
- package/dist/harness/models.d.ts.map +1 -1
- package/dist/harness/models.js +0 -52
- package/dist/harness/models.js.map +1 -1
- package/dist/harness/open-connector.d.ts +0 -12
- package/dist/harness/open-connector.d.ts.map +1 -1
- package/dist/harness/open-connector.js +0 -22
- package/dist/harness/open-connector.js.map +1 -1
- package/dist/harness/presenter.d.ts.map +1 -1
- package/dist/harness/presenter.js +15 -65
- package/dist/harness/presenter.js.map +1 -1
- package/dist/harness/prompt.d.ts +0 -11
- package/dist/harness/prompt.d.ts.map +1 -1
- package/dist/harness/prompt.js +0 -17
- package/dist/harness/prompt.js.map +1 -1
- package/dist/harness/runner.d.ts.map +1 -1
- package/dist/harness/runner.js +0 -25
- package/dist/harness/runner.js.map +1 -1
- package/dist/harness/session.d.ts +11 -28
- package/dist/harness/session.d.ts.map +1 -1
- package/dist/harness/session.js +100 -38
- package/dist/harness/session.js.map +1 -1
- package/dist/harness/skills.d.ts +0 -22
- package/dist/harness/skills.d.ts.map +1 -1
- package/dist/harness/skills.js +0 -20
- package/dist/harness/skills.js.map +1 -1
- package/dist/harness/subagent-profiles.d.ts +0 -4
- package/dist/harness/subagent-profiles.d.ts.map +1 -1
- package/dist/harness/subagent-profiles.js +0 -29
- package/dist/harness/subagent-profiles.js.map +1 -1
- package/dist/harness/subagent.d.ts +0 -25
- package/dist/harness/subagent.d.ts.map +1 -1
- package/dist/harness/subagent.js +1 -70
- package/dist/harness/subagent.js.map +1 -1
- package/dist/harness/tools/event.d.ts.map +1 -1
- package/dist/harness/tools/event.js +0 -9
- package/dist/harness/tools/event.js.map +1 -1
- package/dist/harness/tools/generate-image.d.ts +0 -6
- package/dist/harness/tools/generate-image.d.ts.map +1 -1
- package/dist/harness/tools/generate-image.js.map +1 -1
- package/dist/harness/tools/host-fn-tool.d.ts +0 -17
- package/dist/harness/tools/host-fn-tool.d.ts.map +1 -1
- package/dist/harness/tools/host-fn-tool.js +0 -16
- package/dist/harness/tools/host-fn-tool.js.map +1 -1
- package/dist/harness/tools/index.d.ts +1 -7
- package/dist/harness/tools/index.d.ts.map +1 -1
- package/dist/harness/tools/index.js +3 -14
- package/dist/harness/tools/index.js.map +1 -1
- package/dist/harness/tools/jev-browser.d.ts +4 -94
- package/dist/harness/tools/jev-browser.d.ts.map +1 -1
- package/dist/harness/tools/jev-browser.js +203 -92
- package/dist/harness/tools/jev-browser.js.map +1 -1
- package/dist/harness/tools/jev.d.ts +0 -8
- package/dist/harness/tools/jev.d.ts.map +1 -1
- package/dist/harness/tools/jev.js +0 -11
- package/dist/harness/tools/jev.js.map +1 -1
- package/dist/harness/tools/pi-tools.d.ts +0 -11
- package/dist/harness/tools/pi-tools.d.ts.map +1 -1
- package/dist/harness/tools/pi-tools.js +0 -29
- package/dist/harness/tools/pi-tools.js.map +1 -1
- package/dist/harness/tools/react.d.ts +0 -5
- package/dist/harness/tools/react.d.ts.map +1 -1
- package/dist/harness/tools/react.js +0 -5
- package/dist/harness/tools/react.js.map +1 -1
- package/dist/harness/tools/secret-redaction.d.ts +0 -25
- package/dist/harness/tools/secret-redaction.d.ts.map +1 -1
- package/dist/harness/tools/secret-redaction.js +3 -36
- package/dist/harness/tools/secret-redaction.js.map +1 -1
- package/dist/harness/tools/subagent.d.ts +0 -34
- package/dist/harness/tools/subagent.d.ts.map +1 -1
- package/dist/harness/tools/subagent.js +0 -92
- package/dist/harness/tools/subagent.js.map +1 -1
- package/dist/harness/tools/task.d.ts +0 -1
- package/dist/harness/tools/task.d.ts.map +1 -1
- package/dist/harness/tools/task.js +0 -1
- package/dist/harness/tools/task.js.map +1 -1
- package/dist/harness/tools/types.d.ts +0 -16
- package/dist/harness/tools/types.d.ts.map +1 -1
- package/dist/harness/tools/types.js.map +1 -1
- package/dist/harness/types.d.ts +0 -76
- package/dist/harness/types.d.ts.map +1 -1
- package/dist/harness/types.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -2
- package/dist/index.js.map +1 -1
- package/dist/log.d.ts.map +1 -1
- package/dist/log.js +0 -13
- package/dist/log.js.map +1 -1
- package/dist/main.js +0 -47
- package/dist/main.js.map +1 -1
- package/dist/observability/index.d.ts +0 -9
- package/dist/observability/index.d.ts.map +1 -1
- package/dist/observability/index.js +0 -9
- package/dist/observability/index.js.map +1 -1
- package/dist/observability/instrument.js +0 -5
- package/dist/observability/instrument.js.map +1 -1
- package/dist/observability/otel.js +0 -1
- package/dist/observability/otel.js.map +1 -1
- package/dist/observability/sentry.d.ts +0 -18
- package/dist/observability/sentry.d.ts.map +1 -1
- package/dist/observability/sentry.js +0 -36
- package/dist/observability/sentry.js.map +1 -1
- package/dist/observability/types.d.ts +0 -9
- package/dist/observability/types.d.ts.map +1 -1
- package/dist/observability/types.js.map +1 -1
- package/dist/office/index.d.ts +0 -76
- package/dist/office/index.d.ts.map +1 -1
- package/dist/office/index.js +2 -153
- package/dist/office/index.js.map +1 -1
- package/dist/office/projection.d.ts +0 -29
- package/dist/office/projection.d.ts.map +1 -1
- package/dist/office/projection.js +0 -37
- package/dist/office/projection.js.map +1 -1
- package/dist/office/types.d.ts +0 -66
- package/dist/office/types.d.ts.map +1 -1
- package/dist/office/types.js.map +1 -1
- package/dist/runtime/conversation-runtime.d.ts.map +1 -1
- package/dist/runtime/conversation-runtime.js +9 -27
- package/dist/runtime/conversation-runtime.js.map +1 -1
- package/dist/runtime/session-lifecycle.d.ts +0 -10
- package/dist/runtime/session-lifecycle.d.ts.map +1 -1
- package/dist/runtime/session-lifecycle.js +0 -12
- package/dist/runtime/session-lifecycle.js.map +1 -1
- package/dist/runtime/types.d.ts +0 -28
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/runtime/types.js.map +1 -1
- package/dist/sandbox/container.d.ts.map +1 -1
- package/dist/sandbox/container.js +0 -1
- package/dist/sandbox/container.js.map +1 -1
- package/dist/sandbox/host.d.ts.map +1 -1
- package/dist/sandbox/host.js +0 -2
- package/dist/sandbox/host.js.map +1 -1
- package/dist/sandbox/identity.d.ts +0 -28
- package/dist/sandbox/identity.d.ts.map +1 -1
- package/dist/sandbox/identity.js +0 -28
- package/dist/sandbox/identity.js.map +1 -1
- package/dist/sandbox/index.d.ts +0 -18
- package/dist/sandbox/index.d.ts.map +1 -1
- package/dist/sandbox/index.js +0 -18
- package/dist/sandbox/index.js.map +1 -1
- package/dist/sandbox/provisioner.d.ts +0 -61
- package/dist/sandbox/provisioner.d.ts.map +1 -1
- package/dist/sandbox/provisioner.js +3 -105
- package/dist/sandbox/provisioner.js.map +1 -1
- package/dist/sandbox/types.d.ts +0 -39
- package/dist/sandbox/types.d.ts.map +1 -1
- package/dist/sandbox/types.js.map +1 -1
- package/dist/sandbox/utils.d.ts +2 -5
- package/dist/sandbox/utils.d.ts.map +1 -1
- package/dist/sandbox/utils.js +31 -31
- package/dist/sandbox/utils.js.map +1 -1
- package/dist/sessions/chat-history-sync.d.ts +0 -6
- package/dist/sessions/chat-history-sync.d.ts.map +1 -1
- package/dist/sessions/chat-history-sync.js +1 -33
- package/dist/sessions/chat-history-sync.js.map +1 -1
- package/dist/sessions/history-line.d.ts +0 -20
- package/dist/sessions/history-line.d.ts.map +1 -1
- package/dist/sessions/history-line.js +0 -20
- package/dist/sessions/history-line.js.map +1 -1
- package/dist/sessions/migrate-common.d.ts +0 -15
- package/dist/sessions/migrate-common.d.ts.map +1 -1
- package/dist/sessions/migrate-common.js +0 -19
- package/dist/sessions/migrate-common.js.map +1 -1
- package/dist/sessions/migrate-pi-084.d.ts.map +1 -1
- package/dist/sessions/migrate-pi-084.js +0 -7
- package/dist/sessions/migrate-pi-084.js.map +1 -1
- package/dist/sessions/migrate-v3.d.ts +0 -7
- package/dist/sessions/migrate-v3.d.ts.map +1 -1
- package/dist/sessions/migrate-v3.js +1 -67
- package/dist/sessions/migrate-v3.js.map +1 -1
- package/dist/sessions/session-key.d.ts +3 -17
- package/dist/sessions/session-key.d.ts.map +1 -1
- package/dist/sessions/session-key.js +8 -35
- package/dist/sessions/session-key.js.map +1 -1
- package/dist/sessions/session-store.d.ts +0 -6
- package/dist/sessions/session-store.d.ts.map +1 -1
- package/dist/sessions/session-store.js +8 -50
- package/dist/sessions/session-store.js.map +1 -1
- package/dist/sessions/store.d.ts +0 -59
- package/dist/sessions/store.d.ts.map +1 -1
- package/dist/sessions/store.js +6 -88
- package/dist/sessions/store.js.map +1 -1
- package/dist/sessions/types.d.ts +0 -17
- package/dist/sessions/types.d.ts.map +1 -1
- package/dist/sessions/types.js.map +1 -1
- package/dist/settings/apply.d.ts +0 -6
- package/dist/settings/apply.d.ts.map +1 -1
- package/dist/settings/apply.js +0 -29
- package/dist/settings/apply.js.map +1 -1
- package/dist/settings/index.d.ts +0 -53
- package/dist/settings/index.d.ts.map +1 -1
- package/dist/settings/index.js +0 -77
- package/dist/settings/index.js.map +1 -1
- package/dist/settings/migrate.d.ts +0 -5
- package/dist/settings/migrate.d.ts.map +1 -1
- package/dist/settings/migrate.js +0 -17
- package/dist/settings/migrate.js.map +1 -1
- package/dist/types.d.ts +0 -159
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/vault/index.d.ts +2 -36
- package/dist/vault/index.d.ts.map +1 -1
- package/dist/vault/index.js +128 -59
- package/dist/vault/index.js.map +1 -1
- package/dist/vault/types.d.ts +0 -15
- package/dist/vault/types.d.ts.map +1 -1
- package/dist/vault/types.js.map +1 -1
- package/package.json +1 -1
package/dist/office/index.js
CHANGED
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The Conversation office module: canonical identity, the Workspace/Office
|
|
3
|
-
* layout values, the durable registry journal, and the boot-time legacy
|
|
4
|
-
* migration. Everything outside `src/office/` imports from this module;
|
|
5
|
-
* exported types live in `types.ts` per module convention.
|
|
6
|
-
*/
|
|
7
1
|
import { createHash, randomBytes } from "node:crypto";
|
|
8
2
|
import { existsSync, lstatSync, mkdirSync, readdirSync, readFileSync, renameSync, rmSync, statSync, writeFileSync, } from "node:fs";
|
|
9
3
|
import { isAbsolute, join, resolve } from "node:path";
|
|
@@ -12,20 +6,17 @@ import { parseGithubConversationId } from "../adapters/github/ids.js";
|
|
|
12
6
|
import { legacyConversationCredentialKey } from "../sandbox/identity.js";
|
|
13
7
|
import { migrateConversationVaultKeys } from "../vault/index.js";
|
|
14
8
|
import { atomicWritePrivateFile, isRecord, readTextFileIfExists } from "../file-guards.js";
|
|
15
|
-
// ── Office identity (address & keys) ──────────────────────────────────────────
|
|
16
9
|
const OFFICE_KEY_VERSION = "v1";
|
|
17
10
|
const OFFICE_KEY_DOMAIN = "office-address-v1";
|
|
18
11
|
const OFFICE_KEY_DIGEST_LENGTH = 16;
|
|
19
12
|
const READABLE_ID_LENGTH = 32;
|
|
20
13
|
const PLATFORM_NAMES = new Set(["slack", "discord", "telegram", "github"]);
|
|
21
14
|
const OFFICE_KEY_PATTERN = /^v1-(slack|discord|telegram|github)-[a-z0-9]+(?:-[a-z0-9]+)*-[a-f0-9]{16}$/;
|
|
22
|
-
/** Construct the canonical identity used by future office consumers. */
|
|
23
15
|
export function createOfficeAddress(platform, conversationId) {
|
|
24
16
|
assertPlatformName(platform);
|
|
25
17
|
assertConversationId(conversationId);
|
|
26
18
|
return Object.freeze({ platform, conversationId });
|
|
27
19
|
}
|
|
28
|
-
/** Validate an untrusted runtime value as a canonical office address. */
|
|
29
20
|
export function validateOfficeAddress(value) {
|
|
30
21
|
if (!isRecord(value))
|
|
31
22
|
throw new Error("Office address must be an object");
|
|
@@ -37,22 +28,18 @@ export function validateOfficeAddress(value) {
|
|
|
37
28
|
}
|
|
38
29
|
return createOfficeAddress(assertPlatformName(value.platform), value.conversationId);
|
|
39
30
|
}
|
|
40
|
-
/** Return true only for a supported platform name. */
|
|
41
31
|
function isPlatformName(value) {
|
|
42
32
|
return typeof value === "string" && PLATFORM_NAMES.has(value);
|
|
43
33
|
}
|
|
44
|
-
/** Validate a platform name and return it for typed callers. */
|
|
45
34
|
export function assertPlatformName(value) {
|
|
46
35
|
if (!isPlatformName(value))
|
|
47
36
|
throw new Error(`Unsupported platform: ${JSON.stringify(value)}`);
|
|
48
37
|
return value;
|
|
49
38
|
}
|
|
50
|
-
/** Path separators and the C0/C1 control ranges are never allowed in an id. */
|
|
51
39
|
function isUnsafeConversationIdChar(character) {
|
|
52
40
|
const code = character.codePointAt(0) ?? 0;
|
|
53
41
|
return character === "/" || character === "\\" || code <= 0x1f || (code >= 0x7f && code <= 0x9f);
|
|
54
42
|
}
|
|
55
|
-
/** Validate a raw platform conversation identifier before it enters storage. */
|
|
56
43
|
export function assertConversationId(value) {
|
|
57
44
|
if (value.length === 0 || value === "." || value === "..") {
|
|
58
45
|
throw new Error("Conversation id must be non-empty and not a path marker");
|
|
@@ -62,7 +49,6 @@ export function assertConversationId(value) {
|
|
|
62
49
|
}
|
|
63
50
|
return value;
|
|
64
51
|
}
|
|
65
|
-
/** Derive a readable diagnostic key whose digest remains the identity authority. */
|
|
66
52
|
export function officeKey(address) {
|
|
67
53
|
const normalized = validateOfficeAddress(address);
|
|
68
54
|
const readable = readableConversationId(normalized.conversationId);
|
|
@@ -72,31 +58,18 @@ export function officeKey(address) {
|
|
|
72
58
|
.slice(0, OFFICE_KEY_DIGEST_LENGTH);
|
|
73
59
|
return `${OFFICE_KEY_VERSION}-${normalized.platform}-${readable}-${digest}`;
|
|
74
60
|
}
|
|
75
|
-
/**
|
|
76
|
-
* Resolve the persistent workspace directory for an office.
|
|
77
|
-
* Module-internal: registry/migration record target paths with it. Callers
|
|
78
|
-
* outside `src/office/` use the `Office` value's `dir` field instead.
|
|
79
|
-
*/
|
|
80
61
|
export function officeDir(workspaceRoot, address) {
|
|
81
62
|
return join(workspaceRoot, officeKey(address));
|
|
82
63
|
}
|
|
83
|
-
/**
|
|
84
|
-
* Resolve the host-only state directory for an office.
|
|
85
|
-
*
|
|
86
|
-
* Settings and migration callers that only hold a `stateDir` string use this
|
|
87
|
-
* when no materialized `Office` value is available.
|
|
88
|
-
*/
|
|
89
64
|
export function officeStateDir(stateDir, address) {
|
|
90
65
|
return join(stateDir, "conversations", officeKey(address));
|
|
91
66
|
}
|
|
92
|
-
/** Compare canonical office identities without relying on their readable key. */
|
|
93
67
|
export function sameOffice(left, right) {
|
|
94
68
|
const leftAddress = validateOfficeAddress(left);
|
|
95
69
|
const rightAddress = validateOfficeAddress(right);
|
|
96
70
|
return (leftAddress.platform === rightAddress.platform &&
|
|
97
71
|
leftAddress.conversationId === rightAddress.conversationId);
|
|
98
72
|
}
|
|
99
|
-
/** Validate a persisted or externally supplied office key. */
|
|
100
73
|
export function assertOfficeKey(value) {
|
|
101
74
|
if (!OFFICE_KEY_PATTERN.test(value)) {
|
|
102
75
|
throw new Error(`Invalid office key: ${JSON.stringify(value)}`);
|
|
@@ -115,36 +88,12 @@ function readableConversationId(conversationId) {
|
|
|
115
88
|
.replace(/-+$/g, "");
|
|
116
89
|
return readable || "conversation";
|
|
117
90
|
}
|
|
118
|
-
// ── Workspace/Office layout ───────────────────────────────────────────────────
|
|
119
|
-
/**
|
|
120
|
-
* Workspace-root entries that are shared infrastructure, never office dirs.
|
|
121
|
-
* The single definition behind boot-time directory setup, the workspace
|
|
122
|
-
* projection, and the migration's legacy-dir scan. `events` stays reserved
|
|
123
|
-
* for the legacy scheduling bus that `mikan office migrate-events` drains.
|
|
124
|
-
*/
|
|
125
91
|
export const RESERVED_WORKSPACE_NAMES = Object.freeze(new Set(["skills", "events", "agents", "MEMORY.md"]));
|
|
126
|
-
/**
|
|
127
|
-
* Construct the Workspace value for a deployment. One construction site per
|
|
128
|
-
* process (main.ts for the daemon; CLI subcommands and tests build their
|
|
129
|
-
* own). The value owns the registry instance and the recorded-office cache
|
|
130
|
-
* that office materialization uses on hot paths, so there is no process-wide
|
|
131
|
-
* registry state.
|
|
132
|
-
*/
|
|
133
|
-
/**
|
|
134
|
-
* An office's session files live in `<office dir>/sessions` — the one home of
|
|
135
|
-
* that rule. String-based for surfaces that hold a conversation dir rather
|
|
136
|
-
* than an `Office` value (mirrors `officeStateDir`); `Office.sessionsDir` is
|
|
137
|
-
* derived from it. Pointer/thread-file semantics live in `sessions/store`.
|
|
138
|
-
*/
|
|
139
92
|
export function officeSessionsDir(dir) {
|
|
140
93
|
return join(dir, "sessions");
|
|
141
94
|
}
|
|
142
95
|
export function createWorkspace(options) {
|
|
143
|
-
// Paths are joined as given (no resolve) so values match what callers
|
|
144
|
-
// passing the same root/stateDir strings computed before this module.
|
|
145
96
|
const { root, stateDir } = options;
|
|
146
|
-
// Lazy: CLI surfaces construct a Workspace for path math without paying
|
|
147
|
-
// for (or being allowed to create) the registry journal.
|
|
148
97
|
let registry;
|
|
149
98
|
const recorded = new Set();
|
|
150
99
|
const offices = new Map();
|
|
@@ -174,9 +123,6 @@ export function createWorkspace(options) {
|
|
|
174
123
|
stateDir: join(stateDir, "conversations", key),
|
|
175
124
|
workspace,
|
|
176
125
|
ensure() {
|
|
177
|
-
// Record-first ordering: a crash can leave a record without a
|
|
178
|
-
// directory (harmless; recreated on the next message) but never an
|
|
179
|
-
// anonymous office directory the registry cannot enumerate.
|
|
180
126
|
if (!recorded.has(key)) {
|
|
181
127
|
registry ??= new OfficeRegistry(stateDir);
|
|
182
128
|
registry.recordOffice(normalized);
|
|
@@ -192,7 +138,6 @@ export function createWorkspace(options) {
|
|
|
192
138
|
});
|
|
193
139
|
return workspace;
|
|
194
140
|
}
|
|
195
|
-
/** mkdir-if-missing with the same fail-closed type guard as projection roots. */
|
|
196
141
|
function ensureRegularOfficeDirectory(dir) {
|
|
197
142
|
let stats;
|
|
198
143
|
try {
|
|
@@ -208,7 +153,6 @@ function ensureRegularOfficeDirectory(dir) {
|
|
|
208
153
|
throw new Error(`Office directory must be a regular non-symlink directory: ${dir}`);
|
|
209
154
|
}
|
|
210
155
|
}
|
|
211
|
-
// ── Office registry journal ───────────────────────────────────────────────────
|
|
212
156
|
const REGISTRY_VERSION = 1;
|
|
213
157
|
const REGISTRY_FILENAME = "office-registry.json";
|
|
214
158
|
const MIGRATION_STATUSES = new Set([
|
|
@@ -233,7 +177,6 @@ export class OfficeRegistry {
|
|
|
233
177
|
this.lockTimeoutMs = options.lockTimeoutMs ?? REGISTRY_LOCK_TIMEOUT_MS;
|
|
234
178
|
this.state = this.readState();
|
|
235
179
|
}
|
|
236
|
-
/** Reload the atomic registry file after another host process changed it. */
|
|
237
180
|
reload() {
|
|
238
181
|
this.state = this.readState();
|
|
239
182
|
return this.state;
|
|
@@ -255,11 +198,6 @@ export class OfficeRegistry {
|
|
|
255
198
|
return this.state;
|
|
256
199
|
});
|
|
257
200
|
}
|
|
258
|
-
/**
|
|
259
|
-
* Record that an office exists. Idempotent: re-recording a known office is
|
|
260
|
-
* a lock-free cache hit for callers that materialize directories per
|
|
261
|
-
* message, so this sits safely on hot write paths.
|
|
262
|
-
*/
|
|
263
201
|
recordOffice(address) {
|
|
264
202
|
const normalized = validateOfficeAddress(address);
|
|
265
203
|
const existing = this.findOffice(normalized);
|
|
@@ -284,11 +222,6 @@ export class OfficeRegistry {
|
|
|
284
222
|
findOffice(address) {
|
|
285
223
|
return this.state.offices.find((record) => record.platform === address.platform && record.conversationId === address.conversationId);
|
|
286
224
|
}
|
|
287
|
-
/**
|
|
288
|
-
* Validate and record a legacy directory. With exactly one enabled platform,
|
|
289
|
-
* ownership is safe to infer. With zero or multiple platforms, the record
|
|
290
|
-
* remains explicit `needs-owner` unless the caller supplies an owner.
|
|
291
|
-
*/
|
|
292
225
|
prepareLegacyMigration(options) {
|
|
293
226
|
const rawConversationId = assertConversationId(options.rawConversationId);
|
|
294
227
|
const sourceDir = resolve(options.sourceDir);
|
|
@@ -437,11 +370,6 @@ export class OfficeRegistry {
|
|
|
437
370
|
this.writeState(this.registryPath, `${JSON.stringify(candidate, null, 2)}\n`);
|
|
438
371
|
this.state = candidate;
|
|
439
372
|
}
|
|
440
|
-
/**
|
|
441
|
-
* Acquire the domain lease, reload while holding it, then perform one
|
|
442
|
-
* read-modify-write. A future move transaction can retain the same lease
|
|
443
|
-
* across its filesystem operation instead of splitting the transition.
|
|
444
|
-
*/
|
|
445
373
|
withExclusiveLease(operation) {
|
|
446
374
|
const release = acquireRegistryLease(this.lockPath, this.lockTimeoutMs);
|
|
447
375
|
try {
|
|
@@ -524,7 +452,6 @@ function parseState(value, path) {
|
|
|
524
452
|
if (new Set(enabledPlatforms).size !== enabledPlatforms.length) {
|
|
525
453
|
throw new Error(`Duplicate enabled platform in ${path}`);
|
|
526
454
|
}
|
|
527
|
-
// Files written before office records existed simply have no offices yet.
|
|
528
455
|
const offices = (Array.isArray(value.offices) ? value.offices : []).map((entry) => parseOfficeRecord(entry, path));
|
|
529
456
|
if (new Set(offices.map((record) => officeKey(record))).size !== offices.length) {
|
|
530
457
|
throw new Error(`Duplicate office record in ${path}`);
|
|
@@ -556,7 +483,6 @@ function hasMigrationStrings(value) {
|
|
|
556
483
|
typeof value.status === "string" &&
|
|
557
484
|
typeof value.updatedAt === "string");
|
|
558
485
|
}
|
|
559
|
-
/** Validate the fields every stored migration record must carry. */
|
|
560
486
|
function parseMigrationFields(value, path) {
|
|
561
487
|
if (!hasMigrationStrings(value)) {
|
|
562
488
|
throw new Error(`Invalid office migration fields in ${path}`);
|
|
@@ -577,10 +503,6 @@ function parseMigrationFields(value, path) {
|
|
|
577
503
|
updatedAt: value.updatedAt,
|
|
578
504
|
};
|
|
579
505
|
}
|
|
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
506
|
function assertOwnershipMatchesStatus(status, ownerPlatform, targetDir, path) {
|
|
585
507
|
const owned = ownerPlatform !== undefined;
|
|
586
508
|
const targeted = targetDir !== undefined;
|
|
@@ -673,7 +595,6 @@ function assertRegularDirectory(path, label) {
|
|
|
673
595
|
throw new Error(`${label} must be a regular directory: ${path}`);
|
|
674
596
|
}
|
|
675
597
|
}
|
|
676
|
-
/** `lstat` that reports a missing path as undefined; other errors still throw. */
|
|
677
598
|
function lstatIfExists(path) {
|
|
678
599
|
try {
|
|
679
600
|
return lstatSync(path);
|
|
@@ -703,7 +624,6 @@ function assertPathAbsent(path, label) {
|
|
|
703
624
|
function pathExists(path) {
|
|
704
625
|
return lstatIfExists(path) !== undefined;
|
|
705
626
|
}
|
|
706
|
-
/** Create the lock directory and stamp it with our token, unwinding on failure. */
|
|
707
627
|
function claimRegistryLock(lockPath, token) {
|
|
708
628
|
mkdirSync(lockPath, { mode: 0o700 });
|
|
709
629
|
try {
|
|
@@ -727,10 +647,6 @@ function acquireRegistryLease(lockPath, timeoutMs) {
|
|
|
727
647
|
}
|
|
728
648
|
}
|
|
729
649
|
}
|
|
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
650
|
function awaitFreeRegistryLock(lockPath, deadline, error) {
|
|
735
651
|
if (!isErrno(error, "EEXIST"))
|
|
736
652
|
throw error;
|
|
@@ -772,9 +688,7 @@ function registryLockIsStale(lockPath) {
|
|
|
772
688
|
}
|
|
773
689
|
}
|
|
774
690
|
}
|
|
775
|
-
catch {
|
|
776
|
-
// The owner file may not have been written before its process died.
|
|
777
|
-
}
|
|
691
|
+
catch { }
|
|
778
692
|
try {
|
|
779
693
|
const oldEnough = Date.now() - statSync(lockPath).mtimeMs >= REGISTRY_LOCK_STALE_MS;
|
|
780
694
|
return ownerKnown ? !ownerAlive : oldEnough;
|
|
@@ -786,21 +700,9 @@ function registryLockIsStale(lockPath) {
|
|
|
786
700
|
function sleepSync(milliseconds) {
|
|
787
701
|
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, milliseconds);
|
|
788
702
|
}
|
|
789
|
-
// ── raw-id lookups (cold paths: CLI, Admin enumeration) ──────────────────────
|
|
790
|
-
/** Current office inventory, read fresh from disk for cross-process freshness. */
|
|
791
703
|
export function listRegisteredOffices(stateDir) {
|
|
792
704
|
return new OfficeRegistry(stateDir).getOffices();
|
|
793
705
|
}
|
|
794
|
-
/**
|
|
795
|
-
* Enabled platforms whose id format could have produced this raw
|
|
796
|
-
* conversation id. Auto-claiming uses this as verification, not guessing:
|
|
797
|
-
* every format below is one mikan itself writes (GitHub ids are mikan-derived
|
|
798
|
-
* slugs; Slack/Telegram/Discord ids are the platforms' own grammars), and a
|
|
799
|
-
* directory is only claimed when exactly one enabled platform's format
|
|
800
|
-
* matches. Bare digits stay ambiguous while both Telegram and Discord are
|
|
801
|
-
* enabled (negative ids are Telegram-only); anything matching no enabled
|
|
802
|
-
* format fails closed to needs-owner.
|
|
803
|
-
*/
|
|
804
706
|
function platformsMatchingConversationIdFormat(rawConversationId, enabledPlatforms) {
|
|
805
707
|
return enabledPlatforms.filter((platform) => {
|
|
806
708
|
switch (platform) {
|
|
@@ -827,18 +729,6 @@ function isGithubConversationId(rawConversationId) {
|
|
|
827
729
|
function isErrno(error, code) {
|
|
828
730
|
return error instanceof Error && "code" in error && error.code === code;
|
|
829
731
|
}
|
|
830
|
-
// ── Boot-time legacy migration ────────────────────────────────────────────────
|
|
831
|
-
/**
|
|
832
|
-
* Move every legacy raw-id office directory under the workspace root to the
|
|
833
|
-
* canonical office-key layout, journaling each move through the office
|
|
834
|
-
* registry so an interrupted run resumes instead of losing offices.
|
|
835
|
-
*
|
|
836
|
-
* The engine never guesses: with several enabled platforms an unowned raw
|
|
837
|
-
* directory stays in place and is reported for `mikan office claim`. Callers
|
|
838
|
-
* must treat a non-empty `unowned`/`failed` as fatal for daemon boot — after
|
|
839
|
-
* the layout flip, an unmigrated legacy directory is invisible to the
|
|
840
|
-
* runtime, which would silently present the conversation as empty.
|
|
841
|
-
*/
|
|
842
732
|
export function migrateLegacyOffices(options) {
|
|
843
733
|
const registry = new OfficeRegistry(options.stateDir);
|
|
844
734
|
for (const platform of options.enabledPlatforms)
|
|
@@ -855,8 +745,6 @@ export function migrateLegacyOffices(options) {
|
|
|
855
745
|
};
|
|
856
746
|
recoverInterruptedMoves(registry, summary);
|
|
857
747
|
claimAndMoveLegacyDirs(registry, options.workspaceRoot, summary);
|
|
858
|
-
// Credential vaults are keyed by office too; the registry inventory (which
|
|
859
|
-
// the directory moves above just extended) drives the same rename.
|
|
860
748
|
const vaults = migrateConversationVaultKeys({
|
|
861
749
|
stateDir: options.stateDir,
|
|
862
750
|
offices: registry.getOffices(),
|
|
@@ -875,7 +763,6 @@ export function migrateLegacyOffices(options) {
|
|
|
875
763
|
}
|
|
876
764
|
return summary;
|
|
877
765
|
}
|
|
878
|
-
/** Complete or fail every move the journal says was interrupted mid-rename. */
|
|
879
766
|
function recoverInterruptedMoves(registry, summary) {
|
|
880
767
|
for (const record of registry.getState().migrations) {
|
|
881
768
|
if (record.status !== "moving")
|
|
@@ -891,7 +778,6 @@ function recoverInterruptedMoves(registry, summary) {
|
|
|
891
778
|
log.logInfo(`[office] Recovered interrupted migration: ${record.rawConversationId}`);
|
|
892
779
|
}
|
|
893
780
|
}
|
|
894
|
-
/** Complete one interrupted rename; returns the failure reason when it cannot. */
|
|
895
781
|
function finishInterruptedMove(record) {
|
|
896
782
|
const targetDir = record.targetDir;
|
|
897
783
|
if (!targetDir)
|
|
@@ -907,12 +793,6 @@ function finishInterruptedMove(record) {
|
|
|
907
793
|
renameSync(record.sourceDir, targetDir);
|
|
908
794
|
return undefined;
|
|
909
795
|
}
|
|
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
796
|
function isClaimableLegacyDir(registry, workspaceRoot, rawConversationId) {
|
|
917
797
|
const existing = registry.getMigration(rawConversationId);
|
|
918
798
|
if (existing?.status === "committed") {
|
|
@@ -920,7 +800,6 @@ function isClaimableLegacyDir(registry, workspaceRoot, rawConversationId) {
|
|
|
920
800
|
}
|
|
921
801
|
return existing?.status !== "failed";
|
|
922
802
|
}
|
|
923
|
-
/** Scan the workspace root and move every claimable legacy office directory. */
|
|
924
803
|
function claimAndMoveLegacyDirs(registry, workspaceRoot, summary) {
|
|
925
804
|
for (const rawConversationId of listLegacyOfficeDirs(workspaceRoot)) {
|
|
926
805
|
if (!isClaimableLegacyDir(registry, workspaceRoot, rawConversationId))
|
|
@@ -931,7 +810,7 @@ function claimAndMoveLegacyDirs(registry, workspaceRoot, summary) {
|
|
|
931
810
|
workspaceRoot,
|
|
932
811
|
});
|
|
933
812
|
if (record.status === "needs-owner")
|
|
934
|
-
continue;
|
|
813
|
+
continue;
|
|
935
814
|
const moving = registry.markMoving(rawConversationId);
|
|
936
815
|
const targetDir = moving.targetDir;
|
|
937
816
|
if (!targetDir)
|
|
@@ -943,12 +822,6 @@ function claimAndMoveLegacyDirs(registry, workspaceRoot, summary) {
|
|
|
943
822
|
log.logInfo(`[office] Migrated office directory: ${rawConversationId} -> ${targetDir}`);
|
|
944
823
|
}
|
|
945
824
|
}
|
|
946
|
-
/**
|
|
947
|
-
* Move each registered office's host state tree from
|
|
948
|
-
* `conversations/<rawId>` to
|
|
949
|
-
* `conversations/<officeKey>` in one rename. Conflicts are reported for
|
|
950
|
-
* manual merge, never clobbered.
|
|
951
|
-
*/
|
|
952
825
|
function migrateConversationStateDirs(registry, stateDir, summary) {
|
|
953
826
|
for (const office of registry.getOffices()) {
|
|
954
827
|
const legacyDir = join(stateDir, "conversations", office.conversationId);
|
|
@@ -964,7 +837,6 @@ function migrateConversationStateDirs(registry, stateDir, summary) {
|
|
|
964
837
|
log.logInfo(`[office] Migrated host state dir to office key: ${office.conversationId}`);
|
|
965
838
|
}
|
|
966
839
|
}
|
|
967
|
-
/** A migrated office is an existing office; keep the directory enumerable. */
|
|
968
840
|
function recordMigratedOffice(registry, record) {
|
|
969
841
|
if (!record.ownerPlatform)
|
|
970
842
|
return;
|
|
@@ -973,19 +845,6 @@ function recordMigratedOffice(registry, record) {
|
|
|
973
845
|
conversationId: record.rawConversationId,
|
|
974
846
|
});
|
|
975
847
|
}
|
|
976
|
-
/**
|
|
977
|
-
* Legacy office candidates: regular directories that are not reserved
|
|
978
|
-
* infrastructure, not hidden, and not already office-key named. A symlink in
|
|
979
|
-
* office position is refused outright — following it could move data from
|
|
980
|
-
* outside the workspace root.
|
|
981
|
-
*
|
|
982
|
-
* A candidate must also look like a conversation office: every office that
|
|
983
|
-
* ever saw a message has a `log.jsonl`, and every office that ran the agent
|
|
984
|
-
* has `sessions/`. Trusted workspace roots legitimately accumulate other
|
|
985
|
-
* directories — repos the agent cloned, build output — which are not offices
|
|
986
|
-
* and must be neither renamed nor reported as unowned; they stay where they
|
|
987
|
-
* are (an operator can still claim one explicitly via `mikan office claim`).
|
|
988
|
-
*/
|
|
989
848
|
function listLegacyOfficeDirs(workspaceRoot) {
|
|
990
849
|
return readdirSync(workspaceRoot, { withFileTypes: true })
|
|
991
850
|
.filter((entry) => isLegacyOfficeDir(workspaceRoot, entry))
|
|
@@ -1012,7 +871,6 @@ function isLegacyOfficeDir(workspaceRoot, entry) {
|
|
|
1012
871
|
function looksLikeConversationOffice(dir) {
|
|
1013
872
|
return existsSync(join(dir, "log.jsonl")) || existsSync(join(dir, "sessions"));
|
|
1014
873
|
}
|
|
1015
|
-
/** Operator-facing boot failure for offices the engine may not move itself. */
|
|
1016
874
|
export function formatUnmigratedOfficesError(summary) {
|
|
1017
875
|
const lines = ["Conversation office migration cannot complete:"];
|
|
1018
876
|
if (summary.unowned.length > 0) {
|
|
@@ -1030,20 +888,11 @@ export function formatUnmigratedOfficesError(summary) {
|
|
|
1030
888
|
]));
|
|
1031
889
|
return lines.join("\n");
|
|
1032
890
|
}
|
|
1033
|
-
/** One blank-separated "these need manual work" block, empty when nothing does. */
|
|
1034
891
|
function conflictSection(ids, explanation) {
|
|
1035
892
|
if (ids.length === 0)
|
|
1036
893
|
return [];
|
|
1037
894
|
return ["", ...explanation, ...ids.map((id) => ` - ${id}`)];
|
|
1038
895
|
}
|
|
1039
|
-
/**
|
|
1040
|
-
* Bind-spec translator for the container layout migration: rewrites every
|
|
1041
|
-
* host path the office migration renamed — workspace dirs, per-conversation
|
|
1042
|
-
* state trees, conversation vaults — and the guest workspace segment, using
|
|
1043
|
-
* the registry's office inventory as the raw-id ↔ office mapping. Specs that
|
|
1044
|
-
* reference none of the renamed paths come back unchanged, which is also how
|
|
1045
|
-
* an already-migrated container is recognized.
|
|
1046
|
-
*/
|
|
1047
896
|
function replacePrefix(path, pairs) {
|
|
1048
897
|
for (const [oldPrefix, newPrefix] of pairs) {
|
|
1049
898
|
if (path === oldPrefix)
|