@geminixiang/mikan 1.0.0-beta.4 → 1.0.0-beta.40
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 +688 -0
- package/README.md +99 -36
- package/dist/adapter.d.ts +11 -1
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js +18 -1
- package/dist/adapter.js.map +1 -1
- package/dist/adapters/discord/bot.d.ts +6 -7
- package/dist/adapters/discord/bot.d.ts.map +1 -1
- package/dist/adapters/discord/bot.js +82 -117
- package/dist/adapters/discord/bot.js.map +1 -1
- package/dist/adapters/discord/context.d.ts +3 -1
- package/dist/adapters/discord/context.d.ts.map +1 -1
- package/dist/adapters/discord/context.js +54 -215
- package/dist/adapters/discord/context.js.map +1 -1
- package/dist/adapters/github/bot.d.ts +89 -0
- package/dist/adapters/github/bot.d.ts.map +1 -0
- package/dist/adapters/github/bot.js +653 -0
- package/dist/adapters/github/bot.js.map +1 -0
- package/dist/adapters/github/client.d.ts +122 -0
- package/dist/adapters/github/client.d.ts.map +1 -0
- package/dist/adapters/github/client.js +314 -0
- package/dist/adapters/github/client.js.map +1 -0
- package/dist/adapters/github/cloudbuild.d.ts +19 -0
- package/dist/adapters/github/cloudbuild.d.ts.map +1 -0
- package/dist/adapters/github/cloudbuild.js +71 -0
- package/dist/adapters/github/cloudbuild.js.map +1 -0
- package/dist/adapters/github/context.d.ts +12 -0
- package/dist/adapters/github/context.d.ts.map +1 -0
- package/dist/adapters/github/context.js +101 -0
- package/dist/adapters/github/context.js.map +1 -0
- package/dist/adapters/github/gcp-auth.d.ts +28 -0
- package/dist/adapters/github/gcp-auth.d.ts.map +1 -0
- package/dist/adapters/github/gcp-auth.js +196 -0
- package/dist/adapters/github/gcp-auth.js.map +1 -0
- package/dist/adapters/github/github-ops.d.ts +91 -0
- package/dist/adapters/github/github-ops.d.ts.map +1 -0
- package/dist/adapters/github/github-ops.js +406 -0
- package/dist/adapters/github/github-ops.js.map +1 -0
- package/dist/adapters/github/ids.d.ts +34 -0
- package/dist/adapters/github/ids.d.ts.map +1 -0
- package/dist/adapters/github/ids.js +57 -0
- package/dist/adapters/github/ids.js.map +1 -0
- package/dist/adapters/github/repo.d.ts +33 -0
- package/dist/adapters/github/repo.d.ts.map +1 -0
- package/dist/adapters/github/repo.js +141 -0
- package/dist/adapters/github/repo.js.map +1 -0
- package/dist/adapters/github/tool-pack.d.ts +14 -0
- package/dist/adapters/github/tool-pack.d.ts.map +1 -0
- package/dist/adapters/github/tool-pack.js +56 -0
- package/dist/adapters/github/tool-pack.js.map +1 -0
- package/dist/adapters/github/tools/checks.d.ts +19 -0
- package/dist/adapters/github/tools/checks.d.ts.map +1 -0
- package/dist/adapters/github/tools/checks.js +105 -0
- package/dist/adapters/github/tools/checks.js.map +1 -0
- package/dist/adapters/github/tools/issue.d.ts +21 -0
- package/dist/adapters/github/tools/issue.d.ts.map +1 -0
- package/dist/adapters/github/tools/issue.js +48 -0
- package/dist/adapters/github/tools/issue.js.map +1 -0
- package/dist/adapters/github/tools/pr.d.ts +22 -0
- package/dist/adapters/github/tools/pr.d.ts.map +1 -0
- package/dist/adapters/github/tools/pr.js +48 -0
- package/dist/adapters/github/tools/pr.js.map +1 -0
- package/dist/adapters/github/tools/read.d.ts +21 -0
- package/dist/adapters/github/tools/read.d.ts.map +1 -0
- package/dist/adapters/github/tools/read.js +141 -0
- package/dist/adapters/github/tools/read.js.map +1 -0
- package/dist/adapters/github/tools/review-reply.d.ts +17 -0
- package/dist/adapters/github/tools/review-reply.d.ts.map +1 -0
- package/dist/adapters/github/tools/review-reply.js +38 -0
- package/dist/adapters/github/tools/review-reply.js.map +1 -0
- package/dist/adapters/github/tools/sync.d.ts +17 -0
- package/dist/adapters/github/tools/sync.d.ts.map +1 -0
- package/dist/adapters/github/tools/sync.js +34 -0
- package/dist/adapters/github/tools/sync.js.map +1 -0
- package/dist/adapters/github/types.d.ts +373 -0
- package/dist/adapters/github/types.d.ts.map +1 -0
- package/dist/adapters/github/types.js +2 -0
- package/dist/adapters/github/types.js.map +1 -0
- package/dist/adapters/intake.d.ts +16 -5
- package/dist/adapters/intake.d.ts.map +1 -1
- package/dist/adapters/intake.js +86 -23
- package/dist/adapters/intake.js.map +1 -1
- package/dist/adapters/progressive-renderer.d.ts +7 -0
- package/dist/adapters/progressive-renderer.d.ts.map +1 -0
- package/dist/adapters/progressive-renderer.js +383 -0
- package/dist/adapters/progressive-renderer.js.map +1 -0
- package/dist/adapters/shared.d.ts +23 -10
- package/dist/adapters/shared.d.ts.map +1 -1
- package/dist/adapters/shared.js +60 -22
- package/dist/adapters/shared.js.map +1 -1
- package/dist/adapters/slack/blocks.d.ts +14 -0
- package/dist/adapters/slack/blocks.d.ts.map +1 -1
- package/dist/adapters/slack/blocks.js +147 -111
- package/dist/adapters/slack/blocks.js.map +1 -1
- package/dist/adapters/slack/bot.d.ts +43 -13
- package/dist/adapters/slack/bot.d.ts.map +1 -1
- package/dist/adapters/slack/bot.js +385 -207
- package/dist/adapters/slack/bot.js.map +1 -1
- package/dist/adapters/slack/context.d.ts +3 -1
- package/dist/adapters/slack/context.d.ts.map +1 -1
- package/dist/adapters/slack/context.js +11 -17
- package/dist/adapters/slack/context.js.map +1 -1
- package/dist/adapters/slack/response-lifecycle.d.ts.map +1 -1
- package/dist/adapters/slack/response-lifecycle.js +126 -323
- package/dist/adapters/slack/response-lifecycle.js.map +1 -1
- package/dist/adapters/slack/session.d.ts.map +1 -1
- package/dist/adapters/slack/session.js +7 -11
- package/dist/adapters/slack/session.js.map +1 -1
- package/dist/adapters/slack/tool-pack.d.ts +11 -0
- package/dist/adapters/slack/tool-pack.d.ts.map +1 -0
- package/dist/adapters/slack/tool-pack.js +45 -0
- package/dist/adapters/slack/tool-pack.js.map +1 -0
- package/dist/adapters/slack/tools/attach.js +1 -1
- package/dist/adapters/slack/tools/attach.js.map +1 -1
- package/dist/adapters/slack/tools/blockkit.d.ts +14 -0
- package/dist/adapters/slack/tools/blockkit.d.ts.map +1 -0
- package/dist/adapters/slack/tools/blockkit.js +106 -0
- package/dist/adapters/slack/tools/blockkit.js.map +1 -0
- package/dist/adapters/slack/types.d.ts +40 -2
- package/dist/adapters/slack/types.d.ts.map +1 -1
- package/dist/adapters/slack/types.js.map +1 -1
- package/dist/adapters/telegram/bot.d.ts +8 -9
- package/dist/adapters/telegram/bot.d.ts.map +1 -1
- package/dist/adapters/telegram/bot.js +90 -117
- package/dist/adapters/telegram/bot.js.map +1 -1
- package/dist/adapters/telegram/context.d.ts +2 -0
- package/dist/adapters/telegram/context.d.ts.map +1 -1
- package/dist/adapters/telegram/context.js +61 -184
- package/dist/adapters/telegram/context.js.map +1 -1
- package/dist/adapters/telegram/html.d.ts.map +1 -1
- package/dist/adapters/telegram/html.js +10 -7
- package/dist/adapters/telegram/html.js.map +1 -1
- package/dist/adapters/types.d.ts +109 -12
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/adapters/types.js.map +1 -1
- package/dist/agent-events.d.ts +3 -2
- package/dist/agent-events.d.ts.map +1 -1
- package/dist/agent-events.js +19 -1
- package/dist/agent-events.js.map +1 -1
- package/dist/agent.d.ts +14 -19
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +840 -298
- package/dist/agent.js.map +1 -1
- package/dist/cli/arg-grammar.d.ts +25 -0
- package/dist/cli/arg-grammar.d.ts.map +1 -0
- package/dist/cli/arg-grammar.js +61 -0
- package/dist/cli/arg-grammar.js.map +1 -0
- package/dist/cli/boot.d.ts +5 -0
- package/dist/cli/boot.d.ts.map +1 -0
- package/dist/cli/boot.js +117 -0
- package/dist/cli/boot.js.map +1 -0
- package/dist/cli/download.d.ts.map +1 -0
- package/dist/{download.js → cli/download.js} +2 -0
- package/dist/cli/download.js.map +1 -0
- package/dist/cli/ext-dev.d.ts +2 -0
- package/dist/cli/ext-dev.d.ts.map +1 -0
- package/dist/cli/ext-dev.js +188 -0
- package/dist/cli/ext-dev.js.map +1 -0
- package/dist/cli/ext.d.ts +2 -0
- package/dist/cli/ext.d.ts.map +1 -0
- package/dist/cli/ext.js +324 -0
- package/dist/cli/ext.js.map +1 -0
- package/dist/cli/office.d.ts +2 -0
- package/dist/cli/office.d.ts.map +1 -0
- package/dist/cli/office.js +91 -0
- package/dist/cli/office.js.map +1 -0
- package/dist/cli/types.d.ts +16 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +2 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/commands/admin.d.ts.map +1 -1
- package/dist/commands/admin.js +3 -2
- package/dist/commands/admin.js.map +1 -1
- package/dist/commands/auto-reply.d.ts.map +1 -1
- package/dist/commands/auto-reply.js +5 -9
- package/dist/commands/auto-reply.js.map +1 -1
- package/dist/commands/extensions.d.ts.map +1 -1
- package/dist/commands/extensions.js +9 -6
- package/dist/commands/extensions.js.map +1 -1
- package/dist/commands/login.d.ts +2 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +40 -5
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/manifest.d.ts +37 -0
- package/dist/commands/manifest.d.ts.map +1 -0
- package/dist/commands/manifest.js +151 -0
- package/dist/commands/manifest.js.map +1 -0
- package/dist/commands/model.d.ts +2 -3
- package/dist/commands/model.d.ts.map +1 -1
- package/dist/commands/model.js +63 -24
- package/dist/commands/model.js.map +1 -1
- package/dist/commands/new.d.ts.map +1 -1
- package/dist/commands/new.js +15 -3
- package/dist/commands/new.js.map +1 -1
- package/dist/commands/registry.d.ts +2 -2
- package/dist/commands/registry.d.ts.map +1 -1
- package/dist/commands/registry.js +1 -2
- package/dist/commands/registry.js.map +1 -1
- package/dist/commands/sandbox.d.ts.map +1 -1
- package/dist/commands/sandbox.js +83 -33
- package/dist/commands/sandbox.js.map +1 -1
- package/dist/commands/session-view.d.ts.map +1 -1
- package/dist/commands/session-view.js +6 -3
- package/dist/commands/session-view.js.map +1 -1
- package/dist/commands/types.d.ts +79 -7
- package/dist/commands/types.d.ts.map +1 -1
- package/dist/commands/types.js.map +1 -1
- package/dist/config.d.ts +23 -8
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +222 -135
- package/dist/config.js.map +1 -1
- package/dist/env-manifest.d.ts +30 -0
- package/dist/env-manifest.d.ts.map +1 -0
- package/dist/env-manifest.js +229 -0
- package/dist/env-manifest.js.map +1 -0
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js +20 -81
- package/dist/events.js.map +1 -1
- package/dist/execution-resolver.d.ts +7 -8
- package/dist/execution-resolver.d.ts.map +1 -1
- package/dist/execution-resolver.js +106 -110
- package/dist/execution-resolver.js.map +1 -1
- package/dist/extension-schedules.d.ts +31 -0
- package/dist/extension-schedules.d.ts.map +1 -0
- package/dist/extension-schedules.js +229 -0
- package/dist/extension-schedules.js.map +1 -0
- package/dist/harness/auth.d.ts +2 -1
- package/dist/harness/auth.d.ts.map +1 -1
- package/dist/harness/auth.js +11 -5
- package/dist/harness/auth.js.map +1 -1
- package/dist/harness/event-format.d.ts +27 -0
- package/dist/harness/event-format.d.ts.map +1 -0
- package/dist/harness/event-format.js +160 -0
- package/dist/harness/event-format.js.map +1 -0
- package/dist/harness/extensions/loader.d.ts +27 -49
- package/dist/harness/extensions/loader.d.ts.map +1 -1
- package/dist/harness/extensions/loader.js +486 -130
- package/dist/harness/extensions/loader.js.map +1 -1
- package/dist/harness/extensions/registry.d.ts +107 -2
- package/dist/harness/extensions/registry.d.ts.map +1 -1
- package/dist/harness/extensions/registry.js +316 -0
- package/dist/harness/extensions/registry.js.map +1 -1
- package/dist/harness/extensions/types.d.ts +482 -42
- package/dist/harness/extensions/types.d.ts.map +1 -1
- package/dist/harness/extensions/types.js.map +1 -1
- package/dist/harness/index.d.ts +18 -8
- package/dist/harness/index.d.ts.map +1 -1
- package/dist/harness/index.js +7 -4
- package/dist/harness/index.js.map +1 -1
- package/dist/harness/models.d.ts +7 -4
- package/dist/harness/models.d.ts.map +1 -1
- package/dist/harness/models.js +46 -24
- package/dist/harness/models.js.map +1 -1
- package/dist/harness/runner.d.ts +50 -54
- package/dist/harness/runner.d.ts.map +1 -1
- package/dist/harness/runner.js +232 -46
- package/dist/harness/runner.js.map +1 -1
- package/dist/harness/session-store.d.ts +11 -5
- package/dist/harness/session-store.d.ts.map +1 -1
- package/dist/harness/session-store.js +141 -36
- package/dist/harness/session-store.js.map +1 -1
- package/dist/harness/settings.d.ts +2 -20
- package/dist/harness/settings.d.ts.map +1 -1
- package/dist/harness/settings.js +12 -1
- package/dist/harness/settings.js.map +1 -1
- package/dist/harness/skills.d.ts +10 -29
- package/dist/harness/skills.d.ts.map +1 -1
- package/dist/harness/skills.js +48 -6
- package/dist/harness/skills.js.map +1 -1
- package/dist/harness/subagent-profiles.d.ts +8 -0
- package/dist/harness/subagent-profiles.d.ts.map +1 -0
- package/dist/harness/subagent-profiles.js +299 -0
- package/dist/harness/subagent-profiles.js.map +1 -0
- package/dist/harness/subagent-runner.d.ts +39 -0
- package/dist/harness/subagent-runner.d.ts.map +1 -0
- package/dist/harness/subagent-runner.js +617 -0
- package/dist/harness/subagent-runner.js.map +1 -0
- package/dist/harness/types.d.ts +267 -1
- package/dist/harness/types.d.ts.map +1 -1
- package/dist/harness/types.js.map +1 -1
- package/dist/harness/usage.d.ts +6 -0
- package/dist/harness/usage.d.ts.map +1 -0
- package/dist/harness/usage.js +32 -0
- package/dist/harness/usage.js.map +1 -0
- package/dist/index.d.ts +36 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -6
- package/dist/index.js.map +1 -1
- package/dist/main.js +391 -127
- package/dist/main.js.map +1 -1
- package/dist/observability/instrument.js +7 -5
- package/dist/observability/instrument.js.map +1 -1
- package/dist/observability/sentry.d.ts +2 -0
- package/dist/observability/sentry.d.ts.map +1 -1
- package/dist/observability/sentry.js +10 -2
- package/dist/observability/sentry.js.map +1 -1
- package/dist/office/address.d.ts +31 -0
- package/dist/office/address.d.ts.map +1 -0
- package/dist/office/address.js +113 -0
- package/dist/office/address.js.map +1 -0
- package/dist/office/index.d.ts +11 -0
- package/dist/office/index.d.ts.map +1 -0
- package/dist/office/index.js +11 -0
- package/dist/office/index.js.map +1 -0
- package/dist/office/layout.d.ts +27 -0
- package/dist/office/layout.d.ts.map +1 -0
- package/dist/office/layout.js +97 -0
- package/dist/office/layout.js.map +1 -0
- package/dist/office/migration.d.ts +44 -0
- package/dist/office/migration.d.ts.map +1 -0
- package/dist/office/migration.js +255 -0
- package/dist/office/migration.js.map +1 -0
- package/dist/office/registry.d.ts +75 -0
- package/dist/office/registry.d.ts.map +1 -0
- package/dist/office/registry.js +646 -0
- package/dist/office/registry.js.map +1 -0
- package/dist/office/types.d.ts +71 -0
- package/dist/office/types.d.ts.map +1 -0
- package/dist/office/types.js +2 -0
- package/dist/office/types.js.map +1 -0
- package/dist/packages/admin.d.ts +17 -0
- package/dist/packages/admin.d.ts.map +1 -0
- package/dist/packages/admin.js +98 -0
- package/dist/packages/admin.js.map +1 -0
- package/dist/packages/index.d.ts +6 -0
- package/dist/packages/index.d.ts.map +1 -0
- package/dist/packages/index.js +6 -0
- package/dist/packages/index.js.map +1 -0
- package/dist/packages/inspect.d.ts +11 -0
- package/dist/packages/inspect.d.ts.map +1 -0
- package/dist/packages/inspect.js +98 -0
- package/dist/packages/inspect.js.map +1 -0
- package/dist/packages/materialize.d.ts +40 -0
- package/dist/packages/materialize.d.ts.map +1 -0
- package/dist/packages/materialize.js +297 -0
- package/dist/packages/materialize.js.map +1 -0
- package/dist/packages/resolve.d.ts +25 -0
- package/dist/packages/resolve.d.ts.map +1 -0
- package/dist/packages/resolve.js +208 -0
- package/dist/packages/resolve.js.map +1 -0
- package/dist/packages/source.d.ts +39 -0
- package/dist/packages/source.d.ts.map +1 -0
- package/dist/packages/source.js +189 -0
- package/dist/packages/source.js.map +1 -0
- package/dist/packages/types.d.ts +104 -0
- package/dist/packages/types.d.ts.map +1 -0
- package/dist/packages/types.js +2 -0
- package/dist/packages/types.js.map +1 -0
- package/dist/provisioner.d.ts +66 -0
- package/dist/provisioner.d.ts.map +1 -1
- package/dist/provisioner.js +335 -13
- package/dist/provisioner.js.map +1 -1
- package/dist/runtime/conversation-runtime.d.ts +1 -1
- package/dist/runtime/conversation-runtime.d.ts.map +1 -1
- package/dist/runtime/conversation-runtime.js +562 -118
- package/dist/runtime/conversation-runtime.js.map +1 -1
- package/dist/runtime/session-lifecycle.d.ts +38 -0
- package/dist/runtime/session-lifecycle.d.ts.map +1 -0
- package/dist/runtime/session-lifecycle.js +193 -0
- package/dist/runtime/session-lifecycle.js.map +1 -0
- package/dist/runtime/types.d.ts +66 -7
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/runtime/types.js.map +1 -1
- package/dist/sandbox/cloudflare.d.ts +3 -0
- package/dist/sandbox/cloudflare.d.ts.map +1 -1
- package/dist/sandbox/cloudflare.js +13 -1
- package/dist/sandbox/cloudflare.js.map +1 -1
- package/dist/sandbox/container.d.ts +4 -0
- package/dist/sandbox/container.d.ts.map +1 -1
- package/dist/sandbox/container.js +13 -3
- package/dist/sandbox/container.js.map +1 -1
- package/dist/sandbox/firecracker.d.ts +3 -0
- package/dist/sandbox/firecracker.d.ts.map +1 -1
- package/dist/sandbox/firecracker.js +13 -2
- package/dist/sandbox/firecracker.js.map +1 -1
- package/dist/sandbox/gondolin.d.ts +57 -0
- package/dist/sandbox/gondolin.d.ts.map +1 -0
- package/dist/sandbox/gondolin.js +764 -0
- package/dist/sandbox/gondolin.js.map +1 -0
- package/dist/sandbox/host.d.ts +3 -0
- package/dist/sandbox/host.d.ts.map +1 -1
- package/dist/sandbox/host.js +18 -3
- package/dist/sandbox/host.js.map +1 -1
- package/dist/sandbox/identity.d.ts +44 -0
- package/dist/sandbox/identity.d.ts.map +1 -0
- package/dist/sandbox/identity.js +68 -0
- package/dist/sandbox/identity.js.map +1 -0
- package/dist/sandbox/image.d.ts.map +1 -1
- package/dist/sandbox/image.js +2 -0
- package/dist/sandbox/image.js.map +1 -1
- package/dist/sandbox/index.d.ts +17 -4
- package/dist/sandbox/index.d.ts.map +1 -1
- package/dist/sandbox/index.js +37 -3
- package/dist/sandbox/index.js.map +1 -1
- package/dist/sandbox/types.d.ts +65 -1
- package/dist/sandbox/types.d.ts.map +1 -1
- package/dist/sandbox/types.js.map +1 -1
- package/dist/sandbox/utils.d.ts +14 -0
- package/dist/sandbox/utils.d.ts.map +1 -1
- package/dist/sandbox/utils.js +68 -1
- package/dist/sandbox/utils.js.map +1 -1
- package/dist/sessions/chat-history-sync.d.ts +25 -0
- package/dist/sessions/chat-history-sync.d.ts.map +1 -0
- package/dist/sessions/{agent-memory-file-manager.js → chat-history-sync.js} +135 -131
- package/dist/sessions/chat-history-sync.js.map +1 -0
- package/dist/sessions/conversation-log.d.ts +9 -0
- package/dist/sessions/conversation-log.d.ts.map +1 -0
- package/dist/sessions/conversation-log.js +50 -0
- package/dist/sessions/conversation-log.js.map +1 -0
- package/dist/sessions/history-line.d.ts +29 -0
- package/dist/sessions/history-line.d.ts.map +1 -0
- package/dist/sessions/history-line.js +45 -0
- package/dist/sessions/history-line.js.map +1 -0
- package/dist/sessions/rotation.d.ts +2 -0
- package/dist/sessions/rotation.d.ts.map +1 -0
- package/dist/sessions/rotation.js +39 -0
- package/dist/sessions/rotation.js.map +1 -0
- package/dist/sessions/session-key.d.ts +33 -0
- package/dist/sessions/session-key.d.ts.map +1 -0
- package/dist/sessions/session-key.js +115 -0
- package/dist/sessions/session-key.js.map +1 -0
- package/dist/sessions/store.d.ts +15 -7
- package/dist/sessions/store.d.ts.map +1 -1
- package/dist/sessions/store.js +127 -36
- package/dist/sessions/store.js.map +1 -1
- package/dist/sessions/types.d.ts +19 -5
- package/dist/sessions/types.d.ts.map +1 -1
- package/dist/sessions/types.js.map +1 -1
- package/dist/settings-mutation.d.ts +40 -0
- package/dist/settings-mutation.d.ts.map +1 -0
- package/dist/settings-mutation.js +61 -0
- package/dist/settings-mutation.js.map +1 -0
- package/dist/subagent-progress.d.ts +43 -0
- package/dist/subagent-progress.d.ts.map +1 -0
- package/dist/subagent-progress.js +220 -0
- package/dist/subagent-progress.js.map +1 -0
- package/dist/tools/bash.d.ts +3 -1
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js +26 -18
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/edit.d.ts.map +1 -1
- package/dist/tools/edit.js +14 -13
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/event.d.ts +1 -1
- package/dist/tools/event.d.ts.map +1 -1
- package/dist/tools/event.js +58 -45
- package/dist/tools/event.js.map +1 -1
- package/dist/tools/generate-image.d.ts +23 -0
- package/dist/tools/generate-image.d.ts.map +1 -0
- package/dist/tools/generate-image.js +65 -0
- package/dist/tools/generate-image.js.map +1 -0
- package/dist/tools/host-fn-tool.d.ts +21 -0
- package/dist/tools/host-fn-tool.d.ts.map +1 -0
- package/dist/tools/host-fn-tool.js +32 -0
- package/dist/tools/host-fn-tool.js.map +1 -0
- package/dist/tools/index.d.ts +19 -2
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +25 -2
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/react.d.ts +15 -0
- package/dist/tools/react.d.ts.map +1 -0
- package/dist/tools/react.js +29 -0
- package/dist/tools/react.js.map +1 -0
- package/dist/tools/read.d.ts +1 -0
- package/dist/tools/read.d.ts.map +1 -1
- package/dist/tools/read.js +39 -33
- package/dist/tools/read.js.map +1 -1
- package/dist/tools/sandbox.d.ts +2 -2
- package/dist/tools/sandbox.d.ts.map +1 -1
- package/dist/tools/sandbox.js +14 -9
- package/dist/tools/sandbox.js.map +1 -1
- package/dist/tools/subagent-slots.d.ts +28 -0
- package/dist/tools/subagent-slots.d.ts.map +1 -0
- package/dist/tools/subagent-slots.js +72 -0
- package/dist/tools/subagent-slots.js.map +1 -0
- package/dist/tools/subagent.d.ts +54 -0
- package/dist/tools/subagent.d.ts.map +1 -0
- package/dist/tools/subagent.js +411 -0
- package/dist/tools/subagent.js.map +1 -0
- package/dist/tools/types.d.ts +40 -32
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/types.js.map +1 -1
- package/dist/tools/write.d.ts.map +1 -1
- package/dist/tools/write.js +2 -8
- package/dist/tools/write.js.map +1 -1
- package/dist/trigger.d.ts +2 -1
- package/dist/trigger.d.ts.map +1 -1
- package/dist/trigger.js +6 -9
- package/dist/trigger.js.map +1 -1
- package/dist/types.d.ts +403 -59
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +2 -2
- package/dist/types.js.map +1 -1
- package/dist/utils/file-guards.d.ts +9 -0
- package/dist/utils/file-guards.d.ts.map +1 -1
- package/dist/utils/file-guards.js +44 -1
- package/dist/utils/file-guards.js.map +1 -1
- package/dist/vault/disabled.d.ts +9 -0
- package/dist/vault/disabled.d.ts.map +1 -0
- package/dist/vault/disabled.js +25 -0
- package/dist/vault/disabled.js.map +1 -0
- package/dist/vault/index.d.ts +45 -2
- package/dist/vault/index.d.ts.map +1 -1
- package/dist/vault/index.js +127 -36
- package/dist/vault/index.js.map +1 -1
- package/dist/vault/types.d.ts +6 -2
- package/dist/vault/types.d.ts.map +1 -1
- package/dist/vault/types.js.map +1 -1
- package/dist/web/admin/portal.d.ts +31 -3
- package/dist/web/admin/portal.d.ts.map +1 -1
- package/dist/web/admin/portal.js +846 -345
- package/dist/web/admin/portal.js.map +1 -1
- package/dist/web/admin/provider-models.js +1 -1
- package/dist/web/admin/provider-models.js.map +1 -1
- package/dist/web/admin/types.d.ts +23 -3
- package/dist/web/admin/types.d.ts.map +1 -1
- package/dist/web/admin/types.js.map +1 -1
- package/dist/web/login/oauth.d.ts +2 -3
- package/dist/web/login/oauth.d.ts.map +1 -1
- package/dist/web/login/oauth.js +1 -32
- package/dist/web/login/oauth.js.map +1 -1
- package/dist/web/login/portal.d.ts +1 -1
- package/dist/web/login/portal.d.ts.map +1 -1
- package/dist/web/login/portal.js +13 -36
- package/dist/web/login/portal.js.map +1 -1
- package/dist/web/login/types.d.ts +0 -11
- package/dist/web/login/types.d.ts.map +1 -1
- package/dist/web/login/types.js.map +1 -1
- package/dist/web/portal-shell.d.ts +21 -0
- package/dist/web/portal-shell.d.ts.map +1 -0
- package/dist/{portal-shell.js → web/portal-shell.js} +67 -2
- package/dist/web/portal-shell.js.map +1 -0
- package/dist/web/server.d.ts +3 -2
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +11 -4
- package/dist/web/server.js.map +1 -1
- package/dist/web/session-view/portal.d.ts +1 -1
- package/dist/web/session-view/portal.d.ts.map +1 -1
- package/dist/web/session-view/portal.js +37 -28
- package/dist/web/session-view/portal.js.map +1 -1
- package/dist/web/session-view/service.d.ts +1 -1
- package/dist/web/session-view/service.d.ts.map +1 -1
- package/dist/web/session-view/service.js +61 -18
- package/dist/web/session-view/service.js.map +1 -1
- package/dist/web/session-view/types.d.ts +0 -3
- package/dist/web/session-view/types.d.ts.map +1 -1
- package/dist/web/session-view/types.js.map +1 -1
- package/dist/web/token-store.js +1 -1
- package/dist/web/token-store.js.map +1 -1
- package/dist/workspace-projection/index.d.ts +10 -0
- package/dist/workspace-projection/index.d.ts.map +1 -0
- package/dist/workspace-projection/index.js +120 -0
- package/dist/workspace-projection/index.js.map +1 -0
- package/dist/workspace-projection/types.d.ts +16 -0
- package/dist/workspace-projection/types.d.ts.map +1 -0
- package/dist/workspace-projection/types.js +2 -0
- package/dist/workspace-projection/types.js.map +1 -0
- package/package.json +67 -37
- package/dist/adapters/streaming.d.ts +0 -18
- package/dist/adapters/streaming.d.ts.map +0 -1
- package/dist/adapters/streaming.js +0 -44
- package/dist/adapters/streaming.js.map +0 -1
- package/dist/commands/parse.d.ts +0 -7
- package/dist/commands/parse.d.ts.map +0 -1
- package/dist/commands/parse.js +0 -14
- package/dist/commands/parse.js.map +0 -1
- package/dist/download.d.ts.map +0 -1
- package/dist/download.js.map +0 -1
- package/dist/model-registry.d.ts +0 -4
- package/dist/model-registry.d.ts.map +0 -1
- package/dist/model-registry.js +0 -7
- package/dist/model-registry.js.map +0 -1
- package/dist/portal-shell.d.ts +0 -4
- package/dist/portal-shell.d.ts.map +0 -1
- package/dist/portal-shell.js.map +0 -1
- package/dist/runtime/agent-run-controller.d.ts +0 -31
- package/dist/runtime/agent-run-controller.d.ts.map +0 -1
- package/dist/runtime/agent-run-controller.js +0 -195
- package/dist/runtime/agent-run-controller.js.map +0 -1
- package/dist/sandbox/path-context.d.ts +0 -3
- package/dist/sandbox/path-context.d.ts.map +0 -1
- package/dist/sandbox/path-context.js +0 -20
- package/dist/sandbox/path-context.js.map +0 -1
- package/dist/sessions/agent-memory-file-manager.d.ts +0 -19
- package/dist/sessions/agent-memory-file-manager.d.ts.map +0 -1
- package/dist/sessions/agent-memory-file-manager.js.map +0 -1
- package/dist/sessions/metadata.d.ts +0 -3
- package/dist/sessions/metadata.d.ts.map +0 -1
- package/dist/sessions/metadata.js +0 -11
- package/dist/sessions/metadata.js.map +0 -1
- package/dist/sessions/policy.d.ts +0 -6
- package/dist/sessions/policy.d.ts.map +0 -1
- package/dist/sessions/policy.js +0 -23
- package/dist/sessions/policy.js.map +0 -1
- package/dist/store.d.ts +0 -46
- package/dist/store.d.ts.map +0 -1
- package/dist/store.js +0 -177
- package/dist/store.js.map +0 -1
- package/dist/tools/truncate.d.ts +0 -33
- package/dist/tools/truncate.d.ts.map +0 -1
- package/dist/tools/truncate.js +0 -184
- package/dist/tools/truncate.js.map +0 -1
- package/dist/utils/date.d.ts +0 -10
- package/dist/utils/date.d.ts.map +0 -1
- package/dist/utils/date.js +0 -23
- package/dist/utils/date.js.map +0 -1
- package/dist/utils/env.d.ts +0 -3
- package/dist/utils/env.d.ts.map +0 -1
- package/dist/utils/env.js +0 -12
- package/dist/utils/env.js.map +0 -1
- package/dist/utils/fs-atomic.d.ts +0 -10
- package/dist/utils/fs-atomic.d.ts.map +0 -1
- package/dist/utils/fs-atomic.js +0 -45
- package/dist/utils/fs-atomic.js.map +0 -1
- package/dist/utils/html.d.ts +0 -2
- package/dist/utils/html.d.ts.map +0 -1
- package/dist/utils/html.js +0 -4
- package/dist/utils/html.js.map +0 -1
- package/dist/utils/http-body.d.ts +0 -10
- package/dist/utils/http-body.d.ts.map +0 -1
- package/dist/utils/http-body.js +0 -34
- package/dist/utils/http-body.js.map +0 -1
- package/dist/vault/routing.d.ts +0 -3
- package/dist/vault/routing.d.ts.map +0 -1
- package/dist/vault/routing.js +0 -13
- package/dist/vault/routing.js.map +0 -1
- package/dist/web/agent-events/portal.d.ts +0 -3
- package/dist/web/agent-events/portal.d.ts.map +0 -1
- package/dist/web/agent-events/portal.js +0 -18
- package/dist/web/agent-events/portal.js.map +0 -1
- package/dist/web/request.d.ts +0 -3
- package/dist/web/request.d.ts.map +0 -1
- package/dist/web/request.js +0 -13
- package/dist/web/request.js.map +0 -1
- package/dist/web/session-view/command.d.ts +0 -4
- package/dist/web/session-view/command.d.ts.map +0 -1
- package/dist/web/session-view/command.js +0 -7
- package/dist/web/session-view/command.js.map +0 -1
- /package/dist/{download.d.ts → cli/download.d.ts} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/harness/extensions/loader.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Extension discovery and activation.\n *\n * Extension modules execute inside the mikan host process with its full\n * privileges (platform tokens, vault, host filesystem). They must therefore\n * only ever load from host-controlled directories: installing an extension\n * is an administrator action. In particular, extension directories must not\n * live under paths mounted into sandbox containers (workspace and\n * conversation dirs in image mode), or code written from inside the sandbox\n * would be imported into the host process — a sandbox escape.\n * {@link defaultExtensionDirs} returns the canonical host-only locations\n * under mikan's state dir.\n *\n * Directories are scanned in order; all discovered extensions activate.\n * Accepted layouts:\n *\n * - `extensions/<name>.mjs` / `extensions/<name>.js`\n * - `extensions/<name>/index.mjs` / `extensions/<name>/index.js`\n *\n * Modules are imported with a cache-busting query so edited extensions are\n * picked up when a new harness instance is created for a conversation.\n */\nimport { existsSync, mkdirSync, readdirSync, readFileSync, statSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { basename, dirname, join } from \"path\";\nimport { pathToFileURL } from \"url\";\nimport type { AgentTool, ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport type { Api, Model } from \"@earendil-works/pi-ai\";\nimport * as log from \"../../log.js\";\nimport { loadSkillsFromDir, type MikanSkill } from \"../skills.js\";\nimport { ExtensionRegistry } from \"./registry.js\";\nimport type {\n ExtensionHostServices,\n ExtensionLoadError,\n ExtensionManifest,\n ExtensionSchedulePayload,\n ExtensionScheduleInfo,\n ExtensionScheduleSpec,\n LoadedExtension,\n MikanExtensionActivate,\n MikanExtensionApi,\n MikanExtensionModule,\n} from \"./types.js\";\n\nconst EXTENSION_FILE_PATTERN = /\\.(mjs|js)$/;\n\n/**\n * Canonical host-only extension directories for a conversation:\n * `<stateDir>/extensions/global` (all conversations) and\n * `<stateDir>/extensions/<conversationId>` (that conversation only).\n * `global` is reserved as a scope name; platform conversation ids never\n * take that value.\n */\nexport function defaultExtensionDirs(\n conversationId: string,\n stateDir: string = join(homedir(), \".mikan\"),\n): string[] {\n return [join(stateDir, \"extensions\", \"global\"), join(stateDir, \"extensions\", conversationId)];\n}\n\n/** Discovery-only view of an installed extension (module is not imported). */\nexport interface InstalledExtensionInfo {\n /** Display name: manifest name, falling back to the slug. */\n name: string;\n slug: string;\n path: string;\n /** Scan directory the extension was found in. */\n dir: string;\n version?: string;\n description?: string;\n /** Names of skills shipped in the extension's skills/ directory. */\n skillNames: string[];\n}\n\n/**\n * List installed extensions without importing or activating them — safe for\n * inventory surfaces (commands, portal). Activation side effects (schedule\n * upserts, tool registration) only happen in {@link loadExtensions}.\n */\nexport function listInstalledExtensions(dirs: string[]): InstalledExtensionInfo[] {\n const infos: InstalledExtensionInfo[] = [];\n for (const dir of dirs) {\n for (const entrypoint of discoverExtensionEntrypoints(dir)) {\n const slug = extensionSlug(entrypoint);\n const manifest = readManifest(entrypoint);\n infos.push({\n name: manifest.name ?? slug,\n slug,\n path: entrypoint,\n dir,\n version: manifest.version,\n description: manifest.description,\n skillNames: loadExtensionSkills(entrypoint, slug).map((skill) => skill.name),\n });\n }\n }\n return infos;\n}\n\nexport interface LoadExtensionsOptions {\n /** Directories to scan for extensions. Missing directories are skipped. */\n dirs: string[];\n context: {\n conversationId: string;\n workspaceDir: string;\n model: Model<Api>;\n thinkingLevel: ThinkingLevel;\n };\n /** Embedder-provided services backing the v2 api surface. */\n services?: ExtensionHostServices;\n}\n\nexport interface LoadExtensionsResult {\n registry: ExtensionRegistry;\n extensions: LoadedExtension[];\n errors: ExtensionLoadError[];\n /** Skills contributed by extensions (inline: bodies ride in the prompt). */\n skills: MikanSkill[];\n}\n\nfunction discoverExtensionEntrypoints(dir: string): string[] {\n if (!existsSync(dir)) return [];\n const entrypoints: string[] = [];\n for (const name of readdirSync(dir).toSorted()) {\n if (name.startsWith(\".\")) continue;\n if (/^index\\.(mjs|js)$/.test(name)) {\n // An index file at the scan root means the extension's contents were\n // copied into the scope directory itself; the slug would degenerate to\n // the scope name (e.g. the conversation id), mis-keying its data dir,\n // secrets, and schedules. Require a named form instead.\n log.logWarning(\n `Ignoring extension index file at scope root: ${join(dir, name)}`,\n \"install into a named subdirectory (e.g. extensions/<scope>/my-ext/index.mjs)\",\n );\n continue;\n }\n const fullPath = join(dir, name);\n let stats;\n try {\n stats = statSync(fullPath);\n } catch {\n continue;\n }\n if (stats.isFile() && EXTENSION_FILE_PATTERN.test(name)) {\n entrypoints.push(fullPath);\n continue;\n }\n if (stats.isDirectory()) {\n for (const candidate of [\"index.mjs\", \"index.js\"]) {\n const indexPath = join(fullPath, candidate);\n if (existsSync(indexPath)) {\n entrypoints.push(indexPath);\n break;\n }\n }\n }\n }\n return entrypoints;\n}\n\n/**\n * Filesystem-safe identifier for an extension, derived from its install\n * location (directory name for `<name>/index.mjs`, file basename otherwise).\n * The slug keys the extension's data dir, secrets vault, and schedule\n * ownership — installing the same extension globally and per-conversation\n * shares one slug and therefore one data dir.\n */\nexport function extensionSlug(entrypoint: string): string {\n const base = /^index\\.(mjs|js)$/.test(basename(entrypoint))\n ? basename(dirname(entrypoint))\n : basename(entrypoint).replace(EXTENSION_FILE_PATTERN, \"\");\n const slug = base\n .toLowerCase()\n .replace(/[^a-z0-9_-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 64);\n return slug || \"extension\";\n}\n\n/** Sanitize an extension-chosen schedule name into a filename segment. */\nfunction scheduleNameSegment(name: string): string {\n const segment = name\n .toLowerCase()\n .replace(/[^a-z0-9_-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 64);\n if (!segment) throw new Error(`Invalid schedule name: ${JSON.stringify(name)}`);\n return segment;\n}\n\n/** Read `manifest.json` next to a directory-form extension's entrypoint. */\nfunction readManifest(entrypoint: string): ExtensionManifest {\n if (!/^index\\.(mjs|js)$/.test(basename(entrypoint))) return {};\n const manifestPath = join(dirname(entrypoint), \"manifest.json\");\n if (!existsSync(manifestPath)) return {};\n try {\n const parsed: unknown = JSON.parse(readFileSync(manifestPath, \"utf-8\"));\n if (!parsed || typeof parsed !== \"object\") return {};\n const record = parsed as Record<string, unknown>;\n return {\n name: typeof record.name === \"string\" ? record.name : undefined,\n version: typeof record.version === \"string\" ? record.version : undefined,\n description: typeof record.description === \"string\" ? record.description : undefined,\n };\n } catch (err) {\n log.logWarning(`Ignoring malformed extension manifest: ${manifestPath}`, String(err));\n return {};\n }\n}\n\n/**\n * Skills shipped inside a directory-form extension (`<dir>/skills/`).\n * Marked inline: extension files live under the host-only state dir, which\n * sandbox containers cannot read, so skill bodies must ride in the prompt.\n */\nfunction loadExtensionSkills(entrypoint: string, slug: string): MikanSkill[] {\n if (!/^index\\.(mjs|js)$/.test(basename(entrypoint))) return [];\n const skillsDir = join(dirname(entrypoint), \"skills\");\n if (!existsSync(skillsDir)) return [];\n const result = loadSkillsFromDir({ dir: skillsDir, source: `extension:${slug}` });\n for (const diagnostic of result.diagnostics) {\n log.logWarning(`Extension skill warning (${slug}): ${diagnostic.message}`, diagnostic.path);\n }\n for (const skill of result.skills) skill.inline = true;\n return result.skills;\n}\n\nconst SCHEDULE_FILE_SUFFIX = \".json\";\n\nfunction schedulePrefix(slug: string, conversationId: string): string {\n return `ext.${slug}.${scheduleNameSegment(conversationId)}.`;\n}\n\nfunction payloadFromSpec(\n spec: ExtensionScheduleSpec,\n conversationId: string,\n): ExtensionSchedulePayload {\n if (spec.type === \"periodic\") {\n if (!spec.schedule || !spec.timezone) {\n throw new Error(\"periodic schedule requires schedule and timezone\");\n }\n return {\n type: \"periodic\",\n conversationId,\n text: spec.text,\n schedule: spec.schedule,\n timezone: spec.timezone,\n ...(spec.platform ? { platform: spec.platform } : {}),\n };\n }\n if (!spec.at) throw new Error(\"one-shot schedule requires at\");\n return {\n type: \"one-shot\",\n conversationId,\n text: spec.text,\n at: spec.at,\n ...(spec.platform ? { platform: spec.platform } : {}),\n };\n}\n\nfunction specFromPayload(payload: ExtensionSchedulePayload): ExtensionScheduleSpec {\n if (payload.type === \"periodic\") {\n return {\n type: \"periodic\",\n schedule: payload.schedule ?? \"\",\n timezone: payload.timezone ?? \"\",\n text: payload.text,\n ...(payload.platform ? { platform: payload.platform } : {}),\n };\n }\n return {\n type: \"one-shot\",\n at: payload.at ?? \"\",\n text: payload.text,\n ...(payload.platform ? { platform: payload.platform } : {}),\n };\n}\n\n/** Build the v2 api surface for one extension over the injected services. */\nfunction buildExtensionApi(params: {\n name: string;\n slug: string;\n registry: ExtensionRegistry;\n context: LoadExtensionsOptions[\"context\"];\n services: ExtensionHostServices;\n}): MikanExtensionApi {\n const { name, slug, registry, context, services } = params;\n const stateDir = services.stateDir ?? join(homedir(), \".mikan\");\n const conversationId = context.conversationId;\n\n const requireScheduleStore = () => {\n if (!services.scheduleStore) {\n throw new Error(\"api.schedules is unavailable: this context provides no schedule store\");\n }\n return services.scheduleStore;\n };\n\n return {\n on: (hook, handler) => registry.register(name, hook, handler),\n registerTool: (tool: AgentTool) => registry.registerTool(tool),\n log: (message: string) => log.logInfo(`[extension:${name}] ${message}`),\n context,\n paths: {\n get dataDir(): string {\n const dir = join(stateDir, \"extension-data\", slug);\n mkdirSync(dir, { recursive: true });\n return dir;\n },\n },\n secrets: {\n get: (key: string) => services.resolveSecrets?.(slug)[key],\n list: () => Object.keys(services.resolveSecrets?.(slug) ?? {}),\n },\n schedules: {\n upsert: async (scheduleName, spec) => {\n const store = requireScheduleStore();\n const filename = `${schedulePrefix(slug, conversationId)}${scheduleNameSegment(scheduleName)}${SCHEDULE_FILE_SUFFIX}`;\n await store.write(filename, payloadFromSpec(spec, conversationId));\n },\n delete: async (scheduleName) => {\n const store = requireScheduleStore();\n const filename = `${schedulePrefix(slug, conversationId)}${scheduleNameSegment(scheduleName)}${SCHEDULE_FILE_SUFFIX}`;\n return store.delete(filename);\n },\n list: async () => {\n const store = requireScheduleStore();\n const prefix = schedulePrefix(slug, conversationId);\n const infos: ExtensionScheduleInfo[] = [];\n for (const entry of await store.list()) {\n if (!entry.filename.startsWith(prefix)) continue;\n if (!entry.filename.endsWith(SCHEDULE_FILE_SUFFIX)) continue;\n infos.push({\n name: entry.filename.slice(prefix.length, -SCHEDULE_FILE_SUFFIX.length),\n spec: specFromPayload(entry.payload),\n });\n }\n return infos;\n },\n },\n notify: async (text: string) => {\n if (!services.postMessage) {\n throw new Error(\"api.notify is unavailable: this context provides no platform messaging\");\n }\n await services.postMessage(conversationId, text);\n },\n };\n}\n\nfunction resolveActivate(moduleExports: unknown): MikanExtensionModule | undefined {\n if (!moduleExports || typeof moduleExports !== \"object\") return undefined;\n const candidates: unknown[] = [(moduleExports as { default?: unknown }).default, moduleExports];\n for (const candidate of candidates) {\n if (typeof candidate === \"function\") {\n return { activate: candidate as MikanExtensionActivate };\n }\n if (candidate && typeof candidate === \"object\") {\n const activate = (candidate as { activate?: unknown }).activate;\n if (typeof activate === \"function\") {\n return {\n name:\n typeof (candidate as { name?: unknown }).name === \"string\"\n ? (candidate as { name: string }).name\n : undefined,\n activate: activate as MikanExtensionActivate,\n };\n }\n }\n }\n return undefined;\n}\n\n/** Load and activate all extensions found in the given directories. */\nexport async function loadExtensions(\n options: LoadExtensionsOptions,\n): Promise<LoadExtensionsResult> {\n const registry = new ExtensionRegistry();\n const extensions: LoadedExtension[] = [];\n const errors: ExtensionLoadError[] = [];\n const skills: MikanSkill[] = [];\n const services = options.services ?? {};\n\n for (const dir of options.dirs) {\n for (const entrypoint of discoverExtensionEntrypoints(dir)) {\n try {\n const moduleUrl = `${pathToFileURL(entrypoint).href}?t=${Date.now()}`;\n const moduleExports: unknown = await import(moduleUrl);\n const extension = resolveActivate(moduleExports);\n if (!extension) {\n errors.push({\n path: entrypoint,\n error: \"extension must export an activate function (default or named)\",\n });\n continue;\n }\n const slug = extensionSlug(entrypoint);\n const manifest = readManifest(entrypoint);\n const name = manifest.name ?? extension.name ?? slug;\n const api = buildExtensionApi({\n name,\n slug,\n registry,\n context: options.context,\n services,\n });\n await extension.activate(api);\n const extensionSkills = loadExtensionSkills(entrypoint, slug);\n skills.push(...extensionSkills);\n extensions.push({\n name,\n path: entrypoint,\n slug,\n version: manifest.version,\n description: manifest.description,\n skills: extensionSkills,\n });\n } catch (err) {\n errors.push({\n path: entrypoint,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n }\n\n return { registry, extensions, errors, skills };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/harness/extensions/loader.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Extension discovery and activation.\n *\n * Extension modules execute inside the mikan host process with its full\n * privileges (platform tokens, vault, host filesystem). They must therefore\n * only ever load from host-controlled directories: installing an extension\n * is an administrator action. In particular, extension directories must not\n * live under paths mounted into sandbox containers (workspace and\n * conversation dirs in image mode), or code written from inside the sandbox\n * would be imported into the host process — a sandbox escape.\n * {@link defaultExtensionDirs} returns the canonical host-only locations\n * under mikan's state dir.\n *\n * Directories are scanned in order; all discovered extensions activate.\n * Accepted layouts (entrypoint may be .mjs/.js/.ts/.mts — loaded via jiti):\n *\n * - `extensions/<name>.<ext>` (bare file)\n * - `extensions/<name>/index.<ext>` (directory + index)\n * - `extensions/<name>/package.json` (mikan.extensions entrypoint;\n * may carry npm dependencies in node_modules)\n *\n * Modules are imported with a fresh jiti instance (no cache) so edited\n * extensions are picked up when a new harness instance is created.\n */\nimport { existsSync, mkdirSync, readdirSync, readFileSync, statSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { basename, join } from \"node:path\";\nimport { createJiti } from \"jiti\";\nimport type { AgentTool } from \"@earendil-works/pi-agent-core\";\nimport * as log from \"../../log.js\";\nimport { buildEventPayload } from \"../event-format.js\";\nimport { loadSkillsFromDir } from \"../skills.js\";\nimport type { MikanSkill } from \"../types.js\";\nimport { ExtensionRegistry, namespaceActionIds } from \"./registry.js\";\nimport { officeStateDir } from \"../../office/index.js\";\nimport type { OfficeAddress } from \"../../types.js\";\nimport type {\n ExtensionCommand,\n ExtensionDisposer,\n ExtensionHostServices,\n ExtensionLoadError,\n ExtensionManifest,\n ExtensionSchedulePayload,\n ExtensionScheduleInfo,\n ExtensionScheduleSpec,\n ExtensionSecretDeclaration,\n ExtensionTextScheduleSpec,\n ExtensionValidation,\n InstalledExtensionInfo,\n LoadExtensionsOptions,\n LoadExtensionsResult,\n LoadedExtension,\n MikanExtensionActivate,\n MikanExtensionApi,\n MikanExtensionModule,\n} from \"./types.js\";\n\nexport type {\n ExtensionValidation,\n InstalledExtensionInfo,\n LoadExtensionsOptions,\n LoadExtensionsResult,\n} from \"./types.js\";\n\nconst EXTENSION_FILE_PATTERN = /\\.(mjs|js|ts|mts)$/;\nconst INDEX_FILE_PATTERN = /^index\\.(mjs|js|ts|mts)$/;\nconst INDEX_CANDIDATES = [\"index.mjs\", \"index.js\", \"index.ts\", \"index.mts\"];\n\n/**\n * Import an extension entrypoint through jiti so it can be TypeScript and can\n * use node_modules dependencies, transparently compiling on the fly. A fresh\n * jiti instance with caching disabled is used per load so edited extensions\n * are picked up when a new harness instance is created for a conversation.\n */\nasync function importExtensionModule(entrypoint: string): Promise<unknown> {\n const jiti = createJiti(import.meta.url, { moduleCache: false, fsCache: false });\n return jiti.import(entrypoint);\n}\n\n/**\n * Canonical host-only extension code directories for a conversation, in load\n * order: `<stateDir>/global/extensions` (all conversations) then\n * `<stateDir>/conversations/<office key>/extensions` (that conversation\n * only). `global` and `conversations` are the two sibling scopes; see\n * `LAYOUT.md`.\n */\nexport function defaultExtensionDirs(\n address: OfficeAddress,\n stateDir: string = join(homedir(), \".mikan\"),\n): string[] {\n return [\n join(stateDir, \"global\", \"extensions\"),\n join(officeStateDir(stateDir, address), \"extensions\"),\n ];\n}\n\n/**\n * List installed extensions without importing or activating them — safe for\n * inventory surfaces (commands, portal). Activation side effects (schedule\n * upserts, tool registration) only happen in {@link loadExtensions}.\n */\nexport function listInstalledExtensions(dirs: string[]): InstalledExtensionInfo[] {\n const infos: InstalledExtensionInfo[] = [];\n for (const dir of dirs) {\n for (const { entrypoint, rootDir } of discoverExtensionEntrypoints(dir)) {\n const slug = extensionSlug(rootDir);\n const manifest = readManifest(rootDir);\n infos.push({\n name: manifest.name ?? slug,\n slug,\n path: entrypoint,\n dir,\n version: manifest.version,\n description: manifest.description,\n skillNames: loadExtensionSkills(rootDir, slug).map((skill) => skill.name),\n secrets: manifest.secrets ?? [],\n });\n }\n }\n return infos;\n}\n\n/**\n * A discovered extension: its entrypoint (module to import) and root dir\n * (used for slug, manifest.json, and skills/ — which sit at the extension\n * root, not necessarily next to a nested entrypoint).\n */\ninterface DiscoveredExtension {\n entrypoint: string;\n rootDir: string;\n /** Derived from rootDir; carried here so dedup and activation cannot disagree. */\n slug: string;\n}\n\nfunction discoverExtensionEntrypoints(dir: string): DiscoveredExtension[] {\n if (!existsSync(dir)) return [];\n const found: DiscoveredExtension[] = [];\n for (const name of readdirSync(dir).toSorted()) {\n if (name.startsWith(\".\")) continue;\n if (INDEX_FILE_PATTERN.test(name)) {\n // An index file at the scan root means the extension's contents were\n // copied into the scope directory itself; the slug would degenerate to\n // the scope name (e.g. the conversation id), mis-keying its data dir,\n // secrets, and schedules. Require a named form instead.\n log.logWarning(\n `Ignoring extension index file at scope root: ${join(dir, name)}`,\n \"install into a named subdirectory (e.g. extensions/<scope>/my-ext/index.mjs)\",\n );\n continue;\n }\n const fullPath = join(dir, name);\n let stats;\n try {\n stats = statSync(fullPath);\n } catch {\n continue;\n }\n if (stats.isFile() && EXTENSION_FILE_PATTERN.test(name)) {\n // Bare-file form: the file is both entrypoint and (its own) root.\n found.push({ entrypoint: fullPath, rootDir: fullPath, slug: extensionSlug(fullPath) });\n continue;\n }\n if (stats.isDirectory()) {\n const entrypoint = resolveDirectoryEntrypoint(fullPath);\n if (entrypoint) {\n found.push({ entrypoint, rootDir: fullPath, slug: extensionSlug(fullPath) });\n }\n }\n }\n return found;\n}\n\n/**\n * Resolve a directory-form extension's entrypoint. A `package.json` with a\n * `mikan.extensions` array (first entry, relative to the dir) wins — this is\n * how an extension declares a TypeScript entry and pulls in npm dependencies.\n * Otherwise fall back to an `index.{mjs,js,ts,mts}` file. Returns undefined\n * when neither is present.\n */\nfunction resolveDirectoryEntrypoint(dir: string): string | undefined {\n const declared = readMikanManifestEntrypoints(dir)[0];\n if (declared) {\n const resolved = join(dir, declared);\n if (existsSync(resolved)) return resolved;\n log.logWarning(\n `Extension package.json declares a missing entrypoint: ${resolved}`,\n \"falling back to an index file\",\n );\n }\n for (const candidate of INDEX_CANDIDATES) {\n const indexPath = join(dir, candidate);\n if (existsSync(indexPath)) return indexPath;\n }\n return undefined;\n}\n\ninterface ExtensionPackageJson {\n name?: string;\n version?: string;\n description?: string;\n mikan?: { extensions?: string[]; displayName?: string; secrets?: ExtensionSecretDeclaration[] };\n}\n\nconst SECRET_KEY_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\n/** Shape one `mikan.secrets` entry defensively; undefined when unusable. */\nfunction readSecretDeclaration(entry: unknown): ExtensionSecretDeclaration | undefined {\n if (!entry || typeof entry !== \"object\") return undefined;\n const record = entry as Record<string, unknown>;\n if (typeof record.key !== \"string\" || !SECRET_KEY_PATTERN.test(record.key)) return undefined;\n return {\n key: record.key,\n ...(typeof record.description === \"string\" ? { description: record.description } : {}),\n ...(typeof record.required === \"boolean\" ? { required: record.required } : {}),\n };\n}\n\n/** Read and shape a directory's package.json; undefined when absent/malformed. */\nfunction readPackageJson(dir: string): ExtensionPackageJson | undefined {\n const packageJsonPath = join(dir, \"package.json\");\n if (!existsSync(packageJsonPath)) return undefined;\n try {\n const parsed = JSON.parse(readFileSync(packageJsonPath, \"utf-8\")) as unknown;\n if (!parsed || typeof parsed !== \"object\") return undefined;\n const record = parsed as Record<string, unknown>;\n const mikanRaw = record.mikan as\n | { extensions?: unknown; displayName?: unknown; secrets?: unknown[] }\n | undefined;\n return {\n name: typeof record.name === \"string\" ? record.name : undefined,\n version: typeof record.version === \"string\" ? record.version : undefined,\n description: typeof record.description === \"string\" ? record.description : undefined,\n mikan: {\n extensions: Array.isArray(mikanRaw?.extensions)\n ? mikanRaw.extensions.filter((entry): entry is string => typeof entry === \"string\")\n : undefined,\n displayName: typeof mikanRaw?.displayName === \"string\" ? mikanRaw.displayName : undefined,\n secrets: Array.isArray(mikanRaw?.secrets)\n ? mikanRaw.secrets.flatMap((entry) => readSecretDeclaration(entry) ?? [])\n : undefined,\n },\n };\n } catch (err) {\n log.logWarning(`Ignoring malformed package.json: ${packageJsonPath}`, String(err));\n return undefined;\n }\n}\n\n/** Read the `mikan.extensions` entrypoint list from a directory's package.json. */\nfunction readMikanManifestEntrypoints(dir: string): string[] {\n return readPackageJson(dir)?.mikan?.extensions ?? [];\n}\n\n/** The one filesystem-safe segment sanitizer for extension identity and schedule names. */\nfunction sanitizeSegment(value: string): string {\n return value\n .toLowerCase()\n .replace(/[^a-z0-9_-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 64);\n}\n\nfunction sanitizeSlug(base: string): string {\n return sanitizeSegment(base) || \"extension\";\n}\n\n/**\n * Filesystem-safe identifier for an extension, derived from its root (the\n * install directory, or the file path for a bare-file extension). The slug\n * keys the extension's data dir, secrets vault, and schedule ownership —\n * installing the same extension globally and per-conversation shares one\n * slug and therefore one shared data dir. This is the only slug derivation:\n * a second one keyed off a different input (e.g. the entrypoint, which for\n * package.json-form extensions can live under dist/) would silently split an\n * extension's identity.\n */\nexport function extensionSlug(rootDir: string): string {\n return EXTENSION_FILE_PATTERN.test(basename(rootDir))\n ? sanitizeSlug(basename(rootDir).replace(EXTENSION_FILE_PATTERN, \"\"))\n : sanitizeSlug(basename(rootDir));\n}\n\n/** Sanitize an extension-chosen schedule name into a filename segment. */\nfunction scheduleNameSegment(name: string): string {\n const segment = sanitizeSegment(name);\n if (!segment) throw new Error(`Invalid schedule name: ${JSON.stringify(name)}`);\n return segment;\n}\n\n/**\n * Read display metadata (name/version/description) for a directory-form\n * extension. `package.json` is the primary source — its standard `name`,\n * `version`, `description`, plus an optional `mikan.displayName` that\n * overrides the npm name for the user-facing label (npm names are\n * lowercase/scoped; display names can be arbitrary). A `manifest.json` is a\n * fallback for extensions that ship no package.json.\n */\nfunction readManifest(rootDir: string): ExtensionManifest {\n // Bare-file extensions (rootDir is a *.mjs/.ts file) have no manifest.\n if (EXTENSION_FILE_PATTERN.test(basename(rootDir))) return {};\n\n const pkg = readPackageJson(rootDir);\n if (\n pkg &&\n (pkg.mikan?.displayName ??\n pkg.name ??\n pkg.version ??\n pkg.description ??\n pkg.mikan?.secrets?.length)\n ) {\n return {\n name: pkg.mikan?.displayName ?? pkg.name,\n version: pkg.version,\n description: pkg.description,\n ...(pkg.mikan?.secrets?.length ? { secrets: pkg.mikan.secrets } : {}),\n };\n }\n\n const manifestPath = join(rootDir, \"manifest.json\");\n if (!existsSync(manifestPath)) return {};\n try {\n const parsed: unknown = JSON.parse(readFileSync(manifestPath, \"utf-8\"));\n if (!parsed || typeof parsed !== \"object\") return {};\n const record = parsed as Record<string, unknown>;\n return {\n name: typeof record.name === \"string\" ? record.name : undefined,\n version: typeof record.version === \"string\" ? record.version : undefined,\n description: typeof record.description === \"string\" ? record.description : undefined,\n };\n } catch (err) {\n log.logWarning(`Ignoring malformed extension manifest: ${manifestPath}`, String(err));\n return {};\n }\n}\n\n/**\n * Skills shipped inside a directory-form extension (`<dir>/skills/`).\n * Marked inline: extension files live under the host-only state dir, which\n * sandbox containers cannot read, so skill bodies must ride in the prompt.\n */\nfunction loadExtensionSkills(rootDir: string, slug: string): MikanSkill[] {\n // Bare-file extensions (rootDir is a *.mjs/.ts file) ship no skills.\n if (EXTENSION_FILE_PATTERN.test(basename(rootDir))) return [];\n const skillsDir = join(rootDir, \"skills\");\n if (!existsSync(skillsDir)) return [];\n const result = loadSkillsFromDir({ dir: skillsDir, source: `extension:${slug}` });\n for (const diagnostic of result.diagnostics) {\n log.logWarning(`Extension skill warning (${slug}): ${diagnostic.message}`, diagnostic.path);\n }\n for (const skill of result.skills) skill.inline = true;\n return result.skills;\n}\n\nconst SCHEDULE_FILE_SUFFIX = \".json\";\n\nfunction schedulePrefix(slug: string, conversationId: string): string {\n return `ext.${slug}.${scheduleNameSegment(conversationId)}.`;\n}\n\nfunction payloadFromSpec(\n spec: ExtensionTextScheduleSpec,\n conversationId: string,\n defaultPlatform: string,\n): ExtensionSchedulePayload {\n // Per-type validation (schedule/timezone for periodic, at for one-shot)\n // is owned by the event-format builder.\n return buildEventPayload({\n type: spec.type,\n conversationId,\n text: spec.text,\n platform: spec.platform ?? defaultPlatform,\n ...(spec.type === \"periodic\"\n ? { schedule: spec.schedule, timezone: spec.timezone }\n : { at: spec.at }),\n });\n}\n\nfunction specFromPayload(payload: ExtensionSchedulePayload): ExtensionScheduleSpec {\n if (payload.type === \"periodic\") {\n return {\n type: \"periodic\",\n schedule: payload.schedule,\n timezone: payload.timezone,\n text: payload.text,\n ...(payload.platform ? { platform: payload.platform } : {}),\n };\n }\n // `immediate` payloads never appear under the schedules namespace (they\n // live under \"extrun.\"); tolerate them as an empty one-shot rather than\n // widening the spec union.\n return {\n type: \"one-shot\",\n at: payload.type === \"one-shot\" ? payload.at : \"\",\n text: payload.text,\n ...(payload.platform ? { platform: payload.platform } : {}),\n };\n}\n\n/** Build the v2 api surface for one extension over the injected services. */\nfunction buildExtensionApi(params: {\n name: string;\n slug: string;\n registry: ExtensionRegistry;\n context: LoadExtensionsOptions[\"context\"];\n services: ExtensionHostServices;\n}): MikanExtensionApi {\n const { name, slug, registry, context, services } = params;\n const stateDir = services.stateDir ?? join(homedir(), \".mikan\");\n const conversationId = context.conversationId;\n const conversationStateDir = officeStateDir(stateDir, context.address);\n // Default platform for proactive messaging and schedules: the platform this\n // conversation lives on. Extensions only name a platform explicitly when\n // targeting a conversation on a different one.\n const ownPlatform = context.address.platform;\n\n const requireScheduleStore = () => {\n if (!services.scheduleStore) {\n throw new Error(\"api.schedules is unavailable: this context provides no schedule store\");\n }\n return services.scheduleStore;\n };\n\n const requireCallbackScheduleStore = () => {\n if (!services.callbackScheduleStore) {\n throw new Error(\n \"api.schedules callback specs are unavailable: this context provides no callback-schedule store\",\n );\n }\n return services.callbackScheduleStore;\n };\n\n const scheduleFilename = (scheduleName: string) =>\n `${schedulePrefix(slug, conversationId)}${scheduleNameSegment(scheduleName)}${SCHEDULE_FILE_SUFFIX}`;\n\n return {\n on: (hook, handler) => registry.register(name, hook, handler),\n registerTool: (tool: AgentTool) => registry.registerTool(tool),\n registerCommand: (command: ExtensionCommand) => registry.registerCommand(name, command),\n onDispose: (disposer: ExtensionDisposer) => registry.registerDisposer(name, disposer),\n log: (message: string) => log.logInfo(`[extension:${name}] ${message}`),\n context,\n paths: {\n get dataDir(): string {\n // This conversation's own data, co-located with the conversation's\n // other host-only assets; removed when the conversation is deleted.\n const dir = join(conversationStateDir, \"extension-data\", slug);\n mkdirSync(dir, { recursive: true });\n return dir;\n },\n get sharedDataDir(): string {\n // Cross-conversation data under the sibling `global` scope.\n const dir = join(stateDir, \"global\", \"extension-data\", slug);\n mkdirSync(dir, { recursive: true });\n return dir;\n },\n },\n secrets: {\n get: (key: string) => services.resolveSecrets?.(slug)[key],\n list: () => Object.keys(services.resolveSecrets?.(slug) ?? {}),\n },\n schedules: {\n upsert: async (scheduleName, spec) => {\n const nameSegment = scheduleNameSegment(scheduleName);\n // One name namespace across both action kinds: an upsert switches the\n // schedule's kind by also dropping its counterpart in the other store.\n if (spec.callback !== undefined) {\n await requireCallbackScheduleStore().upsert(slug, nameSegment, spec);\n await services.scheduleStore?.delete(scheduleFilename(scheduleName));\n return;\n }\n const store = requireScheduleStore();\n await store.write(\n scheduleFilename(scheduleName),\n payloadFromSpec(spec, conversationId, ownPlatform),\n );\n await services.callbackScheduleStore?.delete(slug, nameSegment);\n },\n delete: async (scheduleName) => {\n if (!services.scheduleStore && !services.callbackScheduleStore) requireScheduleStore();\n const deletedCallback =\n (await services.callbackScheduleStore?.delete(slug, scheduleNameSegment(scheduleName))) ??\n false;\n const deletedText =\n (await services.scheduleStore?.delete(scheduleFilename(scheduleName))) ?? false;\n return deletedCallback || deletedText;\n },\n list: async () => {\n if (!services.scheduleStore && !services.callbackScheduleStore) requireScheduleStore();\n const infos: ExtensionScheduleInfo[] = [];\n if (services.scheduleStore) {\n const prefix = schedulePrefix(slug, conversationId);\n for (const entry of await services.scheduleStore.list()) {\n if (!entry.filename.startsWith(prefix)) continue;\n if (!entry.filename.endsWith(SCHEDULE_FILE_SUFFIX)) continue;\n infos.push({\n name: entry.filename.slice(prefix.length, -SCHEDULE_FILE_SUFFIX.length),\n spec: specFromPayload(entry.payload),\n });\n }\n }\n if (services.callbackScheduleStore) {\n infos.push(...(await services.callbackScheduleStore.list(slug)));\n }\n return infos;\n },\n onCallback: (callbackName, handler) =>\n registry.registerScheduleCallback(slug, callbackName, handler),\n },\n subagent: {\n run: async (request) => {\n if (!services.runSubagent) {\n throw new Error(\"api.subagent is unavailable: this context provides no subagent runner\");\n }\n return services.runSubagent(request, registry.getContributedTools());\n },\n },\n notify: async (\n text: string,\n options?: { conversationId?: string; platform?: string; threadTs?: string },\n ) => {\n if (!services.postMessage) {\n throw new Error(\"api.notify is unavailable: this context provides no platform messaging\");\n }\n return services.postMessage(options?.conversationId ?? conversationId, text, {\n platform: options?.platform ?? ownPlatform,\n ...(options?.threadTs ? { threadTs: options.threadTs } : {}),\n });\n },\n openDm: async (userId: string) => {\n if (!services.openDirectConversation) {\n throw new Error(\"api.openDm is unavailable: this context provides no DM resolution\");\n }\n return services.openDirectConversation(userId, ownPlatform);\n },\n fetchHistory: async (options?: {\n conversationId?: string;\n oldest?: string;\n limit?: number;\n threadTs?: string;\n }) => {\n if (!services.fetchHistory) {\n throw new Error(\"api.fetchHistory is unavailable: this context provides no history reads\");\n }\n const { conversationId: target, ...historyOptions } = options ?? {};\n return services.fetchHistory(target ?? conversationId, {\n ...historyOptions,\n platform: ownPlatform,\n });\n },\n listUsers: async () => {\n if (!services.listUsers) {\n throw new Error(\"api.listUsers is unavailable: this context provides no user listings\");\n }\n return services.listUsers(ownPlatform);\n },\n blockkit: {\n post: async (message) => {\n if (!services.postBlocks) {\n throw new Error(\n \"api.blockkit is unavailable: this context provides no Block Kit messaging\",\n );\n }\n return services.postBlocks(\n conversationId,\n {\n text: message.text,\n blocks: namespaceActionIds(message.blocks, slug),\n threadTs: message.threadTs,\n },\n ownPlatform,\n );\n },\n update: async (messageTs, message) => {\n if (!services.updateBlocks) {\n throw new Error(\n \"api.blockkit is unavailable: this context provides no Block Kit messaging\",\n );\n }\n await services.updateBlocks(\n conversationId,\n messageTs,\n {\n text: message.text,\n blocks: namespaceActionIds(message.blocks, slug),\n },\n ownPlatform,\n );\n },\n onAction: (actionId, handler) => registry.registerAction(slug, actionId, handler),\n },\n react: async (messageTs: string, emoji: string) => {\n if (!services.addReaction) {\n throw new Error(\"api.react is unavailable: this context provides no reaction support\");\n }\n await services.addReaction(conversationId, messageTs, emoji, ownPlatform);\n },\n uploadFile: async (filePath: string, title?: string) => {\n if (!services.uploadFile) {\n throw new Error(\"api.uploadFile is unavailable: this context provides no file uploads\");\n }\n await services.uploadFile(conversationId, filePath, title, ownPlatform);\n },\n triggerRun: async (text: string) => {\n const store = requireScheduleStore();\n // Distinct \"extrun.\" namespace: run files must never surface in\n // api.schedules.list(), whose ownership filter is the \"ext.\" prefix.\n // The embedder's watcher fires and deletes the file immediately.\n const filename = `extrun.${slug}.${scheduleNameSegment(conversationId)}.${Date.now()}-${runCounter++}${SCHEDULE_FILE_SUFFIX}`;\n await store.write(filename, {\n type: \"immediate\",\n platform: ownPlatform,\n conversationId,\n text,\n });\n },\n };\n}\n\n/** Monotonic suffix so rapid triggerRun calls in one process never collide. */\nlet runCounter = 0;\n\nfunction resolveActivate(moduleExports: unknown): MikanExtensionModule | undefined {\n if (!moduleExports || typeof moduleExports !== \"object\") return undefined;\n const candidates: unknown[] = [(moduleExports as { default?: unknown }).default, moduleExports];\n for (const candidate of candidates) {\n if (typeof candidate === \"function\") {\n return { activate: candidate as MikanExtensionActivate };\n }\n if (candidate && typeof candidate === \"object\") {\n const activate = (candidate as { activate?: unknown }).activate;\n if (typeof activate === \"function\") {\n return {\n name:\n typeof (candidate as { name?: unknown }).name === \"string\"\n ? (candidate as { name: string }).name\n : undefined,\n activate: activate as MikanExtensionActivate,\n };\n }\n }\n }\n return undefined;\n}\n\n/** Load and activate all extensions found in the given directories. */\nexport async function loadExtensions(\n options: LoadExtensionsOptions,\n): Promise<LoadExtensionsResult> {\n const registry = new ExtensionRegistry();\n const extensions: LoadedExtension[] = [];\n const errors: ExtensionLoadError[] = [];\n const skills: MikanSkill[] = [];\n const services = options.services ?? {};\n\n for (const { entrypoint, rootDir, slug } of collectExtensions(options)) {\n try {\n const manifest = readManifest(rootDir);\n // Enforce declared-required secrets before importing: a clear\n // provisioning hint beats whatever error the extension would throw at\n // first `api.secrets.get` miss. Only enforceable when this context\n // resolves secrets at all (`mikan ext dev` and secret-less embedders\n // still activate; `api.secrets.get` returns undefined there).\n if (services.resolveSecrets) {\n const provisioned = services.resolveSecrets(slug);\n const missing = (manifest.secrets ?? [])\n .filter((secret) => secret.required && !(secret.key in provisioned))\n .map((secret) => secret.key);\n if (missing.length > 0) {\n errors.push({\n path: entrypoint,\n error:\n `missing required secrets: ${missing.join(\", \")} — provision them in the admin ` +\n `portal or in <stateDir>/vaults/extensions/${slug}/env`,\n });\n continue;\n }\n }\n const moduleExports: unknown = await importExtensionModule(entrypoint);\n const extension = resolveActivate(moduleExports);\n if (!extension) {\n errors.push({\n path: entrypoint,\n error: \"extension must export an activate function (default or named)\",\n });\n continue;\n }\n const name = manifest.name ?? extension.name ?? slug;\n const api = buildExtensionApi({\n name,\n slug,\n registry,\n context: options.context,\n services,\n });\n const disposer = await extension.activate(api);\n if (typeof disposer === \"function\") registry.registerDisposer(name, disposer);\n const extensionSkills = loadExtensionSkills(rootDir, slug);\n skills.push(...extensionSkills);\n extensions.push({\n name,\n path: entrypoint,\n slug,\n version: manifest.version,\n description: manifest.description,\n skills: extensionSkills,\n });\n } catch (err) {\n errors.push({\n path: entrypoint,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n return { registry, extensions, errors, skills, dispose: () => registry.dispose() };\n}\n\n/**\n * Everything to activate, in final order, with at most one entry per slug.\n *\n * Deduplication happens here rather than at activation time on purpose. The\n * slug keys an extension's data dir, secrets, and schedules, so activating two\n * copies of one extension would have them fight over the same state — and the\n * registry's first-wins rule for commands would silently pick the opposite\n * copy from the one that ran its hooks. Resolving to a single winner before\n * anything is imported keeps those decisions consistent.\n *\n * Precedence follows scan order, so the narrowest scope wins: global\n * directories first, then the conversation's, then explicit roots.\n */\nfunction collectExtensions(options: LoadExtensionsOptions): DiscoveredExtension[] {\n const bySlug = new Map<string, DiscoveredExtension>();\n const candidates = [\n ...options.dirs.flatMap(discoverExtensionEntrypoints),\n ...(options.roots ?? []).flatMap(resolveExtensionRoot),\n ];\n\n for (const candidate of candidates) {\n const shadowed = bySlug.get(candidate.slug);\n if (shadowed && shadowed.rootDir !== candidate.rootDir) {\n log.logInfo(\n `Extension \"${candidate.slug}\" from ${candidate.rootDir} shadows ${shadowed.rootDir}`,\n );\n }\n bySlug.set(candidate.slug, candidate);\n }\n return [...bySlug.values()];\n}\n\n/** Resolve one explicit extension root (directory with an entrypoint, or a bare file). */\nfunction resolveExtensionRoot(rootDir: string): DiscoveredExtension[] {\n let stats;\n try {\n stats = statSync(rootDir);\n } catch {\n log.logWarning(`Extension path does not exist: ${rootDir}`);\n return [];\n }\n if (stats.isFile()) {\n return EXTENSION_FILE_PATTERN.test(basename(rootDir))\n ? [{ entrypoint: rootDir, rootDir, slug: extensionSlug(rootDir) }]\n : [];\n }\n const entrypoint = resolveDirectoryEntrypoint(rootDir);\n if (!entrypoint) {\n log.logWarning(\n `No extension entrypoint in ${rootDir}`,\n \"expected an index.{mjs,js,ts,mts} or a package.json with mikan.extensions\",\n );\n return [];\n }\n return [{ entrypoint, rootDir, slug: extensionSlug(rootDir) }];\n}\n\n/**\n * Validate an extension source path (a directory or a single file) WITHOUT\n * activating it: resolves the entrypoint (package.json `mikan.extensions`,\n * index file, or the file itself), imports it, and checks it exports an\n * `activate` function. Used by `mikan ext install` as a preflight and by\n * `mikan ext validate`. Importing runs top-level module code but not\n * `activate`, so there are no schedule/tool side effects.\n */\nexport async function validateExtension(sourcePath: string): Promise<ExtensionValidation> {\n const errors: string[] = [];\n const warnings: string[] = [];\n const rootDir = sourcePath.replace(/[/\\\\]+$/, \"\");\n const base = basename(rootDir);\n\n if (INDEX_FILE_PATTERN.test(base)) {\n warnings.push(\n \"Entry is a bare index file; install into a named directory so the slug is stable.\",\n );\n }\n\n let entrypoint: string | undefined;\n if (!existsSync(rootDir)) {\n errors.push(`Path does not exist: ${rootDir}`);\n } else if (statSync(rootDir).isDirectory()) {\n entrypoint = resolveDirectoryEntrypoint(rootDir);\n if (!entrypoint) {\n errors.push(\n \"No entrypoint found: expected package.json with a mikan.extensions entry, or an index.{mjs,js,ts,mts}.\",\n );\n }\n } else if (EXTENSION_FILE_PATTERN.test(base)) {\n entrypoint = rootDir;\n } else {\n errors.push(`Not an extension file (expected .mjs/.js/.ts/.mts): ${rootDir}`);\n }\n\n const slug = extensionSlug(rootDir);\n const manifest = readManifest(rootDir);\n const skillNames = loadExtensionSkills(rootDir, slug).map((skill) => skill.name);\n\n if (entrypoint) {\n try {\n const moduleExports: unknown = await importExtensionModule(entrypoint);\n if (!resolveActivate(moduleExports)) {\n errors.push(\"Module does not export an activate function (default or named).\");\n }\n } catch (err) {\n errors.push(`Failed to import: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n return {\n ok: errors.length === 0,\n slug,\n name: manifest.name ?? slug,\n version: manifest.version,\n description: manifest.description,\n entrypoint,\n skillNames,\n secrets: manifest.secrets ?? [],\n errors,\n warnings,\n };\n}\n"]}
|
|
@@ -5,19 +5,124 @@
|
|
|
5
5
|
* extensions and dispatches events from the harness runner. Handler failures
|
|
6
6
|
* are logged and swallowed so a broken extension cannot take down a run.
|
|
7
7
|
*/
|
|
8
|
-
import type { AgentTool } from "@earendil-works/pi-agent-core";
|
|
9
|
-
import type { MikanHookMap, MikanHookName } from "./types.js";
|
|
8
|
+
import type { AgentMessage, AgentTool } from "@earendil-works/pi-agent-core";
|
|
9
|
+
import type { BeforeAgentStartHookEvent, BeforeAgentStartHookResult, ContextHookEvent, ExtensionBlockAction, ExtensionBlockActionHandler, ExtensionCommand, ExtensionCommandContext, ExtensionDisposer, ExtensionScheduleCallbackEvent, ExtensionScheduleCallbackHandler, MessageEndHookEvent, MessageEndHookResult, MikanHookMap, MikanHookName, ToolResultHookEvent, ToolResultHookResult } from "./types.js";
|
|
10
|
+
/**
|
|
11
|
+
* Parse `/name args…` slash-command text. Returns undefined when the text is
|
|
12
|
+
* not a slash command with a valid name (`COMMAND_NAME_PATTERN`).
|
|
13
|
+
*/
|
|
14
|
+
export declare function parseCommandInput(text: string): {
|
|
15
|
+
name: string;
|
|
16
|
+
args: string;
|
|
17
|
+
} | undefined;
|
|
10
18
|
export declare class ExtensionRegistry {
|
|
11
19
|
private handlers;
|
|
12
20
|
private tools;
|
|
21
|
+
private commands;
|
|
22
|
+
/** Block action handlers keyed `<slug>\n<actionId>` (slug scopes, so no cross-extension dups). */
|
|
23
|
+
private actions;
|
|
24
|
+
/** Schedule callback handlers keyed `<slug>\n<callbackName>`, mirroring actions. */
|
|
25
|
+
private scheduleCallbacks;
|
|
26
|
+
private disposers;
|
|
13
27
|
register<T extends MikanHookName>(owner: string, hook: T, handler: MikanHookMap[T]): void;
|
|
14
28
|
registerTool(tool: AgentTool): void;
|
|
29
|
+
/**
|
|
30
|
+
* Register an extension command. Invalid names throw (surfaces as an
|
|
31
|
+
* activation error for that extension); a duplicate name is logged and
|
|
32
|
+
* ignored so the first registration wins, mirroring hook isolation.
|
|
33
|
+
*/
|
|
34
|
+
registerCommand(owner: string, command: ExtensionCommand): void;
|
|
35
|
+
registerDisposer(owner: string, disposer: ExtensionDisposer): void;
|
|
36
|
+
/**
|
|
37
|
+
* Register a block action handler for `actionId` under an extension slug.
|
|
38
|
+
* A duplicate registration is logged and ignored (first wins), mirroring
|
|
39
|
+
* command registration.
|
|
40
|
+
*/
|
|
41
|
+
registerAction(slug: string, actionId: string, handler: ExtensionBlockActionHandler): void;
|
|
42
|
+
/**
|
|
43
|
+
* Register a schedule callback handler under an extension slug. Invalid
|
|
44
|
+
* names throw (an activation error for that extension); a duplicate
|
|
45
|
+
* registration is logged and ignored (first wins), mirroring commands.
|
|
46
|
+
*/
|
|
47
|
+
registerScheduleCallback(slug: string, callbackName: string, handler: ExtensionScheduleCallbackHandler): void;
|
|
48
|
+
/**
|
|
49
|
+
* Run the handler for a fired callback schedule. Returns true when a
|
|
50
|
+
* matching handler exists — including when it threw (the fire was
|
|
51
|
+
* consumed; the error is logged).
|
|
52
|
+
*/
|
|
53
|
+
dispatchScheduleCallback(slug: string, callbackName: string, event: ExtensionScheduleCallbackEvent): Promise<boolean>;
|
|
54
|
+
/**
|
|
55
|
+
* Run the handler for an extension-owned block action. Returns true when a
|
|
56
|
+
* matching handler exists — including when it threw (the action was
|
|
57
|
+
* consumed; the error is logged, never surfaced to the platform).
|
|
58
|
+
*/
|
|
59
|
+
dispatchAction(slug: string, action: ExtensionBlockAction): Promise<boolean>;
|
|
15
60
|
getContributedTools(): AgentTool[];
|
|
61
|
+
/** Registered commands, for inventory surfaces. */
|
|
62
|
+
getCommands(): ExtensionCommand[];
|
|
63
|
+
/**
|
|
64
|
+
* Run the handler for `/name`, if an extension registered it. Returns true
|
|
65
|
+
* when a matching command exists — including when its handler threw (the
|
|
66
|
+
* command was consumed; the error is logged and reported to the user).
|
|
67
|
+
*/
|
|
68
|
+
dispatchCommand(name: string, context: ExtensionCommandContext): Promise<boolean>;
|
|
69
|
+
/**
|
|
70
|
+
* Run all registered disposers in reverse registration order (LIFO).
|
|
71
|
+
* Disposer errors are logged and never propagate. Idempotent: disposers
|
|
72
|
+
* run once and the list is cleared.
|
|
73
|
+
*/
|
|
74
|
+
dispose(): Promise<void>;
|
|
16
75
|
hasHandlers(hook: MikanHookName): boolean;
|
|
17
76
|
/**
|
|
18
77
|
* Run handlers in registration order. Returns the first non-undefined
|
|
19
78
|
* result. Handler errors are logged and skipped.
|
|
20
79
|
*/
|
|
21
80
|
emit<T extends MikanHookName>(hook: T, event: Parameters<MikanHookMap[T]>[0]): Promise<Awaited<ReturnType<MikanHookMap[T]>> | undefined>;
|
|
81
|
+
/**
|
|
82
|
+
* Dispatch `before_agent_start` with merge semantics: `systemPrompt` and
|
|
83
|
+
* `prompt` rewrites chain (each handler sees the event as rewritten by
|
|
84
|
+
* earlier handlers), while `block` from ANY handler wins so a policy
|
|
85
|
+
* extension cannot be shadowed by registration order. The first block's
|
|
86
|
+
* reason is kept. Returns undefined when no handler changed anything.
|
|
87
|
+
*/
|
|
88
|
+
emitBeforeAgentStart(event: BeforeAgentStartHookEvent): Promise<BeforeAgentStartHookResult | undefined>;
|
|
89
|
+
/**
|
|
90
|
+
* Dispatch `context` with Pi-compatible chaining semantics. Handlers receive
|
|
91
|
+
* a call-local clone, so in-place mutations and returned replacements affect
|
|
92
|
+
* only this LLM call and never the canonical transcript.
|
|
93
|
+
*/
|
|
94
|
+
emitContext(event: ContextHookEvent): Promise<AgentMessage[]>;
|
|
95
|
+
/**
|
|
96
|
+
* Dispatch `message_end` with Pi-compatible chaining semantics. Each handler
|
|
97
|
+
* sees the replacement from the previous handler. Role-changing replacements
|
|
98
|
+
* are rejected because the agent lifecycle event role cannot be changed.
|
|
99
|
+
*/
|
|
100
|
+
emitMessageEnd(event: MessageEndHookEvent): Promise<MessageEndHookResult | undefined>;
|
|
101
|
+
/**
|
|
102
|
+
* Dispatch `tool_result` with chaining semantics: each handler sees content,
|
|
103
|
+
* details, isError, and usage as rewritten by earlier handlers, so e.g. a
|
|
104
|
+
* redaction extension processes the output of upstream rewriters instead of
|
|
105
|
+
* the original. Returns the accumulated override, or undefined when no
|
|
106
|
+
* handler changed anything.
|
|
107
|
+
*/
|
|
108
|
+
emitToolResult(event: ToolResultHookEvent): Promise<ToolResultHookResult | undefined>;
|
|
22
109
|
}
|
|
110
|
+
/**
|
|
111
|
+
* Action-id namespacing for extension-posted interactive messages.
|
|
112
|
+
*
|
|
113
|
+
* Blocks posted through `api.blockkit.post` get every `action_id` rewritten
|
|
114
|
+
* to `ext:<slug>:<original>` so the platform adapter can route interactions
|
|
115
|
+
* exclusively to the owning extension's `onAction` handlers (never into an
|
|
116
|
+
* agent run). Model-posted blocks carry no prefix and keep the existing
|
|
117
|
+
* conversation-event path; the two worlds cannot collide because extension
|
|
118
|
+
* slugs are admin-controlled, filesystem-safe identifiers (no `:`).
|
|
119
|
+
*/
|
|
120
|
+
export declare const EXT_ACTION_PREFIX = "ext:";
|
|
121
|
+
/** Deep-clone blocks, rewriting every `action_id` to `ext:<slug>:<id>`. */
|
|
122
|
+
export declare function namespaceActionIds<T>(blocks: T, slug: string): T;
|
|
123
|
+
/** Parse an `ext:<slug>:<actionId>` routing id; null for non-extension actions. */
|
|
124
|
+
export declare function parseExtActionId(actionId: string): {
|
|
125
|
+
slug: string;
|
|
126
|
+
actionId: string;
|
|
127
|
+
} | null;
|
|
23
128
|
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/harness/extensions/registry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/harness/extensions/registry.ts"],"names":[],"mappings":"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"}
|