@shuyhere/takotako 0.0.1
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/CONTRIBUTING.md +84 -0
- package/LICENSE +21 -0
- package/README.md +171 -0
- package/dist/agents/communication.d.ts +48 -0
- package/dist/agents/communication.d.ts.map +1 -0
- package/dist/agents/communication.js +123 -0
- package/dist/agents/communication.js.map +1 -0
- package/dist/agents/config.d.ts +52 -0
- package/dist/agents/config.d.ts.map +1 -0
- package/dist/agents/config.js +65 -0
- package/dist/agents/config.js.map +1 -0
- package/dist/agents/model-catalog.d.ts +49 -0
- package/dist/agents/model-catalog.d.ts.map +1 -0
- package/dist/agents/model-catalog.js +79 -0
- package/dist/agents/model-catalog.js.map +1 -0
- package/dist/agents/registry.d.ts +71 -0
- package/dist/agents/registry.d.ts.map +1 -0
- package/dist/agents/registry.js +297 -0
- package/dist/agents/registry.js.map +1 -0
- package/dist/agents/roles.d.ts +79 -0
- package/dist/agents/roles.d.ts.map +1 -0
- package/dist/agents/roles.js +174 -0
- package/dist/agents/roles.js.map +1 -0
- package/dist/agents/subagent.d.ts +124 -0
- package/dist/agents/subagent.d.ts.map +1 -0
- package/dist/agents/subagent.js +352 -0
- package/dist/agents/subagent.js.map +1 -0
- package/dist/agents/templates.d.ts +18 -0
- package/dist/agents/templates.d.ts.map +1 -0
- package/dist/agents/templates.js +341 -0
- package/dist/agents/templates.js.map +1 -0
- package/dist/agents/thread-binding.d.ts +77 -0
- package/dist/agents/thread-binding.d.ts.map +1 -0
- package/dist/agents/thread-binding.js +167 -0
- package/dist/agents/thread-binding.js.map +1 -0
- package/dist/auth/agent-profiles.d.ts +46 -0
- package/dist/auth/agent-profiles.d.ts.map +1 -0
- package/dist/auth/agent-profiles.js +97 -0
- package/dist/auth/agent-profiles.js.map +1 -0
- package/dist/auth/allow-from.d.ts +27 -0
- package/dist/auth/allow-from.d.ts.map +1 -0
- package/dist/auth/allow-from.js +118 -0
- package/dist/auth/allow-from.js.map +1 -0
- package/dist/auth/oauth.d.ts +66 -0
- package/dist/auth/oauth.d.ts.map +1 -0
- package/dist/auth/oauth.js +253 -0
- package/dist/auth/oauth.js.map +1 -0
- package/dist/auth/storage.d.ts +69 -0
- package/dist/auth/storage.d.ts.map +1 -0
- package/dist/auth/storage.js +157 -0
- package/dist/auth/storage.js.map +1 -0
- package/dist/cache/file-cache.d.ts +68 -0
- package/dist/cache/file-cache.d.ts.map +1 -0
- package/dist/cache/file-cache.js +176 -0
- package/dist/cache/file-cache.js.map +1 -0
- package/dist/cache/manager.d.ts +69 -0
- package/dist/cache/manager.d.ts.map +1 -0
- package/dist/cache/manager.js +117 -0
- package/dist/cache/manager.js.map +1 -0
- package/dist/cache/symbol-index.d.ts +75 -0
- package/dist/cache/symbol-index.d.ts.map +1 -0
- package/dist/cache/symbol-index.js +267 -0
- package/dist/cache/symbol-index.js.map +1 -0
- package/dist/cache/tool-cache.d.ts +75 -0
- package/dist/cache/tool-cache.d.ts.map +1 -0
- package/dist/cache/tool-cache.js +173 -0
- package/dist/cache/tool-cache.js.map +1 -0
- package/dist/channels/channel.d.ts +156 -0
- package/dist/channels/channel.d.ts.map +1 -0
- package/dist/channels/channel.js +25 -0
- package/dist/channels/channel.js.map +1 -0
- package/dist/channels/cli.d.ts +35 -0
- package/dist/channels/cli.d.ts.map +1 -0
- package/dist/channels/cli.js +94 -0
- package/dist/channels/cli.js.map +1 -0
- package/dist/channels/delivery-queue.d.ts +31 -0
- package/dist/channels/delivery-queue.d.ts.map +1 -0
- package/dist/channels/delivery-queue.js +127 -0
- package/dist/channels/delivery-queue.js.map +1 -0
- package/dist/channels/discord.d.ts +124 -0
- package/dist/channels/discord.d.ts.map +1 -0
- package/dist/channels/discord.js +664 -0
- package/dist/channels/discord.js.map +1 -0
- package/dist/channels/retry.d.ts +31 -0
- package/dist/channels/retry.d.ts.map +1 -0
- package/dist/channels/retry.js +94 -0
- package/dist/channels/retry.js.map +1 -0
- package/dist/channels/telegram.d.ts +69 -0
- package/dist/channels/telegram.d.ts.map +1 -0
- package/dist/channels/telegram.js +499 -0
- package/dist/channels/telegram.js.map +1 -0
- package/dist/channels/tui.d.ts +42 -0
- package/dist/channels/tui.d.ts.map +1 -0
- package/dist/channels/tui.js +126 -0
- package/dist/channels/tui.js.map +1 -0
- package/dist/cli/acp.d.ts +10 -0
- package/dist/cli/acp.d.ts.map +1 -0
- package/dist/cli/acp.js +69 -0
- package/dist/cli/acp.js.map +1 -0
- package/dist/cli/audit.d.ts +11 -0
- package/dist/cli/audit.d.ts.map +1 -0
- package/dist/cli/audit.js +55 -0
- package/dist/cli/audit.js.map +1 -0
- package/dist/cli/cache.d.ts +10 -0
- package/dist/cli/cache.d.ts.map +1 -0
- package/dist/cli/cache.js +77 -0
- package/dist/cli/cache.js.map +1 -0
- package/dist/cli/config.d.ts +5 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.js +168 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/cron.d.ts +5 -0
- package/dist/cli/cron.d.ts.map +1 -0
- package/dist/cli/cron.js +192 -0
- package/dist/cli/cron.js.map +1 -0
- package/dist/cli/extensions.d.ts +5 -0
- package/dist/cli/extensions.d.ts.map +1 -0
- package/dist/cli/extensions.js +53 -0
- package/dist/cli/extensions.js.map +1 -0
- package/dist/cli/logs.d.ts +5 -0
- package/dist/cli/logs.d.ts.map +1 -0
- package/dist/cli/logs.js +49 -0
- package/dist/cli/logs.js.map +1 -0
- package/dist/cli/memory.d.ts +5 -0
- package/dist/cli/memory.d.ts.map +1 -0
- package/dist/cli/memory.js +78 -0
- package/dist/cli/memory.js.map +1 -0
- package/dist/cli/message.d.ts +5 -0
- package/dist/cli/message.d.ts.map +1 -0
- package/dist/cli/message.js +69 -0
- package/dist/cli/message.js.map +1 -0
- package/dist/cli/service.d.ts +14 -0
- package/dist/cli/service.d.ts.map +1 -0
- package/dist/cli/service.js +181 -0
- package/dist/cli/service.js.map +1 -0
- package/dist/cli/symphony.d.ts +5 -0
- package/dist/cli/symphony.d.ts.map +1 -0
- package/dist/cli/symphony.js +114 -0
- package/dist/cli/symphony.js.map +1 -0
- package/dist/cli/update.d.ts +5 -0
- package/dist/cli/update.d.ts.map +1 -0
- package/dist/cli/update.js +48 -0
- package/dist/cli/update.js.map +1 -0
- package/dist/commands/channel-setup.d.ts +31 -0
- package/dist/commands/channel-setup.d.ts.map +1 -0
- package/dist/commands/channel-setup.js +138 -0
- package/dist/commands/channel-setup.js.map +1 -0
- package/dist/commands/dispatch.d.ts +48 -0
- package/dist/commands/dispatch.d.ts.map +1 -0
- package/dist/commands/dispatch.js +68 -0
- package/dist/commands/dispatch.js.map +1 -0
- package/dist/commands/model-picker.d.ts +16 -0
- package/dist/commands/model-picker.d.ts.map +1 -0
- package/dist/commands/model-picker.js +120 -0
- package/dist/commands/model-picker.js.map +1 -0
- package/dist/commands/parser.d.ts +32 -0
- package/dist/commands/parser.d.ts.map +1 -0
- package/dist/commands/parser.js +39 -0
- package/dist/commands/parser.js.map +1 -0
- package/dist/commands/registry.d.ts +76 -0
- package/dist/commands/registry.d.ts.map +1 -0
- package/dist/commands/registry.js +351 -0
- package/dist/commands/registry.js.map +1 -0
- package/dist/commands/skill-commands.d.ts +35 -0
- package/dist/commands/skill-commands.d.ts.map +1 -0
- package/dist/commands/skill-commands.js +61 -0
- package/dist/commands/skill-commands.js.map +1 -0
- package/dist/config/resolve.d.ts +25 -0
- package/dist/config/resolve.d.ts.map +1 -0
- package/dist/config/resolve.js +289 -0
- package/dist/config/resolve.js.map +1 -0
- package/dist/config/schema.d.ts +520 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +123 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/core/agent-loop.d.ts +137 -0
- package/dist/core/agent-loop.d.ts.map +1 -0
- package/dist/core/agent-loop.js +700 -0
- package/dist/core/agent-loop.js.map +1 -0
- package/dist/core/audit.d.ts +87 -0
- package/dist/core/audit.d.ts.map +1 -0
- package/dist/core/audit.js +224 -0
- package/dist/core/audit.js.map +1 -0
- package/dist/core/bootstrap.d.ts +23 -0
- package/dist/core/bootstrap.d.ts.map +1 -0
- package/dist/core/bootstrap.js +162 -0
- package/dist/core/bootstrap.js.map +1 -0
- package/dist/core/context.d.ts +44 -0
- package/dist/core/context.d.ts.map +1 -0
- package/dist/core/context.js +65 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/cron.d.ts +111 -0
- package/dist/core/cron.d.ts.map +1 -0
- package/dist/core/cron.js +284 -0
- package/dist/core/cron.js.map +1 -0
- package/dist/core/exec-approvals.d.ts +50 -0
- package/dist/core/exec-approvals.d.ts.map +1 -0
- package/dist/core/exec-approvals.js +187 -0
- package/dist/core/exec-approvals.js.map +1 -0
- package/dist/core/heartbeat.d.ts +71 -0
- package/dist/core/heartbeat.d.ts.map +1 -0
- package/dist/core/heartbeat.js +214 -0
- package/dist/core/heartbeat.js.map +1 -0
- package/dist/core/message-queue.d.ts +60 -0
- package/dist/core/message-queue.d.ts.map +1 -0
- package/dist/core/message-queue.js +182 -0
- package/dist/core/message-queue.js.map +1 -0
- package/dist/core/network-policy.d.ts +39 -0
- package/dist/core/network-policy.d.ts.map +1 -0
- package/dist/core/network-policy.js +121 -0
- package/dist/core/network-policy.js.map +1 -0
- package/dist/core/progress.d.ts +48 -0
- package/dist/core/progress.d.ts.map +1 -0
- package/dist/core/progress.js +81 -0
- package/dist/core/progress.js.map +1 -0
- package/dist/core/prompt.d.ts +105 -0
- package/dist/core/prompt.d.ts.map +1 -0
- package/dist/core/prompt.js +411 -0
- package/dist/core/prompt.js.map +1 -0
- package/dist/core/pruning.d.ts +40 -0
- package/dist/core/pruning.d.ts.map +1 -0
- package/dist/core/pruning.js +165 -0
- package/dist/core/pruning.js.map +1 -0
- package/dist/core/rate-limiter.d.ts +64 -0
- package/dist/core/rate-limiter.d.ts.map +1 -0
- package/dist/core/rate-limiter.js +142 -0
- package/dist/core/rate-limiter.js.map +1 -0
- package/dist/core/reactions.d.ts +31 -0
- package/dist/core/reactions.d.ts.map +1 -0
- package/dist/core/reactions.js +67 -0
- package/dist/core/reactions.js.map +1 -0
- package/dist/core/retry-queue.d.ts +56 -0
- package/dist/core/retry-queue.d.ts.map +1 -0
- package/dist/core/retry-queue.js +106 -0
- package/dist/core/retry-queue.js.map +1 -0
- package/dist/core/sanitizer.d.ts +38 -0
- package/dist/core/sanitizer.d.ts.map +1 -0
- package/dist/core/sanitizer.js +181 -0
- package/dist/core/sanitizer.js.map +1 -0
- package/dist/core/secret-scanner.d.ts +39 -0
- package/dist/core/secret-scanner.d.ts.map +1 -0
- package/dist/core/secret-scanner.js +96 -0
- package/dist/core/secret-scanner.js.map +1 -0
- package/dist/core/secrets.d.ts +38 -0
- package/dist/core/secrets.d.ts.map +1 -0
- package/dist/core/secrets.js +137 -0
- package/dist/core/secrets.js.map +1 -0
- package/dist/core/security.d.ts +58 -0
- package/dist/core/security.d.ts.map +1 -0
- package/dist/core/security.js +120 -0
- package/dist/core/security.js.map +1 -0
- package/dist/core/self-awareness.d.ts +19 -0
- package/dist/core/self-awareness.d.ts.map +1 -0
- package/dist/core/self-awareness.js +124 -0
- package/dist/core/self-awareness.js.map +1 -0
- package/dist/core/session-init.d.ts +34 -0
- package/dist/core/session-init.d.ts.map +1 -0
- package/dist/core/session-init.js +68 -0
- package/dist/core/session-init.js.map +1 -0
- package/dist/core/streaming.d.ts +82 -0
- package/dist/core/streaming.d.ts.map +1 -0
- package/dist/core/streaming.js +264 -0
- package/dist/core/streaming.js.map +1 -0
- package/dist/core/symphony/orchestrator.d.ts +61 -0
- package/dist/core/symphony/orchestrator.d.ts.map +1 -0
- package/dist/core/symphony/orchestrator.js +476 -0
- package/dist/core/symphony/orchestrator.js.map +1 -0
- package/dist/core/symphony/status.d.ts +11 -0
- package/dist/core/symphony/status.d.ts.map +1 -0
- package/dist/core/symphony/status.js +133 -0
- package/dist/core/symphony/status.js.map +1 -0
- package/dist/core/symphony/types.d.ts +84 -0
- package/dist/core/symphony/types.d.ts.map +1 -0
- package/dist/core/symphony/types.js +5 -0
- package/dist/core/symphony/types.js.map +1 -0
- package/dist/core/symphony/workflow.d.ts +18 -0
- package/dist/core/symphony/workflow.d.ts.map +1 -0
- package/dist/core/symphony/workflow.js +149 -0
- package/dist/core/symphony/workflow.js.map +1 -0
- package/dist/core/symphony/workspace.d.ts +24 -0
- package/dist/core/symphony/workspace.d.ts.map +1 -0
- package/dist/core/symphony/workspace.js +94 -0
- package/dist/core/symphony/workspace.js.map +1 -0
- package/dist/core/thinking.d.ts +27 -0
- package/dist/core/thinking.d.ts.map +1 -0
- package/dist/core/thinking.js +83 -0
- package/dist/core/thinking.js.map +1 -0
- package/dist/core/thread-bindings.d.ts +47 -0
- package/dist/core/thread-bindings.d.ts.map +1 -0
- package/dist/core/thread-bindings.js +94 -0
- package/dist/core/thread-bindings.js.map +1 -0
- package/dist/core/timezone.d.ts +28 -0
- package/dist/core/timezone.d.ts.map +1 -0
- package/dist/core/timezone.js +72 -0
- package/dist/core/timezone.js.map +1 -0
- package/dist/core/tool-loop-detector.d.ts +41 -0
- package/dist/core/tool-loop-detector.d.ts.map +1 -0
- package/dist/core/tool-loop-detector.js +83 -0
- package/dist/core/tool-loop-detector.js.map +1 -0
- package/dist/core/tool-validator.d.ts +44 -0
- package/dist/core/tool-validator.d.ts.map +1 -0
- package/dist/core/tool-validator.js +175 -0
- package/dist/core/tool-validator.js.map +1 -0
- package/dist/core/typing.d.ts +25 -0
- package/dist/core/typing.d.ts.map +1 -0
- package/dist/core/typing.js +48 -0
- package/dist/core/typing.js.map +1 -0
- package/dist/core/usage-tracker.d.ts +66 -0
- package/dist/core/usage-tracker.d.ts.map +1 -0
- package/dist/core/usage-tracker.js +163 -0
- package/dist/core/usage-tracker.js.map +1 -0
- package/dist/daemon/commands.d.ts +16 -0
- package/dist/daemon/commands.d.ts.map +1 -0
- package/dist/daemon/commands.js +445 -0
- package/dist/daemon/commands.js.map +1 -0
- package/dist/daemon/pid.d.ts +30 -0
- package/dist/daemon/pid.d.ts.map +1 -0
- package/dist/daemon/pid.js +62 -0
- package/dist/daemon/pid.js.map +1 -0
- package/dist/doctor/checks/browser.d.ts +9 -0
- package/dist/doctor/checks/browser.d.ts.map +1 -0
- package/dist/doctor/checks/browser.js +54 -0
- package/dist/doctor/checks/browser.js.map +1 -0
- package/dist/doctor/checks/channels.d.ts +9 -0
- package/dist/doctor/checks/channels.d.ts.map +1 -0
- package/dist/doctor/checks/channels.js +90 -0
- package/dist/doctor/checks/channels.js.map +1 -0
- package/dist/doctor/checks/config.d.ts +10 -0
- package/dist/doctor/checks/config.d.ts.map +1 -0
- package/dist/doctor/checks/config.js +89 -0
- package/dist/doctor/checks/config.js.map +1 -0
- package/dist/doctor/checks/memory.d.ts +10 -0
- package/dist/doctor/checks/memory.d.ts.map +1 -0
- package/dist/doctor/checks/memory.js +82 -0
- package/dist/doctor/checks/memory.js.map +1 -0
- package/dist/doctor/checks/permissions.d.ts +9 -0
- package/dist/doctor/checks/permissions.d.ts.map +1 -0
- package/dist/doctor/checks/permissions.js +53 -0
- package/dist/doctor/checks/permissions.js.map +1 -0
- package/dist/doctor/checks/providers.d.ts +10 -0
- package/dist/doctor/checks/providers.d.ts.map +1 -0
- package/dist/doctor/checks/providers.js +93 -0
- package/dist/doctor/checks/providers.js.map +1 -0
- package/dist/doctor/checks/sessions.d.ts +10 -0
- package/dist/doctor/checks/sessions.d.ts.map +1 -0
- package/dist/doctor/checks/sessions.js +86 -0
- package/dist/doctor/checks/sessions.js.map +1 -0
- package/dist/doctor/doctor.d.ts +35 -0
- package/dist/doctor/doctor.d.ts.map +1 -0
- package/dist/doctor/doctor.js +51 -0
- package/dist/doctor/doctor.js.map +1 -0
- package/dist/doctor/repairs.d.ts +14 -0
- package/dist/doctor/repairs.d.ts.map +1 -0
- package/dist/doctor/repairs.js +34 -0
- package/dist/doctor/repairs.js.map +1 -0
- package/dist/gateway/compaction.d.ts +63 -0
- package/dist/gateway/compaction.d.ts.map +1 -0
- package/dist/gateway/compaction.js +235 -0
- package/dist/gateway/compaction.js.map +1 -0
- package/dist/gateway/gateway.d.ts +94 -0
- package/dist/gateway/gateway.d.ts.map +1 -0
- package/dist/gateway/gateway.js +466 -0
- package/dist/gateway/gateway.js.map +1 -0
- package/dist/gateway/lock.d.ts +24 -0
- package/dist/gateway/lock.d.ts.map +1 -0
- package/dist/gateway/lock.js +88 -0
- package/dist/gateway/lock.js.map +1 -0
- package/dist/gateway/protocol.d.ts +117 -0
- package/dist/gateway/protocol.d.ts.map +1 -0
- package/dist/gateway/protocol.js +5 -0
- package/dist/gateway/protocol.js.map +1 -0
- package/dist/gateway/session.d.ts +123 -0
- package/dist/gateway/session.d.ts.map +1 -0
- package/dist/gateway/session.js +573 -0
- package/dist/gateway/session.js.map +1 -0
- package/dist/hooks/hooks.d.ts +18 -0
- package/dist/hooks/hooks.d.ts.map +1 -0
- package/dist/hooks/hooks.js +45 -0
- package/dist/hooks/hooks.js.map +1 -0
- package/dist/hooks/types.d.ts +112 -0
- package/dist/hooks/types.d.ts.map +1 -0
- package/dist/hooks/types.js +23 -0
- package/dist/hooks/types.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2900 -0
- package/dist/index.js.map +1 -0
- package/dist/media/storage.d.ts +25 -0
- package/dist/media/storage.d.ts.map +1 -0
- package/dist/media/storage.js +97 -0
- package/dist/media/storage.js.map +1 -0
- package/dist/memory/embeddings.d.ts +46 -0
- package/dist/memory/embeddings.d.ts.map +1 -0
- package/dist/memory/embeddings.js +118 -0
- package/dist/memory/embeddings.js.map +1 -0
- package/dist/memory/hybrid.d.ts +35 -0
- package/dist/memory/hybrid.d.ts.map +1 -0
- package/dist/memory/hybrid.js +156 -0
- package/dist/memory/hybrid.js.map +1 -0
- package/dist/memory/markdown.d.ts +48 -0
- package/dist/memory/markdown.d.ts.map +1 -0
- package/dist/memory/markdown.js +228 -0
- package/dist/memory/markdown.js.map +1 -0
- package/dist/memory/store.d.ts +88 -0
- package/dist/memory/store.d.ts.map +1 -0
- package/dist/memory/store.js +21 -0
- package/dist/memory/store.js.map +1 -0
- package/dist/memory/vector.d.ts +24 -0
- package/dist/memory/vector.d.ts.map +1 -0
- package/dist/memory/vector.js +63 -0
- package/dist/memory/vector.js.map +1 -0
- package/dist/mods/mod.d.ts +100 -0
- package/dist/mods/mod.d.ts.map +1 -0
- package/dist/mods/mod.js +242 -0
- package/dist/mods/mod.js.map +1 -0
- package/dist/onboard/channels.d.ts +12 -0
- package/dist/onboard/channels.d.ts.map +1 -0
- package/dist/onboard/channels.js +283 -0
- package/dist/onboard/channels.js.map +1 -0
- package/dist/onboard/models.d.ts +13 -0
- package/dist/onboard/models.d.ts.map +1 -0
- package/dist/onboard/models.js +491 -0
- package/dist/onboard/models.js.map +1 -0
- package/dist/onboard/onboard.d.ts +12 -0
- package/dist/onboard/onboard.d.ts.map +1 -0
- package/dist/onboard/onboard.js +1137 -0
- package/dist/onboard/onboard.js.map +1 -0
- package/dist/providers/anthropic.d.ts +83 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +583 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/failover.d.ts +46 -0
- package/dist/providers/failover.d.ts.map +1 -0
- package/dist/providers/failover.js +149 -0
- package/dist/providers/failover.js.map +1 -0
- package/dist/providers/litellm.d.ts +38 -0
- package/dist/providers/litellm.d.ts.map +1 -0
- package/dist/providers/litellm.js +349 -0
- package/dist/providers/litellm.js.map +1 -0
- package/dist/providers/openai.d.ts +28 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +321 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/prompt-cache.d.ts +50 -0
- package/dist/providers/prompt-cache.d.ts.map +1 -0
- package/dist/providers/prompt-cache.js +96 -0
- package/dist/providers/prompt-cache.js.map +1 -0
- package/dist/providers/provider.d.ts +173 -0
- package/dist/providers/provider.d.ts.map +1 -0
- package/dist/providers/provider.js +22 -0
- package/dist/providers/provider.js.map +1 -0
- package/dist/sandbox/config.d.ts +42 -0
- package/dist/sandbox/config.d.ts.map +1 -0
- package/dist/sandbox/config.js +20 -0
- package/dist/sandbox/config.js.map +1 -0
- package/dist/sandbox/container.d.ts +71 -0
- package/dist/sandbox/container.d.ts.map +1 -0
- package/dist/sandbox/container.js +193 -0
- package/dist/sandbox/container.js.map +1 -0
- package/dist/sandbox/sandbox.d.ts +82 -0
- package/dist/sandbox/sandbox.d.ts.map +1 -0
- package/dist/sandbox/sandbox.js +176 -0
- package/dist/sandbox/sandbox.js.map +1 -0
- package/dist/skills/channel-loader.d.ts +18 -0
- package/dist/skills/channel-loader.d.ts.map +1 -0
- package/dist/skills/channel-loader.js +35 -0
- package/dist/skills/channel-loader.js.map +1 -0
- package/dist/skills/extension-loader.d.ts +15 -0
- package/dist/skills/extension-loader.d.ts.map +1 -0
- package/dist/skills/extension-loader.js +63 -0
- package/dist/skills/extension-loader.js.map +1 -0
- package/dist/skills/extension-registry.d.ts +32 -0
- package/dist/skills/extension-registry.d.ts.map +1 -0
- package/dist/skills/extension-registry.js +57 -0
- package/dist/skills/extension-registry.js.map +1 -0
- package/dist/skills/extensions.d.ts +91 -0
- package/dist/skills/extensions.d.ts.map +1 -0
- package/dist/skills/extensions.js +14 -0
- package/dist/skills/extensions.js.map +1 -0
- package/dist/skills/loader.d.ts +64 -0
- package/dist/skills/loader.d.ts.map +1 -0
- package/dist/skills/loader.js +382 -0
- package/dist/skills/loader.js.map +1 -0
- package/dist/skills/marketplace.d.ts +56 -0
- package/dist/skills/marketplace.d.ts.map +1 -0
- package/dist/skills/marketplace.js +183 -0
- package/dist/skills/marketplace.js.map +1 -0
- package/dist/skills/types.d.ts +94 -0
- package/dist/skills/types.d.ts.map +1 -0
- package/dist/skills/types.js +9 -0
- package/dist/skills/types.js.map +1 -0
- package/dist/tools/acp-sessions.d.ts +89 -0
- package/dist/tools/acp-sessions.d.ts.map +1 -0
- package/dist/tools/acp-sessions.js +391 -0
- package/dist/tools/acp-sessions.js.map +1 -0
- package/dist/tools/acp.d.ts +18 -0
- package/dist/tools/acp.d.ts.map +1 -0
- package/dist/tools/acp.js +102 -0
- package/dist/tools/acp.js.map +1 -0
- package/dist/tools/agent-tools.d.ts +24 -0
- package/dist/tools/agent-tools.d.ts.map +1 -0
- package/dist/tools/agent-tools.js +611 -0
- package/dist/tools/agent-tools.js.map +1 -0
- package/dist/tools/browser.d.ts +26 -0
- package/dist/tools/browser.d.ts.map +1 -0
- package/dist/tools/browser.js +242 -0
- package/dist/tools/browser.js.map +1 -0
- package/dist/tools/comms.d.ts +8 -0
- package/dist/tools/comms.d.ts.map +1 -0
- package/dist/tools/comms.js +39 -0
- package/dist/tools/comms.js.map +1 -0
- package/dist/tools/cron-tools.d.ts +9 -0
- package/dist/tools/cron-tools.d.ts.map +1 -0
- package/dist/tools/cron-tools.js +117 -0
- package/dist/tools/cron-tools.js.map +1 -0
- package/dist/tools/exec-safety.d.ts +71 -0
- package/dist/tools/exec-safety.d.ts.map +1 -0
- package/dist/tools/exec-safety.js +141 -0
- package/dist/tools/exec-safety.js.map +1 -0
- package/dist/tools/exec.d.ts +24 -0
- package/dist/tools/exec.d.ts.map +1 -0
- package/dist/tools/exec.js +191 -0
- package/dist/tools/exec.js.map +1 -0
- package/dist/tools/fs.d.ts +15 -0
- package/dist/tools/fs.d.ts.map +1 -0
- package/dist/tools/fs.js +249 -0
- package/dist/tools/fs.js.map +1 -0
- package/dist/tools/git.d.ts +9 -0
- package/dist/tools/git.d.ts.map +1 -0
- package/dist/tools/git.js +56 -0
- package/dist/tools/git.js.map +1 -0
- package/dist/tools/image.d.ts +15 -0
- package/dist/tools/image.d.ts.map +1 -0
- package/dist/tools/image.js +106 -0
- package/dist/tools/image.js.map +1 -0
- package/dist/tools/introspect.d.ts +22 -0
- package/dist/tools/introspect.d.ts.map +1 -0
- package/dist/tools/introspect.js +223 -0
- package/dist/tools/introspect.js.map +1 -0
- package/dist/tools/memory.d.ts +11 -0
- package/dist/tools/memory.d.ts.map +1 -0
- package/dist/tools/memory.js +101 -0
- package/dist/tools/memory.js.map +1 -0
- package/dist/tools/message.d.ts +24 -0
- package/dist/tools/message.d.ts.map +1 -0
- package/dist/tools/message.js +205 -0
- package/dist/tools/message.js.map +1 -0
- package/dist/tools/model.d.ts +14 -0
- package/dist/tools/model.d.ts.map +1 -0
- package/dist/tools/model.js +62 -0
- package/dist/tools/model.js.map +1 -0
- package/dist/tools/policy.d.ts +101 -0
- package/dist/tools/policy.d.ts.map +1 -0
- package/dist/tools/policy.js +168 -0
- package/dist/tools/policy.js.map +1 -0
- package/dist/tools/registry.d.ts +52 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +154 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/search.d.ts +10 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +78 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/session.d.ts +13 -0
- package/dist/tools/session.d.ts.map +1 -0
- package/dist/tools/session.js +142 -0
- package/dist/tools/session.js.map +1 -0
- package/dist/tools/spawn.d.ts +10 -0
- package/dist/tools/spawn.d.ts.map +1 -0
- package/dist/tools/spawn.js +72 -0
- package/dist/tools/spawn.js.map +1 -0
- package/dist/tools/symphony.d.ts +12 -0
- package/dist/tools/symphony.d.ts.map +1 -0
- package/dist/tools/symphony.js +142 -0
- package/dist/tools/symphony.js.map +1 -0
- package/dist/tools/system-tools.d.ts +11 -0
- package/dist/tools/system-tools.d.ts.map +1 -0
- package/dist/tools/system-tools.js +39 -0
- package/dist/tools/system-tools.js.map +1 -0
- package/dist/tools/tool.d.ts +119 -0
- package/dist/tools/tool.d.ts.map +1 -0
- package/dist/tools/tool.js +29 -0
- package/dist/tools/tool.js.map +1 -0
- package/dist/tools/web.d.ts +10 -0
- package/dist/tools/web.d.ts.map +1 -0
- package/dist/tools/web.js +105 -0
- package/dist/tools/web.js.map +1 -0
- package/dist/tui/App.d.ts +43 -0
- package/dist/tui/App.d.ts.map +1 -0
- package/dist/tui/App.js +265 -0
- package/dist/tui/App.js.map +1 -0
- package/dist/tui/bridge.d.ts +40 -0
- package/dist/tui/bridge.d.ts.map +1 -0
- package/dist/tui/bridge.js +29 -0
- package/dist/tui/bridge.js.map +1 -0
- package/dist/tui/components/Header.d.ts +14 -0
- package/dist/tui/components/Header.d.ts.map +1 -0
- package/dist/tui/components/Header.js +7 -0
- package/dist/tui/components/Header.js.map +1 -0
- package/dist/tui/components/InputBar.d.ts +10 -0
- package/dist/tui/components/InputBar.d.ts.map +1 -0
- package/dist/tui/components/InputBar.js +121 -0
- package/dist/tui/components/InputBar.js.map +1 -0
- package/dist/tui/components/MessageList.d.ts +18 -0
- package/dist/tui/components/MessageList.d.ts.map +1 -0
- package/dist/tui/components/MessageList.js +34 -0
- package/dist/tui/components/MessageList.js.map +1 -0
- package/dist/tui/components/Spinner.d.ts +9 -0
- package/dist/tui/components/Spinner.d.ts.map +1 -0
- package/dist/tui/components/Spinner.js +18 -0
- package/dist/tui/components/Spinner.js.map +1 -0
- package/dist/tui/components/StatusBar.d.ts +16 -0
- package/dist/tui/components/StatusBar.d.ts.map +1 -0
- package/dist/tui/components/StatusBar.js +15 -0
- package/dist/tui/components/StatusBar.js.map +1 -0
- package/dist/tui/components/ToolCallBox.d.ts +12 -0
- package/dist/tui/components/ToolCallBox.d.ts.map +1 -0
- package/dist/tui/components/ToolCallBox.js +12 -0
- package/dist/tui/components/ToolCallBox.js.map +1 -0
- package/dist/tui/theme.d.ts +58 -0
- package/dist/tui/theme.d.ts.map +1 -0
- package/dist/tui/theme.js +80 -0
- package/dist/tui/theme.js.map +1 -0
- package/dist/utils/logger.d.ts +16 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +70 -0
- package/dist/utils/logger.js.map +1 -0
- package/docs/DEVELOPMENT.md +74 -0
- package/docs/INSTALL.md +161 -0
- package/docs/USAGE.md +94 -0
- package/docs/architecture.md +128 -0
- package/docs/channels.md +140 -0
- package/docs/configuration.md +209 -0
- package/docs/io-system.md +430 -0
- package/docs/providers.md +99 -0
- package/docs/skill-channels.md +113 -0
- package/docs/skills.md +246 -0
- package/package.json +89 -0
- package/skills/acp-router/SKILL.md +41 -0
- package/skills/acp-router/tools/acp-router.mjs +239 -0
- package/skills/find-skills/SKILL.md +133 -0
- package/skills/security-audit/SKILL.md +181 -0
- package/skills/security-audit/audit.sh +67 -0
- package/skills/skill-creator/SKILL.md +479 -0
- package/skills/skill-security-audit/.clawhub/origin.json +7 -0
- package/skills/skill-security-audit/SKILL.md +196 -0
- package/skills/skill-security-audit/_meta.json +6 -0
- package/skills/skill-security-audit/references/prompt-injection-patterns.md +276 -0
- package/skills/skill-security-audit/references/vulnerability-patterns.md +348 -0
- package/skills/symphony/README.md +53 -0
- package/skills/symphony/SKILL.md +75 -0
- package/skills/symphony/tools/symphony-orchestrator.ts +8 -0
- package/tako.example.json +33 -0
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent permission roles for Tako.
|
|
3
|
+
*
|
|
4
|
+
* The root agent (created at first onboarding) has admin permissions.
|
|
5
|
+
* Sub-agents are created with a specific role that limits what they can do.
|
|
6
|
+
*
|
|
7
|
+
* Predefined roles:
|
|
8
|
+
* admin — full control: create/delete agents, manage roles, all tools, config
|
|
9
|
+
* operator — manage agents and run all tools, but can't change roles or config
|
|
10
|
+
* editor — read/write files, safe commands, no exec or config changes
|
|
11
|
+
* standard — use all tools, can spawn sub-agents from its allowlist
|
|
12
|
+
* viewer — read-only access, search and memory tools
|
|
13
|
+
* restricted — limited tools (no exec, no file write outside workspace)
|
|
14
|
+
* readonly — can only read files and respond, no side effects
|
|
15
|
+
*
|
|
16
|
+
* Per-user role overrides: map platform user IDs to specific roles.
|
|
17
|
+
* Config: agents.list[].roles: { default: RoleName; users?: Record<string, RoleName> }
|
|
18
|
+
*
|
|
19
|
+
* Custom roles can be created by the root agent at runtime.
|
|
20
|
+
*/
|
|
21
|
+
/** Predefined roles. */
|
|
22
|
+
export const PREDEFINED_ROLES = {
|
|
23
|
+
admin: {
|
|
24
|
+
name: 'admin',
|
|
25
|
+
description: 'Full control — create agents, manage roles, all tools, config',
|
|
26
|
+
allowTools: [],
|
|
27
|
+
denyTools: [],
|
|
28
|
+
canCreateAgents: true,
|
|
29
|
+
canDeleteAgents: true,
|
|
30
|
+
canManageRoles: true,
|
|
31
|
+
canEditConfig: true,
|
|
32
|
+
canExec: true,
|
|
33
|
+
canWriteGlobal: true,
|
|
34
|
+
canBindChannels: true,
|
|
35
|
+
},
|
|
36
|
+
operator: {
|
|
37
|
+
name: 'operator',
|
|
38
|
+
description: 'Manage agents and run all tools, but no role/config changes',
|
|
39
|
+
allowTools: [],
|
|
40
|
+
denyTools: [],
|
|
41
|
+
canCreateAgents: true,
|
|
42
|
+
canDeleteAgents: false,
|
|
43
|
+
canManageRoles: false,
|
|
44
|
+
canEditConfig: false,
|
|
45
|
+
canExec: true,
|
|
46
|
+
canWriteGlobal: true,
|
|
47
|
+
canBindChannels: true,
|
|
48
|
+
},
|
|
49
|
+
editor: {
|
|
50
|
+
name: 'editor',
|
|
51
|
+
description: 'Read/write files and safe commands — no exec, no config changes',
|
|
52
|
+
allowTools: ['read', 'write', 'edit', 'list_directory', 'memory_search', 'memory_write',
|
|
53
|
+
'web_search', 'web_fetch', 'apply_patch'],
|
|
54
|
+
denyTools: ['exec', 'shell', 'exec_command', 'cron_add', 'cron_remove',
|
|
55
|
+
'agents_add', 'agents_remove'],
|
|
56
|
+
canCreateAgents: false,
|
|
57
|
+
canDeleteAgents: false,
|
|
58
|
+
canManageRoles: false,
|
|
59
|
+
canEditConfig: false,
|
|
60
|
+
canExec: false,
|
|
61
|
+
canWriteGlobal: false,
|
|
62
|
+
canBindChannels: false,
|
|
63
|
+
},
|
|
64
|
+
standard: {
|
|
65
|
+
name: 'standard',
|
|
66
|
+
description: 'All tools, can spawn sub-agents from allowlist',
|
|
67
|
+
allowTools: [],
|
|
68
|
+
denyTools: [],
|
|
69
|
+
canCreateAgents: false,
|
|
70
|
+
canDeleteAgents: false,
|
|
71
|
+
canManageRoles: false,
|
|
72
|
+
canEditConfig: false,
|
|
73
|
+
canExec: true,
|
|
74
|
+
canWriteGlobal: false,
|
|
75
|
+
canBindChannels: false,
|
|
76
|
+
},
|
|
77
|
+
viewer: {
|
|
78
|
+
name: 'viewer',
|
|
79
|
+
description: 'Read-only with search — can read files, search, and use memory',
|
|
80
|
+
allowTools: ['read', 'list_directory', 'memory_search', 'web_search', 'web_fetch'],
|
|
81
|
+
denyTools: ['exec', 'shell', 'write', 'edit', 'exec_command', 'apply_patch',
|
|
82
|
+
'cron_add', 'cron_remove', 'agents_add', 'agents_remove', 'memory_write'],
|
|
83
|
+
canCreateAgents: false,
|
|
84
|
+
canDeleteAgents: false,
|
|
85
|
+
canManageRoles: false,
|
|
86
|
+
canEditConfig: false,
|
|
87
|
+
canExec: false,
|
|
88
|
+
canWriteGlobal: false,
|
|
89
|
+
canBindChannels: false,
|
|
90
|
+
},
|
|
91
|
+
restricted: {
|
|
92
|
+
name: 'restricted',
|
|
93
|
+
description: 'Limited tools — no exec, no writes outside workspace',
|
|
94
|
+
allowTools: [],
|
|
95
|
+
denyTools: ['exec', 'shell', 'exec_command'],
|
|
96
|
+
canCreateAgents: false,
|
|
97
|
+
canDeleteAgents: false,
|
|
98
|
+
canManageRoles: false,
|
|
99
|
+
canEditConfig: false,
|
|
100
|
+
canExec: false,
|
|
101
|
+
canWriteGlobal: false,
|
|
102
|
+
canBindChannels: false,
|
|
103
|
+
},
|
|
104
|
+
readonly: {
|
|
105
|
+
name: 'readonly',
|
|
106
|
+
description: 'Read-only — can read files and respond, no side effects',
|
|
107
|
+
allowTools: ['read', 'list_directory', 'memory_search', 'web_search', 'web_fetch'],
|
|
108
|
+
denyTools: ['exec', 'shell', 'write', 'edit', 'exec_command', 'cron_add', 'cron_remove', 'agents_add', 'agents_remove'],
|
|
109
|
+
canCreateAgents: false,
|
|
110
|
+
canDeleteAgents: false,
|
|
111
|
+
canManageRoles: false,
|
|
112
|
+
canEditConfig: false,
|
|
113
|
+
canExec: false,
|
|
114
|
+
canWriteGlobal: false,
|
|
115
|
+
canBindChannels: false,
|
|
116
|
+
},
|
|
117
|
+
};
|
|
118
|
+
/** Check if a tool call is allowed for a given role. */
|
|
119
|
+
export function isToolAllowed(role, toolName) {
|
|
120
|
+
// Deny list takes priority
|
|
121
|
+
if (role.denyTools.length > 0 && role.denyTools.includes(toolName))
|
|
122
|
+
return false;
|
|
123
|
+
// If allow list is specified (non-empty), tool must be in it
|
|
124
|
+
if (role.allowTools.length > 0)
|
|
125
|
+
return role.allowTools.includes(toolName);
|
|
126
|
+
// Empty allow = all allowed
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
129
|
+
/** Get a role by name (predefined or custom). */
|
|
130
|
+
export function getRole(name, customRoles) {
|
|
131
|
+
return PREDEFINED_ROLES[name] ?? customRoles?.[name] ?? null;
|
|
132
|
+
}
|
|
133
|
+
/** List all available role names. */
|
|
134
|
+
export function listRoles(customRoles) {
|
|
135
|
+
return [...Object.keys(PREDEFINED_ROLES), ...Object.keys(customRoles ?? {})];
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Resolve the effective role for a user interacting with an agent.
|
|
139
|
+
*
|
|
140
|
+
* Resolution order:
|
|
141
|
+
* 1. Per-user override in AgentRoleConfig.users
|
|
142
|
+
* 2. Agent's default role (AgentRoleConfig.default)
|
|
143
|
+
* 3. Fallback to 'standard'
|
|
144
|
+
*/
|
|
145
|
+
export function resolveUserRole(roleConfig, userId, customRoles) {
|
|
146
|
+
if (!roleConfig) {
|
|
147
|
+
return PREDEFINED_ROLES['standard'];
|
|
148
|
+
}
|
|
149
|
+
// Check per-user override
|
|
150
|
+
if (userId && roleConfig.users?.[userId]) {
|
|
151
|
+
const role = getRole(roleConfig.users[userId], customRoles);
|
|
152
|
+
if (role)
|
|
153
|
+
return role;
|
|
154
|
+
}
|
|
155
|
+
// Use agent default
|
|
156
|
+
const role = getRole(roleConfig.default, customRoles);
|
|
157
|
+
return role ?? PREDEFINED_ROLES['standard'];
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Check if a tool call is allowed for a specific user on a specific agent.
|
|
161
|
+
* Convenience function that resolves the role and checks in one call.
|
|
162
|
+
*/
|
|
163
|
+
export function checkToolPermission(toolName, roleConfig, userId, customRoles) {
|
|
164
|
+
const role = resolveUserRole(roleConfig, userId, customRoles);
|
|
165
|
+
if (!isToolAllowed(role, toolName)) {
|
|
166
|
+
return {
|
|
167
|
+
allowed: false,
|
|
168
|
+
role,
|
|
169
|
+
reason: `Role '${role.name}' does not allow tool '${toolName}'`,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
return { allowed: true, role };
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=roles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roles.js","sourceRoot":"","sources":["../../src/agents/roles.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sub-agent orchestration — spawn, track, steer, and kill sub-agents.
|
|
3
|
+
*
|
|
4
|
+
* Supports two modes:
|
|
5
|
+
* - "run" (one-shot): Execute a task, return result, clean up
|
|
6
|
+
* - "session" (persistent): Persistent agent that can receive follow-up messages
|
|
7
|
+
*
|
|
8
|
+
* reference runtime-aligned features:
|
|
9
|
+
* - Configurable timeout per spawn (default 5min for run, none for session)
|
|
10
|
+
* - Completion announcements: push results to parent session
|
|
11
|
+
* - Automatic cleanup: remove completed run-mode sessions after result retrieval
|
|
12
|
+
* - Session key routing: agent:<id>:<mode>:<uuid> format
|
|
13
|
+
* - Thread-bound persistence: session mode runs persist across restarts
|
|
14
|
+
*/
|
|
15
|
+
import type { AgentLoop } from '../core/agent-loop.js';
|
|
16
|
+
import type { SessionManager } from '../gateway/session.js';
|
|
17
|
+
import type { AgentDescriptor } from './config.js';
|
|
18
|
+
/** Sub-agent run mode. */
|
|
19
|
+
export type SubAgentMode = 'run' | 'session';
|
|
20
|
+
/** Sub-agent status. */
|
|
21
|
+
export type SubAgentStatus = 'running' | 'completed' | 'failed' | 'killed' | 'timeout';
|
|
22
|
+
/** Options for spawning a sub-agent. */
|
|
23
|
+
export interface SpawnOptions {
|
|
24
|
+
/** Task description / initial message. */
|
|
25
|
+
task: string;
|
|
26
|
+
/** Agent ID to use (defaults to parent's agent). */
|
|
27
|
+
agentId?: string;
|
|
28
|
+
/** Run mode: one-shot or persistent. */
|
|
29
|
+
mode: SubAgentMode;
|
|
30
|
+
/** Human-readable label for tracking. */
|
|
31
|
+
label?: string;
|
|
32
|
+
/** Model override. */
|
|
33
|
+
model?: string;
|
|
34
|
+
/** Timeout in milliseconds (default: 300_000 for run, 0 for session). */
|
|
35
|
+
timeoutMs?: number;
|
|
36
|
+
/** Whether to announce completion to the parent session. */
|
|
37
|
+
announceCompletion?: boolean;
|
|
38
|
+
}
|
|
39
|
+
/** A tracked sub-agent run. */
|
|
40
|
+
export interface SubAgentRun {
|
|
41
|
+
/** Unique run ID. */
|
|
42
|
+
id: string;
|
|
43
|
+
/** Parent session ID that spawned this run. */
|
|
44
|
+
parentSessionId: string;
|
|
45
|
+
/** Agent ID being used. */
|
|
46
|
+
agentId: string;
|
|
47
|
+
/** The session this sub-agent is using. */
|
|
48
|
+
sessionId: string;
|
|
49
|
+
/** Session key for routing. */
|
|
50
|
+
sessionKey: string;
|
|
51
|
+
/** Run mode. */
|
|
52
|
+
mode: SubAgentMode;
|
|
53
|
+
/** Human-readable label. */
|
|
54
|
+
label: string;
|
|
55
|
+
/** Current status. */
|
|
56
|
+
status: SubAgentStatus;
|
|
57
|
+
/** Task that was given. */
|
|
58
|
+
task: string;
|
|
59
|
+
/** Result text (populated on completion). */
|
|
60
|
+
result?: string;
|
|
61
|
+
/** Error message (populated on failure). */
|
|
62
|
+
error?: string;
|
|
63
|
+
/** When the run started. */
|
|
64
|
+
startedAt: Date;
|
|
65
|
+
/** When the run completed/failed. */
|
|
66
|
+
completedAt?: Date;
|
|
67
|
+
/** Timeout in milliseconds. */
|
|
68
|
+
timeoutMs: number;
|
|
69
|
+
/** Whether to announce completion to parent. */
|
|
70
|
+
announceCompletion: boolean;
|
|
71
|
+
}
|
|
72
|
+
/** Completion event emitted when a sub-agent finishes. */
|
|
73
|
+
export interface SubAgentCompletionEvent {
|
|
74
|
+
runId: string;
|
|
75
|
+
parentSessionId: string;
|
|
76
|
+
status: SubAgentStatus;
|
|
77
|
+
result?: string;
|
|
78
|
+
error?: string;
|
|
79
|
+
}
|
|
80
|
+
export type CompletionHandler = (event: SubAgentCompletionEvent) => void;
|
|
81
|
+
export declare class SubAgentOrchestrator {
|
|
82
|
+
private runs;
|
|
83
|
+
private sessions;
|
|
84
|
+
private agentLoop;
|
|
85
|
+
private completionHandlers;
|
|
86
|
+
private timeoutTimers;
|
|
87
|
+
constructor(sessions: SessionManager, agentLoop: AgentLoop);
|
|
88
|
+
/** Load runs from ~/.tako/subagents/runs.json on startup. */
|
|
89
|
+
private loadPersistedRuns;
|
|
90
|
+
/** Persist all runs to ~/.tako/subagents/runs.json. */
|
|
91
|
+
private saveRuns;
|
|
92
|
+
/** Register a handler for sub-agent completion events. */
|
|
93
|
+
onCompletion(handler: CompletionHandler): void;
|
|
94
|
+
/**
|
|
95
|
+
* Spawn a sub-agent.
|
|
96
|
+
* In "run" mode, executes the task and returns the result.
|
|
97
|
+
* In "session" mode, starts the session and returns immediately.
|
|
98
|
+
*/
|
|
99
|
+
spawn(parentSessionId: string, opts: SpawnOptions, _agent?: AgentDescriptor): Promise<SubAgentRun>;
|
|
100
|
+
/** Execute a sub-agent run. */
|
|
101
|
+
private executeRun;
|
|
102
|
+
/** Send a follow-up message to a persistent sub-agent session. */
|
|
103
|
+
sendMessage(runId: string, message: string): Promise<string>;
|
|
104
|
+
/** List all sub-agent runs, optionally filtered by parent session. */
|
|
105
|
+
listRuns(parentSessionId?: string): SubAgentRun[];
|
|
106
|
+
/** Get a specific run. */
|
|
107
|
+
getRun(runId: string): SubAgentRun | undefined;
|
|
108
|
+
/** Kill a running sub-agent. */
|
|
109
|
+
kill(runId: string): boolean;
|
|
110
|
+
/** Steer a sub-agent by sending it additional instructions. */
|
|
111
|
+
steer(runId: string, message: string): Promise<string>;
|
|
112
|
+
/**
|
|
113
|
+
* Clean up completed run-mode sessions.
|
|
114
|
+
* Removes run records and their sessions after results have been retrieved.
|
|
115
|
+
*/
|
|
116
|
+
cleanup(): number;
|
|
117
|
+
/** Restore thread-bound sessions from persisted session data on restart. */
|
|
118
|
+
restorePersistedSessions(): number;
|
|
119
|
+
private clearTimeout;
|
|
120
|
+
private emitCompletion;
|
|
121
|
+
/** Push completion announcement to the parent session. */
|
|
122
|
+
private announceToParent;
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=subagent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subagent.d.ts","sourceRoot":"","sources":["../../src/agents/subagent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sub-agent orchestration — spawn, track, steer, and kill sub-agents.
|
|
3
|
+
*
|
|
4
|
+
* Supports two modes:
|
|
5
|
+
* - "run" (one-shot): Execute a task, return result, clean up
|
|
6
|
+
* - "session" (persistent): Persistent agent that can receive follow-up messages
|
|
7
|
+
*
|
|
8
|
+
* reference runtime-aligned features:
|
|
9
|
+
* - Configurable timeout per spawn (default 5min for run, none for session)
|
|
10
|
+
* - Completion announcements: push results to parent session
|
|
11
|
+
* - Automatic cleanup: remove completed run-mode sessions after result retrieval
|
|
12
|
+
* - Session key routing: agent:<id>:<mode>:<uuid> format
|
|
13
|
+
* - Thread-bound persistence: session mode runs persist across restarts
|
|
14
|
+
*/
|
|
15
|
+
import { homedir } from 'node:os';
|
|
16
|
+
import { join } from 'node:path';
|
|
17
|
+
import { mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
18
|
+
import { existsSync } from 'node:fs';
|
|
19
|
+
/** Default timeout: 5 minutes for run mode, 0 (no timeout) for session mode. */
|
|
20
|
+
const DEFAULT_RUN_TIMEOUT_MS = 300_000;
|
|
21
|
+
function getRunsPath() {
|
|
22
|
+
return join(homedir(), '.tako', 'subagents', 'runs.json');
|
|
23
|
+
}
|
|
24
|
+
export class SubAgentOrchestrator {
|
|
25
|
+
runs = new Map();
|
|
26
|
+
sessions;
|
|
27
|
+
agentLoop;
|
|
28
|
+
completionHandlers = [];
|
|
29
|
+
timeoutTimers = new Map();
|
|
30
|
+
constructor(sessions, agentLoop) {
|
|
31
|
+
this.sessions = sessions;
|
|
32
|
+
this.agentLoop = agentLoop;
|
|
33
|
+
// Load persisted runs on construction
|
|
34
|
+
this.loadPersistedRuns().catch(() => { });
|
|
35
|
+
}
|
|
36
|
+
/** Load runs from ~/.tako/subagents/runs.json on startup. */
|
|
37
|
+
async loadPersistedRuns() {
|
|
38
|
+
const filePath = getRunsPath();
|
|
39
|
+
if (!existsSync(filePath))
|
|
40
|
+
return;
|
|
41
|
+
try {
|
|
42
|
+
const raw = await readFile(filePath, 'utf-8');
|
|
43
|
+
const data = JSON.parse(raw);
|
|
44
|
+
for (const sr of data.runs) {
|
|
45
|
+
if (this.runs.has(sr.id))
|
|
46
|
+
continue;
|
|
47
|
+
const run = {
|
|
48
|
+
id: sr.id,
|
|
49
|
+
parentSessionId: sr.parentSessionId,
|
|
50
|
+
agentId: sr.agentId,
|
|
51
|
+
sessionId: sr.sessionId,
|
|
52
|
+
sessionKey: sr.sessionKey,
|
|
53
|
+
mode: sr.mode,
|
|
54
|
+
label: sr.label,
|
|
55
|
+
status: sr.status,
|
|
56
|
+
task: sr.task,
|
|
57
|
+
startedAt: new Date(sr.startedAt),
|
|
58
|
+
completedAt: sr.completedAt ? new Date(sr.completedAt) : undefined,
|
|
59
|
+
timeoutMs: 0,
|
|
60
|
+
announceCompletion: false,
|
|
61
|
+
};
|
|
62
|
+
this.runs.set(sr.id, run);
|
|
63
|
+
}
|
|
64
|
+
console.log(`[subagent] Loaded ${data.runs.length} persisted runs`);
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
// Corrupted file — start fresh
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/** Persist all runs to ~/.tako/subagents/runs.json. */
|
|
71
|
+
async saveRuns() {
|
|
72
|
+
const filePath = getRunsPath();
|
|
73
|
+
const dir = join(filePath, '..');
|
|
74
|
+
await mkdir(dir, { recursive: true });
|
|
75
|
+
const serialized = [];
|
|
76
|
+
for (const run of this.runs.values()) {
|
|
77
|
+
serialized.push({
|
|
78
|
+
id: run.id,
|
|
79
|
+
parentSessionId: run.parentSessionId,
|
|
80
|
+
agentId: run.agentId,
|
|
81
|
+
sessionId: run.sessionId,
|
|
82
|
+
sessionKey: run.sessionKey,
|
|
83
|
+
mode: run.mode,
|
|
84
|
+
label: run.label,
|
|
85
|
+
status: run.status,
|
|
86
|
+
task: run.task,
|
|
87
|
+
startedAt: run.startedAt.toISOString(),
|
|
88
|
+
completedAt: run.completedAt?.toISOString(),
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
const data = { version: 1, runs: serialized };
|
|
92
|
+
await writeFile(filePath, JSON.stringify(data, null, 2) + '\n', 'utf-8');
|
|
93
|
+
}
|
|
94
|
+
/** Register a handler for sub-agent completion events. */
|
|
95
|
+
onCompletion(handler) {
|
|
96
|
+
this.completionHandlers.push(handler);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Spawn a sub-agent.
|
|
100
|
+
* In "run" mode, executes the task and returns the result.
|
|
101
|
+
* In "session" mode, starts the session and returns immediately.
|
|
102
|
+
*/
|
|
103
|
+
async spawn(parentSessionId, opts, _agent) {
|
|
104
|
+
const runId = crypto.randomUUID();
|
|
105
|
+
const agentId = opts.agentId ?? 'main';
|
|
106
|
+
// Build session key: agent:<id>:<mode>:<uuid>
|
|
107
|
+
const sessionKey = `agent:${agentId}:${opts.mode}:${runId}`;
|
|
108
|
+
// Determine timeout
|
|
109
|
+
const timeoutMs = opts.timeoutMs ??
|
|
110
|
+
(opts.mode === 'run' ? DEFAULT_RUN_TIMEOUT_MS : 0);
|
|
111
|
+
// Create a new session for the sub-agent with proper key routing
|
|
112
|
+
const session = this.sessions.getOrCreate(sessionKey, {
|
|
113
|
+
name: `subagent:${opts.label ?? agentId}:${runId.slice(0, 8)}`,
|
|
114
|
+
metadata: {
|
|
115
|
+
parentSessionId,
|
|
116
|
+
agentId,
|
|
117
|
+
mode: opts.mode,
|
|
118
|
+
label: opts.label,
|
|
119
|
+
isSubAgent: true,
|
|
120
|
+
sessionKey,
|
|
121
|
+
// Thread-bound: session mode persists across restarts
|
|
122
|
+
persistent: opts.mode === 'session',
|
|
123
|
+
},
|
|
124
|
+
});
|
|
125
|
+
const run = {
|
|
126
|
+
id: runId,
|
|
127
|
+
parentSessionId,
|
|
128
|
+
agentId,
|
|
129
|
+
sessionId: session.id,
|
|
130
|
+
sessionKey,
|
|
131
|
+
mode: opts.mode,
|
|
132
|
+
label: opts.label ?? `${agentId}:${runId.slice(0, 8)}`,
|
|
133
|
+
status: 'running',
|
|
134
|
+
task: opts.task,
|
|
135
|
+
startedAt: new Date(),
|
|
136
|
+
timeoutMs,
|
|
137
|
+
announceCompletion: opts.announceCompletion ?? true,
|
|
138
|
+
};
|
|
139
|
+
this.runs.set(runId, run);
|
|
140
|
+
this.saveRuns().catch(() => { });
|
|
141
|
+
// Set up timeout if configured
|
|
142
|
+
if (timeoutMs > 0) {
|
|
143
|
+
const timer = setTimeout(() => {
|
|
144
|
+
if (run.status === 'running') {
|
|
145
|
+
run.status = 'timeout';
|
|
146
|
+
run.error = `Timed out after ${timeoutMs}ms`;
|
|
147
|
+
run.completedAt = new Date();
|
|
148
|
+
this.timeoutTimers.delete(runId);
|
|
149
|
+
this.emitCompletion(run);
|
|
150
|
+
}
|
|
151
|
+
}, timeoutMs);
|
|
152
|
+
this.timeoutTimers.set(runId, timer);
|
|
153
|
+
}
|
|
154
|
+
// Execute the run
|
|
155
|
+
this.executeRun(run, session).catch((err) => {
|
|
156
|
+
run.status = 'failed';
|
|
157
|
+
run.error = err instanceof Error ? err.message : String(err);
|
|
158
|
+
run.completedAt = new Date();
|
|
159
|
+
this.clearTimeout(runId);
|
|
160
|
+
this.emitCompletion(run);
|
|
161
|
+
});
|
|
162
|
+
return run;
|
|
163
|
+
}
|
|
164
|
+
/** Execute a sub-agent run. */
|
|
165
|
+
async executeRun(run, session) {
|
|
166
|
+
let result = '';
|
|
167
|
+
try {
|
|
168
|
+
for await (const chunk of this.agentLoop.run(session, run.task)) {
|
|
169
|
+
// Check if we've been killed or timed out while running
|
|
170
|
+
if (run.status === 'killed' || run.status === 'timeout')
|
|
171
|
+
return;
|
|
172
|
+
result += chunk;
|
|
173
|
+
}
|
|
174
|
+
// Don't overwrite if already killed/timed out
|
|
175
|
+
if (run.status !== 'running')
|
|
176
|
+
return;
|
|
177
|
+
run.result = result;
|
|
178
|
+
run.status = 'completed';
|
|
179
|
+
run.completedAt = new Date();
|
|
180
|
+
}
|
|
181
|
+
catch (err) {
|
|
182
|
+
if (run.status !== 'running')
|
|
183
|
+
return;
|
|
184
|
+
run.status = 'failed';
|
|
185
|
+
run.error = err instanceof Error ? err.message : String(err);
|
|
186
|
+
run.completedAt = new Date();
|
|
187
|
+
}
|
|
188
|
+
this.clearTimeout(run.id);
|
|
189
|
+
// Automatic cleanup for completed run-mode sessions
|
|
190
|
+
if (run.mode === 'run') {
|
|
191
|
+
session.metadata.completed = true;
|
|
192
|
+
}
|
|
193
|
+
this.emitCompletion(run);
|
|
194
|
+
}
|
|
195
|
+
/** Send a follow-up message to a persistent sub-agent session. */
|
|
196
|
+
async sendMessage(runId, message) {
|
|
197
|
+
const run = this.runs.get(runId);
|
|
198
|
+
if (!run)
|
|
199
|
+
throw new Error(`Sub-agent run not found: ${runId}`);
|
|
200
|
+
if (run.mode !== 'session')
|
|
201
|
+
throw new Error(`Cannot send messages to one-shot runs`);
|
|
202
|
+
if (run.status !== 'completed' && run.status !== 'running') {
|
|
203
|
+
throw new Error(`Sub-agent is ${run.status}, cannot send message`);
|
|
204
|
+
}
|
|
205
|
+
const session = this.sessions.get(run.sessionId);
|
|
206
|
+
if (!session)
|
|
207
|
+
throw new Error(`Session not found: ${run.sessionId}`);
|
|
208
|
+
run.status = 'running';
|
|
209
|
+
let result = '';
|
|
210
|
+
for await (const chunk of this.agentLoop.run(session, message)) {
|
|
211
|
+
result += chunk;
|
|
212
|
+
}
|
|
213
|
+
run.status = 'completed';
|
|
214
|
+
run.result = result;
|
|
215
|
+
return result;
|
|
216
|
+
}
|
|
217
|
+
/** List all sub-agent runs, optionally filtered by parent session. */
|
|
218
|
+
listRuns(parentSessionId) {
|
|
219
|
+
const all = Array.from(this.runs.values());
|
|
220
|
+
if (parentSessionId) {
|
|
221
|
+
return all.filter((r) => r.parentSessionId === parentSessionId);
|
|
222
|
+
}
|
|
223
|
+
return all;
|
|
224
|
+
}
|
|
225
|
+
/** Get a specific run. */
|
|
226
|
+
getRun(runId) {
|
|
227
|
+
return this.runs.get(runId);
|
|
228
|
+
}
|
|
229
|
+
/** Kill a running sub-agent. */
|
|
230
|
+
kill(runId) {
|
|
231
|
+
const run = this.runs.get(runId);
|
|
232
|
+
if (!run)
|
|
233
|
+
return false;
|
|
234
|
+
if (run.status !== 'running')
|
|
235
|
+
return false;
|
|
236
|
+
run.status = 'killed';
|
|
237
|
+
run.completedAt = new Date();
|
|
238
|
+
this.clearTimeout(runId);
|
|
239
|
+
this.emitCompletion(run);
|
|
240
|
+
return true;
|
|
241
|
+
}
|
|
242
|
+
/** Steer a sub-agent by sending it additional instructions. */
|
|
243
|
+
async steer(runId, message) {
|
|
244
|
+
return this.sendMessage(runId, message);
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Clean up completed run-mode sessions.
|
|
248
|
+
* Removes run records and their sessions after results have been retrieved.
|
|
249
|
+
*/
|
|
250
|
+
cleanup() {
|
|
251
|
+
let cleaned = 0;
|
|
252
|
+
for (const [runId, run] of this.runs) {
|
|
253
|
+
if (run.mode === 'run' &&
|
|
254
|
+
(run.status === 'completed' || run.status === 'failed' || run.status === 'timeout')) {
|
|
255
|
+
// Delete the session
|
|
256
|
+
this.sessions.delete(run.sessionId);
|
|
257
|
+
this.runs.delete(runId);
|
|
258
|
+
cleaned++;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
if (cleaned > 0) {
|
|
262
|
+
console.log(`[subagent] Cleaned up ${cleaned} completed run-mode sessions`);
|
|
263
|
+
}
|
|
264
|
+
return cleaned;
|
|
265
|
+
}
|
|
266
|
+
/** Restore thread-bound sessions from persisted session data on restart. */
|
|
267
|
+
restorePersistedSessions() {
|
|
268
|
+
let restored = 0;
|
|
269
|
+
for (const session of this.sessions.list()) {
|
|
270
|
+
if (session.metadata.isSubAgent &&
|
|
271
|
+
session.metadata.persistent &&
|
|
272
|
+
session.metadata.sessionKey &&
|
|
273
|
+
!session.metadata.completed) {
|
|
274
|
+
const key = session.metadata.sessionKey;
|
|
275
|
+
// Parse the session key: agent:<id>:<mode>:<uuid>
|
|
276
|
+
const parts = key.split(':');
|
|
277
|
+
if (parts.length >= 4) {
|
|
278
|
+
const runId = parts[3];
|
|
279
|
+
if (!this.runs.has(runId)) {
|
|
280
|
+
const run = {
|
|
281
|
+
id: runId,
|
|
282
|
+
parentSessionId: session.metadata.parentSessionId ?? '',
|
|
283
|
+
agentId: parts[1],
|
|
284
|
+
sessionId: session.id,
|
|
285
|
+
sessionKey: key,
|
|
286
|
+
mode: parts[2],
|
|
287
|
+
label: session.metadata.label ?? session.name,
|
|
288
|
+
status: 'completed',
|
|
289
|
+
task: '',
|
|
290
|
+
startedAt: session.createdAt,
|
|
291
|
+
completedAt: session.lastActiveAt,
|
|
292
|
+
timeoutMs: 0,
|
|
293
|
+
announceCompletion: false,
|
|
294
|
+
};
|
|
295
|
+
this.runs.set(runId, run);
|
|
296
|
+
restored++;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
if (restored > 0) {
|
|
302
|
+
console.log(`[subagent] Restored ${restored} persisted thread-bound sessions`);
|
|
303
|
+
}
|
|
304
|
+
return restored;
|
|
305
|
+
}
|
|
306
|
+
clearTimeout(runId) {
|
|
307
|
+
const timer = this.timeoutTimers.get(runId);
|
|
308
|
+
if (timer) {
|
|
309
|
+
clearTimeout(timer);
|
|
310
|
+
this.timeoutTimers.delete(runId);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
emitCompletion(run) {
|
|
314
|
+
this.saveRuns().catch(() => { });
|
|
315
|
+
const event = {
|
|
316
|
+
runId: run.id,
|
|
317
|
+
parentSessionId: run.parentSessionId,
|
|
318
|
+
status: run.status,
|
|
319
|
+
result: run.result,
|
|
320
|
+
error: run.error,
|
|
321
|
+
};
|
|
322
|
+
// Announce completion to parent session if configured
|
|
323
|
+
if (run.announceCompletion && run.parentSessionId) {
|
|
324
|
+
this.announceToParent(run);
|
|
325
|
+
}
|
|
326
|
+
for (const handler of this.completionHandlers) {
|
|
327
|
+
try {
|
|
328
|
+
handler(event);
|
|
329
|
+
}
|
|
330
|
+
catch {
|
|
331
|
+
// Don't let handler errors crash the orchestrator
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
/** Push completion announcement to the parent session. */
|
|
336
|
+
announceToParent(run) {
|
|
337
|
+
const parentSession = this.sessions.get(run.parentSessionId);
|
|
338
|
+
if (!parentSession)
|
|
339
|
+
return;
|
|
340
|
+
const statusEmoji = run.status === 'completed' ? '✓' : run.status === 'timeout' ? '⏱' : '✗';
|
|
341
|
+
const summary = run.status === 'completed'
|
|
342
|
+
? (run.result ?? '').slice(0, 500)
|
|
343
|
+
: run.error ?? 'Unknown error';
|
|
344
|
+
const announcement = `[sub-agent ${statusEmoji}] ${run.label} (${run.status}): ${summary}`;
|
|
345
|
+
parentSession.messages.push({
|
|
346
|
+
role: 'system',
|
|
347
|
+
content: announcement,
|
|
348
|
+
});
|
|
349
|
+
parentSession.lastActiveAt = new Date();
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
//# sourceMappingURL=subagent.js.map
|