@geminixiang/mikan 1.0.0-beta.2 → 1.0.0-beta.20
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 +354 -0
- package/README.md +42 -16
- package/dist/adapter.d.ts +1 -1
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js.map +1 -1
- package/dist/adapters/discord/bot.d.ts +1 -0
- package/dist/adapters/discord/bot.d.ts.map +1 -1
- package/dist/adapters/discord/bot.js +36 -67
- package/dist/adapters/discord/bot.js.map +1 -1
- package/dist/adapters/discord/context.d.ts.map +1 -1
- package/dist/adapters/discord/context.js +17 -42
- package/dist/adapters/discord/context.js.map +1 -1
- package/dist/adapters/github/bot.d.ts +148 -0
- package/dist/adapters/github/bot.d.ts.map +1 -0
- package/dist/adapters/github/bot.js +1031 -0
- package/dist/adapters/github/bot.js.map +1 -0
- package/dist/adapters/github/client.d.ts +118 -0
- package/dist/adapters/github/client.d.ts.map +1 -0
- package/dist/adapters/github/client.js +309 -0
- package/dist/adapters/github/client.js.map +1 -0
- package/dist/adapters/github/cloudbuild.d.ts +24 -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 +9 -0
- package/dist/adapters/github/context.d.ts.map +1 -0
- package/dist/adapters/github/context.js +175 -0
- package/dist/adapters/github/context.js.map +1 -0
- package/dist/adapters/github/gcp-auth.d.ts +31 -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/ids.d.ts +34 -0
- package/dist/adapters/github/ids.d.ts.map +1 -0
- package/dist/adapters/github/ids.js +53 -0
- package/dist/adapters/github/ids.js.map +1 -0
- package/dist/adapters/github/repo.d.ts +30 -0
- package/dist/adapters/github/repo.d.ts.map +1 -0
- package/dist/adapters/github/repo.js +136 -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 +24 -0
- package/dist/adapters/github/tools/checks.d.ts.map +1 -0
- package/dist/adapters/github/tools/checks.js +116 -0
- package/dist/adapters/github/tools/checks.js.map +1 -0
- package/dist/adapters/github/tools/issue.d.ts +22 -0
- package/dist/adapters/github/tools/issue.d.ts.map +1 -0
- package/dist/adapters/github/tools/issue.js +59 -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 +59 -0
- package/dist/adapters/github/tools/pr.js.map +1 -0
- package/dist/adapters/github/tools/read.d.ts +22 -0
- package/dist/adapters/github/tools/read.d.ts.map +1 -0
- package/dist/adapters/github/tools/read.js +152 -0
- package/dist/adapters/github/tools/read.js.map +1 -0
- package/dist/adapters/github/tools/review-reply.d.ts +19 -0
- package/dist/adapters/github/tools/review-reply.d.ts.map +1 -0
- package/dist/adapters/github/tools/review-reply.js +49 -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 +45 -0
- package/dist/adapters/github/tools/sync.js.map +1 -0
- package/dist/adapters/github/types.d.ts +350 -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 +79 -22
- package/dist/adapters/intake.js.map +1 -1
- package/dist/adapters/slack/bot.d.ts +8 -6
- package/dist/adapters/slack/bot.d.ts.map +1 -1
- package/dist/adapters/slack/bot.js +81 -133
- 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 +3 -14
- 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 +14 -17
- 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 +5 -8
- package/dist/adapters/slack/session.js.map +1 -1
- package/dist/adapters/streaming.d.ts +4 -0
- package/dist/adapters/streaming.d.ts.map +1 -1
- package/dist/adapters/streaming.js +11 -0
- package/dist/adapters/streaming.js.map +1 -1
- package/dist/adapters/telegram/bot.d.ts +1 -2
- package/dist/adapters/telegram/bot.d.ts.map +1 -1
- package/dist/adapters/telegram/bot.js +27 -62
- 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 +8 -27
- package/dist/adapters/telegram/context.js.map +1 -1
- package/dist/adapters/types.d.ts +28 -2
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/adapters/types.js.map +1 -1
- package/dist/agent.d.ts +38 -14
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +358 -224
- package/dist/agent.js.map +1 -1
- package/dist/cli/download.d.ts.map +1 -0
- package/dist/cli/download.js.map +1 -0
- package/dist/cli/ext-git.d.ts +22 -0
- package/dist/cli/ext-git.d.ts.map +1 -0
- package/dist/cli/ext-git.js +76 -0
- package/dist/cli/ext-git.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 +217 -0
- package/dist/cli/ext.js.map +1 -0
- package/dist/commands/admin.d.ts.map +1 -1
- package/dist/commands/admin.js +2 -1
- package/dist/commands/admin.js.map +1 -1
- package/dist/commands/auto-reply.d.ts.map +1 -1
- package/dist/commands/auto-reply.js +2 -6
- package/dist/commands/auto-reply.js.map +1 -1
- package/dist/commands/extensions.d.ts.map +1 -1
- package/dist/commands/extensions.js +16 -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 +30 -1
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/manifest.d.ts +72 -0
- package/dist/commands/manifest.d.ts.map +1 -0
- package/dist/commands/manifest.js +121 -0
- package/dist/commands/manifest.js.map +1 -0
- package/dist/commands/model.d.ts.map +1 -1
- package/dist/commands/model.js +3 -1
- package/dist/commands/model.js.map +1 -1
- package/dist/commands/new.d.ts.map +1 -1
- package/dist/commands/new.js +2 -1
- package/dist/commands/new.js.map +1 -1
- package/dist/commands/sandbox.d.ts.map +1 -1
- package/dist/commands/sandbox.js +16 -12
- package/dist/commands/sandbox.js.map +1 -1
- package/dist/commands/text.d.ts +2 -0
- package/dist/commands/text.d.ts.map +1 -0
- package/dist/commands/text.js +16 -0
- package/dist/commands/text.js.map +1 -0
- package/dist/commands/types.d.ts +14 -1
- package/dist/commands/types.d.ts.map +1 -1
- package/dist/commands/types.js.map +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +90 -54
- package/dist/config.js.map +1 -1
- package/dist/events.d.ts +10 -0
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js +14 -5
- package/dist/events.js.map +1 -1
- package/dist/execution-resolver.d.ts +3 -2
- package/dist/execution-resolver.d.ts.map +1 -1
- package/dist/execution-resolver.js +28 -12
- package/dist/execution-resolver.js.map +1 -1
- package/dist/harness/extensions/loader.d.ts +39 -9
- package/dist/harness/extensions/loader.d.ts.map +1 -1
- package/dist/harness/extensions/loader.js +258 -54
- package/dist/harness/extensions/loader.js.map +1 -1
- package/dist/harness/extensions/registry.d.ts +48 -1
- package/dist/harness/extensions/registry.d.ts.map +1 -1
- package/dist/harness/extensions/registry.js +146 -0
- package/dist/harness/extensions/registry.js.map +1 -1
- package/dist/harness/extensions/types.d.ts +161 -14
- 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 +5 -5
- package/dist/harness/index.d.ts.map +1 -1
- package/dist/harness/index.js +2 -2
- package/dist/harness/index.js.map +1 -1
- package/dist/harness/models.d.ts +5 -0
- package/dist/harness/models.d.ts.map +1 -1
- package/dist/harness/models.js +10 -0
- package/dist/harness/models.js.map +1 -1
- package/dist/harness/runner.d.ts +21 -2
- package/dist/harness/runner.d.ts.map +1 -1
- package/dist/harness/runner.js +80 -22
- package/dist/harness/runner.js.map +1 -1
- package/dist/harness/session-store.d.ts +4 -1
- package/dist/harness/session-store.d.ts.map +1 -1
- package/dist/harness/session-store.js +11 -2
- package/dist/harness/session-store.js.map +1 -1
- package/dist/harness/subagent-runner.d.ts +17 -0
- package/dist/harness/subagent-runner.d.ts.map +1 -0
- package/dist/harness/subagent-runner.js +307 -0
- package/dist/harness/subagent-runner.js.map +1 -0
- package/dist/harness/types.d.ts +53 -0
- package/dist/harness/types.d.ts.map +1 -1
- package/dist/harness/types.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/main.js +232 -29
- package/dist/main.js.map +1 -1
- package/dist/provisioner.d.ts.map +1 -1
- package/dist/provisioner.js +2 -5
- 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 +264 -41
- package/dist/runtime/conversation-runtime.js.map +1 -1
- package/dist/runtime/types.d.ts +32 -5
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/runtime/types.js.map +1 -1
- package/dist/sandbox/cloudflare.d.ts +2 -0
- package/dist/sandbox/cloudflare.d.ts.map +1 -1
- package/dist/sandbox/cloudflare.js +7 -0
- package/dist/sandbox/cloudflare.js.map +1 -1
- package/dist/sandbox/container.d.ts +3 -0
- package/dist/sandbox/container.d.ts.map +1 -1
- package/dist/sandbox/container.js +8 -2
- package/dist/sandbox/container.js.map +1 -1
- package/dist/sandbox/firecracker.d.ts +2 -0
- package/dist/sandbox/firecracker.d.ts.map +1 -1
- package/dist/sandbox/firecracker.js +7 -1
- package/dist/sandbox/firecracker.js.map +1 -1
- package/dist/sandbox/gondolin-fleet.d.ts +104 -0
- package/dist/sandbox/gondolin-fleet.d.ts.map +1 -0
- package/dist/sandbox/gondolin-fleet.js +330 -0
- package/dist/sandbox/gondolin-fleet.js.map +1 -0
- package/dist/sandbox/gondolin-gateway.d.ts +85 -0
- package/dist/sandbox/gondolin-gateway.d.ts.map +1 -0
- package/dist/sandbox/gondolin-gateway.js +400 -0
- package/dist/sandbox/gondolin-gateway.js.map +1 -0
- package/dist/sandbox/gondolin-inventory.d.ts +89 -0
- package/dist/sandbox/gondolin-inventory.d.ts.map +1 -0
- package/dist/sandbox/gondolin-inventory.js +267 -0
- package/dist/sandbox/gondolin-inventory.js.map +1 -0
- package/dist/sandbox/gondolin-join.d.ts +62 -0
- package/dist/sandbox/gondolin-join.d.ts.map +1 -0
- package/dist/sandbox/gondolin-join.js +261 -0
- package/dist/sandbox/gondolin-join.js.map +1 -0
- package/dist/sandbox/gondolin-nfs-advisory.d.ts +15 -0
- package/dist/sandbox/gondolin-nfs-advisory.d.ts.map +1 -0
- package/dist/sandbox/gondolin-nfs-advisory.js +60 -0
- package/dist/sandbox/gondolin-nfs-advisory.js.map +1 -0
- package/dist/sandbox/gondolin-placement.d.ts +32 -0
- package/dist/sandbox/gondolin-placement.d.ts.map +1 -0
- package/dist/sandbox/gondolin-placement.js +83 -0
- package/dist/sandbox/gondolin-placement.js.map +1 -0
- package/dist/sandbox/gondolin-remote.d.ts +73 -0
- package/dist/sandbox/gondolin-remote.d.ts.map +1 -0
- package/dist/sandbox/gondolin-remote.js +352 -0
- package/dist/sandbox/gondolin-remote.js.map +1 -0
- package/dist/sandbox/gondolin-worker-client.d.ts +139 -0
- package/dist/sandbox/gondolin-worker-client.d.ts.map +1 -0
- package/dist/sandbox/gondolin-worker-client.js +325 -0
- package/dist/sandbox/gondolin-worker-client.js.map +1 -0
- package/dist/sandbox/gondolin-worker-main.d.ts +2 -0
- package/dist/sandbox/gondolin-worker-main.d.ts.map +1 -0
- package/dist/sandbox/gondolin-worker-main.js +22 -0
- package/dist/sandbox/gondolin-worker-main.js.map +1 -0
- package/dist/sandbox/gondolin-worker.d.ts +55 -0
- package/dist/sandbox/gondolin-worker.d.ts.map +1 -0
- package/dist/sandbox/gondolin-worker.js +201 -0
- package/dist/sandbox/gondolin-worker.js.map +1 -0
- package/dist/sandbox/gondolin.d.ts +52 -0
- package/dist/sandbox/gondolin.d.ts.map +1 -0
- package/dist/sandbox/gondolin.js +425 -0
- package/dist/sandbox/gondolin.js.map +1 -0
- package/dist/sandbox/host.d.ts +2 -0
- package/dist/sandbox/host.d.ts.map +1 -1
- package/dist/sandbox/host.js +11 -0
- package/dist/sandbox/host.js.map +1 -1
- package/dist/sandbox/identity.d.ts +21 -0
- package/dist/sandbox/identity.d.ts.map +1 -0
- package/dist/sandbox/identity.js +36 -0
- package/dist/sandbox/identity.js.map +1 -0
- package/dist/sandbox/index.d.ts +4 -3
- package/dist/sandbox/index.d.ts.map +1 -1
- package/dist/sandbox/index.js +5 -3
- package/dist/sandbox/index.js.map +1 -1
- package/dist/sandbox/types.d.ts +26 -1
- package/dist/sandbox/types.d.ts.map +1 -1
- package/dist/sandbox/types.js.map +1 -1
- package/dist/sandbox/utils.d.ts +11 -0
- package/dist/sandbox/utils.d.ts.map +1 -1
- package/dist/sandbox/utils.js +35 -0
- package/dist/sandbox/utils.js.map +1 -1
- package/dist/sessions/agent-memory-file-manager.d.ts.map +1 -1
- package/dist/sessions/agent-memory-file-manager.js +16 -30
- package/dist/sessions/agent-memory-file-manager.js.map +1 -1
- package/dist/sessions/history-line.d.ts +20 -0
- package/dist/sessions/history-line.d.ts.map +1 -0
- package/dist/sessions/history-line.js +24 -0
- package/dist/sessions/history-line.js.map +1 -0
- package/dist/sessions/policy.d.ts.map +1 -1
- package/dist/sessions/policy.js +5 -3
- package/dist/sessions/policy.js.map +1 -1
- package/dist/sessions/session-key.d.ts +31 -0
- package/dist/sessions/session-key.d.ts.map +1 -0
- package/dist/sessions/session-key.js +44 -0
- package/dist/sessions/session-key.js.map +1 -0
- package/dist/sessions/store.d.ts.map +1 -1
- package/dist/sessions/store.js +2 -2
- package/dist/sessions/store.js.map +1 -1
- package/dist/tools/bash.d.ts +3 -1
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js +24 -17
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/edit.d.ts.map +1 -1
- package/dist/tools/edit.js +9 -12
- 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 +33 -4
- package/dist/tools/event.js.map +1 -1
- package/dist/tools/generate-image.d.ts +17 -0
- package/dist/tools/generate-image.d.ts.map +1 -0
- package/dist/tools/generate-image.js +63 -0
- package/dist/tools/generate-image.js.map +1 -0
- package/dist/tools/index.d.ts +16 -2
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +27 -3
- 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 +40 -0
- package/dist/tools/react.js.map +1 -0
- package/dist/tools/sandbox.d.ts +2 -2
- package/dist/tools/sandbox.d.ts.map +1 -1
- package/dist/tools/sandbox.js +8 -7
- package/dist/tools/sandbox.js.map +1 -1
- package/dist/tools/subagent.d.ts +69 -0
- package/dist/tools/subagent.d.ts.map +1 -0
- package/dist/tools/subagent.js +286 -0
- package/dist/tools/subagent.js.map +1 -0
- package/dist/tools/types.d.ts +34 -1
- 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 +1 -8
- package/dist/tools/write.js.map +1 -1
- package/dist/trigger.d.ts.map +1 -1
- package/dist/trigger.js +1 -2
- package/dist/trigger.js.map +1 -1
- package/dist/types.d.ts +139 -7
- package/dist/types.d.ts.map +1 -1
- package/dist/types.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 +23 -0
- package/dist/vault/disabled.js.map +1 -0
- package/dist/vault/index.d.ts.map +1 -1
- package/dist/vault/index.js +3 -24
- package/dist/vault/index.js.map +1 -1
- package/dist/vault/policy.d.ts +20 -0
- package/dist/vault/policy.d.ts.map +1 -0
- package/dist/vault/policy.js +20 -0
- package/dist/vault/policy.js.map +1 -0
- package/dist/vault/routing.d.ts +1 -0
- package/dist/vault/routing.d.ts.map +1 -1
- package/dist/vault/routing.js +3 -10
- package/dist/vault/routing.js.map +1 -1
- package/dist/web/admin/portal.d.ts +27 -0
- package/dist/web/admin/portal.d.ts.map +1 -1
- package/dist/web/admin/portal.js +91 -130
- package/dist/web/admin/portal.js.map +1 -1
- package/dist/web/admin/types.d.ts +3 -0
- 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 +0 -31
- package/dist/web/login/oauth.js.map +1 -1
- package/dist/web/login/portal.js +1 -1
- 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 +4 -0
- package/dist/web/portal-shell.d.ts.map +1 -0
- package/dist/{portal-shell.js → web/portal-shell.js} +2 -2
- package/dist/web/portal-shell.js.map +1 -0
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +7 -0
- package/dist/web/server.js.map +1 -1
- package/dist/web/session-view/command.d.ts.map +1 -1
- package/dist/web/session-view/command.js +4 -1
- package/dist/web/session-view/command.js.map +1 -1
- package/dist/web/session-view/portal.d.ts.map +1 -1
- package/dist/web/session-view/portal.js +4 -3
- package/dist/web/session-view/portal.js.map +1 -1
- package/dist/web/session-view/service.d.ts.map +1 -1
- package/dist/web/session-view/service.js +2 -1
- package/dist/web/session-view/service.js.map +1 -1
- package/dist/web/session-view/types.d.ts +2 -1
- package/dist/web/session-view/types.d.ts.map +1 -1
- package/dist/web/session-view/types.js.map +1 -1
- package/package.json +7 -4
- 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/{download.d.ts → cli/download.d.ts} +0 -0
- /package/dist/{download.js → cli/download.js} +0 -0
|
@@ -6,18 +6,65 @@
|
|
|
6
6
|
* are logged and swallowed so a broken extension cannot take down a run.
|
|
7
7
|
*/
|
|
8
8
|
import type { AgentTool } from "@earendil-works/pi-agent-core";
|
|
9
|
-
import type { MikanHookMap, MikanHookName } from "./types.js";
|
|
9
|
+
import type { BeforeAgentStartHookEvent, BeforeAgentStartHookResult, ExtensionCommand, ExtensionCommandContext, ExtensionDisposer, 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
|
+
private disposers;
|
|
13
23
|
register<T extends MikanHookName>(owner: string, hook: T, handler: MikanHookMap[T]): void;
|
|
14
24
|
registerTool(tool: AgentTool): void;
|
|
25
|
+
/**
|
|
26
|
+
* Register an extension command. Invalid names throw (surfaces as an
|
|
27
|
+
* activation error for that extension); a duplicate name is logged and
|
|
28
|
+
* ignored so the first registration wins, mirroring hook isolation.
|
|
29
|
+
*/
|
|
30
|
+
registerCommand(owner: string, command: ExtensionCommand): void;
|
|
31
|
+
registerDisposer(owner: string, disposer: ExtensionDisposer): void;
|
|
15
32
|
getContributedTools(): AgentTool[];
|
|
33
|
+
/** Registered commands, for inventory surfaces. */
|
|
34
|
+
getCommands(): ExtensionCommand[];
|
|
35
|
+
/**
|
|
36
|
+
* Run the handler for `/name`, if an extension registered it. Returns true
|
|
37
|
+
* when a matching command exists — including when its handler threw (the
|
|
38
|
+
* command was consumed; the error is logged and reported to the user).
|
|
39
|
+
*/
|
|
40
|
+
dispatchCommand(name: string, context: ExtensionCommandContext): Promise<boolean>;
|
|
41
|
+
/**
|
|
42
|
+
* Run all registered disposers in reverse registration order (LIFO).
|
|
43
|
+
* Disposer errors are logged and never propagate. Idempotent: disposers
|
|
44
|
+
* run once and the list is cleared.
|
|
45
|
+
*/
|
|
46
|
+
dispose(): Promise<void>;
|
|
16
47
|
hasHandlers(hook: MikanHookName): boolean;
|
|
17
48
|
/**
|
|
18
49
|
* Run handlers in registration order. Returns the first non-undefined
|
|
19
50
|
* result. Handler errors are logged and skipped.
|
|
20
51
|
*/
|
|
21
52
|
emit<T extends MikanHookName>(hook: T, event: Parameters<MikanHookMap[T]>[0]): Promise<Awaited<ReturnType<MikanHookMap[T]>> | undefined>;
|
|
53
|
+
/**
|
|
54
|
+
* Dispatch `before_agent_start` with merge semantics: `systemPrompt` and
|
|
55
|
+
* `prompt` rewrites chain (each handler sees the event as rewritten by
|
|
56
|
+
* earlier handlers), while `block` from ANY handler wins so a policy
|
|
57
|
+
* extension cannot be shadowed by registration order. The first block's
|
|
58
|
+
* reason is kept. Returns undefined when no handler changed anything.
|
|
59
|
+
*/
|
|
60
|
+
emitBeforeAgentStart(event: BeforeAgentStartHookEvent): Promise<BeforeAgentStartHookResult | undefined>;
|
|
61
|
+
/**
|
|
62
|
+
* Dispatch `tool_result` with chaining semantics: each handler sees the
|
|
63
|
+
* content/isError as rewritten by earlier handlers, so e.g. a redaction
|
|
64
|
+
* extension processes the output of upstream rewriters instead of the
|
|
65
|
+
* original. Returns the accumulated override, or undefined when no handler
|
|
66
|
+
* changed anything.
|
|
67
|
+
*/
|
|
68
|
+
emitToolResult(event: ToolResultHookEvent): Promise<ToolResultHookResult | undefined>;
|
|
22
69
|
}
|
|
23
70
|
//# 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;AAE/D,OAAO,KAAK,
|
|
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;AAE/D,OAAO,KAAK,EACV,yBAAyB,EACzB,0BAA0B,EAC1B,gBAAgB,EAChB,uBAAuB,EACvB,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAIpB;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAI1F;AAMD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CASd;IACF,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,QAAQ,CAAmE;IACnF,OAAO,CAAC,SAAS,CAA6D;IAE9E,QAAQ,CAAC,CAAC,SAAS,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI,CAExF;IAED,YAAY,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,CAElC;IAED;;;;OAIG;IACH,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAc9D;IAED,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAEjE;IAED,mBAAmB,IAAI,SAAS,EAAE,CAEjC;IAED,mDAAmD;IACnD,WAAW,IAAI,gBAAgB,EAAE,CAEhC;IAED;;;;OAIG;IACG,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,OAAO,CAAC,CAetF;IAED;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAa7B;IAED,WAAW,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAExC;IAED;;;OAGG;IACG,IAAI,CAAC,CAAC,SAAS,aAAa,EAChC,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GACpC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAe3D;IAED;;;;;;OAMG;IACG,oBAAoB,CACxB,KAAK,EAAE,yBAAyB,GAC/B,OAAO,CAAC,0BAA0B,GAAG,SAAS,CAAC,CA6BjD;IAED;;;;;;OAMG;IACG,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC,CAuB1F;CACF"}
|
|
@@ -1,4 +1,15 @@
|
|
|
1
1
|
import * as log from "../../log.js";
|
|
2
|
+
const COMMAND_NAME_PATTERN = /^[a-z0-9_-]+$/i;
|
|
3
|
+
/**
|
|
4
|
+
* Parse `/name args…` slash-command text. Returns undefined when the text is
|
|
5
|
+
* not a slash command with a valid name (`COMMAND_NAME_PATTERN`).
|
|
6
|
+
*/
|
|
7
|
+
export function parseCommandInput(text) {
|
|
8
|
+
const match = /^\/(\S+)(?:\s+([\s\S]*))?$/.exec(text.trim());
|
|
9
|
+
if (!match || !COMMAND_NAME_PATTERN.test(match[1]))
|
|
10
|
+
return undefined;
|
|
11
|
+
return { name: match[1], args: match[2]?.trim() ?? "" };
|
|
12
|
+
}
|
|
2
13
|
export class ExtensionRegistry {
|
|
3
14
|
constructor() {
|
|
4
15
|
this.handlers = {
|
|
@@ -8,8 +19,12 @@ export class ExtensionRegistry {
|
|
|
8
19
|
message_end: [],
|
|
9
20
|
turn_end: [],
|
|
10
21
|
session_compact: [],
|
|
22
|
+
agent_error: [],
|
|
23
|
+
budget_exceeded: [],
|
|
11
24
|
};
|
|
12
25
|
this.tools = [];
|
|
26
|
+
this.commands = new Map();
|
|
27
|
+
this.disposers = [];
|
|
13
28
|
}
|
|
14
29
|
register(owner, hook, handler) {
|
|
15
30
|
this.handlers[hook].push({ owner, handler });
|
|
@@ -17,9 +32,74 @@ export class ExtensionRegistry {
|
|
|
17
32
|
registerTool(tool) {
|
|
18
33
|
this.tools.push(tool);
|
|
19
34
|
}
|
|
35
|
+
/**
|
|
36
|
+
* Register an extension command. Invalid names throw (surfaces as an
|
|
37
|
+
* activation error for that extension); a duplicate name is logged and
|
|
38
|
+
* ignored so the first registration wins, mirroring hook isolation.
|
|
39
|
+
*/
|
|
40
|
+
registerCommand(owner, command) {
|
|
41
|
+
if (!COMMAND_NAME_PATTERN.test(command.name)) {
|
|
42
|
+
throw new Error(`Invalid extension command name: ${JSON.stringify(command.name)}`);
|
|
43
|
+
}
|
|
44
|
+
const key = command.name.toLowerCase();
|
|
45
|
+
const existing = this.commands.get(key);
|
|
46
|
+
if (existing) {
|
|
47
|
+
log.logWarning(`Extension command "/${command.name}" already registered by ${existing.owner}`, `ignoring registration from ${owner}`);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
this.commands.set(key, { owner, command });
|
|
51
|
+
}
|
|
52
|
+
registerDisposer(owner, disposer) {
|
|
53
|
+
this.disposers.push({ owner, disposer });
|
|
54
|
+
}
|
|
20
55
|
getContributedTools() {
|
|
21
56
|
return [...this.tools];
|
|
22
57
|
}
|
|
58
|
+
/** Registered commands, for inventory surfaces. */
|
|
59
|
+
getCommands() {
|
|
60
|
+
return [...this.commands.values()].map((entry) => entry.command);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Run the handler for `/name`, if an extension registered it. Returns true
|
|
64
|
+
* when a matching command exists — including when its handler threw (the
|
|
65
|
+
* command was consumed; the error is logged and reported to the user).
|
|
66
|
+
*/
|
|
67
|
+
async dispatchCommand(name, context) {
|
|
68
|
+
const entry = this.commands.get(name.toLowerCase());
|
|
69
|
+
if (!entry)
|
|
70
|
+
return false;
|
|
71
|
+
try {
|
|
72
|
+
await entry.command.handler(context);
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
76
|
+
log.logWarning(`Extension command "/${entry.command.name}" failed (${entry.owner})`, message);
|
|
77
|
+
try {
|
|
78
|
+
await context.respond(`Command /${entry.command.name} failed: ${message}`);
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
// The reply channel itself failed; the log line above is the record.
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Run all registered disposers in reverse registration order (LIFO).
|
|
88
|
+
* Disposer errors are logged and never propagate. Idempotent: disposers
|
|
89
|
+
* run once and the list is cleared.
|
|
90
|
+
*/
|
|
91
|
+
async dispose() {
|
|
92
|
+
const disposers = this.disposers;
|
|
93
|
+
this.disposers = [];
|
|
94
|
+
for (const { owner, disposer } of disposers.toReversed()) {
|
|
95
|
+
try {
|
|
96
|
+
await disposer();
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
log.logWarning(`Extension disposer failed (${owner})`, err instanceof Error ? err.message : String(err));
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
23
103
|
hasHandlers(hook) {
|
|
24
104
|
return this.handlers[hook].length > 0;
|
|
25
105
|
}
|
|
@@ -41,5 +121,71 @@ export class ExtensionRegistry {
|
|
|
41
121
|
}
|
|
42
122
|
return undefined;
|
|
43
123
|
}
|
|
124
|
+
/**
|
|
125
|
+
* Dispatch `before_agent_start` with merge semantics: `systemPrompt` and
|
|
126
|
+
* `prompt` rewrites chain (each handler sees the event as rewritten by
|
|
127
|
+
* earlier handlers), while `block` from ANY handler wins so a policy
|
|
128
|
+
* extension cannot be shadowed by registration order. The first block's
|
|
129
|
+
* reason is kept. Returns undefined when no handler changed anything.
|
|
130
|
+
*/
|
|
131
|
+
async emitBeforeAgentStart(event) {
|
|
132
|
+
const chained = { ...event };
|
|
133
|
+
const merged = {};
|
|
134
|
+
for (const { owner, handler } of this.handlers.before_agent_start) {
|
|
135
|
+
try {
|
|
136
|
+
const result = await handler(chained);
|
|
137
|
+
if (!result)
|
|
138
|
+
continue;
|
|
139
|
+
if (result.systemPrompt !== undefined) {
|
|
140
|
+
merged.systemPrompt = result.systemPrompt;
|
|
141
|
+
chained.systemPrompt = result.systemPrompt;
|
|
142
|
+
}
|
|
143
|
+
if (result.prompt !== undefined) {
|
|
144
|
+
merged.prompt = result.prompt;
|
|
145
|
+
chained.prompt = result.prompt;
|
|
146
|
+
}
|
|
147
|
+
if (result.block && !merged.block) {
|
|
148
|
+
merged.block = true;
|
|
149
|
+
merged.reason = result.reason;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
catch (err) {
|
|
153
|
+
log.logWarning(`Extension hook "before_agent_start" failed (${owner})`, err instanceof Error ? err.message : String(err));
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return merged.systemPrompt !== undefined || merged.prompt !== undefined || merged.block
|
|
157
|
+
? merged
|
|
158
|
+
: undefined;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Dispatch `tool_result` with chaining semantics: each handler sees the
|
|
162
|
+
* content/isError as rewritten by earlier handlers, so e.g. a redaction
|
|
163
|
+
* extension processes the output of upstream rewriters instead of the
|
|
164
|
+
* original. Returns the accumulated override, or undefined when no handler
|
|
165
|
+
* changed anything.
|
|
166
|
+
*/
|
|
167
|
+
async emitToolResult(event) {
|
|
168
|
+
const chained = { ...event };
|
|
169
|
+
const merged = {};
|
|
170
|
+
for (const { owner, handler } of this.handlers.tool_result) {
|
|
171
|
+
try {
|
|
172
|
+
const result = await handler(chained);
|
|
173
|
+
if (!result)
|
|
174
|
+
continue;
|
|
175
|
+
if (result.content !== undefined) {
|
|
176
|
+
merged.content = result.content;
|
|
177
|
+
chained.content = result.content;
|
|
178
|
+
}
|
|
179
|
+
if (result.isError !== undefined) {
|
|
180
|
+
merged.isError = result.isError;
|
|
181
|
+
chained.isError = result.isError;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
catch (err) {
|
|
185
|
+
log.logWarning(`Extension hook "tool_result" failed (${owner})`, err instanceof Error ? err.message : String(err));
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return merged.content !== undefined || merged.isError !== undefined ? merged : undefined;
|
|
189
|
+
}
|
|
44
190
|
}
|
|
45
191
|
//# sourceMappingURL=registry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/harness/extensions/registry.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AAOpC,MAAM,OAAO,iBAAiB;IAA9B;QACU,aAAQ,GAAiB;YAC/B,kBAAkB,EAAE,EAAE;YACtB,SAAS,EAAE,EAAE;YACb,WAAW,EAAE,EAAE;YACf,WAAW,EAAE,EAAE;YACf,QAAQ,EAAE,EAAE;YACZ,eAAe,EAAE,EAAE;SACpB,CAAC;QACM,UAAK,GAAgB,EAAE,CAAC;IAyClC,CAAC;IAvCC,QAAQ,CAA0B,KAAa,EAAE,IAAO,EAAE,OAAwB;QAChF,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,YAAY,CAAC,IAAe;QAC1B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAED,mBAAmB;QACjB,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,WAAW,CAAC,IAAmB;QAC7B,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IACxC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,IAAI,CACR,IAAO,EACP,KAAqC;QAErC,KAAK,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACrD,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAO,OAAuC,CAAC,KAAK,CAAC,CAAC;gBACrE,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;oBACzB,OAAO,MAA8C,CAAC;gBACxD,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,GAAG,CAAC,UAAU,CACZ,mBAAmB,IAAI,aAAa,KAAK,GAAG,EAC5C,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CACjD,CAAC;YACJ,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;CACF","sourcesContent":["/**\n * Hook registry and dispatch for mikan extensions.\n *\n * The registry collects hook handlers and contributed tools from activated\n * extensions and dispatches events from the harness runner. Handler failures\n * are logged and swallowed so a broken extension cannot take down a run.\n */\nimport type { AgentTool } from \"@earendil-works/pi-agent-core\";\nimport * as log from \"../../log.js\";\nimport type { MikanHookMap, MikanHookName } from \"./types.js\";\n\ntype HookHandlers = {\n [T in MikanHookName]: Array<{ owner: string; handler: MikanHookMap[T] }>;\n};\n\nexport class ExtensionRegistry {\n private handlers: HookHandlers = {\n before_agent_start: [],\n tool_call: [],\n tool_result: [],\n message_end: [],\n turn_end: [],\n session_compact: [],\n };\n private tools: AgentTool[] = [];\n\n register<T extends MikanHookName>(owner: string, hook: T, handler: MikanHookMap[T]): void {\n this.handlers[hook].push({ owner, handler });\n }\n\n registerTool(tool: AgentTool): void {\n this.tools.push(tool);\n }\n\n getContributedTools(): AgentTool[] {\n return [...this.tools];\n }\n\n hasHandlers(hook: MikanHookName): boolean {\n return this.handlers[hook].length > 0;\n }\n\n /**\n * Run handlers in registration order. Returns the first non-undefined\n * result. Handler errors are logged and skipped.\n */\n async emit<T extends MikanHookName>(\n hook: T,\n event: Parameters<MikanHookMap[T]>[0],\n ): Promise<Awaited<ReturnType<MikanHookMap[T]>> | undefined> {\n for (const { owner, handler } of this.handlers[hook]) {\n try {\n const result = await (handler as (input: unknown) => unknown)(event);\n if (result !== undefined) {\n return result as Awaited<ReturnType<MikanHookMap[T]>>;\n }\n } catch (err) {\n log.logWarning(\n `Extension hook \"${hook}\" failed (${owner})`,\n err instanceof Error ? err.message : String(err),\n );\n }\n }\n return undefined;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/harness/extensions/registry.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Hook registry and dispatch for mikan extensions.\n *\n * The registry collects hook handlers and contributed tools from activated\n * extensions and dispatches events from the harness runner. Handler failures\n * are logged and swallowed so a broken extension cannot take down a run.\n */\nimport type { AgentTool } from \"@earendil-works/pi-agent-core\";\nimport * as log from \"../../log.js\";\nimport type {\n BeforeAgentStartHookEvent,\n BeforeAgentStartHookResult,\n ExtensionCommand,\n ExtensionCommandContext,\n ExtensionDisposer,\n MikanHookMap,\n MikanHookName,\n ToolResultHookEvent,\n ToolResultHookResult,\n} from \"./types.js\";\n\nconst COMMAND_NAME_PATTERN = /^[a-z0-9_-]+$/i;\n\n/**\n * Parse `/name args…` slash-command text. Returns undefined when the text is\n * not a slash command with a valid name (`COMMAND_NAME_PATTERN`).\n */\nexport function parseCommandInput(text: string): { name: string; args: string } | undefined {\n const match = /^\\/(\\S+)(?:\\s+([\\s\\S]*))?$/.exec(text.trim());\n if (!match || !COMMAND_NAME_PATTERN.test(match[1])) return undefined;\n return { name: match[1], args: match[2]?.trim() ?? \"\" };\n}\n\ntype HookHandlers = {\n [T in MikanHookName]: Array<{ owner: string; handler: MikanHookMap[T] }>;\n};\n\nexport class ExtensionRegistry {\n private handlers: HookHandlers = {\n before_agent_start: [],\n tool_call: [],\n tool_result: [],\n message_end: [],\n turn_end: [],\n session_compact: [],\n agent_error: [],\n budget_exceeded: [],\n };\n private tools: AgentTool[] = [];\n private commands = new Map<string, { owner: string; command: ExtensionCommand }>();\n private disposers: Array<{ owner: string; disposer: ExtensionDisposer }> = [];\n\n register<T extends MikanHookName>(owner: string, hook: T, handler: MikanHookMap[T]): void {\n this.handlers[hook].push({ owner, handler });\n }\n\n registerTool(tool: AgentTool): void {\n this.tools.push(tool);\n }\n\n /**\n * Register an extension command. Invalid names throw (surfaces as an\n * activation error for that extension); a duplicate name is logged and\n * ignored so the first registration wins, mirroring hook isolation.\n */\n registerCommand(owner: string, command: ExtensionCommand): void {\n if (!COMMAND_NAME_PATTERN.test(command.name)) {\n throw new Error(`Invalid extension command name: ${JSON.stringify(command.name)}`);\n }\n const key = command.name.toLowerCase();\n const existing = this.commands.get(key);\n if (existing) {\n log.logWarning(\n `Extension command \"/${command.name}\" already registered by ${existing.owner}`,\n `ignoring registration from ${owner}`,\n );\n return;\n }\n this.commands.set(key, { owner, command });\n }\n\n registerDisposer(owner: string, disposer: ExtensionDisposer): void {\n this.disposers.push({ owner, disposer });\n }\n\n getContributedTools(): AgentTool[] {\n return [...this.tools];\n }\n\n /** Registered commands, for inventory surfaces. */\n getCommands(): ExtensionCommand[] {\n return [...this.commands.values()].map((entry) => entry.command);\n }\n\n /**\n * Run the handler for `/name`, if an extension registered it. Returns true\n * when a matching command exists — including when its handler threw (the\n * command was consumed; the error is logged and reported to the user).\n */\n async dispatchCommand(name: string, context: ExtensionCommandContext): Promise<boolean> {\n const entry = this.commands.get(name.toLowerCase());\n if (!entry) return false;\n try {\n await entry.command.handler(context);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n log.logWarning(`Extension command \"/${entry.command.name}\" failed (${entry.owner})`, message);\n try {\n await context.respond(`Command /${entry.command.name} failed: ${message}`);\n } catch {\n // The reply channel itself failed; the log line above is the record.\n }\n }\n return true;\n }\n\n /**\n * Run all registered disposers in reverse registration order (LIFO).\n * Disposer errors are logged and never propagate. Idempotent: disposers\n * run once and the list is cleared.\n */\n async dispose(): Promise<void> {\n const disposers = this.disposers;\n this.disposers = [];\n for (const { owner, disposer } of disposers.toReversed()) {\n try {\n await disposer();\n } catch (err) {\n log.logWarning(\n `Extension disposer failed (${owner})`,\n err instanceof Error ? err.message : String(err),\n );\n }\n }\n }\n\n hasHandlers(hook: MikanHookName): boolean {\n return this.handlers[hook].length > 0;\n }\n\n /**\n * Run handlers in registration order. Returns the first non-undefined\n * result. Handler errors are logged and skipped.\n */\n async emit<T extends MikanHookName>(\n hook: T,\n event: Parameters<MikanHookMap[T]>[0],\n ): Promise<Awaited<ReturnType<MikanHookMap[T]>> | undefined> {\n for (const { owner, handler } of this.handlers[hook]) {\n try {\n const result = await (handler as (input: unknown) => unknown)(event);\n if (result !== undefined) {\n return result as Awaited<ReturnType<MikanHookMap[T]>>;\n }\n } catch (err) {\n log.logWarning(\n `Extension hook \"${hook}\" failed (${owner})`,\n err instanceof Error ? err.message : String(err),\n );\n }\n }\n return undefined;\n }\n\n /**\n * Dispatch `before_agent_start` with merge semantics: `systemPrompt` and\n * `prompt` rewrites chain (each handler sees the event as rewritten by\n * earlier handlers), while `block` from ANY handler wins so a policy\n * extension cannot be shadowed by registration order. The first block's\n * reason is kept. Returns undefined when no handler changed anything.\n */\n async emitBeforeAgentStart(\n event: BeforeAgentStartHookEvent,\n ): Promise<BeforeAgentStartHookResult | undefined> {\n const chained: BeforeAgentStartHookEvent = { ...event };\n const merged: BeforeAgentStartHookResult = {};\n for (const { owner, handler } of this.handlers.before_agent_start) {\n try {\n const result = await handler(chained);\n if (!result) continue;\n if (result.systemPrompt !== undefined) {\n merged.systemPrompt = result.systemPrompt;\n chained.systemPrompt = result.systemPrompt;\n }\n if (result.prompt !== undefined) {\n merged.prompt = result.prompt;\n chained.prompt = result.prompt;\n }\n if (result.block && !merged.block) {\n merged.block = true;\n merged.reason = result.reason;\n }\n } catch (err) {\n log.logWarning(\n `Extension hook \"before_agent_start\" failed (${owner})`,\n err instanceof Error ? err.message : String(err),\n );\n }\n }\n return merged.systemPrompt !== undefined || merged.prompt !== undefined || merged.block\n ? merged\n : undefined;\n }\n\n /**\n * Dispatch `tool_result` with chaining semantics: each handler sees the\n * content/isError as rewritten by earlier handlers, so e.g. a redaction\n * extension processes the output of upstream rewriters instead of the\n * original. Returns the accumulated override, or undefined when no handler\n * changed anything.\n */\n async emitToolResult(event: ToolResultHookEvent): Promise<ToolResultHookResult | undefined> {\n const chained: ToolResultHookEvent = { ...event };\n const merged: ToolResultHookResult = {};\n for (const { owner, handler } of this.handlers.tool_result) {\n try {\n const result = await handler(chained);\n if (!result) continue;\n if (result.content !== undefined) {\n merged.content = result.content;\n chained.content = result.content;\n }\n if (result.isError !== undefined) {\n merged.isError = result.isError;\n chained.isError = result.isError;\n }\n } catch (err) {\n log.logWarning(\n `Extension hook \"tool_result\" failed (${owner})`,\n err instanceof Error ? err.message : String(err),\n );\n }\n }\n return merged.content !== undefined || merged.isError !== undefined ? merged : undefined;\n }\n}\n"]}
|
|
@@ -17,27 +17,59 @@
|
|
|
17
17
|
* }
|
|
18
18
|
* ```
|
|
19
19
|
*
|
|
20
|
-
* Hooks run in registration order.
|
|
21
|
-
* non-undefined
|
|
20
|
+
* Hooks run in registration order. Result semantics are per hook:
|
|
21
|
+
* `tool_call` keeps v1's first-non-undefined-wins; `before_agent_start` and
|
|
22
|
+
* `tool_result` chain — each handler sees the event as rewritten by earlier
|
|
23
|
+
* handlers, and for `before_agent_start` a `block` from any handler wins.
|
|
22
24
|
* Hook errors are logged and never crash a run.
|
|
23
25
|
*/
|
|
24
26
|
import type { AgentMessage, AgentTool, ThinkingLevel } from "@earendil-works/pi-agent-core";
|
|
25
27
|
import type { Api, ImageContent, Model, TextContent } from "@earendil-works/pi-ai";
|
|
28
|
+
import type { TSchema } from "@sinclair/typebox";
|
|
26
29
|
import type { MikanSkill } from "../skills.js";
|
|
27
|
-
import type { CompactionEntry } from "../types.js";
|
|
30
|
+
import type { SubagentRunOutput, SubagentRunRequest, SubagentRunResult, CompactionEntry } from "../types.js";
|
|
31
|
+
/**
|
|
32
|
+
* Platform provenance of the run a hook event belongs to. Interactive runs
|
|
33
|
+
* carry the triggering message's identity (usable with `api.react` and for
|
|
34
|
+
* per-user policy); autonomous runs (schedules/events) have no triggering
|
|
35
|
+
* platform message, so only `kind` and `platform` are set.
|
|
36
|
+
*/
|
|
37
|
+
export interface RunOrigin {
|
|
38
|
+
kind: "interactive" | "event";
|
|
39
|
+
/** Platform adapter name serving this run (e.g. "slack"). */
|
|
40
|
+
platform?: string;
|
|
41
|
+
/** Platform message id of the triggering message; pass to `api.react`. */
|
|
42
|
+
messageTs?: string;
|
|
43
|
+
userId?: string;
|
|
44
|
+
userName?: string;
|
|
45
|
+
threadTs?: string;
|
|
46
|
+
/** Attachments already downloaded to host paths (extensions run on host). */
|
|
47
|
+
attachments?: {
|
|
48
|
+
name: string;
|
|
49
|
+
localPath: string;
|
|
50
|
+
}[];
|
|
51
|
+
}
|
|
28
52
|
export interface BeforeAgentStartHookEvent {
|
|
29
53
|
prompt: string;
|
|
30
54
|
images?: ImageContent[];
|
|
31
55
|
systemPrompt: string;
|
|
56
|
+
origin?: RunOrigin;
|
|
32
57
|
}
|
|
33
58
|
export interface BeforeAgentStartHookResult {
|
|
34
59
|
/** Replace the system prompt for this turn. */
|
|
35
60
|
systemPrompt?: string;
|
|
61
|
+
/** Rewrite the user prompt for this turn. */
|
|
62
|
+
prompt?: string;
|
|
63
|
+
/** Block the turn entirely; the model is never called and nothing persists. */
|
|
64
|
+
block?: boolean;
|
|
65
|
+
/** Shown to the user when the turn is blocked. */
|
|
66
|
+
reason?: string;
|
|
36
67
|
}
|
|
37
68
|
export interface ToolCallHookEvent {
|
|
38
69
|
toolCallId: string;
|
|
39
70
|
toolName: string;
|
|
40
71
|
args: unknown;
|
|
72
|
+
origin?: RunOrigin;
|
|
41
73
|
}
|
|
42
74
|
export interface ToolCallHookResult {
|
|
43
75
|
/** Block the tool call; the model receives an error tool result instead. */
|
|
@@ -50,25 +82,51 @@ export interface ToolResultHookEvent {
|
|
|
50
82
|
args: unknown;
|
|
51
83
|
content: (TextContent | ImageContent)[];
|
|
52
84
|
isError: boolean;
|
|
85
|
+
origin?: RunOrigin;
|
|
86
|
+
}
|
|
87
|
+
export interface ToolResultHookResult {
|
|
88
|
+
/** Replace the tool result content sent back to the model (e.g. redaction). */
|
|
89
|
+
content?: (TextContent | ImageContent)[];
|
|
90
|
+
/** Override the tool result error flag. */
|
|
91
|
+
isError?: boolean;
|
|
53
92
|
}
|
|
54
93
|
export interface MessageEndHookEvent {
|
|
55
94
|
message: AgentMessage;
|
|
95
|
+
origin?: RunOrigin;
|
|
56
96
|
}
|
|
57
97
|
export interface TurnEndHookEvent {
|
|
58
98
|
messages: AgentMessage[];
|
|
99
|
+
origin?: RunOrigin;
|
|
59
100
|
}
|
|
60
101
|
export interface SessionCompactHookEvent {
|
|
61
102
|
entry: CompactionEntry;
|
|
62
103
|
reason: "threshold" | "overflow" | "manual";
|
|
63
104
|
}
|
|
105
|
+
/** A turn settled with an error after retries were exhausted (or none applied). */
|
|
106
|
+
export interface AgentErrorHookEvent {
|
|
107
|
+
errorMessage: string;
|
|
108
|
+
origin?: RunOrigin;
|
|
109
|
+
}
|
|
110
|
+
/** The run budget circuit breaker tripped and the run was aborted. */
|
|
111
|
+
export interface BudgetExceededHookEvent {
|
|
112
|
+
/** Which cap was hit, e.g. "cost 2.01 USD >= 2 USD limit". */
|
|
113
|
+
reason: string;
|
|
114
|
+
tokens: number;
|
|
115
|
+
costUsd: number;
|
|
116
|
+
llmCalls: number;
|
|
117
|
+
durationMs: number;
|
|
118
|
+
origin?: RunOrigin;
|
|
119
|
+
}
|
|
64
120
|
/** Map of hook names to handler signatures. */
|
|
65
121
|
export interface MikanHookMap {
|
|
66
122
|
before_agent_start: (event: BeforeAgentStartHookEvent) => BeforeAgentStartHookResult | undefined | void | Promise<BeforeAgentStartHookResult | undefined | void>;
|
|
67
123
|
tool_call: (event: ToolCallHookEvent) => ToolCallHookResult | undefined | void | Promise<ToolCallHookResult | undefined | void>;
|
|
68
|
-
tool_result: (event: ToolResultHookEvent) => void | Promise<void>;
|
|
124
|
+
tool_result: (event: ToolResultHookEvent) => ToolResultHookResult | undefined | void | Promise<ToolResultHookResult | undefined | void>;
|
|
69
125
|
message_end: (event: MessageEndHookEvent) => void | Promise<void>;
|
|
70
126
|
turn_end: (event: TurnEndHookEvent) => void | Promise<void>;
|
|
71
127
|
session_compact: (event: SessionCompactHookEvent) => void | Promise<void>;
|
|
128
|
+
agent_error: (event: AgentErrorHookEvent) => void | Promise<void>;
|
|
129
|
+
budget_exceeded: (event: BudgetExceededHookEvent) => void | Promise<void>;
|
|
72
130
|
}
|
|
73
131
|
export type MikanHookName = keyof MikanHookMap;
|
|
74
132
|
/**
|
|
@@ -100,10 +158,11 @@ export interface ExtensionScheduleInfo {
|
|
|
100
158
|
/**
|
|
101
159
|
* Event-file payload the harness hands to the embedder's schedule store.
|
|
102
160
|
* Mirrors mikan's event-file shape; `platform` may be omitted when the
|
|
103
|
-
* embedder runs a single platform.
|
|
161
|
+
* embedder runs a single platform. `immediate` backs `api.triggerRun` —
|
|
162
|
+
* the event fires as soon as the embedder's watcher picks it up.
|
|
104
163
|
*/
|
|
105
164
|
export interface ExtensionSchedulePayload {
|
|
106
|
-
type: "one-shot" | "periodic";
|
|
165
|
+
type: "one-shot" | "periodic" | "immediate";
|
|
107
166
|
conversationId: string;
|
|
108
167
|
text: string;
|
|
109
168
|
platform?: string;
|
|
@@ -111,6 +170,39 @@ export interface ExtensionSchedulePayload {
|
|
|
111
170
|
schedule?: string;
|
|
112
171
|
timezone?: string;
|
|
113
172
|
}
|
|
173
|
+
/** Cleanup callback run when the harness instance owning the extension is discarded. */
|
|
174
|
+
export type ExtensionDisposer = () => void | Promise<void>;
|
|
175
|
+
/** Context handed to an extension command handler for one invocation. */
|
|
176
|
+
export interface ExtensionCommandContext {
|
|
177
|
+
/** Text after the command name, trimmed ("" when none). */
|
|
178
|
+
args: string;
|
|
179
|
+
conversationId: string;
|
|
180
|
+
userId?: string;
|
|
181
|
+
userName?: string;
|
|
182
|
+
/** Reply in the conversation the command was sent from. */
|
|
183
|
+
respond(text: string): Promise<void>;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* A chat command contributed by an extension (`/name args…`). Dispatched
|
|
187
|
+
* deterministically by the embedder — no model call, no agent-session entry
|
|
188
|
+
* (the triggering message still syncs to chat history).
|
|
189
|
+
* Built-in commands always win over extension commands of the same name.
|
|
190
|
+
*/
|
|
191
|
+
export interface ExtensionCommand {
|
|
192
|
+
/** Command name without the leading slash; `[a-z0-9_-]+`, case-insensitive match. */
|
|
193
|
+
name: string;
|
|
194
|
+
/** One-line description for inventory surfaces. */
|
|
195
|
+
description?: string;
|
|
196
|
+
handler: (context: ExtensionCommandContext) => void | Promise<void>;
|
|
197
|
+
}
|
|
198
|
+
export interface SubagentApi {
|
|
199
|
+
/**
|
|
200
|
+
* Run one fresh subagent and return its result to the extension. The
|
|
201
|
+
* subagent has no conversation history, receives no tools by default, and
|
|
202
|
+
* cannot recursively start another subagent run.
|
|
203
|
+
*/
|
|
204
|
+
run<TOutputSchema extends TSchema | undefined = undefined>(request: SubagentRunRequest<TOutputSchema>): Promise<SubagentRunResult<SubagentRunOutput<TOutputSchema>>>;
|
|
205
|
+
}
|
|
114
206
|
/**
|
|
115
207
|
* Persistence backend for extension schedules, injected by the embedder
|
|
116
208
|
* (mikan backs this with event files watched by its EventsWatcher).
|
|
@@ -137,8 +229,14 @@ export interface ExtensionHostServices {
|
|
|
137
229
|
scheduleStore?: ExtensionScheduleStore;
|
|
138
230
|
/** Post a message to a conversation without an agent run; enables `api.notify`. */
|
|
139
231
|
postMessage?: (conversationId: string, text: string, platform?: string) => Promise<void>;
|
|
232
|
+
/** Add an emoji reaction to a message; enables `api.react`. */
|
|
233
|
+
addReaction?: (conversationId: string, messageTs: string, emoji: string, platform?: string) => Promise<void>;
|
|
234
|
+
/** Upload a host file into a conversation; enables `api.uploadFile`. */
|
|
235
|
+
uploadFile?: (conversationId: string, filePath: string, title?: string, platform?: string) => Promise<void>;
|
|
140
236
|
/** Resolve read-only secrets for an extension slug; enables `api.secrets`. */
|
|
141
237
|
resolveSecrets?: (slug: string) => Record<string, string>;
|
|
238
|
+
/** Run a fresh isolated subagent; enables `api.subagent`. */
|
|
239
|
+
runSubagent?: <TOutputSchema extends TSchema | undefined = undefined>(request: SubagentRunRequest<TOutputSchema>, contributedTools: AgentTool[]) => Promise<SubagentRunResult<SubagentRunOutput<TOutputSchema>>>;
|
|
142
240
|
}
|
|
143
241
|
/**
|
|
144
242
|
* Optional `manifest.json` next to a directory-form extension's entrypoint.
|
|
@@ -157,6 +255,17 @@ export interface MikanExtensionApi {
|
|
|
157
255
|
on<T extends MikanHookName>(hook: T, handler: MikanHookMap[T]): void;
|
|
158
256
|
/** Contribute an additional agent tool. */
|
|
159
257
|
registerTool(tool: AgentTool): void;
|
|
258
|
+
/**
|
|
259
|
+
* Contribute a chat command (`/name`). Dispatched without a model call;
|
|
260
|
+
* built-in commands and earlier registrations of the same name win.
|
|
261
|
+
*/
|
|
262
|
+
registerCommand(command: ExtensionCommand): void;
|
|
263
|
+
/**
|
|
264
|
+
* Register cleanup to run when this harness instance is discarded
|
|
265
|
+
* (`/pi-new`, session eviction, shutdown). Alternative to returning a
|
|
266
|
+
* disposer from `activate`. Disposers run in reverse registration order.
|
|
267
|
+
*/
|
|
268
|
+
onDispose(disposer: ExtensionDisposer): void;
|
|
160
269
|
/** Extension-scoped logging that lands in mikan's structured log. */
|
|
161
270
|
log(message: string): void;
|
|
162
271
|
/** Context about the conversation this harness instance serves. */
|
|
@@ -166,14 +275,28 @@ export interface MikanExtensionApi {
|
|
|
166
275
|
readonly model: Model<Api>;
|
|
167
276
|
readonly thinkingLevel: ThinkingLevel;
|
|
168
277
|
};
|
|
169
|
-
/**
|
|
278
|
+
/**
|
|
279
|
+
* Host-only filesystem locations owned by this extension (never mounted
|
|
280
|
+
* into sandbox containers). Which one you use is a declaration: `dataDir`
|
|
281
|
+
* for conversation-scoped state (the safe default — isolation for free),
|
|
282
|
+
* `sharedDataDir` for deliberately cross-conversation state (you own tenant
|
|
283
|
+
* partitioning and concurrency). See `LAYOUT.md`.
|
|
284
|
+
*/
|
|
170
285
|
readonly paths: {
|
|
171
286
|
/**
|
|
172
|
-
*
|
|
173
|
-
* (
|
|
174
|
-
*
|
|
287
|
+
* This conversation's private data directory
|
|
288
|
+
* (`conversations/<conversationId>/extension-data/<slug>`), created on
|
|
289
|
+
* first access. Default choice: co-located with the conversation, so it
|
|
290
|
+
* disappears when the conversation is deleted.
|
|
175
291
|
*/
|
|
176
292
|
readonly dataDir: string;
|
|
293
|
+
/**
|
|
294
|
+
* Data shared across all conversations this extension serves
|
|
295
|
+
* (`global/extension-data/<slug>`), created on first access. Explicit
|
|
296
|
+
* opt-in for multi-conversation applications (e.g. a PM tool with
|
|
297
|
+
* cross-channel views); key rows by conversation id yourself.
|
|
298
|
+
*/
|
|
299
|
+
readonly sharedDataDir: string;
|
|
177
300
|
};
|
|
178
301
|
/**
|
|
179
302
|
* Read-only secrets from the embedder's vault
|
|
@@ -197,13 +320,37 @@ export interface MikanExtensionApi {
|
|
|
197
320
|
/** Schedules owned by this extension in this conversation. */
|
|
198
321
|
list(): Promise<ExtensionScheduleInfo[]>;
|
|
199
322
|
};
|
|
323
|
+
/** Fresh isolated subagent runs. */
|
|
324
|
+
readonly subagent: SubagentApi;
|
|
325
|
+
/**
|
|
326
|
+
* Post text into a conversation without triggering an agent run. Defaults
|
|
327
|
+
* to this conversation; pass `conversationId` to post elsewhere (pairs
|
|
328
|
+
* with `sharedDataDir` for cross-conversation applications). Available
|
|
329
|
+
* when the embedder provides platform messaging.
|
|
330
|
+
*/
|
|
331
|
+
notify(text: string, options?: {
|
|
332
|
+
conversationId?: string;
|
|
333
|
+
}): Promise<void>;
|
|
334
|
+
/**
|
|
335
|
+
* Add an emoji reaction to a message in this conversation. `messageTs` is
|
|
336
|
+
* the platform message id the extension read from an event (see
|
|
337
|
+
* `RunOrigin.messageTs`); `emoji` is a short name without colons.
|
|
338
|
+
* Available when the embedder provides reaction support.
|
|
339
|
+
*/
|
|
340
|
+
react(messageTs: string, emoji: string): Promise<void>;
|
|
341
|
+
/**
|
|
342
|
+
* Upload a host-side file into this conversation without an agent run.
|
|
343
|
+
* Available when the embedder provides file uploads for the platform.
|
|
344
|
+
*/
|
|
345
|
+
uploadFile(filePath: string, title?: string): Promise<void>;
|
|
200
346
|
/**
|
|
201
|
-
*
|
|
202
|
-
*
|
|
347
|
+
* Fire an autonomous agent run in this conversation as soon as possible.
|
|
348
|
+
* Like a schedule, the run does not inherit conversation history — write
|
|
349
|
+
* `text` self-contained. Backed by the embedder's schedule store.
|
|
203
350
|
*/
|
|
204
|
-
|
|
351
|
+
triggerRun(text: string): Promise<void>;
|
|
205
352
|
}
|
|
206
|
-
export type MikanExtensionActivate = (api: MikanExtensionApi) => void | Promise<void>;
|
|
353
|
+
export type MikanExtensionActivate = (api: MikanExtensionApi) => void | ExtensionDisposer | Promise<void | ExtensionDisposer>;
|
|
207
354
|
export interface MikanExtensionModule {
|
|
208
355
|
name?: string;
|
|
209
356
|
activate: MikanExtensionActivate;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/harness/extensions/types.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/harness/extensions/types.ts"],"names":[],"mappings":"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"}
|