@geminixiang/mikan 1.0.0-beta.7 → 1.0.0-beta.71
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 +1052 -0
- package/README.md +98 -38
- package/dist/adapters/commands/admin.d.ts.map +1 -0
- package/dist/{commands → adapters/commands}/admin.js +11 -8
- package/dist/adapters/commands/admin.js.map +1 -0
- package/dist/{commands → adapters/commands}/auto-reply.d.ts +0 -3
- package/dist/adapters/commands/auto-reply.d.ts.map +1 -0
- package/dist/adapters/commands/auto-reply.js +47 -0
- package/dist/adapters/commands/auto-reply.js.map +1 -0
- package/dist/adapters/commands/login.d.ts +6 -0
- package/dist/adapters/commands/login.d.ts.map +1 -0
- package/dist/adapters/commands/login.js +166 -0
- package/dist/adapters/commands/login.js.map +1 -0
- package/dist/adapters/commands/manifest.d.ts +37 -0
- package/dist/adapters/commands/manifest.d.ts.map +1 -0
- package/dist/adapters/commands/manifest.js +155 -0
- package/dist/adapters/commands/manifest.js.map +1 -0
- package/dist/adapters/commands/model.d.ts +15 -0
- package/dist/adapters/commands/model.d.ts.map +1 -0
- package/dist/adapters/commands/model.js +153 -0
- package/dist/adapters/commands/model.js.map +1 -0
- package/dist/adapters/commands/new.d.ts.map +1 -0
- package/dist/adapters/commands/new.js +41 -0
- package/dist/adapters/commands/new.js.map +1 -0
- package/dist/adapters/commands/registry.d.ts +5 -0
- package/dist/adapters/commands/registry.d.ts.map +1 -0
- package/dist/adapters/commands/registry.js +43 -0
- package/dist/adapters/commands/registry.js.map +1 -0
- package/dist/adapters/commands/sandbox.d.ts.map +1 -0
- package/dist/adapters/commands/sandbox.js +125 -0
- package/dist/adapters/commands/sandbox.js.map +1 -0
- package/dist/adapters/commands/session-view.d.ts.map +1 -0
- package/dist/{commands → adapters/commands}/session-view.js +23 -16
- package/dist/adapters/commands/session-view.js.map +1 -0
- package/dist/adapters/commands/types.d.ts +145 -0
- package/dist/adapters/commands/types.d.ts.map +1 -0
- package/dist/adapters/commands/types.js.map +1 -0
- package/dist/adapters/commands/utils.d.ts +14 -0
- package/dist/adapters/commands/utils.d.ts.map +1 -0
- package/dist/{commands → adapters/commands}/utils.js +18 -1
- package/dist/adapters/commands/utils.js.map +1 -0
- package/dist/adapters/discord/bot.d.ts +11 -8
- package/dist/adapters/discord/bot.d.ts.map +1 -1
- package/dist/adapters/discord/bot.js +223 -256
- package/dist/adapters/discord/bot.js.map +1 -1
- package/dist/adapters/discord/components.d.ts +28 -0
- package/dist/adapters/discord/components.d.ts.map +1 -0
- package/dist/adapters/discord/components.js +32 -0
- package/dist/adapters/discord/components.js.map +1 -0
- package/dist/adapters/discord/context.d.ts +2 -6
- package/dist/adapters/discord/context.d.ts.map +1 -1
- package/dist/adapters/discord/context.js +64 -218
- package/dist/adapters/discord/context.js.map +1 -1
- package/dist/adapters/discord/format.d.ts +3 -0
- package/dist/adapters/discord/format.d.ts.map +1 -0
- package/dist/adapters/discord/format.js +84 -0
- package/dist/adapters/discord/format.js.map +1 -0
- package/dist/adapters/discord/types.d.ts +8 -1
- package/dist/adapters/discord/types.d.ts.map +1 -1
- package/dist/adapters/discord/types.js.map +1 -1
- package/dist/adapters/github/bot.d.ts +102 -0
- package/dist/adapters/github/bot.d.ts.map +1 -0
- package/dist/adapters/github/bot.js +720 -0
- package/dist/adapters/github/bot.js.map +1 -0
- package/dist/adapters/github/client.d.ts +122 -0
- package/dist/adapters/github/client.d.ts.map +1 -0
- package/dist/adapters/github/client.js +301 -0
- package/dist/adapters/github/client.js.map +1 -0
- package/dist/adapters/github/context.d.ts +5 -0
- package/dist/adapters/github/context.d.ts.map +1 -0
- package/dist/adapters/github/context.js +101 -0
- package/dist/adapters/github/context.js.map +1 -0
- package/dist/adapters/github/github-ops.d.ts +78 -0
- package/dist/adapters/github/github-ops.d.ts.map +1 -0
- package/dist/adapters/github/github-ops.js +337 -0
- package/dist/adapters/github/github-ops.js.map +1 -0
- package/dist/adapters/github/ids.d.ts +34 -0
- package/dist/adapters/github/ids.d.ts.map +1 -0
- package/dist/adapters/github/ids.js +57 -0
- package/dist/adapters/github/ids.js.map +1 -0
- package/dist/adapters/github/repo.d.ts +33 -0
- package/dist/adapters/github/repo.d.ts.map +1 -0
- package/dist/adapters/github/repo.js +141 -0
- package/dist/adapters/github/repo.js.map +1 -0
- package/dist/adapters/github/tool-pack.d.ts +14 -0
- package/dist/adapters/github/tool-pack.d.ts.map +1 -0
- package/dist/adapters/github/tool-pack.js +55 -0
- package/dist/adapters/github/tool-pack.js.map +1 -0
- package/dist/adapters/github/tools/checks.d.ts +18 -0
- package/dist/adapters/github/tools/checks.d.ts.map +1 -0
- package/dist/adapters/github/tools/checks.js +86 -0
- package/dist/adapters/github/tools/checks.js.map +1 -0
- package/dist/adapters/github/tools/issue.d.ts +21 -0
- package/dist/adapters/github/tools/issue.d.ts.map +1 -0
- package/dist/adapters/github/tools/issue.js +48 -0
- package/dist/adapters/github/tools/issue.js.map +1 -0
- package/dist/adapters/github/tools/pr.d.ts +22 -0
- package/dist/adapters/github/tools/pr.d.ts.map +1 -0
- package/dist/adapters/github/tools/pr.js +48 -0
- package/dist/adapters/github/tools/pr.js.map +1 -0
- package/dist/adapters/github/tools/read.d.ts +21 -0
- package/dist/adapters/github/tools/read.d.ts.map +1 -0
- package/dist/adapters/github/tools/read.js +141 -0
- package/dist/adapters/github/tools/read.js.map +1 -0
- package/dist/adapters/github/tools/review-reply.d.ts +17 -0
- package/dist/adapters/github/tools/review-reply.d.ts.map +1 -0
- package/dist/adapters/github/tools/review-reply.js +38 -0
- package/dist/adapters/github/tools/review-reply.js.map +1 -0
- package/dist/adapters/github/tools/sync.d.ts +17 -0
- package/dist/adapters/github/tools/sync.d.ts.map +1 -0
- package/dist/adapters/github/tools/sync.js +34 -0
- package/dist/adapters/github/tools/sync.js.map +1 -0
- package/dist/adapters/github/types.d.ts +345 -0
- package/dist/adapters/github/types.d.ts.map +1 -0
- package/dist/adapters/github/types.js.map +1 -0
- package/dist/adapters/github/webhook.d.ts +20 -0
- package/dist/adapters/github/webhook.d.ts.map +1 -0
- package/dist/adapters/github/webhook.js +78 -0
- package/dist/adapters/github/webhook.js.map +1 -0
- package/dist/adapters/index.d.ts +12 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +19 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/intake.d.ts +17 -6
- package/dist/adapters/intake.d.ts.map +1 -1
- package/dist/adapters/intake.js +96 -27
- package/dist/adapters/intake.js.map +1 -1
- package/dist/adapters/markdown-tables.d.ts +19 -0
- package/dist/adapters/markdown-tables.d.ts.map +1 -0
- package/dist/adapters/markdown-tables.js +152 -0
- package/dist/adapters/markdown-tables.js.map +1 -0
- package/dist/{platform-messages.d.ts → adapters/messages.d.ts} +3 -2
- package/dist/adapters/messages.d.ts.map +1 -0
- package/dist/{platform-messages.js → adapters/messages.js} +4 -1
- package/dist/adapters/messages.js.map +1 -0
- package/dist/adapters/progressive-renderer.d.ts +7 -0
- package/dist/adapters/progressive-renderer.d.ts.map +1 -0
- package/dist/adapters/progressive-renderer.js +443 -0
- package/dist/adapters/progressive-renderer.js.map +1 -0
- package/dist/adapters/shared.d.ts +37 -11
- package/dist/adapters/shared.d.ts.map +1 -1
- package/dist/adapters/shared.js +130 -24
- package/dist/adapters/shared.js.map +1 -1
- package/dist/adapters/slack/assistant.d.ts +73 -0
- package/dist/adapters/slack/assistant.d.ts.map +1 -0
- package/dist/adapters/slack/assistant.js +205 -0
- package/dist/adapters/slack/assistant.js.map +1 -0
- package/dist/adapters/slack/auto-reply-context.d.ts +21 -0
- package/dist/adapters/slack/auto-reply-context.d.ts.map +1 -0
- package/dist/adapters/slack/auto-reply-context.js +28 -0
- package/dist/adapters/slack/auto-reply-context.js.map +1 -0
- package/dist/adapters/slack/blocks.d.ts +14 -0
- package/dist/adapters/slack/blocks.d.ts.map +1 -1
- package/dist/adapters/slack/blocks.js +104 -148
- package/dist/adapters/slack/blocks.js.map +1 -1
- package/dist/adapters/slack/bot.d.ts +154 -21
- package/dist/adapters/slack/bot.d.ts.map +1 -1
- package/dist/adapters/slack/bot.js +1037 -484
- package/dist/adapters/slack/bot.js.map +1 -1
- package/dist/adapters/slack/context.d.ts +2 -6
- package/dist/adapters/slack/context.d.ts.map +1 -1
- package/dist/adapters/slack/context.js +11 -17
- package/dist/adapters/slack/context.js.map +1 -1
- package/dist/adapters/slack/jev-context.d.ts +30 -0
- package/dist/adapters/slack/jev-context.d.ts.map +1 -0
- package/dist/adapters/slack/jev-context.js +67 -0
- package/dist/adapters/slack/jev-context.js.map +1 -0
- package/dist/adapters/slack/markdown.d.ts +3 -0
- package/dist/adapters/slack/markdown.d.ts.map +1 -0
- package/dist/adapters/slack/markdown.js +48 -0
- package/dist/adapters/slack/markdown.js.map +1 -0
- package/dist/adapters/slack/persona.d.ts +15 -0
- package/dist/adapters/slack/persona.d.ts.map +1 -0
- package/dist/adapters/slack/persona.js +22 -0
- package/dist/adapters/slack/persona.js.map +1 -0
- package/dist/adapters/slack/response-lifecycle.d.ts +1 -1
- package/dist/adapters/slack/response-lifecycle.d.ts.map +1 -1
- package/dist/adapters/slack/response-lifecycle.js +261 -345
- package/dist/adapters/slack/response-lifecycle.js.map +1 -1
- package/dist/adapters/slack/session.d.ts.map +1 -1
- package/dist/adapters/slack/session.js +7 -11
- package/dist/adapters/slack/session.js.map +1 -1
- package/dist/adapters/slack/stream-limits.d.ts +35 -0
- package/dist/adapters/slack/stream-limits.d.ts.map +1 -0
- package/dist/adapters/slack/stream-limits.js +56 -0
- package/dist/adapters/slack/stream-limits.js.map +1 -0
- package/dist/adapters/slack/task-intent.d.ts +32 -0
- package/dist/adapters/slack/task-intent.d.ts.map +1 -0
- package/dist/adapters/slack/task-intent.js +72 -0
- package/dist/adapters/slack/task-intent.js.map +1 -0
- package/dist/adapters/slack/task-status.d.ts +7 -0
- package/dist/adapters/slack/task-status.d.ts.map +1 -0
- package/dist/adapters/slack/task-status.js +107 -0
- package/dist/adapters/slack/task-status.js.map +1 -0
- package/dist/adapters/slack/tool-pack.d.ts +11 -0
- package/dist/adapters/slack/tool-pack.d.ts.map +1 -0
- package/dist/adapters/slack/tool-pack.js +45 -0
- package/dist/adapters/slack/tool-pack.js.map +1 -0
- package/dist/adapters/slack/tools/blockkit.d.ts +14 -0
- package/dist/adapters/slack/tools/blockkit.d.ts.map +1 -0
- package/dist/adapters/slack/tools/blockkit.js +106 -0
- package/dist/adapters/slack/tools/blockkit.js.map +1 -0
- package/dist/adapters/slack/types.d.ts +73 -2
- 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 +14 -0
- package/dist/adapters/slack/update-diagnostics.d.ts.map +1 -0
- package/dist/adapters/slack/update-diagnostics.js +134 -0
- package/dist/adapters/slack/update-diagnostics.js.map +1 -0
- package/dist/adapters/telegram/bot.d.ts +10 -9
- package/dist/adapters/telegram/bot.d.ts.map +1 -1
- package/dist/adapters/telegram/bot.js +133 -202
- package/dist/adapters/telegram/bot.js.map +1 -1
- package/dist/adapters/telegram/context.d.ts +2 -6
- package/dist/adapters/telegram/context.d.ts.map +1 -1
- package/dist/adapters/telegram/context.js +53 -190
- package/dist/adapters/telegram/context.js.map +1 -1
- package/dist/adapters/telegram/types.d.ts +1 -1
- package/dist/adapters/telegram/types.d.ts.map +1 -1
- package/dist/adapters/telegram/types.js.map +1 -1
- package/dist/adapters/types.d.ts +144 -13
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/adapters/types.js.map +1 -1
- package/dist/adapters/web/admin/portal.d.ts +44 -0
- package/dist/adapters/web/admin/portal.d.ts.map +1 -0
- package/dist/adapters/web/admin/portal.js +3207 -0
- package/dist/adapters/web/admin/portal.js.map +1 -0
- package/dist/{web → adapters/web}/admin/provider-models.d.ts +1 -1
- package/dist/adapters/web/admin/provider-models.d.ts.map +1 -0
- package/dist/{web → adapters/web}/admin/provider-models.js +1 -1
- package/dist/adapters/web/admin/provider-models.js.map +1 -0
- package/dist/adapters/web/admin/types.d.ts +53 -0
- package/dist/adapters/web/admin/types.d.ts.map +1 -0
- package/dist/adapters/web/admin/types.js.map +1 -0
- package/dist/adapters/web/login/oauth.d.ts +5 -0
- package/dist/adapters/web/login/oauth.d.ts.map +1 -0
- package/dist/{web → adapters/web}/login/oauth.js +50 -85
- package/dist/adapters/web/login/oauth.js.map +1 -0
- package/dist/{web → adapters/web}/login/portal.d.ts +9 -3
- package/dist/adapters/web/login/portal.d.ts.map +1 -0
- package/dist/{web → adapters/web}/login/portal.js +161 -119
- package/dist/adapters/web/login/portal.js.map +1 -0
- package/dist/{web → adapters/web}/login/types.d.ts +1 -12
- package/dist/adapters/web/login/types.d.ts.map +1 -0
- package/dist/adapters/web/login/types.js.map +1 -0
- package/dist/adapters/web/portal-shell.d.ts +22 -0
- package/dist/adapters/web/portal-shell.d.ts.map +1 -0
- package/dist/{portal-shell.js → adapters/web/portal-shell.js} +78 -2
- package/dist/adapters/web/portal-shell.js.map +1 -0
- package/dist/{web → adapters/web}/server.d.ts +14 -8
- package/dist/adapters/web/server.d.ts.map +1 -0
- package/dist/{web → adapters/web}/server.js +14 -7
- package/dist/adapters/web/server.js.map +1 -0
- package/dist/adapters/web/session-view/portal.d.ts +20 -0
- package/dist/adapters/web/session-view/portal.d.ts.map +1 -0
- package/dist/{web → adapters/web}/session-view/portal.js +633 -162
- package/dist/adapters/web/session-view/portal.js.map +1 -0
- package/dist/{web → adapters/web}/session-view/types.d.ts +11 -6
- package/dist/adapters/web/session-view/types.d.ts.map +1 -0
- package/dist/adapters/web/session-view/types.js.map +1 -0
- package/dist/adapters/web/token-store.d.ts.map +1 -0
- package/dist/{web → adapters/web}/token-store.js +1 -1
- package/dist/adapters/web/token-store.js.map +1 -0
- package/dist/adapters/web/types.d.ts.map +1 -0
- package/dist/adapters/web/types.js.map +1 -0
- package/dist/cli/arg-grammar.d.ts +11 -0
- package/dist/cli/arg-grammar.d.ts.map +1 -0
- package/dist/cli/arg-grammar.js +50 -0
- package/dist/cli/arg-grammar.js.map +1 -0
- package/dist/cli/boot.d.ts +5 -0
- package/dist/cli/boot.d.ts.map +1 -0
- package/dist/cli/boot.js +90 -0
- package/dist/cli/boot.js.map +1 -0
- package/dist/cli/download.d.ts.map +1 -0
- package/dist/cli/download.js +88 -0
- package/dist/cli/download.js.map +1 -0
- package/dist/cli/office.d.ts +2 -0
- package/dist/cli/office.d.ts.map +1 -0
- package/dist/cli/office.js +181 -0
- package/dist/cli/office.js.map +1 -0
- package/dist/cli/onboard.d.ts +10 -0
- package/dist/cli/onboard.d.ts.map +1 -0
- package/dist/cli/onboard.js +225 -0
- package/dist/cli/onboard.js.map +1 -0
- package/dist/cli/process-lifecycle.d.ts +19 -0
- package/dist/cli/process-lifecycle.d.ts.map +1 -0
- package/dist/cli/process-lifecycle.js +67 -0
- package/dist/cli/process-lifecycle.js.map +1 -0
- package/dist/cli/sessions.d.ts +2 -0
- package/dist/cli/sessions.d.ts.map +1 -0
- package/dist/cli/sessions.js +88 -0
- package/dist/cli/sessions.js.map +1 -0
- package/dist/cli/types.d.ts +25 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/dream/index.d.ts +20 -0
- package/dist/dream/index.d.ts.map +1 -0
- package/dist/dream/index.js +264 -0
- package/dist/dream/index.js.map +1 -0
- package/dist/dream/types.d.ts +30 -0
- package/dist/dream/types.d.ts.map +1 -0
- package/dist/dream/types.js +2 -0
- package/dist/dream/types.js.map +1 -0
- package/dist/env-manifest.d.ts +38 -0
- package/dist/env-manifest.d.ts.map +1 -0
- package/dist/env-manifest.js +260 -0
- package/dist/env-manifest.js.map +1 -0
- package/dist/events/index.d.ts +172 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +340 -0
- package/dist/events/index.js.map +1 -0
- package/dist/events/scheduler.d.ts +34 -0
- package/dist/events/scheduler.d.ts.map +1 -0
- package/dist/events/scheduler.js +231 -0
- package/dist/events/scheduler.js.map +1 -0
- package/dist/file-guards.d.ts +26 -0
- package/dist/file-guards.d.ts.map +1 -0
- package/dist/file-guards.js +133 -0
- package/dist/file-guards.js.map +1 -0
- package/dist/harness/execution-env.d.ts +19 -0
- package/dist/harness/execution-env.d.ts.map +1 -0
- package/dist/harness/execution-env.js +262 -0
- package/dist/harness/execution-env.js.map +1 -0
- package/dist/harness/execution-resolver.d.ts +25 -0
- package/dist/harness/execution-resolver.d.ts.map +1 -0
- package/dist/harness/execution-resolver.js +156 -0
- package/dist/harness/execution-resolver.js.map +1 -0
- package/dist/harness/index.d.ts +18 -13
- package/dist/harness/index.d.ts.map +1 -1
- package/dist/harness/index.js +11 -11
- package/dist/harness/index.js.map +1 -1
- package/dist/harness/jev.d.ts +86 -0
- package/dist/harness/jev.d.ts.map +1 -0
- package/dist/harness/jev.js +167 -0
- package/dist/harness/jev.js.map +1 -0
- package/dist/harness/mcp.d.ts +38 -0
- package/dist/harness/mcp.d.ts.map +1 -0
- package/dist/harness/mcp.js +304 -0
- package/dist/harness/mcp.js.map +1 -0
- package/dist/harness/models.d.ts +7 -4
- package/dist/harness/models.d.ts.map +1 -1
- package/dist/harness/models.js +54 -55
- package/dist/harness/models.js.map +1 -1
- package/dist/harness/open-connector.d.ts +25 -0
- package/dist/harness/open-connector.d.ts.map +1 -0
- package/dist/harness/open-connector.js +178 -0
- package/dist/harness/open-connector.js.map +1 -0
- package/dist/harness/presenter.d.ts +31 -0
- package/dist/harness/presenter.d.ts.map +1 -0
- package/dist/harness/presenter.js +859 -0
- package/dist/harness/presenter.js.map +1 -0
- package/dist/harness/prompt.d.ts +30 -0
- package/dist/harness/prompt.d.ts.map +1 -0
- package/dist/harness/prompt.js +420 -0
- package/dist/harness/prompt.js.map +1 -0
- package/dist/harness/runner.d.ts +2 -123
- package/dist/harness/runner.d.ts.map +1 -1
- package/dist/harness/runner.js +551 -416
- package/dist/harness/runner.js.map +1 -1
- package/dist/harness/session.d.ts +122 -0
- package/dist/harness/session.d.ts.map +1 -0
- package/dist/harness/session.js +581 -0
- package/dist/harness/session.js.map +1 -0
- package/dist/harness/skills.d.ts +17 -28
- package/dist/harness/skills.d.ts.map +1 -1
- package/dist/harness/skills.js +104 -39
- package/dist/harness/skills.js.map +1 -1
- package/dist/harness/subagent-profiles.d.ts +8 -0
- package/dist/harness/subagent-profiles.d.ts.map +1 -0
- package/dist/harness/subagent-profiles.js +293 -0
- package/dist/harness/subagent-profiles.js.map +1 -0
- package/dist/harness/subagent.d.ts +64 -0
- package/dist/harness/subagent.d.ts.map +1 -0
- package/dist/harness/subagent.js +687 -0
- package/dist/harness/subagent.js.map +1 -0
- package/dist/harness/tools/attach.d.ts.map +1 -0
- package/dist/{adapters/slack → harness}/tools/attach.js +1 -1
- package/dist/harness/tools/attach.js.map +1 -0
- package/dist/{tools → harness/tools}/event.d.ts +4 -33
- package/dist/harness/tools/event.d.ts.map +1 -0
- package/dist/harness/tools/event.js +175 -0
- package/dist/harness/tools/event.js.map +1 -0
- package/dist/harness/tools/generate-image.d.ts +23 -0
- package/dist/harness/tools/generate-image.d.ts.map +1 -0
- package/dist/harness/tools/generate-image.js +65 -0
- package/dist/harness/tools/generate-image.js.map +1 -0
- package/dist/harness/tools/host-fn-tool.d.ts +21 -0
- package/dist/harness/tools/host-fn-tool.d.ts.map +1 -0
- package/dist/harness/tools/host-fn-tool.js +32 -0
- package/dist/harness/tools/host-fn-tool.js.map +1 -0
- package/dist/harness/tools/index.d.ts +41 -0
- package/dist/harness/tools/index.d.ts.map +1 -0
- package/dist/harness/tools/index.js +51 -0
- package/dist/harness/tools/index.js.map +1 -0
- package/dist/harness/tools/jev.d.ts +21 -0
- package/dist/harness/tools/jev.d.ts.map +1 -0
- package/dist/harness/tools/jev.js +109 -0
- package/dist/harness/tools/jev.js.map +1 -0
- package/dist/harness/tools/pi-tools.d.ts +18 -0
- package/dist/harness/tools/pi-tools.d.ts.map +1 -0
- package/dist/harness/tools/pi-tools.js +84 -0
- package/dist/harness/tools/pi-tools.js.map +1 -0
- package/dist/harness/tools/react.d.ts.map +1 -0
- package/dist/{tools → harness/tools}/react.js +6 -17
- package/dist/harness/tools/react.js.map +1 -0
- package/dist/{tools → harness/tools}/sandbox.d.ts +4 -4
- package/dist/harness/tools/sandbox.d.ts.map +1 -0
- package/dist/{tools → harness/tools}/sandbox.js +12 -8
- package/dist/harness/tools/sandbox.js.map +1 -0
- package/dist/harness/tools/subagent.d.ts +85 -0
- package/dist/harness/tools/subagent.d.ts.map +1 -0
- package/dist/harness/tools/subagent.js +677 -0
- package/dist/harness/tools/subagent.js.map +1 -0
- package/dist/harness/tools/task.d.ts +20 -0
- package/dist/harness/tools/task.d.ts.map +1 -0
- package/dist/harness/tools/task.js +79 -0
- package/dist/harness/tools/task.js.map +1 -0
- package/dist/harness/tools/types.d.ts +29 -0
- package/dist/harness/tools/types.d.ts.map +1 -0
- package/dist/harness/tools/types.js +2 -0
- package/dist/harness/tools/types.js.map +1 -0
- package/dist/harness/types.d.ts +384 -25
- package/dist/harness/types.d.ts.map +1 -1
- package/dist/harness/types.js +1 -1
- package/dist/harness/types.js.map +1 -1
- package/dist/index.d.ts +33 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -6
- package/dist/index.js.map +1 -1
- package/dist/log.d.ts.map +1 -1
- package/dist/log.js +4 -1
- package/dist/log.js.map +1 -1
- package/dist/main.js +357 -198
- package/dist/main.js.map +1 -1
- package/dist/observability/index.d.ts +33 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +257 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/instrument.js +14 -6
- package/dist/observability/instrument.js.map +1 -1
- package/dist/observability/otel.d.ts +10 -0
- package/dist/observability/otel.d.ts.map +1 -0
- package/dist/observability/otel.js +183 -0
- package/dist/observability/otel.js.map +1 -0
- package/dist/observability/sentry.d.ts +40 -7
- package/dist/observability/sentry.d.ts.map +1 -1
- package/dist/observability/sentry.js +176 -32
- package/dist/observability/sentry.js.map +1 -1
- package/dist/observability/types.d.ts +24 -3
- package/dist/observability/types.d.ts.map +1 -1
- package/dist/observability/types.js.map +1 -1
- package/dist/office/index.d.ts +139 -0
- package/dist/office/index.d.ts.map +1 -0
- package/dist/office/index.js +1084 -0
- package/dist/office/index.js.map +1 -0
- package/dist/office/projection.d.ts +42 -0
- package/dist/office/projection.d.ts.map +1 -0
- package/dist/office/projection.js +182 -0
- package/dist/office/projection.js.map +1 -0
- package/dist/office/types.d.ts +116 -0
- package/dist/office/types.d.ts.map +1 -0
- package/dist/office/types.js +2 -0
- package/dist/office/types.js.map +1 -0
- package/dist/runtime/conversation-runtime.d.ts +1 -1
- package/dist/runtime/conversation-runtime.d.ts.map +1 -1
- package/dist/runtime/conversation-runtime.js +423 -152
- package/dist/runtime/conversation-runtime.js.map +1 -1
- package/dist/runtime/session-lifecycle.d.ts +76 -0
- package/dist/runtime/session-lifecycle.d.ts.map +1 -0
- package/dist/runtime/session-lifecycle.js +404 -0
- package/dist/runtime/session-lifecycle.js.map +1 -0
- package/dist/runtime/types.d.ts +63 -15
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/runtime/types.js.map +1 -1
- package/dist/sandbox/cloudflare.d.ts +4 -0
- package/dist/sandbox/cloudflare.d.ts.map +1 -1
- package/dist/sandbox/cloudflare.js +54 -52
- package/dist/sandbox/cloudflare.js.map +1 -1
- package/dist/sandbox/container.d.ts +3 -0
- package/dist/sandbox/container.d.ts.map +1 -1
- package/dist/sandbox/container.js +19 -7
- package/dist/sandbox/container.js.map +1 -1
- package/dist/sandbox/host.d.ts +3 -0
- package/dist/sandbox/host.d.ts.map +1 -1
- package/dist/sandbox/host.js +44 -35
- package/dist/sandbox/host.js.map +1 -1
- package/dist/sandbox/identity.d.ts +42 -0
- package/dist/sandbox/identity.d.ts.map +1 -0
- package/dist/sandbox/identity.js +77 -0
- package/dist/sandbox/identity.js.map +1 -0
- package/dist/sandbox/index.d.ts +24 -6
- package/dist/sandbox/index.d.ts.map +1 -1
- package/dist/sandbox/index.js +77 -17
- package/dist/sandbox/index.js.map +1 -1
- package/dist/sandbox/provisioner.d.ts +139 -0
- package/dist/sandbox/provisioner.d.ts.map +1 -0
- package/dist/{provisioner.js → sandbox/provisioner.js} +378 -24
- package/dist/sandbox/provisioner.js.map +1 -0
- package/dist/sandbox/types.d.ts +43 -9
- package/dist/sandbox/types.d.ts.map +1 -1
- package/dist/sandbox/types.js.map +1 -1
- package/dist/sandbox/utils.d.ts +24 -0
- package/dist/sandbox/utils.d.ts.map +1 -1
- package/dist/sandbox/utils.js +92 -1
- package/dist/sandbox/utils.js.map +1 -1
- package/dist/sessions/chat-history-sync.d.ts +23 -0
- package/dist/sessions/chat-history-sync.d.ts.map +1 -0
- package/dist/sessions/{agent-memory-file-manager.js → chat-history-sync.js} +239 -175
- package/dist/sessions/chat-history-sync.js.map +1 -0
- package/dist/sessions/history-line.d.ts +29 -0
- package/dist/sessions/history-line.d.ts.map +1 -0
- package/dist/sessions/history-line.js +45 -0
- package/dist/sessions/history-line.js.map +1 -0
- package/dist/sessions/migrate-common.d.ts +43 -0
- package/dist/sessions/migrate-common.d.ts.map +1 -0
- package/dist/sessions/migrate-common.js +99 -0
- package/dist/sessions/migrate-common.js.map +1 -0
- package/dist/sessions/migrate-pi-084.d.ts +8 -0
- package/dist/sessions/migrate-pi-084.d.ts.map +1 -0
- package/dist/sessions/migrate-pi-084.js +302 -0
- package/dist/sessions/migrate-pi-084.js.map +1 -0
- package/dist/sessions/migrate-v3.d.ts +15 -0
- package/dist/sessions/migrate-v3.d.ts.map +1 -0
- package/dist/sessions/migrate-v3.js +419 -0
- package/dist/sessions/migrate-v3.js.map +1 -0
- package/dist/sessions/session-key.d.ts +33 -0
- package/dist/sessions/session-key.d.ts.map +1 -0
- package/dist/sessions/session-key.js +115 -0
- package/dist/sessions/session-key.js.map +1 -0
- package/dist/sessions/session-store.d.ts +61 -0
- package/dist/sessions/session-store.d.ts.map +1 -0
- package/dist/sessions/session-store.js +684 -0
- package/dist/sessions/session-store.js.map +1 -0
- package/dist/sessions/store.d.ts +17 -10
- package/dist/sessions/store.d.ts.map +1 -1
- package/dist/sessions/store.js +182 -47
- package/dist/sessions/store.js.map +1 -1
- package/dist/sessions/types.d.ts +74 -8
- package/dist/sessions/types.d.ts.map +1 -1
- package/dist/sessions/types.js +1 -1
- package/dist/sessions/types.js.map +1 -1
- package/dist/settings/apply.d.ts +16 -0
- package/dist/settings/apply.d.ts.map +1 -0
- package/dist/settings/apply.js +60 -0
- package/dist/settings/apply.js.map +1 -0
- package/dist/settings/index.d.ts +126 -0
- package/dist/settings/index.d.ts.map +1 -0
- package/dist/settings/index.js +422 -0
- package/dist/settings/index.js.map +1 -0
- package/dist/settings/migrate.d.ts +21 -0
- package/dist/settings/migrate.d.ts.map +1 -0
- package/dist/settings/migrate.js +86 -0
- package/dist/settings/migrate.js.map +1 -0
- package/dist/types.d.ts +330 -141
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +2 -2
- package/dist/types.js.map +1 -1
- package/dist/vault/index.d.ts +52 -2
- package/dist/vault/index.d.ts.map +1 -1
- package/dist/vault/index.js +218 -86
- package/dist/vault/index.js.map +1 -1
- package/dist/vault/types.d.ts +6 -2
- package/dist/vault/types.d.ts.map +1 -1
- package/dist/vault/types.js.map +1 -1
- package/package.json +79 -40
- package/dist/adapter.d.ts +0 -2
- package/dist/adapter.d.ts.map +0 -1
- package/dist/adapter.js +0 -2
- package/dist/adapter.js.map +0 -1
- package/dist/adapters/slack/tools/attach.d.ts.map +0 -1
- package/dist/adapters/slack/tools/attach.js.map +0 -1
- package/dist/adapters/streaming.d.ts +0 -18
- package/dist/adapters/streaming.d.ts.map +0 -1
- package/dist/adapters/streaming.js +0 -44
- package/dist/adapters/streaming.js.map +0 -1
- package/dist/adapters/telegram/html.d.ts +0 -3
- package/dist/adapters/telegram/html.d.ts.map +0 -1
- package/dist/adapters/telegram/html.js +0 -98
- package/dist/adapters/telegram/html.js.map +0 -1
- package/dist/agent-events.d.ts +0 -5
- package/dist/agent-events.d.ts.map +0 -1
- package/dist/agent-events.js +0 -26
- package/dist/agent-events.js.map +0 -1
- package/dist/agent.d.ts +0 -39
- package/dist/agent.d.ts.map +0 -1
- package/dist/agent.js +0 -1291
- package/dist/agent.js.map +0 -1
- package/dist/cli/ext-git.d.ts +0 -22
- package/dist/cli/ext-git.d.ts.map +0 -1
- package/dist/cli/ext-git.js +0 -76
- package/dist/cli/ext-git.js.map +0 -1
- package/dist/cli/ext.d.ts +0 -2
- package/dist/cli/ext.d.ts.map +0 -1
- package/dist/cli/ext.js +0 -217
- package/dist/cli/ext.js.map +0 -1
- package/dist/commands/admin.d.ts.map +0 -1
- package/dist/commands/admin.js.map +0 -1
- package/dist/commands/auto-reply.d.ts.map +0 -1
- package/dist/commands/auto-reply.js +0 -76
- package/dist/commands/auto-reply.js.map +0 -1
- package/dist/commands/extensions.d.ts +0 -14
- package/dist/commands/extensions.d.ts.map +0 -1
- package/dist/commands/extensions.js +0 -55
- package/dist/commands/extensions.js.map +0 -1
- package/dist/commands/login.d.ts +0 -5
- package/dist/commands/login.d.ts.map +0 -1
- package/dist/commands/login.js +0 -115
- package/dist/commands/login.js.map +0 -1
- package/dist/commands/model.d.ts +0 -10
- package/dist/commands/model.d.ts.map +0 -1
- package/dist/commands/model.js +0 -102
- package/dist/commands/model.js.map +0 -1
- package/dist/commands/new.d.ts.map +0 -1
- package/dist/commands/new.js +0 -25
- package/dist/commands/new.js.map +0 -1
- package/dist/commands/parse.d.ts +0 -7
- package/dist/commands/parse.d.ts.map +0 -1
- package/dist/commands/parse.js +0 -14
- package/dist/commands/parse.js.map +0 -1
- package/dist/commands/registry.d.ts +0 -5
- package/dist/commands/registry.d.ts.map +0 -1
- package/dist/commands/registry.js +0 -31
- package/dist/commands/registry.js.map +0 -1
- package/dist/commands/sandbox.d.ts.map +0 -1
- package/dist/commands/sandbox.js +0 -78
- package/dist/commands/sandbox.js.map +0 -1
- package/dist/commands/session-view.d.ts.map +0 -1
- package/dist/commands/session-view.js.map +0 -1
- package/dist/commands/types.d.ts +0 -66
- package/dist/commands/types.d.ts.map +0 -1
- package/dist/commands/types.js.map +0 -1
- package/dist/commands/utils.d.ts +0 -11
- package/dist/commands/utils.d.ts.map +0 -1
- package/dist/commands/utils.js.map +0 -1
- package/dist/config.d.ts +0 -78
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js +0 -450
- package/dist/config.js.map +0 -1
- package/dist/download.d.ts.map +0 -1
- package/dist/download.js +0 -89
- package/dist/download.js.map +0 -1
- package/dist/events.d.ts +0 -43
- package/dist/events.d.ts.map +0 -1
- package/dist/events.js +0 -456
- package/dist/events.js.map +0 -1
- package/dist/execution-resolver.d.ts +0 -21
- package/dist/execution-resolver.d.ts.map +0 -1
- package/dist/execution-resolver.js +0 -170
- package/dist/execution-resolver.js.map +0 -1
- package/dist/harness/auth.d.ts +0 -16
- package/dist/harness/auth.d.ts.map +0 -1
- package/dist/harness/auth.js +0 -86
- package/dist/harness/auth.js.map +0 -1
- package/dist/harness/extensions/loader.d.ts +0 -86
- package/dist/harness/extensions/loader.d.ts.map +0 -1
- package/dist/harness/extensions/loader.js +0 -525
- package/dist/harness/extensions/loader.js.map +0 -1
- package/dist/harness/extensions/registry.d.ts +0 -23
- package/dist/harness/extensions/registry.d.ts.map +0 -1
- package/dist/harness/extensions/registry.js +0 -45
- package/dist/harness/extensions/registry.js.map +0 -1
- package/dist/harness/extensions/types.d.ts +0 -248
- package/dist/harness/extensions/types.d.ts.map +0 -1
- package/dist/harness/extensions/types.js.map +0 -1
- package/dist/harness/session-store.d.ts +0 -77
- package/dist/harness/session-store.d.ts.map +0 -1
- package/dist/harness/session-store.js +0 -248
- package/dist/harness/session-store.js.map +0 -1
- package/dist/harness/settings.d.ts +0 -47
- package/dist/harness/settings.d.ts.map +0 -1
- package/dist/harness/settings.js +0 -29
- package/dist/harness/settings.js.map +0 -1
- package/dist/model-registry.d.ts +0 -4
- package/dist/model-registry.d.ts.map +0 -1
- package/dist/model-registry.js +0 -7
- package/dist/model-registry.js.map +0 -1
- package/dist/platform-messages.d.ts.map +0 -1
- package/dist/platform-messages.js.map +0 -1
- package/dist/portal-shell.d.ts +0 -4
- package/dist/portal-shell.d.ts.map +0 -1
- package/dist/portal-shell.js.map +0 -1
- package/dist/provisioner.d.ts +0 -61
- package/dist/provisioner.d.ts.map +0 -1
- package/dist/provisioner.js.map +0 -1
- package/dist/runtime/agent-run-controller.d.ts +0 -31
- package/dist/runtime/agent-run-controller.d.ts.map +0 -1
- package/dist/runtime/agent-run-controller.js +0 -195
- package/dist/runtime/agent-run-controller.js.map +0 -1
- package/dist/sandbox/errors.d.ts +0 -6
- package/dist/sandbox/errors.d.ts.map +0 -1
- package/dist/sandbox/errors.js +0 -11
- package/dist/sandbox/errors.js.map +0 -1
- package/dist/sandbox/firecracker.d.ts +0 -15
- package/dist/sandbox/firecracker.d.ts.map +0 -1
- package/dist/sandbox/firecracker.js +0 -212
- package/dist/sandbox/firecracker.js.map +0 -1
- package/dist/sandbox/image.d.ts +0 -3
- package/dist/sandbox/image.d.ts.map +0 -1
- package/dist/sandbox/image.js +0 -27
- package/dist/sandbox/image.js.map +0 -1
- package/dist/sandbox/path-context.d.ts +0 -3
- package/dist/sandbox/path-context.d.ts.map +0 -1
- package/dist/sandbox/path-context.js +0 -20
- package/dist/sandbox/path-context.js.map +0 -1
- package/dist/sessions/agent-memory-file-manager.d.ts +0 -19
- package/dist/sessions/agent-memory-file-manager.d.ts.map +0 -1
- package/dist/sessions/agent-memory-file-manager.js.map +0 -1
- package/dist/sessions/metadata.d.ts +0 -3
- package/dist/sessions/metadata.d.ts.map +0 -1
- package/dist/sessions/metadata.js +0 -11
- package/dist/sessions/metadata.js.map +0 -1
- package/dist/sessions/policy.d.ts +0 -6
- package/dist/sessions/policy.d.ts.map +0 -1
- package/dist/sessions/policy.js +0 -23
- package/dist/sessions/policy.js.map +0 -1
- package/dist/store.d.ts +0 -46
- package/dist/store.d.ts.map +0 -1
- package/dist/store.js +0 -177
- package/dist/store.js.map +0 -1
- package/dist/tools/bash.d.ts +0 -10
- package/dist/tools/bash.d.ts.map +0 -1
- package/dist/tools/bash.js +0 -80
- package/dist/tools/bash.js.map +0 -1
- package/dist/tools/edit.d.ts +0 -11
- package/dist/tools/edit.d.ts.map +0 -1
- package/dist/tools/edit.js +0 -131
- package/dist/tools/edit.js.map +0 -1
- package/dist/tools/event.d.ts.map +0 -1
- package/dist/tools/event.js +0 -252
- package/dist/tools/event.js.map +0 -1
- package/dist/tools/index.d.ts +0 -24
- package/dist/tools/index.d.ts.map +0 -1
- package/dist/tools/index.js +0 -31
- package/dist/tools/index.js.map +0 -1
- package/dist/tools/react.d.ts.map +0 -1
- package/dist/tools/react.js.map +0 -1
- package/dist/tools/read.d.ts +0 -11
- package/dist/tools/read.d.ts.map +0 -1
- package/dist/tools/read.js +0 -134
- package/dist/tools/read.js.map +0 -1
- package/dist/tools/sandbox.d.ts.map +0 -1
- package/dist/tools/sandbox.js.map +0 -1
- package/dist/tools/truncate.d.ts +0 -33
- package/dist/tools/truncate.d.ts.map +0 -1
- package/dist/tools/truncate.js +0 -184
- package/dist/tools/truncate.js.map +0 -1
- package/dist/tools/types.d.ts +0 -54
- package/dist/tools/types.d.ts.map +0 -1
- package/dist/tools/types.js.map +0 -1
- package/dist/tools/write.d.ts +0 -10
- package/dist/tools/write.d.ts.map +0 -1
- package/dist/tools/write.js +0 -29
- package/dist/tools/write.js.map +0 -1
- package/dist/trigger.d.ts +0 -22
- package/dist/trigger.d.ts.map +0 -1
- package/dist/trigger.js +0 -100
- package/dist/trigger.js.map +0 -1
- package/dist/utils/date.d.ts +0 -10
- package/dist/utils/date.d.ts.map +0 -1
- package/dist/utils/date.js +0 -23
- package/dist/utils/date.js.map +0 -1
- package/dist/utils/env.d.ts +0 -3
- package/dist/utils/env.d.ts.map +0 -1
- package/dist/utils/env.js +0 -12
- package/dist/utils/env.js.map +0 -1
- package/dist/utils/file-guards.d.ts +0 -9
- package/dist/utils/file-guards.d.ts.map +0 -1
- package/dist/utils/file-guards.js +0 -59
- package/dist/utils/file-guards.js.map +0 -1
- package/dist/utils/fs-atomic.d.ts +0 -10
- package/dist/utils/fs-atomic.d.ts.map +0 -1
- package/dist/utils/fs-atomic.js +0 -45
- package/dist/utils/fs-atomic.js.map +0 -1
- package/dist/utils/html.d.ts +0 -2
- package/dist/utils/html.d.ts.map +0 -1
- package/dist/utils/html.js +0 -4
- package/dist/utils/html.js.map +0 -1
- package/dist/utils/http-body.d.ts +0 -10
- package/dist/utils/http-body.d.ts.map +0 -1
- package/dist/utils/http-body.js +0 -34
- package/dist/utils/http-body.js.map +0 -1
- package/dist/vault/routing.d.ts +0 -3
- package/dist/vault/routing.d.ts.map +0 -1
- package/dist/vault/routing.js +0 -13
- package/dist/vault/routing.js.map +0 -1
- package/dist/web/admin/portal.d.ts +0 -5
- package/dist/web/admin/portal.d.ts.map +0 -1
- package/dist/web/admin/portal.js +0 -2572
- package/dist/web/admin/portal.js.map +0 -1
- package/dist/web/admin/provider-models.d.ts.map +0 -1
- package/dist/web/admin/provider-models.js.map +0 -1
- package/dist/web/admin/store.d.ts +0 -13
- package/dist/web/admin/store.d.ts.map +0 -1
- package/dist/web/admin/store.js +0 -14
- package/dist/web/admin/store.js.map +0 -1
- package/dist/web/admin/types.d.ts +0 -30
- package/dist/web/admin/types.d.ts.map +0 -1
- package/dist/web/admin/types.js.map +0 -1
- package/dist/web/agent-events/portal.d.ts +0 -3
- package/dist/web/agent-events/portal.d.ts.map +0 -1
- package/dist/web/agent-events/portal.js +0 -18
- package/dist/web/agent-events/portal.js.map +0 -1
- package/dist/web/login/oauth.d.ts +0 -6
- package/dist/web/login/oauth.d.ts.map +0 -1
- package/dist/web/login/oauth.js.map +0 -1
- package/dist/web/login/portal.d.ts.map +0 -1
- package/dist/web/login/portal.js.map +0 -1
- package/dist/web/login/store.d.ts +0 -8
- package/dist/web/login/store.d.ts.map +0 -1
- package/dist/web/login/store.js +0 -15
- package/dist/web/login/store.js.map +0 -1
- package/dist/web/login/types.d.ts.map +0 -1
- package/dist/web/login/types.js.map +0 -1
- package/dist/web/request.d.ts +0 -3
- package/dist/web/request.d.ts.map +0 -1
- package/dist/web/request.js +0 -13
- package/dist/web/request.js.map +0 -1
- package/dist/web/server.d.ts.map +0 -1
- package/dist/web/server.js.map +0 -1
- package/dist/web/session-view/command.d.ts +0 -4
- package/dist/web/session-view/command.d.ts.map +0 -1
- package/dist/web/session-view/command.js +0 -7
- package/dist/web/session-view/command.js.map +0 -1
- package/dist/web/session-view/portal.d.ts +0 -13
- package/dist/web/session-view/portal.d.ts.map +0 -1
- package/dist/web/session-view/portal.js.map +0 -1
- package/dist/web/session-view/service.d.ts +0 -6
- package/dist/web/session-view/service.d.ts.map +0 -1
- package/dist/web/session-view/service.js +0 -498
- package/dist/web/session-view/service.js.map +0 -1
- package/dist/web/session-view/store.d.ts +0 -8
- package/dist/web/session-view/store.d.ts.map +0 -1
- package/dist/web/session-view/store.js +0 -15
- package/dist/web/session-view/store.js.map +0 -1
- package/dist/web/session-view/types.d.ts.map +0 -1
- package/dist/web/session-view/types.js.map +0 -1
- package/dist/web/token-store.d.ts.map +0 -1
- package/dist/web/token-store.js.map +0 -1
- package/dist/web/types.d.ts.map +0 -1
- package/dist/web/types.js.map +0 -1
- /package/dist/{commands → adapters/commands}/admin.d.ts +0 -0
- /package/dist/{commands → adapters/commands}/new.d.ts +0 -0
- /package/dist/{commands → adapters/commands}/sandbox.d.ts +0 -0
- /package/dist/{commands → adapters/commands}/session-view.d.ts +0 -0
- /package/dist/{commands → adapters/commands}/types.js +0 -0
- /package/dist/{harness/extensions → adapters/github}/types.js +0 -0
- /package/dist/{tools → adapters/web/admin}/types.js +0 -0
- /package/dist/{web/admin → adapters/web/login}/types.js +0 -0
- /package/dist/{web/login → adapters/web/session-view}/types.js +0 -0
- /package/dist/{web → adapters/web}/token-store.d.ts +0 -0
- /package/dist/{web → adapters/web}/types.d.ts +0 -0
- /package/dist/{web/session-view → adapters/web}/types.js +0 -0
- /package/dist/{download.d.ts → cli/download.d.ts} +0 -0
- /package/dist/{web → cli}/types.js +0 -0
- /package/dist/{adapters/slack → harness}/tools/attach.d.ts +0 -0
- /package/dist/{tools → harness/tools}/react.d.ts +0 -0
|
@@ -0,0 +1,422 @@
|
|
|
1
|
+
import { Type } from "@sinclair/typebox";
|
|
2
|
+
import { existsSync, lstatSync, readFileSync, rmSync } from "node:fs";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import { effectiveStateDir } from "../cli/arg-grammar.js";
|
|
5
|
+
import { readEnv } from "../env-manifest.js";
|
|
6
|
+
import { atomicWritePrivateFile, ensureDirExists, readJsonSchemaFileIfExists, } from "../file-guards.js";
|
|
7
|
+
import * as log from "../log.js";
|
|
8
|
+
export class MissingGlobalSettingsError extends Error {
|
|
9
|
+
constructor(settingsPath) {
|
|
10
|
+
super(`Missing global settings file at ${settingsPath}`);
|
|
11
|
+
this.settingsPath = settingsPath;
|
|
12
|
+
this.name = "MissingGlobalSettingsError";
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
const ONBOARD_SETTINGS = {
|
|
16
|
+
llm: {
|
|
17
|
+
provider: "anthropic",
|
|
18
|
+
model: "claude-sonnet-4-6",
|
|
19
|
+
thinkingLevel: "off",
|
|
20
|
+
},
|
|
21
|
+
slack: {
|
|
22
|
+
replyMode: "top-level",
|
|
23
|
+
},
|
|
24
|
+
sandbox: {
|
|
25
|
+
cpus: "0.5",
|
|
26
|
+
memory: "1g",
|
|
27
|
+
boost: {
|
|
28
|
+
cpus: "2",
|
|
29
|
+
memory: "4g",
|
|
30
|
+
},
|
|
31
|
+
// Office visibility is not a setting here: it follows the platform
|
|
32
|
+
// conversation type (see office/projection resolveOfficeVisibility).
|
|
33
|
+
defaultSharedVault: "",
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
const SettingsFileSchema = Type.Object({
|
|
37
|
+
llm: Type.Optional(Type.Object({
|
|
38
|
+
provider: Type.Optional(Type.String()),
|
|
39
|
+
model: Type.Optional(Type.String()),
|
|
40
|
+
thinkingLevel: Type.Optional(Type.Union([
|
|
41
|
+
Type.Literal("off"),
|
|
42
|
+
Type.Literal("minimal"),
|
|
43
|
+
Type.Literal("low"),
|
|
44
|
+
Type.Literal("medium"),
|
|
45
|
+
Type.Literal("high"),
|
|
46
|
+
Type.Literal("xhigh"),
|
|
47
|
+
Type.Literal("max"),
|
|
48
|
+
])),
|
|
49
|
+
})),
|
|
50
|
+
sentry: Type.Optional(Type.Object({
|
|
51
|
+
dsn: Type.Optional(Type.String()),
|
|
52
|
+
})),
|
|
53
|
+
slack: Type.Optional(Type.Object({
|
|
54
|
+
replyMode: Type.Optional(Type.Union([Type.Literal("top-level"), Type.Literal("thread")])),
|
|
55
|
+
})),
|
|
56
|
+
/**
|
|
57
|
+
* Conversation-only office policy. `visibility: "private"` marks a
|
|
58
|
+
* platform-public conversation as private; nothing can widen visibility
|
|
59
|
+
* beyond what the platform grants, so "public" is never stored here.
|
|
60
|
+
*/
|
|
61
|
+
office: Type.Optional(Type.Object({
|
|
62
|
+
visibility: Type.Optional(Type.Literal("private")),
|
|
63
|
+
})),
|
|
64
|
+
sandbox: Type.Optional(Type.Object({
|
|
65
|
+
cpus: Type.Optional(Type.String()),
|
|
66
|
+
memory: Type.Optional(Type.String()),
|
|
67
|
+
boost: Type.Optional(Type.Object({
|
|
68
|
+
cpus: Type.Optional(Type.String()),
|
|
69
|
+
memory: Type.Optional(Type.String()),
|
|
70
|
+
})),
|
|
71
|
+
/**
|
|
72
|
+
* Retired door-policy keys (ADR 0008). Still accepted so existing files
|
|
73
|
+
* load, never copied into AgentConfig, and removed by
|
|
74
|
+
* `mikan office migrate-door-policy`.
|
|
75
|
+
*/
|
|
76
|
+
image: Type.Optional(Type.Object({
|
|
77
|
+
workspaceMount: Type.Optional(Type.Union([Type.Literal("private"), Type.Literal("full")])),
|
|
78
|
+
})),
|
|
79
|
+
workspace: Type.Optional(Type.Object({
|
|
80
|
+
doorPolicy: Type.Optional(Type.Union([Type.Literal("isolated"), Type.Literal("trusted")])),
|
|
81
|
+
layout: Type.Optional(Type.Union([
|
|
82
|
+
Type.Literal("conversation"),
|
|
83
|
+
Type.Literal("shared-support"),
|
|
84
|
+
Type.Literal("full"),
|
|
85
|
+
])),
|
|
86
|
+
visibility: Type.Optional(Type.Union([Type.Literal("public"), Type.Literal("private")])),
|
|
87
|
+
})),
|
|
88
|
+
defaultSharedVault: Type.Optional(Type.String()),
|
|
89
|
+
})),
|
|
90
|
+
/**
|
|
91
|
+
* MCP servers, keyed by name. Merged per key across scopes: a conversation
|
|
92
|
+
* entry overrides (or, with `disabled: true`, turns off) the same-name
|
|
93
|
+
* global entry; other global entries stay available. `open-connector` is an
|
|
94
|
+
* ordinary entry that the host fills in from `OPENCONNECTOR_ENDPOINT` when
|
|
95
|
+
* neither scope declares it (see `src/harness/open-connector.ts`).
|
|
96
|
+
*/
|
|
97
|
+
mcpServers: Type.Optional(Type.Record(Type.String(), Type.Object({
|
|
98
|
+
command: Type.Optional(Type.String()),
|
|
99
|
+
args: Type.Optional(Type.Array(Type.String())),
|
|
100
|
+
env: Type.Optional(Type.Record(Type.String(), Type.String())),
|
|
101
|
+
url: Type.Optional(Type.String()),
|
|
102
|
+
headers: Type.Optional(Type.Record(Type.String(), Type.String())),
|
|
103
|
+
disabled: Type.Optional(Type.Boolean()),
|
|
104
|
+
}))),
|
|
105
|
+
});
|
|
106
|
+
export function loadSettingsFile(settingsPath) {
|
|
107
|
+
return readJsonSchemaFileIfExists(settingsPath, SettingsFileSchema, (detail) => detail === "unexpected JSON shape"
|
|
108
|
+
? `Malformed settings file at ${settingsPath}: expected a JSON object at the top level`
|
|
109
|
+
: `Malformed settings file at ${settingsPath}: ${detail}`);
|
|
110
|
+
}
|
|
111
|
+
function normalizeSettingsConfig(config) {
|
|
112
|
+
return {
|
|
113
|
+
...(config.llm?.provider !== undefined ? { provider: config.llm.provider } : {}),
|
|
114
|
+
...(config.llm?.model !== undefined ? { model: config.llm.model } : {}),
|
|
115
|
+
...(config.llm?.thinkingLevel !== undefined ? { thinkingLevel: config.llm.thinkingLevel } : {}),
|
|
116
|
+
...(config.sentry?.dsn !== undefined ? { sentryDsn: config.sentry.dsn } : {}),
|
|
117
|
+
...(config.sandbox !== undefined ? { sandbox: normalizeSandboxSettings(config.sandbox) } : {}),
|
|
118
|
+
...(config.slack !== undefined ? { slack: config.slack } : {}),
|
|
119
|
+
...(config.mcpServers !== undefined ? { mcpServers: config.mcpServers } : {}),
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* File shape → in-memory shape for the sandbox group. An empty or
|
|
124
|
+
* whitespace-only `defaultSharedVault` means "no default" and is dropped;
|
|
125
|
+
* non-empty values are trimmed. Everything else passes through as-is.
|
|
126
|
+
*/
|
|
127
|
+
function normalizeSandboxSettings(sandbox) {
|
|
128
|
+
const defaultSharedVault = sandbox.defaultSharedVault?.trim();
|
|
129
|
+
// Retired `image.workspaceMount` and `workspace` are dropped here: office
|
|
130
|
+
// visibility comes from the platform (ADR 0008), never from these keys.
|
|
131
|
+
return {
|
|
132
|
+
...(sandbox.cpus !== undefined ? { cpus: sandbox.cpus } : {}),
|
|
133
|
+
...(sandbox.memory !== undefined ? { memory: sandbox.memory } : {}),
|
|
134
|
+
...(sandbox.boost !== undefined ? { boost: sandbox.boost } : {}),
|
|
135
|
+
...(defaultSharedVault ? { defaultSharedVault } : {}),
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Merge two sandbox settings groups. The merge invariant is LEAF-LEVEL:
|
|
140
|
+
* an override that only sets `sandbox.memory` keeps the base `sandbox.cpus`,
|
|
141
|
+
* and an override that only sets `boost.memory` keeps the base `boost.cpus`
|
|
142
|
+
* (same for `image`). This mirrors how the fields merged when they were
|
|
143
|
+
* flat top-level keys; a group-level spread would silently drop base leaves.
|
|
144
|
+
*/
|
|
145
|
+
function mergeSandboxSettings(base, override) {
|
|
146
|
+
if (!base)
|
|
147
|
+
return override;
|
|
148
|
+
if (!override)
|
|
149
|
+
return base;
|
|
150
|
+
return {
|
|
151
|
+
...base,
|
|
152
|
+
...override,
|
|
153
|
+
...(base.boost || override.boost ? { boost: { ...base.boost, ...override.boost } } : {}),
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
function getSettingsPath() {
|
|
157
|
+
return join(effectiveStateDir(), "settings.json");
|
|
158
|
+
}
|
|
159
|
+
function requireGlobalSettings() {
|
|
160
|
+
const settingsPath = getSettingsPath();
|
|
161
|
+
const config = loadSettingsFile(settingsPath);
|
|
162
|
+
if (!config) {
|
|
163
|
+
throw new MissingGlobalSettingsError(settingsPath);
|
|
164
|
+
}
|
|
165
|
+
return config;
|
|
166
|
+
}
|
|
167
|
+
function requireString(value, path) {
|
|
168
|
+
if (!value) {
|
|
169
|
+
throw new Error(`Missing required global setting: ${path}. Run \`mikan --onboard\` to create settings.json.`);
|
|
170
|
+
}
|
|
171
|
+
return value;
|
|
172
|
+
}
|
|
173
|
+
function toAgentConfig(fromFile) {
|
|
174
|
+
const provider = requireString(fromFile.provider, "llm.provider");
|
|
175
|
+
const model = requireString(fromFile.model, "llm.model");
|
|
176
|
+
const thinkingLevel = requireString(fromFile.thinkingLevel, "llm.thinkingLevel");
|
|
177
|
+
const sentryDsn = sentryDsnFrom(fromFile.sentryDsn);
|
|
178
|
+
const sandbox = fromFile.sandbox;
|
|
179
|
+
const slack = fromFile.slack;
|
|
180
|
+
const mcpServers = fromFile.mcpServers;
|
|
181
|
+
return {
|
|
182
|
+
provider,
|
|
183
|
+
model,
|
|
184
|
+
thinkingLevel,
|
|
185
|
+
sentryDsn,
|
|
186
|
+
sandbox,
|
|
187
|
+
slack,
|
|
188
|
+
mcpServers,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
function loadRawGlobalSettings() {
|
|
192
|
+
return normalizeSettingsConfig(requireGlobalSettings());
|
|
193
|
+
}
|
|
194
|
+
export function loadGlobalSettings() {
|
|
195
|
+
return toAgentConfig(loadRawGlobalSettings());
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Host-authoritative location of a conversation's settings file:
|
|
199
|
+
* `<office state dir>/settings.json`. The Office value names both the
|
|
200
|
+
* state-dir key and the legacy pre-host-migration location (its workspace
|
|
201
|
+
* dir) — the key is never inferred from a directory basename.
|
|
202
|
+
*
|
|
203
|
+
* Conversation settings used to live at `<conversationDir>/settings.json`,
|
|
204
|
+
* but conversation dirs are bind-mounted read-write into sandbox containers
|
|
205
|
+
* in image mode — code inside the sandbox could edit its own settings.json
|
|
206
|
+
* and flip `sandbox.image.workspaceMount` to "full", remounting the entire
|
|
207
|
+
* workspace into its container (cross-conversation access). Settings are an
|
|
208
|
+
* administrator surface, so they live under the host-only state dir.
|
|
209
|
+
*
|
|
210
|
+
* Migration: on first access per conversation, a legacy
|
|
211
|
+
* `<conversationDir>/settings.json` is moved here. The new file's existence
|
|
212
|
+
* (an empty `{}` is written when there is nothing to migrate) is the
|
|
213
|
+
* migration marker — a legacy file (re)appearing later, e.g. planted from
|
|
214
|
+
* inside the sandbox, is never read again.
|
|
215
|
+
*/
|
|
216
|
+
export function conversationSettingsPath(office) {
|
|
217
|
+
const hostPath = join(office.stateDir, "settings.json");
|
|
218
|
+
if (existsSync(hostPath)) {
|
|
219
|
+
assertSettingsFile(hostPath, "Host conversation settings");
|
|
220
|
+
return hostPath;
|
|
221
|
+
}
|
|
222
|
+
ensureDirExists(dirname(hostPath));
|
|
223
|
+
const legacyPath = join(office.dir, "settings.json");
|
|
224
|
+
let content = "{}\n";
|
|
225
|
+
let migrated = false;
|
|
226
|
+
if (existsSync(legacyPath)) {
|
|
227
|
+
assertSettingsFile(legacyPath, "Legacy conversation settings");
|
|
228
|
+
content = readFileSync(legacyPath, "utf-8");
|
|
229
|
+
// Validate before moving the file. A malformed legacy file must fail
|
|
230
|
+
// closed and remain available for an operator to repair.
|
|
231
|
+
loadSettingsFile(legacyPath);
|
|
232
|
+
migrated = true;
|
|
233
|
+
}
|
|
234
|
+
atomicWritePrivateFile(hostPath, content);
|
|
235
|
+
if (migrated) {
|
|
236
|
+
try {
|
|
237
|
+
rmSync(legacyPath);
|
|
238
|
+
}
|
|
239
|
+
catch (err) {
|
|
240
|
+
log.logWarning(`Could not remove legacy conversation settings: ${legacyPath}`, String(err));
|
|
241
|
+
}
|
|
242
|
+
log.logInfo(`Migrated conversation settings to host-only path: ${hostPath}`);
|
|
243
|
+
}
|
|
244
|
+
return hostPath;
|
|
245
|
+
}
|
|
246
|
+
function assertSettingsFile(path, label) {
|
|
247
|
+
let stats;
|
|
248
|
+
try {
|
|
249
|
+
stats = lstatSync(path);
|
|
250
|
+
}
|
|
251
|
+
catch (err) {
|
|
252
|
+
throw new Error(`${label} cannot be inspected: ${path}`, { cause: err });
|
|
253
|
+
}
|
|
254
|
+
if (stats.isSymbolicLink() || !stats.isFile()) {
|
|
255
|
+
throw new Error(`${label} must be a regular non-symlink file: ${path}`);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
const AUTO_REPLY_FILE = "auto-reply";
|
|
259
|
+
const AUTO_REPLY_JEV_FILE = "auto-reply.jev";
|
|
260
|
+
const AUTO_REPLY_MARKERS = {
|
|
261
|
+
on: AUTO_REPLY_FILE,
|
|
262
|
+
jev: AUTO_REPLY_JEV_FILE,
|
|
263
|
+
};
|
|
264
|
+
export function slackConversationAutoReplyMode(office) {
|
|
265
|
+
if (existsSync(join(office.dir, AUTO_REPLY_JEV_FILE)))
|
|
266
|
+
return "jev";
|
|
267
|
+
if (existsSync(join(office.dir, AUTO_REPLY_FILE)))
|
|
268
|
+
return "on";
|
|
269
|
+
return "off";
|
|
270
|
+
}
|
|
271
|
+
export function setSlackConversationAutoReply(office, mode) {
|
|
272
|
+
ensureDirExists(office.dir);
|
|
273
|
+
for (const [markerMode, fileName] of Object.entries(AUTO_REPLY_MARKERS)) {
|
|
274
|
+
const path = join(office.dir, fileName);
|
|
275
|
+
if (markerMode === mode) {
|
|
276
|
+
if (!existsSync(path))
|
|
277
|
+
atomicWritePrivateFile(path, "");
|
|
278
|
+
}
|
|
279
|
+
else if (existsSync(path)) {
|
|
280
|
+
rmSync(path);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
export function resolveConversationSettings(office) {
|
|
285
|
+
const globalConfig = loadRawGlobalSettings();
|
|
286
|
+
const conversationConfig = normalizeSettingsConfig(loadSettingsFile(conversationSettingsPath(office)) ?? {});
|
|
287
|
+
// MCP servers merge per key: a conversation redefines or disables individual
|
|
288
|
+
// servers without losing the rest of the global set.
|
|
289
|
+
const mcpServers = { ...globalConfig.mcpServers, ...conversationConfig.mcpServers };
|
|
290
|
+
// The sandbox group merges at the leaf level (see mergeSandboxSettings):
|
|
291
|
+
// a conversation that only sets sandbox.memory keeps the global sandbox.cpus.
|
|
292
|
+
const sandbox = mergeSandboxSettings(globalConfig.sandbox, conversationConfig.sandbox);
|
|
293
|
+
return toAgentConfig({
|
|
294
|
+
...globalConfig,
|
|
295
|
+
...conversationConfig,
|
|
296
|
+
...(sandbox ? { sandbox } : {}),
|
|
297
|
+
...(Object.keys(mcpServers).length > 0 ? { mcpServers } : {}),
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
/** Settings-file DSN wins over SENTRY_DSN env — the rule lives only here. */
|
|
301
|
+
function sentryDsnFrom(fromFile) {
|
|
302
|
+
return fromFile || readEnv("SENTRY_DSN");
|
|
303
|
+
}
|
|
304
|
+
export function resolveSentryDsn() {
|
|
305
|
+
const fromFile = normalizeSettingsConfig(loadSettingsFile(getSettingsPath()) ?? {});
|
|
306
|
+
return sentryDsnFrom(fromFile.sentryDsn);
|
|
307
|
+
}
|
|
308
|
+
export function createGlobalSettingsFile(stateDir, llm) {
|
|
309
|
+
const settingsPath = join(stateDir, "settings.json");
|
|
310
|
+
if (existsSync(settingsPath)) {
|
|
311
|
+
throw new Error(`Global settings already exists at ${settingsPath}`);
|
|
312
|
+
}
|
|
313
|
+
ensureDirExists(stateDir);
|
|
314
|
+
const settings = llm
|
|
315
|
+
? {
|
|
316
|
+
...ONBOARD_SETTINGS,
|
|
317
|
+
llm: {
|
|
318
|
+
...ONBOARD_SETTINGS.llm,
|
|
319
|
+
provider: llm.provider,
|
|
320
|
+
model: llm.model,
|
|
321
|
+
},
|
|
322
|
+
}
|
|
323
|
+
: ONBOARD_SETTINGS;
|
|
324
|
+
atomicWritePrivateFile(settingsPath, JSON.stringify(settings, null, 2));
|
|
325
|
+
return settingsPath;
|
|
326
|
+
}
|
|
327
|
+
export function hasDefinedValue(values) {
|
|
328
|
+
return values !== undefined && Object.values(values).some((value) => value !== undefined);
|
|
329
|
+
}
|
|
330
|
+
export function compactSettingsConfig(config) {
|
|
331
|
+
return {
|
|
332
|
+
...(hasDefinedValue(config.llm) ? { llm: config.llm } : {}),
|
|
333
|
+
...(hasDefinedValue(config.sentry) ? { sentry: config.sentry } : {}),
|
|
334
|
+
...(hasDefinedValue(config.sandbox) ? { sandbox: config.sandbox } : {}),
|
|
335
|
+
...(hasDefinedValue(config.slack) ? { slack: config.slack } : {}),
|
|
336
|
+
...(hasDefinedValue(config.office) ? { office: config.office } : {}),
|
|
337
|
+
// An empty map means "all servers removed".
|
|
338
|
+
...(config.mcpServers !== undefined ? { mcpServers: config.mcpServers } : {}),
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
function patchSettingsConfig(existing, config) {
|
|
342
|
+
const patched = {
|
|
343
|
+
...existing,
|
|
344
|
+
llm: {
|
|
345
|
+
...existing.llm,
|
|
346
|
+
...(config.provider !== undefined ? { provider: config.provider } : {}),
|
|
347
|
+
...(config.model !== undefined ? { model: config.model } : {}),
|
|
348
|
+
...(config.thinkingLevel !== undefined ? { thinkingLevel: config.thinkingLevel } : {}),
|
|
349
|
+
},
|
|
350
|
+
sentry: {
|
|
351
|
+
...existing.sentry,
|
|
352
|
+
...(config.sentryDsn !== undefined ? { dsn: config.sentryDsn } : {}),
|
|
353
|
+
},
|
|
354
|
+
// Leaf-level merge: a patch that only sets sandbox.boost.memory keeps the
|
|
355
|
+
// existing boost.cpus (and every other existing leaf). compactSettingsConfig
|
|
356
|
+
// drops the group entirely when it ends up with no defined values.
|
|
357
|
+
sandbox: mergeSandboxSettings(existing.sandbox, config.sandbox) ?? {},
|
|
358
|
+
slack: {
|
|
359
|
+
...existing.slack,
|
|
360
|
+
...config.slack,
|
|
361
|
+
},
|
|
362
|
+
// Office visibility has its own writer (setOfficeVisibilityOverride); the
|
|
363
|
+
// generic patch must not drop it.
|
|
364
|
+
...(existing.office !== undefined ? { office: existing.office } : {}),
|
|
365
|
+
// The portal edits the full MCP map, and
|
|
366
|
+
// a merge would make removing a server impossible.
|
|
367
|
+
...(config.mcpServers !== undefined ? { mcpServers: config.mcpServers } : {}),
|
|
368
|
+
};
|
|
369
|
+
return compactSettingsConfig(patched);
|
|
370
|
+
}
|
|
371
|
+
function loadSettingsFileForUpdate(settingsPath, defaultSettings) {
|
|
372
|
+
if (!existsSync(settingsPath))
|
|
373
|
+
return defaultSettings;
|
|
374
|
+
try {
|
|
375
|
+
return loadSettingsFile(settingsPath) ?? {};
|
|
376
|
+
}
|
|
377
|
+
catch (err) {
|
|
378
|
+
const detail = err instanceof Error ? err.message : String(err);
|
|
379
|
+
const message = detail.startsWith("Malformed settings file")
|
|
380
|
+
? detail.replace("Malformed settings file", "Refusing to overwrite malformed settings file")
|
|
381
|
+
: detail;
|
|
382
|
+
throw new Error(message, { cause: err });
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
function updateSettingsFile(settingsPath, patch, defaultSettings) {
|
|
386
|
+
const existing = loadSettingsFileForUpdate(settingsPath, defaultSettings);
|
|
387
|
+
ensureDirExists(dirname(settingsPath));
|
|
388
|
+
atomicWritePrivateFile(settingsPath, JSON.stringify(patchSettingsConfig(existing, patch), null, 2));
|
|
389
|
+
}
|
|
390
|
+
export function updateGlobalSettings(patch) {
|
|
391
|
+
updateSettingsFile(getSettingsPath(), patch, ONBOARD_SETTINGS);
|
|
392
|
+
}
|
|
393
|
+
export function updateConversationSettings(office, patch) {
|
|
394
|
+
updateSettingsFile(conversationSettingsPath(office), patch, {});
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* The two scope-level MCP server maps, unmerged: the portal edits each scope's
|
|
398
|
+
* own file, so it needs the raw per-scope values, not the effective merge
|
|
399
|
+
* (`resolveConversationSettings` owns that).
|
|
400
|
+
*/
|
|
401
|
+
export function loadScopeMcpServers(office) {
|
|
402
|
+
return {
|
|
403
|
+
global: loadRawGlobalSettings().mcpServers ?? {},
|
|
404
|
+
conversation: loadSettingsFile(conversationSettingsPath(office))?.mcpServers ?? {},
|
|
405
|
+
};
|
|
406
|
+
}
|
|
407
|
+
/**
|
|
408
|
+
* The conversation's own visibility override, or null when it follows the
|
|
409
|
+
* platform. Only "private" can be stored: an operator may narrow a public
|
|
410
|
+
* channel, never widen a private one (see ADR 0008).
|
|
411
|
+
*/
|
|
412
|
+
export function loadOfficeVisibilityOverride(office) {
|
|
413
|
+
return loadSettingsFile(conversationSettingsPath(office))?.office?.visibility ?? null;
|
|
414
|
+
}
|
|
415
|
+
export function setOfficeVisibilityOverride(office, visibility) {
|
|
416
|
+
const settingsPath = conversationSettingsPath(office);
|
|
417
|
+
const existing = loadSettingsFileForUpdate(settingsPath, {});
|
|
418
|
+
const { office: _previous, ...rest } = existing;
|
|
419
|
+
ensureDirExists(dirname(settingsPath));
|
|
420
|
+
atomicWritePrivateFile(settingsPath, JSON.stringify(compactSettingsConfig({ ...rest, ...(visibility ? { office: { visibility } } : {}) }), null, 2));
|
|
421
|
+
}
|
|
422
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/settings/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAe,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EACL,sBAAsB,EACtB,eAAe,EACf,0BAA0B,GAC3B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,GAAG,MAAM,WAAW,CAAC;AAEjC,MAAM,OAAO,0BAA2B,SAAQ,KAAK;IACnD,YAA4B,YAAoB;QAC9C,KAAK,CAAC,mCAAmC,YAAY,EAAE,CAAC,CAAC;4BAD/B,YAAY;QAEtC,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;IAC3C,CAAC;CACF;AAQD,MAAM,gBAAgB,GAAuB;IAC3C,GAAG,EAAE;QACH,QAAQ,EAAE,WAAW;QACrB,KAAK,EAAE,mBAAmB;QAC1B,aAAa,EAAE,KAAK;KACrB;IACD,KAAK,EAAE;QACL,SAAS,EAAE,WAAW;KACvB;IACD,OAAO,EAAE;QACP,IAAI,EAAE,KAAK;QACX,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE;YACL,IAAI,EAAE,GAAG;YACT,MAAM,EAAE,IAAI;SACb;QACD,mEAAmE;QACnE,qEAAqE;QACrE,kBAAkB,EAAE,EAAE;KACvB;CACF,CAAC;AAEF,MAAM,kBAAkB,GAAG,IAAI,CAAC,MAAM,CAAC;IACrC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAChB,IAAI,CAAC,MAAM,CAAC;QACV,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACtC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACnC,aAAa,EAAE,IAAI,CAAC,QAAQ,CAC1B,IAAI,CAAC,KAAK,CAAC;YACT,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;YACnB,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;YACvB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;YACnB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;YACtB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YACpB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;YACrB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;SACpB,CAAC,CACH;KACF,CAAC,CACH;IACD,MAAM,EAAE,IAAI,CAAC,QAAQ,CACnB,IAAI,CAAC,MAAM,CAAC;QACV,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;KAClC,CAAC,CACH;IACD,KAAK,EAAE,IAAI,CAAC,QAAQ,CAClB,IAAI,CAAC,MAAM,CAAC;QACV,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;KAC1F,CAAC,CACH;IACD;;;;OAIG;IACH,MAAM,EAAE,IAAI,CAAC,QAAQ,CACnB,IAAI,CAAC,MAAM,CAAC;QACV,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;KACnD,CAAC,CACH;IACD,OAAO,EAAE,IAAI,CAAC,QAAQ,CACpB,IAAI,CAAC,MAAM,CAAC;QACV,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QAClC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACpC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAClB,IAAI,CAAC,MAAM,CAAC;YACV,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YAClC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;SACrC,CAAC,CACH;QACD;;;;WAIG;QACH,KAAK,EAAE,IAAI,CAAC,QAAQ,CAClB,IAAI,CAAC,MAAM,CAAC;YACV,cAAc,EAAE,IAAI,CAAC,QAAQ,CAC3B,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAC5D;SACF,CAAC,CACH;QACD,SAAS,EAAE,IAAI,CAAC,QAAQ,CACtB,IAAI,CAAC,MAAM,CAAC;YACV,UAAU,EAAE,IAAI,CAAC,QAAQ,CACvB,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAChE;YACD,MAAM,EAAE,IAAI,CAAC,QAAQ,CACnB,IAAI,CAAC,KAAK,CAAC;gBACT,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC;gBAC5B,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;gBAC9B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;aACrB,CAAC,CACH;YACD,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;SACzF,CAAC,CACH;QACD,kBAAkB,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;KACjD,CAAC,CACH;IACD;;;;;;OAMG;IACH,UAAU,EAAE,IAAI,CAAC,QAAQ,CACvB,IAAI,CAAC,MAAM,CACT,IAAI,CAAC,MAAM,EAAE,EACb,IAAI,CAAC,MAAM,CAAC;QACV,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACrC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9C,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7D,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACjC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACjE,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;KACxC,CAAC,CACH,CACF;CACF,CAAC,CAAC;AAKH,MAAM,UAAU,gBAAgB,CAAC,YAAoB;IACnD,OAAO,0BAA0B,CAAC,YAAY,EAAE,kBAAkB,EAAE,CAAC,MAAM,EAAE,EAAE,CAC7E,MAAM,KAAK,uBAAuB;QAChC,CAAC,CAAC,8BAA8B,YAAY,2CAA2C;QACvF,CAAC,CAAC,8BAA8B,YAAY,KAAK,MAAM,EAAE,CAC5D,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAAC,MAA0B;IACzD,OAAO;QACL,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChF,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvE,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/F,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7E,GAAG,CAAC,MAAM,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,wBAAwB,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9F,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,GAAG,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9E,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,wBAAwB,CAAC,OAA4B;IAC5D,MAAM,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,EAAE,IAAI,EAAE,CAAC;IAC9D,0EAA0E;IAC1E,wEAAwE;IACxE,OAAO;QACL,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnE,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACtD,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAS,oBAAoB,CAC3B,IAAiC,EACjC,QAAqC;IAErC,IAAI,CAAC,IAAI;QAAE,OAAO,QAAQ,CAAC;IAC3B,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3B,OAAO;QACL,GAAG,IAAI;QACP,GAAG,QAAQ;QACX,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACzF,CAAC;AACJ,CAAC;AAED,SAAS,eAAe;IACtB,OAAO,IAAI,CAAC,iBAAiB,EAAE,EAAE,eAAe,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,qBAAqB;IAC5B,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;IACvC,MAAM,MAAM,GAAG,gBAAgB,CAAC,YAAY,CAAC,CAAC;IAC9C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,0BAA0B,CAAC,YAAY,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,aAAa,CAAC,KAAyB,EAAE,IAAY;IAC5D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CACb,oCAAoC,IAAI,oDAAoD,CAC7F,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CAAC,QAA8B;IACnD,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IAClE,MAAM,KAAK,GAAG,aAAa,CAAC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IACzD,MAAM,aAAa,GAAG,aAAa,CAAC,QAAQ,CAAC,aAAa,EAAE,mBAAmB,CAAkB,CAAC;IAClG,MAAM,SAAS,GAAG,aAAa,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;IACjC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;IAC7B,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC;IAEvC,OAAO;QACL,QAAQ;QACR,KAAK;QACL,aAAa;QACb,SAAS;QACT,OAAO;QACP,KAAK;QACL,UAAU;KACX,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB;IAC5B,OAAO,uBAAuB,CAAC,qBAAqB,EAAE,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,aAAa,CAAC,qBAAqB,EAAE,CAAC,CAAC;AAChD,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,wBAAwB,CAAC,MAAc;IACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;IACxD,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,kBAAkB,CAAC,QAAQ,EAAE,4BAA4B,CAAC,CAAC;QAC3D,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IACnC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;IACrD,IAAI,OAAO,GAAG,MAAM,CAAC;IACrB,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,kBAAkB,CAAC,UAAU,EAAE,8BAA8B,CAAC,CAAC;QAC/D,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC5C,qEAAqE;QACrE,yDAAyD;QACzD,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAC7B,QAAQ,GAAG,IAAI,CAAC;IAClB,CAAC;IACD,sBAAsB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC1C,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,CAAC;YACH,MAAM,CAAC,UAAU,CAAC,CAAC;QACrB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,UAAU,CAAC,kDAAkD,UAAU,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9F,CAAC;QACD,GAAG,CAAC,OAAO,CAAC,qDAAqD,QAAQ,EAAE,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY,EAAE,KAAa;IACrD,IAAI,KAAK,CAAC;IACV,IAAI,CAAC;QACH,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,yBAAyB,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IAC3E,CAAC;IACD,IAAI,KAAK,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,wCAAwC,IAAI,EAAE,CAAC,CAAC;IAC1E,CAAC;AACH,CAAC;AAWD,MAAM,eAAe,GAAG,YAAY,CAAC;AACrC,MAAM,mBAAmB,GAAG,gBAAgB,CAAC;AAC7C,MAAM,kBAAkB,GAAuD;IAC7E,EAAE,EAAE,eAAe;IACnB,GAAG,EAAE,mBAAmB;CACzB,CAAC;AAEF,MAAM,UAAU,8BAA8B,CAAC,MAAc;IAC3D,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACpE,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/D,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,MAAc,EAAE,IAAwB;IACpF,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC5B,KAAK,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACxE,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACxC,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;YACxB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;gBAAE,sBAAsB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC1D,CAAC;aAAM,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,CAAC;QACf,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,MAAc;IACxD,MAAM,YAAY,GAAG,qBAAqB,EAAE,CAAC;IAC7C,MAAM,kBAAkB,GAAG,uBAAuB,CAChD,gBAAgB,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CACzD,CAAC;IACF,6EAA6E;IAC7E,qDAAqD;IACrD,MAAM,UAAU,GAAG,EAAE,GAAG,YAAY,CAAC,UAAU,EAAE,GAAG,kBAAkB,CAAC,UAAU,EAAE,CAAC;IACpF,yEAAyE;IACzE,8EAA8E;IAC9E,MAAM,OAAO,GAAG,oBAAoB,CAAC,YAAY,CAAC,OAAO,EAAE,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACvF,OAAO,aAAa,CAAC;QACnB,GAAG,YAAY;QACf,GAAG,kBAAkB;QACrB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/B,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9D,CAAC,CAAC;AACL,CAAC;AAED,6EAA6E;AAC7E,SAAS,aAAa,CAAC,QAA4B;IACjD,OAAO,QAAQ,IAAI,OAAO,CAAC,YAAY,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,MAAM,QAAQ,GAAG,uBAAuB,CAAC,gBAAgB,CAAC,eAAe,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;IACpF,OAAO,aAAa,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,QAAgB,EAAE,GAAsB;IAC/E,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;IACrD,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,qCAAqC,YAAY,EAAE,CAAC,CAAC;IACvE,CAAC;IACD,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC1B,MAAM,QAAQ,GAAuB,GAAG;QACtC,CAAC,CAAC;YACE,GAAG,gBAAgB;YACnB,GAAG,EAAE;gBACH,GAAG,gBAAgB,CAAC,GAAG;gBACvB,QAAQ,EAAE,GAAG,CAAC,QAAQ;gBACtB,KAAK,EAAE,GAAG,CAAC,KAAK;aACjB;SACF;QACH,CAAC,CAAC,gBAAgB,CAAC;IACrB,sBAAsB,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACxE,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAA2C;IACzE,OAAO,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;AAC5F,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAA0B;IAC9D,OAAO;QACL,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvE,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjE,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,4CAA4C;QAC5C,GAAG,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9E,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAC1B,QAA4B,EAC5B,MAA4B;IAE5B,MAAM,OAAO,GAAuB;QAClC,GAAG,QAAQ;QACX,GAAG,EAAE;YACH,GAAG,QAAQ,CAAC,GAAG;YACf,GAAG,CAAC,MAAM,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvE,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9D,GAAG,CAAC,MAAM,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACvF;QACD,MAAM,EAAE;YACN,GAAG,QAAQ,CAAC,MAAM;YAClB,GAAG,CAAC,MAAM,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACrE;QACD,0EAA0E;QAC1E,6EAA6E;QAC7E,mEAAmE;QACnE,OAAO,EAAE,oBAAoB,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE;QACrE,KAAK,EAAE;YACL,GAAG,QAAQ,CAAC,KAAK;YACjB,GAAG,MAAM,CAAC,KAAK;SAChB;QACD,0EAA0E;QAC1E,kCAAkC;QAClC,GAAG,CAAC,QAAQ,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrE,yCAAyC;QACzC,mDAAmD;QACnD,GAAG,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9E,CAAC;IACF,OAAO,qBAAqB,CAAC,OAAO,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,yBAAyB,CAChC,YAAoB,EACpB,eAAmC;IAEnC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,eAAe,CAAC;IACtD,IAAI,CAAC;QACH,OAAO,gBAAgB,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IAC9C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAChE,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,yBAAyB,CAAC;YAC1D,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,yBAAyB,EAAE,+CAA+C,CAAC;YAC5F,CAAC,CAAC,MAAM,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IAC3C,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CACzB,YAAoB,EACpB,KAA2B,EAC3B,eAAmC;IAEnC,MAAM,QAAQ,GAAG,yBAAyB,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;IAC1E,eAAe,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;IACvC,sBAAsB,CACpB,YAAY,EACZ,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAC9D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAA2B;IAC9D,kBAAkB,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,MAAc,EAAE,KAA2B;IACpF,kBAAkB,CAAC,wBAAwB,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;AAClE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAc;IAIhD,OAAO;QACL,MAAM,EAAE,qBAAqB,EAAE,CAAC,UAAU,IAAI,EAAE;QAChD,YAAY,EAAE,gBAAgB,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC,EAAE,UAAU,IAAI,EAAE;KACnF,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,4BAA4B,CAAC,MAAc;IACzD,OAAO,gBAAgB,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,IAAI,IAAI,CAAC;AACxF,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,MAAc,EAAE,UAA4B;IACtF,MAAM,YAAY,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACtD,MAAM,QAAQ,GAAG,yBAAyB,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;IAC7D,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,GAAG,QAAQ,CAAC;IAChD,eAAe,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;IACvC,sBAAsB,CACpB,YAAY,EACZ,IAAI,CAAC,SAAS,CACZ,qBAAqB,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EACrF,IAAI,EACJ,CAAC,CACF,CACF,CAAC;AACJ,CAAC","sourcesContent":["import type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport { Type, type Static } from \"@sinclair/typebox\";\nimport { existsSync, lstatSync, readFileSync, rmSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { effectiveStateDir } from \"../cli/arg-grammar.js\";\nimport { readEnv } from \"../env-manifest.js\";\nimport {\n atomicWritePrivateFile,\n ensureDirExists,\n readJsonSchemaFileIfExists,\n} from \"../file-guards.js\";\nimport * as log from \"../log.js\";\n\nexport class MissingGlobalSettingsError extends Error {\n constructor(public readonly settingsPath: string) {\n super(`Missing global settings file at ${settingsPath}`);\n this.name = \"MissingGlobalSettingsError\";\n }\n}\n\nexport type { AgentConfig, SandboxSettings } from \"../types.js\";\nimport type { AgentConfig, SandboxSettings } from \"../types.js\";\nimport type { McpServerConfig } from \"../harness/types.js\";\nimport type { OnboardLlmChoice } from \"../types.js\";\nimport type { Office } from \"../office/index.js\";\n\nconst ONBOARD_SETTINGS: SettingsFileConfig = {\n llm: {\n provider: \"anthropic\",\n model: \"claude-sonnet-4-6\",\n thinkingLevel: \"off\",\n },\n slack: {\n replyMode: \"top-level\",\n },\n sandbox: {\n cpus: \"0.5\",\n memory: \"1g\",\n boost: {\n cpus: \"2\",\n memory: \"4g\",\n },\n // Office visibility is not a setting here: it follows the platform\n // conversation type (see office/projection resolveOfficeVisibility).\n defaultSharedVault: \"\",\n },\n};\n\nconst SettingsFileSchema = Type.Object({\n llm: Type.Optional(\n Type.Object({\n provider: Type.Optional(Type.String()),\n model: Type.Optional(Type.String()),\n thinkingLevel: Type.Optional(\n Type.Union([\n Type.Literal(\"off\"),\n Type.Literal(\"minimal\"),\n Type.Literal(\"low\"),\n Type.Literal(\"medium\"),\n Type.Literal(\"high\"),\n Type.Literal(\"xhigh\"),\n Type.Literal(\"max\"),\n ]),\n ),\n }),\n ),\n sentry: Type.Optional(\n Type.Object({\n dsn: Type.Optional(Type.String()),\n }),\n ),\n slack: Type.Optional(\n Type.Object({\n replyMode: Type.Optional(Type.Union([Type.Literal(\"top-level\"), Type.Literal(\"thread\")])),\n }),\n ),\n /**\n * Conversation-only office policy. `visibility: \"private\"` marks a\n * platform-public conversation as private; nothing can widen visibility\n * beyond what the platform grants, so \"public\" is never stored here.\n */\n office: Type.Optional(\n Type.Object({\n visibility: Type.Optional(Type.Literal(\"private\")),\n }),\n ),\n sandbox: Type.Optional(\n Type.Object({\n cpus: Type.Optional(Type.String()),\n memory: Type.Optional(Type.String()),\n boost: Type.Optional(\n Type.Object({\n cpus: Type.Optional(Type.String()),\n memory: Type.Optional(Type.String()),\n }),\n ),\n /**\n * Retired door-policy keys (ADR 0008). Still accepted so existing files\n * load, never copied into AgentConfig, and removed by\n * `mikan office migrate-door-policy`.\n */\n image: Type.Optional(\n Type.Object({\n workspaceMount: Type.Optional(\n Type.Union([Type.Literal(\"private\"), Type.Literal(\"full\")]),\n ),\n }),\n ),\n workspace: Type.Optional(\n Type.Object({\n doorPolicy: Type.Optional(\n Type.Union([Type.Literal(\"isolated\"), Type.Literal(\"trusted\")]),\n ),\n layout: Type.Optional(\n Type.Union([\n Type.Literal(\"conversation\"),\n Type.Literal(\"shared-support\"),\n Type.Literal(\"full\"),\n ]),\n ),\n visibility: Type.Optional(Type.Union([Type.Literal(\"public\"), Type.Literal(\"private\")])),\n }),\n ),\n defaultSharedVault: Type.Optional(Type.String()),\n }),\n ),\n /**\n * MCP servers, keyed by name. Merged per key across scopes: a conversation\n * entry overrides (or, with `disabled: true`, turns off) the same-name\n * global entry; other global entries stay available. `open-connector` is an\n * ordinary entry that the host fills in from `OPENCONNECTOR_ENDPOINT` when\n * neither scope declares it (see `src/harness/open-connector.ts`).\n */\n mcpServers: Type.Optional(\n Type.Record(\n Type.String(),\n Type.Object({\n command: Type.Optional(Type.String()),\n args: Type.Optional(Type.Array(Type.String())),\n env: Type.Optional(Type.Record(Type.String(), Type.String())),\n url: Type.Optional(Type.String()),\n headers: Type.Optional(Type.Record(Type.String(), Type.String())),\n disabled: Type.Optional(Type.Boolean()),\n }),\n ),\n ),\n});\n\nexport type SettingsFileConfig = Static<typeof SettingsFileSchema>;\nexport type SandboxFileSettings = NonNullable<SettingsFileConfig[\"sandbox\"]>;\n\nexport function loadSettingsFile(settingsPath: string): SettingsFileConfig | undefined {\n return readJsonSchemaFileIfExists(settingsPath, SettingsFileSchema, (detail) =>\n detail === \"unexpected JSON shape\"\n ? `Malformed settings file at ${settingsPath}: expected a JSON object at the top level`\n : `Malformed settings file at ${settingsPath}: ${detail}`,\n );\n}\n\nfunction normalizeSettingsConfig(config: SettingsFileConfig): Partial<AgentConfig> {\n return {\n ...(config.llm?.provider !== undefined ? { provider: config.llm.provider } : {}),\n ...(config.llm?.model !== undefined ? { model: config.llm.model } : {}),\n ...(config.llm?.thinkingLevel !== undefined ? { thinkingLevel: config.llm.thinkingLevel } : {}),\n ...(config.sentry?.dsn !== undefined ? { sentryDsn: config.sentry.dsn } : {}),\n ...(config.sandbox !== undefined ? { sandbox: normalizeSandboxSettings(config.sandbox) } : {}),\n ...(config.slack !== undefined ? { slack: config.slack } : {}),\n ...(config.mcpServers !== undefined ? { mcpServers: config.mcpServers } : {}),\n };\n}\n\n/**\n * File shape → in-memory shape for the sandbox group. An empty or\n * whitespace-only `defaultSharedVault` means \"no default\" and is dropped;\n * non-empty values are trimmed. Everything else passes through as-is.\n */\nfunction normalizeSandboxSettings(sandbox: SandboxFileSettings): SandboxSettings {\n const defaultSharedVault = sandbox.defaultSharedVault?.trim();\n // Retired `image.workspaceMount` and `workspace` are dropped here: office\n // visibility comes from the platform (ADR 0008), never from these keys.\n return {\n ...(sandbox.cpus !== undefined ? { cpus: sandbox.cpus } : {}),\n ...(sandbox.memory !== undefined ? { memory: sandbox.memory } : {}),\n ...(sandbox.boost !== undefined ? { boost: sandbox.boost } : {}),\n ...(defaultSharedVault ? { defaultSharedVault } : {}),\n };\n}\n\n/**\n * Merge two sandbox settings groups. The merge invariant is LEAF-LEVEL:\n * an override that only sets `sandbox.memory` keeps the base `sandbox.cpus`,\n * and an override that only sets `boost.memory` keeps the base `boost.cpus`\n * (same for `image`). This mirrors how the fields merged when they were\n * flat top-level keys; a group-level spread would silently drop base leaves.\n */\nfunction mergeSandboxSettings(\n base: SandboxSettings | undefined,\n override: SandboxSettings | undefined,\n): SandboxSettings | undefined {\n if (!base) return override;\n if (!override) return base;\n return {\n ...base,\n ...override,\n ...(base.boost || override.boost ? { boost: { ...base.boost, ...override.boost } } : {}),\n };\n}\n\nfunction getSettingsPath(): string {\n return join(effectiveStateDir(), \"settings.json\");\n}\n\nfunction requireGlobalSettings(): SettingsFileConfig {\n const settingsPath = getSettingsPath();\n const config = loadSettingsFile(settingsPath);\n if (!config) {\n throw new MissingGlobalSettingsError(settingsPath);\n }\n return config;\n}\n\nfunction requireString(value: string | undefined, path: string): string {\n if (!value) {\n throw new Error(\n `Missing required global setting: ${path}. Run \\`mikan --onboard\\` to create settings.json.`,\n );\n }\n return value;\n}\n\nfunction toAgentConfig(fromFile: Partial<AgentConfig>): AgentConfig {\n const provider = requireString(fromFile.provider, \"llm.provider\");\n const model = requireString(fromFile.model, \"llm.model\");\n const thinkingLevel = requireString(fromFile.thinkingLevel, \"llm.thinkingLevel\") as ThinkingLevel;\n const sentryDsn = sentryDsnFrom(fromFile.sentryDsn);\n const sandbox = fromFile.sandbox;\n const slack = fromFile.slack;\n const mcpServers = fromFile.mcpServers;\n\n return {\n provider,\n model,\n thinkingLevel,\n sentryDsn,\n sandbox,\n slack,\n mcpServers,\n };\n}\n\nfunction loadRawGlobalSettings(): Partial<AgentConfig> {\n return normalizeSettingsConfig(requireGlobalSettings());\n}\n\nexport function loadGlobalSettings(): AgentConfig {\n return toAgentConfig(loadRawGlobalSettings());\n}\n\n/**\n * Host-authoritative location of a conversation's settings file:\n * `<office state dir>/settings.json`. The Office value names both the\n * state-dir key and the legacy pre-host-migration location (its workspace\n * dir) — the key is never inferred from a directory basename.\n *\n * Conversation settings used to live at `<conversationDir>/settings.json`,\n * but conversation dirs are bind-mounted read-write into sandbox containers\n * in image mode — code inside the sandbox could edit its own settings.json\n * and flip `sandbox.image.workspaceMount` to \"full\", remounting the entire\n * workspace into its container (cross-conversation access). Settings are an\n * administrator surface, so they live under the host-only state dir.\n *\n * Migration: on first access per conversation, a legacy\n * `<conversationDir>/settings.json` is moved here. The new file's existence\n * (an empty `{}` is written when there is nothing to migrate) is the\n * migration marker — a legacy file (re)appearing later, e.g. planted from\n * inside the sandbox, is never read again.\n */\nexport function conversationSettingsPath(office: Office): string {\n const hostPath = join(office.stateDir, \"settings.json\");\n if (existsSync(hostPath)) {\n assertSettingsFile(hostPath, \"Host conversation settings\");\n return hostPath;\n }\n\n ensureDirExists(dirname(hostPath));\n const legacyPath = join(office.dir, \"settings.json\");\n let content = \"{}\\n\";\n let migrated = false;\n if (existsSync(legacyPath)) {\n assertSettingsFile(legacyPath, \"Legacy conversation settings\");\n content = readFileSync(legacyPath, \"utf-8\");\n // Validate before moving the file. A malformed legacy file must fail\n // closed and remain available for an operator to repair.\n loadSettingsFile(legacyPath);\n migrated = true;\n }\n atomicWritePrivateFile(hostPath, content);\n if (migrated) {\n try {\n rmSync(legacyPath);\n } catch (err) {\n log.logWarning(`Could not remove legacy conversation settings: ${legacyPath}`, String(err));\n }\n log.logInfo(`Migrated conversation settings to host-only path: ${hostPath}`);\n }\n return hostPath;\n}\n\nfunction assertSettingsFile(path: string, label: string): void {\n let stats;\n try {\n stats = lstatSync(path);\n } catch (err) {\n throw new Error(`${label} cannot be inspected: ${path}`, { cause: err });\n }\n if (stats.isSymbolicLink() || !stats.isFile()) {\n throw new Error(`${label} must be a regular non-symlink file: ${path}`);\n }\n}\n\n/**\n * Auto-reply is tri-state: `off` (default, must mention mikan), `on`\n * (every message in the channel is addressed), `jev` (Jev decides per\n * message whether it addresses mikan). Exactly one marker file exists at a\n * time; its absence means `off`. Markers are mutually exclusive so callers\n * cannot read a self-contradictory state.\n */\nexport type SlackAutoReplyMode = \"off\" | \"on\" | \"jev\";\n\nconst AUTO_REPLY_FILE = \"auto-reply\";\nconst AUTO_REPLY_JEV_FILE = \"auto-reply.jev\";\nconst AUTO_REPLY_MARKERS: Record<Exclude<SlackAutoReplyMode, \"off\">, string> = {\n on: AUTO_REPLY_FILE,\n jev: AUTO_REPLY_JEV_FILE,\n};\n\nexport function slackConversationAutoReplyMode(office: Office): SlackAutoReplyMode {\n if (existsSync(join(office.dir, AUTO_REPLY_JEV_FILE))) return \"jev\";\n if (existsSync(join(office.dir, AUTO_REPLY_FILE))) return \"on\";\n return \"off\";\n}\n\nexport function setSlackConversationAutoReply(office: Office, mode: SlackAutoReplyMode): void {\n ensureDirExists(office.dir);\n for (const [markerMode, fileName] of Object.entries(AUTO_REPLY_MARKERS)) {\n const path = join(office.dir, fileName);\n if (markerMode === mode) {\n if (!existsSync(path)) atomicWritePrivateFile(path, \"\");\n } else if (existsSync(path)) {\n rmSync(path);\n }\n }\n}\n\nexport function resolveConversationSettings(office: Office): AgentConfig {\n const globalConfig = loadRawGlobalSettings();\n const conversationConfig = normalizeSettingsConfig(\n loadSettingsFile(conversationSettingsPath(office)) ?? {},\n );\n // MCP servers merge per key: a conversation redefines or disables individual\n // servers without losing the rest of the global set.\n const mcpServers = { ...globalConfig.mcpServers, ...conversationConfig.mcpServers };\n // The sandbox group merges at the leaf level (see mergeSandboxSettings):\n // a conversation that only sets sandbox.memory keeps the global sandbox.cpus.\n const sandbox = mergeSandboxSettings(globalConfig.sandbox, conversationConfig.sandbox);\n return toAgentConfig({\n ...globalConfig,\n ...conversationConfig,\n ...(sandbox ? { sandbox } : {}),\n ...(Object.keys(mcpServers).length > 0 ? { mcpServers } : {}),\n });\n}\n\n/** Settings-file DSN wins over SENTRY_DSN env — the rule lives only here. */\nfunction sentryDsnFrom(fromFile: string | undefined): string | undefined {\n return fromFile || readEnv(\"SENTRY_DSN\");\n}\n\nexport function resolveSentryDsn(): string | undefined {\n const fromFile = normalizeSettingsConfig(loadSettingsFile(getSettingsPath()) ?? {});\n return sentryDsnFrom(fromFile.sentryDsn);\n}\n\nexport function createGlobalSettingsFile(stateDir: string, llm?: OnboardLlmChoice): string {\n const settingsPath = join(stateDir, \"settings.json\");\n if (existsSync(settingsPath)) {\n throw new Error(`Global settings already exists at ${settingsPath}`);\n }\n ensureDirExists(stateDir);\n const settings: SettingsFileConfig = llm\n ? {\n ...ONBOARD_SETTINGS,\n llm: {\n ...ONBOARD_SETTINGS.llm,\n provider: llm.provider,\n model: llm.model,\n },\n }\n : ONBOARD_SETTINGS;\n atomicWritePrivateFile(settingsPath, JSON.stringify(settings, null, 2));\n return settingsPath;\n}\n\nexport function hasDefinedValue(values: Record<string, unknown> | undefined): boolean {\n return values !== undefined && Object.values(values).some((value) => value !== undefined);\n}\n\nexport function compactSettingsConfig(config: SettingsFileConfig): SettingsFileConfig {\n return {\n ...(hasDefinedValue(config.llm) ? { llm: config.llm } : {}),\n ...(hasDefinedValue(config.sentry) ? { sentry: config.sentry } : {}),\n ...(hasDefinedValue(config.sandbox) ? { sandbox: config.sandbox } : {}),\n ...(hasDefinedValue(config.slack) ? { slack: config.slack } : {}),\n ...(hasDefinedValue(config.office) ? { office: config.office } : {}),\n // An empty map means \"all servers removed\".\n ...(config.mcpServers !== undefined ? { mcpServers: config.mcpServers } : {}),\n };\n}\n\nfunction patchSettingsConfig(\n existing: SettingsFileConfig,\n config: Partial<AgentConfig>,\n): SettingsFileConfig {\n const patched: SettingsFileConfig = {\n ...existing,\n llm: {\n ...existing.llm,\n ...(config.provider !== undefined ? { provider: config.provider } : {}),\n ...(config.model !== undefined ? { model: config.model } : {}),\n ...(config.thinkingLevel !== undefined ? { thinkingLevel: config.thinkingLevel } : {}),\n },\n sentry: {\n ...existing.sentry,\n ...(config.sentryDsn !== undefined ? { dsn: config.sentryDsn } : {}),\n },\n // Leaf-level merge: a patch that only sets sandbox.boost.memory keeps the\n // existing boost.cpus (and every other existing leaf). compactSettingsConfig\n // drops the group entirely when it ends up with no defined values.\n sandbox: mergeSandboxSettings(existing.sandbox, config.sandbox) ?? {},\n slack: {\n ...existing.slack,\n ...config.slack,\n },\n // Office visibility has its own writer (setOfficeVisibilityOverride); the\n // generic patch must not drop it.\n ...(existing.office !== undefined ? { office: existing.office } : {}),\n // The portal edits the full MCP map, and\n // a merge would make removing a server impossible.\n ...(config.mcpServers !== undefined ? { mcpServers: config.mcpServers } : {}),\n };\n return compactSettingsConfig(patched);\n}\n\nfunction loadSettingsFileForUpdate(\n settingsPath: string,\n defaultSettings: SettingsFileConfig,\n): SettingsFileConfig {\n if (!existsSync(settingsPath)) return defaultSettings;\n try {\n return loadSettingsFile(settingsPath) ?? {};\n } catch (err) {\n const detail = err instanceof Error ? err.message : String(err);\n const message = detail.startsWith(\"Malformed settings file\")\n ? detail.replace(\"Malformed settings file\", \"Refusing to overwrite malformed settings file\")\n : detail;\n throw new Error(message, { cause: err });\n }\n}\n\nfunction updateSettingsFile(\n settingsPath: string,\n patch: Partial<AgentConfig>,\n defaultSettings: SettingsFileConfig,\n): void {\n const existing = loadSettingsFileForUpdate(settingsPath, defaultSettings);\n ensureDirExists(dirname(settingsPath));\n atomicWritePrivateFile(\n settingsPath,\n JSON.stringify(patchSettingsConfig(existing, patch), null, 2),\n );\n}\n\nexport function updateGlobalSettings(patch: Partial<AgentConfig>): void {\n updateSettingsFile(getSettingsPath(), patch, ONBOARD_SETTINGS);\n}\n\nexport function updateConversationSettings(office: Office, patch: Partial<AgentConfig>): void {\n updateSettingsFile(conversationSettingsPath(office), patch, {});\n}\n\n/**\n * The two scope-level MCP server maps, unmerged: the portal edits each scope's\n * own file, so it needs the raw per-scope values, not the effective merge\n * (`resolveConversationSettings` owns that).\n */\nexport function loadScopeMcpServers(office: Office): {\n global: Record<string, McpServerConfig>;\n conversation: Record<string, McpServerConfig>;\n} {\n return {\n global: loadRawGlobalSettings().mcpServers ?? {},\n conversation: loadSettingsFile(conversationSettingsPath(office))?.mcpServers ?? {},\n };\n}\n\n/**\n * The conversation's own visibility override, or null when it follows the\n * platform. Only \"private\" can be stored: an operator may narrow a public\n * channel, never widen a private one (see ADR 0008).\n */\nexport function loadOfficeVisibilityOverride(office: Office): \"private\" | null {\n return loadSettingsFile(conversationSettingsPath(office))?.office?.visibility ?? null;\n}\n\nexport function setOfficeVisibilityOverride(office: Office, visibility: \"private\" | null): void {\n const settingsPath = conversationSettingsPath(office);\n const existing = loadSettingsFileForUpdate(settingsPath, {});\n const { office: _previous, ...rest } = existing;\n ensureDirExists(dirname(settingsPath));\n atomicWritePrivateFile(\n settingsPath,\n JSON.stringify(\n compactSettingsConfig({ ...rest, ...(visibility ? { office: { visibility } } : {}) }),\n null,\n 2,\n ),\n );\n}\n"]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type Workspace } from "../office/index.js";
|
|
2
|
+
import type { OfficeKey } from "../types.js";
|
|
3
|
+
export interface DoorPolicyMigrationReport {
|
|
4
|
+
/** Retired keys removed from the global settings file. */
|
|
5
|
+
global: string[];
|
|
6
|
+
conversations: {
|
|
7
|
+
key: OfficeKey;
|
|
8
|
+
removed: string[];
|
|
9
|
+
visibility?: "private";
|
|
10
|
+
}[];
|
|
11
|
+
skipped: {
|
|
12
|
+
key: OfficeKey | "global";
|
|
13
|
+
reason: string;
|
|
14
|
+
}[];
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* One-time removal of the retired door-policy settings from the global file
|
|
18
|
+
* and every registered office (ADR 0008). Run with the daemon stopped.
|
|
19
|
+
*/
|
|
20
|
+
export declare function migrateLegacyDoorPolicy(workspace: Workspace): DoorPolicyMigrationReport;
|
|
21
|
+
//# sourceMappingURL=migrate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/settings/migrate.ts"],"names":[],"mappings":"AAOA,OAAO,EAAyB,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAS7C,MAAM,WAAW,yBAAyB;IACxC,0DAA0D;IAC1D,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,aAAa,EAAE;QAAE,GAAG,EAAE,SAAS,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,UAAU,CAAC,EAAE,SAAS,CAAA;KAAE,EAAE,CAAC;IAC/E,OAAO,EAAE;QAAE,GAAG,EAAE,SAAS,GAAG,QAAQ,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC1D;AA8CD;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,SAAS,GAAG,yBAAyB,CA4BvF"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One-time settings migrations run by `mikan office …` with the daemon
|
|
3
|
+
* stopped. Runtime code never imports this file.
|
|
4
|
+
*/
|
|
5
|
+
import { existsSync } from "node:fs";
|
|
6
|
+
import { join } from "node:path";
|
|
7
|
+
import { atomicWritePrivateFile } from "../file-guards.js";
|
|
8
|
+
import { listRegisteredOffices } from "../office/index.js";
|
|
9
|
+
import { compactSettingsConfig, hasDefinedValue, loadSettingsFile, } from "./index.js";
|
|
10
|
+
const RETIRED_KEYS = {
|
|
11
|
+
image: "sandbox.image.workspaceMount",
|
|
12
|
+
workspace: "sandbox.workspace",
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Strip the retired door-policy keys from one settings file. Returns the
|
|
16
|
+
* removed key paths, or an empty list when nothing had to change (the file is
|
|
17
|
+
* then left byte-for-byte alone, which also preserves `{}` migration markers).
|
|
18
|
+
* The only value carried forward is an explicit shared-support `private`
|
|
19
|
+
* visibility, which maps onto `office.visibility` (ADR 0008). Every other
|
|
20
|
+
* retired combination — `full`, `isolated`, legacy `private` — is dropped
|
|
21
|
+
* without deriving a grant.
|
|
22
|
+
*/
|
|
23
|
+
function stripRetiredDoorPolicy(settingsPath, allowVisibilityCarry) {
|
|
24
|
+
const existing = loadSettingsFile(settingsPath);
|
|
25
|
+
if (!existing?.sandbox)
|
|
26
|
+
return { removed: [] };
|
|
27
|
+
const { image, workspace, ...sandboxRest } = existing.sandbox;
|
|
28
|
+
const removed = [];
|
|
29
|
+
if (image?.workspaceMount !== undefined)
|
|
30
|
+
removed.push(RETIRED_KEYS.image);
|
|
31
|
+
if (workspace !== undefined)
|
|
32
|
+
removed.push(RETIRED_KEYS.workspace);
|
|
33
|
+
if (removed.length === 0)
|
|
34
|
+
return { removed };
|
|
35
|
+
const carry = allowVisibilityCarry &&
|
|
36
|
+
workspace?.doorPolicy === "trusted" &&
|
|
37
|
+
workspace.layout !== "full" &&
|
|
38
|
+
workspace.visibility === "private";
|
|
39
|
+
const { workspaceMount: _mount, ...imageRest } = image ?? {};
|
|
40
|
+
const sandbox = {
|
|
41
|
+
...sandboxRest,
|
|
42
|
+
...(hasDefinedValue(imageRest) ? { image: imageRest } : {}),
|
|
43
|
+
};
|
|
44
|
+
const next = {
|
|
45
|
+
...existing,
|
|
46
|
+
sandbox,
|
|
47
|
+
...(carry ? { office: { ...existing.office, visibility: "private" } } : {}),
|
|
48
|
+
};
|
|
49
|
+
atomicWritePrivateFile(settingsPath, JSON.stringify(compactSettingsConfig(next), null, 2));
|
|
50
|
+
return { removed, ...(carry ? { visibility: "private" } : {}) };
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* One-time removal of the retired door-policy settings from the global file
|
|
54
|
+
* and every registered office (ADR 0008). Run with the daemon stopped.
|
|
55
|
+
*/
|
|
56
|
+
export function migrateLegacyDoorPolicy(workspace) {
|
|
57
|
+
const report = { global: [], conversations: [], skipped: [] };
|
|
58
|
+
try {
|
|
59
|
+
report.global = stripRetiredDoorPolicy(join(workspace.stateDir, "settings.json"), false).removed;
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
report.skipped.push({
|
|
63
|
+
key: "global",
|
|
64
|
+
reason: error instanceof Error ? error.message : String(error),
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
for (const record of listRegisteredOffices(workspace.stateDir)) {
|
|
68
|
+
const office = workspace.office(record);
|
|
69
|
+
const settingsPath = join(office.stateDir, "settings.json");
|
|
70
|
+
if (!existsSync(settingsPath))
|
|
71
|
+
continue;
|
|
72
|
+
try {
|
|
73
|
+
const result = stripRetiredDoorPolicy(settingsPath, true);
|
|
74
|
+
if (result.removed.length > 0)
|
|
75
|
+
report.conversations.push({ key: office.key, ...result });
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
report.skipped.push({
|
|
79
|
+
key: office.key,
|
|
80
|
+
reason: error instanceof Error ? error.message : String(error),
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return report;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=migrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/settings/migrate.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * One-time settings migrations run by `mikan office …` with the daemon\n * stopped. Runtime code never imports this file.\n */\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { atomicWritePrivateFile } from \"../file-guards.js\";\nimport { listRegisteredOffices, type Workspace } from \"../office/index.js\";\nimport type { OfficeKey } from \"../types.js\";\nimport {\n compactSettingsConfig,\n hasDefinedValue,\n loadSettingsFile,\n type SandboxFileSettings,\n type SettingsFileConfig,\n} from \"./index.js\";\n\nexport interface DoorPolicyMigrationReport {\n /** Retired keys removed from the global settings file. */\n global: string[];\n conversations: { key: OfficeKey; removed: string[]; visibility?: \"private\" }[];\n skipped: { key: OfficeKey | \"global\"; reason: string }[];\n}\n\nconst RETIRED_KEYS = {\n image: \"sandbox.image.workspaceMount\",\n workspace: \"sandbox.workspace\",\n} as const;\n\n/**\n * Strip the retired door-policy keys from one settings file. Returns the\n * removed key paths, or an empty list when nothing had to change (the file is\n * then left byte-for-byte alone, which also preserves `{}` migration markers).\n * The only value carried forward is an explicit shared-support `private`\n * visibility, which maps onto `office.visibility` (ADR 0008). Every other\n * retired combination — `full`, `isolated`, legacy `private` — is dropped\n * without deriving a grant.\n */\nfunction stripRetiredDoorPolicy(\n settingsPath: string,\n allowVisibilityCarry: boolean,\n): { removed: string[]; visibility?: \"private\" } {\n const existing = loadSettingsFile(settingsPath);\n if (!existing?.sandbox) return { removed: [] };\n const { image, workspace, ...sandboxRest } = existing.sandbox;\n const removed: string[] = [];\n if (image?.workspaceMount !== undefined) removed.push(RETIRED_KEYS.image);\n if (workspace !== undefined) removed.push(RETIRED_KEYS.workspace);\n if (removed.length === 0) return { removed };\n const carry =\n allowVisibilityCarry &&\n workspace?.doorPolicy === \"trusted\" &&\n workspace.layout !== \"full\" &&\n workspace.visibility === \"private\";\n const { workspaceMount: _mount, ...imageRest } = image ?? {};\n const sandbox: SandboxFileSettings = {\n ...sandboxRest,\n ...(hasDefinedValue(imageRest) ? { image: imageRest } : {}),\n };\n const next: SettingsFileConfig = {\n ...existing,\n sandbox,\n ...(carry ? { office: { ...existing.office, visibility: \"private\" as const } } : {}),\n };\n atomicWritePrivateFile(settingsPath, JSON.stringify(compactSettingsConfig(next), null, 2));\n return { removed, ...(carry ? { visibility: \"private\" as const } : {}) };\n}\n\n/**\n * One-time removal of the retired door-policy settings from the global file\n * and every registered office (ADR 0008). Run with the daemon stopped.\n */\nexport function migrateLegacyDoorPolicy(workspace: Workspace): DoorPolicyMigrationReport {\n const report: DoorPolicyMigrationReport = { global: [], conversations: [], skipped: [] };\n try {\n report.global = stripRetiredDoorPolicy(\n join(workspace.stateDir, \"settings.json\"),\n false,\n ).removed;\n } catch (error) {\n report.skipped.push({\n key: \"global\",\n reason: error instanceof Error ? error.message : String(error),\n });\n }\n for (const record of listRegisteredOffices(workspace.stateDir)) {\n const office = workspace.office(record);\n const settingsPath = join(office.stateDir, \"settings.json\");\n if (!existsSync(settingsPath)) continue;\n try {\n const result = stripRetiredDoorPolicy(settingsPath, true);\n if (result.removed.length > 0) report.conversations.push({ key: office.key, ...result });\n } catch (error) {\n report.skipped.push({\n key: office.key,\n reason: error instanceof Error ? error.message : String(error),\n });\n }\n }\n return report;\n}\n"]}
|