crewly 1.20.250 → 1.20.251

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.
Files changed (101) hide show
  1. package/config/skills/agent/core/complete-task/SKILL.md +5 -1
  2. package/config/skills/agent/core/complete-task/execute.sh +30 -15
  3. package/config/skills/agent/core/complete-task/execute.test.sh +45 -1
  4. package/dist/backend/backend/src/constants.d.ts +49 -0
  5. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  6. package/dist/backend/backend/src/constants.js +49 -0
  7. package/dist/backend/backend/src/constants.js.map +1 -1
  8. package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
  9. package/dist/backend/backend/src/controllers/team/team.controller.js +43 -4
  10. package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
  11. package/dist/backend/backend/src/index.d.ts.map +1 -1
  12. package/dist/backend/backend/src/index.js +4 -0
  13. package/dist/backend/backend/src/index.js.map +1 -1
  14. package/dist/backend/backend/src/services/agent/agent-registration.service.js +2 -2
  15. package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
  16. package/dist/backend/backend/src/services/agent/resource-mode.service.d.ts +13 -0
  17. package/dist/backend/backend/src/services/agent/resource-mode.service.d.ts.map +1 -1
  18. package/dist/backend/backend/src/services/agent/resource-mode.service.js +36 -0
  19. package/dist/backend/backend/src/services/agent/resource-mode.service.js.map +1 -1
  20. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +24 -1
  21. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.d.ts.map +1 -1
  22. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.js +44 -1
  23. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -1
  24. package/dist/backend/backend/src/services/orchestrator/commitment-approval-guard.d.ts +48 -0
  25. package/dist/backend/backend/src/services/orchestrator/commitment-approval-guard.d.ts.map +1 -1
  26. package/dist/backend/backend/src/services/orchestrator/commitment-approval-guard.js +46 -0
  27. package/dist/backend/backend/src/services/orchestrator/commitment-approval-guard.js.map +1 -1
  28. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.d.ts +43 -1
  29. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.d.ts.map +1 -1
  30. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.js +34 -0
  31. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.js.map +1 -1
  32. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-stats.d.ts.map +1 -1
  33. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-stats.js +1 -0
  34. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-stats.js.map +1 -1
  35. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.d.ts.map +1 -1
  36. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.js +23 -7
  37. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.js.map +1 -1
  38. package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts +5 -0
  39. package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts.map +1 -1
  40. package/dist/backend/backend/src/services/reconciler/reconcile-rules.js.map +1 -1
  41. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts +18 -2
  42. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts.map +1 -1
  43. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js +67 -8
  44. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js.map +1 -1
  45. package/dist/backend/backend/src/services/reconciler/reconciler.service.d.ts +117 -3
  46. package/dist/backend/backend/src/services/reconciler/reconciler.service.d.ts.map +1 -1
  47. package/dist/backend/backend/src/services/reconciler/reconciler.service.js +304 -19
  48. package/dist/backend/backend/src/services/reconciler/reconciler.service.js.map +1 -1
  49. package/dist/backend/backend/src/services/reconciler/stalled-agent-recovery.d.ts +66 -0
  50. package/dist/backend/backend/src/services/reconciler/stalled-agent-recovery.d.ts.map +1 -0
  51. package/dist/backend/backend/src/services/reconciler/stalled-agent-recovery.js +107 -0
  52. package/dist/backend/backend/src/services/reconciler/stalled-agent-recovery.js.map +1 -0
  53. package/dist/backend/backend/src/services/trace/trace-metrics.d.ts.map +1 -1
  54. package/dist/backend/backend/src/services/trace/trace-metrics.js +2 -1
  55. package/dist/backend/backend/src/services/trace/trace-metrics.js.map +1 -1
  56. package/dist/backend/backend/src/services/trace/trace.types.d.ts +1 -1
  57. package/dist/backend/backend/src/services/trace/trace.types.d.ts.map +1 -1
  58. package/dist/backend/backend/src/services/trace/trace.types.js +2 -0
  59. package/dist/backend/backend/src/services/trace/trace.types.js.map +1 -1
  60. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts +15 -0
  61. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts.map +1 -1
  62. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js +47 -0
  63. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js.map +1 -1
  64. package/dist/backend/backend/src/types/v2/index.d.ts +1 -1
  65. package/dist/backend/backend/src/types/v2/index.d.ts.map +1 -1
  66. package/dist/backend/backend/src/types/v2/index.js.map +1 -1
  67. package/dist/backend/backend/src/types/v2/reconcile.types.d.ts +20 -0
  68. package/dist/backend/backend/src/types/v2/reconcile.types.d.ts.map +1 -1
  69. package/dist/backend/backend/src/types/v2/reconcile.types.js.map +1 -1
  70. package/dist/backend/build-info.json +2 -2
  71. package/dist/cli/backend/src/constants.d.ts +49 -0
  72. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  73. package/dist/cli/backend/src/constants.js +49 -0
  74. package/dist/cli/backend/src/constants.js.map +1 -1
  75. package/dist/cli/backend/src/services/agent/agent-registration.service.js +2 -2
  76. package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
  77. package/dist/cli/backend/src/services/agent/resource-mode.service.d.ts +13 -0
  78. package/dist/cli/backend/src/services/agent/resource-mode.service.d.ts.map +1 -1
  79. package/dist/cli/backend/src/services/agent/resource-mode.service.js +36 -0
  80. package/dist/cli/backend/src/services/agent/resource-mode.service.js.map +1 -1
  81. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +24 -1
  82. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts.map +1 -1
  83. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js +44 -1
  84. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -1
  85. package/dist/cli/backend/src/services/orchestrator/commitment-approval-guard.d.ts +48 -0
  86. package/dist/cli/backend/src/services/orchestrator/commitment-approval-guard.d.ts.map +1 -1
  87. package/dist/cli/backend/src/services/orchestrator/commitment-approval-guard.js +46 -0
  88. package/dist/cli/backend/src/services/orchestrator/commitment-approval-guard.js.map +1 -1
  89. package/dist/cli/backend/src/services/trace/trace.types.d.ts +1 -1
  90. package/dist/cli/backend/src/services/trace/trace.types.d.ts.map +1 -1
  91. package/dist/cli/backend/src/services/trace/trace.types.js +2 -0
  92. package/dist/cli/backend/src/services/trace/trace.types.js.map +1 -1
  93. package/dist/cli/backend/src/types/v2/index.d.ts +1 -1
  94. package/dist/cli/backend/src/types/v2/index.d.ts.map +1 -1
  95. package/dist/cli/backend/src/types/v2/index.js.map +1 -1
  96. package/dist/cli/backend/src/types/v2/reconcile.types.d.ts +20 -0
  97. package/dist/cli/backend/src/types/v2/reconcile.types.d.ts.map +1 -1
  98. package/dist/cli/backend/src/types/v2/reconcile.types.js.map +1 -1
  99. package/frontend/dist/assets/{index-2db17f1e.js → index-83188f0b.js} +2 -2
  100. package/frontend/dist/index.html +1 -1
  101. 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, TEAM_PAUSE_CONSTANTS } from '../../constants.js';
6
+ import { CREWLY_CONSTANTS, AGENT_TIMEOUTS, AGENT_WAKE_ERROR_CODES, TEAM_LEAD_CONSTANTS, TEAM_PAUSE_CONSTANTS, STALLED_AGENT_RECOVERY_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';
@@ -16,12 +16,13 @@ import { seedDeclaredCapabilities } from '../../services/memory/task-history-see
16
16
  import { validateAgentRole, InvalidAgentRoleError, } from '../../services/agent/agent-registration.service.js';
17
17
  import { SubAgentMessageQueue } from '../../services/messaging/sub-agent-message-queue.service.js';
18
18
  import { SUB_AGENT_QUEUE_CONSTANTS } from '../../constants.js';
19
+ import { RESOURCE_MODE_CONSTANTS } from '../../services/agent/resource-mode.service.js';
19
20
  import { LoggerService } from '../../services/core/logger.service.js';
20
21
  import { getChatV2Service } from '../../services/chat-v2/chat-v2.singleton.js';
21
22
  import { OAuthReloginMonitorService } from '../../services/agent/oauth-relogin-monitor.service.js';
22
23
  import { normalizeMemberSkills } from '../../services/ai/prompt-builder.service.js';
23
24
  import { isSafeModelId, isSafeReasoningEffort } from '../../utils/runtime-model-flags.utils.js';
24
- import { evaluateColdLaunch, isDormantTeam, isPreAuthorizedSchedule, COMMITMENT_APPROVAL_LOOKBACK_MS, } from '../../services/orchestrator/commitment-approval-guard.js';
25
+ import { evaluateColdLaunch, isDormantTeam, isHarnessParkedResume, isPreAuthorizedSchedule, COMMITMENT_APPROVAL_LOOKBACK_MS, } from '../../services/orchestrator/commitment-approval-guard.js';
25
26
  import { isOwnerDashboardRequest, readAgentSessionHeader } from '../../utils/agent-caller.utils.js';
26
27
  import { getCallerIdentity, isOwnerCaller, rejectNonOwner, sendOwnerAuthRequired } from '../../middleware/caller-identity.middleware.js';
27
28
  import { effectiveRuntimeType } from '../../services/runtime-fallback/effective-runtime.js';
@@ -692,6 +693,9 @@ async function _startTeamMemberCore(context, team, member, projectPath, options
692
693
  // Don't retry non-recoverable errors (e.g. missing CLI binary, or a
693
694
  // start-up blocked on the user such as Claude Code as root / never set up)
694
695
  if (createResult.errorCode === CLAUDE_STARTUP_CONSTANTS.BLOCKED_ERROR_CODE ||
696
+ // Waited for a slot behind the running-agent cap: retrying only waits
697
+ // again (CREW-304); the caller treats it as deferred.
698
+ createResult.errorCode === RESOURCE_MODE_CONSTANTS.START_DEFERRED_ERROR_CODE ||
695
699
  (lastError && NON_RECOVERABLE_ERROR_PATTERNS.some(p => lastError.includes(p)))) {
696
700
  logger.error('Non-recoverable error detected, skipping retries', { sessionName, lastError });
697
701
  break;
@@ -1976,7 +1980,39 @@ export async function startTeamMember(req, res) {
1976
1980
  workItemId: wakeWorkItemId,
1977
1981
  });
1978
1982
  }
1979
- if (!memberAlreadyActive && !ownerDashboardCall && isDormantTeam(team) && !scheduledPreAuthorized) {
1983
+ // A team the harness parked (idle stop, slot freed, update) is resumed by
1984
+ // the reconciler's wake for its own queued work, not cold-launched
1985
+ // (CREW-303/304: CE sat 4h35m behind this gate on 2026-10-06).
1986
+ let harnessParkedResume = false;
1987
+ if (!memberAlreadyActive && !ownerDashboardCall && !scheduledPreAuthorized && wakeWorkItemId && isDormantTeam(team)) {
1988
+ try {
1989
+ const { TaskPoolService } = await import('../../services/task-pool/task-pool.service.js');
1990
+ const wakeItem = await TaskPoolService.getInstance().findWorkItem(wakeWorkItemId);
1991
+ harnessParkedResume = isHarnessParkedResume({
1992
+ team,
1993
+ sessionName: member.sessionName,
1994
+ workItem: wakeItem,
1995
+ now: Date.now(),
1996
+ parkReasons: STALLED_AGENT_RECOVERY_CONSTANTS.HARNESS_PARK_REASONS,
1997
+ windowMs: STALLED_AGENT_RECOVERY_CONSTANTS.PARKED_RESUME_WINDOW_MS,
1998
+ });
1999
+ }
2000
+ catch (err) {
2001
+ logger.warn('Commitment gate: could not read the wake WorkItem — treating as a cold launch', {
2002
+ workItemId: wakeWorkItemId,
2003
+ error: err instanceof Error ? err.message : String(err),
2004
+ });
2005
+ }
2006
+ if (harnessParkedResume) {
2007
+ logger.info('Commitment gate: resuming a team the harness parked (its own queued work)', {
2008
+ teamId,
2009
+ memberId,
2010
+ sessionName: member.sessionName,
2011
+ workItemId: wakeWorkItemId,
2012
+ });
2013
+ }
2014
+ }
2015
+ if (!memberAlreadyActive && !ownerDashboardCall && isDormantTeam(team) && !scheduledPreAuthorized && !harnessParkedResume) {
1980
2016
  let ownerMessages = [];
1981
2017
  let readOk = true;
1982
2018
  try {
@@ -2100,7 +2136,10 @@ export async function startTeamMember(req, res) {
2100
2136
  else {
2101
2137
  res.status(500).json({
2102
2138
  success: false,
2103
- error: result.error || 'Failed to start team member'
2139
+ error: result.error || 'Failed to start team member',
2140
+ // Lets the reconciler tell a deferred start (RESOURCE_PRESSURE_CAP)
2141
+ // from a broken one (CREW-304).
2142
+ ...(result.errorCode ? { code: result.errorCode } : {}),
2104
2143
  });
2105
2144
  }
2106
2145
  }