crewly 1.14.1 → 1.16.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/README.md +34 -4
- package/config/constants.ts +57 -0
- package/config/index.ts +6 -2
- package/config/roles/architect/soul.md +31 -0
- package/config/roles/auditor/soul.md +30 -0
- package/config/roles/backend-developer/soul.md +30 -0
- package/config/roles/content-strategist/soul.md +29 -0
- package/config/roles/designer/soul.md +30 -0
- package/config/roles/developer/prompt.md +1 -1
- package/config/roles/developer/soul.md +4 -1
- package/config/roles/frontend-developer/soul.md +28 -0
- package/config/roles/fullstack-dev/soul.md +28 -0
- package/config/roles/generalist/soul.md +28 -0
- package/config/roles/ops/soul.md +31 -0
- package/config/roles/orchestrator/fragments/lifecycle.md +2 -22
- package/config/roles/orchestrator/fragments/recovery.md +1 -1
- package/config/roles/orchestrator/prompt.md +18 -49
- package/config/roles/orchestrator/soul.md +2 -1
- package/config/roles/product-manager/prompt.md +1 -1
- package/config/roles/product-manager/soul.md +30 -0
- package/config/roles/qa/soul.md +31 -0
- package/config/roles/qa-engineer/soul.md +31 -0
- package/config/roles/researcher/soul.md +4 -1
- package/config/roles/sales/soul.md +30 -0
- package/config/roles/support/soul.md +30 -0
- package/config/roles/team-leader/prompt.md +1 -1
- package/config/roles/team-leader/soul.md +32 -0
- package/config/roles/tpm/soul.md +31 -0
- package/config/roles/ux-designer/soul.md +31 -0
- package/config/runtime_scripts/runtime-config.json +7 -0
- package/config/skills/_common/lib.sh +124 -2
- package/config/skills/_common/lib.test.sh +68 -1
- package/config/skills/agent/core/count-json/SKILL.md +61 -0
- package/config/skills/agent/core/count-json/execute.sh +52 -0
- package/config/skills/agent/core/count-json/execute.test.sh +35 -0
- package/config/skills/agent/core/record-prediction/SKILL.md +61 -0
- package/config/skills/agent/core/record-prediction/execute.sh +90 -0
- package/config/skills/agent/core/record-prediction/execute.test.sh +67 -0
- package/config/skills/agent/core/resolve-prediction/SKILL.md +61 -0
- package/config/skills/agent/core/resolve-prediction/execute.sh +87 -0
- package/config/skills/agent/core/resolve-prediction/execute.test.sh +74 -0
- package/config/skills/agent/core/set-focus/SKILL.md +64 -0
- package/config/skills/agent/core/set-focus/execute.sh +73 -0
- package/config/skills/agent/core/set-focus/execute.test.sh +67 -0
- package/config/skills/agent/core/suppress-noise/SKILL.md +59 -0
- package/config/skills/agent/core/suppress-noise/execute.sh +68 -0
- package/config/skills/agent/core/suppress-noise/execute.test.sh +58 -0
- package/config/skills/orchestrator/delegate-task/SKILL.md +17 -21
- package/config/skills/orchestrator/delegate-task/execute.sh +18 -9
- package/config/skills/orchestrator/delegate-task/execute.test.sh +1 -1
- package/config/skills/orchestrator/wiki-migrate/SKILL.md +33 -3
- package/config/skills/orchestrator/wiki-migrate/compact.jq +36 -0
- package/config/skills/orchestrator/wiki-migrate/execute.sh +35 -5
- package/config/skills/orchestrator/wiki-migrate/execute.test.sh +124 -0
- package/config/skills/team-leader/verify-output/execute.sh +14 -6
- package/config/skills/team-leader/verify-output/execute.test.sh +117 -0
- package/dist/backend/backend/src/constants.d.ts +161 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +159 -1
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/agent-self-improvement/agent-self-improvement.controller.d.ts +76 -0
- package/dist/backend/backend/src/controllers/agent-self-improvement/agent-self-improvement.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/agent-self-improvement/agent-self-improvement.controller.js +262 -0
- package/dist/backend/backend/src/controllers/agent-self-improvement/agent-self-improvement.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/mission/mission-policy.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/mission/mission-policy.controller.js +4 -6
- package/dist/backend/backend/src/controllers/mission/mission-policy.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/mission/mission-policy.routes.d.ts +10 -0
- package/dist/backend/backend/src/controllers/mission/mission-policy.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/mission/mission-policy.routes.js +78 -16
- package/dist/backend/backend/src/controllers/mission/mission-policy.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/oauth/oauth.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/oauth/oauth.routes.js +31 -0
- package/dist/backend/backend/src/controllers/oauth/oauth.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 +11 -1
- package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/request-types.d.ts +6 -2
- package/dist/backend/backend/src/controllers/request-types.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts +14 -0
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js +59 -0
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/task-pool/task-pool.routes.d.ts +9 -0
- package/dist/backend/backend/src/controllers/task-pool/task-pool.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/task-pool/task-pool.routes.js +14 -1
- package/dist/backend/backend/src/controllers/task-pool/task-pool.routes.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 +20 -1
- package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts +13 -0
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +240 -9
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/middleware/api-token.middleware.d.ts +139 -0
- package/dist/backend/backend/src/middleware/api-token.middleware.d.ts.map +1 -0
- package/dist/backend/backend/src/middleware/api-token.middleware.js +301 -0
- package/dist/backend/backend/src/middleware/api-token.middleware.js.map +1 -0
- package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.js +9 -1
- package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +78 -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 +311 -13
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/claude-runtime.service.d.ts +7 -0
- package/dist/backend/backend/src/services/agent/claude-runtime.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/claude-runtime.service.js +10 -1
- package/dist/backend/backend/src/services/agent/claude-runtime.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/codex-runtime.service.d.ts +8 -0
- package/dist/backend/backend/src/services/agent/codex-runtime.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/codex-runtime.service.js +11 -1
- package/dist/backend/backend/src/services/agent/codex-runtime.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts +36 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js +66 -9
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/gemini-runtime.service.d.ts +7 -0
- package/dist/backend/backend/src/services/agent/gemini-runtime.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/gemini-runtime.service.js +10 -1
- package/dist/backend/backend/src/services/agent/gemini-runtime.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.d.ts +197 -0
- package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.js +422 -3
- package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/opencode-runtime.service.d.ts +114 -0
- package/dist/backend/backend/src/services/agent/opencode-runtime.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/opencode-runtime.service.js +185 -0
- package/dist/backend/backend/src/services/agent/opencode-runtime.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.d.ts +27 -0
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js +71 -1
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts +1 -1
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js +15 -3
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-service.factory.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-service.factory.js +9 -0
- package/dist/backend/backend/src/services/agent/runtime-service.factory.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-builder.service.d.ts +23 -0
- 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 +45 -0
- package/dist/backend/backend/src/services/ai/prompt-builder.service.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/index.d.ts +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/index.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/index.js +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/index.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/memory-reference.module.d.ts +43 -3
- package/dist/backend/backend/src/services/ai/prompt-modules/memory-reference.module.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/memory-reference.module.js +85 -4
- package/dist/backend/backend/src/services/ai/prompt-modules/memory-reference.module.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/prompt-assembly.service.d.ts +35 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/prompt-assembly.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/prompt-assembly.service.js +73 -2
- package/dist/backend/backend/src/services/ai/prompt-modules/prompt-assembly.service.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts +44 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/prompt-module.interface.js +33 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/prompt-module.interface.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 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/recovery.module.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js +6 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
- package/dist/backend/backend/src/services/ai/self-improvement/agent-memory-provider.d.ts +45 -0
- package/dist/backend/backend/src/services/ai/self-improvement/agent-memory-provider.d.ts.map +1 -0
- package/dist/backend/backend/src/services/ai/self-improvement/agent-memory-provider.js +59 -0
- package/dist/backend/backend/src/services/ai/self-improvement/agent-memory-provider.js.map +1 -0
- package/dist/backend/backend/src/services/ai/self-improvement/consolidation-scheduler.service.d.ts +137 -0
- package/dist/backend/backend/src/services/ai/self-improvement/consolidation-scheduler.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/ai/self-improvement/consolidation-scheduler.service.js +216 -0
- package/dist/backend/backend/src/services/ai/self-improvement/consolidation-scheduler.service.js.map +1 -0
- package/dist/backend/backend/src/services/ai/self-improvement/prediction-calibration.service.d.ts +4 -1
- package/dist/backend/backend/src/services/ai/self-improvement/prediction-calibration.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/self-improvement/prediction-calibration.service.js +3 -1
- package/dist/backend/backend/src/services/ai/self-improvement/prediction-calibration.service.js.map +1 -1
- package/dist/backend/backend/src/services/backup/backup-archive.service.d.ts +26 -2
- package/dist/backend/backend/src/services/backup/backup-archive.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/backup/backup-archive.service.js +91 -10
- package/dist/backend/backend/src/services/backup/backup-archive.service.js.map +1 -1
- package/dist/backend/backend/src/services/backup/backup-restore.service.d.ts +15 -2
- package/dist/backend/backend/src/services/backup/backup-restore.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/backup/backup-restore.service.js +100 -21
- package/dist/backend/backend/src/services/backup/backup-restore.service.js.map +1 -1
- package/dist/backend/backend/src/services/backup/backup.types.d.ts +85 -2
- package/dist/backend/backend/src/services/backup/backup.types.d.ts.map +1 -1
- package/dist/backend/backend/src/services/backup/backup.types.js +21 -0
- package/dist/backend/backend/src/services/backup/backup.types.js.map +1 -1
- package/dist/backend/backend/src/services/backup/project-file-filter.d.ts +35 -0
- package/dist/backend/backend/src/services/backup/project-file-filter.d.ts.map +1 -0
- package/dist/backend/backend/src/services/backup/project-file-filter.js +90 -0
- package/dist/backend/backend/src/services/backup/project-file-filter.js.map +1 -0
- package/dist/backend/backend/src/services/budget/team-budget-gate.service.d.ts +165 -0
- package/dist/backend/backend/src/services/budget/team-budget-gate.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/budget/team-budget-gate.service.js +364 -0
- package/dist/backend/backend/src/services/budget/team-budget-gate.service.js.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts +23 -3
- 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 +34 -3
- 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 +5 -3
- 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 +6 -4
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
- package/dist/backend/backend/src/services/core/api-token.service.d.ts +78 -0
- package/dist/backend/backend/src/services/core/api-token.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/core/api-token.service.js +149 -0
- package/dist/backend/backend/src/services/core/api-token.service.js.map +1 -0
- package/dist/backend/backend/src/services/core/logger.service.d.ts +10 -1
- package/dist/backend/backend/src/services/core/logger.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/core/logger.service.js +18 -3
- package/dist/backend/backend/src/services/core/logger.service.js.map +1 -1
- package/dist/backend/backend/src/services/core/storage.service.d.ts +11 -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 +34 -0
- package/dist/backend/backend/src/services/core/storage.service.js.map +1 -1
- package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.d.ts +7 -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 +29 -7
- package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.js.map +1 -1
- package/dist/backend/backend/src/services/hierarchy/hierarchy-escalation-monitor.service.d.ts +140 -0
- package/dist/backend/backend/src/services/hierarchy/hierarchy-escalation-monitor.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/hierarchy/hierarchy-escalation-monitor.service.js +346 -0
- package/dist/backend/backend/src/services/hierarchy/hierarchy-escalation-monitor.service.js.map +1 -0
- package/dist/backend/backend/src/services/mcp-tool-definitions.d.ts +1 -1
- package/dist/backend/backend/src/services/mcp-tool-definitions.js +1 -1
- package/dist/backend/backend/src/services/mcp-tool-definitions.js.map +1 -1
- package/dist/backend/backend/src/services/monitoring/token-usage.service.d.ts +27 -3
- package/dist/backend/backend/src/services/monitoring/token-usage.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/monitoring/token-usage.service.js +42 -7
- package/dist/backend/backend/src/services/monitoring/token-usage.service.js.map +1 -1
- package/dist/backend/backend/src/services/orc/orc-delivery-enforcer.service.d.ts +47 -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 +67 -1
- package/dist/backend/backend/src/services/orc/orc-delivery-enforcer.service.js.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts +22 -15
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.js +24 -15
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.js.map +1 -1
- package/dist/backend/backend/src/services/runtime-adapter.d.ts +10 -1
- package/dist/backend/backend/src/services/runtime-adapter.d.ts.map +1 -1
- package/dist/backend/backend/src/services/runtime-adapter.js +12 -1
- package/dist/backend/backend/src/services/runtime-adapter.js.map +1 -1
- package/dist/backend/backend/src/services/session/pty/pty-session.d.ts +7 -1
- package/dist/backend/backend/src/services/session/pty/pty-session.d.ts.map +1 -1
- package/dist/backend/backend/src/services/session/pty/pty-session.js +9 -3
- package/dist/backend/backend/src/services/session/pty/pty-session.js.map +1 -1
- package/dist/backend/backend/src/services/session/session-handoff.service.d.ts +27 -0
- package/dist/backend/backend/src/services/session/session-handoff.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/session/session-handoff.service.js +110 -22
- package/dist/backend/backend/src/services/session/session-handoff.service.js.map +1 -1
- package/dist/backend/backend/src/services/settings/settings.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/settings/settings.service.js +1 -0
- package/dist/backend/backend/src/services/settings/settings.service.js.map +1 -1
- package/dist/backend/backend/src/services/skill/skill-catalog.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/skill/skill-catalog.service.js +7 -1
- package/dist/backend/backend/src/services/skill/skill-catalog.service.js.map +1 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +52 -0
- 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 +132 -6
- package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/escalation-boot.d.ts +87 -0
- package/dist/backend/backend/src/services/v3/escalation-boot.d.ts.map +1 -0
- package/dist/backend/backend/src/services/v3/escalation-boot.js +128 -0
- package/dist/backend/backend/src/services/v3/escalation-boot.js.map +1 -0
- package/dist/backend/backend/src/services/v3/escalation.service.d.ts +1 -1
- package/dist/backend/backend/src/services/v3/escalation.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/escalation.service.js +4 -4
- package/dist/backend/backend/src/services/v3/escalation.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/fallback-trigger-cleanup.subscriber.d.ts +78 -0
- package/dist/backend/backend/src/services/v3/fallback-trigger-cleanup.subscriber.d.ts.map +1 -0
- package/dist/backend/backend/src/services/v3/fallback-trigger-cleanup.subscriber.js +129 -0
- package/dist/backend/backend/src/services/v3/fallback-trigger-cleanup.subscriber.js.map +1 -0
- package/dist/backend/backend/src/services/v3/kr-completion.subscriber.d.ts +118 -0
- package/dist/backend/backend/src/services/v3/kr-completion.subscriber.d.ts.map +1 -0
- package/dist/backend/backend/src/services/v3/kr-completion.subscriber.js +277 -0
- package/dist/backend/backend/src/services/v3/kr-completion.subscriber.js.map +1 -0
- package/dist/backend/backend/src/services/v3/kr-skill-measurer.service.d.ts +117 -0
- package/dist/backend/backend/src/services/v3/kr-skill-measurer.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/v3/kr-skill-measurer.service.js +214 -0
- package/dist/backend/backend/src/services/v3/kr-skill-measurer.service.js.map +1 -0
- package/dist/backend/backend/src/services/v3/kr-tracking.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/kr-tracking.service.js +3 -6
- package/dist/backend/backend/src/services/v3/kr-tracking.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/mission-executor.service.d.ts +5 -0
- package/dist/backend/backend/src/services/v3/mission-executor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/mission-executor.service.js +36 -0
- package/dist/backend/backend/src/services/v3/mission-executor.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/mission-paths.d.ts +69 -0
- package/dist/backend/backend/src/services/v3/mission-paths.d.ts.map +1 -0
- package/dist/backend/backend/src/services/v3/mission-paths.js +92 -0
- package/dist/backend/backend/src/services/v3/mission-paths.js.map +1 -0
- package/dist/backend/backend/src/services/v3/mission-period.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/mission-period.service.js +1 -12
- package/dist/backend/backend/src/services/v3/mission-period.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/mission-reminder.service.d.ts +76 -2
- package/dist/backend/backend/src/services/v3/mission-reminder.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/mission-reminder.service.js +267 -9
- package/dist/backend/backend/src/services/v3/mission-reminder.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/okr-cascade.service.d.ts +6 -4
- package/dist/backend/backend/src/services/v3/okr-cascade.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/okr-cascade.service.js +11 -10
- package/dist/backend/backend/src/services/v3/okr-cascade.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/okr-review.service.d.ts +24 -0
- package/dist/backend/backend/src/services/v3/okr-review.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/okr-review.service.js +63 -3
- package/dist/backend/backend/src/services/v3/okr-review.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/tl-auto-verify.service.d.ts +17 -0
- package/dist/backend/backend/src/services/v3/tl-auto-verify.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/tl-auto-verify.service.js +62 -13
- package/dist/backend/backend/src/services/v3/tl-auto-verify.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/v3-data.service.d.ts +6 -2
- 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 +14 -9
- package/dist/backend/backend/src/services/v3/v3-data.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts +14 -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 +31 -0
- package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js.map +1 -1
- package/dist/backend/backend/src/types/event-bus.types.d.ts +4 -2
- package/dist/backend/backend/src/types/event-bus.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/event-bus.types.js +15 -0
- package/dist/backend/backend/src/types/event-bus.types.js.map +1 -1
- package/dist/backend/backend/src/types/index.d.ts +27 -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/settings.types.d.ts +1 -1
- package/dist/backend/backend/src/types/settings.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/settings.types.js +7 -0
- package/dist/backend/backend/src/types/settings.types.js.map +1 -1
- package/dist/backend/backend/src/types/team-template.types.d.ts +2 -2
- package/dist/backend/backend/src/types/team-template.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/team-template.types.js +1 -1
- package/dist/backend/backend/src/types/team-template.types.js.map +1 -1
- package/dist/backend/backend/src/types/v2/index.d.ts +1 -1
- package/dist/backend/backend/src/types/v2/index.d.ts.map +1 -1
- package/dist/backend/backend/src/types/v2/index.js +1 -1
- package/dist/backend/backend/src/types/v2/index.js.map +1 -1
- package/dist/backend/backend/src/types/v2/mission.types.d.ts +41 -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 +29 -0
- package/dist/backend/backend/src/types/v2/mission.types.js.map +1 -1
- package/dist/backend/backend/src/utils/network-exposure.utils.d.ts +67 -0
- package/dist/backend/backend/src/utils/network-exposure.utils.d.ts.map +1 -0
- package/dist/backend/backend/src/utils/network-exposure.utils.js +92 -0
- package/dist/backend/backend/src/utils/network-exposure.utils.js.map +1 -0
- package/dist/backend/backend/src/utils/terminal-string-ops.d.ts +2 -0
- package/dist/backend/backend/src/utils/terminal-string-ops.d.ts.map +1 -1
- package/dist/backend/backend/src/utils/terminal-string-ops.js +14 -0
- package/dist/backend/backend/src/utils/terminal-string-ops.js.map +1 -1
- package/dist/backend/build-info.json +2 -2
- package/dist/backend/config/constants.d.ts +53 -0
- package/dist/backend/config/constants.d.ts.map +1 -1
- package/dist/backend/config/constants.js +54 -0
- package/dist/backend/config/constants.js.map +1 -1
- package/dist/backend/config/index.d.ts +2 -2
- package/dist/backend/config/index.d.ts.map +1 -1
- package/dist/backend/config/index.js +6 -6
- package/dist/backend/config/index.js.map +1 -1
- package/dist/cli/backend/src/constants.d.ts +161 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +159 -1
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts +78 -0
- package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.js +311 -13
- package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/claude-runtime.service.d.ts +7 -0
- package/dist/cli/backend/src/services/agent/claude-runtime.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/claude-runtime.service.js +10 -1
- package/dist/cli/backend/src/services/agent/claude-runtime.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/codex-runtime.service.d.ts +8 -0
- package/dist/cli/backend/src/services/agent/codex-runtime.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/codex-runtime.service.js +11 -1
- package/dist/cli/backend/src/services/agent/codex-runtime.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts +36 -1
- package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js +66 -9
- package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/gemini-runtime.service.d.ts +7 -0
- package/dist/cli/backend/src/services/agent/gemini-runtime.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/gemini-runtime.service.js +10 -1
- package/dist/cli/backend/src/services/agent/gemini-runtime.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.d.ts +197 -0
- package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.js +422 -3
- package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/opencode-runtime.service.d.ts +114 -0
- package/dist/cli/backend/src/services/agent/opencode-runtime.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/opencode-runtime.service.js +185 -0
- package/dist/cli/backend/src/services/agent/opencode-runtime.service.js.map +1 -0
- package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.d.ts +27 -0
- package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js +71 -1
- package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.d.ts +1 -1
- package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js +15 -3
- package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-service.factory.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-service.factory.js +9 -0
- package/dist/cli/backend/src/services/agent/runtime-service.factory.js.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-builder.service.d.ts +23 -0
- package/dist/cli/backend/src/services/ai/prompt-builder.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-builder.service.js +45 -0
- package/dist/cli/backend/src/services/ai/prompt-builder.service.js.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/memory-reference.module.d.ts +43 -3
- package/dist/cli/backend/src/services/ai/prompt-modules/memory-reference.module.d.ts.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/memory-reference.module.js +85 -4
- package/dist/cli/backend/src/services/ai/prompt-modules/memory-reference.module.js.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/prompt-assembly.service.d.ts +35 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/prompt-assembly.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/prompt-assembly.service.js +73 -2
- package/dist/cli/backend/src/services/ai/prompt-modules/prompt-assembly.service.js.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts +44 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.js +33 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.js.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/recovery.module.d.ts.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/recovery.module.js +13 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/recovery.module.js.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js +6 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
- package/dist/cli/backend/src/services/ai/self-improvement/agent-memory-provider.d.ts +45 -0
- package/dist/cli/backend/src/services/ai/self-improvement/agent-memory-provider.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/self-improvement/agent-memory-provider.js +59 -0
- package/dist/cli/backend/src/services/ai/self-improvement/agent-memory-provider.js.map +1 -0
- package/dist/cli/backend/src/services/ai/self-improvement/attention.service.d.ts +74 -0
- package/dist/cli/backend/src/services/ai/self-improvement/attention.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/self-improvement/attention.service.js +132 -0
- package/dist/cli/backend/src/services/ai/self-improvement/attention.service.js.map +1 -0
- package/dist/cli/backend/src/services/ai/self-improvement/memory-consolidation.service.d.ts +107 -0
- package/dist/cli/backend/src/services/ai/self-improvement/memory-consolidation.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/self-improvement/memory-consolidation.service.js +183 -0
- package/dist/cli/backend/src/services/ai/self-improvement/memory-consolidation.service.js.map +1 -0
- package/dist/cli/backend/src/services/ai/self-improvement/prediction-calibration.service.d.ts +100 -0
- package/dist/cli/backend/src/services/ai/self-improvement/prediction-calibration.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/self-improvement/prediction-calibration.service.js +130 -0
- package/dist/cli/backend/src/services/ai/self-improvement/prediction-calibration.service.js.map +1 -0
- package/dist/cli/backend/src/services/backup/backup-archive.service.d.ts +26 -2
- package/dist/cli/backend/src/services/backup/backup-archive.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/backup/backup-archive.service.js +91 -10
- package/dist/cli/backend/src/services/backup/backup-archive.service.js.map +1 -1
- package/dist/cli/backend/src/services/backup/backup-restore.service.d.ts +15 -2
- package/dist/cli/backend/src/services/backup/backup-restore.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/backup/backup-restore.service.js +100 -21
- package/dist/cli/backend/src/services/backup/backup-restore.service.js.map +1 -1
- package/dist/cli/backend/src/services/backup/backup.types.d.ts +85 -2
- package/dist/cli/backend/src/services/backup/backup.types.d.ts.map +1 -1
- package/dist/cli/backend/src/services/backup/backup.types.js +21 -0
- package/dist/cli/backend/src/services/backup/backup.types.js.map +1 -1
- package/dist/cli/backend/src/services/backup/project-file-filter.d.ts +35 -0
- package/dist/cli/backend/src/services/backup/project-file-filter.d.ts.map +1 -0
- package/dist/cli/backend/src/services/backup/project-file-filter.js +90 -0
- package/dist/cli/backend/src/services/backup/project-file-filter.js.map +1 -0
- package/dist/cli/backend/src/services/budget/team-budget-gate.service.d.ts +165 -0
- package/dist/cli/backend/src/services/budget/team-budget-gate.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/budget/team-budget-gate.service.js +364 -0
- package/dist/cli/backend/src/services/budget/team-budget-gate.service.js.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts +23 -3
- 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 +34 -3
- 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 +5 -3
- 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 +6 -4
- package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
- package/dist/cli/backend/src/services/core/api-token.service.d.ts +78 -0
- package/dist/cli/backend/src/services/core/api-token.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/core/api-token.service.js +149 -0
- package/dist/cli/backend/src/services/core/api-token.service.js.map +1 -0
- package/dist/cli/backend/src/services/core/logger.service.d.ts +10 -1
- package/dist/cli/backend/src/services/core/logger.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/core/logger.service.js +18 -3
- package/dist/cli/backend/src/services/core/logger.service.js.map +1 -1
- package/dist/cli/backend/src/services/core/storage.service.d.ts +11 -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 +34 -0
- package/dist/cli/backend/src/services/core/storage.service.js.map +1 -1
- package/dist/cli/backend/src/services/mcp-tool-definitions.d.ts +1 -1
- package/dist/cli/backend/src/services/mcp-tool-definitions.js +1 -1
- package/dist/cli/backend/src/services/mcp-tool-definitions.js.map +1 -1
- package/dist/cli/backend/src/services/monitoring/token-usage.service.d.ts +27 -3
- package/dist/cli/backend/src/services/monitoring/token-usage.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/monitoring/token-usage.service.js +42 -7
- package/dist/cli/backend/src/services/monitoring/token-usage.service.js.map +1 -1
- package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.d.ts +47 -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 +67 -1
- package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.js.map +1 -1
- package/dist/cli/backend/src/services/session/pty/pty-session.d.ts +7 -1
- package/dist/cli/backend/src/services/session/pty/pty-session.d.ts.map +1 -1
- package/dist/cli/backend/src/services/session/pty/pty-session.js +9 -3
- package/dist/cli/backend/src/services/session/pty/pty-session.js.map +1 -1
- package/dist/cli/backend/src/services/session/session-handoff.service.d.ts +27 -0
- package/dist/cli/backend/src/services/session/session-handoff.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/session/session-handoff.service.js +110 -22
- package/dist/cli/backend/src/services/session/session-handoff.service.js.map +1 -1
- package/dist/cli/backend/src/services/settings/settings.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/settings/settings.service.js +1 -0
- package/dist/cli/backend/src/services/settings/settings.service.js.map +1 -1
- package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +52 -0
- package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/task-pool/task-pool.service.js +132 -6
- package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/cli/backend/src/services/v3/kr-tracking.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/v3/kr-tracking.service.js +3 -6
- package/dist/cli/backend/src/services/v3/kr-tracking.service.js.map +1 -1
- package/dist/cli/backend/src/services/v3/mission-executor.service.d.ts +5 -0
- package/dist/cli/backend/src/services/v3/mission-executor.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/v3/mission-executor.service.js +36 -0
- package/dist/cli/backend/src/services/v3/mission-executor.service.js.map +1 -1
- package/dist/cli/backend/src/services/v3/mission-paths.d.ts +69 -0
- package/dist/cli/backend/src/services/v3/mission-paths.d.ts.map +1 -0
- package/dist/cli/backend/src/services/v3/mission-paths.js +92 -0
- package/dist/cli/backend/src/services/v3/mission-paths.js.map +1 -0
- package/dist/cli/backend/src/services/v3/v3-data.service.d.ts +6 -2
- package/dist/cli/backend/src/services/v3/v3-data.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/v3/v3-data.service.js +14 -9
- package/dist/cli/backend/src/services/v3/v3-data.service.js.map +1 -1
- package/dist/cli/backend/src/types/event-bus.types.d.ts +4 -2
- package/dist/cli/backend/src/types/event-bus.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/event-bus.types.js +15 -0
- package/dist/cli/backend/src/types/event-bus.types.js.map +1 -1
- package/dist/cli/backend/src/types/index.d.ts +27 -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/settings.types.d.ts +1 -1
- package/dist/cli/backend/src/types/settings.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/settings.types.js +7 -0
- package/dist/cli/backend/src/types/settings.types.js.map +1 -1
- package/dist/cli/backend/src/types/team-template.types.d.ts +2 -2
- package/dist/cli/backend/src/types/team-template.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/team-template.types.js +1 -1
- package/dist/cli/backend/src/types/team-template.types.js.map +1 -1
- package/dist/cli/backend/src/types/v2/index.d.ts +1 -1
- package/dist/cli/backend/src/types/v2/index.d.ts.map +1 -1
- package/dist/cli/backend/src/types/v2/index.js +1 -1
- package/dist/cli/backend/src/types/v2/index.js.map +1 -1
- package/dist/cli/backend/src/types/v2/mission.types.d.ts +41 -0
- package/dist/cli/backend/src/types/v2/mission.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/v2/mission.types.js +29 -0
- package/dist/cli/backend/src/types/v2/mission.types.js.map +1 -1
- package/dist/cli/backend/src/utils/terminal-string-ops.d.ts +2 -0
- package/dist/cli/backend/src/utils/terminal-string-ops.d.ts.map +1 -1
- package/dist/cli/backend/src/utils/terminal-string-ops.js +14 -0
- package/dist/cli/backend/src/utils/terminal-string-ops.js.map +1 -1
- package/dist/cli/cli/src/commands/backup.d.ts +25 -0
- package/dist/cli/cli/src/commands/backup.d.ts.map +1 -1
- package/dist/cli/cli/src/commands/backup.js +120 -6
- package/dist/cli/cli/src/commands/backup.js.map +1 -1
- package/dist/cli/cli/src/commands/doctor.d.ts +58 -0
- package/dist/cli/cli/src/commands/doctor.d.ts.map +1 -0
- package/dist/cli/cli/src/commands/doctor.js +163 -0
- package/dist/cli/cli/src/commands/doctor.js.map +1 -0
- package/dist/cli/cli/src/commands/onboard.d.ts +2 -2
- package/dist/cli/cli/src/commands/onboard.d.ts.map +1 -1
- package/dist/cli/cli/src/commands/onboard.js +15 -7
- package/dist/cli/cli/src/commands/onboard.js.map +1 -1
- package/dist/cli/cli/src/commands/service.d.ts +68 -11
- package/dist/cli/cli/src/commands/service.d.ts.map +1 -1
- package/dist/cli/cli/src/commands/service.js +183 -51
- package/dist/cli/cli/src/commands/service.js.map +1 -1
- package/dist/cli/cli/src/commands/token.d.ts +53 -0
- package/dist/cli/cli/src/commands/token.d.ts.map +1 -0
- package/dist/cli/cli/src/commands/token.js +70 -0
- package/dist/cli/cli/src/commands/token.js.map +1 -0
- package/dist/cli/cli/src/index.js +40 -5
- package/dist/cli/cli/src/index.js.map +1 -1
- package/dist/cli/cli/src/scripts/check-native-toolchain.d.ts +21 -0
- package/dist/cli/cli/src/scripts/check-native-toolchain.d.ts.map +1 -0
- package/dist/cli/cli/src/scripts/check-native-toolchain.js +40 -0
- package/dist/cli/cli/src/scripts/check-native-toolchain.js.map +1 -0
- package/dist/cli/cli/src/utils/native-toolchain.d.ts +111 -0
- package/dist/cli/cli/src/utils/native-toolchain.d.ts.map +1 -0
- package/dist/cli/cli/src/utils/native-toolchain.js +146 -0
- package/dist/cli/cli/src/utils/native-toolchain.js.map +1 -0
- package/dist/cli/cli/src/utils/package-root.d.ts +55 -0
- package/dist/cli/cli/src/utils/package-root.d.ts.map +1 -0
- package/dist/cli/cli/src/utils/package-root.js +107 -0
- package/dist/cli/cli/src/utils/package-root.js.map +1 -0
- package/dist/cli/cli/src/utils/version-check.d.ts +18 -2
- package/dist/cli/cli/src/utils/version-check.d.ts.map +1 -1
- package/dist/cli/cli/src/utils/version-check.js +51 -4
- package/dist/cli/cli/src/utils/version-check.js.map +1 -1
- package/dist/cli/config/constants.d.ts +53 -0
- package/dist/cli/config/constants.d.ts.map +1 -1
- package/dist/cli/config/constants.js +54 -0
- package/dist/cli/config/constants.js.map +1 -1
- package/dist/cli/config/index.d.ts +2 -2
- package/dist/cli/config/index.d.ts.map +1 -1
- package/dist/cli/config/index.js +6 -6
- package/dist/cli/config/index.js.map +1 -1
- package/frontend/dist/assets/index-019817e2.js +4961 -0
- package/frontend/dist/assets/{index-88feb412.css → index-a56613e7.css} +1 -1
- package/frontend/dist/index.html +2 -2
- package/package.json +3 -2
- package/frontend/dist/assets/index-190a957f.js +0 -4961
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mission-paths.js","sourceRoot":"","sources":["../../../../../../backend/src/services/v3/mission-paths.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAErE,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,oEAAoE;AACpE,MAAM,CAAC,MAAM,gBAAgB,GAAG,qBAAqB,CAAC;AAEtD,mEAAmE;AACnE,MAAM,CAAC,MAAM,eAAe,GAAG,UAAU,CAAC;AAE1C,4EAA4E;AAC5E,MAAM,CAAC,MAAM,kBAAkB,GAAG,aAAa,CAAC;AAEhD,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,UAAU,qBAAqB;IACnC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAAC;IAC/D,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,OAAO,CAAC;IAClD,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC;AACvB,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,cAAc,CAAC,WAAoB;IACjD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC/C,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,QAAQ,CAAC;IACrD,MAAM,IAAI,GAAG,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,qBAAqB,EAAE,CAAC;IAC3F,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,gBAAgB,CAAC,KAAK,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;AAC9E,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB,EAAE,WAAoB;IACpE,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,GAAG,SAAS,OAAO,CAAC,CAAC;AACrE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,SAAiB,EAAE,WAAoB;IACtE,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAAC;AAC/E,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mission-period.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/v3/mission-period.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;
|
|
1
|
+
{"version":3,"file":"mission-period.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/v3/mission-period.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAMH,OAAO,KAAK,EAAE,OAAO,EAAgC,MAAM,iCAAiC,CAAC;AAkB7F,+CAA+C;AAC/C,MAAM,WAAW,qBAAqB;IACpC,sDAAsD;IACtD,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,0DAA0D;IAC1D,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,+BAA+B;IAC/B,SAAS,EAAE,MAAM,CAAC;CACnB;AAMD;;GAEG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAqC;IAC5D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IAEzC,OAAO;IAIP,MAAM,CAAC,WAAW,IAAI,oBAAoB;IAO1C,MAAM,CAAC,aAAa,IAAI,IAAI;IAQ5B;;;;;;;;;OASG;IACG,SAAS,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAkD3D;;;;;OAKG;IACG,uBAAuB,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAY7D;;;;;;;OAOG;IACG,0BAA0B,CAC9B,MAAM,EAAE,MAAM,EACd,YAAY,GAAE,SAAS,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAa,EAC3D,GAAG,CAAC,EAAE,IAAI,GACT,OAAO,CAAC,OAAO,EAAE,CAAC;IAkCrB;;OAEG;YACW,eAAe;IAoB7B;;OAEG;YACW,mBAAmB;CAYlC"}
|
|
@@ -17,21 +17,10 @@
|
|
|
17
17
|
*/
|
|
18
18
|
import * as fs from 'fs/promises';
|
|
19
19
|
import * as path from 'path';
|
|
20
|
+
import { getMissionsDir } from './mission-paths.js';
|
|
20
21
|
import { LoggerService } from '../core/logger.service.js';
|
|
21
22
|
import { isPeriodActive, isPeriodPast, isPeriodFuture, sortMissionsByPriority, TERMINAL_MISSION_STATUSES, } from '../../types/v2/mission.types.js';
|
|
22
23
|
// ---------------------------------------------------------------------------
|
|
23
|
-
// Constants
|
|
24
|
-
// ---------------------------------------------------------------------------
|
|
25
|
-
/**
|
|
26
|
-
* Resolve the mission store directory. Defaults to `<cwd>/.crewly/missions`
|
|
27
|
-
* (the production store). Honors the `CREWLY_MISSIONS_DIR` env override so tests
|
|
28
|
-
* can isolate to a temp directory and never read/delete the real store — without
|
|
29
|
-
* this override a test's cleanup would wipe production missions.
|
|
30
|
-
*/
|
|
31
|
-
function getMissionsDir() {
|
|
32
|
-
return process.env['CREWLY_MISSIONS_DIR'] || path.join(process.cwd(), '.crewly', 'missions');
|
|
33
|
-
}
|
|
34
|
-
// ---------------------------------------------------------------------------
|
|
35
24
|
// Service
|
|
36
25
|
// ---------------------------------------------------------------------------
|
|
37
26
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mission-period.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/v3/mission-period.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAwB,MAAM,2BAA2B,CAAC;AAEhF,OAAO,EACL,cAAc,EACd,YAAY,EACZ,cAAc,EACd,sBAAsB,EACtB,yBAAyB,GAC1B,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"mission-period.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/v3/mission-period.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
*
|
|
14
14
|
* @module services/v3/mission-reminder.service
|
|
15
15
|
*/
|
|
16
|
+
import type { EventBusService } from '../event-bus/event-bus.service.js';
|
|
16
17
|
import type { ReviewReason } from '../../types/review-reason.types.js';
|
|
17
18
|
export type { ReviewReason };
|
|
18
19
|
/**
|
|
@@ -39,6 +40,23 @@ export declare class MissionReminderService {
|
|
|
39
40
|
* {@link cronParseFailureCount} for tests + (future) Prom metric.
|
|
40
41
|
*/
|
|
41
42
|
private cronParseFailures;
|
|
43
|
+
/**
|
|
44
|
+
* Optional EventBus for `mission:stale` publication. Wired from the
|
|
45
|
+
* backend boot path via {@link setEventBusService}; when absent the
|
|
46
|
+
* stale detection still bumps `staleCycles` but publishes nothing.
|
|
47
|
+
*/
|
|
48
|
+
private eventBus;
|
|
49
|
+
/**
|
|
50
|
+
* Consecutive idle sweeps per mission (no active WI + no KR measurement
|
|
51
|
+
* since the previous sweep). In-memory by design — a restart simply
|
|
52
|
+
* restarts the count, and the per-day publish id keeps the downstream
|
|
53
|
+
* review WI idempotent regardless.
|
|
54
|
+
*/
|
|
55
|
+
private readonly idleSweeps;
|
|
56
|
+
/** Wall-clock of the previous sweep (for "measurement since last sweep"). */
|
|
57
|
+
private lastSweepAt;
|
|
58
|
+
/** `<missionId>:stale:<YYYY-MM-DD>` ids already published (FIFO-bounded). */
|
|
59
|
+
private readonly publishedStale;
|
|
42
60
|
private constructor();
|
|
43
61
|
/**
|
|
44
62
|
* Total number of cron-parse failures observed since this service
|
|
@@ -57,6 +75,13 @@ export declare class MissionReminderService {
|
|
|
57
75
|
private getTaskPool;
|
|
58
76
|
static getInstance(): MissionReminderService;
|
|
59
77
|
static resetInstance(): void;
|
|
78
|
+
/**
|
|
79
|
+
* Wire the EventBus used to publish `mission:stale`. Idempotent; pass
|
|
80
|
+
* `null` to disable publication (tests / CLI).
|
|
81
|
+
*
|
|
82
|
+
* @param bus - The live EventBusService, or null
|
|
83
|
+
*/
|
|
84
|
+
setEventBusService(bus: EventBusService | null): void;
|
|
60
85
|
/**
|
|
61
86
|
* Run a full sweep of all active missions, sending Slack OKR reminders
|
|
62
87
|
* AND (per REVIEW-1, Phase E pre-beta) creating cadence-driven review
|
|
@@ -83,14 +108,56 @@ export declare class MissionReminderService {
|
|
|
83
108
|
skipped: number;
|
|
84
109
|
reviewsCreated: number;
|
|
85
110
|
reviewsSkipped: number;
|
|
111
|
+
/** Cadence boundaries where the deterministic review said `continue` — no WI raised. */
|
|
112
|
+
reviewsAutoContinued: number;
|
|
113
|
+
/** Missions flagged stale this sweep (`mission:stale` published, staleCycles bumped). */
|
|
114
|
+
staleFlagged: number;
|
|
115
|
+
/** KRs re-measured from skill output this sweep */
|
|
116
|
+
skillMeasured: number;
|
|
86
117
|
}>;
|
|
87
118
|
/**
|
|
88
119
|
* Result of {@link maybeCreateReviewWorkItem} — `'created'` when a new
|
|
89
120
|
* review WorkItem was added to the pool, `'skipped'` when the
|
|
90
121
|
* reentrancy lock or cadence boundary blocked creation, `'noop'` when
|
|
91
|
-
* the mission has no executionCadence configured (legacy missions)
|
|
122
|
+
* the mission has no executionCadence configured (legacy missions),
|
|
123
|
+
* `'auto_continued'` when the cadence boundary fired but the
|
|
124
|
+
* deterministic OKR review recommended `continue` with no off-track KR
|
|
125
|
+
* — the review is persisted on the mission and NO WorkItem is raised.
|
|
92
126
|
*/
|
|
93
127
|
private maybeCreateReviewWorkItem;
|
|
128
|
+
/**
|
|
129
|
+
* Run {@link MissionPeriodService.reconcile} so period-bound missions
|
|
130
|
+
* auto-activate / get flagged at period end. Previously nothing called
|
|
131
|
+
* reconcile(), so periods never advanced on their own. Failure-soft.
|
|
132
|
+
*/
|
|
133
|
+
private reconcilePeriods;
|
|
134
|
+
/**
|
|
135
|
+
* Stale detector. A mission is "idle" this sweep when it has no
|
|
136
|
+
* non-terminal WorkItem in the pool AND no KR measurement recorded since
|
|
137
|
+
* the previous sweep. After {@link STALE_SWEEP_THRESHOLD} consecutive
|
|
138
|
+
* idle sweeps the mission's `staleCycles` is bumped, persisted, and a
|
|
139
|
+
* `mission:stale` event is published with the idempotent id
|
|
140
|
+
* `<missionId>:stale:<YYYY-MM-DD>` (once per mission per UTC day). The
|
|
141
|
+
* bridge turns that into a `no_active_work` review WorkItem.
|
|
142
|
+
*
|
|
143
|
+
* @returns `true` when the mission was flagged stale on this sweep
|
|
144
|
+
*/
|
|
145
|
+
private detectStale;
|
|
146
|
+
/** Whether any KR carries a measurement taken at/after `since`. */
|
|
147
|
+
private hasMeasurementSince;
|
|
148
|
+
/**
|
|
149
|
+
* Run {@link OKRReviewService.executeReview} for a mission at its cadence
|
|
150
|
+
* boundary and fold the persisted bookkeeping (`lastReviewSummary`,
|
|
151
|
+
* `staleCycles`, `lastReviewAt`) back into the caller's in-memory copy.
|
|
152
|
+
*
|
|
153
|
+
* Failure-soft: any error is logged and `null` is returned so the sweep
|
|
154
|
+
* falls back to the legacy behaviour (create the review WI with an
|
|
155
|
+
* inferred reason) rather than dropping the cadence tick.
|
|
156
|
+
*
|
|
157
|
+
* @param mission - In-memory mission (mutated with the persisted fields)
|
|
158
|
+
* @returns The review result, or `null` if the review could not run
|
|
159
|
+
*/
|
|
160
|
+
private runDeterministicReview;
|
|
94
161
|
/**
|
|
95
162
|
* Pick the {@link ReviewReason} for this sweep tick.
|
|
96
163
|
*
|
|
@@ -137,9 +204,16 @@ export declare class MissionReminderService {
|
|
|
137
204
|
*/
|
|
138
205
|
private resolveOwnerName;
|
|
139
206
|
/**
|
|
140
|
-
* Load all missions
|
|
207
|
+
* Load all executable missions — `status: 'active'` AND approved (or
|
|
208
|
+
* legacy, no approval metadata). A cascade child still awaiting its
|
|
209
|
+
* owner's approval is skipped so it is neither reminded about nor handed
|
|
210
|
+
* review WorkItems before anyone said yes. See {@link isMissionExecutable}.
|
|
141
211
|
*/
|
|
142
212
|
private loadAllActiveMissions;
|
|
213
|
+
/**
|
|
214
|
+
* Load a single mission from disk (null when missing/corrupt).
|
|
215
|
+
*/
|
|
216
|
+
private loadMission;
|
|
143
217
|
/**
|
|
144
218
|
* Save a mission back to disk.
|
|
145
219
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mission-reminder.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/v3/mission-reminder.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;
|
|
1
|
+
{"version":3,"file":"mission-reminder.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/v3/mission-reminder.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAYH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAUzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAOvE,YAAY,EAAE,YAAY,EAAE,CAAC;AAuE7B;;GAEG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAuC;IAC9D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoB;IACtD;;;;;;;OAOG;IACH,OAAO,CAAC,QAAQ,CAAgC;IAEhD;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB,CAAK;IAE9B;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAgC;IAEhD;;;;;OAKG;IACH,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA6B;IAExD,6EAA6E;IAC7E,OAAO,CAAC,WAAW,CAAqB;IAExC,6EAA6E;IAC7E,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;IAE/C,OAAO;IAMP;;;;;;OAMG;IACH,IAAW,qBAAqB,IAAI,MAAM,CAEzC;IAED;;;;;OAKG;IACH,OAAO,CAAC,WAAW;IAOnB,MAAM,CAAC,WAAW,IAAI,sBAAsB;IAO5C,MAAM,CAAC,aAAa,IAAI,IAAI;IAI5B;;;;;OAKG;IACH,kBAAkB,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI,GAAG,IAAI;IAIrD;;;;;;;;;;;;;;;;;;;OAmBG;IACG,QAAQ,CAAC,KAAK,GAAE,OAAe,GAAG,OAAO,CAAC;QAC9C,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,cAAc,EAAE,MAAM,CAAC;QACvB,cAAc,EAAE,MAAM,CAAC;QACvB,wFAAwF;QACxF,oBAAoB,EAAE,MAAM,CAAC;QAC7B,yFAAyF;QACzF,YAAY,EAAE,MAAM,CAAC;QACrB,mDAAmD;QACnD,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;IAoIF;;;;;;;;OAQG;YACW,yBAAyB;IAoLvC;;;;OAIG;YACW,gBAAgB;IAa9B;;;;;;;;;;OAUG;YACW,WAAW;IAyDzB,mEAAmE;IACnE,OAAO,CAAC,mBAAmB;IAO3B;;;;;;;;;;;OAWG;YACW,sBAAsB;IAmBpC;;;;;;;;;;;;;;;;;OAiBG;IACH,OAAO,CAAC,iBAAiB;IAkBzB;;;;;;;;;;;;OAYG;YACW,sBAAsB;IAcpC;;OAEG;YACW,YAAY;IAoC1B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAoB7B;;OAEG;YACW,gBAAgB;IAqB9B;;;;;OAKG;YACW,qBAAqB;IAuBnC;;OAEG;YACW,WAAW;IASzB;;OAEG;YACW,WAAW;CAI1B"}
|
|
@@ -15,12 +15,17 @@
|
|
|
15
15
|
*/
|
|
16
16
|
import * as fs from 'fs/promises';
|
|
17
17
|
import * as path from 'path';
|
|
18
|
+
import { getMissionsDir } from './mission-paths.js';
|
|
18
19
|
import { CronExpressionParser } from 'cron-parser';
|
|
19
20
|
import { LoggerService } from '../core/logger.service.js';
|
|
20
21
|
import { StorageService } from '../core/storage.service.js';
|
|
21
22
|
import { KRTrackingService } from './kr-tracking.service.js';
|
|
23
|
+
import { OKRReviewService } from './okr-review.service.js';
|
|
24
|
+
import { MissionPeriodService } from './mission-period.service.js';
|
|
25
|
+
import { KRSkillMeasurerService } from './kr-skill-measurer.service.js';
|
|
22
26
|
import { getSlackOrchestratorBridge } from '../slack/slack-orchestrator-bridge.js';
|
|
23
27
|
import { TaskPoolService } from '../task-pool/task-pool.service.js';
|
|
28
|
+
import { isMissionExecutable } from '../../types/v2/mission.types.js';
|
|
24
29
|
import { SLA_TERMINAL_WORK_ITEM_STATUSES } from '../../types/v2/work-item.types.js';
|
|
25
30
|
import { atomicWriteJson } from '../../utils/file-io.utils.js';
|
|
26
31
|
import { pickTeamLead } from '../../utils/team.utils.js';
|
|
@@ -30,6 +35,14 @@ import { ORCHESTRATOR_SESSION_NAME } from '../../constants.js';
|
|
|
30
35
|
// ---------------------------------------------------------------------------
|
|
31
36
|
/** Minimum interval between reminders for the same mission (24 hours) */
|
|
32
37
|
const REMINDER_COOLDOWN_MS = 24 * 60 * 60 * 1000;
|
|
38
|
+
/**
|
|
39
|
+
* Consecutive sweeps a mission must show no active WorkItem AND no fresh
|
|
40
|
+
* KR measurement before it is flagged stale (`mission:stale` published,
|
|
41
|
+
* `staleCycles` bumped). Two sweeps ≈ two hours on the production timer.
|
|
42
|
+
*/
|
|
43
|
+
const STALE_SWEEP_THRESHOLD = 2;
|
|
44
|
+
/** Bounded size of the per-day `mission:stale` publish dedup set. */
|
|
45
|
+
const STALE_DEDUP_CAPACITY = 1000;
|
|
33
46
|
/**
|
|
34
47
|
* Statuses that *clear* a Mission's `pendingReviewWorkItemId` so the next
|
|
35
48
|
* sweep tick can fire a new review. Aliases the canonical
|
|
@@ -54,9 +67,6 @@ const REMINDER_COOLDOWN_MS = 24 * 60 * 60 * 1000;
|
|
|
54
67
|
* and clear the lock when it's in any of the SLA-terminal states.
|
|
55
68
|
*/
|
|
56
69
|
const PENDING_REVIEW_TERMINAL_STATUSES = SLA_TERMINAL_WORK_ITEM_STATUSES;
|
|
57
|
-
function getMissionsDir() {
|
|
58
|
-
return path.join(process.cwd(), '.crewly', 'missions');
|
|
59
|
-
}
|
|
60
70
|
/**
|
|
61
71
|
* Default timezone used when a mission's `policy.executionCadence.workHours`
|
|
62
72
|
* does not specify one. UTC keeps the dedup key globally consistent across
|
|
@@ -104,6 +114,23 @@ export class MissionReminderService {
|
|
|
104
114
|
* {@link cronParseFailureCount} for tests + (future) Prom metric.
|
|
105
115
|
*/
|
|
106
116
|
cronParseFailures = 0;
|
|
117
|
+
/**
|
|
118
|
+
* Optional EventBus for `mission:stale` publication. Wired from the
|
|
119
|
+
* backend boot path via {@link setEventBusService}; when absent the
|
|
120
|
+
* stale detection still bumps `staleCycles` but publishes nothing.
|
|
121
|
+
*/
|
|
122
|
+
eventBus = null;
|
|
123
|
+
/**
|
|
124
|
+
* Consecutive idle sweeps per mission (no active WI + no KR measurement
|
|
125
|
+
* since the previous sweep). In-memory by design — a restart simply
|
|
126
|
+
* restarts the count, and the per-day publish id keeps the downstream
|
|
127
|
+
* review WI idempotent regardless.
|
|
128
|
+
*/
|
|
129
|
+
idleSweeps = new Map();
|
|
130
|
+
/** Wall-clock of the previous sweep (for "measurement since last sweep"). */
|
|
131
|
+
lastSweepAt = null;
|
|
132
|
+
/** `<missionId>:stale:<YYYY-MM-DD>` ids already published (FIFO-bounded). */
|
|
133
|
+
publishedStale = [];
|
|
107
134
|
constructor() {
|
|
108
135
|
this.logger = LoggerService.getInstance().createComponentLogger('MissionReminder');
|
|
109
136
|
this.storageService = StorageService.getInstance();
|
|
@@ -140,6 +167,15 @@ export class MissionReminderService {
|
|
|
140
167
|
static resetInstance() {
|
|
141
168
|
MissionReminderService.instance = null;
|
|
142
169
|
}
|
|
170
|
+
/**
|
|
171
|
+
* Wire the EventBus used to publish `mission:stale`. Idempotent; pass
|
|
172
|
+
* `null` to disable publication (tests / CLI).
|
|
173
|
+
*
|
|
174
|
+
* @param bus - The live EventBusService, or null
|
|
175
|
+
*/
|
|
176
|
+
setEventBusService(bus) {
|
|
177
|
+
this.eventBus = bus;
|
|
178
|
+
}
|
|
143
179
|
/**
|
|
144
180
|
* Run a full sweep of all active missions, sending Slack OKR reminders
|
|
145
181
|
* AND (per REVIEW-1, Phase E pre-beta) creating cadence-driven review
|
|
@@ -162,6 +198,11 @@ export class MissionReminderService {
|
|
|
162
198
|
*/
|
|
163
199
|
async runSweep(force = false) {
|
|
164
200
|
const now = new Date();
|
|
201
|
+
const previousSweepAt = this.lastSweepAt;
|
|
202
|
+
this.lastSweepAt = now;
|
|
203
|
+
// Period lifecycle first: a paused mission whose period just started
|
|
204
|
+
// becomes active and is then picked up by loadAllActiveMissions below.
|
|
205
|
+
await this.reconcilePeriods(now);
|
|
165
206
|
const missions = await this.loadAllActiveMissions();
|
|
166
207
|
const result = {
|
|
167
208
|
checked: 0,
|
|
@@ -169,10 +210,56 @@ export class MissionReminderService {
|
|
|
169
210
|
skipped: 0,
|
|
170
211
|
reviewsCreated: 0,
|
|
171
212
|
reviewsSkipped: 0,
|
|
213
|
+
reviewsAutoContinued: 0,
|
|
214
|
+
staleFlagged: 0,
|
|
215
|
+
skillMeasured: 0,
|
|
172
216
|
};
|
|
173
217
|
this.logger.info('Starting Mission OKR reminder sweep', { count: missions.length });
|
|
218
|
+
// One pool read per sweep for the stale detector (not per mission).
|
|
219
|
+
let poolItems = null;
|
|
220
|
+
if (missions.length > 0) {
|
|
221
|
+
try {
|
|
222
|
+
poolItems = await this.getTaskPool().getAllItems();
|
|
223
|
+
}
|
|
224
|
+
catch (err) {
|
|
225
|
+
this.logger.warn('Stale detection skipped — pool unavailable', {
|
|
226
|
+
error: err instanceof Error ? err.message : String(err),
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
}
|
|
174
230
|
for (const mission of missions) {
|
|
175
231
|
result.checked++;
|
|
232
|
+
// -------------------------------------------------------------------
|
|
233
|
+
// Stale detection: no active WorkItem AND no KR measurement since the
|
|
234
|
+
// previous sweep, for STALE_SWEEP_THRESHOLD consecutive sweeps.
|
|
235
|
+
// -------------------------------------------------------------------
|
|
236
|
+
if (poolItems) {
|
|
237
|
+
try {
|
|
238
|
+
const flagged = await this.detectStale(mission, poolItems, previousSweepAt, now);
|
|
239
|
+
if (flagged)
|
|
240
|
+
result.staleFlagged++;
|
|
241
|
+
}
|
|
242
|
+
catch (err) {
|
|
243
|
+
this.logger.warn('Stale detection failed for mission', {
|
|
244
|
+
missionId: mission.id,
|
|
245
|
+
error: err instanceof Error ? err.message : String(err),
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
// Refresh skill-measured KRs before reading progress, so the sweep
|
|
250
|
+
// reviews this hour's numbers rather than whatever was typed in last.
|
|
251
|
+
try {
|
|
252
|
+
const measured = await KRSkillMeasurerService.getInstance().measureMission(mission.id);
|
|
253
|
+
const recorded = measured.filter((m) => m.status === 'recorded').length;
|
|
254
|
+
if (recorded > 0)
|
|
255
|
+
result.skillMeasured += recorded;
|
|
256
|
+
}
|
|
257
|
+
catch (err) {
|
|
258
|
+
this.logger.warn('skill_output measurement failed for mission', {
|
|
259
|
+
missionId: mission.id,
|
|
260
|
+
error: err instanceof Error ? err.message : String(err),
|
|
261
|
+
});
|
|
262
|
+
}
|
|
176
263
|
let summary = null;
|
|
177
264
|
try {
|
|
178
265
|
// Get OKR progress summary — needed for both the reminder DM
|
|
@@ -225,6 +312,8 @@ export class MissionReminderService {
|
|
|
225
312
|
result.reviewsCreated++;
|
|
226
313
|
else if (created === 'skipped')
|
|
227
314
|
result.reviewsSkipped++;
|
|
315
|
+
else if (created === 'auto_continued')
|
|
316
|
+
result.reviewsAutoContinued++;
|
|
228
317
|
}
|
|
229
318
|
catch (err) {
|
|
230
319
|
this.logger.error('Failed to create mission review WorkItem', {
|
|
@@ -241,7 +330,10 @@ export class MissionReminderService {
|
|
|
241
330
|
* Result of {@link maybeCreateReviewWorkItem} — `'created'` when a new
|
|
242
331
|
* review WorkItem was added to the pool, `'skipped'` when the
|
|
243
332
|
* reentrancy lock or cadence boundary blocked creation, `'noop'` when
|
|
244
|
-
* the mission has no executionCadence configured (legacy missions)
|
|
333
|
+
* the mission has no executionCadence configured (legacy missions),
|
|
334
|
+
* `'auto_continued'` when the cadence boundary fired but the
|
|
335
|
+
* deterministic OKR review recommended `continue` with no off-track KR
|
|
336
|
+
* — the review is persisted on the mission and NO WorkItem is raised.
|
|
245
337
|
*/
|
|
246
338
|
async maybeCreateReviewWorkItem(mission, summary, now) {
|
|
247
339
|
const cadence = mission.policy?.executionCadence;
|
|
@@ -318,23 +410,54 @@ export class MissionReminderService {
|
|
|
318
410
|
}
|
|
319
411
|
}
|
|
320
412
|
// -----------------------------------------------------------------
|
|
413
|
+
// Cadence boundary fired. Run the deterministic OKR review FIRST
|
|
414
|
+
// (aggregate → recommendation, no LLM) so the loop actually closes
|
|
415
|
+
// on the clock instead of only when someone POSTs /okr-review.
|
|
416
|
+
// `executeReview` persists lastReviewSummary / staleCycles /
|
|
417
|
+
// lastReviewAt on disk; we fold those back into our in-memory copy
|
|
418
|
+
// so the single saveMission below does not clobber them.
|
|
419
|
+
// -----------------------------------------------------------------
|
|
420
|
+
const review = await this.runDeterministicReview(mission);
|
|
421
|
+
const cycleId = boundary.toISOString().slice(0, 10);
|
|
422
|
+
const offTrack = (summary?.offTrack ?? 0) > 0 || (review?.okrSummary.offTrack ?? 0) > 0;
|
|
423
|
+
if (review && review.recommendation === 'continue' && !offTrack) {
|
|
424
|
+
// Healthy on the clock: nothing for the TL to decide. Persist the
|
|
425
|
+
// bookkeeping (lastReviewAt from the review, any cleared lock) and
|
|
426
|
+
// move on without waking anyone.
|
|
427
|
+
mission.lastReviewAt = review.reviewedAt;
|
|
428
|
+
await this.saveMission(mission);
|
|
429
|
+
this.logger.info('Mission cadence review: continue — no review WorkItem raised', {
|
|
430
|
+
missionId: mission.id,
|
|
431
|
+
cycleId,
|
|
432
|
+
progress: review.okrSummary.overallProgress,
|
|
433
|
+
staleCycles: mission.staleCycles ?? 0,
|
|
434
|
+
});
|
|
435
|
+
return 'auto_continued';
|
|
436
|
+
}
|
|
437
|
+
// -----------------------------------------------------------------
|
|
321
438
|
// Build the deterministic review WorkItem.
|
|
322
439
|
//
|
|
323
440
|
// The id collapses to the date-form of the boundary so a sweep
|
|
324
441
|
// replay within the same cycle hits the existing addToPool
|
|
325
442
|
// dedup-by-id guard (V1 satisfied without a TaskPoolService change).
|
|
326
443
|
// -----------------------------------------------------------------
|
|
327
|
-
const cycleId = boundary.toISOString().slice(0, 10);
|
|
328
444
|
const reviewWorkItemId = `${mission.id}:review:${cycleId}`;
|
|
329
|
-
const reviewReason = this.inferReviewReason(mission, summary);
|
|
445
|
+
const reviewReason = this.inferReviewReason(mission, summary ?? review?.okrSummary ?? null);
|
|
330
446
|
const target = await this.resolveTeamLeadSession(mission);
|
|
447
|
+
const recommendationLine = review
|
|
448
|
+
? ` Recommendation: ${review.recommendation} (${review.action}) — ` +
|
|
449
|
+
`progress ${review.okrSummary.overallProgress}%, ` +
|
|
450
|
+
`${review.okrSummary.achieved}/${review.okrSummary.totalKRs} KRs achieved, ` +
|
|
451
|
+
`${review.okrSummary.offTrack} off-track, ${review.okrSummary.atRisk} at-risk, ` +
|
|
452
|
+
`staleCycles=${mission.staleCycles ?? 0}.`
|
|
453
|
+
: '';
|
|
331
454
|
const reviewWorkItem = {
|
|
332
455
|
id: reviewWorkItemId,
|
|
333
456
|
type: 'review',
|
|
334
457
|
owner: 'team_lead',
|
|
335
458
|
target,
|
|
336
459
|
title: `Mission review — ${mission.objective.slice(0, 60)}${mission.objective.length > 60 ? '…' : ''}`,
|
|
337
|
-
description: `Cadence-driven review for mission ${mission.id}. Reason: ${reviewReason}
|
|
460
|
+
description: `Cadence-driven review for mission ${mission.id}. Reason: ${reviewReason}.${recommendationLine}`,
|
|
338
461
|
status: 'queued',
|
|
339
462
|
createdAt: now.toISOString(),
|
|
340
463
|
retryCount: 0,
|
|
@@ -349,6 +472,16 @@ export class MissionReminderService {
|
|
|
349
472
|
reviewReason,
|
|
350
473
|
reviewCycleId: cycleId,
|
|
351
474
|
cadenceSchedule: cadence.reviewSchedule,
|
|
475
|
+
...(review
|
|
476
|
+
? {
|
|
477
|
+
recommendation: review.recommendation,
|
|
478
|
+
reviewAction: review.action,
|
|
479
|
+
okrProgress: review.okrSummary.overallProgress,
|
|
480
|
+
okrOffTrack: review.okrSummary.offTrack,
|
|
481
|
+
okrAtRisk: review.okrSummary.atRisk,
|
|
482
|
+
staleCycles: mission.staleCycles ?? 0,
|
|
483
|
+
}
|
|
484
|
+
: {}),
|
|
352
485
|
},
|
|
353
486
|
};
|
|
354
487
|
await this.getTaskPool().addToPool(reviewWorkItem);
|
|
@@ -367,6 +500,116 @@ export class MissionReminderService {
|
|
|
367
500
|
});
|
|
368
501
|
return 'created';
|
|
369
502
|
}
|
|
503
|
+
/**
|
|
504
|
+
* Run {@link MissionPeriodService.reconcile} so period-bound missions
|
|
505
|
+
* auto-activate / get flagged at period end. Previously nothing called
|
|
506
|
+
* reconcile(), so periods never advanced on their own. Failure-soft.
|
|
507
|
+
*/
|
|
508
|
+
async reconcilePeriods(now) {
|
|
509
|
+
try {
|
|
510
|
+
const outcome = await MissionPeriodService.getInstance().reconcile(now);
|
|
511
|
+
if (outcome.activated.length > 0 || outcome.endOfPeriod.length > 0) {
|
|
512
|
+
this.logger.info('Mission periods reconciled', outcome);
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
catch (err) {
|
|
516
|
+
this.logger.warn('Mission period reconcile failed (non-fatal)', {
|
|
517
|
+
error: err instanceof Error ? err.message : String(err),
|
|
518
|
+
});
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
/**
|
|
522
|
+
* Stale detector. A mission is "idle" this sweep when it has no
|
|
523
|
+
* non-terminal WorkItem in the pool AND no KR measurement recorded since
|
|
524
|
+
* the previous sweep. After {@link STALE_SWEEP_THRESHOLD} consecutive
|
|
525
|
+
* idle sweeps the mission's `staleCycles` is bumped, persisted, and a
|
|
526
|
+
* `mission:stale` event is published with the idempotent id
|
|
527
|
+
* `<missionId>:stale:<YYYY-MM-DD>` (once per mission per UTC day). The
|
|
528
|
+
* bridge turns that into a `no_active_work` review WorkItem.
|
|
529
|
+
*
|
|
530
|
+
* @returns `true` when the mission was flagged stale on this sweep
|
|
531
|
+
*/
|
|
532
|
+
async detectStale(mission, poolItems, previousSweepAt, now) {
|
|
533
|
+
const hasActiveWork = poolItems.some((wi) => wi.missionId === mission.id && !SLA_TERMINAL_WORK_ITEM_STATUSES.has(wi.status));
|
|
534
|
+
const krs = await this.krTrackingService.listByMission(mission.id);
|
|
535
|
+
const measuredSinceLastSweep = previousSweepAt !== null && this.hasMeasurementSince(krs, previousSweepAt);
|
|
536
|
+
if (hasActiveWork || measuredSinceLastSweep) {
|
|
537
|
+
this.idleSweeps.delete(mission.id);
|
|
538
|
+
return false;
|
|
539
|
+
}
|
|
540
|
+
const idle = (this.idleSweeps.get(mission.id) ?? 0) + 1;
|
|
541
|
+
this.idleSweeps.set(mission.id, idle);
|
|
542
|
+
if (idle < STALE_SWEEP_THRESHOLD)
|
|
543
|
+
return false;
|
|
544
|
+
const day = now.toISOString().slice(0, 10);
|
|
545
|
+
const eventId = `${mission.id}:stale:${day}`;
|
|
546
|
+
if (this.publishedStale.includes(eventId))
|
|
547
|
+
return false;
|
|
548
|
+
this.publishedStale.push(eventId);
|
|
549
|
+
if (this.publishedStale.length > STALE_DEDUP_CAPACITY)
|
|
550
|
+
this.publishedStale.shift();
|
|
551
|
+
mission.staleCycles = (mission.staleCycles ?? 0) + 1;
|
|
552
|
+
await this.saveMission(mission);
|
|
553
|
+
if (this.eventBus) {
|
|
554
|
+
this.eventBus.publish({
|
|
555
|
+
id: eventId,
|
|
556
|
+
type: 'mission:stale',
|
|
557
|
+
timestamp: now.toISOString(),
|
|
558
|
+
teamId: mission.ownerTeamId,
|
|
559
|
+
teamName: '',
|
|
560
|
+
memberId: '',
|
|
561
|
+
memberName: '',
|
|
562
|
+
sessionName: '',
|
|
563
|
+
previousValue: String(mission.staleCycles - 1),
|
|
564
|
+
newValue: String(mission.staleCycles),
|
|
565
|
+
changedField: 'taskStatus',
|
|
566
|
+
missionId: mission.id,
|
|
567
|
+
});
|
|
568
|
+
}
|
|
569
|
+
this.logger.info('Mission flagged stale', {
|
|
570
|
+
missionId: mission.id,
|
|
571
|
+
idleSweeps: idle,
|
|
572
|
+
staleCycles: mission.staleCycles,
|
|
573
|
+
published: this.eventBus !== null,
|
|
574
|
+
});
|
|
575
|
+
return true;
|
|
576
|
+
}
|
|
577
|
+
/** Whether any KR carries a measurement taken at/after `since`. */
|
|
578
|
+
hasMeasurementSince(krs, since) {
|
|
579
|
+
const sinceMs = since.getTime();
|
|
580
|
+
return krs.some((kr) => (kr.measurements ?? []).some((m) => new Date(m.measuredAt).getTime() >= sinceMs));
|
|
581
|
+
}
|
|
582
|
+
/**
|
|
583
|
+
* Run {@link OKRReviewService.executeReview} for a mission at its cadence
|
|
584
|
+
* boundary and fold the persisted bookkeeping (`lastReviewSummary`,
|
|
585
|
+
* `staleCycles`, `lastReviewAt`) back into the caller's in-memory copy.
|
|
586
|
+
*
|
|
587
|
+
* Failure-soft: any error is logged and `null` is returned so the sweep
|
|
588
|
+
* falls back to the legacy behaviour (create the review WI with an
|
|
589
|
+
* inferred reason) rather than dropping the cadence tick.
|
|
590
|
+
*
|
|
591
|
+
* @param mission - In-memory mission (mutated with the persisted fields)
|
|
592
|
+
* @returns The review result, or `null` if the review could not run
|
|
593
|
+
*/
|
|
594
|
+
async runDeterministicReview(mission) {
|
|
595
|
+
try {
|
|
596
|
+
const review = await OKRReviewService.getInstance().executeReview(mission.id);
|
|
597
|
+
const persisted = await this.loadMission(mission.id);
|
|
598
|
+
if (persisted) {
|
|
599
|
+
mission.lastReviewSummary = persisted.lastReviewSummary;
|
|
600
|
+
mission.staleCycles = persisted.staleCycles;
|
|
601
|
+
mission.lastReviewAt = persisted.lastReviewAt;
|
|
602
|
+
}
|
|
603
|
+
return review;
|
|
604
|
+
}
|
|
605
|
+
catch (err) {
|
|
606
|
+
this.logger.warn('Deterministic OKR review failed at cadence boundary — falling back to review WI', {
|
|
607
|
+
missionId: mission.id,
|
|
608
|
+
error: err instanceof Error ? err.message : String(err),
|
|
609
|
+
});
|
|
610
|
+
return null;
|
|
611
|
+
}
|
|
612
|
+
}
|
|
370
613
|
/**
|
|
371
614
|
* Pick the {@link ReviewReason} for this sweep tick.
|
|
372
615
|
*
|
|
@@ -507,7 +750,10 @@ cc: @${ORCHESTRATOR_SESSION_NAME}`;
|
|
|
507
750
|
return 'Team Lead';
|
|
508
751
|
}
|
|
509
752
|
/**
|
|
510
|
-
* Load all missions
|
|
753
|
+
* Load all executable missions — `status: 'active'` AND approved (or
|
|
754
|
+
* legacy, no approval metadata). A cascade child still awaiting its
|
|
755
|
+
* owner's approval is skipped so it is neither reminded about nor handed
|
|
756
|
+
* review WorkItems before anyone said yes. See {@link isMissionExecutable}.
|
|
511
757
|
*/
|
|
512
758
|
async loadAllActiveMissions() {
|
|
513
759
|
const dir = getMissionsDir();
|
|
@@ -520,7 +766,7 @@ cc: @${ORCHESTRATOR_SESSION_NAME}`;
|
|
|
520
766
|
try {
|
|
521
767
|
const raw = await fs.readFile(path.join(dir, file), 'utf-8');
|
|
522
768
|
const mission = JSON.parse(raw);
|
|
523
|
-
if (mission
|
|
769
|
+
if (isMissionExecutable(mission)) {
|
|
524
770
|
missions.push(mission);
|
|
525
771
|
}
|
|
526
772
|
}
|
|
@@ -534,6 +780,18 @@ cc: @${ORCHESTRATOR_SESSION_NAME}`;
|
|
|
534
780
|
return [];
|
|
535
781
|
}
|
|
536
782
|
}
|
|
783
|
+
/**
|
|
784
|
+
* Load a single mission from disk (null when missing/corrupt).
|
|
785
|
+
*/
|
|
786
|
+
async loadMission(missionId) {
|
|
787
|
+
try {
|
|
788
|
+
const raw = await fs.readFile(path.join(getMissionsDir(), `${missionId}.json`), 'utf-8');
|
|
789
|
+
return JSON.parse(raw);
|
|
790
|
+
}
|
|
791
|
+
catch {
|
|
792
|
+
return null;
|
|
793
|
+
}
|
|
794
|
+
}
|
|
537
795
|
/**
|
|
538
796
|
* Save a mission back to disk.
|
|
539
797
|
*/
|