crewly 1.13.1 → 1.14.0
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/config/constants.ts +8 -0
- package/config/roles/orchestrator/prompt.md +23 -0
- package/config/skills/agent/core/reply-channel/SKILL.md +6 -0
- package/config/skills/agent/core/reply-channel/execute.sh +14 -2
- package/config/skills/agent/core/slack-post/SKILL.md +126 -0
- package/config/skills/agent/core/slack-post/execute.sh +127 -0
- package/config/skills/agent/remote-browser/SKILL.md +178 -0
- package/config/skills/agent/xiaoyuzhoufm-transcript/SKILL.md +46 -22
- package/config/skills/agent/xiaoyuzhoufm-transcript/execute.sh +82 -214
- package/config/skills/agent/xiaoyuzhoufm-transcript/skill.json +3 -3
- package/config/skills/orchestrator/get-team-status/SKILL.md +5 -1
- package/config/skills/orchestrator/get-team-status/execute.sh +28 -2
- package/config/slack-app-manifest.json +7 -1
- package/dist/backend/backend/src/config/oauth.config.d.ts +93 -19
- package/dist/backend/backend/src/config/oauth.config.d.ts.map +1 -1
- package/dist/backend/backend/src/config/oauth.config.js +121 -19
- package/dist/backend/backend/src/config/oauth.config.js.map +1 -1
- package/dist/backend/backend/src/constants.d.ts +60 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +74 -0
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/chat/chat.controller.js +33 -4
- package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/credentials/google-oauth.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/credentials/google-oauth.controller.js +27 -9
- package/dist/backend/backend/src/controllers/credentials/google-oauth.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/slack/slack.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/slack/slack.controller.js +342 -0
- package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +23 -7
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/services/agent/idle-detection.service.d.ts +10 -0
- package/dist/backend/backend/src/services/agent/idle-detection.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/idle-detection.service.js +37 -0
- package/dist/backend/backend/src/services/agent/idle-detection.service.js.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-bridge.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-bridge.service.js +13 -11
- package/dist/backend/backend/src/services/browser/browser-bridge.service.js.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-proxy.service.d.ts +14 -0
- package/dist/backend/backend/src/services/browser/browser-proxy.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-proxy.service.js +56 -0
- package/dist/backend/backend/src/services/browser/browser-proxy.service.js.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-services.registry.d.ts +63 -0
- package/dist/backend/backend/src/services/browser/browser-services.registry.d.ts.map +1 -0
- package/dist/backend/backend/src/services/browser/browser-services.registry.js +74 -0
- package/dist/backend/backend/src/services/browser/browser-services.registry.js.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +25 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +19 -7
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts +57 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js +110 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts +21 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js +43 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
- package/dist/backend/backend/src/services/core/storage.service.d.ts +6 -0
- package/dist/backend/backend/src/services/core/storage.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/core/storage.service.js +1 -1
- package/dist/backend/backend/src/services/core/storage.service.js.map +1 -1
- package/dist/backend/backend/src/services/credential/helpers/gemini-cli-workspace.helper.d.ts.map +1 -1
- package/dist/backend/backend/src/services/credential/helpers/gemini-cli-workspace.helper.js +6 -2
- package/dist/backend/backend/src/services/credential/helpers/gemini-cli-workspace.helper.js.map +1 -1
- package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.js +14 -0
- package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.js.map +1 -1
- package/dist/backend/backend/src/services/orc/orc-delivery-enforcer.service.d.ts +8 -0
- package/dist/backend/backend/src/services/orc/orc-delivery-enforcer.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/orc-delivery-enforcer.service.js +31 -3
- package/dist/backend/backend/src/services/orc/orc-delivery-enforcer.service.js.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts +34 -0
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js +99 -10
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-agent-identity.service.d.ts +209 -0
- package/dist/backend/backend/src/services/slack/slack-agent-identity.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-agent-identity.service.js +416 -0
- package/dist/backend/backend/src/services/slack/slack-agent-identity.service.js.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-agent-post.service.d.ts +124 -0
- package/dist/backend/backend/src/services/slack/slack-agent-post.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-agent-post.service.js +243 -0
- package/dist/backend/backend/src/services/slack/slack-agent-post.service.js.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-initializer.d.ts +11 -0
- package/dist/backend/backend/src/services/slack/slack-initializer.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-initializer.js +56 -0
- package/dist/backend/backend/src/services/slack/slack-initializer.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-mention-resolver.d.ts +103 -0
- package/dist/backend/backend/src/services/slack/slack-mention-resolver.d.ts.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-mention-resolver.js +197 -0
- package/dist/backend/backend/src/services/slack/slack-mention-resolver.js.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +18 -0
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +329 -0
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +821 -0
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -0
- package/dist/backend/backend/src/services/slack/slack.service.d.ts +116 -1
- package/dist/backend/backend/src/services/slack/slack.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack.service.js +297 -3
- package/dist/backend/backend/src/services/slack/slack.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts +22 -0
- package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js +71 -0
- package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.d.ts +20 -2
- package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.js +27 -2
- package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.js.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.d.ts +15 -2
- package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.js +33 -7
- package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.js.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.d.ts +37 -0
- package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.js +74 -8
- package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.js.map +1 -1
- package/dist/backend/backend/src/types/slack.types.d.ts +87 -0
- package/dist/backend/backend/src/types/slack.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/slack.types.js.map +1 -1
- package/dist/backend/build-info.json +2 -2
- package/dist/backend/config/constants.d.ts +8 -0
- package/dist/backend/config/constants.d.ts.map +1 -1
- package/dist/backend/config/constants.js +8 -0
- package/dist/backend/config/constants.js.map +1 -1
- package/dist/cli/backend/src/config/oauth.config.d.ts +93 -19
- package/dist/cli/backend/src/config/oauth.config.d.ts.map +1 -1
- package/dist/cli/backend/src/config/oauth.config.js +121 -19
- package/dist/cli/backend/src/config/oauth.config.js.map +1 -1
- package/dist/cli/backend/src/constants.d.ts +60 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +74 -0
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +292 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +420 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.mention-resolver.d.ts +134 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.mention-resolver.d.ts.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.mention-resolver.js +232 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.mention-resolver.js.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts +57 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js +110 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts +21 -0
- package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js +43 -0
- package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
- package/dist/cli/backend/src/services/core/storage.service.d.ts +6 -0
- package/dist/cli/backend/src/services/core/storage.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/core/storage.service.js +1 -1
- package/dist/cli/backend/src/services/core/storage.service.js.map +1 -1
- package/dist/cli/backend/src/services/credential/helpers/gemini-cli-workspace.helper.d.ts.map +1 -1
- package/dist/cli/backend/src/services/credential/helpers/gemini-cli-workspace.helper.js +6 -2
- package/dist/cli/backend/src/services/credential/helpers/gemini-cli-workspace.helper.js.map +1 -1
- package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.d.ts +8 -0
- package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.js +31 -3
- package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-agent-identity.service.d.ts +209 -0
- package/dist/cli/backend/src/services/slack/slack-agent-identity.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/slack/slack-agent-identity.service.js +416 -0
- package/dist/cli/backend/src/services/slack/slack-agent-identity.service.js.map +1 -0
- package/dist/cli/backend/src/services/slack/slack-mention-resolver.d.ts +103 -0
- package/dist/cli/backend/src/services/slack/slack-mention-resolver.d.ts.map +1 -0
- package/dist/cli/backend/src/services/slack/slack-mention-resolver.js +197 -0
- package/dist/cli/backend/src/services/slack/slack-mention-resolver.js.map +1 -0
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js +18 -0
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +329 -0
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +821 -0
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -0
- package/dist/cli/backend/src/services/slack/slack.service.d.ts +116 -1
- package/dist/cli/backend/src/services/slack/slack.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack.service.js +297 -3
- package/dist/cli/backend/src/services/slack/slack.service.js.map +1 -1
- package/dist/cli/backend/src/types/slack.types.d.ts +87 -0
- package/dist/cli/backend/src/types/slack.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/slack.types.js.map +1 -1
- package/dist/cli/backend/src/utils/team.utils.d.ts +40 -0
- package/dist/cli/backend/src/utils/team.utils.d.ts.map +1 -0
- package/dist/cli/backend/src/utils/team.utils.js +66 -0
- package/dist/cli/backend/src/utils/team.utils.js.map +1 -0
- package/dist/cli/cli/src/index.js +0 -0
- package/dist/cli/config/constants.d.ts +8 -0
- package/dist/cli/config/constants.d.ts.map +1 -1
- package/dist/cli/config/constants.js +8 -0
- package/dist/cli/config/constants.js.map +1 -1
- package/frontend/dist/assets/{index-890d3f9d.js → index-190a957f.js} +294 -294
- package/frontend/dist/assets/{index-8205ea5e.css → index-88feb412.css} +1 -1
- package/frontend/dist/index.html +2 -2
- package/package.json +1 -1
- package/dist/backend/backend/src/controllers/knowledge/index.d.ts +0 -7
- package/dist/backend/backend/src/controllers/knowledge/index.d.ts.map +0 -1
- package/dist/backend/backend/src/controllers/knowledge/index.js +0 -7
- package/dist/backend/backend/src/controllers/knowledge/index.js.map +0 -1
- package/dist/backend/backend/src/controllers/knowledge/knowledge.controller.d.ts +0 -71
- package/dist/backend/backend/src/controllers/knowledge/knowledge.controller.d.ts.map +0 -1
- package/dist/backend/backend/src/controllers/knowledge/knowledge.controller.js +0 -237
- package/dist/backend/backend/src/controllers/knowledge/knowledge.controller.js.map +0 -1
- package/dist/backend/backend/src/controllers/knowledge/knowledge.routes.d.ts +0 -24
- package/dist/backend/backend/src/controllers/knowledge/knowledge.routes.d.ts.map +0 -1
- package/dist/backend/backend/src/controllers/knowledge/knowledge.routes.js +0 -34
- package/dist/backend/backend/src/controllers/knowledge/knowledge.routes.js.map +0 -1
- package/dist/backend/backend/src/controllers/scheduler/unified-scheduler.controller.d.ts +0 -91
- package/dist/backend/backend/src/controllers/scheduler/unified-scheduler.controller.d.ts.map +0 -1
- package/dist/backend/backend/src/controllers/scheduler/unified-scheduler.controller.js +0 -290
- package/dist/backend/backend/src/controllers/scheduler/unified-scheduler.controller.js.map +0 -1
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.d.ts +0 -169
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.d.ts.map +0 -1
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.js +0 -1779
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.js.map +0 -1
- package/dist/backend/backend/src/index.js.orc-bak-20260529 +0 -3130
- package/dist/backend/backend/src/routes/modules/unified-scheduler.routes.d.ts +0 -27
- package/dist/backend/backend/src/routes/modules/unified-scheduler.routes.d.ts.map +0 -1
- package/dist/backend/backend/src/routes/modules/unified-scheduler.routes.js +0 -40
- package/dist/backend/backend/src/routes/modules/unified-scheduler.routes.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.d.ts +0 -513
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.js +0 -1568
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.d.ts +0 -86
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.js +0 -147
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/api-client.d.ts +0 -68
- package/dist/backend/backend/src/services/agent/crewly-agent/api-client.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/api-client.js +0 -131
- package/dist/backend/backend/src/services/agent/crewly-agent/api-client.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.d.ts +0 -130
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.js +0 -263
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.d.ts +0 -74
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.js +0 -140
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.d.ts +0 -29
- package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.js +0 -279
- package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.d.ts +0 -340
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.js +0 -1176
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.d.ts +0 -79
- package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.js +0 -145
- package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.d.ts +0 -79
- package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.js +0 -218
- package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/index.d.ts +0 -16
- package/dist/backend/backend/src/services/agent/crewly-agent/index.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/index.js +0 -16
- package/dist/backend/backend/src/services/agent/crewly-agent/index.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.d.ts +0 -135
- package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.js +0 -185
- package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts +0 -141
- package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js +0 -310
- package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.d.ts +0 -91
- package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.js +0 -143
- package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.d.ts +0 -103
- package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.js +0 -256
- package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.d.ts +0 -143
- package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.js +0 -264
- package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.d.ts +0 -13
- package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.js +0 -91
- package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.d.ts +0 -135
- package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.js +0 -1937
- package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.js.map +0 -1
- package/dist/backend/backend/src/services/autonomous/auto-assign.service.d.ts +0 -429
- package/dist/backend/backend/src/services/autonomous/auto-assign.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/autonomous/auto-assign.service.js +0 -852
- package/dist/backend/backend/src/services/autonomous/auto-assign.service.js.map +0 -1
- package/dist/backend/backend/src/services/knowledge/embedding-provider.d.ts +0 -78
- package/dist/backend/backend/src/services/knowledge/embedding-provider.d.ts.map +0 -1
- package/dist/backend/backend/src/services/knowledge/embedding-provider.js +0 -179
- package/dist/backend/backend/src/services/knowledge/embedding-provider.js.map +0 -1
- package/dist/backend/backend/src/services/knowledge/fts5-index.service.d.ts +0 -118
- package/dist/backend/backend/src/services/knowledge/fts5-index.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/knowledge/fts5-index.service.js +0 -241
- package/dist/backend/backend/src/services/knowledge/fts5-index.service.js.map +0 -1
- package/dist/backend/backend/src/services/knowledge/fts5-query-sanitizer.d.ts +0 -102
- package/dist/backend/backend/src/services/knowledge/fts5-query-sanitizer.d.ts.map +0 -1
- package/dist/backend/backend/src/services/knowledge/fts5-query-sanitizer.js +0 -118
- package/dist/backend/backend/src/services/knowledge/fts5-query-sanitizer.js.map +0 -1
- package/dist/backend/backend/src/services/knowledge/index.d.ts +0 -8
- package/dist/backend/backend/src/services/knowledge/index.d.ts.map +0 -1
- package/dist/backend/backend/src/services/knowledge/index.js +0 -8
- package/dist/backend/backend/src/services/knowledge/index.js.map +0 -1
- package/dist/backend/backend/src/services/knowledge/knowledge-search.service.d.ts +0 -241
- package/dist/backend/backend/src/services/knowledge/knowledge-search.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/knowledge/knowledge-search.service.js +0 -590
- package/dist/backend/backend/src/services/knowledge/knowledge-search.service.js.map +0 -1
- package/dist/backend/backend/src/services/knowledge/knowledge.service.d.ts +0 -153
- package/dist/backend/backend/src/services/knowledge/knowledge.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/knowledge/knowledge.service.js +0 -409
- package/dist/backend/backend/src/services/knowledge/knowledge.service.js.map +0 -1
- package/dist/backend/backend/src/services/knowledge/vector-store.service.d.ts +0 -331
- package/dist/backend/backend/src/services/knowledge/vector-store.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/knowledge/vector-store.service.js +0 -830
- package/dist/backend/backend/src/services/knowledge/vector-store.service.js.map +0 -1
- package/dist/backend/backend/src/services/knowledge/wiki-compiler.service.d.ts +0 -115
- package/dist/backend/backend/src/services/knowledge/wiki-compiler.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/knowledge/wiki-compiler.service.js +0 -215
- package/dist/backend/backend/src/services/knowledge/wiki-compiler.service.js.map +0 -1
- package/dist/backend/backend/src/services/memory/embedding-provider.d.ts +0 -78
- package/dist/backend/backend/src/services/memory/embedding-provider.d.ts.map +0 -1
- package/dist/backend/backend/src/services/memory/embedding-provider.js +0 -185
- package/dist/backend/backend/src/services/memory/embedding-provider.js.map +0 -1
- package/dist/backend/backend/src/services/memory/vector-store.service.d.ts +0 -331
- package/dist/backend/backend/src/services/memory/vector-store.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/memory/vector-store.service.js +0 -825
- package/dist/backend/backend/src/services/memory/vector-store.service.js.map +0 -1
- package/dist/backend/backend/src/services/project/task-tracking.service.d.ts +0 -171
- package/dist/backend/backend/src/services/project/task-tracking.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/project/task-tracking.service.js +0 -725
- package/dist/backend/backend/src/services/project/task-tracking.service.js.map +0 -1
- package/dist/backend/backend/src/services/v3/project-task-watcher.service.d.ts +0 -118
- package/dist/backend/backend/src/services/v3/project-task-watcher.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/v3/project-task-watcher.service.js +0 -326
- package/dist/backend/backend/src/services/v3/project-task-watcher.service.js.map +0 -1
- package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.d.ts +0 -74
- package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.js +0 -154
- package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.js.map +0 -1
- package/dist/backend/backend/src/services/workflow/unified-scheduler.service.d.ts +0 -234
- package/dist/backend/backend/src/services/workflow/unified-scheduler.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/workflow/unified-scheduler.service.js +0 -636
- package/dist/backend/backend/src/services/workflow/unified-scheduler.service.js.map +0 -1
- package/dist/backend/backend/src/services/workflow/unified-scheduler.types.d.ts +0 -156
- package/dist/backend/backend/src/services/workflow/unified-scheduler.types.d.ts.map +0 -1
- package/dist/backend/backend/src/services/workflow/unified-scheduler.types.js +0 -81
- package/dist/backend/backend/src/services/workflow/unified-scheduler.types.js.map +0 -1
- package/dist/backend/backend/src/types/auto-assign.types.d.ts +0 -271
- package/dist/backend/backend/src/types/auto-assign.types.d.ts.map +0 -1
- package/dist/backend/backend/src/types/auto-assign.types.js +0 -136
- package/dist/backend/backend/src/types/auto-assign.types.js.map +0 -1
- package/dist/backend/backend/src/types/knowledge.types.d.ts +0 -195
- package/dist/backend/backend/src/types/knowledge.types.d.ts.map +0 -1
- package/dist/backend/backend/src/types/knowledge.types.js +0 -38
- package/dist/backend/backend/src/types/knowledge.types.js.map +0 -1
- package/dist/backend/backend/src/utils/esm-require.utils.d.ts +0 -111
- package/dist/backend/backend/src/utils/esm-require.utils.d.ts.map +0 -1
- package/dist/backend/backend/src/utils/esm-require.utils.js +0 -124
- package/dist/backend/backend/src/utils/esm-require.utils.js.map +0 -1
- package/dist/cli/backend/src/services/knowledge/embedding-provider.d.ts +0 -78
- package/dist/cli/backend/src/services/knowledge/embedding-provider.d.ts.map +0 -1
- package/dist/cli/backend/src/services/knowledge/embedding-provider.js +0 -179
- package/dist/cli/backend/src/services/knowledge/embedding-provider.js.map +0 -1
- package/dist/cli/backend/src/services/knowledge/fts5-index.service.d.ts +0 -118
- package/dist/cli/backend/src/services/knowledge/fts5-index.service.d.ts.map +0 -1
- package/dist/cli/backend/src/services/knowledge/fts5-index.service.js +0 -241
- package/dist/cli/backend/src/services/knowledge/fts5-index.service.js.map +0 -1
- package/dist/cli/backend/src/services/knowledge/fts5-query-sanitizer.d.ts +0 -102
- package/dist/cli/backend/src/services/knowledge/fts5-query-sanitizer.d.ts.map +0 -1
- package/dist/cli/backend/src/services/knowledge/fts5-query-sanitizer.js +0 -118
- package/dist/cli/backend/src/services/knowledge/fts5-query-sanitizer.js.map +0 -1
- package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.d.ts +0 -56
- package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.d.ts.map +0 -1
- package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.js +0 -91
- package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.js.map +0 -1
- package/dist/cli/backend/src/services/knowledge/knowledge-search.service.d.ts +0 -241
- package/dist/cli/backend/src/services/knowledge/knowledge-search.service.d.ts.map +0 -1
- package/dist/cli/backend/src/services/knowledge/knowledge-search.service.js +0 -590
- package/dist/cli/backend/src/services/knowledge/knowledge-search.service.js.map +0 -1
- package/dist/cli/backend/src/services/knowledge/knowledge.service.d.ts +0 -153
- package/dist/cli/backend/src/services/knowledge/knowledge.service.d.ts.map +0 -1
- package/dist/cli/backend/src/services/knowledge/knowledge.service.js +0 -409
- package/dist/cli/backend/src/services/knowledge/knowledge.service.js.map +0 -1
- package/dist/cli/backend/src/services/knowledge/learnings-index.service.d.ts +0 -159
- package/dist/cli/backend/src/services/knowledge/learnings-index.service.d.ts.map +0 -1
- package/dist/cli/backend/src/services/knowledge/learnings-index.service.js +0 -304
- package/dist/cli/backend/src/services/knowledge/learnings-index.service.js.map +0 -1
- package/dist/cli/backend/src/services/knowledge/vector-store.service.d.ts +0 -331
- package/dist/cli/backend/src/services/knowledge/vector-store.service.d.ts.map +0 -1
- package/dist/cli/backend/src/services/knowledge/vector-store.service.js +0 -830
- package/dist/cli/backend/src/services/knowledge/vector-store.service.js.map +0 -1
- package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.d.ts +0 -115
- package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.d.ts.map +0 -1
- package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.js +0 -215
- package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.js.map +0 -1
- package/dist/cli/backend/src/services/memory/embedding-provider.d.ts +0 -78
- package/dist/cli/backend/src/services/memory/embedding-provider.d.ts.map +0 -1
- package/dist/cli/backend/src/services/memory/embedding-provider.js +0 -179
- package/dist/cli/backend/src/services/memory/embedding-provider.js.map +0 -1
- package/dist/cli/backend/src/services/memory/vector-store.service.d.ts +0 -331
- package/dist/cli/backend/src/services/memory/vector-store.service.d.ts.map +0 -1
- package/dist/cli/backend/src/services/memory/vector-store.service.js +0 -814
- package/dist/cli/backend/src/services/memory/vector-store.service.js.map +0 -1
- package/dist/cli/backend/src/services/project/task-tracking.service.d.ts +0 -171
- package/dist/cli/backend/src/services/project/task-tracking.service.d.ts.map +0 -1
- package/dist/cli/backend/src/services/project/task-tracking.service.js +0 -725
- package/dist/cli/backend/src/services/project/task-tracking.service.js.map +0 -1
- package/dist/cli/backend/src/types/auto-assign.types.d.ts +0 -271
- package/dist/cli/backend/src/types/auto-assign.types.d.ts.map +0 -1
- package/dist/cli/backend/src/types/auto-assign.types.js +0 -136
- package/dist/cli/backend/src/types/auto-assign.types.js.map +0 -1
- package/dist/cli/backend/src/types/knowledge.types.d.ts +0 -195
- package/dist/cli/backend/src/types/knowledge.types.d.ts.map +0 -1
- package/dist/cli/backend/src/types/knowledge.types.js +0 -38
- package/dist/cli/backend/src/types/knowledge.types.js.map +0 -1
|
@@ -0,0 +1,420 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ChatV2DispatcherService — deliver user-origin chat messages to the
|
|
3
|
+
* bound agent session.
|
|
4
|
+
*
|
|
5
|
+
* Flow:
|
|
6
|
+
* HTTP POST /api/chat/channels/:id/messages
|
|
7
|
+
* → ChatV2Service.sendMessage (persist + dedupe)
|
|
8
|
+
* → controller broadcasts WS message frame (user bubble)
|
|
9
|
+
* → controller calls ChatV2Dispatcher.dispatchToAgent(channel, messageDTO)
|
|
10
|
+
* → sendMessageToAgent(agent_session, "[CHAT:<id>] <content>\n<hint>")
|
|
11
|
+
* → agent processes + calls `reply-chat` skill
|
|
12
|
+
* → skill POSTs back to /api/chat/channels/:id/messages as the agent
|
|
13
|
+
* → same controller path → WS message frame (agent bubble)
|
|
14
|
+
*
|
|
15
|
+
* This service is intentionally thin — a couple of dozen lines of glue
|
|
16
|
+
* around the AgentRegistrationService's `sendMessageToAgent` primitive.
|
|
17
|
+
* The dispatch prompt is extracted so tests can assert the format, which
|
|
18
|
+
* is the contract the `reply-chat` skill relies on.
|
|
19
|
+
*
|
|
20
|
+
* @module services/chat-v2/chat-v2.dispatcher.service
|
|
21
|
+
*/
|
|
22
|
+
import { LoggerService } from '../core/logger.service.js';
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
// Prompt formatter
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
/**
|
|
27
|
+
* Default prompt formatter the agent sees when a user sends in their
|
|
28
|
+
* chat channel.
|
|
29
|
+
*
|
|
30
|
+
* Format is intentionally stable and tag-prefixed so the `reply-chat`
|
|
31
|
+
* skill (and future tooling) can reliably extract the channelId without
|
|
32
|
+
* regex ambiguity. The `回复:` hint line gives the agent a one-step
|
|
33
|
+
* instruction on how to reply.
|
|
34
|
+
*/
|
|
35
|
+
export function defaultFormatPrompt(args) {
|
|
36
|
+
const { channelId, channelName, senderId, content, clientMessageId, responseMode, threadId, replyVia } = args;
|
|
37
|
+
const trimmed = content.trim();
|
|
38
|
+
const idHint = clientMessageId ? ` [cmid:${clientMessageId}]` : '';
|
|
39
|
+
// Default to "required" so DM and single-mention channel dispatches
|
|
40
|
+
// preserve the legacy "must reply" semantic. Only huddles flip this
|
|
41
|
+
// to "optional" for non-@'d members.
|
|
42
|
+
const mode = responseMode ?? 'required';
|
|
43
|
+
let replyHint;
|
|
44
|
+
if (replyVia === 'reply-channel') {
|
|
45
|
+
// Slack team channel: reply as yourself into the channel, in-thread.
|
|
46
|
+
const cmd = `bash config/skills/agent/core/reply-channel/execute.sh --channel ${channelId}${threadId ? ` --thread ${threadId}` : ''} --content "<your reply>"`;
|
|
47
|
+
replyHint = mode === 'optional'
|
|
48
|
+
? `回复本频道: 这是团队频道,你收到此消息但未被 @ — 如有必要用 \`reply-channel\` skill 回复(${cmd}),否则不回复也可以。`
|
|
49
|
+
: `回复本频道: 用 \`reply-channel\` skill(${cmd})。回复会以你的名字发到 Slack 同一个 thread。`;
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
replyHint = mode === 'optional'
|
|
53
|
+
? `回复本频道: 你在此 huddle 中收到此消息但未被 @ — 如有必要可用 \`reply-chat\` skill (conversationId="${channelId}") 回复,否则不回复也可以。`
|
|
54
|
+
: `回复本频道: 用 \`reply-chat\` skill, 参数 conversationId="${channelId}"、content="<your reply>"。`;
|
|
55
|
+
}
|
|
56
|
+
return [
|
|
57
|
+
`[CHAT:${channelId}]${idHint} <${senderId}@${channelName}>`,
|
|
58
|
+
``,
|
|
59
|
+
trimmed,
|
|
60
|
+
``,
|
|
61
|
+
`---`,
|
|
62
|
+
replyHint,
|
|
63
|
+
].join('\n');
|
|
64
|
+
}
|
|
65
|
+
// ---------------------------------------------------------------------------
|
|
66
|
+
// Service
|
|
67
|
+
// ---------------------------------------------------------------------------
|
|
68
|
+
/**
|
|
69
|
+
* Dispatches user-origin chat messages to the agent session bound to the
|
|
70
|
+
* channel. Invoked from the chat controller after `ChatV2Service.sendMessage`
|
|
71
|
+
* returns.
|
|
72
|
+
*/
|
|
73
|
+
export class ChatV2DispatcherService {
|
|
74
|
+
agentSink;
|
|
75
|
+
formatPrompt;
|
|
76
|
+
mentionResolver;
|
|
77
|
+
huddleMembersFor;
|
|
78
|
+
activateAgent;
|
|
79
|
+
logger;
|
|
80
|
+
constructor(options) {
|
|
81
|
+
this.agentSink = options.agentSink;
|
|
82
|
+
this.formatPrompt = options.formatPrompt ?? defaultFormatPrompt;
|
|
83
|
+
this.mentionResolver = options.mentionResolver;
|
|
84
|
+
this.huddleMembersFor = options.huddleMembersFor;
|
|
85
|
+
this.activateAgent = options.activateAgent;
|
|
86
|
+
this.logger = LoggerService.getInstance().createComponentLogger('ChatV2Dispatcher');
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Phase C BE.3 entry point — choose the routing strategy from
|
|
90
|
+
* `channel.type` and the message's mentions, then fan out.
|
|
91
|
+
*
|
|
92
|
+
* Routing rules (SEALED §2.1):
|
|
93
|
+
* - `type='dm'` → existing 1:1 path via `dispatchToAgent`. Mentions
|
|
94
|
+
* in DMs are advisory only (the channel already binds to one
|
|
95
|
+
* agent); the dispatcher does not currently re-route them.
|
|
96
|
+
* - `type='channel'` → resolve `message.mentions` via the injected
|
|
97
|
+
* `mentionResolver`, then dispatch the formatted prompt to each
|
|
98
|
+
* resolved sessionName. No mentions → no dispatch (the message
|
|
99
|
+
* still persists; nobody is paged).
|
|
100
|
+
* - Agent-origin messages always skip dispatch (no self-loopback).
|
|
101
|
+
*
|
|
102
|
+
* Always resolves; per-recipient errors are captured in
|
|
103
|
+
* {@link DispatchMessageResult.mentionOutcomes} and never thrown.
|
|
104
|
+
*
|
|
105
|
+
* @param channel - The channel DTO (provides `type`, name, agentSession).
|
|
106
|
+
* @param message - The persisted message DTO (provides senderType, mentions).
|
|
107
|
+
* @returns Aggregate result describing the strategy + outcomes.
|
|
108
|
+
*/
|
|
109
|
+
async dispatchMessage(channel, message, options = {}) {
|
|
110
|
+
if (message.senderType !== 'user') {
|
|
111
|
+
return {
|
|
112
|
+
strategy: 'skip',
|
|
113
|
+
dispatched: false,
|
|
114
|
+
reason: 'not a user-origin message',
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
if (channel.type === 'channel') {
|
|
118
|
+
return this.dispatchChannelMentions(channel, message);
|
|
119
|
+
}
|
|
120
|
+
if (channel.type === 'huddle') {
|
|
121
|
+
return this.dispatchHuddleBroadcast(channel, message, options);
|
|
122
|
+
}
|
|
123
|
+
// Default to the DM path for any other type (including legacy /
|
|
124
|
+
// missing — `type` is non-null after Phase A migration but defensive
|
|
125
|
+
// here keeps the dispatcher robust).
|
|
126
|
+
const dmResult = await this.dispatchToAgent(channel, message);
|
|
127
|
+
return {
|
|
128
|
+
strategy: 'dm',
|
|
129
|
+
dispatched: dmResult.dispatched,
|
|
130
|
+
dmResult,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Phase B-2 — fan a user message out to every member of a huddle.
|
|
135
|
+
*
|
|
136
|
+
* Resolution path:
|
|
137
|
+
* 1. Look up the roster via the injected `huddleMembersFor`. No
|
|
138
|
+
* resolver wired → return `strategy: 'skip'` (the message still
|
|
139
|
+
* persists; nobody is paged).
|
|
140
|
+
* 2. Empty roster → same skip path. Should not happen since
|
|
141
|
+
* `createHuddle` rejects empty membership, but defensive.
|
|
142
|
+
* 3. For each member, derive `responseMode` from whether their
|
|
143
|
+
* session appears in `message.mentions[]`. Format the prompt
|
|
144
|
+
* accordingly and call `sendMessageToAgent`.
|
|
145
|
+
*
|
|
146
|
+
* Always resolves; per-member errors are captured in
|
|
147
|
+
* {@link DispatchMessageResult.huddleOutcomes} and never thrown.
|
|
148
|
+
*
|
|
149
|
+
* @param channel - The huddle channel.
|
|
150
|
+
* @param message - The persisted user message.
|
|
151
|
+
* @returns Aggregate result with one outcome per member.
|
|
152
|
+
*/
|
|
153
|
+
async dispatchHuddleBroadcast(channel, message, options = {}) {
|
|
154
|
+
if (!this.huddleMembersFor) {
|
|
155
|
+
this.logger.debug('chat-v2 huddle dispatch skipped — no roster lookup wired', {
|
|
156
|
+
channelId: channel.id,
|
|
157
|
+
messageId: message.id,
|
|
158
|
+
});
|
|
159
|
+
return {
|
|
160
|
+
strategy: 'skip',
|
|
161
|
+
dispatched: false,
|
|
162
|
+
reason: 'no huddleMembersFor resolver wired',
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
const members = this.huddleMembersFor(channel.id);
|
|
166
|
+
if (members.length === 0) {
|
|
167
|
+
return {
|
|
168
|
+
strategy: 'skip',
|
|
169
|
+
dispatched: false,
|
|
170
|
+
reason: 'huddle has no members',
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
// Pre-build the mention set so each member lookup is O(1). The
|
|
174
|
+
// wire mention is the agent session id (same shape as the roster
|
|
175
|
+
// entries) so a simple Set membership check is enough.
|
|
176
|
+
const mentioned = new Set(Array.isArray(message.mentions) ? message.mentions : []);
|
|
177
|
+
const outcomes = [];
|
|
178
|
+
let anyDispatched = false;
|
|
179
|
+
for (const sessionName of members) {
|
|
180
|
+
const responseMode = mentioned.has(sessionName) ? 'required' : 'optional';
|
|
181
|
+
const prompt = this.formatPrompt({
|
|
182
|
+
channelId: channel.id,
|
|
183
|
+
channelName: channel.name,
|
|
184
|
+
agentSession: sessionName,
|
|
185
|
+
senderId: message.senderId,
|
|
186
|
+
content: message.content,
|
|
187
|
+
clientMessageId: typeof message.metadata?.clientMessageId === 'string'
|
|
188
|
+
? message.metadata.clientMessageId
|
|
189
|
+
: undefined,
|
|
190
|
+
responseMode,
|
|
191
|
+
threadId: options.threadId,
|
|
192
|
+
replyVia: options.replyVia,
|
|
193
|
+
});
|
|
194
|
+
try {
|
|
195
|
+
const result = await this.agentSink.sendMessageToAgent(sessionName, prompt);
|
|
196
|
+
if (result.success) {
|
|
197
|
+
outcomes.push({ sessionName, responseMode, dispatched: true });
|
|
198
|
+
anyDispatched = true;
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
this.logger.warn('chat-v2 huddle dispatch reported failure', {
|
|
202
|
+
channelId: channel.id,
|
|
203
|
+
sessionName,
|
|
204
|
+
err: result.error,
|
|
205
|
+
});
|
|
206
|
+
outcomes.push({
|
|
207
|
+
sessionName,
|
|
208
|
+
responseMode,
|
|
209
|
+
dispatched: false,
|
|
210
|
+
error: result.error ?? 'unknown sink failure',
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
catch (err) {
|
|
215
|
+
const errMsg = err instanceof Error ? err.message : String(err);
|
|
216
|
+
this.logger.error('chat-v2 huddle dispatch threw', {
|
|
217
|
+
channelId: channel.id,
|
|
218
|
+
sessionName,
|
|
219
|
+
err: errMsg,
|
|
220
|
+
});
|
|
221
|
+
outcomes.push({ sessionName, responseMode, dispatched: false, error: errMsg });
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
return {
|
|
225
|
+
strategy: 'huddle-broadcast',
|
|
226
|
+
dispatched: anyDispatched,
|
|
227
|
+
huddleOutcomes: outcomes,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Dispatch a `type='channel'` message to its resolved mentions.
|
|
232
|
+
*
|
|
233
|
+
* Skips entirely when:
|
|
234
|
+
* - No mention resolver is wired (return strategy=skip).
|
|
235
|
+
* - `mentions` is empty (return strategy=skip).
|
|
236
|
+
* - The resolver returns no targets (return strategy=channel-mentions
|
|
237
|
+
* with empty `mentionOutcomes`; `dispatched=false`).
|
|
238
|
+
*
|
|
239
|
+
* @param channel - The team channel.
|
|
240
|
+
* @param message - The persisted user message.
|
|
241
|
+
* @returns Aggregate result with one outcome per resolved recipient.
|
|
242
|
+
*/
|
|
243
|
+
async dispatchChannelMentions(channel, message) {
|
|
244
|
+
if (!this.mentionResolver) {
|
|
245
|
+
this.logger.debug('chat-v2 dispatch skipped — no mention resolver wired', {
|
|
246
|
+
channelId: channel.id,
|
|
247
|
+
messageId: message.id,
|
|
248
|
+
});
|
|
249
|
+
return {
|
|
250
|
+
strategy: 'skip',
|
|
251
|
+
dispatched: false,
|
|
252
|
+
reason: 'no mention resolver wired for type=channel',
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
const mentions = Array.isArray(message.mentions) ? message.mentions : [];
|
|
256
|
+
if (mentions.length === 0) {
|
|
257
|
+
return {
|
|
258
|
+
strategy: 'skip',
|
|
259
|
+
dispatched: false,
|
|
260
|
+
reason: 'no mentions on type=channel message',
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
const ctx = { teamId: channel.teamId };
|
|
264
|
+
const targets = await this.mentionResolver.resolve(mentions, ctx);
|
|
265
|
+
const outcomes = [];
|
|
266
|
+
let anyDispatched = false;
|
|
267
|
+
for (const target of targets) {
|
|
268
|
+
const prompt = this.formatPrompt({
|
|
269
|
+
channelId: channel.id,
|
|
270
|
+
channelName: channel.name,
|
|
271
|
+
agentSession: target.sessionName,
|
|
272
|
+
senderId: message.senderId,
|
|
273
|
+
content: message.content,
|
|
274
|
+
clientMessageId: typeof message.metadata?.clientMessageId === 'string'
|
|
275
|
+
? message.metadata.clientMessageId
|
|
276
|
+
: undefined,
|
|
277
|
+
});
|
|
278
|
+
try {
|
|
279
|
+
const result = await this.agentSink.sendMessageToAgent(target.sessionName, prompt);
|
|
280
|
+
if (result.success) {
|
|
281
|
+
outcomes.push({ target, dispatched: true });
|
|
282
|
+
anyDispatched = true;
|
|
283
|
+
}
|
|
284
|
+
else {
|
|
285
|
+
this.logger.warn('chat-v2 mention dispatch reported failure', {
|
|
286
|
+
channelId: channel.id,
|
|
287
|
+
sessionName: target.sessionName,
|
|
288
|
+
err: result.error,
|
|
289
|
+
});
|
|
290
|
+
outcomes.push({
|
|
291
|
+
target,
|
|
292
|
+
dispatched: false,
|
|
293
|
+
error: result.error ?? 'unknown sink failure',
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
catch (err) {
|
|
298
|
+
const errMsg = err instanceof Error ? err.message : String(err);
|
|
299
|
+
this.logger.error('chat-v2 mention dispatch threw', {
|
|
300
|
+
channelId: channel.id,
|
|
301
|
+
sessionName: target.sessionName,
|
|
302
|
+
err: errMsg,
|
|
303
|
+
});
|
|
304
|
+
outcomes.push({ target, dispatched: false, error: errMsg });
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
return {
|
|
308
|
+
strategy: 'channel-mentions',
|
|
309
|
+
dispatched: anyDispatched,
|
|
310
|
+
mentionOutcomes: outcomes,
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Push a newly-persisted user message to the agent.
|
|
315
|
+
*
|
|
316
|
+
* Dispatch is fire-and-forget at the API-response level (the HTTP 201 has
|
|
317
|
+
* already been serialized), but we still await the write so tests can
|
|
318
|
+
* observe the outcome and the logger can record failures.
|
|
319
|
+
*
|
|
320
|
+
* Messages where `senderType !== "user"` are a no-op — we never loop an
|
|
321
|
+
* agent's own reply back into its own PTY.
|
|
322
|
+
*
|
|
323
|
+
* @deprecated Issue #334 — `dispatchToAgent` is the legacy 1:1 entry
|
|
324
|
+
* point. New callers MUST go through `dispatchMessage`, which routes
|
|
325
|
+
* type='dm' messages here and adds the type='channel' (@mentions /
|
|
326
|
+
* @team) path. Direct callers of `dispatchToAgent` silently bypass
|
|
327
|
+
* the mention-resolution layer.
|
|
328
|
+
*
|
|
329
|
+
* Conversion: replace `dispatchToAgent(channel, message)` with
|
|
330
|
+
* `dispatchMessage(channel, message)` and read the `dmResult` field
|
|
331
|
+
* of the returned object. See chat-v2.dispatcher.service.ts:dispatchMessage
|
|
332
|
+
* for the contract.
|
|
333
|
+
*
|
|
334
|
+
* @param channel - Channel DTO (provides `agentSession` + display name)
|
|
335
|
+
* @param message - Persisted message DTO
|
|
336
|
+
*/
|
|
337
|
+
async dispatchToAgent(channel, message) {
|
|
338
|
+
if (message.senderType !== 'user') {
|
|
339
|
+
return { dispatched: false, error: 'not a user-origin message' };
|
|
340
|
+
}
|
|
341
|
+
if (!channel.agentSession) {
|
|
342
|
+
this.logger.warn('chat-v2 dispatch skipped — no agentSession', {
|
|
343
|
+
channelId: channel.id,
|
|
344
|
+
});
|
|
345
|
+
return { dispatched: false, error: 'channel has no bound agent' };
|
|
346
|
+
}
|
|
347
|
+
const prompt = this.formatPrompt({
|
|
348
|
+
channelId: channel.id,
|
|
349
|
+
channelName: channel.name,
|
|
350
|
+
agentSession: channel.agentSession,
|
|
351
|
+
senderId: message.senderId,
|
|
352
|
+
content: message.content,
|
|
353
|
+
clientMessageId: typeof message.metadata?.clientMessageId === 'string'
|
|
354
|
+
? message.metadata.clientMessageId
|
|
355
|
+
: undefined,
|
|
356
|
+
});
|
|
357
|
+
let result;
|
|
358
|
+
try {
|
|
359
|
+
result = await this.agentSink.sendMessageToAgent(channel.agentSession, prompt);
|
|
360
|
+
}
|
|
361
|
+
catch (err) {
|
|
362
|
+
const errMsg = err instanceof Error ? err.message : String(err);
|
|
363
|
+
this.logger.error('chat-v2 dispatch threw', {
|
|
364
|
+
channelId: channel.id,
|
|
365
|
+
agentSession: channel.agentSession,
|
|
366
|
+
err: errMsg,
|
|
367
|
+
});
|
|
368
|
+
return { dispatched: false, error: errMsg };
|
|
369
|
+
}
|
|
370
|
+
if (!result.success) {
|
|
371
|
+
// Auto-activate on send: the agent's session doesn't exist (inactive).
|
|
372
|
+
// When an activation hook is wired, start the agent and retry delivery
|
|
373
|
+
// once — so messaging an offline agent wakes it and delivers, instead
|
|
374
|
+
// of silently queueing. This is user-initiated, so it bypasses the
|
|
375
|
+
// orchestrator wake-gate by design.
|
|
376
|
+
if (this.activateAgent) {
|
|
377
|
+
this.logger.info('chat-v2 dispatch: agent inactive — activating on send', {
|
|
378
|
+
channelId: channel.id,
|
|
379
|
+
agentSession: channel.agentSession,
|
|
380
|
+
});
|
|
381
|
+
let activated = false;
|
|
382
|
+
try {
|
|
383
|
+
activated = await this.activateAgent(channel.agentSession);
|
|
384
|
+
}
|
|
385
|
+
catch (err) {
|
|
386
|
+
this.logger.warn('chat-v2 activate-on-send failed', {
|
|
387
|
+
agentSession: channel.agentSession,
|
|
388
|
+
err: err instanceof Error ? err.message : String(err),
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
if (activated) {
|
|
392
|
+
try {
|
|
393
|
+
result = await this.agentSink.sendMessageToAgent(channel.agentSession, prompt);
|
|
394
|
+
}
|
|
395
|
+
catch (err) {
|
|
396
|
+
return {
|
|
397
|
+
dispatched: false,
|
|
398
|
+
error: err instanceof Error ? err.message : String(err),
|
|
399
|
+
};
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
if (!result.success) {
|
|
404
|
+
this.logger.warn('chat-v2 dispatch reported failure', {
|
|
405
|
+
channelId: channel.id,
|
|
406
|
+
agentSession: channel.agentSession,
|
|
407
|
+
err: result.error,
|
|
408
|
+
});
|
|
409
|
+
return { dispatched: false, error: result.error ?? 'unknown sink failure' };
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
this.logger.debug('chat-v2 dispatched', {
|
|
413
|
+
channelId: channel.id,
|
|
414
|
+
agentSession: channel.agentSession,
|
|
415
|
+
queued: result.queued ?? false,
|
|
416
|
+
});
|
|
417
|
+
return { dispatched: true };
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
//# sourceMappingURL=chat-v2.dispatcher.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-v2.dispatcher.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/chat-v2/chat-v2.dispatcher.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ChatV2MentionResolver — turn `mentions[]` from a chat message into a
|
|
3
|
+
* deduplicated list of agent-session dispatch targets.
|
|
4
|
+
*
|
|
5
|
+
* Phase C BE.2 scaffolding for Slack-like team-chat mention dispatch
|
|
6
|
+
* (SEALED §2.1 routing rules):
|
|
7
|
+
*
|
|
8
|
+
* - **`@agent` mention** (mention id matches a `TeamMember.id`):
|
|
9
|
+
* resolves to that member's tmux/agent `sessionName`. The dispatcher
|
|
10
|
+
* will deliver the message directly into that agent's session.
|
|
11
|
+
*
|
|
12
|
+
* - **`@team` mention** (mention id matches a `Team.id`): resolves to
|
|
13
|
+
* that team's TL — the canonical primary responder per the spec
|
|
14
|
+
* ("the Team Lead is the primary responder; if busy, queue in the
|
|
15
|
+
* Team's Task Pool"). TL is selected as: first member with both
|
|
16
|
+
* `hierarchyLevel === 1` and `canDelegate === true`, falling back
|
|
17
|
+
* to any `canDelegate` member, then `members[0]` so the rule is
|
|
18
|
+
* deterministic even on legacy teams without hierarchy fields.
|
|
19
|
+
*
|
|
20
|
+
* - **Unknown mention id** (not a team or a known member): skipped
|
|
21
|
+
* with a debug log. The dispatcher must always succeed even when
|
|
22
|
+
* the FE includes a stale/typo mention; the chat HTTP ack has
|
|
23
|
+
* already been sent by the time we resolve.
|
|
24
|
+
*
|
|
25
|
+
* Phase C F2a (issue #333) — cross-tenant scope enforcement: when the
|
|
26
|
+
* caller passes `context.teamId`, the resolver enforces the channel's
|
|
27
|
+
* tenant boundary. `@agent` mentions to members of any other team are
|
|
28
|
+
* dropped (cross-tenant leak vector pinned by Arch on PR #331); `@team`
|
|
29
|
+
* mentions to any team still resolve (cross-team pings are a useful
|
|
30
|
+
* coordination affordance), but a mismatch emits a warn for audit.
|
|
31
|
+
*
|
|
32
|
+
* The resolver is the boundary between the chat-v2 wire (id strings)
|
|
33
|
+
* and the agent runtime (session names). It deliberately does NOT
|
|
34
|
+
* touch the agent registry — it only produces the addresses that the
|
|
35
|
+
* dispatcher will hand to `AgentMessageSink.sendMessageToAgent`.
|
|
36
|
+
*
|
|
37
|
+
* The team list is loaded via an injected `loadTeams()` callback so
|
|
38
|
+
* tests can drive it without a real `StorageService`. Production wiring
|
|
39
|
+
* passes `() => storageService.getTeams()`.
|
|
40
|
+
*
|
|
41
|
+
* @module services/chat-v2/chat-v2.mention-resolver
|
|
42
|
+
*/
|
|
43
|
+
import type { Team } from '../../types/index.js';
|
|
44
|
+
/** Kind of mention that resolved to a target. */
|
|
45
|
+
export type MentionTargetKind = 'agent' | 'team';
|
|
46
|
+
/**
|
|
47
|
+
* One resolved dispatch target. The dispatcher will call
|
|
48
|
+
* `sendMessageToAgent(sessionName, prompt)` for each unique entry.
|
|
49
|
+
*/
|
|
50
|
+
export interface MentionTarget {
|
|
51
|
+
/** Whether this target came from an `@agent` (member) or `@team` mention. */
|
|
52
|
+
kind: MentionTargetKind;
|
|
53
|
+
/** The original mention id as it appeared in the wire `mentions[]`. */
|
|
54
|
+
mentionId: string;
|
|
55
|
+
/** Resolved member id. For `kind='team'`, this is the TL's member id. */
|
|
56
|
+
memberId: string;
|
|
57
|
+
/** Resolved agent session name — the address `sendMessageToAgent` expects. */
|
|
58
|
+
sessionName: string;
|
|
59
|
+
/** For `kind='team'`, the matched team's id. Undefined for `kind='agent'`. */
|
|
60
|
+
teamId?: string;
|
|
61
|
+
}
|
|
62
|
+
/** Optional context the resolver may use to disambiguate. */
|
|
63
|
+
export interface MentionResolverContext {
|
|
64
|
+
/**
|
|
65
|
+
* The channel's `teamId` (when the channel is `type='channel'`). When set,
|
|
66
|
+
* the resolver enforces cross-tenant scope (Phase C F2a, issue #333):
|
|
67
|
+
*
|
|
68
|
+
* - `@agent` mentions are restricted to members whose owning team's
|
|
69
|
+
* id equals `teamId`. Mentions to agents of any other team are
|
|
70
|
+
* dropped with a debug log so a foreign-team agent never receives
|
|
71
|
+
* a dispatch frame from a channel they are not a member of.
|
|
72
|
+
*
|
|
73
|
+
* - `@team` mentions to any team id still resolve to that team's TL
|
|
74
|
+
* (they remain useful for cross-team coordination), but a mismatch
|
|
75
|
+
* between the channel's `teamId` and the mentioned team's id emits
|
|
76
|
+
* a warn so the cross-team ping is observable in audit/log.
|
|
77
|
+
*
|
|
78
|
+
* Leave undefined (or empty string) to disable scoping — used by the
|
|
79
|
+
* legacy DM dispatch path and by tests that need the global resolver.
|
|
80
|
+
*/
|
|
81
|
+
teamId?: string;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Dependencies. The team-list source is callable so tests don't need a
|
|
85
|
+
* StorageService; the production path injects `() => storage.getTeams()`.
|
|
86
|
+
*/
|
|
87
|
+
export interface MentionResolverDeps {
|
|
88
|
+
/**
|
|
89
|
+
* Returns the current team list. May be sync or async — the resolver
|
|
90
|
+
* awaits the result either way. Errors propagate; the resolver
|
|
91
|
+
* surfaces an empty-target list on caller error so a transient
|
|
92
|
+
* storage hiccup never crashes the chat dispatch path.
|
|
93
|
+
*/
|
|
94
|
+
loadTeams: () => Promise<Team[]> | Team[];
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Stateless resolver — instances are cheap to construct. Each `resolve()`
|
|
98
|
+
* call loads the team list fresh so dispatch always sees the latest
|
|
99
|
+
* member/session bindings (a new agent comes online → next mention
|
|
100
|
+
* resolves correctly without a restart).
|
|
101
|
+
*/
|
|
102
|
+
export declare class ChatV2MentionResolver {
|
|
103
|
+
private readonly loadTeams;
|
|
104
|
+
private readonly logger;
|
|
105
|
+
constructor(deps: MentionResolverDeps);
|
|
106
|
+
/**
|
|
107
|
+
* Resolve `mentions` to dispatch targets.
|
|
108
|
+
*
|
|
109
|
+
* Behavior:
|
|
110
|
+
* - Empty / whitespace mention ids are skipped silently.
|
|
111
|
+
* - Each id is classified as team-first, then agent-first; ties go to
|
|
112
|
+
* the team interpretation since team ids and member ids share the
|
|
113
|
+
* same UUID-shape namespace and team mentions are higher-impact.
|
|
114
|
+
* - Unknown ids are logged at debug level and skipped.
|
|
115
|
+
* - Duplicate `sessionName`s are collapsed (first-seen wins, keeping
|
|
116
|
+
* `kind` ordering stable for tests).
|
|
117
|
+
* - Targets with empty `sessionName` are skipped — there is no agent
|
|
118
|
+
* to dispatch to.
|
|
119
|
+
*
|
|
120
|
+
* Phase C F2a (#333) — when `context.teamId` is set:
|
|
121
|
+
* - `@agent` mentions whose owning team !== `context.teamId` are
|
|
122
|
+
* dropped at debug level (cross-tenant leak guard).
|
|
123
|
+
* - `@team` mentions to a different team still resolve to that
|
|
124
|
+
* team's TL but emit a warn so cross-team pings are auditable.
|
|
125
|
+
* - A blank/whitespace `context.teamId` is treated as "no scope"
|
|
126
|
+
* so DM dispatch and back-compat tests keep current behavior.
|
|
127
|
+
*
|
|
128
|
+
* @param mentions - The raw mention id list from `ChatMessageDTO.mentions`.
|
|
129
|
+
* @param context - Optional resolver context (teamId etc.).
|
|
130
|
+
* @returns Deduplicated dispatch targets, in input order with team-first ties.
|
|
131
|
+
*/
|
|
132
|
+
resolve(mentions: string[], context?: MentionResolverContext): Promise<MentionTarget[]>;
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=chat-v2.mention-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-v2.mention-resolver.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/chat-v2/chat-v2.mention-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,sBAAsB,CAAC;AAQ7D,iDAAiD;AACjD,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,MAAM,CAAC;AAEjD;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,6EAA6E;IAC7E,IAAI,EAAE,iBAAiB,CAAC;IACxB,uEAAuE;IACvE,SAAS,EAAE,MAAM,CAAC;IAClB,yEAAyE;IACzE,QAAQ,EAAE,MAAM,CAAC;IACjB,8EAA8E;IAC9E,WAAW,EAAE,MAAM,CAAC;IACpB,8EAA8E;IAC9E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,6DAA6D;AAC7D,MAAM,WAAW,sBAAsB;IACrC;;;;;;;;;;;;;;;;OAgBG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;;;OAKG;IACH,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC;CAC3C;AAMD;;;;;GAKG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmC;IAC7D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;gBAE7B,IAAI,EAAE,mBAAmB;IAKrC;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACG,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,sBAAsB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;CAgJ9F"}
|