crewly 1.20.176 → 1.20.177

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 (161) hide show
  1. package/config/skills/orchestrator/update-team-member/SKILL.md +1 -1
  2. package/dist/backend/backend/src/constants.d.ts +58 -3
  3. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  4. package/dist/backend/backend/src/constants.js +72 -3
  5. package/dist/backend/backend/src/constants.js.map +1 -1
  6. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts.map +1 -1
  7. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js +2 -1
  8. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js.map +1 -1
  9. package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.d.ts +30 -0
  10. package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.d.ts.map +1 -0
  11. package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.js +100 -0
  12. package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.js.map +1 -0
  13. package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
  14. package/dist/backend/backend/src/controllers/team/team.controller.js +33 -4
  15. package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
  16. package/dist/backend/backend/src/index.d.ts.map +1 -1
  17. package/dist/backend/backend/src/index.js +25 -0
  18. package/dist/backend/backend/src/index.js.map +1 -1
  19. package/dist/backend/backend/src/routes/modules/system.routes.d.ts.map +1 -1
  20. package/dist/backend/backend/src/routes/modules/system.routes.js +3 -0
  21. package/dist/backend/backend/src/routes/modules/system.routes.js.map +1 -1
  22. package/dist/backend/backend/src/services/agent/agent-heartbeat-monitor.service.d.ts.map +1 -1
  23. package/dist/backend/backend/src/services/agent/agent-heartbeat-monitor.service.js +6 -0
  24. package/dist/backend/backend/src/services/agent/agent-heartbeat-monitor.service.js.map +1 -1
  25. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +10 -1
  26. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  27. package/dist/backend/backend/src/services/agent/agent-registration.service.js +103 -7
  28. package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
  29. package/dist/backend/backend/src/services/agent/antigravity-runtime.service.d.ts +1 -1
  30. package/dist/backend/backend/src/services/agent/antigravity-runtime.service.d.ts.map +1 -1
  31. package/dist/backend/backend/src/services/agent/antigravity-runtime.service.js +3 -2
  32. package/dist/backend/backend/src/services/agent/antigravity-runtime.service.js.map +1 -1
  33. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts +7 -0
  34. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts.map +1 -1
  35. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js +16 -0
  36. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js.map +1 -1
  37. package/dist/backend/backend/src/services/agent/idle-detection.service.d.ts.map +1 -1
  38. package/dist/backend/backend/src/services/agent/idle-detection.service.js +2 -1
  39. package/dist/backend/backend/src/services/agent/idle-detection.service.js.map +1 -1
  40. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -1
  41. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.js +7 -0
  42. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.js.map +1 -1
  43. package/dist/backend/backend/src/services/agent/tmux.service.d.ts.map +1 -1
  44. package/dist/backend/backend/src/services/agent/tmux.service.js +2 -1
  45. package/dist/backend/backend/src/services/agent/tmux.service.js.map +1 -1
  46. package/dist/backend/backend/src/services/harness/harness-status.service.d.ts +17 -0
  47. package/dist/backend/backend/src/services/harness/harness-status.service.d.ts.map +1 -1
  48. package/dist/backend/backend/src/services/harness/harness-status.service.js +25 -1
  49. package/dist/backend/backend/src/services/harness/harness-status.service.js.map +1 -1
  50. package/dist/backend/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -1
  51. package/dist/backend/backend/src/services/messaging/queue-processor.service.js +2 -1
  52. package/dist/backend/backend/src/services/messaging/queue-processor.service.js.map +1 -1
  53. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.d.ts.map +1 -1
  54. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js +3 -2
  55. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js.map +1 -1
  56. package/dist/backend/backend/src/services/orchestrator/orchestrator-status.service.d.ts.map +1 -1
  57. package/dist/backend/backend/src/services/orchestrator/orchestrator-status.service.js +3 -2
  58. package/dist/backend/backend/src/services/orchestrator/orchestrator-status.service.js.map +1 -1
  59. package/dist/backend/backend/src/services/runtime-fallback/effective-runtime.d.ts +100 -0
  60. package/dist/backend/backend/src/services/runtime-fallback/effective-runtime.d.ts.map +1 -0
  61. package/dist/backend/backend/src/services/runtime-fallback/effective-runtime.js +115 -0
  62. package/dist/backend/backend/src/services/runtime-fallback/effective-runtime.js.map +1 -0
  63. package/dist/backend/backend/src/services/runtime-fallback/reset-time.d.ts +66 -0
  64. package/dist/backend/backend/src/services/runtime-fallback/reset-time.d.ts.map +1 -0
  65. package/dist/backend/backend/src/services/runtime-fallback/reset-time.js +211 -0
  66. package/dist/backend/backend/src/services/runtime-fallback/reset-time.js.map +1 -0
  67. package/dist/backend/backend/src/services/runtime-fallback/runtime-availability.d.ts +39 -0
  68. package/dist/backend/backend/src/services/runtime-fallback/runtime-availability.d.ts.map +1 -0
  69. package/dist/backend/backend/src/services/runtime-fallback/runtime-availability.js +56 -0
  70. package/dist/backend/backend/src/services/runtime-fallback/runtime-availability.js.map +1 -0
  71. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.d.ts +377 -0
  72. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.d.ts.map +1 -0
  73. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.js +867 -0
  74. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.js.map +1 -0
  75. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.store.d.ts +53 -0
  76. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.store.d.ts.map +1 -0
  77. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.store.js +107 -0
  78. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.store.js.map +1 -0
  79. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.types.d.ts +126 -0
  80. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.types.d.ts.map +1 -0
  81. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.types.js +152 -0
  82. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.types.js.map +1 -0
  83. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.d.ts +82 -0
  84. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.d.ts.map +1 -0
  85. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.js +219 -0
  86. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.js.map +1 -0
  87. package/dist/backend/backend/src/services/runtime-fallback/runtime-smoke-test.service.d.ts +203 -0
  88. package/dist/backend/backend/src/services/runtime-fallback/runtime-smoke-test.service.d.ts.map +1 -0
  89. package/dist/backend/backend/src/services/runtime-fallback/runtime-smoke-test.service.js +419 -0
  90. package/dist/backend/backend/src/services/runtime-fallback/runtime-smoke-test.service.js.map +1 -0
  91. package/dist/backend/backend/src/services/runtime-fallback/runtime-usage-probe.d.ts +54 -0
  92. package/dist/backend/backend/src/services/runtime-fallback/runtime-usage-probe.d.ts.map +1 -0
  93. package/dist/backend/backend/src/services/runtime-fallback/runtime-usage-probe.js +80 -0
  94. package/dist/backend/backend/src/services/runtime-fallback/runtime-usage-probe.js.map +1 -0
  95. package/dist/backend/backend/src/services/runtime-fallback/usage-limit-rules.d.ts +99 -0
  96. package/dist/backend/backend/src/services/runtime-fallback/usage-limit-rules.d.ts.map +1 -0
  97. package/dist/backend/backend/src/services/runtime-fallback/usage-limit-rules.js +240 -0
  98. package/dist/backend/backend/src/services/runtime-fallback/usage-limit-rules.js.map +1 -0
  99. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +8 -0
  100. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  101. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +16 -2
  102. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  103. package/dist/backend/backend/src/services/workflow/message-scheduler.service.d.ts.map +1 -1
  104. package/dist/backend/backend/src/services/workflow/message-scheduler.service.js +3 -2
  105. package/dist/backend/backend/src/services/workflow/message-scheduler.service.js.map +1 -1
  106. package/dist/backend/backend/src/services/workflow/scheduler.service.d.ts.map +1 -1
  107. package/dist/backend/backend/src/services/workflow/scheduler.service.js +3 -2
  108. package/dist/backend/backend/src/services/workflow/scheduler.service.js.map +1 -1
  109. package/dist/backend/backend/src/types/index.d.ts +14 -0
  110. package/dist/backend/backend/src/types/index.d.ts.map +1 -1
  111. package/dist/backend/backend/src/types/index.js.map +1 -1
  112. package/dist/backend/build-info.json +2 -2
  113. package/dist/cli/backend/src/constants.d.ts +58 -3
  114. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  115. package/dist/cli/backend/src/constants.js +72 -3
  116. package/dist/cli/backend/src/constants.js.map +1 -1
  117. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts +10 -1
  118. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  119. package/dist/cli/backend/src/services/agent/agent-registration.service.js +103 -7
  120. package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
  121. package/dist/cli/backend/src/services/agent/antigravity-runtime.service.d.ts +1 -1
  122. package/dist/cli/backend/src/services/agent/antigravity-runtime.service.d.ts.map +1 -1
  123. package/dist/cli/backend/src/services/agent/antigravity-runtime.service.js +3 -2
  124. package/dist/cli/backend/src/services/agent/antigravity-runtime.service.js.map +1 -1
  125. package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts +7 -0
  126. package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts.map +1 -1
  127. package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js +16 -0
  128. package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js.map +1 -1
  129. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -1
  130. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.js +7 -0
  131. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.js.map +1 -1
  132. package/dist/cli/backend/src/services/harness/harness-status.service.d.ts +17 -0
  133. package/dist/cli/backend/src/services/harness/harness-status.service.d.ts.map +1 -1
  134. package/dist/cli/backend/src/services/harness/harness-status.service.js +25 -1
  135. package/dist/cli/backend/src/services/harness/harness-status.service.js.map +1 -1
  136. package/dist/cli/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -1
  137. package/dist/cli/backend/src/services/messaging/queue-processor.service.js +2 -1
  138. package/dist/cli/backend/src/services/messaging/queue-processor.service.js.map +1 -1
  139. package/dist/cli/backend/src/services/monitoring/activity-monitor.service.d.ts.map +1 -1
  140. package/dist/cli/backend/src/services/monitoring/activity-monitor.service.js +3 -2
  141. package/dist/cli/backend/src/services/monitoring/activity-monitor.service.js.map +1 -1
  142. package/dist/cli/backend/src/services/orchestrator/orchestrator-status.service.d.ts.map +1 -1
  143. package/dist/cli/backend/src/services/orchestrator/orchestrator-status.service.js +3 -2
  144. package/dist/cli/backend/src/services/orchestrator/orchestrator-status.service.js.map +1 -1
  145. package/dist/cli/backend/src/services/runtime-fallback/effective-runtime.d.ts +100 -0
  146. package/dist/cli/backend/src/services/runtime-fallback/effective-runtime.d.ts.map +1 -0
  147. package/dist/cli/backend/src/services/runtime-fallback/effective-runtime.js +115 -0
  148. package/dist/cli/backend/src/services/runtime-fallback/effective-runtime.js.map +1 -0
  149. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +8 -0
  150. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  151. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +16 -2
  152. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  153. package/dist/cli/backend/src/types/index.d.ts +14 -0
  154. package/dist/cli/backend/src/types/index.d.ts.map +1 -1
  155. package/dist/cli/backend/src/types/index.js.map +1 -1
  156. package/dist/cli/cli/src/utils/runtime-auth.d.ts +1 -1
  157. package/dist/cli/cli/src/utils/runtime-auth.js +1 -1
  158. package/frontend/dist/assets/{index-0726afab.js → index-69af46c3.js} +275 -275
  159. package/frontend/dist/assets/{index-0c5449b5.css → index-cdc52122.css} +1 -1
  160. package/frontend/dist/index.html +2 -2
  161. package/package.json +1 -1
@@ -0,0 +1,219 @@
1
+ /**
2
+ * Runtime fallback — the real dependencies, bound to the running backend.
3
+ *
4
+ * Kept apart from the coordinator so the coordinator stays testable with
5
+ * fakes; heavy services are imported lazily so importing this module from
6
+ * index.ts adds no import cycles.
7
+ *
8
+ * @module services/runtime-fallback/runtime-fallback.wiring
9
+ */
10
+ import * as fs from 'fs';
11
+ import * as path from 'path';
12
+ import { ORC_CONVERSATION_CONSTANTS, ORCHESTRATOR_SESSION_NAME, RUNTIME_FALLBACK_CONSTANTS, RUNTIME_TYPES } from '../../constants.js';
13
+ import { buildHandoverSummary, claudeTranscriptPath } from '../agent/runtime-session-recovery.js';
14
+ import { setRuntimeFallbackHooks } from './effective-runtime.js';
15
+ import { computeRuntimeAvailability } from './runtime-availability.js';
16
+ import { FileRuntimeFallbackStore } from './runtime-fallback.store.js';
17
+ import { RuntimeFallbackService, setRuntimeFallbackService, } from './runtime-fallback.service.js';
18
+ import { runtimeLabel } from './runtime-fallback.types.js';
19
+ import { createRuntimeUsageProbe } from './runtime-usage-probe.js';
20
+ /** Crewly Agent model provider → settings API key provider. */
21
+ const KEY_PROVIDER = {
22
+ deepseek: 'deepseek',
23
+ google: 'gemini',
24
+ anthropic: 'anthropic',
25
+ openai: 'openai',
26
+ };
27
+ /**
28
+ * Write a handover file for a runtime change.
29
+ *
30
+ * @param crewlyHome - CREWLY_HOME
31
+ * @param req - What changes
32
+ * @param cwd - The agent's working directory (Claude transcripts are keyed on it)
33
+ * @param now - Clock
34
+ * @returns The file path
35
+ */
36
+ export function writeRuntimeHandover(crewlyHome, req, cwd, now = new Date()) {
37
+ const dir = path.join(crewlyHome, ORC_CONVERSATION_CONSTANTS.HANDOVER_DIR);
38
+ fs.mkdirSync(dir, { recursive: true });
39
+ const file = path.join(dir, `${req.sessionName}-runtime-${req.direction}-${now.toISOString().replace(/[:.]/g, '-')}.md`);
40
+ let summary = '';
41
+ if (req.from === RUNTIME_TYPES.CLAUDE_CODE && req.conversationId && cwd) {
42
+ summary = buildHandoverSummary(claudeTranscriptPath({ sessionId: req.conversationId, cwd }));
43
+ }
44
+ const why = req.direction === 'switch'
45
+ ? `You were running on ${runtimeLabel(req.from)}. It ran out of usage, so Crewly moved you to ${runtimeLabel(req.to)} until it resets.`
46
+ : `You ran on ${runtimeLabel(req.from)} while ${runtimeLabel(req.to)} was out of usage. ${runtimeLabel(req.to)} is back, so Crewly moved you back.`;
47
+ fs.writeFileSync(file, [
48
+ '# Handover: runtime change',
49
+ '',
50
+ why,
51
+ 'Everything Crewly tracks — tasks, teams, OKRs, wiki — is still there; this file keeps only the end of what was said before.',
52
+ ...(req.workItem ? ['', `You were on WorkItem ${req.workItem.id} ("${req.workItem.title}"). Continue it.`] : []),
53
+ '',
54
+ summary || `_The ${runtimeLabel(req.from)} conversation is not readable here; check your WorkItems and wiki for where you were._`,
55
+ '',
56
+ ].join('\n'), 'utf-8');
57
+ return file;
58
+ }
59
+ /**
60
+ * Build the backend's runtime-fallback service, register its hooks and the
61
+ * instance, and start its tick.
62
+ *
63
+ * @param ctx - Backend context
64
+ * @returns The running service
65
+ */
66
+ export function startBackendRuntimeFallback(ctx) {
67
+ const probe = createRuntimeUsageProbe();
68
+ const findMember = async (sessionName) => {
69
+ for (const team of await ctx.storage.getTeams()) {
70
+ const member = team.members.find((m) => m.sessionName === sessionName);
71
+ if (member)
72
+ return { team, member };
73
+ }
74
+ return null;
75
+ };
76
+ const persistence = async () => {
77
+ const { getSessionStatePersistence } = await import('../session/session-state-persistence.js');
78
+ return getSessionStatePersistence();
79
+ };
80
+ let persistenceSync = null;
81
+ void persistence()
82
+ .then((p) => {
83
+ persistenceSync = p;
84
+ })
85
+ .catch(() => undefined);
86
+ const getAgent = async (sessionName) => {
87
+ if (sessionName === ORCHESTRATOR_SESSION_NAME) {
88
+ const status = await ctx.storage.getOrchestratorStatus().catch(() => null);
89
+ return { sessionName, name: 'Orc', primary: status?.runtimeType ?? RUNTIME_TYPES.CLAUDE_CODE, isOrchestrator: true };
90
+ }
91
+ const found = await findMember(sessionName);
92
+ if (!found)
93
+ return null;
94
+ return {
95
+ sessionName,
96
+ name: found.member.name,
97
+ primary: found.member.runtimeType ?? RUNTIME_TYPES.CLAUDE_CODE,
98
+ memberId: found.member.id,
99
+ teamId: found.team.id,
100
+ isOrchestrator: false,
101
+ };
102
+ };
103
+ const service = new RuntimeFallbackService({
104
+ store: new FileRuntimeFallbackStore(path.join(ctx.crewlyHome, RUNTIME_FALLBACK_CONSTANTS.STATE_FILE)),
105
+ getAgent,
106
+ countAgentsOnRuntime: async (runtime) => {
107
+ let n = 0;
108
+ const orc = await ctx.storage.getOrchestratorStatus().catch(() => null);
109
+ if ((orc?.runtimeType ?? RUNTIME_TYPES.CLAUDE_CODE) === runtime)
110
+ n += 1;
111
+ for (const team of await ctx.storage.getTeams()) {
112
+ n += team.members.filter((m) => (m.runtimeType ?? RUNTIME_TYPES.CLAUDE_CODE) === runtime).length;
113
+ }
114
+ return n;
115
+ },
116
+ isLive: (sessionName) => {
117
+ try {
118
+ if (ctx.registration()?.isInProcessRuntimeActive(sessionName))
119
+ return true;
120
+ return ctx.sessionExists(sessionName);
121
+ }
122
+ catch {
123
+ return false;
124
+ }
125
+ },
126
+ isBusy: async (sessionName) => {
127
+ const { ActivityMonitorService } = await import('../monitoring/activity-monitor.service.js');
128
+ const { PtyActivityTrackerService } = await import('../agent/pty-activity-tracker.service.js');
129
+ if (ActivityMonitorService.getInstance().getObservedWorkingStatus(sessionName) === 'in_progress')
130
+ return true;
131
+ const tracker = PtyActivityTrackerService.getInstance();
132
+ return tracker.hasActivity(sessionName) && tracker.getIdleTimeMs(sessionName) < RUNTIME_FALLBACK_CONSTANTS.IDLE_QUIET_MS;
133
+ },
134
+ getAvailability: async (settings) => {
135
+ const { getHarnessService } = await import('../harness/harness.service.js');
136
+ const { getSettingsService } = await import('../settings/settings.service.js');
137
+ const harnesses = await getHarnessService().status.listStatuses();
138
+ const provider = settings.crewlyAgentModel.split('/')[0] ?? '';
139
+ const keyProvider = KEY_PROVIDER[provider];
140
+ const key = keyProvider ? await getSettingsService().getApiKey(keyProvider, { runtime: RUNTIME_TYPES.CREWLY_AGENT }).catch(() => undefined) : undefined;
141
+ return computeRuntimeAvailability({
142
+ harnesses,
143
+ crewlyAgentModel: settings.crewlyAgentModel,
144
+ hasProviderKey: (p) => p === provider && Boolean(key && key.trim()),
145
+ });
146
+ },
147
+ probe,
148
+ writeHandover: async (req) => {
149
+ const cwd = (await persistence().catch(() => null))?.getSessionMetadata(req.sessionName)?.cwd;
150
+ return writeRuntimeHandover(ctx.crewlyHome, req, cwd);
151
+ },
152
+ getActiveWorkItem: async (sessionName) => {
153
+ const { TaskPoolService } = await import('../task-pool/task-pool.service.js');
154
+ const active = (await TaskPoolService.getInstance().getAllItems()).filter((wi) => wi.target === sessionName && (wi.status === 'running' || wi.status === 'accepted' || wi.status === 'proposed'));
155
+ const rank = { running: 0, accepted: 1, proposed: 2 };
156
+ active.sort((a, b) => (rank[a.status] ?? 9) - (rank[b.status] ?? 9));
157
+ const wi = active[0];
158
+ return wi ? { id: wi.id, title: wi.title } : null;
159
+ },
160
+ conversation: {
161
+ get: (s) => persistenceSync?.getSessionId(s),
162
+ set: (s, id) => persistenceSync?.updateSessionId(s, id),
163
+ clear: (s) => persistenceSync?.clearSessionId(s),
164
+ },
165
+ relaunch: async (agent) => {
166
+ const reg = ctx.registration();
167
+ if (!reg)
168
+ return false;
169
+ await reg.stopSessionForRelaunch(agent.sessionName);
170
+ const { PtyActivityTrackerService } = await import('../agent/pty-activity-tracker.service.js');
171
+ PtyActivityTrackerService.getInstance().clearSession(agent.sessionName);
172
+ if (agent.isOrchestrator) {
173
+ const { OrchestratorRestartService } = await import('../orchestrator/orchestrator-restart.service.js');
174
+ return OrchestratorRestartService.getInstance().attemptRestart();
175
+ }
176
+ const found = await findMember(agent.sessionName);
177
+ if (!found)
178
+ return false;
179
+ let projectPath;
180
+ if (found.team.projectIds[0]) {
181
+ projectPath = (await ctx.storage.getProjects()).find((p) => p.id === found.team.projectIds[0])?.path;
182
+ }
183
+ projectPath ??= (await persistence().catch(() => null))?.getSessionMetadata(agent.sessionName)?.cwd;
184
+ const result = await reg.createAgentSession({
185
+ sessionName: agent.sessionName,
186
+ role: found.member.role,
187
+ projectPath,
188
+ memberId: found.member.id,
189
+ teamId: found.team.id,
190
+ });
191
+ if (!result.success)
192
+ ctx.logger.warn('Relaunch failed', { sessionName: agent.sessionName, error: result.error });
193
+ return result.success;
194
+ },
195
+ redeliver: async (sessionName) => {
196
+ const { getOwnerMessageWatchdog } = await import('../messaging/owner-message-watchdog.service.js');
197
+ await getOwnerMessageWatchdog()?.resumeAfterLogin({ sessions: [sessionName] });
198
+ },
199
+ flushQueued: async (sessionName) => {
200
+ const reg = ctx.registration();
201
+ if (!reg)
202
+ return;
203
+ const { SubAgentMessageQueue } = await import('../messaging/sub-agent-message-queue.service.js');
204
+ const queue = SubAgentMessageQueue.getInstance();
205
+ if (!queue.hasPending(sessionName))
206
+ return;
207
+ await queue.flush(sessionName, (data) => reg.sendMessageToAgent(sessionName, data));
208
+ },
209
+ machineName: ctx.machineName,
210
+ notifier: ctx.notifier,
211
+ timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,
212
+ logger: ctx.logger,
213
+ });
214
+ setRuntimeFallbackService(service);
215
+ setRuntimeFallbackHooks(service);
216
+ service.start();
217
+ return service;
218
+ }
219
+ //# sourceMappingURL=runtime-fallback.wiring.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-fallback.wiring.js","sourceRoot":"","sources":["../../../../../../backend/src/services/runtime-fallback/runtime-fallback.wiring.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,203 @@
1
+ /**
2
+ * Runtime smoke test — prove a runtime really works on this machine by
3
+ * running one agent on it end to end.
4
+ *
5
+ * Through the backend's own REST API (the calls the dashboard makes):
6
+ *
7
+ * 1. `create_team` — temp project + team `zz-runtime-smoke-<runtime>` with
8
+ * one member on the runtime (a leftover of the same name is removed first).
9
+ * 2. `start_member` — start it (as the owner's dashboard would).
10
+ * 3. `agent_ready` — wait until it registered. Antigravity's first-run Terms
11
+ * screen fails the test with "Antigravity needs its terms accepted once"
12
+ * and the screen text — Crewly never accepts terms for the owner.
13
+ * 4. `send_task` — `echo ok > <file>` with bash, then reply with a token.
14
+ * 5. `bash` — the file holds `ok`.
15
+ * 6. `reply` — the token `SMOKE-ok-<nonce>` shows in the agent's output. The
16
+ * task never contains that string verbatim (only its parts), so an echo
17
+ * of the task does not count.
18
+ * 7. `cleanup` — stop and delete the team and the project (always).
19
+ *
20
+ * Bounded by 5 minutes. specs/2026-10-01-runtime-fallback.md
21
+ *
22
+ * @module services/runtime-fallback/runtime-smoke-test.service
23
+ */
24
+ /** Steps, in order. */
25
+ export type SmokeStep = 'create_team' | 'start_member' | 'agent_ready' | 'send_task' | 'bash' | 'reply' | 'cleanup';
26
+ /** Result of one smoke test. */
27
+ export interface SmokeTestResult {
28
+ runtime: string;
29
+ passed: boolean;
30
+ /** The step that failed */
31
+ failedStep?: SmokeStep;
32
+ /** Owner-facing reason (English) */
33
+ error?: string;
34
+ /** Steps that passed, in order */
35
+ steps: Array<{
36
+ step: SmokeStep;
37
+ ok: boolean;
38
+ ms: number;
39
+ detail?: string;
40
+ }>;
41
+ /** Last screen text (on failure, and for the Terms screen) */
42
+ screen?: string;
43
+ durationMs: number;
44
+ }
45
+ /** A job (POST returns its id; GET reads it). */
46
+ export interface SmokeTestJob {
47
+ jobId: string;
48
+ runtime: string;
49
+ state: 'running' | 'done';
50
+ startedAt: string;
51
+ result?: SmokeTestResult;
52
+ }
53
+ /** The REST calls the smoke test makes (the default talks to the local API). */
54
+ export interface SmokeApi {
55
+ listTeams(): Promise<Array<{
56
+ id: string;
57
+ name: string;
58
+ }>>;
59
+ listProjects(): Promise<Array<{
60
+ id: string;
61
+ name: string;
62
+ }>>;
63
+ createProject(name: string, projectPath: string): Promise<string>;
64
+ deleteProject(projectId: string): Promise<void>;
65
+ createTeam(body: Record<string, unknown>): Promise<{
66
+ id: string;
67
+ memberId: string;
68
+ }>;
69
+ startMember(teamId: string, memberId: string): Promise<{
70
+ ok: boolean;
71
+ error?: string;
72
+ }>;
73
+ getMember(teamId: string, memberId: string): Promise<{
74
+ agentStatus: string;
75
+ sessionName: string;
76
+ } | null>;
77
+ capture(sessionName: string, lines: number): Promise<string>;
78
+ /** The session's persistent log (also after the session is gone) */
79
+ sessionLog(sessionName: string, lines: number): Promise<string>;
80
+ deliver(sessionName: string, message: string): Promise<{
81
+ ok: boolean;
82
+ error?: string;
83
+ }>;
84
+ stopTeam(teamId: string): Promise<void>;
85
+ /** Kill a session by name (a refused start can leave its PTY behind) */
86
+ killSession(sessionName: string): Promise<void>;
87
+ /** Whether a session is still live */
88
+ sessionExists(sessionName: string): Promise<boolean>;
89
+ deleteTeam(teamId: string): Promise<void>;
90
+ }
91
+ /** Dependencies. */
92
+ export interface SmokeTestDeps {
93
+ api: SmokeApi;
94
+ /** Scratch root for the project + proof files */
95
+ workRoot?: string;
96
+ now?: () => number;
97
+ sleep?: (ms: number) => Promise<void>;
98
+ nonce?: () => string;
99
+ timeoutMs?: number;
100
+ pollMs?: number;
101
+ /** provider/model a Crewly Agent test runs (the fallback's model, DeepSeek by default) */
102
+ crewlyAgentModel?: () => string;
103
+ }
104
+ /**
105
+ * Whether a screen shows Antigravity's first-run (Terms) screens.
106
+ *
107
+ * @param screen - Screen text
108
+ * @returns True when the Terms / onboarding screen is up
109
+ */
110
+ export declare function showsAntigravityTerms(screen: string): boolean;
111
+ /**
112
+ * The task the smoke agent gets.
113
+ *
114
+ * @param file - Proof file to write with bash
115
+ * @param nonce - Code for the reply token
116
+ * @returns Message text (never contains `SMOKE-ok-<nonce>` verbatim)
117
+ */
118
+ export declare function buildSmokeTask(file: string, nonce: string): string;
119
+ /** Runs smoke tests and keeps their jobs. */
120
+ export declare class RuntimeSmokeTestService {
121
+ private readonly deps;
122
+ private readonly jobs;
123
+ private readonly running;
124
+ private readonly now;
125
+ private readonly sleep;
126
+ /**
127
+ * @param deps - Dependencies
128
+ */
129
+ constructor(deps: SmokeTestDeps);
130
+ /**
131
+ * Start a smoke test (one per runtime at a time).
132
+ *
133
+ * @param runtime - Runtime id
134
+ * @returns The job and a promise of its result
135
+ * @throws Error for an unknown runtime
136
+ */
137
+ start(runtime: string): {
138
+ job: SmokeTestJob;
139
+ done: Promise<SmokeTestResult>;
140
+ };
141
+ /**
142
+ * A job by id.
143
+ *
144
+ * @param jobId - Job id
145
+ * @returns Job, or null
146
+ */
147
+ get(jobId: string): SmokeTestJob | null;
148
+ private prune;
149
+ /**
150
+ * Run one smoke test.
151
+ *
152
+ * @param runtime - Runtime id
153
+ * @returns Result (never throws)
154
+ */
155
+ run(runtime: string): Promise<SmokeTestResult>;
156
+ /** Remove a team / project left over from an earlier run. */
157
+ private removeLeftovers;
158
+ private result;
159
+ }
160
+ /** Fetch-based client for the local API (the default {@link SmokeApi}). */
161
+ export declare class LocalSmokeApi implements SmokeApi {
162
+ private readonly baseUrl;
163
+ private readonly token;
164
+ /**
165
+ * @param baseUrl - e.g. http://127.0.0.1:8787
166
+ * @param token - Crewly API token
167
+ */
168
+ constructor(baseUrl: () => string, token: () => string);
169
+ private call;
170
+ listTeams(): Promise<Array<{
171
+ id: string;
172
+ name: string;
173
+ }>>;
174
+ listProjects(): Promise<Array<{
175
+ id: string;
176
+ name: string;
177
+ }>>;
178
+ createProject(name: string, projectPath: string): Promise<string>;
179
+ deleteProject(projectId: string): Promise<void>;
180
+ createTeam(body: Record<string, unknown>): Promise<{
181
+ id: string;
182
+ memberId: string;
183
+ }>;
184
+ startMember(teamId: string, memberId: string): Promise<{
185
+ ok: boolean;
186
+ error?: string;
187
+ }>;
188
+ getMember(teamId: string, memberId: string): Promise<{
189
+ agentStatus: string;
190
+ sessionName: string;
191
+ } | null>;
192
+ capture(sessionName: string, lines: number): Promise<string>;
193
+ sessionLog(sessionName: string, lines: number): Promise<string>;
194
+ deliver(sessionName: string, message: string): Promise<{
195
+ ok: boolean;
196
+ error?: string;
197
+ }>;
198
+ killSession(sessionName: string): Promise<void>;
199
+ sessionExists(sessionName: string): Promise<boolean>;
200
+ stopTeam(teamId: string): Promise<void>;
201
+ deleteTeam(teamId: string): Promise<void>;
202
+ }
203
+ //# sourceMappingURL=runtime-smoke-test.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-smoke-test.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/runtime-fallback/runtime-smoke-test.service.ts"],"names":[],"mappings":"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"}