crewly 1.20.176 → 1.20.178
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/skills/orchestrator/update-team-member/SKILL.md +1 -1
- package/dist/backend/backend/src/constants.d.ts +79 -3
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +97 -3
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js +2 -1
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.d.ts +30 -0
- package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.js +100 -0
- package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.js.map +1 -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 +33 -4
- package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +25 -0
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/routes/modules/system.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/modules/system.routes.js +3 -0
- package/dist/backend/backend/src/routes/modules/system.routes.js.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-heartbeat-monitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-heartbeat-monitor.service.js +17 -0
- package/dist/backend/backend/src/services/agent/agent-heartbeat-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +10 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.js +103 -7
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/antigravity-runtime.service.d.ts +1 -1
- package/dist/backend/backend/src/services/agent/antigravity-runtime.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/antigravity-runtime.service.js +3 -2
- package/dist/backend/backend/src/services/agent/antigravity-runtime.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts +7 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js +16 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/idle-detection.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/idle-detection.service.js +2 -1
- package/dist/backend/backend/src/services/agent/idle-detection.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.js +7 -0
- package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/planned-relaunch.registry.d.ts +61 -0
- package/dist/backend/backend/src/services/agent/planned-relaunch.registry.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/planned-relaunch.registry.js +73 -0
- package/dist/backend/backend/src/services/agent/planned-relaunch.registry.js.map +1 -0
- package/dist/backend/backend/src/services/agent/tmux.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/tmux.service.js +2 -1
- package/dist/backend/backend/src/services/agent/tmux.service.js.map +1 -1
- package/dist/backend/backend/src/services/harness/harness-status.service.d.ts +17 -0
- package/dist/backend/backend/src/services/harness/harness-status.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/harness/harness-status.service.js +25 -1
- package/dist/backend/backend/src/services/harness/harness-status.service.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/queue-processor.service.js +2 -1
- package/dist/backend/backend/src/services/messaging/queue-processor.service.js.map +1 -1
- package/dist/backend/backend/src/services/monitoring/activity-monitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js +3 -2
- package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.js +10 -0
- package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/orchestrator-restart.service.d.ts +28 -1
- package/dist/backend/backend/src/services/orchestrator/orchestrator-restart.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/orchestrator-restart.service.js +48 -3
- package/dist/backend/backend/src/services/orchestrator/orchestrator-restart.service.js.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/orchestrator-status.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/orchestrator-status.service.js +3 -2
- package/dist/backend/backend/src/services/orchestrator/orchestrator-status.service.js.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/effective-runtime.d.ts +100 -0
- package/dist/backend/backend/src/services/runtime-fallback/effective-runtime.d.ts.map +1 -0
- package/dist/backend/backend/src/services/runtime-fallback/effective-runtime.js +115 -0
- package/dist/backend/backend/src/services/runtime-fallback/effective-runtime.js.map +1 -0
- package/dist/backend/backend/src/services/runtime-fallback/reset-time.d.ts +66 -0
- package/dist/backend/backend/src/services/runtime-fallback/reset-time.d.ts.map +1 -0
- package/dist/backend/backend/src/services/runtime-fallback/reset-time.js +211 -0
- package/dist/backend/backend/src/services/runtime-fallback/reset-time.js.map +1 -0
- package/dist/backend/backend/src/services/runtime-fallback/runtime-availability.d.ts +39 -0
- package/dist/backend/backend/src/services/runtime-fallback/runtime-availability.d.ts.map +1 -0
- package/dist/backend/backend/src/services/runtime-fallback/runtime-availability.js +56 -0
- package/dist/backend/backend/src/services/runtime-fallback/runtime-availability.js.map +1 -0
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.d.ts +417 -0
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.js +974 -0
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.js.map +1 -0
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.store.d.ts +53 -0
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.store.d.ts.map +1 -0
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.store.js +109 -0
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.store.js.map +1 -0
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.types.d.ts +134 -0
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.types.d.ts.map +1 -0
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.types.js +152 -0
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.types.js.map +1 -0
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.d.ts +95 -0
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.d.ts.map +1 -0
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.js +286 -0
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.js.map +1 -0
- package/dist/backend/backend/src/services/runtime-fallback/runtime-smoke-test.service.d.ts +203 -0
- package/dist/backend/backend/src/services/runtime-fallback/runtime-smoke-test.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/runtime-fallback/runtime-smoke-test.service.js +419 -0
- package/dist/backend/backend/src/services/runtime-fallback/runtime-smoke-test.service.js.map +1 -0
- package/dist/backend/backend/src/services/runtime-fallback/runtime-usage-probe.d.ts +94 -0
- package/dist/backend/backend/src/services/runtime-fallback/runtime-usage-probe.d.ts.map +1 -0
- package/dist/backend/backend/src/services/runtime-fallback/runtime-usage-probe.js +186 -0
- package/dist/backend/backend/src/services/runtime-fallback/runtime-usage-probe.js.map +1 -0
- package/dist/backend/backend/src/services/runtime-fallback/usage-limit-rules.d.ts +113 -0
- package/dist/backend/backend/src/services/runtime-fallback/usage-limit-rules.d.ts.map +1 -0
- package/dist/backend/backend/src/services/runtime-fallback/usage-limit-rules.js +257 -0
- package/dist/backend/backend/src/services/runtime-fallback/usage-limit-rules.js.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +8 -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 +16 -2
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/dist/backend/backend/src/services/task-pool/claim.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/task-pool/claim.service.js +3 -1
- package/dist/backend/backend/src/services/task-pool/claim.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 +3 -2
- 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 +3 -2
- package/dist/backend/backend/src/services/workflow/scheduler.service.js.map +1 -1
- package/dist/backend/backend/src/types/index.d.ts +14 -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 +79 -3
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +97 -3
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts +10 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.js +103 -7
- package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/antigravity-runtime.service.d.ts +1 -1
- package/dist/cli/backend/src/services/agent/antigravity-runtime.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/antigravity-runtime.service.js +3 -2
- package/dist/cli/backend/src/services/agent/antigravity-runtime.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts +7 -0
- package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js +16 -0
- package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.js +7 -0
- package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/planned-relaunch.registry.d.ts +61 -0
- package/dist/cli/backend/src/services/agent/planned-relaunch.registry.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/planned-relaunch.registry.js +73 -0
- package/dist/cli/backend/src/services/agent/planned-relaunch.registry.js.map +1 -0
- package/dist/cli/backend/src/services/harness/harness-status.service.d.ts +17 -0
- package/dist/cli/backend/src/services/harness/harness-status.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/harness/harness-status.service.js +25 -1
- package/dist/cli/backend/src/services/harness/harness-status.service.js.map +1 -1
- package/dist/cli/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/messaging/queue-processor.service.js +2 -1
- package/dist/cli/backend/src/services/messaging/queue-processor.service.js.map +1 -1
- package/dist/cli/backend/src/services/monitoring/activity-monitor.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/monitoring/activity-monitor.service.js +3 -2
- package/dist/cli/backend/src/services/monitoring/activity-monitor.service.js.map +1 -1
- package/dist/cli/backend/src/services/orchestrator/orchestrator-restart.service.d.ts +28 -1
- package/dist/cli/backend/src/services/orchestrator/orchestrator-restart.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/orchestrator/orchestrator-restart.service.js +48 -3
- package/dist/cli/backend/src/services/orchestrator/orchestrator-restart.service.js.map +1 -1
- package/dist/cli/backend/src/services/orchestrator/orchestrator-status.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/orchestrator/orchestrator-status.service.js +3 -2
- package/dist/cli/backend/src/services/orchestrator/orchestrator-status.service.js.map +1 -1
- package/dist/cli/backend/src/services/runtime-fallback/effective-runtime.d.ts +100 -0
- package/dist/cli/backend/src/services/runtime-fallback/effective-runtime.d.ts.map +1 -0
- package/dist/cli/backend/src/services/runtime-fallback/effective-runtime.js +115 -0
- package/dist/cli/backend/src/services/runtime-fallback/effective-runtime.js.map +1 -0
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +8 -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 +16 -2
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/dist/cli/backend/src/services/task-pool/claim.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/task-pool/claim.service.js +3 -1
- package/dist/cli/backend/src/services/task-pool/claim.service.js.map +1 -1
- package/dist/cli/backend/src/types/index.d.ts +14 -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/dist/cli/cli/src/utils/runtime-auth.d.ts +1 -1
- package/dist/cli/cli/src/utils/runtime-auth.js +1 -1
- package/frontend/dist/assets/{index-0726afab.js → index-69af46c3.js} +275 -275
- package/frontend/dist/assets/{index-0c5449b5.css → index-cdc52122.css} +1 -1
- package/frontend/dist/index.html +2 -2
- package/package.json +1 -1
|
@@ -0,0 +1,286 @@
|
|
|
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
|
+
import { clearPlannedRelaunch, markPlannedRelaunch } from '../agent/planned-relaunch.registry.js';
|
|
21
|
+
/** Reason recorded for the fallback's relaunches. */
|
|
22
|
+
const PLANNED_RELAUNCH_REASON = 'runtime_fallback';
|
|
23
|
+
/** Provider of an in-process Crewly Agent run without a model id (CREWLY_AGENT_DEFAULTS.DEFAULT_MODEL). */
|
|
24
|
+
const DEFAULT_CREWLY_AGENT_PROVIDER = 'google';
|
|
25
|
+
/**
|
|
26
|
+
* Providers (with model) the in-process Crewly Agent runtime uses: the
|
|
27
|
+
* orchestrator's model when it runs on it, and each member configured on it.
|
|
28
|
+
*
|
|
29
|
+
* @param storage - Teams / orchestrator status
|
|
30
|
+
* @returns Unique provider → model (first model seen) pairs
|
|
31
|
+
*/
|
|
32
|
+
export async function crewlyAgentModelsInUse(storage) {
|
|
33
|
+
const modelIds = [];
|
|
34
|
+
const orc = await storage.getOrchestratorStatus().catch(() => null);
|
|
35
|
+
if (orc?.runtimeType === RUNTIME_TYPES.CREWLY_AGENT)
|
|
36
|
+
modelIds.push(orc.modelId);
|
|
37
|
+
for (const team of await storage.getTeams().catch(() => [])) {
|
|
38
|
+
for (const member of team.members) {
|
|
39
|
+
if (member.runtimeType === RUNTIME_TYPES.CREWLY_AGENT)
|
|
40
|
+
modelIds.push(member.modelId);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
const byProvider = new Map();
|
|
44
|
+
for (const id of modelIds) {
|
|
45
|
+
const slash = id ? id.indexOf('/') : -1;
|
|
46
|
+
const provider = id && slash > 0 ? id.slice(0, slash) : DEFAULT_CREWLY_AGENT_PROVIDER;
|
|
47
|
+
const model = id && slash > 0 ? id.slice(slash + 1) : undefined;
|
|
48
|
+
if (!byProvider.has(provider) || (!byProvider.get(provider) && model))
|
|
49
|
+
byProvider.set(provider, model);
|
|
50
|
+
}
|
|
51
|
+
return [...byProvider].map(([provider, model]) => ({ provider, ...(model ? { model } : {}) }));
|
|
52
|
+
}
|
|
53
|
+
/** Crewly Agent model provider → settings API key provider. */
|
|
54
|
+
const KEY_PROVIDER = {
|
|
55
|
+
deepseek: 'deepseek',
|
|
56
|
+
google: 'gemini',
|
|
57
|
+
anthropic: 'anthropic',
|
|
58
|
+
openai: 'openai',
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* Write a handover file for a runtime change.
|
|
62
|
+
*
|
|
63
|
+
* @param crewlyHome - CREWLY_HOME
|
|
64
|
+
* @param req - What changes
|
|
65
|
+
* @param cwd - The agent's working directory (Claude transcripts are keyed on it)
|
|
66
|
+
* @param now - Clock
|
|
67
|
+
* @returns The file path
|
|
68
|
+
*/
|
|
69
|
+
export function writeRuntimeHandover(crewlyHome, req, cwd, now = new Date()) {
|
|
70
|
+
const dir = path.join(crewlyHome, ORC_CONVERSATION_CONSTANTS.HANDOVER_DIR);
|
|
71
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
72
|
+
const file = path.join(dir, `${req.sessionName}-runtime-${req.direction}-${now.toISOString().replace(/[:.]/g, '-')}.md`);
|
|
73
|
+
let summary = '';
|
|
74
|
+
if (req.from === RUNTIME_TYPES.CLAUDE_CODE && req.conversationId && cwd) {
|
|
75
|
+
summary = buildHandoverSummary(claudeTranscriptPath({ sessionId: req.conversationId, cwd }));
|
|
76
|
+
}
|
|
77
|
+
const why = req.direction === 'switch'
|
|
78
|
+
? `You were running on ${runtimeLabel(req.from)}. It ran out of usage, so Crewly moved you to ${runtimeLabel(req.to)} until it resets.`
|
|
79
|
+
: `You ran on ${runtimeLabel(req.from)} while ${runtimeLabel(req.to)} was out of usage. ${runtimeLabel(req.to)} is back, so Crewly moved you back.`;
|
|
80
|
+
fs.writeFileSync(file, [
|
|
81
|
+
'# Handover: runtime change',
|
|
82
|
+
'',
|
|
83
|
+
why,
|
|
84
|
+
'Everything Crewly tracks — tasks, teams, OKRs, wiki — is still there; this file keeps only the end of what was said before.',
|
|
85
|
+
...(req.workItem ? ['', `You were on WorkItem ${req.workItem.id} ("${req.workItem.title}"). Continue it.`] : []),
|
|
86
|
+
'',
|
|
87
|
+
summary || `_The ${runtimeLabel(req.from)} conversation is not readable here; check your WorkItems and wiki for where you were._`,
|
|
88
|
+
'',
|
|
89
|
+
].join('\n'), 'utf-8');
|
|
90
|
+
return file;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Build the backend's runtime-fallback service, register its hooks and the
|
|
94
|
+
* instance, and start its tick.
|
|
95
|
+
*
|
|
96
|
+
* @param ctx - Backend context
|
|
97
|
+
* @returns The running service
|
|
98
|
+
*/
|
|
99
|
+
export function startBackendRuntimeFallback(ctx) {
|
|
100
|
+
const probe = createRuntimeUsageProbe({
|
|
101
|
+
crewlyAgentTargets: async () => {
|
|
102
|
+
const { getSettingsService } = await import('../settings/settings.service.js');
|
|
103
|
+
const targets = [];
|
|
104
|
+
for (const { provider, model } of await crewlyAgentModelsInUse(ctx.storage)) {
|
|
105
|
+
const keyProvider = KEY_PROVIDER[provider];
|
|
106
|
+
if (!keyProvider)
|
|
107
|
+
continue;
|
|
108
|
+
const apiKey = await getSettingsService().getApiKey(keyProvider, { runtime: RUNTIME_TYPES.CREWLY_AGENT }).catch(() => undefined);
|
|
109
|
+
if (apiKey && apiKey.trim())
|
|
110
|
+
targets.push({ provider, apiKey: apiKey.trim(), ...(model ? { model } : {}) });
|
|
111
|
+
}
|
|
112
|
+
return targets;
|
|
113
|
+
},
|
|
114
|
+
});
|
|
115
|
+
const findMember = async (sessionName) => {
|
|
116
|
+
for (const team of await ctx.storage.getTeams()) {
|
|
117
|
+
const member = team.members.find((m) => m.sessionName === sessionName);
|
|
118
|
+
if (member)
|
|
119
|
+
return { team, member };
|
|
120
|
+
}
|
|
121
|
+
return null;
|
|
122
|
+
};
|
|
123
|
+
const persistence = async () => {
|
|
124
|
+
const { getSessionStatePersistence } = await import('../session/session-state-persistence.js');
|
|
125
|
+
return getSessionStatePersistence();
|
|
126
|
+
};
|
|
127
|
+
let persistenceSync = null;
|
|
128
|
+
void persistence()
|
|
129
|
+
.then((p) => {
|
|
130
|
+
persistenceSync = p;
|
|
131
|
+
})
|
|
132
|
+
.catch(() => undefined);
|
|
133
|
+
const getAgent = async (sessionName) => {
|
|
134
|
+
if (sessionName === ORCHESTRATOR_SESSION_NAME) {
|
|
135
|
+
const status = await ctx.storage.getOrchestratorStatus().catch(() => null);
|
|
136
|
+
return { sessionName, name: 'Orc', primary: status?.runtimeType ?? RUNTIME_TYPES.CLAUDE_CODE, isOrchestrator: true };
|
|
137
|
+
}
|
|
138
|
+
const found = await findMember(sessionName);
|
|
139
|
+
if (!found)
|
|
140
|
+
return null;
|
|
141
|
+
return {
|
|
142
|
+
sessionName,
|
|
143
|
+
name: found.member.name,
|
|
144
|
+
primary: found.member.runtimeType ?? RUNTIME_TYPES.CLAUDE_CODE,
|
|
145
|
+
memberId: found.member.id,
|
|
146
|
+
teamId: found.team.id,
|
|
147
|
+
isOrchestrator: false,
|
|
148
|
+
};
|
|
149
|
+
};
|
|
150
|
+
const relaunchSession = async (agent, reg) => {
|
|
151
|
+
await reg.stopSessionForRelaunch(agent.sessionName);
|
|
152
|
+
const { PtyActivityTrackerService } = await import('../agent/pty-activity-tracker.service.js');
|
|
153
|
+
PtyActivityTrackerService.getInstance().clearSession(agent.sessionName);
|
|
154
|
+
// Grace-revokes of the old session must not flag the new one as hung.
|
|
155
|
+
const { TaskPoolService } = await import('../task-pool/task-pool.service.js');
|
|
156
|
+
try {
|
|
157
|
+
TaskPoolService.getInstance().clearHungState(agent.sessionName);
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
// task pool not ready
|
|
161
|
+
}
|
|
162
|
+
if (agent.isOrchestrator) {
|
|
163
|
+
const { OrchestratorRestartService } = await import('../orchestrator/orchestrator-restart.service.js');
|
|
164
|
+
return OrchestratorRestartService.getInstance().attemptRestart({ planned: true, reason: PLANNED_RELAUNCH_REASON });
|
|
165
|
+
}
|
|
166
|
+
const found = await findMember(agent.sessionName);
|
|
167
|
+
if (!found)
|
|
168
|
+
return false;
|
|
169
|
+
let projectPath;
|
|
170
|
+
if (found.team.projectIds[0]) {
|
|
171
|
+
projectPath = (await ctx.storage.getProjects()).find((p) => p.id === found.team.projectIds[0])?.path;
|
|
172
|
+
}
|
|
173
|
+
projectPath ??= (await persistence().catch(() => null))?.getSessionMetadata(agent.sessionName)?.cwd;
|
|
174
|
+
const result = await reg.createAgentSession({
|
|
175
|
+
sessionName: agent.sessionName,
|
|
176
|
+
role: found.member.role,
|
|
177
|
+
projectPath,
|
|
178
|
+
memberId: found.member.id,
|
|
179
|
+
teamId: found.team.id,
|
|
180
|
+
});
|
|
181
|
+
if (!result.success)
|
|
182
|
+
ctx.logger.warn('Relaunch failed', { sessionName: agent.sessionName, error: result.error });
|
|
183
|
+
return result.success;
|
|
184
|
+
};
|
|
185
|
+
const service = new RuntimeFallbackService({
|
|
186
|
+
store: new FileRuntimeFallbackStore(path.join(ctx.crewlyHome, RUNTIME_FALLBACK_CONSTANTS.STATE_FILE)),
|
|
187
|
+
getAgent,
|
|
188
|
+
countAgentsOnRuntime: async (runtime) => {
|
|
189
|
+
let n = 0;
|
|
190
|
+
const orc = await ctx.storage.getOrchestratorStatus().catch(() => null);
|
|
191
|
+
if ((orc?.runtimeType ?? RUNTIME_TYPES.CLAUDE_CODE) === runtime)
|
|
192
|
+
n += 1;
|
|
193
|
+
for (const team of await ctx.storage.getTeams()) {
|
|
194
|
+
n += team.members.filter((m) => (m.runtimeType ?? RUNTIME_TYPES.CLAUDE_CODE) === runtime).length;
|
|
195
|
+
}
|
|
196
|
+
return n;
|
|
197
|
+
},
|
|
198
|
+
isLive: (sessionName) => {
|
|
199
|
+
try {
|
|
200
|
+
if (ctx.registration()?.isInProcessRuntimeActive(sessionName))
|
|
201
|
+
return true;
|
|
202
|
+
return ctx.sessionExists(sessionName);
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
return false;
|
|
206
|
+
}
|
|
207
|
+
},
|
|
208
|
+
isBusy: async (sessionName) => {
|
|
209
|
+
const { ActivityMonitorService } = await import('../monitoring/activity-monitor.service.js');
|
|
210
|
+
const { PtyActivityTrackerService } = await import('../agent/pty-activity-tracker.service.js');
|
|
211
|
+
if (ActivityMonitorService.getInstance().getObservedWorkingStatus(sessionName) === 'in_progress')
|
|
212
|
+
return true;
|
|
213
|
+
const tracker = PtyActivityTrackerService.getInstance();
|
|
214
|
+
return tracker.hasActivity(sessionName) && tracker.getIdleTimeMs(sessionName) < RUNTIME_FALLBACK_CONSTANTS.IDLE_QUIET_MS;
|
|
215
|
+
},
|
|
216
|
+
getAvailability: async (settings) => {
|
|
217
|
+
const { getHarnessService } = await import('../harness/harness.service.js');
|
|
218
|
+
const { getSettingsService } = await import('../settings/settings.service.js');
|
|
219
|
+
const harnesses = await getHarnessService().status.listStatuses();
|
|
220
|
+
const provider = settings.crewlyAgentModel.split('/')[0] ?? '';
|
|
221
|
+
const keyProvider = KEY_PROVIDER[provider];
|
|
222
|
+
const key = keyProvider ? await getSettingsService().getApiKey(keyProvider, { runtime: RUNTIME_TYPES.CREWLY_AGENT }).catch(() => undefined) : undefined;
|
|
223
|
+
return computeRuntimeAvailability({
|
|
224
|
+
harnesses,
|
|
225
|
+
crewlyAgentModel: settings.crewlyAgentModel,
|
|
226
|
+
hasProviderKey: (p) => p === provider && Boolean(key && key.trim()),
|
|
227
|
+
});
|
|
228
|
+
},
|
|
229
|
+
probe,
|
|
230
|
+
writeHandover: async (req) => {
|
|
231
|
+
const cwd = (await persistence().catch(() => null))?.getSessionMetadata(req.sessionName)?.cwd;
|
|
232
|
+
return writeRuntimeHandover(ctx.crewlyHome, req, cwd);
|
|
233
|
+
},
|
|
234
|
+
getActiveWorkItem: async (sessionName) => {
|
|
235
|
+
const { TaskPoolService } = await import('../task-pool/task-pool.service.js');
|
|
236
|
+
const active = (await TaskPoolService.getInstance().getAllItems()).filter((wi) => wi.target === sessionName && (wi.status === 'running' || wi.status === 'accepted' || wi.status === 'proposed'));
|
|
237
|
+
const rank = { running: 0, accepted: 1, proposed: 2 };
|
|
238
|
+
active.sort((a, b) => (rank[a.status] ?? 9) - (rank[b.status] ?? 9));
|
|
239
|
+
const wi = active[0];
|
|
240
|
+
return wi ? { id: wi.id, title: wi.title } : null;
|
|
241
|
+
},
|
|
242
|
+
conversation: {
|
|
243
|
+
get: (s) => persistenceSync?.getSessionId(s),
|
|
244
|
+
set: (s, id) => persistenceSync?.updateSessionId(s, id),
|
|
245
|
+
clear: (s) => persistenceSync?.clearSessionId(s),
|
|
246
|
+
},
|
|
247
|
+
relaunch: async (agent) => {
|
|
248
|
+
const reg = ctx.registration();
|
|
249
|
+
if (!reg)
|
|
250
|
+
return false;
|
|
251
|
+
// A runtime switch is not a crash or a hang: the restart, heartbeat and
|
|
252
|
+
// hung monitors leave the session alone through the relaunch and its
|
|
253
|
+
// start-up, and the owner gets only the fallback's own message.
|
|
254
|
+
markPlannedRelaunch(agent.sessionName, PLANNED_RELAUNCH_REASON);
|
|
255
|
+
const ok = await relaunchSession(agent, reg).catch(() => false);
|
|
256
|
+
if (ok)
|
|
257
|
+
markPlannedRelaunch(agent.sessionName, PLANNED_RELAUNCH_REASON);
|
|
258
|
+
else
|
|
259
|
+
clearPlannedRelaunch(agent.sessionName);
|
|
260
|
+
return ok;
|
|
261
|
+
},
|
|
262
|
+
redeliver: async (sessionName) => {
|
|
263
|
+
const { getOwnerMessageWatchdog } = await import('../messaging/owner-message-watchdog.service.js');
|
|
264
|
+
await getOwnerMessageWatchdog()?.resumeAfterLogin({ sessions: [sessionName] });
|
|
265
|
+
},
|
|
266
|
+
flushQueued: async (sessionName) => {
|
|
267
|
+
const reg = ctx.registration();
|
|
268
|
+
if (!reg)
|
|
269
|
+
return;
|
|
270
|
+
const { SubAgentMessageQueue } = await import('../messaging/sub-agent-message-queue.service.js');
|
|
271
|
+
const queue = SubAgentMessageQueue.getInstance();
|
|
272
|
+
if (!queue.hasPending(sessionName))
|
|
273
|
+
return;
|
|
274
|
+
await queue.flush(sessionName, (data) => reg.sendMessageToAgent(sessionName, data));
|
|
275
|
+
},
|
|
276
|
+
machineName: ctx.machineName,
|
|
277
|
+
notifier: ctx.notifier,
|
|
278
|
+
timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,
|
|
279
|
+
logger: ctx.logger,
|
|
280
|
+
});
|
|
281
|
+
setRuntimeFallbackService(service);
|
|
282
|
+
setRuntimeFallbackHooks(service);
|
|
283
|
+
service.start();
|
|
284
|
+
return service;
|
|
285
|
+
}
|
|
286
|
+
//# 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
|
package/dist/backend/backend/src/services/runtime-fallback/runtime-smoke-test.service.d.ts.map
ADDED
|
@@ -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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"}
|