crewly 1.13.0 → 1.13.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/config/skills/_common/complete-body-shape.test.sh +113 -0
- package/config/skills/_common/no-dangling-symlinks.test.sh +63 -0
- package/config/skills/_common/task-pool-body-shape.test.sh +471 -0
- package/config/skills/agent/core/accept-task/execute.sh +30 -5
- package/config/skills/agent/core/block-task/execute.sh +59 -6
- package/config/skills/agent/core/complete-task/SKILL.md +37 -5
- package/config/skills/agent/core/complete-task/execute.sh +40 -9
- package/config/skills/agent/core/complete-task/execute.test.sh +213 -0
- package/config/skills/agent/core/create-task/SKILL.md +33 -0
- package/config/skills/agent/core/create-task/execute.sh +82 -23
- package/config/skills/agent/core/delegate-task/execute.sh +46 -0
- package/config/skills/agent/core/get-team-norms/SKILL.md +1 -1
- package/config/skills/agent/core/get-team-norms/execute.sh +73 -2
- package/config/skills/agent/core/handoff-task/execute.sh +8 -1
- package/config/skills/agent/core/report-status/SKILL.md +26 -0
- package/config/skills/agent/core/report-status/execute.sh +40 -5
- package/config/skills/orchestrator/delegate-task/SKILL.md +1 -1
- package/config/skills/orchestrator/delegate-task/execute.sh +45 -11
- package/config/skills/orchestrator/delegate-task/execute.test.sh +153 -1
- package/config/skills/team-leader/aggregate-results/SKILL.md +1 -1
- package/config/skills/team-leader/decompose-goal/execute.sh +11 -16
- package/config/skills/team-leader/delegate-task/SKILL.md +14 -1
- package/config/skills/team-leader/delegate-task/execute.sh +132 -43
- package/config/skills/team-leader/delegate-task/execute.test.sh +180 -27
- package/config/vitest-exclude.constants.ts +56 -0
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js +18 -3
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/slack/slack.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/slack/slack.controller.js +18 -15
- package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts +6 -1
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js +19 -10
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +20 -0
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/scripts/stamp-build.d.ts +25 -0
- package/dist/backend/backend/src/scripts/stamp-build.d.ts.map +1 -0
- package/dist/backend/backend/src/scripts/stamp-build.js +48 -0
- package/dist/backend/backend/src/scripts/stamp-build.js.map +1 -0
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.js +25 -0
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js +9 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/types.d.ts +42 -3
- package/dist/backend/backend/src/services/agent/crewly-agent/types.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/types.js +22 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/types.js.map +1 -1
- package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.d.ts +15 -0
- package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.js +40 -0
- package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.js.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/orchestrator-status.service.d.ts +28 -3
- package/dist/backend/backend/src/services/orchestrator/orchestrator-status.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/orchestrator-status.service.js +65 -8
- package/dist/backend/backend/src/services/orchestrator/orchestrator-status.service.js.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts +214 -4
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.js +330 -48
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.js.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts +13 -1
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js +84 -5
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconciler.service.d.ts +14 -0
- package/dist/backend/backend/src/services/reconciler/reconciler.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconciler.service.js +77 -3
- package/dist/backend/backend/src/services/reconciler/reconciler.service.js.map +1 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +152 -7
- package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.js +268 -36
- package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/escalation-router.service.js +2 -2
- package/dist/backend/backend/src/services/v3/escalation-router.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/request-sla.subscriber.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/request-sla.subscriber.js +39 -2
- package/dist/backend/backend/src/services/v3/request-sla.subscriber.js.map +1 -1
- package/dist/backend/backend/src/types/v2/index.d.ts +1 -1
- package/dist/backend/backend/src/types/v2/index.d.ts.map +1 -1
- package/dist/backend/backend/src/types/v2/index.js +1 -1
- package/dist/backend/backend/src/types/v2/index.js.map +1 -1
- package/dist/backend/backend/src/types/v2/work-item.types.d.ts +181 -1
- package/dist/backend/backend/src/types/v2/work-item.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/v2/work-item.types.js +104 -17
- package/dist/backend/backend/src/types/v2/work-item.types.js.map +1 -1
- package/dist/backend/backend/src/utils/build-provenance.d.ts +150 -0
- package/dist/backend/backend/src/utils/build-provenance.d.ts.map +1 -0
- package/dist/backend/backend/src/utils/build-provenance.js +211 -0
- package/dist/backend/backend/src/utils/build-provenance.js.map +1 -0
- package/dist/backend/build-info.json +4 -0
- package/dist/backend/config/vitest-exclude.constants.d.ts +53 -0
- package/dist/backend/config/vitest-exclude.constants.d.ts.map +1 -0
- package/dist/backend/config/vitest-exclude.constants.js +55 -0
- package/dist/backend/config/vitest-exclude.constants.js.map +1 -0
- package/dist/cli/backend/src/services/agent/active-work-briefing.service.d.ts +538 -0
- package/dist/cli/backend/src/services/agent/active-work-briefing.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/active-work-briefing.service.js +802 -0
- package/dist/cli/backend/src/services/agent/active-work-briefing.service.js.map +1 -0
- package/dist/cli/backend/src/services/agent/agent-heartbeat.service.d.ts +240 -0
- package/dist/cli/backend/src/services/agent/agent-heartbeat.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/agent-heartbeat.service.js +524 -0
- package/dist/cli/backend/src/services/agent/agent-heartbeat.service.js.map +1 -0
- package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts +629 -0
- package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/agent-registration.service.js +4548 -0
- package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -0
- package/dist/cli/backend/src/services/agent/agent-suspend.service.d.ts +118 -0
- package/dist/cli/backend/src/services/agent/agent-suspend.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/agent-suspend.service.js +304 -0
- package/dist/cli/backend/src/services/agent/agent-suspend.service.js.map +1 -0
- package/dist/cli/backend/src/services/agent/auditor-scheduler.service.d.ts +196 -0
- package/dist/cli/backend/src/services/agent/auditor-scheduler.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/auditor-scheduler.service.js +504 -0
- package/dist/cli/backend/src/services/agent/auditor-scheduler.service.js.map +1 -0
- package/dist/cli/backend/src/services/agent/claude-runtime.service.d.ts +97 -0
- package/dist/cli/backend/src/services/agent/claude-runtime.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/claude-runtime.service.js +334 -0
- package/dist/cli/backend/src/services/agent/claude-runtime.service.js.map +1 -0
- package/dist/cli/backend/src/services/agent/codex-runtime.service.d.ts +47 -0
- package/dist/cli/backend/src/services/agent/codex-runtime.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/codex-runtime.service.js +112 -0
- package/dist/cli/backend/src/services/agent/codex-runtime.service.js.map +1 -0
- package/dist/cli/backend/src/services/agent/context-window-monitor.service.d.ts +323 -0
- package/dist/cli/backend/src/services/agent/context-window-monitor.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/context-window-monitor.service.js +1056 -0
- package/dist/cli/backend/src/services/agent/context-window-monitor.service.js.map +1 -0
- package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts +198 -0
- package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js +816 -0
- package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js.map +1 -0
- package/dist/cli/backend/src/services/agent/crewly-agent/in-process-log-buffer.d.ts +155 -0
- package/dist/cli/backend/src/services/agent/crewly-agent/in-process-log-buffer.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/crewly-agent/in-process-log-buffer.js +272 -0
- package/dist/cli/backend/src/services/agent/crewly-agent/in-process-log-buffer.js.map +1 -0
- package/dist/cli/backend/src/services/agent/crewly-agent/in-process-runtime-registry.d.ts +91 -0
- package/dist/cli/backend/src/services/agent/crewly-agent/in-process-runtime-registry.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/crewly-agent/in-process-runtime-registry.js +120 -0
- package/dist/cli/backend/src/services/agent/crewly-agent/in-process-runtime-registry.js.map +1 -0
- package/dist/cli/backend/src/services/agent/crewly-agent/types.d.ts +536 -0
- package/dist/cli/backend/src/services/agent/crewly-agent/types.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/crewly-agent/types.js +282 -0
- package/dist/cli/backend/src/services/agent/crewly-agent/types.js.map +1 -0
- package/dist/cli/backend/src/services/agent/disk-cleanup.service.d.ts +100 -0
- package/dist/cli/backend/src/services/agent/disk-cleanup.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/disk-cleanup.service.js +149 -0
- package/dist/cli/backend/src/services/agent/disk-cleanup.service.js.map +1 -0
- package/dist/cli/backend/src/services/agent/gemini-runtime.service.d.ts +130 -0
- package/dist/cli/backend/src/services/agent/gemini-runtime.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/gemini-runtime.service.js +758 -0
- package/dist/cli/backend/src/services/agent/gemini-runtime.service.js.map +1 -0
- package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.d.ts +216 -0
- package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.js +508 -0
- package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.js.map +1 -0
- package/dist/cli/backend/src/services/agent/pty-activity-tracker.service.d.ts +113 -0
- package/dist/cli/backend/src/services/agent/pty-activity-tracker.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/pty-activity-tracker.service.js +161 -0
- package/dist/cli/backend/src/services/agent/pty-activity-tracker.service.js.map +1 -0
- package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.d.ts +156 -0
- package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js +641 -0
- package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -0
- package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.d.ts +295 -0
- package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js +1166 -0
- package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -0
- package/dist/cli/backend/src/services/agent/runtime-service.factory.d.ts +71 -0
- package/dist/cli/backend/src/services/agent/runtime-service.factory.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/runtime-service.factory.js +174 -0
- package/dist/cli/backend/src/services/agent/runtime-service.factory.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-builder.service.d.ts +435 -0
- package/dist/cli/backend/src/services/ai/prompt-builder.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-builder.service.js +1331 -0
- package/dist/cli/backend/src/services/ai/prompt-builder.service.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/capability-overlay.module.d.ts +33 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/capability-overlay.module.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/capability-overlay.module.js +70 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/capability-overlay.module.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/communication.module.d.ts +100 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/communication.module.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/communication.module.js +296 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/communication.module.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/decision-rights.module.d.ts +59 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/decision-rights.module.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/decision-rights.module.js +87 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/decision-rights.module.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/default-execution-loop.module.d.ts +67 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/default-execution-loop.module.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/default-execution-loop.module.js +84 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/default-execution-loop.module.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/domain-sop.module.d.ts +35 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/domain-sop.module.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/domain-sop.module.js +50 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/domain-sop.module.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/expert-profile.module.d.ts +41 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/expert-profile.module.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/expert-profile.module.js +95 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/expert-profile.module.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/identity.module.d.ts +28 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/identity.module.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/identity.module.js +47 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/identity.module.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/lazy-anti-patterns.module.d.ts +65 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/lazy-anti-patterns.module.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/lazy-anti-patterns.module.js +79 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/lazy-anti-patterns.module.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/learning-reference.module.d.ts +28 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/learning-reference.module.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/learning-reference.module.js +55 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/learning-reference.module.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/lifecycle.module.d.ts +44 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/lifecycle.module.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/lifecycle.module.js +120 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/lifecycle.module.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/markdown-file-module.d.ts +46 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/markdown-file-module.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/markdown-file-module.js +44 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/markdown-file-module.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/memory-reference.module.d.ts +28 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/memory-reference.module.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/memory-reference.module.js +46 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/memory-reference.module.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/mission-context.module.d.ts +60 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/mission-context.module.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/mission-context.module.js +104 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/mission-context.module.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/project-reference.module.d.ts +29 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/project-reference.module.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/project-reference.module.js +50 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/project-reference.module.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/prompt-assembly.service.d.ts +103 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/prompt-assembly.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/prompt-assembly.service.js +383 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/prompt-assembly.service.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/recovery.module.d.ts +34 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/recovery.module.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/recovery.module.js +96 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/recovery.module.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/request-contract.module.d.ts +106 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/request-contract.module.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/request-contract.module.js +167 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/request-contract.module.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/risk-policy.module.d.ts +35 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/risk-policy.module.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/risk-policy.module.js +50 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/risk-policy.module.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/role-boundary.module.d.ts +91 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/role-boundary.module.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/role-boundary.module.js +411 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/role-boundary.module.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts +62 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js +199 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/sop-norm-distinction.module.d.ts +79 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/sop-norm-distinction.module.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/sop-norm-distinction.module.js +118 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/sop-norm-distinction.module.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/soul.module.d.ts +102 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/soul.module.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/soul.module.js +229 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/soul.module.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/team-norms.module.d.ts +61 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/team-norms.module.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/team-norms.module.js +197 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/team-norms.module.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/team-reference.module.d.ts +54 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/team-reference.module.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/team-reference.module.js +149 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/team-reference.module.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/user-profile-reference.module.d.ts +32 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/user-profile-reference.module.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/user-profile-reference.module.js +69 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/user-profile-reference.module.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/working-memory.module.d.ts +91 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/working-memory.module.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/working-memory.module.js +136 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/working-memory.module.js.map +1 -0
- package/dist/cli/backend/src/services/ai/self-improvement/growth-areas.service.d.ts +81 -0
- package/dist/cli/backend/src/services/ai/self-improvement/growth-areas.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/self-improvement/growth-areas.service.js +135 -0
- package/dist/cli/backend/src/services/ai/self-improvement/growth-areas.service.js.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts +737 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js +1213 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.singleton.d.ts +27 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.singleton.d.ts.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.singleton.js +57 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.singleton.js.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/config.d.ts +100 -0
- package/dist/cli/backend/src/services/chat-v2/config.d.ts.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/config.js +174 -0
- package/dist/cli/backend/src/services/chat-v2/config.js.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/legacy-dto.utils.d.ts +118 -0
- package/dist/cli/backend/src/services/chat-v2/legacy-dto.utils.d.ts.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/legacy-dto.utils.js +171 -0
- package/dist/cli/backend/src/services/chat-v2/legacy-dto.utils.js.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/sqlite/channel.store.d.ts +188 -0
- package/dist/cli/backend/src/services/chat-v2/sqlite/channel.store.d.ts.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/sqlite/channel.store.js +317 -0
- package/dist/cli/backend/src/services/chat-v2/sqlite/channel.store.js.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/sqlite/chat-db.d.ts +119 -0
- package/dist/cli/backend/src/services/chat-v2/sqlite/chat-db.d.ts.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/sqlite/chat-db.js +551 -0
- package/dist/cli/backend/src/services/chat-v2/sqlite/chat-db.js.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts +208 -0
- package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js +405 -0
- package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/types.d.ts +341 -0
- package/dist/cli/backend/src/services/chat-v2/types.d.ts.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/types.js +61 -0
- package/dist/cli/backend/src/services/chat-v2/types.js.map +1 -0
- package/dist/cli/backend/src/services/continuation/patterns/idle-patterns.d.ts +37 -0
- package/dist/cli/backend/src/services/continuation/patterns/idle-patterns.d.ts.map +1 -0
- package/dist/cli/backend/src/services/continuation/patterns/idle-patterns.js +63 -0
- package/dist/cli/backend/src/services/continuation/patterns/idle-patterns.js.map +1 -0
- package/dist/cli/backend/src/services/intent-task/intent-classifier.rules.d.ts +335 -0
- package/dist/cli/backend/src/services/intent-task/intent-classifier.rules.d.ts.map +1 -0
- package/dist/cli/backend/src/services/intent-task/intent-classifier.rules.js +421 -0
- package/dist/cli/backend/src/services/intent-task/intent-classifier.rules.js.map +1 -0
- package/dist/cli/backend/src/services/mcp-client.d.ts +233 -0
- package/dist/cli/backend/src/services/mcp-client.d.ts.map +1 -0
- package/dist/cli/backend/src/services/mcp-client.js +302 -0
- package/dist/cli/backend/src/services/mcp-client.js.map +1 -0
- package/dist/cli/backend/src/services/memory/mission-context.service.d.ts +168 -0
- package/dist/cli/backend/src/services/memory/mission-context.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/memory/mission-context.service.js +365 -0
- package/dist/cli/backend/src/services/memory/mission-context.service.js.map +1 -0
- package/dist/cli/backend/src/services/memory/session-memory.service.d.ts +197 -0
- package/dist/cli/backend/src/services/memory/session-memory.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/memory/session-memory.service.js +369 -0
- package/dist/cli/backend/src/services/memory/session-memory.service.js.map +1 -0
- package/dist/cli/backend/src/services/memory/user-profile.service.d.ts +77 -0
- package/dist/cli/backend/src/services/memory/user-profile.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/memory/user-profile.service.js +171 -0
- package/dist/cli/backend/src/services/memory/user-profile.service.js.map +1 -0
- package/dist/cli/backend/src/services/memory/working-memory.service.d.ts +232 -0
- package/dist/cli/backend/src/services/memory/working-memory.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/memory/working-memory.service.js +417 -0
- package/dist/cli/backend/src/services/memory/working-memory.service.js.map +1 -0
- package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +84 -0
- package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js +136 -0
- package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -0
- package/dist/cli/backend/src/services/messaging/thread-status-queue.service.d.ts +358 -0
- package/dist/cli/backend/src/services/messaging/thread-status-queue.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/messaging/thread-status-queue.service.js +755 -0
- package/dist/cli/backend/src/services/messaging/thread-status-queue.service.js.map +1 -0
- package/dist/cli/backend/src/services/monitoring/token-usage.service.d.ts +269 -0
- package/dist/cli/backend/src/services/monitoring/token-usage.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/monitoring/token-usage.service.js +391 -0
- package/dist/cli/backend/src/services/monitoring/token-usage.service.js.map +1 -0
- package/dist/cli/backend/src/services/observability/agent-behavior-log.service.d.ts +132 -0
- package/dist/cli/backend/src/services/observability/agent-behavior-log.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/observability/agent-behavior-log.service.js +284 -0
- package/dist/cli/backend/src/services/observability/agent-behavior-log.service.js.map +1 -0
- package/dist/cli/backend/src/services/observability/agent-behavior-log.singleton.d.ts +70 -0
- package/dist/cli/backend/src/services/observability/agent-behavior-log.singleton.d.ts.map +1 -0
- package/dist/cli/backend/src/services/observability/agent-behavior-log.singleton.js +121 -0
- package/dist/cli/backend/src/services/observability/agent-behavior-log.singleton.js.map +1 -0
- package/dist/cli/backend/src/services/observability/agent-behavior-log.types.d.ts +130 -0
- package/dist/cli/backend/src/services/observability/agent-behavior-log.types.d.ts.map +1 -0
- package/dist/cli/backend/src/services/observability/agent-behavior-log.types.js +48 -0
- package/dist/cli/backend/src/services/observability/agent-behavior-log.types.js.map +1 -0
- package/dist/cli/backend/src/services/observability/observability-db.d.ts +84 -0
- package/dist/cli/backend/src/services/observability/observability-db.d.ts.map +1 -0
- package/dist/cli/backend/src/services/observability/observability-db.js +165 -0
- package/dist/cli/backend/src/services/observability/observability-db.js.map +1 -0
- package/dist/cli/backend/src/services/onboarding/content-approval.service.d.ts +124 -0
- package/dist/cli/backend/src/services/onboarding/content-approval.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/onboarding/content-approval.service.js +256 -0
- package/dist/cli/backend/src/services/onboarding/content-approval.service.js.map +1 -0
- package/dist/cli/backend/src/services/onboarding/content-approval.types.d.ts +80 -0
- package/dist/cli/backend/src/services/onboarding/content-approval.types.d.ts.map +1 -0
- package/dist/cli/backend/src/services/onboarding/content-approval.types.js +16 -0
- package/dist/cli/backend/src/services/onboarding/content-approval.types.js.map +1 -0
- package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.d.ts +142 -0
- package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.js +265 -0
- package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.js.map +1 -0
- package/dist/cli/backend/src/services/orchestrator/improvement-marker.service.d.ts +231 -0
- package/dist/cli/backend/src/services/orchestrator/improvement-marker.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/orchestrator/improvement-marker.service.js +353 -0
- package/dist/cli/backend/src/services/orchestrator/improvement-marker.service.js.map +1 -0
- package/dist/cli/backend/src/services/orchestrator/improvement-startup.service.d.ts +157 -0
- package/dist/cli/backend/src/services/orchestrator/improvement-startup.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/orchestrator/improvement-startup.service.js +483 -0
- package/dist/cli/backend/src/services/orchestrator/improvement-startup.service.js.map +1 -0
- package/dist/cli/backend/src/services/orchestrator/index.d.ts +16 -0
- package/dist/cli/backend/src/services/orchestrator/index.d.ts.map +1 -0
- package/dist/cli/backend/src/services/orchestrator/index.js +16 -0
- package/dist/cli/backend/src/services/orchestrator/index.js.map +1 -0
- package/dist/cli/backend/src/services/orchestrator/orchestrator-restart.service.d.ts +117 -0
- package/dist/cli/backend/src/services/orchestrator/orchestrator-restart.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/orchestrator/orchestrator-restart.service.js +300 -0
- package/dist/cli/backend/src/services/orchestrator/orchestrator-restart.service.js.map +1 -0
- package/dist/cli/backend/src/services/orchestrator/orchestrator-setup.service.d.ts +114 -0
- package/dist/cli/backend/src/services/orchestrator/orchestrator-setup.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/orchestrator/orchestrator-setup.service.js +195 -0
- package/dist/cli/backend/src/services/orchestrator/orchestrator-setup.service.js.map +1 -0
- package/dist/cli/backend/src/services/orchestrator/orchestrator-status.service.d.ts +94 -0
- package/dist/cli/backend/src/services/orchestrator/orchestrator-status.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/orchestrator/orchestrator-status.service.js +279 -0
- package/dist/cli/backend/src/services/orchestrator/orchestrator-status.service.js.map +1 -0
- package/dist/cli/backend/src/services/orchestrator/safe-restart.service.d.ts +192 -0
- package/dist/cli/backend/src/services/orchestrator/safe-restart.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/orchestrator/safe-restart.service.js +395 -0
- package/dist/cli/backend/src/services/orchestrator/safe-restart.service.js.map +1 -0
- package/dist/cli/backend/src/services/orchestrator/self-improvement.service.d.ts +201 -0
- package/dist/cli/backend/src/services/orchestrator/self-improvement.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/orchestrator/self-improvement.service.js +396 -0
- package/dist/cli/backend/src/services/orchestrator/self-improvement.service.js.map +1 -0
- package/dist/cli/backend/src/services/orchestrator/slack-bridge-lazy.d.ts +17 -0
- package/dist/cli/backend/src/services/orchestrator/slack-bridge-lazy.d.ts.map +1 -0
- package/dist/cli/backend/src/services/orchestrator/slack-bridge-lazy.js +30 -0
- package/dist/cli/backend/src/services/orchestrator/slack-bridge-lazy.js.map +1 -0
- package/dist/cli/backend/src/services/orchestrator/state-persistence.service.d.ts +249 -0
- package/dist/cli/backend/src/services/orchestrator/state-persistence.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/orchestrator/state-persistence.service.js +569 -0
- package/dist/cli/backend/src/services/orchestrator/state-persistence.service.js.map +1 -0
- package/dist/cli/backend/src/services/session/index.d.ts +47 -0
- package/dist/cli/backend/src/services/session/index.d.ts.map +1 -0
- package/dist/cli/backend/src/services/session/index.js +50 -0
- package/dist/cli/backend/src/services/session/index.js.map +1 -0
- package/dist/cli/backend/src/services/session/log-rotation.service.d.ts +163 -0
- package/dist/cli/backend/src/services/session/log-rotation.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/session/log-rotation.service.js +362 -0
- package/dist/cli/backend/src/services/session/log-rotation.service.js.map +1 -0
- package/dist/cli/backend/src/services/session/pty/index.d.ts +11 -0
- package/dist/cli/backend/src/services/session/pty/index.d.ts.map +1 -0
- package/dist/cli/backend/src/services/session/pty/index.js +11 -0
- package/dist/cli/backend/src/services/session/pty/index.js.map +1 -0
- package/dist/cli/backend/src/services/session/pty/pty-session-backend.d.ts +445 -0
- package/dist/cli/backend/src/services/session/pty/pty-session-backend.d.ts.map +1 -0
- package/dist/cli/backend/src/services/session/pty/pty-session-backend.js +804 -0
- package/dist/cli/backend/src/services/session/pty/pty-session-backend.js.map +1 -0
- package/dist/cli/backend/src/services/session/pty/pty-session.d.ts +252 -0
- package/dist/cli/backend/src/services/session/pty/pty-session.d.ts.map +1 -0
- package/dist/cli/backend/src/services/session/pty/pty-session.js +611 -0
- package/dist/cli/backend/src/services/session/pty/pty-session.js.map +1 -0
- package/dist/cli/backend/src/services/session/pty/pty-terminal-buffer.d.ts +275 -0
- package/dist/cli/backend/src/services/session/pty/pty-terminal-buffer.d.ts.map +1 -0
- package/dist/cli/backend/src/services/session/pty/pty-terminal-buffer.js +403 -0
- package/dist/cli/backend/src/services/session/pty/pty-terminal-buffer.js.map +1 -0
- package/dist/cli/backend/src/services/session/runtime-pid-registry.service.d.ts +86 -0
- package/dist/cli/backend/src/services/session/runtime-pid-registry.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/session/runtime-pid-registry.service.js +214 -0
- package/dist/cli/backend/src/services/session/runtime-pid-registry.service.js.map +1 -0
- package/dist/cli/backend/src/services/session/session-backend.factory.d.ts +127 -0
- package/dist/cli/backend/src/services/session/session-backend.factory.d.ts.map +1 -0
- package/dist/cli/backend/src/services/session/session-backend.factory.js +226 -0
- package/dist/cli/backend/src/services/session/session-backend.factory.js.map +1 -0
- package/dist/cli/backend/src/services/session/session-backend.interface.d.ts +390 -0
- package/dist/cli/backend/src/services/session/session-backend.interface.d.ts.map +1 -0
- package/dist/cli/backend/src/services/session/session-backend.interface.js +19 -0
- package/dist/cli/backend/src/services/session/session-backend.interface.js.map +1 -0
- package/dist/cli/backend/src/services/session/session-command-helper.d.ts +350 -0
- package/dist/cli/backend/src/services/session/session-command-helper.d.ts.map +1 -0
- package/dist/cli/backend/src/services/session/session-command-helper.js +810 -0
- package/dist/cli/backend/src/services/session/session-command-helper.js.map +1 -0
- package/dist/cli/backend/src/services/session/session-handoff.service.d.ts +307 -0
- package/dist/cli/backend/src/services/session/session-handoff.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/session/session-handoff.service.js +742 -0
- package/dist/cli/backend/src/services/session/session-handoff.service.js.map +1 -0
- package/dist/cli/backend/src/services/session/session-state-persistence.d.ts +231 -0
- package/dist/cli/backend/src/services/session/session-state-persistence.d.ts.map +1 -0
- package/dist/cli/backend/src/services/session/session-state-persistence.js +407 -0
- package/dist/cli/backend/src/services/session/session-state-persistence.js.map +1 -0
- package/dist/cli/backend/src/services/settings/role.service.d.ts +277 -0
- package/dist/cli/backend/src/services/settings/role.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/settings/role.service.js +728 -0
- package/dist/cli/backend/src/services/settings/role.service.js.map +1 -0
- package/dist/cli/backend/src/services/slack/cross-machine-message.service.d.ts +152 -0
- package/dist/cli/backend/src/services/slack/cross-machine-message.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/slack/cross-machine-message.service.js +354 -0
- package/dist/cli/backend/src/services/slack/cross-machine-message.service.js.map +1 -0
- package/dist/cli/backend/src/services/slack/slack-image.service.d.ts +114 -0
- package/dist/cli/backend/src/services/slack/slack-image.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/slack/slack-image.service.js +331 -0
- package/dist/cli/backend/src/services/slack/slack-image.service.js.map +1 -0
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts +499 -0
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -0
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js +1928 -0
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -0
- package/dist/cli/backend/src/services/slack/slack.service.d.ts +315 -0
- package/dist/cli/backend/src/services/slack/slack.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/slack/slack.service.js +1094 -0
- package/dist/cli/backend/src/services/slack/slack.service.js.map +1 -0
- package/dist/cli/backend/src/services/sop/sop.service.d.ts +364 -0
- package/dist/cli/backend/src/services/sop/sop.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/sop/sop.service.js +734 -0
- package/dist/cli/backend/src/services/sop/sop.service.js.map +1 -0
- package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +152 -7
- package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/task-pool/task-pool.service.js +268 -36
- package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/cli/backend/src/services/v3/escalation-router.service.d.ts +178 -0
- package/dist/cli/backend/src/services/v3/escalation-router.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/v3/escalation-router.service.js +692 -0
- package/dist/cli/backend/src/services/v3/escalation-router.service.js.map +1 -0
- package/dist/cli/backend/src/services/v3/kr-tracking.service.d.ts +200 -0
- package/dist/cli/backend/src/services/v3/kr-tracking.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/v3/kr-tracking.service.js +482 -0
- package/dist/cli/backend/src/services/v3/kr-tracking.service.js.map +1 -0
- package/dist/cli/backend/src/services/v3/mission-executor.service.d.ts +117 -0
- package/dist/cli/backend/src/services/v3/mission-executor.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/v3/mission-executor.service.js +321 -0
- package/dist/cli/backend/src/services/v3/mission-executor.service.js.map +1 -0
- package/dist/cli/backend/src/services/v3/request-sla.subscriber.d.ts +610 -0
- package/dist/cli/backend/src/services/v3/request-sla.subscriber.d.ts.map +1 -0
- package/dist/cli/backend/src/services/v3/request-sla.subscriber.js +1529 -0
- package/dist/cli/backend/src/services/v3/request-sla.subscriber.js.map +1 -0
- package/dist/cli/backend/src/services/v3/request-tracker.service.d.ts +78 -0
- package/dist/cli/backend/src/services/v3/request-tracker.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/v3/request-tracker.service.js +108 -0
- package/dist/cli/backend/src/services/v3/request-tracker.service.js.map +1 -0
- package/dist/cli/backend/src/services/v3/request.service.d.ts +295 -0
- package/dist/cli/backend/src/services/v3/request.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/v3/request.service.js +534 -0
- package/dist/cli/backend/src/services/v3/request.service.js.map +1 -0
- package/dist/cli/backend/src/services/v3/v3-data.service.d.ts +340 -0
- package/dist/cli/backend/src/services/v3/v3-data.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/v3/v3-data.service.js +1113 -0
- package/dist/cli/backend/src/services/v3/v3-data.service.js.map +1 -0
- package/dist/cli/backend/src/types/cross-machine.types.d.ts +103 -0
- package/dist/cli/backend/src/types/cross-machine.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/cross-machine.types.js +47 -0
- package/dist/cli/backend/src/types/cross-machine.types.js.map +1 -0
- package/dist/cli/backend/src/types/intent-task.types.d.ts +402 -0
- package/dist/cli/backend/src/types/intent-task.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/intent-task.types.js +403 -0
- package/dist/cli/backend/src/types/intent-task.types.js.map +1 -0
- package/dist/cli/backend/src/types/orchestrator-state.types.d.ts +531 -0
- package/dist/cli/backend/src/types/orchestrator-state.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/orchestrator-state.types.js +110 -0
- package/dist/cli/backend/src/types/orchestrator-state.types.js.map +1 -0
- package/dist/cli/backend/src/types/v2/index.d.ts +30 -0
- package/dist/cli/backend/src/types/v2/index.d.ts.map +1 -0
- package/dist/cli/backend/src/types/v2/index.js +22 -0
- package/dist/cli/backend/src/types/v2/index.js.map +1 -0
- package/dist/cli/backend/src/types/v2/key-result.types.d.ts +279 -0
- package/dist/cli/backend/src/types/v2/key-result.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/v2/key-result.types.js +264 -0
- package/dist/cli/backend/src/types/v2/key-result.types.js.map +1 -0
- package/dist/cli/backend/src/types/v2/mission.types.d.ts +661 -0
- package/dist/cli/backend/src/types/v2/mission.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/v2/mission.types.js +713 -0
- package/dist/cli/backend/src/types/v2/mission.types.js.map +1 -0
- package/dist/cli/backend/src/types/v2/reconcile.types.d.ts +204 -0
- package/dist/cli/backend/src/types/v2/reconcile.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/v2/reconcile.types.js +121 -0
- package/dist/cli/backend/src/types/v2/reconcile.types.js.map +1 -0
- package/dist/cli/backend/src/types/v2/request.types.d.ts +192 -0
- package/dist/cli/backend/src/types/v2/request.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/v2/request.types.js +179 -0
- package/dist/cli/backend/src/types/v2/request.types.js.map +1 -0
- package/dist/cli/backend/src/types/v2/work-item.types.d.ts +181 -1
- package/dist/cli/backend/src/types/v2/work-item.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/v2/work-item.types.js +104 -17
- package/dist/cli/backend/src/types/v2/work-item.types.js.map +1 -1
- package/dist/cli/backend/src/types/v2/workspace.types.d.ts +157 -0
- package/dist/cli/backend/src/types/v2/workspace.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/v2/workspace.types.js +173 -0
- package/dist/cli/backend/src/types/v2/workspace.types.js.map +1 -0
- package/dist/cli/backend/src/utils/async.utils.d.ts +68 -0
- package/dist/cli/backend/src/utils/async.utils.d.ts.map +1 -0
- package/dist/cli/backend/src/utils/async.utils.js +80 -0
- package/dist/cli/backend/src/utils/async.utils.js.map +1 -0
- package/dist/cli/backend/src/utils/native-binding.utils.d.ts +128 -0
- package/dist/cli/backend/src/utils/native-binding.utils.d.ts.map +1 -0
- package/dist/cli/backend/src/utils/native-binding.utils.js +206 -0
- package/dist/cli/backend/src/utils/native-binding.utils.js.map +1 -0
- package/dist/cli/backend/src/websocket/chat.gateway.d.ts +142 -0
- package/dist/cli/backend/src/websocket/chat.gateway.d.ts.map +1 -0
- package/dist/cli/backend/src/websocket/chat.gateway.js +327 -0
- package/dist/cli/backend/src/websocket/chat.gateway.js.map +1 -0
- package/dist/cli/backend/src/websocket/terminal.gateway.d.ts +341 -0
- package/dist/cli/backend/src/websocket/terminal.gateway.d.ts.map +1 -0
- package/dist/cli/backend/src/websocket/terminal.gateway.js +933 -0
- package/dist/cli/backend/src/websocket/terminal.gateway.js.map +1 -0
- package/dist/cli/config/vitest-exclude.constants.d.ts +53 -0
- package/dist/cli/config/vitest-exclude.constants.d.ts.map +1 -0
- package/dist/cli/config/vitest-exclude.constants.js +55 -0
- package/dist/cli/config/vitest-exclude.constants.js.map +1 -0
- package/frontend/dist/assets/index-890d3f9d.js +4961 -0
- package/frontend/dist/index.html +1 -1
- package/package.json +2 -2
- package/packages/crewly-agent/src/runtime/agent-runner.service.test.ts +174 -30
- package/packages/crewly-agent/src/runtime/agent-runner.service.ts +121 -6
- package/packages/crewly-agent/src/runtime/types.ts +56 -5
- package/frontend/dist/assets/index-aa737fd3.js +0 -5254
|
@@ -0,0 +1,933 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Terminal Gateway Module
|
|
3
|
+
*
|
|
4
|
+
* Provides WebSocket-based real-time terminal streaming for PTY and in-process sessions.
|
|
5
|
+
* Uses event-based streaming instead of polling for better performance.
|
|
6
|
+
*
|
|
7
|
+
* In-process sessions (Crewly Agent runtime) are streamed via InProcessLogBuffer
|
|
8
|
+
* EventEmitter events, while PTY sessions use native onData events.
|
|
9
|
+
*
|
|
10
|
+
* @module terminal-gateway
|
|
11
|
+
*/
|
|
12
|
+
import { LoggerService } from '../services/core/logger.service.js';
|
|
13
|
+
import { getSessionBackendSync, } from '../services/session/index.js';
|
|
14
|
+
import { TERMINAL_GATEWAY_CONSTANTS } from '../constants.js';
|
|
15
|
+
import { InProcessLogBuffer } from '../services/agent/crewly-agent/in-process-log-buffer.js';
|
|
16
|
+
/**
|
|
17
|
+
* Terminal Gateway class for WebSocket-based terminal streaming.
|
|
18
|
+
*
|
|
19
|
+
* Provides:
|
|
20
|
+
* - Real-time terminal output streaming via PTY onData events
|
|
21
|
+
* - Terminal input forwarding to PTY sessions
|
|
22
|
+
* - Terminal resize handling
|
|
23
|
+
* - Session subscription management
|
|
24
|
+
*/
|
|
25
|
+
export class TerminalGateway {
|
|
26
|
+
io;
|
|
27
|
+
logger;
|
|
28
|
+
/** Map of session name to set of subscribed socket IDs */
|
|
29
|
+
connectedClients = new Map();
|
|
30
|
+
/** Map of session name to unsubscribe function for PTY onData */
|
|
31
|
+
sessionSubscriptions = new Map();
|
|
32
|
+
/** Set of sessions with persistent monitoring (not stopped on client disconnect) */
|
|
33
|
+
persistentMonitoringSessions = new Set();
|
|
34
|
+
/**
|
|
35
|
+
* Pending retry timers for eager monitoring attempts that fired before the
|
|
36
|
+
* PTY session was registered in the SessionBackend.
|
|
37
|
+
*
|
|
38
|
+
* Keyed by session name. Cleared on first successful attach, on stop, and
|
|
39
|
+
* on destroy so a backoff schedule never leaks a timer past the gateway.
|
|
40
|
+
*/
|
|
41
|
+
pendingMonitoringRetries = new Map();
|
|
42
|
+
/** Current active chat conversation ID for orchestrator responses */
|
|
43
|
+
activeConversationId = null;
|
|
44
|
+
/**
|
|
45
|
+
* Sessions in read-only mode for security auditing.
|
|
46
|
+
* Terminal output is streamed normally, but all input is blocked.
|
|
47
|
+
* Used for compliance auditing and observing agent behavior safely.
|
|
48
|
+
*/
|
|
49
|
+
readOnlySessions = new Set();
|
|
50
|
+
/**
|
|
51
|
+
* Set of in-process sessions currently being streamed via InProcessLogBuffer.
|
|
52
|
+
* These sessions are automatically read-only (no PTY to write to).
|
|
53
|
+
*/
|
|
54
|
+
inProcessStreamingSessions = new Set();
|
|
55
|
+
/**
|
|
56
|
+
* Bound handler for InProcessLogBuffer 'data' events.
|
|
57
|
+
* Stored so it can be removed on destroy.
|
|
58
|
+
*/
|
|
59
|
+
inProcessDataHandler = null;
|
|
60
|
+
/**
|
|
61
|
+
* Create a new TerminalGateway.
|
|
62
|
+
*
|
|
63
|
+
* @param io - Socket.IO server instance
|
|
64
|
+
*/
|
|
65
|
+
constructor(io) {
|
|
66
|
+
this.io = io;
|
|
67
|
+
this.logger = LoggerService.getInstance().createComponentLogger('TerminalGateway');
|
|
68
|
+
this.setupEventHandlers();
|
|
69
|
+
this.setupInProcessLogStreaming();
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Set up WebSocket event handlers.
|
|
73
|
+
*/
|
|
74
|
+
setupEventHandlers() {
|
|
75
|
+
this.io.on('connection', (socket) => {
|
|
76
|
+
this.logger.info('WebSocket client connected', { socketId: socket.id });
|
|
77
|
+
// Handle subscription to terminal sessions
|
|
78
|
+
socket.on('subscribe_to_session', (sessionName) => {
|
|
79
|
+
this.logger.debug('Received subscribe_to_session event', {
|
|
80
|
+
sessionName,
|
|
81
|
+
socketId: socket.id,
|
|
82
|
+
});
|
|
83
|
+
this.subscribeToSession(sessionName, socket);
|
|
84
|
+
});
|
|
85
|
+
// Handle unsubscription from terminal sessions
|
|
86
|
+
socket.on('unsubscribe_from_session', (sessionName) => {
|
|
87
|
+
this.unsubscribeFromSession(sessionName, socket);
|
|
88
|
+
});
|
|
89
|
+
// Handle sending input to terminal sessions
|
|
90
|
+
socket.on('send_input', async (data) => {
|
|
91
|
+
await this.sendInput(data.sessionName, data.input, socket);
|
|
92
|
+
});
|
|
93
|
+
// Handle terminal resize events
|
|
94
|
+
socket.on('terminal_resize', (data) => {
|
|
95
|
+
this.handleTerminalResize(data.sessionName, data.cols, data.rows);
|
|
96
|
+
});
|
|
97
|
+
// Handle request for fresh terminal state (e.g. after resize)
|
|
98
|
+
socket.on('request_terminal_state', (sessionName) => {
|
|
99
|
+
this.sendCurrentTerminalState(sessionName, socket);
|
|
100
|
+
});
|
|
101
|
+
// Handle client disconnection
|
|
102
|
+
socket.on('disconnect', () => {
|
|
103
|
+
this.handleClientDisconnect(socket);
|
|
104
|
+
});
|
|
105
|
+
// Send initial connection confirmation
|
|
106
|
+
socket.emit('connected', {
|
|
107
|
+
type: 'connection_established',
|
|
108
|
+
payload: { socketId: socket.id },
|
|
109
|
+
timestamp: new Date().toISOString(),
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Set up real-time log streaming from InProcessLogBuffer.
|
|
115
|
+
*
|
|
116
|
+
* Listens for 'data' events emitted when InProcessLogBuffer.append() is called,
|
|
117
|
+
* and broadcasts the formatted log line to all WebSocket subscribers of that session.
|
|
118
|
+
*/
|
|
119
|
+
setupInProcessLogStreaming() {
|
|
120
|
+
const logBuffer = InProcessLogBuffer.getInstance();
|
|
121
|
+
this.inProcessDataHandler = (sessionName, formattedLine) => {
|
|
122
|
+
// Only broadcast if someone is subscribed to this in-process session
|
|
123
|
+
if (!this.inProcessStreamingSessions.has(sessionName)) {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
const terminalOutput = {
|
|
127
|
+
sessionName,
|
|
128
|
+
content: formattedLine + '\r\n',
|
|
129
|
+
timestamp: new Date().toISOString(),
|
|
130
|
+
type: 'stdout',
|
|
131
|
+
};
|
|
132
|
+
const message = {
|
|
133
|
+
type: 'terminal_output',
|
|
134
|
+
payload: terminalOutput,
|
|
135
|
+
timestamp: new Date().toISOString(),
|
|
136
|
+
};
|
|
137
|
+
this.io.to(`terminal_${sessionName}`).emit('terminal_output', message);
|
|
138
|
+
};
|
|
139
|
+
logBuffer.on('data', this.inProcessDataHandler);
|
|
140
|
+
this.logger.info('In-process log streaming listener registered');
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Check if a session is an in-process Crewly Agent session.
|
|
144
|
+
*
|
|
145
|
+
* @param sessionName - The session to check
|
|
146
|
+
* @returns True if the session exists in InProcessLogBuffer
|
|
147
|
+
*/
|
|
148
|
+
isInProcessSession(sessionName) {
|
|
149
|
+
return InProcessLogBuffer.getInstance().hasSession(sessionName);
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Subscribe a client to a specific terminal session.
|
|
153
|
+
*
|
|
154
|
+
* @param sessionName - The session to subscribe to
|
|
155
|
+
* @param socket - The client socket
|
|
156
|
+
*/
|
|
157
|
+
subscribeToSession(sessionName, socket) {
|
|
158
|
+
this.logger.info('Subscribing client to session', {
|
|
159
|
+
socketId: socket.id,
|
|
160
|
+
sessionName,
|
|
161
|
+
});
|
|
162
|
+
// Initialize client set for this session if not exists
|
|
163
|
+
if (!this.connectedClients.has(sessionName)) {
|
|
164
|
+
this.connectedClients.set(sessionName, new Set());
|
|
165
|
+
}
|
|
166
|
+
// Add client to subscription list
|
|
167
|
+
this.connectedClients.get(sessionName).add(socket.id);
|
|
168
|
+
// Join socket.io room for this session
|
|
169
|
+
socket.join(`terminal_${sessionName}`);
|
|
170
|
+
// Try PTY streaming first, then fall back to in-process streaming
|
|
171
|
+
let streamingStarted = this.startPtyStreaming(sessionName);
|
|
172
|
+
if (!streamingStarted) {
|
|
173
|
+
// Check if this is an in-process Crewly Agent session
|
|
174
|
+
streamingStarted = this.startInProcessStreaming(sessionName);
|
|
175
|
+
}
|
|
176
|
+
// Send current terminal state to new subscriber
|
|
177
|
+
this.sendCurrentTerminalState(sessionName, socket);
|
|
178
|
+
// Confirm subscription (even if session doesn't exist yet - client will get updates when it's created)
|
|
179
|
+
socket.emit('subscription_confirmed', {
|
|
180
|
+
type: 'subscription_confirmed',
|
|
181
|
+
payload: { sessionName, sessionExists: streamingStarted },
|
|
182
|
+
timestamp: new Date().toISOString(),
|
|
183
|
+
});
|
|
184
|
+
// If session doesn't exist, also emit a session_not_found so client knows to wait
|
|
185
|
+
if (!streamingStarted) {
|
|
186
|
+
this.logger.info('Session does not exist yet, client will wait for creation', {
|
|
187
|
+
sessionName,
|
|
188
|
+
socketId: socket.id,
|
|
189
|
+
});
|
|
190
|
+
socket.emit('session_pending', {
|
|
191
|
+
type: 'session_pending',
|
|
192
|
+
payload: { sessionName, message: 'Session is being created, please wait...' },
|
|
193
|
+
timestamp: new Date().toISOString(),
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Start streaming logs from an in-process Crewly Agent session.
|
|
199
|
+
*
|
|
200
|
+
* In-process sessions are automatically read-only (no PTY to write to).
|
|
201
|
+
* Real-time streaming is handled by the InProcessLogBuffer 'data' event
|
|
202
|
+
* listener set up in setupInProcessLogStreaming().
|
|
203
|
+
*
|
|
204
|
+
* @param sessionName - The session to stream from
|
|
205
|
+
* @returns True if the session is an in-process session and streaming started
|
|
206
|
+
*/
|
|
207
|
+
startInProcessStreaming(sessionName) {
|
|
208
|
+
const logBuffer = InProcessLogBuffer.getInstance();
|
|
209
|
+
if (!logBuffer.hasSession(sessionName)) {
|
|
210
|
+
return false;
|
|
211
|
+
}
|
|
212
|
+
// Mark as in-process streaming session (enables data event broadcasting)
|
|
213
|
+
this.inProcessStreamingSessions.add(sessionName);
|
|
214
|
+
// In-process sessions are always read-only (no PTY to write to)
|
|
215
|
+
this.readOnlySessions.add(sessionName);
|
|
216
|
+
this.logger.info('Started in-process log streaming for session', {
|
|
217
|
+
sessionName,
|
|
218
|
+
isReadOnly: true,
|
|
219
|
+
});
|
|
220
|
+
return true;
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Start streaming output from a PTY session.
|
|
224
|
+
* Uses event-based onData instead of polling.
|
|
225
|
+
*
|
|
226
|
+
* @param sessionName - The session to stream from
|
|
227
|
+
* @returns True if streaming started successfully, false otherwise
|
|
228
|
+
*/
|
|
229
|
+
startPtyStreaming(sessionName) {
|
|
230
|
+
// Don't duplicate subscriptions
|
|
231
|
+
if (this.sessionSubscriptions.has(sessionName)) {
|
|
232
|
+
this.logger.debug('Session already has streaming subscription', { sessionName });
|
|
233
|
+
return true;
|
|
234
|
+
}
|
|
235
|
+
const backend = getSessionBackendSync();
|
|
236
|
+
if (!backend) {
|
|
237
|
+
this.logger.warn('Session backend not initialized, cannot start streaming', {
|
|
238
|
+
sessionName,
|
|
239
|
+
});
|
|
240
|
+
return false;
|
|
241
|
+
}
|
|
242
|
+
// List all available sessions for debugging
|
|
243
|
+
const availableSessions = backend.listSessions();
|
|
244
|
+
this.logger.debug('Looking for session in backend', {
|
|
245
|
+
sessionName,
|
|
246
|
+
availableSessions,
|
|
247
|
+
sessionCount: availableSessions.length,
|
|
248
|
+
});
|
|
249
|
+
const session = backend.getSession(sessionName);
|
|
250
|
+
if (!session) {
|
|
251
|
+
this.logger.warn('Session not found for streaming', {
|
|
252
|
+
sessionName,
|
|
253
|
+
availableSessions,
|
|
254
|
+
});
|
|
255
|
+
return false;
|
|
256
|
+
}
|
|
257
|
+
// Subscribe to PTY onData events - real-time streaming
|
|
258
|
+
const unsubscribeData = session.onData((data) => {
|
|
259
|
+
const terminalOutput = {
|
|
260
|
+
sessionName,
|
|
261
|
+
content: data,
|
|
262
|
+
timestamp: new Date().toISOString(),
|
|
263
|
+
type: 'stdout',
|
|
264
|
+
};
|
|
265
|
+
this.broadcastOutput(sessionName, terminalOutput);
|
|
266
|
+
});
|
|
267
|
+
// Subscribe to exit events
|
|
268
|
+
const unsubscribeExit = session.onExit((exitCode) => {
|
|
269
|
+
const lastOutput = backend.captureOutput(sessionName, 50);
|
|
270
|
+
this.logger.info('Session exited', {
|
|
271
|
+
sessionName,
|
|
272
|
+
exitCode,
|
|
273
|
+
lastOutput: lastOutput?.slice(-500),
|
|
274
|
+
});
|
|
275
|
+
this.broadcastSessionStatus(sessionName, 'terminated');
|
|
276
|
+
this.cleanupSessionSubscription(sessionName);
|
|
277
|
+
});
|
|
278
|
+
// Store combined cleanup function to prevent memory leaks
|
|
279
|
+
this.sessionSubscriptions.set(sessionName, () => {
|
|
280
|
+
unsubscribeData();
|
|
281
|
+
unsubscribeExit();
|
|
282
|
+
});
|
|
283
|
+
this.logger.info('Started PTY streaming for session', { sessionName });
|
|
284
|
+
return true;
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Stop streaming output from a PTY session.
|
|
288
|
+
* Does not stop sessions with persistent monitoring enabled.
|
|
289
|
+
*
|
|
290
|
+
* @param sessionName - The session to stop streaming from
|
|
291
|
+
* @param force - Force stop even for persistent monitoring sessions
|
|
292
|
+
*/
|
|
293
|
+
stopPtyStreaming(sessionName, force = false) {
|
|
294
|
+
// Don't stop persistent monitoring sessions unless forced
|
|
295
|
+
if (!force && this.persistentMonitoringSessions.has(sessionName)) {
|
|
296
|
+
this.logger.debug('Skipping stop for persistent monitoring session', { sessionName });
|
|
297
|
+
return;
|
|
298
|
+
}
|
|
299
|
+
const unsubscribe = this.sessionSubscriptions.get(sessionName);
|
|
300
|
+
if (unsubscribe) {
|
|
301
|
+
unsubscribe();
|
|
302
|
+
this.sessionSubscriptions.delete(sessionName);
|
|
303
|
+
this.persistentMonitoringSessions.delete(sessionName);
|
|
304
|
+
this.logger.info('Stopped PTY streaming for session', { sessionName });
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Start persistent monitoring for the orchestrator session.
|
|
309
|
+
*
|
|
310
|
+
* Ensures chat responses are captured even when no WebSocket clients are
|
|
311
|
+
* viewing the terminal. If the PTY session is not yet registered in the
|
|
312
|
+
* SessionBackend (e.g. eager call from boot fires before
|
|
313
|
+
* createAgentSession's backend registration completes), schedules bounded
|
|
314
|
+
* retries on the {@link TERMINAL_GATEWAY_CONSTANTS.MONITORING_RETRY_BACKOFFS_MS}
|
|
315
|
+
* backoff schedule. Persistent flag stays set across retries so a parallel
|
|
316
|
+
* subscriber path doesn't bypass eventual attachment.
|
|
317
|
+
*
|
|
318
|
+
* @param sessionName - The orchestrator session name to monitor
|
|
319
|
+
* @returns True if monitoring started synchronously on first attempt; false
|
|
320
|
+
* if a retry was scheduled (caller-visible failure is reserved for
|
|
321
|
+
* terminal failure after all retries, surfaced via ERROR log only).
|
|
322
|
+
*/
|
|
323
|
+
startOrchestratorChatMonitoring(sessionName) {
|
|
324
|
+
this.logger.info('Starting persistent orchestrator chat monitoring', { sessionName });
|
|
325
|
+
// Cancel any in-flight retry from a previous start call so we don't
|
|
326
|
+
// stack two backoff schedules on the same session.
|
|
327
|
+
this.clearPendingMonitoringRetry(sessionName);
|
|
328
|
+
// Force cleanup any stale subscription from a previous session.
|
|
329
|
+
// When the orchestrator is restarted, the old PTY session is destroyed but
|
|
330
|
+
// the subscription entry may still exist pointing to the dead session.
|
|
331
|
+
// We must remove it so startPtyStreaming creates a fresh subscription.
|
|
332
|
+
if (this.sessionSubscriptions.has(sessionName)) {
|
|
333
|
+
this.logger.info('Cleaning up existing subscription for orchestrator chat monitoring', { sessionName });
|
|
334
|
+
const unsubscribe = this.sessionSubscriptions.get(sessionName);
|
|
335
|
+
unsubscribe();
|
|
336
|
+
this.sessionSubscriptions.delete(sessionName);
|
|
337
|
+
}
|
|
338
|
+
// Mark session as persistent so it won't be stopped when clients disconnect
|
|
339
|
+
this.persistentMonitoringSessions.add(sessionName);
|
|
340
|
+
const started = this.startPtyStreaming(sessionName);
|
|
341
|
+
if (started) {
|
|
342
|
+
return true;
|
|
343
|
+
}
|
|
344
|
+
// Backend hasn't registered the session yet (race with createAgentSession).
|
|
345
|
+
// Keep persistentMonitoringSessions flagged and schedule bounded retries.
|
|
346
|
+
this.logger.warn('PTY not ready for orchestrator chat monitoring, scheduling retries', { sessionName, schedule: TERMINAL_GATEWAY_CONSTANTS.MONITORING_RETRY_BACKOFFS_MS });
|
|
347
|
+
this.scheduleMonitoringRetry(sessionName, 0);
|
|
348
|
+
return false;
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Schedule the next bounded retry attempt to attach orchestrator monitoring.
|
|
352
|
+
*
|
|
353
|
+
* @param sessionName - Session name being monitored
|
|
354
|
+
* @param attemptIndex - 0-based index into MONITORING_RETRY_BACKOFFS_MS
|
|
355
|
+
*/
|
|
356
|
+
scheduleMonitoringRetry(sessionName, attemptIndex) {
|
|
357
|
+
const schedule = TERMINAL_GATEWAY_CONSTANTS.MONITORING_RETRY_BACKOFFS_MS;
|
|
358
|
+
if (attemptIndex >= schedule.length) {
|
|
359
|
+
// Exhausted retries — log diagnostics and give up. Drop the
|
|
360
|
+
// persistent flag so a subsequent subscriber-driven attach can
|
|
361
|
+
// still proceed via the normal subscribeToSession path.
|
|
362
|
+
const backend = getSessionBackendSync();
|
|
363
|
+
this.logger.error('Orchestrator chat monitoring failed after all retries — orc output will not stream until a client subscribes', {
|
|
364
|
+
sessionName,
|
|
365
|
+
attempts: schedule.length,
|
|
366
|
+
availableSessions: backend?.listSessions() ?? [],
|
|
367
|
+
});
|
|
368
|
+
this.persistentMonitoringSessions.delete(sessionName);
|
|
369
|
+
this.pendingMonitoringRetries.delete(sessionName);
|
|
370
|
+
return;
|
|
371
|
+
}
|
|
372
|
+
const delayMs = schedule[attemptIndex];
|
|
373
|
+
const timer = setTimeout(() => {
|
|
374
|
+
this.pendingMonitoringRetries.delete(sessionName);
|
|
375
|
+
// Stop guard: the persistent flag is cleared by
|
|
376
|
+
// stopOrchestratorChatMonitoring. If it's gone, abandon retry.
|
|
377
|
+
if (!this.persistentMonitoringSessions.has(sessionName)) {
|
|
378
|
+
this.logger.debug('Monitoring retry abandoned — persistent flag cleared', {
|
|
379
|
+
sessionName,
|
|
380
|
+
attemptIndex,
|
|
381
|
+
});
|
|
382
|
+
return;
|
|
383
|
+
}
|
|
384
|
+
const started = this.startPtyStreaming(sessionName);
|
|
385
|
+
if (started) {
|
|
386
|
+
this.logger.info('Orchestrator chat monitoring attached on retry', {
|
|
387
|
+
sessionName,
|
|
388
|
+
attemptIndex: attemptIndex + 1,
|
|
389
|
+
delayMs,
|
|
390
|
+
});
|
|
391
|
+
return;
|
|
392
|
+
}
|
|
393
|
+
this.scheduleMonitoringRetry(sessionName, attemptIndex + 1);
|
|
394
|
+
}, delayMs);
|
|
395
|
+
// Allow the process to exit even if a retry is still pending.
|
|
396
|
+
// Without unref, lingering timers keep node alive past graceful shutdown.
|
|
397
|
+
if (typeof timer.unref === 'function') {
|
|
398
|
+
timer.unref();
|
|
399
|
+
}
|
|
400
|
+
this.pendingMonitoringRetries.set(sessionName, timer);
|
|
401
|
+
}
|
|
402
|
+
/**
|
|
403
|
+
* Clear any pending monitoring retry timer for a session.
|
|
404
|
+
*
|
|
405
|
+
* Idempotent — safe to call when no retry is queued.
|
|
406
|
+
*
|
|
407
|
+
* @param sessionName - Session name whose retry should be cleared
|
|
408
|
+
*/
|
|
409
|
+
clearPendingMonitoringRetry(sessionName) {
|
|
410
|
+
const timer = this.pendingMonitoringRetries.get(sessionName);
|
|
411
|
+
if (timer) {
|
|
412
|
+
clearTimeout(timer);
|
|
413
|
+
this.pendingMonitoringRetries.delete(sessionName);
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* Stop persistent monitoring for the orchestrator session.
|
|
418
|
+
*
|
|
419
|
+
* Cancels any in-flight retry schedule so a stop mid-backoff doesn't leak
|
|
420
|
+
* a timer that later attaches to a session the caller already gave up on.
|
|
421
|
+
*
|
|
422
|
+
* @param sessionName - The orchestrator session name
|
|
423
|
+
*/
|
|
424
|
+
stopOrchestratorChatMonitoring(sessionName) {
|
|
425
|
+
this.logger.info('Stopping persistent orchestrator chat monitoring', { sessionName });
|
|
426
|
+
this.clearPendingMonitoringRetry(sessionName);
|
|
427
|
+
this.stopPtyStreaming(sessionName, true);
|
|
428
|
+
}
|
|
429
|
+
/**
|
|
430
|
+
* Clean up session subscription when session ends.
|
|
431
|
+
*
|
|
432
|
+
* @param sessionName - The session to clean up
|
|
433
|
+
*/
|
|
434
|
+
cleanupSessionSubscription(sessionName) {
|
|
435
|
+
this.stopPtyStreaming(sessionName);
|
|
436
|
+
this.connectedClients.delete(sessionName);
|
|
437
|
+
}
|
|
438
|
+
/**
|
|
439
|
+
* Unsubscribe a client from a terminal session.
|
|
440
|
+
*
|
|
441
|
+
* @param sessionName - The session to unsubscribe from
|
|
442
|
+
* @param socket - The client socket
|
|
443
|
+
*/
|
|
444
|
+
unsubscribeFromSession(sessionName, socket) {
|
|
445
|
+
const clients = this.connectedClients.get(sessionName);
|
|
446
|
+
if (clients) {
|
|
447
|
+
clients.delete(socket.id);
|
|
448
|
+
// Stop streaming if no more clients watching
|
|
449
|
+
if (clients.size === 0) {
|
|
450
|
+
this.stopPtyStreaming(sessionName);
|
|
451
|
+
// Clean up in-process streaming tracking
|
|
452
|
+
this.inProcessStreamingSessions.delete(sessionName);
|
|
453
|
+
this.connectedClients.delete(sessionName);
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
// Leave socket.io room
|
|
457
|
+
socket.leave(`terminal_${sessionName}`);
|
|
458
|
+
this.logger.debug('Client unsubscribed from session', {
|
|
459
|
+
socketId: socket.id,
|
|
460
|
+
sessionName,
|
|
461
|
+
});
|
|
462
|
+
// Confirm unsubscription
|
|
463
|
+
socket.emit('unsubscription_confirmed', {
|
|
464
|
+
type: 'unsubscription_confirmed',
|
|
465
|
+
payload: { sessionName },
|
|
466
|
+
timestamp: new Date().toISOString(),
|
|
467
|
+
});
|
|
468
|
+
}
|
|
469
|
+
/**
|
|
470
|
+
* Send input to a terminal session.
|
|
471
|
+
*
|
|
472
|
+
* @param sessionName - The session to send input to
|
|
473
|
+
* @param input - The input string
|
|
474
|
+
* @param socket - The client socket
|
|
475
|
+
*/
|
|
476
|
+
async sendInput(sessionName, input, socket) {
|
|
477
|
+
try {
|
|
478
|
+
// Block input for read-only sessions (audit mode)
|
|
479
|
+
if (this.readOnlySessions.has(sessionName)) {
|
|
480
|
+
this.logger.warn('Input blocked for read-only session', { sessionName, fromClient: socket.id });
|
|
481
|
+
socket.emit('error', {
|
|
482
|
+
type: 'read_only',
|
|
483
|
+
payload: { sessionName, error: 'Session is in read-only mode (audit mode). Input is blocked.' },
|
|
484
|
+
timestamp: new Date().toISOString(),
|
|
485
|
+
});
|
|
486
|
+
return;
|
|
487
|
+
}
|
|
488
|
+
const backend = getSessionBackendSync();
|
|
489
|
+
if (!backend) {
|
|
490
|
+
throw new Error('Session backend not initialized');
|
|
491
|
+
}
|
|
492
|
+
const session = backend.getSession(sessionName);
|
|
493
|
+
if (!session) {
|
|
494
|
+
socket.emit('error', {
|
|
495
|
+
type: 'session_not_found',
|
|
496
|
+
payload: { sessionName, error: 'Session does not exist' },
|
|
497
|
+
timestamp: new Date().toISOString(),
|
|
498
|
+
});
|
|
499
|
+
return;
|
|
500
|
+
}
|
|
501
|
+
// Write input directly to PTY
|
|
502
|
+
session.write(input);
|
|
503
|
+
this.logger.debug('Sent input to session', {
|
|
504
|
+
sessionName,
|
|
505
|
+
inputLength: input.length,
|
|
506
|
+
fromClient: socket.id,
|
|
507
|
+
});
|
|
508
|
+
// Broadcast input confirmation to all subscribers
|
|
509
|
+
this.broadcastMessage(sessionName, 'input_received', {
|
|
510
|
+
sessionName,
|
|
511
|
+
input,
|
|
512
|
+
fromClient: socket.id,
|
|
513
|
+
});
|
|
514
|
+
}
|
|
515
|
+
catch (error) {
|
|
516
|
+
this.logger.error('Error sending input to session', {
|
|
517
|
+
sessionName,
|
|
518
|
+
error: error instanceof Error ? error.message : String(error),
|
|
519
|
+
});
|
|
520
|
+
socket.emit('error', {
|
|
521
|
+
type: 'input_error',
|
|
522
|
+
payload: {
|
|
523
|
+
sessionName,
|
|
524
|
+
error: error instanceof Error ? error.message : 'Failed to send input',
|
|
525
|
+
},
|
|
526
|
+
timestamp: new Date().toISOString(),
|
|
527
|
+
});
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
/**
|
|
531
|
+
* Handle terminal resize events.
|
|
532
|
+
*
|
|
533
|
+
* @param sessionName - The session to resize
|
|
534
|
+
* @param cols - New column count
|
|
535
|
+
* @param rows - New row count
|
|
536
|
+
*/
|
|
537
|
+
handleTerminalResize(sessionName, cols, rows) {
|
|
538
|
+
try {
|
|
539
|
+
const backend = getSessionBackendSync();
|
|
540
|
+
if (!backend) {
|
|
541
|
+
this.logger.warn('Cannot resize: session backend not initialized');
|
|
542
|
+
return;
|
|
543
|
+
}
|
|
544
|
+
// Use resizeSession if available (resizes both PTY and headless buffer).
|
|
545
|
+
// This prevents cursor movement corruption when the frontend xterm.js
|
|
546
|
+
// has different dimensions than the backend headless terminal buffer.
|
|
547
|
+
if (backend.resizeSession) {
|
|
548
|
+
backend.resizeSession(sessionName, cols, rows);
|
|
549
|
+
}
|
|
550
|
+
else {
|
|
551
|
+
const session = backend.getSession(sessionName);
|
|
552
|
+
if (!session) {
|
|
553
|
+
this.logger.debug('Cannot resize: session not found', { sessionName });
|
|
554
|
+
return;
|
|
555
|
+
}
|
|
556
|
+
session.resize(cols, rows);
|
|
557
|
+
}
|
|
558
|
+
this.logger.debug('Terminal resized', { sessionName, cols, rows });
|
|
559
|
+
// Broadcast resize event to other clients viewing the same session
|
|
560
|
+
this.broadcastMessage(sessionName, 'terminal_resized', {
|
|
561
|
+
sessionName,
|
|
562
|
+
cols,
|
|
563
|
+
rows,
|
|
564
|
+
});
|
|
565
|
+
}
|
|
566
|
+
catch (error) {
|
|
567
|
+
// Distinguish "session genuinely gone" (frontend reconnect
|
|
568
|
+
// race — common, expected, drop to debug) from other resize
|
|
569
|
+
// failures (PTY backend issue — keep at error). Steve
|
|
570
|
+
// 2026-05-15: 314 ERROR entries from `Session 'X' does not
|
|
571
|
+
// exist` across one day was overwhelming the log without
|
|
572
|
+
// indicating any actionable problem.
|
|
573
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
574
|
+
const isMissingSession = /does not exist/.test(msg);
|
|
575
|
+
this.logger[isMissingSession ? 'debug' : 'error']('Error resizing terminal', {
|
|
576
|
+
sessionName,
|
|
577
|
+
error: msg,
|
|
578
|
+
});
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
/**
|
|
582
|
+
* Handle client disconnection.
|
|
583
|
+
*
|
|
584
|
+
* @param socket - The disconnected client socket
|
|
585
|
+
*/
|
|
586
|
+
handleClientDisconnect(socket) {
|
|
587
|
+
this.logger.info('Client disconnected', { socketId: socket.id });
|
|
588
|
+
// Remove client from all session subscriptions
|
|
589
|
+
for (const [sessionName, clients] of this.connectedClients.entries()) {
|
|
590
|
+
if (clients.has(socket.id)) {
|
|
591
|
+
clients.delete(socket.id);
|
|
592
|
+
// Stop streaming if no more clients watching
|
|
593
|
+
if (clients.size === 0) {
|
|
594
|
+
this.stopPtyStreaming(sessionName);
|
|
595
|
+
this.inProcessStreamingSessions.delete(sessionName);
|
|
596
|
+
this.connectedClients.delete(sessionName);
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
/**
|
|
602
|
+
* Broadcast terminal output to all subscribers of a session.
|
|
603
|
+
* Also processes orchestrator output for chat responses.
|
|
604
|
+
*
|
|
605
|
+
* @param sessionName - The session name
|
|
606
|
+
* @param output - The terminal output
|
|
607
|
+
*/
|
|
608
|
+
broadcastOutput(sessionName, output) {
|
|
609
|
+
const message = {
|
|
610
|
+
type: 'terminal_output',
|
|
611
|
+
payload: output,
|
|
612
|
+
timestamp: new Date().toISOString(),
|
|
613
|
+
};
|
|
614
|
+
this.io.to(`terminal_${sessionName}`).emit('terminal_output', message);
|
|
615
|
+
}
|
|
616
|
+
/**
|
|
617
|
+
* Enable read-only mode for a session. Output streaming continues but
|
|
618
|
+
* all input is blocked. Used for security auditing and safe observation.
|
|
619
|
+
*
|
|
620
|
+
* @param sessionName - The session to set as read-only
|
|
621
|
+
*/
|
|
622
|
+
setReadOnly(sessionName) {
|
|
623
|
+
this.readOnlySessions.add(sessionName);
|
|
624
|
+
this.logger.info('Session set to read-only mode', { sessionName });
|
|
625
|
+
}
|
|
626
|
+
/**
|
|
627
|
+
* Disable read-only mode for a session, restoring normal input capability.
|
|
628
|
+
*
|
|
629
|
+
* @param sessionName - The session to restore
|
|
630
|
+
*/
|
|
631
|
+
clearReadOnly(sessionName) {
|
|
632
|
+
this.readOnlySessions.delete(sessionName);
|
|
633
|
+
this.logger.info('Session read-only mode cleared', { sessionName });
|
|
634
|
+
}
|
|
635
|
+
/**
|
|
636
|
+
* Check if a session is in read-only (audit) mode.
|
|
637
|
+
*
|
|
638
|
+
* @param sessionName - The session to check
|
|
639
|
+
* @returns True if the session is read-only
|
|
640
|
+
*/
|
|
641
|
+
isReadOnly(sessionName) {
|
|
642
|
+
return this.readOnlySessions.has(sessionName);
|
|
643
|
+
}
|
|
644
|
+
/**
|
|
645
|
+
* Set the active conversation ID for orchestrator chat responses.
|
|
646
|
+
*
|
|
647
|
+
* @param conversationId - The conversation ID to set
|
|
648
|
+
*/
|
|
649
|
+
setActiveConversationId(conversationId) {
|
|
650
|
+
this.activeConversationId = conversationId;
|
|
651
|
+
}
|
|
652
|
+
/**
|
|
653
|
+
* Get the active conversation ID.
|
|
654
|
+
*
|
|
655
|
+
* @returns The active conversation ID or null
|
|
656
|
+
*/
|
|
657
|
+
getActiveConversationId() {
|
|
658
|
+
return this.activeConversationId;
|
|
659
|
+
}
|
|
660
|
+
/**
|
|
661
|
+
* Broadcast session status changes.
|
|
662
|
+
*
|
|
663
|
+
* @param sessionName - The session name
|
|
664
|
+
* @param status - The status string
|
|
665
|
+
*/
|
|
666
|
+
broadcastSessionStatus(sessionName, status) {
|
|
667
|
+
const message = {
|
|
668
|
+
type: 'team_status',
|
|
669
|
+
payload: { sessionName, status },
|
|
670
|
+
timestamp: new Date().toISOString(),
|
|
671
|
+
};
|
|
672
|
+
this.io.to(`terminal_${sessionName}`).emit('session_status', message);
|
|
673
|
+
}
|
|
674
|
+
/**
|
|
675
|
+
* Broadcast general messages to session subscribers.
|
|
676
|
+
*
|
|
677
|
+
* @param sessionName - The session name
|
|
678
|
+
* @param type - Message type
|
|
679
|
+
* @param payload - Message payload
|
|
680
|
+
*/
|
|
681
|
+
broadcastMessage(sessionName, type, payload) {
|
|
682
|
+
const message = {
|
|
683
|
+
type: type,
|
|
684
|
+
payload,
|
|
685
|
+
timestamp: new Date().toISOString(),
|
|
686
|
+
};
|
|
687
|
+
this.io.to(`terminal_${sessionName}`).emit(type, message);
|
|
688
|
+
}
|
|
689
|
+
/**
|
|
690
|
+
* Send current terminal state to a new subscriber.
|
|
691
|
+
*
|
|
692
|
+
* @param sessionName - The session name
|
|
693
|
+
* @param socket - The client socket
|
|
694
|
+
*/
|
|
695
|
+
async sendCurrentTerminalState(sessionName, socket) {
|
|
696
|
+
try {
|
|
697
|
+
this.logger.debug('Sending current terminal state', {
|
|
698
|
+
sessionName,
|
|
699
|
+
socketId: socket.id,
|
|
700
|
+
});
|
|
701
|
+
// Check in-process sessions first (they don't have a PTY backend)
|
|
702
|
+
if (this.inProcessStreamingSessions.has(sessionName)) {
|
|
703
|
+
const logBuffer = InProcessLogBuffer.getInstance();
|
|
704
|
+
const output = logBuffer.capture(sessionName, 500);
|
|
705
|
+
const terminalState = {
|
|
706
|
+
sessionName,
|
|
707
|
+
content: output + '\r\n',
|
|
708
|
+
timestamp: new Date().toISOString(),
|
|
709
|
+
type: 'stdout',
|
|
710
|
+
};
|
|
711
|
+
this.logger.debug('Emitting initial in-process terminal state', {
|
|
712
|
+
sessionName,
|
|
713
|
+
contentLength: output.length,
|
|
714
|
+
});
|
|
715
|
+
socket.emit('initial_terminal_state', {
|
|
716
|
+
type: 'initial_terminal_state',
|
|
717
|
+
payload: terminalState,
|
|
718
|
+
timestamp: new Date().toISOString(),
|
|
719
|
+
});
|
|
720
|
+
return;
|
|
721
|
+
}
|
|
722
|
+
const backend = getSessionBackendSync();
|
|
723
|
+
if (!backend) {
|
|
724
|
+
socket.emit('error', {
|
|
725
|
+
type: 'terminal_state_error',
|
|
726
|
+
payload: { sessionName, error: 'Session backend not initialized' },
|
|
727
|
+
timestamp: new Date().toISOString(),
|
|
728
|
+
});
|
|
729
|
+
return;
|
|
730
|
+
}
|
|
731
|
+
if (!backend.sessionExists(sessionName)) {
|
|
732
|
+
this.logger.debug('Session does not exist', { sessionName });
|
|
733
|
+
socket.emit('session_not_found', {
|
|
734
|
+
type: 'session_not_found',
|
|
735
|
+
payload: { sessionName },
|
|
736
|
+
timestamp: new Date().toISOString(),
|
|
737
|
+
});
|
|
738
|
+
return;
|
|
739
|
+
}
|
|
740
|
+
// Get serialized terminal visual state (plain text, no cursor movements).
|
|
741
|
+
// The headless terminal processes all ANSI sequences and returns the
|
|
742
|
+
// rendered result — safe for replay at any terminal dimensions.
|
|
743
|
+
// Falls back to raw history if serialization is not available.
|
|
744
|
+
const output = backend.getSerializedState
|
|
745
|
+
? await backend.getSerializedState(sessionName)
|
|
746
|
+
: backend.getRawHistory(sessionName);
|
|
747
|
+
const terminalState = {
|
|
748
|
+
sessionName,
|
|
749
|
+
content: output,
|
|
750
|
+
timestamp: new Date().toISOString(),
|
|
751
|
+
type: 'stdout',
|
|
752
|
+
};
|
|
753
|
+
this.logger.debug('Emitting initial terminal state', {
|
|
754
|
+
sessionName,
|
|
755
|
+
contentLength: output.length,
|
|
756
|
+
});
|
|
757
|
+
// Send initial terminal state
|
|
758
|
+
socket.emit('initial_terminal_state', {
|
|
759
|
+
type: 'initial_terminal_state',
|
|
760
|
+
payload: terminalState,
|
|
761
|
+
timestamp: new Date().toISOString(),
|
|
762
|
+
});
|
|
763
|
+
}
|
|
764
|
+
catch (error) {
|
|
765
|
+
this.logger.error('Error getting terminal state', {
|
|
766
|
+
sessionName,
|
|
767
|
+
error: error instanceof Error ? error.message : String(error),
|
|
768
|
+
});
|
|
769
|
+
socket.emit('error', {
|
|
770
|
+
type: 'terminal_state_error',
|
|
771
|
+
payload: {
|
|
772
|
+
sessionName,
|
|
773
|
+
error: error instanceof Error ? error.message : 'Failed to get terminal state',
|
|
774
|
+
},
|
|
775
|
+
timestamp: new Date().toISOString(),
|
|
776
|
+
});
|
|
777
|
+
}
|
|
778
|
+
}
|
|
779
|
+
/**
|
|
780
|
+
* Get statistics about connected clients.
|
|
781
|
+
*
|
|
782
|
+
* @returns Connection statistics
|
|
783
|
+
*/
|
|
784
|
+
getConnectionStats() {
|
|
785
|
+
const sessionSubscriptions = {};
|
|
786
|
+
for (const [sessionName, clients] of this.connectedClients.entries()) {
|
|
787
|
+
sessionSubscriptions[sessionName] = clients.size;
|
|
788
|
+
}
|
|
789
|
+
return {
|
|
790
|
+
totalClients: this.io.sockets.sockets.size,
|
|
791
|
+
sessionSubscriptions,
|
|
792
|
+
totalSessions: this.connectedClients.size,
|
|
793
|
+
activeStreams: this.sessionSubscriptions.size,
|
|
794
|
+
};
|
|
795
|
+
}
|
|
796
|
+
/**
|
|
797
|
+
* Force disconnect all clients from a session.
|
|
798
|
+
*
|
|
799
|
+
* @param sessionName - The session name
|
|
800
|
+
*/
|
|
801
|
+
disconnectSessionClients(sessionName) {
|
|
802
|
+
this.io.to(`terminal_${sessionName}`).disconnectSockets();
|
|
803
|
+
this.cleanupSessionSubscription(sessionName);
|
|
804
|
+
this.logger.info('Disconnected all clients from session', { sessionName });
|
|
805
|
+
}
|
|
806
|
+
/**
|
|
807
|
+
* Broadcast system-wide notifications.
|
|
808
|
+
*
|
|
809
|
+
* @param message - Notification message
|
|
810
|
+
* @param type - Notification type
|
|
811
|
+
*/
|
|
812
|
+
broadcastSystemNotification(message, type = 'info') {
|
|
813
|
+
this.io.emit('system_notification', {
|
|
814
|
+
type: 'system_notification',
|
|
815
|
+
payload: { message, notificationType: type },
|
|
816
|
+
timestamp: new Date().toISOString(),
|
|
817
|
+
});
|
|
818
|
+
}
|
|
819
|
+
/**
|
|
820
|
+
* Broadcast orchestrator status changes.
|
|
821
|
+
*
|
|
822
|
+
* @param orchestratorData - Orchestrator data
|
|
823
|
+
*/
|
|
824
|
+
broadcastOrchestratorStatus(orchestratorData) {
|
|
825
|
+
this.io.emit('orchestrator_status_changed', {
|
|
826
|
+
type: 'orchestrator_status_changed',
|
|
827
|
+
payload: orchestratorData,
|
|
828
|
+
timestamp: new Date().toISOString(),
|
|
829
|
+
});
|
|
830
|
+
}
|
|
831
|
+
/**
|
|
832
|
+
* Broadcast team member status changes.
|
|
833
|
+
*
|
|
834
|
+
* @param memberData - Team member data
|
|
835
|
+
*/
|
|
836
|
+
broadcastTeamMemberStatus(memberData) {
|
|
837
|
+
this.io.emit('team_member_status_changed', {
|
|
838
|
+
type: 'team_member_status_changed',
|
|
839
|
+
payload: memberData,
|
|
840
|
+
timestamp: new Date().toISOString(),
|
|
841
|
+
});
|
|
842
|
+
}
|
|
843
|
+
/**
|
|
844
|
+
* Broadcast a system resource alert to all connected clients.
|
|
845
|
+
*
|
|
846
|
+
* @param alertData - Alert details including key, message, severity, and timestamp
|
|
847
|
+
*/
|
|
848
|
+
broadcastSystemResourceAlert(alertData) {
|
|
849
|
+
this.io.emit('system_resource_alert', {
|
|
850
|
+
type: 'system_resource_alert',
|
|
851
|
+
payload: alertData,
|
|
852
|
+
timestamp: alertData.timestamp,
|
|
853
|
+
});
|
|
854
|
+
}
|
|
855
|
+
/**
|
|
856
|
+
* Broadcast context window status updates to all connected clients.
|
|
857
|
+
*
|
|
858
|
+
* @param contextData - Context window status data
|
|
859
|
+
*/
|
|
860
|
+
broadcastContextWindowStatus(contextData) {
|
|
861
|
+
this.io.emit('context_window_status', {
|
|
862
|
+
type: 'context_window_status',
|
|
863
|
+
payload: contextData,
|
|
864
|
+
timestamp: contextData.timestamp,
|
|
865
|
+
});
|
|
866
|
+
}
|
|
867
|
+
/**
|
|
868
|
+
* Broadcast comprehensive team activity updates.
|
|
869
|
+
*
|
|
870
|
+
* @param activityData - Activity data
|
|
871
|
+
*/
|
|
872
|
+
broadcastTeamActivity(activityData) {
|
|
873
|
+
this.io.emit('team_activity_updated', {
|
|
874
|
+
type: 'team_activity_updated',
|
|
875
|
+
payload: activityData,
|
|
876
|
+
timestamp: new Date().toISOString(),
|
|
877
|
+
});
|
|
878
|
+
}
|
|
879
|
+
/**
|
|
880
|
+
* Destroy the gateway and clean up all subscriptions.
|
|
881
|
+
*/
|
|
882
|
+
destroy() {
|
|
883
|
+
// Cancel any pending monitoring retries before tearing down.
|
|
884
|
+
// Otherwise a queued retry could fire after destroy and attach
|
|
885
|
+
// a listener to a session whose owner has gone away.
|
|
886
|
+
for (const timer of this.pendingMonitoringRetries.values()) {
|
|
887
|
+
clearTimeout(timer);
|
|
888
|
+
}
|
|
889
|
+
this.pendingMonitoringRetries.clear();
|
|
890
|
+
// Unsubscribe from all PTY sessions
|
|
891
|
+
for (const unsubscribe of this.sessionSubscriptions.values()) {
|
|
892
|
+
unsubscribe();
|
|
893
|
+
}
|
|
894
|
+
this.sessionSubscriptions.clear();
|
|
895
|
+
this.connectedClients.clear();
|
|
896
|
+
this.persistentMonitoringSessions.clear();
|
|
897
|
+
// Clean up in-process log streaming
|
|
898
|
+
if (this.inProcessDataHandler) {
|
|
899
|
+
InProcessLogBuffer.getInstance().removeListener('data', this.inProcessDataHandler);
|
|
900
|
+
this.inProcessDataHandler = null;
|
|
901
|
+
}
|
|
902
|
+
this.inProcessStreamingSessions.clear();
|
|
903
|
+
this.logger.info('TerminalGateway destroyed');
|
|
904
|
+
}
|
|
905
|
+
}
|
|
906
|
+
// =============================================================================
|
|
907
|
+
// Singleton Instance
|
|
908
|
+
// =============================================================================
|
|
909
|
+
let terminalGatewayInstance = null;
|
|
910
|
+
/**
|
|
911
|
+
* Set the terminal gateway singleton instance.
|
|
912
|
+
* Called during server initialization.
|
|
913
|
+
*
|
|
914
|
+
* @param gateway - The TerminalGateway instance
|
|
915
|
+
*/
|
|
916
|
+
export function setTerminalGateway(gateway) {
|
|
917
|
+
terminalGatewayInstance = gateway;
|
|
918
|
+
}
|
|
919
|
+
/**
|
|
920
|
+
* Get the terminal gateway singleton instance.
|
|
921
|
+
*
|
|
922
|
+
* @returns The TerminalGateway instance or null if not initialized
|
|
923
|
+
*/
|
|
924
|
+
export function getTerminalGateway() {
|
|
925
|
+
return terminalGatewayInstance;
|
|
926
|
+
}
|
|
927
|
+
/**
|
|
928
|
+
* Reset the terminal gateway singleton instance (for testing).
|
|
929
|
+
*/
|
|
930
|
+
export function resetTerminalGateway() {
|
|
931
|
+
terminalGatewayInstance = null;
|
|
932
|
+
}
|
|
933
|
+
//# sourceMappingURL=terminal.gateway.js.map
|