@geminixiang/mikan 1.0.0-beta.76 → 1.0.0-beta.78
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 +39 -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 +3 -7
- 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 +4 -37
- 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 +3 -12
- 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/sandbox.d.ts +3 -0
- package/dist/cli/sandbox.d.ts.map +1 -0
- package/dist/cli/sandbox.js +79 -0
- package/dist/cli/sandbox.js.map +1 -0
- 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 +2 -6
- package/dist/cli/types.d.ts.map +1 -1
- package/dist/cli/types.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 +4 -7
- package/dist/harness/index.d.ts.map +1 -1
- package/dist/harness/index.js +4 -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-result.d.ts +20 -0
- package/dist/harness/mcp-result.d.ts.map +1 -0
- package/dist/harness/mcp-result.js +171 -0
- package/dist/harness/mcp-result.js.map +1 -0
- package/dist/harness/mcp.d.ts +0 -19
- package/dist/harness/mcp.d.ts.map +1 -1
- package/dist/harness/mcp.js +7 -66
- 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 +1 -0
- package/dist/harness/presenter.d.ts.map +1 -1
- package/dist/harness/presenter.js +16 -66
- 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 +1 -18
- package/dist/harness/prompt.js.map +1 -1
- package/dist/harness/runner.d.ts.map +1 -1
- package/dist/harness/runner.js +8 -28
- 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 +1 -11
- package/dist/harness/tools/pi-tools.d.ts.map +1 -1
- package/dist/harness/tools/pi-tools.js +1 -30
- 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 +1 -77
- 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 +7 -52
- package/dist/main.js.map +1 -1
- package/dist/memory-capture/index.d.ts +16 -0
- package/dist/memory-capture/index.d.ts.map +1 -0
- package/dist/memory-capture/index.js +194 -0
- package/dist/memory-capture/index.js.map +1 -0
- package/dist/memory-capture/types.d.ts +27 -0
- package/dist/memory-capture/types.d.ts.map +1 -0
- package/dist/memory-capture/types.js.map +1 -0
- 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 +1 -10
- 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 +4 -154
- 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 +5 -41
- 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 +22 -83
- 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 +2 -29
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/runtime/types.js.map +1 -1
- package/dist/sandbox/cloudflare.d.ts.map +1 -1
- package/dist/sandbox/cloudflare.js +2 -1
- package/dist/sandbox/cloudflare.js.map +1 -1
- package/dist/sandbox/container.d.ts.map +1 -1
- package/dist/sandbox/container.js +21 -15
- 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 +2 -19
- package/dist/sandbox/index.js.map +1 -1
- package/dist/sandbox/layout.d.ts +7 -0
- package/dist/sandbox/layout.d.ts.map +1 -0
- package/dist/sandbox/layout.js +13 -0
- package/dist/sandbox/layout.js.map +1 -0
- package/dist/sandbox/provisioner.d.ts +24 -65
- package/dist/sandbox/provisioner.d.ts.map +1 -1
- package/dist/sandbox/provisioner.js +213 -125
- 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 +1 -7
- 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 -60
- package/dist/sessions/store.d.ts.map +1 -1
- package/dist/sessions/store.js +0 -113
- 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 +9 -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 +135 -65
- 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/dream/index.d.ts +0 -20
- package/dist/dream/index.d.ts.map +0 -1
- package/dist/dream/index.js +0 -264
- package/dist/dream/index.js.map +0 -1
- package/dist/dream/types.d.ts +0 -30
- package/dist/dream/types.d.ts.map +0 -1
- package/dist/dream/types.js.map +0 -1
- /package/dist/{dream → memory-capture}/types.js +0 -0
package/dist/office/index.js
CHANGED
|
@@ -1,31 +1,23 @@
|
|
|
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";
|
|
10
4
|
import * as log from "../log.js";
|
|
11
5
|
import { parseGithubConversationId } from "../adapters/github/ids.js";
|
|
12
6
|
import { legacyConversationCredentialKey } from "../sandbox/identity.js";
|
|
7
|
+
import { guestWorkspacePath } from "../sandbox/layout.js";
|
|
13
8
|
import { migrateConversationVaultKeys } from "../vault/index.js";
|
|
14
9
|
import { atomicWritePrivateFile, isRecord, readTextFileIfExists } from "../file-guards.js";
|
|
15
|
-
// ── Office identity (address & keys) ──────────────────────────────────────────
|
|
16
10
|
const OFFICE_KEY_VERSION = "v1";
|
|
17
11
|
const OFFICE_KEY_DOMAIN = "office-address-v1";
|
|
18
12
|
const OFFICE_KEY_DIGEST_LENGTH = 16;
|
|
19
13
|
const READABLE_ID_LENGTH = 32;
|
|
20
14
|
const PLATFORM_NAMES = new Set(["slack", "discord", "telegram", "github"]);
|
|
21
15
|
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
16
|
export function createOfficeAddress(platform, conversationId) {
|
|
24
17
|
assertPlatformName(platform);
|
|
25
18
|
assertConversationId(conversationId);
|
|
26
19
|
return Object.freeze({ platform, conversationId });
|
|
27
20
|
}
|
|
28
|
-
/** Validate an untrusted runtime value as a canonical office address. */
|
|
29
21
|
export function validateOfficeAddress(value) {
|
|
30
22
|
if (!isRecord(value))
|
|
31
23
|
throw new Error("Office address must be an object");
|
|
@@ -37,22 +29,18 @@ export function validateOfficeAddress(value) {
|
|
|
37
29
|
}
|
|
38
30
|
return createOfficeAddress(assertPlatformName(value.platform), value.conversationId);
|
|
39
31
|
}
|
|
40
|
-
/** Return true only for a supported platform name. */
|
|
41
32
|
function isPlatformName(value) {
|
|
42
33
|
return typeof value === "string" && PLATFORM_NAMES.has(value);
|
|
43
34
|
}
|
|
44
|
-
/** Validate a platform name and return it for typed callers. */
|
|
45
35
|
export function assertPlatformName(value) {
|
|
46
36
|
if (!isPlatformName(value))
|
|
47
37
|
throw new Error(`Unsupported platform: ${JSON.stringify(value)}`);
|
|
48
38
|
return value;
|
|
49
39
|
}
|
|
50
|
-
/** Path separators and the C0/C1 control ranges are never allowed in an id. */
|
|
51
40
|
function isUnsafeConversationIdChar(character) {
|
|
52
41
|
const code = character.codePointAt(0) ?? 0;
|
|
53
42
|
return character === "/" || character === "\\" || code <= 0x1f || (code >= 0x7f && code <= 0x9f);
|
|
54
43
|
}
|
|
55
|
-
/** Validate a raw platform conversation identifier before it enters storage. */
|
|
56
44
|
export function assertConversationId(value) {
|
|
57
45
|
if (value.length === 0 || value === "." || value === "..") {
|
|
58
46
|
throw new Error("Conversation id must be non-empty and not a path marker");
|
|
@@ -62,7 +50,6 @@ export function assertConversationId(value) {
|
|
|
62
50
|
}
|
|
63
51
|
return value;
|
|
64
52
|
}
|
|
65
|
-
/** Derive a readable diagnostic key whose digest remains the identity authority. */
|
|
66
53
|
export function officeKey(address) {
|
|
67
54
|
const normalized = validateOfficeAddress(address);
|
|
68
55
|
const readable = readableConversationId(normalized.conversationId);
|
|
@@ -72,31 +59,18 @@ export function officeKey(address) {
|
|
|
72
59
|
.slice(0, OFFICE_KEY_DIGEST_LENGTH);
|
|
73
60
|
return `${OFFICE_KEY_VERSION}-${normalized.platform}-${readable}-${digest}`;
|
|
74
61
|
}
|
|
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
62
|
export function officeDir(workspaceRoot, address) {
|
|
81
63
|
return join(workspaceRoot, officeKey(address));
|
|
82
64
|
}
|
|
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
65
|
export function officeStateDir(stateDir, address) {
|
|
90
66
|
return join(stateDir, "conversations", officeKey(address));
|
|
91
67
|
}
|
|
92
|
-
/** Compare canonical office identities without relying on their readable key. */
|
|
93
68
|
export function sameOffice(left, right) {
|
|
94
69
|
const leftAddress = validateOfficeAddress(left);
|
|
95
70
|
const rightAddress = validateOfficeAddress(right);
|
|
96
71
|
return (leftAddress.platform === rightAddress.platform &&
|
|
97
72
|
leftAddress.conversationId === rightAddress.conversationId);
|
|
98
73
|
}
|
|
99
|
-
/** Validate a persisted or externally supplied office key. */
|
|
100
74
|
export function assertOfficeKey(value) {
|
|
101
75
|
if (!OFFICE_KEY_PATTERN.test(value)) {
|
|
102
76
|
throw new Error(`Invalid office key: ${JSON.stringify(value)}`);
|
|
@@ -115,36 +89,12 @@ function readableConversationId(conversationId) {
|
|
|
115
89
|
.replace(/-+$/g, "");
|
|
116
90
|
return readable || "conversation";
|
|
117
91
|
}
|
|
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
92
|
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
93
|
export function officeSessionsDir(dir) {
|
|
140
94
|
return join(dir, "sessions");
|
|
141
95
|
}
|
|
142
96
|
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
97
|
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
98
|
let registry;
|
|
149
99
|
const recorded = new Set();
|
|
150
100
|
const offices = new Map();
|
|
@@ -174,9 +124,6 @@ export function createWorkspace(options) {
|
|
|
174
124
|
stateDir: join(stateDir, "conversations", key),
|
|
175
125
|
workspace,
|
|
176
126
|
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
127
|
if (!recorded.has(key)) {
|
|
181
128
|
registry ??= new OfficeRegistry(stateDir);
|
|
182
129
|
registry.recordOffice(normalized);
|
|
@@ -192,7 +139,6 @@ export function createWorkspace(options) {
|
|
|
192
139
|
});
|
|
193
140
|
return workspace;
|
|
194
141
|
}
|
|
195
|
-
/** mkdir-if-missing with the same fail-closed type guard as projection roots. */
|
|
196
142
|
function ensureRegularOfficeDirectory(dir) {
|
|
197
143
|
let stats;
|
|
198
144
|
try {
|
|
@@ -208,7 +154,6 @@ function ensureRegularOfficeDirectory(dir) {
|
|
|
208
154
|
throw new Error(`Office directory must be a regular non-symlink directory: ${dir}`);
|
|
209
155
|
}
|
|
210
156
|
}
|
|
211
|
-
// ── Office registry journal ───────────────────────────────────────────────────
|
|
212
157
|
const REGISTRY_VERSION = 1;
|
|
213
158
|
const REGISTRY_FILENAME = "office-registry.json";
|
|
214
159
|
const MIGRATION_STATUSES = new Set([
|
|
@@ -233,7 +178,6 @@ export class OfficeRegistry {
|
|
|
233
178
|
this.lockTimeoutMs = options.lockTimeoutMs ?? REGISTRY_LOCK_TIMEOUT_MS;
|
|
234
179
|
this.state = this.readState();
|
|
235
180
|
}
|
|
236
|
-
/** Reload the atomic registry file after another host process changed it. */
|
|
237
181
|
reload() {
|
|
238
182
|
this.state = this.readState();
|
|
239
183
|
return this.state;
|
|
@@ -255,11 +199,6 @@ export class OfficeRegistry {
|
|
|
255
199
|
return this.state;
|
|
256
200
|
});
|
|
257
201
|
}
|
|
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
202
|
recordOffice(address) {
|
|
264
203
|
const normalized = validateOfficeAddress(address);
|
|
265
204
|
const existing = this.findOffice(normalized);
|
|
@@ -284,11 +223,6 @@ export class OfficeRegistry {
|
|
|
284
223
|
findOffice(address) {
|
|
285
224
|
return this.state.offices.find((record) => record.platform === address.platform && record.conversationId === address.conversationId);
|
|
286
225
|
}
|
|
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
226
|
prepareLegacyMigration(options) {
|
|
293
227
|
const rawConversationId = assertConversationId(options.rawConversationId);
|
|
294
228
|
const sourceDir = resolve(options.sourceDir);
|
|
@@ -437,11 +371,6 @@ export class OfficeRegistry {
|
|
|
437
371
|
this.writeState(this.registryPath, `${JSON.stringify(candidate, null, 2)}\n`);
|
|
438
372
|
this.state = candidate;
|
|
439
373
|
}
|
|
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
374
|
withExclusiveLease(operation) {
|
|
446
375
|
const release = acquireRegistryLease(this.lockPath, this.lockTimeoutMs);
|
|
447
376
|
try {
|
|
@@ -524,7 +453,6 @@ function parseState(value, path) {
|
|
|
524
453
|
if (new Set(enabledPlatforms).size !== enabledPlatforms.length) {
|
|
525
454
|
throw new Error(`Duplicate enabled platform in ${path}`);
|
|
526
455
|
}
|
|
527
|
-
// Files written before office records existed simply have no offices yet.
|
|
528
456
|
const offices = (Array.isArray(value.offices) ? value.offices : []).map((entry) => parseOfficeRecord(entry, path));
|
|
529
457
|
if (new Set(offices.map((record) => officeKey(record))).size !== offices.length) {
|
|
530
458
|
throw new Error(`Duplicate office record in ${path}`);
|
|
@@ -556,7 +484,6 @@ function hasMigrationStrings(value) {
|
|
|
556
484
|
typeof value.status === "string" &&
|
|
557
485
|
typeof value.updatedAt === "string");
|
|
558
486
|
}
|
|
559
|
-
/** Validate the fields every stored migration record must carry. */
|
|
560
487
|
function parseMigrationFields(value, path) {
|
|
561
488
|
if (!hasMigrationStrings(value)) {
|
|
562
489
|
throw new Error(`Invalid office migration fields in ${path}`);
|
|
@@ -577,10 +504,6 @@ function parseMigrationFields(value, path) {
|
|
|
577
504
|
updatedAt: value.updatedAt,
|
|
578
505
|
};
|
|
579
506
|
}
|
|
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
507
|
function assertOwnershipMatchesStatus(status, ownerPlatform, targetDir, path) {
|
|
585
508
|
const owned = ownerPlatform !== undefined;
|
|
586
509
|
const targeted = targetDir !== undefined;
|
|
@@ -673,7 +596,6 @@ function assertRegularDirectory(path, label) {
|
|
|
673
596
|
throw new Error(`${label} must be a regular directory: ${path}`);
|
|
674
597
|
}
|
|
675
598
|
}
|
|
676
|
-
/** `lstat` that reports a missing path as undefined; other errors still throw. */
|
|
677
599
|
function lstatIfExists(path) {
|
|
678
600
|
try {
|
|
679
601
|
return lstatSync(path);
|
|
@@ -703,7 +625,6 @@ function assertPathAbsent(path, label) {
|
|
|
703
625
|
function pathExists(path) {
|
|
704
626
|
return lstatIfExists(path) !== undefined;
|
|
705
627
|
}
|
|
706
|
-
/** Create the lock directory and stamp it with our token, unwinding on failure. */
|
|
707
628
|
function claimRegistryLock(lockPath, token) {
|
|
708
629
|
mkdirSync(lockPath, { mode: 0o700 });
|
|
709
630
|
try {
|
|
@@ -727,10 +648,6 @@ function acquireRegistryLease(lockPath, timeoutMs) {
|
|
|
727
648
|
}
|
|
728
649
|
}
|
|
729
650
|
}
|
|
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
651
|
function awaitFreeRegistryLock(lockPath, deadline, error) {
|
|
735
652
|
if (!isErrno(error, "EEXIST"))
|
|
736
653
|
throw error;
|
|
@@ -772,9 +689,7 @@ function registryLockIsStale(lockPath) {
|
|
|
772
689
|
}
|
|
773
690
|
}
|
|
774
691
|
}
|
|
775
|
-
catch {
|
|
776
|
-
// The owner file may not have been written before its process died.
|
|
777
|
-
}
|
|
692
|
+
catch { }
|
|
778
693
|
try {
|
|
779
694
|
const oldEnough = Date.now() - statSync(lockPath).mtimeMs >= REGISTRY_LOCK_STALE_MS;
|
|
780
695
|
return ownerKnown ? !ownerAlive : oldEnough;
|
|
@@ -786,21 +701,9 @@ function registryLockIsStale(lockPath) {
|
|
|
786
701
|
function sleepSync(milliseconds) {
|
|
787
702
|
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, milliseconds);
|
|
788
703
|
}
|
|
789
|
-
// ── raw-id lookups (cold paths: CLI, Admin enumeration) ──────────────────────
|
|
790
|
-
/** Current office inventory, read fresh from disk for cross-process freshness. */
|
|
791
704
|
export function listRegisteredOffices(stateDir) {
|
|
792
705
|
return new OfficeRegistry(stateDir).getOffices();
|
|
793
706
|
}
|
|
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
707
|
function platformsMatchingConversationIdFormat(rawConversationId, enabledPlatforms) {
|
|
805
708
|
return enabledPlatforms.filter((platform) => {
|
|
806
709
|
switch (platform) {
|
|
@@ -827,18 +730,6 @@ function isGithubConversationId(rawConversationId) {
|
|
|
827
730
|
function isErrno(error, code) {
|
|
828
731
|
return error instanceof Error && "code" in error && error.code === code;
|
|
829
732
|
}
|
|
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
733
|
export function migrateLegacyOffices(options) {
|
|
843
734
|
const registry = new OfficeRegistry(options.stateDir);
|
|
844
735
|
for (const platform of options.enabledPlatforms)
|
|
@@ -855,8 +746,6 @@ export function migrateLegacyOffices(options) {
|
|
|
855
746
|
};
|
|
856
747
|
recoverInterruptedMoves(registry, summary);
|
|
857
748
|
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
749
|
const vaults = migrateConversationVaultKeys({
|
|
861
750
|
stateDir: options.stateDir,
|
|
862
751
|
offices: registry.getOffices(),
|
|
@@ -875,7 +764,6 @@ export function migrateLegacyOffices(options) {
|
|
|
875
764
|
}
|
|
876
765
|
return summary;
|
|
877
766
|
}
|
|
878
|
-
/** Complete or fail every move the journal says was interrupted mid-rename. */
|
|
879
767
|
function recoverInterruptedMoves(registry, summary) {
|
|
880
768
|
for (const record of registry.getState().migrations) {
|
|
881
769
|
if (record.status !== "moving")
|
|
@@ -891,7 +779,6 @@ function recoverInterruptedMoves(registry, summary) {
|
|
|
891
779
|
log.logInfo(`[office] Recovered interrupted migration: ${record.rawConversationId}`);
|
|
892
780
|
}
|
|
893
781
|
}
|
|
894
|
-
/** Complete one interrupted rename; returns the failure reason when it cannot. */
|
|
895
782
|
function finishInterruptedMove(record) {
|
|
896
783
|
const targetDir = record.targetDir;
|
|
897
784
|
if (!targetDir)
|
|
@@ -907,12 +794,6 @@ function finishInterruptedMove(record) {
|
|
|
907
794
|
renameSync(record.sourceDir, targetDir);
|
|
908
795
|
return undefined;
|
|
909
796
|
}
|
|
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
797
|
function isClaimableLegacyDir(registry, workspaceRoot, rawConversationId) {
|
|
917
798
|
const existing = registry.getMigration(rawConversationId);
|
|
918
799
|
if (existing?.status === "committed") {
|
|
@@ -920,7 +801,6 @@ function isClaimableLegacyDir(registry, workspaceRoot, rawConversationId) {
|
|
|
920
801
|
}
|
|
921
802
|
return existing?.status !== "failed";
|
|
922
803
|
}
|
|
923
|
-
/** Scan the workspace root and move every claimable legacy office directory. */
|
|
924
804
|
function claimAndMoveLegacyDirs(registry, workspaceRoot, summary) {
|
|
925
805
|
for (const rawConversationId of listLegacyOfficeDirs(workspaceRoot)) {
|
|
926
806
|
if (!isClaimableLegacyDir(registry, workspaceRoot, rawConversationId))
|
|
@@ -931,7 +811,7 @@ function claimAndMoveLegacyDirs(registry, workspaceRoot, summary) {
|
|
|
931
811
|
workspaceRoot,
|
|
932
812
|
});
|
|
933
813
|
if (record.status === "needs-owner")
|
|
934
|
-
continue;
|
|
814
|
+
continue;
|
|
935
815
|
const moving = registry.markMoving(rawConversationId);
|
|
936
816
|
const targetDir = moving.targetDir;
|
|
937
817
|
if (!targetDir)
|
|
@@ -943,12 +823,6 @@ function claimAndMoveLegacyDirs(registry, workspaceRoot, summary) {
|
|
|
943
823
|
log.logInfo(`[office] Migrated office directory: ${rawConversationId} -> ${targetDir}`);
|
|
944
824
|
}
|
|
945
825
|
}
|
|
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
826
|
function migrateConversationStateDirs(registry, stateDir, summary) {
|
|
953
827
|
for (const office of registry.getOffices()) {
|
|
954
828
|
const legacyDir = join(stateDir, "conversations", office.conversationId);
|
|
@@ -964,7 +838,6 @@ function migrateConversationStateDirs(registry, stateDir, summary) {
|
|
|
964
838
|
log.logInfo(`[office] Migrated host state dir to office key: ${office.conversationId}`);
|
|
965
839
|
}
|
|
966
840
|
}
|
|
967
|
-
/** A migrated office is an existing office; keep the directory enumerable. */
|
|
968
841
|
function recordMigratedOffice(registry, record) {
|
|
969
842
|
if (!record.ownerPlatform)
|
|
970
843
|
return;
|
|
@@ -973,19 +846,6 @@ function recordMigratedOffice(registry, record) {
|
|
|
973
846
|
conversationId: record.rawConversationId,
|
|
974
847
|
});
|
|
975
848
|
}
|
|
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
849
|
function listLegacyOfficeDirs(workspaceRoot) {
|
|
990
850
|
return readdirSync(workspaceRoot, { withFileTypes: true })
|
|
991
851
|
.filter((entry) => isLegacyOfficeDir(workspaceRoot, entry))
|
|
@@ -1012,7 +872,6 @@ function isLegacyOfficeDir(workspaceRoot, entry) {
|
|
|
1012
872
|
function looksLikeConversationOffice(dir) {
|
|
1013
873
|
return existsSync(join(dir, "log.jsonl")) || existsSync(join(dir, "sessions"));
|
|
1014
874
|
}
|
|
1015
|
-
/** Operator-facing boot failure for offices the engine may not move itself. */
|
|
1016
875
|
export function formatUnmigratedOfficesError(summary) {
|
|
1017
876
|
const lines = ["Conversation office migration cannot complete:"];
|
|
1018
877
|
if (summary.unowned.length > 0) {
|
|
@@ -1030,20 +889,11 @@ export function formatUnmigratedOfficesError(summary) {
|
|
|
1030
889
|
]));
|
|
1031
890
|
return lines.join("\n");
|
|
1032
891
|
}
|
|
1033
|
-
/** One blank-separated "these need manual work" block, empty when nothing does. */
|
|
1034
892
|
function conflictSection(ids, explanation) {
|
|
1035
893
|
if (ids.length === 0)
|
|
1036
894
|
return [];
|
|
1037
895
|
return ["", ...explanation, ...ids.map((id) => ` - ${id}`)];
|
|
1038
896
|
}
|
|
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
897
|
function replacePrefix(path, pairs) {
|
|
1048
898
|
for (const [oldPrefix, newPrefix] of pairs) {
|
|
1049
899
|
if (path === oldPrefix)
|
|
@@ -1068,7 +918,7 @@ export function buildContainerBindTranslator(options) {
|
|
|
1068
918
|
join(options.stateDir, "vaults", legacyConversationCredentialKey(rawId)),
|
|
1069
919
|
join(options.stateDir, "vaults", key),
|
|
1070
920
|
]);
|
|
1071
|
-
guestPairs.push([
|
|
921
|
+
guestPairs.push([guestWorkspacePath(rawId), guestWorkspacePath(key)]);
|
|
1072
922
|
}
|
|
1073
923
|
return (bindSpec) => {
|
|
1074
924
|
const readOnly = bindSpec.endsWith(":ro");
|