@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,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool Execution Cache — caches command results keyed by SHA256(command+args+cwd).
|
|
3
|
+
*
|
|
4
|
+
* Features:
|
|
5
|
+
* - Per-command TTL overrides (git status 10s, ls 30s, grep 15s, etc.)
|
|
6
|
+
* - Blocklist for side-effect commands (test, build, make, etc.)
|
|
7
|
+
* - Auto-invalidation on file writes in the same cwd
|
|
8
|
+
*/
|
|
9
|
+
import { createHash } from 'node:crypto';
|
|
10
|
+
// ─── Default TTL overrides by command prefix ────────────────────────
|
|
11
|
+
const DEFAULT_TTL_OVERRIDES = {
|
|
12
|
+
'git status': 10,
|
|
13
|
+
'git log': 15,
|
|
14
|
+
'git diff': 10,
|
|
15
|
+
'git branch': 15,
|
|
16
|
+
'ls': 30,
|
|
17
|
+
'find': 15,
|
|
18
|
+
'grep': 15,
|
|
19
|
+
'rg': 15,
|
|
20
|
+
'wc': 30,
|
|
21
|
+
'cat': 60,
|
|
22
|
+
'head': 60,
|
|
23
|
+
'tail': 60,
|
|
24
|
+
'file': 60,
|
|
25
|
+
'which': 120,
|
|
26
|
+
'type': 120,
|
|
27
|
+
};
|
|
28
|
+
// ─── Tool Execution Cache ───────────────────────────────────────────
|
|
29
|
+
export class ToolCache {
|
|
30
|
+
config;
|
|
31
|
+
cache = new Map();
|
|
32
|
+
hits = 0;
|
|
33
|
+
misses = 0;
|
|
34
|
+
blocked = 0;
|
|
35
|
+
evictions = 0;
|
|
36
|
+
constructor(config) {
|
|
37
|
+
this.config = config;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Build a cache key from command, args, and cwd.
|
|
41
|
+
*/
|
|
42
|
+
static buildKey(command, cwd) {
|
|
43
|
+
return createHash('sha256')
|
|
44
|
+
.update(`${command}\0${cwd}`)
|
|
45
|
+
.digest('hex');
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Check if a command is blocklisted (should never be cached).
|
|
49
|
+
*/
|
|
50
|
+
isBlocked(command) {
|
|
51
|
+
const trimmed = command.trim();
|
|
52
|
+
return this.config.blocklist.some((pattern) => trimmed.startsWith(pattern) || trimmed.includes(` && ${pattern}`) || trimmed.includes(`; ${pattern}`));
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Get the TTL for a command in milliseconds.
|
|
56
|
+
*/
|
|
57
|
+
getTtlMs(command) {
|
|
58
|
+
const trimmed = command.trim();
|
|
59
|
+
const overrides = { ...DEFAULT_TTL_OVERRIDES, ...this.config.ttlOverrides };
|
|
60
|
+
// Match longest prefix first
|
|
61
|
+
let bestMatch = '';
|
|
62
|
+
let bestTtl = this.config.defaultTtlSeconds;
|
|
63
|
+
for (const [prefix, ttlSeconds] of Object.entries(overrides)) {
|
|
64
|
+
if (trimmed.startsWith(prefix) && prefix.length > bestMatch.length) {
|
|
65
|
+
bestMatch = prefix;
|
|
66
|
+
bestTtl = ttlSeconds;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return bestTtl * 1000;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Get a cached result if valid, or null if stale/missing/blocked.
|
|
73
|
+
*/
|
|
74
|
+
get(command, cwd) {
|
|
75
|
+
if (!this.config.enabled)
|
|
76
|
+
return null;
|
|
77
|
+
if (this.isBlocked(command)) {
|
|
78
|
+
this.blocked++;
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
const key = ToolCache.buildKey(command, cwd);
|
|
82
|
+
const entry = this.cache.get(key);
|
|
83
|
+
if (!entry) {
|
|
84
|
+
this.misses++;
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
// Check TTL
|
|
88
|
+
if (Date.now() - entry.cachedAt > entry.ttlMs) {
|
|
89
|
+
this.cache.delete(key);
|
|
90
|
+
this.misses++;
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
this.hits++;
|
|
94
|
+
return entry;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Store a command result in cache.
|
|
98
|
+
*/
|
|
99
|
+
set(command, cwd, output, success, error) {
|
|
100
|
+
if (!this.config.enabled)
|
|
101
|
+
return;
|
|
102
|
+
if (this.isBlocked(command))
|
|
103
|
+
return;
|
|
104
|
+
const key = ToolCache.buildKey(command, cwd);
|
|
105
|
+
const ttlMs = this.getTtlMs(command);
|
|
106
|
+
this.cache.set(key, {
|
|
107
|
+
output,
|
|
108
|
+
success,
|
|
109
|
+
error,
|
|
110
|
+
cachedAt: Date.now(),
|
|
111
|
+
ttlMs,
|
|
112
|
+
commandKey: command.slice(0, 80),
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Invalidate all cached commands for a given cwd (e.g. after file write).
|
|
117
|
+
*/
|
|
118
|
+
invalidateCwd(cwd) {
|
|
119
|
+
// We can't reconstruct keys from cwd alone, so scan all entries
|
|
120
|
+
for (const [key, entry] of this.cache) {
|
|
121
|
+
// commandKey is the truncated command; we hash with cwd
|
|
122
|
+
// Since we can't reverse the hash, mark all entries as expired by setting cachedAt to 0
|
|
123
|
+
// Actually, let's just clear all — simpler and correct since writes affect the directory
|
|
124
|
+
}
|
|
125
|
+
// Clear all entries — writes can affect any command's output
|
|
126
|
+
this.cache.clear();
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Clear the entire cache.
|
|
130
|
+
*/
|
|
131
|
+
clear() {
|
|
132
|
+
this.cache.clear();
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Run auto-clean: remove expired entries.
|
|
136
|
+
*/
|
|
137
|
+
autoClean() {
|
|
138
|
+
const now = Date.now();
|
|
139
|
+
let cleaned = 0;
|
|
140
|
+
for (const [key, entry] of this.cache) {
|
|
141
|
+
if (now - entry.cachedAt > entry.ttlMs) {
|
|
142
|
+
this.cache.delete(key);
|
|
143
|
+
cleaned++;
|
|
144
|
+
this.evictions++;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return cleaned;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Get cache statistics.
|
|
151
|
+
*/
|
|
152
|
+
getStats() {
|
|
153
|
+
const total = this.hits + this.misses;
|
|
154
|
+
return {
|
|
155
|
+
entries: this.cache.size,
|
|
156
|
+
hits: this.hits,
|
|
157
|
+
misses: this.misses,
|
|
158
|
+
blocked: this.blocked,
|
|
159
|
+
evictions: this.evictions,
|
|
160
|
+
hitRate: total > 0 ? this.hits / total : 0,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Reset counters (for testing).
|
|
165
|
+
*/
|
|
166
|
+
resetStats() {
|
|
167
|
+
this.hits = 0;
|
|
168
|
+
this.misses = 0;
|
|
169
|
+
this.blocked = 0;
|
|
170
|
+
this.evictions = 0;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=tool-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-cache.js","sourceRoot":"","sources":["../../src/cache/tool-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Channel — messaging I/O trait.
|
|
3
|
+
*
|
|
4
|
+
* One interface, many adapters (Discord, Telegram, CLI, WebChat, etc.).
|
|
5
|
+
* Channels run simultaneously through the Gateway, each handling its own
|
|
6
|
+
* authentication, rate limiting, and message formatting.
|
|
7
|
+
*
|
|
8
|
+
* Each channel:
|
|
9
|
+
* - Connects to a platform and listens for messages
|
|
10
|
+
* - Converts platform-specific payloads to InboundMessage
|
|
11
|
+
* - Sends OutboundMessage back through the platform
|
|
12
|
+
* - Handles reconnection and error recovery independently
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* const cli = new CLIChannel();
|
|
17
|
+
* cli.onMessage(async (msg) => {
|
|
18
|
+
* console.log(`User said: ${msg.content}`);
|
|
19
|
+
* await cli.send({ target: msg.channelId, content: 'Hello!' });
|
|
20
|
+
* });
|
|
21
|
+
* await cli.connect();
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
/** An inbound message received from any channel. */
|
|
25
|
+
export interface InboundMessage {
|
|
26
|
+
/** Unique message ID (platform-specific, e.g. Discord snowflake) */
|
|
27
|
+
id: string;
|
|
28
|
+
/** Channel identifier with optional platform prefix (e.g. 'cli', 'discord:123') */
|
|
29
|
+
channelId: string;
|
|
30
|
+
/** Author information */
|
|
31
|
+
author: {
|
|
32
|
+
/** Platform-specific user ID */
|
|
33
|
+
id: string;
|
|
34
|
+
/** Display name */
|
|
35
|
+
name: string;
|
|
36
|
+
/** Additional platform-specific metadata */
|
|
37
|
+
meta?: Record<string, unknown>;
|
|
38
|
+
};
|
|
39
|
+
/** Message text content */
|
|
40
|
+
content: string;
|
|
41
|
+
/** File or media attachments */
|
|
42
|
+
attachments?: Attachment[];
|
|
43
|
+
/** ISO-8601 timestamp of when the message was sent */
|
|
44
|
+
timestamp: string;
|
|
45
|
+
/** Platform-specific raw payload (for advanced use) */
|
|
46
|
+
raw?: unknown;
|
|
47
|
+
/** Platform thread/topic ID (e.g., Telegram forum topic). */
|
|
48
|
+
threadId?: string;
|
|
49
|
+
}
|
|
50
|
+
/** An outbound message to send through a channel. */
|
|
51
|
+
export interface OutboundMessage {
|
|
52
|
+
/** Target conversation, thread, or chat ID */
|
|
53
|
+
target: string;
|
|
54
|
+
/** Text content to send */
|
|
55
|
+
content: string;
|
|
56
|
+
/** Optional message ID to reply to */
|
|
57
|
+
replyTo?: string;
|
|
58
|
+
/** Optional file or media attachments */
|
|
59
|
+
attachments?: Attachment[];
|
|
60
|
+
}
|
|
61
|
+
/** A file or media attachment on a message. */
|
|
62
|
+
export interface Attachment {
|
|
63
|
+
/** Attachment type */
|
|
64
|
+
type: 'image' | 'file' | 'audio' | 'video';
|
|
65
|
+
/** URL to the attachment (if hosted) */
|
|
66
|
+
url?: string;
|
|
67
|
+
/** Raw binary data (for inline attachments) */
|
|
68
|
+
data?: Buffer;
|
|
69
|
+
/** Original filename */
|
|
70
|
+
filename?: string;
|
|
71
|
+
/** MIME type (e.g. 'image/png', 'application/pdf') */
|
|
72
|
+
mimeType?: string;
|
|
73
|
+
}
|
|
74
|
+
/** Callback for handling inbound messages. */
|
|
75
|
+
export type MessageHandler = (msg: InboundMessage) => void | Promise<void>;
|
|
76
|
+
/**
|
|
77
|
+
* Channel — the messaging I/O trait.
|
|
78
|
+
*
|
|
79
|
+
* Implementations adapt a specific messaging platform into Tako's
|
|
80
|
+
* unified message handling interface. Multiple channels can run
|
|
81
|
+
* simultaneously, each receiving and sending messages independently.
|
|
82
|
+
*
|
|
83
|
+
* Built-in implementations:
|
|
84
|
+
* - {@link CLIChannel} — terminal readline interface
|
|
85
|
+
* - {@link DiscordChannel} — Discord bot via discord.js
|
|
86
|
+
* - {@link TelegramChannel} — Telegram bot via grammY
|
|
87
|
+
*/
|
|
88
|
+
export interface Channel {
|
|
89
|
+
/** Unique channel identifier (e.g. 'discord', 'telegram', 'cli') */
|
|
90
|
+
id: string;
|
|
91
|
+
/** If set, all messages on this channel route to this specific agent. */
|
|
92
|
+
agentId?: string;
|
|
93
|
+
/**
|
|
94
|
+
* Connect to the messaging platform.
|
|
95
|
+
* For CLI, this starts the readline interface (blocking).
|
|
96
|
+
* For Discord/Telegram, this authenticates and starts listening.
|
|
97
|
+
*/
|
|
98
|
+
connect(): Promise<void>;
|
|
99
|
+
/**
|
|
100
|
+
* Disconnect cleanly from the platform.
|
|
101
|
+
* Releases resources and stops listening for messages.
|
|
102
|
+
*/
|
|
103
|
+
disconnect(): Promise<void>;
|
|
104
|
+
/**
|
|
105
|
+
* Send an outbound message through the channel.
|
|
106
|
+
* Handles platform-specific formatting (message splitting, Markdown, etc.).
|
|
107
|
+
*
|
|
108
|
+
* @param msg - The message to send
|
|
109
|
+
*/
|
|
110
|
+
send(msg: OutboundMessage): Promise<void>;
|
|
111
|
+
/**
|
|
112
|
+
* Register a handler for inbound messages.
|
|
113
|
+
* Only one handler is typically registered (the agent loop router).
|
|
114
|
+
*
|
|
115
|
+
* @param handler - Callback invoked for each incoming message
|
|
116
|
+
*/
|
|
117
|
+
onMessage(handler: MessageHandler): void;
|
|
118
|
+
/**
|
|
119
|
+
* Send a typing indicator to the given chat/channel.
|
|
120
|
+
* Optional — channels that don't support typing can omit this.
|
|
121
|
+
*/
|
|
122
|
+
sendTyping?(chatId: string): Promise<void>;
|
|
123
|
+
/**
|
|
124
|
+
* Add a reaction emoji to a message.
|
|
125
|
+
* Optional — channels that don't support reactions can omit this.
|
|
126
|
+
*/
|
|
127
|
+
addReaction?(chatId: string, messageId: string, emoji: string): Promise<void>;
|
|
128
|
+
/**
|
|
129
|
+
* Remove a reaction emoji from a message.
|
|
130
|
+
* Optional — channels that don't support reactions can omit this.
|
|
131
|
+
*/
|
|
132
|
+
removeReaction?(chatId: string, messageId: string, emoji: string): Promise<void>;
|
|
133
|
+
/**
|
|
134
|
+
* Broadcast a system message to all configured default channels.
|
|
135
|
+
* Used for startup/shutdown notices. Optional — CLI can omit.
|
|
136
|
+
*/
|
|
137
|
+
broadcast?(text: string): Promise<void>;
|
|
138
|
+
/**
|
|
139
|
+
* Edit an existing message (for streaming updates).
|
|
140
|
+
* Optional — channels that don't support editing can omit this.
|
|
141
|
+
*
|
|
142
|
+
* @param chatId - Target chat/channel ID
|
|
143
|
+
* @param messageId - The message to edit
|
|
144
|
+
* @param content - New content for the message
|
|
145
|
+
*/
|
|
146
|
+
editMessage?(chatId: string, messageId: string, content: string): Promise<void>;
|
|
147
|
+
/**
|
|
148
|
+
* Send a message and return the message ID (for subsequent edits).
|
|
149
|
+
* Optional — channels that don't support message IDs can omit this.
|
|
150
|
+
*
|
|
151
|
+
* @param msg - The message to send
|
|
152
|
+
* @returns Platform-specific message ID
|
|
153
|
+
*/
|
|
154
|
+
sendAndGetId?(msg: OutboundMessage): Promise<string>;
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=channel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../../src/channels/channel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Channel — messaging I/O trait.
|
|
3
|
+
*
|
|
4
|
+
* One interface, many adapters (Discord, Telegram, CLI, WebChat, etc.).
|
|
5
|
+
* Channels run simultaneously through the Gateway, each handling its own
|
|
6
|
+
* authentication, rate limiting, and message formatting.
|
|
7
|
+
*
|
|
8
|
+
* Each channel:
|
|
9
|
+
* - Connects to a platform and listens for messages
|
|
10
|
+
* - Converts platform-specific payloads to InboundMessage
|
|
11
|
+
* - Sends OutboundMessage back through the platform
|
|
12
|
+
* - Handles reconnection and error recovery independently
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* const cli = new CLIChannel();
|
|
17
|
+
* cli.onMessage(async (msg) => {
|
|
18
|
+
* console.log(`User said: ${msg.content}`);
|
|
19
|
+
* await cli.send({ target: msg.channelId, content: 'Hello!' });
|
|
20
|
+
* });
|
|
21
|
+
* await cli.connect();
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=channel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel.js","sourceRoot":"","sources":["../../src/channels/channel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI channel — terminal/stdin adapter.
|
|
3
|
+
*
|
|
4
|
+
* The simplest channel: reads from stdin, writes to stdout.
|
|
5
|
+
* Properly awaits async message handlers and re-prompts after completion.
|
|
6
|
+
*/
|
|
7
|
+
import type { Channel, OutboundMessage, MessageHandler } from './channel.js';
|
|
8
|
+
export declare class CLIChannel implements Channel {
|
|
9
|
+
id: string;
|
|
10
|
+
private rl;
|
|
11
|
+
private handlers;
|
|
12
|
+
private promptStr;
|
|
13
|
+
private busy;
|
|
14
|
+
constructor(opts?: {
|
|
15
|
+
prompt?: string;
|
|
16
|
+
});
|
|
17
|
+
connect(): Promise<void>;
|
|
18
|
+
/** Display the prompt. */
|
|
19
|
+
showPrompt(): void;
|
|
20
|
+
disconnect(): Promise<void>;
|
|
21
|
+
send(msg: OutboundMessage): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Send a message and return a synthetic ID.
|
|
24
|
+
* CLI doesn't have real message IDs, but this enables the streaming
|
|
25
|
+
* interface. Subsequent editMessage calls overwrite the current line.
|
|
26
|
+
*/
|
|
27
|
+
sendAndGetId(msg: OutboundMessage): Promise<string>;
|
|
28
|
+
/**
|
|
29
|
+
* Edit the current streaming message by clearing and rewriting.
|
|
30
|
+
* For CLI, we use carriage return to overwrite the current output.
|
|
31
|
+
*/
|
|
32
|
+
editMessage(_chatId: string, _messageId: string, content: string): Promise<void>;
|
|
33
|
+
onMessage(handler: MessageHandler): void;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/channels/cli.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAkB,eAAe,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE7F,qBAAa,UAAW,YAAW,OAAO;IACxC,EAAE,SAAS;IACX,OAAO,CAAC,EAAE,CAAkC;IAC5C,OAAO,CAAC,QAAQ,CAAwB;IACxC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,IAAI,CAAS;gBAET,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;IAIhC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAiD9B,0BAA0B;IAC1B,UAAU,IAAI,IAAI;IAIZ,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B,IAAI,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/C;;;;OAIG;IACG,YAAY,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IAKzD;;;OAGG;IACG,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKtF,SAAS,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;CAGzC"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI channel — terminal/stdin adapter.
|
|
3
|
+
*
|
|
4
|
+
* The simplest channel: reads from stdin, writes to stdout.
|
|
5
|
+
* Properly awaits async message handlers and re-prompts after completion.
|
|
6
|
+
*/
|
|
7
|
+
import { createInterface } from 'node:readline';
|
|
8
|
+
export class CLIChannel {
|
|
9
|
+
id = 'cli';
|
|
10
|
+
rl = null;
|
|
11
|
+
handlers = [];
|
|
12
|
+
promptStr;
|
|
13
|
+
busy = false;
|
|
14
|
+
constructor(opts) {
|
|
15
|
+
this.promptStr = opts?.prompt ?? 'tako> ';
|
|
16
|
+
}
|
|
17
|
+
async connect() {
|
|
18
|
+
this.rl = createInterface({
|
|
19
|
+
input: process.stdin,
|
|
20
|
+
output: process.stdout,
|
|
21
|
+
prompt: this.promptStr,
|
|
22
|
+
});
|
|
23
|
+
this.rl.on('line', async (line) => {
|
|
24
|
+
const trimmed = line.trim();
|
|
25
|
+
if (!trimmed) {
|
|
26
|
+
this.showPrompt();
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
// Prevent overlapping handler executions
|
|
30
|
+
if (this.busy)
|
|
31
|
+
return;
|
|
32
|
+
this.busy = true;
|
|
33
|
+
const msg = {
|
|
34
|
+
id: crypto.randomUUID(),
|
|
35
|
+
channelId: 'cli',
|
|
36
|
+
author: { id: 'local', name: 'user' },
|
|
37
|
+
content: trimmed,
|
|
38
|
+
timestamp: new Date().toISOString(),
|
|
39
|
+
};
|
|
40
|
+
try {
|
|
41
|
+
for (const handler of this.handlers) {
|
|
42
|
+
await handler(msg);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
console.error('[tako] Error:', err instanceof Error ? err.message : err);
|
|
47
|
+
}
|
|
48
|
+
finally {
|
|
49
|
+
this.busy = false;
|
|
50
|
+
this.showPrompt();
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
this.rl.on('close', () => {
|
|
54
|
+
// Only exit if CLI is the sole channel (no Discord/Telegram).
|
|
55
|
+
// In Docker or daemon mode, stdin closes immediately — don't kill the process.
|
|
56
|
+
if (!process.env['TAKO_KEEP_ALIVE']) {
|
|
57
|
+
process.exit(0);
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
this.showPrompt();
|
|
61
|
+
}
|
|
62
|
+
/** Display the prompt. */
|
|
63
|
+
showPrompt() {
|
|
64
|
+
this.rl?.prompt();
|
|
65
|
+
}
|
|
66
|
+
async disconnect() {
|
|
67
|
+
this.rl?.close();
|
|
68
|
+
this.rl = null;
|
|
69
|
+
}
|
|
70
|
+
async send(msg) {
|
|
71
|
+
process.stdout.write(msg.content + '\n');
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Send a message and return a synthetic ID.
|
|
75
|
+
* CLI doesn't have real message IDs, but this enables the streaming
|
|
76
|
+
* interface. Subsequent editMessage calls overwrite the current line.
|
|
77
|
+
*/
|
|
78
|
+
async sendAndGetId(msg) {
|
|
79
|
+
process.stdout.write(msg.content);
|
|
80
|
+
return 'cli-stream';
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Edit the current streaming message by clearing and rewriting.
|
|
84
|
+
* For CLI, we use carriage return to overwrite the current output.
|
|
85
|
+
*/
|
|
86
|
+
async editMessage(_chatId, _messageId, content) {
|
|
87
|
+
// Move cursor to start of line, clear, and rewrite
|
|
88
|
+
process.stdout.write('\r\x1b[K' + content);
|
|
89
|
+
}
|
|
90
|
+
onMessage(handler) {
|
|
91
|
+
this.handlers.push(handler);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/channels/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Delivery queue — async message delivery with retry.
|
|
3
|
+
*
|
|
4
|
+
* When channel.send() fails, the message is queued as a JSON file
|
|
5
|
+
* in ~/.tako/delivery-queue/. A background worker retries every 30s
|
|
6
|
+
* with max 3 attempts. Failed messages move to ~/.tako/delivery-queue/failed/.
|
|
7
|
+
*/
|
|
8
|
+
import type { Channel, OutboundMessage } from './channel.js';
|
|
9
|
+
export declare class DeliveryQueue {
|
|
10
|
+
private channels;
|
|
11
|
+
private retryTimer;
|
|
12
|
+
private queueDir;
|
|
13
|
+
private failedDir;
|
|
14
|
+
constructor();
|
|
15
|
+
/** Register a channel for retry delivery. */
|
|
16
|
+
registerChannel(channel: Channel): void;
|
|
17
|
+
/** Start the background retry worker. */
|
|
18
|
+
start(): Promise<void>;
|
|
19
|
+
/** Stop the background retry worker. */
|
|
20
|
+
stop(): void;
|
|
21
|
+
/**
|
|
22
|
+
* Enqueue a failed message for retry.
|
|
23
|
+
* Called when channel.send() throws.
|
|
24
|
+
*/
|
|
25
|
+
enqueue(channelId: string, message: OutboundMessage, error: string): Promise<void>;
|
|
26
|
+
/** Process all queued messages, retrying delivery. */
|
|
27
|
+
private processQueue;
|
|
28
|
+
/** Move a message to the failed directory. */
|
|
29
|
+
private moveFailed;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=delivery-queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delivery-queue.d.ts","sourceRoot":"","sources":["../../src/channels/delivery-queue.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AA8B7D,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,UAAU,CAA+C;IACjE,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,SAAS,CAAS;;IAO1B,6CAA6C;IAC7C,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAIvC,yCAAyC;IACnC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAW5B,wCAAwC;IACxC,IAAI,IAAI,IAAI;IAOZ;;;OAGG;IACG,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBxF,sDAAsD;YACxC,YAAY;IA+C1B,8CAA8C;YAChC,UAAU;CAOzB"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Delivery queue — async message delivery with retry.
|
|
3
|
+
*
|
|
4
|
+
* When channel.send() fails, the message is queued as a JSON file
|
|
5
|
+
* in ~/.tako/delivery-queue/. A background worker retries every 30s
|
|
6
|
+
* with max 3 attempts. Failed messages move to ~/.tako/delivery-queue/failed/.
|
|
7
|
+
*/
|
|
8
|
+
import { homedir } from 'node:os';
|
|
9
|
+
import { join } from 'node:path';
|
|
10
|
+
import { mkdir, readFile, writeFile, readdir, unlink } from 'node:fs/promises';
|
|
11
|
+
// ─── Paths ──────────────────────────────────────────────────────────
|
|
12
|
+
function getQueueDir() {
|
|
13
|
+
return join(homedir(), '.tako', 'delivery-queue');
|
|
14
|
+
}
|
|
15
|
+
function getFailedDir() {
|
|
16
|
+
return join(getQueueDir(), 'failed');
|
|
17
|
+
}
|
|
18
|
+
// ─── DeliveryQueue ──────────────────────────────────────────────────
|
|
19
|
+
const RETRY_INTERVAL_MS = 30_000;
|
|
20
|
+
const MAX_ATTEMPTS = 3;
|
|
21
|
+
export class DeliveryQueue {
|
|
22
|
+
channels = new Map();
|
|
23
|
+
retryTimer = null;
|
|
24
|
+
queueDir;
|
|
25
|
+
failedDir;
|
|
26
|
+
constructor() {
|
|
27
|
+
this.queueDir = getQueueDir();
|
|
28
|
+
this.failedDir = getFailedDir();
|
|
29
|
+
}
|
|
30
|
+
/** Register a channel for retry delivery. */
|
|
31
|
+
registerChannel(channel) {
|
|
32
|
+
this.channels.set(channel.id, channel);
|
|
33
|
+
}
|
|
34
|
+
/** Start the background retry worker. */
|
|
35
|
+
async start() {
|
|
36
|
+
await mkdir(this.queueDir, { recursive: true });
|
|
37
|
+
await mkdir(this.failedDir, { recursive: true });
|
|
38
|
+
this.retryTimer = setInterval(() => {
|
|
39
|
+
this.processQueue().catch((err) => {
|
|
40
|
+
console.error('[delivery-queue] Retry error:', err instanceof Error ? err.message : err);
|
|
41
|
+
});
|
|
42
|
+
}, RETRY_INTERVAL_MS);
|
|
43
|
+
}
|
|
44
|
+
/** Stop the background retry worker. */
|
|
45
|
+
stop() {
|
|
46
|
+
if (this.retryTimer) {
|
|
47
|
+
clearInterval(this.retryTimer);
|
|
48
|
+
this.retryTimer = null;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Enqueue a failed message for retry.
|
|
53
|
+
* Called when channel.send() throws.
|
|
54
|
+
*/
|
|
55
|
+
async enqueue(channelId, message, error) {
|
|
56
|
+
const id = crypto.randomUUID();
|
|
57
|
+
const queued = {
|
|
58
|
+
id,
|
|
59
|
+
channelId,
|
|
60
|
+
message,
|
|
61
|
+
attempts: 1, // already tried once
|
|
62
|
+
maxAttempts: MAX_ATTEMPTS,
|
|
63
|
+
createdAt: new Date().toISOString(),
|
|
64
|
+
lastAttemptAt: new Date().toISOString(),
|
|
65
|
+
lastError: error,
|
|
66
|
+
};
|
|
67
|
+
const filePath = join(this.queueDir, `${id}.json`);
|
|
68
|
+
await writeFile(filePath, JSON.stringify(queued, null, 2) + '\n', 'utf-8');
|
|
69
|
+
console.log(`[delivery-queue] Queued message ${id} for ${channelId} (error: ${error.slice(0, 100)})`);
|
|
70
|
+
}
|
|
71
|
+
/** Process all queued messages, retrying delivery. */
|
|
72
|
+
async processQueue() {
|
|
73
|
+
let files;
|
|
74
|
+
try {
|
|
75
|
+
files = await readdir(this.queueDir);
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
const jsonFiles = files.filter((f) => f.endsWith('.json'));
|
|
81
|
+
if (jsonFiles.length === 0)
|
|
82
|
+
return;
|
|
83
|
+
for (const file of jsonFiles) {
|
|
84
|
+
const filePath = join(this.queueDir, file);
|
|
85
|
+
try {
|
|
86
|
+
const raw = await readFile(filePath, 'utf-8');
|
|
87
|
+
const queued = JSON.parse(raw);
|
|
88
|
+
const channel = this.channels.get(queued.channelId);
|
|
89
|
+
if (!channel) {
|
|
90
|
+
// Channel not registered — move to failed
|
|
91
|
+
await this.moveFailed(filePath, queued, 'Channel not registered');
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
try {
|
|
95
|
+
await channel.send(queued.message);
|
|
96
|
+
// Success — remove from queue
|
|
97
|
+
await unlink(filePath);
|
|
98
|
+
console.log(`[delivery-queue] Delivered queued message ${queued.id}`);
|
|
99
|
+
}
|
|
100
|
+
catch (err) {
|
|
101
|
+
queued.attempts++;
|
|
102
|
+
queued.lastAttemptAt = new Date().toISOString();
|
|
103
|
+
queued.lastError = err instanceof Error ? err.message : String(err);
|
|
104
|
+
if (queued.attempts >= queued.maxAttempts) {
|
|
105
|
+
await this.moveFailed(filePath, queued, queued.lastError);
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
await writeFile(filePath, JSON.stringify(queued, null, 2) + '\n', 'utf-8');
|
|
109
|
+
console.log(`[delivery-queue] Retry ${queued.attempts}/${queued.maxAttempts} for ${queued.id}`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
console.error(`[delivery-queue] Error processing ${file}:`, err instanceof Error ? err.message : err);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/** Move a message to the failed directory. */
|
|
119
|
+
async moveFailed(filePath, queued, reason) {
|
|
120
|
+
queued.lastError = reason;
|
|
121
|
+
const failedPath = join(this.failedDir, `${queued.id}.json`);
|
|
122
|
+
await writeFile(failedPath, JSON.stringify(queued, null, 2) + '\n', 'utf-8');
|
|
123
|
+
await unlink(filePath);
|
|
124
|
+
console.log(`[delivery-queue] Message ${queued.id} moved to failed (${reason.slice(0, 100)})`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=delivery-queue.js.map
|