@monoes/monomindcli 2.16.13 → 2.16.14
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/README.md +1 -1
- package/dist/src/commands/org-control.d.ts +117 -0
- package/dist/src/commands/org-control.d.ts.map +1 -0
- package/dist/src/commands/org-control.js +274 -0
- package/dist/src/commands/org-control.js.map +1 -0
- package/dist/src/commands/org-lifecycle.d.ts +7 -0
- package/dist/src/commands/org-lifecycle.d.ts.map +1 -0
- package/dist/src/commands/org-lifecycle.js +298 -0
- package/dist/src/commands/org-lifecycle.js.map +1 -0
- package/dist/src/commands/org-manage.d.ts +7 -0
- package/dist/src/commands/org-manage.d.ts.map +1 -0
- package/dist/src/commands/org-manage.js +357 -0
- package/dist/src/commands/org-manage.js.map +1 -0
- package/dist/src/commands/org-memory-command.d.ts +3 -0
- package/dist/src/commands/org-memory-command.d.ts.map +1 -0
- package/dist/src/commands/org-memory-command.js +178 -0
- package/dist/src/commands/org-memory-command.js.map +1 -0
- package/dist/src/commands/org-observe-approvals.d.ts +8 -0
- package/dist/src/commands/org-observe-approvals.d.ts.map +1 -0
- package/dist/src/commands/org-observe-approvals.js +211 -0
- package/dist/src/commands/org-observe-approvals.js.map +1 -0
- package/dist/src/commands/org-observe-checkpoint.d.ts +26 -0
- package/dist/src/commands/org-observe-checkpoint.d.ts.map +1 -0
- package/dist/src/commands/org-observe-checkpoint.js +180 -0
- package/dist/src/commands/org-observe-checkpoint.js.map +1 -0
- package/dist/src/commands/org-observe-config.d.ts +8 -0
- package/dist/src/commands/org-observe-config.d.ts.map +1 -0
- package/dist/src/commands/org-observe-config.js +160 -0
- package/dist/src/commands/org-observe-config.js.map +1 -0
- package/dist/src/commands/org-observe-gates.d.ts +4 -0
- package/dist/src/commands/org-observe-gates.d.ts.map +1 -0
- package/dist/src/commands/org-observe-gates.js +182 -0
- package/dist/src/commands/org-observe-gates.js.map +1 -0
- package/dist/src/commands/org-observe-inbox.d.ts +18 -0
- package/dist/src/commands/org-observe-inbox.d.ts.map +1 -0
- package/dist/src/commands/org-observe-inbox.js +154 -0
- package/dist/src/commands/org-observe-inbox.js.map +1 -0
- package/dist/src/commands/org-observe-logs.d.ts +31 -0
- package/dist/src/commands/org-observe-logs.d.ts.map +1 -0
- package/dist/src/commands/org-observe-logs.js +272 -0
- package/dist/src/commands/org-observe-logs.js.map +1 -0
- package/dist/src/commands/org-observe-questions.d.ts +8 -0
- package/dist/src/commands/org-observe-questions.d.ts.map +1 -0
- package/dist/src/commands/org-observe-questions.js +201 -0
- package/dist/src/commands/org-observe-questions.js.map +1 -0
- package/dist/src/commands/org-observe-report.d.ts +8 -0
- package/dist/src/commands/org-observe-report.d.ts.map +1 -0
- package/dist/src/commands/org-observe-report.js +366 -0
- package/dist/src/commands/org-observe-report.js.map +1 -0
- package/dist/src/commands/org-observe-shared.d.ts +20 -0
- package/dist/src/commands/org-observe-shared.d.ts.map +1 -0
- package/dist/src/commands/org-observe-shared.js +55 -0
- package/dist/src/commands/org-observe-shared.js.map +1 -0
- package/dist/src/commands/org-observe.d.ts +9 -101
- package/dist/src/commands/org-observe.d.ts.map +1 -1
- package/dist/src/commands/org-observe.js +12 -1675
- package/dist/src/commands/org-observe.js.map +1 -1
- package/dist/src/commands/org-poll.d.ts +57 -0
- package/dist/src/commands/org-poll.d.ts.map +1 -0
- package/dist/src/commands/org-poll.js +194 -0
- package/dist/src/commands/org-poll.js.map +1 -0
- package/dist/src/commands/org-run.d.ts +3 -0
- package/dist/src/commands/org-run.d.ts.map +1 -0
- package/dist/src/commands/org-run.js +449 -0
- package/dist/src/commands/org-run.js.map +1 -0
- package/dist/src/commands/org-serve.d.ts +19 -0
- package/dist/src/commands/org-serve.d.ts.map +1 -0
- package/dist/src/commands/org-serve.js +395 -0
- package/dist/src/commands/org-serve.js.map +1 -0
- package/dist/src/commands/org-subcommands-config.d.ts +8 -0
- package/dist/src/commands/org-subcommands-config.d.ts.map +1 -0
- package/dist/src/commands/org-subcommands-config.js +93 -0
- package/dist/src/commands/org-subcommands-config.js.map +1 -0
- package/dist/src/commands/org-subcommands-hil.d.ts +11 -0
- package/dist/src/commands/org-subcommands-hil.d.ts.map +1 -0
- package/dist/src/commands/org-subcommands-hil.js +216 -0
- package/dist/src/commands/org-subcommands-hil.js.map +1 -0
- package/dist/src/commands/org-subcommands-observe.d.ts +12 -0
- package/dist/src/commands/org-subcommands-observe.d.ts.map +1 -0
- package/dist/src/commands/org-subcommands-observe.js +249 -0
- package/dist/src/commands/org-subcommands-observe.js.map +1 -0
- package/dist/src/commands/org-subcommands-runtime.d.ts +12 -0
- package/dist/src/commands/org-subcommands-runtime.d.ts.map +1 -0
- package/dist/src/commands/org-subcommands-runtime.js +163 -0
- package/dist/src/commands/org-subcommands-runtime.js.map +1 -0
- package/dist/src/commands/org.d.ts +3 -151
- package/dist/src/commands/org.d.ts.map +1 -1
- package/dist/src/commands/org.js +43 -2735
- package/dist/src/commands/org.js.map +1 -1
- package/dist/src/orgrt/daemon-types.d.ts +196 -0
- package/dist/src/orgrt/daemon-types.d.ts.map +1 -0
- package/dist/src/orgrt/daemon-types.js +38 -0
- package/dist/src/orgrt/daemon-types.js.map +1 -0
- package/dist/src/orgrt/daemon.d.ts +70 -300
- package/dist/src/orgrt/daemon.d.ts.map +1 -1
- package/dist/src/orgrt/daemon.js +41 -2536
- package/dist/src/orgrt/daemon.js.map +1 -1
- package/dist/src/orgrt/idle-watchdog.d.ts +39 -0
- package/dist/src/orgrt/idle-watchdog.d.ts.map +1 -0
- package/dist/src/orgrt/idle-watchdog.js +289 -0
- package/dist/src/orgrt/idle-watchdog.js.map +1 -0
- package/dist/src/orgrt/org-reload.d.ts +7 -0
- package/dist/src/orgrt/org-reload.d.ts.map +1 -0
- package/dist/src/orgrt/org-reload.js +111 -0
- package/dist/src/orgrt/org-reload.js.map +1 -0
- package/dist/src/orgrt/org-start-steps.d.ts +21 -0
- package/dist/src/orgrt/org-start-steps.d.ts.map +1 -0
- package/dist/src/orgrt/org-start-steps.js +305 -0
- package/dist/src/orgrt/org-start-steps.js.map +1 -0
- package/dist/src/orgrt/org-start.d.ts +7 -0
- package/dist/src/orgrt/org-start.d.ts.map +1 -0
- package/dist/src/orgrt/org-start.js +435 -0
- package/dist/src/orgrt/org-start.js.map +1 -0
- package/dist/src/orgrt/org-state-file.d.ts +8 -0
- package/dist/src/orgrt/org-state-file.d.ts.map +1 -0
- package/dist/src/orgrt/org-state-file.js +116 -0
- package/dist/src/orgrt/org-state-file.js.map +1 -0
- package/dist/src/orgrt/org-stop.d.ts +6 -0
- package/dist/src/orgrt/org-stop.d.ts.map +1 -0
- package/dist/src/orgrt/org-stop.js +332 -0
- package/dist/src/orgrt/org-stop.js.map +1 -0
- package/dist/src/orgrt/org-tools.d.ts +11 -0
- package/dist/src/orgrt/org-tools.d.ts.map +1 -0
- package/dist/src/orgrt/org-tools.js +305 -0
- package/dist/src/orgrt/org-tools.js.map +1 -0
- package/dist/src/orgrt/role-incarnation.d.ts +18 -0
- package/dist/src/orgrt/role-incarnation.d.ts.map +1 -0
- package/dist/src/orgrt/role-incarnation.js +374 -0
- package/dist/src/orgrt/role-incarnation.js.map +1 -0
- package/dist/src/orgrt/role-respawn.d.ts +7 -0
- package/dist/src/orgrt/role-respawn.d.ts.map +1 -0
- package/dist/src/orgrt/role-respawn.js +318 -0
- package/dist/src/orgrt/role-respawn.js.map +1 -0
- package/dist/src/orgrt/role-session-opts.d.ts +389 -0
- package/dist/src/orgrt/role-session-opts.d.ts.map +1 -0
- package/dist/src/orgrt/role-session-opts.js +289 -0
- package/dist/src/orgrt/role-session-opts.js.map +1 -0
- package/dist/src/orgrt/runner-resolve.d.ts +43 -0
- package/dist/src/orgrt/runner-resolve.d.ts.map +1 -0
- package/dist/src/orgrt/runner-resolve.js +77 -0
- package/dist/src/orgrt/runner-resolve.js.map +1 -0
- package/dist/src/orgrt/session-gate.d.ts +34 -0
- package/dist/src/orgrt/session-gate.d.ts.map +1 -0
- package/dist/src/orgrt/session-gate.js +74 -0
- package/dist/src/orgrt/session-gate.js.map +1 -0
- package/dist/src/orgrt/session-prompt.d.ts +31 -0
- package/dist/src/orgrt/session-prompt.d.ts.map +1 -0
- package/dist/src/orgrt/session-prompt.js +115 -0
- package/dist/src/orgrt/session-prompt.js.map +1 -0
- package/dist/src/orgrt/session-run.d.ts +18 -0
- package/dist/src/orgrt/session-run.d.ts.map +1 -0
- package/dist/src/orgrt/session-run.js +429 -0
- package/dist/src/orgrt/session-run.js.map +1 -0
- package/dist/src/orgrt/session-stream.d.ts +21 -0
- package/dist/src/orgrt/session-stream.d.ts.map +1 -0
- package/dist/src/orgrt/session-stream.js +173 -0
- package/dist/src/orgrt/session-stream.js.map +1 -0
- package/dist/src/orgrt/session-types.d.ts +219 -0
- package/dist/src/orgrt/session-types.d.ts.map +1 -0
- package/dist/src/orgrt/session-types.js +2 -0
- package/dist/src/orgrt/session-types.js.map +1 -0
- package/dist/src/orgrt/session-usage.d.ts +29 -0
- package/dist/src/orgrt/session-usage.d.ts.map +1 -0
- package/dist/src/orgrt/session-usage.js +64 -0
- package/dist/src/orgrt/session-usage.js.map +1 -0
- package/dist/src/orgrt/session.d.ts +5 -281
- package/dist/src/orgrt/session.d.ts.map +1 -1
- package/dist/src/orgrt/session.js +8 -1117
- package/dist/src/orgrt/session.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -6
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
import { resolveRoleProvider } from './provider.js';
|
|
2
|
+
import { buildRespawnReceipt, computeReplacementBudget, mergeEffectiveRoleConfig, redactRoleConfig, validateRespawnInput, } from './role-slot.js';
|
|
3
|
+
import { resolveRoleRunner } from './runner-resolve.js';
|
|
4
|
+
/** org_respawn_role's daemon-owned implementation. See the design doc's
|
|
5
|
+
* "Replacement algorithm" (13 steps) — this method's body follows those
|
|
6
|
+
* steps in order, numbered in comments. */
|
|
7
|
+
export async function respawnRole(daemon, name, callerId, rawInput) {
|
|
8
|
+
const running = daemon.orgs.get(name);
|
|
9
|
+
if (!running) {
|
|
10
|
+
return {
|
|
11
|
+
success: false,
|
|
12
|
+
roleId: '',
|
|
13
|
+
generation: 0,
|
|
14
|
+
respawnCount: 0,
|
|
15
|
+
respawnsRemaining: 0,
|
|
16
|
+
error: `org "${name}" is not running`,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
// Step 1: authorize (defense in depth — buildOrgTools only ever wires
|
|
20
|
+
// onRespawnRole for the selected coordinator, but re-check here too).
|
|
21
|
+
if (callerId !== running.bossRoleId) {
|
|
22
|
+
return {
|
|
23
|
+
success: false,
|
|
24
|
+
roleId: '',
|
|
25
|
+
generation: 0,
|
|
26
|
+
respawnCount: 0,
|
|
27
|
+
respawnsRemaining: 0,
|
|
28
|
+
error: 'only the selected coordinator may call org_respawn_role',
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
if (daemon.stopping.has(name)) {
|
|
32
|
+
return {
|
|
33
|
+
success: false,
|
|
34
|
+
roleId: '',
|
|
35
|
+
generation: 0,
|
|
36
|
+
respawnCount: 0,
|
|
37
|
+
respawnsRemaining: 0,
|
|
38
|
+
error: `org "${name}" is stopping`,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
const validated = validateRespawnInput(rawInput);
|
|
42
|
+
if (!validated.ok) {
|
|
43
|
+
return {
|
|
44
|
+
success: false,
|
|
45
|
+
roleId: '',
|
|
46
|
+
generation: 0,
|
|
47
|
+
respawnCount: 0,
|
|
48
|
+
respawnsRemaining: 0,
|
|
49
|
+
error: validated.error,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
const input = validated.value;
|
|
53
|
+
if (input.roleId === running.bossRoleId) {
|
|
54
|
+
return {
|
|
55
|
+
success: false,
|
|
56
|
+
roleId: input.roleId,
|
|
57
|
+
generation: 0,
|
|
58
|
+
respawnCount: 0,
|
|
59
|
+
respawnsRemaining: 0,
|
|
60
|
+
error: 'cannot replace the selected coordinator',
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
const slot = running.roleSlots.get(input.roleId);
|
|
64
|
+
if (!slot) {
|
|
65
|
+
return {
|
|
66
|
+
success: false,
|
|
67
|
+
roleId: input.roleId,
|
|
68
|
+
generation: 0,
|
|
69
|
+
respawnCount: 0,
|
|
70
|
+
respawnsRemaining: 0,
|
|
71
|
+
error: `unknown or not-yet-started role "${input.roleId}"`,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
const maxRespawns = running.def.run_config.max_role_respawns ?? 0;
|
|
75
|
+
if (slot.phase === 'removed') {
|
|
76
|
+
return buildRespawnReceipt(slot, maxRespawns, false, {
|
|
77
|
+
roleId: input.roleId,
|
|
78
|
+
error: `role "${input.roleId}" was removed from this org`,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
// Step 2: acquire the role slot (reject a concurrent replacement).
|
|
82
|
+
if (running.respawning.has(input.roleId) || slot.respawnPromise) {
|
|
83
|
+
return buildRespawnReceipt(slot, maxRespawns, false, {
|
|
84
|
+
roleId: input.roleId,
|
|
85
|
+
error: `role "${input.roleId}" is already undergoing replacement`,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
if (slot.respawnCount >= maxRespawns) {
|
|
89
|
+
return buildRespawnReceipt(slot, maxRespawns, false, {
|
|
90
|
+
roleId: input.roleId,
|
|
91
|
+
error: `role "${input.roleId}" has reached its respawn limit (${slot.respawnCount}/${maxRespawns}) for this run`,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
// Step 3: resolve the candidate configuration.
|
|
95
|
+
if (input.providerName !== undefined && slot.effectiveRole.provider) {
|
|
96
|
+
return buildRespawnReceipt(slot, maxRespawns, false, {
|
|
97
|
+
roleId: input.roleId,
|
|
98
|
+
error: `role "${input.roleId}" has an inline provider, which always takes precedence over adapter_config.provider — replacing an inline provider is a separate design`,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
const candidateRole = mergeEffectiveRoleConfig(slot.effectiveRole, {
|
|
102
|
+
runtime: input.runtime,
|
|
103
|
+
model: input.model,
|
|
104
|
+
providerName: input.providerName,
|
|
105
|
+
});
|
|
106
|
+
const budgetTokens = input.budgetTokens ?? computeReplacementBudget(running.def, input.roleId);
|
|
107
|
+
// Step 4: preflight — must not mutate the old runtime.
|
|
108
|
+
try {
|
|
109
|
+
resolveRoleProvider(candidateRole, daemon.root);
|
|
110
|
+
}
|
|
111
|
+
catch (err) {
|
|
112
|
+
return buildRespawnReceipt(slot, maxRespawns, false, {
|
|
113
|
+
roleId: input.roleId,
|
|
114
|
+
error: `preflight failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
// resolveRoleRunner's undefined return is the valid Claude default, not
|
|
118
|
+
// an error — nothing further to validate for the runtime dimension here.
|
|
119
|
+
resolveRoleRunner(candidateRole.runtime, running.def.runtime, candidateRole.provider?.kind, undefined, candidateRole.provider);
|
|
120
|
+
// Step 5: consume one attempt — only after validation/preflight succeed.
|
|
121
|
+
running.respawning.add(input.roleId);
|
|
122
|
+
slot.respawnCount++;
|
|
123
|
+
running.bus.emit({
|
|
124
|
+
type: 'audit',
|
|
125
|
+
from: callerId,
|
|
126
|
+
reason: 'role-respawn-started',
|
|
127
|
+
msg: `replacing role "${input.roleId}": ${input.reason}`,
|
|
128
|
+
data: {
|
|
129
|
+
roleId: input.roleId,
|
|
130
|
+
from: redactRoleConfig(slot.effectiveRole),
|
|
131
|
+
to: redactRoleConfig(candidateRole),
|
|
132
|
+
generation: slot.generation,
|
|
133
|
+
caller: callerId,
|
|
134
|
+
},
|
|
135
|
+
});
|
|
136
|
+
// Step 6: quiesce the old incarnation. Bump the generation NOW, before
|
|
137
|
+
// draining starts — not at the final publish (step 11-13) — so the OLD
|
|
138
|
+
// generation's crash-retry loop (spawnRoleIncarnation's isStaleGeneration
|
|
139
|
+
// check) recognizes supersession immediately. Without this, a backoff
|
|
140
|
+
// timer firing during the drain/force-stop window, or the forced abort's
|
|
141
|
+
// own rejection, would still see itself as the current generation:
|
|
142
|
+
// the abort's rejection doesn't match killedByStop's SIGTERM-only regex,
|
|
143
|
+
// so it would run full terminal crash handling — a duplicate live runner
|
|
144
|
+
// (mid-backoff restart) or a false worker-crashed notification, exactly
|
|
145
|
+
// what the guard exists to prevent.
|
|
146
|
+
const newGeneration = slot.generation + 1;
|
|
147
|
+
slot.generation = newGeneration;
|
|
148
|
+
slot.phase = 'draining';
|
|
149
|
+
// Every await from here on can race a stop/restart of this org — verify
|
|
150
|
+
// ownership before EVERY subsequent step, not just once before the final
|
|
151
|
+
// publish, so a stale operation can never mutate accounting, force-stop
|
|
152
|
+
// a runtime, or spawn into an org that's no longer the live one.
|
|
153
|
+
const stillOwned = () => daemon.orgs.get(name) === running && running.roleSlots.get(input.roleId) === slot;
|
|
154
|
+
const abandonedReceipt = () => {
|
|
155
|
+
running.respawning.delete(input.roleId);
|
|
156
|
+
return buildRespawnReceipt(slot, maxRespawns, false, {
|
|
157
|
+
roleId: input.roleId,
|
|
158
|
+
error: `org "${name}" stopped or restarted during replacement`,
|
|
159
|
+
});
|
|
160
|
+
};
|
|
161
|
+
const oldRuntime = slot.runtime;
|
|
162
|
+
const sweptQueue = oldRuntime.mailbox.beginDrain();
|
|
163
|
+
slot.queuedDuringSwap.push(...sweptQueue);
|
|
164
|
+
const drainTimeoutMs = running.def.run_config.respawn_drain_timeout_ms ?? 30_000;
|
|
165
|
+
const drained = await Promise.race([
|
|
166
|
+
oldRuntime.done.then(() => true),
|
|
167
|
+
new Promise((r) => setTimeout(() => r(false), drainTimeoutMs)),
|
|
168
|
+
]);
|
|
169
|
+
if (!stillOwned())
|
|
170
|
+
return abandonedReceipt();
|
|
171
|
+
let drainTimedOut = false;
|
|
172
|
+
if (!drained) {
|
|
173
|
+
drainTimedOut = true;
|
|
174
|
+
// Step 7: force stop.
|
|
175
|
+
slot.abort?.abort();
|
|
176
|
+
const forceStopMs = running.def.run_config.respawn_force_stop_timeout_ms ?? 5_000;
|
|
177
|
+
const stopped = await Promise.race([
|
|
178
|
+
oldRuntime.done.then(() => true).catch(() => true),
|
|
179
|
+
new Promise((r) => setTimeout(() => r(false), forceStopMs)),
|
|
180
|
+
]);
|
|
181
|
+
if (!stillOwned())
|
|
182
|
+
return abandonedReceipt();
|
|
183
|
+
if (!stopped) {
|
|
184
|
+
slot.phase = 'stuck';
|
|
185
|
+
running.respawning.delete(input.roleId);
|
|
186
|
+
running.bus.emit({
|
|
187
|
+
type: 'audit',
|
|
188
|
+
from: callerId,
|
|
189
|
+
reason: 'role-respawn-failed',
|
|
190
|
+
msg: `role "${input.roleId}" forced stop did not confirm termination — refusing to spawn a replacement`,
|
|
191
|
+
});
|
|
192
|
+
return buildRespawnReceipt(slot, maxRespawns, false, {
|
|
193
|
+
roleId: input.roleId,
|
|
194
|
+
error: `role "${input.roleId}" could not be confirmed stopped; not replaced`,
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
// Step 8: preserve durable role state (worktree path, task ownership, and
|
|
199
|
+
// the DAG survive untouched — they live outside AgentRuntime/Mailbox
|
|
200
|
+
// entirely, keyed by role.id, which never changes). Reclaim any message
|
|
201
|
+
// abandoned mid-yield by a forced stop for at-least-once redelivery.
|
|
202
|
+
oldRuntime.mailbox.reclaimInFlight();
|
|
203
|
+
const reclaimedQueue = oldRuntime.mailbox.serialize().queue;
|
|
204
|
+
slot.queuedDuringSwap.push(...reclaimedQueue);
|
|
205
|
+
// Step 9: retire accounting BEFORE replacing the runtime.
|
|
206
|
+
slot.retiredUsage = {
|
|
207
|
+
// Budgeted basis: this total is summed with live policy.budgetedUsage
|
|
208
|
+
// against the org-wide budget_tokens ceiling (ADR-O001 D1), so the two
|
|
209
|
+
// terms must share a basis.
|
|
210
|
+
tokens: slot.retiredUsage.tokens + oldRuntime.policy.budgetedUsage,
|
|
211
|
+
costUsd: slot.retiredUsage.costUsd + oldRuntime.metrics.costUsd,
|
|
212
|
+
};
|
|
213
|
+
// Step 10: spawn generation N+1 (generation already bumped in step 6).
|
|
214
|
+
const { runtime: newRuntime, abort: newAbort } = daemon.spawnRoleIncarnation(name, running, candidateRole, newGeneration, { budgetTokensOverride: budgetTokens });
|
|
215
|
+
// Seed the new mailbox with everything swapped/reclaimed, delivered
|
|
216
|
+
// FIFO, plus a delimited coordinator briefing appended last so it reads
|
|
217
|
+
// as the newest context once the replacement starts its first turn.
|
|
218
|
+
for (const queued of slot.queuedDuringSwap)
|
|
219
|
+
newRuntime.mailbox.push(queued);
|
|
220
|
+
newRuntime.mailbox.push(`[system: role replacement briefing — not a system prompt] You are a fresh session replacing the previous incarnation of role "${input.roleId}". Reason: ${input.reason}\n\n${input.briefing}`);
|
|
221
|
+
// Seed USD accounting from retained totals so a respawn cannot reset
|
|
222
|
+
// role.budget_usd.
|
|
223
|
+
if (running.def.roles.find((r) => r.id === input.roleId)?.budget_usd !== undefined) {
|
|
224
|
+
newRuntime.policy.setUsageUsd(slot.retiredUsage.costUsd);
|
|
225
|
+
}
|
|
226
|
+
// "Ready" here means "did not crash within the startup window" — a
|
|
227
|
+
// silent-but-healthy runner (one that never emits a chat/tool/usage
|
|
228
|
+
// event, e.g. because it hasn't finished its first turn yet) must not be
|
|
229
|
+
// misreported as a startup failure, so this does NOT wait for a positive
|
|
230
|
+
// signal. It races the new incarnation's own crash-retry loop (which
|
|
231
|
+
// shares this generation, so it is NOT superseded and behaves normally)
|
|
232
|
+
// against the timeout: a config that fails immediately (bad model,
|
|
233
|
+
// missing runtime binary, auth failure) crashes fast and newRuntime.done
|
|
234
|
+
// resolves with status 'crashed' well before startTimeoutMs, correctly
|
|
235
|
+
// failing readiness and triggering rollback.
|
|
236
|
+
const startTimeoutMs = running.def.run_config.respawn_start_timeout_ms ?? 60_000;
|
|
237
|
+
const ready = await Promise.race([
|
|
238
|
+
newRuntime.done.then(() => newRuntime.status !== 'crashed'),
|
|
239
|
+
new Promise((r) => setTimeout(() => r(true), startTimeoutMs)),
|
|
240
|
+
]);
|
|
241
|
+
// Step 11: publish atomically — verify ownership is still current.
|
|
242
|
+
if (!stillOwned()) {
|
|
243
|
+
newAbort.abort();
|
|
244
|
+
return abandonedReceipt();
|
|
245
|
+
}
|
|
246
|
+
if (!ready) {
|
|
247
|
+
// Step 12: rollback — one attempt with the prior effective config.
|
|
248
|
+
newAbort.abort();
|
|
249
|
+
running.bus.emit({
|
|
250
|
+
type: 'audit',
|
|
251
|
+
from: callerId,
|
|
252
|
+
reason: 'role-respawn-failed',
|
|
253
|
+
msg: `role "${input.roleId}" replacement did not become ready within ${startTimeoutMs}ms — attempting rollback`,
|
|
254
|
+
});
|
|
255
|
+
try {
|
|
256
|
+
const { runtime: rolledBack, abort: rolledBackAbort } = daemon.spawnRoleIncarnation(name, running, slot.effectiveRole, newGeneration + 1, {});
|
|
257
|
+
for (const queued of slot.queuedDuringSwap)
|
|
258
|
+
rolledBack.mailbox.push(queued);
|
|
259
|
+
running.agents.set(input.roleId, rolledBack);
|
|
260
|
+
slot.runtime = rolledBack;
|
|
261
|
+
slot.abort = rolledBackAbort;
|
|
262
|
+
slot.generation = newGeneration + 1;
|
|
263
|
+
slot.phase = 'running';
|
|
264
|
+
slot.queuedDuringSwap = [];
|
|
265
|
+
running.respawning.delete(input.roleId);
|
|
266
|
+
running.bus.emit({
|
|
267
|
+
type: 'audit',
|
|
268
|
+
from: callerId,
|
|
269
|
+
reason: 'role-respawn-failed',
|
|
270
|
+
msg: `role "${input.roleId}" replacement failed; rolled back to prior config`,
|
|
271
|
+
});
|
|
272
|
+
return buildRespawnReceipt(slot, maxRespawns, false, {
|
|
273
|
+
roleId: input.roleId,
|
|
274
|
+
drainTimedOut,
|
|
275
|
+
error: `replacement failed to start; rolled back to prior configuration`,
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
catch (rollbackErr) {
|
|
279
|
+
slot.phase = 'crashed';
|
|
280
|
+
running.respawning.delete(input.roleId);
|
|
281
|
+
running.bus.emit({
|
|
282
|
+
type: 'audit',
|
|
283
|
+
from: callerId,
|
|
284
|
+
reason: 'role-respawn-rollback-failed',
|
|
285
|
+
msg: `role "${input.roleId}" replacement AND rollback both failed: ${rollbackErr instanceof Error ? rollbackErr.message : String(rollbackErr)}`,
|
|
286
|
+
});
|
|
287
|
+
return buildRespawnReceipt(slot, maxRespawns, false, {
|
|
288
|
+
roleId: input.roleId,
|
|
289
|
+
drainTimedOut,
|
|
290
|
+
error: `replacement and rollback both failed; role "${input.roleId}" is unavailable`,
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
running.agents.set(input.roleId, newRuntime);
|
|
295
|
+
slot.runtime = newRuntime;
|
|
296
|
+
slot.abort = newAbort;
|
|
297
|
+
slot.generation = newGeneration;
|
|
298
|
+
slot.effectiveRole = candidateRole;
|
|
299
|
+
slot.phase = 'running';
|
|
300
|
+
slot.queuedDuringSwap = [];
|
|
301
|
+
running.respawning.delete(input.roleId);
|
|
302
|
+
// Step 13: audit and persist.
|
|
303
|
+
running.bus.emit({
|
|
304
|
+
type: 'audit',
|
|
305
|
+
from: callerId,
|
|
306
|
+
reason: 'role-respawned',
|
|
307
|
+
msg: `role "${input.roleId}" replaced (generation ${newGeneration})`,
|
|
308
|
+
data: {
|
|
309
|
+
roleId: input.roleId,
|
|
310
|
+
generation: newGeneration,
|
|
311
|
+
respawnCount: slot.respawnCount,
|
|
312
|
+
drainTimedOut,
|
|
313
|
+
},
|
|
314
|
+
});
|
|
315
|
+
daemon.persistState(name, 'running', running.run);
|
|
316
|
+
return buildRespawnReceipt(slot, maxRespawns, true, { roleId: input.roleId, drainTimedOut });
|
|
317
|
+
}
|
|
318
|
+
//# sourceMappingURL=role-respawn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"role-respawn.js","sourceRoot":"","sources":["../../../src/orgrt/role-respawn.ts"],"names":[],"mappings":"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"}
|