crewly 1.14.1 → 1.15.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 +28 -0
- 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/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/skills/_common/lib.sh +124 -2
- package/config/skills/_common/lib.test.sh +68 -1
- 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 +100 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +88 -1
- package/dist/backend/backend/src/constants.js.map +1 -1
- 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/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/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 +16 -1
- package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts +12 -0
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +187 -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 +3 -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 +68 -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 +280 -10
- 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/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 +50 -1
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.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/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 +42 -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/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/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/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/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/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-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 +74 -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 +251 -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 +16 -0
- 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/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/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 +100 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +88 -1
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts +68 -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 +280 -10
- 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/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 +50 -1
- package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.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 +42 -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/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/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/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 +16 -0
- 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/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/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/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-203224f9.js +4961 -0
- package/frontend/dist/assets/index-dcaf6c88.css +42 -0
- package/frontend/dist/index.html +2 -2
- package/package.json +3 -2
- package/frontend/dist/assets/index-190a957f.js +0 -4961
- package/frontend/dist/assets/index-88feb412.css +0 -42
|
@@ -22,7 +22,7 @@ import { TerminalGateway, setTerminalGateway } from './websocket/terminal.gatewa
|
|
|
22
22
|
import { initializeChatGateway } from './websocket/chat.gateway.js';
|
|
23
23
|
import { LoggerService } from './services/core/logger.service.js';
|
|
24
24
|
import { retryWithBackoff } from './services/core/retry.util.js';
|
|
25
|
-
import { CREWLY_CONSTANTS, ORCHESTRATOR_SESSION_NAME, ORCHESTRATOR_ROLE, ORCHESTRATOR_WINDOW_NAME, MESSAGE_QUEUE_CONSTANTS, RUNTIME_TYPES, AUDITOR_CONSTANTS, AUDITOR_SCHEDULER_CONSTANTS, } from './constants.js';
|
|
25
|
+
import { CREWLY_CONSTANTS, ORCHESTRATOR_SESSION_NAME, ORCHESTRATOR_ROLE, ORCHESTRATOR_WINDOW_NAME, MESSAGE_QUEUE_CONSTANTS, RUNTIME_TYPES, AUDITOR_CONSTANTS, AUDITOR_SCHEDULER_CONSTANTS, API_SECURITY_CONSTANTS, } from './constants.js';
|
|
26
26
|
import { getSettingsService } from './services/settings/index.js';
|
|
27
27
|
import { MemoryService } from './services/memory/memory.service.js';
|
|
28
28
|
import { getImprovementStartupService } from './services/orchestrator/improvement-startup.service.js';
|
|
@@ -35,6 +35,12 @@ import { MessageQueueService, QueueProcessorService, ResponseRouterService } fro
|
|
|
35
35
|
import { ThreadStatusQueueService } from './services/messaging/thread-status-queue.service.js';
|
|
36
36
|
import { EventBusService } from './services/event-bus/index.js';
|
|
37
37
|
import { EventToWorkItemBridge } from './services/event-bus/event-to-workitem-bridge.service.js';
|
|
38
|
+
import { KRCompletionSubscriber } from './services/v3/kr-completion.subscriber.js';
|
|
39
|
+
import { MissionReminderService } from './services/v3/mission-reminder.service.js';
|
|
40
|
+
import { OKRReviewService } from './services/v3/okr-review.service.js';
|
|
41
|
+
import { bootEscalationService } from './services/v3/escalation-boot.js';
|
|
42
|
+
import { TeamBudgetGateService } from './services/budget/team-budget-gate.service.js';
|
|
43
|
+
import { HierarchyEscalationMonitor } from './services/hierarchy/hierarchy-escalation-monitor.service.js';
|
|
38
44
|
import { AutoLearningSubscriber } from './services/memory/auto-learning.subscriber.js';
|
|
39
45
|
import { MilestoneNotificationSubscriber } from './services/notification/milestone-notification.subscriber.js';
|
|
40
46
|
import { RequestSlaSubscriber, setRequestSlaSubscriber, getRequestSlaSubscriber, } from './services/v3/request-sla.subscriber.js';
|
|
@@ -56,6 +62,9 @@ import { setMessageQueueService as setMessagingControllerQueueService } from './
|
|
|
56
62
|
import { SystemResourceAlertService } from './services/monitoring/system-resource-alert.service.js';
|
|
57
63
|
import { TokenUsageService } from './services/monitoring/token-usage.service.js';
|
|
58
64
|
import { agentHeartbeatMiddleware } from './middleware/agent-heartbeat.middleware.js';
|
|
65
|
+
import { apiTokenMiddleware, socketIoAllowRequest, installWebSocketGate, } from './middleware/api-token.middleware.js';
|
|
66
|
+
import { resolveApiToken } from './services/core/api-token.service.js';
|
|
67
|
+
import { isHeadlessEnvironment, describeNetworkExposure } from './utils/network-exposure.utils.js';
|
|
59
68
|
import { RedisCacheService } from './services/cache/redis-cache.service.js';
|
|
60
69
|
import { OrchestratorRestartService } from './services/orchestrator/orchestrator-restart.service.js';
|
|
61
70
|
import { setOrchestratorSetupDependencies } from './services/orchestrator/orchestrator-setup.service.js';
|
|
@@ -66,6 +75,7 @@ import { OrchestratorHeartbeatMonitorService } from './services/orchestrator/orc
|
|
|
66
75
|
import { RuntimeExitMonitorService } from './services/agent/runtime-exit-monitor.service.js';
|
|
67
76
|
import { ContextWindowMonitorService } from './services/agent/context-window-monitor.service.js';
|
|
68
77
|
import { OAuthReloginMonitorService } from './services/agent/oauth-relogin-monitor.service.js';
|
|
78
|
+
import { getChatV2Service } from './services/chat-v2/chat-v2.singleton.js';
|
|
69
79
|
import { findPackageRoot } from './utils/package-root.js';
|
|
70
80
|
import { assertBuildProvenance } from './utils/build-provenance.js';
|
|
71
81
|
import { isNativeBindingFatalError } from './utils/native-binding.utils.js';
|
|
@@ -146,6 +156,9 @@ export class CrewlyServer {
|
|
|
146
156
|
eventBusService;
|
|
147
157
|
/** BRIDGE-1: subscribes to autonomy events and creates WorkItems. */
|
|
148
158
|
eventToWorkItemBridge = null;
|
|
159
|
+
krCompletionSubscriber = null;
|
|
160
|
+
escalationService = null;
|
|
161
|
+
hierarchyEscalationMonitor = null;
|
|
149
162
|
/** LEARN-1: subscribes to terminal task / mission:replanned events and auto-records learnings. */
|
|
150
163
|
autoLearningSubscriber = null;
|
|
151
164
|
// DF-1 #438 — symmetric to AutoLearningSubscriber; surfaces milestones
|
|
@@ -188,6 +201,9 @@ export class CrewlyServer {
|
|
|
188
201
|
parseIntWithFallback(process.env.DEFAULT_CHECK_INTERVAL, 30, 'DEFAULT_CHECK_INTERVAL'),
|
|
189
202
|
autoCommitInterval: config?.autoCommitInterval || parseIntWithFallback(process.env.AUTO_COMMIT_INTERVAL, 30, 'AUTO_COMMIT_INTERVAL'),
|
|
190
203
|
headless: config?.headless ?? process.env.CREWLY_HEADLESS === 'true',
|
|
204
|
+
bindHost: config?.bindHost ||
|
|
205
|
+
process.env[API_SECURITY_CONSTANTS.ENV.BIND_HOST] ||
|
|
206
|
+
API_SECURITY_CONSTANTS.DEFAULT_BIND_HOST,
|
|
191
207
|
};
|
|
192
208
|
this.app = express();
|
|
193
209
|
this.httpServer = createServer(this.app);
|
|
@@ -214,6 +230,10 @@ export class CrewlyServer {
|
|
|
214
230
|
// that doesn't match /socket.io/ — killing Crewly in Chrome connections before
|
|
215
231
|
// any data is exchanged (manifests as "Invalid frame header" errors).
|
|
216
232
|
destroyUpgrade: false,
|
|
233
|
+
// Non-loopback clients must present the API token (query `token`
|
|
234
|
+
// or the `crewly_token` cookie). Engine.IO's polling handshake
|
|
235
|
+
// bypasses Express, so the gate has to live here as well.
|
|
236
|
+
allowRequest: socketIoAllowRequest,
|
|
217
237
|
});
|
|
218
238
|
this.initializeServices();
|
|
219
239
|
this.configureMiddleware();
|
|
@@ -275,6 +295,15 @@ export class CrewlyServer {
|
|
|
275
295
|
// triggers addToPool — the slack listener / TaskPool router below both
|
|
276
296
|
// depend on this for the auto-close path b chain. Idempotent.
|
|
277
297
|
TaskPoolService.getInstance().setEventBusService(this.eventBusService);
|
|
298
|
+
// Team budget gate (Team.budget was stored + prompt-injected but never
|
|
299
|
+
// evaluated). Enforced in claimFromPool + WorkItemDispatchSubscriber;
|
|
300
|
+
// here we give it the bus + queue so cap crossings reach the owner.
|
|
301
|
+
const teamBudgetGate = TeamBudgetGateService.getInstance();
|
|
302
|
+
teamBudgetGate.setNotifiers({
|
|
303
|
+
eventBus: this.eventBusService,
|
|
304
|
+
messageQueue: this.messageQueueService,
|
|
305
|
+
});
|
|
306
|
+
TaskPoolService.getInstance().setTeamBudgetGate(teamBudgetGate);
|
|
278
307
|
// Memory: TaskHistorySubscriber listens on the bus for
|
|
279
308
|
// task:done_by_worker / task:rejected / task:cancelled and writes
|
|
280
309
|
// the resulting TaskHistoryEntry into ProjectMemory. This is the
|
|
@@ -479,6 +508,10 @@ export class CrewlyServer {
|
|
|
479
508
|
// actually delivers OR the budget is exhausted.
|
|
480
509
|
try {
|
|
481
510
|
const { OrcDeliveryEnforcerService } = await import('./services/orc/orc-delivery-enforcer.service.js');
|
|
511
|
+
const [{ getChatV2Service }, { synthesizeSlackConversationId }] = await Promise.all([
|
|
512
|
+
import('./services/chat-v2/chat-v2.singleton.js'),
|
|
513
|
+
import('./services/chat-v2/legacy-dto.utils.js'),
|
|
514
|
+
]);
|
|
482
515
|
const enforcer = new OrcDeliveryEnforcerService({
|
|
483
516
|
reminderSink: ({ conversationId, text }) => {
|
|
484
517
|
if (!this.messageQueueService)
|
|
@@ -489,6 +522,12 @@ export class CrewlyServer {
|
|
|
489
522
|
source: 'system_event',
|
|
490
523
|
});
|
|
491
524
|
},
|
|
525
|
+
// Issue #731: let the enforcer see the thread's real activity
|
|
526
|
+
// (owner silence → don't track; reply via any path → stop).
|
|
527
|
+
// Every Slack thread is a chat-v2 channel keyed by its
|
|
528
|
+
// synthesized conversation id, and every outbound Slack
|
|
529
|
+
// reply is mirrored into it.
|
|
530
|
+
threadActivityProvider: ({ channelId, threadTs }) => getChatV2Service().getChannelActivity(synthesizeSlackConversationId(channelId, threadTs)),
|
|
492
531
|
});
|
|
493
532
|
OrcDeliveryEnforcerService.setInstance(enforcer);
|
|
494
533
|
enforcer.start();
|
|
@@ -521,6 +560,23 @@ export class CrewlyServer {
|
|
|
521
560
|
// for idempotency contract + retry cap + cron-recursion guard.
|
|
522
561
|
this.eventToWorkItemBridge = EventToWorkItemBridge.boot(this.eventBusService);
|
|
523
562
|
this.eventToWorkItemBridge.start();
|
|
563
|
+
// OKR loop closure: auto-measure `task_completion` KRs from task:done /
|
|
564
|
+
// task:verified and publish `team:all_tasks_done` when a mission has no
|
|
565
|
+
// active WorkItems left (the bridge turns that into a review WI). See
|
|
566
|
+
// `kr-completion.subscriber.ts`.
|
|
567
|
+
this.krCompletionSubscriber = KRCompletionSubscriber.boot(this.eventBusService);
|
|
568
|
+
this.krCompletionSubscriber.start();
|
|
569
|
+
// OKR loop closure: give the reminder sweep (mission:stale) and the
|
|
570
|
+
// review service (mission:replanned) a bus to publish on. Both were
|
|
571
|
+
// declared + bridged events with no publisher before this.
|
|
572
|
+
MissionReminderService.getInstance().setEventBusService(this.eventBusService);
|
|
573
|
+
OKRReviewService.getInstance().setEventBusService(this.eventBusService);
|
|
574
|
+
// Hierarchy escalation: a TL that has not acted on a worker's
|
|
575
|
+
// verification handoff within 15 min triggers the documented bypass to
|
|
576
|
+
// the orchestrator (`hierarchy:escalation` + [ESCALATION] queue message).
|
|
577
|
+
// HierarchyEscalationService had the rules but no runtime consumer.
|
|
578
|
+
this.hierarchyEscalationMonitor = HierarchyEscalationMonitor.boot(this.eventBusService, this.messageQueueService);
|
|
579
|
+
this.hierarchyEscalationMonitor.start();
|
|
524
580
|
// LEARN-1: subscribe to terminal task / mission:replanned events and
|
|
525
581
|
// auto-record a learning entry via MemoryService.recordLearning. Closes
|
|
526
582
|
// the prompt-driven "agents-forget-to-record" gap. See
|
|
@@ -908,6 +964,10 @@ export class CrewlyServer {
|
|
|
908
964
|
// Note: Static files are configured in configureRoutes() after API routes
|
|
909
965
|
}
|
|
910
966
|
configureRoutes() {
|
|
967
|
+
// API token gate — loopback callers (local skills, local dashboard)
|
|
968
|
+
// pass; every other address must present the API token. `/health`,
|
|
969
|
+
// static assets and the SPA shell are outside `/api` and stay open.
|
|
970
|
+
this.app.use('/api', apiTokenMiddleware);
|
|
911
971
|
// Agent heartbeat middleware - any API call with X-Agent-Session header updates heartbeat
|
|
912
972
|
this.app.use('/api', agentHeartbeatMiddleware);
|
|
913
973
|
// API routes
|
|
@@ -1291,12 +1351,44 @@ export class CrewlyServer {
|
|
|
1291
1351
|
error: error instanceof Error ? error.message : String(error),
|
|
1292
1352
|
});
|
|
1293
1353
|
}
|
|
1294
|
-
// Wire OAuthReloginMonitorService
|
|
1354
|
+
// Wire OAuthReloginMonitorService: event bus, orchestrator queue,
|
|
1355
|
+
// chat + Slack sinks for the owner-facing login notice, and the
|
|
1356
|
+
// boot-level sign-in-screen sweep (server-install finding 7).
|
|
1295
1357
|
try {
|
|
1296
|
-
OAuthReloginMonitorService.getInstance()
|
|
1358
|
+
const oauthMonitor = OAuthReloginMonitorService.getInstance();
|
|
1359
|
+
oauthMonitor.setEventBusService(this.eventBusService);
|
|
1360
|
+
oauthMonitor.setNoticeQueue(this.messageQueueService);
|
|
1361
|
+
oauthMonitor.setSlackProvider(async () => {
|
|
1362
|
+
const slack = getSlackService();
|
|
1363
|
+
return slack.isConnected() ? slack : null;
|
|
1364
|
+
});
|
|
1365
|
+
oauthMonitor.setChatProvider(() => {
|
|
1366
|
+
const gateway = this.terminalGateway;
|
|
1367
|
+
if (!gateway)
|
|
1368
|
+
return null;
|
|
1369
|
+
return {
|
|
1370
|
+
getActiveConversationId: () => gateway.getActiveConversationId(),
|
|
1371
|
+
recordSystemTurn: (conversationId, content) => {
|
|
1372
|
+
const chatV2 = getChatV2Service();
|
|
1373
|
+
const channel = chatV2.ensureChannelForLegacyConversation({
|
|
1374
|
+
conversationId,
|
|
1375
|
+
agentSession: ORCHESTRATOR_SESSION_NAME,
|
|
1376
|
+
});
|
|
1377
|
+
chatV2.recordTurn({
|
|
1378
|
+
channelId: channel.id,
|
|
1379
|
+
senderType: 'system',
|
|
1380
|
+
senderId: 'system',
|
|
1381
|
+
content,
|
|
1382
|
+
metadata: { source: 'system' },
|
|
1383
|
+
});
|
|
1384
|
+
},
|
|
1385
|
+
broadcastSystemNotification: (message, type) => gateway.broadcastSystemNotification(message, type),
|
|
1386
|
+
};
|
|
1387
|
+
});
|
|
1388
|
+
oauthMonitor.start();
|
|
1297
1389
|
}
|
|
1298
1390
|
catch (error) {
|
|
1299
|
-
this.logger.warn('Failed to wire OAuthReloginMonitorService
|
|
1391
|
+
this.logger.warn('Failed to wire OAuthReloginMonitorService (non-critical)', {
|
|
1300
1392
|
error: error instanceof Error ? error.message : String(error),
|
|
1301
1393
|
});
|
|
1302
1394
|
}
|
|
@@ -1832,6 +1924,15 @@ export class CrewlyServer {
|
|
|
1832
1924
|
});
|
|
1833
1925
|
await triggerEngine.start();
|
|
1834
1926
|
this.logger.info('TriggerEngine started with action handler wired');
|
|
1927
|
+
// MissionPolicy escalation loop (every 5 min: cost/time/failure rules →
|
|
1928
|
+
// notify/pause/block). Sequenced AFTER the action handler above because
|
|
1929
|
+
// EscalationService.start() wraps the installed handler and delegates
|
|
1930
|
+
// non-escalation triggers back to it. Gated by CREWLY_ESCALATION_ENABLED
|
|
1931
|
+
// (default on); a no-op when no mission carries escalation rules.
|
|
1932
|
+
this.escalationService = await bootEscalationService({
|
|
1933
|
+
messageQueue: this.messageQueueService,
|
|
1934
|
+
logger: this.logger,
|
|
1935
|
+
});
|
|
1835
1936
|
// Wire team-scoped triggers: reconcile declarative Team.triggers spec
|
|
1836
1937
|
// against the running engine on every team save, and cancel all of a
|
|
1837
1938
|
// team's triggers when it's deleted. Listener is fire-and-forget.
|
|
@@ -1894,6 +1995,7 @@ export class CrewlyServer {
|
|
|
1894
1995
|
try {
|
|
1895
1996
|
const { WorkItemDispatchSubscriber } = await import('./services/v3/workitem-dispatch.subscriber.js');
|
|
1896
1997
|
const dispatchSubscriber = WorkItemDispatchSubscriber.getInstance();
|
|
1998
|
+
dispatchSubscriber.setTeamBudgetGate(TeamBudgetGateService.getInstance());
|
|
1897
1999
|
dispatchSubscriber.initialize(this.eventBusService);
|
|
1898
2000
|
dispatchSubscriber.start();
|
|
1899
2001
|
this.logger.info('WorkItemDispatchSubscriber started — workitem:queued events push to target sessions');
|
|
@@ -2067,6 +2169,12 @@ export class CrewlyServer {
|
|
|
2067
2169
|
const loadedAddons = await addonLoader.loadAddons(this.app, this.httpServer);
|
|
2068
2170
|
if (loadedAddons.length > 0) {
|
|
2069
2171
|
this.logger.info('Addons loaded successfully', { addons: loadedAddons });
|
|
2172
|
+
// An addon that attaches its own WebSocket gateway wraps
|
|
2173
|
+
// `httpServer.emit` after our gate did; re-install so the
|
|
2174
|
+
// gate is outermost again (double-wrapping is harmless —
|
|
2175
|
+
// an allowed upgrade passes both, a refused one is
|
|
2176
|
+
// answered once by the outer wrapper).
|
|
2177
|
+
installWebSocketGate(this.httpServer);
|
|
2070
2178
|
}
|
|
2071
2179
|
}
|
|
2072
2180
|
catch (addonErr) {
|
|
@@ -2669,9 +2777,9 @@ export class CrewlyServer {
|
|
|
2669
2777
|
const { createServer } = await import('net');
|
|
2670
2778
|
const testServer = createServer();
|
|
2671
2779
|
return new Promise((resolve, reject) => {
|
|
2672
|
-
testServer.listen(this.config.webPort, () => {
|
|
2780
|
+
testServer.listen(this.config.webPort, this.config.bindHost, () => {
|
|
2673
2781
|
testServer.close(() => {
|
|
2674
|
-
this.logger.info('Port is available', { port: this.config.webPort });
|
|
2782
|
+
this.logger.info('Port is available', { port: this.config.webPort, host: this.config.bindHost });
|
|
2675
2783
|
resolve();
|
|
2676
2784
|
});
|
|
2677
2785
|
});
|
|
@@ -2685,18 +2793,63 @@ export class CrewlyServer {
|
|
|
2685
2793
|
});
|
|
2686
2794
|
});
|
|
2687
2795
|
}
|
|
2796
|
+
/**
|
|
2797
|
+
* Log where the API token lives and how reachable the API is.
|
|
2798
|
+
*
|
|
2799
|
+
* Resolving the token here also performs the first-boot generation so
|
|
2800
|
+
* the file exists (0600) before the first non-loopback caller arrives.
|
|
2801
|
+
* Emits a WARN for a headless install that binds every interface with
|
|
2802
|
+
* neither `CREWLY_BIND_HOST` nor `CREWLY_API_TOKEN` set.
|
|
2803
|
+
*/
|
|
2804
|
+
logNetworkExposure() {
|
|
2805
|
+
try {
|
|
2806
|
+
const token = resolveApiToken();
|
|
2807
|
+
const summary = describeNetworkExposure({
|
|
2808
|
+
bindHost: this.config.bindHost,
|
|
2809
|
+
port: this.config.webPort,
|
|
2810
|
+
bindHostExplicit: Boolean(process.env[API_SECURITY_CONSTANTS.ENV.BIND_HOST]),
|
|
2811
|
+
tokenSource: token.source,
|
|
2812
|
+
tokenFilePath: token.filePath,
|
|
2813
|
+
headless: this.config.headless || isHeadlessEnvironment(),
|
|
2814
|
+
});
|
|
2815
|
+
if (token.source === 'generated') {
|
|
2816
|
+
this.logger.info('Generated API token for non-loopback callers', {
|
|
2817
|
+
file: token.filePath,
|
|
2818
|
+
usage: 'crewly token | curl -H "X-Crewly-Token: $(crewly token)" http://<host>:<port>/api/teams',
|
|
2819
|
+
});
|
|
2820
|
+
}
|
|
2821
|
+
if (summary.level === 'warn') {
|
|
2822
|
+
this.logger.warn(summary.message, summary.details);
|
|
2823
|
+
}
|
|
2824
|
+
else {
|
|
2825
|
+
this.logger.info(summary.message, summary.details);
|
|
2826
|
+
}
|
|
2827
|
+
}
|
|
2828
|
+
catch (error) {
|
|
2829
|
+
this.logger.error('Failed to resolve API token', {
|
|
2830
|
+
error: error instanceof Error ? error.message : String(error),
|
|
2831
|
+
});
|
|
2832
|
+
}
|
|
2833
|
+
}
|
|
2688
2834
|
async startHttpServer() {
|
|
2689
2835
|
return new Promise((resolve, reject) => {
|
|
2690
2836
|
const startTime = Date.now();
|
|
2691
|
-
|
|
2837
|
+
// Outermost upgrade wrapper: every gateway (Socket.IO, browser
|
|
2838
|
+
// bridge, chat-v2, terminal) has attached by now, so this gate
|
|
2839
|
+
// runs before any of them sees a non-loopback upgrade.
|
|
2840
|
+
installWebSocketGate(this.httpServer);
|
|
2841
|
+
this.httpServer.listen(this.config.webPort, this.config.bindHost, () => {
|
|
2692
2842
|
const duration = Date.now() - startTime;
|
|
2693
2843
|
this.logger.info('Crewly server started', {
|
|
2844
|
+
host: this.config.bindHost,
|
|
2694
2845
|
port: this.config.webPort,
|
|
2846
|
+
listening: `${this.config.bindHost}:${this.config.webPort}`,
|
|
2695
2847
|
durationMs: duration,
|
|
2696
2848
|
dashboardUrl: `http://localhost:${this.config.webPort}`,
|
|
2697
2849
|
websocketUrl: `ws://localhost:${this.config.webPort}`,
|
|
2698
2850
|
home: this.config.crewlyHome
|
|
2699
2851
|
});
|
|
2852
|
+
this.logNetworkExposure();
|
|
2700
2853
|
// B0 (interim) per `.crewly/specs/2026-05-05-trigger-persistence-bug.md`:
|
|
2701
2854
|
// Broadcast `system:backend_restarted` exactly once per boot. The
|
|
2702
2855
|
// trigger engine (`backend/src/services/v3/trigger-engine.service.ts`)
|
|
@@ -2831,7 +2984,6 @@ export class CrewlyServer {
|
|
|
2831
2984
|
// Scans active missions and sends Slack alerts for off-track KRs
|
|
2832
2985
|
setInterval(async () => {
|
|
2833
2986
|
try {
|
|
2834
|
-
const { MissionReminderService } = await import('./services/v3/mission-reminder.service.js');
|
|
2835
2987
|
await MissionReminderService.getInstance().runSweep();
|
|
2836
2988
|
}
|
|
2837
2989
|
catch (err) {
|
|
@@ -2844,7 +2996,6 @@ export class CrewlyServer {
|
|
|
2844
2996
|
setTimeout(() => this.purgeCompletedData(), 30 * 1000);
|
|
2845
2997
|
setTimeout(async () => {
|
|
2846
2998
|
try {
|
|
2847
|
-
const { MissionReminderService } = await import('./services/v3/mission-reminder.service.js');
|
|
2848
2999
|
await MissionReminderService.getInstance().runSweep();
|
|
2849
3000
|
}
|
|
2850
3001
|
catch (err) {
|
|
@@ -3187,6 +3338,21 @@ export class CrewlyServer {
|
|
|
3187
3338
|
this.eventToWorkItemBridge.stop();
|
|
3188
3339
|
this.eventToWorkItemBridge = null;
|
|
3189
3340
|
}
|
|
3341
|
+
if (this.krCompletionSubscriber) {
|
|
3342
|
+
this.krCompletionSubscriber.stop();
|
|
3343
|
+
this.krCompletionSubscriber = null;
|
|
3344
|
+
}
|
|
3345
|
+
if (this.escalationService) {
|
|
3346
|
+
try {
|
|
3347
|
+
await this.escalationService.stop();
|
|
3348
|
+
}
|
|
3349
|
+
catch { /* best-effort */ }
|
|
3350
|
+
this.escalationService = null;
|
|
3351
|
+
}
|
|
3352
|
+
if (this.hierarchyEscalationMonitor) {
|
|
3353
|
+
this.hierarchyEscalationMonitor.stop();
|
|
3354
|
+
this.hierarchyEscalationMonitor = null;
|
|
3355
|
+
}
|
|
3190
3356
|
// LEARN-1: stop the AutoLearningSubscriber on the same window as the
|
|
3191
3357
|
// bridge so its in-flight recordLearning calls drain before the bus
|
|
3192
3358
|
// is cleaned.
|
|
@@ -3255,6 +3421,18 @@ export class CrewlyServer {
|
|
|
3255
3421
|
LogRotationService.getInstance().stop();
|
|
3256
3422
|
// Stop auditor scheduler
|
|
3257
3423
|
AuditorSchedulerService.getInstance().stop();
|
|
3424
|
+
// Persist the token ledger: it flushes every 5 minutes, so a restart
|
|
3425
|
+
// used to drop everything recorded since the last tick (2026-09-18).
|
|
3426
|
+
try {
|
|
3427
|
+
const ledger = TokenUsageService.getInstance();
|
|
3428
|
+
ledger.stopPeriodicFlush();
|
|
3429
|
+
await ledger.flushToDisk();
|
|
3430
|
+
}
|
|
3431
|
+
catch (flushErr) {
|
|
3432
|
+
this.logger.warn('Token ledger flush on shutdown failed (non-fatal)', {
|
|
3433
|
+
error: flushErr instanceof Error ? flushErr.message : String(flushErr),
|
|
3434
|
+
});
|
|
3435
|
+
}
|
|
3258
3436
|
// Flush and shutdown OpenTelemetry tracing
|
|
3259
3437
|
try {
|
|
3260
3438
|
const { TracingService: TracingSvc } = await import('./services/core/tracing.service.js');
|