crewly 1.20.194 → 1.20.195
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/roles/auditor/prompt.md +2 -2
- package/config/roles/orchestrator/fragments/communication.md +1 -1
- package/config/roles/orchestrator/prompt.md +15 -505
- package/config/skills/agent/computer-use/SKILL.md +6 -0
- package/config/skills/agent/core/experiment-card/SKILL.md +10 -5
- package/config/skills/agent/core/experiment-card/execute.sh +5 -3
- package/config/skills/agent/core/experiment-card/execute.test.sh +6 -0
- package/config/skills/agent/desktop-app-control/execute.sh +5 -2
- package/config/skills/orchestrator/send-message/execute.sh +19 -2
- package/config/skills/orchestrator/send-message/execute.test.sh +80 -0
- package/config/skills/registry.json +6 -5
- 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 +133 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +135 -2
- package/dist/backend/backend/src/constants.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 +6 -0
- 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/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/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/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/trace/trace.controller.d.ts +47 -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 +169 -0
- package/dist/backend/backend/src/controllers/trace/trace.controller.js.map +1 -0
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +29 -19
- package/dist/backend/backend/src/index.js.map +1 -1
- 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 +6 -1
- package/dist/backend/backend/src/services/agent/agent-registration.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/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/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 +78 -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 +210 -26
- package/dist/backend/backend/src/services/chat/chat.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/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 +52 -3
- package/dist/backend/backend/src/services/experiments/experiment.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/experiments/experiment.service.js +178 -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 +27 -7
- 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/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/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.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/project-ticket.service.js +2 -0
- package/dist/backend/backend/src/services/project-tickets/project-ticket.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/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-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.service.d.ts +25 -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 +44 -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-context.service.d.ts +195 -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 +432 -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 +42 -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 +146 -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-recorder.d.ts +290 -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 +669 -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 +269 -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 +602 -0
- package/dist/backend/backend/src/services/trace/trace-store.js.map +1 -0
- package/dist/backend/backend/src/services/trace/trace.types.d.ts +118 -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 +85 -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.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/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/workitem-dispatch.subscriber.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js +22 -2
- package/dist/backend/backend/src/services/v3/workitem-dispatch.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/experiment.types.d.ts +8 -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/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 +4 -0
- 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 +1 -0
- package/dist/backend/backend/src/types/v2/work-item.types.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/cli/backend/src/constants.d.ts +133 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +135 -2
- 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 +6 -1
- package/dist/cli/backend/src/services/agent/agent-registration.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-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/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 +185 -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 +558 -0
- package/dist/cli/backend/src/services/chat/chat.service.js.map +1 -0
- 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/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/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/project-tickets/project-ticket.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/project-tickets/project-ticket.service.js +2 -0
- package/dist/cli/backend/src/services/project-tickets/project-ticket.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-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.service.d.ts +25 -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 +44 -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 +195 -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 +432 -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 +290 -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 +669 -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 +269 -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 +602 -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 +118 -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 +85 -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/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 +4 -0
- 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 +1 -0
- package/dist/cli/backend/src/types/v2/work-item.types.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/package.json +1 -1
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Durable store of signal digests (#987, specs/2026-10-03-signal-digest.md).
|
|
3
|
+
*
|
|
4
|
+
* One JSON file under CREWLY_HOME with a monotonically increasing id counter,
|
|
5
|
+
* so `SD-3` is never reused. All writes are serialised and atomic. Digests
|
|
6
|
+
* untouched for {@link SIGNAL_DIGEST_CONSTANTS.KEEP_MS} are pruned.
|
|
7
|
+
*
|
|
8
|
+
* @module services/signal-digest/signal-digest-store
|
|
9
|
+
*/
|
|
10
|
+
import type { SignalDigest, SignalSiteSources } from '../../types/signal-digest.types.js';
|
|
11
|
+
/**
|
|
12
|
+
* Persistent digest store.
|
|
13
|
+
*/
|
|
14
|
+
export declare class SignalDigestStore {
|
|
15
|
+
private readonly filePath;
|
|
16
|
+
private readonly now;
|
|
17
|
+
private data;
|
|
18
|
+
private chain;
|
|
19
|
+
/**
|
|
20
|
+
* @param filePath - JSON file
|
|
21
|
+
* @param now - Clock (tests)
|
|
22
|
+
*/
|
|
23
|
+
constructor(filePath: string, now?: () => Date);
|
|
24
|
+
/**
|
|
25
|
+
* Store under a CREWLY_HOME.
|
|
26
|
+
*
|
|
27
|
+
* @param crewlyHome - CREWLY_HOME
|
|
28
|
+
* @returns The store
|
|
29
|
+
*/
|
|
30
|
+
static inHome(crewlyHome: string): SignalDigestStore;
|
|
31
|
+
/**
|
|
32
|
+
* Add a digest, assigning its id.
|
|
33
|
+
*
|
|
34
|
+
* @param draft - Digest without id/timestamps
|
|
35
|
+
* @returns The stored digest
|
|
36
|
+
*/
|
|
37
|
+
create(draft: Omit<SignalDigest, 'id' | 'createdAt' | 'updatedAt'>): Promise<SignalDigest>;
|
|
38
|
+
/**
|
|
39
|
+
* Change a digest under the write lock.
|
|
40
|
+
*
|
|
41
|
+
* @param id - Digest id
|
|
42
|
+
* @param fn - Gets a copy; returns the new digest, or null to leave it alone
|
|
43
|
+
* @returns The updated digest, or null when missing / unchanged
|
|
44
|
+
*/
|
|
45
|
+
update(id: string, fn: (d: SignalDigest) => SignalDigest | null): Promise<SignalDigest | null>;
|
|
46
|
+
/**
|
|
47
|
+
* One digest.
|
|
48
|
+
*
|
|
49
|
+
* @param id - Digest id
|
|
50
|
+
* @returns Copy, or null
|
|
51
|
+
*/
|
|
52
|
+
get(id: string): Promise<SignalDigest | null>;
|
|
53
|
+
/**
|
|
54
|
+
* All digests, newest first, optionally filtered.
|
|
55
|
+
*
|
|
56
|
+
* @param filter - Predicate
|
|
57
|
+
* @returns Copies
|
|
58
|
+
*/
|
|
59
|
+
list(filter?: (d: SignalDigest) => boolean): Promise<SignalDigest[]>;
|
|
60
|
+
/**
|
|
61
|
+
* A site's latest source report.
|
|
62
|
+
*
|
|
63
|
+
* @param site - Site
|
|
64
|
+
* @returns Copy, or null when none was reported
|
|
65
|
+
*/
|
|
66
|
+
getSiteSources(site: string): Promise<SignalSiteSources | null>;
|
|
67
|
+
/**
|
|
68
|
+
* Change a site's source report under the write lock.
|
|
69
|
+
*
|
|
70
|
+
* @param site - Site
|
|
71
|
+
* @param fn - Gets a copy (null when none); returns the new report
|
|
72
|
+
* @returns The stored report
|
|
73
|
+
*/
|
|
74
|
+
updateSiteSources(site: string, fn: (cur: SignalSiteSources | null) => SignalSiteSources): Promise<SignalSiteSources>;
|
|
75
|
+
/**
|
|
76
|
+
* Drop digests with nothing open that were last changed before the keep window.
|
|
77
|
+
*
|
|
78
|
+
* @returns How many were dropped
|
|
79
|
+
*/
|
|
80
|
+
prune(): Promise<number>;
|
|
81
|
+
private load;
|
|
82
|
+
private save;
|
|
83
|
+
private serial;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=signal-digest-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal-digest-store.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/signal-digest/signal-digest-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AA8B1F;;GAEG;AACH,qBAAa,iBAAiB;IAS1B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,GAAG;IATtB,OAAO,CAAC,IAAI,CAA2B;IACvC,OAAO,CAAC,KAAK,CAAuC;IAEpD;;;OAGG;gBAEgB,QAAQ,EAAE,MAAM,EAChB,GAAG,GAAE,MAAM,IAAuB;IAGrD;;;;;OAKG;IACH,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,iBAAiB;IAIpD;;;;;OAKG;IACG,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC;IAYhG;;;;;;OAMG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,YAAY,KAAK,YAAY,GAAG,IAAI,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAcpG;;;;;OAKG;IACG,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAMnD;;;;;OAKG;IACG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,YAAY,KAAK,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAQ1E;;;;;OAKG;IACG,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAMrE;;;;;;OAMG;IACG,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,KAAK,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAY3H;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;YAYhB,IAAI;YAUJ,IAAI;IAIlB,OAAO,CAAC,MAAM;CAKf"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Durable store of signal digests (#987, specs/2026-10-03-signal-digest.md).
|
|
3
|
+
*
|
|
4
|
+
* One JSON file under CREWLY_HOME with a monotonically increasing id counter,
|
|
5
|
+
* so `SD-3` is never reused. All writes are serialised and atomic. Digests
|
|
6
|
+
* untouched for {@link SIGNAL_DIGEST_CONSTANTS.KEEP_MS} are pruned.
|
|
7
|
+
*
|
|
8
|
+
* @module services/signal-digest/signal-digest-store
|
|
9
|
+
*/
|
|
10
|
+
import * as path from 'path';
|
|
11
|
+
import { SIGNAL_DIGEST_CONSTANTS } from '../../constants.js';
|
|
12
|
+
import { atomicWriteJson, safeReadJson } from '../../utils/file-io.utils.js';
|
|
13
|
+
/**
|
|
14
|
+
* Store key of a site.
|
|
15
|
+
*
|
|
16
|
+
* @param site - Site
|
|
17
|
+
* @returns Lower-cased, trimmed
|
|
18
|
+
*/
|
|
19
|
+
function siteKey(site) {
|
|
20
|
+
return site.trim().toLowerCase();
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Deep copy (digests hold nested item arrays).
|
|
24
|
+
*
|
|
25
|
+
* @param d - Digest
|
|
26
|
+
* @returns Independent copy
|
|
27
|
+
*/
|
|
28
|
+
function copy(d) {
|
|
29
|
+
return JSON.parse(JSON.stringify(d));
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Persistent digest store.
|
|
33
|
+
*/
|
|
34
|
+
export class SignalDigestStore {
|
|
35
|
+
filePath;
|
|
36
|
+
now;
|
|
37
|
+
data = null;
|
|
38
|
+
chain = Promise.resolve();
|
|
39
|
+
/**
|
|
40
|
+
* @param filePath - JSON file
|
|
41
|
+
* @param now - Clock (tests)
|
|
42
|
+
*/
|
|
43
|
+
constructor(filePath, now = () => new Date()) {
|
|
44
|
+
this.filePath = filePath;
|
|
45
|
+
this.now = now;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Store under a CREWLY_HOME.
|
|
49
|
+
*
|
|
50
|
+
* @param crewlyHome - CREWLY_HOME
|
|
51
|
+
* @returns The store
|
|
52
|
+
*/
|
|
53
|
+
static inHome(crewlyHome) {
|
|
54
|
+
return new SignalDigestStore(path.join(crewlyHome, SIGNAL_DIGEST_CONSTANTS.STORE_FILENAME));
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Add a digest, assigning its id.
|
|
58
|
+
*
|
|
59
|
+
* @param draft - Digest without id/timestamps
|
|
60
|
+
* @returns The stored digest
|
|
61
|
+
*/
|
|
62
|
+
async create(draft) {
|
|
63
|
+
return this.serial(async () => {
|
|
64
|
+
const data = await this.load();
|
|
65
|
+
const at = this.now().toISOString();
|
|
66
|
+
const digest = { ...copy(draft), id: `${SIGNAL_DIGEST_CONSTANTS.ID_PREFIX}${data.nextId}`, createdAt: at, updatedAt: at };
|
|
67
|
+
data.nextId += 1;
|
|
68
|
+
data.digests.push(digest);
|
|
69
|
+
await this.save();
|
|
70
|
+
return copy(digest);
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Change a digest under the write lock.
|
|
75
|
+
*
|
|
76
|
+
* @param id - Digest id
|
|
77
|
+
* @param fn - Gets a copy; returns the new digest, or null to leave it alone
|
|
78
|
+
* @returns The updated digest, or null when missing / unchanged
|
|
79
|
+
*/
|
|
80
|
+
async update(id, fn) {
|
|
81
|
+
return this.serial(async () => {
|
|
82
|
+
const data = await this.load();
|
|
83
|
+
const idx = data.digests.findIndex((d) => d.id === id);
|
|
84
|
+
if (idx < 0)
|
|
85
|
+
return null;
|
|
86
|
+
const next = fn(copy(data.digests[idx]));
|
|
87
|
+
if (!next)
|
|
88
|
+
return null;
|
|
89
|
+
const stored = { ...next, id, updatedAt: this.now().toISOString() };
|
|
90
|
+
data.digests[idx] = stored;
|
|
91
|
+
await this.save();
|
|
92
|
+
return copy(stored);
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* One digest.
|
|
97
|
+
*
|
|
98
|
+
* @param id - Digest id
|
|
99
|
+
* @returns Copy, or null
|
|
100
|
+
*/
|
|
101
|
+
async get(id) {
|
|
102
|
+
const data = await this.load();
|
|
103
|
+
const d = data.digests.find((x) => x.id === id);
|
|
104
|
+
return d ? copy(d) : null;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* All digests, newest first, optionally filtered.
|
|
108
|
+
*
|
|
109
|
+
* @param filter - Predicate
|
|
110
|
+
* @returns Copies
|
|
111
|
+
*/
|
|
112
|
+
async list(filter) {
|
|
113
|
+
const data = await this.load();
|
|
114
|
+
return data.digests
|
|
115
|
+
.filter((d) => !filter || filter(d))
|
|
116
|
+
.map(copy)
|
|
117
|
+
.sort((a, b) => Date.parse(b.createdAt) - Date.parse(a.createdAt) || b.id.localeCompare(a.id, undefined, { numeric: true }));
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* A site's latest source report.
|
|
121
|
+
*
|
|
122
|
+
* @param site - Site
|
|
123
|
+
* @returns Copy, or null when none was reported
|
|
124
|
+
*/
|
|
125
|
+
async getSiteSources(site) {
|
|
126
|
+
const data = await this.load();
|
|
127
|
+
const s = data.siteSources[siteKey(site)];
|
|
128
|
+
return s ? JSON.parse(JSON.stringify(s)) : null;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Change a site's source report under the write lock.
|
|
132
|
+
*
|
|
133
|
+
* @param site - Site
|
|
134
|
+
* @param fn - Gets a copy (null when none); returns the new report
|
|
135
|
+
* @returns The stored report
|
|
136
|
+
*/
|
|
137
|
+
async updateSiteSources(site, fn) {
|
|
138
|
+
return this.serial(async () => {
|
|
139
|
+
const data = await this.load();
|
|
140
|
+
const key = siteKey(site);
|
|
141
|
+
const cur = data.siteSources[key];
|
|
142
|
+
const next = fn(cur ? JSON.parse(JSON.stringify(cur)) : null);
|
|
143
|
+
data.siteSources[key] = next;
|
|
144
|
+
await this.save();
|
|
145
|
+
return JSON.parse(JSON.stringify(next));
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Drop digests with nothing open that were last changed before the keep window.
|
|
150
|
+
*
|
|
151
|
+
* @returns How many were dropped
|
|
152
|
+
*/
|
|
153
|
+
async prune() {
|
|
154
|
+
return this.serial(async () => {
|
|
155
|
+
const data = await this.load();
|
|
156
|
+
const cutoff = this.now().getTime() - SIGNAL_DIGEST_CONSTANTS.KEEP_MS;
|
|
157
|
+
const before = data.digests.length;
|
|
158
|
+
data.digests = data.digests.filter((d) => d.items.some((i) => i.status === 'open') || Date.parse(d.updatedAt) >= cutoff);
|
|
159
|
+
const dropped = before - data.digests.length;
|
|
160
|
+
if (dropped > 0)
|
|
161
|
+
await this.save();
|
|
162
|
+
return dropped;
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
async load() {
|
|
166
|
+
if (this.data)
|
|
167
|
+
return this.data;
|
|
168
|
+
const raw = await safeReadJson(this.filePath, {});
|
|
169
|
+
const digests = Array.isArray(raw.digests) ? raw.digests : [];
|
|
170
|
+
const maxId = digests.reduce((m, d) => Math.max(m, Number(String(d.id).replace(SIGNAL_DIGEST_CONSTANTS.ID_PREFIX, '')) || 0), 0);
|
|
171
|
+
const siteSources = raw.siteSources && typeof raw.siteSources === 'object' && !Array.isArray(raw.siteSources) ? raw.siteSources : {};
|
|
172
|
+
this.data = { nextId: Math.max(Number(raw.nextId) || 1, maxId + 1), digests, siteSources };
|
|
173
|
+
return this.data;
|
|
174
|
+
}
|
|
175
|
+
async save() {
|
|
176
|
+
if (this.data)
|
|
177
|
+
await atomicWriteJson(this.filePath, this.data);
|
|
178
|
+
}
|
|
179
|
+
serial(fn) {
|
|
180
|
+
const next = this.chain.then(fn, fn);
|
|
181
|
+
this.chain = next.catch(() => undefined);
|
|
182
|
+
return next;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=signal-digest-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal-digest-store.js","sourceRoot":"","sources":["../../../../../../backend/src/services/signal-digest/signal-digest-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Daily signal digest (#987, specs/2026-10-03-signal-digest.md).
|
|
3
|
+
*
|
|
4
|
+
* A team lead proposes 3–5 actions for a site (the `signal-digest` skill
|
|
5
|
+
* collects the signals and drafts them). This service:
|
|
6
|
+
* 1. refuses actions the site's history blocks (tried with Do, or skipped
|
|
7
|
+
* recently), and replaces the site's earlier unanswered actions;
|
|
8
|
+
* 2. posts ONE Slack card with Do / Skip per action, from the lead's bot, in
|
|
9
|
+
* the lead's team channel (else the owner's DM);
|
|
10
|
+
* 3. on Do, opens an experiment ticket in the site's project and tells the
|
|
11
|
+
* lead; on Skip, records it so the action stays off the list for a while;
|
|
12
|
+
* 4. keeps each site's signal-source status and tells the owner once when a
|
|
13
|
+
* source starts or stops failing (nothing on the days it does not change).
|
|
14
|
+
*
|
|
15
|
+
* @module services/signal-digest/signal-digest.service
|
|
16
|
+
*/
|
|
17
|
+
import type { ComponentLogger } from '../core/logger.service.js';
|
|
18
|
+
import type { DecisionPostIdentity, DecisionSlackApi, BlockActionsPayload } from '../decisions/decision.service.js';
|
|
19
|
+
import type { CreateSignalDigestInput, SignalChoice, SignalDigest, SignalDigestItem, SignalHistoryEntry, SignalSourceReport } from '../../types/signal-digest.types.js';
|
|
20
|
+
import type { SignalDigestStore } from './signal-digest-store.js';
|
|
21
|
+
/** A ticket a Do asks for. */
|
|
22
|
+
export interface SignalTicketInput {
|
|
23
|
+
/** Project reference (name, id or path) */
|
|
24
|
+
project: string;
|
|
25
|
+
/** The lead's team, when known (dropped when it is not on the project) */
|
|
26
|
+
team?: string;
|
|
27
|
+
title: string;
|
|
28
|
+
description: string;
|
|
29
|
+
acceptance: string[];
|
|
30
|
+
labels: string[];
|
|
31
|
+
source: string;
|
|
32
|
+
}
|
|
33
|
+
/** The experiment card a Do asks for (#986): the experiment service's create input. */
|
|
34
|
+
export interface SignalExperimentInput {
|
|
35
|
+
title: string;
|
|
36
|
+
hypothesis: string;
|
|
37
|
+
metric: Record<string, string>;
|
|
38
|
+
ticket: {
|
|
39
|
+
kind: 'project';
|
|
40
|
+
project: string;
|
|
41
|
+
id: string;
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/** Collaborators. */
|
|
45
|
+
export interface SignalDigestServiceDeps {
|
|
46
|
+
store: SignalDigestStore;
|
|
47
|
+
slack: () => DecisionSlackApi | null;
|
|
48
|
+
instanceId: () => string;
|
|
49
|
+
/** Whether a Slack user may answer (the owner) */
|
|
50
|
+
isOwner: (userId: string) => boolean;
|
|
51
|
+
identityOf: (session: string) => Promise<DecisionPostIdentity>;
|
|
52
|
+
teamOf: (session: string) => Promise<string | undefined>;
|
|
53
|
+
teamChannelOf: (teamId: string) => Promise<string | null>;
|
|
54
|
+
/** The owner's DM, opened with that identity (fallback place) */
|
|
55
|
+
ownerDmOf?: (identity: DecisionPostIdentity) => Promise<string | null>;
|
|
56
|
+
displayName?: (session: string) => Promise<string | undefined>;
|
|
57
|
+
/** Open a ticket; returns its id */
|
|
58
|
+
createTicket: (input: SignalTicketInput) => Promise<{
|
|
59
|
+
id: string;
|
|
60
|
+
}>;
|
|
61
|
+
/** Create an experiment card as that session (#986); absent = experiment cards are off */
|
|
62
|
+
createExperiment?: (input: SignalExperimentInput, caller: string) => Promise<{
|
|
63
|
+
id: string;
|
|
64
|
+
}>;
|
|
65
|
+
/** Tell an agent something (wakes it when needed) */
|
|
66
|
+
deliverToAgent: (session: string, text: string) => Promise<boolean>;
|
|
67
|
+
/** Tell the owner (false = not delivered); absent = no source-change notices */
|
|
68
|
+
notifyOwner?: (notice: {
|
|
69
|
+
title: string;
|
|
70
|
+
message: string;
|
|
71
|
+
urgent: boolean;
|
|
72
|
+
}) => Promise<boolean>;
|
|
73
|
+
logger: ComponentLogger;
|
|
74
|
+
now?: () => Date;
|
|
75
|
+
}
|
|
76
|
+
/** What a Slack click did. */
|
|
77
|
+
export interface SignalInteractionOutcome {
|
|
78
|
+
handled: boolean;
|
|
79
|
+
reason: string;
|
|
80
|
+
digest?: SignalDigest;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* The description of the ticket a Do opens: the digest item plus the
|
|
84
|
+
* experiment card fields #986 measures (hypothesis, metric, baseline, window).
|
|
85
|
+
*
|
|
86
|
+
* @param digest - Digest
|
|
87
|
+
* @param item - The action
|
|
88
|
+
* @returns Markdown
|
|
89
|
+
*/
|
|
90
|
+
export declare function experimentTicketDescription(digest: SignalDigest, item: SignalDigestItem): string;
|
|
91
|
+
/**
|
|
92
|
+
* How a source is named to the owner.
|
|
93
|
+
*
|
|
94
|
+
* @param name - Source name
|
|
95
|
+
* @returns Label
|
|
96
|
+
*/
|
|
97
|
+
export declare function sourceLabel(name: string): string;
|
|
98
|
+
/**
|
|
99
|
+
* Signal digests: proposals, the Slack card, the owner's answers.
|
|
100
|
+
*/
|
|
101
|
+
export declare class SignalDigestService {
|
|
102
|
+
private readonly deps;
|
|
103
|
+
private static instance;
|
|
104
|
+
private readonly now;
|
|
105
|
+
/** Source reports are handled one at a time (one change notice per change) */
|
|
106
|
+
private sourceChain;
|
|
107
|
+
/**
|
|
108
|
+
* @param deps - Collaborators
|
|
109
|
+
*/
|
|
110
|
+
constructor(deps: SignalDigestServiceDeps);
|
|
111
|
+
/** The running service, when started. */
|
|
112
|
+
static getInstance(): SignalDigestService | null;
|
|
113
|
+
/**
|
|
114
|
+
* Set (or clear) the running service.
|
|
115
|
+
*
|
|
116
|
+
* @param service - Service or null
|
|
117
|
+
*/
|
|
118
|
+
static setInstance(service: SignalDigestService | null): void;
|
|
119
|
+
/**
|
|
120
|
+
* Propose a digest. The site's earlier unanswered actions are replaced
|
|
121
|
+
* (expired) first; then any action the history still blocks is refused.
|
|
122
|
+
*
|
|
123
|
+
* @param callerSession - Team lead session (X-Agent-Session)
|
|
124
|
+
* @param input - `{ site, project?, config?, items }`
|
|
125
|
+
* @returns The stored digest (with `card`, or `postError` when Slack refused)
|
|
126
|
+
* @throws SignalDigestError(400) for a contract violation, (409) for blocked actions
|
|
127
|
+
*/
|
|
128
|
+
propose(callerSession: string | undefined, input: CreateSignalDigestInput): Promise<SignalDigest>;
|
|
129
|
+
/**
|
|
130
|
+
* A site's digest proposed within DUPLICATE_WINDOW_MS that still has open actions.
|
|
131
|
+
*
|
|
132
|
+
* @param site - Site
|
|
133
|
+
* @returns The newest such digest, or null
|
|
134
|
+
*/
|
|
135
|
+
private recentOpenDigest;
|
|
136
|
+
/**
|
|
137
|
+
* The site's latest source report, when it is recent enough to describe today's run.
|
|
138
|
+
*
|
|
139
|
+
* @param site - Site
|
|
140
|
+
* @returns Statuses, or undefined
|
|
141
|
+
*/
|
|
142
|
+
private latestSources;
|
|
143
|
+
/**
|
|
144
|
+
* A collect run's source statuses (`POST /api/signal-digests/sources`).
|
|
145
|
+
* Stored per site; the owner is told once when a source starts or stops
|
|
146
|
+
* failing — not every day it stays broken.
|
|
147
|
+
*
|
|
148
|
+
* @param callerSession - Team lead session (X-Agent-Session)
|
|
149
|
+
* @param input - `{ site, sources }`
|
|
150
|
+
* @returns What changed and whether the owner was told
|
|
151
|
+
* @throws SignalDigestError(400)
|
|
152
|
+
*/
|
|
153
|
+
reportSources(callerSession: string | undefined, input: {
|
|
154
|
+
site?: unknown;
|
|
155
|
+
sources?: unknown;
|
|
156
|
+
}): Promise<SignalSourceReport>;
|
|
157
|
+
/**
|
|
158
|
+
* Store a source report and send the change notice (see {@link reportSources}).
|
|
159
|
+
*
|
|
160
|
+
* @param caller - Reporting session
|
|
161
|
+
* @param site - Site
|
|
162
|
+
* @param sources - Statuses
|
|
163
|
+
* @returns The report outcome
|
|
164
|
+
*/
|
|
165
|
+
private recordSources;
|
|
166
|
+
/**
|
|
167
|
+
* The site's blocked keys (Do within 90 days, Skip within 30) and its open ones.
|
|
168
|
+
*
|
|
169
|
+
* @param site - Site
|
|
170
|
+
* @returns History entries
|
|
171
|
+
*/
|
|
172
|
+
history(site: string): Promise<SignalHistoryEntry[]>;
|
|
173
|
+
/**
|
|
174
|
+
* Digests, newest first.
|
|
175
|
+
*
|
|
176
|
+
* @param site - Only this site, when given
|
|
177
|
+
* @returns Digests
|
|
178
|
+
*/
|
|
179
|
+
list(site?: string): Promise<SignalDigest[]>;
|
|
180
|
+
/**
|
|
181
|
+
* One digest.
|
|
182
|
+
*
|
|
183
|
+
* @param id - Digest id
|
|
184
|
+
* @returns Digest or null
|
|
185
|
+
*/
|
|
186
|
+
get(id: string): Promise<SignalDigest | null>;
|
|
187
|
+
/**
|
|
188
|
+
* Answer one action from the dashboard / API (owner only; the caller checks).
|
|
189
|
+
*
|
|
190
|
+
* @param id - Digest id
|
|
191
|
+
* @param n - Item number
|
|
192
|
+
* @param choice - do / skip
|
|
193
|
+
* @returns The updated digest
|
|
194
|
+
* @throws SignalDigestError(404) unknown digest / item, (409) already answered
|
|
195
|
+
*/
|
|
196
|
+
choose(id: string, n: number, choice: SignalChoice): Promise<SignalDigest>;
|
|
197
|
+
/**
|
|
198
|
+
* A Slack `block_actions` payload. Ignores anything that is not a click on
|
|
199
|
+
* one of this instance's digest cards by the owner.
|
|
200
|
+
*
|
|
201
|
+
* @param payload - Slack payload
|
|
202
|
+
* @returns What happened
|
|
203
|
+
*/
|
|
204
|
+
handleInteraction(payload: BlockActionsPayload): Promise<SignalInteractionOutcome>;
|
|
205
|
+
/**
|
|
206
|
+
* Record the answer; on Do open the ticket and tell the lead; redraw the card.
|
|
207
|
+
*
|
|
208
|
+
* @param id - Digest id
|
|
209
|
+
* @param n - Item number
|
|
210
|
+
* @param choice - do / skip
|
|
211
|
+
* @param by - Slack user id, or `dashboard`
|
|
212
|
+
* @returns The updated digest, or null when the item was not open
|
|
213
|
+
*/
|
|
214
|
+
private apply;
|
|
215
|
+
/**
|
|
216
|
+
* Open the experiment ticket of a Do.
|
|
217
|
+
*
|
|
218
|
+
* @param digest - Digest
|
|
219
|
+
* @param item - The action
|
|
220
|
+
* @returns The ticket id, or why there is none
|
|
221
|
+
*/
|
|
222
|
+
private openTicket;
|
|
223
|
+
/**
|
|
224
|
+
* Create the experiment card of a Do (#986), linked to its ticket, as the
|
|
225
|
+
* lead (its prediction is recorded under the lead). Only when the action
|
|
226
|
+
* names a metric and the digest has the seo-ops config.
|
|
227
|
+
*
|
|
228
|
+
* @param digest - Digest
|
|
229
|
+
* @param item - The action
|
|
230
|
+
* @param ticketId - The ticket the Do opened
|
|
231
|
+
* @returns The card id, why there is none, or null when none was asked for
|
|
232
|
+
*/
|
|
233
|
+
private openExperiment;
|
|
234
|
+
/**
|
|
235
|
+
* What the lead is told after a Do.
|
|
236
|
+
*
|
|
237
|
+
* @param digest - Digest
|
|
238
|
+
* @param item - The answered action
|
|
239
|
+
* @returns Message text
|
|
240
|
+
*/
|
|
241
|
+
private doNote;
|
|
242
|
+
/**
|
|
243
|
+
* Replace the site's earlier unanswered actions: they become `expired` and
|
|
244
|
+
* their cards say so.
|
|
245
|
+
*
|
|
246
|
+
* @param site - Site
|
|
247
|
+
*/
|
|
248
|
+
private expireOpen;
|
|
249
|
+
/**
|
|
250
|
+
* Post the card: the lead's team channel from the lead's bot, else the
|
|
251
|
+
* owner's DM.
|
|
252
|
+
*
|
|
253
|
+
* @param digest - Digest without a card
|
|
254
|
+
* @returns The digest with `card`, or `postError`
|
|
255
|
+
*/
|
|
256
|
+
private postCard;
|
|
257
|
+
/**
|
|
258
|
+
* Redraw a posted card.
|
|
259
|
+
*
|
|
260
|
+
* @param digest - Digest
|
|
261
|
+
* @returns True when Slack accepted the update
|
|
262
|
+
*/
|
|
263
|
+
private refreshCard;
|
|
264
|
+
/**
|
|
265
|
+
* Tell the lead (best effort).
|
|
266
|
+
*
|
|
267
|
+
* @param digest - Digest
|
|
268
|
+
* @param text - Message
|
|
269
|
+
*/
|
|
270
|
+
private tellAsker;
|
|
271
|
+
}
|
|
272
|
+
//# sourceMappingURL=signal-digest.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal-digest.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/signal-digest/signal-digest.service.ts"],"names":[],"mappings":"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"}
|