@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,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Exec approval system — require user confirmation for dangerous commands.
|
|
3
|
+
*
|
|
4
|
+
* Classifies commands by risk level and routes high-risk ones through
|
|
5
|
+
* an approval flow before execution.
|
|
6
|
+
*/
|
|
7
|
+
const DEFAULT_APPROVAL_CONFIG = {
|
|
8
|
+
mode: 'ask',
|
|
9
|
+
alwaysAsk: [],
|
|
10
|
+
allowed: [],
|
|
11
|
+
blocked: [],
|
|
12
|
+
timeoutMs: 60_000,
|
|
13
|
+
autoApproveAfter: undefined,
|
|
14
|
+
};
|
|
15
|
+
// ─── Risk classification patterns ──────────────────────────────────
|
|
16
|
+
const BLOCKED_PATTERNS = [
|
|
17
|
+
{ pattern: /\brm\s+-[^\s]*r[^\s]*f[^\s]*\s+\/\s*$/, reason: 'Recursive delete of root filesystem' },
|
|
18
|
+
{ pattern: /\brm\s+-[^\s]*f[^\s]*r[^\s]*\s+\/\s*$/, reason: 'Recursive delete of root filesystem' },
|
|
19
|
+
{ pattern: /\bformat\b/, reason: 'Disk format command' },
|
|
20
|
+
{ pattern: /\bdd\s+if=/, reason: 'Raw disk write (dd)' },
|
|
21
|
+
{ pattern: /\bmkfs\b/, reason: 'Filesystem creation' },
|
|
22
|
+
{ pattern: /:\(\)\{\s*:\|:&\s*\};:/, reason: 'Fork bomb' },
|
|
23
|
+
];
|
|
24
|
+
const DANGEROUS_PATTERNS = [
|
|
25
|
+
{ pattern: /\bsudo\b/, reason: 'Elevated privileges (sudo)' },
|
|
26
|
+
{ pattern: /\brm\s+-[^\s]*r[^\s]*f/, reason: 'Recursive force delete' },
|
|
27
|
+
{ pattern: /\bchmod\s+777\b/, reason: 'World-writable permissions' },
|
|
28
|
+
{ pattern: /\bcurl\b.*\|\s*\bbash\b/, reason: 'Remote code execution (curl | bash)' },
|
|
29
|
+
{ pattern: /\bwget\b.*\|\s*\bsh\b/, reason: 'Remote code execution (wget | sh)' },
|
|
30
|
+
{ pattern: /\bshutdown\b/, reason: 'System shutdown' },
|
|
31
|
+
{ pattern: /\breboot\b/, reason: 'System reboot' },
|
|
32
|
+
];
|
|
33
|
+
const MODERATE_PATTERNS = [
|
|
34
|
+
{ pattern: /\bgit\s+push\s+--force\b/, reason: 'Force push (destructive)' },
|
|
35
|
+
{ pattern: /\bnpm\s+publish\b/, reason: 'Package publish' },
|
|
36
|
+
{ pattern: /\bdocker\s+rm\b/, reason: 'Docker container removal' },
|
|
37
|
+
{ pattern: /\bkill\s+-9\b/, reason: 'Force kill process' },
|
|
38
|
+
];
|
|
39
|
+
const SAFE_PATTERNS = [
|
|
40
|
+
/^\s*(ls|cat|echo|pwd|git\s+status|git\s+log|npm\s+test|node)\b/,
|
|
41
|
+
];
|
|
42
|
+
export class ExecApprovalManager {
|
|
43
|
+
config;
|
|
44
|
+
pending;
|
|
45
|
+
sessionApprovals; // sessionId -> command -> approval count
|
|
46
|
+
constructor(config) {
|
|
47
|
+
this.config = { ...DEFAULT_APPROVAL_CONFIG, ...config };
|
|
48
|
+
this.pending = new Map();
|
|
49
|
+
this.sessionApprovals = new Map();
|
|
50
|
+
}
|
|
51
|
+
/** Check if a command needs approval. Returns null if auto-approved. */
|
|
52
|
+
checkCommand(command, sessionId) {
|
|
53
|
+
if (this.config.mode === 'off')
|
|
54
|
+
return null;
|
|
55
|
+
const { level, reason } = this.classifyRisk(command);
|
|
56
|
+
// Safe commands never need approval
|
|
57
|
+
if (level === 'safe')
|
|
58
|
+
return null;
|
|
59
|
+
// Blocked commands get an immediate blocked request (no approval possible)
|
|
60
|
+
if (level === 'blocked') {
|
|
61
|
+
const req = {
|
|
62
|
+
id: crypto.randomUUID().slice(0, 8),
|
|
63
|
+
command,
|
|
64
|
+
riskLevel: level,
|
|
65
|
+
reason,
|
|
66
|
+
sessionId,
|
|
67
|
+
timestamp: Date.now(),
|
|
68
|
+
status: 'denied',
|
|
69
|
+
};
|
|
70
|
+
return req;
|
|
71
|
+
}
|
|
72
|
+
// In allowlist mode, check if command is pre-approved
|
|
73
|
+
if (this.config.mode === 'allowlist') {
|
|
74
|
+
const isAllowed = this.config.allowed.some(pattern => command.includes(pattern) || new RegExp(pattern).test(command));
|
|
75
|
+
if (isAllowed)
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
// Check auto-approve threshold
|
|
79
|
+
if (this.config.autoApproveAfter !== undefined) {
|
|
80
|
+
const sessionMap = this.sessionApprovals.get(sessionId);
|
|
81
|
+
if (sessionMap) {
|
|
82
|
+
const count = sessionMap.get(command) ?? 0;
|
|
83
|
+
if (count >= this.config.autoApproveAfter)
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// In 'full' mode, everything non-safe needs approval
|
|
88
|
+
// In 'ask' mode, dangerous/moderate need approval
|
|
89
|
+
if (this.config.mode === 'full' || level === 'dangerous' || level === 'moderate') {
|
|
90
|
+
// Check alwaysAsk overrides
|
|
91
|
+
const forceAsk = this.config.alwaysAsk.some(pattern => command.includes(pattern));
|
|
92
|
+
// In ask mode, moderate commands don't need approval unless in alwaysAsk
|
|
93
|
+
if (this.config.mode === 'ask' && level === 'moderate' && !forceAsk) {
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
const req = {
|
|
97
|
+
id: crypto.randomUUID().slice(0, 8),
|
|
98
|
+
command,
|
|
99
|
+
riskLevel: level,
|
|
100
|
+
reason,
|
|
101
|
+
sessionId,
|
|
102
|
+
timestamp: Date.now(),
|
|
103
|
+
status: 'pending',
|
|
104
|
+
};
|
|
105
|
+
this.pending.set(req.id, req);
|
|
106
|
+
return req;
|
|
107
|
+
}
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
/** Classify command risk level. */
|
|
111
|
+
classifyRisk(command) {
|
|
112
|
+
// Check user-configured blocked list first
|
|
113
|
+
for (const pattern of this.config.blocked) {
|
|
114
|
+
if (command.includes(pattern) || new RegExp(pattern).test(command)) {
|
|
115
|
+
return { level: 'blocked', reason: `Blocked by policy: ${pattern}` };
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// Check built-in blocked patterns
|
|
119
|
+
for (const { pattern, reason } of BLOCKED_PATTERNS) {
|
|
120
|
+
if (pattern.test(command)) {
|
|
121
|
+
return { level: 'blocked', reason };
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// Check dangerous patterns
|
|
125
|
+
for (const { pattern, reason } of DANGEROUS_PATTERNS) {
|
|
126
|
+
if (pattern.test(command)) {
|
|
127
|
+
return { level: 'dangerous', reason };
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// Check moderate patterns
|
|
131
|
+
for (const { pattern, reason } of MODERATE_PATTERNS) {
|
|
132
|
+
if (pattern.test(command)) {
|
|
133
|
+
return { level: 'moderate', reason };
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// Check safe patterns
|
|
137
|
+
for (const pattern of SAFE_PATTERNS) {
|
|
138
|
+
if (pattern.test(command)) {
|
|
139
|
+
return { level: 'safe', reason: 'Known safe command' };
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// Default: safe for unknown commands (ExecSafety handles blocking)
|
|
143
|
+
return { level: 'safe', reason: 'No risk patterns matched' };
|
|
144
|
+
}
|
|
145
|
+
/** Resolve a pending approval. */
|
|
146
|
+
resolve(requestId, decision) {
|
|
147
|
+
const req = this.pending.get(requestId);
|
|
148
|
+
if (!req)
|
|
149
|
+
return;
|
|
150
|
+
req.status = decision;
|
|
151
|
+
this.pending.delete(requestId);
|
|
152
|
+
// Track approval count for auto-approve
|
|
153
|
+
if (decision === 'approved' && this.config.autoApproveAfter !== undefined) {
|
|
154
|
+
if (!this.sessionApprovals.has(req.sessionId)) {
|
|
155
|
+
this.sessionApprovals.set(req.sessionId, new Map());
|
|
156
|
+
}
|
|
157
|
+
const sessionMap = this.sessionApprovals.get(req.sessionId);
|
|
158
|
+
const count = sessionMap.get(req.command) ?? 0;
|
|
159
|
+
sessionMap.set(req.command, count + 1);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
/** Get pending approval for a session. */
|
|
163
|
+
getPending(sessionId) {
|
|
164
|
+
for (const req of this.pending.values()) {
|
|
165
|
+
if (req.sessionId === sessionId && req.status === 'pending') {
|
|
166
|
+
return req;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return undefined;
|
|
170
|
+
}
|
|
171
|
+
/** Format approval request as a user-facing message. */
|
|
172
|
+
formatRequest(req) {
|
|
173
|
+
const riskLabel = req.riskLevel.toUpperCase();
|
|
174
|
+
const lines = [
|
|
175
|
+
`⚠️ Command requires approval [${riskLabel}]`,
|
|
176
|
+
`Command: ${req.command}`,
|
|
177
|
+
`Reason: ${req.reason}`,
|
|
178
|
+
``,
|
|
179
|
+
`Reply with:`,
|
|
180
|
+
` /approve ${req.id} allow — execute this command`,
|
|
181
|
+
` /approve ${req.id} deny — block this command`,
|
|
182
|
+
` /approve ${req.id} allow-always — approve and auto-approve future identical commands`,
|
|
183
|
+
];
|
|
184
|
+
return lines.join('\n');
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=exec-approvals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exec-approvals.js","sourceRoot":"","sources":["../../src/core/exec-approvals.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Heartbeat manager — periodic agent turns for proactive work.
|
|
3
|
+
*
|
|
4
|
+
* Implements the reference runtime heartbeat contract:
|
|
5
|
+
* - Periodic agent turns at configured interval
|
|
6
|
+
* - HEARTBEAT_OK response contract (ack stripped, reply dropped if ≤ maxChars)
|
|
7
|
+
* - Active hours support (only run during configured window)
|
|
8
|
+
* - HEARTBEAT.md workspace file read (skip if empty)
|
|
9
|
+
* - Delivery routing: "none" (silent), "last" (last channel), or explicit
|
|
10
|
+
* - Manual wake support
|
|
11
|
+
*/
|
|
12
|
+
import type { HeartbeatConfig } from '../config/schema.js';
|
|
13
|
+
import type { AgentLoop } from './agent-loop.js';
|
|
14
|
+
import type { SessionManager } from '../gateway/session.js';
|
|
15
|
+
/** Result of a heartbeat run. */
|
|
16
|
+
export interface HeartbeatResult {
|
|
17
|
+
/** Whether the agent responded with HEARTBEAT_OK (acknowledgment). */
|
|
18
|
+
isAck: boolean;
|
|
19
|
+
/** Raw response text from the agent. */
|
|
20
|
+
rawResponse: string;
|
|
21
|
+
/** Cleaned response (HEARTBEAT_OK stripped). */
|
|
22
|
+
deliverableText: string;
|
|
23
|
+
/** Whether the response should be delivered (not suppressed). */
|
|
24
|
+
shouldDeliver: boolean;
|
|
25
|
+
/** Timestamp of the heartbeat run. */
|
|
26
|
+
timestamp: Date;
|
|
27
|
+
}
|
|
28
|
+
/** Delivery handler called when heartbeat produces deliverable output. */
|
|
29
|
+
export type HeartbeatDeliveryHandler = (result: HeartbeatResult, target: string) => void;
|
|
30
|
+
export declare class HeartbeatManager {
|
|
31
|
+
private timer;
|
|
32
|
+
private config;
|
|
33
|
+
private agentLoop;
|
|
34
|
+
private sessions;
|
|
35
|
+
private workspaceRoot;
|
|
36
|
+
private heartbeatSession;
|
|
37
|
+
private running;
|
|
38
|
+
private deliveryHandlers;
|
|
39
|
+
private lastChannel;
|
|
40
|
+
private typingSuppressed;
|
|
41
|
+
constructor(config: HeartbeatConfig, workspaceRoot: string);
|
|
42
|
+
/** Inject dependencies after construction. */
|
|
43
|
+
setDeps(agentLoop: AgentLoop, sessions: SessionManager): void;
|
|
44
|
+
/** Register a handler for deliverable heartbeat output. */
|
|
45
|
+
onDelivery(handler: HeartbeatDeliveryHandler): void;
|
|
46
|
+
/** Track the last active channel for 'last' target routing. */
|
|
47
|
+
setLastChannel(channel: string): void;
|
|
48
|
+
/** Whether typing should be suppressed (heartbeat in progress). */
|
|
49
|
+
isTypingSuppressed(): boolean;
|
|
50
|
+
/** Start the heartbeat loop. */
|
|
51
|
+
start(): void;
|
|
52
|
+
/** Stop the heartbeat loop. */
|
|
53
|
+
stop(): void;
|
|
54
|
+
/** Manual wake — run heartbeat immediately outside the timer. */
|
|
55
|
+
wake(): Promise<HeartbeatResult | null>;
|
|
56
|
+
/** Execute a single heartbeat run. */
|
|
57
|
+
private runHeartbeat;
|
|
58
|
+
/** Parse a heartbeat response according to the HEARTBEAT_OK contract. */
|
|
59
|
+
private parseResponse;
|
|
60
|
+
/** Route delivery to the configured target. */
|
|
61
|
+
private deliver;
|
|
62
|
+
/** Check if the current time is within the active hours window. */
|
|
63
|
+
private isWithinActiveHours;
|
|
64
|
+
/** Read HEARTBEAT.md from workspace. Returns null if file doesn't exist. */
|
|
65
|
+
private readHeartbeatFile;
|
|
66
|
+
/** Get or create the dedicated heartbeat session. */
|
|
67
|
+
private getHeartbeatSession;
|
|
68
|
+
}
|
|
69
|
+
/** Parse a duration string like "30m", "1h", "2h30m" into milliseconds. */
|
|
70
|
+
export declare function parseDuration(duration: string): number;
|
|
71
|
+
//# sourceMappingURL=heartbeat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heartbeat.d.ts","sourceRoot":"","sources":["../../src/core/heartbeat.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAW,MAAM,uBAAuB,CAAC;AAErE,iCAAiC;AACjC,MAAM,WAAW,eAAe;IAC9B,sEAAsE;IACtE,KAAK,EAAE,OAAO,CAAC;IACf,wCAAwC;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,gDAAgD;IAChD,eAAe,EAAE,MAAM,CAAC;IACxB,iEAAiE;IACjE,aAAa,EAAE,OAAO,CAAC;IACvB,sCAAsC;IACtC,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,0EAA0E;AAC1E,MAAM,MAAM,wBAAwB,GAAG,CAAC,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;AAEzF,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,QAAQ,CAA+B;IAC/C,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,gBAAgB,CAAwB;IAChD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,gBAAgB,CAAkC;IAC1D,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,gBAAgB,CAAS;gBAErB,MAAM,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM;IAK1D,8CAA8C;IAC9C,OAAO,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,GAAG,IAAI;IAK7D,2DAA2D;IAC3D,UAAU,CAAC,OAAO,EAAE,wBAAwB,GAAG,IAAI;IAInD,+DAA+D;IAC/D,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIrC,mEAAmE;IACnE,kBAAkB,IAAI,OAAO;IAI7B,gCAAgC;IAChC,KAAK,IAAI,IAAI;IAiBb,+BAA+B;IAC/B,IAAI,IAAI,IAAI;IASZ,iEAAiE;IAC3D,IAAI,IAAI,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAI7C,sCAAsC;YACxB,YAAY;IA4C1B,yEAAyE;IACzE,OAAO,CAAC,aAAa;IAyBrB,+CAA+C;IAC/C,OAAO,CAAC,OAAO;IAkBf,mEAAmE;IACnE,OAAO,CAAC,mBAAmB;IA+B3B,4EAA4E;YAC9D,iBAAiB;IAQ/B,qDAAqD;IACrD,OAAO,CAAC,mBAAmB;CAS5B;AAED,2EAA2E;AAC3E,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAatD"}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Heartbeat manager — periodic agent turns for proactive work.
|
|
3
|
+
*
|
|
4
|
+
* Implements the reference runtime heartbeat contract:
|
|
5
|
+
* - Periodic agent turns at configured interval
|
|
6
|
+
* - HEARTBEAT_OK response contract (ack stripped, reply dropped if ≤ maxChars)
|
|
7
|
+
* - Active hours support (only run during configured window)
|
|
8
|
+
* - HEARTBEAT.md workspace file read (skip if empty)
|
|
9
|
+
* - Delivery routing: "none" (silent), "last" (last channel), or explicit
|
|
10
|
+
* - Manual wake support
|
|
11
|
+
*/
|
|
12
|
+
import { readFile } from 'node:fs/promises';
|
|
13
|
+
import { join } from 'node:path';
|
|
14
|
+
export class HeartbeatManager {
|
|
15
|
+
timer = null;
|
|
16
|
+
config;
|
|
17
|
+
agentLoop = null;
|
|
18
|
+
sessions = null;
|
|
19
|
+
workspaceRoot;
|
|
20
|
+
heartbeatSession = null;
|
|
21
|
+
running = false;
|
|
22
|
+
deliveryHandlers = [];
|
|
23
|
+
lastChannel = null;
|
|
24
|
+
typingSuppressed = false;
|
|
25
|
+
constructor(config, workspaceRoot) {
|
|
26
|
+
this.config = config;
|
|
27
|
+
this.workspaceRoot = workspaceRoot;
|
|
28
|
+
}
|
|
29
|
+
/** Inject dependencies after construction. */
|
|
30
|
+
setDeps(agentLoop, sessions) {
|
|
31
|
+
this.agentLoop = agentLoop;
|
|
32
|
+
this.sessions = sessions;
|
|
33
|
+
}
|
|
34
|
+
/** Register a handler for deliverable heartbeat output. */
|
|
35
|
+
onDelivery(handler) {
|
|
36
|
+
this.deliveryHandlers.push(handler);
|
|
37
|
+
}
|
|
38
|
+
/** Track the last active channel for 'last' target routing. */
|
|
39
|
+
setLastChannel(channel) {
|
|
40
|
+
this.lastChannel = channel;
|
|
41
|
+
}
|
|
42
|
+
/** Whether typing should be suppressed (heartbeat in progress). */
|
|
43
|
+
isTypingSuppressed() {
|
|
44
|
+
return this.typingSuppressed;
|
|
45
|
+
}
|
|
46
|
+
/** Start the heartbeat loop. */
|
|
47
|
+
start() {
|
|
48
|
+
const intervalMs = parseDuration(this.config.every);
|
|
49
|
+
if (intervalMs <= 0) {
|
|
50
|
+
console.log('[heartbeat] Disabled (every=0)');
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
this.running = true;
|
|
54
|
+
this.timer = setInterval(() => {
|
|
55
|
+
this.runHeartbeat().catch((err) => {
|
|
56
|
+
console.error('[heartbeat] Error:', err instanceof Error ? err.message : err);
|
|
57
|
+
});
|
|
58
|
+
}, intervalMs);
|
|
59
|
+
console.log(`[heartbeat] Started (every ${this.config.every}, target=${this.config.target})`);
|
|
60
|
+
}
|
|
61
|
+
/** Stop the heartbeat loop. */
|
|
62
|
+
stop() {
|
|
63
|
+
if (this.timer) {
|
|
64
|
+
clearInterval(this.timer);
|
|
65
|
+
this.timer = null;
|
|
66
|
+
}
|
|
67
|
+
this.running = false;
|
|
68
|
+
console.log('[heartbeat] Stopped');
|
|
69
|
+
}
|
|
70
|
+
/** Manual wake — run heartbeat immediately outside the timer. */
|
|
71
|
+
async wake() {
|
|
72
|
+
return this.runHeartbeat();
|
|
73
|
+
}
|
|
74
|
+
/** Execute a single heartbeat run. */
|
|
75
|
+
async runHeartbeat() {
|
|
76
|
+
if (!this.agentLoop || !this.sessions) {
|
|
77
|
+
console.warn('[heartbeat] Not initialized (missing agentLoop or sessions)');
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
// 1. Check active hours
|
|
81
|
+
if (!this.isWithinActiveHours()) {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
// 2. Read HEARTBEAT.md — skip if empty
|
|
85
|
+
const heartbeatContent = await this.readHeartbeatFile();
|
|
86
|
+
if (heartbeatContent !== null && heartbeatContent.trim() === '') {
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
// 3. Suppress typing during heartbeat
|
|
90
|
+
this.typingSuppressed = true;
|
|
91
|
+
try {
|
|
92
|
+
// 4. Get or create heartbeat session
|
|
93
|
+
const session = this.getHeartbeatSession();
|
|
94
|
+
// 5. Run agent loop with heartbeat prompt
|
|
95
|
+
let response = '';
|
|
96
|
+
for await (const chunk of this.agentLoop.run(session, this.config.prompt)) {
|
|
97
|
+
response += chunk;
|
|
98
|
+
}
|
|
99
|
+
// 6. Parse response: HEARTBEAT_OK contract
|
|
100
|
+
const result = this.parseResponse(response);
|
|
101
|
+
// 7. Route delivery
|
|
102
|
+
if (result.shouldDeliver) {
|
|
103
|
+
this.deliver(result);
|
|
104
|
+
}
|
|
105
|
+
return result;
|
|
106
|
+
}
|
|
107
|
+
finally {
|
|
108
|
+
this.typingSuppressed = false;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/** Parse a heartbeat response according to the HEARTBEAT_OK contract. */
|
|
112
|
+
parseResponse(raw) {
|
|
113
|
+
const trimmed = raw.trim();
|
|
114
|
+
const hasAck = trimmed.startsWith('HEARTBEAT_OK') || trimmed.endsWith('HEARTBEAT_OK');
|
|
115
|
+
// Strip HEARTBEAT_OK from the response
|
|
116
|
+
const cleaned = trimmed
|
|
117
|
+
.replace(/^HEARTBEAT_OK\s*/i, '')
|
|
118
|
+
.replace(/\s*HEARTBEAT_OK$/i, '')
|
|
119
|
+
.trim();
|
|
120
|
+
// If ack and remaining text is short, suppress delivery
|
|
121
|
+
const shouldDeliver = hasAck
|
|
122
|
+
? cleaned.length > this.config.ackMaxChars
|
|
123
|
+
: cleaned.length > 0;
|
|
124
|
+
return {
|
|
125
|
+
isAck: hasAck,
|
|
126
|
+
rawResponse: raw,
|
|
127
|
+
deliverableText: cleaned,
|
|
128
|
+
shouldDeliver,
|
|
129
|
+
timestamp: new Date(),
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
/** Route delivery to the configured target. */
|
|
133
|
+
deliver(result) {
|
|
134
|
+
let target = this.config.target;
|
|
135
|
+
if (target === 'none')
|
|
136
|
+
return;
|
|
137
|
+
if (target === 'last') {
|
|
138
|
+
target = this.lastChannel ?? 'none';
|
|
139
|
+
if (target === 'none')
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
for (const handler of this.deliveryHandlers) {
|
|
143
|
+
try {
|
|
144
|
+
handler(result, target);
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
// Don't let handler errors crash the heartbeat system
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
/** Check if the current time is within the active hours window. */
|
|
152
|
+
isWithinActiveHours() {
|
|
153
|
+
if (!this.config.activeHours)
|
|
154
|
+
return true;
|
|
155
|
+
const { start, end, timezone } = this.config.activeHours;
|
|
156
|
+
const now = new Date();
|
|
157
|
+
// Get current time in the configured timezone
|
|
158
|
+
const formatter = new Intl.DateTimeFormat('en-US', {
|
|
159
|
+
hour: '2-digit',
|
|
160
|
+
minute: '2-digit',
|
|
161
|
+
hour12: false,
|
|
162
|
+
timeZone: timezone ?? undefined,
|
|
163
|
+
});
|
|
164
|
+
const parts = formatter.formatToParts(now);
|
|
165
|
+
const hour = parseInt(parts.find((p) => p.type === 'hour')?.value ?? '0', 10);
|
|
166
|
+
const minute = parseInt(parts.find((p) => p.type === 'minute')?.value ?? '0', 10);
|
|
167
|
+
const currentMinutes = hour * 60 + minute;
|
|
168
|
+
const [startH, startM] = start.split(':').map(Number);
|
|
169
|
+
const [endH, endM] = end.split(':').map(Number);
|
|
170
|
+
const startMinutes = startH * 60 + startM;
|
|
171
|
+
const endMinutes = endH * 60 + endM;
|
|
172
|
+
if (startMinutes <= endMinutes) {
|
|
173
|
+
return currentMinutes >= startMinutes && currentMinutes < endMinutes;
|
|
174
|
+
}
|
|
175
|
+
// Wraps midnight
|
|
176
|
+
return currentMinutes >= startMinutes || currentMinutes < endMinutes;
|
|
177
|
+
}
|
|
178
|
+
/** Read HEARTBEAT.md from workspace. Returns null if file doesn't exist. */
|
|
179
|
+
async readHeartbeatFile() {
|
|
180
|
+
try {
|
|
181
|
+
return await readFile(join(this.workspaceRoot, 'HEARTBEAT.md'), 'utf-8');
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
/** Get or create the dedicated heartbeat session. */
|
|
188
|
+
getHeartbeatSession() {
|
|
189
|
+
if (!this.heartbeatSession) {
|
|
190
|
+
this.heartbeatSession = this.sessions.create({
|
|
191
|
+
name: 'heartbeat',
|
|
192
|
+
metadata: { isHeartbeat: true },
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
return this.heartbeatSession;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
/** Parse a duration string like "30m", "1h", "2h30m" into milliseconds. */
|
|
199
|
+
export function parseDuration(duration) {
|
|
200
|
+
if (!duration || duration === '0' || duration === '0m')
|
|
201
|
+
return 0;
|
|
202
|
+
let totalMs = 0;
|
|
203
|
+
const hourMatch = duration.match(/(\d+)\s*h/i);
|
|
204
|
+
const minMatch = duration.match(/(\d+)\s*m/i);
|
|
205
|
+
const secMatch = duration.match(/(\d+)\s*s/i);
|
|
206
|
+
if (hourMatch)
|
|
207
|
+
totalMs += parseInt(hourMatch[1], 10) * 3600_000;
|
|
208
|
+
if (minMatch)
|
|
209
|
+
totalMs += parseInt(minMatch[1], 10) * 60_000;
|
|
210
|
+
if (secMatch)
|
|
211
|
+
totalMs += parseInt(secMatch[1], 10) * 1000;
|
|
212
|
+
return totalMs;
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=heartbeat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heartbeat.js","sourceRoot":"","sources":["../../src/core/heartbeat.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Message queue — collect, debounce, and cap inbound messages.
|
|
3
|
+
*
|
|
4
|
+
* When messages arrive faster than the model can process them:
|
|
5
|
+
* - collect: batch messages within a time window
|
|
6
|
+
* - debounce: wait for a pause in typing before processing
|
|
7
|
+
* - cap: limit max queued messages to prevent context overflow
|
|
8
|
+
* - drop: configurable strategy when cap is hit (oldest, summarize)
|
|
9
|
+
*/
|
|
10
|
+
export interface QueueConfig {
|
|
11
|
+
/** Queue mode: 'off' | 'collect' | 'debounce' */
|
|
12
|
+
mode: 'off' | 'collect' | 'debounce';
|
|
13
|
+
/** Debounce delay in ms (default: 2000) */
|
|
14
|
+
debounceMs: number;
|
|
15
|
+
/** Max messages to collect before force-processing (default: 25) */
|
|
16
|
+
cap: number;
|
|
17
|
+
/** What to do when cap is hit: 'oldest' drops oldest, 'summarize' summarizes */
|
|
18
|
+
dropStrategy: 'oldest' | 'summarize';
|
|
19
|
+
/** Max wait time before force-processing in ms (default: 10000) */
|
|
20
|
+
maxWaitMs: number;
|
|
21
|
+
}
|
|
22
|
+
export interface QueuedMessage {
|
|
23
|
+
content: string;
|
|
24
|
+
channelId: string;
|
|
25
|
+
authorId: string;
|
|
26
|
+
timestamp: number;
|
|
27
|
+
messageId: string;
|
|
28
|
+
}
|
|
29
|
+
export declare class MessageQueue {
|
|
30
|
+
private config;
|
|
31
|
+
private queues;
|
|
32
|
+
private timers;
|
|
33
|
+
private maxTimers;
|
|
34
|
+
private processor;
|
|
35
|
+
constructor(config: Partial<QueueConfig>, processor: (sessionId: string, messages: QueuedMessage[]) => Promise<void>);
|
|
36
|
+
/** Enqueue a message. Returns true if message was queued (not processed immediately). */
|
|
37
|
+
enqueue(sessionId: string, message: QueuedMessage): boolean;
|
|
38
|
+
/** Force-flush a session's queue immediately. */
|
|
39
|
+
flush(sessionId: string): Promise<void>;
|
|
40
|
+
/** Get current queue depth for a session. */
|
|
41
|
+
depth(sessionId: string): number;
|
|
42
|
+
/** Clear all queues and timers. */
|
|
43
|
+
clear(): void;
|
|
44
|
+
/** Get queue status for all sessions. */
|
|
45
|
+
status(): Array<{
|
|
46
|
+
sessionId: string;
|
|
47
|
+
depth: number;
|
|
48
|
+
oldestMs: number;
|
|
49
|
+
}>;
|
|
50
|
+
/** Update the queue mode at runtime. */
|
|
51
|
+
setMode(mode: 'off' | 'collect' | 'debounce'): void;
|
|
52
|
+
/** Get current config. */
|
|
53
|
+
getConfig(): QueueConfig;
|
|
54
|
+
private startDebounceTimer;
|
|
55
|
+
private startMaxWaitTimer;
|
|
56
|
+
private processQueue;
|
|
57
|
+
/** Merge queued messages into a single string for the model. */
|
|
58
|
+
static mergeMessages(messages: QueuedMessage[]): string;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=message-queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-queue.d.ts","sourceRoot":"","sources":["../../src/core/message-queue.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,WAAW;IAC1B,iDAAiD;IACjD,IAAI,EAAE,KAAK,GAAG,SAAS,GAAG,UAAU,CAAC;IACrC,2CAA2C;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,oEAAoE;IACpE,GAAG,EAAE,MAAM,CAAC;IACZ,gFAAgF;IAChF,YAAY,EAAE,QAAQ,GAAG,WAAW,CAAC;IACrC,mEAAmE;IACnE,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAUD,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,MAAM,CAA+B;IAC7C,OAAO,CAAC,MAAM,CAA6C;IAC3D,OAAO,CAAC,SAAS,CAA6C;IAC9D,OAAO,CAAC,SAAS,CAAkE;gBAGjF,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,EAC5B,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC;IAS5E,yFAAyF;IACzF,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO;IA8C3D,iDAAiD;IAC3C,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7C,6CAA6C;IAC7C,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAIhC,mCAAmC;IACnC,KAAK,IAAI,IAAI;IAQb,yCAAyC;IACzC,MAAM,IAAI,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAcvE,wCAAwC;IACxC,OAAO,CAAC,IAAI,EAAE,KAAK,GAAG,SAAS,GAAG,UAAU,GAAG,IAAI;IAInD,0BAA0B;IAC1B,SAAS,IAAI,WAAW;IAIxB,OAAO,CAAC,kBAAkB;IAe1B,OAAO,CAAC,iBAAiB;YAcX,YAAY;IAuB1B,gEAAgE;IAChE,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,MAAM;CAyBxD"}
|