@geminixiang/mikan 1.0.0-beta.2 → 1.0.0-beta.21
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 +388 -0
- package/README.md +49 -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/buffered-responder.d.ts +60 -0
- package/dist/adapters/buffered-responder.d.ts.map +1 -0
- package/dist/adapters/buffered-responder.js +201 -0
- package/dist/adapters/buffered-responder.js.map +1 -0
- 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 +44 -204
- package/dist/adapters/discord/context.js.map +1 -1
- package/dist/adapters/github/bot.d.ts +86 -0
- package/dist/adapters/github/bot.d.ts.map +1 -0
- package/dist/adapters/github/bot.js +640 -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 +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 +103 -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/github-ops.d.ts +90 -0
- package/dist/adapters/github/github-ops.d.ts.map +1 -0
- package/dist/adapters/github/github-ops.js +405 -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 +53 -0
- package/dist/adapters/github/ids.js.map +1 -0
- package/dist/adapters/github/repo.d.ts +32 -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 +24 -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 +22 -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 +22 -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 +19 -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 +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 +82 -134
- 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 +37 -174
- 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 +37 -14
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +359 -229
- 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 +59 -0
- package/dist/cli/arg-grammar.js.map +1 -0
- package/dist/cli/boot.d.ts +16 -0
- package/dist/cli/boot.d.ts.map +1 -0
- package/dist/cli/boot.js +119 -0
- package/dist/cli/boot.js.map +1 -0
- 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 +215 -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 +18 -8
- 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 +35 -3
- 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 +11 -9
- 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 +23 -17
- 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 -3
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +98 -95
- package/dist/config.js.map +1 -1
- package/dist/env-manifest.d.ts +35 -0
- package/dist/env-manifest.d.ts.map +1 -0
- package/dist/env-manifest.js +225 -0
- package/dist/env-manifest.js.map +1 -0
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js +9 -73
- package/dist/events.js.map +1 -1
- package/dist/execution-resolver.d.ts +4 -2
- package/dist/execution-resolver.d.ts.map +1 -1
- package/dist/execution-resolver.js +54 -41
- package/dist/execution-resolver.js.map +1 -1
- package/dist/harness/event-format.d.ts +66 -0
- package/dist/harness/event-format.d.ts.map +1 -0
- package/dist/harness/event-format.js +112 -0
- package/dist/harness/event-format.js.map +1 -0
- package/dist/harness/extensions/loader.d.ts +44 -11
- package/dist/harness/extensions/loader.d.ts.map +1 -1
- package/dist/harness/extensions/loader.js +273 -84
- 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 +165 -22
- 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 +6 -5
- package/dist/harness/index.d.ts.map +1 -1
- package/dist/harness/index.js +3 -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 +37 -2
- package/dist/harness/runner.d.ts.map +1 -1
- package/dist/harness/runner.js +107 -23
- 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 +34 -0
- package/dist/harness/subagent-runner.d.ts.map +1 -0
- package/dist/harness/subagent-runner.js +339 -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 +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/main.js +260 -109
- package/dist/main.js.map +1 -1
- package/dist/observability/instrument.js +6 -4
- package/dist/observability/instrument.js.map +1 -1
- package/dist/observability/sentry.d.ts.map +1 -1
- package/dist/observability/sentry.js +3 -2
- package/dist/observability/sentry.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 +276 -43
- package/dist/runtime/conversation-runtime.js.map +1 -1
- package/dist/runtime/types.d.ts +36 -5
- 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 +10 -0
- 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 +11 -2
- 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 +10 -1
- package/dist/sandbox/firecracker.js.map +1 -1
- package/dist/sandbox/gondolin-bootstrap.d.ts +26 -0
- package/dist/sandbox/gondolin-bootstrap.d.ts.map +1 -0
- package/dist/sandbox/gondolin-bootstrap.js +27 -0
- package/dist/sandbox/gondolin-bootstrap.js.map +1 -0
- package/dist/sandbox/gondolin-contract.d.ts +125 -0
- package/dist/sandbox/gondolin-contract.d.ts.map +1 -0
- package/dist/sandbox/gondolin-contract.js +155 -0
- package/dist/sandbox/gondolin-contract.js.map +1 -0
- 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 +86 -0
- package/dist/sandbox/gondolin-gateway.d.ts.map +1 -0
- package/dist/sandbox/gondolin-gateway.js +407 -0
- package/dist/sandbox/gondolin-gateway.js.map +1 -0
- package/dist/sandbox/gondolin-inventory.d.ts +75 -0
- package/dist/sandbox/gondolin-inventory.d.ts.map +1 -0
- package/dist/sandbox/gondolin-inventory.js +257 -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 +30 -0
- package/dist/sandbox/gondolin-placement.d.ts.map +1 -0
- package/dist/sandbox/gondolin-placement.js +77 -0
- package/dist/sandbox/gondolin-placement.js.map +1 -0
- package/dist/sandbox/gondolin-recovery.d.ts +33 -0
- package/dist/sandbox/gondolin-recovery.d.ts.map +1 -0
- package/dist/sandbox/gondolin-recovery.js +39 -0
- package/dist/sandbox/gondolin-recovery.js.map +1 -0
- package/dist/sandbox/gondolin-remote.d.ts +70 -0
- package/dist/sandbox/gondolin-remote.d.ts.map +1 -0
- package/dist/sandbox/gondolin-remote.js +325 -0
- package/dist/sandbox/gondolin-remote.js.map +1 -0
- package/dist/sandbox/gondolin-worker-client.d.ts +135 -0
- package/dist/sandbox/gondolin-worker-client.d.ts.map +1 -0
- package/dist/sandbox/gondolin-worker-client.js +323 -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 +17 -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 +53 -0
- package/dist/sandbox/gondolin.d.ts.map +1 -0
- package/dist/sandbox/gondolin.js +429 -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 +14 -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 +13 -4
- package/dist/sandbox/index.d.ts.map +1 -1
- package/dist/sandbox/index.js +19 -3
- package/dist/sandbox/index.js.map +1 -1
- package/dist/sandbox/types.d.ts +31 -1
- package/dist/sandbox/types.d.ts.map +1 -1
- package/dist/sandbox/types.js.map +1 -1
- package/dist/sandbox/utils.d.ts +12 -0
- package/dist/sandbox/utils.d.ts.map +1 -1
- package/dist/sandbox/utils.js +38 -0
- package/dist/sandbox/utils.js.map +1 -1
- package/dist/sessions/chat-history-sync.d.ts +32 -0
- package/dist/sessions/chat-history-sync.d.ts.map +1 -0
- package/dist/sessions/{agent-memory-file-manager.js → chat-history-sync.js} +40 -113
- package/dist/sessions/chat-history-sync.js.map +1 -0
- package/dist/sessions/conversation-log.d.ts +13 -0
- package/dist/sessions/conversation-log.d.ts.map +1 -0
- package/dist/sessions/conversation-log.js +47 -0
- package/dist/sessions/conversation-log.js.map +1 -0
- 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/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 +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 +6 -12
- package/dist/sessions/store.js.map +1 -1
- package/dist/sessions/types.d.ts +2 -2
- package/dist/sessions/types.d.ts.map +1 -1
- package/dist/sessions/types.js.map +1 -1
- package/dist/settings-mutation.d.ts +23 -0
- package/dist/settings-mutation.d.ts.map +1 -0
- package/dist/settings-mutation.js +42 -0
- package/dist/settings-mutation.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 +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 +53 -43
- 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/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 +17 -2
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +28 -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 +29 -0
- package/dist/tools/react.js.map +1 -0
- package/dist/tools/read.d.ts.map +1 -1
- package/dist/tools/read.js +7 -26
- 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 +13 -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 +57 -0
- package/dist/tools/subagent-slots.js.map +1 -0
- package/dist/tools/subagent.d.ts +74 -0
- package/dist/tools/subagent.d.ts.map +1 -0
- package/dist/tools/subagent.js +335 -0
- package/dist/tools/subagent.js.map +1 -0
- package/dist/tools/types.d.ts +40 -6
- 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 +144 -31
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/date.d.ts +1 -1
- package/dist/utils/date.js +1 -1
- package/dist/utils/date.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 +22 -0
- package/dist/vault/disabled.js.map +1 -0
- package/dist/vault/index.d.ts +0 -2
- package/dist/vault/index.d.ts.map +1 -1
- package/dist/vault/index.js +1 -32
- package/dist/vault/index.js.map +1 -1
- package/dist/vault/injection.d.ts +20 -0
- package/dist/vault/injection.d.ts.map +1 -0
- package/dist/vault/injection.js +27 -0
- package/dist/vault/injection.js.map +1 -0
- 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/types.d.ts +0 -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 +27 -0
- package/dist/web/admin/portal.d.ts.map +1 -1
- package/dist/web/admin/portal.js +117 -154
- package/dist/web/admin/portal.js.map +1 -1
- package/dist/web/admin/types.d.ts +6 -0
- package/dist/web/admin/types.d.ts.map +1 -1
- package/dist/web/admin/types.js.map +1 -1
- package/dist/web/agent-events/portal.d.ts.map +1 -1
- package/dist/web/agent-events/portal.js +2 -1
- package/dist/web/agent-events/portal.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/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/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/{download.d.ts → cli/download.d.ts} +0 -0
- /package/dist/{download.js → cli/download.js} +0 -0
package/dist/agent.js
CHANGED
|
@@ -1,24 +1,40 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Agent runner: prompt construction, path translation, run lifecycle, and createRunner.
|
|
3
|
+
* Single module — do not split helpers that only this file uses.
|
|
4
|
+
*/
|
|
5
|
+
import { DEFAULT_EVENT_BUDGET, defaultExtensionDirs, formatSkillsForPrompt, loadExtensions, loadSkillsFromDir, MikanAgentSession, MikanModels, parseCommandInput, } from "./harness/index.js";
|
|
6
|
+
import { runSubagent } from "./harness/subagent-runner.js";
|
|
2
7
|
import { createHash } from "crypto";
|
|
3
8
|
import { existsSync, readFileSync } from "fs";
|
|
4
|
-
import { mkdir, readFile
|
|
9
|
+
import { mkdir, readFile } from "fs/promises";
|
|
5
10
|
import { join, posix } from "path";
|
|
6
11
|
import { resolveConversationSettings } from "./config.js";
|
|
7
|
-
import {
|
|
12
|
+
import { effectiveStateDir } from "./cli/arg-grammar.js";
|
|
8
13
|
import { ActorExecutionResolver } from "./execution-resolver.js";
|
|
9
14
|
import * as log from "./log.js";
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
+
import { createExecutor, getUnresolvedSandboxPathContext, } from "./sandbox/index.js";
|
|
16
|
+
import { addLifecycleBreadcrumb, metricAttributes, reportUserFacingError, updateActiveSpanAttribution, } from "./observability/sentry.js";
|
|
17
|
+
import { ChatHistorySync } from "./sessions/chat-history-sync.js";
|
|
18
|
+
import { formatHistoryLine } from "./sessions/history-line.js";
|
|
19
|
+
import { conversationIdOf, isThreadSessionKey } from "./sessions/session-key.js";
|
|
15
20
|
import { extractSessionUuid, openManagedSession, } from "./sessions/store.js";
|
|
16
21
|
import { HostEventStore } from "./tools/event.js";
|
|
17
|
-
import { createMikanTools } from "./tools/index.js";
|
|
22
|
+
import { createMikanTools, createSubagentTool, DEFAULT_GLOBAL_SUBAGENT_SLOTS, SubagentSlotPool, } from "./tools/index.js";
|
|
23
|
+
// One process-wide fan-out account: per-conversation queues serialize runs,
|
|
24
|
+
// but each run can fan out up to the per-run cap — without this shared
|
|
25
|
+
// ceiling, N busy conversations hold N × cap live subagent sessions.
|
|
26
|
+
const globalSubagentSlots = new SubagentSlotPool(DEFAULT_GLOBAL_SUBAGENT_SLOTS);
|
|
18
27
|
import * as Sentry from "@sentry/node";
|
|
19
|
-
import { formatLocalTimestamp } from "./utils/date.js";
|
|
20
|
-
import { resolveConfiguredModel } from "./model-registry.js";
|
|
21
28
|
import { emitAgentEvent } from "./agent-events.js";
|
|
29
|
+
export function translateRuntimePathToHost(runtimePath, pathContext) {
|
|
30
|
+
return pathContext.runtimeToHostPath?.(runtimePath) ?? runtimePath;
|
|
31
|
+
}
|
|
32
|
+
export function translateAttachPathToHost(filePath, pathContext) {
|
|
33
|
+
const runtimePath = posix.isAbsolute(filePath)
|
|
34
|
+
? filePath
|
|
35
|
+
: posix.join(pathContext.runtimeWorkspaceRoot, filePath);
|
|
36
|
+
return translateRuntimePathToHost(runtimePath, pathContext);
|
|
37
|
+
}
|
|
22
38
|
const IMAGE_MIME_TYPES = {
|
|
23
39
|
jpg: "image/jpeg",
|
|
24
40
|
jpeg: "image/jpeg",
|
|
@@ -29,12 +45,46 @@ const IMAGE_MIME_TYPES = {
|
|
|
29
45
|
function getImageMimeType(filename) {
|
|
30
46
|
return IMAGE_MIME_TYPES[filename.toLowerCase().split(".").pop() || ""];
|
|
31
47
|
}
|
|
32
|
-
function
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
48
|
+
function formatTimestampedUserMessage(message) {
|
|
49
|
+
return formatHistoryLine({
|
|
50
|
+
date: new Date(),
|
|
51
|
+
userName: message.userName,
|
|
52
|
+
threadTs: message.threadTs,
|
|
53
|
+
text: message.text,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
function collectMessageAttachments(message, workspacePath, pathContext) {
|
|
57
|
+
const imageAttachments = [];
|
|
58
|
+
const nonImagePaths = [];
|
|
59
|
+
for (const attachment of message.attachments || []) {
|
|
60
|
+
const runtimePath = `${workspacePath}/${attachment.localPath}`;
|
|
61
|
+
const hostPath = pathContext?.runtimeToHostPath?.(runtimePath) ?? runtimePath;
|
|
62
|
+
const mimeType = getImageMimeType(attachment.localPath);
|
|
63
|
+
if (mimeType && existsSync(hostPath)) {
|
|
64
|
+
try {
|
|
65
|
+
imageAttachments.push({
|
|
66
|
+
type: "image",
|
|
67
|
+
mimeType,
|
|
68
|
+
data: readFileSync(hostPath).toString("base64"),
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
nonImagePaths.push(runtimePath);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
nonImagePaths.push(runtimePath);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return { imageAttachments, nonImagePaths };
|
|
80
|
+
}
|
|
81
|
+
export function buildPromptPayload(message, workspacePath, pathContext) {
|
|
82
|
+
let userMessage = formatTimestampedUserMessage(message);
|
|
83
|
+
const { imageAttachments, nonImagePaths } = collectMessageAttachments(message, workspacePath, pathContext);
|
|
84
|
+
if (nonImagePaths.length > 0) {
|
|
85
|
+
userMessage += `\n\n<slack_attachments>\n${nonImagePaths.join("\n")}\n</slack_attachments>`;
|
|
86
|
+
}
|
|
87
|
+
return { userMessage, imageAttachments };
|
|
38
88
|
}
|
|
39
89
|
async function getMemory(conversationDir) {
|
|
40
90
|
const parts = [];
|
|
@@ -329,81 +379,21 @@ Do not add this to \`[SILENT]\` responses.`);
|
|
|
329
379
|
}
|
|
330
380
|
return parts.join("\n\n");
|
|
331
381
|
}
|
|
332
|
-
export function
|
|
333
|
-
if (
|
|
334
|
-
return
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
const
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
: createExecutor(sandboxConfig);
|
|
347
|
-
const executor = {
|
|
348
|
-
exec(command, options) {
|
|
349
|
-
return activeExecutor.exec(command, options);
|
|
350
|
-
},
|
|
351
|
-
getWorkspacePath(hostPath) {
|
|
352
|
-
return activeExecutor.getWorkspacePath(hostPath);
|
|
353
|
-
},
|
|
354
|
-
getSandboxConfig() {
|
|
355
|
-
return activeExecutor.getSandboxConfig();
|
|
356
|
-
},
|
|
357
|
-
getPathContext(hostWorkspaceRoot) {
|
|
358
|
-
return activeExecutor.getPathContext(hostWorkspaceRoot);
|
|
359
|
-
},
|
|
360
|
-
};
|
|
361
|
-
return {
|
|
362
|
-
executionResolver,
|
|
363
|
-
executor,
|
|
364
|
-
getPathContext: () => executor.getPathContext(hostWorkspacePath),
|
|
365
|
-
async resolveExecutorForRun(context) {
|
|
366
|
-
if (!executionResolver)
|
|
367
|
-
return;
|
|
368
|
-
activeExecutor = await executionResolver.resolve(context);
|
|
369
|
-
},
|
|
370
|
-
};
|
|
371
|
-
}
|
|
372
|
-
/**
|
|
373
|
-
* Extension host services over mikan's runtime infrastructure: schedules
|
|
374
|
-
* become event files under `<workspaceDir>/events` (picked up live by
|
|
375
|
-
* EventsWatcher), secrets come from `vaults/extensions/<slug>/env`, and
|
|
376
|
-
* notify posts through the platform bots when main.ts provides a notifier.
|
|
377
|
-
*/
|
|
378
|
-
function buildExtensionHostServices(params) {
|
|
379
|
-
const { workspaceDir, vaultManager, platformNotifier } = params;
|
|
380
|
-
const eventStore = HostEventStore.fromWorkspaceDir(workspaceDir);
|
|
381
|
-
return {
|
|
382
|
-
stateDir: readEnv("STATE_DIR"),
|
|
383
|
-
scheduleStore: {
|
|
384
|
-
write: async (filename, payload) => {
|
|
385
|
-
// Event files tolerate a missing platform (single-platform default),
|
|
386
|
-
// so the harness payload is a valid event payload as written.
|
|
387
|
-
await eventStore.write(filename, payload);
|
|
388
|
-
},
|
|
389
|
-
delete: async (filename) => (await eventStore.delete(filename)).deleted,
|
|
390
|
-
list: async () => (await eventStore.list()).map((entry) => ({
|
|
391
|
-
filename: entry.filename,
|
|
392
|
-
payload: entry.payload,
|
|
393
|
-
})),
|
|
394
|
-
},
|
|
395
|
-
...(platformNotifier ? { postMessage: platformNotifier } : {}),
|
|
396
|
-
...(vaultManager
|
|
397
|
-
? {
|
|
398
|
-
resolveSecrets: (slug) => vaultManager.resolve(`extensions/${slug}`)?.env ?? {},
|
|
399
|
-
}
|
|
400
|
-
: {}),
|
|
401
|
-
};
|
|
382
|
+
export function appendTriggerAttribution(text, triggerAttribution, sessionLink) {
|
|
383
|
+
if (!triggerAttribution)
|
|
384
|
+
return text;
|
|
385
|
+
const trimmed = text.trimEnd();
|
|
386
|
+
const legacySuffix = `_Triggered by ${triggerAttribution}_`;
|
|
387
|
+
// Slack mrkdwn italics cannot span a URL — a `_..._` wrapping a link renders
|
|
388
|
+
// the underscores literally. Keep the session link outside the italic span.
|
|
389
|
+
const suffix = sessionLink ? `${legacySuffix} · session: ${sessionLink}` : legacySuffix;
|
|
390
|
+
if (trimmed.endsWith(suffix))
|
|
391
|
+
return text;
|
|
392
|
+
const body = trimmed.endsWith(legacySuffix)
|
|
393
|
+
? trimmed.slice(0, -legacySuffix.length).trimEnd()
|
|
394
|
+
: trimmed;
|
|
395
|
+
return `${body}\n\n${suffix}`;
|
|
402
396
|
}
|
|
403
|
-
/**
|
|
404
|
-
* Local (workspace/conversation) skills override extension skills on name
|
|
405
|
-
* collision: an admin's on-disk skill always beats an extension's.
|
|
406
|
-
*/
|
|
407
397
|
function mergeExtensionSkills(local, extension) {
|
|
408
398
|
if (extension.length === 0)
|
|
409
399
|
return local;
|
|
@@ -414,37 +404,6 @@ function mergeExtensionSkills(local, extension) {
|
|
|
414
404
|
byName.set(skill.name, skill);
|
|
415
405
|
return [...byName.values()];
|
|
416
406
|
}
|
|
417
|
-
async function createConfiguredAgentSession(params) {
|
|
418
|
-
const { conversationId, workspaceDir, systemPrompt, model, thinkingLevel, tools, sessionStore, models, vaultManager, platformNotifier, } = params;
|
|
419
|
-
// Host-only dirs under the state dir: extension code runs in the mikan
|
|
420
|
-
// process, so it must never load from workspace paths — those are mounted
|
|
421
|
-
// into sandbox containers and agent-writable (sandbox escape otherwise).
|
|
422
|
-
const extensionsResult = await loadExtensions({
|
|
423
|
-
dirs: defaultExtensionDirs(conversationId, readEnv("STATE_DIR")),
|
|
424
|
-
context: { conversationId, workspaceDir, model, thinkingLevel },
|
|
425
|
-
services: buildExtensionHostServices({ workspaceDir, vaultManager, platformNotifier }),
|
|
426
|
-
});
|
|
427
|
-
for (const err of extensionsResult.errors) {
|
|
428
|
-
log.logWarning(`[${conversationId}] Extension load error: ${err.path}`, err.error);
|
|
429
|
-
}
|
|
430
|
-
if (extensionsResult.extensions.length > 0) {
|
|
431
|
-
log.logInfo(`[${conversationId}] Loaded ${extensionsResult.extensions.length} extension(s): ${extensionsResult.extensions.map((extension) => extension.name).join(", ")}`);
|
|
432
|
-
}
|
|
433
|
-
const session = new MikanAgentSession({
|
|
434
|
-
systemPrompt,
|
|
435
|
-
model,
|
|
436
|
-
thinkingLevel,
|
|
437
|
-
tools,
|
|
438
|
-
models,
|
|
439
|
-
sessionStore,
|
|
440
|
-
extensions: extensionsResult.registry,
|
|
441
|
-
});
|
|
442
|
-
const reloaded = session.reloadFromSession();
|
|
443
|
-
if (reloaded > 0) {
|
|
444
|
-
log.logInfo(`[${conversationId}] Reloaded ${reloaded} messages from session context`);
|
|
445
|
-
}
|
|
446
|
-
return { session, extensionSkills: extensionsResult.skills };
|
|
447
|
-
}
|
|
448
407
|
function createEmptyUsageTotals() {
|
|
449
408
|
return {
|
|
450
409
|
input: 0,
|
|
@@ -461,6 +420,7 @@ function createRunState() {
|
|
|
461
420
|
queue: null,
|
|
462
421
|
pendingTools: new Map(),
|
|
463
422
|
toolProgress: new Map(),
|
|
423
|
+
toolProgressTimer: undefined,
|
|
464
424
|
totalUsage: createEmptyUsageTotals(),
|
|
465
425
|
llmCallCount: 0,
|
|
466
426
|
stopReason: "stop",
|
|
@@ -480,6 +440,9 @@ function resetRunState(runState, responder, sessionConversation, userName, sessi
|
|
|
480
440
|
};
|
|
481
441
|
runState.pendingTools.clear();
|
|
482
442
|
runState.toolProgress.clear();
|
|
443
|
+
if (runState.toolProgressTimer)
|
|
444
|
+
clearTimeout(runState.toolProgressTimer);
|
|
445
|
+
runState.toolProgressTimer = undefined;
|
|
483
446
|
runState.totalUsage = createEmptyUsageTotals();
|
|
484
447
|
runState.llmCallCount = 0;
|
|
485
448
|
runState.stopReason = "stop";
|
|
@@ -515,53 +478,6 @@ function createRunQueue(responder, runState) {
|
|
|
515
478
|
wait: () => queueChain,
|
|
516
479
|
};
|
|
517
480
|
}
|
|
518
|
-
function formatTimestampedUserMessage(message) {
|
|
519
|
-
const timestamp = formatLocalTimestamp(new Date());
|
|
520
|
-
const threadContext = message.threadTs ? ` [in-thread:${message.threadTs}]` : "";
|
|
521
|
-
return `[${timestamp}] [${message.userName || "unknown"}]${threadContext}: ${message.text}`;
|
|
522
|
-
}
|
|
523
|
-
function collectMessageAttachments(message, workspacePath, pathContext) {
|
|
524
|
-
const imageAttachments = [];
|
|
525
|
-
const nonImagePaths = [];
|
|
526
|
-
for (const attachment of message.attachments || []) {
|
|
527
|
-
const runtimePath = `${workspacePath}/${attachment.localPath}`;
|
|
528
|
-
const hostPath = pathContext?.runtimeToHostPath?.(runtimePath) ?? runtimePath;
|
|
529
|
-
const mimeType = getImageMimeType(attachment.localPath);
|
|
530
|
-
if (mimeType && existsSync(hostPath)) {
|
|
531
|
-
try {
|
|
532
|
-
imageAttachments.push({
|
|
533
|
-
type: "image",
|
|
534
|
-
mimeType,
|
|
535
|
-
data: readFileSync(hostPath).toString("base64"),
|
|
536
|
-
});
|
|
537
|
-
}
|
|
538
|
-
catch {
|
|
539
|
-
nonImagePaths.push(runtimePath);
|
|
540
|
-
}
|
|
541
|
-
}
|
|
542
|
-
else {
|
|
543
|
-
nonImagePaths.push(runtimePath);
|
|
544
|
-
}
|
|
545
|
-
}
|
|
546
|
-
return { imageAttachments, nonImagePaths };
|
|
547
|
-
}
|
|
548
|
-
export function buildPromptPayload(message, workspacePath, pathContext) {
|
|
549
|
-
let userMessage = formatTimestampedUserMessage(message);
|
|
550
|
-
const { imageAttachments, nonImagePaths } = collectMessageAttachments(message, workspacePath, pathContext);
|
|
551
|
-
if (nonImagePaths.length > 0) {
|
|
552
|
-
userMessage += `\n\n<slack_attachments>\n${nonImagePaths.join("\n")}\n</slack_attachments>`;
|
|
553
|
-
}
|
|
554
|
-
return { userMessage, imageAttachments };
|
|
555
|
-
}
|
|
556
|
-
async function writePromptDebugContext(conversationDir, systemPrompt, session, userMessage, imageAttachmentCount) {
|
|
557
|
-
const debugContext = {
|
|
558
|
-
systemPrompt,
|
|
559
|
-
messages: session.messages,
|
|
560
|
-
newUserMessage: userMessage,
|
|
561
|
-
imageAttachmentCount,
|
|
562
|
-
};
|
|
563
|
-
await writeFile(join(conversationDir, "last_prompt.jsonl"), JSON.stringify(debugContext, null, 2));
|
|
564
|
-
}
|
|
565
481
|
function getFinalAssistantText(session) {
|
|
566
482
|
const lastAssistant = session.messages.findLast((message) => message.role === "assistant");
|
|
567
483
|
return (lastAssistant?.content
|
|
@@ -569,21 +485,6 @@ function getFinalAssistantText(session) {
|
|
|
569
485
|
.map((content) => content.text)
|
|
570
486
|
.join("\n") || "");
|
|
571
487
|
}
|
|
572
|
-
export function appendTriggerAttribution(text, triggerAttribution, sessionLink) {
|
|
573
|
-
if (!triggerAttribution)
|
|
574
|
-
return text;
|
|
575
|
-
const trimmed = text.trimEnd();
|
|
576
|
-
const legacySuffix = `_Triggered by ${triggerAttribution}_`;
|
|
577
|
-
const suffix = sessionLink
|
|
578
|
-
? `_Triggered by ${triggerAttribution} · session: ${sessionLink}_`
|
|
579
|
-
: legacySuffix;
|
|
580
|
-
if (trimmed.endsWith(suffix))
|
|
581
|
-
return text;
|
|
582
|
-
const body = trimmed.endsWith(legacySuffix)
|
|
583
|
-
? trimmed.slice(0, -legacySuffix.length).trimEnd()
|
|
584
|
-
: trimmed;
|
|
585
|
-
return `${body}\n\n${suffix}`;
|
|
586
|
-
}
|
|
587
488
|
function isEventTriggerAttribution(triggerAttribution) {
|
|
588
489
|
return triggerAttribution?.startsWith("[event:") === true;
|
|
589
490
|
}
|
|
@@ -609,6 +510,31 @@ async function replaceResponseWithToolProgress(responder, runState) {
|
|
|
609
510
|
if (progress)
|
|
610
511
|
await responder.replaceResponse(progress);
|
|
611
512
|
}
|
|
513
|
+
const TOOL_PROGRESS_DEBOUNCE_MS = 500;
|
|
514
|
+
function scheduleToolProgressUpdate(responder, runState) {
|
|
515
|
+
if (runState.toolProgressTimer)
|
|
516
|
+
return;
|
|
517
|
+
runState.toolProgressTimer = setTimeout(() => {
|
|
518
|
+
runState.toolProgressTimer = undefined;
|
|
519
|
+
runState.queue?.enqueue(() => replaceResponseWithToolProgress(responder, runState), "tool progress update");
|
|
520
|
+
}, TOOL_PROGRESS_DEBOUNCE_MS);
|
|
521
|
+
runState.toolProgressTimer.unref();
|
|
522
|
+
}
|
|
523
|
+
function flushToolProgressUpdate(responder, runState) {
|
|
524
|
+
if (runState.toolProgressTimer)
|
|
525
|
+
clearTimeout(runState.toolProgressTimer);
|
|
526
|
+
runState.toolProgressTimer = undefined;
|
|
527
|
+
runState.queue?.enqueue(() => replaceResponseWithToolProgress(responder, runState), "tool progress update");
|
|
528
|
+
}
|
|
529
|
+
function extractToolProgressLabel(partialResult) {
|
|
530
|
+
if (!partialResult || typeof partialResult !== "object")
|
|
531
|
+
return undefined;
|
|
532
|
+
const details = partialResult.details;
|
|
533
|
+
if (!details || typeof details !== "object")
|
|
534
|
+
return undefined;
|
|
535
|
+
const label = details.progressLabel;
|
|
536
|
+
return typeof label === "string" && label.trim() ? label.trim().slice(0, 1000) : undefined;
|
|
537
|
+
}
|
|
612
538
|
async function finalizeRunResponse(responder, session, runState, options) {
|
|
613
539
|
if (runState.stopReason === "error" && runState.errorMessage) {
|
|
614
540
|
if (!runState.reportedLlmError) {
|
|
@@ -739,6 +665,169 @@ async function reportUsageSummary(ctx) {
|
|
|
739
665
|
await waitForQueue();
|
|
740
666
|
}
|
|
741
667
|
}
|
|
668
|
+
function extractToolResultText(result) {
|
|
669
|
+
if (typeof result === "string") {
|
|
670
|
+
return result;
|
|
671
|
+
}
|
|
672
|
+
if (result &&
|
|
673
|
+
typeof result === "object" &&
|
|
674
|
+
"content" in result &&
|
|
675
|
+
Array.isArray(result.content)) {
|
|
676
|
+
const content = result.content;
|
|
677
|
+
const textParts = [];
|
|
678
|
+
for (const part of content) {
|
|
679
|
+
if (part.type === "text" && part.text) {
|
|
680
|
+
textParts.push(part.text);
|
|
681
|
+
}
|
|
682
|
+
}
|
|
683
|
+
if (textParts.length > 0) {
|
|
684
|
+
return textParts.join("\n");
|
|
685
|
+
}
|
|
686
|
+
}
|
|
687
|
+
return JSON.stringify(result);
|
|
688
|
+
}
|
|
689
|
+
function buildThreadSessionName(message) {
|
|
690
|
+
const text = message?.text?.trim();
|
|
691
|
+
if (!text)
|
|
692
|
+
return undefined;
|
|
693
|
+
const userLabel = message?.userName || message?.user || "unknown";
|
|
694
|
+
return `[${userLabel}]: ${text}`;
|
|
695
|
+
}
|
|
696
|
+
function createRunnerExecutionContext(sandboxConfig, vaultManager, provisioner, workspaceDir, hostWorkspacePath) {
|
|
697
|
+
const executionResolver = vaultManager && sandboxConfig.type !== "host"
|
|
698
|
+
? new ActorExecutionResolver(sandboxConfig, vaultManager, provisioner, workspaceDir, hostWorkspacePath)
|
|
699
|
+
: undefined;
|
|
700
|
+
// activeExecutor is replaced at the start of each run() call when executionResolver
|
|
701
|
+
// is present, so the stable `executor` wrapper always delegates to the latest resolved value.
|
|
702
|
+
let activeExecutor = executionResolver !== undefined
|
|
703
|
+
? createExecutor({ type: "host" })
|
|
704
|
+
: createExecutor(sandboxConfig);
|
|
705
|
+
const executor = {
|
|
706
|
+
exec(command, options) {
|
|
707
|
+
return activeExecutor.exec(command, options);
|
|
708
|
+
},
|
|
709
|
+
readFile(path, options) {
|
|
710
|
+
return activeExecutor.readFile(path, options);
|
|
711
|
+
},
|
|
712
|
+
readFileBase64(path, options) {
|
|
713
|
+
return activeExecutor.readFileBase64(path, options);
|
|
714
|
+
},
|
|
715
|
+
writeFile(path, content, options) {
|
|
716
|
+
return activeExecutor.writeFile(path, content, options);
|
|
717
|
+
},
|
|
718
|
+
getWorkspacePath(hostPath) {
|
|
719
|
+
return activeExecutor.getWorkspacePath(hostPath);
|
|
720
|
+
},
|
|
721
|
+
getSandboxConfig() {
|
|
722
|
+
return activeExecutor.getSandboxConfig();
|
|
723
|
+
},
|
|
724
|
+
getPathContext(hostWorkspaceRoot) {
|
|
725
|
+
return activeExecutor.getPathContext(hostWorkspaceRoot);
|
|
726
|
+
},
|
|
727
|
+
};
|
|
728
|
+
return {
|
|
729
|
+
executionResolver,
|
|
730
|
+
executor,
|
|
731
|
+
getPathContext: () => executor.getPathContext(hostWorkspacePath),
|
|
732
|
+
async resolveExecutorForRun(context) {
|
|
733
|
+
if (!executionResolver)
|
|
734
|
+
return;
|
|
735
|
+
activeExecutor = await executionResolver.resolve(context);
|
|
736
|
+
},
|
|
737
|
+
};
|
|
738
|
+
}
|
|
739
|
+
/**
|
|
740
|
+
* Extension host services over mikan's runtime infrastructure: schedules
|
|
741
|
+
* become event files under `<workspaceDir>/events` (picked up live by
|
|
742
|
+
* EventsWatcher), secrets come from `vaults/extensions/<slug>/env`, and
|
|
743
|
+
* notify posts through the platform bots when main.ts provides a notifier.
|
|
744
|
+
*/
|
|
745
|
+
function buildExtensionHostServices(params) {
|
|
746
|
+
const { workspaceDir, vaultManager, platformNotifier, platformReactor, platformUploader, runSubagentService, } = params;
|
|
747
|
+
const eventStore = HostEventStore.fromWorkspaceDir(workspaceDir);
|
|
748
|
+
return {
|
|
749
|
+
stateDir: effectiveStateDir(),
|
|
750
|
+
scheduleStore: {
|
|
751
|
+
write: async (filename, payload) => {
|
|
752
|
+
await eventStore.write(filename, payload);
|
|
753
|
+
},
|
|
754
|
+
delete: async (filename) => (await eventStore.delete(filename)).deleted,
|
|
755
|
+
list: async () => (await eventStore.list()).flatMap((entry) => entry.payload ? [{ filename: entry.filename, payload: entry.payload }] : []),
|
|
756
|
+
},
|
|
757
|
+
...(platformNotifier ? { postMessage: platformNotifier } : {}),
|
|
758
|
+
...(platformReactor ? { addReaction: platformReactor } : {}),
|
|
759
|
+
...(platformUploader ? { uploadFile: platformUploader } : {}),
|
|
760
|
+
...(runSubagentService ? { runSubagent: runSubagentService } : {}),
|
|
761
|
+
...(vaultManager
|
|
762
|
+
? {
|
|
763
|
+
resolveSecrets: (slug) => vaultManager.resolve(`extensions/${slug}`)?.env ?? {},
|
|
764
|
+
}
|
|
765
|
+
: {}),
|
|
766
|
+
};
|
|
767
|
+
}
|
|
768
|
+
async function createConfiguredAgentSession(params) {
|
|
769
|
+
const { conversationId, workspaceDir, systemPrompt, model, thinkingLevel, tools, sessionStore, models, vaultManager, platformNotifier, platformReactor, platformUploader, } = params;
|
|
770
|
+
// Host-only dirs under the state dir: extension code runs in the mikan
|
|
771
|
+
// process, so it must never load from workspace paths — those are mounted
|
|
772
|
+
// into sandbox containers and agent-writable (sandbox escape otherwise).
|
|
773
|
+
const extensionsResult = await loadExtensions({
|
|
774
|
+
dirs: defaultExtensionDirs(conversationId, effectiveStateDir()),
|
|
775
|
+
context: { conversationId, workspaceDir, model, thinkingLevel },
|
|
776
|
+
services: buildExtensionHostServices({
|
|
777
|
+
workspaceDir,
|
|
778
|
+
vaultManager,
|
|
779
|
+
platformNotifier,
|
|
780
|
+
platformReactor,
|
|
781
|
+
platformUploader,
|
|
782
|
+
runSubagentService: (request, extensionTools) => runSubagent({
|
|
783
|
+
request,
|
|
784
|
+
defaultModel: model,
|
|
785
|
+
thinkingLevel,
|
|
786
|
+
models,
|
|
787
|
+
workspaceDir,
|
|
788
|
+
availableTools: [...tools, ...extensionTools],
|
|
789
|
+
}),
|
|
790
|
+
}),
|
|
791
|
+
});
|
|
792
|
+
const contributedTools = extensionsResult.registry.getContributedTools();
|
|
793
|
+
for (const err of extensionsResult.errors) {
|
|
794
|
+
log.logWarning(`[${conversationId}] Extension load error: ${err.path}`, err.error);
|
|
795
|
+
}
|
|
796
|
+
if (extensionsResult.extensions.length > 0) {
|
|
797
|
+
log.logInfo(`[${conversationId}] Loaded ${extensionsResult.extensions.length} extension(s): ${extensionsResult.extensions.map((extension) => extension.name).join(", ")}`);
|
|
798
|
+
}
|
|
799
|
+
const subagentTool = createSubagentTool((request) => runSubagent({
|
|
800
|
+
request,
|
|
801
|
+
defaultModel: model,
|
|
802
|
+
thinkingLevel,
|
|
803
|
+
models,
|
|
804
|
+
workspaceDir,
|
|
805
|
+
availableTools: [...tools, ...contributedTools],
|
|
806
|
+
// `session` is the const below: the tool only executes inside that
|
|
807
|
+
// session's own prompt loop, and the temporal dead zone turns any
|
|
808
|
+
// earlier call into a loud error instead of a silently dropped fold.
|
|
809
|
+
onUsage: (usage) => session.foldExternalUsage(usage),
|
|
810
|
+
}), globalSubagentSlots);
|
|
811
|
+
const session = new MikanAgentSession({
|
|
812
|
+
systemPrompt,
|
|
813
|
+
model,
|
|
814
|
+
thinkingLevel,
|
|
815
|
+
tools: [...tools, subagentTool],
|
|
816
|
+
models,
|
|
817
|
+
sessionStore,
|
|
818
|
+
extensions: extensionsResult.registry,
|
|
819
|
+
});
|
|
820
|
+
const reloaded = session.reloadFromSession();
|
|
821
|
+
if (reloaded > 0) {
|
|
822
|
+
log.logInfo(`[${conversationId}] Reloaded ${reloaded} messages from session context`);
|
|
823
|
+
}
|
|
824
|
+
return {
|
|
825
|
+
session,
|
|
826
|
+
extensionSkills: extensionsResult.skills,
|
|
827
|
+
extensionRegistry: extensionsResult.registry,
|
|
828
|
+
disposeExtensions: extensionsResult.dispose,
|
|
829
|
+
};
|
|
830
|
+
}
|
|
742
831
|
function reloadSessionMessages(session, conversationId) {
|
|
743
832
|
const reloaded = session.reloadFromSession();
|
|
744
833
|
if (reloaded > 0) {
|
|
@@ -746,15 +835,16 @@ function reloadSessionMessages(session, conversationId) {
|
|
|
746
835
|
}
|
|
747
836
|
}
|
|
748
837
|
async function prepareRunContext(params) {
|
|
749
|
-
const { message, responder, platform, conversationId, conversationDir, sessionUuid, runState, executor, executionResolver, resolveExecutorForRun, getPathContext, session, setEventContext, setSandboxContext, setUploadFunction, } = params;
|
|
838
|
+
const { message, responder, platform, conversationId, conversationDir, sessionUuid, runState, executor, executionResolver, resolveExecutorForRun, getPathContext, session, setEventContext, setSandboxContext, setUploadFunction, setReactFunction, bindPlatformToolPacks, } = params;
|
|
750
839
|
let pathContext = params.pathContext;
|
|
751
|
-
const sessionConversation = message.sessionKey
|
|
840
|
+
const sessionConversation = conversationIdOf(message.sessionKey);
|
|
752
841
|
await mkdir(join(conversationDir, "scratch"), { recursive: true });
|
|
753
842
|
if (executionResolver) {
|
|
754
843
|
await resolveExecutorForRun({
|
|
755
844
|
platform: platform.name,
|
|
756
845
|
userId: message.userId,
|
|
757
846
|
conversationId,
|
|
847
|
+
trustModel: platform.trustModel,
|
|
758
848
|
});
|
|
759
849
|
pathContext = getPathContext();
|
|
760
850
|
}
|
|
@@ -768,9 +858,11 @@ async function prepareRunContext(params) {
|
|
|
768
858
|
// provider prompt caching. If this hash changes between turns of one
|
|
769
859
|
// conversation, something turn-varying leaked into the prompt; if it is
|
|
770
860
|
// stable and cacheRead stays 0, the miss is provider-side (e.g. OpenRouter
|
|
771
|
-
// routing the model across upstream hosts).
|
|
861
|
+
// routing the model across upstream hosts). This is the base prompt mikan
|
|
862
|
+
// builds; a `before_agent_start` extension may still rewrite it per turn
|
|
863
|
+
// (logged separately by the runner).
|
|
772
864
|
const promptHash = createHash("sha256").update(systemPrompt).digest("hex").slice(0, 8);
|
|
773
|
-
log.logInfo(`[${conversationId}] System prompt: ${systemPrompt.length} chars, sha ${promptHash}`);
|
|
865
|
+
log.logInfo(`[${conversationId}] System prompt (base): ${systemPrompt.length} chars, sha ${promptHash}`);
|
|
774
866
|
setEventContext({
|
|
775
867
|
platform: platform.name,
|
|
776
868
|
conversationId,
|
|
@@ -782,6 +874,13 @@ async function prepareRunContext(params) {
|
|
|
782
874
|
const hostPath = translateAttachPathToHost(filePath, pathContext);
|
|
783
875
|
await responder.uploadFile(hostPath, title);
|
|
784
876
|
});
|
|
877
|
+
// The react tool is available only when the responder supports reactions
|
|
878
|
+
// (interactive turns on platforms with reaction support); otherwise unset
|
|
879
|
+
// so the tool reports it is unavailable rather than silently no-op'ing.
|
|
880
|
+
setReactFunction(responder.react ? async (emoji) => responder.react(emoji) : null);
|
|
881
|
+
// Platform capability packs (e.g. GitHub PR/CI) enable themselves per run;
|
|
882
|
+
// core does not branch on platform name here.
|
|
883
|
+
bindPlatformToolPacks({ conversationId, platformName: platform.name });
|
|
785
884
|
resetRunState(runState, responder, sessionConversation, message.userName, sessionUuid, triggerAttribution);
|
|
786
885
|
const runQueue = createRunQueue(responder, runState);
|
|
787
886
|
runState.queue = runQueue.queue;
|
|
@@ -790,7 +889,6 @@ async function prepareRunContext(params) {
|
|
|
790
889
|
const { userMessage, imageAttachments } = buildPromptPayload(message, pathContext.runtimeWorkspaceRoot, pathContext);
|
|
791
890
|
const turnInstructions = buildTurnInstructions(message.id.startsWith("event:"), triggerAttribution, platform.name);
|
|
792
891
|
const finalUserMessage = turnInstructions ? `${turnInstructions}\n\n${userMessage}` : userMessage;
|
|
793
|
-
await writePromptDebugContext(conversationDir, systemPrompt, session, finalUserMessage, imageAttachments.length);
|
|
794
892
|
return {
|
|
795
893
|
sessionConversation,
|
|
796
894
|
runQueue,
|
|
@@ -845,6 +943,15 @@ function attachSessionEventHandlers(params) {
|
|
|
845
943
|
log.logToolStart(logCtx, event.toolName, label, event.args);
|
|
846
944
|
return;
|
|
847
945
|
}
|
|
946
|
+
if (event.type === "tool_execution_update") {
|
|
947
|
+
const label = extractToolProgressLabel(event.partialResult);
|
|
948
|
+
const progress = runState.toolProgress.get(event.toolCallId);
|
|
949
|
+
if (label && progress) {
|
|
950
|
+
progress.label = label;
|
|
951
|
+
scheduleToolProgressUpdate(responder, runState);
|
|
952
|
+
}
|
|
953
|
+
return;
|
|
954
|
+
}
|
|
848
955
|
if (event.type === "tool_execution_end") {
|
|
849
956
|
const resultStr = extractToolResultText(event.result);
|
|
850
957
|
const pending = pendingTools.get(event.toolCallId);
|
|
@@ -856,7 +963,7 @@ function attachSessionEventHandlers(params) {
|
|
|
856
963
|
const progress = runState.toolProgress.get(event.toolCallId);
|
|
857
964
|
if (progress)
|
|
858
965
|
progress.status = event.isError ? "error" : "done";
|
|
859
|
-
|
|
966
|
+
flushToolProgressUpdate(responder, runState);
|
|
860
967
|
pendingTools.delete(event.toolCallId);
|
|
861
968
|
const durationMs = pending ? Date.now() - pending.startTime : 0;
|
|
862
969
|
Sentry.metrics.count("agent.tool.calls", 1, {
|
|
@@ -1069,27 +1176,6 @@ function attachSessionEventHandlers(params) {
|
|
|
1069
1176
|
}
|
|
1070
1177
|
});
|
|
1071
1178
|
}
|
|
1072
|
-
function extractToolResultText(result) {
|
|
1073
|
-
if (typeof result === "string") {
|
|
1074
|
-
return result;
|
|
1075
|
-
}
|
|
1076
|
-
if (result &&
|
|
1077
|
-
typeof result === "object" &&
|
|
1078
|
-
"content" in result &&
|
|
1079
|
-
Array.isArray(result.content)) {
|
|
1080
|
-
const content = result.content;
|
|
1081
|
-
const textParts = [];
|
|
1082
|
-
for (const part of content) {
|
|
1083
|
-
if (part.type === "text" && part.text) {
|
|
1084
|
-
textParts.push(part.text);
|
|
1085
|
-
}
|
|
1086
|
-
}
|
|
1087
|
-
if (textParts.length > 0) {
|
|
1088
|
-
return textParts.join("\n");
|
|
1089
|
-
}
|
|
1090
|
-
}
|
|
1091
|
-
return JSON.stringify(result);
|
|
1092
|
-
}
|
|
1093
1179
|
/**
|
|
1094
1180
|
* Create a new PiAgentWrapper for a channel.
|
|
1095
1181
|
* Sets up the session and subscribes to events once.
|
|
@@ -1097,18 +1183,22 @@ function extractToolResultText(result) {
|
|
|
1097
1183
|
* Runner caching is handled by the caller (channelStates in main.ts).
|
|
1098
1184
|
* This is a stateless factory function.
|
|
1099
1185
|
*/
|
|
1100
|
-
export async function createRunner(
|
|
1186
|
+
export async function createRunner(options) {
|
|
1187
|
+
const { sandboxConfig, sessionKey, conversationId, conversationDir, workspaceDir, sessionScope, vaultManager, provisioner, resourceController, sessionView, platformNotifier, platformReactor, platformUploader, platformToolPackFactories, } = options;
|
|
1101
1188
|
const agentConfig = resolveConversationSettings(conversationDir);
|
|
1102
1189
|
const workspaceBase = join(conversationDir, "..");
|
|
1103
1190
|
const { executionResolver, executor, getPathContext, resolveExecutorForRun } = createRunnerExecutionContext(sandboxConfig, vaultManager, provisioner, workspaceDir, workspaceBase);
|
|
1104
1191
|
let pathContext = getUnresolvedSandboxPathContext(sandboxConfig, workspaceBase);
|
|
1105
|
-
|
|
1106
|
-
const { tools, setUploadFunction, setEventContext, setSandboxContext } = createMikanTools(executor, workspaceDir, { sandbox: sandboxConfig, provisioner });
|
|
1107
|
-
const modelRegistry = MikanModels.create();
|
|
1192
|
+
const modelRegistry = options.models ?? MikanModels.create();
|
|
1108
1193
|
if (modelRegistry.getError()) {
|
|
1109
1194
|
log.logWarning("models.json load error", modelRegistry.getError());
|
|
1110
1195
|
}
|
|
1111
|
-
const model =
|
|
1196
|
+
const model = modelRegistry.resolve(agentConfig.provider, agentConfig.model);
|
|
1197
|
+
// Create tools (per-runner, with per-runner upload function setter)
|
|
1198
|
+
const { tools, setUploadFunction, setReactFunction, bindPlatformToolPacks, setEventContext, setSandboxContext, } = createMikanTools(executor, workspaceDir, { sandbox: sandboxConfig, resourceController: resourceController ?? provisioner }, platformToolPackFactories ?? [], {
|
|
1199
|
+
model,
|
|
1200
|
+
getApiKey: () => modelRegistry.getApiKeyForProvider(model.provider),
|
|
1201
|
+
});
|
|
1112
1202
|
// Initial system prompt (will be updated each run with fresh memory/channels/users/skills)
|
|
1113
1203
|
const memory = await getMemory(conversationDir);
|
|
1114
1204
|
const skills = loadMikanSkills(conversationDir, pathContext.runtimeWorkspaceRoot);
|
|
@@ -1117,12 +1207,13 @@ export async function createRunner(sandboxConfig, sessionKey, conversationId, co
|
|
|
1117
1207
|
formattingGuide: "",
|
|
1118
1208
|
channels: [],
|
|
1119
1209
|
users: [],
|
|
1210
|
+
trustModel: "membership",
|
|
1120
1211
|
};
|
|
1121
1212
|
const systemPrompt = buildSystemPrompt(pathContext.runtimeWorkspaceRoot, conversationId, "shared", undefined, memory, sandboxConfig, emptyPlatform, skills);
|
|
1122
1213
|
// Create session manager and settings manager. Top-level/private sessions
|
|
1123
1214
|
// use the conversation's current pointer; scoped sessions use fixed files.
|
|
1124
1215
|
// Platform-specific scope behavior is resolved before runner creation.
|
|
1125
|
-
const isThread = sessionKey
|
|
1216
|
+
const isThread = isThreadSessionKey(sessionKey);
|
|
1126
1217
|
const { contextFile, threadRootMessage } = sessionScope;
|
|
1127
1218
|
const sessionManager = openManagedSession(contextFile, pathContext.runtimeWorkspaceRoot);
|
|
1128
1219
|
const threadSessionName = buildThreadSessionName(threadRootMessage);
|
|
@@ -1130,8 +1221,8 @@ export async function createRunner(sandboxConfig, sessionKey, conversationId, co
|
|
|
1130
1221
|
sessionManager.appendSessionInfo(threadSessionName);
|
|
1131
1222
|
}
|
|
1132
1223
|
const sessionUuid = extractSessionUuid(contextFile);
|
|
1133
|
-
const chatSessionManager = new
|
|
1134
|
-
const { session, extensionSkills } = await createConfiguredAgentSession({
|
|
1224
|
+
const chatSessionManager = new ChatHistorySync();
|
|
1225
|
+
const { session, extensionSkills, extensionRegistry, disposeExtensions } = await createConfiguredAgentSession({
|
|
1135
1226
|
conversationId,
|
|
1136
1227
|
workspaceDir,
|
|
1137
1228
|
systemPrompt,
|
|
@@ -1142,6 +1233,8 @@ export async function createRunner(sandboxConfig, sessionKey, conversationId, co
|
|
|
1142
1233
|
models: modelRegistry,
|
|
1143
1234
|
vaultManager,
|
|
1144
1235
|
platformNotifier,
|
|
1236
|
+
platformReactor,
|
|
1237
|
+
platformUploader,
|
|
1145
1238
|
});
|
|
1146
1239
|
// Mutable per-run state - event handler references this
|
|
1147
1240
|
const runState = createRunState();
|
|
@@ -1173,6 +1266,8 @@ export async function createRunner(sandboxConfig, sessionKey, conversationId, co
|
|
|
1173
1266
|
setEventContext,
|
|
1174
1267
|
setSandboxContext,
|
|
1175
1268
|
setUploadFunction,
|
|
1269
|
+
setReactFunction,
|
|
1270
|
+
bindPlatformToolPacks,
|
|
1176
1271
|
pathContext,
|
|
1177
1272
|
});
|
|
1178
1273
|
pathContext = prepared.pathContext;
|
|
@@ -1201,10 +1296,39 @@ export async function createRunner(sandboxConfig, sessionKey, conversationId, co
|
|
|
1201
1296
|
// Autonomous (event/trigger) runs get an explicit resource ceiling since
|
|
1202
1297
|
// no human is watching the loop; interactive turns stay human-gated.
|
|
1203
1298
|
const isEventRun = message.id.startsWith("event:");
|
|
1204
|
-
|
|
1299
|
+
// Event runs have no triggering platform message, so identity fields
|
|
1300
|
+
// stay unset and extensions must null-check them.
|
|
1301
|
+
const origin = isEventRun
|
|
1302
|
+
? { kind: "event", platform: platform.name }
|
|
1303
|
+
: {
|
|
1304
|
+
kind: "interactive",
|
|
1305
|
+
platform: platform.name,
|
|
1306
|
+
messageTs: message.id,
|
|
1307
|
+
userId: message.userId,
|
|
1308
|
+
userName: message.userName,
|
|
1309
|
+
threadTs: message.threadTs,
|
|
1310
|
+
attachments: message.attachments,
|
|
1311
|
+
};
|
|
1312
|
+
const outcome = await session.prompt(prepared.userMessage, {
|
|
1313
|
+
origin,
|
|
1205
1314
|
...(prepared.imageAttachments.length > 0 ? { images: prepared.imageAttachments } : {}),
|
|
1206
1315
|
...(isEventRun ? { budget: DEFAULT_EVENT_BUDGET } : {}),
|
|
1207
1316
|
});
|
|
1317
|
+
if (outcome?.blocked) {
|
|
1318
|
+
const text = outcome.reason
|
|
1319
|
+
? `_Turn blocked by an extension: ${outcome.reason}_`
|
|
1320
|
+
: "_Turn blocked by an extension._";
|
|
1321
|
+
sendAgentEvent({
|
|
1322
|
+
sessionId: sessionUuid,
|
|
1323
|
+
actorName: formatAgentActorName(message.userName, prepared.sessionConversation),
|
|
1324
|
+
event: { kind: "diagnostic", text },
|
|
1325
|
+
});
|
|
1326
|
+
await responder.respondDiagnostic(text, { style: "muted" });
|
|
1327
|
+
runState.responder = null;
|
|
1328
|
+
runState.logCtx = null;
|
|
1329
|
+
runState.queue = null;
|
|
1330
|
+
return { stopReason: "blocked" };
|
|
1331
|
+
}
|
|
1208
1332
|
// Wait for queued messages
|
|
1209
1333
|
await prepared.runQueue.wait();
|
|
1210
1334
|
const sessionViewTokenStore = sessionView?.tokenStore;
|
|
@@ -1250,6 +1374,21 @@ export async function createRunner(sandboxConfig, sessionKey, conversationId, co
|
|
|
1250
1374
|
abort() {
|
|
1251
1375
|
session.abort();
|
|
1252
1376
|
},
|
|
1377
|
+
async tryExtensionCommand(message, responder) {
|
|
1378
|
+
const parsed = parseCommandInput(message.text);
|
|
1379
|
+
if (!parsed)
|
|
1380
|
+
return false;
|
|
1381
|
+
return extensionRegistry.dispatchCommand(parsed.name, {
|
|
1382
|
+
args: parsed.args,
|
|
1383
|
+
conversationId,
|
|
1384
|
+
userId: message.userId,
|
|
1385
|
+
userName: message.userName,
|
|
1386
|
+
respond: (text) => responder.respond(text),
|
|
1387
|
+
});
|
|
1388
|
+
},
|
|
1389
|
+
async dispose() {
|
|
1390
|
+
await disposeExtensions();
|
|
1391
|
+
},
|
|
1253
1392
|
getCurrentStep() {
|
|
1254
1393
|
const pending = runState.pendingTools;
|
|
1255
1394
|
if (pending.size === 0)
|
|
@@ -1265,13 +1404,4 @@ export async function createRunner(sandboxConfig, sessionKey, conversationId, co
|
|
|
1265
1404
|
},
|
|
1266
1405
|
};
|
|
1267
1406
|
}
|
|
1268
|
-
export function translateRuntimePathToHost(runtimePath, pathContext) {
|
|
1269
|
-
return pathContext.runtimeToHostPath?.(runtimePath) ?? runtimePath;
|
|
1270
|
-
}
|
|
1271
|
-
export function translateAttachPathToHost(filePath, pathContext) {
|
|
1272
|
-
const runtimePath = posix.isAbsolute(filePath)
|
|
1273
|
-
? filePath
|
|
1274
|
-
: posix.join(pathContext.runtimeWorkspaceRoot, filePath);
|
|
1275
|
-
return translateRuntimePathToHost(runtimePath, pathContext);
|
|
1276
|
-
}
|
|
1277
1407
|
//# sourceMappingURL=agent.js.map
|