crewly 1.20.211 → 1.20.213
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/orchestrator/prompt.md +1 -0
- package/config/skills/agent/core/send-message/SKILL.md +9 -0
- package/config/skills/orchestrator/delegate-task/SKILL.md +9 -0
- package/config/skills/orchestrator/get-team-status/SKILL.md +9 -0
- package/config/skills/orchestrator/get-team-status/execute.sh +5 -1
- package/config/skills/orchestrator/send-message/SKILL.md +9 -0
- package/config/skills/orchestrator/start-agent/SKILL.md +9 -0
- package/config/skills/orchestrator/start-team/SKILL.md +9 -0
- package/config/skills/team-leader/assign-ticket/SKILL.md +9 -0
- package/config/skills/team-leader/delegate-task/SKILL.md +9 -0
- package/dist/backend/backend/src/constants.d.ts +25 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +25 -0
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts +12 -0
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js +36 -1
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/request-types.d.ts +10 -1
- package/dist/backend/backend/src/controllers/request-types.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts +0 -36
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js +41 -1
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/team/team-pause.controller.d.ts +59 -0
- package/dist/backend/backend/src/controllers/team/team-pause.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/team/team-pause.controller.js +161 -0
- package/dist/backend/backend/src/controllers/team/team-pause.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/team/team.controller.d.ts +14 -0
- package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.controller.js +78 -5
- package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.routes.js +7 -1
- package/dist/backend/backend/src/controllers/team/team.routes.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +18 -1
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/models/Team.d.ts +5 -1
- package/dist/backend/backend/src/models/Team.d.ts.map +1 -1
- package/dist/backend/backend/src/models/Team.js +8 -0
- package/dist/backend/backend/src/models/Team.js.map +1 -1
- package/dist/backend/backend/src/services/agent/owner-stopped.registry.d.ts +7 -2
- package/dist/backend/backend/src/services/agent/owner-stopped.registry.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/owner-stopped.registry.js +9 -3
- package/dist/backend/backend/src/services/agent/owner-stopped.registry.js.map +1 -1
- 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 +14 -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.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js +3 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/ticket-line.utils.d.ts +29 -0
- package/dist/backend/backend/src/services/chat-v2/ticket-line.utils.d.ts.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/ticket-line.utils.js +48 -0
- package/dist/backend/backend/src/services/chat-v2/ticket-line.utils.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/conversation-cloud-sync.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/conversation-cloud-sync.service.js +3 -1
- package/dist/backend/backend/src/services/cloud/conversation-cloud-sync.service.js.map +1 -1
- package/dist/backend/backend/src/services/core/storage.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/core/storage.service.js +6 -0
- package/dist/backend/backend/src/services/core/storage.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 +6 -0
- package/dist/backend/backend/src/services/messaging/owner-message-watchdog.wiring.js.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.d.ts +12 -0
- 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 +59 -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/ticket-autopilot.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.js +12 -6
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.js.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.js +5 -0
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.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 +4 -0
- package/dist/backend/backend/src/services/reconciler/reconciler.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-agent-dm.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-agent-dm.service.js +22 -0
- package/dist/backend/backend/src/services/slack/slack-agent-dm.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-channel-members.d.ts +27 -0
- package/dist/backend/backend/src/services/slack/slack-channel-members.d.ts.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-channel-members.js +54 -0
- package/dist/backend/backend/src/services/slack/slack-channel-members.js.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-directory.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-directory.service.js +7 -2
- package/dist/backend/backend/src/services/slack/slack-directory.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-initializer.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-initializer.js +3 -0
- package/dist/backend/backend/src/services/slack/slack-initializer.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts +12 -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 +57 -16
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +48 -0
- 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 +155 -4
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +11 -0
- 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 +36 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/backend/backend/src/services/task-pool/untargeted-router.d.ts.map +1 -1
- package/dist/backend/backend/src/services/task-pool/untargeted-router.js +14 -6
- package/dist/backend/backend/src/services/task-pool/untargeted-router.js.map +1 -1
- package/dist/backend/backend/src/services/team/team-pause-command.d.ts +97 -0
- package/dist/backend/backend/src/services/team/team-pause-command.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team/team-pause-command.js +177 -0
- package/dist/backend/backend/src/services/team/team-pause-command.js.map +1 -0
- package/dist/backend/backend/src/services/team/team-pause-notice.d.ts +43 -0
- package/dist/backend/backend/src/services/team/team-pause-notice.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team/team-pause-notice.js +61 -0
- package/dist/backend/backend/src/services/team/team-pause-notice.js.map +1 -0
- package/dist/backend/backend/src/services/team/team-pause.registry.d.ts +167 -0
- package/dist/backend/backend/src/services/team/team-pause.registry.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team/team-pause.registry.js +263 -0
- package/dist/backend/backend/src/services/team/team-pause.registry.js.map +1 -0
- package/dist/backend/backend/src/services/team/team-pause.service.d.ts +172 -0
- package/dist/backend/backend/src/services/team/team-pause.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team/team-pause.service.js +254 -0
- package/dist/backend/backend/src/services/team/team-pause.service.js.map +1 -0
- package/dist/backend/backend/src/services/team/team-pause.wiring.d.ts +30 -0
- package/dist/backend/backend/src/services/team/team-pause.wiring.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team/team-pause.wiring.js +48 -0
- package/dist/backend/backend/src/services/team/team-pause.wiring.js.map +1 -0
- package/dist/backend/backend/src/services/v3/agent-auto-claim.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/agent-auto-claim.service.js +11 -0
- package/dist/backend/backend/src/services/v3/agent-auto-claim.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/trigger-engine.service.d.ts +9 -0
- package/dist/backend/backend/src/services/v3/trigger-engine.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/trigger-engine.service.js +27 -2
- package/dist/backend/backend/src/services/v3/trigger-engine.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 +7 -0
- package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js.map +1 -1
- package/dist/backend/backend/src/services/workflow/cron-task.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/workflow/cron-task.service.js +14 -0
- package/dist/backend/backend/src/services/workflow/cron-task.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 +5 -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 +6 -0
- package/dist/backend/backend/src/services/workflow/scheduler.service.js.map +1 -1
- package/dist/backend/backend/src/types/index.d.ts +22 -0
- package/dist/backend/backend/src/types/index.d.ts.map +1 -1
- package/dist/backend/backend/src/types/index.js.map +1 -1
- package/dist/backend/build-info.json +2 -2
- package/dist/cli/backend/src/constants.d.ts +25 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +25 -0
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/models/Team.d.ts +5 -1
- package/dist/cli/backend/src/models/Team.d.ts.map +1 -1
- package/dist/cli/backend/src/models/Team.js +8 -0
- package/dist/cli/backend/src/models/Team.js.map +1 -1
- 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 +14 -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.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js +3 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/ticket-line.utils.d.ts +29 -0
- package/dist/cli/backend/src/services/chat-v2/ticket-line.utils.d.ts.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/ticket-line.utils.js +48 -0
- package/dist/cli/backend/src/services/chat-v2/ticket-line.utils.js.map +1 -0
- package/dist/cli/backend/src/services/core/storage.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/core/storage.service.js +6 -0
- package/dist/cli/backend/src/services/core/storage.service.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-agent-dm.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-agent-dm.service.js +22 -0
- package/dist/cli/backend/src/services/slack/slack-agent-dm.service.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-directory.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-directory.service.js +7 -2
- package/dist/cli/backend/src/services/slack/slack-directory.service.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts +12 -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 +57 -16
- 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 +48 -0
- 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 +155 -4
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +11 -0
- 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 +36 -1
- package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/cli/backend/src/services/team/team-pause-notice.d.ts +43 -0
- package/dist/cli/backend/src/services/team/team-pause-notice.d.ts.map +1 -0
- package/dist/cli/backend/src/services/team/team-pause-notice.js +61 -0
- package/dist/cli/backend/src/services/team/team-pause-notice.js.map +1 -0
- package/dist/cli/backend/src/services/team/team-pause.registry.d.ts +167 -0
- package/dist/cli/backend/src/services/team/team-pause.registry.d.ts.map +1 -0
- package/dist/cli/backend/src/services/team/team-pause.registry.js +263 -0
- package/dist/cli/backend/src/services/team/team-pause.registry.js.map +1 -0
- package/dist/cli/backend/src/services/workflow/cron-task.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/workflow/cron-task.service.js +14 -0
- package/dist/cli/backend/src/services/workflow/cron-task.service.js.map +1 -1
- package/dist/cli/backend/src/types/index.d.ts +22 -0
- package/dist/cli/backend/src/types/index.d.ts.map +1 -1
- package/dist/cli/backend/src/types/index.js.map +1 -1
- package/frontend/dist/assets/{index-f64b333a.js → index-917db1b8.js} +279 -279
- package/frontend/dist/index.html +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Paused teams — the in-memory index every automation path consults
|
|
3
|
+
* (specs/2026-10-04-team-pause.md).
|
|
4
|
+
*
|
|
5
|
+
* The pause itself is stored on the team (`Team.paused`, persisted in the
|
|
6
|
+
* team's config.json), so it survives restarts. This module keeps a
|
|
7
|
+
* synchronous index of it — team id → pause, and every session name a
|
|
8
|
+
* member of a paused team may run under → team — because most of the gates
|
|
9
|
+
* (the reconciler's wake rule, the queued-message wake, the dispatcher's
|
|
10
|
+
* target planning) only have a session name and must not await storage.
|
|
11
|
+
*
|
|
12
|
+
* The index is rebuilt from storage: {@link syncPausedTeams} runs on every
|
|
13
|
+
* `StorageService.getTeams()` read and at boot, and {@link notePausedTeam}
|
|
14
|
+
* on every save. A pause whose `until` has passed counts as resumed at once,
|
|
15
|
+
* before the auto-resume sweep clears it from storage.
|
|
16
|
+
*
|
|
17
|
+
* Module-level and dependency-free (types and two utils only), so the team
|
|
18
|
+
* controller, the storage service and the services can share it without
|
|
19
|
+
* import cycles.
|
|
20
|
+
*
|
|
21
|
+
* @module services/team/team-pause.registry
|
|
22
|
+
*/
|
|
23
|
+
import { deriveMemberSessionName } from '../../utils/member-session-name.utils.js';
|
|
24
|
+
const pausedTeams = new Map();
|
|
25
|
+
const teamOfSession = new Map();
|
|
26
|
+
/** Every known team (id → name, archived), for the owner's Slack commands */
|
|
27
|
+
const knownTeams = new Map();
|
|
28
|
+
/**
|
|
29
|
+
* Whether a pause is in force at `now` (set, and its `until` not reached).
|
|
30
|
+
*
|
|
31
|
+
* @param pause - The team's pause, if any
|
|
32
|
+
* @param now - Clock (ms)
|
|
33
|
+
* @returns True while paused
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* isPauseActive({ pausedAt: '…', by: 'owner', until: '2099-01-01T00:00:00Z' }) // true
|
|
37
|
+
*/
|
|
38
|
+
export function isPauseActive(pause, now = Date.now()) {
|
|
39
|
+
if (!pause || !pause.pausedAt)
|
|
40
|
+
return false;
|
|
41
|
+
if (!pause.until)
|
|
42
|
+
return true;
|
|
43
|
+
const until = Date.parse(pause.until);
|
|
44
|
+
return Number.isNaN(until) || until > now;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Whether a team object is paused now. Prefer this where the team is at
|
|
48
|
+
* hand: it reads the team itself, not the index.
|
|
49
|
+
*
|
|
50
|
+
* @param team - Team (only `paused` is read)
|
|
51
|
+
* @param now - Clock (ms)
|
|
52
|
+
* @returns True while paused
|
|
53
|
+
*/
|
|
54
|
+
export function isTeamPausedNow(team, now = Date.now()) {
|
|
55
|
+
return isPauseActive(team?.paused, now);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Every session name a member may run under: its live session, its
|
|
59
|
+
* permanent agent id, and the name the controller derives on start.
|
|
60
|
+
*
|
|
61
|
+
* @param teamName - Team display name
|
|
62
|
+
* @param member - Member
|
|
63
|
+
* @returns Distinct, non-empty session names
|
|
64
|
+
*/
|
|
65
|
+
export function memberSessionKeys(teamName, member) {
|
|
66
|
+
const keys = [member.sessionName, member.agentId, member.id ? deriveMemberSessionName(teamName, member.name, member.id) : undefined];
|
|
67
|
+
return [...new Set(keys.filter((k) => typeof k === 'string' && k.length > 0))];
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Build the index entry for a team (whether or not it is paused).
|
|
71
|
+
*
|
|
72
|
+
* @param team - Team with a pause
|
|
73
|
+
* @returns Entry
|
|
74
|
+
*/
|
|
75
|
+
function entryOf(team) {
|
|
76
|
+
const sessions = new Set();
|
|
77
|
+
for (const m of team.members ?? [])
|
|
78
|
+
for (const k of memberSessionKeys(team.name, m))
|
|
79
|
+
sessions.add(k);
|
|
80
|
+
return {
|
|
81
|
+
teamId: team.id,
|
|
82
|
+
teamName: team.name || team.id,
|
|
83
|
+
...(team.issueRepo ? { issueRepo: team.issueRepo } : {}),
|
|
84
|
+
pause: team.paused,
|
|
85
|
+
sessions: [...sessions],
|
|
86
|
+
memberNames: (team.members ?? []).map((m) => m.name).filter(Boolean),
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Remove a team from the index.
|
|
91
|
+
*
|
|
92
|
+
* @param teamId - Team
|
|
93
|
+
*/
|
|
94
|
+
function forget(teamId) {
|
|
95
|
+
const prev = pausedTeams.get(teamId);
|
|
96
|
+
if (!prev)
|
|
97
|
+
return;
|
|
98
|
+
for (const s of prev.sessions)
|
|
99
|
+
if (teamOfSession.get(s) === teamId)
|
|
100
|
+
teamOfSession.delete(s);
|
|
101
|
+
pausedTeams.delete(teamId);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Update the index for one team (after a save). A team that is not paused
|
|
105
|
+
* is removed from it.
|
|
106
|
+
*
|
|
107
|
+
* @param team - The saved team
|
|
108
|
+
*/
|
|
109
|
+
export function notePausedTeam(team) {
|
|
110
|
+
if (!team?.id)
|
|
111
|
+
return;
|
|
112
|
+
knownTeams.set(team.id, { name: team.name || team.id, archived: !!team.archived });
|
|
113
|
+
forget(team.id);
|
|
114
|
+
if (!team.paused)
|
|
115
|
+
return;
|
|
116
|
+
const entry = entryOf(team);
|
|
117
|
+
pausedTeams.set(team.id, entry);
|
|
118
|
+
for (const s of entry.sessions)
|
|
119
|
+
teamOfSession.set(s, team.id);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Forget a deleted team.
|
|
123
|
+
*
|
|
124
|
+
* @param teamId - Deleted team
|
|
125
|
+
*/
|
|
126
|
+
export function noteTeamDeleted(teamId) {
|
|
127
|
+
forget(teamId);
|
|
128
|
+
knownTeams.delete(teamId);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Every team the index has seen (id and name), archived ones excluded.
|
|
132
|
+
*
|
|
133
|
+
* @returns Teams
|
|
134
|
+
*/
|
|
135
|
+
export function listKnownTeams() {
|
|
136
|
+
return [...knownTeams.entries()].filter(([, t]) => !t.archived).map(([id, t]) => ({ id, name: t.name }));
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Rebuild the index from a full team list (a storage read, boot).
|
|
140
|
+
*
|
|
141
|
+
* @param teams - Every stored team
|
|
142
|
+
*/
|
|
143
|
+
export function syncPausedTeams(teams) {
|
|
144
|
+
pausedTeams.clear();
|
|
145
|
+
teamOfSession.clear();
|
|
146
|
+
knownTeams.clear();
|
|
147
|
+
for (const team of teams)
|
|
148
|
+
notePausedTeam(team);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* The paused team with this id, if its pause is in force.
|
|
152
|
+
*
|
|
153
|
+
* @param teamId - Team id
|
|
154
|
+
* @param now - Clock (ms)
|
|
155
|
+
* @returns Info, or null
|
|
156
|
+
*/
|
|
157
|
+
export function pausedTeamById(teamId, now = Date.now()) {
|
|
158
|
+
if (!teamId)
|
|
159
|
+
return null;
|
|
160
|
+
const entry = pausedTeams.get(teamId);
|
|
161
|
+
return entry && isPauseActive(entry.pause, now) ? entry : null;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Whether the team with this id is paused now.
|
|
165
|
+
*
|
|
166
|
+
* @param teamId - Team id
|
|
167
|
+
* @returns True while paused
|
|
168
|
+
*/
|
|
169
|
+
export function isTeamIdPaused(teamId) {
|
|
170
|
+
return pausedTeamById(teamId) !== null;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* The paused team a session belongs to, if its pause is in force.
|
|
174
|
+
*
|
|
175
|
+
* @param session - Agent session (or agent id)
|
|
176
|
+
* @param now - Clock (ms)
|
|
177
|
+
* @returns Info, or null
|
|
178
|
+
*/
|
|
179
|
+
export function pausedTeamOfSession(session, now = Date.now()) {
|
|
180
|
+
if (!session)
|
|
181
|
+
return null;
|
|
182
|
+
const teamId = teamOfSession.get(session);
|
|
183
|
+
return teamId ? pausedTeamById(teamId, now) : null;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Whether a session belongs to a paused team.
|
|
187
|
+
*
|
|
188
|
+
* @param session - Agent session (or agent id)
|
|
189
|
+
* @returns True while its team is paused
|
|
190
|
+
*
|
|
191
|
+
* @example
|
|
192
|
+
* if (isSessionPaused(wi.target)) return false; // do not dispatch
|
|
193
|
+
*/
|
|
194
|
+
export function isSessionPaused(session) {
|
|
195
|
+
return pausedTeamOfSession(session) !== null;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* The paused team named by an id, a name (case-insensitive) or a member
|
|
199
|
+
* session — whatever an agent typed.
|
|
200
|
+
*
|
|
201
|
+
* @param ref - Team id, team name, or member session
|
|
202
|
+
* @returns Info, or null
|
|
203
|
+
*/
|
|
204
|
+
export function pausedTeamByRef(ref) {
|
|
205
|
+
if (!ref)
|
|
206
|
+
return null;
|
|
207
|
+
const byId = pausedTeamById(ref) ?? pausedTeamOfSession(ref);
|
|
208
|
+
if (byId)
|
|
209
|
+
return byId;
|
|
210
|
+
const want = ref.trim().toLowerCase();
|
|
211
|
+
for (const entry of pausedTeams.values()) {
|
|
212
|
+
if (entry.teamName.toLowerCase() === want && isPauseActive(entry.pause))
|
|
213
|
+
return entry;
|
|
214
|
+
}
|
|
215
|
+
return null;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Every team paused now.
|
|
219
|
+
*
|
|
220
|
+
* @param now - Clock (ms)
|
|
221
|
+
* @returns Infos
|
|
222
|
+
*/
|
|
223
|
+
export function listPausedTeams(now = Date.now()) {
|
|
224
|
+
return [...pausedTeams.values()].filter((e) => isPauseActive(e.pause, now));
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Teams whose pause has an `until` that has passed (still stored as paused).
|
|
228
|
+
*
|
|
229
|
+
* @param now - Clock (ms)
|
|
230
|
+
* @returns Infos due for auto-resume
|
|
231
|
+
*/
|
|
232
|
+
export function listExpiredPauses(now = Date.now()) {
|
|
233
|
+
return [...pausedTeams.values()].filter((e) => !isPauseActive(e.pause, now));
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* The refusal an agent gets when it targets a paused team (English: harness
|
|
237
|
+
* text rule).
|
|
238
|
+
*
|
|
239
|
+
* @param info - The paused team
|
|
240
|
+
* @param options - `callerIsOrc`: the orchestrator asked (it tells the owner, not itself)
|
|
241
|
+
* @returns Message
|
|
242
|
+
*
|
|
243
|
+
* @example
|
|
244
|
+
* pausedRefusalMessage({ teamName: 'Crewly', issueRepo: 'stevehuang0115/crewly' })
|
|
245
|
+
* // 'Crewly is paused by the owner. File a GitHub issue instead: `gh issue create -R stevehuang0115/crewly --title "…" --body "…"`'
|
|
246
|
+
*/
|
|
247
|
+
export function pausedRefusalMessage(info, options = {}) {
|
|
248
|
+
const until = info.pause?.until ? ` until ${info.pause.until}` : '';
|
|
249
|
+
const head = `${info.teamName} is paused by the owner${until}.`;
|
|
250
|
+
if (info.issueRepo) {
|
|
251
|
+
return `${head} File a GitHub issue instead: \`gh issue create -R ${info.issueRepo} --title "<short title>" --body "<what is needed and why>"\``;
|
|
252
|
+
}
|
|
253
|
+
return options.callerIsOrc
|
|
254
|
+
? `${head} Do not hand it work or wake it. If this cannot wait until the owner resumes it, tell the owner.`
|
|
255
|
+
: `${head} Do not hand it work. Tell the orc what you need instead.`;
|
|
256
|
+
}
|
|
257
|
+
/** Clear the index (tests only). */
|
|
258
|
+
export function resetTeamPauseRegistryForTesting() {
|
|
259
|
+
pausedTeams.clear();
|
|
260
|
+
teamOfSession.clear();
|
|
261
|
+
knownTeams.clear();
|
|
262
|
+
}
|
|
263
|
+
//# sourceMappingURL=team-pause.registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-pause.registry.js","sourceRoot":"","sources":["../../../../../../backend/src/services/team/team-pause.registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pause and resume a team (specs/2026-10-04-team-pause.md).
|
|
3
|
+
*
|
|
4
|
+
* The owner pauses a team — from the dashboard, the API or a DM to the orc —
|
|
5
|
+
* when its work is handled elsewhere for a while (the Crewly product team
|
|
6
|
+
* while a separate harness session works on the harness). While paused:
|
|
7
|
+
*
|
|
8
|
+
* - its members are not started by automation (the start path refuses
|
|
9
|
+
* unless the owner asks), and automation does not route work to it;
|
|
10
|
+
* - other agents do not see it, and an agent that targets it is told to
|
|
11
|
+
* file a GitHub issue (or tell the orc) instead.
|
|
12
|
+
*
|
|
13
|
+
* Pausing stores `Team.paused`, stops the running members the way stop-team
|
|
14
|
+
* does, and unassigns work that has not started: queued WorkItems go back to
|
|
15
|
+
* the unassigned pool (the router picks a decider that is not paused), and
|
|
16
|
+
* backlog / ready tickets lose their assignee. Running work stays where it
|
|
17
|
+
* is, for the owner to see. Resuming clears the pause; an `until` time
|
|
18
|
+
* resumes the team by itself ({@link TeamPauseService.sweepExpired}).
|
|
19
|
+
*
|
|
20
|
+
* @module services/team/team-pause.service
|
|
21
|
+
*/
|
|
22
|
+
import type { Team, TeamMember } from '../../types/index.js';
|
|
23
|
+
/** A refused pause / resume (HTTP status + English message). */
|
|
24
|
+
export declare class TeamPauseError extends Error {
|
|
25
|
+
readonly status: number;
|
|
26
|
+
/**
|
|
27
|
+
* @param status - HTTP status (400 bad input, 404 unknown team)
|
|
28
|
+
* @param message - Reason
|
|
29
|
+
*/
|
|
30
|
+
constructor(status: number, message: string);
|
|
31
|
+
}
|
|
32
|
+
/** Pause options. */
|
|
33
|
+
export interface PauseTeamInput {
|
|
34
|
+
reason?: string;
|
|
35
|
+
/** ISO time (or anything `Date.parse` reads) the pause ends by itself */
|
|
36
|
+
until?: string;
|
|
37
|
+
}
|
|
38
|
+
/** What a pause did. */
|
|
39
|
+
export interface PauseTeamOutcome {
|
|
40
|
+
team: Team;
|
|
41
|
+
/** The team was already paused (reason / until updated) */
|
|
42
|
+
alreadyPaused: boolean;
|
|
43
|
+
/** Members whose running session was stopped */
|
|
44
|
+
stopped: string[];
|
|
45
|
+
/** Members whose session could not be stopped */
|
|
46
|
+
stopFailed: Array<{
|
|
47
|
+
member: string;
|
|
48
|
+
error: string;
|
|
49
|
+
}>;
|
|
50
|
+
/** Queued WorkItems unassigned */
|
|
51
|
+
releasedWorkItems: string[];
|
|
52
|
+
/** Tickets unassigned (or put back to ready) */
|
|
53
|
+
releasedTickets: string[];
|
|
54
|
+
}
|
|
55
|
+
/** What a resume did. */
|
|
56
|
+
export interface ResumeTeamOutcome {
|
|
57
|
+
team: Team;
|
|
58
|
+
/** The team was not paused */
|
|
59
|
+
wasPaused: boolean;
|
|
60
|
+
/** The pause ran out (`until`), not an owner action */
|
|
61
|
+
auto: boolean;
|
|
62
|
+
}
|
|
63
|
+
/** Collaborators. */
|
|
64
|
+
export interface TeamPauseServiceDeps {
|
|
65
|
+
storage: {
|
|
66
|
+
getTeams(): Promise<Team[]>;
|
|
67
|
+
saveTeam(team: Team): Promise<void>;
|
|
68
|
+
};
|
|
69
|
+
/** Stop one member's running session, the way stop-team does */
|
|
70
|
+
stopMember: (team: Team, member: TeamMember) => Promise<{
|
|
71
|
+
success: boolean;
|
|
72
|
+
error?: string;
|
|
73
|
+
}>;
|
|
74
|
+
/** Unassign queued (unstarted) WorkItems targeting these sessions; returns their ids */
|
|
75
|
+
releaseWorkItems?: (sessions: ReadonlySet<string>, team: Team) => Promise<string[]>;
|
|
76
|
+
/** Unassign unstarted tickets assigned to these sessions; returns `<project>/<id>` refs */
|
|
77
|
+
releaseTickets?: (sessions: ReadonlySet<string>, team: Team) => Promise<string[]>;
|
|
78
|
+
/** Tell the owner (auto-resume); best effort */
|
|
79
|
+
notifyOwner?: (text: string) => Promise<unknown>;
|
|
80
|
+
logger?: {
|
|
81
|
+
info(msg: string, meta?: Record<string, unknown>): void;
|
|
82
|
+
warn(msg: string, meta?: Record<string, unknown>): void;
|
|
83
|
+
};
|
|
84
|
+
now?: () => number;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Find a team by id, by name (case-insensitive), or by a unique name prefix.
|
|
88
|
+
*
|
|
89
|
+
* @param teams - Every team
|
|
90
|
+
* @param ref - What the owner typed
|
|
91
|
+
* @returns The team, or null
|
|
92
|
+
*/
|
|
93
|
+
export declare function findTeamByRef(teams: readonly Team[], ref: string): Team | null;
|
|
94
|
+
/**
|
|
95
|
+
* Every session name a team's members may run under.
|
|
96
|
+
*
|
|
97
|
+
* @param team - Team
|
|
98
|
+
* @returns Sessions
|
|
99
|
+
*/
|
|
100
|
+
export declare function teamSessionKeys(team: Team): Set<string>;
|
|
101
|
+
/** The team pause service. */
|
|
102
|
+
export declare class TeamPauseService {
|
|
103
|
+
private readonly deps;
|
|
104
|
+
private timer;
|
|
105
|
+
/**
|
|
106
|
+
* @param deps - Collaborators
|
|
107
|
+
*/
|
|
108
|
+
constructor(deps: TeamPauseServiceDeps);
|
|
109
|
+
/**
|
|
110
|
+
* Resolve a team reference or throw 404.
|
|
111
|
+
*
|
|
112
|
+
* @param ref - Team id or name
|
|
113
|
+
* @returns The stored team
|
|
114
|
+
*/
|
|
115
|
+
resolveTeam(ref: string): Promise<Team>;
|
|
116
|
+
/**
|
|
117
|
+
* Pause a team: store the pause, stop its running members, unassign its
|
|
118
|
+
* unstarted work. Pausing a paused team updates its reason / until.
|
|
119
|
+
*
|
|
120
|
+
* @param ref - Team id or name
|
|
121
|
+
* @param input - Reason and until
|
|
122
|
+
* @returns What was done
|
|
123
|
+
* @throws TeamPauseError on bad input or an unknown team
|
|
124
|
+
*/
|
|
125
|
+
pause(ref: string, input?: PauseTeamInput): Promise<PauseTeamOutcome>;
|
|
126
|
+
/**
|
|
127
|
+
* Resume a team. Its members are not started: they start when there is
|
|
128
|
+
* work for them or the owner starts them, as before the pause.
|
|
129
|
+
*
|
|
130
|
+
* @param ref - Team id or name
|
|
131
|
+
* @param options - `auto`: the pause ran out
|
|
132
|
+
* @returns What was done
|
|
133
|
+
* @throws TeamPauseError(404) for an unknown team
|
|
134
|
+
*/
|
|
135
|
+
resume(ref: string, options?: {
|
|
136
|
+
auto?: boolean;
|
|
137
|
+
}): Promise<ResumeTeamOutcome>;
|
|
138
|
+
/**
|
|
139
|
+
* Resume every team whose `until` has passed, and tell the owner.
|
|
140
|
+
*
|
|
141
|
+
* @returns Names of the teams resumed
|
|
142
|
+
*/
|
|
143
|
+
sweepExpired(): Promise<string[]>;
|
|
144
|
+
/** Start the auto-resume sweep (runs once now, then every minute). */
|
|
145
|
+
start(): void;
|
|
146
|
+
/** Stop the sweep. */
|
|
147
|
+
stop(): void;
|
|
148
|
+
/**
|
|
149
|
+
* Run one release step; a failure is logged, never thrown.
|
|
150
|
+
*
|
|
151
|
+
* @param what - For the log
|
|
152
|
+
* @param fn - The step
|
|
153
|
+
* @param team - Team
|
|
154
|
+
* @returns Released ids
|
|
155
|
+
*/
|
|
156
|
+
private release;
|
|
157
|
+
/** @returns Clock (ms) */
|
|
158
|
+
private now;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* The wired service.
|
|
162
|
+
*
|
|
163
|
+
* @returns Service, or null before the server wired it
|
|
164
|
+
*/
|
|
165
|
+
export declare function getTeamPauseService(): TeamPauseService | null;
|
|
166
|
+
/**
|
|
167
|
+
* Install (or clear) the service.
|
|
168
|
+
*
|
|
169
|
+
* @param service - Service, null to clear (tests)
|
|
170
|
+
*/
|
|
171
|
+
export declare function setTeamPauseService(service: TeamPauseService | null): void;
|
|
172
|
+
//# sourceMappingURL=team-pause.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-pause.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/team/team-pause.service.ts"],"names":[],"mappings":"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"}
|