crewly 1.13.0 → 1.13.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/config/skills/_common/complete-body-shape.test.sh +113 -0
- package/config/skills/_common/no-dangling-symlinks.test.sh +63 -0
- package/config/skills/_common/task-pool-body-shape.test.sh +471 -0
- package/config/skills/agent/core/accept-task/execute.sh +30 -5
- package/config/skills/agent/core/block-task/execute.sh +59 -6
- package/config/skills/agent/core/complete-task/SKILL.md +37 -5
- package/config/skills/agent/core/complete-task/execute.sh +40 -9
- package/config/skills/agent/core/complete-task/execute.test.sh +213 -0
- package/config/skills/agent/core/create-task/SKILL.md +33 -0
- package/config/skills/agent/core/create-task/execute.sh +82 -23
- package/config/skills/agent/core/delegate-task/execute.sh +46 -0
- package/config/skills/agent/core/get-team-norms/SKILL.md +1 -1
- package/config/skills/agent/core/get-team-norms/execute.sh +73 -2
- package/config/skills/agent/core/handoff-task/execute.sh +8 -1
- package/config/skills/agent/core/report-status/SKILL.md +26 -0
- package/config/skills/agent/core/report-status/execute.sh +40 -5
- package/config/skills/orchestrator/delegate-task/SKILL.md +1 -1
- package/config/skills/orchestrator/delegate-task/execute.sh +45 -11
- package/config/skills/orchestrator/delegate-task/execute.test.sh +153 -1
- package/config/skills/team-leader/aggregate-results/SKILL.md +1 -1
- package/config/skills/team-leader/decompose-goal/execute.sh +11 -16
- package/config/skills/team-leader/delegate-task/SKILL.md +14 -1
- package/config/skills/team-leader/delegate-task/execute.sh +132 -43
- package/config/skills/team-leader/delegate-task/execute.test.sh +180 -27
- package/config/vitest-exclude.constants.ts +56 -0
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js +18 -3
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/slack/slack.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/slack/slack.controller.js +18 -15
- package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts +6 -1
- 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 +19 -10
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +20 -0
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/scripts/stamp-build.d.ts +25 -0
- package/dist/backend/backend/src/scripts/stamp-build.d.ts.map +1 -0
- package/dist/backend/backend/src/scripts/stamp-build.js +48 -0
- package/dist/backend/backend/src/scripts/stamp-build.js.map +1 -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 +25 -0
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -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 +9 -1
- 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/crewly-agent/types.d.ts +42 -3
- package/dist/backend/backend/src/services/agent/crewly-agent/types.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/types.js +22 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/types.js.map +1 -1
- package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.d.ts +15 -0
- 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 +40 -0
- package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.js.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/orchestrator-status.service.d.ts +28 -3
- package/dist/backend/backend/src/services/orchestrator/orchestrator-status.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/orchestrator-status.service.js +65 -8
- package/dist/backend/backend/src/services/orchestrator/orchestrator-status.service.js.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts +214 -4
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.js +330 -48
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.js.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts +13 -1
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js +84 -5
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconciler.service.d.ts +14 -0
- package/dist/backend/backend/src/services/reconciler/reconciler.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconciler.service.js +77 -3
- package/dist/backend/backend/src/services/reconciler/reconciler.service.js.map +1 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +152 -7
- 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 +268 -36
- package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/escalation-router.service.js +2 -2
- package/dist/backend/backend/src/services/v3/escalation-router.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/request-sla.subscriber.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/request-sla.subscriber.js +39 -2
- package/dist/backend/backend/src/services/v3/request-sla.subscriber.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/work-item.types.d.ts +181 -1
- package/dist/backend/backend/src/types/v2/work-item.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/v2/work-item.types.js +104 -17
- package/dist/backend/backend/src/types/v2/work-item.types.js.map +1 -1
- package/dist/backend/backend/src/utils/build-provenance.d.ts +150 -0
- package/dist/backend/backend/src/utils/build-provenance.d.ts.map +1 -0
- package/dist/backend/backend/src/utils/build-provenance.js +211 -0
- package/dist/backend/backend/src/utils/build-provenance.js.map +1 -0
- package/dist/backend/build-info.json +4 -0
- package/dist/backend/config/vitest-exclude.constants.d.ts +53 -0
- package/dist/backend/config/vitest-exclude.constants.d.ts.map +1 -0
- package/dist/backend/config/vitest-exclude.constants.js +55 -0
- package/dist/backend/config/vitest-exclude.constants.js.map +1 -0
- package/dist/cli/backend/src/services/agent/active-work-briefing.service.d.ts +538 -0
- package/dist/cli/backend/src/services/agent/active-work-briefing.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/active-work-briefing.service.js +802 -0
- package/dist/cli/backend/src/services/agent/active-work-briefing.service.js.map +1 -0
- package/dist/cli/backend/src/services/agent/agent-heartbeat.service.d.ts +240 -0
- package/dist/cli/backend/src/services/agent/agent-heartbeat.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/agent-heartbeat.service.js +524 -0
- package/dist/cli/backend/src/services/agent/agent-heartbeat.service.js.map +1 -0
- package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts +629 -0
- package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/agent-registration.service.js +4548 -0
- package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -0
- package/dist/cli/backend/src/services/agent/agent-suspend.service.d.ts +118 -0
- package/dist/cli/backend/src/services/agent/agent-suspend.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/agent-suspend.service.js +304 -0
- package/dist/cli/backend/src/services/agent/agent-suspend.service.js.map +1 -0
- package/dist/cli/backend/src/services/agent/auditor-scheduler.service.d.ts +196 -0
- package/dist/cli/backend/src/services/agent/auditor-scheduler.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/auditor-scheduler.service.js +504 -0
- package/dist/cli/backend/src/services/agent/auditor-scheduler.service.js.map +1 -0
- package/dist/cli/backend/src/services/agent/claude-runtime.service.d.ts +97 -0
- package/dist/cli/backend/src/services/agent/claude-runtime.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/claude-runtime.service.js +334 -0
- package/dist/cli/backend/src/services/agent/claude-runtime.service.js.map +1 -0
- package/dist/cli/backend/src/services/agent/codex-runtime.service.d.ts +47 -0
- package/dist/cli/backend/src/services/agent/codex-runtime.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/codex-runtime.service.js +112 -0
- package/dist/cli/backend/src/services/agent/codex-runtime.service.js.map +1 -0
- package/dist/cli/backend/src/services/agent/context-window-monitor.service.d.ts +323 -0
- package/dist/cli/backend/src/services/agent/context-window-monitor.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/context-window-monitor.service.js +1056 -0
- package/dist/cli/backend/src/services/agent/context-window-monitor.service.js.map +1 -0
- package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts +198 -0
- package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js +816 -0
- package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js.map +1 -0
- package/dist/cli/backend/src/services/agent/crewly-agent/in-process-log-buffer.d.ts +155 -0
- package/dist/cli/backend/src/services/agent/crewly-agent/in-process-log-buffer.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/crewly-agent/in-process-log-buffer.js +272 -0
- package/dist/cli/backend/src/services/agent/crewly-agent/in-process-log-buffer.js.map +1 -0
- package/dist/cli/backend/src/services/agent/crewly-agent/in-process-runtime-registry.d.ts +91 -0
- package/dist/cli/backend/src/services/agent/crewly-agent/in-process-runtime-registry.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/crewly-agent/in-process-runtime-registry.js +120 -0
- package/dist/cli/backend/src/services/agent/crewly-agent/in-process-runtime-registry.js.map +1 -0
- package/dist/cli/backend/src/services/agent/crewly-agent/types.d.ts +536 -0
- package/dist/cli/backend/src/services/agent/crewly-agent/types.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/crewly-agent/types.js +282 -0
- package/dist/cli/backend/src/services/agent/crewly-agent/types.js.map +1 -0
- package/dist/cli/backend/src/services/agent/disk-cleanup.service.d.ts +100 -0
- package/dist/cli/backend/src/services/agent/disk-cleanup.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/disk-cleanup.service.js +149 -0
- package/dist/cli/backend/src/services/agent/disk-cleanup.service.js.map +1 -0
- package/dist/cli/backend/src/services/agent/gemini-runtime.service.d.ts +130 -0
- package/dist/cli/backend/src/services/agent/gemini-runtime.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/gemini-runtime.service.js +758 -0
- package/dist/cli/backend/src/services/agent/gemini-runtime.service.js.map +1 -0
- package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.d.ts +216 -0
- package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.js +508 -0
- package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.js.map +1 -0
- package/dist/cli/backend/src/services/agent/pty-activity-tracker.service.d.ts +113 -0
- package/dist/cli/backend/src/services/agent/pty-activity-tracker.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/pty-activity-tracker.service.js +161 -0
- package/dist/cli/backend/src/services/agent/pty-activity-tracker.service.js.map +1 -0
- package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.d.ts +156 -0
- package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js +641 -0
- package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -0
- package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.d.ts +295 -0
- package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js +1166 -0
- package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -0
- package/dist/cli/backend/src/services/agent/runtime-service.factory.d.ts +71 -0
- package/dist/cli/backend/src/services/agent/runtime-service.factory.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/runtime-service.factory.js +174 -0
- package/dist/cli/backend/src/services/agent/runtime-service.factory.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-builder.service.d.ts +435 -0
- package/dist/cli/backend/src/services/ai/prompt-builder.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-builder.service.js +1331 -0
- package/dist/cli/backend/src/services/ai/prompt-builder.service.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/capability-overlay.module.d.ts +33 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/capability-overlay.module.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/capability-overlay.module.js +70 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/capability-overlay.module.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/communication.module.d.ts +100 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/communication.module.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/communication.module.js +296 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/communication.module.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/decision-rights.module.d.ts +59 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/decision-rights.module.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/decision-rights.module.js +87 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/decision-rights.module.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/default-execution-loop.module.d.ts +67 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/default-execution-loop.module.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/default-execution-loop.module.js +84 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/default-execution-loop.module.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/domain-sop.module.d.ts +35 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/domain-sop.module.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/domain-sop.module.js +50 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/domain-sop.module.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/expert-profile.module.d.ts +41 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/expert-profile.module.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/expert-profile.module.js +95 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/expert-profile.module.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/identity.module.d.ts +28 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/identity.module.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/identity.module.js +47 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/identity.module.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/lazy-anti-patterns.module.d.ts +65 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/lazy-anti-patterns.module.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/lazy-anti-patterns.module.js +79 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/lazy-anti-patterns.module.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/learning-reference.module.d.ts +28 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/learning-reference.module.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/learning-reference.module.js +55 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/learning-reference.module.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/lifecycle.module.d.ts +44 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/lifecycle.module.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/lifecycle.module.js +120 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/lifecycle.module.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/markdown-file-module.d.ts +46 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/markdown-file-module.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/markdown-file-module.js +44 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/markdown-file-module.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/memory-reference.module.d.ts +28 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/memory-reference.module.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/memory-reference.module.js +46 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/memory-reference.module.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/mission-context.module.d.ts +60 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/mission-context.module.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/mission-context.module.js +104 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/mission-context.module.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/project-reference.module.d.ts +29 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/project-reference.module.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/project-reference.module.js +50 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/project-reference.module.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/prompt-assembly.service.d.ts +103 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/prompt-assembly.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/prompt-assembly.service.js +383 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/prompt-assembly.service.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/recovery.module.d.ts +34 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/recovery.module.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/recovery.module.js +96 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/recovery.module.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/request-contract.module.d.ts +106 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/request-contract.module.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/request-contract.module.js +167 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/request-contract.module.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/risk-policy.module.d.ts +35 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/risk-policy.module.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/risk-policy.module.js +50 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/risk-policy.module.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/role-boundary.module.d.ts +91 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/role-boundary.module.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/role-boundary.module.js +411 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/role-boundary.module.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts +62 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js +199 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/sop-norm-distinction.module.d.ts +79 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/sop-norm-distinction.module.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/sop-norm-distinction.module.js +118 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/sop-norm-distinction.module.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/soul.module.d.ts +102 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/soul.module.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/soul.module.js +229 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/soul.module.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/team-norms.module.d.ts +61 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/team-norms.module.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/team-norms.module.js +197 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/team-norms.module.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/team-reference.module.d.ts +54 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/team-reference.module.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/team-reference.module.js +149 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/team-reference.module.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/user-profile-reference.module.d.ts +32 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/user-profile-reference.module.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/user-profile-reference.module.js +69 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/user-profile-reference.module.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/working-memory.module.d.ts +91 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/working-memory.module.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/working-memory.module.js +136 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/working-memory.module.js.map +1 -0
- package/dist/cli/backend/src/services/ai/self-improvement/growth-areas.service.d.ts +81 -0
- package/dist/cli/backend/src/services/ai/self-improvement/growth-areas.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/self-improvement/growth-areas.service.js +135 -0
- package/dist/cli/backend/src/services/ai/self-improvement/growth-areas.service.js.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts +737 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js +1213 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.singleton.d.ts +27 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.singleton.d.ts.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.singleton.js +57 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.singleton.js.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/config.d.ts +100 -0
- package/dist/cli/backend/src/services/chat-v2/config.d.ts.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/config.js +174 -0
- package/dist/cli/backend/src/services/chat-v2/config.js.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/legacy-dto.utils.d.ts +118 -0
- package/dist/cli/backend/src/services/chat-v2/legacy-dto.utils.d.ts.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/legacy-dto.utils.js +171 -0
- package/dist/cli/backend/src/services/chat-v2/legacy-dto.utils.js.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/sqlite/channel.store.d.ts +188 -0
- package/dist/cli/backend/src/services/chat-v2/sqlite/channel.store.d.ts.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/sqlite/channel.store.js +317 -0
- package/dist/cli/backend/src/services/chat-v2/sqlite/channel.store.js.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/sqlite/chat-db.d.ts +119 -0
- package/dist/cli/backend/src/services/chat-v2/sqlite/chat-db.d.ts.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/sqlite/chat-db.js +551 -0
- package/dist/cli/backend/src/services/chat-v2/sqlite/chat-db.js.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts +208 -0
- package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js +405 -0
- package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/types.d.ts +341 -0
- package/dist/cli/backend/src/services/chat-v2/types.d.ts.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/types.js +61 -0
- package/dist/cli/backend/src/services/chat-v2/types.js.map +1 -0
- package/dist/cli/backend/src/services/continuation/patterns/idle-patterns.d.ts +37 -0
- package/dist/cli/backend/src/services/continuation/patterns/idle-patterns.d.ts.map +1 -0
- package/dist/cli/backend/src/services/continuation/patterns/idle-patterns.js +63 -0
- package/dist/cli/backend/src/services/continuation/patterns/idle-patterns.js.map +1 -0
- package/dist/cli/backend/src/services/intent-task/intent-classifier.rules.d.ts +335 -0
- package/dist/cli/backend/src/services/intent-task/intent-classifier.rules.d.ts.map +1 -0
- package/dist/cli/backend/src/services/intent-task/intent-classifier.rules.js +421 -0
- package/dist/cli/backend/src/services/intent-task/intent-classifier.rules.js.map +1 -0
- package/dist/cli/backend/src/services/mcp-client.d.ts +233 -0
- package/dist/cli/backend/src/services/mcp-client.d.ts.map +1 -0
- package/dist/cli/backend/src/services/mcp-client.js +302 -0
- package/dist/cli/backend/src/services/mcp-client.js.map +1 -0
- package/dist/cli/backend/src/services/memory/mission-context.service.d.ts +168 -0
- package/dist/cli/backend/src/services/memory/mission-context.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/memory/mission-context.service.js +365 -0
- package/dist/cli/backend/src/services/memory/mission-context.service.js.map +1 -0
- package/dist/cli/backend/src/services/memory/session-memory.service.d.ts +197 -0
- package/dist/cli/backend/src/services/memory/session-memory.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/memory/session-memory.service.js +369 -0
- package/dist/cli/backend/src/services/memory/session-memory.service.js.map +1 -0
- package/dist/cli/backend/src/services/memory/user-profile.service.d.ts +77 -0
- package/dist/cli/backend/src/services/memory/user-profile.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/memory/user-profile.service.js +171 -0
- package/dist/cli/backend/src/services/memory/user-profile.service.js.map +1 -0
- package/dist/cli/backend/src/services/memory/working-memory.service.d.ts +232 -0
- package/dist/cli/backend/src/services/memory/working-memory.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/memory/working-memory.service.js +417 -0
- package/dist/cli/backend/src/services/memory/working-memory.service.js.map +1 -0
- package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +84 -0
- package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js +136 -0
- package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -0
- package/dist/cli/backend/src/services/messaging/thread-status-queue.service.d.ts +358 -0
- package/dist/cli/backend/src/services/messaging/thread-status-queue.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/messaging/thread-status-queue.service.js +755 -0
- package/dist/cli/backend/src/services/messaging/thread-status-queue.service.js.map +1 -0
- package/dist/cli/backend/src/services/monitoring/token-usage.service.d.ts +269 -0
- package/dist/cli/backend/src/services/monitoring/token-usage.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/monitoring/token-usage.service.js +391 -0
- package/dist/cli/backend/src/services/monitoring/token-usage.service.js.map +1 -0
- package/dist/cli/backend/src/services/observability/agent-behavior-log.service.d.ts +132 -0
- package/dist/cli/backend/src/services/observability/agent-behavior-log.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/observability/agent-behavior-log.service.js +284 -0
- package/dist/cli/backend/src/services/observability/agent-behavior-log.service.js.map +1 -0
- package/dist/cli/backend/src/services/observability/agent-behavior-log.singleton.d.ts +70 -0
- package/dist/cli/backend/src/services/observability/agent-behavior-log.singleton.d.ts.map +1 -0
- package/dist/cli/backend/src/services/observability/agent-behavior-log.singleton.js +121 -0
- package/dist/cli/backend/src/services/observability/agent-behavior-log.singleton.js.map +1 -0
- package/dist/cli/backend/src/services/observability/agent-behavior-log.types.d.ts +130 -0
- package/dist/cli/backend/src/services/observability/agent-behavior-log.types.d.ts.map +1 -0
- package/dist/cli/backend/src/services/observability/agent-behavior-log.types.js +48 -0
- package/dist/cli/backend/src/services/observability/agent-behavior-log.types.js.map +1 -0
- package/dist/cli/backend/src/services/observability/observability-db.d.ts +84 -0
- package/dist/cli/backend/src/services/observability/observability-db.d.ts.map +1 -0
- package/dist/cli/backend/src/services/observability/observability-db.js +165 -0
- package/dist/cli/backend/src/services/observability/observability-db.js.map +1 -0
- package/dist/cli/backend/src/services/onboarding/content-approval.service.d.ts +124 -0
- package/dist/cli/backend/src/services/onboarding/content-approval.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/onboarding/content-approval.service.js +256 -0
- package/dist/cli/backend/src/services/onboarding/content-approval.service.js.map +1 -0
- package/dist/cli/backend/src/services/onboarding/content-approval.types.d.ts +80 -0
- package/dist/cli/backend/src/services/onboarding/content-approval.types.d.ts.map +1 -0
- package/dist/cli/backend/src/services/onboarding/content-approval.types.js +16 -0
- package/dist/cli/backend/src/services/onboarding/content-approval.types.js.map +1 -0
- package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.d.ts +142 -0
- package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.js +265 -0
- package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.js.map +1 -0
- package/dist/cli/backend/src/services/orchestrator/improvement-marker.service.d.ts +231 -0
- package/dist/cli/backend/src/services/orchestrator/improvement-marker.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/orchestrator/improvement-marker.service.js +353 -0
- package/dist/cli/backend/src/services/orchestrator/improvement-marker.service.js.map +1 -0
- package/dist/cli/backend/src/services/orchestrator/improvement-startup.service.d.ts +157 -0
- package/dist/cli/backend/src/services/orchestrator/improvement-startup.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/orchestrator/improvement-startup.service.js +483 -0
- package/dist/cli/backend/src/services/orchestrator/improvement-startup.service.js.map +1 -0
- package/dist/cli/backend/src/services/orchestrator/index.d.ts +16 -0
- package/dist/cli/backend/src/services/orchestrator/index.d.ts.map +1 -0
- package/dist/cli/backend/src/services/orchestrator/index.js +16 -0
- package/dist/cli/backend/src/services/orchestrator/index.js.map +1 -0
- package/dist/cli/backend/src/services/orchestrator/orchestrator-restart.service.d.ts +117 -0
- package/dist/cli/backend/src/services/orchestrator/orchestrator-restart.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/orchestrator/orchestrator-restart.service.js +300 -0
- package/dist/cli/backend/src/services/orchestrator/orchestrator-restart.service.js.map +1 -0
- package/dist/cli/backend/src/services/orchestrator/orchestrator-setup.service.d.ts +114 -0
- package/dist/cli/backend/src/services/orchestrator/orchestrator-setup.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/orchestrator/orchestrator-setup.service.js +195 -0
- package/dist/cli/backend/src/services/orchestrator/orchestrator-setup.service.js.map +1 -0
- package/dist/cli/backend/src/services/orchestrator/orchestrator-status.service.d.ts +94 -0
- package/dist/cli/backend/src/services/orchestrator/orchestrator-status.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/orchestrator/orchestrator-status.service.js +279 -0
- package/dist/cli/backend/src/services/orchestrator/orchestrator-status.service.js.map +1 -0
- package/dist/cli/backend/src/services/orchestrator/safe-restart.service.d.ts +192 -0
- package/dist/cli/backend/src/services/orchestrator/safe-restart.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/orchestrator/safe-restart.service.js +395 -0
- package/dist/cli/backend/src/services/orchestrator/safe-restart.service.js.map +1 -0
- package/dist/cli/backend/src/services/orchestrator/self-improvement.service.d.ts +201 -0
- package/dist/cli/backend/src/services/orchestrator/self-improvement.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/orchestrator/self-improvement.service.js +396 -0
- package/dist/cli/backend/src/services/orchestrator/self-improvement.service.js.map +1 -0
- package/dist/cli/backend/src/services/orchestrator/slack-bridge-lazy.d.ts +17 -0
- package/dist/cli/backend/src/services/orchestrator/slack-bridge-lazy.d.ts.map +1 -0
- package/dist/cli/backend/src/services/orchestrator/slack-bridge-lazy.js +30 -0
- package/dist/cli/backend/src/services/orchestrator/slack-bridge-lazy.js.map +1 -0
- package/dist/cli/backend/src/services/orchestrator/state-persistence.service.d.ts +249 -0
- package/dist/cli/backend/src/services/orchestrator/state-persistence.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/orchestrator/state-persistence.service.js +569 -0
- package/dist/cli/backend/src/services/orchestrator/state-persistence.service.js.map +1 -0
- package/dist/cli/backend/src/services/session/index.d.ts +47 -0
- package/dist/cli/backend/src/services/session/index.d.ts.map +1 -0
- package/dist/cli/backend/src/services/session/index.js +50 -0
- package/dist/cli/backend/src/services/session/index.js.map +1 -0
- package/dist/cli/backend/src/services/session/log-rotation.service.d.ts +163 -0
- package/dist/cli/backend/src/services/session/log-rotation.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/session/log-rotation.service.js +362 -0
- package/dist/cli/backend/src/services/session/log-rotation.service.js.map +1 -0
- package/dist/cli/backend/src/services/session/pty/index.d.ts +11 -0
- package/dist/cli/backend/src/services/session/pty/index.d.ts.map +1 -0
- package/dist/cli/backend/src/services/session/pty/index.js +11 -0
- package/dist/cli/backend/src/services/session/pty/index.js.map +1 -0
- package/dist/cli/backend/src/services/session/pty/pty-session-backend.d.ts +445 -0
- package/dist/cli/backend/src/services/session/pty/pty-session-backend.d.ts.map +1 -0
- package/dist/cli/backend/src/services/session/pty/pty-session-backend.js +804 -0
- package/dist/cli/backend/src/services/session/pty/pty-session-backend.js.map +1 -0
- package/dist/cli/backend/src/services/session/pty/pty-session.d.ts +252 -0
- package/dist/cli/backend/src/services/session/pty/pty-session.d.ts.map +1 -0
- package/dist/cli/backend/src/services/session/pty/pty-session.js +611 -0
- package/dist/cli/backend/src/services/session/pty/pty-session.js.map +1 -0
- package/dist/cli/backend/src/services/session/pty/pty-terminal-buffer.d.ts +275 -0
- package/dist/cli/backend/src/services/session/pty/pty-terminal-buffer.d.ts.map +1 -0
- package/dist/cli/backend/src/services/session/pty/pty-terminal-buffer.js +403 -0
- package/dist/cli/backend/src/services/session/pty/pty-terminal-buffer.js.map +1 -0
- package/dist/cli/backend/src/services/session/runtime-pid-registry.service.d.ts +86 -0
- package/dist/cli/backend/src/services/session/runtime-pid-registry.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/session/runtime-pid-registry.service.js +214 -0
- package/dist/cli/backend/src/services/session/runtime-pid-registry.service.js.map +1 -0
- package/dist/cli/backend/src/services/session/session-backend.factory.d.ts +127 -0
- package/dist/cli/backend/src/services/session/session-backend.factory.d.ts.map +1 -0
- package/dist/cli/backend/src/services/session/session-backend.factory.js +226 -0
- package/dist/cli/backend/src/services/session/session-backend.factory.js.map +1 -0
- package/dist/cli/backend/src/services/session/session-backend.interface.d.ts +390 -0
- package/dist/cli/backend/src/services/session/session-backend.interface.d.ts.map +1 -0
- package/dist/cli/backend/src/services/session/session-backend.interface.js +19 -0
- package/dist/cli/backend/src/services/session/session-backend.interface.js.map +1 -0
- package/dist/cli/backend/src/services/session/session-command-helper.d.ts +350 -0
- package/dist/cli/backend/src/services/session/session-command-helper.d.ts.map +1 -0
- package/dist/cli/backend/src/services/session/session-command-helper.js +810 -0
- package/dist/cli/backend/src/services/session/session-command-helper.js.map +1 -0
- package/dist/cli/backend/src/services/session/session-handoff.service.d.ts +307 -0
- package/dist/cli/backend/src/services/session/session-handoff.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/session/session-handoff.service.js +742 -0
- package/dist/cli/backend/src/services/session/session-handoff.service.js.map +1 -0
- package/dist/cli/backend/src/services/session/session-state-persistence.d.ts +231 -0
- package/dist/cli/backend/src/services/session/session-state-persistence.d.ts.map +1 -0
- package/dist/cli/backend/src/services/session/session-state-persistence.js +407 -0
- package/dist/cli/backend/src/services/session/session-state-persistence.js.map +1 -0
- package/dist/cli/backend/src/services/settings/role.service.d.ts +277 -0
- package/dist/cli/backend/src/services/settings/role.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/settings/role.service.js +728 -0
- package/dist/cli/backend/src/services/settings/role.service.js.map +1 -0
- package/dist/cli/backend/src/services/slack/cross-machine-message.service.d.ts +152 -0
- package/dist/cli/backend/src/services/slack/cross-machine-message.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/slack/cross-machine-message.service.js +354 -0
- package/dist/cli/backend/src/services/slack/cross-machine-message.service.js.map +1 -0
- package/dist/cli/backend/src/services/slack/slack-image.service.d.ts +114 -0
- package/dist/cli/backend/src/services/slack/slack-image.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/slack/slack-image.service.js +331 -0
- package/dist/cli/backend/src/services/slack/slack-image.service.js.map +1 -0
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts +499 -0
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -0
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js +1928 -0
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -0
- package/dist/cli/backend/src/services/slack/slack.service.d.ts +315 -0
- package/dist/cli/backend/src/services/slack/slack.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/slack/slack.service.js +1094 -0
- package/dist/cli/backend/src/services/slack/slack.service.js.map +1 -0
- package/dist/cli/backend/src/services/sop/sop.service.d.ts +364 -0
- package/dist/cli/backend/src/services/sop/sop.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/sop/sop.service.js +734 -0
- package/dist/cli/backend/src/services/sop/sop.service.js.map +1 -0
- package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +152 -7
- 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 +268 -36
- package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/cli/backend/src/services/v3/escalation-router.service.d.ts +178 -0
- package/dist/cli/backend/src/services/v3/escalation-router.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/v3/escalation-router.service.js +692 -0
- package/dist/cli/backend/src/services/v3/escalation-router.service.js.map +1 -0
- package/dist/cli/backend/src/services/v3/kr-tracking.service.d.ts +200 -0
- package/dist/cli/backend/src/services/v3/kr-tracking.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/v3/kr-tracking.service.js +482 -0
- package/dist/cli/backend/src/services/v3/kr-tracking.service.js.map +1 -0
- package/dist/cli/backend/src/services/v3/mission-executor.service.d.ts +117 -0
- package/dist/cli/backend/src/services/v3/mission-executor.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/v3/mission-executor.service.js +321 -0
- package/dist/cli/backend/src/services/v3/mission-executor.service.js.map +1 -0
- package/dist/cli/backend/src/services/v3/request-sla.subscriber.d.ts +610 -0
- package/dist/cli/backend/src/services/v3/request-sla.subscriber.d.ts.map +1 -0
- package/dist/cli/backend/src/services/v3/request-sla.subscriber.js +1529 -0
- package/dist/cli/backend/src/services/v3/request-sla.subscriber.js.map +1 -0
- package/dist/cli/backend/src/services/v3/request-tracker.service.d.ts +78 -0
- package/dist/cli/backend/src/services/v3/request-tracker.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/v3/request-tracker.service.js +108 -0
- package/dist/cli/backend/src/services/v3/request-tracker.service.js.map +1 -0
- package/dist/cli/backend/src/services/v3/request.service.d.ts +295 -0
- package/dist/cli/backend/src/services/v3/request.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/v3/request.service.js +534 -0
- package/dist/cli/backend/src/services/v3/request.service.js.map +1 -0
- package/dist/cli/backend/src/services/v3/v3-data.service.d.ts +340 -0
- package/dist/cli/backend/src/services/v3/v3-data.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/v3/v3-data.service.js +1113 -0
- package/dist/cli/backend/src/services/v3/v3-data.service.js.map +1 -0
- package/dist/cli/backend/src/types/cross-machine.types.d.ts +103 -0
- package/dist/cli/backend/src/types/cross-machine.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/cross-machine.types.js +47 -0
- package/dist/cli/backend/src/types/cross-machine.types.js.map +1 -0
- package/dist/cli/backend/src/types/intent-task.types.d.ts +402 -0
- package/dist/cli/backend/src/types/intent-task.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/intent-task.types.js +403 -0
- package/dist/cli/backend/src/types/intent-task.types.js.map +1 -0
- package/dist/cli/backend/src/types/orchestrator-state.types.d.ts +531 -0
- package/dist/cli/backend/src/types/orchestrator-state.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/orchestrator-state.types.js +110 -0
- package/dist/cli/backend/src/types/orchestrator-state.types.js.map +1 -0
- package/dist/cli/backend/src/types/v2/index.d.ts +30 -0
- package/dist/cli/backend/src/types/v2/index.d.ts.map +1 -0
- package/dist/cli/backend/src/types/v2/index.js +22 -0
- package/dist/cli/backend/src/types/v2/index.js.map +1 -0
- package/dist/cli/backend/src/types/v2/key-result.types.d.ts +279 -0
- package/dist/cli/backend/src/types/v2/key-result.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/v2/key-result.types.js +264 -0
- package/dist/cli/backend/src/types/v2/key-result.types.js.map +1 -0
- package/dist/cli/backend/src/types/v2/mission.types.d.ts +661 -0
- package/dist/cli/backend/src/types/v2/mission.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/v2/mission.types.js +713 -0
- package/dist/cli/backend/src/types/v2/mission.types.js.map +1 -0
- package/dist/cli/backend/src/types/v2/reconcile.types.d.ts +204 -0
- package/dist/cli/backend/src/types/v2/reconcile.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/v2/reconcile.types.js +121 -0
- package/dist/cli/backend/src/types/v2/reconcile.types.js.map +1 -0
- package/dist/cli/backend/src/types/v2/request.types.d.ts +192 -0
- package/dist/cli/backend/src/types/v2/request.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/v2/request.types.js +179 -0
- package/dist/cli/backend/src/types/v2/request.types.js.map +1 -0
- package/dist/cli/backend/src/types/v2/work-item.types.d.ts +181 -1
- package/dist/cli/backend/src/types/v2/work-item.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/v2/work-item.types.js +104 -17
- package/dist/cli/backend/src/types/v2/work-item.types.js.map +1 -1
- package/dist/cli/backend/src/types/v2/workspace.types.d.ts +157 -0
- package/dist/cli/backend/src/types/v2/workspace.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/v2/workspace.types.js +173 -0
- package/dist/cli/backend/src/types/v2/workspace.types.js.map +1 -0
- package/dist/cli/backend/src/utils/async.utils.d.ts +68 -0
- package/dist/cli/backend/src/utils/async.utils.d.ts.map +1 -0
- package/dist/cli/backend/src/utils/async.utils.js +80 -0
- package/dist/cli/backend/src/utils/async.utils.js.map +1 -0
- package/dist/cli/backend/src/utils/native-binding.utils.d.ts +128 -0
- package/dist/cli/backend/src/utils/native-binding.utils.d.ts.map +1 -0
- package/dist/cli/backend/src/utils/native-binding.utils.js +206 -0
- package/dist/cli/backend/src/utils/native-binding.utils.js.map +1 -0
- package/dist/cli/backend/src/websocket/chat.gateway.d.ts +142 -0
- package/dist/cli/backend/src/websocket/chat.gateway.d.ts.map +1 -0
- package/dist/cli/backend/src/websocket/chat.gateway.js +327 -0
- package/dist/cli/backend/src/websocket/chat.gateway.js.map +1 -0
- package/dist/cli/backend/src/websocket/terminal.gateway.d.ts +341 -0
- package/dist/cli/backend/src/websocket/terminal.gateway.d.ts.map +1 -0
- package/dist/cli/backend/src/websocket/terminal.gateway.js +933 -0
- package/dist/cli/backend/src/websocket/terminal.gateway.js.map +1 -0
- package/dist/cli/config/vitest-exclude.constants.d.ts +53 -0
- package/dist/cli/config/vitest-exclude.constants.d.ts.map +1 -0
- package/dist/cli/config/vitest-exclude.constants.js +55 -0
- package/dist/cli/config/vitest-exclude.constants.js.map +1 -0
- package/frontend/dist/assets/index-890d3f9d.js +4961 -0
- package/frontend/dist/index.html +1 -1
- package/package.json +2 -2
- package/packages/crewly-agent/src/runtime/agent-runner.service.test.ts +174 -30
- package/packages/crewly-agent/src/runtime/agent-runner.service.ts +121 -6
- package/packages/crewly-agent/src/runtime/types.ts +56 -5
- package/frontend/dist/assets/index-aa737fd3.js +0 -5254
|
@@ -0,0 +1,755 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thread Status Queue Service
|
|
3
|
+
*
|
|
4
|
+
* Tracks the lifecycle of every inbound message thread across platforms
|
|
5
|
+
* (Slack, GChat, Telegram, etc.). On orchestrator restart, non-terminal
|
|
6
|
+
* threads are recovered and re-enqueued so no user messages are silently dropped.
|
|
7
|
+
*
|
|
8
|
+
* Persistence is debounced and written to ~/.crewly/thread-status-queue.json
|
|
9
|
+
* using atomic file I/O to prevent corruption.
|
|
10
|
+
*
|
|
11
|
+
* @module services/messaging/thread-status-queue
|
|
12
|
+
*/
|
|
13
|
+
import { randomUUID } from 'crypto';
|
|
14
|
+
import path from 'path';
|
|
15
|
+
import { THREAD_STATUS_CONSTANTS, ORCHESTRATOR_SESSION_NAME } from '../../constants.js';
|
|
16
|
+
import { LoggerService } from '../core/logger.service.js';
|
|
17
|
+
import { atomicWriteFile, safeReadJson } from '../../utils/file-io.utils.js';
|
|
18
|
+
import { PERSISTED_THREAD_STATUS_VERSION, isPersistedThreadStatusState, isTerminalStatus, isReplyStatus, } from '../../types/thread-status.types.js';
|
|
19
|
+
/** Default follow-up check delay in minutes */
|
|
20
|
+
const FOLLOW_UP_CHECK_DELAY_MINUTES = 5;
|
|
21
|
+
/**
|
|
22
|
+
* Service that maintains a persistent queue of thread statuses.
|
|
23
|
+
* Constructed with a crewly home directory path for disk persistence.
|
|
24
|
+
*
|
|
25
|
+
* Lifecycle: enqueued → delivered → replied_* (terminal or waiting_actions)
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```typescript
|
|
29
|
+
* const svc = new ThreadStatusQueueService('/home/user/.crewly');
|
|
30
|
+
* await svc.loadPersistedState();
|
|
31
|
+
*
|
|
32
|
+
* const entry = svc.trackInbound({
|
|
33
|
+
* source: 'slack',
|
|
34
|
+
* threadKey: 'C123:170743.001',
|
|
35
|
+
* conversationId: 'conv-1',
|
|
36
|
+
* messagePreview: 'Deploy the new feature',
|
|
37
|
+
* });
|
|
38
|
+
*
|
|
39
|
+
* svc.markDelivered('C123:170743.001');
|
|
40
|
+
* svc.markReplied('C123:170743.001', 'replied_completed');
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export class ThreadStatusQueueService {
|
|
44
|
+
/** Singleton instance */
|
|
45
|
+
static instance;
|
|
46
|
+
/** Logger for this service */
|
|
47
|
+
logger = LoggerService.getInstance().createComponentLogger('ThreadStatusQueueService');
|
|
48
|
+
/** All tracked thread entries, keyed by threadKey for O(1) lookup */
|
|
49
|
+
entries = new Map();
|
|
50
|
+
/** Path to the persistence file, or null if init() has not been called */
|
|
51
|
+
persistPath = null;
|
|
52
|
+
/** Debounce timer for batching persistence writes */
|
|
53
|
+
persistTimer = null;
|
|
54
|
+
/** ISO timestamp of last cleanup run */
|
|
55
|
+
lastCleanupAt = new Date().toISOString();
|
|
56
|
+
/** Scheduler service for creating follow-up checks */
|
|
57
|
+
schedulerService = null;
|
|
58
|
+
/** Event bus for subscribing to message:received events */
|
|
59
|
+
eventBusService = null;
|
|
60
|
+
/** Tracks active follow-up subscriptions keyed by threadKey */
|
|
61
|
+
followUpTracking = new Map();
|
|
62
|
+
/**
|
|
63
|
+
* Creates a new ThreadStatusQueueService.
|
|
64
|
+
* Use getInstance() for singleton access, or construct directly for testing.
|
|
65
|
+
*
|
|
66
|
+
* @param crewlyHome - Optional crewly home directory path for immediate initialization
|
|
67
|
+
*/
|
|
68
|
+
constructor(crewlyHome) {
|
|
69
|
+
if (crewlyHome) {
|
|
70
|
+
this.persistPath = path.join(crewlyHome, THREAD_STATUS_CONSTANTS.STORAGE_FILE);
|
|
71
|
+
this.logger.info('Initialized', { persistPath: this.persistPath });
|
|
72
|
+
}
|
|
73
|
+
// Register as singleton so getInstance() returns the fully-initialized instance
|
|
74
|
+
ThreadStatusQueueService.instance = this;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Returns the singleton instance of ThreadStatusQueueService.
|
|
78
|
+
* Call init() after this to set the persistence path.
|
|
79
|
+
*
|
|
80
|
+
* @returns The singleton instance
|
|
81
|
+
*/
|
|
82
|
+
static getInstance() {
|
|
83
|
+
if (!ThreadStatusQueueService.instance) {
|
|
84
|
+
ThreadStatusQueueService.instance = new ThreadStatusQueueService();
|
|
85
|
+
}
|
|
86
|
+
return ThreadStatusQueueService.instance;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Resets the singleton instance. For testing only.
|
|
90
|
+
*/
|
|
91
|
+
static resetInstance() {
|
|
92
|
+
if (ThreadStatusQueueService.instance) {
|
|
93
|
+
ThreadStatusQueueService.instance.destroy();
|
|
94
|
+
}
|
|
95
|
+
ThreadStatusQueueService.instance = undefined;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Loads persisted state from disk.
|
|
99
|
+
* If the file doesn't exist or is corrupted, starts with an empty queue.
|
|
100
|
+
*/
|
|
101
|
+
async loadPersistedState() {
|
|
102
|
+
if (!this.persistPath) {
|
|
103
|
+
this.logger.warn('loadPersistedState called before init — skipping');
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
const defaultState = {
|
|
107
|
+
version: PERSISTED_THREAD_STATUS_VERSION,
|
|
108
|
+
entries: [],
|
|
109
|
+
lastCleanupAt: new Date().toISOString(),
|
|
110
|
+
};
|
|
111
|
+
const state = await safeReadJson(this.persistPath, defaultState, this.logger);
|
|
112
|
+
if (!isPersistedThreadStatusState(state)) {
|
|
113
|
+
this.logger.warn('Invalid persisted state, starting fresh');
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
this.entries.clear();
|
|
117
|
+
for (const entry of state.entries) {
|
|
118
|
+
this.entries.set(entry.threadKey, entry);
|
|
119
|
+
}
|
|
120
|
+
this.lastCleanupAt = state.lastCleanupAt;
|
|
121
|
+
this.logger.info('Loaded persisted state', {
|
|
122
|
+
entryCount: this.entries.size,
|
|
123
|
+
lastCleanupAt: this.lastCleanupAt,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Records a new inbound thread message with status `enqueued`.
|
|
128
|
+
* If a thread with the same threadKey already exists, the existing entry is returned.
|
|
129
|
+
*
|
|
130
|
+
* @param input - Inbound message details
|
|
131
|
+
* @returns The created (or existing) ThreadStatusEntry
|
|
132
|
+
*/
|
|
133
|
+
trackInbound(input) {
|
|
134
|
+
const existing = this.entries.get(input.threadKey);
|
|
135
|
+
if (existing) {
|
|
136
|
+
this.logger.debug('Thread already tracked, returning existing', { threadKey: input.threadKey });
|
|
137
|
+
return existing;
|
|
138
|
+
}
|
|
139
|
+
const now = new Date().toISOString();
|
|
140
|
+
const entry = {
|
|
141
|
+
id: randomUUID(),
|
|
142
|
+
source: input.source,
|
|
143
|
+
threadKey: input.threadKey,
|
|
144
|
+
conversationId: input.conversationId,
|
|
145
|
+
status: 'enqueued',
|
|
146
|
+
receivedAt: now,
|
|
147
|
+
updatedAt: now,
|
|
148
|
+
messagePreview: input.messagePreview.slice(0, THREAD_STATUS_CONSTANTS.MAX_PREVIEW_LENGTH),
|
|
149
|
+
retryCount: 0,
|
|
150
|
+
queueMessageId: input.queueMessageId,
|
|
151
|
+
sourceMetadata: input.sourceMetadata,
|
|
152
|
+
};
|
|
153
|
+
this.entries.set(input.threadKey, entry);
|
|
154
|
+
this.schedulePersist();
|
|
155
|
+
this.logger.info('Tracked inbound thread', {
|
|
156
|
+
threadKey: input.threadKey,
|
|
157
|
+
source: input.source,
|
|
158
|
+
conversationId: input.conversationId,
|
|
159
|
+
});
|
|
160
|
+
return entry;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Transitions a thread from `enqueued` (or `error`) to `delivered`.
|
|
164
|
+
* No-op if thread is already in a terminal or later status.
|
|
165
|
+
*
|
|
166
|
+
* @param threadKey - Platform-specific thread identifier
|
|
167
|
+
* @throws Error if threadKey is not found
|
|
168
|
+
*/
|
|
169
|
+
markDelivered(threadKey) {
|
|
170
|
+
const entry = this.getOrThrow(threadKey, 'markDelivered');
|
|
171
|
+
if (isTerminalStatus(entry.status) || entry.status === 'delivered') {
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
const now = new Date().toISOString();
|
|
175
|
+
entry.status = 'delivered';
|
|
176
|
+
entry.deliveredAt = now;
|
|
177
|
+
entry.updatedAt = now;
|
|
178
|
+
this.schedulePersist();
|
|
179
|
+
this.logger.info('Marked delivered', { threadKey });
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Set the SchedulerService instance for creating follow-up checks.
|
|
183
|
+
* Called during server initialization.
|
|
184
|
+
*
|
|
185
|
+
* @param service - The SchedulerService instance (or compatible interface)
|
|
186
|
+
*/
|
|
187
|
+
setSchedulerService(service) {
|
|
188
|
+
this.schedulerService = service;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Set the EventBusService instance for subscribing to message events.
|
|
192
|
+
* Called during server initialization.
|
|
193
|
+
*
|
|
194
|
+
* @param service - The EventBusService instance (or compatible interface)
|
|
195
|
+
*/
|
|
196
|
+
setEventBusService(service) {
|
|
197
|
+
this.eventBusService = service;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Transitions a thread to one of the replied_* statuses.
|
|
201
|
+
* Sets the repliedAt timestamp.
|
|
202
|
+
*
|
|
203
|
+
* When status is `replied_to_follow_up`, automatically:
|
|
204
|
+
* 1. Creates a scheduled check (default 5 min) to verify user replied
|
|
205
|
+
* 2. Subscribes to message:received events for this thread's conversation
|
|
206
|
+
* 3. On user reply: cancels the scheduled check and transitions to replied_completed
|
|
207
|
+
*
|
|
208
|
+
* @param threadKey - Platform-specific thread identifier
|
|
209
|
+
* @param status - One of: replied_completed, replied_waiting_actions, replied_to_follow_up
|
|
210
|
+
* @throws Error if threadKey is not found or status is not a valid reply status
|
|
211
|
+
*/
|
|
212
|
+
markReplied(threadKey, status) {
|
|
213
|
+
if (!isReplyStatus(status)) {
|
|
214
|
+
throw new Error(`Invalid reply status: ${status}`);
|
|
215
|
+
}
|
|
216
|
+
const entry = this.getOrThrow(threadKey, 'markReplied');
|
|
217
|
+
if (isTerminalStatus(entry.status)) {
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
const now = new Date().toISOString();
|
|
221
|
+
entry.status = status;
|
|
222
|
+
entry.repliedAt = now;
|
|
223
|
+
entry.updatedAt = now;
|
|
224
|
+
this.schedulePersist();
|
|
225
|
+
this.logger.info('Marked replied', { threadKey, status });
|
|
226
|
+
// Sub-task A: Auto-schedule follow-up check and event subscription
|
|
227
|
+
if (status === 'replied_to_follow_up') {
|
|
228
|
+
this.setupFollowUpTracking(threadKey, entry);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Handles a user reply to a follow-up thread.
|
|
233
|
+
* Cancels the scheduled check, removes the event subscription,
|
|
234
|
+
* and transitions the thread to replied_completed (or re-enqueues).
|
|
235
|
+
*
|
|
236
|
+
* @param threadKey - Platform-specific thread identifier
|
|
237
|
+
*/
|
|
238
|
+
handleFollowUpReply(threadKey) {
|
|
239
|
+
const tracking = this.followUpTracking.get(threadKey);
|
|
240
|
+
if (!tracking) {
|
|
241
|
+
this.logger.debug('No follow-up tracking found for thread', { threadKey });
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
// Cancel the scheduled check
|
|
245
|
+
if (this.schedulerService) {
|
|
246
|
+
this.schedulerService.cancelCheck(tracking.scheduledCheckId);
|
|
247
|
+
}
|
|
248
|
+
// Remove the event subscription
|
|
249
|
+
if (this.eventBusService) {
|
|
250
|
+
this.eventBusService.unsubscribe(tracking.eventSubscriptionId);
|
|
251
|
+
}
|
|
252
|
+
this.followUpTracking.delete(threadKey);
|
|
253
|
+
// Transition thread to replied_completed
|
|
254
|
+
const entry = this.entries.get(threadKey);
|
|
255
|
+
if (entry && entry.status === 'replied_to_follow_up') {
|
|
256
|
+
entry.status = 'replied_completed';
|
|
257
|
+
entry.updatedAt = new Date().toISOString();
|
|
258
|
+
this.schedulePersist();
|
|
259
|
+
this.logger.info('Follow-up reply received, thread completed', { threadKey });
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Returns the active follow-up tracking for a thread, if any.
|
|
264
|
+
* Useful for testing and debugging.
|
|
265
|
+
*
|
|
266
|
+
* @param threadKey - Platform-specific thread identifier
|
|
267
|
+
* @returns The follow-up tracking info, or null
|
|
268
|
+
*/
|
|
269
|
+
getFollowUpTracking(threadKey) {
|
|
270
|
+
return this.followUpTracking.get(threadKey) ?? null;
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Records that an agent was delegated work from this thread.
|
|
274
|
+
*
|
|
275
|
+
* @param threadKey - Platform-specific thread identifier
|
|
276
|
+
* @param agentSession - Session name of the delegated agent
|
|
277
|
+
* @throws Error if threadKey is not found
|
|
278
|
+
*/
|
|
279
|
+
addDelegatedAgent(threadKey, agentSession) {
|
|
280
|
+
const entry = this.getOrThrow(threadKey, 'addDelegatedAgent');
|
|
281
|
+
if (!entry.delegatedAgents) {
|
|
282
|
+
entry.delegatedAgents = [];
|
|
283
|
+
}
|
|
284
|
+
if (!entry.delegatedAgents.includes(agentSession)) {
|
|
285
|
+
entry.delegatedAgents.push(agentSession);
|
|
286
|
+
entry.updatedAt = new Date().toISOString();
|
|
287
|
+
this.schedulePersist();
|
|
288
|
+
this.logger.info('Added delegated agent', { threadKey, agentSession });
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Transitions a `replied_waiting_actions` thread to `replied_completed`
|
|
293
|
+
* when all delegated agents have finished their work.
|
|
294
|
+
*
|
|
295
|
+
* @param threadKey - Platform-specific thread identifier
|
|
296
|
+
* @throws Error if threadKey is not found
|
|
297
|
+
*/
|
|
298
|
+
markDelegationsComplete(threadKey) {
|
|
299
|
+
const entry = this.getOrThrow(threadKey, 'markDelegationsComplete');
|
|
300
|
+
if (entry.status !== 'replied_waiting_actions') {
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
entry.status = 'replied_completed';
|
|
304
|
+
entry.updatedAt = new Date().toISOString();
|
|
305
|
+
this.schedulePersist();
|
|
306
|
+
this.logger.info('Marked delegations complete', { threadKey });
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Returns all entries not in a terminal status. Used for restart recovery.
|
|
310
|
+
*
|
|
311
|
+
* @returns Array of non-terminal ThreadStatusEntry objects
|
|
312
|
+
*/
|
|
313
|
+
getPendingThreads() {
|
|
314
|
+
const pending = [];
|
|
315
|
+
for (const entry of this.entries.values()) {
|
|
316
|
+
if (!isTerminalStatus(entry.status)) {
|
|
317
|
+
pending.push(entry);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
return pending;
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Returns all entries matching the given status.
|
|
324
|
+
*
|
|
325
|
+
* @param status - The ThreadStatus to filter by
|
|
326
|
+
* @returns Array of matching ThreadStatusEntry objects
|
|
327
|
+
*/
|
|
328
|
+
getByStatus(status) {
|
|
329
|
+
const results = [];
|
|
330
|
+
for (const entry of this.entries.values()) {
|
|
331
|
+
if (entry.status === status) {
|
|
332
|
+
results.push(entry);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
return results;
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Retrieves a specific entry by threadKey.
|
|
339
|
+
*
|
|
340
|
+
* @param threadKey - Platform-specific thread identifier
|
|
341
|
+
* @returns The entry, or null if not found
|
|
342
|
+
*/
|
|
343
|
+
get(threadKey) {
|
|
344
|
+
return this.entries.get(threadKey) ?? null;
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Find a thread entry by its conversationId.
|
|
348
|
+
*
|
|
349
|
+
* Useful when the caller has a conversationId (e.g. from chat history)
|
|
350
|
+
* but not the threadKey. Scans all entries — O(n) but the set is small.
|
|
351
|
+
*
|
|
352
|
+
* @param conversationId - The conversation ID to search for
|
|
353
|
+
* @returns The most recently updated matching entry, or null
|
|
354
|
+
*/
|
|
355
|
+
getByConversationId(conversationId) {
|
|
356
|
+
let best = null;
|
|
357
|
+
for (const entry of this.entries.values()) {
|
|
358
|
+
if (entry.conversationId === conversationId) {
|
|
359
|
+
if (!best || entry.updatedAt > best.updatedAt) {
|
|
360
|
+
best = entry;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
return best;
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Finds a thread status entry by its queueMessageId.
|
|
368
|
+
* Returns the most recently updated entry if multiple match.
|
|
369
|
+
*
|
|
370
|
+
* @param queueMessageId - The queue message ID to search for
|
|
371
|
+
* @returns The most recently updated matching entry, or null
|
|
372
|
+
*/
|
|
373
|
+
getByQueueMessageId(queueMessageId) {
|
|
374
|
+
let best = null;
|
|
375
|
+
for (const entry of this.entries.values()) {
|
|
376
|
+
if (entry.queueMessageId === queueMessageId) {
|
|
377
|
+
if (!best || entry.updatedAt > best.updatedAt) {
|
|
378
|
+
best = entry;
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
return best;
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* Expires entries that have been in a non-terminal status longer than maxAgeMinutes.
|
|
386
|
+
* Transitions them to `expired`.
|
|
387
|
+
*
|
|
388
|
+
* @param maxAgeMinutes - Maximum age in minutes (defaults to STALE_TIMEOUT_MINUTES)
|
|
389
|
+
* @returns Number of entries expired
|
|
390
|
+
*/
|
|
391
|
+
expireStale(maxAgeMinutes = THREAD_STATUS_CONSTANTS.STALE_TIMEOUT_MINUTES) {
|
|
392
|
+
const cutoff = Date.now() - maxAgeMinutes * 60 * 1000;
|
|
393
|
+
let count = 0;
|
|
394
|
+
for (const entry of this.entries.values()) {
|
|
395
|
+
if (isTerminalStatus(entry.status))
|
|
396
|
+
continue;
|
|
397
|
+
const updatedTime = new Date(entry.updatedAt).getTime();
|
|
398
|
+
if (updatedTime < cutoff) {
|
|
399
|
+
entry.status = 'expired';
|
|
400
|
+
entry.updatedAt = new Date().toISOString();
|
|
401
|
+
count++;
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
if (count > 0) {
|
|
405
|
+
this.schedulePersist();
|
|
406
|
+
this.logger.info('Expired stale threads', { count, maxAgeMinutes });
|
|
407
|
+
}
|
|
408
|
+
return count;
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* Removes terminal entries older than retentionHours.
|
|
412
|
+
* Also enforces MAX_ENTRIES by pruning oldest terminal entries first.
|
|
413
|
+
*
|
|
414
|
+
* @param retentionHours - Hours to retain terminal entries (defaults to CLEANUP_RETENTION_HOURS)
|
|
415
|
+
* @returns Number of entries removed
|
|
416
|
+
*/
|
|
417
|
+
cleanup(retentionHours = THREAD_STATUS_CONSTANTS.CLEANUP_RETENTION_HOURS) {
|
|
418
|
+
const cutoff = Date.now() - retentionHours * 60 * 60 * 1000;
|
|
419
|
+
let count = 0;
|
|
420
|
+
// Remove terminal entries older than retention period
|
|
421
|
+
for (const [key, entry] of this.entries) {
|
|
422
|
+
if (isTerminalStatus(entry.status)) {
|
|
423
|
+
const updatedTime = new Date(entry.updatedAt).getTime();
|
|
424
|
+
if (updatedTime < cutoff) {
|
|
425
|
+
this.entries.delete(key);
|
|
426
|
+
count++;
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
// Enforce MAX_ENTRIES: prune oldest terminal entries first
|
|
431
|
+
if (this.entries.size > THREAD_STATUS_CONSTANTS.MAX_ENTRIES) {
|
|
432
|
+
const terminalEntries = Array.from(this.entries.entries())
|
|
433
|
+
.filter(([, e]) => isTerminalStatus(e.status))
|
|
434
|
+
.sort(([, a], [, b]) => new Date(a.updatedAt).getTime() - new Date(b.updatedAt).getTime());
|
|
435
|
+
for (const [key] of terminalEntries) {
|
|
436
|
+
if (this.entries.size <= THREAD_STATUS_CONSTANTS.MAX_ENTRIES)
|
|
437
|
+
break;
|
|
438
|
+
this.entries.delete(key);
|
|
439
|
+
count++;
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
if (count > 0) {
|
|
443
|
+
this.lastCleanupAt = new Date().toISOString();
|
|
444
|
+
this.schedulePersist();
|
|
445
|
+
this.logger.info('Cleaned up entries', { removed: count, remaining: this.entries.size });
|
|
446
|
+
}
|
|
447
|
+
return count;
|
|
448
|
+
}
|
|
449
|
+
/**
|
|
450
|
+
* Returns statistics for monitoring the thread status queue.
|
|
451
|
+
*
|
|
452
|
+
* @returns Stats snapshot including total, per-status counts, and oldest pending timestamp
|
|
453
|
+
*/
|
|
454
|
+
getStats() {
|
|
455
|
+
const byStatus = {
|
|
456
|
+
enqueued: 0,
|
|
457
|
+
delivered: 0,
|
|
458
|
+
replied_completed: 0,
|
|
459
|
+
replied_waiting_actions: 0,
|
|
460
|
+
replied_to_follow_up: 0,
|
|
461
|
+
expired: 0,
|
|
462
|
+
error: 0,
|
|
463
|
+
};
|
|
464
|
+
let oldestPending = null;
|
|
465
|
+
for (const entry of this.entries.values()) {
|
|
466
|
+
byStatus[entry.status]++;
|
|
467
|
+
if (!isTerminalStatus(entry.status)) {
|
|
468
|
+
if (oldestPending === null || entry.receivedAt < oldestPending) {
|
|
469
|
+
oldestPending = entry.receivedAt;
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
return {
|
|
474
|
+
total: this.entries.size,
|
|
475
|
+
byStatus,
|
|
476
|
+
oldestPending,
|
|
477
|
+
};
|
|
478
|
+
}
|
|
479
|
+
/**
|
|
480
|
+
* Initializes the service with a crewly home directory for persistence.
|
|
481
|
+
* Must be called before loadPersistedState() when using getInstance().
|
|
482
|
+
*
|
|
483
|
+
* @param crewlyHome - Absolute path to the crewly home directory (e.g. ~/.crewly)
|
|
484
|
+
*/
|
|
485
|
+
init(crewlyHome) {
|
|
486
|
+
this.persistPath = path.join(crewlyHome, THREAD_STATUS_CONSTANTS.STORAGE_FILE);
|
|
487
|
+
this.logger.info('Initialized', { persistPath: this.persistPath });
|
|
488
|
+
}
|
|
489
|
+
/**
|
|
490
|
+
* Public convenience method: optionally re-inits the persist path,
|
|
491
|
+
* then loads persisted state from disk.
|
|
492
|
+
*
|
|
493
|
+
* @param crewlyHome - Optional crewly home directory to re-initialize with
|
|
494
|
+
*/
|
|
495
|
+
async load(crewlyHome) {
|
|
496
|
+
if (crewlyHome) {
|
|
497
|
+
this.init(crewlyHome);
|
|
498
|
+
}
|
|
499
|
+
await this.loadPersistedState();
|
|
500
|
+
}
|
|
501
|
+
/**
|
|
502
|
+
* Immediately flushes the current state to disk. Call during graceful shutdown
|
|
503
|
+
* to ensure no in-memory mutations are lost.
|
|
504
|
+
*/
|
|
505
|
+
async persist() {
|
|
506
|
+
// Cancel any debounced write — we flush synchronously
|
|
507
|
+
if (this.persistTimer) {
|
|
508
|
+
clearTimeout(this.persistTimer);
|
|
509
|
+
this.persistTimer = null;
|
|
510
|
+
}
|
|
511
|
+
await this.persistToDisk();
|
|
512
|
+
}
|
|
513
|
+
/**
|
|
514
|
+
* Returns all entries in the queue. Used for the thread-status API.
|
|
515
|
+
*
|
|
516
|
+
* @returns Array of all ThreadStatusEntry objects
|
|
517
|
+
*/
|
|
518
|
+
getAllEntries() {
|
|
519
|
+
return Array.from(this.entries.values());
|
|
520
|
+
}
|
|
521
|
+
/**
|
|
522
|
+
* Recovers pending threads after an orchestrator restart.
|
|
523
|
+
* Loads persisted state and handles each thread based on its status:
|
|
524
|
+
*
|
|
525
|
+
* 1. **enqueued/delivered/error** — Send a "I'm back online" confirmation
|
|
526
|
+
* via the platform, then re-enqueue for orchestrator processing.
|
|
527
|
+
* 2. **replied_to_follow_up** — Re-setup follow-up tracking (scheduled
|
|
528
|
+
* check + event subscription) to continue waiting for user reply.
|
|
529
|
+
* 3. **replied_waiting_actions** — Check delegated agent statuses. If all
|
|
530
|
+
* agents are done, transition to replied_completed. Otherwise keep waiting.
|
|
531
|
+
* 4. **replied_completed/expired** — Already terminal, skip.
|
|
532
|
+
*
|
|
533
|
+
* @param messageQueueService - The message queue service for re-enqueuing
|
|
534
|
+
* @param options - Optional callbacks for agent status checking and platform confirmations
|
|
535
|
+
* @returns Summary of recovery actions taken
|
|
536
|
+
*/
|
|
537
|
+
async recoverPendingThreads(messageQueueService, options) {
|
|
538
|
+
await this.loadPersistedState();
|
|
539
|
+
const pending = this.getPendingThreads();
|
|
540
|
+
let reEnqueued = 0;
|
|
541
|
+
let followUpRestored = 0;
|
|
542
|
+
let waitingActionsChecked = 0;
|
|
543
|
+
let delegationsCompleted = 0;
|
|
544
|
+
for (const entry of pending) {
|
|
545
|
+
// Branch 1: enqueued / delivered / error — confirm + re-enqueue
|
|
546
|
+
if (entry.status === 'enqueued' || entry.status === 'delivered' || entry.status === 'error') {
|
|
547
|
+
// Send platform confirmation if callback provided
|
|
548
|
+
if (options?.confirmCallback) {
|
|
549
|
+
try {
|
|
550
|
+
await options.confirmCallback(entry);
|
|
551
|
+
}
|
|
552
|
+
catch (err) {
|
|
553
|
+
this.logger.warn('Recovery confirm callback failed', {
|
|
554
|
+
threadKey: entry.threadKey,
|
|
555
|
+
error: err instanceof Error ? err.message : String(err),
|
|
556
|
+
});
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
// Re-enqueue for orchestrator processing
|
|
560
|
+
messageQueueService.enqueue({
|
|
561
|
+
content: `[RECOVERY] Unreplied thread from ${entry.receivedAt}: ${entry.messagePreview}`,
|
|
562
|
+
conversationId: entry.conversationId,
|
|
563
|
+
source: entry.source,
|
|
564
|
+
sourceMetadata: entry.sourceMetadata,
|
|
565
|
+
});
|
|
566
|
+
reEnqueued++;
|
|
567
|
+
}
|
|
568
|
+
// Branch 2: replied_to_follow_up — re-setup follow-up tracking
|
|
569
|
+
else if (entry.status === 'replied_to_follow_up') {
|
|
570
|
+
this.setupFollowUpTracking(entry.threadKey, entry);
|
|
571
|
+
followUpRestored++;
|
|
572
|
+
}
|
|
573
|
+
// Branch 3: replied_waiting_actions — check delegated agents
|
|
574
|
+
else if (entry.status === 'replied_waiting_actions') {
|
|
575
|
+
waitingActionsChecked++;
|
|
576
|
+
if (options?.agentStatusChecker && entry.delegatedAgents && entry.delegatedAgents.length > 0) {
|
|
577
|
+
const statuses = await Promise.all(entry.delegatedAgents.map((agent) => options.agentStatusChecker.getAgentWorkingStatus(agent)));
|
|
578
|
+
const allDone = statuses.every((status) => status === 'idle' || status === 'unknown');
|
|
579
|
+
if (allDone) {
|
|
580
|
+
entry.status = 'replied_completed';
|
|
581
|
+
entry.updatedAt = new Date().toISOString();
|
|
582
|
+
delegationsCompleted++;
|
|
583
|
+
this.logger.info('All delegated agents done on recovery, completing thread', {
|
|
584
|
+
threadKey: entry.threadKey,
|
|
585
|
+
agents: entry.delegatedAgents,
|
|
586
|
+
});
|
|
587
|
+
}
|
|
588
|
+
else {
|
|
589
|
+
// Agents still working — notify orchestrator to keep watching
|
|
590
|
+
messageQueueService.enqueue({
|
|
591
|
+
content: `[RECOVERY] Thread ${entry.threadKey} is waiting for agents: ${entry.delegatedAgents.join(', ')}. Some are still working.`,
|
|
592
|
+
conversationId: 'system',
|
|
593
|
+
source: 'system_event',
|
|
594
|
+
targetSession: ORCHESTRATOR_SESSION_NAME,
|
|
595
|
+
});
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
else {
|
|
599
|
+
// No agent status checker or no delegated agents — notify orchestrator
|
|
600
|
+
messageQueueService.enqueue({
|
|
601
|
+
content: `[RECOVERY] Thread ${entry.threadKey} is waiting for agents: ${entry.delegatedAgents?.join(', ') || 'unknown'}. Check their status.`,
|
|
602
|
+
conversationId: 'system',
|
|
603
|
+
source: 'system_event',
|
|
604
|
+
targetSession: ORCHESTRATOR_SESSION_NAME,
|
|
605
|
+
});
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
// Branch 4: replied_completed / expired — skip (already terminal)
|
|
609
|
+
// These are filtered out by getPendingThreads(), but defensive check
|
|
610
|
+
}
|
|
611
|
+
if (reEnqueued > 0 || followUpRestored > 0 || delegationsCompleted > 0) {
|
|
612
|
+
this.schedulePersist();
|
|
613
|
+
}
|
|
614
|
+
const expired = this.expireStale();
|
|
615
|
+
const cleaned = this.cleanup();
|
|
616
|
+
this.logger.info('Pending thread recovery complete', {
|
|
617
|
+
loaded: this.entries.size,
|
|
618
|
+
reEnqueued,
|
|
619
|
+
followUpRestored,
|
|
620
|
+
waitingActionsChecked,
|
|
621
|
+
delegationsCompleted,
|
|
622
|
+
expired,
|
|
623
|
+
cleaned,
|
|
624
|
+
});
|
|
625
|
+
return {
|
|
626
|
+
loaded: this.entries.size,
|
|
627
|
+
reEnqueued,
|
|
628
|
+
followUpRestored,
|
|
629
|
+
waitingActionsChecked,
|
|
630
|
+
delegationsCompleted,
|
|
631
|
+
expired,
|
|
632
|
+
cleaned,
|
|
633
|
+
};
|
|
634
|
+
}
|
|
635
|
+
/**
|
|
636
|
+
* Cleans up timers and follow-up tracking. Call on shutdown.
|
|
637
|
+
*/
|
|
638
|
+
destroy() {
|
|
639
|
+
if (this.persistTimer) {
|
|
640
|
+
clearTimeout(this.persistTimer);
|
|
641
|
+
this.persistTimer = null;
|
|
642
|
+
}
|
|
643
|
+
// Cancel all active follow-up tracking
|
|
644
|
+
for (const [threadKey, tracking] of this.followUpTracking) {
|
|
645
|
+
if (this.schedulerService) {
|
|
646
|
+
this.schedulerService.cancelCheck(tracking.scheduledCheckId);
|
|
647
|
+
}
|
|
648
|
+
if (this.eventBusService) {
|
|
649
|
+
this.eventBusService.unsubscribe(tracking.eventSubscriptionId);
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
this.followUpTracking.clear();
|
|
653
|
+
}
|
|
654
|
+
// ===========================================================================
|
|
655
|
+
// Private Helpers
|
|
656
|
+
// ===========================================================================
|
|
657
|
+
/**
|
|
658
|
+
* Retrieves an entry by threadKey or throws an error with a descriptive message.
|
|
659
|
+
*
|
|
660
|
+
* @param threadKey - Platform-specific thread identifier
|
|
661
|
+
* @param caller - Name of the calling method (for error messages)
|
|
662
|
+
* @returns The found entry
|
|
663
|
+
* @throws Error if entry is not found
|
|
664
|
+
*/
|
|
665
|
+
getOrThrow(threadKey, caller) {
|
|
666
|
+
const entry = this.entries.get(threadKey);
|
|
667
|
+
if (!entry) {
|
|
668
|
+
throw new Error(`${caller}: thread not found — threadKey=${threadKey}`);
|
|
669
|
+
}
|
|
670
|
+
return entry;
|
|
671
|
+
}
|
|
672
|
+
/**
|
|
673
|
+
* Sets up follow-up tracking for a replied_to_follow_up thread.
|
|
674
|
+
* Creates a scheduled check and an event subscription so that if
|
|
675
|
+
* the user replies, the check is cancelled and the thread is completed.
|
|
676
|
+
*
|
|
677
|
+
* @param threadKey - Platform-specific thread identifier
|
|
678
|
+
* @param entry - The thread status entry
|
|
679
|
+
*/
|
|
680
|
+
setupFollowUpTracking(threadKey, entry) {
|
|
681
|
+
// Schedule a check to verify user replied
|
|
682
|
+
let scheduledCheckId = '';
|
|
683
|
+
if (this.schedulerService) {
|
|
684
|
+
scheduledCheckId = this.schedulerService.scheduleCheck(ORCHESTRATOR_SESSION_NAME, FOLLOW_UP_CHECK_DELAY_MINUTES, `[FOLLOW-UP CHECK] Thread ${threadKey} (conv: ${entry.conversationId}) asked user for clarification ${FOLLOW_UP_CHECK_DELAY_MINUTES}m ago. Preview: "${entry.messagePreview}". Check if user has replied.`, 'check-in', { label: `follow-up:${threadKey}` });
|
|
685
|
+
this.logger.info('Scheduled follow-up check', {
|
|
686
|
+
threadKey,
|
|
687
|
+
scheduledCheckId,
|
|
688
|
+
delayMinutes: FOLLOW_UP_CHECK_DELAY_MINUTES,
|
|
689
|
+
});
|
|
690
|
+
}
|
|
691
|
+
else {
|
|
692
|
+
this.logger.warn('SchedulerService not set, skipping follow-up check scheduling', { threadKey });
|
|
693
|
+
}
|
|
694
|
+
// Subscribe to message events for this thread's conversation
|
|
695
|
+
let eventSubscriptionId = '';
|
|
696
|
+
if (this.eventBusService) {
|
|
697
|
+
const sub = this.eventBusService.subscribe({
|
|
698
|
+
eventType: ['message:received', 'agent:idle'],
|
|
699
|
+
filter: { conversationId: entry.conversationId },
|
|
700
|
+
subscriberSession: ORCHESTRATOR_SESSION_NAME,
|
|
701
|
+
oneShot: true,
|
|
702
|
+
ttlMinutes: FOLLOW_UP_CHECK_DELAY_MINUTES + 5,
|
|
703
|
+
messageTemplate: `[FOLLOW-UP REPLY] User replied to thread ${threadKey}. Original: "${entry.messagePreview}"`,
|
|
704
|
+
});
|
|
705
|
+
eventSubscriptionId = sub.id;
|
|
706
|
+
this.logger.info('Subscribed to follow-up reply events', {
|
|
707
|
+
threadKey,
|
|
708
|
+
subscriptionId: eventSubscriptionId,
|
|
709
|
+
});
|
|
710
|
+
}
|
|
711
|
+
else {
|
|
712
|
+
this.logger.warn('EventBusService not set, skipping follow-up event subscription', { threadKey });
|
|
713
|
+
}
|
|
714
|
+
if (scheduledCheckId || eventSubscriptionId) {
|
|
715
|
+
this.followUpTracking.set(threadKey, {
|
|
716
|
+
scheduledCheckId,
|
|
717
|
+
eventSubscriptionId,
|
|
718
|
+
});
|
|
719
|
+
}
|
|
720
|
+
}
|
|
721
|
+
/**
|
|
722
|
+
* Schedules a debounced persistence write to disk.
|
|
723
|
+
* Multiple mutations within PERSIST_DEBOUNCE_MS are batched into a single write.
|
|
724
|
+
*/
|
|
725
|
+
schedulePersist() {
|
|
726
|
+
if (!this.persistPath)
|
|
727
|
+
return;
|
|
728
|
+
if (this.persistTimer) {
|
|
729
|
+
clearTimeout(this.persistTimer);
|
|
730
|
+
}
|
|
731
|
+
this.persistTimer = setTimeout(() => {
|
|
732
|
+
this.persistTimer = null;
|
|
733
|
+
this.persistToDisk().catch((err) => {
|
|
734
|
+
this.logger.warn('Failed to persist thread status queue', { error: String(err) });
|
|
735
|
+
});
|
|
736
|
+
}, THREAD_STATUS_CONSTANTS.PERSIST_DEBOUNCE_MS);
|
|
737
|
+
}
|
|
738
|
+
/**
|
|
739
|
+
* Writes the current queue state to disk atomically.
|
|
740
|
+
*/
|
|
741
|
+
async persistToDisk() {
|
|
742
|
+
if (!this.persistPath) {
|
|
743
|
+
this.logger.warn('persistToDisk called before init — skipping');
|
|
744
|
+
return;
|
|
745
|
+
}
|
|
746
|
+
const state = {
|
|
747
|
+
version: PERSISTED_THREAD_STATUS_VERSION,
|
|
748
|
+
entries: Array.from(this.entries.values()),
|
|
749
|
+
lastCleanupAt: this.lastCleanupAt,
|
|
750
|
+
};
|
|
751
|
+
await atomicWriteFile(this.persistPath, JSON.stringify(state, null, 2));
|
|
752
|
+
this.logger.debug('Persisted to disk', { entryCount: state.entries.length });
|
|
753
|
+
}
|
|
754
|
+
}
|
|
755
|
+
//# sourceMappingURL=thread-status-queue.service.js.map
|