crewly 1.6.1 → 1.6.3
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/roles/orchestrator/prompt.md +16 -0
- package/config/skills/agent/core/get-my-active-work/SKILL.md +101 -0
- package/config/skills/agent/core/get-my-active-work/execute.sh +122 -0
- package/config/skills/agent/core/record-learning/SKILL.md +29 -0
- package/config/skills/agent/core/reply-channel/SKILL.md +41 -0
- package/config/skills/agent/core/reply-channel/execute.sh +165 -0
- package/config/skills/agent/core/reply-channel/execute.test.sh +148 -0
- package/config/skills/agent/remote-browser/execute.sh +296 -14
- package/config/skills/agent/remote-browser/execute.test.sh +482 -0
- package/config/skills/orchestrator/send-message/SKILL.md +30 -7
- package/config/skills/orchestrator/team-health-scan/SKILL.md +98 -0
- package/config/skills/orchestrator/team-health-scan/execute.sh +44 -0
- package/config/skills/registry.json +62 -1
- package/config/slack-app-manifest.json +2 -1
- package/config/sops/developer/git-workflow.md +38 -3
- package/dist/backend/backend/src/constants.d.ts +69 -1
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +69 -2
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/active-work/active-work.controller.d.ts +53 -0
- package/dist/backend/backend/src/controllers/active-work/active-work.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/active-work/active-work.controller.js +92 -0
- package/dist/backend/backend/src/controllers/active-work/active-work.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/agent-stream/agent-stream.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/agent-stream/agent-stream.controller.js +18 -1
- package/dist/backend/backend/src/controllers/agent-stream/agent-stream.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/browser/browser.controller.d.ts +68 -0
- package/dist/backend/backend/src/controllers/browser/browser.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/browser/browser.controller.js +233 -5
- package/dist/backend/backend/src/controllers/browser/browser.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/browser/browser.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/browser/browser.routes.js +10 -1
- package/dist/backend/backend/src/controllers/browser/browser.routes.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 +8 -3
- package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.d.ts +132 -0
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.js +401 -0
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.routes.d.ts +29 -0
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.routes.js +39 -0
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/chat-v2/index.d.ts +8 -0
- package/dist/backend/backend/src/controllers/chat-v2/index.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/chat-v2/index.js +8 -0
- package/dist/backend/backend/src/controllers/chat-v2/index.js.map +1 -0
- package/dist/backend/backend/src/controllers/onboarding/onboarding.routes.d.ts +13 -13
- package/dist/backend/backend/src/controllers/onboarding/onboarding.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/onboarding/onboarding.routes.js +74 -234
- package/dist/backend/backend/src/controllers/onboarding/onboarding.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.js +76 -15
- package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/request/request.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/request/request.controller.js +4 -6
- package/dist/backend/backend/src/controllers/request/request.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/task-management/tasks.controller.d.ts +43 -0
- package/dist/backend/backend/src/controllers/task-management/tasks.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/task-management/tasks.controller.js +200 -72
- package/dist/backend/backend/src/controllers/task-management/tasks.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.controller.js +49 -0
- package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/team-health/team-health.controller.d.ts +59 -0
- package/dist/backend/backend/src/controllers/team-health/team-health.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/team-health/team-health.controller.js +127 -0
- package/dist/backend/backend/src/controllers/team-health/team-health.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/team-health/team-health.routes.d.ts +13 -0
- package/dist/backend/backend/src/controllers/team-health/team-health.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/team-health/team-health.routes.js +20 -0
- package/dist/backend/backend/src/controllers/team-health/team-health.routes.js.map +1 -0
- package/dist/backend/backend/src/index.d.ts +9 -0
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +233 -0
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.js +40 -6
- package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
- package/dist/backend/backend/src/services/agent/active-work-briefing.service.d.ts +498 -0
- package/dist/backend/backend/src/services/agent/active-work-briefing.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/active-work-briefing.service.js +759 -0
- package/dist/backend/backend/src/services/agent/active-work-briefing.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +25 -0
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.js +221 -58
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts +9 -2
- package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js +35 -2
- package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/types.d.ts +8 -2
- package/dist/backend/backend/src/services/agent/crewly-agent/types.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/types.js +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/types.js.map +1 -1
- package/dist/backend/backend/src/services/agent/tmux-command.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/tmux-command.service.js +2 -1
- package/dist/backend/backend/src/services/agent/tmux-command.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/tmux.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/tmux.service.js +2 -1
- package/dist/backend/backend/src/services/agent/tmux.service.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-builder.service.d.ts +148 -3
- package/dist/backend/backend/src/services/ai/prompt-builder.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-builder.service.js +241 -2
- package/dist/backend/backend/src/services/ai/prompt-builder.service.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/recovery.module.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/recovery.module.js +13 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/recovery.module.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/role-boundary.module.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/role-boundary.module.js +26 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/role-boundary.module.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/sop-norm-distinction.module.d.ts +79 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/sop-norm-distinction.module.d.ts.map +1 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/sop-norm-distinction.module.js +118 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/sop-norm-distinction.module.js.map +1 -0
- package/dist/backend/backend/src/services/browser/browser-bridge.service.d.ts +161 -0
- 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 +382 -2
- 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 +105 -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 +232 -13
- package/dist/backend/backend/src/services/browser/browser-proxy.service.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +178 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +254 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.mention-resolver.d.ts +134 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.mention-resolver.d.ts.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.mention-resolver.js +232 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.mention-resolver.js.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.realtime-holder.d.ts +25 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.realtime-holder.d.ts.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.realtime-holder.js +23 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.realtime-holder.js.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts +254 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js +467 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.singleton.d.ts +27 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.singleton.d.ts.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.singleton.js +57 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.singleton.js.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.team-membership.d.ts +43 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.team-membership.d.ts.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.team-membership.js +54 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.team-membership.js.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/config.d.ts +100 -0
- package/dist/backend/backend/src/services/chat-v2/config.d.ts.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/config.js +174 -0
- package/dist/backend/backend/src/services/chat-v2/config.js.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/index.d.ts +11 -0
- package/dist/backend/backend/src/services/chat-v2/index.d.ts.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/index.js +12 -0
- package/dist/backend/backend/src/services/chat-v2/index.js.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.d.ts +114 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.d.ts.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.js +194 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.js.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/chat-db.d.ts +100 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/chat-db.d.ts.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/chat-db.js +351 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/chat-db.js.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts +132 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js +281 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/types.d.ts +295 -0
- package/dist/backend/backend/src/services/chat-v2/types.d.ts.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/types.js +61 -0
- package/dist/backend/backend/src/services/chat-v2/types.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-event-bridge.service.d.ts +113 -0
- package/dist/backend/backend/src/services/cloud/cloud-event-bridge.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-event-bridge.service.js +179 -0
- package/dist/backend/backend/src/services/cloud/cloud-event-bridge.service.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-event-forwarder.service.d.ts +131 -0
- package/dist/backend/backend/src/services/cloud/cloud-event-forwarder.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-event-forwarder.service.js +227 -0
- package/dist/backend/backend/src/services/cloud/cloud-event-forwarder.service.js.map +1 -0
- package/dist/backend/backend/src/services/core/config.service.js +3 -3
- package/dist/backend/backend/src/services/core/config.service.js.map +1 -1
- package/dist/backend/backend/src/services/core/storage.service.d.ts +22 -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 +57 -0
- package/dist/backend/backend/src/services/core/storage.service.js.map +1 -1
- package/dist/backend/backend/src/services/event-bus/event-bus.service.d.ts +69 -1
- package/dist/backend/backend/src/services/event-bus/event-bus.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/event-bus/event-bus.service.js +118 -0
- package/dist/backend/backend/src/services/event-bus/event-bus.service.js.map +1 -1
- package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.d.ts +275 -0
- package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.js +736 -0
- package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.js.map +1 -0
- package/dist/backend/backend/src/services/knowledge/fts5-index.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/knowledge/fts5-index.service.js +18 -2
- package/dist/backend/backend/src/services/knowledge/fts5-index.service.js.map +1 -1
- package/dist/backend/backend/src/services/knowledge/knowledge-search.service.d.ts +49 -13
- package/dist/backend/backend/src/services/knowledge/knowledge-search.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/knowledge/knowledge-search.service.js +123 -29
- package/dist/backend/backend/src/services/knowledge/knowledge-search.service.js.map +1 -1
- package/dist/backend/backend/src/services/knowledge/learnings-index.service.d.ts +159 -0
- package/dist/backend/backend/src/services/knowledge/learnings-index.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/knowledge/learnings-index.service.js +304 -0
- package/dist/backend/backend/src/services/knowledge/learnings-index.service.js.map +1 -0
- package/dist/backend/backend/src/services/knowledge/vector-store.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/knowledge/vector-store.service.js +24 -4
- package/dist/backend/backend/src/services/knowledge/vector-store.service.js.map +1 -1
- package/dist/backend/backend/src/services/memory/auto-learning.subscriber.d.ts +174 -0
- package/dist/backend/backend/src/services/memory/auto-learning.subscriber.d.ts.map +1 -0
- package/dist/backend/backend/src/services/memory/auto-learning.subscriber.js +375 -0
- package/dist/backend/backend/src/services/memory/auto-learning.subscriber.js.map +1 -0
- package/dist/backend/backend/src/services/memory/learning-format.validator.d.ts +97 -0
- package/dist/backend/backend/src/services/memory/learning-format.validator.d.ts.map +1 -0
- package/dist/backend/backend/src/services/memory/learning-format.validator.js +209 -0
- package/dist/backend/backend/src/services/memory/learning-format.validator.js.map +1 -0
- package/dist/backend/backend/src/services/memory/vector-store.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/memory/vector-store.service.js +19 -4
- package/dist/backend/backend/src/services/memory/vector-store.service.js.map +1 -1
- package/dist/backend/backend/src/services/onboarding/onboarding-provision.service.d.ts +16 -5
- package/dist/backend/backend/src/services/onboarding/onboarding-provision.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/onboarding/onboarding-provision.service.js +32 -5
- package/dist/backend/backend/src/services/onboarding/onboarding-provision.service.js.map +1 -1
- package/dist/backend/backend/src/services/onboarding/onboarding.service.d.ts +157 -0
- package/dist/backend/backend/src/services/onboarding/onboarding.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/onboarding/onboarding.service.js +229 -0
- package/dist/backend/backend/src/services/onboarding/onboarding.service.js.map +1 -0
- package/dist/backend/backend/src/services/onboarding/onboarding.types.d.ts +141 -0
- package/dist/backend/backend/src/services/onboarding/onboarding.types.d.ts.map +1 -0
- package/dist/backend/backend/src/services/onboarding/onboarding.types.js +18 -0
- package/dist/backend/backend/src/services/onboarding/onboarding.types.js.map +1 -0
- package/dist/backend/backend/src/services/pr-review/pr-review.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/pr-review/pr-review.service.js +1 -1
- package/dist/backend/backend/src/services/pr-review/pr-review.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/cross-machine-message.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/cross-machine-message.service.js +17 -1
- package/dist/backend/backend/src/services/slack/cross-machine-message.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts +39 -1
- 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 +158 -26
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +248 -6
- package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.js +531 -51
- package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/backend/backend/src/services/team-health/index.d.ts +16 -0
- package/dist/backend/backend/src/services/team-health/index.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-health/index.js +16 -0
- package/dist/backend/backend/src/services/team-health/index.js.map +1 -0
- package/dist/backend/backend/src/services/team-health/live-team-health-data-provider.d.ts +52 -0
- package/dist/backend/backend/src/services/team-health/live-team-health-data-provider.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-health/live-team-health-data-provider.js +161 -0
- package/dist/backend/backend/src/services/team-health/live-team-health-data-provider.js.map +1 -0
- package/dist/backend/backend/src/services/team-health/lost-dispatch-detector.d.ts +53 -0
- package/dist/backend/backend/src/services/team-health/lost-dispatch-detector.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-health/lost-dispatch-detector.js +88 -0
- package/dist/backend/backend/src/services/team-health/lost-dispatch-detector.js.map +1 -0
- package/dist/backend/backend/src/services/team-health/stale-trigger-detector.d.ts +44 -0
- package/dist/backend/backend/src/services/team-health/stale-trigger-detector.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-health/stale-trigger-detector.js +83 -0
- package/dist/backend/backend/src/services/team-health/stale-trigger-detector.js.map +1 -0
- package/dist/backend/backend/src/services/team-health/team-health-alert-router.d.ts +92 -0
- package/dist/backend/backend/src/services/team-health/team-health-alert-router.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-health/team-health-alert-router.js +328 -0
- package/dist/backend/backend/src/services/team-health/team-health-alert-router.js.map +1 -0
- package/dist/backend/backend/src/services/team-health/team-health-config.d.ts +41 -0
- package/dist/backend/backend/src/services/team-health/team-health-config.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-health/team-health-config.js +213 -0
- package/dist/backend/backend/src/services/team-health/team-health-config.js.map +1 -0
- package/dist/backend/backend/src/services/team-health/team-health-detector.d.ts +46 -0
- package/dist/backend/backend/src/services/team-health/team-health-detector.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-health/team-health-detector.js +347 -0
- package/dist/backend/backend/src/services/team-health/team-health-detector.js.map +1 -0
- package/dist/backend/backend/src/services/team-health/team-health-types.d.ts +154 -0
- package/dist/backend/backend/src/services/team-health/team-health-types.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-health/team-health-types.js +94 -0
- package/dist/backend/backend/src/services/team-health/team-health-types.js.map +1 -0
- package/dist/backend/backend/src/services/team-health/team-health-watchdog.service.d.ts +111 -0
- package/dist/backend/backend/src/services/team-health/team-health-watchdog.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-health/team-health-watchdog.service.js +226 -0
- package/dist/backend/backend/src/services/team-health/team-health-watchdog.service.js.map +1 -0
- package/dist/backend/backend/src/services/v3/mission-reminder.service.d.ts +148 -0
- package/dist/backend/backend/src/services/v3/mission-reminder.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/v3/mission-reminder.service.js +545 -0
- package/dist/backend/backend/src/services/v3/mission-reminder.service.js.map +1 -0
- package/dist/backend/backend/src/services/v3/request-sla.subscriber.d.ts +499 -0
- package/dist/backend/backend/src/services/v3/request-sla.subscriber.d.ts.map +1 -0
- package/dist/backend/backend/src/services/v3/request-sla.subscriber.js +1105 -0
- package/dist/backend/backend/src/services/v3/request-sla.subscriber.js.map +1 -0
- package/dist/backend/backend/src/services/v3/request.service.d.ts +22 -0
- package/dist/backend/backend/src/services/v3/request.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/request.service.js +71 -0
- package/dist/backend/backend/src/services/v3/request.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/v3-data.service.d.ts +1 -0
- package/dist/backend/backend/src/services/v3/v3-data.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/v3-data.service.js +22 -6
- package/dist/backend/backend/src/services/v3/v3-data.service.js.map +1 -1
- package/dist/backend/backend/src/types/event-bus.types.d.ts +19 -1
- package/dist/backend/backend/src/types/event-bus.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/event-bus.types.js +43 -0
- package/dist/backend/backend/src/types/event-bus.types.js.map +1 -1
- package/dist/backend/backend/src/types/index.d.ts +22 -1
- package/dist/backend/backend/src/types/index.d.ts.map +1 -1
- package/dist/backend/backend/src/types/index.js.map +1 -1
- package/dist/backend/backend/src/types/review-reason.types.d.ts +63 -0
- package/dist/backend/backend/src/types/review-reason.types.d.ts.map +1 -0
- package/dist/backend/backend/src/types/review-reason.types.js +50 -0
- package/dist/backend/backend/src/types/review-reason.types.js.map +1 -0
- package/dist/backend/backend/src/types/slack.types.d.ts +4 -1
- 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/backend/src/types/v2/mission.types.d.ts +18 -0
- package/dist/backend/backend/src/types/v2/mission.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/v2/mission.types.js +1 -0
- package/dist/backend/backend/src/types/v2/mission.types.js.map +1 -1
- package/dist/backend/backend/src/types/v2/work-item.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/v2/work-item.types.js +25 -1
- package/dist/backend/backend/src/types/v2/work-item.types.js.map +1 -1
- package/dist/backend/backend/src/utils/team.utils.d.ts +38 -0
- package/dist/backend/backend/src/utils/team.utils.d.ts.map +1 -0
- package/dist/backend/backend/src/utils/team.utils.js +45 -0
- package/dist/backend/backend/src/utils/team.utils.js.map +1 -0
- package/dist/backend/backend/src/websocket/chat-v2.gateway.d.ts +195 -0
- package/dist/backend/backend/src/websocket/chat-v2.gateway.d.ts.map +1 -0
- package/dist/backend/backend/src/websocket/chat-v2.gateway.js +401 -0
- package/dist/backend/backend/src/websocket/chat-v2.gateway.js.map +1 -0
- package/dist/backend/backend/src/websocket/terminal.gateway.d.ts +37 -2
- package/dist/backend/backend/src/websocket/terminal.gateway.d.ts.map +1 -1
- package/dist/backend/backend/src/websocket/terminal.gateway.js +106 -5
- package/dist/backend/backend/src/websocket/terminal.gateway.js.map +1 -1
- package/dist/cli/backend/src/constants.d.ts +69 -1
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +69 -2
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/core/config.service.js +3 -3
- package/dist/cli/backend/src/services/core/config.service.js.map +1 -1
- package/dist/cli/backend/src/services/core/storage.service.d.ts +22 -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 +57 -0
- package/dist/cli/backend/src/services/core/storage.service.js.map +1 -1
- package/dist/cli/backend/src/services/knowledge/fts5-index.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/knowledge/fts5-index.service.js +18 -2
- package/dist/cli/backend/src/services/knowledge/fts5-index.service.js.map +1 -1
- package/dist/cli/backend/src/services/knowledge/knowledge-search.service.d.ts +49 -13
- package/dist/cli/backend/src/services/knowledge/knowledge-search.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/knowledge/knowledge-search.service.js +123 -29
- package/dist/cli/backend/src/services/knowledge/knowledge-search.service.js.map +1 -1
- package/dist/cli/backend/src/services/knowledge/vector-store.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/knowledge/vector-store.service.js +24 -4
- package/dist/cli/backend/src/services/knowledge/vector-store.service.js.map +1 -1
- package/dist/cli/backend/src/types/index.d.ts +22 -1
- package/dist/cli/backend/src/types/index.d.ts.map +1 -1
- package/dist/cli/backend/src/types/index.js.map +1 -1
- package/dist/cli/backend/src/types/v2/work-item.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/v2/work-item.types.js +25 -1
- package/dist/cli/backend/src/types/v2/work-item.types.js.map +1 -1
- package/frontend/dist/assets/{index-70356616.js → index-7a4e7df5.js} +328 -326
- package/frontend/dist/assets/index-b7e59b2b.css +33 -0
- package/frontend/dist/index.html +2 -2
- package/package.json +2 -1
- package/config/skills/orchestrator/recall/SKILL.md +0 -47
- package/config/skills/orchestrator/recall/execute.sh +0 -13
- package/config/skills/orchestrator/record-learning/SKILL.md +0 -47
- package/config/skills/orchestrator/record-learning/execute.sh +0 -13
- package/config/skills/orchestrator/remember/SKILL.md +0 -55
- package/config/skills/orchestrator/remember/execute.sh +0 -15
- package/frontend/dist/assets/index-6aaa0630.css +0 -33
|
@@ -0,0 +1,545 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mission Reminder Service
|
|
3
|
+
*
|
|
4
|
+
* Scans active Missions and sends proactive Slack reminders to KR owners
|
|
5
|
+
* if their metrics are 'off_track' or 'at_risk'.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Periodic sweep of all active missions
|
|
9
|
+
* - KR-level status evaluation via KRTrackingService
|
|
10
|
+
* - Intelligent owner resolution (Mission owner -> Team Lead)
|
|
11
|
+
* - Proactive Slack delivery via SlackOrchestratorBridge
|
|
12
|
+
* - Rate limiting to prevent reminder fatigue (lastReminderAt tracking)
|
|
13
|
+
*
|
|
14
|
+
* @module services/v3/mission-reminder.service
|
|
15
|
+
*/
|
|
16
|
+
import * as fs from 'fs/promises';
|
|
17
|
+
import * as path from 'path';
|
|
18
|
+
import { CronExpressionParser } from 'cron-parser';
|
|
19
|
+
import { LoggerService } from '../core/logger.service.js';
|
|
20
|
+
import { StorageService } from '../core/storage.service.js';
|
|
21
|
+
import { KRTrackingService } from './kr-tracking.service.js';
|
|
22
|
+
import { getSlackOrchestratorBridge } from '../slack/slack-orchestrator-bridge.js';
|
|
23
|
+
import { TaskPoolService } from '../task-pool/task-pool.service.js';
|
|
24
|
+
import { TERMINAL_WORK_ITEM_STATUSES } from '../../types/v2/work-item.types.js';
|
|
25
|
+
import { atomicWriteJson } from '../../utils/file-io.utils.js';
|
|
26
|
+
import { pickTeamLead } from '../../utils/team.utils.js';
|
|
27
|
+
import { ORCHESTRATOR_SESSION_NAME } from '../../constants.js';
|
|
28
|
+
// ---------------------------------------------------------------------------
|
|
29
|
+
// Constants
|
|
30
|
+
// ---------------------------------------------------------------------------
|
|
31
|
+
/** Minimum interval between reminders for the same mission (24 hours) */
|
|
32
|
+
const REMINDER_COOLDOWN_MS = 24 * 60 * 60 * 1000;
|
|
33
|
+
/**
|
|
34
|
+
* Statuses that *clear* a Mission's `pendingReviewWorkItemId` so the next
|
|
35
|
+
* sweep tick can fire a new review. The set mirrors
|
|
36
|
+
* {@link TERMINAL_WORK_ITEM_STATUSES} (`done`, `verified`, `cancelled`) but
|
|
37
|
+
* adds two statuses that the canonical TERMINAL set excludes for valid
|
|
38
|
+
* reasons elsewhere — yet which DO represent "exited the active queue" for
|
|
39
|
+
* the V8 reentrancy-lock perspective:
|
|
40
|
+
*
|
|
41
|
+
* - `failed`: a failed review WI has terminated execution; not blocking next cadence.
|
|
42
|
+
* - `rejected`: a TL-rejected review WI ({@link WorkItemStatus} reachable from
|
|
43
|
+
* the review path per work-item.types.ts) has likewise exited the queue.
|
|
44
|
+
* Without this, a single TL rejection of a review WI would silently freeze
|
|
45
|
+
* that mission's lock forever — exactly the V8 failure mode this lock
|
|
46
|
+
* exists to prevent (Arch N1 BLOCKING fix on PR #354).
|
|
47
|
+
*
|
|
48
|
+
* The reentrancy lock is sweep-time lazy: we don't subscribe to TRANS-1
|
|
49
|
+
* events here, we just observe the WorkItem's current state on each sweep
|
|
50
|
+
* and clear the lock when it's terminal.
|
|
51
|
+
*/
|
|
52
|
+
const PENDING_REVIEW_TERMINAL_STATUSES = new Set([
|
|
53
|
+
...TERMINAL_WORK_ITEM_STATUSES,
|
|
54
|
+
'failed',
|
|
55
|
+
'rejected',
|
|
56
|
+
]);
|
|
57
|
+
function getMissionsDir() {
|
|
58
|
+
return path.join(process.cwd(), '.crewly', 'missions');
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Default timezone used when a mission's `policy.executionCadence.workHours`
|
|
62
|
+
* does not specify one. UTC keeps the dedup key globally consistent across
|
|
63
|
+
* deployments — overriding to a local TZ would only matter if we surfaced
|
|
64
|
+
* the cycleId to humans.
|
|
65
|
+
*/
|
|
66
|
+
const DEFAULT_REVIEW_TIMEZONE = 'UTC';
|
|
67
|
+
/**
|
|
68
|
+
* Whether to create a `type: 'review'` WorkItem on every cadence boundary
|
|
69
|
+
* in addition to the existing Slack reminder. Controlled by env so ops
|
|
70
|
+
* can turn the loop off independently of the reminder DM if a downstream
|
|
71
|
+
* pipeline (BRIDGE-1, LEARN-1) regresses.
|
|
72
|
+
*
|
|
73
|
+
* Env:
|
|
74
|
+
* `CREWLY_REVIEW_WI_ENABLED=false` — disables review WI creation
|
|
75
|
+
* anything else (or unset) — review WI creation enabled (default)
|
|
76
|
+
*/
|
|
77
|
+
function isReviewWorkItemEnabled() {
|
|
78
|
+
return process.env['CREWLY_REVIEW_WI_ENABLED'] !== 'false';
|
|
79
|
+
}
|
|
80
|
+
// ---------------------------------------------------------------------------
|
|
81
|
+
// Service
|
|
82
|
+
// ---------------------------------------------------------------------------
|
|
83
|
+
/**
|
|
84
|
+
* Service for sending proactive reminders for off-track OKRs.
|
|
85
|
+
*/
|
|
86
|
+
export class MissionReminderService {
|
|
87
|
+
static instance = null;
|
|
88
|
+
logger;
|
|
89
|
+
storageService;
|
|
90
|
+
krTrackingService;
|
|
91
|
+
/**
|
|
92
|
+
* Cached TaskPoolService singleton (Arch NTH-4 on PR #354).
|
|
93
|
+
* Resolved lazily on first access via {@link getTaskPool} and reused
|
|
94
|
+
* across every sweep × mission call site for the lifetime of this
|
|
95
|
+
* MissionReminderService instance. Tests that need to swap the
|
|
96
|
+
* underlying TaskPool must call {@link resetInstance} to also discard
|
|
97
|
+
* this cached reference.
|
|
98
|
+
*/
|
|
99
|
+
taskPool = null;
|
|
100
|
+
/**
|
|
101
|
+
* Counter of cron-parse failures observed across all sweeps (Arch NTH-3
|
|
102
|
+
* on PR #354). Bumped each time {@link CronExpressionParser.parse}
|
|
103
|
+
* throws on a mission's `reviewSchedule`. Exposed via
|
|
104
|
+
* {@link cronParseFailureCount} for tests + (future) Prom metric.
|
|
105
|
+
*/
|
|
106
|
+
cronParseFailures = 0;
|
|
107
|
+
constructor() {
|
|
108
|
+
this.logger = LoggerService.getInstance().createComponentLogger('MissionReminder');
|
|
109
|
+
this.storageService = StorageService.getInstance();
|
|
110
|
+
this.krTrackingService = KRTrackingService.getInstance();
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Total number of cron-parse failures observed since this service
|
|
114
|
+
* instance was constructed. Read by tests (asserting the warn-log path
|
|
115
|
+
* also bumps the counter) and intended as the source for a future
|
|
116
|
+
* Prometheus gauge (sister F4 follow-up filed on the OKR Mission
|
|
117
|
+
* Reminder spec).
|
|
118
|
+
*/
|
|
119
|
+
get cronParseFailureCount() {
|
|
120
|
+
return this.cronParseFailures;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Cached TaskPoolService accessor. Resolves the singleton on first call
|
|
124
|
+
* and reuses it thereafter. Allows test harnesses to reset the cache
|
|
125
|
+
* via {@link resetInstance}, which clears both the
|
|
126
|
+
* MissionReminderService singleton and any private references it holds.
|
|
127
|
+
*/
|
|
128
|
+
getTaskPool() {
|
|
129
|
+
if (!this.taskPool) {
|
|
130
|
+
this.taskPool = TaskPoolService.getInstance();
|
|
131
|
+
}
|
|
132
|
+
return this.taskPool;
|
|
133
|
+
}
|
|
134
|
+
static getInstance() {
|
|
135
|
+
if (!MissionReminderService.instance) {
|
|
136
|
+
MissionReminderService.instance = new MissionReminderService();
|
|
137
|
+
}
|
|
138
|
+
return MissionReminderService.instance;
|
|
139
|
+
}
|
|
140
|
+
static resetInstance() {
|
|
141
|
+
MissionReminderService.instance = null;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Run a full sweep of all active missions, sending Slack OKR reminders
|
|
145
|
+
* AND (per REVIEW-1, Phase E pre-beta) creating cadence-driven review
|
|
146
|
+
* WorkItems that wake the Team Lead.
|
|
147
|
+
*
|
|
148
|
+
* The two outputs are intentionally additive — the Slack DM keeps the
|
|
149
|
+
* legacy 24h-cooldown path, and the review WorkItem is created when
|
|
150
|
+
* the mission's `policy.executionCadence.reviewSchedule` cron has
|
|
151
|
+
* fired since the last `lastReviewAt`. The DM and the WI may both
|
|
152
|
+
* fire on the same sweep tick — one is a notification, the other is
|
|
153
|
+
* a queue item the TL can act on. Idempotency is guaranteed by the
|
|
154
|
+
* deterministic WorkItem id (`<missionId>:review:<cycleId>`) which
|
|
155
|
+
* the existing `addToPool` dedup-by-id catches; reentrancy is
|
|
156
|
+
* guaranteed by `mission.pendingReviewWorkItemId` (Arch Veto V8).
|
|
157
|
+
*
|
|
158
|
+
* @param force - If true, ignores the REMINDER_COOLDOWN_MS for the
|
|
159
|
+
* Slack DM path (does NOT bypass the review-WI cadence/lock — that
|
|
160
|
+
* would defeat the deterministic-id contract).
|
|
161
|
+
* @returns Summary of actions taken
|
|
162
|
+
*/
|
|
163
|
+
async runSweep(force = false) {
|
|
164
|
+
const now = new Date();
|
|
165
|
+
const missions = await this.loadAllActiveMissions();
|
|
166
|
+
const result = {
|
|
167
|
+
checked: 0,
|
|
168
|
+
sent: 0,
|
|
169
|
+
skipped: 0,
|
|
170
|
+
reviewsCreated: 0,
|
|
171
|
+
reviewsSkipped: 0,
|
|
172
|
+
};
|
|
173
|
+
this.logger.info('Starting Mission OKR reminder sweep', { count: missions.length });
|
|
174
|
+
for (const mission of missions) {
|
|
175
|
+
result.checked++;
|
|
176
|
+
let summary = null;
|
|
177
|
+
try {
|
|
178
|
+
// Get OKR progress summary — needed for both the reminder DM
|
|
179
|
+
// and the reviewReason inference on the review WorkItem.
|
|
180
|
+
summary = await this.krTrackingService.computeMissionOKRProgress(mission.id);
|
|
181
|
+
}
|
|
182
|
+
catch (err) {
|
|
183
|
+
this.logger.error('Failed to compute mission OKR progress', {
|
|
184
|
+
missionId: mission.id,
|
|
185
|
+
error: err instanceof Error ? err.message : String(err),
|
|
186
|
+
});
|
|
187
|
+
// Don't `continue` — the review-WI path doesn't strictly need
|
|
188
|
+
// the summary (it falls back to `scheduled_review`). Slack
|
|
189
|
+
// path will be skipped by the off-track/at-risk filter below.
|
|
190
|
+
}
|
|
191
|
+
// -------------------------------------------------------------------
|
|
192
|
+
// Slack OKR reminder path (existing — 24h cooldown).
|
|
193
|
+
// -------------------------------------------------------------------
|
|
194
|
+
const reminderEligible = force || !mission.lastReminderAt ||
|
|
195
|
+
now.getTime() - new Date(mission.lastReminderAt).getTime() >= REMINDER_COOLDOWN_MS;
|
|
196
|
+
if (reminderEligible && summary && (summary.offTrack > 0 || summary.atRisk > 0)) {
|
|
197
|
+
try {
|
|
198
|
+
const sent = await this.sendReminder(mission, summary);
|
|
199
|
+
if (sent) {
|
|
200
|
+
result.sent++;
|
|
201
|
+
mission.lastReminderAt = now.toISOString();
|
|
202
|
+
await this.saveMission(mission);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
catch (err) {
|
|
206
|
+
this.logger.error('Failed to send mission reminder', {
|
|
207
|
+
missionId: mission.id,
|
|
208
|
+
error: err instanceof Error ? err.message : String(err),
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
else if (!reminderEligible) {
|
|
213
|
+
result.skipped++;
|
|
214
|
+
}
|
|
215
|
+
// -------------------------------------------------------------------
|
|
216
|
+
// REVIEW-1: cadence-driven review WorkItem creation.
|
|
217
|
+
//
|
|
218
|
+
// The DM above is a notification; this is a queue item the TL must
|
|
219
|
+
// explicitly act on. Both can fire on the same sweep tick.
|
|
220
|
+
// -------------------------------------------------------------------
|
|
221
|
+
if (isReviewWorkItemEnabled()) {
|
|
222
|
+
try {
|
|
223
|
+
const created = await this.maybeCreateReviewWorkItem(mission, summary, now);
|
|
224
|
+
if (created === 'created')
|
|
225
|
+
result.reviewsCreated++;
|
|
226
|
+
else if (created === 'skipped')
|
|
227
|
+
result.reviewsSkipped++;
|
|
228
|
+
}
|
|
229
|
+
catch (err) {
|
|
230
|
+
this.logger.error('Failed to create mission review WorkItem', {
|
|
231
|
+
missionId: mission.id,
|
|
232
|
+
error: err instanceof Error ? err.message : String(err),
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
this.logger.info('Mission OKR reminder sweep complete', result);
|
|
238
|
+
return result;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Result of {@link maybeCreateReviewWorkItem} — `'created'` when a new
|
|
242
|
+
* review WorkItem was added to the pool, `'skipped'` when the
|
|
243
|
+
* reentrancy lock or cadence boundary blocked creation, `'noop'` when
|
|
244
|
+
* the mission has no executionCadence configured (legacy missions).
|
|
245
|
+
*/
|
|
246
|
+
async maybeCreateReviewWorkItem(mission, summary, now) {
|
|
247
|
+
const cadence = mission.policy?.executionCadence;
|
|
248
|
+
if (!cadence?.reviewSchedule)
|
|
249
|
+
return 'noop';
|
|
250
|
+
const timezone = cadence.workHours?.timezone ?? DEFAULT_REVIEW_TIMEZONE;
|
|
251
|
+
// -----------------------------------------------------------------
|
|
252
|
+
// Reentrancy lock (Arch Veto V8).
|
|
253
|
+
// Lazily clear the pending pointer when the previous review WI has
|
|
254
|
+
// reached terminal status; otherwise short-circuit creation.
|
|
255
|
+
//
|
|
256
|
+
// NTH-2 (Arch on PR #354): defer the saveMission for the lock-clear
|
|
257
|
+
// until we know whether a new review WI will be created in the same
|
|
258
|
+
// sweep tick. If yes, both writes (clear + new id) collapse to one
|
|
259
|
+
// saveMission at the end of the success path. If no (skipped /
|
|
260
|
+
// noop), we still need to persist the cleared lock — handled in the
|
|
261
|
+
// exit branches below.
|
|
262
|
+
// -----------------------------------------------------------------
|
|
263
|
+
let pendingLockCleared = false;
|
|
264
|
+
if (mission.pendingReviewWorkItemId) {
|
|
265
|
+
const pendingWI = await this.getTaskPool().findWorkItem(mission.pendingReviewWorkItemId);
|
|
266
|
+
if (!pendingWI || PENDING_REVIEW_TERMINAL_STATUSES.has(pendingWI.status)) {
|
|
267
|
+
// Pending WI is gone or terminal — clear in memory; persist on exit.
|
|
268
|
+
mission.pendingReviewWorkItemId = undefined;
|
|
269
|
+
pendingLockCleared = true;
|
|
270
|
+
}
|
|
271
|
+
else {
|
|
272
|
+
return 'skipped';
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
// -----------------------------------------------------------------
|
|
276
|
+
// Cadence boundary check.
|
|
277
|
+
// The most recent cron-tick <= now defines the current cycle. If
|
|
278
|
+
// `lastReviewAt` is at or after that boundary, we already covered
|
|
279
|
+
// this cycle and the next sweep tick will roll into the next one.
|
|
280
|
+
// -----------------------------------------------------------------
|
|
281
|
+
let boundary;
|
|
282
|
+
try {
|
|
283
|
+
const interval = CronExpressionParser.parse(cadence.reviewSchedule, {
|
|
284
|
+
currentDate: now,
|
|
285
|
+
tz: timezone,
|
|
286
|
+
});
|
|
287
|
+
boundary = interval.prev().toDate();
|
|
288
|
+
}
|
|
289
|
+
catch (err) {
|
|
290
|
+
// NTH-3 (Arch on PR #354): bump the cron-parse failure counter so
|
|
291
|
+
// ops can see how often this fires + which missions are affected.
|
|
292
|
+
// The warn-log already carried mission id + cron + error message.
|
|
293
|
+
this.cronParseFailures += 1;
|
|
294
|
+
this.logger.warn('Mission has unparseable review cadence cron — skipping review WI', {
|
|
295
|
+
missionId: mission.id,
|
|
296
|
+
reviewSchedule: cadence.reviewSchedule,
|
|
297
|
+
error: err instanceof Error ? err.message : String(err),
|
|
298
|
+
totalCronParseFailures: this.cronParseFailures,
|
|
299
|
+
});
|
|
300
|
+
// Persist the cleared reentrancy lock if we cleared it earlier in
|
|
301
|
+
// this method but are now bailing out of WI creation — the
|
|
302
|
+
// mission's in-memory state would otherwise leak the cleared
|
|
303
|
+
// pointer to the next sweep without disk-backed durability.
|
|
304
|
+
if (pendingLockCleared) {
|
|
305
|
+
await this.saveMission(mission);
|
|
306
|
+
}
|
|
307
|
+
return 'noop';
|
|
308
|
+
}
|
|
309
|
+
if (mission.lastReviewAt) {
|
|
310
|
+
const lastReview = new Date(mission.lastReviewAt);
|
|
311
|
+
if (lastReview.getTime() >= boundary.getTime()) {
|
|
312
|
+
// Already reviewed within the current cadence cycle.
|
|
313
|
+
// NTH-2: persist any deferred lock-clear before bailing.
|
|
314
|
+
if (pendingLockCleared) {
|
|
315
|
+
await this.saveMission(mission);
|
|
316
|
+
}
|
|
317
|
+
return 'skipped';
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
// -----------------------------------------------------------------
|
|
321
|
+
// Build the deterministic review WorkItem.
|
|
322
|
+
//
|
|
323
|
+
// The id collapses to the date-form of the boundary so a sweep
|
|
324
|
+
// replay within the same cycle hits the existing addToPool
|
|
325
|
+
// dedup-by-id guard (V1 satisfied without a TaskPoolService change).
|
|
326
|
+
// -----------------------------------------------------------------
|
|
327
|
+
const cycleId = boundary.toISOString().slice(0, 10);
|
|
328
|
+
const reviewWorkItemId = `${mission.id}:review:${cycleId}`;
|
|
329
|
+
const reviewReason = this.inferReviewReason(mission, summary);
|
|
330
|
+
const target = await this.resolveTeamLeadSession(mission);
|
|
331
|
+
const reviewWorkItem = {
|
|
332
|
+
id: reviewWorkItemId,
|
|
333
|
+
type: 'review',
|
|
334
|
+
owner: 'team_lead',
|
|
335
|
+
target,
|
|
336
|
+
title: `Mission review — ${mission.objective.slice(0, 60)}${mission.objective.length > 60 ? '…' : ''}`,
|
|
337
|
+
description: `Cadence-driven review for mission ${mission.id}. Reason: ${reviewReason}.`,
|
|
338
|
+
status: 'queued',
|
|
339
|
+
createdAt: now.toISOString(),
|
|
340
|
+
retryCount: 0,
|
|
341
|
+
maxRetries: 0, // V2 N/A for review WIs — no auto-retry policy
|
|
342
|
+
missionId: mission.id,
|
|
343
|
+
inputTokens: 0,
|
|
344
|
+
outputTokens: 0,
|
|
345
|
+
cost: 0,
|
|
346
|
+
metadata: {
|
|
347
|
+
idempotencyKey: reviewWorkItemId, // V1 — same as id, surfaces in audit logs
|
|
348
|
+
requiresVerification: false, // F-H — review WIs do NOT loop back to TL self-verify
|
|
349
|
+
reviewReason,
|
|
350
|
+
reviewCycleId: cycleId,
|
|
351
|
+
cadenceSchedule: cadence.reviewSchedule,
|
|
352
|
+
},
|
|
353
|
+
};
|
|
354
|
+
await this.getTaskPool().addToPool(reviewWorkItem);
|
|
355
|
+
// Persist the reentrancy lock + bookkeeping fields.
|
|
356
|
+
// NTH-2: this is the canonical single saveMission per sweep tick —
|
|
357
|
+
// any earlier in-memory lock-clear collapses into this write.
|
|
358
|
+
mission.pendingReviewWorkItemId = reviewWorkItemId;
|
|
359
|
+
mission.lastReviewAt = now.toISOString();
|
|
360
|
+
await this.saveMission(mission);
|
|
361
|
+
this.logger.info('Mission review WorkItem created', {
|
|
362
|
+
missionId: mission.id,
|
|
363
|
+
workItemId: reviewWorkItemId,
|
|
364
|
+
reviewReason,
|
|
365
|
+
target,
|
|
366
|
+
cycleId,
|
|
367
|
+
});
|
|
368
|
+
return 'created';
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* Pick the {@link ReviewReason} for this sweep tick.
|
|
372
|
+
*
|
|
373
|
+
* Precedence (most-actionable-first):
|
|
374
|
+
* 1. `off_track_kr` — at least one KR is reported off-track.
|
|
375
|
+
* 2. `no_active_work` — the mission has no active project tasks.
|
|
376
|
+
* 3. `phase_complete` — the mission has advanced phases since
|
|
377
|
+
* the last review (heuristic — uses
|
|
378
|
+
* `currentPhase` if both this sweep's
|
|
379
|
+
* inferred phase and the previous one are
|
|
380
|
+
* recorded; otherwise skipped).
|
|
381
|
+
* 4. `scheduled_review` — default; cadence boundary fired.
|
|
382
|
+
*
|
|
383
|
+
* Conservative on `phase_complete`: we only emit it when the
|
|
384
|
+
* previous review (`lastReviewSummary`) and the current `currentPhase`
|
|
385
|
+
* actually disagree — REVIEW-1 doesn't reach into the phase machine
|
|
386
|
+
* to invent state.
|
|
387
|
+
*/
|
|
388
|
+
inferReviewReason(mission, summary) {
|
|
389
|
+
if (summary && summary.offTrack > 0)
|
|
390
|
+
return 'off_track_kr';
|
|
391
|
+
if (!mission.activeProjectTaskIds || mission.activeProjectTaskIds.length === 0) {
|
|
392
|
+
return 'no_active_work';
|
|
393
|
+
}
|
|
394
|
+
if (typeof mission.currentPhase === 'number' &&
|
|
395
|
+
mission.lastReviewSummary &&
|
|
396
|
+
!mission.lastReviewSummary.includes(`phase=${mission.currentPhase}`)) {
|
|
397
|
+
return 'phase_complete';
|
|
398
|
+
}
|
|
399
|
+
return 'scheduled_review';
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* Resolve the session name to wake when a review WorkItem fires.
|
|
403
|
+
*
|
|
404
|
+
* Order:
|
|
405
|
+
* 1. The mission's explicit owner (`mission.ownerId`)
|
|
406
|
+
* 2. The team lead resolved via the canonical {@link pickTeamLead}
|
|
407
|
+
* cascade (same path as Slack reminder owner resolution)
|
|
408
|
+
* 3. The orchestrator session as last-resort wake target so a
|
|
409
|
+
* review never gets dropped on the floor.
|
|
410
|
+
*
|
|
411
|
+
* @param mission - The mission whose review WI is being created
|
|
412
|
+
* @returns Session name string
|
|
413
|
+
*/
|
|
414
|
+
async resolveTeamLeadSession(mission) {
|
|
415
|
+
if (mission.ownerId) {
|
|
416
|
+
const member = await this.storageService.getMemberById(mission.ownerId);
|
|
417
|
+
if (member?.sessionName)
|
|
418
|
+
return member.sessionName;
|
|
419
|
+
}
|
|
420
|
+
const teams = await this.storageService.getTeams();
|
|
421
|
+
const team = teams.find((t) => t.id === mission.ownerTeamId);
|
|
422
|
+
if (team) {
|
|
423
|
+
const lead = pickTeamLead(team);
|
|
424
|
+
if (lead?.sessionName)
|
|
425
|
+
return lead.sessionName;
|
|
426
|
+
}
|
|
427
|
+
return ORCHESTRATOR_SESSION_NAME;
|
|
428
|
+
}
|
|
429
|
+
/**
|
|
430
|
+
* Send a Slack reminder for a specific mission.
|
|
431
|
+
*/
|
|
432
|
+
async sendReminder(mission, summary) {
|
|
433
|
+
const bridge = getSlackOrchestratorBridge();
|
|
434
|
+
if (!bridge) {
|
|
435
|
+
this.logger.warn('SlackOrchestratorBridge not available, cannot send reminder');
|
|
436
|
+
return false;
|
|
437
|
+
}
|
|
438
|
+
// Resolve owner name for @mention
|
|
439
|
+
const ownerName = await this.resolveOwnerName(mission);
|
|
440
|
+
const urgency = summary.offTrack > 0 ? 'high' : 'normal';
|
|
441
|
+
const message = this.formatReminderMessage(mission, summary, ownerName);
|
|
442
|
+
try {
|
|
443
|
+
await bridge.sendNotification({
|
|
444
|
+
type: 'okr_reminder',
|
|
445
|
+
title: `OKR Alert: ${mission.objective.slice(0, 50)}${mission.objective.length > 50 ? '...' : ''}`,
|
|
446
|
+
message,
|
|
447
|
+
urgency,
|
|
448
|
+
timestamp: new Date().toISOString(),
|
|
449
|
+
metadata: {
|
|
450
|
+
missionId: mission.id,
|
|
451
|
+
offTrack: summary.offTrack,
|
|
452
|
+
atRisk: summary.atRisk,
|
|
453
|
+
},
|
|
454
|
+
});
|
|
455
|
+
return true;
|
|
456
|
+
}
|
|
457
|
+
catch (err) {
|
|
458
|
+
this.logger.error('Failed to send Slack notification', {
|
|
459
|
+
missionId: mission.id,
|
|
460
|
+
error: err instanceof Error ? err.message : String(err),
|
|
461
|
+
});
|
|
462
|
+
return false;
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
/**
|
|
466
|
+
* Format the reminder message text.
|
|
467
|
+
*/
|
|
468
|
+
formatReminderMessage(mission, summary, ownerName) {
|
|
469
|
+
const statusLine = summary.offTrack > 0
|
|
470
|
+
? `🚨 *${summary.offTrack} Key Results are OFF TRACK*`
|
|
471
|
+
: `⚠️ *${summary.atRisk} Key Results are AT RISK*`;
|
|
472
|
+
return `Hello ${ownerName},
|
|
473
|
+
|
|
474
|
+
${statusLine} for Mission: "${mission.objective}"
|
|
475
|
+
|
|
476
|
+
Progress: ${Math.round(summary.overallProgress)}%
|
|
477
|
+
Total KRs: ${summary.totalKRs}
|
|
478
|
+
Achieved: ${summary.achieved}
|
|
479
|
+
On Track: ${summary.onTrack}
|
|
480
|
+
At Risk: ${summary.atRisk}
|
|
481
|
+
Off Track: ${summary.offTrack}
|
|
482
|
+
|
|
483
|
+
Please review the current strategy and adjust as needed.
|
|
484
|
+
cc: @${ORCHESTRATOR_SESSION_NAME}`;
|
|
485
|
+
}
|
|
486
|
+
/**
|
|
487
|
+
* Resolve a human-readable name for the mission owner.
|
|
488
|
+
*/
|
|
489
|
+
async resolveOwnerName(mission) {
|
|
490
|
+
// 1. Try explicit ownerId
|
|
491
|
+
if (mission.ownerId) {
|
|
492
|
+
const member = await this.storageService.getMemberById(mission.ownerId);
|
|
493
|
+
if (member)
|
|
494
|
+
return member.name;
|
|
495
|
+
}
|
|
496
|
+
// 2. Fallback to Team Lead of ownerTeamId via the canonical 4-rule
|
|
497
|
+
// cascade in `utils/team.utils.pickTeamLead` — same resolver used
|
|
498
|
+
// by chat-v2 mention dispatch so behavior cannot drift.
|
|
499
|
+
const teams = await this.storageService.getTeams();
|
|
500
|
+
const team = teams.find((t) => t.id === mission.ownerTeamId);
|
|
501
|
+
if (team) {
|
|
502
|
+
const leader = pickTeamLead(team);
|
|
503
|
+
if (leader)
|
|
504
|
+
return leader.name;
|
|
505
|
+
return team.name;
|
|
506
|
+
}
|
|
507
|
+
return 'Team Lead';
|
|
508
|
+
}
|
|
509
|
+
/**
|
|
510
|
+
* Load all missions with 'active' status.
|
|
511
|
+
*/
|
|
512
|
+
async loadAllActiveMissions() {
|
|
513
|
+
const dir = getMissionsDir();
|
|
514
|
+
try {
|
|
515
|
+
const files = await fs.readdir(dir);
|
|
516
|
+
const missions = [];
|
|
517
|
+
for (const file of files) {
|
|
518
|
+
if (!file.endsWith('.json'))
|
|
519
|
+
continue;
|
|
520
|
+
try {
|
|
521
|
+
const raw = await fs.readFile(path.join(dir, file), 'utf-8');
|
|
522
|
+
const mission = JSON.parse(raw);
|
|
523
|
+
if (mission.status === 'active') {
|
|
524
|
+
missions.push(mission);
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
catch {
|
|
528
|
+
// Skip corrupt files
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
return missions;
|
|
532
|
+
}
|
|
533
|
+
catch {
|
|
534
|
+
return [];
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
/**
|
|
538
|
+
* Save a mission back to disk.
|
|
539
|
+
*/
|
|
540
|
+
async saveMission(mission) {
|
|
541
|
+
const filePath = path.join(getMissionsDir(), `${mission.id}.json`);
|
|
542
|
+
await atomicWriteJson(filePath, mission);
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
//# sourceMappingURL=mission-reminder.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mission-reminder.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/v3/mission-reminder.service.ts"],"names":[],"mappings":"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"}
|