crewly 1.12.1 → 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/chat/chat.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/chat/chat.controller.js +29 -7
- package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.js +1 -1
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.js.map +1 -1
- 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 +33 -1
- 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 +78 -2
- 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 +248 -44
- 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 +51 -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 +31 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/types.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-client.service.d.ts +5 -0
- package/dist/backend/backend/src/services/cloud/cloud-client.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-client.service.js +7 -0
- package/dist/backend/backend/src/services/cloud/cloud-client.service.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/commitment-approval-guard.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/commitment-approval-guard.js +26 -0
- package/dist/backend/backend/src/services/orchestrator/commitment-approval-guard.js.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/onboarding/materialize-team.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/onboarding/materialize-team.js +19 -3
- package/dist/backend/backend/src/services/orchestrator/onboarding/materialize-team.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/services/wiki/wiki-migrate.service.d.ts +3 -0
- package/dist/backend/backend/src/services/wiki/wiki-migrate.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-migrate.service.js +21 -10
- package/dist/backend/backend/src/services/wiki/wiki-migrate.service.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/backend/src/websocket/chat.gateway.d.ts.map +1 -1
- package/dist/backend/backend/src/websocket/chat.gateway.js +7 -1
- package/dist/backend/backend/src/websocket/chat.gateway.js.map +1 -1
- 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/cloud/cloud-client.service.d.ts +5 -0
- package/dist/cli/backend/src/services/cloud/cloud-client.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/cloud/cloud-client.service.js +7 -0
- package/dist/cli/backend/src/services/cloud/cloud-client.service.js.map +1 -1
- 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/package.json +2 -2
- package/packages/crewly-agent/src/cli.ts +16 -6
- package/packages/crewly-agent/src/runtime/agent-runner.service.test.ts +311 -33
- package/packages/crewly-agent/src/runtime/agent-runner.service.ts +221 -12
- package/packages/crewly-agent/src/runtime/tool-registry.test.ts +19 -0
- package/packages/crewly-agent/src/runtime/tool-registry.ts +4 -1
- package/packages/crewly-agent/src/runtime/types.ts +65 -5
|
@@ -0,0 +1,734 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SOP Service
|
|
3
|
+
*
|
|
4
|
+
* Manages Standard Operating Procedures (SOPs) including loading,
|
|
5
|
+
* indexing, matching, and creating custom SOPs.
|
|
6
|
+
*
|
|
7
|
+
* @module services/sop/sop.service
|
|
8
|
+
*/
|
|
9
|
+
import * as path from 'path';
|
|
10
|
+
import * as fs from 'fs/promises';
|
|
11
|
+
import { existsSync } from 'fs';
|
|
12
|
+
import { parse as parseYAML, stringify as stringifyYAML } from 'yaml';
|
|
13
|
+
import { LoggerService } from '../core/logger.service.js';
|
|
14
|
+
import { SOP_CONSTANTS, } from '../../types/sop.types.js';
|
|
15
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
16
|
+
/**
|
|
17
|
+
* Service for managing Standard Operating Procedures
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```typescript
|
|
21
|
+
* const service = SOPService.getInstance();
|
|
22
|
+
* await service.initialize();
|
|
23
|
+
*
|
|
24
|
+
* const sops = await service.findRelevantSOPs({
|
|
25
|
+
* role: 'developer',
|
|
26
|
+
* taskContext: 'implementing a new API endpoint',
|
|
27
|
+
* });
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export class SOPService {
|
|
31
|
+
static instance = null;
|
|
32
|
+
logger;
|
|
33
|
+
basePath;
|
|
34
|
+
systemPath;
|
|
35
|
+
customPath;
|
|
36
|
+
indexPath;
|
|
37
|
+
index = null;
|
|
38
|
+
sopCache = new Map();
|
|
39
|
+
initialized = false;
|
|
40
|
+
lastFallbackReason = null;
|
|
41
|
+
/**
|
|
42
|
+
* Sentinel reason emitted when the canonical index is missing/unparseable
|
|
43
|
+
* and we synthesise an empty in-memory index so callers can degrade
|
|
44
|
+
* cleanly instead of receiving a 500.
|
|
45
|
+
*
|
|
46
|
+
* Surfaced via `getLastFallbackReason()` and propagated by the API
|
|
47
|
+
* controller to clients in the response envelope.
|
|
48
|
+
*/
|
|
49
|
+
static FALLBACK_REASON_INDEX_MISSING = 'index-missing-graceful-fallback';
|
|
50
|
+
/**
|
|
51
|
+
* Private constructor for singleton pattern
|
|
52
|
+
*
|
|
53
|
+
* @param basePath - Optional custom base path for SOPs
|
|
54
|
+
*/
|
|
55
|
+
constructor(basePath) {
|
|
56
|
+
this.logger = LoggerService.getInstance().createComponentLogger('SOPService');
|
|
57
|
+
this.basePath = basePath || path.join(this.getCrewlyHome(), SOP_CONSTANTS.PATHS.SOP_DIR);
|
|
58
|
+
this.systemPath = path.join(this.basePath, SOP_CONSTANTS.PATHS.SYSTEM_SOP_DIR);
|
|
59
|
+
this.customPath = path.join(this.basePath, SOP_CONSTANTS.PATHS.CUSTOM_SOP_DIR);
|
|
60
|
+
this.indexPath = path.join(this.basePath, SOP_CONSTANTS.PATHS.INDEX_FILE);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Gets the singleton instance
|
|
64
|
+
*
|
|
65
|
+
* @returns The SOPService instance
|
|
66
|
+
*/
|
|
67
|
+
static getInstance() {
|
|
68
|
+
if (!SOPService.instance) {
|
|
69
|
+
SOPService.instance = new SOPService();
|
|
70
|
+
}
|
|
71
|
+
return SOPService.instance;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Clears the singleton instance (for testing)
|
|
75
|
+
*/
|
|
76
|
+
static clearInstance() {
|
|
77
|
+
SOPService.instance = null;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Create an instance with a custom base path (for testing)
|
|
81
|
+
*
|
|
82
|
+
* @param basePath - Custom base path
|
|
83
|
+
* @returns SOPService instance
|
|
84
|
+
*/
|
|
85
|
+
static createWithPath(basePath) {
|
|
86
|
+
return new SOPService(basePath);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Get the Crewly home directory
|
|
90
|
+
*
|
|
91
|
+
* @returns Home directory path
|
|
92
|
+
*/
|
|
93
|
+
getCrewlyHome() {
|
|
94
|
+
return process.env.CREWLY_HOME || path.join(process.env.HOME || '', '.crewly');
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Initialize the service
|
|
98
|
+
*/
|
|
99
|
+
async initialize() {
|
|
100
|
+
if (this.initialized) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
// Ensure directories exist
|
|
104
|
+
await fs.mkdir(this.systemPath, { recursive: true });
|
|
105
|
+
await fs.mkdir(this.customPath, { recursive: true });
|
|
106
|
+
// Build index if not exists or outdated
|
|
107
|
+
await this.ensureIndex();
|
|
108
|
+
this.initialized = true;
|
|
109
|
+
this.logger.info('SOPService initialized', { basePath: this.basePath });
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Rebuild the SOP index from filesystem.
|
|
113
|
+
*
|
|
114
|
+
* Resilience contract (F8 — get-sops graceful fallback):
|
|
115
|
+
* - Walks `systemPath` and `customPath` to collect entries (each walker
|
|
116
|
+
* silently no-ops when its directory is absent).
|
|
117
|
+
* - Populates `this.index` with the collected entries (possibly empty)
|
|
118
|
+
* BEFORE attempting any disk write, so callers reading the index
|
|
119
|
+
* in-memory always see a valid object even if persistence fails.
|
|
120
|
+
* - Persists by ensuring `basePath` exists (`mkdir -p`) and then
|
|
121
|
+
* writing the index file. Persistence failure is logged-warn and
|
|
122
|
+
* swallowed — the in-memory index remains canonical for this process.
|
|
123
|
+
*
|
|
124
|
+
* Should not throw under normal failure modes (missing dir, ENOSPC,
|
|
125
|
+
* permission to write index). Pathological errors in helpers are
|
|
126
|
+
* logged inside them; this method returns successfully with an
|
|
127
|
+
* in-memory index regardless.
|
|
128
|
+
*/
|
|
129
|
+
async rebuildIndex() {
|
|
130
|
+
const entries = [];
|
|
131
|
+
// Index system SOPs
|
|
132
|
+
await this.indexDirectory(this.systemPath, entries, true);
|
|
133
|
+
// Index custom SOPs
|
|
134
|
+
await this.indexDirectory(this.customPath, entries, false);
|
|
135
|
+
// Always populate in-memory index FIRST so callers can read even if
|
|
136
|
+
// persistence below fails (e.g. read-only FS, ENOSPC).
|
|
137
|
+
this.index = {
|
|
138
|
+
version: SOP_CONSTANTS.INDEX_VERSION,
|
|
139
|
+
lastUpdated: new Date().toISOString(),
|
|
140
|
+
sops: entries,
|
|
141
|
+
};
|
|
142
|
+
// Persist — failures are logged but never thrown to the caller.
|
|
143
|
+
try {
|
|
144
|
+
await this.ensureBasePathExists();
|
|
145
|
+
await this.saveIndex();
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
this.logger.warn('SOP index regenerated in memory but persistence failed', {
|
|
149
|
+
indexPath: this.indexPath,
|
|
150
|
+
error: error instanceof Error ? error.message : String(error),
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
this.sopCache.clear();
|
|
154
|
+
this.logger.info('SOP index rebuilt', { count: entries.length });
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Ensure the SOP base directory exists before writing the index.
|
|
158
|
+
*
|
|
159
|
+
* Idempotent. Created with `recursive: true` so any missing parent
|
|
160
|
+
* (e.g. a fresh `~/.crewly` install where `sops/` was never created)
|
|
161
|
+
* is materialised in one call.
|
|
162
|
+
*/
|
|
163
|
+
async ensureBasePathExists() {
|
|
164
|
+
await fs.mkdir(this.basePath, { recursive: true });
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Index a directory recursively
|
|
168
|
+
*
|
|
169
|
+
* @param dirPath - Directory path to index
|
|
170
|
+
* @param entries - Array to add entries to
|
|
171
|
+
* @param isSystem - Whether these are system SOPs
|
|
172
|
+
*/
|
|
173
|
+
async indexDirectory(dirPath, entries, isSystem) {
|
|
174
|
+
if (!existsSync(dirPath)) {
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
try {
|
|
178
|
+
const items = await fs.readdir(dirPath, { withFileTypes: true });
|
|
179
|
+
for (const item of items) {
|
|
180
|
+
const itemPath = path.join(dirPath, item.name);
|
|
181
|
+
if (item.isDirectory()) {
|
|
182
|
+
await this.indexDirectory(itemPath, entries, isSystem);
|
|
183
|
+
}
|
|
184
|
+
else if (item.name.endsWith('.md')) {
|
|
185
|
+
const parsed = await this.parseSOPFile(itemPath);
|
|
186
|
+
if (parsed) {
|
|
187
|
+
entries.push({
|
|
188
|
+
id: parsed.frontmatter.id,
|
|
189
|
+
path: path.relative(this.basePath, itemPath),
|
|
190
|
+
role: parsed.frontmatter.role,
|
|
191
|
+
category: parsed.frontmatter.category,
|
|
192
|
+
priority: parsed.frontmatter.priority,
|
|
193
|
+
triggers: parsed.frontmatter.triggers,
|
|
194
|
+
title: parsed.frontmatter.title,
|
|
195
|
+
isSystem,
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
catch (error) {
|
|
202
|
+
this.logger.warn('Error indexing directory', { dirPath, error });
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Parse an SOP file from disk
|
|
207
|
+
*
|
|
208
|
+
* @param filePath - Path to the SOP file
|
|
209
|
+
* @returns Parsed SOP or null on error
|
|
210
|
+
*/
|
|
211
|
+
async parseSOPFile(filePath) {
|
|
212
|
+
try {
|
|
213
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
214
|
+
return this.parseSOPContent(content);
|
|
215
|
+
}
|
|
216
|
+
catch (error) {
|
|
217
|
+
this.logger.warn('Failed to parse SOP file', { filePath, error });
|
|
218
|
+
return null;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Parse SOP content (frontmatter + body)
|
|
223
|
+
*
|
|
224
|
+
* @param content - Raw file content
|
|
225
|
+
* @returns Parsed SOP or null on error
|
|
226
|
+
*/
|
|
227
|
+
parseSOPContent(content) {
|
|
228
|
+
// Match frontmatter (YAML between ---)
|
|
229
|
+
const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);
|
|
230
|
+
if (!frontmatterMatch) {
|
|
231
|
+
return null;
|
|
232
|
+
}
|
|
233
|
+
const [, frontmatterStr, body] = frontmatterMatch;
|
|
234
|
+
try {
|
|
235
|
+
const frontmatter = parseYAML(frontmatterStr);
|
|
236
|
+
// Validate required fields
|
|
237
|
+
if (!frontmatter.id || !frontmatter.role || !frontmatter.category) {
|
|
238
|
+
return null;
|
|
239
|
+
}
|
|
240
|
+
return {
|
|
241
|
+
frontmatter: {
|
|
242
|
+
id: frontmatter.id,
|
|
243
|
+
version: frontmatter.version || 1,
|
|
244
|
+
createdAt: frontmatter.createdAt || new Date().toISOString(),
|
|
245
|
+
updatedAt: frontmatter.updatedAt || new Date().toISOString(),
|
|
246
|
+
createdBy: frontmatter.createdBy || 'system',
|
|
247
|
+
role: frontmatter.role,
|
|
248
|
+
category: frontmatter.category,
|
|
249
|
+
priority: frontmatter.priority ?? SOP_CONSTANTS.MATCHING.DEFAULT_PRIORITY,
|
|
250
|
+
title: frontmatter.title || frontmatter.id,
|
|
251
|
+
description: frontmatter.description || '',
|
|
252
|
+
triggers: frontmatter.triggers || [],
|
|
253
|
+
conditions: frontmatter.conditions,
|
|
254
|
+
tags: frontmatter.tags || [],
|
|
255
|
+
relatedSOPs: frontmatter.relatedSOPs,
|
|
256
|
+
},
|
|
257
|
+
content: body.trim(),
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
catch {
|
|
261
|
+
return null;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Convert parsed SOP to full SOP object
|
|
266
|
+
*
|
|
267
|
+
* @param parsed - Parsed SOP
|
|
268
|
+
* @returns Full SOP object
|
|
269
|
+
*/
|
|
270
|
+
parsedToSOP(parsed) {
|
|
271
|
+
return {
|
|
272
|
+
...parsed.frontmatter,
|
|
273
|
+
content: parsed.content,
|
|
274
|
+
examples: parsed.examples,
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Get an SOP by ID
|
|
279
|
+
*
|
|
280
|
+
* @param id - SOP identifier
|
|
281
|
+
* @returns SOP or null if not found
|
|
282
|
+
*/
|
|
283
|
+
async getSOP(id) {
|
|
284
|
+
// Check cache
|
|
285
|
+
if (this.sopCache.has(id)) {
|
|
286
|
+
return this.sopCache.get(id);
|
|
287
|
+
}
|
|
288
|
+
// Find in index
|
|
289
|
+
const index = await this.getIndex();
|
|
290
|
+
const entry = index.sops.find((e) => e.id === id);
|
|
291
|
+
if (!entry) {
|
|
292
|
+
return null;
|
|
293
|
+
}
|
|
294
|
+
// Load file
|
|
295
|
+
const filePath = path.join(this.basePath, entry.path);
|
|
296
|
+
const parsed = await this.parseSOPFile(filePath);
|
|
297
|
+
if (parsed) {
|
|
298
|
+
const sop = this.parsedToSOP(parsed);
|
|
299
|
+
this.sopCache.set(id, sop);
|
|
300
|
+
return sop;
|
|
301
|
+
}
|
|
302
|
+
return null;
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Get all SOPs for a specific role
|
|
306
|
+
*
|
|
307
|
+
* @param role - Role to filter by
|
|
308
|
+
* @returns Array of SOPs
|
|
309
|
+
*/
|
|
310
|
+
async getSOPsByRole(role) {
|
|
311
|
+
const index = await this.getIndex();
|
|
312
|
+
const entries = index.sops.filter((e) => e.role === role || e.role === 'all' || role === 'all');
|
|
313
|
+
const sops = [];
|
|
314
|
+
for (const entry of entries) {
|
|
315
|
+
const sop = await this.getSOP(entry.id);
|
|
316
|
+
if (sop) {
|
|
317
|
+
sops.push(sop);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
return sops;
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Get all SOPs in a category
|
|
324
|
+
*
|
|
325
|
+
* @param category - Category to filter by
|
|
326
|
+
* @returns Array of SOPs
|
|
327
|
+
*/
|
|
328
|
+
async getSOPsByCategory(category) {
|
|
329
|
+
const index = await this.getIndex();
|
|
330
|
+
const entries = index.sops.filter((e) => e.category === category);
|
|
331
|
+
const sops = [];
|
|
332
|
+
for (const entry of entries) {
|
|
333
|
+
const sop = await this.getSOP(entry.id);
|
|
334
|
+
if (sop) {
|
|
335
|
+
sops.push(sop);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
return sops;
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Find SOPs relevant to the given context
|
|
342
|
+
*
|
|
343
|
+
* @param params - Match parameters
|
|
344
|
+
* @returns Array of matching SOPs
|
|
345
|
+
*/
|
|
346
|
+
async findRelevantSOPs(params) {
|
|
347
|
+
const index = await this.getIndex();
|
|
348
|
+
const { role, taskContext, taskType, limit = SOP_CONSTANTS.LIMITS.MAX_SOPS_IN_PROMPT } = params;
|
|
349
|
+
// Filter and score entries
|
|
350
|
+
const scored = index.sops
|
|
351
|
+
.filter((entry) => this.matchesRole(entry, role))
|
|
352
|
+
.map((entry) => ({
|
|
353
|
+
entry,
|
|
354
|
+
score: this.scoreRelevance(entry, taskContext || '', taskType),
|
|
355
|
+
}))
|
|
356
|
+
.filter((s) => s.score >= SOP_CONSTANTS.MATCHING.MIN_TRIGGER_MATCH_SCORE)
|
|
357
|
+
.sort((a, b) => {
|
|
358
|
+
// Sort by score, then priority
|
|
359
|
+
if (b.score !== a.score) {
|
|
360
|
+
return b.score - a.score;
|
|
361
|
+
}
|
|
362
|
+
return b.entry.priority - a.entry.priority;
|
|
363
|
+
})
|
|
364
|
+
.slice(0, limit);
|
|
365
|
+
// Load full SOPs
|
|
366
|
+
const sops = [];
|
|
367
|
+
for (const { entry } of scored) {
|
|
368
|
+
const sop = await this.getSOP(entry.id);
|
|
369
|
+
if (sop) {
|
|
370
|
+
sops.push(sop);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
return sops;
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* Check if an SOP matches a role
|
|
377
|
+
*
|
|
378
|
+
* @param entry - SOP index entry
|
|
379
|
+
* @param role - Role to check
|
|
380
|
+
* @returns True if matches
|
|
381
|
+
*/
|
|
382
|
+
matchesRole(entry, role) {
|
|
383
|
+
if (entry.role === 'all') {
|
|
384
|
+
return true;
|
|
385
|
+
}
|
|
386
|
+
if (entry.role === role) {
|
|
387
|
+
return true;
|
|
388
|
+
}
|
|
389
|
+
// Handle role hierarchies
|
|
390
|
+
const roleHierarchy = {
|
|
391
|
+
'frontend-developer': ['developer'],
|
|
392
|
+
'backend-developer': ['developer'],
|
|
393
|
+
developer: [],
|
|
394
|
+
pm: [],
|
|
395
|
+
tpm: [],
|
|
396
|
+
pgm: [],
|
|
397
|
+
qa: [],
|
|
398
|
+
tester: [],
|
|
399
|
+
orchestrator: [],
|
|
400
|
+
designer: [],
|
|
401
|
+
devops: [],
|
|
402
|
+
};
|
|
403
|
+
const parentRoles = roleHierarchy[role] || [];
|
|
404
|
+
return parentRoles.includes(entry.role);
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Score how relevant an SOP is to the given context
|
|
408
|
+
*
|
|
409
|
+
* @param entry - SOP index entry
|
|
410
|
+
* @param context - Context string
|
|
411
|
+
* @param taskType - Optional task type
|
|
412
|
+
* @returns Relevance score (0-1)
|
|
413
|
+
*/
|
|
414
|
+
scoreRelevance(entry, context, taskType) {
|
|
415
|
+
let score = 0;
|
|
416
|
+
const contextLower = context.toLowerCase();
|
|
417
|
+
const words = contextLower.split(/\s+/);
|
|
418
|
+
// Score trigger matches
|
|
419
|
+
for (const trigger of entry.triggers) {
|
|
420
|
+
const triggerLower = trigger.toLowerCase();
|
|
421
|
+
if (contextLower.includes(triggerLower)) {
|
|
422
|
+
score += 0.3;
|
|
423
|
+
}
|
|
424
|
+
if (words.includes(triggerLower)) {
|
|
425
|
+
score += 0.2;
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
// Score category match
|
|
429
|
+
if (taskType && entry.category === taskType) {
|
|
430
|
+
score += SOP_CONSTANTS.MATCHING.CATEGORY_MATCH_BOOST;
|
|
431
|
+
}
|
|
432
|
+
// Normalize score
|
|
433
|
+
return Math.min(score, 1.0);
|
|
434
|
+
}
|
|
435
|
+
/**
|
|
436
|
+
* Generate SOP context string for prompts
|
|
437
|
+
*
|
|
438
|
+
* @param params - Match parameters
|
|
439
|
+
* @returns Formatted SOP context string
|
|
440
|
+
*/
|
|
441
|
+
async generateSOPContext(params) {
|
|
442
|
+
const sops = await this.findRelevantSOPs(params);
|
|
443
|
+
// Surface the team's own installed/custom SOPs (written to the team library
|
|
444
|
+
// by the wiki editor / update-sop skill) — the read path historically only
|
|
445
|
+
// read the global store, so team SOPs were invisible to get-sops.
|
|
446
|
+
const teamSops = params.teamId ? await this.readTeamSOPs(params.teamId) : [];
|
|
447
|
+
if (sops.length === 0 && teamSops.length === 0) {
|
|
448
|
+
return '';
|
|
449
|
+
}
|
|
450
|
+
const render = (title, category, priority, raw) => {
|
|
451
|
+
const content = raw.length > SOP_CONSTANTS.LIMITS.MAX_SOP_CONTENT_LENGTH
|
|
452
|
+
? raw.substring(0, SOP_CONSTANTS.LIMITS.MAX_SOP_CONTENT_LENGTH) + '\n\n*[Content truncated]*'
|
|
453
|
+
: raw;
|
|
454
|
+
return `### ${title}\n\n*Category: ${category} | Priority: ${priority}*\n\n${content}\n\n---\n\n`;
|
|
455
|
+
};
|
|
456
|
+
let context = '## Relevant Standard Operating Procedures\n\n';
|
|
457
|
+
context += 'Follow these procedures for your current work:\n\n';
|
|
458
|
+
for (const sop of sops) {
|
|
459
|
+
context += render(sop.title, sop.category, sop.priority, sop.content);
|
|
460
|
+
}
|
|
461
|
+
if (teamSops.length > 0) {
|
|
462
|
+
context += '## Team SOPs\n\n';
|
|
463
|
+
context += "Your team's own SOPs:\n\n";
|
|
464
|
+
for (const sop of teamSops) {
|
|
465
|
+
context += render(sop.title, sop.category, 'team', sop.content);
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
return context;
|
|
469
|
+
}
|
|
470
|
+
/**
|
|
471
|
+
* Read a team's installed/custom SOP library from
|
|
472
|
+
* `~/.crewly/teams/<teamId>/sops/` (recursively). Each `.md` file becomes a
|
|
473
|
+
* SOP entry with its frontmatter `title`/`category` (falling back to the
|
|
474
|
+
* filename / parent folder). Read-only; tolerant of a missing directory.
|
|
475
|
+
*
|
|
476
|
+
* @param teamId - The team whose SOP library to read.
|
|
477
|
+
* @returns Team SOP entries (possibly empty).
|
|
478
|
+
*/
|
|
479
|
+
async readTeamSOPs(teamId) {
|
|
480
|
+
const root = path.join(this.getCrewlyHome(), 'teams', teamId, 'sops');
|
|
481
|
+
const out = [];
|
|
482
|
+
const walk = async (dir, categoryHint) => {
|
|
483
|
+
let entries;
|
|
484
|
+
try {
|
|
485
|
+
entries = await fs.readdir(dir, { withFileTypes: true });
|
|
486
|
+
}
|
|
487
|
+
catch {
|
|
488
|
+
return;
|
|
489
|
+
}
|
|
490
|
+
for (const entry of entries) {
|
|
491
|
+
if (entry.name.startsWith('.'))
|
|
492
|
+
continue;
|
|
493
|
+
const abs = path.join(dir, entry.name);
|
|
494
|
+
if (entry.isDirectory()) {
|
|
495
|
+
await walk(abs, entry.name);
|
|
496
|
+
}
|
|
497
|
+
else if (entry.isFile() && entry.name.endsWith('.md')) {
|
|
498
|
+
try {
|
|
499
|
+
const raw = await fs.readFile(abs, 'utf-8');
|
|
500
|
+
const titleMatch = raw.match(/^\s*title:\s*(.+?)\s*$/m);
|
|
501
|
+
const catMatch = raw.match(/^\s*category:\s*(.+?)\s*$/m);
|
|
502
|
+
const body = raw.replace(/^---\n[\s\S]*?\n---\n?/, '').trim();
|
|
503
|
+
out.push({
|
|
504
|
+
title: titleMatch ? titleMatch[1].replace(/^["']|["']$/g, '') : path.basename(entry.name, '.md'),
|
|
505
|
+
category: catMatch ? catMatch[1].trim() : categoryHint || 'team',
|
|
506
|
+
content: body || raw,
|
|
507
|
+
});
|
|
508
|
+
}
|
|
509
|
+
catch {
|
|
510
|
+
// skip unreadable file
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
};
|
|
515
|
+
await walk(root, '');
|
|
516
|
+
return out;
|
|
517
|
+
}
|
|
518
|
+
/**
|
|
519
|
+
* Create a custom SOP
|
|
520
|
+
*
|
|
521
|
+
* @param sopData - SOP data (without id, timestamps, version)
|
|
522
|
+
* @returns Created SOP ID
|
|
523
|
+
*/
|
|
524
|
+
async createCustomSOP(sopData) {
|
|
525
|
+
const id = `custom-${uuidv4().substring(0, 8)}`;
|
|
526
|
+
const now = new Date().toISOString();
|
|
527
|
+
const sop = {
|
|
528
|
+
...sopData,
|
|
529
|
+
id,
|
|
530
|
+
version: 1,
|
|
531
|
+
createdAt: now,
|
|
532
|
+
updatedAt: now,
|
|
533
|
+
};
|
|
534
|
+
// Create file
|
|
535
|
+
const filePath = path.join(this.customPath, `${id}.md`);
|
|
536
|
+
const content = this.sopToMarkdown(sop);
|
|
537
|
+
await fs.writeFile(filePath, content, 'utf-8');
|
|
538
|
+
// Update index
|
|
539
|
+
await this.rebuildIndex();
|
|
540
|
+
this.logger.info('Custom SOP created', { id, title: sop.title });
|
|
541
|
+
return id;
|
|
542
|
+
}
|
|
543
|
+
/**
|
|
544
|
+
* Update an existing SOP
|
|
545
|
+
*
|
|
546
|
+
* @param id - SOP identifier
|
|
547
|
+
* @param updates - Partial SOP updates
|
|
548
|
+
*/
|
|
549
|
+
async updateSOP(id, updates) {
|
|
550
|
+
const index = await this.getIndex();
|
|
551
|
+
const entry = index.sops.find((e) => e.id === id);
|
|
552
|
+
if (!entry) {
|
|
553
|
+
throw new Error(`SOP not found: ${id}`);
|
|
554
|
+
}
|
|
555
|
+
if (entry.isSystem) {
|
|
556
|
+
throw new Error('Cannot update system SOPs');
|
|
557
|
+
}
|
|
558
|
+
const existingSOP = await this.getSOP(id);
|
|
559
|
+
if (!existingSOP) {
|
|
560
|
+
throw new Error(`SOP not found: ${id}`);
|
|
561
|
+
}
|
|
562
|
+
const updatedSOP = {
|
|
563
|
+
...existingSOP,
|
|
564
|
+
...updates,
|
|
565
|
+
id: existingSOP.id, // Prevent ID change
|
|
566
|
+
version: existingSOP.version + 1,
|
|
567
|
+
updatedAt: new Date().toISOString(),
|
|
568
|
+
};
|
|
569
|
+
// Update file
|
|
570
|
+
const filePath = path.join(this.basePath, entry.path);
|
|
571
|
+
const content = this.sopToMarkdown(updatedSOP);
|
|
572
|
+
await fs.writeFile(filePath, content, 'utf-8');
|
|
573
|
+
// Update cache and index
|
|
574
|
+
this.sopCache.set(id, updatedSOP);
|
|
575
|
+
await this.rebuildIndex();
|
|
576
|
+
this.logger.info('SOP updated', { id, version: updatedSOP.version });
|
|
577
|
+
}
|
|
578
|
+
/**
|
|
579
|
+
* Delete a custom SOP
|
|
580
|
+
*
|
|
581
|
+
* @param id - SOP identifier
|
|
582
|
+
*/
|
|
583
|
+
async deleteSOP(id) {
|
|
584
|
+
const index = await this.getIndex();
|
|
585
|
+
const entry = index.sops.find((e) => e.id === id);
|
|
586
|
+
if (!entry) {
|
|
587
|
+
throw new Error(`SOP not found: ${id}`);
|
|
588
|
+
}
|
|
589
|
+
if (entry.isSystem) {
|
|
590
|
+
throw new Error('Cannot delete system SOPs');
|
|
591
|
+
}
|
|
592
|
+
// Delete file
|
|
593
|
+
const filePath = path.join(this.basePath, entry.path);
|
|
594
|
+
await fs.unlink(filePath);
|
|
595
|
+
// Update cache and index
|
|
596
|
+
this.sopCache.delete(id);
|
|
597
|
+
await this.rebuildIndex();
|
|
598
|
+
this.logger.info('SOP deleted', { id });
|
|
599
|
+
}
|
|
600
|
+
/**
|
|
601
|
+
* Get the current SOP index
|
|
602
|
+
*
|
|
603
|
+
* @returns SOP index
|
|
604
|
+
*/
|
|
605
|
+
async getIndex() {
|
|
606
|
+
if (!this.index) {
|
|
607
|
+
await this.ensureIndex();
|
|
608
|
+
}
|
|
609
|
+
return this.index;
|
|
610
|
+
}
|
|
611
|
+
/**
|
|
612
|
+
* Search SOPs by query string
|
|
613
|
+
*
|
|
614
|
+
* @param query - Search query
|
|
615
|
+
* @returns Matching index entries
|
|
616
|
+
*/
|
|
617
|
+
async searchSOPs(query) {
|
|
618
|
+
const index = await this.getIndex();
|
|
619
|
+
const queryLower = query.toLowerCase();
|
|
620
|
+
return index.sops.filter((entry) => {
|
|
621
|
+
// Search in title
|
|
622
|
+
if (entry.title.toLowerCase().includes(queryLower)) {
|
|
623
|
+
return true;
|
|
624
|
+
}
|
|
625
|
+
// Search in triggers
|
|
626
|
+
if (entry.triggers.some((t) => t.toLowerCase().includes(queryLower))) {
|
|
627
|
+
return true;
|
|
628
|
+
}
|
|
629
|
+
// Search in category
|
|
630
|
+
if (entry.category.toLowerCase().includes(queryLower)) {
|
|
631
|
+
return true;
|
|
632
|
+
}
|
|
633
|
+
return false;
|
|
634
|
+
});
|
|
635
|
+
}
|
|
636
|
+
/**
|
|
637
|
+
* Ensure the index exists (load from disk or rebuild from filesystem).
|
|
638
|
+
*
|
|
639
|
+
* Graceful-fallback contract (F8):
|
|
640
|
+
* - Happy path: read `index.json`, JSON.parse it, set `this.index`.
|
|
641
|
+
* `lastFallbackReason` is cleared.
|
|
642
|
+
* - Index missing/unparseable: invoke `rebuildIndex()`. If rebuild
|
|
643
|
+
* succeeded with N>=0 entries, mark fallback reason iff the index
|
|
644
|
+
* was rebuilt due to missing-on-disk (so the controller can surface
|
|
645
|
+
* `index-missing-graceful-fallback` to clients).
|
|
646
|
+
* - Catastrophic rebuild failure (extremely unlikely — rebuild itself
|
|
647
|
+
* swallows persistence errors): synthesise an empty in-memory index
|
|
648
|
+
* and stamp `lastFallbackReason`. The endpoint returns 200 with an
|
|
649
|
+
* empty payload rather than 500.
|
|
650
|
+
*/
|
|
651
|
+
async ensureIndex() {
|
|
652
|
+
try {
|
|
653
|
+
const content = await fs.readFile(this.indexPath, 'utf-8');
|
|
654
|
+
this.index = JSON.parse(content);
|
|
655
|
+
this.lastFallbackReason = null;
|
|
656
|
+
return;
|
|
657
|
+
}
|
|
658
|
+
catch {
|
|
659
|
+
// fall through to rebuild
|
|
660
|
+
}
|
|
661
|
+
try {
|
|
662
|
+
await this.rebuildIndex();
|
|
663
|
+
// Index was missing/unparseable on disk; even after a successful
|
|
664
|
+
// rebuild we stamp the reason so the controller can advertise the
|
|
665
|
+
// degraded path to callers (telemetry / client-side back-off).
|
|
666
|
+
this.lastFallbackReason = SOPService.FALLBACK_REASON_INDEX_MISSING;
|
|
667
|
+
}
|
|
668
|
+
catch (error) {
|
|
669
|
+
this.logger.warn('SOP index rebuild failed catastrophically — serving empty fallback', { error: error instanceof Error ? error.message : String(error) });
|
|
670
|
+
this.index = {
|
|
671
|
+
version: SOP_CONSTANTS.INDEX_VERSION,
|
|
672
|
+
lastUpdated: new Date().toISOString(),
|
|
673
|
+
sops: [],
|
|
674
|
+
};
|
|
675
|
+
this.lastFallbackReason = SOPService.FALLBACK_REASON_INDEX_MISSING;
|
|
676
|
+
}
|
|
677
|
+
}
|
|
678
|
+
/**
|
|
679
|
+
* Get the reason for the last graceful fallback, if any.
|
|
680
|
+
*
|
|
681
|
+
* Returns the `FALLBACK_REASON_INDEX_MISSING` sentinel when the most
|
|
682
|
+
* recent index load fell back to a regenerated/synthesised in-memory
|
|
683
|
+
* index. Returns null when the cached index was loaded directly from
|
|
684
|
+
* a healthy `index.json` on disk.
|
|
685
|
+
*
|
|
686
|
+
* @returns Fallback reason string, or null.
|
|
687
|
+
*/
|
|
688
|
+
getLastFallbackReason() {
|
|
689
|
+
return this.lastFallbackReason;
|
|
690
|
+
}
|
|
691
|
+
/**
|
|
692
|
+
* Save the index to disk
|
|
693
|
+
*/
|
|
694
|
+
async saveIndex() {
|
|
695
|
+
// Ensure the store dir exists — on a fresh machine ~/.crewly/sops may not
|
|
696
|
+
// exist yet, and the first query rebuilds the index before initialize()
|
|
697
|
+
// has created it (otherwise saveIndex throws ENOENT → 500 on first call).
|
|
698
|
+
await fs.mkdir(path.dirname(this.indexPath), { recursive: true });
|
|
699
|
+
await fs.writeFile(this.indexPath, JSON.stringify(this.index, null, 2), 'utf-8');
|
|
700
|
+
}
|
|
701
|
+
/**
|
|
702
|
+
* Convert an SOP to Markdown format
|
|
703
|
+
*
|
|
704
|
+
* @param sop - SOP to convert
|
|
705
|
+
* @returns Markdown string
|
|
706
|
+
*/
|
|
707
|
+
sopToMarkdown(sop) {
|
|
708
|
+
const frontmatter = {
|
|
709
|
+
id: sop.id,
|
|
710
|
+
version: sop.version,
|
|
711
|
+
createdAt: sop.createdAt,
|
|
712
|
+
updatedAt: sop.updatedAt,
|
|
713
|
+
createdBy: sop.createdBy,
|
|
714
|
+
role: sop.role,
|
|
715
|
+
category: sop.category,
|
|
716
|
+
priority: sop.priority,
|
|
717
|
+
title: sop.title,
|
|
718
|
+
description: sop.description,
|
|
719
|
+
triggers: sop.triggers,
|
|
720
|
+
conditions: sop.conditions,
|
|
721
|
+
tags: sop.tags,
|
|
722
|
+
relatedSOPs: sop.relatedSOPs,
|
|
723
|
+
};
|
|
724
|
+
return `---\n${stringifyYAML(frontmatter)}---\n\n${sop.content}`;
|
|
725
|
+
}
|
|
726
|
+
/**
|
|
727
|
+
* Clear the SOP cache
|
|
728
|
+
*/
|
|
729
|
+
clearCache() {
|
|
730
|
+
this.sopCache.clear();
|
|
731
|
+
this.logger.debug('SOP cache cleared');
|
|
732
|
+
}
|
|
733
|
+
}
|
|
734
|
+
//# sourceMappingURL=sop.service.js.map
|