crewly 1.20.210 → 1.20.212
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/app-data/SKILL.md +30 -1
- package/config/skills/agent/core/publish-app/SKILL.md +73 -6
- package/config/skills/agent/core/publish-app/execute.sh +125 -4
- package/config/skills/agent/core/publish-app/execute.test.sh +95 -4
- 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 +78 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +78 -0
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/apps/apps.controller.d.ts +17 -1
- package/dist/backend/backend/src/controllers/apps/apps.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/apps/apps.controller.js +45 -8
- package/dist/backend/backend/src/controllers/apps/apps.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/apps/apps.routes.d.ts +7 -0
- package/dist/backend/backend/src/controllers/apps/apps.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/apps/apps.routes.js +15 -1
- package/dist/backend/backend/src/controllers/apps/apps.routes.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/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js +3 -2
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
- package/dist/backend/backend/src/services/apps/app-open-link.d.ts +61 -0
- package/dist/backend/backend/src/services/apps/app-open-link.d.ts.map +1 -0
- package/dist/backend/backend/src/services/apps/app-open-link.js +112 -0
- package/dist/backend/backend/src/services/apps/app-open-link.js.map +1 -0
- package/dist/backend/backend/src/services/apps/app-wake-message.d.ts +44 -3
- package/dist/backend/backend/src/services/apps/app-wake-message.d.ts.map +1 -1
- package/dist/backend/backend/src/services/apps/app-wake-message.js +99 -7
- package/dist/backend/backend/src/services/apps/app-wake-message.js.map +1 -1
- package/dist/backend/backend/src/services/apps/app-wake.service.d.ts +29 -2
- package/dist/backend/backend/src/services/apps/app-wake.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/apps/app-wake.service.js +151 -21
- package/dist/backend/backend/src/services/apps/app-wake.service.js.map +1 -1
- package/dist/backend/backend/src/services/apps/apps-registry.service.d.ts +18 -0
- package/dist/backend/backend/src/services/apps/apps-registry.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/apps/apps-registry.service.js +14 -0
- package/dist/backend/backend/src/services/apps/apps-registry.service.js.map +1 -1
- package/dist/backend/backend/src/services/apps/apps.service.d.ts +261 -12
- package/dist/backend/backend/src/services/apps/apps.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/apps/apps.service.js +387 -30
- package/dist/backend/backend/src/services/apps/apps.service.js.map +1 -1
- package/dist/backend/backend/src/services/apps/apps.wiring.d.ts +15 -1
- package/dist/backend/backend/src/services/apps/apps.wiring.d.ts.map +1 -1
- package/dist/backend/backend/src/services/apps/apps.wiring.js +27 -7
- package/dist/backend/backend/src/services/apps/apps.wiring.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 +17 -5
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
- package/dist/backend/backend/src/services/core/logger.service.d.ts +5 -0
- package/dist/backend/backend/src/services/core/logger.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/core/logger.service.js +8 -0
- package/dist/backend/backend/src/services/core/logger.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.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +19 -0
- 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/slack/slack-thread-context.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-thread-context.service.js +3 -1
- package/dist/backend/backend/src/services/slack/slack-thread-context.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 +78 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +78 -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/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js +3 -2
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
- package/dist/cli/backend/src/services/apps/app-open-link.d.ts +61 -0
- package/dist/cli/backend/src/services/apps/app-open-link.d.ts.map +1 -0
- package/dist/cli/backend/src/services/apps/app-open-link.js +112 -0
- package/dist/cli/backend/src/services/apps/app-open-link.js.map +1 -0
- 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 +17 -5
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
- package/dist/cli/backend/src/services/core/logger.service.d.ts +5 -0
- package/dist/cli/backend/src/services/core/logger.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/core/logger.service.js +8 -0
- package/dist/cli/backend/src/services/core/logger.service.js.map +1 -1
- 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.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js +19 -0
- 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/slack/slack-thread-context.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-thread-context.service.js +3 -1
- package/dist/cli/backend/src/services/slack/slack-thread-context.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
|
@@ -3,7 +3,7 @@ import { isPersonId } from '../../services/people/people-directory.service.js';
|
|
|
3
3
|
import { canMemberDelegate, getTeamLeadIds, isLeadRole, setTeamLead } from '../../utils/team.utils.js';
|
|
4
4
|
import { v4 as uuidv4 } from 'uuid';
|
|
5
5
|
import { ORCHESTRATOR_SESSION_NAME, ORCHESTRATOR_ROLE, RUNTIME_TYPES, NON_RECOVERABLE_ERROR_PATTERNS, CLAUDE_STARTUP_CONSTANTS, RUNTIME_STARTUP_CONSTANTS, } from '../../constants.js';
|
|
6
|
-
import { CREWLY_CONSTANTS, AGENT_TIMEOUTS, AGENT_WAKE_ERROR_CODES, TEAM_LEAD_CONSTANTS } from '../../constants.js';
|
|
6
|
+
import { CREWLY_CONSTANTS, AGENT_TIMEOUTS, AGENT_WAKE_ERROR_CODES, TEAM_LEAD_CONSTANTS, TEAM_PAUSE_CONSTANTS } from '../../constants.js';
|
|
7
7
|
import { updateAgentHeartbeat } from '../../services/agent/agent-heartbeat.service.js';
|
|
8
8
|
import { getSessionBackendSync, getSessionStatePersistence } from '../../services/session/index.js';
|
|
9
9
|
import { removeCrewlyAgentFile } from '../../services/session/session-binding.js';
|
|
@@ -27,6 +27,7 @@ import { getCallerIdentity, isOwnerCaller, rejectNonOwner, sendOwnerAuthRequired
|
|
|
27
27
|
import { effectiveRuntimeType } from '../../services/runtime-fallback/effective-runtime.js';
|
|
28
28
|
import { getRuntimeFallbackService } from '../../services/runtime-fallback/runtime-fallback.service.js';
|
|
29
29
|
import { clearOwnerStopped, markOwnerStopped } from '../../services/agent/owner-stopped.registry.js';
|
|
30
|
+
import { isTeamPausedNow, pausedRefusalMessage } from '../../services/team/team-pause.registry.js';
|
|
30
31
|
const logger = LoggerService.getInstance().createComponentLogger('TeamController');
|
|
31
32
|
/**
|
|
32
33
|
* Module-level EventBusService instance, injected at startup.
|
|
@@ -467,7 +468,28 @@ export async function activateAgentBySession(context, sessionName) {
|
|
|
467
468
|
* @param projectPath - Optional project path for the session
|
|
468
469
|
* @returns Result of the start operation
|
|
469
470
|
*/
|
|
470
|
-
async function _startTeamMemberCore(context, team, member, projectPath) {
|
|
471
|
+
async function _startTeamMemberCore(context, team, member, projectPath, options = {}) {
|
|
472
|
+
// A paused team's members are started only by the owner
|
|
473
|
+
// (specs/2026-10-04-team-pause.md). Every automated start — the queued-
|
|
474
|
+
// message wake, the owner-message watchdog, activate-on-send, a skill —
|
|
475
|
+
// comes through here without `ownerStart` and is refused.
|
|
476
|
+
if (!options.ownerStart && isTeamPausedNow(team)) {
|
|
477
|
+
logger.info('Not starting a member of a paused team (only the owner can)', {
|
|
478
|
+
teamId: team.id,
|
|
479
|
+
team: team.name,
|
|
480
|
+
member: member.name,
|
|
481
|
+
sessionName: member.sessionName || undefined,
|
|
482
|
+
});
|
|
483
|
+
return {
|
|
484
|
+
success: false,
|
|
485
|
+
memberName: member.name,
|
|
486
|
+
memberId: member.id,
|
|
487
|
+
sessionName: member.sessionName || null,
|
|
488
|
+
status: 'failed',
|
|
489
|
+
error: `${team.name} is paused by the owner; only the owner can start its members.`,
|
|
490
|
+
errorCode: TEAM_PAUSE_CONSTANTS.ERROR_CODE,
|
|
491
|
+
};
|
|
492
|
+
}
|
|
471
493
|
try {
|
|
472
494
|
// Guard against members with no role — without this, undefined flows into
|
|
473
495
|
// session creation, gets stringified to "undefined" in CREWLY_ROLE, and
|
|
@@ -906,6 +928,19 @@ async function _stopTeamMemberCore(context, team, member) {
|
|
|
906
928
|
};
|
|
907
929
|
}
|
|
908
930
|
}
|
|
931
|
+
/**
|
|
932
|
+
* Stop one member the way stop-team does (owner-stopped mark, terminate,
|
|
933
|
+
* status inactive). Used by the team pause (specs/2026-10-04-team-pause.md).
|
|
934
|
+
*
|
|
935
|
+
* @param context - API context
|
|
936
|
+
* @param team - The member's team (saved with the member's new status)
|
|
937
|
+
* @param member - Member to stop
|
|
938
|
+
* @returns `{ success, error? }`
|
|
939
|
+
*/
|
|
940
|
+
export async function stopTeamMemberGracefully(context, team, member) {
|
|
941
|
+
const result = await _stopTeamMemberCore(context, team, member);
|
|
942
|
+
return { success: result.success, ...(result.error ? { error: result.error } : {}) };
|
|
943
|
+
}
|
|
909
944
|
// Orchestrator reads agent status on-demand; no push subscriptions.
|
|
910
945
|
export async function createTeam(req, res) {
|
|
911
946
|
try {
|
|
@@ -1114,9 +1149,12 @@ export async function getTeams(req, res) {
|
|
|
1114
1149
|
// Non-fatal: fall back to teams.json workingStatus values
|
|
1115
1150
|
workingStatusData = null;
|
|
1116
1151
|
}
|
|
1117
|
-
// Also update status for team members based on actual session existence
|
|
1152
|
+
// Also update status for team members based on actual session existence.
|
|
1153
|
+
// `pausedNow` / `pauseLabel`: the owner's pause is in force (an expired
|
|
1154
|
+
// `paused` waits for the auto-resume sweep) — specs/2026-10-04-team-pause.md.
|
|
1118
1155
|
const teamsWithActualStatus = teams.map(team => ({
|
|
1119
1156
|
...team,
|
|
1157
|
+
...(isTeamPausedNow(team) ? { pausedNow: true, pauseLabel: TEAM_PAUSE_CONSTANTS.ORC_STATUS_LABEL } : {}),
|
|
1120
1158
|
members: team.members.map(member => {
|
|
1121
1159
|
const memberSessionExists = backend?.sessionExists(member.sessionName) || false;
|
|
1122
1160
|
const isInProcessActive = this.agentRegistrationService.isInProcessRuntimeActive(member.sessionName);
|
|
@@ -1241,6 +1279,16 @@ export async function startTeam(req, res) {
|
|
|
1241
1279
|
res.status(404).json({ success: false, error: 'Team not found' });
|
|
1242
1280
|
return;
|
|
1243
1281
|
}
|
|
1282
|
+
// A paused team is started by the owner only (specs/2026-10-04-team-pause.md).
|
|
1283
|
+
const ownerStart = isOwnerDashboardRequest(req);
|
|
1284
|
+
if (!ownerStart && isTeamPausedNow(team)) {
|
|
1285
|
+
res.status(409).json({
|
|
1286
|
+
success: false,
|
|
1287
|
+
error: pausedRefusalMessage({ teamName: team.name, issueRepo: team.issueRepo, pause: team.paused }, { callerIsOrc: readAgentSessionHeader(req) === ORCHESTRATOR_SESSION_NAME }),
|
|
1288
|
+
code: TEAM_PAUSE_CONSTANTS.ERROR_CODE,
|
|
1289
|
+
});
|
|
1290
|
+
return;
|
|
1291
|
+
}
|
|
1244
1292
|
const projects = await this.storageService.getProjects();
|
|
1245
1293
|
let targetProjectId = projectId || team.projectIds[0];
|
|
1246
1294
|
if (!targetProjectId) {
|
|
@@ -1300,7 +1348,7 @@ export async function startTeam(req, res) {
|
|
|
1300
1348
|
}
|
|
1301
1349
|
// Session doesn't exist despite active status — fall through to start it
|
|
1302
1350
|
}
|
|
1303
|
-
const result = await _startTeamMemberCore(this, team, member, assignedProject.path);
|
|
1351
|
+
const result = await _startTeamMemberCore(this, team, member, assignedProject.path, { ownerStart });
|
|
1304
1352
|
// Convert internal result to the expected format for the response
|
|
1305
1353
|
const resultForResponse = {
|
|
1306
1354
|
memberName: result.memberName,
|
|
@@ -1854,6 +1902,15 @@ export async function startTeamMember(req, res) {
|
|
|
1854
1902
|
// — see isOwnerDashboardRequest for why a missing `X-Agent-Session`
|
|
1855
1903
|
// alone is not enough.
|
|
1856
1904
|
const ownerDashboardCall = isOwnerDashboardRequest(req);
|
|
1905
|
+
// A paused team is started by the owner only (specs/2026-10-04-team-pause.md).
|
|
1906
|
+
if (!ownerDashboardCall && isTeamPausedNow(team)) {
|
|
1907
|
+
res.status(409).json({
|
|
1908
|
+
success: false,
|
|
1909
|
+
error: pausedRefusalMessage({ teamName: team.name, issueRepo: team.issueRepo, pause: team.paused }, { callerIsOrc: readAgentSessionHeader(req) === ORCHESTRATOR_SESSION_NAME }),
|
|
1910
|
+
code: TEAM_PAUSE_CONSTANTS.ERROR_CODE,
|
|
1911
|
+
});
|
|
1912
|
+
return;
|
|
1913
|
+
}
|
|
1857
1914
|
if (ownerDashboardCall && !memberAlreadyActive) {
|
|
1858
1915
|
logger.info('startTeamMember: owner dashboard request — wake and commitment gates do not apply', {
|
|
1859
1916
|
teamId,
|
|
@@ -1992,7 +2049,7 @@ export async function startTeamMember(req, res) {
|
|
|
1992
2049
|
projectPath = project?.path;
|
|
1993
2050
|
}
|
|
1994
2051
|
// Use the internal helper function to start the team member
|
|
1995
|
-
const result = await _startTeamMemberCore(this, team, member, projectPath);
|
|
2052
|
+
const result = await _startTeamMemberCore(this, team, member, projectPath, { ownerStart: ownerDashboardCall });
|
|
1996
2053
|
// Handle the result and respond appropriately
|
|
1997
2054
|
if (result.success) {
|
|
1998
2055
|
if (result.status === 'synchronized') {
|
|
@@ -2944,6 +3001,22 @@ export async function updateTeam(req, res) {
|
|
|
2944
3001
|
team.archived = updates.archived;
|
|
2945
3002
|
team.archivedAt = updates.archived ? new Date().toISOString() : undefined;
|
|
2946
3003
|
}
|
|
3004
|
+
// Where other agents file work while the team is paused (owner only;
|
|
3005
|
+
// specs/2026-10-04-team-pause.md).
|
|
3006
|
+
const requestedRepo = updates.issueRepo === undefined ? undefined : typeof updates.issueRepo === 'string' ? updates.issueRepo.trim() : '';
|
|
3007
|
+
if (requestedRepo !== undefined && requestedRepo !== (team.issueRepo ?? '')) {
|
|
3008
|
+
if (rejectNonOwner(req, res, { success: false, error: 'Only the owner can set a team\'s issue repo' }))
|
|
3009
|
+
return;
|
|
3010
|
+
const repo = requestedRepo;
|
|
3011
|
+
if (repo && !TEAM_PAUSE_CONSTANTS.ISSUE_REPO_PATTERN.test(repo)) {
|
|
3012
|
+
res.status(400).json({ success: false, error: 'issueRepo must look like owner/name (e.g. stevehuang0115/crewly)' });
|
|
3013
|
+
return;
|
|
3014
|
+
}
|
|
3015
|
+
if (repo)
|
|
3016
|
+
team.issueRepo = repo;
|
|
3017
|
+
else
|
|
3018
|
+
delete team.issueRepo;
|
|
3019
|
+
}
|
|
2947
3020
|
// #173: Handle org chart fields
|
|
2948
3021
|
if (updates.mission !== undefined) {
|
|
2949
3022
|
team.mission = updates.mission;
|