@geminixiang/mikan 1.0.0-beta.4 → 1.0.0-beta.40
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +688 -0
- package/README.md +99 -36
- package/dist/adapter.d.ts +11 -1
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js +18 -1
- package/dist/adapter.js.map +1 -1
- package/dist/adapters/discord/bot.d.ts +6 -7
- package/dist/adapters/discord/bot.d.ts.map +1 -1
- package/dist/adapters/discord/bot.js +82 -117
- package/dist/adapters/discord/bot.js.map +1 -1
- package/dist/adapters/discord/context.d.ts +3 -1
- package/dist/adapters/discord/context.d.ts.map +1 -1
- package/dist/adapters/discord/context.js +54 -215
- package/dist/adapters/discord/context.js.map +1 -1
- package/dist/adapters/github/bot.d.ts +89 -0
- package/dist/adapters/github/bot.d.ts.map +1 -0
- package/dist/adapters/github/bot.js +653 -0
- package/dist/adapters/github/bot.js.map +1 -0
- package/dist/adapters/github/client.d.ts +122 -0
- package/dist/adapters/github/client.d.ts.map +1 -0
- package/dist/adapters/github/client.js +314 -0
- package/dist/adapters/github/client.js.map +1 -0
- package/dist/adapters/github/cloudbuild.d.ts +19 -0
- package/dist/adapters/github/cloudbuild.d.ts.map +1 -0
- package/dist/adapters/github/cloudbuild.js +71 -0
- package/dist/adapters/github/cloudbuild.js.map +1 -0
- package/dist/adapters/github/context.d.ts +12 -0
- package/dist/adapters/github/context.d.ts.map +1 -0
- package/dist/adapters/github/context.js +101 -0
- package/dist/adapters/github/context.js.map +1 -0
- package/dist/adapters/github/gcp-auth.d.ts +28 -0
- package/dist/adapters/github/gcp-auth.d.ts.map +1 -0
- package/dist/adapters/github/gcp-auth.js +196 -0
- package/dist/adapters/github/gcp-auth.js.map +1 -0
- package/dist/adapters/github/github-ops.d.ts +91 -0
- package/dist/adapters/github/github-ops.d.ts.map +1 -0
- package/dist/adapters/github/github-ops.js +406 -0
- package/dist/adapters/github/github-ops.js.map +1 -0
- package/dist/adapters/github/ids.d.ts +34 -0
- package/dist/adapters/github/ids.d.ts.map +1 -0
- package/dist/adapters/github/ids.js +57 -0
- package/dist/adapters/github/ids.js.map +1 -0
- package/dist/adapters/github/repo.d.ts +33 -0
- package/dist/adapters/github/repo.d.ts.map +1 -0
- package/dist/adapters/github/repo.js +141 -0
- package/dist/adapters/github/repo.js.map +1 -0
- package/dist/adapters/github/tool-pack.d.ts +14 -0
- package/dist/adapters/github/tool-pack.d.ts.map +1 -0
- package/dist/adapters/github/tool-pack.js +56 -0
- package/dist/adapters/github/tool-pack.js.map +1 -0
- package/dist/adapters/github/tools/checks.d.ts +19 -0
- package/dist/adapters/github/tools/checks.d.ts.map +1 -0
- package/dist/adapters/github/tools/checks.js +105 -0
- package/dist/adapters/github/tools/checks.js.map +1 -0
- package/dist/adapters/github/tools/issue.d.ts +21 -0
- package/dist/adapters/github/tools/issue.d.ts.map +1 -0
- package/dist/adapters/github/tools/issue.js +48 -0
- package/dist/adapters/github/tools/issue.js.map +1 -0
- package/dist/adapters/github/tools/pr.d.ts +22 -0
- package/dist/adapters/github/tools/pr.d.ts.map +1 -0
- package/dist/adapters/github/tools/pr.js +48 -0
- package/dist/adapters/github/tools/pr.js.map +1 -0
- package/dist/adapters/github/tools/read.d.ts +21 -0
- package/dist/adapters/github/tools/read.d.ts.map +1 -0
- package/dist/adapters/github/tools/read.js +141 -0
- package/dist/adapters/github/tools/read.js.map +1 -0
- package/dist/adapters/github/tools/review-reply.d.ts +17 -0
- package/dist/adapters/github/tools/review-reply.d.ts.map +1 -0
- package/dist/adapters/github/tools/review-reply.js +38 -0
- package/dist/adapters/github/tools/review-reply.js.map +1 -0
- package/dist/adapters/github/tools/sync.d.ts +17 -0
- package/dist/adapters/github/tools/sync.d.ts.map +1 -0
- package/dist/adapters/github/tools/sync.js +34 -0
- package/dist/adapters/github/tools/sync.js.map +1 -0
- package/dist/adapters/github/types.d.ts +373 -0
- package/dist/adapters/github/types.d.ts.map +1 -0
- package/dist/adapters/github/types.js +2 -0
- package/dist/adapters/github/types.js.map +1 -0
- package/dist/adapters/intake.d.ts +16 -5
- package/dist/adapters/intake.d.ts.map +1 -1
- package/dist/adapters/intake.js +86 -23
- package/dist/adapters/intake.js.map +1 -1
- package/dist/adapters/progressive-renderer.d.ts +7 -0
- package/dist/adapters/progressive-renderer.d.ts.map +1 -0
- package/dist/adapters/progressive-renderer.js +383 -0
- package/dist/adapters/progressive-renderer.js.map +1 -0
- package/dist/adapters/shared.d.ts +23 -10
- package/dist/adapters/shared.d.ts.map +1 -1
- package/dist/adapters/shared.js +60 -22
- package/dist/adapters/shared.js.map +1 -1
- package/dist/adapters/slack/blocks.d.ts +14 -0
- package/dist/adapters/slack/blocks.d.ts.map +1 -1
- package/dist/adapters/slack/blocks.js +147 -111
- package/dist/adapters/slack/blocks.js.map +1 -1
- package/dist/adapters/slack/bot.d.ts +43 -13
- package/dist/adapters/slack/bot.d.ts.map +1 -1
- package/dist/adapters/slack/bot.js +385 -207
- package/dist/adapters/slack/bot.js.map +1 -1
- package/dist/adapters/slack/context.d.ts +3 -1
- package/dist/adapters/slack/context.d.ts.map +1 -1
- package/dist/adapters/slack/context.js +11 -17
- package/dist/adapters/slack/context.js.map +1 -1
- package/dist/adapters/slack/response-lifecycle.d.ts.map +1 -1
- package/dist/adapters/slack/response-lifecycle.js +126 -323
- package/dist/adapters/slack/response-lifecycle.js.map +1 -1
- package/dist/adapters/slack/session.d.ts.map +1 -1
- package/dist/adapters/slack/session.js +7 -11
- package/dist/adapters/slack/session.js.map +1 -1
- package/dist/adapters/slack/tool-pack.d.ts +11 -0
- package/dist/adapters/slack/tool-pack.d.ts.map +1 -0
- package/dist/adapters/slack/tool-pack.js +45 -0
- package/dist/adapters/slack/tool-pack.js.map +1 -0
- package/dist/adapters/slack/tools/attach.js +1 -1
- package/dist/adapters/slack/tools/attach.js.map +1 -1
- package/dist/adapters/slack/tools/blockkit.d.ts +14 -0
- package/dist/adapters/slack/tools/blockkit.d.ts.map +1 -0
- package/dist/adapters/slack/tools/blockkit.js +106 -0
- package/dist/adapters/slack/tools/blockkit.js.map +1 -0
- package/dist/adapters/slack/types.d.ts +40 -2
- package/dist/adapters/slack/types.d.ts.map +1 -1
- package/dist/adapters/slack/types.js.map +1 -1
- package/dist/adapters/telegram/bot.d.ts +8 -9
- package/dist/adapters/telegram/bot.d.ts.map +1 -1
- package/dist/adapters/telegram/bot.js +90 -117
- package/dist/adapters/telegram/bot.js.map +1 -1
- package/dist/adapters/telegram/context.d.ts +2 -0
- package/dist/adapters/telegram/context.d.ts.map +1 -1
- package/dist/adapters/telegram/context.js +61 -184
- package/dist/adapters/telegram/context.js.map +1 -1
- package/dist/adapters/telegram/html.d.ts.map +1 -1
- package/dist/adapters/telegram/html.js +10 -7
- package/dist/adapters/telegram/html.js.map +1 -1
- package/dist/adapters/types.d.ts +109 -12
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/adapters/types.js.map +1 -1
- package/dist/agent-events.d.ts +3 -2
- package/dist/agent-events.d.ts.map +1 -1
- package/dist/agent-events.js +19 -1
- package/dist/agent-events.js.map +1 -1
- package/dist/agent.d.ts +14 -19
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +840 -298
- package/dist/agent.js.map +1 -1
- package/dist/cli/arg-grammar.d.ts +25 -0
- package/dist/cli/arg-grammar.d.ts.map +1 -0
- package/dist/cli/arg-grammar.js +61 -0
- package/dist/cli/arg-grammar.js.map +1 -0
- package/dist/cli/boot.d.ts +5 -0
- package/dist/cli/boot.d.ts.map +1 -0
- package/dist/cli/boot.js +117 -0
- package/dist/cli/boot.js.map +1 -0
- package/dist/cli/download.d.ts.map +1 -0
- package/dist/{download.js → cli/download.js} +2 -0
- package/dist/cli/download.js.map +1 -0
- package/dist/cli/ext-dev.d.ts +2 -0
- package/dist/cli/ext-dev.d.ts.map +1 -0
- package/dist/cli/ext-dev.js +188 -0
- package/dist/cli/ext-dev.js.map +1 -0
- package/dist/cli/ext.d.ts +2 -0
- package/dist/cli/ext.d.ts.map +1 -0
- package/dist/cli/ext.js +324 -0
- package/dist/cli/ext.js.map +1 -0
- package/dist/cli/office.d.ts +2 -0
- package/dist/cli/office.d.ts.map +1 -0
- package/dist/cli/office.js +91 -0
- package/dist/cli/office.js.map +1 -0
- package/dist/cli/types.d.ts +16 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +2 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/commands/admin.d.ts.map +1 -1
- package/dist/commands/admin.js +3 -2
- package/dist/commands/admin.js.map +1 -1
- package/dist/commands/auto-reply.d.ts.map +1 -1
- package/dist/commands/auto-reply.js +5 -9
- package/dist/commands/auto-reply.js.map +1 -1
- package/dist/commands/extensions.d.ts.map +1 -1
- package/dist/commands/extensions.js +9 -6
- package/dist/commands/extensions.js.map +1 -1
- package/dist/commands/login.d.ts +2 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +40 -5
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/manifest.d.ts +37 -0
- package/dist/commands/manifest.d.ts.map +1 -0
- package/dist/commands/manifest.js +151 -0
- package/dist/commands/manifest.js.map +1 -0
- package/dist/commands/model.d.ts +2 -3
- package/dist/commands/model.d.ts.map +1 -1
- package/dist/commands/model.js +63 -24
- package/dist/commands/model.js.map +1 -1
- package/dist/commands/new.d.ts.map +1 -1
- package/dist/commands/new.js +15 -3
- package/dist/commands/new.js.map +1 -1
- package/dist/commands/registry.d.ts +2 -2
- package/dist/commands/registry.d.ts.map +1 -1
- package/dist/commands/registry.js +1 -2
- package/dist/commands/registry.js.map +1 -1
- package/dist/commands/sandbox.d.ts.map +1 -1
- package/dist/commands/sandbox.js +83 -33
- package/dist/commands/sandbox.js.map +1 -1
- package/dist/commands/session-view.d.ts.map +1 -1
- package/dist/commands/session-view.js +6 -3
- package/dist/commands/session-view.js.map +1 -1
- package/dist/commands/types.d.ts +79 -7
- package/dist/commands/types.d.ts.map +1 -1
- package/dist/commands/types.js.map +1 -1
- package/dist/config.d.ts +23 -8
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +222 -135
- package/dist/config.js.map +1 -1
- package/dist/env-manifest.d.ts +30 -0
- package/dist/env-manifest.d.ts.map +1 -0
- package/dist/env-manifest.js +229 -0
- package/dist/env-manifest.js.map +1 -0
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js +20 -81
- package/dist/events.js.map +1 -1
- package/dist/execution-resolver.d.ts +7 -8
- package/dist/execution-resolver.d.ts.map +1 -1
- package/dist/execution-resolver.js +106 -110
- package/dist/execution-resolver.js.map +1 -1
- package/dist/extension-schedules.d.ts +31 -0
- package/dist/extension-schedules.d.ts.map +1 -0
- package/dist/extension-schedules.js +229 -0
- package/dist/extension-schedules.js.map +1 -0
- package/dist/harness/auth.d.ts +2 -1
- package/dist/harness/auth.d.ts.map +1 -1
- package/dist/harness/auth.js +11 -5
- package/dist/harness/auth.js.map +1 -1
- package/dist/harness/event-format.d.ts +27 -0
- package/dist/harness/event-format.d.ts.map +1 -0
- package/dist/harness/event-format.js +160 -0
- package/dist/harness/event-format.js.map +1 -0
- package/dist/harness/extensions/loader.d.ts +27 -49
- package/dist/harness/extensions/loader.d.ts.map +1 -1
- package/dist/harness/extensions/loader.js +486 -130
- package/dist/harness/extensions/loader.js.map +1 -1
- package/dist/harness/extensions/registry.d.ts +107 -2
- package/dist/harness/extensions/registry.d.ts.map +1 -1
- package/dist/harness/extensions/registry.js +316 -0
- package/dist/harness/extensions/registry.js.map +1 -1
- package/dist/harness/extensions/types.d.ts +482 -42
- package/dist/harness/extensions/types.d.ts.map +1 -1
- package/dist/harness/extensions/types.js.map +1 -1
- package/dist/harness/index.d.ts +18 -8
- package/dist/harness/index.d.ts.map +1 -1
- package/dist/harness/index.js +7 -4
- package/dist/harness/index.js.map +1 -1
- package/dist/harness/models.d.ts +7 -4
- package/dist/harness/models.d.ts.map +1 -1
- package/dist/harness/models.js +46 -24
- package/dist/harness/models.js.map +1 -1
- package/dist/harness/runner.d.ts +50 -54
- package/dist/harness/runner.d.ts.map +1 -1
- package/dist/harness/runner.js +232 -46
- package/dist/harness/runner.js.map +1 -1
- package/dist/harness/session-store.d.ts +11 -5
- package/dist/harness/session-store.d.ts.map +1 -1
- package/dist/harness/session-store.js +141 -36
- package/dist/harness/session-store.js.map +1 -1
- package/dist/harness/settings.d.ts +2 -20
- package/dist/harness/settings.d.ts.map +1 -1
- package/dist/harness/settings.js +12 -1
- package/dist/harness/settings.js.map +1 -1
- package/dist/harness/skills.d.ts +10 -29
- package/dist/harness/skills.d.ts.map +1 -1
- package/dist/harness/skills.js +48 -6
- package/dist/harness/skills.js.map +1 -1
- package/dist/harness/subagent-profiles.d.ts +8 -0
- package/dist/harness/subagent-profiles.d.ts.map +1 -0
- package/dist/harness/subagent-profiles.js +299 -0
- package/dist/harness/subagent-profiles.js.map +1 -0
- package/dist/harness/subagent-runner.d.ts +39 -0
- package/dist/harness/subagent-runner.d.ts.map +1 -0
- package/dist/harness/subagent-runner.js +617 -0
- package/dist/harness/subagent-runner.js.map +1 -0
- package/dist/harness/types.d.ts +267 -1
- package/dist/harness/types.d.ts.map +1 -1
- package/dist/harness/types.js.map +1 -1
- package/dist/harness/usage.d.ts +6 -0
- package/dist/harness/usage.d.ts.map +1 -0
- package/dist/harness/usage.js +32 -0
- package/dist/harness/usage.js.map +1 -0
- package/dist/index.d.ts +36 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -6
- package/dist/index.js.map +1 -1
- package/dist/main.js +391 -127
- package/dist/main.js.map +1 -1
- package/dist/observability/instrument.js +7 -5
- package/dist/observability/instrument.js.map +1 -1
- package/dist/observability/sentry.d.ts +2 -0
- package/dist/observability/sentry.d.ts.map +1 -1
- package/dist/observability/sentry.js +10 -2
- package/dist/observability/sentry.js.map +1 -1
- package/dist/office/address.d.ts +31 -0
- package/dist/office/address.d.ts.map +1 -0
- package/dist/office/address.js +113 -0
- package/dist/office/address.js.map +1 -0
- package/dist/office/index.d.ts +11 -0
- package/dist/office/index.d.ts.map +1 -0
- package/dist/office/index.js +11 -0
- package/dist/office/index.js.map +1 -0
- package/dist/office/layout.d.ts +27 -0
- package/dist/office/layout.d.ts.map +1 -0
- package/dist/office/layout.js +97 -0
- package/dist/office/layout.js.map +1 -0
- package/dist/office/migration.d.ts +44 -0
- package/dist/office/migration.d.ts.map +1 -0
- package/dist/office/migration.js +255 -0
- package/dist/office/migration.js.map +1 -0
- package/dist/office/registry.d.ts +75 -0
- package/dist/office/registry.d.ts.map +1 -0
- package/dist/office/registry.js +646 -0
- package/dist/office/registry.js.map +1 -0
- package/dist/office/types.d.ts +71 -0
- package/dist/office/types.d.ts.map +1 -0
- package/dist/office/types.js +2 -0
- package/dist/office/types.js.map +1 -0
- package/dist/packages/admin.d.ts +17 -0
- package/dist/packages/admin.d.ts.map +1 -0
- package/dist/packages/admin.js +98 -0
- package/dist/packages/admin.js.map +1 -0
- package/dist/packages/index.d.ts +6 -0
- package/dist/packages/index.d.ts.map +1 -0
- package/dist/packages/index.js +6 -0
- package/dist/packages/index.js.map +1 -0
- package/dist/packages/inspect.d.ts +11 -0
- package/dist/packages/inspect.d.ts.map +1 -0
- package/dist/packages/inspect.js +98 -0
- package/dist/packages/inspect.js.map +1 -0
- package/dist/packages/materialize.d.ts +40 -0
- package/dist/packages/materialize.d.ts.map +1 -0
- package/dist/packages/materialize.js +297 -0
- package/dist/packages/materialize.js.map +1 -0
- package/dist/packages/resolve.d.ts +25 -0
- package/dist/packages/resolve.d.ts.map +1 -0
- package/dist/packages/resolve.js +208 -0
- package/dist/packages/resolve.js.map +1 -0
- package/dist/packages/source.d.ts +39 -0
- package/dist/packages/source.d.ts.map +1 -0
- package/dist/packages/source.js +189 -0
- package/dist/packages/source.js.map +1 -0
- package/dist/packages/types.d.ts +104 -0
- package/dist/packages/types.d.ts.map +1 -0
- package/dist/packages/types.js +2 -0
- package/dist/packages/types.js.map +1 -0
- package/dist/provisioner.d.ts +66 -0
- package/dist/provisioner.d.ts.map +1 -1
- package/dist/provisioner.js +335 -13
- package/dist/provisioner.js.map +1 -1
- package/dist/runtime/conversation-runtime.d.ts +1 -1
- package/dist/runtime/conversation-runtime.d.ts.map +1 -1
- package/dist/runtime/conversation-runtime.js +562 -118
- package/dist/runtime/conversation-runtime.js.map +1 -1
- package/dist/runtime/session-lifecycle.d.ts +38 -0
- package/dist/runtime/session-lifecycle.d.ts.map +1 -0
- package/dist/runtime/session-lifecycle.js +193 -0
- package/dist/runtime/session-lifecycle.js.map +1 -0
- package/dist/runtime/types.d.ts +66 -7
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/runtime/types.js.map +1 -1
- package/dist/sandbox/cloudflare.d.ts +3 -0
- package/dist/sandbox/cloudflare.d.ts.map +1 -1
- package/dist/sandbox/cloudflare.js +13 -1
- package/dist/sandbox/cloudflare.js.map +1 -1
- package/dist/sandbox/container.d.ts +4 -0
- package/dist/sandbox/container.d.ts.map +1 -1
- package/dist/sandbox/container.js +13 -3
- package/dist/sandbox/container.js.map +1 -1
- package/dist/sandbox/firecracker.d.ts +3 -0
- package/dist/sandbox/firecracker.d.ts.map +1 -1
- package/dist/sandbox/firecracker.js +13 -2
- package/dist/sandbox/firecracker.js.map +1 -1
- package/dist/sandbox/gondolin.d.ts +57 -0
- package/dist/sandbox/gondolin.d.ts.map +1 -0
- package/dist/sandbox/gondolin.js +764 -0
- package/dist/sandbox/gondolin.js.map +1 -0
- package/dist/sandbox/host.d.ts +3 -0
- package/dist/sandbox/host.d.ts.map +1 -1
- package/dist/sandbox/host.js +18 -3
- package/dist/sandbox/host.js.map +1 -1
- package/dist/sandbox/identity.d.ts +44 -0
- package/dist/sandbox/identity.d.ts.map +1 -0
- package/dist/sandbox/identity.js +68 -0
- package/dist/sandbox/identity.js.map +1 -0
- package/dist/sandbox/image.d.ts.map +1 -1
- package/dist/sandbox/image.js +2 -0
- package/dist/sandbox/image.js.map +1 -1
- package/dist/sandbox/index.d.ts +17 -4
- package/dist/sandbox/index.d.ts.map +1 -1
- package/dist/sandbox/index.js +37 -3
- package/dist/sandbox/index.js.map +1 -1
- package/dist/sandbox/types.d.ts +65 -1
- package/dist/sandbox/types.d.ts.map +1 -1
- package/dist/sandbox/types.js.map +1 -1
- package/dist/sandbox/utils.d.ts +14 -0
- package/dist/sandbox/utils.d.ts.map +1 -1
- package/dist/sandbox/utils.js +68 -1
- package/dist/sandbox/utils.js.map +1 -1
- package/dist/sessions/chat-history-sync.d.ts +25 -0
- package/dist/sessions/chat-history-sync.d.ts.map +1 -0
- package/dist/sessions/{agent-memory-file-manager.js → chat-history-sync.js} +135 -131
- package/dist/sessions/chat-history-sync.js.map +1 -0
- package/dist/sessions/conversation-log.d.ts +9 -0
- package/dist/sessions/conversation-log.d.ts.map +1 -0
- package/dist/sessions/conversation-log.js +50 -0
- package/dist/sessions/conversation-log.js.map +1 -0
- package/dist/sessions/history-line.d.ts +29 -0
- package/dist/sessions/history-line.d.ts.map +1 -0
- package/dist/sessions/history-line.js +45 -0
- package/dist/sessions/history-line.js.map +1 -0
- package/dist/sessions/rotation.d.ts +2 -0
- package/dist/sessions/rotation.d.ts.map +1 -0
- package/dist/sessions/rotation.js +39 -0
- package/dist/sessions/rotation.js.map +1 -0
- package/dist/sessions/session-key.d.ts +33 -0
- package/dist/sessions/session-key.d.ts.map +1 -0
- package/dist/sessions/session-key.js +115 -0
- package/dist/sessions/session-key.js.map +1 -0
- package/dist/sessions/store.d.ts +15 -7
- package/dist/sessions/store.d.ts.map +1 -1
- package/dist/sessions/store.js +127 -36
- package/dist/sessions/store.js.map +1 -1
- package/dist/sessions/types.d.ts +19 -5
- package/dist/sessions/types.d.ts.map +1 -1
- package/dist/sessions/types.js.map +1 -1
- package/dist/settings-mutation.d.ts +40 -0
- package/dist/settings-mutation.d.ts.map +1 -0
- package/dist/settings-mutation.js +61 -0
- package/dist/settings-mutation.js.map +1 -0
- package/dist/subagent-progress.d.ts +43 -0
- package/dist/subagent-progress.d.ts.map +1 -0
- package/dist/subagent-progress.js +220 -0
- package/dist/subagent-progress.js.map +1 -0
- package/dist/tools/bash.d.ts +3 -1
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js +26 -18
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/edit.d.ts.map +1 -1
- package/dist/tools/edit.js +14 -13
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/event.d.ts +1 -1
- package/dist/tools/event.d.ts.map +1 -1
- package/dist/tools/event.js +58 -45
- package/dist/tools/event.js.map +1 -1
- package/dist/tools/generate-image.d.ts +23 -0
- package/dist/tools/generate-image.d.ts.map +1 -0
- package/dist/tools/generate-image.js +65 -0
- package/dist/tools/generate-image.js.map +1 -0
- package/dist/tools/host-fn-tool.d.ts +21 -0
- package/dist/tools/host-fn-tool.d.ts.map +1 -0
- package/dist/tools/host-fn-tool.js +32 -0
- package/dist/tools/host-fn-tool.js.map +1 -0
- package/dist/tools/index.d.ts +19 -2
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +25 -2
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/react.d.ts +15 -0
- package/dist/tools/react.d.ts.map +1 -0
- package/dist/tools/react.js +29 -0
- package/dist/tools/react.js.map +1 -0
- package/dist/tools/read.d.ts +1 -0
- package/dist/tools/read.d.ts.map +1 -1
- package/dist/tools/read.js +39 -33
- package/dist/tools/read.js.map +1 -1
- package/dist/tools/sandbox.d.ts +2 -2
- package/dist/tools/sandbox.d.ts.map +1 -1
- package/dist/tools/sandbox.js +14 -9
- package/dist/tools/sandbox.js.map +1 -1
- package/dist/tools/subagent-slots.d.ts +28 -0
- package/dist/tools/subagent-slots.d.ts.map +1 -0
- package/dist/tools/subagent-slots.js +72 -0
- package/dist/tools/subagent-slots.js.map +1 -0
- package/dist/tools/subagent.d.ts +54 -0
- package/dist/tools/subagent.d.ts.map +1 -0
- package/dist/tools/subagent.js +411 -0
- package/dist/tools/subagent.js.map +1 -0
- package/dist/tools/types.d.ts +40 -32
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/types.js.map +1 -1
- package/dist/tools/write.d.ts.map +1 -1
- package/dist/tools/write.js +2 -8
- package/dist/tools/write.js.map +1 -1
- package/dist/trigger.d.ts +2 -1
- package/dist/trigger.d.ts.map +1 -1
- package/dist/trigger.js +6 -9
- package/dist/trigger.js.map +1 -1
- package/dist/types.d.ts +403 -59
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +2 -2
- package/dist/types.js.map +1 -1
- package/dist/utils/file-guards.d.ts +9 -0
- package/dist/utils/file-guards.d.ts.map +1 -1
- package/dist/utils/file-guards.js +44 -1
- package/dist/utils/file-guards.js.map +1 -1
- package/dist/vault/disabled.d.ts +9 -0
- package/dist/vault/disabled.d.ts.map +1 -0
- package/dist/vault/disabled.js +25 -0
- package/dist/vault/disabled.js.map +1 -0
- package/dist/vault/index.d.ts +45 -2
- package/dist/vault/index.d.ts.map +1 -1
- package/dist/vault/index.js +127 -36
- package/dist/vault/index.js.map +1 -1
- package/dist/vault/types.d.ts +6 -2
- package/dist/vault/types.d.ts.map +1 -1
- package/dist/vault/types.js.map +1 -1
- package/dist/web/admin/portal.d.ts +31 -3
- package/dist/web/admin/portal.d.ts.map +1 -1
- package/dist/web/admin/portal.js +846 -345
- package/dist/web/admin/portal.js.map +1 -1
- package/dist/web/admin/provider-models.js +1 -1
- package/dist/web/admin/provider-models.js.map +1 -1
- package/dist/web/admin/types.d.ts +23 -3
- package/dist/web/admin/types.d.ts.map +1 -1
- package/dist/web/admin/types.js.map +1 -1
- package/dist/web/login/oauth.d.ts +2 -3
- package/dist/web/login/oauth.d.ts.map +1 -1
- package/dist/web/login/oauth.js +1 -32
- package/dist/web/login/oauth.js.map +1 -1
- package/dist/web/login/portal.d.ts +1 -1
- package/dist/web/login/portal.d.ts.map +1 -1
- package/dist/web/login/portal.js +13 -36
- package/dist/web/login/portal.js.map +1 -1
- package/dist/web/login/types.d.ts +0 -11
- package/dist/web/login/types.d.ts.map +1 -1
- package/dist/web/login/types.js.map +1 -1
- package/dist/web/portal-shell.d.ts +21 -0
- package/dist/web/portal-shell.d.ts.map +1 -0
- package/dist/{portal-shell.js → web/portal-shell.js} +67 -2
- package/dist/web/portal-shell.js.map +1 -0
- package/dist/web/server.d.ts +3 -2
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +11 -4
- package/dist/web/server.js.map +1 -1
- package/dist/web/session-view/portal.d.ts +1 -1
- package/dist/web/session-view/portal.d.ts.map +1 -1
- package/dist/web/session-view/portal.js +37 -28
- package/dist/web/session-view/portal.js.map +1 -1
- package/dist/web/session-view/service.d.ts +1 -1
- package/dist/web/session-view/service.d.ts.map +1 -1
- package/dist/web/session-view/service.js +61 -18
- package/dist/web/session-view/service.js.map +1 -1
- package/dist/web/session-view/types.d.ts +0 -3
- package/dist/web/session-view/types.d.ts.map +1 -1
- package/dist/web/session-view/types.js.map +1 -1
- package/dist/web/token-store.js +1 -1
- package/dist/web/token-store.js.map +1 -1
- package/dist/workspace-projection/index.d.ts +10 -0
- package/dist/workspace-projection/index.d.ts.map +1 -0
- package/dist/workspace-projection/index.js +120 -0
- package/dist/workspace-projection/index.js.map +1 -0
- package/dist/workspace-projection/types.d.ts +16 -0
- package/dist/workspace-projection/types.d.ts.map +1 -0
- package/dist/workspace-projection/types.js +2 -0
- package/dist/workspace-projection/types.js.map +1 -0
- package/package.json +67 -37
- package/dist/adapters/streaming.d.ts +0 -18
- package/dist/adapters/streaming.d.ts.map +0 -1
- package/dist/adapters/streaming.js +0 -44
- package/dist/adapters/streaming.js.map +0 -1
- package/dist/commands/parse.d.ts +0 -7
- package/dist/commands/parse.d.ts.map +0 -1
- package/dist/commands/parse.js +0 -14
- package/dist/commands/parse.js.map +0 -1
- package/dist/download.d.ts.map +0 -1
- package/dist/download.js.map +0 -1
- package/dist/model-registry.d.ts +0 -4
- package/dist/model-registry.d.ts.map +0 -1
- package/dist/model-registry.js +0 -7
- package/dist/model-registry.js.map +0 -1
- package/dist/portal-shell.d.ts +0 -4
- package/dist/portal-shell.d.ts.map +0 -1
- package/dist/portal-shell.js.map +0 -1
- package/dist/runtime/agent-run-controller.d.ts +0 -31
- package/dist/runtime/agent-run-controller.d.ts.map +0 -1
- package/dist/runtime/agent-run-controller.js +0 -195
- package/dist/runtime/agent-run-controller.js.map +0 -1
- package/dist/sandbox/path-context.d.ts +0 -3
- package/dist/sandbox/path-context.d.ts.map +0 -1
- package/dist/sandbox/path-context.js +0 -20
- package/dist/sandbox/path-context.js.map +0 -1
- package/dist/sessions/agent-memory-file-manager.d.ts +0 -19
- package/dist/sessions/agent-memory-file-manager.d.ts.map +0 -1
- package/dist/sessions/agent-memory-file-manager.js.map +0 -1
- package/dist/sessions/metadata.d.ts +0 -3
- package/dist/sessions/metadata.d.ts.map +0 -1
- package/dist/sessions/metadata.js +0 -11
- package/dist/sessions/metadata.js.map +0 -1
- package/dist/sessions/policy.d.ts +0 -6
- package/dist/sessions/policy.d.ts.map +0 -1
- package/dist/sessions/policy.js +0 -23
- package/dist/sessions/policy.js.map +0 -1
- package/dist/store.d.ts +0 -46
- package/dist/store.d.ts.map +0 -1
- package/dist/store.js +0 -177
- package/dist/store.js.map +0 -1
- package/dist/tools/truncate.d.ts +0 -33
- package/dist/tools/truncate.d.ts.map +0 -1
- package/dist/tools/truncate.js +0 -184
- package/dist/tools/truncate.js.map +0 -1
- package/dist/utils/date.d.ts +0 -10
- package/dist/utils/date.d.ts.map +0 -1
- package/dist/utils/date.js +0 -23
- package/dist/utils/date.js.map +0 -1
- package/dist/utils/env.d.ts +0 -3
- package/dist/utils/env.d.ts.map +0 -1
- package/dist/utils/env.js +0 -12
- package/dist/utils/env.js.map +0 -1
- package/dist/utils/fs-atomic.d.ts +0 -10
- package/dist/utils/fs-atomic.d.ts.map +0 -1
- package/dist/utils/fs-atomic.js +0 -45
- package/dist/utils/fs-atomic.js.map +0 -1
- package/dist/utils/html.d.ts +0 -2
- package/dist/utils/html.d.ts.map +0 -1
- package/dist/utils/html.js +0 -4
- package/dist/utils/html.js.map +0 -1
- package/dist/utils/http-body.d.ts +0 -10
- package/dist/utils/http-body.d.ts.map +0 -1
- package/dist/utils/http-body.js +0 -34
- package/dist/utils/http-body.js.map +0 -1
- package/dist/vault/routing.d.ts +0 -3
- package/dist/vault/routing.d.ts.map +0 -1
- package/dist/vault/routing.js +0 -13
- package/dist/vault/routing.js.map +0 -1
- package/dist/web/agent-events/portal.d.ts +0 -3
- package/dist/web/agent-events/portal.d.ts.map +0 -1
- package/dist/web/agent-events/portal.js +0 -18
- package/dist/web/agent-events/portal.js.map +0 -1
- package/dist/web/request.d.ts +0 -3
- package/dist/web/request.d.ts.map +0 -1
- package/dist/web/request.js +0 -13
- package/dist/web/request.js.map +0 -1
- package/dist/web/session-view/command.d.ts +0 -4
- package/dist/web/session-view/command.d.ts.map +0 -1
- package/dist/web/session-view/command.js +0 -7
- package/dist/web/session-view/command.js.map +0 -1
- /package/dist/{download.d.ts → cli/download.d.ts} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../../src/tools/sandbox.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAGzC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../../src/tools/sandbox.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentTool } from \"@earendil-works/pi-agent-core\";\nimport { Type } from \"@sinclair/typebox\";\nimport type { SandboxConfig } from \"../sandbox/index.js\";\nimport type { ResourceLimits, SandboxResourceController } from \"../types.js\";\nimport { runtimeResourceKey } from \"../sandbox/identity.js\";\n\nconst sandboxSchema = Type.Object({\n action: Type.Union([Type.Literal(\"status\"), Type.Literal(\"set\")], {\n description: \"Use status to inspect current limits, or set to apply temporary limits.\",\n }),\n cpus: Type.Optional(\n Type.String({\n description: \"CPU limit for action=set, for example '0.5', '1', or '2'.\",\n }),\n ),\n memory: Type.Optional(\n Type.String({\n description: \"Docker memory limit for action=set, for example '512m', '1g', or '4g'.\",\n }),\n ),\n});\n\ntype SandboxToolParams = {\n action: \"status\" | \"set\";\n cpus?: string;\n memory?: string;\n};\n\ninterface SandboxToolContext {\n userId: string;\n conversationId: string;\n}\n\ninterface SandboxToolController {\n sandbox: SandboxConfig;\n resourceController?: Pick<SandboxResourceController, \"getLimitStatus\" | \"setLimits\">;\n}\n\nexport function createSandboxTool(controller: SandboxToolController): {\n tool: AgentTool<typeof sandboxSchema>;\n setSandboxContext: (context: SandboxToolContext) => void;\n} {\n let sandboxContext: SandboxToolContext | null = null;\n\n const tool: AgentTool<typeof sandboxSchema> = {\n name: \"sandbox\",\n label: \"sandbox\",\n executionMode: \"sequential\",\n description:\n \"Inspect or temporarily set CPU/memory limits for the current managed sandbox. Limits apply to this conversation's runtime and are cleared when it stops.\",\n parameters: sandboxSchema,\n execute: async (_toolCallId: string, params: SandboxToolParams, signal?: AbortSignal) => {\n if (signal?.aborted) {\n throw new Error(\"Operation aborted\");\n }\n if (!sandboxContext) {\n throw new Error(\"Sandbox context not configured\");\n }\n if (\n (controller.sandbox.type !== \"image\" && controller.sandbox.type !== \"gondolin\") ||\n !controller.resourceController\n ) {\n throw new Error(\"The sandbox tool only supports image:* and gondolin:* managed sandboxes\");\n }\n\n const containerKey = runtimeResourceKey(controller.sandbox, {\n userId: sandboxContext.userId,\n conversationId: sandboxContext.conversationId,\n });\n\n if (params.action === \"set\") {\n const limits = normalizeLimits(params);\n const status = await controller.resourceController.setLimits(containerKey, limits);\n return textResult(\n `Updated sandbox limits for ${containerKey}: ${formatLimits(status.limits)}. These temporary limits are cleared when the sandbox runtime stops.`,\n );\n }\n\n const status = controller.resourceController.getLimitStatus(containerKey);\n return textResult(\n `Sandbox limits for ${containerKey}: ${formatLimits(status.limits)}${status.boosted ? \" (boosted)\" : \"\"}.`,\n );\n },\n };\n\n return {\n tool,\n setSandboxContext: (context: SandboxToolContext) => {\n sandboxContext = context;\n },\n };\n}\n\nfunction normalizeLimits(params: SandboxToolParams): ResourceLimits {\n const cpus = normalizeLimitValue(\"cpus\", params.cpus);\n const memory = normalizeLimitValue(\"memory\", params.memory);\n if (!cpus && !memory) {\n throw new Error(\"action=set requires cpus and/or memory\");\n }\n return { ...(cpus ? { cpus } : {}), ...(memory ? { memory } : {}) };\n}\n\nfunction normalizeLimitValue(name: string, value: string | undefined): string | undefined {\n if (value === undefined) return undefined;\n const trimmed = value.trim();\n if (!trimmed) return undefined;\n if (!/^[A-Za-z0-9_.-]+$/.test(trimmed)) {\n throw new Error(`${name} must not contain whitespace or shell metacharacters`);\n }\n return trimmed;\n}\n\nfunction formatLimits(limits: ResourceLimits | undefined): string {\n return `CPU ${limits?.cpus ?? \"unlimited\"} / Memory ${limits?.memory ?? \"unlimited\"}`;\n}\n\nfunction textResult(text: string): {\n content: Array<{ type: \"text\"; text: string }>;\n details: undefined;\n} {\n return { content: [{ type: \"text\", text }], details: undefined };\n}\n"]}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Process-wide subagent fan-out account. The per-conversation queues
|
|
3
|
+
* serialize agent runs, and each run's subagent tool bounds its own fan-out
|
|
4
|
+
* — but without a shared ceiling, N busy conversations hold N × per-run-cap
|
|
5
|
+
* live subagent sessions. Every subagent launch draws a slot from one shared
|
|
6
|
+
* pool; the per-run cap and this global ceiling are the two bounds, enforced
|
|
7
|
+
* where each concrete subagent session is launched.
|
|
8
|
+
*/
|
|
9
|
+
/** Default process-wide ceiling on concurrently live subagent sessions. */
|
|
10
|
+
export declare const DEFAULT_GLOBAL_SUBAGENT_SLOTS = 8;
|
|
11
|
+
/** Async slot pool: at most `capacity` concurrent holders, FIFO waiters. */
|
|
12
|
+
export declare class SubagentSlotPool {
|
|
13
|
+
readonly capacity: number;
|
|
14
|
+
private held;
|
|
15
|
+
private waiters;
|
|
16
|
+
constructor(capacity: number);
|
|
17
|
+
/** Currently held slots (for tests and capacity reporting). */
|
|
18
|
+
get inFlight(): number;
|
|
19
|
+
/**
|
|
20
|
+
* Resolve with a release function once a slot frees up. Call the release
|
|
21
|
+
* exactly once; releasing hands the slot to the oldest waiter.
|
|
22
|
+
*/
|
|
23
|
+
acquire(signal?: AbortSignal): Promise<() => void>;
|
|
24
|
+
private releaser;
|
|
25
|
+
}
|
|
26
|
+
/** A pool that never blocks — the default when no shared ceiling is wired. */
|
|
27
|
+
export declare function unboundedSlotPool(): SubagentSlotPool;
|
|
28
|
+
//# sourceMappingURL=subagent-slots.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subagent-slots.d.ts","sourceRoot":"","sources":["../../src/tools/subagent-slots.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,2EAA2E;AAC3E,eAAO,MAAM,6BAA6B,IAAI,CAAC;AAE/C,4EAA4E;AAC5E,qBAAa,gBAAgB;IAQf,QAAQ,CAAC,QAAQ,EAAE,MAAM;IAPrC,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,OAAO,CAIP;IAER,YAAqB,QAAQ,EAAE,MAAM,EAIpC;IAED,+DAA+D;IAC/D,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED;;;OAGG;IACG,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,CAiBvD;IAED,OAAO,CAAC,QAAQ;CAcjB;AAED,8EAA8E;AAC9E,wBAAgB,iBAAiB,IAAI,gBAAgB,CAEpD"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Process-wide subagent fan-out account. The per-conversation queues
|
|
3
|
+
* serialize agent runs, and each run's subagent tool bounds its own fan-out
|
|
4
|
+
* — but without a shared ceiling, N busy conversations hold N × per-run-cap
|
|
5
|
+
* live subagent sessions. Every subagent launch draws a slot from one shared
|
|
6
|
+
* pool; the per-run cap and this global ceiling are the two bounds, enforced
|
|
7
|
+
* where each concrete subagent session is launched.
|
|
8
|
+
*/
|
|
9
|
+
function abortError() {
|
|
10
|
+
return new DOMException("The operation was aborted", "AbortError");
|
|
11
|
+
}
|
|
12
|
+
/** Default process-wide ceiling on concurrently live subagent sessions. */
|
|
13
|
+
export const DEFAULT_GLOBAL_SUBAGENT_SLOTS = 8;
|
|
14
|
+
/** Async slot pool: at most `capacity` concurrent holders, FIFO waiters. */
|
|
15
|
+
export class SubagentSlotPool {
|
|
16
|
+
constructor(capacity) {
|
|
17
|
+
this.capacity = capacity;
|
|
18
|
+
this.held = 0;
|
|
19
|
+
this.waiters = [];
|
|
20
|
+
if (!(capacity >= 1)) {
|
|
21
|
+
throw new Error(`SubagentSlotPool capacity must be >= 1, got ${capacity}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/** Currently held slots (for tests and capacity reporting). */
|
|
25
|
+
get inFlight() {
|
|
26
|
+
return this.held;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Resolve with a release function once a slot frees up. Call the release
|
|
30
|
+
* exactly once; releasing hands the slot to the oldest waiter.
|
|
31
|
+
*/
|
|
32
|
+
async acquire(signal) {
|
|
33
|
+
if (signal?.aborted)
|
|
34
|
+
throw abortError();
|
|
35
|
+
if (this.held < this.capacity) {
|
|
36
|
+
this.held += 1;
|
|
37
|
+
return this.releaser();
|
|
38
|
+
}
|
|
39
|
+
return new Promise((resolve, reject) => {
|
|
40
|
+
const waiter = { resolve, signal };
|
|
41
|
+
waiter.onAbort = () => {
|
|
42
|
+
const index = this.waiters.indexOf(waiter);
|
|
43
|
+
if (index < 0)
|
|
44
|
+
return;
|
|
45
|
+
this.waiters.splice(index, 1);
|
|
46
|
+
reject(abortError());
|
|
47
|
+
};
|
|
48
|
+
signal?.addEventListener("abort", waiter.onAbort, { once: true });
|
|
49
|
+
this.waiters.push(waiter);
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
releaser() {
|
|
53
|
+
let released = false;
|
|
54
|
+
return () => {
|
|
55
|
+
if (released)
|
|
56
|
+
return;
|
|
57
|
+
released = true;
|
|
58
|
+
const next = this.waiters.shift();
|
|
59
|
+
if (next) {
|
|
60
|
+
next.signal?.removeEventListener("abort", next.onAbort);
|
|
61
|
+
next.resolve(this.releaser());
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
this.held -= 1;
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/** A pool that never blocks — the default when no shared ceiling is wired. */
|
|
69
|
+
export function unboundedSlotPool() {
|
|
70
|
+
return new SubagentSlotPool(Number.MAX_SAFE_INTEGER);
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=subagent-slots.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subagent-slots.js","sourceRoot":"","sources":["../../src/tools/subagent-slots.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,SAAS,UAAU;IACjB,OAAO,IAAI,YAAY,CAAC,2BAA2B,EAAE,YAAY,CAAC,CAAC;AACrE,CAAC;AAED,2EAA2E;AAC3E,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,CAAC;AAE/C,4EAA4E;AAC5E,MAAM,OAAO,gBAAgB;IAQ3B,YAAqB,QAAgB;QAAhB,aAAQ,GAAR,QAAQ,CAAQ;QAP7B,SAAI,GAAG,CAAC,CAAC;QACT,YAAO,GAIV,EAAE,CAAC;QAGN,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,+CAA+C,QAAQ,EAAE,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;IAED,+DAA+D;IAC/D,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO,CAAC,MAAoB;QAChC,IAAI,MAAM,EAAE,OAAO;YAAE,MAAM,UAAU,EAAE,CAAC;QACxC,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC9B,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;YACf,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;QACzB,CAAC;QACD,OAAO,IAAI,OAAO,CAAa,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACjD,MAAM,MAAM,GAAkC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;YAClE,MAAM,CAAC,OAAO,GAAG,GAAG,EAAE;gBACpB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBAC3C,IAAI,KAAK,GAAG,CAAC;oBAAE,OAAO;gBACtB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBAC9B,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;YACvB,CAAC,CAAC;YACF,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAClE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,QAAQ;QACd,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,OAAO,GAAG,EAAE;YACV,IAAI,QAAQ;gBAAE,OAAO;YACrB,QAAQ,GAAG,IAAI,CAAC;YAChB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAClC,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,OAAQ,CAAC,CAAC;gBACzD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAC9B,OAAO;YACT,CAAC;YACD,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;QACjB,CAAC,CAAC;IACJ,CAAC;CACF;AAED,8EAA8E;AAC9E,MAAM,UAAU,iBAAiB;IAC/B,OAAO,IAAI,gBAAgB,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;AACvD,CAAC","sourcesContent":["/**\n * Process-wide subagent fan-out account. The per-conversation queues\n * serialize agent runs, and each run's subagent tool bounds its own fan-out\n * — but without a shared ceiling, N busy conversations hold N × per-run-cap\n * live subagent sessions. Every subagent launch draws a slot from one shared\n * pool; the per-run cap and this global ceiling are the two bounds, enforced\n * where each concrete subagent session is launched.\n */\n\nfunction abortError(): Error {\n return new DOMException(\"The operation was aborted\", \"AbortError\");\n}\n\n/** Default process-wide ceiling on concurrently live subagent sessions. */\nexport const DEFAULT_GLOBAL_SUBAGENT_SLOTS = 8;\n\n/** Async slot pool: at most `capacity` concurrent holders, FIFO waiters. */\nexport class SubagentSlotPool {\n private held = 0;\n private waiters: Array<{\n resolve: (release: () => void) => void;\n signal?: AbortSignal;\n onAbort?: () => void;\n }> = [];\n\n constructor(readonly capacity: number) {\n if (!(capacity >= 1)) {\n throw new Error(`SubagentSlotPool capacity must be >= 1, got ${capacity}`);\n }\n }\n\n /** Currently held slots (for tests and capacity reporting). */\n get inFlight(): number {\n return this.held;\n }\n\n /**\n * Resolve with a release function once a slot frees up. Call the release\n * exactly once; releasing hands the slot to the oldest waiter.\n */\n async acquire(signal?: AbortSignal): Promise<() => void> {\n if (signal?.aborted) throw abortError();\n if (this.held < this.capacity) {\n this.held += 1;\n return this.releaser();\n }\n return new Promise<() => void>((resolve, reject) => {\n const waiter: (typeof this.waiters)[number] = { resolve, signal };\n waiter.onAbort = () => {\n const index = this.waiters.indexOf(waiter);\n if (index < 0) return;\n this.waiters.splice(index, 1);\n reject(abortError());\n };\n signal?.addEventListener(\"abort\", waiter.onAbort, { once: true });\n this.waiters.push(waiter);\n });\n }\n\n private releaser(): () => void {\n let released = false;\n return () => {\n if (released) return;\n released = true;\n const next = this.waiters.shift();\n if (next) {\n next.signal?.removeEventListener(\"abort\", next.onAbort!);\n next.resolve(this.releaser());\n return;\n }\n this.held -= 1;\n };\n }\n}\n\n/** A pool that never blocks — the default when no shared ceiling is wired. */\nexport function unboundedSlotPool(): SubagentSlotPool {\n return new SubagentSlotPool(Number.MAX_SAFE_INTEGER);\n}\n"]}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { AgentTool } from "@earendil-works/pi-agent-core";
|
|
2
|
+
import { type TSchema } from "@sinclair/typebox";
|
|
3
|
+
import type { SubagentRunOutput, SubagentRunRequest, SubagentRunResult } from "../harness/types.js";
|
|
4
|
+
declare const subagentSchema: import("@sinclair/typebox").TObject<{
|
|
5
|
+
parentContext: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
|
|
6
|
+
mode: import("@sinclair/typebox").TLiteral<"normalized">;
|
|
7
|
+
recentTurns: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
|
|
8
|
+
}>>;
|
|
9
|
+
outputSchema: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRecord<import("@sinclair/typebox").TString, import("@sinclair/typebox").TUnknown>>;
|
|
10
|
+
budget: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
|
|
11
|
+
maxTurns: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
|
|
12
|
+
maxTokens: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
|
|
13
|
+
maxCostUsd: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
14
|
+
maxDurationMs: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
|
|
15
|
+
}>>;
|
|
16
|
+
task: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
17
|
+
profile: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
18
|
+
label: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
19
|
+
input: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnknown>;
|
|
20
|
+
tasks: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
|
|
21
|
+
task: import("@sinclair/typebox").TString;
|
|
22
|
+
profile: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
23
|
+
label: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
24
|
+
input: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnknown>;
|
|
25
|
+
}>>>;
|
|
26
|
+
dag: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
|
|
27
|
+
nodes: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
|
|
28
|
+
task: import("@sinclair/typebox").TString;
|
|
29
|
+
profile: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
30
|
+
label: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
31
|
+
input: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnknown>;
|
|
32
|
+
id: import("@sinclair/typebox").TString;
|
|
33
|
+
dependsOn: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
|
|
34
|
+
}>>;
|
|
35
|
+
maxConcurrency: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
|
|
36
|
+
}>>;
|
|
37
|
+
}>;
|
|
38
|
+
type RunSubagent = <TOutputSchema extends TSchema | undefined = undefined>(request: SubagentRunRequest<TOutputSchema>) => Promise<SubagentRunResult<SubagentRunOutput<TOutputSchema>>>;
|
|
39
|
+
/** What the model needs to choose a profile: what it is, and what it can do. */
|
|
40
|
+
interface SubagentProfileMenuEntry {
|
|
41
|
+
description: string;
|
|
42
|
+
tools?: string[];
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Create the normal agent's bounded subagent delegation and DAG tool.
|
|
46
|
+
* `globalSlots` is the process-wide fan-out account shared across every
|
|
47
|
+
* conversation's tool instance; omitted, fan-out is bounded per run only.
|
|
48
|
+
*
|
|
49
|
+
* `profiles` must be non-empty: it is both the model-facing menu and the only
|
|
50
|
+
* way to grant a subagent any capability at all.
|
|
51
|
+
*/
|
|
52
|
+
export declare function createSubagentTool(runSubagent: RunSubagent, profiles: ReadonlyMap<string, SubagentProfileMenuEntry>): AgentTool<typeof subagentSchema>;
|
|
53
|
+
export {};
|
|
54
|
+
//# sourceMappingURL=subagent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subagent.d.ts","sourceRoot":"","sources":["../../src/tools/subagent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAA2B,MAAM,+BAA+B,CAAC;AACxF,OAAO,EAAqB,KAAK,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AA2HpG,QAAA,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAA0B,CAAC;AAM/C,KAAK,WAAW,GAAG,CAAC,aAAa,SAAS,OAAO,GAAG,SAAS,GAAG,SAAS,EACvE,OAAO,EAAE,kBAAkB,CAAC,aAAa,CAAC,KACvC,OAAO,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;AAsSlE,gFAAgF;AAChF,UAAU,wBAAwB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAyBD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,wBAAwB,CAAC,GACtD,SAAS,CAAC,OAAO,cAAc,CAAC,CA8ElC"}
|
|
@@ -0,0 +1,411 @@
|
|
|
1
|
+
import { Type } from "@sinclair/typebox";
|
|
2
|
+
import { boundSubagentProgressNode, clampSubagentLabel } from "../subagent-progress.js";
|
|
3
|
+
const MAX_DAG_NODES = 8;
|
|
4
|
+
const MAX_DAG_EDGES = 16;
|
|
5
|
+
const MAX_DAG_DEPTH = 4;
|
|
6
|
+
const MAX_CONCURRENT_SUBAGENTS = 4;
|
|
7
|
+
const MAX_DEPENDENCY_OUTPUT_CHARS = 4000;
|
|
8
|
+
/**
|
|
9
|
+
* Every subagent runs under a named profile: the profile owns the prompt,
|
|
10
|
+
* tool grant, model and budget defaults. Letting the model assemble those
|
|
11
|
+
* per call proved unstable, so the schema deliberately exposes no
|
|
12
|
+
* `systemPrompt`, `tools` or `model` escape hatch — narrowing what the model
|
|
13
|
+
* can get wrong is the point. `budget` survives so the model can propose
|
|
14
|
+
* limits. Token requests may raise the profile allowance; the other fields can
|
|
15
|
+
* only tighten profile defaults.
|
|
16
|
+
*
|
|
17
|
+
* `profileNames` is baked into the schema as an enum to steer the model's
|
|
18
|
+
* choice. TypeBox does not check `enum` on a string, so an unknown name still
|
|
19
|
+
* reaches `validatePlanProfiles`, which names the available profiles.
|
|
20
|
+
*/
|
|
21
|
+
function buildTaskProperties(profileNames) {
|
|
22
|
+
return {
|
|
23
|
+
task: Type.String({ minLength: 1, description: "Self-contained task for a fresh subagent." }),
|
|
24
|
+
profile: Type.Optional(Type.String({
|
|
25
|
+
enum: profileNames,
|
|
26
|
+
description: "Profile this subagent runs under. Required, but a top-level profile covers every task and DAG node that does not set its own.",
|
|
27
|
+
})),
|
|
28
|
+
// No length bound: a label is a display string, and `taskLabel` clamps it.
|
|
29
|
+
// Bounding it in the schema only lets a cosmetic field reject a whole DAG,
|
|
30
|
+
// and validation reports that failure by echoing every node back.
|
|
31
|
+
label: Type.Optional(Type.String({ description: "Short progress label for this subagent." })),
|
|
32
|
+
input: Type.Optional(Type.Unknown({ description: "Optional JSON-serializable structured input for the task." })),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
const sharedProperties = {
|
|
36
|
+
parentContext: Type.Optional(Type.Object({
|
|
37
|
+
mode: Type.Literal("normalized"),
|
|
38
|
+
recentTurns: Type.Optional(Type.Integer({ minimum: 1, maximum: 8, default: 3 })),
|
|
39
|
+
})),
|
|
40
|
+
outputSchema: Type.Optional(Type.Record(Type.String(), Type.Unknown(), {
|
|
41
|
+
description: "Optional TypeBox/JSON Schema applied to every subagent result.",
|
|
42
|
+
})),
|
|
43
|
+
budget: Type.Optional(Type.Object({
|
|
44
|
+
maxTurns: Type.Optional(Type.Integer({ minimum: 1 })),
|
|
45
|
+
maxTokens: Type.Optional(Type.Integer({ minimum: 1 })),
|
|
46
|
+
maxCostUsd: Type.Optional(Type.Number({ minimum: 0 })),
|
|
47
|
+
maxDurationMs: Type.Optional(Type.Integer({ minimum: 1 })),
|
|
48
|
+
}, {
|
|
49
|
+
description: "Sets run budget preferences. maxTokens may raise the profile allowance; other fields can only tighten profile defaults.",
|
|
50
|
+
})),
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* The runtime schema varies only in the `profile` enum, so every instance
|
|
54
|
+
* shares one static type and `subagentSchema` below can stand in for it.
|
|
55
|
+
*/
|
|
56
|
+
function buildSubagentSchema(profileNames) {
|
|
57
|
+
const taskProperties = buildTaskProperties(profileNames);
|
|
58
|
+
return Type.Object({
|
|
59
|
+
task: Type.Optional(taskProperties.task),
|
|
60
|
+
profile: taskProperties.profile,
|
|
61
|
+
label: taskProperties.label,
|
|
62
|
+
input: taskProperties.input,
|
|
63
|
+
tasks: Type.Optional(Type.Array(Type.Object(taskProperties), {
|
|
64
|
+
minItems: 1,
|
|
65
|
+
maxItems: MAX_DAG_NODES,
|
|
66
|
+
description: "Independent subagent tasks executed concurrently; results preserve input order.",
|
|
67
|
+
})),
|
|
68
|
+
dag: Type.Optional(Type.Object({
|
|
69
|
+
nodes: Type.Array(Type.Object({
|
|
70
|
+
id: Type.String({
|
|
71
|
+
pattern: "^[A-Za-z0-9_-]+$",
|
|
72
|
+
maxLength: 64,
|
|
73
|
+
description: "Unique stable node id used by dependsOn.",
|
|
74
|
+
}),
|
|
75
|
+
...taskProperties,
|
|
76
|
+
dependsOn: Type.Optional(Type.Array(Type.String(), { maxItems: MAX_DAG_NODES })),
|
|
77
|
+
}), { minItems: 1, maxItems: MAX_DAG_NODES }),
|
|
78
|
+
maxConcurrency: Type.Optional(Type.Integer({
|
|
79
|
+
minimum: 1,
|
|
80
|
+
maximum: MAX_CONCURRENT_SUBAGENTS,
|
|
81
|
+
default: MAX_CONCURRENT_SUBAGENTS,
|
|
82
|
+
})),
|
|
83
|
+
})),
|
|
84
|
+
...sharedProperties,
|
|
85
|
+
}, { description: "Provide task, tasks, or dag." });
|
|
86
|
+
}
|
|
87
|
+
const subagentSchema = buildSubagentSchema([]);
|
|
88
|
+
class SubagentProgressTracker {
|
|
89
|
+
constructor(mode, items, onUpdate) {
|
|
90
|
+
this.mode = mode;
|
|
91
|
+
this.items = items;
|
|
92
|
+
this.onUpdate = onUpdate;
|
|
93
|
+
this.states = new Map();
|
|
94
|
+
this.metrics = new Map();
|
|
95
|
+
for (const item of items)
|
|
96
|
+
this.states.set(item.id, "pending");
|
|
97
|
+
}
|
|
98
|
+
update(id, status, metrics) {
|
|
99
|
+
this.states.set(id, status);
|
|
100
|
+
if (metrics)
|
|
101
|
+
this.metrics.set(id, metrics);
|
|
102
|
+
this.emit();
|
|
103
|
+
}
|
|
104
|
+
emit() {
|
|
105
|
+
if (!this.onUpdate)
|
|
106
|
+
return;
|
|
107
|
+
const nodes = this.items.map((item) => boundSubagentProgressNode({
|
|
108
|
+
...item,
|
|
109
|
+
status: this.states.get(item.id) ?? "pending",
|
|
110
|
+
...this.metrics.get(item.id),
|
|
111
|
+
}));
|
|
112
|
+
this.onUpdate({
|
|
113
|
+
content: [],
|
|
114
|
+
details: { progress: { mode: this.mode, nodes } },
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
function taskLabel(task, fallback) {
|
|
119
|
+
return clampSubagentLabel(task.label?.trim() || task.task.trim().slice(0, 48) || fallback);
|
|
120
|
+
}
|
|
121
|
+
function formatOutcome(outcome) {
|
|
122
|
+
if (outcome.status === "budget_exceeded") {
|
|
123
|
+
return `Subagent stopped: budget limit exceeded${outcome.error ? ` (${outcome.error})` : ""}`;
|
|
124
|
+
}
|
|
125
|
+
if (outcome.status !== "completed") {
|
|
126
|
+
return `Subagent ${outcome.status}${outcome.error ? `: ${outcome.error}` : ""}`;
|
|
127
|
+
}
|
|
128
|
+
return typeof outcome.output === "string"
|
|
129
|
+
? outcome.output
|
|
130
|
+
: JSON.stringify(outcome.output, null, 2);
|
|
131
|
+
}
|
|
132
|
+
function buildRequest(task, shared, signal) {
|
|
133
|
+
const outputSchema = shared.outputSchema;
|
|
134
|
+
return {
|
|
135
|
+
task: task.task,
|
|
136
|
+
...(task.profile ? { profile: task.profile } : {}),
|
|
137
|
+
...(task.input !== undefined ? { input: task.input } : {}),
|
|
138
|
+
...(shared.parentContext ? { parentContext: shared.parentContext } : {}),
|
|
139
|
+
...(outputSchema ? { outputSchema } : {}),
|
|
140
|
+
...(shared.budget ? { budget: shared.budget } : {}),
|
|
141
|
+
...(signal ? { signal } : {}),
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
function buildDagWaves(nodes) {
|
|
145
|
+
if (nodes.length === 0 || nodes.length > MAX_DAG_NODES) {
|
|
146
|
+
throw new Error(`Subagent DAG must contain 1-${MAX_DAG_NODES} nodes`);
|
|
147
|
+
}
|
|
148
|
+
const byId = new Map();
|
|
149
|
+
let edgeCount = 0;
|
|
150
|
+
for (const node of nodes) {
|
|
151
|
+
if (!/^[A-Za-z0-9_-]{1,64}$/.test(node.id)) {
|
|
152
|
+
throw new Error(`Invalid subagent DAG node id: ${node.id}`);
|
|
153
|
+
}
|
|
154
|
+
if (byId.has(node.id))
|
|
155
|
+
throw new Error(`Duplicate subagent DAG node id: ${node.id}`);
|
|
156
|
+
byId.set(node.id, node);
|
|
157
|
+
const dependencies = new Set(node.dependsOn ?? []);
|
|
158
|
+
if (dependencies.size !== (node.dependsOn?.length ?? 0)) {
|
|
159
|
+
throw new Error(`Duplicate dependency on subagent DAG node: ${node.id}`);
|
|
160
|
+
}
|
|
161
|
+
edgeCount += dependencies.size;
|
|
162
|
+
}
|
|
163
|
+
if (edgeCount > MAX_DAG_EDGES) {
|
|
164
|
+
throw new Error(`Subagent DAG exceeds ${MAX_DAG_EDGES} dependency edges`);
|
|
165
|
+
}
|
|
166
|
+
for (const node of nodes) {
|
|
167
|
+
for (const dependency of node.dependsOn ?? []) {
|
|
168
|
+
if (!byId.has(dependency)) {
|
|
169
|
+
throw new Error(`Unknown subagent DAG dependency ${dependency} for node ${node.id}`);
|
|
170
|
+
}
|
|
171
|
+
if (dependency === node.id)
|
|
172
|
+
throw new Error(`Subagent DAG node ${node.id} depends on itself`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
const remaining = new Set(nodes.map((node) => node.id));
|
|
176
|
+
const completed = new Set();
|
|
177
|
+
const waves = [];
|
|
178
|
+
while (remaining.size > 0) {
|
|
179
|
+
const wave = nodes.filter((node) => remaining.has(node.id) && (node.dependsOn ?? []).every((id) => completed.has(id)));
|
|
180
|
+
if (wave.length === 0)
|
|
181
|
+
throw new Error("Subagent DAG contains a cycle");
|
|
182
|
+
waves.push(wave);
|
|
183
|
+
if (waves.length > MAX_DAG_DEPTH) {
|
|
184
|
+
throw new Error(`Subagent DAG exceeds maximum depth ${MAX_DAG_DEPTH}`);
|
|
185
|
+
}
|
|
186
|
+
for (const node of wave) {
|
|
187
|
+
remaining.delete(node.id);
|
|
188
|
+
completed.add(node.id);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return waves;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* A top-level `profile` is the default for every task and DAG node, like the
|
|
195
|
+
* other shared params. A fan-out that runs entirely under one profile then
|
|
196
|
+
* names it once instead of repeating it per node.
|
|
197
|
+
*/
|
|
198
|
+
function withDefaultProfile(task, fallback) {
|
|
199
|
+
return task.profile || !fallback ? task : { ...task, profile: fallback };
|
|
200
|
+
}
|
|
201
|
+
function itemForNode(node, defaultProfile) {
|
|
202
|
+
return {
|
|
203
|
+
id: node.id,
|
|
204
|
+
label: clampSubagentLabel(node.label?.trim() || node.id),
|
|
205
|
+
task: withDefaultProfile(node, defaultProfile),
|
|
206
|
+
dependsOn: node.dependsOn ?? [],
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
/** Normalize every tool mode into one plan: nodes, waves, concurrency. */
|
|
210
|
+
function buildPlan(params) {
|
|
211
|
+
const modeCount = [params.task, params.tasks, params.dag].filter((mode) => mode !== undefined).length;
|
|
212
|
+
if (modeCount !== 1) {
|
|
213
|
+
throw new Error("Subagent requires exactly one of task, tasks, or dag");
|
|
214
|
+
}
|
|
215
|
+
if (params.dag !== undefined) {
|
|
216
|
+
const toItem = (node) => itemForNode(node, params.profile);
|
|
217
|
+
const waves = buildDagWaves(params.dag.nodes).map((wave) => wave.map(toItem));
|
|
218
|
+
const requested = params.dag.maxConcurrency ?? MAX_CONCURRENT_SUBAGENTS;
|
|
219
|
+
return {
|
|
220
|
+
mode: "dag",
|
|
221
|
+
items: params.dag.nodes.map(toItem),
|
|
222
|
+
waves,
|
|
223
|
+
concurrency: Math.max(1, Math.min(MAX_CONCURRENT_SUBAGENTS, Math.floor(requested))),
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
if (params.tasks !== undefined) {
|
|
227
|
+
const items = params.tasks.map((task, index) => ({
|
|
228
|
+
id: String(index),
|
|
229
|
+
label: taskLabel(task, String(index + 1)),
|
|
230
|
+
task: withDefaultProfile(task, params.profile),
|
|
231
|
+
dependsOn: [],
|
|
232
|
+
}));
|
|
233
|
+
return { mode: "parallel", items, waves: [items], concurrency: MAX_CONCURRENT_SUBAGENTS };
|
|
234
|
+
}
|
|
235
|
+
if (!params.task)
|
|
236
|
+
throw new Error("Subagent requires task, tasks, or dag");
|
|
237
|
+
const task = { ...params, task: params.task };
|
|
238
|
+
const item = { id: "0", label: taskLabel(task, "subagent"), task, dependsOn: [] };
|
|
239
|
+
return { mode: "single", items: [item], waves: [[item]], concurrency: 1 };
|
|
240
|
+
}
|
|
241
|
+
/** Run `worker` over every item with at most `limit` in flight. */
|
|
242
|
+
async function forEachConcurrent(items, limit, worker) {
|
|
243
|
+
let cursor = 0;
|
|
244
|
+
await Promise.all(Array.from({ length: Math.min(limit, items.length) }, async () => {
|
|
245
|
+
while (cursor < items.length) {
|
|
246
|
+
const index = cursor++;
|
|
247
|
+
const item = items[index];
|
|
248
|
+
if (item === undefined)
|
|
249
|
+
continue;
|
|
250
|
+
await worker(item, index);
|
|
251
|
+
}
|
|
252
|
+
}));
|
|
253
|
+
}
|
|
254
|
+
function dependencyOutput(outcome) {
|
|
255
|
+
if (outcome.status !== "completed")
|
|
256
|
+
return undefined;
|
|
257
|
+
const value = outcome.output;
|
|
258
|
+
const serialized = typeof value === "string" ? value : JSON.stringify(value);
|
|
259
|
+
if (serialized === undefined)
|
|
260
|
+
return null;
|
|
261
|
+
if (serialized.length <= MAX_DEPENDENCY_OUTPUT_CHARS)
|
|
262
|
+
return value;
|
|
263
|
+
// Oversized structured output becomes a marked string — the shape is lost,
|
|
264
|
+
// which the tool description warns downstream consumers about.
|
|
265
|
+
return `${serialized.slice(0, MAX_DEPENDENCY_OUTPUT_CHARS)}\n[truncated]`;
|
|
266
|
+
}
|
|
267
|
+
function planRequest(item, shared, outcomes, signal) {
|
|
268
|
+
if (item.dependsOn.length === 0)
|
|
269
|
+
return buildRequest(item.task, shared, signal);
|
|
270
|
+
const dependencies = Object.fromEntries(item.dependsOn.map((id) => [id, dependencyOutput(outcomes.get(id))]));
|
|
271
|
+
const input = {
|
|
272
|
+
...(item.task.input !== undefined ? { input: item.task.input } : {}),
|
|
273
|
+
dependencies,
|
|
274
|
+
};
|
|
275
|
+
return buildRequest({ ...item.task, input }, shared, signal);
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* One executor for every mode: wave barriers and a per-invocation concurrency
|
|
279
|
+
* bound. Process-wide slots are acquired by the shared runner seam.
|
|
280
|
+
*/
|
|
281
|
+
async function runWaves(plan, shared, runSubagent, progress, signal) {
|
|
282
|
+
const outcomes = new Map();
|
|
283
|
+
for (const wave of plan.waves) {
|
|
284
|
+
await forEachConcurrent(wave, plan.concurrency, async (item) => {
|
|
285
|
+
const failedDependency = item.dependsOn.find((id) => outcomes.get(id)?.status !== "completed");
|
|
286
|
+
if (failedDependency) {
|
|
287
|
+
outcomes.set(item.id, {
|
|
288
|
+
id: item.id,
|
|
289
|
+
status: "skipped",
|
|
290
|
+
error: `Dependency ${failedDependency} did not complete`,
|
|
291
|
+
});
|
|
292
|
+
progress.update(item.id, "skipped", {
|
|
293
|
+
reason: `Dependency ${failedDependency} did not complete`,
|
|
294
|
+
});
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
let result;
|
|
298
|
+
progress.update(item.id, "running");
|
|
299
|
+
result = await runSubagent(planRequest(item, shared, outcomes, signal));
|
|
300
|
+
outcomes.set(item.id, { id: item.id, ...result });
|
|
301
|
+
progress.update(item.id, result.status, {
|
|
302
|
+
turns: result.turns,
|
|
303
|
+
toolCalls: result.toolCalls,
|
|
304
|
+
toolCallCounts: result.toolCallCounts,
|
|
305
|
+
tokens: result.tokens,
|
|
306
|
+
costUsd: result.costUsd,
|
|
307
|
+
durationMs: result.durationMs,
|
|
308
|
+
...(result.error ? { reason: result.error } : {}),
|
|
309
|
+
...(result.cleanupPending ? { cleanupPending: true } : {}),
|
|
310
|
+
});
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
return plan.items.map((item) => outcomes.get(item.id));
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* The tool grant belongs in the menu. A description alone reads as a stylistic
|
|
317
|
+
* constraint, so a model will pick a no-tool profile for work that needs tools
|
|
318
|
+
* and then narrate the tool call it could not make.
|
|
319
|
+
*/
|
|
320
|
+
function formatToolGrant(tools) {
|
|
321
|
+
if (!tools)
|
|
322
|
+
return "tools unknown";
|
|
323
|
+
return tools.length === 0 ? "no tools" : `tools: ${tools.join(", ")}`;
|
|
324
|
+
}
|
|
325
|
+
function validatePlanProfiles(plan, availableProfiles) {
|
|
326
|
+
const known = [...availableProfiles].join(", ");
|
|
327
|
+
for (const item of plan.items) {
|
|
328
|
+
const profile = item.task.profile;
|
|
329
|
+
if (!profile) {
|
|
330
|
+
throw new Error(`Subagent ${item.label} must specify a profile (available: ${known})`);
|
|
331
|
+
}
|
|
332
|
+
if (!availableProfiles.has(profile)) {
|
|
333
|
+
throw new Error(`Unknown subagent profile: ${profile} (available: ${known})`);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Create the normal agent's bounded subagent delegation and DAG tool.
|
|
339
|
+
* `globalSlots` is the process-wide fan-out account shared across every
|
|
340
|
+
* conversation's tool instance; omitted, fan-out is bounded per run only.
|
|
341
|
+
*
|
|
342
|
+
* `profiles` must be non-empty: it is both the model-facing menu and the only
|
|
343
|
+
* way to grant a subagent any capability at all.
|
|
344
|
+
*/
|
|
345
|
+
export function createSubagentTool(runSubagent, profiles) {
|
|
346
|
+
if (profiles.size === 0) {
|
|
347
|
+
throw new Error("createSubagentTool requires at least one subagent profile");
|
|
348
|
+
}
|
|
349
|
+
const profileDescription = [...profiles.entries()]
|
|
350
|
+
.map(([name, profile]) => `${name} [${formatToolGrant(profile.tools)}] — ${profile.description}`)
|
|
351
|
+
.join("; ");
|
|
352
|
+
return {
|
|
353
|
+
name: "subagent",
|
|
354
|
+
label: "Subagent",
|
|
355
|
+
description: `Run fresh isolated subagents. Use task for one subagent, tasks for independent concurrent work, or dag.nodes for a bounded dependency graph. At most ${MAX_CONCURRENT_SUBAGENTS} subagents run concurrently. DAG limits: ${MAX_DAG_NODES} nodes, ${MAX_DAG_EDGES} edges, depth ${MAX_DAG_DEPTH}; failed dependencies skip descendants, and dependency outputs larger than ${MAX_DEPENDENCY_OUTPUT_CHARS} characters reach downstream nodes as a truncated string. ` +
|
|
356
|
+
"Subagents are fresh by default; parentContext.mode=normalized can include a sanitized reference snapshot of the active parent run. Nested subagents are not allowed. " +
|
|
357
|
+
`Every task and DAG node must set profile; the profile supplies the prompt, tools, model and budget. Available profiles: ${profileDescription}.`,
|
|
358
|
+
parameters: buildSubagentSchema([...profiles.keys()]),
|
|
359
|
+
execute: async (_toolCallId, params, signal, onUpdate) => {
|
|
360
|
+
const plan = buildPlan(params);
|
|
361
|
+
validatePlanProfiles(plan, new Set(profiles.keys()));
|
|
362
|
+
const progress = new SubagentProgressTracker(plan.mode, plan.items.map(({ id, label, task }) => ({ id, label, profile: task.profile })), onUpdate);
|
|
363
|
+
progress.emit();
|
|
364
|
+
const ordered = await runWaves(plan, params, runSubagent, progress, signal);
|
|
365
|
+
switch (plan.mode) {
|
|
366
|
+
case "dag":
|
|
367
|
+
return {
|
|
368
|
+
content: [
|
|
369
|
+
{
|
|
370
|
+
type: "text",
|
|
371
|
+
text: ordered
|
|
372
|
+
.map((outcome) => `[${outcome.id}] ${formatOutcome(outcome)}`)
|
|
373
|
+
.join("\n\n"),
|
|
374
|
+
},
|
|
375
|
+
],
|
|
376
|
+
details: {
|
|
377
|
+
mode: "dag",
|
|
378
|
+
waves: plan.waves.map((wave) => wave.map((item) => item.id)),
|
|
379
|
+
results: ordered,
|
|
380
|
+
},
|
|
381
|
+
};
|
|
382
|
+
case "parallel": {
|
|
383
|
+
const results = ordered.map(({ id: _id, ...result }) => result);
|
|
384
|
+
return {
|
|
385
|
+
content: [
|
|
386
|
+
{
|
|
387
|
+
type: "text",
|
|
388
|
+
text: results
|
|
389
|
+
.map((result, index) => `[${index + 1}] ${formatOutcome(result)}`)
|
|
390
|
+
.join("\n\n"),
|
|
391
|
+
},
|
|
392
|
+
],
|
|
393
|
+
details: { mode: "parallel", results },
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
case "single": {
|
|
397
|
+
const single = ordered[0];
|
|
398
|
+
if (single === undefined) {
|
|
399
|
+
throw new Error("Subagent plan produced no outcome");
|
|
400
|
+
}
|
|
401
|
+
const { id: _id, ...result } = single;
|
|
402
|
+
return {
|
|
403
|
+
content: [{ type: "text", text: formatOutcome(result) }],
|
|
404
|
+
details: result,
|
|
405
|
+
};
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
},
|
|
409
|
+
};
|
|
410
|
+
}
|
|
411
|
+
//# sourceMappingURL=subagent.js.map
|