crewly 1.20.194 → 1.20.196
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/constants.ts +68 -0
- package/config/hooks/agent-status/report.sh +31 -12
- package/config/hooks/subagent-guard/subagent.sh +25 -1
- package/config/roles/auditor/prompt.md +2 -2
- package/config/roles/orchestrator/fragments/communication.md +1 -1
- package/config/roles/orchestrator/fragments/lifecycle.md +1 -1
- package/config/roles/orchestrator/prompt.md +18 -508
- package/config/skills/_common/lib.sh +28 -5
- package/config/skills/_common/lib.test.sh +32 -1
- package/config/skills/agent/computer-use/SKILL.md +6 -0
- package/config/skills/agent/core/create-intent-tasks/execute.sh +2 -0
- package/config/skills/agent/core/decompose-intent/execute.sh +2 -0
- package/config/skills/agent/core/experiment-card/SKILL.md +38 -5
- package/config/skills/agent/core/experiment-card/execute.sh +40 -4
- package/config/skills/agent/core/experiment-card/execute.test.sh +17 -0
- package/config/skills/agent/core/project-tickets/SKILL.md +35 -2
- package/config/skills/agent/core/project-tickets/execute.sh +59 -6
- package/config/skills/agent/core/project-tickets/execute.test.sh +24 -0
- package/config/skills/agent/core/send-message/execute.sh +16 -0
- package/config/skills/agent/core/send-message/execute.test.sh +10 -0
- package/config/skills/agent/core/trace-read/SKILL.md +117 -0
- package/config/skills/agent/core/trace-read/execute.sh +116 -0
- package/config/skills/agent/core/update-intent-task/execute.sh +2 -0
- package/config/skills/agent/desktop-app-control/execute.sh +5 -2
- package/config/skills/agent/marketing/submit-for-approval/execute.sh +3 -2
- package/config/skills/orchestrator/decompose-mission/execute.sh +2 -0
- package/config/skills/orchestrator/decompose-okr/execute.sh +1 -0
- package/config/skills/orchestrator/design-team/execute.sh +2 -0
- package/config/skills/orchestrator/measure-kr/execute.sh +2 -0
- package/config/skills/orchestrator/review-mission/execute.sh +2 -0
- package/config/skills/orchestrator/send-message/execute.sh +27 -2
- package/config/skills/orchestrator/send-message/execute.test.sh +89 -0
- package/config/skills/registry.json +6 -5
- package/config/skills/team-leader/design-checklist/execute.sh +2 -0
- package/config/skills/team-leader/signal-digest/SKILL.md +110 -0
- package/config/skills/team-leader/signal-digest/execute.sh +173 -0
- package/config/skills/team-leader/signal-digest/execute.test.sh +123 -0
- package/config/skills/team-leader/signal-digest/signal-digest.config.example.json +23 -0
- package/config/skills/team-leader/signal-digest/signal_digest.py +572 -0
- package/config/skills/team-leader/signal-digest/signal_digest.test.py +319 -0
- package/dist/backend/backend/src/constants.d.ts +356 -5
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +341 -8
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.controller.d.ts +9 -3
- package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.controller.js +38 -5
- package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/approvals/approvals.controller.d.ts +4 -9
- package/dist/backend/backend/src/controllers/approvals/approvals.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/approvals/approvals.controller.js +6 -14
- package/dist/backend/backend/src/controllers/approvals/approvals.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/auth/owner-session.controller.d.ts +64 -0
- package/dist/backend/backend/src/controllers/auth/owner-session.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/auth/owner-session.controller.js +164 -0
- package/dist/backend/backend/src/controllers/auth/owner-session.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/browser/browser.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/browser/browser.routes.js +18 -5
- package/dist/backend/backend/src/controllers/browser/browser.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/canva/canva.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/canva/canva.routes.js +8 -1
- package/dist/backend/backend/src/controllers/canva/canva.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/chat/chat.controller.js +16 -1
- package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.js +3 -1
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/cloud-device-pairing.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/cloud-device-pairing.controller.js +3 -5
- package/dist/backend/backend/src/controllers/cloud/cloud-device-pairing.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/connector/connector.controller.d.ts +4 -2
- package/dist/backend/backend/src/controllers/connector/connector.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/connector/connector.controller.js +17 -2
- package/dist/backend/backend/src/controllers/connector/connector.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/connector/grant-sharing.handler.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/connector/grant-sharing.handler.js +2 -3
- package/dist/backend/backend/src/controllers/connector/grant-sharing.handler.js.map +1 -1
- package/dist/backend/backend/src/controllers/decisions/decisions.controller.d.ts +4 -2
- package/dist/backend/backend/src/controllers/decisions/decisions.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/decisions/decisions.controller.js +31 -20
- package/dist/backend/backend/src/controllers/decisions/decisions.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/desktop/desktop.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/desktop/desktop.controller.js +16 -0
- package/dist/backend/backend/src/controllers/desktop/desktop.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/google/google.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/google/google.controller.js +9 -5
- package/dist/backend/backend/src/controllers/google/google.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/google/google.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/google/google.routes.js +16 -3
- package/dist/backend/backend/src/controllers/google/google.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/harness/harness.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/harness/harness.controller.js +3 -5
- package/dist/backend/backend/src/controllers/harness/harness.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/marketplace/marketplace.routes.d.ts +1 -0
- package/dist/backend/backend/src/controllers/marketplace/marketplace.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/marketplace/marketplace.routes.js +1 -0
- package/dist/backend/backend/src/controllers/marketplace/marketplace.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.routes.js +8 -1
- package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/mission/mission-policy.routes.js +1 -1
- package/dist/backend/backend/src/controllers/mission/mission-policy.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js +5 -2
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/owner-receipt/owner-receipt.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/owner-receipt/owner-receipt.controller.js +3 -5
- package/dist/backend/backend/src/controllers/owner-receipt/owner-receipt.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/people/people.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/people/people.routes.js +3 -5
- package/dist/backend/backend/src/controllers/people/people.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.d.ts +35 -2
- package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.js +138 -4
- package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/project-tickets/project-tickets.routes.d.ts +2 -0
- package/dist/backend/backend/src/controllers/project-tickets/project-tickets.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/project-tickets/project-tickets.routes.js +7 -1
- package/dist/backend/backend/src/controllers/project-tickets/project-tickets.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/request/open-items.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/request/open-items.controller.js +2 -4
- package/dist/backend/backend/src/controllers/request/open-items.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/request/request.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/request/request.controller.js +5 -1
- package/dist/backend/backend/src/controllers/request/request.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/settings/settings.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/settings/settings.controller.js +18 -2
- package/dist/backend/backend/src/controllers/settings/settings.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/signal-digest/signal-digest.controller.d.ts +26 -0
- package/dist/backend/backend/src/controllers/signal-digest/signal-digest.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/signal-digest/signal-digest.controller.js +100 -0
- package/dist/backend/backend/src/controllers/signal-digest/signal-digest.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/slack/slack.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/slack/slack.controller.js +9 -0
- package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.js +11 -0
- package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/system/system-control.controller.d.ts +6 -4
- package/dist/backend/backend/src/controllers/system/system-control.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/system/system-control.controller.js +20 -13
- package/dist/backend/backend/src/controllers/system/system-control.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.controller.js +14 -7
- package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/tickets/tickets.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/tickets/tickets.controller.js +5 -7
- package/dist/backend/backend/src/controllers/tickets/tickets.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/trace/trace.controller.d.ts +73 -0
- package/dist/backend/backend/src/controllers/trace/trace.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/trace/trace.controller.js +437 -0
- package/dist/backend/backend/src/controllers/trace/trace.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/whatsapp/whatsapp-inbox.controller.d.ts +3 -3
- package/dist/backend/backend/src/controllers/whatsapp/whatsapp-inbox.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/whatsapp/whatsapp-inbox.controller.js +4 -2
- package/dist/backend/backend/src/controllers/whatsapp/whatsapp-inbox.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/whatsapp/whatsapp.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/whatsapp/whatsapp.controller.js +10 -2
- package/dist/backend/backend/src/controllers/whatsapp/whatsapp.controller.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts +34 -0
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +342 -61
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/middleware/agent-origin-correction.d.ts +31 -0
- package/dist/backend/backend/src/middleware/agent-origin-correction.d.ts.map +1 -0
- package/dist/backend/backend/src/middleware/agent-origin-correction.js +31 -0
- package/dist/backend/backend/src/middleware/agent-origin-correction.js.map +1 -0
- package/dist/backend/backend/src/middleware/agent-origin.middleware.d.ts +6 -0
- package/dist/backend/backend/src/middleware/agent-origin.middleware.d.ts.map +1 -1
- package/dist/backend/backend/src/middleware/agent-origin.middleware.js +4 -1
- package/dist/backend/backend/src/middleware/agent-origin.middleware.js.map +1 -1
- package/dist/backend/backend/src/middleware/api-token.middleware.d.ts +20 -17
- package/dist/backend/backend/src/middleware/api-token.middleware.d.ts.map +1 -1
- package/dist/backend/backend/src/middleware/api-token.middleware.js +27 -37
- package/dist/backend/backend/src/middleware/api-token.middleware.js.map +1 -1
- package/dist/backend/backend/src/middleware/caller-identity.middleware.d.ts +213 -0
- package/dist/backend/backend/src/middleware/caller-identity.middleware.d.ts.map +1 -0
- package/dist/backend/backend/src/middleware/caller-identity.middleware.js +481 -0
- package/dist/backend/backend/src/middleware/caller-identity.middleware.js.map +1 -0
- package/dist/backend/backend/src/middleware/caller-identity.testing.d.ts +67 -0
- package/dist/backend/backend/src/middleware/caller-identity.testing.d.ts.map +1 -0
- package/dist/backend/backend/src/middleware/caller-identity.testing.js +108 -0
- package/dist/backend/backend/src/middleware/caller-identity.testing.js.map +1 -0
- package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.js +11 -0
- package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
- 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 +17 -2
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/control-plane-guard.service.d.ts +7 -5
- package/dist/backend/backend/src/services/agent/control-plane-guard.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/control-plane-guard.service.js +19 -10
- package/dist/backend/backend/src/services/agent/control-plane-guard.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 +10 -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/oauth-relogin-monitor.service.d.ts +1 -1
- package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/restore-filter.d.ts +5 -2
- package/dist/backend/backend/src/services/agent/restore-filter.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/restore-filter.js +5 -2
- package/dist/backend/backend/src/services/agent/restore-filter.js.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js +4 -0
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts +29 -0
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js +77 -1
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-session-recovery.d.ts +4 -2
- package/dist/backend/backend/src/services/agent/runtime-session-recovery.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-session-recovery.js +22 -6
- package/dist/backend/backend/src/services/agent/runtime-session-recovery.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/communication.module.js +2 -2
- package/dist/backend/backend/src/services/ai/prompt-modules/communication.module.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js +1 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
- package/dist/backend/backend/src/services/backup/backup-archive.service.d.ts +6 -0
- package/dist/backend/backend/src/services/backup/backup-archive.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/backup/backup-archive.service.js +7 -1
- package/dist/backend/backend/src/services/backup/backup-archive.service.js.map +1 -1
- package/dist/backend/backend/src/services/boot/boot-announce.service.d.ts +1 -1
- package/dist/backend/backend/src/services/boot/boot-announce.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat/chat.service.d.ts +175 -2
- package/dist/backend/backend/src/services/chat/chat.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat/chat.service.js +444 -35
- package/dist/backend/backend/src/services/chat/chat.service.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +30 -5
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +34 -4
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts +4 -3
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js +7 -4
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.d.ts +18 -11
- package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.js +19 -25
- package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts +7 -4
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js +8 -4
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/types.d.ts +0 -1
- package/dist/backend/backend/src/services/chat-v2/types.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/types.js +0 -1
- package/dist/backend/backend/src/services/chat-v2/types.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js +5 -0
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js.map +1 -1
- package/dist/backend/backend/src/services/core/api-token.service.d.ts +28 -0
- package/dist/backend/backend/src/services/core/api-token.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/core/api-token.service.js +46 -0
- package/dist/backend/backend/src/services/core/api-token.service.js.map +1 -1
- package/dist/backend/backend/src/services/core/dashboard-build.d.ts +49 -0
- package/dist/backend/backend/src/services/core/dashboard-build.d.ts.map +1 -0
- package/dist/backend/backend/src/services/core/dashboard-build.js +68 -0
- package/dist/backend/backend/src/services/core/dashboard-build.js.map +1 -0
- package/dist/backend/backend/src/services/core/owner-auth.service.d.ts +127 -0
- package/dist/backend/backend/src/services/core/owner-auth.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/core/owner-auth.service.js +205 -0
- package/dist/backend/backend/src/services/core/owner-auth.service.js.map +1 -0
- package/dist/backend/backend/src/services/core/peer-process.service.d.ts +168 -0
- package/dist/backend/backend/src/services/core/peer-process.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/core/peer-process.service.js +352 -0
- package/dist/backend/backend/src/services/core/peer-process.service.js.map +1 -0
- package/dist/backend/backend/src/services/decisions/decision-store.d.ts.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision-store.js +5 -1
- package/dist/backend/backend/src/services/decisions/decision-store.js.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision.wiring.d.ts +10 -1
- package/dist/backend/backend/src/services/decisions/decision.wiring.d.ts.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision.wiring.js +20 -9
- package/dist/backend/backend/src/services/decisions/decision.wiring.js.map +1 -1
- package/dist/backend/backend/src/services/experiments/experiment-verdict.d.ts +1 -1
- package/dist/backend/backend/src/services/experiments/experiment-verdict.js +2 -2
- package/dist/backend/backend/src/services/experiments/experiment-verdict.js.map +1 -1
- package/dist/backend/backend/src/services/experiments/experiment.service.d.ts +149 -4
- package/dist/backend/backend/src/services/experiments/experiment.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/experiments/experiment.service.js +549 -24
- package/dist/backend/backend/src/services/experiments/experiment.service.js.map +1 -1
- package/dist/backend/backend/src/services/experiments/experiment.wiring.d.ts +20 -5
- package/dist/backend/backend/src/services/experiments/experiment.wiring.d.ts.map +1 -1
- package/dist/backend/backend/src/services/experiments/experiment.wiring.js +46 -9
- package/dist/backend/backend/src/services/experiments/experiment.wiring.js.map +1 -1
- package/dist/backend/backend/src/services/experiments/seo-ops-metric.fetcher.d.ts +7 -0
- package/dist/backend/backend/src/services/experiments/seo-ops-metric.fetcher.d.ts.map +1 -1
- package/dist/backend/backend/src/services/experiments/seo-ops-metric.fetcher.js +21 -1
- package/dist/backend/backend/src/services/experiments/seo-ops-metric.fetcher.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/owner-message-watchdog.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/owner-message-watchdog.service.js +7 -0
- package/dist/backend/backend/src/services/messaging/owner-message-watchdog.service.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/owner-message-watchdog.wiring.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/owner-message-watchdog.wiring.js +2 -1
- package/dist/backend/backend/src/services/messaging/owner-message-watchdog.wiring.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/thread-status-queue.service.d.ts +0 -8
- package/dist/backend/backend/src/services/messaging/thread-status-queue.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/thread-status-queue.service.js +0 -18
- package/dist/backend/backend/src/services/messaging/thread-status-queue.service.js.map +1 -1
- package/dist/backend/backend/src/services/monitoring/activity-monitor.service.d.ts +19 -0
- package/dist/backend/backend/src/services/monitoring/activity-monitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js +41 -5
- package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/monitoring/agent-turn-state.d.ts +184 -0
- package/dist/backend/backend/src/services/monitoring/agent-turn-state.d.ts.map +1 -0
- package/dist/backend/backend/src/services/monitoring/agent-turn-state.js +391 -0
- package/dist/backend/backend/src/services/monitoring/agent-turn-state.js.map +1 -0
- package/dist/backend/backend/src/services/monitoring/claude-transcript-sync.service.d.ts +35 -1
- package/dist/backend/backend/src/services/monitoring/claude-transcript-sync.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/monitoring/claude-transcript-sync.service.js +138 -2
- package/dist/backend/backend/src/services/monitoring/claude-transcript-sync.service.js.map +1 -1
- package/dist/backend/backend/src/services/monitoring/claude-transcript-turn.d.ts +73 -0
- package/dist/backend/backend/src/services/monitoring/claude-transcript-turn.d.ts.map +1 -0
- package/dist/backend/backend/src/services/monitoring/claude-transcript-turn.js +258 -0
- package/dist/backend/backend/src/services/monitoring/claude-transcript-turn.js.map +1 -0
- package/dist/backend/backend/src/services/monitoring/deferred-idle-settle.d.ts +82 -0
- package/dist/backend/backend/src/services/monitoring/deferred-idle-settle.d.ts.map +1 -0
- package/dist/backend/backend/src/services/monitoring/deferred-idle-settle.js +141 -0
- package/dist/backend/backend/src/services/monitoring/deferred-idle-settle.js.map +1 -0
- package/dist/backend/backend/src/services/monitoring/system-resource-alert.service.d.ts +51 -1
- package/dist/backend/backend/src/services/monitoring/system-resource-alert.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/monitoring/system-resource-alert.service.js +118 -2
- package/dist/backend/backend/src/services/monitoring/system-resource-alert.service.js.map +1 -1
- package/dist/backend/backend/src/services/monitoring/token-usage.service.d.ts +7 -0
- package/dist/backend/backend/src/services/monitoring/token-usage.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/monitoring/token-usage.service.js +4 -0
- package/dist/backend/backend/src/services/monitoring/token-usage.service.js.map +1 -1
- package/dist/backend/backend/src/services/monitoring/transcript-cost-repair.d.ts +103 -0
- package/dist/backend/backend/src/services/monitoring/transcript-cost-repair.d.ts.map +1 -0
- package/dist/backend/backend/src/services/monitoring/transcript-cost-repair.js +86 -0
- package/dist/backend/backend/src/services/monitoring/transcript-cost-repair.js.map +1 -0
- package/dist/backend/backend/src/services/open-items/open-items.service.d.ts +57 -0
- package/dist/backend/backend/src/services/open-items/open-items.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/open-items/open-items.service.js +100 -4
- package/dist/backend/backend/src/services/open-items/open-items.service.js.map +1 -1
- package/dist/backend/backend/src/services/orc/orc-status-router.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/orc-status-router.service.js +10 -2
- package/dist/backend/backend/src/services/orc/orc-status-router.service.js.map +1 -1
- package/dist/backend/backend/src/services/orc/reply-destination.wiring.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/reply-destination.wiring.js +16 -0
- package/dist/backend/backend/src/services/orc/reply-destination.wiring.js.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.js +13 -0
- package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.js.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/project-ticket.service.d.ts +36 -0
- package/dist/backend/backend/src/services/project-tickets/project-ticket.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/project-ticket.service.js +44 -3
- package/dist/backend/backend/src/services/project-tickets/project-ticket.service.js.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/ticket-assignee-waker.d.ts.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/ticket-assignee-waker.js +2 -1
- package/dist/backend/backend/src/services/project-tickets/ticket-assignee-waker.js.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.d.ts.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.js +3 -0
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.js.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-retro.d.ts +156 -0
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-retro.d.ts.map +1 -0
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-retro.js +308 -0
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-retro.js.map +1 -0
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-stats.d.ts +212 -0
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-stats.d.ts.map +1 -0
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-stats.js +515 -0
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-stats.js.map +1 -0
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-trace.d.ts +186 -0
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-trace.d.ts.map +1 -0
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-trace.js +341 -0
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-trace.js.map +1 -0
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.d.ts +309 -0
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.js +726 -1
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.js.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconciler.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconciler.service.js +15 -0
- package/dist/backend/backend/src/services/reconciler/reconciler.service.js.map +1 -1
- package/dist/backend/backend/src/services/restart/in-flight-turn-tracker.service.d.ts +34 -3
- package/dist/backend/backend/src/services/restart/in-flight-turn-tracker.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/restart/in-flight-turn-tracker.service.js +57 -2
- package/dist/backend/backend/src/services/restart/in-flight-turn-tracker.service.js.map +1 -1
- package/dist/backend/backend/src/services/restart/interrupted-turns.d.ts +61 -3
- package/dist/backend/backend/src/services/restart/interrupted-turns.d.ts.map +1 -1
- package/dist/backend/backend/src/services/restart/interrupted-turns.js +106 -9
- package/dist/backend/backend/src/services/restart/interrupted-turns.js.map +1 -1
- package/dist/backend/backend/src/services/restart/restart-drain.service.d.ts +22 -0
- package/dist/backend/backend/src/services/restart/restart-drain.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/restart/restart-drain.service.js +37 -5
- package/dist/backend/backend/src/services/restart/restart-drain.service.js.map +1 -1
- package/dist/backend/backend/src/services/restart/supervisor-stop-budget.d.ts +62 -0
- package/dist/backend/backend/src/services/restart/supervisor-stop-budget.d.ts.map +1 -0
- package/dist/backend/backend/src/services/restart/supervisor-stop-budget.js +126 -0
- package/dist/backend/backend/src/services/restart/supervisor-stop-budget.js.map +1 -0
- package/dist/backend/backend/src/services/restart/turn-probe.d.ts +17 -2
- package/dist/backend/backend/src/services/restart/turn-probe.d.ts.map +1 -1
- package/dist/backend/backend/src/services/restart/turn-probe.js +29 -4
- package/dist/backend/backend/src/services/restart/turn-probe.js.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.js +4 -0
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.js.map +1 -1
- package/dist/backend/backend/src/services/session/session-handoff.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/session/session-handoff.service.js +8 -5
- package/dist/backend/backend/src/services/session/session-handoff.service.js.map +1 -1
- package/dist/backend/backend/src/services/signal-digest/signal-digest-card.d.ts +75 -0
- package/dist/backend/backend/src/services/signal-digest/signal-digest-card.d.ts.map +1 -0
- package/dist/backend/backend/src/services/signal-digest/signal-digest-card.js +187 -0
- package/dist/backend/backend/src/services/signal-digest/signal-digest-card.js.map +1 -0
- package/dist/backend/backend/src/services/signal-digest/signal-digest-contract.d.ts +86 -0
- package/dist/backend/backend/src/services/signal-digest/signal-digest-contract.d.ts.map +1 -0
- package/dist/backend/backend/src/services/signal-digest/signal-digest-contract.js +307 -0
- package/dist/backend/backend/src/services/signal-digest/signal-digest-contract.js.map +1 -0
- package/dist/backend/backend/src/services/signal-digest/signal-digest-store.d.ts +85 -0
- package/dist/backend/backend/src/services/signal-digest/signal-digest-store.d.ts.map +1 -0
- package/dist/backend/backend/src/services/signal-digest/signal-digest-store.js +185 -0
- package/dist/backend/backend/src/services/signal-digest/signal-digest-store.js.map +1 -0
- package/dist/backend/backend/src/services/signal-digest/signal-digest.service.d.ts +272 -0
- package/dist/backend/backend/src/services/signal-digest/signal-digest.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/signal-digest/signal-digest.service.js +570 -0
- package/dist/backend/backend/src/services/signal-digest/signal-digest.service.js.map +1 -0
- package/dist/backend/backend/src/services/signal-digest/signal-digest.wiring.d.ts +51 -0
- package/dist/backend/backend/src/services/signal-digest/signal-digest.wiring.d.ts.map +1 -0
- package/dist/backend/backend/src/services/signal-digest/signal-digest.wiring.js +116 -0
- package/dist/backend/backend/src/services/signal-digest/signal-digest.wiring.js.map +1 -0
- package/dist/backend/backend/src/services/slack/notify-reconciliation.service.d.ts +5 -1
- package/dist/backend/backend/src/services/slack/notify-reconciliation.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/notify-reconciliation.service.js +6 -2
- package/dist/backend/backend/src/services/slack/notify-reconciliation.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-auto-working.service.d.ts +29 -0
- package/dist/backend/backend/src/services/slack/slack-auto-working.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-auto-working.service.js +66 -3
- package/dist/backend/backend/src/services/slack/slack-auto-working.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts +2 -1
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +3 -2
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-relogin-dm.service.d.ts +1 -1
- package/dist/backend/backend/src/services/slack/slack-relogin-dm.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +79 -15
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +200 -41
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack.service.d.ts +43 -1
- package/dist/backend/backend/src/services/slack/slack.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack.service.js +76 -7
- package/dist/backend/backend/src/services/slack/slack.service.js.map +1 -1
- package/dist/backend/backend/src/services/system/auto-update.service.d.ts +2 -2
- package/dist/backend/backend/src/services/system/auto-update.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/task-pool/pool-storage.d.ts.map +1 -1
- package/dist/backend/backend/src/services/task-pool/pool-storage.js +4 -0
- package/dist/backend/backend/src/services/task-pool/pool-storage.js.map +1 -1
- 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 +2 -0
- package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/backend/backend/src/services/trace/trace-analysis.service.d.ts +99 -0
- package/dist/backend/backend/src/services/trace/trace-analysis.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/trace/trace-analysis.service.js +148 -0
- package/dist/backend/backend/src/services/trace/trace-analysis.service.js.map +1 -0
- package/dist/backend/backend/src/services/trace/trace-context.service.d.ts +212 -0
- package/dist/backend/backend/src/services/trace/trace-context.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/trace/trace-context.service.js +489 -0
- package/dist/backend/backend/src/services/trace/trace-context.service.js.map +1 -0
- package/dist/backend/backend/src/services/trace/trace-http.middleware.d.ts +46 -0
- package/dist/backend/backend/src/services/trace/trace-http.middleware.d.ts.map +1 -0
- package/dist/backend/backend/src/services/trace/trace-http.middleware.js +176 -0
- package/dist/backend/backend/src/services/trace/trace-http.middleware.js.map +1 -0
- package/dist/backend/backend/src/services/trace/trace-markers.d.ts +93 -0
- package/dist/backend/backend/src/services/trace/trace-markers.d.ts.map +1 -0
- package/dist/backend/backend/src/services/trace/trace-markers.js +162 -0
- package/dist/backend/backend/src/services/trace/trace-markers.js.map +1 -0
- package/dist/backend/backend/src/services/trace/trace-metrics.d.ts +262 -0
- package/dist/backend/backend/src/services/trace/trace-metrics.d.ts.map +1 -0
- package/dist/backend/backend/src/services/trace/trace-metrics.js +810 -0
- package/dist/backend/backend/src/services/trace/trace-metrics.js.map +1 -0
- package/dist/backend/backend/src/services/trace/trace-recorder.d.ts +338 -0
- package/dist/backend/backend/src/services/trace/trace-recorder.d.ts.map +1 -0
- package/dist/backend/backend/src/services/trace/trace-recorder.js +789 -0
- package/dist/backend/backend/src/services/trace/trace-recorder.js.map +1 -0
- package/dist/backend/backend/src/services/trace/trace-store.d.ts +308 -0
- package/dist/backend/backend/src/services/trace/trace-store.d.ts.map +1 -0
- package/dist/backend/backend/src/services/trace/trace-store.js +714 -0
- package/dist/backend/backend/src/services/trace/trace-store.js.map +1 -0
- package/dist/backend/backend/src/services/trace/trace-summary.d.ts +77 -0
- package/dist/backend/backend/src/services/trace/trace-summary.d.ts.map +1 -0
- package/dist/backend/backend/src/services/trace/trace-summary.js +239 -0
- package/dist/backend/backend/src/services/trace/trace-summary.js.map +1 -0
- package/dist/backend/backend/src/services/trace/trace-timeline.d.ts +74 -0
- package/dist/backend/backend/src/services/trace/trace-timeline.d.ts.map +1 -0
- package/dist/backend/backend/src/services/trace/trace-timeline.js +162 -0
- package/dist/backend/backend/src/services/trace/trace-timeline.js.map +1 -0
- package/dist/backend/backend/src/services/trace/trace.types.d.ts +137 -0
- package/dist/backend/backend/src/services/trace/trace.types.d.ts.map +1 -0
- package/dist/backend/backend/src/services/trace/trace.types.js +104 -0
- package/dist/backend/backend/src/services/trace/trace.types.js.map +1 -0
- package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt-format-ask.d.ts +80 -0
- package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt-format-ask.d.ts.map +1 -0
- package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt-format-ask.js +184 -0
- package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt-format-ask.js.map +1 -0
- package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.boot.d.ts +1 -1
- package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.boot.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.service.d.ts +7 -0
- package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.service.js +16 -0
- package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.types.d.ts +16 -0
- package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.types.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.types.js.map +1 -1
- package/dist/backend/backend/src/services/v3/request.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/request.service.js +4 -0
- package/dist/backend/backend/src/services/v3/request.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/tl-auto-verify.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/tl-auto-verify.service.js +2 -1
- package/dist/backend/backend/src/services/v3/tl-auto-verify.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts +8 -0
- package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js +46 -4
- package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js.map +1 -1
- package/dist/backend/backend/src/services/whatsapp/whatsapp-draft-gate.d.ts +4 -3
- package/dist/backend/backend/src/services/whatsapp/whatsapp-draft-gate.d.ts.map +1 -1
- package/dist/backend/backend/src/services/whatsapp/whatsapp-draft-gate.js +3 -2
- package/dist/backend/backend/src/services/whatsapp/whatsapp-draft-gate.js.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-ingest.service.d.ts +3 -1
- package/dist/backend/backend/src/services/wiki/wiki-ingest.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-ingest.service.js.map +1 -1
- package/dist/backend/backend/src/services/workflow/message-scheduler.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/workflow/message-scheduler.service.js +3 -0
- package/dist/backend/backend/src/services/workflow/message-scheduler.service.js.map +1 -1
- package/dist/backend/backend/src/services/workflow/scheduler.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/workflow/scheduler.service.js +3 -0
- package/dist/backend/backend/src/services/workflow/scheduler.service.js.map +1 -1
- package/dist/backend/backend/src/services/worktree/workitem-worktree.subscriber.d.ts.map +1 -1
- package/dist/backend/backend/src/services/worktree/workitem-worktree.subscriber.js +2 -1
- package/dist/backend/backend/src/services/worktree/workitem-worktree.subscriber.js.map +1 -1
- package/dist/backend/backend/src/services/worktree/worktree-janitor.service.d.ts +3 -0
- package/dist/backend/backend/src/services/worktree/worktree-janitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/worktree/worktree-janitor.service.js +7 -0
- package/dist/backend/backend/src/services/worktree/worktree-janitor.service.js.map +1 -1
- package/dist/backend/backend/src/types/decision.types.d.ts +3 -1
- package/dist/backend/backend/src/types/decision.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/experiment.types.d.ts +65 -6
- package/dist/backend/backend/src/types/experiment.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/experiment.types.js.map +1 -1
- package/dist/backend/backend/src/types/signal-digest.types.d.ts +185 -0
- package/dist/backend/backend/src/types/signal-digest.types.d.ts.map +1 -0
- package/dist/backend/backend/src/types/signal-digest.types.js +21 -0
- package/dist/backend/backend/src/types/signal-digest.types.js.map +1 -0
- package/dist/backend/backend/src/types/ticket-autopilot.types.d.ts +9 -0
- package/dist/backend/backend/src/types/ticket-autopilot.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/ticket-autopilot.types.js +14 -0
- package/dist/backend/backend/src/types/ticket-autopilot.types.js.map +1 -1
- package/dist/backend/backend/src/types/v2/open-item.types.d.ts +4 -0
- package/dist/backend/backend/src/types/v2/open-item.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/v2/request.types.d.ts +4 -0
- package/dist/backend/backend/src/types/v2/request.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/v2/request.types.js.map +1 -1
- package/dist/backend/backend/src/types/v2/work-item.types.d.ts +5 -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 +2 -0
- package/dist/backend/backend/src/types/v2/work-item.types.js.map +1 -1
- package/dist/backend/backend/src/utils/agent-caller.utils.d.ts +44 -37
- package/dist/backend/backend/src/utils/agent-caller.utils.d.ts.map +1 -1
- package/dist/backend/backend/src/utils/agent-caller.utils.js +48 -42
- package/dist/backend/backend/src/utils/agent-caller.utils.js.map +1 -1
- package/dist/backend/backend/src/utils/secret-env.d.ts.map +1 -1
- package/dist/backend/backend/src/utils/secret-env.js +8 -1
- package/dist/backend/backend/src/utils/secret-env.js.map +1 -1
- package/dist/backend/backend/src/utils/security.d.ts +2 -0
- package/dist/backend/backend/src/utils/security.d.ts.map +1 -1
- package/dist/backend/backend/src/utils/security.js +3 -1
- package/dist/backend/backend/src/utils/security.js.map +1 -1
- package/dist/backend/backend/src/websocket/chat.gateway.d.ts +9 -0
- package/dist/backend/backend/src/websocket/chat.gateway.d.ts.map +1 -1
- package/dist/backend/backend/src/websocket/chat.gateway.js +26 -0
- package/dist/backend/backend/src/websocket/chat.gateway.js.map +1 -1
- package/dist/backend/build-info.json +2 -2
- package/dist/backend/config/constants.d.ts +67 -0
- package/dist/backend/config/constants.d.ts.map +1 -1
- package/dist/backend/config/constants.js +67 -0
- package/dist/backend/config/constants.js.map +1 -1
- package/dist/cli/backend/src/constants.d.ts +356 -5
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +341 -8
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.js +17 -2
- package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/control-plane-guard.service.d.ts +7 -5
- package/dist/cli/backend/src/services/agent/control-plane-guard.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/control-plane-guard.service.js +19 -10
- package/dist/cli/backend/src/services/agent/control-plane-guard.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js +10 -1
- package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.d.ts +1 -1
- package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js +4 -0
- package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.d.ts +29 -0
- package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js +77 -1
- package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-session-recovery.d.ts +4 -2
- package/dist/cli/backend/src/services/agent/runtime-session-recovery.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-session-recovery.js +22 -6
- package/dist/cli/backend/src/services/agent/runtime-session-recovery.js.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/communication.module.js +2 -2
- package/dist/cli/backend/src/services/ai/prompt-modules/communication.module.js.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
- package/dist/cli/backend/src/services/backup/backup-archive.service.d.ts +6 -0
- package/dist/cli/backend/src/services/backup/backup-archive.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/backup/backup-archive.service.js +7 -1
- package/dist/cli/backend/src/services/backup/backup-archive.service.js.map +1 -1
- package/dist/cli/backend/src/services/chat/chat.service.d.ts +282 -0
- package/dist/cli/backend/src/services/chat/chat.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/chat/chat.service.js +783 -0
- package/dist/cli/backend/src/services/chat/chat.service.js.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +30 -5
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +34 -4
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts +4 -3
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js +7 -4
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/sqlite/channel.store.d.ts +18 -11
- package/dist/cli/backend/src/services/chat-v2/sqlite/channel.store.d.ts.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/sqlite/channel.store.js +19 -25
- package/dist/cli/backend/src/services/chat-v2/sqlite/channel.store.js.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts +7 -4
- package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js +8 -4
- package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/types.d.ts +0 -1
- package/dist/cli/backend/src/services/chat-v2/types.d.ts.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/types.js +0 -1
- package/dist/cli/backend/src/services/chat-v2/types.js.map +1 -1
- package/dist/cli/backend/src/services/core/api-token.service.d.ts +28 -0
- package/dist/cli/backend/src/services/core/api-token.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/core/api-token.service.js +46 -0
- package/dist/cli/backend/src/services/core/api-token.service.js.map +1 -1
- package/dist/cli/backend/src/services/core/owner-auth.service.d.ts +127 -0
- package/dist/cli/backend/src/services/core/owner-auth.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/core/owner-auth.service.js +205 -0
- package/dist/cli/backend/src/services/core/owner-auth.service.js.map +1 -0
- package/dist/cli/backend/src/services/decisions/decision-store.d.ts.map +1 -1
- package/dist/cli/backend/src/services/decisions/decision-store.js +5 -1
- package/dist/cli/backend/src/services/decisions/decision-store.js.map +1 -1
- package/dist/cli/backend/src/services/messaging/owner-message-watchdog.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/messaging/owner-message-watchdog.service.js +7 -0
- package/dist/cli/backend/src/services/messaging/owner-message-watchdog.service.js.map +1 -1
- package/dist/cli/backend/src/services/messaging/thread-status-queue.service.d.ts +0 -8
- package/dist/cli/backend/src/services/messaging/thread-status-queue.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/messaging/thread-status-queue.service.js +0 -18
- package/dist/cli/backend/src/services/messaging/thread-status-queue.service.js.map +1 -1
- package/dist/cli/backend/src/services/monitoring/activity-monitor.service.d.ts +19 -0
- package/dist/cli/backend/src/services/monitoring/activity-monitor.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/monitoring/activity-monitor.service.js +41 -5
- package/dist/cli/backend/src/services/monitoring/activity-monitor.service.js.map +1 -1
- package/dist/cli/backend/src/services/monitoring/agent-turn-state.d.ts +184 -0
- package/dist/cli/backend/src/services/monitoring/agent-turn-state.d.ts.map +1 -0
- package/dist/cli/backend/src/services/monitoring/agent-turn-state.js +391 -0
- package/dist/cli/backend/src/services/monitoring/agent-turn-state.js.map +1 -0
- package/dist/cli/backend/src/services/monitoring/claude-transcript-turn.d.ts +73 -0
- package/dist/cli/backend/src/services/monitoring/claude-transcript-turn.d.ts.map +1 -0
- package/dist/cli/backend/src/services/monitoring/claude-transcript-turn.js +258 -0
- package/dist/cli/backend/src/services/monitoring/claude-transcript-turn.js.map +1 -0
- package/dist/cli/backend/src/services/monitoring/token-usage.service.d.ts +7 -0
- package/dist/cli/backend/src/services/monitoring/token-usage.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/monitoring/token-usage.service.js +4 -0
- package/dist/cli/backend/src/services/monitoring/token-usage.service.js.map +1 -1
- package/dist/cli/backend/src/services/open-items/open-items.service.d.ts +57 -0
- package/dist/cli/backend/src/services/open-items/open-items.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/open-items/open-items.service.js +100 -4
- package/dist/cli/backend/src/services/open-items/open-items.service.js.map +1 -1
- package/dist/cli/backend/src/services/project-tickets/project-ticket.service.d.ts +36 -0
- package/dist/cli/backend/src/services/project-tickets/project-ticket.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/project-tickets/project-ticket.service.js +44 -3
- package/dist/cli/backend/src/services/project-tickets/project-ticket.service.js.map +1 -1
- package/dist/cli/backend/src/services/restart/in-flight-turn-tracker.service.d.ts +34 -3
- package/dist/cli/backend/src/services/restart/in-flight-turn-tracker.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/restart/in-flight-turn-tracker.service.js +57 -2
- package/dist/cli/backend/src/services/restart/in-flight-turn-tracker.service.js.map +1 -1
- package/dist/cli/backend/src/services/restart/restart-drain.service.d.ts +22 -0
- package/dist/cli/backend/src/services/restart/restart-drain.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/restart/restart-drain.service.js +37 -5
- package/dist/cli/backend/src/services/restart/restart-drain.service.js.map +1 -1
- package/dist/cli/backend/src/services/session/session-handoff.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/session/session-handoff.service.js +8 -5
- package/dist/cli/backend/src/services/session/session-handoff.service.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-auto-working.service.d.ts +29 -0
- package/dist/cli/backend/src/services/slack/slack-auto-working.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-auto-working.service.js +66 -3
- package/dist/cli/backend/src/services/slack/slack-auto-working.service.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts +2 -1
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js +3 -2
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +79 -15
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +200 -41
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack.service.d.ts +43 -1
- package/dist/cli/backend/src/services/slack/slack.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack.service.js +76 -7
- package/dist/cli/backend/src/services/slack/slack.service.js.map +1 -1
- package/dist/cli/backend/src/services/task-pool/pool-storage.d.ts.map +1 -1
- package/dist/cli/backend/src/services/task-pool/pool-storage.js +4 -0
- package/dist/cli/backend/src/services/task-pool/pool-storage.js.map +1 -1
- 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 +2 -0
- package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/cli/backend/src/services/trace/trace-context.service.d.ts +212 -0
- package/dist/cli/backend/src/services/trace/trace-context.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/trace/trace-context.service.js +489 -0
- package/dist/cli/backend/src/services/trace/trace-context.service.js.map +1 -0
- package/dist/cli/backend/src/services/trace/trace-markers.d.ts +93 -0
- package/dist/cli/backend/src/services/trace/trace-markers.d.ts.map +1 -0
- package/dist/cli/backend/src/services/trace/trace-markers.js +162 -0
- package/dist/cli/backend/src/services/trace/trace-markers.js.map +1 -0
- package/dist/cli/backend/src/services/trace/trace-recorder.d.ts +338 -0
- package/dist/cli/backend/src/services/trace/trace-recorder.d.ts.map +1 -0
- package/dist/cli/backend/src/services/trace/trace-recorder.js +789 -0
- package/dist/cli/backend/src/services/trace/trace-recorder.js.map +1 -0
- package/dist/cli/backend/src/services/trace/trace-store.d.ts +308 -0
- package/dist/cli/backend/src/services/trace/trace-store.d.ts.map +1 -0
- package/dist/cli/backend/src/services/trace/trace-store.js +714 -0
- package/dist/cli/backend/src/services/trace/trace-store.js.map +1 -0
- package/dist/cli/backend/src/services/trace/trace.types.d.ts +137 -0
- package/dist/cli/backend/src/services/trace/trace.types.d.ts.map +1 -0
- package/dist/cli/backend/src/services/trace/trace.types.js +104 -0
- package/dist/cli/backend/src/services/trace/trace.types.js.map +1 -0
- package/dist/cli/backend/src/services/v3/request.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/v3/request.service.js +4 -0
- package/dist/cli/backend/src/services/v3/request.service.js.map +1 -1
- package/dist/cli/backend/src/services/wiki/wiki-ingest.service.d.ts +3 -1
- package/dist/cli/backend/src/services/wiki/wiki-ingest.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/wiki/wiki-ingest.service.js.map +1 -1
- package/dist/cli/backend/src/types/decision.types.d.ts +3 -1
- package/dist/cli/backend/src/types/decision.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/ticket-autopilot.types.d.ts +9 -0
- package/dist/cli/backend/src/types/ticket-autopilot.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/ticket-autopilot.types.js +14 -0
- package/dist/cli/backend/src/types/ticket-autopilot.types.js.map +1 -1
- package/dist/cli/backend/src/types/v2/open-item.types.d.ts +4 -0
- package/dist/cli/backend/src/types/v2/open-item.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/v2/request.types.d.ts +4 -0
- package/dist/cli/backend/src/types/v2/request.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/v2/request.types.js.map +1 -1
- package/dist/cli/backend/src/types/v2/work-item.types.d.ts +5 -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 +2 -0
- package/dist/cli/backend/src/types/v2/work-item.types.js.map +1 -1
- package/dist/cli/backend/src/utils/secret-env.d.ts.map +1 -1
- package/dist/cli/backend/src/utils/secret-env.js +8 -1
- package/dist/cli/backend/src/utils/secret-env.js.map +1 -1
- package/dist/cli/backend/src/utils/security.d.ts +196 -0
- package/dist/cli/backend/src/utils/security.d.ts.map +1 -0
- package/dist/cli/backend/src/utils/security.js +538 -0
- package/dist/cli/backend/src/utils/security.js.map +1 -0
- package/dist/cli/backend/src/websocket/chat.gateway.d.ts +9 -0
- package/dist/cli/backend/src/websocket/chat.gateway.d.ts.map +1 -1
- package/dist/cli/backend/src/websocket/chat.gateway.js +26 -0
- package/dist/cli/backend/src/websocket/chat.gateway.js.map +1 -1
- package/dist/cli/cli/src/commands/service.d.ts +12 -0
- package/dist/cli/cli/src/commands/service.d.ts.map +1 -1
- package/dist/cli/cli/src/commands/service.js +36 -2
- package/dist/cli/cli/src/commands/service.js.map +1 -1
- package/dist/cli/cli/src/index.js +4 -0
- package/dist/cli/cli/src/index.js.map +1 -1
- package/dist/cli/cli/src/utils/owner-token-fetch.d.ts +41 -0
- package/dist/cli/cli/src/utils/owner-token-fetch.d.ts.map +1 -0
- package/dist/cli/cli/src/utils/owner-token-fetch.js +83 -0
- package/dist/cli/cli/src/utils/owner-token-fetch.js.map +1 -0
- package/dist/cli/cli/src/utils/safe-shutdown.d.ts +13 -3
- package/dist/cli/cli/src/utils/safe-shutdown.d.ts.map +1 -1
- package/dist/cli/cli/src/utils/safe-shutdown.js +26 -4
- package/dist/cli/cli/src/utils/safe-shutdown.js.map +1 -1
- package/dist/cli/config/constants.d.ts +67 -0
- package/dist/cli/config/constants.d.ts.map +1 -1
- package/dist/cli/config/constants.js +67 -0
- package/dist/cli/config/constants.js.map +1 -1
- package/frontend/dist/assets/index-bfa0e2e8.css +42 -0
- package/frontend/dist/assets/{index-800118ca.js → index-edfa8e04.js} +285 -285
- package/frontend/dist/index.html +2 -2
- package/package.json +1 -1
- package/packages/crewly-agent/src/runtime/api-client.test.ts +42 -0
- package/packages/crewly-agent/src/runtime/api-client.ts +6 -0
- package/dist/backend/backend/src/services/v3/request-notification.service.d.ts +0 -52
- package/dist/backend/backend/src/services/v3/request-notification.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/v3/request-notification.service.js +0 -161
- package/dist/backend/backend/src/services/v3/request-notification.service.js.map +0 -1
- package/frontend/dist/assets/index-5e967795.css +0 -42
|
@@ -0,0 +1,783 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chat Service — facade over ChatV2Service.
|
|
3
|
+
*
|
|
4
|
+
* Phase 6 of the unified-chat-message-store spec
|
|
5
|
+
* (`specs/2026-05-14-unified-chat-message-store.md`):
|
|
6
|
+
* the legacy JSON-file storage at `~/.crewly/chat/` is retired.
|
|
7
|
+
* All chat persistence and read paths now flow through the canonical
|
|
8
|
+
* `ChatV2Service` (SQLite at `~/.crewly/chat.db`). This file remains
|
|
9
|
+
* temporarily as a deprecation shim so the many legacy callers
|
|
10
|
+
* (`chat.controller.ts`, `chat.gateway.ts`, `slack-orchestrator-bridge.ts`,
|
|
11
|
+
* `notify-reconciliation.service.ts`, `message-replay.service.ts`,
|
|
12
|
+
* `index.ts`) continue to compile and run while they are migrated to
|
|
13
|
+
* call ChatV2Service directly. Each facade method translates between
|
|
14
|
+
* the legacy `ChatMessage` / `ChatConversation` DTOs and chat-v2's
|
|
15
|
+
* `ChatMessageDTO` / `ChatChannelDTO` so existing event subscribers
|
|
16
|
+
* (chat.gateway.ts) see the same shapes they always have.
|
|
17
|
+
*
|
|
18
|
+
* @module services/chat/chat.service
|
|
19
|
+
*/
|
|
20
|
+
import { EventEmitter } from 'events';
|
|
21
|
+
import { LoggerService } from '../core/logger.service.js';
|
|
22
|
+
/**
|
|
23
|
+
* Default page size for legacy `getMessages` calls without an explicit
|
|
24
|
+
* `filter.limit`. Matches the historical hardcoded value so the change
|
|
25
|
+
* to honor `filter.limit` is a strict superset of the prior behavior.
|
|
26
|
+
*/
|
|
27
|
+
const LEGACY_DEFAULT_PAGE_SIZE = 200;
|
|
28
|
+
/**
|
|
29
|
+
* Hard cap on `getMessages` limit, applied after the caller-supplied
|
|
30
|
+
* value. Keeps a buggy/malicious caller from asking chat-v2 to load
|
|
31
|
+
* the entire channel history into a single response. Requests above
|
|
32
|
+
* this are clamped (documented contract), never silently truncated
|
|
33
|
+
* below it: a limit larger than chat-v2's per-page cap
|
|
34
|
+
* (`MessageStore.MAX_LIMIT`, 100) is served by walking several
|
|
35
|
+
* chat-v2 pages.
|
|
36
|
+
*/
|
|
37
|
+
const LEGACY_MAX_PAGE_SIZE = 1000;
|
|
38
|
+
/**
|
|
39
|
+
* Upper bound on how many chat-v2 rows a single legacy read may scan.
|
|
40
|
+
*
|
|
41
|
+
* Legacy filters (`senderType`, `contentType`, timestamp `before`/`after`)
|
|
42
|
+
* have no chat-v2 equivalent, so they are applied while walking chat-v2
|
|
43
|
+
* pages until `limit` matches are found or the channel is exhausted. This
|
|
44
|
+
* bound stops a sparse filter on a huge channel from turning one HTTP
|
|
45
|
+
* request into an unbounded table scan; when it is hit the result (or
|
|
46
|
+
* count) is a best-effort subset and a warning is logged.
|
|
47
|
+
*/
|
|
48
|
+
const LEGACY_MAX_SCAN_ROWS = 20_000;
|
|
49
|
+
/**
|
|
50
|
+
* Pick the chat-v2 `metadata.source` for a legacy `addAgentMessage`
|
|
51
|
+
* /`addDirectMessage` call. Returns the caller-provided
|
|
52
|
+
* `metadata.source` when it is one of the closed chat-v2 source enum
|
|
53
|
+
* values, otherwise falls back to `defaultSource` (the historical
|
|
54
|
+
* hardcoded value for the call site).
|
|
55
|
+
*
|
|
56
|
+
* @param metadata - Legacy metadata blob (possibly undefined)
|
|
57
|
+
* @param defaultSource - Source to use when metadata has no valid source
|
|
58
|
+
* @returns A chat-v2 `RecordTurnSource` value
|
|
59
|
+
*/
|
|
60
|
+
function resolveLegacyRecordSource(metadata, defaultSource) {
|
|
61
|
+
const raw = metadata?.source;
|
|
62
|
+
if (raw === 'web' ||
|
|
63
|
+
raw === 'slack' ||
|
|
64
|
+
raw === 'pty-runtime' ||
|
|
65
|
+
raw === 'in-process-runtime' ||
|
|
66
|
+
raw === 'reply-tool' ||
|
|
67
|
+
raw === 'system') {
|
|
68
|
+
return raw;
|
|
69
|
+
}
|
|
70
|
+
return defaultSource;
|
|
71
|
+
}
|
|
72
|
+
import { getChatV2Service } from '../chat-v2/chat-v2.singleton.js';
|
|
73
|
+
import { ChatError, CHAT_ERROR_CODES } from '../chat-v2/types.js';
|
|
74
|
+
import { MessageStore, encodeCursor } from '../chat-v2/sqlite/message.store.js';
|
|
75
|
+
import { SYSTEM_PRINCIPAL, senderToV2, v2MessageToLegacy, v2ChannelToLegacy, inferSourceFromLegacyMetadata, synthesizeSlackConversationId, } from '../chat-v2/legacy-dto.utils.js';
|
|
76
|
+
/**
|
|
77
|
+
* Whether an error is chat-v2's "channel not found" (404) error.
|
|
78
|
+
*
|
|
79
|
+
* The legacy façade contract maps a missing conversation to either a
|
|
80
|
+
* `ConversationNotFoundError` (mutations) or an empty result (reads);
|
|
81
|
+
* this predicate lets each method translate chat-v2's typed error.
|
|
82
|
+
*
|
|
83
|
+
* @param err - Any thrown value
|
|
84
|
+
* @returns True when `err` is a `ChatError` with code `channel_not_found`
|
|
85
|
+
*/
|
|
86
|
+
function isChannelNotFound(err) {
|
|
87
|
+
return err instanceof ChatError && err.code === CHAT_ERROR_CODES.CHANNEL_NOT_FOUND;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Whether a message lies strictly before (is older than) an anchor.
|
|
91
|
+
*
|
|
92
|
+
* @param dto - chat-v2 DTO (supplies `seq`)
|
|
93
|
+
* @param legacy - The same message in legacy shape (supplies `timestamp`)
|
|
94
|
+
* @param anchor - Resolved boundary
|
|
95
|
+
* @returns True when the message is older than the anchor
|
|
96
|
+
*/
|
|
97
|
+
function isOlderThanAnchor(dto, legacy, anchor) {
|
|
98
|
+
return anchor.kind === 'seq' ? dto.seq < anchor.seq : legacy.timestamp < anchor.value;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Whether a message lies strictly after (is newer than) an anchor.
|
|
102
|
+
*
|
|
103
|
+
* @param dto - chat-v2 DTO (supplies `seq`)
|
|
104
|
+
* @param legacy - The same message in legacy shape (supplies `timestamp`)
|
|
105
|
+
* @param anchor - Resolved boundary
|
|
106
|
+
* @returns True when the message is newer than the anchor
|
|
107
|
+
*/
|
|
108
|
+
function isNewerThanAnchor(dto, legacy, anchor) {
|
|
109
|
+
return anchor.kind === 'seq' ? dto.seq > anchor.seq : legacy.timestamp > anchor.value;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Apply the legacy per-message content filters (`senderType`,
|
|
113
|
+
* `contentType`) that the original JSON-backed ChatService honored.
|
|
114
|
+
* The `before` / `after` window is enforced by the paging walk itself.
|
|
115
|
+
*
|
|
116
|
+
* @param message - Legacy message to test
|
|
117
|
+
* @param filter - Legacy message filter
|
|
118
|
+
* @returns True when the message matches every supplied content filter
|
|
119
|
+
*/
|
|
120
|
+
function matchesLegacyContentFilters(message, filter) {
|
|
121
|
+
return ((!filter.senderType || message.from.type === filter.senderType) &&
|
|
122
|
+
(!filter.contentType || message.contentType === filter.contentType));
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Resolve a legacy `filter.limit` to the effective page size: positive
|
|
126
|
+
* finite values are honored (floored), anything else falls back to
|
|
127
|
+
* {@link LEGACY_DEFAULT_PAGE_SIZE}, and the result is clamped to
|
|
128
|
+
* {@link LEGACY_MAX_PAGE_SIZE}.
|
|
129
|
+
*
|
|
130
|
+
* @param raw - Caller-supplied limit (possibly undefined / NaN / <= 0)
|
|
131
|
+
* @returns The limit to serve
|
|
132
|
+
*/
|
|
133
|
+
function resolveLegacyLimit(raw) {
|
|
134
|
+
const requested = typeof raw === 'number' && Number.isFinite(raw) && raw > 0
|
|
135
|
+
? Math.floor(raw)
|
|
136
|
+
: LEGACY_DEFAULT_PAGE_SIZE;
|
|
137
|
+
return Math.min(requested, LEGACY_MAX_PAGE_SIZE);
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Resolve a legacy `filter.offset` to a non-negative integer, or null
|
|
141
|
+
* when the caller did not request offset pagination.
|
|
142
|
+
*
|
|
143
|
+
* @param raw - Caller-supplied offset
|
|
144
|
+
* @returns The offset, or null for the default newest-tail read
|
|
145
|
+
*/
|
|
146
|
+
function resolveLegacyOffset(raw) {
|
|
147
|
+
if (typeof raw !== 'number' || !Number.isFinite(raw))
|
|
148
|
+
return null;
|
|
149
|
+
return Math.max(0, Math.floor(raw));
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Whether a legacy message filter narrows beyond the conversation id.
|
|
153
|
+
*
|
|
154
|
+
* @param filter - Legacy message filter
|
|
155
|
+
* @returns True when any of senderType/contentType/after/before is set
|
|
156
|
+
*/
|
|
157
|
+
function hasLegacyMessageFilters(filter) {
|
|
158
|
+
return Boolean(filter.senderType || filter.contentType || filter.after || filter.before);
|
|
159
|
+
}
|
|
160
|
+
// =============================================================================
|
|
161
|
+
// Error classes — preserved for callers that catch them by name
|
|
162
|
+
// =============================================================================
|
|
163
|
+
export class ConversationNotFoundError extends Error {
|
|
164
|
+
conversationId;
|
|
165
|
+
constructor(conversationId) {
|
|
166
|
+
super(`Conversation not found: ${conversationId}`);
|
|
167
|
+
this.conversationId = conversationId;
|
|
168
|
+
this.name = 'ConversationNotFoundError';
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
export class MessageValidationError extends Error {
|
|
172
|
+
constructor(message) {
|
|
173
|
+
super(message);
|
|
174
|
+
this.name = 'MessageValidationError';
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
// =============================================================================
|
|
178
|
+
// ChatService facade
|
|
179
|
+
// =============================================================================
|
|
180
|
+
/**
|
|
181
|
+
* Deprecated façade over ChatV2Service.
|
|
182
|
+
*
|
|
183
|
+
* Preserves the public surface of the original `ChatService` so the
|
|
184
|
+
* remaining legacy callers compile unchanged. Internally every method
|
|
185
|
+
* delegates to `ChatV2Service`. The original ~/.crewly/chat/*.json
|
|
186
|
+
* storage layer has been removed.
|
|
187
|
+
*
|
|
188
|
+
* New code MUST NOT depend on this class; call `getChatV2Service()`
|
|
189
|
+
* directly. Phase 6c of the spec deletes this file once all callers
|
|
190
|
+
* are migrated.
|
|
191
|
+
*/
|
|
192
|
+
export class ChatService extends EventEmitter {
|
|
193
|
+
logger;
|
|
194
|
+
chatV2;
|
|
195
|
+
constructor(_options) {
|
|
196
|
+
super();
|
|
197
|
+
this.logger = LoggerService.getInstance().createComponentLogger('ChatService');
|
|
198
|
+
this.chatV2 = getChatV2Service();
|
|
199
|
+
}
|
|
200
|
+
// ---------------------------------------------------------------------------
|
|
201
|
+
// Lifecycle (no-ops — chat-v2 manages its own DB lifecycle)
|
|
202
|
+
// ---------------------------------------------------------------------------
|
|
203
|
+
async initialize() {
|
|
204
|
+
// chat-v2 lazy-initializes on first access; nothing to do.
|
|
205
|
+
}
|
|
206
|
+
isInitialized() {
|
|
207
|
+
return true;
|
|
208
|
+
}
|
|
209
|
+
// ---------------------------------------------------------------------------
|
|
210
|
+
// Writes
|
|
211
|
+
// ---------------------------------------------------------------------------
|
|
212
|
+
/**
|
|
213
|
+
* Send a user message. Idempotency via legacy callers' own
|
|
214
|
+
* metadata.clientMessageId when present.
|
|
215
|
+
*/
|
|
216
|
+
async sendMessage(input) {
|
|
217
|
+
const conversationId = input.conversationId ?? this.synthesizeConversationId(input);
|
|
218
|
+
const channel = this.chatV2.ensureChannelForLegacyConversation({
|
|
219
|
+
conversationId,
|
|
220
|
+
agentSession: 'crewly-orc',
|
|
221
|
+
});
|
|
222
|
+
const senderId = (typeof input.metadata?.userId === 'string' && input.metadata.userId) || 'user';
|
|
223
|
+
const { message } = this.chatV2.recordTurn({
|
|
224
|
+
channelId: channel.id,
|
|
225
|
+
senderType: 'user',
|
|
226
|
+
senderId,
|
|
227
|
+
content: input.content,
|
|
228
|
+
clientMessageId: typeof input.metadata?.clientMessageId === 'string'
|
|
229
|
+
? input.metadata.clientMessageId
|
|
230
|
+
: undefined,
|
|
231
|
+
// Source resolution here is intentionally STRICTER than
|
|
232
|
+
// `recordViaFacade` (which uses `resolveLegacyRecordSource`).
|
|
233
|
+
// `sendMessage` always writes `senderType: 'user'`, so the only
|
|
234
|
+
// legitimate sources are 'web' or 'slack'. Caller-supplied values
|
|
235
|
+
// like 'reply-tool' or 'pty-runtime' are agent-reply tags and
|
|
236
|
+
// would be nonsensical on a user-authored row — `inferSource…`
|
|
237
|
+
// downgrades them to 'system' on purpose. Phase 6α follow-up #5.
|
|
238
|
+
metadata: {
|
|
239
|
+
...(input.metadata ?? {}),
|
|
240
|
+
source: inferSourceFromLegacyMetadata(input.metadata),
|
|
241
|
+
},
|
|
242
|
+
});
|
|
243
|
+
const conversation = v2ChannelToLegacy(channel, this.chatV2.countChannelMessages(channel.id, SYSTEM_PRINCIPAL));
|
|
244
|
+
const legacyMessage = v2MessageToLegacy(message);
|
|
245
|
+
// Phase 6α follow-up #6: chat-v2 already emits 'chat_message' for
|
|
246
|
+
// every fresh recordTurn write (chat-v2.service.ts:936/1063). The
|
|
247
|
+
// chat.gateway WebSocket subscriber listens on the chat-v2
|
|
248
|
+
// EventEmitter directly, so a second emit here would double-broadcast
|
|
249
|
+
// to every connected client. The 'conversation_updated' event has no
|
|
250
|
+
// chat-v2 equivalent yet, so we keep emitting that one until chat-v2
|
|
251
|
+
// grows a channel-touched event.
|
|
252
|
+
this.emitConversationUpdated(conversation);
|
|
253
|
+
return { conversation, message: legacyMessage };
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Add an agent reply extracted from raw terminal output. The legacy
|
|
257
|
+
* regex extraction (`[RESPONSE]` / `[CHAT_RESPONSE]` markers) is gone
|
|
258
|
+
* — callers should pass already-clean content. Kept for source
|
|
259
|
+
* compatibility with `chat.gateway.processTerminalOutput`, which has
|
|
260
|
+
* no production callers post Phase 4 discovery.
|
|
261
|
+
*/
|
|
262
|
+
async addAgentMessage(conversationId, rawOutput, sender, metadata) {
|
|
263
|
+
// Phase 6α follow-up #5: source defaults to 'pty-runtime' (the
|
|
264
|
+
// historical caller) but the caller can override via
|
|
265
|
+
// `metadata.source` — e.g. an in-process runtime route should tag
|
|
266
|
+
// its replies 'in-process-runtime', not 'pty-runtime'. Falling back
|
|
267
|
+
// through inferSourceFromLegacyMetadata preserves the previous
|
|
268
|
+
// default for callers that don't tag.
|
|
269
|
+
const source = resolveLegacyRecordSource(metadata, 'pty-runtime');
|
|
270
|
+
return this.recordViaFacade(conversationId, rawOutput, sender, metadata, source);
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Persist a pre-extracted markdown reply. Primary call site is the
|
|
274
|
+
* PTY `[NOTIFY]` path in `chat.gateway.processNotifyMessage`.
|
|
275
|
+
*/
|
|
276
|
+
async addDirectMessage(conversationId, content, sender, metadata) {
|
|
277
|
+
// Phase 6α follow-up #5: see addAgentMessage. Same default + override.
|
|
278
|
+
const source = resolveLegacyRecordSource(metadata, 'pty-runtime');
|
|
279
|
+
return this.recordViaFacade(conversationId, content, sender, metadata, source);
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Add a server-side system note (progress markers, errors, etc.).
|
|
283
|
+
*/
|
|
284
|
+
async addSystemMessage(conversationId, content, metadata) {
|
|
285
|
+
return this.recordViaFacade(conversationId, content, { type: 'system', id: 'system', name: 'System' }, metadata, 'system');
|
|
286
|
+
}
|
|
287
|
+
async recordViaFacade(conversationId, content, sender, metadata, source) {
|
|
288
|
+
const channel = this.chatV2.ensureChannelForLegacyConversation({
|
|
289
|
+
conversationId,
|
|
290
|
+
agentSession: 'crewly-orc',
|
|
291
|
+
});
|
|
292
|
+
const { type: senderType, id: senderId } = senderToV2(sender);
|
|
293
|
+
const { message } = this.chatV2.recordTurn({
|
|
294
|
+
channelId: channel.id,
|
|
295
|
+
senderType,
|
|
296
|
+
senderId,
|
|
297
|
+
content,
|
|
298
|
+
clientMessageId: typeof metadata?.clientMessageId === 'string' ? metadata.clientMessageId : undefined,
|
|
299
|
+
// `source` AFTER the spread: the resolved source from
|
|
300
|
+
// resolveLegacyRecordSource already incorporated metadata.source
|
|
301
|
+
// (if valid) or fell back to the default. Putting it last
|
|
302
|
+
// guarantees a value from the closed enum lands in the row
|
|
303
|
+
// regardless of what the legacy caller passed.
|
|
304
|
+
metadata: { ...(metadata ?? {}), source },
|
|
305
|
+
});
|
|
306
|
+
const legacyMessage = v2MessageToLegacy(message);
|
|
307
|
+
// Phase 6α follow-up #6: chat-v2 already emits 'chat_message';
|
|
308
|
+
// chat.gateway subscribes to chat-v2 directly. No re-emit here to
|
|
309
|
+
// avoid double-broadcasting to WebSocket clients.
|
|
310
|
+
return legacyMessage;
|
|
311
|
+
}
|
|
312
|
+
// ---------------------------------------------------------------------------
|
|
313
|
+
// Reads
|
|
314
|
+
// ---------------------------------------------------------------------------
|
|
315
|
+
/**
|
|
316
|
+
* Read messages from a conversation with the legacy filter contract.
|
|
317
|
+
*
|
|
318
|
+
* Semantics (matching the original JSON-backed service, issue #1000):
|
|
319
|
+
* - Default (no `offset`): the NEWEST `limit` messages that match every
|
|
320
|
+
* filter, returned oldest → newest. `before` / `after` bound the window
|
|
321
|
+
* exclusively, so `before=<oldest loaded id|timestamp>` yields the
|
|
322
|
+
* `limit` messages immediately preceding that point ("load older"),
|
|
323
|
+
* and `after=<ts>` yields the newest `limit` messages after it (the
|
|
324
|
+
* original service also returned the newest tail when `after` was set,
|
|
325
|
+
* which is what `ChatHighlightsService` relies on).
|
|
326
|
+
* - With `offset`: legacy offset pagination over the matching window,
|
|
327
|
+
* counted from the OLDEST message — skip `offset`, return `limit`.
|
|
328
|
+
*
|
|
329
|
+
* `before` / `after` accept a message id from this conversation (exact
|
|
330
|
+
* seq boundary) or an ISO timestamp (string comparison, legacy).
|
|
331
|
+
*
|
|
332
|
+
* Implementation: walks chat-v2 `listMessages` pages through its cursors
|
|
333
|
+
* (`backward` from the newest message or the `before` id; `forward` for
|
|
334
|
+
* offset reads) and applies the content filters while walking, fetching
|
|
335
|
+
* more pages until `limit` matches are found, the window boundary is
|
|
336
|
+
* crossed, or the channel is exhausted. So a sparse filter does not
|
|
337
|
+
* return fewer than `limit` messages while older matches exist — up to
|
|
338
|
+
* the {@link LEGACY_MAX_SCAN_ROWS} scan bound. Stopping the walk at the
|
|
339
|
+
* opposite boundary assumes chat-v2 `seq` order agrees with `createdAt`
|
|
340
|
+
* order (both are assigned at insert time from the same clock).
|
|
341
|
+
*
|
|
342
|
+
* @param filter - Legacy message filter (`conversationId` required)
|
|
343
|
+
* @returns Matching messages in chronological order; [] for an unknown
|
|
344
|
+
* conversation or when `conversationId` is missing
|
|
345
|
+
* @throws Any chat-v2 error other than "channel not found"
|
|
346
|
+
*
|
|
347
|
+
* @example
|
|
348
|
+
* ```typescript
|
|
349
|
+
* const newest = await chatService.getMessages({ conversationId, limit: 50 });
|
|
350
|
+
* const older = await chatService.getMessages({ conversationId, limit: 50, before: newest[0].id });
|
|
351
|
+
* ```
|
|
352
|
+
*/
|
|
353
|
+
async getMessages(filter) {
|
|
354
|
+
if (!filter.conversationId) {
|
|
355
|
+
// Legacy callers occasionally call with no conversationId to get
|
|
356
|
+
// everything. chat-v2 has no global query — return [] and let
|
|
357
|
+
// the migration of those call sites surface explicit filters.
|
|
358
|
+
return [];
|
|
359
|
+
}
|
|
360
|
+
const conversationId = filter.conversationId;
|
|
361
|
+
const limit = resolveLegacyLimit(filter.limit);
|
|
362
|
+
const offset = resolveLegacyOffset(filter.offset);
|
|
363
|
+
try {
|
|
364
|
+
const window = this.resolveLegacyWindow(conversationId, filter);
|
|
365
|
+
return offset === null
|
|
366
|
+
? this.selectNewestInWindow(conversationId, filter, window, limit)
|
|
367
|
+
: this.selectFromOffsetInWindow(conversationId, filter, window, offset, limit);
|
|
368
|
+
}
|
|
369
|
+
catch (err) {
|
|
370
|
+
// Legacy contract: an unknown conversation reads as empty.
|
|
371
|
+
if (isChannelNotFound(err))
|
|
372
|
+
return [];
|
|
373
|
+
throw err;
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Count messages in a conversation, honoring the same filters as
|
|
378
|
+
* {@link getMessages} (`limit` / `offset` are ignored). Returns 0 for an
|
|
379
|
+
* unknown conversation (legacy contract) instead of surfacing chat-v2's
|
|
380
|
+
* 404. Unfiltered counts use chat-v2's count query; filtered counts walk
|
|
381
|
+
* the same pages as `getMessages`, bounded by {@link LEGACY_MAX_SCAN_ROWS}.
|
|
382
|
+
*
|
|
383
|
+
* @param filter - Legacy message filter (`conversationId` required for a non-zero count)
|
|
384
|
+
* @returns Number of matching messages
|
|
385
|
+
* @throws Any chat-v2 error other than "channel not found"
|
|
386
|
+
*/
|
|
387
|
+
async getMessageCount(filter) {
|
|
388
|
+
if (!filter.conversationId)
|
|
389
|
+
return 0;
|
|
390
|
+
const conversationId = filter.conversationId;
|
|
391
|
+
try {
|
|
392
|
+
if (!hasLegacyMessageFilters(filter)) {
|
|
393
|
+
return this.chatV2.countChannelMessages(conversationId, SYSTEM_PRINCIPAL);
|
|
394
|
+
}
|
|
395
|
+
const window = this.resolveLegacyWindow(conversationId, filter);
|
|
396
|
+
return this.selectNewestInWindow(conversationId, filter, window, Number.POSITIVE_INFINITY)
|
|
397
|
+
.length;
|
|
398
|
+
}
|
|
399
|
+
catch (err) {
|
|
400
|
+
if (isChannelNotFound(err))
|
|
401
|
+
return 0;
|
|
402
|
+
throw err;
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* Resolve a legacy `before` / `after` value to a boundary. A value that
|
|
407
|
+
* is the id of a message in this conversation becomes an exact `seq`
|
|
408
|
+
* boundary; anything else is treated as a timestamp.
|
|
409
|
+
*
|
|
410
|
+
* @param conversationId - Conversation being read
|
|
411
|
+
* @param value - Raw `before` / `after` value
|
|
412
|
+
* @returns The anchor, or null when no value was supplied
|
|
413
|
+
*/
|
|
414
|
+
resolveLegacyAnchor(conversationId, value) {
|
|
415
|
+
if (!value)
|
|
416
|
+
return null;
|
|
417
|
+
const dto = this.chatV2.getMessageForBridge(value);
|
|
418
|
+
if (dto && dto.channelId === conversationId)
|
|
419
|
+
return { kind: 'seq', seq: dto.seq };
|
|
420
|
+
return { kind: 'timestamp', value };
|
|
421
|
+
}
|
|
422
|
+
/**
|
|
423
|
+
* Resolve both window boundaries of a legacy filter.
|
|
424
|
+
*
|
|
425
|
+
* @param conversationId - Conversation being read
|
|
426
|
+
* @param filter - Legacy message filter
|
|
427
|
+
* @returns The resolved window
|
|
428
|
+
*/
|
|
429
|
+
resolveLegacyWindow(conversationId, filter) {
|
|
430
|
+
return {
|
|
431
|
+
before: this.resolveLegacyAnchor(conversationId, filter.before),
|
|
432
|
+
after: this.resolveLegacyAnchor(conversationId, filter.after),
|
|
433
|
+
};
|
|
434
|
+
}
|
|
435
|
+
/**
|
|
436
|
+
* Walk a channel's messages through chat-v2 cursor pagination, one full
|
|
437
|
+
* chat-v2 page (`MessageStore.MAX_LIMIT`) at a time. Pages are fetched
|
|
438
|
+
* lazily, so a consumer that stops early never loads further pages.
|
|
439
|
+
*
|
|
440
|
+
* @param conversationId - Channel to walk
|
|
441
|
+
* @param direction - `backward` = newest → oldest, `forward` = oldest → newest
|
|
442
|
+
* @param startSeq - Exclusive starting seq, or null to start at the channel
|
|
443
|
+
* end (newest for backward, first message for forward)
|
|
444
|
+
* @returns A generator of chat-v2 DTOs in walk order, at most
|
|
445
|
+
* {@link LEGACY_MAX_SCAN_ROWS} of them
|
|
446
|
+
* @throws {ChatError} `channel_not_found` when the conversation does not exist
|
|
447
|
+
*/
|
|
448
|
+
*walkChannel(conversationId, direction, startSeq) {
|
|
449
|
+
let cursor = startSeq === null ? null : encodeCursor({ seq: startSeq, channelId: conversationId });
|
|
450
|
+
let scanned = 0;
|
|
451
|
+
do {
|
|
452
|
+
const page = this.chatV2.listMessages({
|
|
453
|
+
channelId: conversationId,
|
|
454
|
+
principal: SYSTEM_PRINCIPAL,
|
|
455
|
+
cursor,
|
|
456
|
+
limit: MessageStore.MAX_LIMIT,
|
|
457
|
+
direction,
|
|
458
|
+
});
|
|
459
|
+
for (const dto of page.messages) {
|
|
460
|
+
if (scanned >= LEGACY_MAX_SCAN_ROWS) {
|
|
461
|
+
this.logger.warn('Legacy chat read hit the scan bound; result is partial', {
|
|
462
|
+
conversationId,
|
|
463
|
+
direction,
|
|
464
|
+
maxScanRows: LEGACY_MAX_SCAN_ROWS,
|
|
465
|
+
});
|
|
466
|
+
return;
|
|
467
|
+
}
|
|
468
|
+
scanned++;
|
|
469
|
+
yield dto;
|
|
470
|
+
}
|
|
471
|
+
cursor = page.nextCursor;
|
|
472
|
+
} while (cursor);
|
|
473
|
+
}
|
|
474
|
+
/**
|
|
475
|
+
* Select the newest `limit` messages inside the window that match the
|
|
476
|
+
* content filters, walking backward from the `before` id (or the newest
|
|
477
|
+
* message) and stopping at the `after` boundary.
|
|
478
|
+
*
|
|
479
|
+
* @param conversationId - Conversation being read
|
|
480
|
+
* @param filter - Legacy message filter (content filters)
|
|
481
|
+
* @param window - Resolved before/after window
|
|
482
|
+
* @param limit - Max messages to return (`Infinity` to collect all, for counts)
|
|
483
|
+
* @returns Matching messages, oldest → newest
|
|
484
|
+
*/
|
|
485
|
+
selectNewestInWindow(conversationId, filter, window, limit) {
|
|
486
|
+
const newestFirst = [];
|
|
487
|
+
const startSeq = window.before?.kind === 'seq' ? window.before.seq : null;
|
|
488
|
+
for (const dto of this.walkChannel(conversationId, 'backward', startSeq)) {
|
|
489
|
+
const message = v2MessageToLegacy(dto);
|
|
490
|
+
// Crossed the lower bound: every older message is outside the window.
|
|
491
|
+
if (window.after && !isNewerThanAnchor(dto, message, window.after))
|
|
492
|
+
break;
|
|
493
|
+
// Timestamp `before`: skip newer messages until the walk reaches it.
|
|
494
|
+
if (window.before && !isOlderThanAnchor(dto, message, window.before))
|
|
495
|
+
continue;
|
|
496
|
+
if (!matchesLegacyContentFilters(message, filter))
|
|
497
|
+
continue;
|
|
498
|
+
newestFirst.push(message);
|
|
499
|
+
if (newestFirst.length >= limit)
|
|
500
|
+
break;
|
|
501
|
+
}
|
|
502
|
+
return newestFirst.reverse();
|
|
503
|
+
}
|
|
504
|
+
/**
|
|
505
|
+
* Legacy offset pagination: skip the first `offset` matching messages of
|
|
506
|
+
* the window (counted from the oldest) and return the next `limit`.
|
|
507
|
+
*
|
|
508
|
+
* @param conversationId - Conversation being read
|
|
509
|
+
* @param filter - Legacy message filter (content filters)
|
|
510
|
+
* @param window - Resolved before/after window
|
|
511
|
+
* @param offset - Matching messages to skip, counted from the oldest
|
|
512
|
+
* @param limit - Max messages to return
|
|
513
|
+
* @returns Matching messages, oldest → newest
|
|
514
|
+
*/
|
|
515
|
+
selectFromOffsetInWindow(conversationId, filter, window, offset, limit) {
|
|
516
|
+
const result = [];
|
|
517
|
+
let skipped = 0;
|
|
518
|
+
const startSeq = window.after?.kind === 'seq' ? window.after.seq : null;
|
|
519
|
+
for (const dto of this.walkChannel(conversationId, 'forward', startSeq)) {
|
|
520
|
+
const message = v2MessageToLegacy(dto);
|
|
521
|
+
// Crossed the upper bound: every newer message is outside the window.
|
|
522
|
+
if (window.before && !isOlderThanAnchor(dto, message, window.before))
|
|
523
|
+
break;
|
|
524
|
+
// Timestamp `after`: skip older messages until the walk reaches it.
|
|
525
|
+
if (window.after && !isNewerThanAnchor(dto, message, window.after))
|
|
526
|
+
continue;
|
|
527
|
+
if (!matchesLegacyContentFilters(message, filter))
|
|
528
|
+
continue;
|
|
529
|
+
if (skipped < offset) {
|
|
530
|
+
skipped++;
|
|
531
|
+
continue;
|
|
532
|
+
}
|
|
533
|
+
result.push(message);
|
|
534
|
+
if (result.length >= limit)
|
|
535
|
+
break;
|
|
536
|
+
}
|
|
537
|
+
return result;
|
|
538
|
+
}
|
|
539
|
+
/**
|
|
540
|
+
* Look up a single message by id within a conversation.
|
|
541
|
+
*
|
|
542
|
+
* @param conversationId - Conversation the message must belong to
|
|
543
|
+
* @param messageId - The message id
|
|
544
|
+
* @returns The legacy message, or null when absent or in another conversation
|
|
545
|
+
*/
|
|
546
|
+
async getMessage(conversationId, messageId) {
|
|
547
|
+
const dto = this.chatV2.getMessageForBridge(messageId);
|
|
548
|
+
if (!dto || dto.channelId !== conversationId)
|
|
549
|
+
return null;
|
|
550
|
+
return v2MessageToLegacy(dto);
|
|
551
|
+
}
|
|
552
|
+
async updateMessageMetadata(_conversationId, messageId, metadataPatch) {
|
|
553
|
+
const dto = this.chatV2.updateMessageMetadata(messageId, metadataPatch);
|
|
554
|
+
return dto ? v2MessageToLegacy(dto) : null;
|
|
555
|
+
}
|
|
556
|
+
async getMessagesWithPendingSlackDelivery(maxAgeMs) {
|
|
557
|
+
return this.chatV2.findMessagesWithPendingSlackDelivery(maxAgeMs).map(v2MessageToLegacy);
|
|
558
|
+
}
|
|
559
|
+
/**
|
|
560
|
+
* List conversations in the legacy shape, honoring the legacy filters:
|
|
561
|
+
* `includeArchived` (archived rows are hidden by default), `channelType`,
|
|
562
|
+
* a case-insensitive title `search`, and `offset` / `limit` pagination.
|
|
563
|
+
*
|
|
564
|
+
* @param filter - Optional legacy conversation filter
|
|
565
|
+
* @returns Matching conversations
|
|
566
|
+
*/
|
|
567
|
+
async getConversations(filter) {
|
|
568
|
+
const channels = this.chatV2.listChannels({
|
|
569
|
+
principal: SYSTEM_PRINCIPAL,
|
|
570
|
+
includeArchived: filter?.includeArchived === true,
|
|
571
|
+
});
|
|
572
|
+
let conversations = channels.map((c) => v2ChannelToLegacy(c, this.chatV2.countChannelMessages(c.id, SYSTEM_PRINCIPAL)));
|
|
573
|
+
if (filter?.channelType) {
|
|
574
|
+
conversations = conversations.filter((c) => c.channelType === filter.channelType);
|
|
575
|
+
}
|
|
576
|
+
if (filter?.search) {
|
|
577
|
+
const needle = filter.search.toLowerCase();
|
|
578
|
+
conversations = conversations.filter((c) => c.title?.toLowerCase().includes(needle));
|
|
579
|
+
}
|
|
580
|
+
if (filter?.offset !== undefined || filter?.limit !== undefined) {
|
|
581
|
+
const offset = filter.offset ?? 0;
|
|
582
|
+
conversations = conversations.slice(offset, filter.limit !== undefined ? offset + filter.limit : undefined);
|
|
583
|
+
}
|
|
584
|
+
return conversations;
|
|
585
|
+
}
|
|
586
|
+
async getConversation(id) {
|
|
587
|
+
try {
|
|
588
|
+
const channel = this.chatV2.getChannel(id, SYSTEM_PRINCIPAL);
|
|
589
|
+
return v2ChannelToLegacy(channel, this.chatV2.countChannelMessages(id, SYSTEM_PRINCIPAL));
|
|
590
|
+
}
|
|
591
|
+
catch {
|
|
592
|
+
return null;
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
async createNewConversation(title, idOverride, _channelType) {
|
|
596
|
+
const conversationId = idOverride ?? `web-conv-${Date.now()}`;
|
|
597
|
+
const channel = this.chatV2.ensureChannelForLegacyConversation({
|
|
598
|
+
conversationId,
|
|
599
|
+
agentSession: 'crewly-orc',
|
|
600
|
+
name: title ?? conversationId,
|
|
601
|
+
});
|
|
602
|
+
const conversation = v2ChannelToLegacy(channel, 0);
|
|
603
|
+
this.emitConversationUpdated(conversation);
|
|
604
|
+
return conversation;
|
|
605
|
+
}
|
|
606
|
+
/**
|
|
607
|
+
* Rename a conversation.
|
|
608
|
+
*
|
|
609
|
+
* @param id - Conversation id
|
|
610
|
+
* @param title - New title
|
|
611
|
+
* @returns The updated conversation
|
|
612
|
+
* @throws {ConversationNotFoundError} when the conversation does not exist
|
|
613
|
+
*/
|
|
614
|
+
async updateConversationTitle(id, title) {
|
|
615
|
+
const conversation = this.withConversation(id, () => {
|
|
616
|
+
const channel = this.chatV2.renameChannel(id, title, SYSTEM_PRINCIPAL);
|
|
617
|
+
return v2ChannelToLegacy(channel, this.chatV2.countChannelMessages(id, SYSTEM_PRINCIPAL));
|
|
618
|
+
});
|
|
619
|
+
this.emitConversationUpdated(conversation);
|
|
620
|
+
return conversation;
|
|
621
|
+
}
|
|
622
|
+
/**
|
|
623
|
+
* Archive a conversation.
|
|
624
|
+
*
|
|
625
|
+
* @param id - Conversation id
|
|
626
|
+
* @throws {ConversationNotFoundError} when the conversation does not exist
|
|
627
|
+
*/
|
|
628
|
+
async archiveConversation(id) {
|
|
629
|
+
this.withConversation(id, () => this.chatV2.archiveChannel(id, SYSTEM_PRINCIPAL));
|
|
630
|
+
await this.emitConversationUpdatedById(id);
|
|
631
|
+
}
|
|
632
|
+
/**
|
|
633
|
+
* Unarchive a conversation.
|
|
634
|
+
*
|
|
635
|
+
* @param id - Conversation id
|
|
636
|
+
* @throws {ConversationNotFoundError} when the conversation does not exist
|
|
637
|
+
*/
|
|
638
|
+
async unarchiveConversation(id) {
|
|
639
|
+
this.withConversation(id, () => this.chatV2.unarchiveChannel(id, SYSTEM_PRINCIPAL));
|
|
640
|
+
await this.emitConversationUpdatedById(id);
|
|
641
|
+
}
|
|
642
|
+
/**
|
|
643
|
+
* Delete a conversation and its messages. Idempotent: deleting an
|
|
644
|
+
* unknown conversation is a no-op (legacy contract).
|
|
645
|
+
*
|
|
646
|
+
* @param id - Conversation id
|
|
647
|
+
*/
|
|
648
|
+
async deleteConversation(id) {
|
|
649
|
+
try {
|
|
650
|
+
this.chatV2.deleteChannel(id, SYSTEM_PRINCIPAL);
|
|
651
|
+
}
|
|
652
|
+
catch (err) {
|
|
653
|
+
if (!isChannelNotFound(err))
|
|
654
|
+
throw err;
|
|
655
|
+
}
|
|
656
|
+
}
|
|
657
|
+
async clearConversation(id) {
|
|
658
|
+
this.chatV2.clearChannel(id, SYSTEM_PRINCIPAL);
|
|
659
|
+
}
|
|
660
|
+
async getCurrentConversation() {
|
|
661
|
+
// Frontend should adopt "latest channel" via listChannels;
|
|
662
|
+
// here we approximate by returning the most recently touched channel.
|
|
663
|
+
const channels = this.chatV2.listChannels({ principal: SYSTEM_PRINCIPAL });
|
|
664
|
+
if (channels.length === 0)
|
|
665
|
+
return null;
|
|
666
|
+
const newest = channels.reduce((a, b) => (a.lastMessageAt ?? a.createdAt) > (b.lastMessageAt ?? b.createdAt) ? a : b);
|
|
667
|
+
return v2ChannelToLegacy(newest, this.chatV2.countChannelMessages(newest.id, SYSTEM_PRINCIPAL));
|
|
668
|
+
}
|
|
669
|
+
emitTypingIndicator(conversationId, sender, isTyping) {
|
|
670
|
+
this.emit('chat_typing', {
|
|
671
|
+
type: 'chat_typing',
|
|
672
|
+
data: { conversationId, sender, isTyping },
|
|
673
|
+
});
|
|
674
|
+
}
|
|
675
|
+
emitProgress(conversationId, text) {
|
|
676
|
+
// Transient — emit but don't persist. Frontend renders progress
|
|
677
|
+
// ephemerally. Legacy behaviour preserved.
|
|
678
|
+
this.emit('chat_message', {
|
|
679
|
+
type: 'chat_message',
|
|
680
|
+
data: {
|
|
681
|
+
id: `progress-${Date.now()}`,
|
|
682
|
+
conversationId,
|
|
683
|
+
from: { type: 'system', id: 'system', name: 'System' },
|
|
684
|
+
content: text,
|
|
685
|
+
contentType: 'system',
|
|
686
|
+
status: 'sent',
|
|
687
|
+
timestamp: new Date().toISOString(),
|
|
688
|
+
metadata: { ephemeral: true },
|
|
689
|
+
},
|
|
690
|
+
});
|
|
691
|
+
}
|
|
692
|
+
async getStatistics() {
|
|
693
|
+
const s = this.chatV2.getStatistics();
|
|
694
|
+
return {
|
|
695
|
+
totalConversations: s.totalChannels,
|
|
696
|
+
activeConversations: s.activeChannels,
|
|
697
|
+
archivedConversations: s.archivedChannels,
|
|
698
|
+
totalMessages: s.totalMessages,
|
|
699
|
+
};
|
|
700
|
+
}
|
|
701
|
+
// ---------------------------------------------------------------------------
|
|
702
|
+
// Helpers
|
|
703
|
+
// ---------------------------------------------------------------------------
|
|
704
|
+
/**
|
|
705
|
+
* Generate a conversationId for a brand-new sendMessage call that
|
|
706
|
+
* didn't supply one. Web-chat-style id; Slack callers always pass
|
|
707
|
+
* their own slack-CHANNEL-TS identifier.
|
|
708
|
+
*/
|
|
709
|
+
synthesizeConversationId(input) {
|
|
710
|
+
if (typeof input.metadata?.channelId === 'string') {
|
|
711
|
+
// Slack source — derive from channel + timestamp pattern.
|
|
712
|
+
const channel = input.metadata.channelId;
|
|
713
|
+
const ts = typeof input.metadata.threadTs === 'string' ? input.metadata.threadTs : `${Date.now()}`;
|
|
714
|
+
return synthesizeSlackConversationId(channel, ts);
|
|
715
|
+
}
|
|
716
|
+
return `web-conv-${Date.now()}`;
|
|
717
|
+
}
|
|
718
|
+
/**
|
|
719
|
+
* Emit the legacy `conversation_updated` event. chat-v2 has no
|
|
720
|
+
* channel-touched event yet, so the façade remains its source and
|
|
721
|
+
* `ChatGateway` forwards it to WebSocket clients (the chat sidebar
|
|
722
|
+
* listens for it).
|
|
723
|
+
*
|
|
724
|
+
* @param conversation - The conversation in its new state
|
|
725
|
+
*/
|
|
726
|
+
emitConversationUpdated(conversation) {
|
|
727
|
+
this.emit('conversation_updated', {
|
|
728
|
+
type: 'conversation_updated',
|
|
729
|
+
data: conversation,
|
|
730
|
+
});
|
|
731
|
+
}
|
|
732
|
+
/**
|
|
733
|
+
* Re-read a conversation and emit `conversation_updated` for it.
|
|
734
|
+
* No-op when the conversation no longer exists.
|
|
735
|
+
*
|
|
736
|
+
* @param id - Conversation id
|
|
737
|
+
*/
|
|
738
|
+
async emitConversationUpdatedById(id) {
|
|
739
|
+
const conversation = await this.getConversation(id);
|
|
740
|
+
if (conversation)
|
|
741
|
+
this.emitConversationUpdated(conversation);
|
|
742
|
+
}
|
|
743
|
+
/**
|
|
744
|
+
* Run a chat-v2 mutation on a conversation, translating chat-v2's
|
|
745
|
+
* `channel_not_found` error into the legacy `ConversationNotFoundError`
|
|
746
|
+
* that callers (chat.controller → 404) catch by type.
|
|
747
|
+
*
|
|
748
|
+
* @param id - Conversation id
|
|
749
|
+
* @param fn - The chat-v2 operation
|
|
750
|
+
* @returns Whatever `fn` returns
|
|
751
|
+
* @throws {ConversationNotFoundError} when the conversation does not exist
|
|
752
|
+
*/
|
|
753
|
+
withConversation(id, fn) {
|
|
754
|
+
try {
|
|
755
|
+
return fn();
|
|
756
|
+
}
|
|
757
|
+
catch (err) {
|
|
758
|
+
if (isChannelNotFound(err))
|
|
759
|
+
throw new ConversationNotFoundError(id);
|
|
760
|
+
throw err;
|
|
761
|
+
}
|
|
762
|
+
}
|
|
763
|
+
/**
|
|
764
|
+
* @deprecated Will be removed when the façade is retired.
|
|
765
|
+
*/
|
|
766
|
+
async ensureInitialized() {
|
|
767
|
+
/* no-op */
|
|
768
|
+
}
|
|
769
|
+
}
|
|
770
|
+
// =============================================================================
|
|
771
|
+
// Singleton accessors — preserved for source compatibility
|
|
772
|
+
// =============================================================================
|
|
773
|
+
let _instance = null;
|
|
774
|
+
export function getChatService(options) {
|
|
775
|
+
if (!_instance) {
|
|
776
|
+
_instance = new ChatService(options);
|
|
777
|
+
}
|
|
778
|
+
return _instance;
|
|
779
|
+
}
|
|
780
|
+
export function resetChatService() {
|
|
781
|
+
_instance = null;
|
|
782
|
+
}
|
|
783
|
+
//# sourceMappingURL=chat.service.js.map
|