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,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Slack Agent Post Service — an agent starting a Slack conversation itself.
|
|
3
|
+
*
|
|
4
|
+
* Everything else in the Slack layer is reactive: a message arrives, an agent
|
|
5
|
+
* answers. This is the other direction. An agent calls the `slack-post` skill
|
|
6
|
+
* and the message goes to a channel or into a DM, under the agent's own
|
|
7
|
+
* identity when it has one.
|
|
8
|
+
*
|
|
9
|
+
* Target syntax (one string, so the skill stays a one-liner):
|
|
10
|
+
*
|
|
11
|
+
* | Target | Meaning |
|
|
12
|
+
* |---|---|
|
|
13
|
+
* | `#general`, `general` | public/private channel by name (lower-case) |
|
|
14
|
+
* | `C0123ABCD` | channel by id (upper-case) |
|
|
15
|
+
* | `D0123ABCD` | an already-open DM channel |
|
|
16
|
+
* | `@sam`, `U0123ABCD` | DM that person |
|
|
17
|
+
*
|
|
18
|
+
* Identity: an agent with a Cloud-provisioned Slack app posts with its own
|
|
19
|
+
* bot token, so a DM is a real conversation between the person and that agent.
|
|
20
|
+
* Without one it falls back to the shared Crewly bot with the agent's name and
|
|
21
|
+
* icon — visually similar, but the DM is Crewly's, not the agent's.
|
|
22
|
+
*
|
|
23
|
+
* @module services/slack/slack-agent-post.service
|
|
24
|
+
*/
|
|
25
|
+
import type { Team } from '../../types/index.js';
|
|
26
|
+
import type { SlackChannelInfo, SlackOutgoingMessage } from '../../types/slack.types.js';
|
|
27
|
+
import type { SlackAgentIdentityService } from './slack-agent-identity.service.js';
|
|
28
|
+
/** The slice of SlackService this service uses. */
|
|
29
|
+
export interface AgentPostSlackApi {
|
|
30
|
+
isConnected(): boolean;
|
|
31
|
+
sendMessage(message: SlackOutgoingMessage): Promise<string>;
|
|
32
|
+
findChannelByName(name: string): Promise<SlackChannelInfo | null>;
|
|
33
|
+
openDirectMessage(userId: string, botToken?: string): Promise<string>;
|
|
34
|
+
findUserByHandle(handle: string): Promise<string | null>;
|
|
35
|
+
}
|
|
36
|
+
/** The slice of the identity service this service uses. */
|
|
37
|
+
export type AgentPostIdentityApi = Pick<SlackAgentIdentityService, 'load' | 'getInstalled'>;
|
|
38
|
+
/** Storage slice — used to give a token-less agent its name and icon. */
|
|
39
|
+
export interface AgentPostStorageApi {
|
|
40
|
+
getTeams(): Promise<Team[]>;
|
|
41
|
+
}
|
|
42
|
+
/** Constructor dependencies. */
|
|
43
|
+
export interface SlackAgentPostServiceDeps {
|
|
44
|
+
slack: AgentPostSlackApi;
|
|
45
|
+
storage: AgentPostStorageApi;
|
|
46
|
+
identities?: AgentPostIdentityApi | null;
|
|
47
|
+
}
|
|
48
|
+
/** One post request. */
|
|
49
|
+
export interface SlackAgentPostRequest {
|
|
50
|
+
/** The agent asking (its session name). */
|
|
51
|
+
agentSession: string;
|
|
52
|
+
/** Channel or person — see the table in the module docs. */
|
|
53
|
+
target: string;
|
|
54
|
+
text: string;
|
|
55
|
+
/** Reply inside an existing Slack thread. */
|
|
56
|
+
threadTs?: string;
|
|
57
|
+
}
|
|
58
|
+
/** What happened. */
|
|
59
|
+
export interface SlackAgentPostResult {
|
|
60
|
+
channelId: string;
|
|
61
|
+
messageTs: string;
|
|
62
|
+
kind: 'channel' | 'dm';
|
|
63
|
+
/** `agent` when the agent's own bot posted, `crewly` for the shared bot. */
|
|
64
|
+
postedAs: 'agent' | 'crewly';
|
|
65
|
+
/** Display name the message carries. */
|
|
66
|
+
identity: string;
|
|
67
|
+
}
|
|
68
|
+
/** Reasons a post can be refused, for HTTP mapping. */
|
|
69
|
+
export type SlackAgentPostErrorCode = 'validation' | 'not_connected' | 'target_not_found' | 'slack_error';
|
|
70
|
+
/** Structured failure. */
|
|
71
|
+
export declare class SlackAgentPostError extends Error {
|
|
72
|
+
readonly code: SlackAgentPostErrorCode;
|
|
73
|
+
constructor(code: SlackAgentPostErrorCode, message: string);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Service — see module docs.
|
|
77
|
+
*/
|
|
78
|
+
export declare class SlackAgentPostService {
|
|
79
|
+
private readonly logger;
|
|
80
|
+
private readonly deps;
|
|
81
|
+
constructor(deps: SlackAgentPostServiceDeps);
|
|
82
|
+
/**
|
|
83
|
+
* Send one agent-initiated message.
|
|
84
|
+
*
|
|
85
|
+
* @param req - Who is posting, where, and what
|
|
86
|
+
* @returns Where it landed and which identity carried it
|
|
87
|
+
* @throws {SlackAgentPostError} `validation` for bad input, `not_connected`
|
|
88
|
+
* when Slack is not up, `target_not_found` when the channel or person
|
|
89
|
+
* cannot be resolved, `slack_error` when Slack refuses the send
|
|
90
|
+
*/
|
|
91
|
+
post(req: SlackAgentPostRequest): Promise<SlackAgentPostResult>;
|
|
92
|
+
/**
|
|
93
|
+
* Which identity this agent posts under: its own bot token when installed,
|
|
94
|
+
* otherwise the shared bot with the member's name and icon.
|
|
95
|
+
*/
|
|
96
|
+
private resolveIdentity;
|
|
97
|
+
/** The team member behind a session, for name and avatar. */
|
|
98
|
+
private findMember;
|
|
99
|
+
/**
|
|
100
|
+
* Turn a target string into a Slack conversation id.
|
|
101
|
+
*
|
|
102
|
+
* @param target - See the table in the module docs
|
|
103
|
+
* @param botToken - Token to open the DM with, so the DM belongs to the agent
|
|
104
|
+
* @returns The conversation id and whether it is a channel or a DM
|
|
105
|
+
*/
|
|
106
|
+
private resolveTarget;
|
|
107
|
+
private openDm;
|
|
108
|
+
private lookupHandle;
|
|
109
|
+
/** Turn Slack's send errors into something an agent can act on. */
|
|
110
|
+
private explainSendFailure;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Install the process-wide instance (composition root).
|
|
114
|
+
*
|
|
115
|
+
* @param service - The service or null
|
|
116
|
+
*/
|
|
117
|
+
export declare function setSlackAgentPostService(service: SlackAgentPostService | null): void;
|
|
118
|
+
/**
|
|
119
|
+
* The process-wide instance, or null before wiring.
|
|
120
|
+
*
|
|
121
|
+
* @returns The service or null
|
|
122
|
+
*/
|
|
123
|
+
export declare function getSlackAgentPostService(): SlackAgentPostService | null;
|
|
124
|
+
//# sourceMappingURL=slack-agent-post.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack-agent-post.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/slack/slack-agent-post.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAIzF,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAEnF,mDAAmD;AACnD,MAAM,WAAW,iBAAiB;IAChC,WAAW,IAAI,OAAO,CAAC;IACvB,WAAW,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5D,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IAClE,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACtE,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CAC1D;AAED,2DAA2D;AAC3D,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,yBAAyB,EAAE,MAAM,GAAG,cAAc,CAAC,CAAC;AAE5F,yEAAyE;AACzE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;CAC7B;AAED,gCAAgC;AAChC,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,iBAAiB,CAAC;IACzB,OAAO,EAAE,mBAAmB,CAAC;IAC7B,UAAU,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;CAC1C;AAED,wBAAwB;AACxB,MAAM,WAAW,qBAAqB;IACpC,2CAA2C;IAC3C,YAAY,EAAE,MAAM,CAAC;IACrB,4DAA4D;IAC5D,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAqB;AACrB,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,SAAS,GAAG,IAAI,CAAC;IACvB,4EAA4E;IAC5E,QAAQ,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC7B,wCAAwC;IACxC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,uDAAuD;AACvD,MAAM,MAAM,uBAAuB,GAAG,YAAY,GAAG,eAAe,GAAG,kBAAkB,GAAG,aAAa,CAAC;AAE1G,0BAA0B;AAC1B,qBAAa,mBAAoB,SAAQ,KAAK;aAE1B,IAAI,EAAE,uBAAuB;gBAA7B,IAAI,EAAE,uBAAuB,EAC7C,OAAO,EAAE,MAAM;CAKlB;AAUD;;GAEG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA4B;gBAErC,IAAI,EAAE,yBAAyB;IAK3C;;;;;;;;OAQG;IACG,IAAI,CAAC,GAAG,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA+CrE;;;OAGG;YACW,eAAe;IAqB7B,6DAA6D;YAC/C,UAAU;IAexB;;;;;;OAMG;YACW,aAAa;YA8Bb,MAAM;YAeN,YAAY;IAQ1B,mEAAmE;IACnE,OAAO,CAAC,kBAAkB;CAW3B;AAYD;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,qBAAqB,GAAG,IAAI,GAAG,IAAI,CAEpF;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,IAAI,qBAAqB,GAAG,IAAI,CAEvE"}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Slack Agent Post Service — an agent starting a Slack conversation itself.
|
|
3
|
+
*
|
|
4
|
+
* Everything else in the Slack layer is reactive: a message arrives, an agent
|
|
5
|
+
* answers. This is the other direction. An agent calls the `slack-post` skill
|
|
6
|
+
* and the message goes to a channel or into a DM, under the agent's own
|
|
7
|
+
* identity when it has one.
|
|
8
|
+
*
|
|
9
|
+
* Target syntax (one string, so the skill stays a one-liner):
|
|
10
|
+
*
|
|
11
|
+
* | Target | Meaning |
|
|
12
|
+
* |---|---|
|
|
13
|
+
* | `#general`, `general` | public/private channel by name (lower-case) |
|
|
14
|
+
* | `C0123ABCD` | channel by id (upper-case) |
|
|
15
|
+
* | `D0123ABCD` | an already-open DM channel |
|
|
16
|
+
* | `@sam`, `U0123ABCD` | DM that person |
|
|
17
|
+
*
|
|
18
|
+
* Identity: an agent with a Cloud-provisioned Slack app posts with its own
|
|
19
|
+
* bot token, so a DM is a real conversation between the person and that agent.
|
|
20
|
+
* Without one it falls back to the shared Crewly bot with the agent's name and
|
|
21
|
+
* icon — visually similar, but the DM is Crewly's, not the agent's.
|
|
22
|
+
*
|
|
23
|
+
* @module services/slack/slack-agent-post.service
|
|
24
|
+
*/
|
|
25
|
+
import { LoggerService } from '../core/logger.service.js';
|
|
26
|
+
import { SLACK_AGENT_POST_CONSTANTS } from '../../constants.js';
|
|
27
|
+
import { slackIdentityFor } from './slack-team-channel.service.js';
|
|
28
|
+
/** Structured failure. */
|
|
29
|
+
export class SlackAgentPostError extends Error {
|
|
30
|
+
code;
|
|
31
|
+
constructor(code, message) {
|
|
32
|
+
super(message);
|
|
33
|
+
this.code = code;
|
|
34
|
+
this.name = 'SlackAgentPostError';
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// Case is the discriminator, and it is reliable: Slack ids are uppercase,
|
|
38
|
+
// while Slack forces channel names to lowercase. Matching case-insensitively
|
|
39
|
+
// would swallow ordinary names — `general` is `G` followed by six
|
|
40
|
+
// alphanumerics, so it would have been read as a private-channel id.
|
|
41
|
+
const CHANNEL_ID_RE = /^[CG][A-Z0-9]{6,}$/;
|
|
42
|
+
const DM_ID_RE = /^D[A-Z0-9]{6,}$/;
|
|
43
|
+
const USER_ID_RE = /^[UW][A-Z0-9]{6,}$/;
|
|
44
|
+
/**
|
|
45
|
+
* Service — see module docs.
|
|
46
|
+
*/
|
|
47
|
+
export class SlackAgentPostService {
|
|
48
|
+
logger;
|
|
49
|
+
deps;
|
|
50
|
+
constructor(deps) {
|
|
51
|
+
this.deps = deps;
|
|
52
|
+
this.logger = LoggerService.getInstance().createComponentLogger('SlackAgentPost');
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Send one agent-initiated message.
|
|
56
|
+
*
|
|
57
|
+
* @param req - Who is posting, where, and what
|
|
58
|
+
* @returns Where it landed and which identity carried it
|
|
59
|
+
* @throws {SlackAgentPostError} `validation` for bad input, `not_connected`
|
|
60
|
+
* when Slack is not up, `target_not_found` when the channel or person
|
|
61
|
+
* cannot be resolved, `slack_error` when Slack refuses the send
|
|
62
|
+
*/
|
|
63
|
+
async post(req) {
|
|
64
|
+
const agentSession = (req.agentSession ?? '').trim();
|
|
65
|
+
const target = (req.target ?? '').trim();
|
|
66
|
+
const text = req.text ?? '';
|
|
67
|
+
if (!agentSession)
|
|
68
|
+
throw new SlackAgentPostError('validation', 'agentSession is required');
|
|
69
|
+
if (!target)
|
|
70
|
+
throw new SlackAgentPostError('validation', 'target is required');
|
|
71
|
+
if (!text.trim())
|
|
72
|
+
throw new SlackAgentPostError('validation', 'text is required');
|
|
73
|
+
if (text.length > SLACK_AGENT_POST_CONSTANTS.MAX_TEXT_LENGTH) {
|
|
74
|
+
throw new SlackAgentPostError('validation', `text exceeds ${SLACK_AGENT_POST_CONSTANTS.MAX_TEXT_LENGTH} characters`);
|
|
75
|
+
}
|
|
76
|
+
if (!this.deps.slack.isConnected()) {
|
|
77
|
+
throw new SlackAgentPostError('not_connected', 'Slack is not connected');
|
|
78
|
+
}
|
|
79
|
+
const { identity, botToken, postedAs } = await this.resolveIdentity(agentSession);
|
|
80
|
+
const { channelId, kind } = await this.resolveTarget(target, botToken);
|
|
81
|
+
let messageTs;
|
|
82
|
+
try {
|
|
83
|
+
messageTs = await this.deps.slack.sendMessage({
|
|
84
|
+
channelId,
|
|
85
|
+
text,
|
|
86
|
+
threadTs: req.threadTs,
|
|
87
|
+
// The chat-v2 mirror attributes outbound Slack replies to the
|
|
88
|
+
// orchestrator, which would misfile an agent's own post. Team-channel
|
|
89
|
+
// traffic is mirrored by its own path; this one stays Slack-only.
|
|
90
|
+
skipChatV2Mirror: true,
|
|
91
|
+
...identity,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
throw new SlackAgentPostError('slack_error', this.explainSendFailure(err, kind, postedAs));
|
|
96
|
+
}
|
|
97
|
+
this.logger.info('Agent posted to Slack', {
|
|
98
|
+
agentSession,
|
|
99
|
+
channelId,
|
|
100
|
+
kind,
|
|
101
|
+
postedAs,
|
|
102
|
+
threaded: !!req.threadTs,
|
|
103
|
+
chars: text.length,
|
|
104
|
+
});
|
|
105
|
+
return { channelId, messageTs, kind, postedAs, identity: identity.username ?? agentSession };
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Which identity this agent posts under: its own bot token when installed,
|
|
109
|
+
* otherwise the shared bot with the member's name and icon.
|
|
110
|
+
*/
|
|
111
|
+
async resolveIdentity(agentSession) {
|
|
112
|
+
if (this.deps.identities) {
|
|
113
|
+
await this.deps.identities.load();
|
|
114
|
+
const installed = this.deps.identities.getInstalled(agentSession);
|
|
115
|
+
if (installed) {
|
|
116
|
+
const member = await this.findMember(agentSession);
|
|
117
|
+
return {
|
|
118
|
+
identity: { botToken: installed.botToken, username: member?.name ?? agentSession },
|
|
119
|
+
botToken: installed.botToken,
|
|
120
|
+
postedAs: 'agent',
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
const member = await this.findMember(agentSession);
|
|
125
|
+
return { identity: slackIdentityFor(member, agentSession), postedAs: 'crewly' };
|
|
126
|
+
}
|
|
127
|
+
/** The team member behind a session, for name and avatar. */
|
|
128
|
+
async findMember(agentSession) {
|
|
129
|
+
try {
|
|
130
|
+
const teams = await this.deps.storage.getTeams();
|
|
131
|
+
for (const team of teams) {
|
|
132
|
+
const member = team.members?.find((m) => m.sessionName === agentSession);
|
|
133
|
+
if (member)
|
|
134
|
+
return member;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
this.logger.debug('Could not read teams for agent identity', {
|
|
139
|
+
error: err instanceof Error ? err.message : String(err),
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
return undefined;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Turn a target string into a Slack conversation id.
|
|
146
|
+
*
|
|
147
|
+
* @param target - See the table in the module docs
|
|
148
|
+
* @param botToken - Token to open the DM with, so the DM belongs to the agent
|
|
149
|
+
* @returns The conversation id and whether it is a channel or a DM
|
|
150
|
+
*/
|
|
151
|
+
async resolveTarget(target, botToken) {
|
|
152
|
+
if (DM_ID_RE.test(target))
|
|
153
|
+
return { channelId: target, kind: 'dm' };
|
|
154
|
+
if (CHANNEL_ID_RE.test(target))
|
|
155
|
+
return { channelId: target, kind: 'channel' };
|
|
156
|
+
if (USER_ID_RE.test(target))
|
|
157
|
+
return { channelId: await this.openDm(target, botToken), kind: 'dm' };
|
|
158
|
+
if (target.startsWith('@')) {
|
|
159
|
+
const handle = target.slice(1);
|
|
160
|
+
const userId = await this.lookupHandle(handle);
|
|
161
|
+
if (!userId)
|
|
162
|
+
throw new SlackAgentPostError('target_not_found', `No Slack user matches "@${handle}"`);
|
|
163
|
+
return { channelId: await this.openDm(userId, botToken), kind: 'dm' };
|
|
164
|
+
}
|
|
165
|
+
const name = target.replace(/^#/, '');
|
|
166
|
+
let channel;
|
|
167
|
+
try {
|
|
168
|
+
channel = await this.deps.slack.findChannelByName(name);
|
|
169
|
+
}
|
|
170
|
+
catch (err) {
|
|
171
|
+
const text = errText(err);
|
|
172
|
+
// Resolving a name needs channels:read / groups:read. Say so, rather
|
|
173
|
+
// than handing the agent a bare Slack error code it cannot act on.
|
|
174
|
+
const hint = /missing_scope/.test(text)
|
|
175
|
+
? ' — the app is missing channels:read; reinstall it to pick up the new scopes, or pass the channel id instead'
|
|
176
|
+
: '';
|
|
177
|
+
throw new SlackAgentPostError('slack_error', `Could not look up channel "#${name}": ${text}${hint}`);
|
|
178
|
+
}
|
|
179
|
+
if (!channel)
|
|
180
|
+
throw new SlackAgentPostError('target_not_found', `No Slack channel named "#${name}"`);
|
|
181
|
+
if (channel.isArchived)
|
|
182
|
+
throw new SlackAgentPostError('target_not_found', `Channel "#${name}" is archived`);
|
|
183
|
+
return { channelId: channel.id, kind: 'channel' };
|
|
184
|
+
}
|
|
185
|
+
async openDm(userId, botToken) {
|
|
186
|
+
try {
|
|
187
|
+
return await this.deps.slack.openDirectMessage(userId, botToken);
|
|
188
|
+
}
|
|
189
|
+
catch (err) {
|
|
190
|
+
const text = errText(err);
|
|
191
|
+
if (/missing_scope/.test(text)) {
|
|
192
|
+
throw new SlackAgentPostError('slack_error', 'Slack refused to open the DM: the app is missing the im:write scope — reinstall it to pick up the new scopes');
|
|
193
|
+
}
|
|
194
|
+
throw new SlackAgentPostError('slack_error', `Could not open a DM with ${userId}: ${text}`);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
async lookupHandle(handle) {
|
|
198
|
+
try {
|
|
199
|
+
return await this.deps.slack.findUserByHandle(handle);
|
|
200
|
+
}
|
|
201
|
+
catch (err) {
|
|
202
|
+
throw new SlackAgentPostError('slack_error', `Could not look up "@${handle}": ${errText(err)}`);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
/** Turn Slack's send errors into something an agent can act on. */
|
|
206
|
+
explainSendFailure(err, kind, postedAs) {
|
|
207
|
+
const text = errText(err);
|
|
208
|
+
if (/not_in_channel|channel_not_found/.test(text) && kind === 'channel') {
|
|
209
|
+
const who = postedAs === 'agent' ? "this agent's Slack bot" : 'the Crewly bot';
|
|
210
|
+
return `Slack refused the post (${text}): invite ${who} into the channel, or use a public channel (chat:write.public covers those)`;
|
|
211
|
+
}
|
|
212
|
+
if (/missing_scope/.test(text)) {
|
|
213
|
+
return `Slack refused the post (${text}): reinstall the app to pick up the new scopes`;
|
|
214
|
+
}
|
|
215
|
+
return `Slack refused the post: ${text}`;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
function errText(err) {
|
|
219
|
+
if (err && typeof err === 'object') {
|
|
220
|
+
const data = err.data;
|
|
221
|
+
if (typeof data?.error === 'string')
|
|
222
|
+
return data.error;
|
|
223
|
+
}
|
|
224
|
+
return err instanceof Error ? err.message : String(err);
|
|
225
|
+
}
|
|
226
|
+
let instance = null;
|
|
227
|
+
/**
|
|
228
|
+
* Install the process-wide instance (composition root).
|
|
229
|
+
*
|
|
230
|
+
* @param service - The service or null
|
|
231
|
+
*/
|
|
232
|
+
export function setSlackAgentPostService(service) {
|
|
233
|
+
instance = service;
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* The process-wide instance, or null before wiring.
|
|
237
|
+
*
|
|
238
|
+
* @returns The service or null
|
|
239
|
+
*/
|
|
240
|
+
export function getSlackAgentPostService() {
|
|
241
|
+
return instance;
|
|
242
|
+
}
|
|
243
|
+
//# sourceMappingURL=slack-agent-post.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack-agent-post.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/slack/slack-agent-post.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -70,6 +70,17 @@ export interface SlackInitOptions {
|
|
|
70
70
|
* ```
|
|
71
71
|
*/
|
|
72
72
|
export declare function initializeSlackIfConfigured(options?: SlackInitOptions): Promise<SlackInitResult>;
|
|
73
|
+
/**
|
|
74
|
+
* Wire and start the Slack team-channel service (one Slack channel + one
|
|
75
|
+
* chat-v2 huddle per team). Idempotent — safe to call from both the boot
|
|
76
|
+
* path and the `/connect` route. Never throws: team channels are an
|
|
77
|
+
* optional layer on top of the orchestrator bridge, so a failure here
|
|
78
|
+
* must not take the Slack connection down with it.
|
|
79
|
+
*
|
|
80
|
+
* Dependencies are imported lazily so this module stays cheap to load in
|
|
81
|
+
* unit tests that only exercise credential resolution.
|
|
82
|
+
*/
|
|
83
|
+
export declare function startSlackTeamChannels(): Promise<void>;
|
|
73
84
|
/**
|
|
74
85
|
* Gracefully shutdown Slack integration
|
|
75
86
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slack-initializer.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/slack/slack-initializer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;AAKjF;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,2CAA2C;IAC3C,SAAS,EAAE,OAAO,CAAC;IACnB,uCAAuC;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAM3C;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,WAAW,GAAG,IAAI,CAiB1D;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAqBlE;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,0EAA0E;IAC1E,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;CAC3C;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,eAAe,CAAC,
|
|
1
|
+
{"version":3,"file":"slack-initializer.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/slack/slack-initializer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;AAKjF;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,2CAA2C;IAC3C,SAAS,EAAE,OAAO,CAAC;IACnB,uCAAuC;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAM3C;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,WAAW,GAAG,IAAI,CAiB1D;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAqBlE;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,0EAA0E;IAC1E,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;CAC3C;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,eAAe,CAAC,CA8B1B;AAED;;;;;;;;;GASG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC,CAqD5D;AAED;;;;GAIG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAUnD"}
|
|
@@ -108,6 +108,7 @@ export async function initializeSlackIfConfigured(options) {
|
|
|
108
108
|
bridge.setMessageQueueService(options.messageQueueService);
|
|
109
109
|
}
|
|
110
110
|
await bridge.initialize();
|
|
111
|
+
await startSlackTeamChannels();
|
|
111
112
|
logger.info('Successfully connected');
|
|
112
113
|
return { attempted: true, success: true };
|
|
113
114
|
}
|
|
@@ -117,6 +118,61 @@ export async function initializeSlackIfConfigured(options) {
|
|
|
117
118
|
return { attempted: true, success: false, error: errorMessage };
|
|
118
119
|
}
|
|
119
120
|
}
|
|
121
|
+
/**
|
|
122
|
+
* Wire and start the Slack team-channel service (one Slack channel + one
|
|
123
|
+
* chat-v2 huddle per team). Idempotent — safe to call from both the boot
|
|
124
|
+
* path and the `/connect` route. Never throws: team channels are an
|
|
125
|
+
* optional layer on top of the orchestrator bridge, so a failure here
|
|
126
|
+
* must not take the Slack connection down with it.
|
|
127
|
+
*
|
|
128
|
+
* Dependencies are imported lazily so this module stays cheap to load in
|
|
129
|
+
* unit tests that only exercise credential resolution.
|
|
130
|
+
*/
|
|
131
|
+
export async function startSlackTeamChannels() {
|
|
132
|
+
try {
|
|
133
|
+
const [{ SlackTeamChannelService, getSlackTeamChannelService, setSlackTeamChannelService }, { SlackAgentIdentityService, getSlackAgentIdentityService, setSlackAgentIdentityService }, { SlackAgentPostService, getSlackAgentPostService, setSlackAgentPostService }, { getChatV2Service }, { getChatV2RealtimeDeps }, { StorageService }, { CloudClientService },] = await Promise.all([
|
|
134
|
+
import('./slack-team-channel.service.js'),
|
|
135
|
+
import('./slack-agent-identity.service.js'),
|
|
136
|
+
import('./slack-agent-post.service.js'),
|
|
137
|
+
import('../chat-v2/chat-v2.singleton.js'),
|
|
138
|
+
import('../chat-v2/chat-v2.realtime-holder.js'),
|
|
139
|
+
import('../core/storage.service.js'),
|
|
140
|
+
import('../cloud/cloud-client.service.js'),
|
|
141
|
+
]);
|
|
142
|
+
// Real per-agent identities live behind the Cloud login; the service is
|
|
143
|
+
// always constructed and simply reports unavailable until then.
|
|
144
|
+
let identities = getSlackAgentIdentityService();
|
|
145
|
+
if (!identities) {
|
|
146
|
+
identities = new SlackAgentIdentityService({ cloud: CloudClientService.getInstance() });
|
|
147
|
+
setSlackAgentIdentityService(identities);
|
|
148
|
+
}
|
|
149
|
+
// Agent-initiated posts (the `slack-post` skill).
|
|
150
|
+
if (!getSlackAgentPostService()) {
|
|
151
|
+
setSlackAgentPostService(new SlackAgentPostService({
|
|
152
|
+
slack: getSlackService(),
|
|
153
|
+
storage: StorageService.getInstance(),
|
|
154
|
+
identities,
|
|
155
|
+
}));
|
|
156
|
+
}
|
|
157
|
+
let service = getSlackTeamChannelService();
|
|
158
|
+
if (!service) {
|
|
159
|
+
service = new SlackTeamChannelService({
|
|
160
|
+
slack: getSlackService(),
|
|
161
|
+
chat: getChatV2Service(),
|
|
162
|
+
storage: StorageService.getInstance(),
|
|
163
|
+
getDispatcher: () => getChatV2RealtimeDeps().dispatcher ?? null,
|
|
164
|
+
identities,
|
|
165
|
+
});
|
|
166
|
+
setSlackTeamChannelService(service);
|
|
167
|
+
}
|
|
168
|
+
await service.start();
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
logger.warn('Slack team channels not started', {
|
|
172
|
+
error: error instanceof Error ? error.message : String(error),
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
}
|
|
120
176
|
/**
|
|
121
177
|
* Gracefully shutdown Slack integration
|
|
122
178
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slack-initializer.js","sourceRoot":"","sources":["../../../../../../backend/src/services/slack/slack-initializer.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"slack-initializer.js","sourceRoot":"","sources":["../../../../../../backend/src/services/slack/slack-initializer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Slack mention resolver for team channels.
|
|
3
|
+
*
|
|
4
|
+
* Agents are not Slack users, so a message like `@sam 看一下这个` arrives as
|
|
5
|
+
* plain text. This module finds every `@name` token in a Slack message and
|
|
6
|
+
* maps it to a Crewly agent session, and for names that match nothing it
|
|
7
|
+
* offers "did you mean" suggestions (bounded Levenshtein distance) so the
|
|
8
|
+
* bridge can answer a typo instead of silently ignoring it.
|
|
9
|
+
*
|
|
10
|
+
* Pure functions, no I/O — the bridge supplies the candidate list from the
|
|
11
|
+
* team's members.
|
|
12
|
+
*
|
|
13
|
+
* @module services/slack/slack-mention-resolver
|
|
14
|
+
*/
|
|
15
|
+
/** One agent the resolver may match against. */
|
|
16
|
+
export interface MentionCandidate {
|
|
17
|
+
/** Display name as configured on the team member (e.g. `Sam`). */
|
|
18
|
+
name: string;
|
|
19
|
+
/** Agent session name (e.g. `crewly-alpha-sam`). */
|
|
20
|
+
sessionName: string;
|
|
21
|
+
/**
|
|
22
|
+
* The agent's own Slack bot user id when it has a real identity. A native
|
|
23
|
+
* Slack mention arrives as `<@U…>` and is matched here first.
|
|
24
|
+
*/
|
|
25
|
+
botUserId?: string;
|
|
26
|
+
}
|
|
27
|
+
/** An `@name` that matched no candidate, with close alternatives. */
|
|
28
|
+
export interface UnknownMention {
|
|
29
|
+
/** The token as typed, without the `@`. */
|
|
30
|
+
token: string;
|
|
31
|
+
/** Candidate display names within the edit-distance cutoff, best first. */
|
|
32
|
+
suggestions: string[];
|
|
33
|
+
}
|
|
34
|
+
/** Result of {@link resolveSlackMentions}. */
|
|
35
|
+
export interface ResolvedSlackMentions {
|
|
36
|
+
/** Session names of matched agents, in first-mention order, deduped. */
|
|
37
|
+
mentions: string[];
|
|
38
|
+
/** Tokens that matched nobody. */
|
|
39
|
+
unknown: UnknownMention[];
|
|
40
|
+
}
|
|
41
|
+
/** Options for {@link resolveSlackMentions}. */
|
|
42
|
+
export interface ResolveSlackMentionsOptions {
|
|
43
|
+
/** Max edit distance for a suggestion (default from constants). */
|
|
44
|
+
maxDistance?: number;
|
|
45
|
+
/** Max suggestions per unknown token (default from constants). */
|
|
46
|
+
maxSuggestions?: number;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Extract the user ids of native `<@U…>` mentions, in order, deduped.
|
|
50
|
+
*
|
|
51
|
+
* @param text - Slack message text
|
|
52
|
+
* @returns Slack user ids
|
|
53
|
+
*/
|
|
54
|
+
export declare function extractNativeMentionIds(text: string): string[];
|
|
55
|
+
/**
|
|
56
|
+
* Levenshtein edit distance between two strings, compared case-insensitively.
|
|
57
|
+
*
|
|
58
|
+
* @param a - First string
|
|
59
|
+
* @param b - Second string
|
|
60
|
+
* @returns The minimum number of single-character edits to turn `a` into `b`
|
|
61
|
+
*/
|
|
62
|
+
export declare function levenshtein(a: string, b: string): number;
|
|
63
|
+
/**
|
|
64
|
+
* The aliases a candidate answers to: its display name, the name with
|
|
65
|
+
* whitespace removed, its full session name, and the short session
|
|
66
|
+
* segment (`crewly-alpha-sam` → `sam`, matching the orchestrator bridge's
|
|
67
|
+
* existing `@name` rule). All lower-cased.
|
|
68
|
+
*
|
|
69
|
+
* @param candidate - The agent
|
|
70
|
+
* @returns Distinct lower-case aliases
|
|
71
|
+
*/
|
|
72
|
+
export declare function candidateAliases(candidate: MentionCandidate): string[];
|
|
73
|
+
/**
|
|
74
|
+
* Extract the raw `@name` tokens from a message, in order, deduped
|
|
75
|
+
* case-insensitively, with Slack's reserved words removed.
|
|
76
|
+
*
|
|
77
|
+
* @param text - Slack message text
|
|
78
|
+
* @returns Tokens without the leading `@`
|
|
79
|
+
*/
|
|
80
|
+
export declare function extractMentionTokens(text: string): string[];
|
|
81
|
+
/**
|
|
82
|
+
* Map every `@name` in `text` to an agent session.
|
|
83
|
+
*
|
|
84
|
+
* Exact (case-insensitive) alias matches win. A token that matches no
|
|
85
|
+
* alias is reported under `unknown` with up to `maxSuggestions` candidate
|
|
86
|
+
* display names within `maxDistance` edits, closest first.
|
|
87
|
+
*
|
|
88
|
+
* @param text - Slack message text
|
|
89
|
+
* @param candidates - The agents that can be mentioned (team members)
|
|
90
|
+
* @param options - Distance and suggestion caps
|
|
91
|
+
* @returns Matched sessions and unknown tokens
|
|
92
|
+
*
|
|
93
|
+
* @example
|
|
94
|
+
* ```ts
|
|
95
|
+
* resolveSlackMentions('@sam @lee 看一下', [
|
|
96
|
+
* { name: 'Sam', sessionName: 'crewly-alpha-sam' },
|
|
97
|
+
* { name: 'Leo', sessionName: 'crewly-alpha-leo' },
|
|
98
|
+
* ]);
|
|
99
|
+
* // → { mentions: ['crewly-alpha-sam'], unknown: [{ token: 'lee', suggestions: ['Leo'] }] }
|
|
100
|
+
* ```
|
|
101
|
+
*/
|
|
102
|
+
export declare function resolveSlackMentions(text: string, candidates: MentionCandidate[], options?: ResolveSlackMentionsOptions): ResolvedSlackMentions;
|
|
103
|
+
//# sourceMappingURL=slack-mention-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack-mention-resolver.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/slack/slack-mention-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,gDAAgD;AAChD,MAAM,WAAW,gBAAgB;IAC/B,kEAAkE;IAClE,IAAI,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,WAAW,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qEAAqE;AACrE,MAAM,WAAW,cAAc;IAC7B,2CAA2C;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,8CAA8C;AAC9C,MAAM,WAAW,qBAAqB;IACpC,wEAAwE;IACxE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,kCAAkC;IAClC,OAAO,EAAE,cAAc,EAAE,CAAC;CAC3B;AAED,gDAAgD;AAChD,MAAM,WAAW,2BAA2B;IAC1C,mEAAmE;IACnE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAmBD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAS9D;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAgBxD;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,gBAAgB,GAAG,MAAM,EAAE,CAgBtE;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAY3D;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,gBAAgB,EAAE,EAC9B,OAAO,GAAE,2BAAgC,GACxC,qBAAqB,CAqDvB"}
|