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,209 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Slack Agent Identity Service — one real Slack bot user per agent.
|
|
3
|
+
*
|
|
4
|
+
* Crewly Cloud (`/api/cloud/slack/*`) creates one Slack app per agent with
|
|
5
|
+
* the owner's app configuration token, hands back an install link, and after
|
|
6
|
+
* the owner's one consent click holds the agent's bot token. This service is
|
|
7
|
+
* the OSS half:
|
|
8
|
+
*
|
|
9
|
+
* - talks to Cloud with the OSS install's Cloud access token;
|
|
10
|
+
* - caches identities (bot user id, bot token) in
|
|
11
|
+
* `~/.crewly/slack-agent-identities.json` (mode 0600) so posting works
|
|
12
|
+
* without a Cloud round-trip;
|
|
13
|
+
* - polls Cloud while any install is pending so a click on the link shows
|
|
14
|
+
* up here within ~30 s;
|
|
15
|
+
* - remembers where each install link was announced and which channels the
|
|
16
|
+
* bot has been invited into, so the team-channel service does each once.
|
|
17
|
+
*
|
|
18
|
+
* Team channels use it to post replies as the agent (its own token) and to
|
|
19
|
+
* resolve native `<@U…>` mentions. Everything degrades gracefully: with no
|
|
20
|
+
* Cloud login or no identity, replies fall back to the cosmetic
|
|
21
|
+
* username/icon override.
|
|
22
|
+
*
|
|
23
|
+
* @module services/slack/slack-agent-identity.service
|
|
24
|
+
*/
|
|
25
|
+
import type { SlackAgentIdentityRecord, SlackAgentIdentitiesFile } from '../../types/slack.types.js';
|
|
26
|
+
/** The slice of CloudClientService this service needs. */
|
|
27
|
+
export interface IdentityCloudClient {
|
|
28
|
+
isConnected(): boolean;
|
|
29
|
+
getToken(): string | null;
|
|
30
|
+
getCloudUrl(): string | null;
|
|
31
|
+
}
|
|
32
|
+
/** Constructor dependencies. */
|
|
33
|
+
export interface SlackAgentIdentityServiceDeps {
|
|
34
|
+
cloud: IdentityCloudClient;
|
|
35
|
+
storePath?: string;
|
|
36
|
+
fetchImpl?: typeof fetch;
|
|
37
|
+
now?: () => number;
|
|
38
|
+
/** Timer override for tests. */
|
|
39
|
+
setInterval?: typeof setInterval;
|
|
40
|
+
clearInterval?: typeof clearInterval;
|
|
41
|
+
}
|
|
42
|
+
/** Cloud's config-token status. */
|
|
43
|
+
export interface CloudConfigTokenStatus {
|
|
44
|
+
configured: boolean;
|
|
45
|
+
status?: 'ok' | 'invalid';
|
|
46
|
+
expiresAt?: string;
|
|
47
|
+
lastError?: string;
|
|
48
|
+
}
|
|
49
|
+
/** Cloud's `/slack/status` payload. */
|
|
50
|
+
export interface CloudSlackStatus {
|
|
51
|
+
enabled: boolean;
|
|
52
|
+
configToken: CloudConfigTokenStatus;
|
|
53
|
+
agents: {
|
|
54
|
+
total: number;
|
|
55
|
+
installed: number;
|
|
56
|
+
pending: number;
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/** Error from Cloud with the stable code it returned. */
|
|
60
|
+
export declare class SlackIdentityCloudError extends Error {
|
|
61
|
+
readonly status: number;
|
|
62
|
+
readonly code: string;
|
|
63
|
+
constructor(status: number, code: string, message: string);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Service — see module docs.
|
|
67
|
+
*/
|
|
68
|
+
export declare class SlackAgentIdentityService {
|
|
69
|
+
private readonly logger;
|
|
70
|
+
private readonly deps;
|
|
71
|
+
private readonly storePath;
|
|
72
|
+
private readonly fetchImpl;
|
|
73
|
+
private store;
|
|
74
|
+
private loading;
|
|
75
|
+
private pollTimer;
|
|
76
|
+
private pollingSince;
|
|
77
|
+
private readonly listeners;
|
|
78
|
+
constructor(deps: SlackAgentIdentityServiceDeps);
|
|
79
|
+
/**
|
|
80
|
+
* Whether Cloud can be reached (logged in with a token).
|
|
81
|
+
*
|
|
82
|
+
* @returns True when the OSS install is connected to Crewly Cloud
|
|
83
|
+
*/
|
|
84
|
+
isAvailable(): boolean;
|
|
85
|
+
/**
|
|
86
|
+
* Register a callback for the moment an identity becomes installed
|
|
87
|
+
* (bot user id + token known). The team-channel service uses it to invite
|
|
88
|
+
* the new bot into its channels.
|
|
89
|
+
*
|
|
90
|
+
* @param listener - Called with the installed record
|
|
91
|
+
* @returns Unsubscribe
|
|
92
|
+
*/
|
|
93
|
+
onInstalled(listener: (record: SlackAgentIdentityRecord) => void): () => void;
|
|
94
|
+
/**
|
|
95
|
+
* Cloud-side status: whether the feature is enabled there, whether this
|
|
96
|
+
* account has a config token, and agent counts.
|
|
97
|
+
*
|
|
98
|
+
* @returns The status
|
|
99
|
+
* @throws {SlackIdentityCloudError} on a Cloud failure
|
|
100
|
+
*/
|
|
101
|
+
getCloudStatus(): Promise<CloudSlackStatus>;
|
|
102
|
+
/**
|
|
103
|
+
* Store the owner's Slack app configuration token on Cloud (validated
|
|
104
|
+
* there by rotating it once).
|
|
105
|
+
*
|
|
106
|
+
* @param token - Config access token (may be empty/expired)
|
|
107
|
+
* @param refreshToken - Config refresh token (required)
|
|
108
|
+
* @returns The stored token's status
|
|
109
|
+
*/
|
|
110
|
+
setConfigToken(token: string, refreshToken: string): Promise<CloudConfigTokenStatus>;
|
|
111
|
+
/**
|
|
112
|
+
* Remove the config token on Cloud.
|
|
113
|
+
*
|
|
114
|
+
* @returns True when one existed
|
|
115
|
+
*/
|
|
116
|
+
deleteConfigToken(): Promise<boolean>;
|
|
117
|
+
/**
|
|
118
|
+
* Ask Cloud for an identity for an agent (idempotent). Returns the cached
|
|
119
|
+
* record updated with Cloud's answer, including `installUrl` while the
|
|
120
|
+
* install is pending.
|
|
121
|
+
*
|
|
122
|
+
* @param agentSession - Stable agent id
|
|
123
|
+
* @param displayName - Name the bot will carry in Slack
|
|
124
|
+
* @param description - Optional app description
|
|
125
|
+
* @returns The record
|
|
126
|
+
*/
|
|
127
|
+
provision(agentSession: string, displayName: string, description?: string): Promise<SlackAgentIdentityRecord>;
|
|
128
|
+
/**
|
|
129
|
+
* Pull every identity (with tokens) from Cloud into the local cache.
|
|
130
|
+
* Newly installed ones fire {@link onInstalled}.
|
|
131
|
+
*
|
|
132
|
+
* @returns All records after the merge
|
|
133
|
+
*/
|
|
134
|
+
refreshFromCloud(): Promise<SlackAgentIdentityRecord[]>;
|
|
135
|
+
/**
|
|
136
|
+
* Delete an agent's Slack app on Cloud and forget it locally.
|
|
137
|
+
*
|
|
138
|
+
* @param agentSession - The agent
|
|
139
|
+
* @returns True when a record existed on Cloud
|
|
140
|
+
*/
|
|
141
|
+
remove(agentSession: string): Promise<boolean>;
|
|
142
|
+
/**
|
|
143
|
+
* All cached identities (tokens included — callers must not log them).
|
|
144
|
+
*
|
|
145
|
+
* @returns Copies
|
|
146
|
+
*/
|
|
147
|
+
list(): Promise<SlackAgentIdentityRecord[]>;
|
|
148
|
+
/**
|
|
149
|
+
* Cached identity for an agent, if any. Synchronous read of the loaded
|
|
150
|
+
* cache (call {@link list} or any Cloud method first to load it).
|
|
151
|
+
*
|
|
152
|
+
* @param agentSession - The agent
|
|
153
|
+
* @returns The record or null
|
|
154
|
+
*/
|
|
155
|
+
get(agentSession: string): SlackAgentIdentityRecord | null;
|
|
156
|
+
/**
|
|
157
|
+
* Installed identity (bot user + token) for an agent, or null.
|
|
158
|
+
*
|
|
159
|
+
* @param agentSession - The agent
|
|
160
|
+
* @returns `{ botUserId, botToken }` when installed
|
|
161
|
+
*/
|
|
162
|
+
getInstalled(agentSession: string): {
|
|
163
|
+
botUserId: string;
|
|
164
|
+
botToken: string;
|
|
165
|
+
} | null;
|
|
166
|
+
/**
|
|
167
|
+
* Agent session for a Slack bot user id (native mention resolution).
|
|
168
|
+
*
|
|
169
|
+
* @param botUserId - Slack user id
|
|
170
|
+
* @returns The agent session or null
|
|
171
|
+
*/
|
|
172
|
+
findByBotUserId(botUserId: string): string | null;
|
|
173
|
+
/**
|
|
174
|
+
* Mark that an install link was announced in a channel / the bot was
|
|
175
|
+
* invited into a channel, so it is not repeated.
|
|
176
|
+
*
|
|
177
|
+
* @param agentSession - The agent
|
|
178
|
+
* @param patch - Channel ids to add to either list
|
|
179
|
+
*/
|
|
180
|
+
markChannel(agentSession: string, patch: {
|
|
181
|
+
announcedIn?: string;
|
|
182
|
+
invitedTo?: string;
|
|
183
|
+
}): Promise<void>;
|
|
184
|
+
/** Load the cache once. */
|
|
185
|
+
load(): Promise<SlackAgentIdentitiesFile>;
|
|
186
|
+
/** Stop timers (shutdown / tests). */
|
|
187
|
+
stop(): void;
|
|
188
|
+
private mergeView;
|
|
189
|
+
private save;
|
|
190
|
+
private ensurePolling;
|
|
191
|
+
private stopPolling;
|
|
192
|
+
/** One poll: refresh from Cloud; give up after the max age. */
|
|
193
|
+
pollTick(): Promise<void>;
|
|
194
|
+
private now;
|
|
195
|
+
private cloudRequest;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Install the process-wide instance (composition root).
|
|
199
|
+
*
|
|
200
|
+
* @param service - The service or null
|
|
201
|
+
*/
|
|
202
|
+
export declare function setSlackAgentIdentityService(service: SlackAgentIdentityService | null): void;
|
|
203
|
+
/**
|
|
204
|
+
* The process-wide instance, or null before wiring.
|
|
205
|
+
*
|
|
206
|
+
* @returns The service or null
|
|
207
|
+
*/
|
|
208
|
+
export declare function getSlackAgentIdentityService(): SlackAgentIdentityService | null;
|
|
209
|
+
//# sourceMappingURL=slack-agent-identity.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack-agent-identity.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/slack/slack-agent-identity.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,416 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Slack Agent Identity Service — one real Slack bot user per agent.
|
|
3
|
+
*
|
|
4
|
+
* Crewly Cloud (`/api/cloud/slack/*`) creates one Slack app per agent with
|
|
5
|
+
* the owner's app configuration token, hands back an install link, and after
|
|
6
|
+
* the owner's one consent click holds the agent's bot token. This service is
|
|
7
|
+
* the OSS half:
|
|
8
|
+
*
|
|
9
|
+
* - talks to Cloud with the OSS install's Cloud access token;
|
|
10
|
+
* - caches identities (bot user id, bot token) in
|
|
11
|
+
* `~/.crewly/slack-agent-identities.json` (mode 0600) so posting works
|
|
12
|
+
* without a Cloud round-trip;
|
|
13
|
+
* - polls Cloud while any install is pending so a click on the link shows
|
|
14
|
+
* up here within ~30 s;
|
|
15
|
+
* - remembers where each install link was announced and which channels the
|
|
16
|
+
* bot has been invited into, so the team-channel service does each once.
|
|
17
|
+
*
|
|
18
|
+
* Team channels use it to post replies as the agent (its own token) and to
|
|
19
|
+
* resolve native `<@U…>` mentions. Everything degrades gracefully: with no
|
|
20
|
+
* Cloud login or no identity, replies fall back to the cosmetic
|
|
21
|
+
* username/icon override.
|
|
22
|
+
*
|
|
23
|
+
* @module services/slack/slack-agent-identity.service
|
|
24
|
+
*/
|
|
25
|
+
import * as path from 'path';
|
|
26
|
+
import { promises as fs } from 'fs';
|
|
27
|
+
import { getCrewlyHomePath } from '../core/crewly-home.utils.js';
|
|
28
|
+
import { atomicWriteJson, safeReadJson } from '../../utils/file-io.utils.js';
|
|
29
|
+
import { LoggerService } from '../core/logger.service.js';
|
|
30
|
+
import { SLACK_AGENT_IDENTITY_CONSTANTS } from '../../constants.js';
|
|
31
|
+
/** Error from Cloud with the stable code it returned. */
|
|
32
|
+
export class SlackIdentityCloudError extends Error {
|
|
33
|
+
status;
|
|
34
|
+
code;
|
|
35
|
+
constructor(status, code, message) {
|
|
36
|
+
super(message);
|
|
37
|
+
this.status = status;
|
|
38
|
+
this.code = code;
|
|
39
|
+
this.name = 'SlackIdentityCloudError';
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const EMPTY = { version: 1, identities: [] };
|
|
43
|
+
/**
|
|
44
|
+
* Service — see module docs.
|
|
45
|
+
*/
|
|
46
|
+
export class SlackAgentIdentityService {
|
|
47
|
+
logger;
|
|
48
|
+
deps;
|
|
49
|
+
storePath;
|
|
50
|
+
fetchImpl;
|
|
51
|
+
store = null;
|
|
52
|
+
loading = null;
|
|
53
|
+
pollTimer = null;
|
|
54
|
+
pollingSince = 0;
|
|
55
|
+
listeners = new Set();
|
|
56
|
+
constructor(deps) {
|
|
57
|
+
this.deps = deps;
|
|
58
|
+
this.storePath =
|
|
59
|
+
deps.storePath ?? path.join(getCrewlyHomePath(), SLACK_AGENT_IDENTITY_CONSTANTS.STORE_FILENAME);
|
|
60
|
+
this.fetchImpl = deps.fetchImpl ?? fetch;
|
|
61
|
+
this.logger = LoggerService.getInstance().createComponentLogger('SlackAgentIdentity');
|
|
62
|
+
}
|
|
63
|
+
// -------------------------------------------------------------------------
|
|
64
|
+
// Availability
|
|
65
|
+
// -------------------------------------------------------------------------
|
|
66
|
+
/**
|
|
67
|
+
* Whether Cloud can be reached (logged in with a token).
|
|
68
|
+
*
|
|
69
|
+
* @returns True when the OSS install is connected to Crewly Cloud
|
|
70
|
+
*/
|
|
71
|
+
isAvailable() {
|
|
72
|
+
return this.deps.cloud.isConnected() && !!this.deps.cloud.getToken() && !!this.deps.cloud.getCloudUrl();
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Register a callback for the moment an identity becomes installed
|
|
76
|
+
* (bot user id + token known). The team-channel service uses it to invite
|
|
77
|
+
* the new bot into its channels.
|
|
78
|
+
*
|
|
79
|
+
* @param listener - Called with the installed record
|
|
80
|
+
* @returns Unsubscribe
|
|
81
|
+
*/
|
|
82
|
+
onInstalled(listener) {
|
|
83
|
+
this.listeners.add(listener);
|
|
84
|
+
return () => this.listeners.delete(listener);
|
|
85
|
+
}
|
|
86
|
+
// -------------------------------------------------------------------------
|
|
87
|
+
// Cloud calls
|
|
88
|
+
// -------------------------------------------------------------------------
|
|
89
|
+
/**
|
|
90
|
+
* Cloud-side status: whether the feature is enabled there, whether this
|
|
91
|
+
* account has a config token, and agent counts.
|
|
92
|
+
*
|
|
93
|
+
* @returns The status
|
|
94
|
+
* @throws {SlackIdentityCloudError} on a Cloud failure
|
|
95
|
+
*/
|
|
96
|
+
async getCloudStatus() {
|
|
97
|
+
return this.cloudRequest('GET', '/status');
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Store the owner's Slack app configuration token on Cloud (validated
|
|
101
|
+
* there by rotating it once).
|
|
102
|
+
*
|
|
103
|
+
* @param token - Config access token (may be empty/expired)
|
|
104
|
+
* @param refreshToken - Config refresh token (required)
|
|
105
|
+
* @returns The stored token's status
|
|
106
|
+
*/
|
|
107
|
+
async setConfigToken(token, refreshToken) {
|
|
108
|
+
return this.cloudRequest('PUT', '/config-token', { token, refreshToken });
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Remove the config token on Cloud.
|
|
112
|
+
*
|
|
113
|
+
* @returns True when one existed
|
|
114
|
+
*/
|
|
115
|
+
async deleteConfigToken() {
|
|
116
|
+
const res = await this.cloudRequest('DELETE', '/config-token');
|
|
117
|
+
return res.removed;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Ask Cloud for an identity for an agent (idempotent). Returns the cached
|
|
121
|
+
* record updated with Cloud's answer, including `installUrl` while the
|
|
122
|
+
* install is pending.
|
|
123
|
+
*
|
|
124
|
+
* @param agentSession - Stable agent id
|
|
125
|
+
* @param displayName - Name the bot will carry in Slack
|
|
126
|
+
* @param description - Optional app description
|
|
127
|
+
* @returns The record
|
|
128
|
+
*/
|
|
129
|
+
async provision(agentSession, displayName, description) {
|
|
130
|
+
const view = await this.cloudRequest('POST', '/agents', { agentSession, displayName, description });
|
|
131
|
+
const record = await this.mergeView(view);
|
|
132
|
+
if (record.status === 'pending_install')
|
|
133
|
+
this.ensurePolling();
|
|
134
|
+
return record;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Pull every identity (with tokens) from Cloud into the local cache.
|
|
138
|
+
* Newly installed ones fire {@link onInstalled}.
|
|
139
|
+
*
|
|
140
|
+
* @returns All records after the merge
|
|
141
|
+
*/
|
|
142
|
+
async refreshFromCloud() {
|
|
143
|
+
const views = await this.cloudRequest('GET', '/agents?includeTokens=1');
|
|
144
|
+
for (const view of views)
|
|
145
|
+
await this.mergeView(view);
|
|
146
|
+
const store = await this.load();
|
|
147
|
+
if (!store.identities.some((r) => r.status === 'pending_install'))
|
|
148
|
+
this.stopPolling();
|
|
149
|
+
return store.identities.map((r) => ({ ...r }));
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Delete an agent's Slack app on Cloud and forget it locally.
|
|
153
|
+
*
|
|
154
|
+
* @param agentSession - The agent
|
|
155
|
+
* @returns True when a record existed on Cloud
|
|
156
|
+
*/
|
|
157
|
+
async remove(agentSession) {
|
|
158
|
+
let removed = false;
|
|
159
|
+
try {
|
|
160
|
+
const res = await this.cloudRequest('DELETE', `/agents/${encodeURIComponent(agentSession)}`);
|
|
161
|
+
removed = res.removed;
|
|
162
|
+
}
|
|
163
|
+
catch (err) {
|
|
164
|
+
if (!(err instanceof SlackIdentityCloudError && err.status === 404))
|
|
165
|
+
throw err;
|
|
166
|
+
}
|
|
167
|
+
const store = await this.load();
|
|
168
|
+
store.identities = store.identities.filter((r) => r.agentSession !== agentSession);
|
|
169
|
+
await this.save();
|
|
170
|
+
return removed;
|
|
171
|
+
}
|
|
172
|
+
// -------------------------------------------------------------------------
|
|
173
|
+
// Local cache
|
|
174
|
+
// -------------------------------------------------------------------------
|
|
175
|
+
/**
|
|
176
|
+
* All cached identities (tokens included — callers must not log them).
|
|
177
|
+
*
|
|
178
|
+
* @returns Copies
|
|
179
|
+
*/
|
|
180
|
+
async list() {
|
|
181
|
+
const store = await this.load();
|
|
182
|
+
return store.identities.map((r) => ({ ...r }));
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Cached identity for an agent, if any. Synchronous read of the loaded
|
|
186
|
+
* cache (call {@link list} or any Cloud method first to load it).
|
|
187
|
+
*
|
|
188
|
+
* @param agentSession - The agent
|
|
189
|
+
* @returns The record or null
|
|
190
|
+
*/
|
|
191
|
+
get(agentSession) {
|
|
192
|
+
return this.store?.identities.find((r) => r.agentSession === agentSession) ?? null;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Installed identity (bot user + token) for an agent, or null.
|
|
196
|
+
*
|
|
197
|
+
* @param agentSession - The agent
|
|
198
|
+
* @returns `{ botUserId, botToken }` when installed
|
|
199
|
+
*/
|
|
200
|
+
getInstalled(agentSession) {
|
|
201
|
+
const r = this.get(agentSession);
|
|
202
|
+
if (r && r.status === 'installed' && r.botUserId && r.botToken) {
|
|
203
|
+
return { botUserId: r.botUserId, botToken: r.botToken };
|
|
204
|
+
}
|
|
205
|
+
return null;
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Agent session for a Slack bot user id (native mention resolution).
|
|
209
|
+
*
|
|
210
|
+
* @param botUserId - Slack user id
|
|
211
|
+
* @returns The agent session or null
|
|
212
|
+
*/
|
|
213
|
+
findByBotUserId(botUserId) {
|
|
214
|
+
return this.store?.identities.find((r) => r.botUserId === botUserId)?.agentSession ?? null;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Mark that an install link was announced in a channel / the bot was
|
|
218
|
+
* invited into a channel, so it is not repeated.
|
|
219
|
+
*
|
|
220
|
+
* @param agentSession - The agent
|
|
221
|
+
* @param patch - Channel ids to add to either list
|
|
222
|
+
*/
|
|
223
|
+
async markChannel(agentSession, patch) {
|
|
224
|
+
const store = await this.load();
|
|
225
|
+
const r = store.identities.find((x) => x.agentSession === agentSession);
|
|
226
|
+
if (!r)
|
|
227
|
+
return;
|
|
228
|
+
if (patch.announcedIn && !r.announcedIn.includes(patch.announcedIn))
|
|
229
|
+
r.announcedIn.push(patch.announcedIn);
|
|
230
|
+
if (patch.invitedTo && !r.invitedTo.includes(patch.invitedTo))
|
|
231
|
+
r.invitedTo.push(patch.invitedTo);
|
|
232
|
+
r.updatedAt = new Date(this.now()).toISOString();
|
|
233
|
+
await this.save();
|
|
234
|
+
}
|
|
235
|
+
/** Load the cache once. */
|
|
236
|
+
async load() {
|
|
237
|
+
if (this.store)
|
|
238
|
+
return this.store;
|
|
239
|
+
if (!this.loading) {
|
|
240
|
+
this.loading = safeReadJson(this.storePath, EMPTY).then((raw) => {
|
|
241
|
+
const identities = Array.isArray(raw?.identities) ? raw.identities.filter(isRecord) : [];
|
|
242
|
+
this.store = { version: 1, identities };
|
|
243
|
+
if (identities.some((r) => r.status === 'pending_install'))
|
|
244
|
+
this.ensurePolling();
|
|
245
|
+
return this.store;
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
return this.loading;
|
|
249
|
+
}
|
|
250
|
+
/** Stop timers (shutdown / tests). */
|
|
251
|
+
stop() {
|
|
252
|
+
this.stopPolling();
|
|
253
|
+
}
|
|
254
|
+
// -------------------------------------------------------------------------
|
|
255
|
+
// Internals
|
|
256
|
+
// -------------------------------------------------------------------------
|
|
257
|
+
async mergeView(view) {
|
|
258
|
+
const store = await this.load();
|
|
259
|
+
const nowIso = new Date(this.now()).toISOString();
|
|
260
|
+
let record = store.identities.find((r) => r.agentSession === view.agentSession);
|
|
261
|
+
const wasInstalled = record?.status === 'installed';
|
|
262
|
+
if (!record) {
|
|
263
|
+
record = {
|
|
264
|
+
agentSession: view.agentSession,
|
|
265
|
+
displayName: view.displayName,
|
|
266
|
+
appId: view.appId,
|
|
267
|
+
status: view.status,
|
|
268
|
+
announcedIn: [],
|
|
269
|
+
invitedTo: [],
|
|
270
|
+
updatedAt: nowIso,
|
|
271
|
+
};
|
|
272
|
+
store.identities.push(record);
|
|
273
|
+
}
|
|
274
|
+
record.displayName = view.displayName;
|
|
275
|
+
record.appId = view.appId;
|
|
276
|
+
record.status = view.status;
|
|
277
|
+
record.updatedAt = nowIso;
|
|
278
|
+
if (view.botUserId)
|
|
279
|
+
record.botUserId = view.botUserId;
|
|
280
|
+
if (view.teamId)
|
|
281
|
+
record.teamId = view.teamId;
|
|
282
|
+
if (view.botToken)
|
|
283
|
+
record.botToken = view.botToken;
|
|
284
|
+
if (view.installUrl)
|
|
285
|
+
record.installUrl = view.installUrl;
|
|
286
|
+
else if (view.status === 'installed')
|
|
287
|
+
delete record.installUrl;
|
|
288
|
+
if (view.error)
|
|
289
|
+
record.error = view.error;
|
|
290
|
+
else
|
|
291
|
+
delete record.error;
|
|
292
|
+
await this.save();
|
|
293
|
+
if (!wasInstalled && record.status === 'installed' && record.botToken) {
|
|
294
|
+
this.logger.info('Slack agent identity installed', {
|
|
295
|
+
agentSession: record.agentSession,
|
|
296
|
+
botUserId: record.botUserId,
|
|
297
|
+
});
|
|
298
|
+
for (const l of this.listeners) {
|
|
299
|
+
try {
|
|
300
|
+
l({ ...record });
|
|
301
|
+
}
|
|
302
|
+
catch (err) {
|
|
303
|
+
this.logger.warn('onInstalled listener threw', { error: err instanceof Error ? err.message : String(err) });
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
return { ...record };
|
|
308
|
+
}
|
|
309
|
+
async save() {
|
|
310
|
+
const store = await this.load();
|
|
311
|
+
await fs.mkdir(path.dirname(this.storePath), { recursive: true });
|
|
312
|
+
await atomicWriteJson(this.storePath, store);
|
|
313
|
+
await fs.chmod(this.storePath, 0o600).catch(() => undefined);
|
|
314
|
+
}
|
|
315
|
+
ensurePolling() {
|
|
316
|
+
if (this.pollTimer)
|
|
317
|
+
return;
|
|
318
|
+
this.pollingSince = this.now();
|
|
319
|
+
const setI = this.deps.setInterval ?? setInterval;
|
|
320
|
+
this.pollTimer = setI(() => {
|
|
321
|
+
void this.pollTick();
|
|
322
|
+
}, SLACK_AGENT_IDENTITY_CONSTANTS.PENDING_POLL_INTERVAL_MS);
|
|
323
|
+
// Never keep the process alive just for this.
|
|
324
|
+
this.pollTimer.unref?.();
|
|
325
|
+
}
|
|
326
|
+
stopPolling() {
|
|
327
|
+
if (!this.pollTimer)
|
|
328
|
+
return;
|
|
329
|
+
const clearI = this.deps.clearInterval ?? clearInterval;
|
|
330
|
+
clearI(this.pollTimer);
|
|
331
|
+
this.pollTimer = null;
|
|
332
|
+
}
|
|
333
|
+
/** One poll: refresh from Cloud; give up after the max age. */
|
|
334
|
+
async pollTick() {
|
|
335
|
+
if (this.now() - this.pollingSince > SLACK_AGENT_IDENTITY_CONSTANTS.PENDING_POLL_MAX_AGE_MS) {
|
|
336
|
+
this.logger.info('Stopped polling for pending Slack installs (max age reached)');
|
|
337
|
+
this.stopPolling();
|
|
338
|
+
return;
|
|
339
|
+
}
|
|
340
|
+
if (!this.isAvailable())
|
|
341
|
+
return;
|
|
342
|
+
try {
|
|
343
|
+
await this.refreshFromCloud();
|
|
344
|
+
}
|
|
345
|
+
catch (err) {
|
|
346
|
+
this.logger.debug('Pending-install poll failed', { error: err instanceof Error ? err.message : String(err) });
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
now() {
|
|
350
|
+
return this.deps.now?.() ?? Date.now();
|
|
351
|
+
}
|
|
352
|
+
async cloudRequest(method, suffix, body) {
|
|
353
|
+
const token = this.deps.cloud.getToken();
|
|
354
|
+
const base = this.deps.cloud.getCloudUrl();
|
|
355
|
+
if (!token || !base) {
|
|
356
|
+
throw new SlackIdentityCloudError(401, 'not_logged_in', 'Not logged in to Crewly Cloud');
|
|
357
|
+
}
|
|
358
|
+
const url = `${base.replace(/\/$/, '')}${SLACK_AGENT_IDENTITY_CONSTANTS.CLOUD_PATH}${suffix}`;
|
|
359
|
+
const controller = new AbortController();
|
|
360
|
+
const timer = setTimeout(() => controller.abort(), SLACK_AGENT_IDENTITY_CONSTANTS.REQUEST_TIMEOUT_MS);
|
|
361
|
+
try {
|
|
362
|
+
const res = await this.fetchImpl(url, {
|
|
363
|
+
method,
|
|
364
|
+
headers: {
|
|
365
|
+
Authorization: `Bearer ${token}`,
|
|
366
|
+
...(body !== undefined ? { 'Content-Type': 'application/json' } : {}),
|
|
367
|
+
},
|
|
368
|
+
body: body !== undefined ? JSON.stringify(body) : undefined,
|
|
369
|
+
signal: controller.signal,
|
|
370
|
+
});
|
|
371
|
+
const text = await res.text();
|
|
372
|
+
let parsed = {};
|
|
373
|
+
try {
|
|
374
|
+
parsed = JSON.parse(text);
|
|
375
|
+
}
|
|
376
|
+
catch {
|
|
377
|
+
parsed = {};
|
|
378
|
+
}
|
|
379
|
+
if (!res.ok || parsed.success !== true) {
|
|
380
|
+
throw new SlackIdentityCloudError(res.status, parsed.code ?? `http_${res.status}`, parsed.error ?? `Cloud request failed (${res.status})`);
|
|
381
|
+
}
|
|
382
|
+
return parsed.data;
|
|
383
|
+
}
|
|
384
|
+
catch (err) {
|
|
385
|
+
if (err instanceof SlackIdentityCloudError)
|
|
386
|
+
throw err;
|
|
387
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
388
|
+
throw new SlackIdentityCloudError(502, 'network', `Cloud unreachable: ${message}`);
|
|
389
|
+
}
|
|
390
|
+
finally {
|
|
391
|
+
clearTimeout(timer);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
function isRecord(value) {
|
|
396
|
+
const v = value;
|
|
397
|
+
return !!v && typeof v.agentSession === 'string' && typeof v.appId === 'string' && typeof v.status === 'string';
|
|
398
|
+
}
|
|
399
|
+
let instance = null;
|
|
400
|
+
/**
|
|
401
|
+
* Install the process-wide instance (composition root).
|
|
402
|
+
*
|
|
403
|
+
* @param service - The service or null
|
|
404
|
+
*/
|
|
405
|
+
export function setSlackAgentIdentityService(service) {
|
|
406
|
+
instance = service;
|
|
407
|
+
}
|
|
408
|
+
/**
|
|
409
|
+
* The process-wide instance, or null before wiring.
|
|
410
|
+
*
|
|
411
|
+
* @returns The service or null
|
|
412
|
+
*/
|
|
413
|
+
export function getSlackAgentIdentityService() {
|
|
414
|
+
return instance;
|
|
415
|
+
}
|
|
416
|
+
//# sourceMappingURL=slack-agent-identity.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack-agent-identity.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/slack/slack-agent-identity.service.ts"],"names":[],"mappings":"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"}
|