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
package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js
ADDED
|
@@ -0,0 +1,816 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Crewly Agent External Runtime Service
|
|
3
|
+
*
|
|
4
|
+
* Runs the Crewly Agent as a dedicated executable process and communicates
|
|
5
|
+
* with it over a newline-delimited JSON protocol on stdin/stdout.
|
|
6
|
+
*
|
|
7
|
+
* This keeps OSS integration points intact while moving the agent runtime
|
|
8
|
+
* behind an external process boundary so it can be versioned separately.
|
|
9
|
+
*
|
|
10
|
+
* @module services/agent/crewly-agent/crewly-agent-external-runtime.service
|
|
11
|
+
*/
|
|
12
|
+
import { spawn } from 'child_process';
|
|
13
|
+
import { promises as fs } from 'fs';
|
|
14
|
+
import * as path from 'path';
|
|
15
|
+
import { homedir } from 'os';
|
|
16
|
+
import { RuntimeAgentService } from '../runtime-agent.service.abstract.js';
|
|
17
|
+
import { InProcessLogBuffer } from './in-process-log-buffer.js';
|
|
18
|
+
import { CREWLY_AGENT_DEFAULTS } from './types.js';
|
|
19
|
+
import { updateAgentHeartbeat } from '../agent-heartbeat.service.js';
|
|
20
|
+
import { PtyActivityTrackerService } from '../pty-activity-tracker.service.js';
|
|
21
|
+
import { TokenUsageService } from '../../monitoring/token-usage.service.js';
|
|
22
|
+
import { getSettingsService } from '../../settings/settings.service.js';
|
|
23
|
+
import { LoggerService } from '../../core/logger.service.js';
|
|
24
|
+
import { ADDON_CONSTANTS, CREWLY_CONSTANTS, CREWLY_AGENT_MANAGED_COMMAND, ENV_CONSTANTS, LEGACY_CREWLY_AGENT_SENTINELS, RUNTIME_TYPES, } from '../../../constants.js';
|
|
25
|
+
export class CrewlyAgentExternalRuntimeService extends RuntimeAgentService {
|
|
26
|
+
initialized = false;
|
|
27
|
+
ready = false;
|
|
28
|
+
currentSessionName = null;
|
|
29
|
+
currentMemberId;
|
|
30
|
+
currentRoleName = 'orchestrator';
|
|
31
|
+
currentModelString = 'unknown';
|
|
32
|
+
child = null;
|
|
33
|
+
logBuffer;
|
|
34
|
+
heartbeatTimer = null;
|
|
35
|
+
stdoutBuffer = '';
|
|
36
|
+
/**
|
|
37
|
+
* In-flight runs keyed by correlation id, in dispatch order.
|
|
38
|
+
*
|
|
39
|
+
* A single resolve/reject pair used to live here instead. Delivery is
|
|
40
|
+
* fire-and-forget, so two messages dispatched milliseconds apart both wrote
|
|
41
|
+
* that pair: the first run's handlers were overwritten and its promise was
|
|
42
|
+
* orphaned forever, while the second promise got settled with the FIRST
|
|
43
|
+
* run's result. Observed live — a reply meant for one Slack thread was
|
|
44
|
+
* booked against another, the orphan later tripped the IPC deadline and
|
|
45
|
+
* recycled a perfectly healthy child, and the second message's real answer
|
|
46
|
+
* was swallowed by the `?.` on an already-cleared slot.
|
|
47
|
+
*/
|
|
48
|
+
pendingRuns = new Map();
|
|
49
|
+
/** Monotonic source for run correlation ids. */
|
|
50
|
+
runCounter = 0;
|
|
51
|
+
pendingInitResolve = null;
|
|
52
|
+
pendingInitReject = null;
|
|
53
|
+
storedConfig = null;
|
|
54
|
+
/** Guard against overlapping {@link recycleChild} calls. */
|
|
55
|
+
recycling = false;
|
|
56
|
+
/**
|
|
57
|
+
* Bound signal forwarder so we can register it on parent SIGINT/
|
|
58
|
+
* SIGTERM/SIGHUP and detach the same identity on shutdown. Null
|
|
59
|
+
* when no child is currently attached.
|
|
60
|
+
*/
|
|
61
|
+
signalForwarder = null;
|
|
62
|
+
constructor(sessionHelper, projectRoot) {
|
|
63
|
+
super(sessionHelper, projectRoot);
|
|
64
|
+
this.logBuffer = InProcessLogBuffer.getInstance();
|
|
65
|
+
}
|
|
66
|
+
getRuntimeType() {
|
|
67
|
+
return RUNTIME_TYPES.CREWLY_AGENT;
|
|
68
|
+
}
|
|
69
|
+
async detectRuntimeSpecific(_sessionName) {
|
|
70
|
+
return this.isReady();
|
|
71
|
+
}
|
|
72
|
+
getRuntimeReadyPatterns() {
|
|
73
|
+
return ['Crewly Agent Ready'];
|
|
74
|
+
}
|
|
75
|
+
getRuntimeErrorPatterns() {
|
|
76
|
+
return [];
|
|
77
|
+
}
|
|
78
|
+
getRuntimeExitPatterns() {
|
|
79
|
+
return [];
|
|
80
|
+
}
|
|
81
|
+
async initializeInProcess(sessionName, config, roleName) {
|
|
82
|
+
this.currentSessionName = sessionName;
|
|
83
|
+
this.currentMemberId = config?.memberId;
|
|
84
|
+
this.currentRoleName = roleName || 'orchestrator';
|
|
85
|
+
const systemPrompt = await this.buildEnhancedSystemPrompt(this.currentRoleName);
|
|
86
|
+
const fullConfig = {
|
|
87
|
+
model: config?.model || CREWLY_AGENT_DEFAULTS.DEFAULT_MODEL,
|
|
88
|
+
maxSteps: config?.maxSteps || CREWLY_AGENT_DEFAULTS.MAX_STEPS,
|
|
89
|
+
sessionName,
|
|
90
|
+
apiBaseUrl: config?.apiBaseUrl || CREWLY_AGENT_DEFAULTS.API_BASE_URL,
|
|
91
|
+
systemPrompt: config?.systemPrompt || systemPrompt,
|
|
92
|
+
maxHistoryMessages: config?.maxHistoryMessages || CREWLY_AGENT_DEFAULTS.MAX_HISTORY_MESSAGES,
|
|
93
|
+
compactionThreshold: config?.compactionThreshold || CREWLY_AGENT_DEFAULTS.COMPACTION_THRESHOLD,
|
|
94
|
+
projectPath: config?.projectPath,
|
|
95
|
+
};
|
|
96
|
+
this.storedConfig = fullConfig;
|
|
97
|
+
this.currentModelString = `${fullConfig.model.provider}/${fullConfig.model.modelId}`;
|
|
98
|
+
await this.spawnAgentProcess(fullConfig);
|
|
99
|
+
this.initialized = true;
|
|
100
|
+
this.ready = true;
|
|
101
|
+
this.logBuffer.registerSession(sessionName);
|
|
102
|
+
this.logBuffer.append(sessionName, 'info', `Crewly Agent initialized [external] (${this.currentModelString})`);
|
|
103
|
+
this.startHeartbeat(sessionName);
|
|
104
|
+
}
|
|
105
|
+
async handleMessage(message, metadata) {
|
|
106
|
+
if (!this.isReady() || !this.child) {
|
|
107
|
+
throw new Error('Crewly Agent runtime not initialized. Call initializeInProcess() first.');
|
|
108
|
+
}
|
|
109
|
+
const session = this.currentSessionName;
|
|
110
|
+
let conversationId;
|
|
111
|
+
let cleanMessage = message;
|
|
112
|
+
const chatPrefixMatch = message.match(/^\[(?:G?CHAT):([^\]\s]+)[^\]]*\]\s*/);
|
|
113
|
+
if (chatPrefixMatch) {
|
|
114
|
+
conversationId = chatPrefixMatch[1];
|
|
115
|
+
cleanMessage = message.slice(chatPrefixMatch[0].length);
|
|
116
|
+
}
|
|
117
|
+
this.logBuffer.append(session, 'info', `← Message received (${cleanMessage.length} chars): ${cleanMessage.substring(0, 150)}`);
|
|
118
|
+
// Backstop deadline on the child's IPC reply.
|
|
119
|
+
//
|
|
120
|
+
// This promise settles ONLY when the child writes `result` or `error` to
|
|
121
|
+
// stdout. A child that can no longer write — blocked event loop, broken
|
|
122
|
+
// pipe, SIGSTOP — leaves it pending forever, and because delivery is
|
|
123
|
+
// fire-and-forget the caller's .then/.catch never run either: no log, no
|
|
124
|
+
// status reset, no alert. That is exactly how the orchestrator went
|
|
125
|
+
// silently catatonic for 12 days. The child enforces its own (shorter) run
|
|
126
|
+
// budget, so reaching this deadline means the child itself is gone-but-
|
|
127
|
+
// breathing — hence the recycle.
|
|
128
|
+
const timeoutMs = this.resolveIpcTimeoutMs();
|
|
129
|
+
const runId = `run-${++this.runCounter}-${Date.now().toString(36)}`;
|
|
130
|
+
return await new Promise((resolve, reject) => {
|
|
131
|
+
const timer = setTimeout(() => {
|
|
132
|
+
this.pendingRuns.delete(runId);
|
|
133
|
+
const message = `Crewly Agent did not reply within ${timeoutMs}ms — the runtime process is `
|
|
134
|
+
+ `alive but unresponsive. Recycling it.`;
|
|
135
|
+
this.logBuffer.append(session, 'error', message);
|
|
136
|
+
this.logger.error('Crewly Agent IPC timeout — recycling wedged runtime', {
|
|
137
|
+
sessionName: session,
|
|
138
|
+
runId,
|
|
139
|
+
timeoutMs,
|
|
140
|
+
});
|
|
141
|
+
// Respawn before rejecting so the session is usable again by the time
|
|
142
|
+
// the caller handles the failure.
|
|
143
|
+
void this.recycleChild();
|
|
144
|
+
reject(new Error(message));
|
|
145
|
+
}, timeoutMs);
|
|
146
|
+
this.pendingRuns.set(runId, {
|
|
147
|
+
resolve: (result) => {
|
|
148
|
+
clearTimeout(timer);
|
|
149
|
+
this.pendingRuns.delete(runId);
|
|
150
|
+
const textPreview = result.text ? result.text.substring(0, 150) : '(no text)';
|
|
151
|
+
this.logBuffer.append(session, 'info', `→ Response (${result.steps} steps, ${result.toolCalls.length} tools): ${textPreview}`);
|
|
152
|
+
// Cache hits are reported alongside the raw counts: prompt caching
|
|
153
|
+
// was off for a long time and nothing surfaced it, because the only
|
|
154
|
+
// numbers ever logged were the ones that look identical either way.
|
|
155
|
+
// A run whose prefix is cached shows most of its input under `cached`;
|
|
156
|
+
// a persistent 0 there means caching silently stopped engaging.
|
|
157
|
+
const cached = result.usage.cachedInput ?? 0;
|
|
158
|
+
const promptTokens = result.usage.input + cached;
|
|
159
|
+
const hitRate = promptTokens > 0 ? Math.round((cached / promptTokens) * 100) : 0;
|
|
160
|
+
this.logBuffer.append(session, 'debug', ` Tokens: ${result.usage.input}in/${result.usage.output}out, ${cached} cached (${hitRate}% of prompt)`);
|
|
161
|
+
this.recordTokenUsageIfEnabled(session, result).catch(() => { });
|
|
162
|
+
resolve(result);
|
|
163
|
+
},
|
|
164
|
+
reject: (error) => {
|
|
165
|
+
clearTimeout(timer);
|
|
166
|
+
this.pendingRuns.delete(runId);
|
|
167
|
+
this.logBuffer.append(session, 'error', `Agent error: ${error.message}`);
|
|
168
|
+
reject(error);
|
|
169
|
+
},
|
|
170
|
+
});
|
|
171
|
+
try {
|
|
172
|
+
this.sendMessage({
|
|
173
|
+
type: 'run',
|
|
174
|
+
runId,
|
|
175
|
+
message: cleanMessage,
|
|
176
|
+
conversationId,
|
|
177
|
+
metadata,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
catch (sendError) {
|
|
181
|
+
// stdin already gone — fail now rather than idling until the deadline.
|
|
182
|
+
clearTimeout(timer);
|
|
183
|
+
this.pendingRuns.delete(runId);
|
|
184
|
+
reject(sendError instanceof Error ? sendError : new Error(String(sendError)));
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Settle the pending run a worker message belongs to.
|
|
190
|
+
*
|
|
191
|
+
* Correlates on `runId` when the child echoes one. Falls back to the OLDEST
|
|
192
|
+
* pending run when it does not — the child processes runs strictly serially
|
|
193
|
+
* (its own queue is FIFO), so the oldest outstanding request is the one being
|
|
194
|
+
* answered. The fallback keeps an older `crewly-agent` binary working.
|
|
195
|
+
*
|
|
196
|
+
* @param runId - Correlation id echoed by the child, if any
|
|
197
|
+
* @param settle - Applied to the matched run's handlers
|
|
198
|
+
* @returns True when a pending run was matched and settled
|
|
199
|
+
*/
|
|
200
|
+
settlePendingRun(runId, settle) {
|
|
201
|
+
let key = runId;
|
|
202
|
+
if (key === undefined || !this.pendingRuns.has(key)) {
|
|
203
|
+
// Map preserves insertion order — first key is the oldest run.
|
|
204
|
+
key = this.pendingRuns.keys().next().value;
|
|
205
|
+
}
|
|
206
|
+
if (key === undefined)
|
|
207
|
+
return false;
|
|
208
|
+
const handlers = this.pendingRuns.get(key);
|
|
209
|
+
if (!handlers)
|
|
210
|
+
return false;
|
|
211
|
+
settle(handlers);
|
|
212
|
+
return true;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Resolve how long the parent waits for the child's IPC reply.
|
|
216
|
+
*
|
|
217
|
+
* Deliberately the child's own run budget plus a grace window, so the child
|
|
218
|
+
* always gets to report its own timeout with proper context first; the parent
|
|
219
|
+
* timer only fires when the child has stopped reporting altogether.
|
|
220
|
+
*
|
|
221
|
+
* @returns Deadline in milliseconds
|
|
222
|
+
*/
|
|
223
|
+
resolveIpcTimeoutMs() {
|
|
224
|
+
const modelId = this.storedConfig?.model.modelId ?? '';
|
|
225
|
+
const childBudget = CREWLY_AGENT_DEFAULTS.MODEL_TIMEOUT_MS[modelId]
|
|
226
|
+
?? CREWLY_AGENT_DEFAULTS.MESSAGE_TIMEOUT_MS;
|
|
227
|
+
return childBudget + CREWLY_AGENT_DEFAULTS.IPC_RUN_TIMEOUT_GRACE_MS;
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Replace a wedged child process with a fresh one.
|
|
231
|
+
*
|
|
232
|
+
* Without this, a single unresponsive child left the session permanently
|
|
233
|
+
* dead: `handleExit` nulls the child and clears `initialized`, and nothing
|
|
234
|
+
* ever spawned a replacement, so every later message failed the `isReady()`
|
|
235
|
+
* check for the lifetime of the backend process.
|
|
236
|
+
*
|
|
237
|
+
* Concurrent calls are collapsed — the delivery mutex serializes sends, but
|
|
238
|
+
* a process 'error' event can race the IPC deadline.
|
|
239
|
+
*
|
|
240
|
+
* @returns Resolves once the replacement is ready, or after logging a failure
|
|
241
|
+
*/
|
|
242
|
+
async recycleChild() {
|
|
243
|
+
if (this.recycling)
|
|
244
|
+
return;
|
|
245
|
+
const config = this.storedConfig;
|
|
246
|
+
const session = this.currentSessionName;
|
|
247
|
+
if (!config || !session)
|
|
248
|
+
return;
|
|
249
|
+
this.recycling = true;
|
|
250
|
+
try {
|
|
251
|
+
const doomed = this.child;
|
|
252
|
+
// Drop the reference FIRST so the imminent 'exit' event is recognized as
|
|
253
|
+
// belonging to a superseded child and does not clobber the new one.
|
|
254
|
+
this.child = null;
|
|
255
|
+
this.ready = false;
|
|
256
|
+
this.stdoutBuffer = '';
|
|
257
|
+
if (doomed && !doomed.killed) {
|
|
258
|
+
try {
|
|
259
|
+
doomed.kill('SIGKILL');
|
|
260
|
+
}
|
|
261
|
+
catch { /* already gone */ }
|
|
262
|
+
}
|
|
263
|
+
await this.spawnAgentProcess(config);
|
|
264
|
+
this.initialized = true;
|
|
265
|
+
this.ready = true;
|
|
266
|
+
this.logBuffer.append(session, 'info', 'Crewly Agent runtime recycled after timeout');
|
|
267
|
+
this.logger.info('Crewly Agent runtime recycled', { sessionName: session });
|
|
268
|
+
this.startHeartbeat(session);
|
|
269
|
+
}
|
|
270
|
+
catch (error) {
|
|
271
|
+
const errMsg = error instanceof Error ? error.message : String(error);
|
|
272
|
+
this.logBuffer.append(session, 'error', `Runtime recycle failed: ${errMsg}`);
|
|
273
|
+
this.logger.error('Crewly Agent runtime recycle failed', { sessionName: session, error: errMsg });
|
|
274
|
+
}
|
|
275
|
+
finally {
|
|
276
|
+
this.recycling = false;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
isReady() {
|
|
280
|
+
return this.initialized && this.ready && this.child !== null && !this.child.killed;
|
|
281
|
+
}
|
|
282
|
+
shutdown() {
|
|
283
|
+
this.initialized = false;
|
|
284
|
+
this.ready = false;
|
|
285
|
+
this.stopHeartbeat();
|
|
286
|
+
this.detachSignalForwarders();
|
|
287
|
+
if (this.currentSessionName) {
|
|
288
|
+
this.logBuffer.append(this.currentSessionName, 'info', 'Crewly Agent shutting down');
|
|
289
|
+
}
|
|
290
|
+
if (this.child && !this.child.killed) {
|
|
291
|
+
try {
|
|
292
|
+
this.sendMessage({ type: 'shutdown' });
|
|
293
|
+
}
|
|
294
|
+
catch {
|
|
295
|
+
// Ignore shutdown send failures.
|
|
296
|
+
}
|
|
297
|
+
// Give the child a brief grace window to drain stdout + exit
|
|
298
|
+
// cleanly after receiving the shutdown message, then SIGTERM,
|
|
299
|
+
// then SIGKILL. All three are no-ops on an already-exited child.
|
|
300
|
+
const child = this.child;
|
|
301
|
+
setTimeout(() => {
|
|
302
|
+
if (!child.killed) {
|
|
303
|
+
try {
|
|
304
|
+
child.kill('SIGTERM');
|
|
305
|
+
}
|
|
306
|
+
catch { /* gone */ }
|
|
307
|
+
}
|
|
308
|
+
setTimeout(() => {
|
|
309
|
+
if (!child.killed) {
|
|
310
|
+
try {
|
|
311
|
+
child.kill('SIGKILL');
|
|
312
|
+
}
|
|
313
|
+
catch { /* gone */ }
|
|
314
|
+
}
|
|
315
|
+
}, 2000).unref();
|
|
316
|
+
}, 500).unref();
|
|
317
|
+
}
|
|
318
|
+
if (this.currentSessionName) {
|
|
319
|
+
this.logBuffer.removeSession(this.currentSessionName);
|
|
320
|
+
}
|
|
321
|
+
this.child = null;
|
|
322
|
+
this.stdoutBuffer = '';
|
|
323
|
+
this.pendingInitResolve = null;
|
|
324
|
+
this.pendingInitReject = null;
|
|
325
|
+
this.rejectAllPendingRuns(new Error('Crewly Agent runtime shut down'));
|
|
326
|
+
this.currentSessionName = null;
|
|
327
|
+
this.storedConfig = null;
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Fail every in-flight run with the same cause.
|
|
331
|
+
*
|
|
332
|
+
* Used on teardown paths where the child is gone: leaving any pending run
|
|
333
|
+
* unsettled would strand its caller forever, which is precisely the silent
|
|
334
|
+
* hang this runtime has been hardened against.
|
|
335
|
+
*
|
|
336
|
+
* @param error - Cause reported to every waiting caller
|
|
337
|
+
*/
|
|
338
|
+
rejectAllPendingRuns(error) {
|
|
339
|
+
// Snapshot first — each reject() deletes its own entry from the map.
|
|
340
|
+
const handlers = [...this.pendingRuns.values()];
|
|
341
|
+
this.pendingRuns.clear();
|
|
342
|
+
for (const h of handlers) {
|
|
343
|
+
try {
|
|
344
|
+
h.reject(error);
|
|
345
|
+
}
|
|
346
|
+
catch {
|
|
347
|
+
// A caller's rejection handler must not block the rest.
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
async spawnAgentProcess(config) {
|
|
352
|
+
const { command, useShell } = await this.resolveRuntimeCommand();
|
|
353
|
+
const env = {
|
|
354
|
+
...process.env,
|
|
355
|
+
[ENV_CONSTANTS.CREWLY_SESSION_NAME]: config.sessionName,
|
|
356
|
+
[ENV_CONSTANTS.CREWLY_ROLE]: this.currentRoleName,
|
|
357
|
+
[ENV_CONSTANTS.CREWLY_API_URL]: config.apiBaseUrl,
|
|
358
|
+
[ENV_CONSTANTS.CREWLY_PROJECT_PATH]: config.projectPath || this.projectRoot,
|
|
359
|
+
[ENV_CONSTANTS.CREWLY_INSTALL_DIR]: this.projectRoot,
|
|
360
|
+
};
|
|
361
|
+
// Pre-flight check: when running the default `crewly-agent` binary
|
|
362
|
+
// (no shell, no custom user command), confirm it resolves on PATH
|
|
363
|
+
// BEFORE spawn so we can return a clear error instead of a cryptic
|
|
364
|
+
// exit-code-127 a few hundred milliseconds later. Skip the check
|
|
365
|
+
// when the user supplied a custom shell command — they own that
|
|
366
|
+
// path resolution.
|
|
367
|
+
if (!useShell) {
|
|
368
|
+
const found = await this.lookupOnPath(command, process.env.PATH);
|
|
369
|
+
if (!found) {
|
|
370
|
+
throw new Error(`crewly-agent binary not found on PATH. Either:\n` +
|
|
371
|
+
` • install crewly-agent (npm i crewly-agent / npm i -g crewly-agent),\n` +
|
|
372
|
+
` • make sure the install directory is on the engine's PATH (e.g. PM2 ecosystem env), or\n` +
|
|
373
|
+
` • point settings.general.runtimeCommands['crewly-agent'] at the absolute path of an alternate binary.\n` +
|
|
374
|
+
`Engine PATH at spawn time: ${process.env.PATH ?? '(unset)'}`);
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
if (useShell) {
|
|
378
|
+
// Custom command path: the user explicitly set
|
|
379
|
+
// settings.general.runtimeCommands['crewly-agent'] to a shell-ready
|
|
380
|
+
// string. Validated against a strict allow-list (see
|
|
381
|
+
// resolveRuntimeCommand) before reaching here.
|
|
382
|
+
const shell = process.env.SHELL || '/bin/bash';
|
|
383
|
+
this.child = spawn(shell, ['-lc', command], {
|
|
384
|
+
cwd: config.projectPath || this.projectRoot,
|
|
385
|
+
env,
|
|
386
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
else {
|
|
390
|
+
// Default path: spawn the binary directly, no shell. Removes
|
|
391
|
+
// any shell-injection surface area (the command string is
|
|
392
|
+
// argv[0], not interpreted).
|
|
393
|
+
this.child = spawn(command, [], {
|
|
394
|
+
cwd: config.projectPath || this.projectRoot,
|
|
395
|
+
env,
|
|
396
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
397
|
+
shell: false,
|
|
398
|
+
});
|
|
399
|
+
}
|
|
400
|
+
this.child.stdout.setEncoding('utf8');
|
|
401
|
+
this.child.stderr.setEncoding('utf8');
|
|
402
|
+
// Bind handlers to THIS child instance. A recycled runtime has an old
|
|
403
|
+
// process whose 'exit' fires after the replacement is already installed;
|
|
404
|
+
// without the identity check in the handlers, that late event would tear
|
|
405
|
+
// down the healthy new child.
|
|
406
|
+
const spawned = this.child;
|
|
407
|
+
spawned.stdout.on('data', (chunk) => this.handleStdout(chunk));
|
|
408
|
+
spawned.stderr.on('data', (chunk) => this.handleStderr(chunk));
|
|
409
|
+
spawned.on('exit', (code, signal) => this.handleExit(spawned, code, signal));
|
|
410
|
+
spawned.on('error', (error) => this.handleProcessError(spawned, error));
|
|
411
|
+
// Forward parent termination signals to the child so PM2 restarts /
|
|
412
|
+
// SIGINT / SIGTERM don't leave the agent process orphaned and
|
|
413
|
+
// reparented to PID 1 (regression of the zombie fix tracked in
|
|
414
|
+
// user-memory session_zombie_fix_progress).
|
|
415
|
+
this.attachSignalForwarders();
|
|
416
|
+
await new Promise((resolve, reject) => {
|
|
417
|
+
this.pendingInitResolve = resolve;
|
|
418
|
+
this.pendingInitReject = reject;
|
|
419
|
+
this.sendMessage({ type: 'init', config });
|
|
420
|
+
});
|
|
421
|
+
}
|
|
422
|
+
/**
|
|
423
|
+
* Resolve the runtime command. Returns the bare binary name (no shell)
|
|
424
|
+
* by default, or, if the user has configured a custom shell command in
|
|
425
|
+
* settings, returns it with `useShell=true` after validating it against
|
|
426
|
+
* a strict allow-list.
|
|
427
|
+
*
|
|
428
|
+
* Allow-list rationale: a shell-ready command is anything matching the
|
|
429
|
+
* shape `<word>[ <flag-or-arg>]*` — no shell metacharacters like
|
|
430
|
+
* `;` `|` `&` `$` backticks. Anything richer is suspicious and is
|
|
431
|
+
* silently dropped (we fall back to the default binary). Settings are
|
|
432
|
+
* user-controlled in principle but flow through HTTP APIs, so we
|
|
433
|
+
* treat the value as semi-trusted input.
|
|
434
|
+
*/
|
|
435
|
+
async resolveRuntimeCommand() {
|
|
436
|
+
try {
|
|
437
|
+
const settings = await getSettingsService().getSettings();
|
|
438
|
+
const configured = settings.general.runtimeCommands?.['crewly-agent'];
|
|
439
|
+
if (configured && configured.trim()) {
|
|
440
|
+
const trimmed = configured.trim();
|
|
441
|
+
// Managed sentinels are NOT real shell commands — route them to the
|
|
442
|
+
// managed binary (no shell). This is the root-cause guard for issue
|
|
443
|
+
// #693: the legacy default `'crewly-agent-in-process'` passes the
|
|
444
|
+
// shell allow-list below (no metacharacters), so without this branch
|
|
445
|
+
// it would be shelled out via `sh -lc` to a non-existent command and
|
|
446
|
+
// exit-127. We also treat the managed command name itself as a
|
|
447
|
+
// sentinel so the explicit default never accidentally shells out.
|
|
448
|
+
// Routing through `useShell: false` re-enables the pre-flight
|
|
449
|
+
// `lookupOnPath` check in spawnAgentProcess(), turning a cryptic
|
|
450
|
+
// exit-127 into a clear "binary not found on PATH" error.
|
|
451
|
+
if (trimmed === CREWLY_AGENT_MANAGED_COMMAND ||
|
|
452
|
+
LEGACY_CREWLY_AGENT_SENTINELS.includes(trimmed)) {
|
|
453
|
+
return { command: await this.resolveManagedBinary(), useShell: false };
|
|
454
|
+
}
|
|
455
|
+
if (CrewlyAgentExternalRuntimeService.SAFE_SHELL_COMMAND_RE.test(trimmed)) {
|
|
456
|
+
return { command: trimmed, useShell: true };
|
|
457
|
+
}
|
|
458
|
+
// Suspicious shell metacharacters — drop silently and use the
|
|
459
|
+
// default. Logging the raw value would echo whatever a malicious
|
|
460
|
+
// settings write tried to plant; log a fingerprint instead.
|
|
461
|
+
const log = LoggerService.getInstance().createComponentLogger('CrewlyAgentExternalRuntimeService');
|
|
462
|
+
log.warn('settings.runtimeCommands["crewly-agent"] rejected — shell metacharacters detected; falling back to default binary');
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
catch {
|
|
466
|
+
// Fall through to default command.
|
|
467
|
+
}
|
|
468
|
+
return { command: await this.resolveManagedBinary(), useShell: false };
|
|
469
|
+
}
|
|
470
|
+
/**
|
|
471
|
+
* Resolve the managed `crewly-agent` runtime to an executable path.
|
|
472
|
+
*
|
|
473
|
+
* Prefers the binary VENDORED inside crewly itself at
|
|
474
|
+
* `packages/crewly-agent/bin/crewly-agent` (relative to the install dir,
|
|
475
|
+
* {@link this.projectRoot}). This is what makes the in-process runtime work
|
|
476
|
+
* out of the box now that crewly-agent lives in the OSS monorepo — it
|
|
477
|
+
* resolves identically whether the engine was started via an npm script
|
|
478
|
+
* (which puts `node_modules/.bin` on PATH) or directly via `node dist/...`
|
|
479
|
+
* (which does not), and whether running from a checkout or an installed
|
|
480
|
+
* npm package (the tarball ships `packages/crewly-agent/`).
|
|
481
|
+
*
|
|
482
|
+
* Falls back to the bare {@link CREWLY_AGENT_MANAGED_COMMAND} name (PATH
|
|
483
|
+
* lookup) for legacy global installs where the vendored copy is absent.
|
|
484
|
+
*
|
|
485
|
+
* @returns Absolute path to the vendored binary, or the bare command name
|
|
486
|
+
*/
|
|
487
|
+
async resolveManagedBinary() {
|
|
488
|
+
const vendored = path.join(this.projectRoot, 'packages', 'crewly-agent', 'bin', 'crewly-agent');
|
|
489
|
+
const found = await this.lookupOnPath(vendored, undefined);
|
|
490
|
+
return found ?? CREWLY_AGENT_MANAGED_COMMAND;
|
|
491
|
+
}
|
|
492
|
+
/**
|
|
493
|
+
* Allow-list for custom runtime commands. Matches an executable path or
|
|
494
|
+
* name followed by space-separated flags/args, where each token is a
|
|
495
|
+
* combination of letters, digits, and the path-safe punctuation
|
|
496
|
+
* (`. _ / - = :`). Rejects anything containing shell control characters
|
|
497
|
+
* (`; | & $ \` < > ( ) { } [ ]`), newlines, or quotes.
|
|
498
|
+
*/
|
|
499
|
+
static SAFE_SHELL_COMMAND_RE = /^[A-Za-z0-9._\/\-]+( +[A-Za-z0-9._\/\-=:]+)*$/;
|
|
500
|
+
/**
|
|
501
|
+
* Find an executable on the engine's PATH. Returns the absolute path
|
|
502
|
+
* when found, or null when not. Async so we never block the event
|
|
503
|
+
* loop on slow disks. Exported behavior is "is `name` runnable?";
|
|
504
|
+
* we don't care which exact entry won the search.
|
|
505
|
+
*/
|
|
506
|
+
async lookupOnPath(name, pathEnv) {
|
|
507
|
+
// Absolute or relative path — skip the search, just check existence.
|
|
508
|
+
if (name.includes('/')) {
|
|
509
|
+
try {
|
|
510
|
+
const stat = await fs.stat(name);
|
|
511
|
+
if (stat.isFile())
|
|
512
|
+
return name;
|
|
513
|
+
}
|
|
514
|
+
catch {
|
|
515
|
+
return null;
|
|
516
|
+
}
|
|
517
|
+
return null;
|
|
518
|
+
}
|
|
519
|
+
const dirs = (pathEnv ?? '').split(path.delimiter).filter(Boolean);
|
|
520
|
+
for (const dir of dirs) {
|
|
521
|
+
const candidate = path.join(dir, name);
|
|
522
|
+
try {
|
|
523
|
+
const stat = await fs.stat(candidate);
|
|
524
|
+
if (stat.isFile())
|
|
525
|
+
return candidate;
|
|
526
|
+
}
|
|
527
|
+
catch {
|
|
528
|
+
// Not in this dir, keep searching.
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
return null;
|
|
532
|
+
}
|
|
533
|
+
/**
|
|
534
|
+
* Forward parent SIGINT/SIGTERM/SIGHUP to the spawned child so it gets
|
|
535
|
+
* a chance to flush + exit instead of being orphaned. Idempotent —
|
|
536
|
+
* calling more than once just replaces the previous listeners.
|
|
537
|
+
*
|
|
538
|
+
* Removes its own listeners on `handleExit` so old callbacks don't
|
|
539
|
+
* fire against a recycled `this.child` reference after a restart.
|
|
540
|
+
*/
|
|
541
|
+
attachSignalForwarders() {
|
|
542
|
+
if (this.signalForwarder) {
|
|
543
|
+
// Belt-and-braces: shouldn't happen, but clean previous wiring.
|
|
544
|
+
this.detachSignalForwarders();
|
|
545
|
+
}
|
|
546
|
+
const forwarder = (signal) => {
|
|
547
|
+
if (this.child && !this.child.killed) {
|
|
548
|
+
try {
|
|
549
|
+
this.child.kill(signal);
|
|
550
|
+
}
|
|
551
|
+
catch {
|
|
552
|
+
// Process already gone — handleExit will run.
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
};
|
|
556
|
+
this.signalForwarder = forwarder;
|
|
557
|
+
process.on('SIGINT', forwarder);
|
|
558
|
+
process.on('SIGTERM', forwarder);
|
|
559
|
+
process.on('SIGHUP', forwarder);
|
|
560
|
+
}
|
|
561
|
+
detachSignalForwarders() {
|
|
562
|
+
if (!this.signalForwarder)
|
|
563
|
+
return;
|
|
564
|
+
process.off('SIGINT', this.signalForwarder);
|
|
565
|
+
process.off('SIGTERM', this.signalForwarder);
|
|
566
|
+
process.off('SIGHUP', this.signalForwarder);
|
|
567
|
+
this.signalForwarder = null;
|
|
568
|
+
}
|
|
569
|
+
sendMessage(message) {
|
|
570
|
+
if (!this.child?.stdin.writable) {
|
|
571
|
+
throw new Error('Crewly Agent process stdin is not writable');
|
|
572
|
+
}
|
|
573
|
+
this.child.stdin.write(`${JSON.stringify(message)}\n`);
|
|
574
|
+
}
|
|
575
|
+
handleStdout(chunk) {
|
|
576
|
+
this.stdoutBuffer += chunk;
|
|
577
|
+
const lines = this.stdoutBuffer.split('\n');
|
|
578
|
+
this.stdoutBuffer = lines.pop() ?? '';
|
|
579
|
+
for (const line of lines) {
|
|
580
|
+
const trimmed = line.trim();
|
|
581
|
+
if (!trimmed)
|
|
582
|
+
continue;
|
|
583
|
+
try {
|
|
584
|
+
const message = JSON.parse(trimmed);
|
|
585
|
+
this.handleWorkerMessage(message);
|
|
586
|
+
}
|
|
587
|
+
catch {
|
|
588
|
+
if (this.currentSessionName) {
|
|
589
|
+
this.logBuffer.append(this.currentSessionName, 'debug', `[raw] ${trimmed}`);
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
handleWorkerMessage(message) {
|
|
595
|
+
const session = this.currentSessionName;
|
|
596
|
+
switch (message.type) {
|
|
597
|
+
case 'ready':
|
|
598
|
+
if (this.pendingInitResolve) {
|
|
599
|
+
this.pendingInitResolve();
|
|
600
|
+
this.pendingInitResolve = null;
|
|
601
|
+
this.pendingInitReject = null;
|
|
602
|
+
}
|
|
603
|
+
break;
|
|
604
|
+
case 'result': {
|
|
605
|
+
const matched = this.settlePendingRun(message.runId, (h) => h.resolve(message.data));
|
|
606
|
+
if (!matched && session) {
|
|
607
|
+
// A result nobody is waiting for. Previously `?.` swallowed this
|
|
608
|
+
// silently; say so, because it means an answer was computed and
|
|
609
|
+
// then thrown away.
|
|
610
|
+
this.logBuffer.append(session, 'warn', `Discarded a result with no matching pending run (runId=${message.runId ?? 'none'})`);
|
|
611
|
+
this.logger.warn('Crewly Agent result had no matching pending run', {
|
|
612
|
+
sessionName: session,
|
|
613
|
+
runId: message.runId ?? null,
|
|
614
|
+
});
|
|
615
|
+
}
|
|
616
|
+
break;
|
|
617
|
+
}
|
|
618
|
+
case 'error': {
|
|
619
|
+
const error = new Error(message.error);
|
|
620
|
+
if (this.pendingInitReject) {
|
|
621
|
+
this.pendingInitReject(error);
|
|
622
|
+
this.pendingInitResolve = null;
|
|
623
|
+
this.pendingInitReject = null;
|
|
624
|
+
break;
|
|
625
|
+
}
|
|
626
|
+
const matched = this.settlePendingRun(message.runId, (h) => h.reject(error));
|
|
627
|
+
if (!matched && session) {
|
|
628
|
+
this.logBuffer.append(session, 'error', message.error);
|
|
629
|
+
}
|
|
630
|
+
break;
|
|
631
|
+
}
|
|
632
|
+
case 'log':
|
|
633
|
+
if (session) {
|
|
634
|
+
this.logBuffer.append(session, message.level, `[external] ${message.message}`);
|
|
635
|
+
}
|
|
636
|
+
break;
|
|
637
|
+
case 'stream':
|
|
638
|
+
if (!session)
|
|
639
|
+
break;
|
|
640
|
+
if (message.event === 'toolFinish') {
|
|
641
|
+
const { toolName, args, result } = message.data;
|
|
642
|
+
const argsPreview = JSON.stringify(args).substring(0, 120);
|
|
643
|
+
this.logBuffer.append(session, 'info', `tool ${toolName}(${argsPreview})`);
|
|
644
|
+
const resultPreview = result ? JSON.stringify(result).substring(0, 200) : 'void';
|
|
645
|
+
this.logBuffer.append(session, 'debug', ` -> ${resultPreview}`);
|
|
646
|
+
}
|
|
647
|
+
break;
|
|
648
|
+
case 'state':
|
|
649
|
+
break;
|
|
650
|
+
default:
|
|
651
|
+
break;
|
|
652
|
+
}
|
|
653
|
+
}
|
|
654
|
+
handleStderr(chunk) {
|
|
655
|
+
if (!this.currentSessionName)
|
|
656
|
+
return;
|
|
657
|
+
for (const line of chunk.split('\n')) {
|
|
658
|
+
const trimmed = line.trim();
|
|
659
|
+
if (trimmed) {
|
|
660
|
+
this.logBuffer.append(this.currentSessionName, 'warn', `[stderr] ${trimmed}`);
|
|
661
|
+
}
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
/**
|
|
665
|
+
* Handle child process exit.
|
|
666
|
+
*
|
|
667
|
+
* @param child - The process that exited; ignored when it is not the current
|
|
668
|
+
* one (a superseded child from a recycle)
|
|
669
|
+
* @param code - Exit code, if any
|
|
670
|
+
* @param signal - Terminating signal, if any
|
|
671
|
+
*/
|
|
672
|
+
handleExit(child, code, signal) {
|
|
673
|
+
if (this.child !== child) {
|
|
674
|
+
// Superseded child finishing its death throes — its replacement owns the
|
|
675
|
+
// runtime state now.
|
|
676
|
+
return;
|
|
677
|
+
}
|
|
678
|
+
// Clear initialized + detach signal handlers — the child is gone,
|
|
679
|
+
// any tick-aligned work (heartbeat, signal forwarding) referring
|
|
680
|
+
// to it would be writing to a corpse.
|
|
681
|
+
this.initialized = false;
|
|
682
|
+
this.ready = false;
|
|
683
|
+
this.stopHeartbeat();
|
|
684
|
+
this.detachSignalForwarders();
|
|
685
|
+
const error = new Error(`Crewly Agent process exited (${code ?? 'null'}${signal ? `, ${signal}` : ''})`);
|
|
686
|
+
if (this.pendingInitReject)
|
|
687
|
+
this.pendingInitReject(error);
|
|
688
|
+
this.pendingInitResolve = null;
|
|
689
|
+
this.pendingInitReject = null;
|
|
690
|
+
// EVERY in-flight run dies with the process, not just the newest one.
|
|
691
|
+
this.rejectAllPendingRuns(error);
|
|
692
|
+
if (this.currentSessionName) {
|
|
693
|
+
this.logBuffer.append(this.currentSessionName, 'warn', error.message);
|
|
694
|
+
}
|
|
695
|
+
this.child = null;
|
|
696
|
+
}
|
|
697
|
+
/**
|
|
698
|
+
* Handle a child process-level error (spawn failure, EPIPE, …).
|
|
699
|
+
*
|
|
700
|
+
* @param child - The process that errored; ignored when superseded
|
|
701
|
+
* @param error - The emitted error
|
|
702
|
+
*/
|
|
703
|
+
handleProcessError(child, error) {
|
|
704
|
+
if (this.child !== child)
|
|
705
|
+
return;
|
|
706
|
+
this.ready = false;
|
|
707
|
+
if (this.pendingInitReject)
|
|
708
|
+
this.pendingInitReject(error);
|
|
709
|
+
this.pendingInitResolve = null;
|
|
710
|
+
this.pendingInitReject = null;
|
|
711
|
+
this.rejectAllPendingRuns(error);
|
|
712
|
+
if (this.currentSessionName) {
|
|
713
|
+
this.logBuffer.append(this.currentSessionName, 'error', `Process error: ${error.message}`);
|
|
714
|
+
}
|
|
715
|
+
}
|
|
716
|
+
async recordTokenUsageIfEnabled(session, result) {
|
|
717
|
+
const settings = await getSettingsService().getSettings();
|
|
718
|
+
if (!settings.general.tokenTracking)
|
|
719
|
+
return;
|
|
720
|
+
TokenUsageService.getInstance().recordUsage(session, session, result.usage.input, result.usage.output, this.currentModelString);
|
|
721
|
+
}
|
|
722
|
+
startHeartbeat(sessionName) {
|
|
723
|
+
this.stopHeartbeat();
|
|
724
|
+
const interval = setInterval(() => {
|
|
725
|
+
if (!this.initialized) {
|
|
726
|
+
this.stopHeartbeat();
|
|
727
|
+
return;
|
|
728
|
+
}
|
|
729
|
+
updateAgentHeartbeat(sessionName, this.currentMemberId).catch(() => { });
|
|
730
|
+
try {
|
|
731
|
+
PtyActivityTrackerService.getInstance().recordApiActivity(sessionName);
|
|
732
|
+
}
|
|
733
|
+
catch {
|
|
734
|
+
// Non-fatal.
|
|
735
|
+
}
|
|
736
|
+
}, CREWLY_AGENT_DEFAULTS.HEARTBEAT_INTERVAL_MS);
|
|
737
|
+
interval.unref();
|
|
738
|
+
this.heartbeatTimer = interval;
|
|
739
|
+
}
|
|
740
|
+
stopHeartbeat() {
|
|
741
|
+
if (this.heartbeatTimer) {
|
|
742
|
+
clearInterval(this.heartbeatTimer);
|
|
743
|
+
this.heartbeatTimer = null;
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
async loadSystemPrompt(roleName = 'orchestrator') {
|
|
747
|
+
const promptPath = path.join(this.projectRoot, 'config', 'roles', roleName, 'prompt.md');
|
|
748
|
+
try {
|
|
749
|
+
return await fs.readFile(promptPath, 'utf8');
|
|
750
|
+
}
|
|
751
|
+
catch {
|
|
752
|
+
return 'You are the Crewly orchestrator agent. Manage teams and delegate tasks.';
|
|
753
|
+
}
|
|
754
|
+
}
|
|
755
|
+
async buildEnhancedSystemPrompt(roleName = 'orchestrator') {
|
|
756
|
+
const basePrompt = await this.loadSystemPrompt(roleName);
|
|
757
|
+
const sections = [basePrompt];
|
|
758
|
+
const skillsSummary = await this.loadSkillsCatalogSummary();
|
|
759
|
+
if (skillsSummary) {
|
|
760
|
+
sections.push(`\n## Available Skills\n${skillsSummary}`);
|
|
761
|
+
}
|
|
762
|
+
const addonsSection = await this.loadInstalledAddons();
|
|
763
|
+
if (addonsSection) {
|
|
764
|
+
sections.push(`\n## Installed Addons\n${addonsSection}`);
|
|
765
|
+
}
|
|
766
|
+
sections.push('\n## Instructions\n'
|
|
767
|
+
+ 'You have access to the above skills via bash. '
|
|
768
|
+
+ 'When asked questions, use your tools to find answers. '
|
|
769
|
+
+ 'Maintain conversation context across messages.\n\n'
|
|
770
|
+
+ '**IMPORTANT - Output Requirements:**\n'
|
|
771
|
+
+ 'Each task must end with a text summary of findings, results, and issues encountered, '
|
|
772
|
+
+ 'then call report-status. Never finish with only tool calls and no text output.');
|
|
773
|
+
return sections.join('\n');
|
|
774
|
+
}
|
|
775
|
+
async loadSkillsCatalogSummary() {
|
|
776
|
+
const catalogPath = path.join(homedir(), CREWLY_CONSTANTS.PATHS.CREWLY_HOME, CREWLY_CONSTANTS.PATHS.SKILLS_DIR, CREWLY_CONSTANTS.PATHS.SKILLS_CATALOG_FILE);
|
|
777
|
+
try {
|
|
778
|
+
const content = await fs.readFile(catalogPath, 'utf8');
|
|
779
|
+
const lines = content.split('\n');
|
|
780
|
+
const maxLines = 50;
|
|
781
|
+
const summary = lines.slice(0, maxLines).join('\n');
|
|
782
|
+
const truncated = lines.length > maxLines ? `\n... (${lines.length - maxLines} more lines)` : '';
|
|
783
|
+
return summary + truncated;
|
|
784
|
+
}
|
|
785
|
+
catch {
|
|
786
|
+
return null;
|
|
787
|
+
}
|
|
788
|
+
}
|
|
789
|
+
async loadInstalledAddons() {
|
|
790
|
+
const addonsDir = path.join(homedir(), CREWLY_CONSTANTS.PATHS.CREWLY_HOME, ADDON_CONSTANTS.PATHS.ADDONS_DIR);
|
|
791
|
+
let entries;
|
|
792
|
+
try {
|
|
793
|
+
entries = await fs.readdir(addonsDir);
|
|
794
|
+
}
|
|
795
|
+
catch {
|
|
796
|
+
return null;
|
|
797
|
+
}
|
|
798
|
+
const addonLines = [];
|
|
799
|
+
for (const entry of entries) {
|
|
800
|
+
const manifestPath = path.join(addonsDir, entry, ADDON_CONSTANTS.MANIFEST_FILE);
|
|
801
|
+
try {
|
|
802
|
+
const raw = await fs.readFile(manifestPath, 'utf8');
|
|
803
|
+
const manifest = JSON.parse(raw);
|
|
804
|
+
const name = manifest.name || entry;
|
|
805
|
+
const version = manifest.version || 'unknown';
|
|
806
|
+
const desc = manifest.description ? `: ${manifest.description}` : '';
|
|
807
|
+
addonLines.push(`- ${name} v${version}${desc}`);
|
|
808
|
+
}
|
|
809
|
+
catch {
|
|
810
|
+
// Skip directories without valid manifest.
|
|
811
|
+
}
|
|
812
|
+
}
|
|
813
|
+
return addonLines.length > 0 ? addonLines.join('\n') : null;
|
|
814
|
+
}
|
|
815
|
+
}
|
|
816
|
+
//# sourceMappingURL=crewly-agent-external-runtime.service.js.map
|