@geminixiang/mikan 1.0.0-beta.76 → 1.0.0-beta.78
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +39 -0
- package/dist/adapters/commands/login.d.ts.map +1 -1
- package/dist/adapters/commands/login.js +0 -9
- package/dist/adapters/commands/login.js.map +1 -1
- package/dist/adapters/commands/manifest.d.ts +0 -19
- package/dist/adapters/commands/manifest.d.ts.map +1 -1
- package/dist/adapters/commands/manifest.js +0 -34
- package/dist/adapters/commands/manifest.js.map +1 -1
- package/dist/adapters/commands/model.d.ts +0 -5
- package/dist/adapters/commands/model.d.ts.map +1 -1
- package/dist/adapters/commands/model.js +0 -5
- package/dist/adapters/commands/model.js.map +1 -1
- package/dist/adapters/commands/new.d.ts.map +1 -1
- package/dist/adapters/commands/new.js +0 -2
- package/dist/adapters/commands/new.js.map +1 -1
- package/dist/adapters/commands/registry.d.ts +0 -1
- package/dist/adapters/commands/registry.d.ts.map +1 -1
- package/dist/adapters/commands/registry.js +0 -8
- package/dist/adapters/commands/registry.js.map +1 -1
- package/dist/adapters/commands/session-view.d.ts.map +1 -1
- package/dist/adapters/commands/session-view.js +0 -2
- package/dist/adapters/commands/session-view.js.map +1 -1
- package/dist/adapters/commands/types.d.ts +0 -29
- package/dist/adapters/commands/types.d.ts.map +1 -1
- package/dist/adapters/commands/types.js.map +1 -1
- package/dist/adapters/commands/utils.d.ts +0 -3
- package/dist/adapters/commands/utils.d.ts.map +1 -1
- package/dist/adapters/commands/utils.js +0 -3
- package/dist/adapters/commands/utils.js.map +1 -1
- package/dist/adapters/discord/bot.d.ts +0 -4
- package/dist/adapters/discord/bot.d.ts.map +1 -1
- package/dist/adapters/discord/bot.js +5 -41
- package/dist/adapters/discord/bot.js.map +1 -1
- package/dist/adapters/discord/components.d.ts +0 -23
- package/dist/adapters/discord/components.d.ts.map +1 -1
- package/dist/adapters/discord/components.js +0 -23
- package/dist/adapters/discord/components.js.map +1 -1
- package/dist/adapters/discord/context.d.ts.map +1 -1
- package/dist/adapters/discord/context.js +1 -11
- package/dist/adapters/discord/context.js.map +1 -1
- package/dist/adapters/discord/format.d.ts +0 -1
- package/dist/adapters/discord/format.d.ts.map +1 -1
- package/dist/adapters/discord/format.js +0 -37
- package/dist/adapters/discord/format.js.map +1 -1
- package/dist/adapters/github/bot.d.ts +0 -44
- package/dist/adapters/github/bot.d.ts.map +1 -1
- package/dist/adapters/github/bot.js +1 -120
- package/dist/adapters/github/bot.js.map +1 -1
- package/dist/adapters/github/client.d.ts +0 -57
- package/dist/adapters/github/client.d.ts.map +1 -1
- package/dist/adapters/github/client.js +0 -59
- package/dist/adapters/github/client.js.map +1 -1
- package/dist/adapters/github/context.d.ts.map +1 -1
- package/dist/adapters/github/context.js +1 -8
- package/dist/adapters/github/context.js.map +1 -1
- package/dist/adapters/github/github-ops.d.ts +0 -55
- package/dist/adapters/github/github-ops.d.ts.map +1 -1
- package/dist/adapters/github/github-ops.js +0 -59
- package/dist/adapters/github/github-ops.js.map +1 -1
- package/dist/adapters/github/ids.d.ts +0 -27
- package/dist/adapters/github/ids.d.ts.map +1 -1
- package/dist/adapters/github/ids.js +0 -29
- package/dist/adapters/github/ids.js.map +1 -1
- package/dist/adapters/github/repo.d.ts +0 -25
- package/dist/adapters/github/repo.d.ts.map +1 -1
- package/dist/adapters/github/repo.js +0 -49
- package/dist/adapters/github/repo.js.map +1 -1
- package/dist/adapters/github/tool-pack.d.ts +0 -10
- package/dist/adapters/github/tool-pack.d.ts.map +1 -1
- package/dist/adapters/github/tool-pack.js +0 -10
- package/dist/adapters/github/tool-pack.js.map +1 -1
- package/dist/adapters/github/tools/checks.d.ts +0 -6
- package/dist/adapters/github/tools/checks.d.ts.map +1 -1
- package/dist/adapters/github/tools/checks.js +0 -7
- package/dist/adapters/github/tools/checks.js.map +1 -1
- package/dist/adapters/github/tools/issue.d.ts +0 -5
- package/dist/adapters/github/tools/issue.d.ts.map +1 -1
- package/dist/adapters/github/tools/issue.js +0 -5
- package/dist/adapters/github/tools/issue.js.map +1 -1
- package/dist/adapters/github/tools/pr.d.ts +0 -7
- package/dist/adapters/github/tools/pr.d.ts.map +1 -1
- package/dist/adapters/github/tools/pr.js +0 -7
- package/dist/adapters/github/tools/pr.js.map +1 -1
- package/dist/adapters/github/tools/read.d.ts +0 -6
- package/dist/adapters/github/tools/read.d.ts.map +1 -1
- package/dist/adapters/github/tools/read.js +0 -8
- package/dist/adapters/github/tools/read.js.map +1 -1
- package/dist/adapters/github/tools/review-reply.d.ts +0 -5
- package/dist/adapters/github/tools/review-reply.d.ts.map +1 -1
- package/dist/adapters/github/tools/review-reply.js +0 -5
- package/dist/adapters/github/tools/review-reply.js.map +1 -1
- package/dist/adapters/github/tools/sync.d.ts +0 -6
- package/dist/adapters/github/tools/sync.d.ts.map +1 -1
- package/dist/adapters/github/tools/sync.js +0 -6
- package/dist/adapters/github/tools/sync.js.map +1 -1
- package/dist/adapters/github/types.d.ts +0 -88
- package/dist/adapters/github/types.d.ts.map +1 -1
- package/dist/adapters/github/types.js.map +1 -1
- package/dist/adapters/github/webhook.d.ts +0 -13
- package/dist/adapters/github/webhook.d.ts.map +1 -1
- package/dist/adapters/github/webhook.js +0 -16
- package/dist/adapters/github/webhook.js.map +1 -1
- package/dist/adapters/index.d.ts +3 -4
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +4 -4
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/intake.d.ts +0 -17
- package/dist/adapters/intake.d.ts.map +1 -1
- package/dist/adapters/intake.js +6 -32
- package/dist/adapters/intake.js.map +1 -1
- package/dist/adapters/markdown-tables.d.ts +0 -10
- package/dist/adapters/markdown-tables.d.ts.map +1 -1
- package/dist/adapters/markdown-tables.js +1 -42
- package/dist/adapters/markdown-tables.js.map +1 -1
- package/dist/adapters/progressive-renderer.d.ts.map +1 -1
- package/dist/adapters/progressive-renderer.js +3 -25
- package/dist/adapters/progressive-renderer.js.map +1 -1
- package/dist/adapters/shared.d.ts +0 -57
- package/dist/adapters/shared.d.ts.map +1 -1
- package/dist/adapters/shared.js +0 -71
- package/dist/adapters/shared.js.map +1 -1
- package/dist/adapters/slack/assistant.d.ts +0 -49
- package/dist/adapters/slack/assistant.d.ts.map +1 -1
- package/dist/adapters/slack/assistant.js +0 -97
- package/dist/adapters/slack/assistant.js.map +1 -1
- package/dist/adapters/slack/auto-reply-context.d.ts +0 -7
- package/dist/adapters/slack/auto-reply-context.d.ts.map +1 -1
- package/dist/adapters/slack/auto-reply-context.js +0 -7
- package/dist/adapters/slack/auto-reply-context.js.map +1 -1
- package/dist/adapters/slack/blocks.d.ts +0 -9
- package/dist/adapters/slack/blocks.d.ts.map +1 -1
- package/dist/adapters/slack/blocks.js +0 -20
- package/dist/adapters/slack/blocks.js.map +1 -1
- package/dist/adapters/slack/bot.d.ts +0 -116
- package/dist/adapters/slack/bot.d.ts.map +1 -1
- package/dist/adapters/slack/bot.js +7 -231
- package/dist/adapters/slack/bot.js.map +1 -1
- package/dist/adapters/slack/context.d.ts.map +1 -1
- package/dist/adapters/slack/context.js +1 -3
- package/dist/adapters/slack/context.js.map +1 -1
- package/dist/adapters/slack/jev-context.d.ts +0 -13
- package/dist/adapters/slack/jev-context.d.ts.map +1 -1
- package/dist/adapters/slack/jev-context.js +0 -12
- package/dist/adapters/slack/jev-context.js.map +1 -1
- package/dist/adapters/slack/markdown.d.ts +0 -1
- package/dist/adapters/slack/markdown.d.ts.map +1 -1
- package/dist/adapters/slack/markdown.js +0 -5
- package/dist/adapters/slack/markdown.js.map +1 -1
- package/dist/adapters/slack/persona.d.ts +0 -9
- package/dist/adapters/slack/persona.d.ts.map +1 -1
- package/dist/adapters/slack/persona.js +0 -9
- package/dist/adapters/slack/persona.js.map +1 -1
- package/dist/adapters/slack/response-lifecycle.d.ts.map +1 -1
- package/dist/adapters/slack/response-lifecycle.js +1 -45
- package/dist/adapters/slack/response-lifecycle.js.map +1 -1
- package/dist/adapters/slack/session.d.ts +2 -1
- package/dist/adapters/slack/session.d.ts.map +1 -1
- package/dist/adapters/slack/session.js +2 -2
- package/dist/adapters/slack/session.js.map +1 -1
- package/dist/adapters/slack/stream-limits.d.ts +0 -25
- package/dist/adapters/slack/stream-limits.d.ts.map +1 -1
- package/dist/adapters/slack/stream-limits.js +0 -34
- package/dist/adapters/slack/stream-limits.js.map +1 -1
- package/dist/adapters/slack/task-intent.d.ts +0 -13
- package/dist/adapters/slack/task-intent.d.ts.map +1 -1
- package/dist/adapters/slack/task-intent.js +0 -7
- package/dist/adapters/slack/task-intent.js.map +1 -1
- package/dist/adapters/slack/task-status.d.ts +0 -1
- package/dist/adapters/slack/task-status.d.ts.map +1 -1
- package/dist/adapters/slack/task-status.js +1 -9
- package/dist/adapters/slack/task-status.js.map +1 -1
- package/dist/adapters/slack/tool-pack.d.ts +0 -6
- package/dist/adapters/slack/tool-pack.d.ts.map +1 -1
- package/dist/adapters/slack/tool-pack.js +0 -6
- package/dist/adapters/slack/tool-pack.js.map +1 -1
- package/dist/adapters/slack/tools/blockkit.d.ts.map +1 -1
- package/dist/adapters/slack/tools/blockkit.js +0 -11
- package/dist/adapters/slack/tools/blockkit.js.map +1 -1
- package/dist/adapters/slack/types.d.ts +0 -19
- package/dist/adapters/slack/types.d.ts.map +1 -1
- package/dist/adapters/slack/types.js.map +1 -1
- package/dist/adapters/slack/update-diagnostics.d.ts +0 -1
- package/dist/adapters/slack/update-diagnostics.d.ts.map +1 -1
- package/dist/adapters/slack/update-diagnostics.js +1 -7
- package/dist/adapters/slack/update-diagnostics.js.map +1 -1
- package/dist/adapters/telegram/bot.d.ts +0 -6
- package/dist/adapters/telegram/bot.d.ts.map +1 -1
- package/dist/adapters/telegram/bot.js +1 -50
- package/dist/adapters/telegram/bot.js.map +1 -1
- package/dist/adapters/telegram/context.d.ts.map +1 -1
- package/dist/adapters/telegram/context.js +1 -8
- package/dist/adapters/telegram/context.js.map +1 -1
- package/dist/adapters/types.d.ts +0 -57
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/adapters/types.js.map +1 -1
- package/dist/adapters/web/admin/client-assets.d.ts +4 -0
- package/dist/adapters/web/admin/client-assets.d.ts.map +1 -0
- package/dist/adapters/web/admin/client-assets.js +1765 -0
- package/dist/adapters/web/admin/client-assets.js.map +1 -0
- package/dist/adapters/web/admin/portal.d.ts +0 -10
- package/dist/adapters/web/admin/portal.d.ts.map +1 -1
- package/dist/adapters/web/admin/portal.js +6 -1909
- package/dist/adapters/web/admin/portal.js.map +1 -1
- package/dist/adapters/web/admin/types.d.ts +0 -3
- package/dist/adapters/web/admin/types.d.ts.map +1 -1
- package/dist/adapters/web/admin/types.js.map +1 -1
- package/dist/adapters/web/login/oauth.d.ts.map +1 -1
- package/dist/adapters/web/login/oauth.js +3 -7
- package/dist/adapters/web/login/oauth.js.map +1 -1
- package/dist/adapters/web/login/portal.d.ts +0 -10
- package/dist/adapters/web/login/portal.d.ts.map +1 -1
- package/dist/adapters/web/login/portal.js +4 -37
- package/dist/adapters/web/login/portal.js.map +1 -1
- package/dist/adapters/web/login/types.d.ts +0 -5
- package/dist/adapters/web/login/types.d.ts.map +1 -1
- package/dist/adapters/web/login/types.js.map +1 -1
- package/dist/adapters/web/portal-shell.d.ts +0 -12
- package/dist/adapters/web/portal-shell.d.ts.map +1 -1
- package/dist/adapters/web/portal-shell.js +8 -25
- package/dist/adapters/web/portal-shell.js.map +1 -1
- package/dist/adapters/web/server.d.ts +0 -1
- package/dist/adapters/web/server.d.ts.map +1 -1
- package/dist/adapters/web/server.js +0 -2
- package/dist/adapters/web/server.js.map +1 -1
- package/dist/adapters/web/session-view/portal.d.ts.map +1 -1
- package/dist/adapters/web/session-view/portal.js +13 -24
- package/dist/adapters/web/session-view/portal.js.map +1 -1
- package/dist/adapters/web/session-view/types.d.ts.map +1 -1
- package/dist/adapters/web/session-view/types.js.map +1 -1
- package/dist/adapters/web/token-store.d.ts +0 -2
- package/dist/adapters/web/token-store.d.ts.map +1 -1
- package/dist/adapters/web/token-store.js +0 -2
- package/dist/adapters/web/token-store.js.map +1 -1
- package/dist/cli/arg-grammar.d.ts +0 -3
- package/dist/cli/arg-grammar.d.ts.map +1 -1
- package/dist/cli/arg-grammar.js +0 -3
- package/dist/cli/arg-grammar.js.map +1 -1
- package/dist/cli/boot.d.ts.map +1 -1
- package/dist/cli/boot.js +3 -12
- package/dist/cli/boot.js.map +1 -1
- package/dist/cli/download.d.ts.map +1 -1
- package/dist/cli/download.js +2 -6
- package/dist/cli/download.js.map +1 -1
- package/dist/cli/office.d.ts.map +1 -1
- package/dist/cli/office.js +0 -31
- package/dist/cli/office.js.map +1 -1
- package/dist/cli/onboard.d.ts +0 -2
- package/dist/cli/onboard.d.ts.map +1 -1
- package/dist/cli/onboard.js +0 -30
- package/dist/cli/onboard.js.map +1 -1
- package/dist/cli/process-lifecycle.d.ts +0 -5
- package/dist/cli/process-lifecycle.d.ts.map +1 -1
- package/dist/cli/process-lifecycle.js +0 -6
- package/dist/cli/process-lifecycle.js.map +1 -1
- package/dist/cli/sandbox.d.ts +3 -0
- package/dist/cli/sandbox.d.ts.map +1 -0
- package/dist/cli/sandbox.js +79 -0
- package/dist/cli/sandbox.js.map +1 -0
- package/dist/cli/sessions.d.ts.map +1 -1
- package/dist/cli/sessions.js +0 -11
- package/dist/cli/sessions.js.map +1 -1
- package/dist/cli/types.d.ts +2 -6
- package/dist/cli/types.d.ts.map +1 -1
- package/dist/cli/types.js.map +1 -1
- package/dist/env-manifest.d.ts +0 -21
- package/dist/env-manifest.d.ts.map +1 -1
- package/dist/env-manifest.js +0 -11
- package/dist/env-manifest.js.map +1 -1
- package/dist/events/index.d.ts +0 -51
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js +0 -42
- package/dist/events/index.js.map +1 -1
- package/dist/events/scheduler.d.ts +0 -8
- package/dist/events/scheduler.d.ts.map +1 -1
- package/dist/events/scheduler.js +0 -8
- package/dist/events/scheduler.js.map +1 -1
- package/dist/file-guards.d.ts +0 -15
- package/dist/file-guards.d.ts.map +1 -1
- package/dist/file-guards.js +2 -26
- package/dist/file-guards.js.map +1 -1
- package/dist/harness/execution-env.d.ts +0 -15
- package/dist/harness/execution-env.d.ts.map +1 -1
- package/dist/harness/execution-env.js +4 -55
- package/dist/harness/execution-env.js.map +1 -1
- package/dist/harness/http.d.ts +0 -12
- package/dist/harness/http.d.ts.map +1 -1
- package/dist/harness/http.js +0 -34
- package/dist/harness/http.js.map +1 -1
- package/dist/harness/index.d.ts +4 -7
- package/dist/harness/index.d.ts.map +1 -1
- package/dist/harness/index.js +4 -7
- package/dist/harness/index.js.map +1 -1
- package/dist/harness/jev.d.ts +0 -28
- package/dist/harness/jev.d.ts.map +1 -1
- package/dist/harness/jev.js +0 -45
- package/dist/harness/jev.js.map +1 -1
- package/dist/harness/mcp-result.d.ts +20 -0
- package/dist/harness/mcp-result.d.ts.map +1 -0
- package/dist/harness/mcp-result.js +171 -0
- package/dist/harness/mcp-result.js.map +1 -0
- package/dist/harness/mcp.d.ts +0 -19
- package/dist/harness/mcp.d.ts.map +1 -1
- package/dist/harness/mcp.js +7 -66
- package/dist/harness/mcp.js.map +1 -1
- package/dist/harness/models.d.ts +0 -19
- package/dist/harness/models.d.ts.map +1 -1
- package/dist/harness/models.js +0 -52
- package/dist/harness/models.js.map +1 -1
- package/dist/harness/open-connector.d.ts +0 -12
- package/dist/harness/open-connector.d.ts.map +1 -1
- package/dist/harness/open-connector.js +0 -22
- package/dist/harness/open-connector.js.map +1 -1
- package/dist/harness/presenter.d.ts +1 -0
- package/dist/harness/presenter.d.ts.map +1 -1
- package/dist/harness/presenter.js +16 -66
- package/dist/harness/presenter.js.map +1 -1
- package/dist/harness/prompt.d.ts +0 -11
- package/dist/harness/prompt.d.ts.map +1 -1
- package/dist/harness/prompt.js +1 -18
- package/dist/harness/prompt.js.map +1 -1
- package/dist/harness/runner.d.ts.map +1 -1
- package/dist/harness/runner.js +8 -28
- package/dist/harness/runner.js.map +1 -1
- package/dist/harness/session.d.ts +11 -28
- package/dist/harness/session.d.ts.map +1 -1
- package/dist/harness/session.js +100 -38
- package/dist/harness/session.js.map +1 -1
- package/dist/harness/skills.d.ts +0 -22
- package/dist/harness/skills.d.ts.map +1 -1
- package/dist/harness/skills.js +0 -20
- package/dist/harness/skills.js.map +1 -1
- package/dist/harness/subagent-profiles.d.ts +0 -4
- package/dist/harness/subagent-profiles.d.ts.map +1 -1
- package/dist/harness/subagent-profiles.js +0 -29
- package/dist/harness/subagent-profiles.js.map +1 -1
- package/dist/harness/subagent.d.ts +0 -25
- package/dist/harness/subagent.d.ts.map +1 -1
- package/dist/harness/subagent.js +1 -70
- package/dist/harness/subagent.js.map +1 -1
- package/dist/harness/tools/event.d.ts.map +1 -1
- package/dist/harness/tools/event.js +0 -9
- package/dist/harness/tools/event.js.map +1 -1
- package/dist/harness/tools/generate-image.d.ts +0 -6
- package/dist/harness/tools/generate-image.d.ts.map +1 -1
- package/dist/harness/tools/generate-image.js.map +1 -1
- package/dist/harness/tools/host-fn-tool.d.ts +0 -17
- package/dist/harness/tools/host-fn-tool.d.ts.map +1 -1
- package/dist/harness/tools/host-fn-tool.js +0 -16
- package/dist/harness/tools/host-fn-tool.js.map +1 -1
- package/dist/harness/tools/index.d.ts +1 -7
- package/dist/harness/tools/index.d.ts.map +1 -1
- package/dist/harness/tools/index.js +3 -14
- package/dist/harness/tools/index.js.map +1 -1
- package/dist/harness/tools/jev-browser.d.ts +4 -94
- package/dist/harness/tools/jev-browser.d.ts.map +1 -1
- package/dist/harness/tools/jev-browser.js +203 -92
- package/dist/harness/tools/jev-browser.js.map +1 -1
- package/dist/harness/tools/jev.d.ts +0 -8
- package/dist/harness/tools/jev.d.ts.map +1 -1
- package/dist/harness/tools/jev.js +0 -11
- package/dist/harness/tools/jev.js.map +1 -1
- package/dist/harness/tools/pi-tools.d.ts +1 -11
- package/dist/harness/tools/pi-tools.d.ts.map +1 -1
- package/dist/harness/tools/pi-tools.js +1 -30
- package/dist/harness/tools/pi-tools.js.map +1 -1
- package/dist/harness/tools/react.d.ts +0 -5
- package/dist/harness/tools/react.d.ts.map +1 -1
- package/dist/harness/tools/react.js +0 -5
- package/dist/harness/tools/react.js.map +1 -1
- package/dist/harness/tools/secret-redaction.d.ts +0 -25
- package/dist/harness/tools/secret-redaction.d.ts.map +1 -1
- package/dist/harness/tools/secret-redaction.js +3 -36
- package/dist/harness/tools/secret-redaction.js.map +1 -1
- package/dist/harness/tools/subagent.d.ts +0 -34
- package/dist/harness/tools/subagent.d.ts.map +1 -1
- package/dist/harness/tools/subagent.js +0 -92
- package/dist/harness/tools/subagent.js.map +1 -1
- package/dist/harness/tools/task.d.ts +0 -1
- package/dist/harness/tools/task.d.ts.map +1 -1
- package/dist/harness/tools/task.js +0 -1
- package/dist/harness/tools/task.js.map +1 -1
- package/dist/harness/tools/types.d.ts +0 -16
- package/dist/harness/tools/types.d.ts.map +1 -1
- package/dist/harness/tools/types.js.map +1 -1
- package/dist/harness/types.d.ts +1 -77
- package/dist/harness/types.d.ts.map +1 -1
- package/dist/harness/types.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -2
- package/dist/index.js.map +1 -1
- package/dist/log.d.ts.map +1 -1
- package/dist/log.js +0 -13
- package/dist/log.js.map +1 -1
- package/dist/main.js +7 -52
- package/dist/main.js.map +1 -1
- package/dist/memory-capture/index.d.ts +16 -0
- package/dist/memory-capture/index.d.ts.map +1 -0
- package/dist/memory-capture/index.js +194 -0
- package/dist/memory-capture/index.js.map +1 -0
- package/dist/memory-capture/types.d.ts +27 -0
- package/dist/memory-capture/types.d.ts.map +1 -0
- package/dist/memory-capture/types.js.map +1 -0
- package/dist/observability/index.d.ts +0 -9
- package/dist/observability/index.d.ts.map +1 -1
- package/dist/observability/index.js +0 -9
- package/dist/observability/index.js.map +1 -1
- package/dist/observability/instrument.js +0 -5
- package/dist/observability/instrument.js.map +1 -1
- package/dist/observability/otel.js +0 -1
- package/dist/observability/otel.js.map +1 -1
- package/dist/observability/sentry.d.ts +0 -18
- package/dist/observability/sentry.d.ts.map +1 -1
- package/dist/observability/sentry.js +0 -36
- package/dist/observability/sentry.js.map +1 -1
- package/dist/observability/types.d.ts +1 -10
- package/dist/observability/types.d.ts.map +1 -1
- package/dist/observability/types.js.map +1 -1
- package/dist/office/index.d.ts +0 -76
- package/dist/office/index.d.ts.map +1 -1
- package/dist/office/index.js +4 -154
- package/dist/office/index.js.map +1 -1
- package/dist/office/projection.d.ts +0 -29
- package/dist/office/projection.d.ts.map +1 -1
- package/dist/office/projection.js +5 -41
- package/dist/office/projection.js.map +1 -1
- package/dist/office/types.d.ts +0 -66
- package/dist/office/types.d.ts.map +1 -1
- package/dist/office/types.js.map +1 -1
- package/dist/runtime/conversation-runtime.d.ts.map +1 -1
- package/dist/runtime/conversation-runtime.js +22 -83
- package/dist/runtime/conversation-runtime.js.map +1 -1
- package/dist/runtime/session-lifecycle.d.ts +0 -10
- package/dist/runtime/session-lifecycle.d.ts.map +1 -1
- package/dist/runtime/session-lifecycle.js +0 -12
- package/dist/runtime/session-lifecycle.js.map +1 -1
- package/dist/runtime/types.d.ts +2 -29
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/runtime/types.js.map +1 -1
- package/dist/sandbox/cloudflare.d.ts.map +1 -1
- package/dist/sandbox/cloudflare.js +2 -1
- package/dist/sandbox/cloudflare.js.map +1 -1
- package/dist/sandbox/container.d.ts.map +1 -1
- package/dist/sandbox/container.js +21 -15
- package/dist/sandbox/container.js.map +1 -1
- package/dist/sandbox/host.d.ts.map +1 -1
- package/dist/sandbox/host.js +0 -2
- package/dist/sandbox/host.js.map +1 -1
- package/dist/sandbox/identity.d.ts +0 -28
- package/dist/sandbox/identity.d.ts.map +1 -1
- package/dist/sandbox/identity.js +0 -28
- package/dist/sandbox/identity.js.map +1 -1
- package/dist/sandbox/index.d.ts +0 -18
- package/dist/sandbox/index.d.ts.map +1 -1
- package/dist/sandbox/index.js +2 -19
- package/dist/sandbox/index.js.map +1 -1
- package/dist/sandbox/layout.d.ts +7 -0
- package/dist/sandbox/layout.d.ts.map +1 -0
- package/dist/sandbox/layout.js +13 -0
- package/dist/sandbox/layout.js.map +1 -0
- package/dist/sandbox/provisioner.d.ts +24 -65
- package/dist/sandbox/provisioner.d.ts.map +1 -1
- package/dist/sandbox/provisioner.js +213 -125
- package/dist/sandbox/provisioner.js.map +1 -1
- package/dist/sandbox/types.d.ts +0 -39
- package/dist/sandbox/types.d.ts.map +1 -1
- package/dist/sandbox/types.js.map +1 -1
- package/dist/sandbox/utils.d.ts +2 -5
- package/dist/sandbox/utils.d.ts.map +1 -1
- package/dist/sandbox/utils.js +31 -31
- package/dist/sandbox/utils.js.map +1 -1
- package/dist/sessions/chat-history-sync.d.ts +0 -6
- package/dist/sessions/chat-history-sync.d.ts.map +1 -1
- package/dist/sessions/chat-history-sync.js +1 -33
- package/dist/sessions/chat-history-sync.js.map +1 -1
- package/dist/sessions/history-line.d.ts +0 -20
- package/dist/sessions/history-line.d.ts.map +1 -1
- package/dist/sessions/history-line.js +0 -20
- package/dist/sessions/history-line.js.map +1 -1
- package/dist/sessions/migrate-common.d.ts +0 -15
- package/dist/sessions/migrate-common.d.ts.map +1 -1
- package/dist/sessions/migrate-common.js +0 -19
- package/dist/sessions/migrate-common.js.map +1 -1
- package/dist/sessions/migrate-pi-084.d.ts.map +1 -1
- package/dist/sessions/migrate-pi-084.js +0 -7
- package/dist/sessions/migrate-pi-084.js.map +1 -1
- package/dist/sessions/migrate-v3.d.ts +0 -7
- package/dist/sessions/migrate-v3.d.ts.map +1 -1
- package/dist/sessions/migrate-v3.js +1 -67
- package/dist/sessions/migrate-v3.js.map +1 -1
- package/dist/sessions/session-key.d.ts +3 -17
- package/dist/sessions/session-key.d.ts.map +1 -1
- package/dist/sessions/session-key.js +8 -35
- package/dist/sessions/session-key.js.map +1 -1
- package/dist/sessions/session-store.d.ts +1 -7
- package/dist/sessions/session-store.d.ts.map +1 -1
- package/dist/sessions/session-store.js +8 -50
- package/dist/sessions/session-store.js.map +1 -1
- package/dist/sessions/store.d.ts +0 -60
- package/dist/sessions/store.d.ts.map +1 -1
- package/dist/sessions/store.js +0 -113
- package/dist/sessions/store.js.map +1 -1
- package/dist/sessions/types.d.ts +0 -17
- package/dist/sessions/types.d.ts.map +1 -1
- package/dist/sessions/types.js.map +1 -1
- package/dist/settings/apply.d.ts +0 -6
- package/dist/settings/apply.d.ts.map +1 -1
- package/dist/settings/apply.js +0 -29
- package/dist/settings/apply.js.map +1 -1
- package/dist/settings/index.d.ts +0 -53
- package/dist/settings/index.d.ts.map +1 -1
- package/dist/settings/index.js +0 -77
- package/dist/settings/index.js.map +1 -1
- package/dist/settings/migrate.d.ts +0 -5
- package/dist/settings/migrate.d.ts.map +1 -1
- package/dist/settings/migrate.js +0 -17
- package/dist/settings/migrate.js.map +1 -1
- package/dist/types.d.ts +9 -159
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/vault/index.d.ts +2 -36
- package/dist/vault/index.d.ts.map +1 -1
- package/dist/vault/index.js +135 -65
- package/dist/vault/index.js.map +1 -1
- package/dist/vault/types.d.ts +0 -15
- package/dist/vault/types.d.ts.map +1 -1
- package/dist/vault/types.js.map +1 -1
- package/package.json +1 -1
- package/dist/dream/index.d.ts +0 -20
- package/dist/dream/index.d.ts.map +0 -1
- package/dist/dream/index.js +0 -264
- package/dist/dream/index.js.map +0 -1
- package/dist/dream/types.d.ts +0 -30
- package/dist/dream/types.d.ts.map +0 -1
- package/dist/dream/types.js.map +0 -1
- /package/dist/{dream → memory-capture}/types.js +0 -0
package/dist/harness/mcp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/harness/mcp.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n McpPreset,\n McpServerConfig,\n McpLoadError,\n McpServerInstruction,\n McpToolsResult,\n} from \"./types.js\";\nimport { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport {\n StdioClientTransport,\n getDefaultEnvironment,\n} from \"@modelcontextprotocol/sdk/client/stdio.js\";\nimport { StreamableHTTPClientTransport } from \"@modelcontextprotocol/sdk/client/streamableHttp.js\";\nimport type { AgentTool, AgentToolResult } from \"@earendil-works/pi-agent-core\";\nimport type { TSchema } from \"@sinclair/typebox\";\n\nimport * as log from \"../log.js\";\n\n/** Server names become tool-name segments (`mcp__<server>__<tool>`); keep them\n * to a safe charset so a settings typo cannot produce an unparseable or\n * provider-rejected tool name. Shared by the loader and the portal. */\nconst SERVER_NAME_RE = /^[a-zA-Z][a-zA-Z0-9_-]{0,63}$/;\n\nexport function isValidMcpServerName(name: string): boolean {\n return SERVER_NAME_RE.test(name);\n}\n\nexport type StandardMcpParseResult =\n | { servers: Record<string, McpServerConfig>; error?: undefined }\n | { servers?: undefined; error: string };\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/**\n * Accept the `mcpServers` JSON every MCP server's setup page hands out\n * (`{ \"mcpServers\": { name: entry } }`, or the bare `{ name: entry }` map).\n * Entries are stored as pasted — `command`/`args`/`env` or `url`/`headers`,\n * values untouched — and the official SDK client does the rest at connect\n * time. mikan only keeps the config and its enabled state per scope.\n */\nexport function parseStandardMcpServers(text: string): StandardMcpParseResult {\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch (err) {\n return { error: `not valid JSON: ${err instanceof Error ? err.message : String(err)}` };\n }\n if (!isRecord(parsed)) return { error: \"expected a JSON object at the top level\" };\n const map = \"mcpServers\" in parsed ? parsed.mcpServers : parsed;\n if (!isRecord(map)) return { error: '\"mcpServers\" must be an object keyed by server name' };\n if (Object.keys(map).length === 0) return { error: \"no servers found in the pasted JSON\" };\n const servers: Record<string, McpServerConfig> = {};\n for (const [name, entry] of Object.entries(map)) {\n if (!isValidMcpServerName(name)) {\n return {\n error: `invalid server name \"${name}\" (letters, digits, '_' or '-', starting with a letter)`,\n };\n }\n if (!isRecord(entry)) return { error: `\"${name}\" must be an object` };\n const hasCommand = typeof entry.command === \"string\" && entry.command.trim() !== \"\";\n const hasUrl = typeof entry.url === \"string\";\n // A broken url is named before the transport count, so a paste carrying\n // both keys and a bad URL reports the URL rather than the ambiguity.\n if (hasUrl && !URL.canParse(entry.url as string)) {\n return { error: `\"${name}\": url is not a valid URL` };\n }\n // Exactly one transport: equal flags mean both were set, or neither was.\n if (hasCommand === hasUrl) {\n const detail = hasCommand\n ? \"set only one of command / url\"\n : \"set either command (stdio) or url (HTTP)\";\n return { error: `\"${name}\": ${detail}` };\n }\n servers[name] = {\n ...(hasCommand ? { command: entry.command as string } : {}),\n ...(Array.isArray(entry.args) ? { args: entry.args.map(String) } : {}),\n ...(isRecord(entry.env) ? { env: stringValues(entry.env) } : {}),\n ...(hasUrl ? { url: entry.url as string } : {}),\n ...(isRecord(entry.headers) ? { headers: stringValues(entry.headers) } : {}),\n ...(entry.disabled === true ? { disabled: true } : {}),\n };\n }\n return { servers };\n}\n\nfunction stringValues(map: Record<string, unknown>): Record<string, string> {\n return Object.fromEntries(Object.entries(map).map(([k, v]) => [k, String(v)]));\n}\n\n/**\n * Hide query-string values: `?token=…` is a legitimate MCP auth channel\n * (browserless, Claude.ai connectors), so a URL is a credential carrier and\n * must never be echoed to a browser or a log line verbatim.\n */\nexport function redactMcpUrl(url: string): string {\n if (!URL.canParse(url)) return url.replace(/([?&][^=&]+=)[^&]*/g, \"$1<redacted>\");\n const parsed = new URL(url);\n if (!parsed.search) return url;\n const keys = new Set(parsed.searchParams.keys());\n for (const key of keys) parsed.searchParams.set(key, \"<redacted>\");\n return parsed.toString().replace(/%3Credacted%3E/g, \"<redacted>\");\n}\n\nconst MCP_PRESETS: readonly McpPreset[] = [\n {\n id: \"metabase\",\n name: \"Metabase\",\n description: \"Query and explore analytics from your Metabase instance.\",\n category: \"Analytics\",\n serverName: \"metabase\",\n sourceUrl: \"https://github.com/metabase/metabase\",\n setupUrl: \"https://www.metabase.com/docs/latest/ai/mcp\",\n server: { url: \"https://{your-metabase.example.com}/api/metabase-mcp\" },\n credentials: [\n {\n key: \"url\",\n label: \"Metabase MCP server URL\",\n description:\n \"The full endpoint, for example https://metabase.example.com/api/metabase-mcp.\",\n target: \"url\",\n required: true,\n secret: false,\n },\n {\n key: \"x-api-key\",\n label: \"Metabase API key\",\n description:\n \"An API key whose Metabase permissions match the access you want mikan to have.\",\n target: \"header\",\n required: true,\n secret: true,\n },\n ],\n },\n];\n\nexport function listMcpPresets(): readonly McpPreset[] {\n return MCP_PRESETS;\n}\n\nexport function findMcpPreset(id: string): McpPreset | undefined {\n return MCP_PRESETS.find((preset) => preset.id === id);\n}\n\nexport function materializeMcpPreset(\n preset: McpPreset,\n values: Record<string, string>,\n): McpServerConfig {\n const env: Record<string, string> = {};\n const headers: Record<string, string> = {};\n let url = preset.server.url;\n for (const credential of preset.credentials) {\n const value = values[credential.key]?.trim() ?? \"\";\n if (!value) {\n if (credential.required) throw new Error(`${credential.label} is required`);\n continue;\n }\n const formatted = `${credential.valuePrefix ?? \"\"}${value}`;\n if (credential.target === \"env\") env[credential.key] = formatted;\n else if (credential.target === \"header\") headers[credential.key] = formatted;\n else {\n if (!URL.canParse(formatted) || !/^https?:/.test(new URL(formatted).protocol)) {\n throw new Error(`${credential.label} must be a valid HTTP URL`);\n }\n url = formatted;\n }\n }\n return {\n ...preset.server,\n ...(preset.server.args ? { args: [...preset.server.args] } : {}),\n ...(url !== undefined ? { url } : {}),\n ...(Object.keys(env).length > 0 ? { env } : {}),\n ...(Object.keys(headers).length > 0 ? { headers } : {}),\n };\n}\nexport type { McpServerConfig } from \"./types.js\";\nexport type { McpToolsResult } from \"./types.js\";\n\nconst CONNECT_TIMEOUT_MS = 15_000;\n\nconst CALL_TIMEOUT_MS = 120_000;\n\nfunction buildTransport(name: string, config: McpServerConfig) {\n if (config.command && config.url) {\n throw new Error(`server \"${name}\" sets both command and url; pick one transport`);\n }\n if (config.command) {\n return new StdioClientTransport({\n command: config.command,\n args: config.args ?? [],\n // The SDK's default env is a minimal safe allowlist (PATH, HOME…);\n // entries from settings are merged over it. Credentials for the MCP\n // server belong here — on the host, out of the model's reach.\n env: { ...getDefaultEnvironment(), ...config.env },\n stderr: \"ignore\",\n });\n }\n if (config.url) {\n return new StreamableHTTPClientTransport(new URL(config.url), {\n requestInit: config.headers ? { headers: config.headers } : undefined,\n });\n }\n throw new Error(`server \"${name}\" sets neither command nor url`);\n}\n\nfunction toAgentToolResult(result: {\n content?: unknown;\n isError?: boolean;\n}): AgentToolResult<undefined> {\n const parts = Array.isArray(result.content) ? result.content : [];\n const content: AgentToolResult<undefined>[\"content\"] = [];\n for (const part of parts) {\n if (part && typeof part === \"object\" && \"type\" in part) {\n if (part.type === \"text\" && typeof (part as { text?: unknown }).text === \"string\") {\n content.push({ type: \"text\", text: (part as { text: string }).text });\n continue;\n }\n if (\n part.type === \"image\" &&\n typeof (part as { data?: unknown }).data === \"string\" &&\n typeof (part as { mimeType?: unknown }).mimeType === \"string\"\n ) {\n const image = part as { data: string; mimeType: string };\n content.push({ type: \"image\", data: image.data, mimeType: image.mimeType });\n continue;\n }\n // resource/audio/other parts: surface as JSON text rather than dropping.\n content.push({ type: \"text\", text: JSON.stringify(part) });\n }\n }\n if (content.length === 0) {\n content.push({ type: \"text\", text: \"(empty result)\" });\n }\n const text = content.map((c) => (c.type === \"text\" ? c.text : \"\")).join(\"\\n\");\n if (result.isError) {\n // AgentTool contract: throw on failure instead of encoding errors in content.\n throw new Error(text || \"MCP tool call failed\");\n }\n return { content, details: undefined };\n}\n\nasync function connectServer(\n name: string,\n config: McpServerConfig,\n signal?: AbortSignal,\n): Promise<{ client: Client; tools: AgentTool<TSchema>[]; instructions?: string }> {\n const client = new Client({ name: \"mikan\", version: \"1.0.0\" });\n const transport = buildTransport(name, config);\n try {\n await client.connect(transport, {\n timeout: CONNECT_TIMEOUT_MS,\n ...(signal ? { signal } : {}),\n });\n const listed = await client.listTools(undefined, {\n timeout: CONNECT_TIMEOUT_MS,\n ...(signal ? { signal } : {}),\n });\n const tools: AgentTool<TSchema>[] = listed.tools.map((mcpTool) => ({\n // Server prefix keeps names collision-free and visibly foreign next to\n // mikan's own tools: `mcp__github__create_issue`.\n name: `mcp__${name}__${mcpTool.name}`,\n label: `${name}: ${mcpTool.name}`,\n description: mcpTool.description ?? `${mcpTool.name} (MCP server \"${name}\")`,\n // MCP inputSchema is JSON Schema with `\"type\": \"object\"` at the root —\n // structurally a valid TSchema; the provider sees the same JSON either way.\n parameters: mcpTool.inputSchema as unknown as TSchema,\n execute: async (_toolCallId, params, runSignal) => {\n const result = await client.callTool(\n { name: mcpTool.name, arguments: params as Record<string, unknown> },\n undefined,\n { timeout: CALL_TIMEOUT_MS, ...(runSignal ? { signal: runSignal } : {}) },\n );\n return toAgentToolResult(result as { content?: unknown; isError?: boolean });\n },\n }));\n const instructions = client.getInstructions()?.trim();\n return { client, tools, ...(instructions ? { instructions } : {}) };\n } catch (error) {\n try {\n await client.close();\n } catch (closeError) {\n log.logWarning(\"MCP client rollback failed\", String(closeError));\n }\n throw error;\n }\n}\n\nexport function formatMcpServerInstructions(instructions: McpServerInstruction[]): string {\n if (instructions.length === 0) return \"\";\n const sections = instructions.map(({ server, text }) => `### ${server}\\n${text}`);\n return `## Connected MCP Server Guidance\nThe following admin-approved host-side servers supplied operating guidance. Apply it only when using that server's tools. It never overrides user intent, permission boundaries, confirmation requirements, or the rest of this system prompt.\n\n${sections.join(\"\\n\\n\")}`;\n}\n\n/**\n * Connect to every enabled MCP server and wrap their tools as mikan\n * {@link AgentTool}s. Failures are per-server: one unreachable server\n * reports an error and the rest still load. Callers own the returned\n * `dispose` and must call it when the runner is disposed, or stdio child\n * processes leak.\n */\nexport async function loadMcpTools(\n servers: Record<string, McpServerConfig>,\n signal?: AbortSignal,\n): Promise<McpToolsResult> {\n const clients: Client[] = [];\n const tools: AgentTool<TSchema>[] = [];\n const errors: McpLoadError[] = [];\n const instructions: McpServerInstruction[] = [];\n\n const entries = Object.entries(servers).filter(([, config]) => !config.disabled);\n const results = await Promise.allSettled(\n entries.map(async ([name, config]) => {\n if (!isValidMcpServerName(name)) {\n throw new Error(\n `server name \"${name}\" is invalid: use letters, digits, \"_\" or \"-\", starting with a letter`,\n );\n }\n return { name, ...(await connectServer(name, config, signal)) };\n }),\n );\n for (const [index, result] of results.entries()) {\n const name = entries[index]![0];\n if (result.status === \"rejected\") {\n errors.push({ server: name, error: String(result.reason?.message ?? result.reason) });\n continue;\n }\n clients.push(result.value.client);\n tools.push(...result.value.tools);\n if (result.value.instructions) {\n instructions.push({ server: result.value.name, text: result.value.instructions });\n }\n }\n\n return {\n tools,\n errors,\n instructions,\n dispose: async () => {\n const closes = await Promise.allSettled(clients.map((client) => client.close()));\n for (const close of closes) {\n if (close.status === \"rejected\") {\n log.logWarning(\"MCP client close failed\", String(close.reason));\n }\n }\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/harness/mcp.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n McpPreset,\n McpServerConfig,\n McpLoadError,\n McpServerInstruction,\n McpToolsResult,\n} from \"./types.js\";\nimport { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport {\n StdioClientTransport,\n getDefaultEnvironment,\n} from \"@modelcontextprotocol/sdk/client/stdio.js\";\nimport { StreamableHTTPClientTransport } from \"@modelcontextprotocol/sdk/client/streamableHttp.js\";\nimport type { TSchema } from \"@sinclair/typebox\";\nimport type { MikanHarnessTool } from \"./types.js\";\nimport { guardMcpToolResult, type McpCallResult } from \"./mcp-result.js\";\nimport { tagHarnessTool } from \"./tools/pi-tools.js\";\n\nimport * as log from \"../log.js\";\n\nconst SERVER_NAME_RE = /^[a-zA-Z][a-zA-Z0-9_-]{0,63}$/;\n\nexport function isValidMcpServerName(name: string): boolean {\n return SERVER_NAME_RE.test(name);\n}\n\nexport type StandardMcpParseResult =\n | { servers: Record<string, McpServerConfig>; error?: undefined }\n | { servers?: undefined; error: string };\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function parseStandardMcpServers(text: string): StandardMcpParseResult {\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch (err) {\n return { error: `not valid JSON: ${err instanceof Error ? err.message : String(err)}` };\n }\n if (!isRecord(parsed)) return { error: \"expected a JSON object at the top level\" };\n const map = \"mcpServers\" in parsed ? parsed.mcpServers : parsed;\n if (!isRecord(map)) return { error: '\"mcpServers\" must be an object keyed by server name' };\n if (Object.keys(map).length === 0) return { error: \"no servers found in the pasted JSON\" };\n const servers: Record<string, McpServerConfig> = {};\n for (const [name, entry] of Object.entries(map)) {\n if (!isValidMcpServerName(name)) {\n return {\n error: `invalid server name \"${name}\" (letters, digits, '_' or '-', starting with a letter)`,\n };\n }\n if (!isRecord(entry)) return { error: `\"${name}\" must be an object` };\n const hasCommand = typeof entry.command === \"string\" && entry.command.trim() !== \"\";\n const hasUrl = typeof entry.url === \"string\";\n if (hasUrl && !URL.canParse(entry.url as string)) {\n return { error: `\"${name}\": url is not a valid URL` };\n }\n if (hasCommand === hasUrl) {\n const detail = hasCommand\n ? \"set only one of command / url\"\n : \"set either command (stdio) or url (HTTP)\";\n return { error: `\"${name}\": ${detail}` };\n }\n servers[name] = {\n ...(hasCommand ? { command: entry.command as string } : {}),\n ...(Array.isArray(entry.args) ? { args: entry.args.map(String) } : {}),\n ...(isRecord(entry.env) ? { env: stringValues(entry.env) } : {}),\n ...(hasUrl ? { url: entry.url as string } : {}),\n ...(isRecord(entry.headers) ? { headers: stringValues(entry.headers) } : {}),\n ...(entry.disabled === true ? { disabled: true } : {}),\n };\n }\n return { servers };\n}\n\nfunction stringValues(map: Record<string, unknown>): Record<string, string> {\n return Object.fromEntries(Object.entries(map).map(([k, v]) => [k, String(v)]));\n}\n\nexport function redactMcpUrl(url: string): string {\n if (!URL.canParse(url)) return url.replace(/([?&][^=&]+=)[^&]*/g, \"$1<redacted>\");\n const parsed = new URL(url);\n if (!parsed.search) return url;\n const keys = new Set(parsed.searchParams.keys());\n for (const key of keys) parsed.searchParams.set(key, \"<redacted>\");\n return parsed.toString().replace(/%3Credacted%3E/g, \"<redacted>\");\n}\n\nconst MCP_PRESETS: readonly McpPreset[] = [\n {\n id: \"metabase\",\n name: \"Metabase\",\n description: \"Query and explore analytics from your Metabase instance.\",\n category: \"Analytics\",\n serverName: \"metabase\",\n sourceUrl: \"https://github.com/metabase/metabase\",\n setupUrl: \"https://www.metabase.com/docs/latest/ai/mcp\",\n server: { url: \"https://{your-metabase.example.com}/api/metabase-mcp\" },\n credentials: [\n {\n key: \"url\",\n label: \"Metabase MCP server URL\",\n description:\n \"The full endpoint, for example https://metabase.example.com/api/metabase-mcp.\",\n target: \"url\",\n required: true,\n secret: false,\n },\n {\n key: \"x-api-key\",\n label: \"Metabase API key\",\n description:\n \"An API key whose Metabase permissions match the access you want mikan to have.\",\n target: \"header\",\n required: true,\n secret: true,\n },\n ],\n },\n];\n\nexport function listMcpPresets(): readonly McpPreset[] {\n return MCP_PRESETS;\n}\n\nexport function findMcpPreset(id: string): McpPreset | undefined {\n return MCP_PRESETS.find((preset) => preset.id === id);\n}\n\nexport function materializeMcpPreset(\n preset: McpPreset,\n values: Record<string, string>,\n): McpServerConfig {\n const env: Record<string, string> = {};\n const headers: Record<string, string> = {};\n let url = preset.server.url;\n for (const credential of preset.credentials) {\n const value = values[credential.key]?.trim() ?? \"\";\n if (!value) {\n if (credential.required) throw new Error(`${credential.label} is required`);\n continue;\n }\n const formatted = `${credential.valuePrefix ?? \"\"}${value}`;\n if (credential.target === \"env\") env[credential.key] = formatted;\n else if (credential.target === \"header\") headers[credential.key] = formatted;\n else {\n if (!URL.canParse(formatted) || !/^https?:/.test(new URL(formatted).protocol)) {\n throw new Error(`${credential.label} must be a valid HTTP URL`);\n }\n url = formatted;\n }\n }\n return {\n ...preset.server,\n ...(preset.server.args ? { args: [...preset.server.args] } : {}),\n ...(url !== undefined ? { url } : {}),\n ...(Object.keys(env).length > 0 ? { env } : {}),\n ...(Object.keys(headers).length > 0 ? { headers } : {}),\n };\n}\nexport type { McpServerConfig } from \"./types.js\";\nexport type { McpToolsResult } from \"./types.js\";\n\nconst CONNECT_TIMEOUT_MS = 15_000;\n\nconst CALL_TIMEOUT_MS = 120_000;\n\nfunction buildTransport(name: string, config: McpServerConfig) {\n if (config.command && config.url) {\n throw new Error(`server \"${name}\" sets both command and url; pick one transport`);\n }\n if (config.command) {\n return new StdioClientTransport({\n command: config.command,\n args: config.args ?? [],\n env: { ...getDefaultEnvironment(), ...config.env },\n stderr: \"ignore\",\n });\n }\n if (config.url) {\n return new StreamableHTTPClientTransport(new URL(config.url), {\n requestInit: config.headers ? { headers: config.headers } : undefined,\n });\n }\n throw new Error(`server \"${name}\" sets neither command nor url`);\n}\n\nasync function connectServer(\n name: string,\n config: McpServerConfig,\n signal?: AbortSignal,\n): Promise<{ client: Client; tools: MikanHarnessTool[]; instructions?: string }> {\n const client = new Client({ name: \"mikan\", version: \"1.0.0\" });\n const transport = buildTransport(name, config);\n try {\n await client.connect(transport, {\n timeout: CONNECT_TIMEOUT_MS,\n ...(signal ? { signal } : {}),\n });\n const listed = await client.listTools(undefined, {\n timeout: CONNECT_TIMEOUT_MS,\n ...(signal ? { signal } : {}),\n });\n const tools: MikanHarnessTool[] = listed.tools.map((mcpTool) =>\n tagHarnessTool({\n name: `mcp__${name}__${mcpTool.name}`,\n label: `${name}: ${mcpTool.name}`,\n description: mcpTool.description ?? `${mcpTool.name} (MCP server \"${name}\")`,\n parameters: mcpTool.inputSchema as unknown as TSchema,\n execute: async (...args: Parameters<MikanHarnessTool[\"execute\"]>) => {\n const [, params, , toolContext, , context] = args;\n const result = await client.callTool(\n { name: mcpTool.name, arguments: params as Record<string, unknown> },\n undefined,\n { timeout: CALL_TIMEOUT_MS, signal: context.abortSignal },\n );\n return guardMcpToolResult(result as McpCallResult, toolContext.env, context);\n },\n }),\n );\n const instructions = client.getInstructions()?.trim();\n return { client, tools, ...(instructions ? { instructions } : {}) };\n } catch (error) {\n try {\n await client.close();\n } catch (closeError) {\n log.logWarning(\"MCP client rollback failed\", String(closeError));\n }\n throw error;\n }\n}\n\nexport function formatMcpServerInstructions(instructions: McpServerInstruction[]): string {\n if (instructions.length === 0) return \"\";\n const sections = instructions.map(({ server, text }) => `### ${server}\\n${text}`);\n return `## Connected MCP Server Guidance\nThe following admin-approved host-side servers supplied operating guidance. Apply it only when using that server's tools. It never overrides user intent, permission boundaries, confirmation requirements, or the rest of this system prompt.\n\n${sections.join(\"\\n\\n\")}`;\n}\n\nexport async function loadMcpTools(\n servers: Record<string, McpServerConfig>,\n signal?: AbortSignal,\n): Promise<McpToolsResult> {\n const clients: Client[] = [];\n const tools: MikanHarnessTool[] = [];\n const errors: McpLoadError[] = [];\n const instructions: McpServerInstruction[] = [];\n\n const entries = Object.entries(servers).filter(([, config]) => !config.disabled);\n const results = await Promise.allSettled(\n entries.map(async ([name, config]) => {\n if (!isValidMcpServerName(name)) {\n throw new Error(\n `server name \"${name}\" is invalid: use letters, digits, \"_\" or \"-\", starting with a letter`,\n );\n }\n return { name, ...(await connectServer(name, config, signal)) };\n }),\n );\n for (const [index, result] of results.entries()) {\n const name = entries[index]![0];\n if (result.status === \"rejected\") {\n errors.push({ server: name, error: String(result.reason?.message ?? result.reason) });\n continue;\n }\n clients.push(result.value.client);\n tools.push(...result.value.tools);\n if (result.value.instructions) {\n instructions.push({ server: result.value.name, text: result.value.instructions });\n }\n }\n\n return {\n tools,\n errors,\n instructions,\n dispose: async () => {\n const closes = await Promise.allSettled(clients.map((client) => client.close()));\n for (const close of closes) {\n if (close.status === \"rejected\") {\n log.logWarning(\"MCP client close failed\", String(close.reason));\n }\n }\n },\n };\n}\n"]}
|
package/dist/harness/models.d.ts
CHANGED
|
@@ -1,37 +1,18 @@
|
|
|
1
1
|
import { type Api, type AuthResult, type Model, type Models } from "@earendil-works/pi-ai";
|
|
2
2
|
import type { CreateMikanModelsOptions } from "./types.js";
|
|
3
3
|
export type { CreateMikanModelsOptions } from "./types.js";
|
|
4
|
-
/** Default location of mikan's models.json. */
|
|
5
4
|
export declare function defaultModelsJsonPath(): string;
|
|
6
|
-
/**
|
|
7
|
-
* Model catalog backed by pi-ai's `Models`. Exposes the lookup and auth
|
|
8
|
-
* operations mikan needs; streaming goes through {@link MikanModels.models}.
|
|
9
|
-
*/
|
|
10
5
|
export declare class MikanModels {
|
|
11
|
-
/** Underlying pi-ai collection, for streaming/completion calls. */
|
|
12
6
|
readonly models: Models;
|
|
13
7
|
private loadError;
|
|
14
8
|
private constructor();
|
|
15
9
|
static create(options?: CreateMikanModelsOptions): MikanModels;
|
|
16
|
-
/** Error from loading models.json, if any. Built-in models stay available. */
|
|
17
10
|
getError(): string | undefined;
|
|
18
|
-
/** All known models (built-in plus custom). */
|
|
19
11
|
getAll(): Model<Api>[];
|
|
20
|
-
/** Find a model by provider and id. */
|
|
21
12
|
find(provider: string, modelId: string): Model<Api> | undefined;
|
|
22
|
-
/**
|
|
23
|
-
* Find a model by provider and id, or throw a user-facing configuration error.
|
|
24
|
-
* Prefer this at runtime entry points over raw `find` + ad-hoc throws.
|
|
25
|
-
*/
|
|
26
13
|
resolve(provider: string, modelId: string): Model<Api>;
|
|
27
|
-
/** Models whose provider auth currently resolves (API key, OAuth, or ambient). */
|
|
28
14
|
getAvailable(): Promise<Model<Api>[]>;
|
|
29
|
-
/** Resolve request auth for a model. Undefined when unconfigured. */
|
|
30
15
|
getAuth(model: Model<Api>): Promise<AuthResult | undefined>;
|
|
31
|
-
/**
|
|
32
|
-
* Resolve an API key for a provider. Convenience for call sites that only
|
|
33
|
-
* need a bearer key (for example pi-agent-core's compat stream function).
|
|
34
|
-
*/
|
|
35
16
|
getApiKeyForProvider(provider: string): Promise<string | undefined>;
|
|
36
17
|
}
|
|
37
18
|
//# sourceMappingURL=models.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/harness/models.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/harness/models.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,GAAG,EACR,KAAK,UAAU,EACf,KAAK,KAAK,EACV,KAAK,MAAM,EAIZ,MAAM,uBAAuB,CAAC;AAS/B,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAE3D,YAAY,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AA6C3D,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAiID,qBAAa,WAAW;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,SAAS,CAAqB;IAEtC,OAAO,eAGN;IAED,MAAM,CAAC,MAAM,CAAC,OAAO,GAAE,wBAA6B,GAAG,WAAW,CAKjE;IAED,QAAQ,IAAI,MAAM,GAAG,SAAS,CAE7B;IAED,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAErB;IAED,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,CAE9D;IAED,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAMrD;IAEK,YAAY,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAW1C;IAED,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAE1D;IAEK,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAOxE;CACF"}
|
package/dist/harness/models.js
CHANGED
|
@@ -1,29 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Model catalog for the mikan harness.
|
|
3
|
-
*
|
|
4
|
-
* Wraps pi-ai's `Models` collection: all built-in providers are registered
|
|
5
|
-
* with credentials resolved from provider env vars, and custom providers
|
|
6
|
-
* or overrides can be added via a `models.json` file
|
|
7
|
-
* (`~/.mikan/models.json` by default).
|
|
8
|
-
*
|
|
9
|
-
* models.json subset supported by mikan:
|
|
10
|
-
*
|
|
11
|
-
* ```jsonc
|
|
12
|
-
* {
|
|
13
|
-
* "providers": {
|
|
14
|
-
* "my-provider": {
|
|
15
|
-
* "api": "openai-completions", // required when models are listed
|
|
16
|
-
* "baseUrl": "http://host/v1",
|
|
17
|
-
* "apiKey": "literal-key", // optional; MY_PROVIDER_API_KEY env var otherwise
|
|
18
|
-
* "headers": { },
|
|
19
|
-
* "compat": { },
|
|
20
|
-
* "models": [{ "id": "m", "name": "M", "input": ["text"], "reasoning": false }]
|
|
21
|
-
* },
|
|
22
|
-
* "anthropic": { "baseUrl": "https://proxy.example/v1" } // override built-in provider
|
|
23
|
-
* }
|
|
24
|
-
* }
|
|
25
|
-
* ```
|
|
26
|
-
*/
|
|
27
1
|
import { homedir } from "node:os";
|
|
28
2
|
import { join } from "node:path";
|
|
29
3
|
import { createProvider, } from "@earendil-works/pi-ai";
|
|
@@ -46,7 +20,6 @@ const CUSTOM_API_STREAMS = {
|
|
|
46
20
|
const DEFAULT_COST = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };
|
|
47
21
|
const DEFAULT_CONTEXT_WINDOW = 128000;
|
|
48
22
|
const DEFAULT_MAX_TOKENS = 16384;
|
|
49
|
-
/** Default location of mikan's models.json. */
|
|
50
23
|
export function defaultModelsJsonPath() {
|
|
51
24
|
return join(homedir(), ".mikan", "models.json");
|
|
52
25
|
}
|
|
@@ -85,12 +58,6 @@ function isModelsJsonConfig(parsed) {
|
|
|
85
58
|
function envVarNameFor(providerName) {
|
|
86
59
|
return `${providerName.replace(/[^a-zA-Z0-9]+/g, "_").toUpperCase()}_API_KEY`;
|
|
87
60
|
}
|
|
88
|
-
/**
|
|
89
|
-
* Register models.json providers on top of the built-ins: a provider with its
|
|
90
|
-
* own model list replaces wholesale; a bare baseUrl/compat entry overrides a
|
|
91
|
-
* matching built-in in place. Returns a user-facing load error, if any —
|
|
92
|
-
* built-in models stay available either way.
|
|
93
|
-
*/
|
|
94
61
|
function applyModelsJson(models, modelsJsonPath) {
|
|
95
62
|
try {
|
|
96
63
|
const config = readJsonFileIfExists(modelsJsonPath, isModelsJsonConfig, (detail) => `models.json is invalid: ${detail}`);
|
|
@@ -161,7 +128,6 @@ function buildCustomProvider(providerName, config) {
|
|
|
161
128
|
api: CUSTOM_API_STREAMS[api](),
|
|
162
129
|
});
|
|
163
130
|
}
|
|
164
|
-
/** Rebuild a built-in provider with overridden model base URLs / compat. */
|
|
165
131
|
function overrideBuiltinProvider(provider, config) {
|
|
166
132
|
const models = provider.getModels().map((model) => {
|
|
167
133
|
const overridden = Object.assign({}, model);
|
|
@@ -176,10 +142,6 @@ function overrideBuiltinProvider(provider, config) {
|
|
|
176
142
|
getModels: () => models,
|
|
177
143
|
};
|
|
178
144
|
}
|
|
179
|
-
/**
|
|
180
|
-
* Model catalog backed by pi-ai's `Models`. Exposes the lookup and auth
|
|
181
|
-
* operations mikan needs; streaming goes through {@link MikanModels.models}.
|
|
182
|
-
*/
|
|
183
145
|
export class MikanModels {
|
|
184
146
|
constructor(models, loadError) {
|
|
185
147
|
this.models = models;
|
|
@@ -191,49 +153,35 @@ export class MikanModels {
|
|
|
191
153
|
const loadError = applyModelsJson(models, modelsJsonPath);
|
|
192
154
|
return new MikanModels(models, loadError);
|
|
193
155
|
}
|
|
194
|
-
/** Error from loading models.json, if any. Built-in models stay available. */
|
|
195
156
|
getError() {
|
|
196
157
|
return this.loadError;
|
|
197
158
|
}
|
|
198
|
-
/** All known models (built-in plus custom). */
|
|
199
159
|
getAll() {
|
|
200
160
|
return [...this.models.getModels()];
|
|
201
161
|
}
|
|
202
|
-
/** Find a model by provider and id. */
|
|
203
162
|
find(provider, modelId) {
|
|
204
163
|
return this.models.getModel(provider, modelId);
|
|
205
164
|
}
|
|
206
|
-
/**
|
|
207
|
-
* Find a model by provider and id, or throw a user-facing configuration error.
|
|
208
|
-
* Prefer this at runtime entry points over raw `find` + ad-hoc throws.
|
|
209
|
-
*/
|
|
210
165
|
resolve(provider, modelId) {
|
|
211
166
|
const model = this.find(provider, modelId);
|
|
212
167
|
if (model)
|
|
213
168
|
return model;
|
|
214
169
|
throw new Error(`Unknown model "${provider}/${modelId}". Configure it in pi models.json or choose a registered model.`);
|
|
215
170
|
}
|
|
216
|
-
/** Models whose provider auth currently resolves (API key, OAuth, or ambient). */
|
|
217
171
|
async getAvailable() {
|
|
218
172
|
const available = await Promise.all(this.models.getProviders().map(async (provider) => {
|
|
219
173
|
try {
|
|
220
174
|
return await this.models.getAvailable(provider.id);
|
|
221
175
|
}
|
|
222
176
|
catch {
|
|
223
|
-
// One provider's auth failure must not hide models from other providers.
|
|
224
177
|
return [];
|
|
225
178
|
}
|
|
226
179
|
}));
|
|
227
180
|
return available.flat();
|
|
228
181
|
}
|
|
229
|
-
/** Resolve request auth for a model. Undefined when unconfigured. */
|
|
230
182
|
getAuth(model) {
|
|
231
183
|
return this.models.getAuth(model);
|
|
232
184
|
}
|
|
233
|
-
/**
|
|
234
|
-
* Resolve an API key for a provider. Convenience for call sites that only
|
|
235
|
-
* need a bearer key (for example pi-agent-core's compat stream function).
|
|
236
|
-
*/
|
|
237
185
|
async getApiKeyForProvider(provider) {
|
|
238
186
|
try {
|
|
239
187
|
const auth = await this.models.getAuth(provider);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/harness/models.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Model catalog for the mikan harness.\n *\n * Wraps pi-ai's `Models` collection: all built-in providers are registered\n * with credentials resolved from provider env vars, and custom providers\n * or overrides can be added via a `models.json` file\n * (`~/.mikan/models.json` by default).\n *\n * models.json subset supported by mikan:\n *\n * ```jsonc\n * {\n * \"providers\": {\n * \"my-provider\": {\n * \"api\": \"openai-completions\", // required when models are listed\n * \"baseUrl\": \"http://host/v1\",\n * \"apiKey\": \"literal-key\", // optional; MY_PROVIDER_API_KEY env var otherwise\n * \"headers\": { },\n * \"compat\": { },\n * \"models\": [{ \"id\": \"m\", \"name\": \"M\", \"input\": [\"text\"], \"reasoning\": false }]\n * },\n * \"anthropic\": { \"baseUrl\": \"https://proxy.example/v1\" } // override built-in provider\n * }\n * }\n * ```\n */\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport {\n createProvider,\n type Api,\n type AuthResult,\n type Model,\n type Models,\n type MutableModels,\n type Provider,\n type ProviderStreams,\n} from \"@earendil-works/pi-ai\";\nimport { builtinModels } from \"@earendil-works/pi-ai/providers/all\";\nimport { anthropicMessagesApi } from \"@earendil-works/pi-ai/api/anthropic-messages.lazy\";\nimport { azureOpenAIResponsesApi } from \"@earendil-works/pi-ai/api/azure-openai-responses.lazy\";\nimport { googleGenerativeAIApi } from \"@earendil-works/pi-ai/api/google-generative-ai.lazy\";\nimport { mistralConversationsApi } from \"@earendil-works/pi-ai/api/mistral-conversations.lazy\";\nimport { openAICompletionsApi } from \"@earendil-works/pi-ai/api/openai-completions.lazy\";\nimport { openAIResponsesApi } from \"@earendil-works/pi-ai/api/openai-responses.lazy\";\nimport { readJsonFileIfExists } from \"../file-guards.js\";\nimport type { CreateMikanModelsOptions } from \"./types.js\";\n\nexport type { CreateMikanModelsOptions } from \"./types.js\";\n\nconst CUSTOM_API_STREAMS: Record<string, () => ProviderStreams> = {\n \"anthropic-messages\": anthropicMessagesApi,\n \"azure-openai-responses\": azureOpenAIResponsesApi,\n \"google-generative-ai\": googleGenerativeAIApi,\n \"mistral-conversations\": mistralConversationsApi,\n \"openai-completions\": openAICompletionsApi,\n \"openai-responses\": openAIResponsesApi,\n};\n\nconst DEFAULT_COST = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };\nconst DEFAULT_CONTEXT_WINDOW = 128000;\nconst DEFAULT_MAX_TOKENS = 16384;\n\ninterface CustomModelConfig {\n id: string;\n name?: string;\n api?: string;\n baseUrl?: string;\n reasoning?: boolean;\n input?: (\"text\" | \"image\")[];\n cost?: { input: number; output: number; cacheRead: number; cacheWrite: number };\n contextWindow?: number;\n maxTokens?: number;\n /** Accepted alias for `maxTokens` (used by existing deployments). */\n maxOutputTokens?: number;\n thinkingLevelMap?: Model<Api>[\"thinkingLevelMap\"];\n headers?: Record<string, string>;\n compat?: unknown;\n}\n\ninterface CustomProviderConfig {\n name?: string;\n api?: string;\n baseUrl?: string;\n apiKey?: string;\n headers?: Record<string, string>;\n compat?: unknown;\n models?: CustomModelConfig[];\n}\n\ninterface ModelsJsonConfig {\n providers?: Record<string, CustomProviderConfig>;\n}\n\n/** Default location of mikan's models.json. */\nexport function defaultModelsJsonPath(): string {\n return join(homedir(), \".mikan\", \"models.json\");\n}\n\nfunction isModelsJsonConfig(parsed: unknown): parsed is ModelsJsonConfig {\n if (!parsed || typeof parsed !== \"object\") {\n throw new Error(\"models.json must be a JSON object\");\n }\n const providers = (parsed as { providers?: unknown }).providers;\n if (providers === undefined) return true;\n if (!providers || typeof providers !== \"object\" || Array.isArray(providers)) {\n throw new Error('models.json \"providers\" must be an object');\n }\n for (const [name, config] of Object.entries(providers)) {\n if (!config || typeof config !== \"object\") {\n throw new Error(`models.json provider \"${name}\" must be an object`);\n }\n const models = (config as CustomProviderConfig).models;\n if (models !== undefined) {\n if (!Array.isArray(models)) {\n throw new Error(`models.json provider \"${name}\" models must be an array`);\n }\n const api = (config as CustomProviderConfig).api;\n if (typeof api !== \"string\" || !(api in CUSTOM_API_STREAMS)) {\n throw new Error(\n `models.json provider \"${name}\" needs an \"api\" of: ${Object.keys(CUSTOM_API_STREAMS).join(\", \")}`,\n );\n }\n for (const model of models) {\n if (!model || typeof model !== \"object\" || typeof model.id !== \"string\") {\n throw new Error(`models.json provider \"${name}\" has a model without a string \"id\"`);\n }\n }\n }\n }\n return true;\n}\n\nfunction envVarNameFor(providerName: string): string {\n return `${providerName.replace(/[^a-zA-Z0-9]+/g, \"_\").toUpperCase()}_API_KEY`;\n}\n\n/**\n * Register models.json providers on top of the built-ins: a provider with its\n * own model list replaces wholesale; a bare baseUrl/compat entry overrides a\n * matching built-in in place. Returns a user-facing load error, if any —\n * built-in models stay available either way.\n */\nfunction applyModelsJson(\n models: ReturnType<typeof builtinModels>,\n modelsJsonPath: string,\n): string | undefined {\n try {\n const config = readJsonFileIfExists(\n modelsJsonPath,\n isModelsJsonConfig,\n (detail) => `models.json is invalid: ${detail}`,\n );\n for (const [providerName, providerConfig] of Object.entries(config?.providers ?? {})) {\n if (providerConfig.models && providerConfig.models.length > 0) {\n models.setProvider(buildCustomProvider(providerName, providerConfig));\n } else if (providerConfig.baseUrl || providerConfig.compat) {\n const builtin = models.getProvider(providerName);\n if (builtin) {\n models.setProvider(overrideBuiltinProvider(builtin, providerConfig));\n }\n }\n }\n return undefined;\n } catch (err) {\n return `Failed to load ${modelsJsonPath}: ${err instanceof Error ? err.message : String(err)}`;\n }\n}\n\nfunction buildCustomProvider(providerName: string, config: CustomProviderConfig): Provider {\n const api = config.api!;\n const displayName = config.name ?? providerName;\n const envVar = envVarNameFor(providerName);\n const models = (config.models ?? []).map((modelConfig): Model<Api> => {\n const model: Model<Api> = {\n id: modelConfig.id,\n name: modelConfig.name ?? modelConfig.id,\n api: (modelConfig.api ?? api) as Api,\n provider: providerName,\n baseUrl: modelConfig.baseUrl ?? config.baseUrl ?? \"\",\n reasoning: modelConfig.reasoning ?? false,\n input: modelConfig.input ?? [\"text\"],\n cost: modelConfig.cost ?? DEFAULT_COST,\n contextWindow: modelConfig.contextWindow ?? DEFAULT_CONTEXT_WINDOW,\n maxTokens: modelConfig.maxTokens ?? modelConfig.maxOutputTokens ?? DEFAULT_MAX_TOKENS,\n };\n if (modelConfig.thinkingLevelMap) model.thinkingLevelMap = modelConfig.thinkingLevelMap;\n if (modelConfig.headers ?? config.headers) {\n model.headers = { ...config.headers, ...modelConfig.headers };\n }\n const compat = modelConfig.compat ?? config.compat;\n if (compat) model.compat = compat as Model<Api>[\"compat\"];\n return model;\n });\n\n return createProvider({\n id: providerName,\n name: displayName,\n baseUrl: config.baseUrl,\n headers: config.headers,\n auth: {\n apiKey: {\n name: `${displayName} API key`,\n resolve: async ({ ctx, credential }) => {\n const key =\n (credential?.type === \"api_key\" ? credential.key : undefined) ??\n config.apiKey ??\n (await ctx.env(envVar));\n if (!key) return undefined;\n const source = config.apiKey ? \"models.json\" : envVar;\n return { auth: { apiKey: key }, source };\n },\n },\n },\n models,\n api: CUSTOM_API_STREAMS[api]!(),\n });\n}\n\n/** Rebuild a built-in provider with overridden model base URLs / compat. */\nfunction overrideBuiltinProvider(provider: Provider, config: CustomProviderConfig): Provider {\n const models = provider.getModels().map((model): Model<Api> => {\n const overridden: Model<Api> = Object.assign({}, model);\n if (config.baseUrl) overridden.baseUrl = config.baseUrl;\n if (config.compat) overridden.compat = config.compat as Model<Api>[\"compat\"];\n return overridden;\n });\n return {\n ...provider,\n getModels: () => models,\n };\n}\n\n/**\n * Model catalog backed by pi-ai's `Models`. Exposes the lookup and auth\n * operations mikan needs; streaming goes through {@link MikanModels.models}.\n */\nexport class MikanModels {\n /** Underlying pi-ai collection, for streaming/completion calls. */\n readonly models: Models;\n private loadError: string | undefined;\n\n private constructor(models: MutableModels, loadError: string | undefined) {\n this.models = models;\n this.loadError = loadError;\n }\n\n static create(options: CreateMikanModelsOptions = {}): MikanModels {\n const modelsJsonPath = options.modelsJsonPath ?? defaultModelsJsonPath();\n const models = builtinModels();\n const loadError = applyModelsJson(models, modelsJsonPath);\n return new MikanModels(models, loadError);\n }\n\n /** Error from loading models.json, if any. Built-in models stay available. */\n getError(): string | undefined {\n return this.loadError;\n }\n\n /** All known models (built-in plus custom). */\n getAll(): Model<Api>[] {\n return [...this.models.getModels()];\n }\n\n /** Find a model by provider and id. */\n find(provider: string, modelId: string): Model<Api> | undefined {\n return this.models.getModel(provider, modelId);\n }\n\n /**\n * Find a model by provider and id, or throw a user-facing configuration error.\n * Prefer this at runtime entry points over raw `find` + ad-hoc throws.\n */\n resolve(provider: string, modelId: string): Model<Api> {\n const model = this.find(provider, modelId);\n if (model) return model;\n throw new Error(\n `Unknown model \"${provider}/${modelId}\". Configure it in pi models.json or choose a registered model.`,\n );\n }\n\n /** Models whose provider auth currently resolves (API key, OAuth, or ambient). */\n async getAvailable(): Promise<Model<Api>[]> {\n const available = await Promise.all(\n this.models.getProviders().map(async (provider) => {\n try {\n return await this.models.getAvailable(provider.id);\n } catch {\n // One provider's auth failure must not hide models from other providers.\n return [];\n }\n }),\n );\n return available.flat();\n }\n\n /** Resolve request auth for a model. Undefined when unconfigured. */\n getAuth(model: Model<Api>): Promise<AuthResult | undefined> {\n return this.models.getAuth(model);\n }\n\n /**\n * Resolve an API key for a provider. Convenience for call sites that only\n * need a bearer key (for example pi-agent-core's compat stream function).\n */\n async getApiKeyForProvider(provider: string): Promise<string | undefined> {\n try {\n const auth = await this.models.getAuth(provider);\n return auth?.auth.apiKey;\n } catch {\n return undefined;\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/harness/models.ts"],"names":[],"mappings":"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","sourcesContent":["import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport {\n createProvider,\n type Api,\n type AuthResult,\n type Model,\n type Models,\n type MutableModels,\n type Provider,\n type ProviderStreams,\n} from \"@earendil-works/pi-ai\";\nimport { builtinModels } from \"@earendil-works/pi-ai/providers/all\";\nimport { anthropicMessagesApi } from \"@earendil-works/pi-ai/api/anthropic-messages.lazy\";\nimport { azureOpenAIResponsesApi } from \"@earendil-works/pi-ai/api/azure-openai-responses.lazy\";\nimport { googleGenerativeAIApi } from \"@earendil-works/pi-ai/api/google-generative-ai.lazy\";\nimport { mistralConversationsApi } from \"@earendil-works/pi-ai/api/mistral-conversations.lazy\";\nimport { openAICompletionsApi } from \"@earendil-works/pi-ai/api/openai-completions.lazy\";\nimport { openAIResponsesApi } from \"@earendil-works/pi-ai/api/openai-responses.lazy\";\nimport { readJsonFileIfExists } from \"../file-guards.js\";\nimport type { CreateMikanModelsOptions } from \"./types.js\";\n\nexport type { CreateMikanModelsOptions } from \"./types.js\";\n\nconst CUSTOM_API_STREAMS: Record<string, () => ProviderStreams> = {\n \"anthropic-messages\": anthropicMessagesApi,\n \"azure-openai-responses\": azureOpenAIResponsesApi,\n \"google-generative-ai\": googleGenerativeAIApi,\n \"mistral-conversations\": mistralConversationsApi,\n \"openai-completions\": openAICompletionsApi,\n \"openai-responses\": openAIResponsesApi,\n};\n\nconst DEFAULT_COST = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };\nconst DEFAULT_CONTEXT_WINDOW = 128000;\nconst DEFAULT_MAX_TOKENS = 16384;\n\ninterface CustomModelConfig {\n id: string;\n name?: string;\n api?: string;\n baseUrl?: string;\n reasoning?: boolean;\n input?: (\"text\" | \"image\")[];\n cost?: { input: number; output: number; cacheRead: number; cacheWrite: number };\n contextWindow?: number;\n maxTokens?: number;\n maxOutputTokens?: number;\n thinkingLevelMap?: Model<Api>[\"thinkingLevelMap\"];\n headers?: Record<string, string>;\n compat?: unknown;\n}\n\ninterface CustomProviderConfig {\n name?: string;\n api?: string;\n baseUrl?: string;\n apiKey?: string;\n headers?: Record<string, string>;\n compat?: unknown;\n models?: CustomModelConfig[];\n}\n\ninterface ModelsJsonConfig {\n providers?: Record<string, CustomProviderConfig>;\n}\n\nexport function defaultModelsJsonPath(): string {\n return join(homedir(), \".mikan\", \"models.json\");\n}\n\nfunction isModelsJsonConfig(parsed: unknown): parsed is ModelsJsonConfig {\n if (!parsed || typeof parsed !== \"object\") {\n throw new Error(\"models.json must be a JSON object\");\n }\n const providers = (parsed as { providers?: unknown }).providers;\n if (providers === undefined) return true;\n if (!providers || typeof providers !== \"object\" || Array.isArray(providers)) {\n throw new Error('models.json \"providers\" must be an object');\n }\n for (const [name, config] of Object.entries(providers)) {\n if (!config || typeof config !== \"object\") {\n throw new Error(`models.json provider \"${name}\" must be an object`);\n }\n const models = (config as CustomProviderConfig).models;\n if (models !== undefined) {\n if (!Array.isArray(models)) {\n throw new Error(`models.json provider \"${name}\" models must be an array`);\n }\n const api = (config as CustomProviderConfig).api;\n if (typeof api !== \"string\" || !(api in CUSTOM_API_STREAMS)) {\n throw new Error(\n `models.json provider \"${name}\" needs an \"api\" of: ${Object.keys(CUSTOM_API_STREAMS).join(\", \")}`,\n );\n }\n for (const model of models) {\n if (!model || typeof model !== \"object\" || typeof model.id !== \"string\") {\n throw new Error(`models.json provider \"${name}\" has a model without a string \"id\"`);\n }\n }\n }\n }\n return true;\n}\n\nfunction envVarNameFor(providerName: string): string {\n return `${providerName.replace(/[^a-zA-Z0-9]+/g, \"_\").toUpperCase()}_API_KEY`;\n}\n\nfunction applyModelsJson(\n models: ReturnType<typeof builtinModels>,\n modelsJsonPath: string,\n): string | undefined {\n try {\n const config = readJsonFileIfExists(\n modelsJsonPath,\n isModelsJsonConfig,\n (detail) => `models.json is invalid: ${detail}`,\n );\n for (const [providerName, providerConfig] of Object.entries(config?.providers ?? {})) {\n if (providerConfig.models && providerConfig.models.length > 0) {\n models.setProvider(buildCustomProvider(providerName, providerConfig));\n } else if (providerConfig.baseUrl || providerConfig.compat) {\n const builtin = models.getProvider(providerName);\n if (builtin) {\n models.setProvider(overrideBuiltinProvider(builtin, providerConfig));\n }\n }\n }\n return undefined;\n } catch (err) {\n return `Failed to load ${modelsJsonPath}: ${err instanceof Error ? err.message : String(err)}`;\n }\n}\n\nfunction buildCustomProvider(providerName: string, config: CustomProviderConfig): Provider {\n const api = config.api!;\n const displayName = config.name ?? providerName;\n const envVar = envVarNameFor(providerName);\n const models = (config.models ?? []).map((modelConfig): Model<Api> => {\n const model: Model<Api> = {\n id: modelConfig.id,\n name: modelConfig.name ?? modelConfig.id,\n api: (modelConfig.api ?? api) as Api,\n provider: providerName,\n baseUrl: modelConfig.baseUrl ?? config.baseUrl ?? \"\",\n reasoning: modelConfig.reasoning ?? false,\n input: modelConfig.input ?? [\"text\"],\n cost: modelConfig.cost ?? DEFAULT_COST,\n contextWindow: modelConfig.contextWindow ?? DEFAULT_CONTEXT_WINDOW,\n maxTokens: modelConfig.maxTokens ?? modelConfig.maxOutputTokens ?? DEFAULT_MAX_TOKENS,\n };\n if (modelConfig.thinkingLevelMap) model.thinkingLevelMap = modelConfig.thinkingLevelMap;\n if (modelConfig.headers ?? config.headers) {\n model.headers = { ...config.headers, ...modelConfig.headers };\n }\n const compat = modelConfig.compat ?? config.compat;\n if (compat) model.compat = compat as Model<Api>[\"compat\"];\n return model;\n });\n\n return createProvider({\n id: providerName,\n name: displayName,\n baseUrl: config.baseUrl,\n headers: config.headers,\n auth: {\n apiKey: {\n name: `${displayName} API key`,\n resolve: async ({ ctx, credential }) => {\n const key =\n (credential?.type === \"api_key\" ? credential.key : undefined) ??\n config.apiKey ??\n (await ctx.env(envVar));\n if (!key) return undefined;\n const source = config.apiKey ? \"models.json\" : envVar;\n return { auth: { apiKey: key }, source };\n },\n },\n },\n models,\n api: CUSTOM_API_STREAMS[api]!(),\n });\n}\n\nfunction overrideBuiltinProvider(provider: Provider, config: CustomProviderConfig): Provider {\n const models = provider.getModels().map((model): Model<Api> => {\n const overridden: Model<Api> = Object.assign({}, model);\n if (config.baseUrl) overridden.baseUrl = config.baseUrl;\n if (config.compat) overridden.compat = config.compat as Model<Api>[\"compat\"];\n return overridden;\n });\n return {\n ...provider,\n getModels: () => models,\n };\n}\n\nexport class MikanModels {\n readonly models: Models;\n private loadError: string | undefined;\n\n private constructor(models: MutableModels, loadError: string | undefined) {\n this.models = models;\n this.loadError = loadError;\n }\n\n static create(options: CreateMikanModelsOptions = {}): MikanModels {\n const modelsJsonPath = options.modelsJsonPath ?? defaultModelsJsonPath();\n const models = builtinModels();\n const loadError = applyModelsJson(models, modelsJsonPath);\n return new MikanModels(models, loadError);\n }\n\n getError(): string | undefined {\n return this.loadError;\n }\n\n getAll(): Model<Api>[] {\n return [...this.models.getModels()];\n }\n\n find(provider: string, modelId: string): Model<Api> | undefined {\n return this.models.getModel(provider, modelId);\n }\n\n resolve(provider: string, modelId: string): Model<Api> {\n const model = this.find(provider, modelId);\n if (model) return model;\n throw new Error(\n `Unknown model \"${provider}/${modelId}\". Configure it in pi models.json or choose a registered model.`,\n );\n }\n\n async getAvailable(): Promise<Model<Api>[]> {\n const available = await Promise.all(\n this.models.getProviders().map(async (provider) => {\n try {\n return await this.models.getAvailable(provider.id);\n } catch {\n return [];\n }\n }),\n );\n return available.flat();\n }\n\n getAuth(model: Model<Api>): Promise<AuthResult | undefined> {\n return this.models.getAuth(model);\n }\n\n async getApiKeyForProvider(provider: string): Promise<string | undefined> {\n try {\n const auth = await this.models.getAuth(provider);\n return auth?.auth.apiKey;\n } catch {\n return undefined;\n }\n }\n}\n"]}
|
|
@@ -1,12 +1,6 @@
|
|
|
1
1
|
import { type Office } from "../office/index.js";
|
|
2
2
|
import type { OfficeKey } from "../types.js";
|
|
3
3
|
import type { McpServerConfig } from "./types.js";
|
|
4
|
-
/**
|
|
5
|
-
* Fill in the deployment default for a Slack office that has not declared
|
|
6
|
-
* `open-connector` anywhere. Writes the token as a conversation MCP entry;
|
|
7
|
-
* throws when provisioning fails so the caller can report it. Any declared
|
|
8
|
-
* entry (self-hosted, disabled, or global) is respected untouched.
|
|
9
|
-
*/
|
|
10
4
|
export declare function ensureDefaultOpenConnector(office: Office, platformWorkspaceId: string | undefined, defaultServer: McpServerConfig | undefined, signal?: AbortSignal): Promise<void>;
|
|
11
5
|
export interface LegacyTokenMigrationReport {
|
|
12
6
|
migrated: OfficeKey[];
|
|
@@ -15,11 +9,5 @@ export interface LegacyTokenMigrationReport {
|
|
|
15
9
|
reason: string;
|
|
16
10
|
}[];
|
|
17
11
|
}
|
|
18
|
-
/**
|
|
19
|
-
* One-time conversion of pre-existing `open-connector-runtime-token.json`
|
|
20
|
-
* files into conversation `mcpServers` entries for `defaultUrl`. Files whose
|
|
21
|
-
* token was minted for another origin, or whose office already declares the
|
|
22
|
-
* server, are left in place and reported. Run with the daemon stopped.
|
|
23
|
-
*/
|
|
24
12
|
export declare function migrateLegacyOpenConnectorTokens(stateDir: string, defaultUrl: string, workspaceRoot?: string): LegacyTokenMigrationReport;
|
|
25
13
|
//# sourceMappingURL=open-connector.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"open-connector.d.ts","sourceRoot":"","sources":["../../src/harness/open-connector.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"open-connector.d.ts","sourceRoot":"","sources":["../../src/harness/open-connector.ts"],"names":[],"mappings":"AAOA,OAAO,EAKL,KAAK,MAAM,EACZ,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AA6FlD,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,MAAM,EACd,mBAAmB,EAAE,MAAM,GAAG,SAAS,EACvC,aAAa,EAAE,eAAe,GAAG,SAAS,EAC1C,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC,CA+Bf;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtB,OAAO,EAAE;QAAE,GAAG,EAAE,SAAS,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC/C;AAED,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,aAAa,SAA8B,GAC1C,0BAA0B,CAgD5B"}
|
|
@@ -1,11 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* OpenConnector is an ordinary MCP server with one deployment-provided
|
|
3
|
-
* default. When a Slack office has not declared `open-connector` in global or
|
|
4
|
-
* conversation settings, the host mints a runtime token for that office with
|
|
5
|
-
* the startup admin token and writes a plain conversation `mcpServers` entry.
|
|
6
|
-
* From then on the entry is loaded, tested, disabled, or removed like any
|
|
7
|
-
* other MCP server; the admin token itself never leaves this module.
|
|
8
|
-
*/
|
|
9
1
|
import { Type } from "@sinclair/typebox";
|
|
10
2
|
import { existsSync, readdirSync, rmSync } from "node:fs";
|
|
11
3
|
import { join } from "node:path";
|
|
@@ -46,7 +38,6 @@ function requestSignal(signal) {
|
|
|
46
38
|
const timeout = AbortSignal.timeout(REQUEST_TIMEOUT_MS);
|
|
47
39
|
return signal ? AbortSignal.any([signal, timeout]) : timeout;
|
|
48
40
|
}
|
|
49
|
-
/** Mint a runtime token that copies the deployment's current action policy. */
|
|
50
41
|
async function createRuntimeToken(origin, adminToken, name, signal) {
|
|
51
42
|
const headers = { Authorization: `Bearer ${adminToken}` };
|
|
52
43
|
const policyValue = await readJson(await fetch(new URL("/api/runtime-policy", origin), { headers, signal: requestSignal(signal) }), "runtime policy request");
|
|
@@ -81,12 +72,6 @@ function isDeclared(office) {
|
|
|
81
72
|
return (Object.hasOwn(scopes.global, OPEN_CONNECTOR_SERVER) ||
|
|
82
73
|
Object.hasOwn(scopes.conversation, OPEN_CONNECTOR_SERVER));
|
|
83
74
|
}
|
|
84
|
-
/**
|
|
85
|
-
* Fill in the deployment default for a Slack office that has not declared
|
|
86
|
-
* `open-connector` anywhere. Writes the token as a conversation MCP entry;
|
|
87
|
-
* throws when provisioning fails so the caller can report it. Any declared
|
|
88
|
-
* entry (self-hosted, disabled, or global) is respected untouched.
|
|
89
|
-
*/
|
|
90
75
|
export async function ensureDefaultOpenConnector(office, platformWorkspaceId, defaultServer, signal) {
|
|
91
76
|
const adminToken = readEnv("OPENCONNECTOR_ADMIN_TOKEN");
|
|
92
77
|
if (!defaultServer?.url || !adminToken || office.address.platform !== "slack")
|
|
@@ -104,7 +89,6 @@ export async function ensureDefaultOpenConnector(office, platformWorkspaceId, de
|
|
|
104
89
|
const task = (async () => {
|
|
105
90
|
const name = `mikan:slack:${platformWorkspaceId}:${office.address.conversationId}`;
|
|
106
91
|
const token = await createRuntimeToken(new URL(url).origin, adminToken, name, signal);
|
|
107
|
-
// Re-read after the await: an operator may have declared the server meanwhile.
|
|
108
92
|
if (isDeclared(office))
|
|
109
93
|
return;
|
|
110
94
|
const current = loadScopeMcpServers(office).conversation;
|
|
@@ -121,12 +105,6 @@ export async function ensureDefaultOpenConnector(office, platformWorkspaceId, de
|
|
|
121
105
|
pending.delete(office.stateDir);
|
|
122
106
|
}
|
|
123
107
|
}
|
|
124
|
-
/**
|
|
125
|
-
* One-time conversion of pre-existing `open-connector-runtime-token.json`
|
|
126
|
-
* files into conversation `mcpServers` entries for `defaultUrl`. Files whose
|
|
127
|
-
* token was minted for another origin, or whose office already declares the
|
|
128
|
-
* server, are left in place and reported. Run with the daemon stopped.
|
|
129
|
-
*/
|
|
130
108
|
export function migrateLegacyOpenConnectorTokens(stateDir, defaultUrl, workspaceRoot = join(stateDir, "workspace")) {
|
|
131
109
|
const origin = new URL(defaultUrl).origin;
|
|
132
110
|
const report = { migrated: [], skipped: [] };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"open-connector.js","sourceRoot":"","sources":["../../src/harness/open-connector.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,KAAK,GAAG,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,mBAAmB,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AACvF,OAAO,EAAE,QAAQ,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EACL,eAAe,EACf,WAAW,EACX,qBAAqB,EACrB,SAAS,GAEV,MAAM,oBAAoB,CAAC;AAI5B,MAAM,qBAAqB,GAAG,gBAAgB,CAAC;AAC/C,MAAM,iBAAiB,GAAG,mCAAmC,CAAC;AAC9D,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAClC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAyB,CAAC;AAEjD,MAAM,iBAAiB,GAAG,IAAI,CAAC,MAAM,CACnC;IACE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACxB,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;IACrB,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE;IACnB,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE;IACjB,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE;CACrB,EACD,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAChC,CAAC;AAEF,SAAS,WAAW,CAAC,KAAc,EAAE,KAAa;IAChD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;QAC9E,MAAM,IAAI,KAAK,CAAC,qCAAqC,KAAK,EAAE,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,QAAkB,EAAE,SAAiB;IAC3D,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,iBAAiB,SAAS,qBAAqB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACpF,CAAC;IACD,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC/B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,iBAAiB,SAAS,wBAAwB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACxF,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,MAAoB;IACzC,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACxD,OAAO,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AAC/D,CAAC;AAED,+EAA+E;AAC/E,KAAK,UAAU,kBAAkB,CAC/B,MAAc,EACd,UAAkB,EAClB,IAAY,EACZ,MAAoB;IAEpB,MAAM,OAAO,GAAG,EAAE,aAAa,EAAE,UAAU,UAAU,EAAE,EAAE,CAAC;IAC1D,MAAM,WAAW,GAAG,MAAM,QAAQ,CAChC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,qBAAqB,EAAE,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,EAC/F,wBAAwB,CACzB,CAAC;IACF,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IACD,MAAM,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC;IAC1C,MAAM,aAAa,GAAG,MAAM,QAAQ,CAClC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,qBAAqB,EAAE,MAAM,CAAC,EAAE;QAClD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,GAAG,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC3D,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,IAAI;YACJ,cAAc,EAAE,WAAW,CAAC,UAAU,CAAC,cAAc,EAAE,uBAAuB,CAAC;YAC/E,cAAc,EAAE,WAAW,CAAC,UAAU,CAAC,cAAc,EAAE,uBAAuB,CAAC;YAC/E,cAAc,EAAE,WAAW,CAAC,UAAU,CAAC,cAAc,EAAE,uBAAuB,CAAC;SAChF,CAAC;QACF,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC;KAC9B,CAAC,EACF,wBAAwB,CACzB,CAAC;IACF,IACE,CAAC,QAAQ,CAAC,aAAa,CAAC;QACxB,OAAO,aAAa,CAAC,KAAK,KAAK,QAAQ;QACvC,CAAC,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC;QAC/B,aAAa,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI,EAClC,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,aAAa,CAAC,KAAK,CAAC;AAC7B,CAAC;AAED,SAAS,YAAY,CAAC,GAAW,EAAE,KAAa;IAC9C,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE,EAAE,CAAC;AAChE,CAAC;AAED,SAAS,UAAU,CAAC,MAAc;IAChC,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC3C,OAAO,CACL,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC;QACnD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,qBAAqB,CAAC,CAC1D,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,MAAc,EACd,mBAAuC,EACvC,aAA0C,EAC1C,MAAoB;IAEpB,MAAM,UAAU,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAAC;IACxD,IAAI,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO;IACtF,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACzB,GAAG,CAAC,UAAU,CACZ,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,iCAAiC,EAClE,mCAAmC,CACpC,CAAC;QACF,OAAO;IACT,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO;IAE/B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC9C,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC;IAC9B,MAAM,IAAI,GAAG,CAAC,KAAK,IAAI,EAAE;QACvB,MAAM,IAAI,GAAG,eAAe,mBAAmB,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;QACnF,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QACtF,+EAA+E;QAC/E,IAAI,UAAU,CAAC,MAAM,CAAC;YAAE,OAAO;QAC/B,MAAM,OAAO,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC;QACzD,0BAA0B,CAAC,MAAM,EAAE;YACjC,UAAU,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC,qBAAqB,CAAC,EAAE,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE;SAC9E,CAAC,CAAC;QACH,GAAG,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,2CAA2C,CAAC,CAAC;IAC5F,CAAC,CAAC,EAAE,CAAC;IACL,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,IAAI,CAAC;IACb,CAAC;YAAS,CAAC;QACT,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;AACH,CAAC;AAOD;;;;;GAKG;AACH,MAAM,UAAU,gCAAgC,CAC9C,QAAgB,EAChB,UAAkB,EAClB,aAAa,GAAG,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC;IAE3C,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;IAC1C,MAAM,MAAM,GAA+B,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACzE,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;IACzD,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC;QAAE,OAAO,MAAM,CAAC;IACjD,MAAM,SAAS,GAAG,eAAe,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,CAAC;IACrE,MAAM,UAAU,GAAG,IAAI,GAAG,CACxB,qBAAqB,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,CAAU,CAAC,CACtF,CAAC;IACF,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,gBAAgB,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAC3E,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,SAAS;QAC/D,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC;QACvB,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,EAAE,GAAG,EAAE,iBAAiB,CAAC,CAAC;QAClE,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,SAAS;QACtC,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,0BAA0B,EAAE,CAAC,CAAC;YACjE,SAAS;QACX,CAAC;QACD,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACvB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,qBAAqB,sBAAsB,EAAE,CAAC,CAAC;YACrF,SAAS;QACX,CAAC;QACD,IAAI,KAAK,CAAC;QACV,IAAI,CAAC;YACH,KAAK,GAAG,0BAA0B,CAChC,UAAU,EACV,iBAAiB,EACjB,CAAC,MAAM,EAAE,EAAE,CAAC,gCAAgC,MAAM,EAAE,CACrD,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC7F,SAAS;QACX,CAAC;QACD,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC5B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,gBAAgB,KAAK,CAAC,MAAM,UAAU,EAAE,CAAC,CAAC;YAC7E,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC;QACzD,0BAA0B,CAAC,MAAM,EAAE;YACjC,UAAU,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC,qBAAqB,CAAC,EAAE,YAAY,CAAC,UAAU,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE;SAC3F,CAAC,CAAC;QACH,MAAM,CAAC,UAAU,CAAC,CAAC;QACnB,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["/**\n * OpenConnector is an ordinary MCP server with one deployment-provided\n * default. When a Slack office has not declared `open-connector` in global or\n * conversation settings, the host mints a runtime token for that office with\n * the startup admin token and writes a plain conversation `mcpServers` entry.\n * From then on the entry is loaded, tested, disabled, or removed like any\n * other MCP server; the admin token itself never leaves this module.\n */\nimport { Type } from \"@sinclair/typebox\";\nimport { existsSync, readdirSync, rmSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { readEnv } from \"../env-manifest.js\";\nimport * as log from \"../log.js\";\nimport { loadScopeMcpServers, updateConversationSettings } from \"../settings/index.js\";\nimport { isRecord, readJsonSchemaFileIfExists } from \"../file-guards.js\";\nimport {\n createWorkspace,\n isOfficeKey,\n listRegisteredOffices,\n officeKey,\n type Office,\n} from \"../office/index.js\";\nimport type { OfficeKey } from \"../types.js\";\nimport type { McpServerConfig } from \"./types.js\";\n\nconst OPEN_CONNECTOR_SERVER = \"open-connector\";\nconst LEGACY_TOKEN_FILE = \"open-connector-runtime-token.json\";\nconst REQUEST_TIMEOUT_MS = 10_000;\nconst pending = new Map<string, Promise<void>>();\n\nconst LegacyTokenSchema = Type.Object(\n {\n version: Type.Literal(1),\n origin: Type.String(),\n name: Type.String(),\n id: Type.String(),\n token: Type.String(),\n },\n { additionalProperties: false },\n);\n\nfunction stringArray(value: unknown, field: string): string[] {\n if (!Array.isArray(value) || !value.every((item) => typeof item === \"string\")) {\n throw new Error(`OpenConnector returned an invalid ${field}`);\n }\n return value;\n}\n\nasync function readJson(response: Response, operation: string): Promise<unknown> {\n if (!response.ok) {\n throw new Error(`OpenConnector ${operation} failed with HTTP ${response.status}`);\n }\n try {\n return await response.json();\n } catch (error) {\n throw new Error(`OpenConnector ${operation} returned invalid JSON`, { cause: error });\n }\n}\n\nfunction requestSignal(signal?: AbortSignal): AbortSignal {\n const timeout = AbortSignal.timeout(REQUEST_TIMEOUT_MS);\n return signal ? AbortSignal.any([signal, timeout]) : timeout;\n}\n\n/** Mint a runtime token that copies the deployment's current action policy. */\nasync function createRuntimeToken(\n origin: string,\n adminToken: string,\n name: string,\n signal?: AbortSignal,\n): Promise<string> {\n const headers = { Authorization: `Bearer ${adminToken}` };\n const policyValue = await readJson(\n await fetch(new URL(\"/api/runtime-policy\", origin), { headers, signal: requestSignal(signal) }),\n \"runtime policy request\",\n );\n if (!isRecord(policyValue) || !isRecord(policyValue.deployment)) {\n throw new Error(\"OpenConnector returned an invalid runtime policy\");\n }\n const deployment = policyValue.deployment;\n const responseValue = await readJson(\n await fetch(new URL(\"/api/runtime-tokens\", origin), {\n method: \"POST\",\n headers: { ...headers, \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n name,\n allowedActions: stringArray(deployment.allowedActions, \"allowedActions policy\"),\n blockedActions: stringArray(deployment.blockedActions, \"blockedActions policy\"),\n allowedProxies: stringArray(deployment.allowedProxies, \"allowedProxies policy\"),\n }),\n signal: requestSignal(signal),\n }),\n \"runtime token creation\",\n );\n if (\n !isRecord(responseValue) ||\n typeof responseValue.token !== \"string\" ||\n !isRecord(responseValue.record) ||\n responseValue.record.name !== name\n ) {\n throw new Error(\"OpenConnector returned an invalid runtime token\");\n }\n return responseValue.token;\n}\n\nfunction defaultEntry(url: string, token: string): McpServerConfig {\n return { url, headers: { Authorization: `Bearer ${token}` } };\n}\n\nfunction isDeclared(office: Office): boolean {\n const scopes = loadScopeMcpServers(office);\n return (\n Object.hasOwn(scopes.global, OPEN_CONNECTOR_SERVER) ||\n Object.hasOwn(scopes.conversation, OPEN_CONNECTOR_SERVER)\n );\n}\n\n/**\n * Fill in the deployment default for a Slack office that has not declared\n * `open-connector` anywhere. Writes the token as a conversation MCP entry;\n * throws when provisioning fails so the caller can report it. Any declared\n * entry (self-hosted, disabled, or global) is respected untouched.\n */\nexport async function ensureDefaultOpenConnector(\n office: Office,\n platformWorkspaceId: string | undefined,\n defaultServer: McpServerConfig | undefined,\n signal?: AbortSignal,\n): Promise<void> {\n const adminToken = readEnv(\"OPENCONNECTOR_ADMIN_TOKEN\");\n if (!defaultServer?.url || !adminToken || office.address.platform !== \"slack\") return;\n if (!platformWorkspaceId) {\n log.logWarning(\n `[${office.address.conversationId}] OpenConnector default skipped`,\n \"Slack workspace ID is unavailable\",\n );\n return;\n }\n if (isDeclared(office)) return;\n\n const inflight = pending.get(office.stateDir);\n if (inflight) return inflight;\n const url = defaultServer.url;\n const task = (async () => {\n const name = `mikan:slack:${platformWorkspaceId}:${office.address.conversationId}`;\n const token = await createRuntimeToken(new URL(url).origin, adminToken, name, signal);\n // Re-read after the await: an operator may have declared the server meanwhile.\n if (isDeclared(office)) return;\n const current = loadScopeMcpServers(office).conversation;\n updateConversationSettings(office, {\n mcpServers: { ...current, [OPEN_CONNECTOR_SERVER]: defaultEntry(url, token) },\n });\n log.logInfo(`[${office.address.conversationId}] Provisioned default OpenConnector token`);\n })();\n pending.set(office.stateDir, task);\n try {\n await task;\n } finally {\n pending.delete(office.stateDir);\n }\n}\n\nexport interface LegacyTokenMigrationReport {\n migrated: OfficeKey[];\n skipped: { key: OfficeKey; reason: string }[];\n}\n\n/**\n * One-time conversion of pre-existing `open-connector-runtime-token.json`\n * files into conversation `mcpServers` entries for `defaultUrl`. Files whose\n * token was minted for another origin, or whose office already declares the\n * server, are left in place and reported. Run with the daemon stopped.\n */\nexport function migrateLegacyOpenConnectorTokens(\n stateDir: string,\n defaultUrl: string,\n workspaceRoot = join(stateDir, \"workspace\"),\n): LegacyTokenMigrationReport {\n const origin = new URL(defaultUrl).origin;\n const report: LegacyTokenMigrationReport = { migrated: [], skipped: [] };\n const conversationsDir = join(stateDir, \"conversations\");\n if (!existsSync(conversationsDir)) return report;\n const workspace = createWorkspace({ root: workspaceRoot, stateDir });\n const registered = new Map(\n listRegisteredOffices(stateDir).map((record) => [officeKey(record), record] as const),\n );\n for (const entry of readdirSync(conversationsDir, { withFileTypes: true })) {\n if (!entry.isDirectory() || !isOfficeKey(entry.name)) continue;\n const key = entry.name;\n const legacyPath = join(conversationsDir, key, LEGACY_TOKEN_FILE);\n if (!existsSync(legacyPath)) continue;\n const record = registered.get(key);\n if (!record) {\n report.skipped.push({ key, reason: \"office is not registered\" });\n continue;\n }\n const office = workspace.office(record);\n if (isDeclared(office)) {\n report.skipped.push({ key, reason: `${OPEN_CONNECTOR_SERVER} is already declared` });\n continue;\n }\n let state;\n try {\n state = readJsonSchemaFileIfExists(\n legacyPath,\n LegacyTokenSchema,\n (detail) => `Malformed legacy token file: ${detail}`,\n );\n } catch (error) {\n report.skipped.push({ key, reason: error instanceof Error ? error.message : String(error) });\n continue;\n }\n if (!state) continue;\n if (state.origin !== origin) {\n report.skipped.push({ key, reason: `token origin ${state.origin} differs` });\n continue;\n }\n const current = loadScopeMcpServers(office).conversation;\n updateConversationSettings(office, {\n mcpServers: { ...current, [OPEN_CONNECTOR_SERVER]: defaultEntry(defaultUrl, state.token) },\n });\n rmSync(legacyPath);\n report.migrated.push(key);\n }\n return report;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"open-connector.js","sourceRoot":"","sources":["../../src/harness/open-connector.ts"],"names":[],"mappings":"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","sourcesContent":["import { Type } from \"@sinclair/typebox\";\nimport { existsSync, readdirSync, rmSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { readEnv } from \"../env-manifest.js\";\nimport * as log from \"../log.js\";\nimport { loadScopeMcpServers, updateConversationSettings } from \"../settings/index.js\";\nimport { isRecord, readJsonSchemaFileIfExists } from \"../file-guards.js\";\nimport {\n createWorkspace,\n isOfficeKey,\n listRegisteredOffices,\n officeKey,\n type Office,\n} from \"../office/index.js\";\nimport type { OfficeKey } from \"../types.js\";\nimport type { McpServerConfig } from \"./types.js\";\n\nconst OPEN_CONNECTOR_SERVER = \"open-connector\";\nconst LEGACY_TOKEN_FILE = \"open-connector-runtime-token.json\";\nconst REQUEST_TIMEOUT_MS = 10_000;\nconst pending = new Map<string, Promise<void>>();\n\nconst LegacyTokenSchema = Type.Object(\n {\n version: Type.Literal(1),\n origin: Type.String(),\n name: Type.String(),\n id: Type.String(),\n token: Type.String(),\n },\n { additionalProperties: false },\n);\n\nfunction stringArray(value: unknown, field: string): string[] {\n if (!Array.isArray(value) || !value.every((item) => typeof item === \"string\")) {\n throw new Error(`OpenConnector returned an invalid ${field}`);\n }\n return value;\n}\n\nasync function readJson(response: Response, operation: string): Promise<unknown> {\n if (!response.ok) {\n throw new Error(`OpenConnector ${operation} failed with HTTP ${response.status}`);\n }\n try {\n return await response.json();\n } catch (error) {\n throw new Error(`OpenConnector ${operation} returned invalid JSON`, { cause: error });\n }\n}\n\nfunction requestSignal(signal?: AbortSignal): AbortSignal {\n const timeout = AbortSignal.timeout(REQUEST_TIMEOUT_MS);\n return signal ? AbortSignal.any([signal, timeout]) : timeout;\n}\n\nasync function createRuntimeToken(\n origin: string,\n adminToken: string,\n name: string,\n signal?: AbortSignal,\n): Promise<string> {\n const headers = { Authorization: `Bearer ${adminToken}` };\n const policyValue = await readJson(\n await fetch(new URL(\"/api/runtime-policy\", origin), { headers, signal: requestSignal(signal) }),\n \"runtime policy request\",\n );\n if (!isRecord(policyValue) || !isRecord(policyValue.deployment)) {\n throw new Error(\"OpenConnector returned an invalid runtime policy\");\n }\n const deployment = policyValue.deployment;\n const responseValue = await readJson(\n await fetch(new URL(\"/api/runtime-tokens\", origin), {\n method: \"POST\",\n headers: { ...headers, \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n name,\n allowedActions: stringArray(deployment.allowedActions, \"allowedActions policy\"),\n blockedActions: stringArray(deployment.blockedActions, \"blockedActions policy\"),\n allowedProxies: stringArray(deployment.allowedProxies, \"allowedProxies policy\"),\n }),\n signal: requestSignal(signal),\n }),\n \"runtime token creation\",\n );\n if (\n !isRecord(responseValue) ||\n typeof responseValue.token !== \"string\" ||\n !isRecord(responseValue.record) ||\n responseValue.record.name !== name\n ) {\n throw new Error(\"OpenConnector returned an invalid runtime token\");\n }\n return responseValue.token;\n}\n\nfunction defaultEntry(url: string, token: string): McpServerConfig {\n return { url, headers: { Authorization: `Bearer ${token}` } };\n}\n\nfunction isDeclared(office: Office): boolean {\n const scopes = loadScopeMcpServers(office);\n return (\n Object.hasOwn(scopes.global, OPEN_CONNECTOR_SERVER) ||\n Object.hasOwn(scopes.conversation, OPEN_CONNECTOR_SERVER)\n );\n}\n\nexport async function ensureDefaultOpenConnector(\n office: Office,\n platformWorkspaceId: string | undefined,\n defaultServer: McpServerConfig | undefined,\n signal?: AbortSignal,\n): Promise<void> {\n const adminToken = readEnv(\"OPENCONNECTOR_ADMIN_TOKEN\");\n if (!defaultServer?.url || !adminToken || office.address.platform !== \"slack\") return;\n if (!platformWorkspaceId) {\n log.logWarning(\n `[${office.address.conversationId}] OpenConnector default skipped`,\n \"Slack workspace ID is unavailable\",\n );\n return;\n }\n if (isDeclared(office)) return;\n\n const inflight = pending.get(office.stateDir);\n if (inflight) return inflight;\n const url = defaultServer.url;\n const task = (async () => {\n const name = `mikan:slack:${platformWorkspaceId}:${office.address.conversationId}`;\n const token = await createRuntimeToken(new URL(url).origin, adminToken, name, signal);\n if (isDeclared(office)) return;\n const current = loadScopeMcpServers(office).conversation;\n updateConversationSettings(office, {\n mcpServers: { ...current, [OPEN_CONNECTOR_SERVER]: defaultEntry(url, token) },\n });\n log.logInfo(`[${office.address.conversationId}] Provisioned default OpenConnector token`);\n })();\n pending.set(office.stateDir, task);\n try {\n await task;\n } finally {\n pending.delete(office.stateDir);\n }\n}\n\nexport interface LegacyTokenMigrationReport {\n migrated: OfficeKey[];\n skipped: { key: OfficeKey; reason: string }[];\n}\n\nexport function migrateLegacyOpenConnectorTokens(\n stateDir: string,\n defaultUrl: string,\n workspaceRoot = join(stateDir, \"workspace\"),\n): LegacyTokenMigrationReport {\n const origin = new URL(defaultUrl).origin;\n const report: LegacyTokenMigrationReport = { migrated: [], skipped: [] };\n const conversationsDir = join(stateDir, \"conversations\");\n if (!existsSync(conversationsDir)) return report;\n const workspace = createWorkspace({ root: workspaceRoot, stateDir });\n const registered = new Map(\n listRegisteredOffices(stateDir).map((record) => [officeKey(record), record] as const),\n );\n for (const entry of readdirSync(conversationsDir, { withFileTypes: true })) {\n if (!entry.isDirectory() || !isOfficeKey(entry.name)) continue;\n const key = entry.name;\n const legacyPath = join(conversationsDir, key, LEGACY_TOKEN_FILE);\n if (!existsSync(legacyPath)) continue;\n const record = registered.get(key);\n if (!record) {\n report.skipped.push({ key, reason: \"office is not registered\" });\n continue;\n }\n const office = workspace.office(record);\n if (isDeclared(office)) {\n report.skipped.push({ key, reason: `${OPEN_CONNECTOR_SERVER} is already declared` });\n continue;\n }\n let state;\n try {\n state = readJsonSchemaFileIfExists(\n legacyPath,\n LegacyTokenSchema,\n (detail) => `Malformed legacy token file: ${detail}`,\n );\n } catch (error) {\n report.skipped.push({ key, reason: error instanceof Error ? error.message : String(error) });\n continue;\n }\n if (!state) continue;\n if (state.origin !== origin) {\n report.skipped.push({ key, reason: `token origin ${state.origin} differs` });\n continue;\n }\n const current = loadScopeMcpServers(office).conversation;\n updateConversationSettings(office, {\n mcpServers: { ...current, [OPEN_CONNECTOR_SERVER]: defaultEntry(defaultUrl, state.token) },\n });\n rmSync(legacyPath);\n report.migrated.push(key);\n }\n return report;\n}\n"]}
|
|
@@ -11,6 +11,7 @@ export declare function activateRunPresentation(runState: RunnerSessionState, co
|
|
|
11
11
|
sessionUuid: string;
|
|
12
12
|
triggerAttribution: string | undefined;
|
|
13
13
|
}): RunPresentation;
|
|
14
|
+
export declare function getFinalAssistantText(session: MikanAgentSession): string;
|
|
14
15
|
export declare function isEventTriggerAttribution(triggerAttribution: string | undefined): boolean;
|
|
15
16
|
export declare function finalizeRunResponse(responder: ConversationResponder, session: MikanAgentSession, runState: RunnerSessionState, options?: {
|
|
16
17
|
triggerSessionLink?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presenter.d.ts","sourceRoot":"","sources":["../../src/harness/presenter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,GAAG,EAAE,KAAK,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,KAAK,EAEV,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAOtD,OAAO,KAAK,EAAE,qBAAqB,EAA4B,MAAM,aAAa,CAAC;AACnF,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"presenter.d.ts","sourceRoot":"","sources":["../../src/harness/presenter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,GAAG,EAAE,KAAK,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,KAAK,EAEV,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAOtD,OAAO,KAAK,EAAE,qBAAqB,EAA4B,MAAM,aAAa,CAAC;AACnF,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AAmGxE,wBAAgB,cAAc,IAAI,kBAAkB,CAEnD;AAED,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,EAAE;IACP,SAAS,EAAE,qBAAqB,CAAC;IACjC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,GAAG,SAAS,CAAC;CACxC,GACA,eAAe,CA2CjB;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAGxE;AAED,wBAAgB,yBAAyB,CAAC,kBAAkB,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAEzF;AA6JD,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,qBAAqB,EAChC,OAAO,EAAE,iBAAiB,EAC1B,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,CAAC,EAAE;IACR,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,kBAAkB,CAAC,EAAE,MAAM,MAAM,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,GACA,OAAO,CAAC,IAAI,CAAC,CAsBf;AA8ED,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiG/E;AAkcD,wBAAgB,0BAA0B,CAAC,MAAM,EAAE;IACjD,OAAO,EAAE,iBAAiB,CAAC;IAC3B,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,WAAW,EAAE,UAAU,CAAC,OAAO,2BAA2B,CAAC,CAAC;CAC7D,GAAG,IAAI,CAiBP"}
|