@senpi/runtime 3.0.71 → 3.0.73
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/dist/cli/guide-commands.d.ts.map +1 -1
- package/dist/cli/guide-commands.js +12 -1
- package/dist/cli/guide-commands.js.map +1 -1
- package/dist/cli/senpi-commands.d.ts.map +1 -1
- package/dist/cli/senpi-commands.js +23 -20
- package/dist/cli/senpi-commands.js.map +1 -1
- package/dist/deploy/deadlines.d.ts +61 -1
- package/dist/deploy/deadlines.d.ts.map +1 -1
- package/dist/deploy/deadlines.js +85 -2
- package/dist/deploy/deadlines.js.map +1 -1
- package/dist/deploy/funding.d.ts +38 -0
- package/dist/deploy/funding.d.ts.map +1 -1
- package/dist/deploy/funding.js +39 -0
- package/dist/deploy/funding.js.map +1 -1
- package/dist/deploy/job.d.ts.map +1 -1
- package/dist/deploy/job.js +7 -1
- package/dist/deploy/job.js.map +1 -1
- package/dist/deploy/messages.d.ts +603 -0
- package/dist/deploy/messages.d.ts.map +1 -0
- package/dist/deploy/messages.js +1388 -0
- package/dist/deploy/messages.js.map +1 -0
- package/dist/deploy/orchestrator.d.ts +8 -0
- package/dist/deploy/orchestrator.d.ts.map +1 -1
- package/dist/deploy/orchestrator.js +146 -1211
- package/dist/deploy/orchestrator.js.map +1 -1
- package/dist/deploy/package.d.ts +42 -0
- package/dist/deploy/package.d.ts.map +1 -1
- package/dist/deploy/package.js +146 -4
- package/dist/deploy/package.js.map +1 -1
- package/dist/deploy/recheck-commands.d.ts.map +1 -1
- package/dist/deploy/recheck-commands.js +21 -3
- package/dist/deploy/recheck-commands.js.map +1 -1
- package/dist/deploy/register.d.ts +2 -0
- package/dist/deploy/register.d.ts.map +1 -1
- package/dist/deploy/register.js +23 -6
- package/dist/deploy/register.js.map +1 -1
- package/dist/deploy/taxonomy.d.ts +19 -0
- package/dist/deploy/taxonomy.d.ts.map +1 -1
- package/dist/deploy/taxonomy.js +28 -0
- package/dist/deploy/taxonomy.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +235 -176
- package/dist/index.js.map +1 -1
- package/dist/runtime/env-resolve.d.ts +13 -0
- package/dist/runtime/env-resolve.d.ts.map +1 -1
- package/dist/runtime/env-resolve.js +14 -1
- package/dist/runtime/env-resolve.js.map +1 -1
- package/dist/runtime/runtime-descriptor.d.ts +37 -0
- package/dist/runtime/runtime-descriptor.d.ts.map +1 -0
- package/dist/runtime/runtime-descriptor.js +163 -0
- package/dist/runtime/runtime-descriptor.js.map +1 -0
- package/dist/telemetry/metrics.d.ts +7 -0
- package/dist/telemetry/metrics.d.ts.map +1 -1
- package/dist/telemetry/metrics.js +7 -0
- package/dist/telemetry/metrics.js.map +1 -1
- package/dist/validate/codes.d.ts +2 -0
- package/dist/validate/codes.d.ts.map +1 -1
- package/dist/validate/codes.js +7 -0
- package/dist/validate/codes.js.map +1 -1
- package/dist/validate/run.d.ts.map +1 -1
- package/dist/validate/run.js +6 -1
- package/dist/validate/run.js.map +1 -1
- package/dist/validate/wallet-binding-stage.d.ts +44 -0
- package/dist/validate/wallet-binding-stage.d.ts.map +1 -0
- package/dist/validate/wallet-binding-stage.js +103 -0
- package/dist/validate/wallet-binding-stage.js.map +1 -0
- package/openclaw.plugin.json +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,603 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Every refusal, warning and detail string the deploy verb emits — one producer per taxonomy code.
|
|
3
|
+
*
|
|
4
|
+
* Split out of `orchestrator.ts` verbatim: this module holds the rendering, `orchestrator.ts` holds
|
|
5
|
+
* the control flow that decides which of these to call. Nothing here reads the job's run state, which
|
|
6
|
+
* is why it could move at all — the handful of builders that DO take an `InstanceRun` stay beside it.
|
|
7
|
+
*/
|
|
8
|
+
import type { StrategySummary } from "../senpi/types.js";
|
|
9
|
+
import { type WalletBindingFault, type DeployPackage, type DeployInstance, type ScannerEnabledKey } from "./package.js";
|
|
10
|
+
import { type ShareOverrun } from "./funding.js";
|
|
11
|
+
import type { MinBudgetResult } from "./min-budget.js";
|
|
12
|
+
import type { InstallGateResult } from "../validate/index.js";
|
|
13
|
+
/**
|
|
14
|
+
* How reconcile found a candidate. `name` is the ordinary path; `created-key` is the C2 carve-out —
|
|
15
|
+
* a strategyId this box journaled at create time, re-read from the backend before it counts.
|
|
16
|
+
*/
|
|
17
|
+
export type MatchedBy = "name" | "created-key";
|
|
18
|
+
/** The provenance clause every reconcile message carries, so a report never hides how it matched. */
|
|
19
|
+
export declare function matchedByClause(matchedBy: MatchedBy): string;
|
|
20
|
+
/**
|
|
21
|
+
* The other live strategies that answered to the matched name and were dropped as another
|
|
22
|
+
* package's. A bind that ignored one is still a bind on a CONTESTED name — the collision outlives
|
|
23
|
+
* this deploy and surfaces again at the next `close.py`, rename, or status read — so the report
|
|
24
|
+
* says so rather than rendering a clean "matched by name". It is a note, not a warning: nothing
|
|
25
|
+
* here is this package's to act on, which is the same reason those rows were dropped.
|
|
26
|
+
*/
|
|
27
|
+
export declare function foreignCollisionClause(ignoredForeign: StrategySummary[]): string;
|
|
28
|
+
export declare function buildAmbiguousRefusal(count: number, matchedAs: string, instance: string): string;
|
|
29
|
+
/**
|
|
30
|
+
* A single live name-match whose wallet address cannot be read. deploy.py refused this case rather
|
|
31
|
+
* than guessing, and the taxonomy's `E_STATE_AMBIGUOUS_WALLETS` row names it explicitly: the strategy
|
|
32
|
+
* may be funded and live, so neither adopting a blank address nor creating a second wallet is safe.
|
|
33
|
+
*/
|
|
34
|
+
export declare function buildUnreadableWalletRefusal(strategyName: string, instance: string, strategyId: string): string;
|
|
35
|
+
/**
|
|
36
|
+
* The `create: skipped` detail for an adopted wallet.
|
|
37
|
+
*
|
|
38
|
+
* When a budget was requested, this is the only place the report can say that it was **not**
|
|
39
|
+
* applied — deploy never adds funds to a wallet that already exists, and a silent skip would let an
|
|
40
|
+
* agent summarise "deployed spider with $500" over a wallet holding $100.
|
|
41
|
+
*/
|
|
42
|
+
/**
|
|
43
|
+
* How a backend `totalFunded` read renders in prose.
|
|
44
|
+
*
|
|
45
|
+
* An unreadable figure is stated as unreadable, never as `$0.00`. Every sentence that quotes this
|
|
46
|
+
* number sits beside an instruction about money, and the two cases call for opposite next steps: a
|
|
47
|
+
* genuine zero says "there is nothing on this wallet", an unread one says "nobody knows yet".
|
|
48
|
+
*/
|
|
49
|
+
export declare function fundedClause(amount: number | undefined): string;
|
|
50
|
+
/** `its $60.00` / `its balance` — the possessive form of the same rule. */
|
|
51
|
+
export declare function itsFunded(amount: number | undefined): string;
|
|
52
|
+
/**
|
|
53
|
+
* The rollback voice of {@link fundedClause}: `funded $250.00` / the unread form.
|
|
54
|
+
*
|
|
55
|
+
* Both sentences it feeds order money moves on the wallet they name — "closing it and returning the
|
|
56
|
+
* funds", "Reclaim the funds from THIS wallet" — so a `?? 0` here told the reader to reclaim from a
|
|
57
|
+
* wallet the same sentence called empty, which reads as "nothing to reclaim, skip it" over money
|
|
58
|
+
* that is genuinely out there. UNKNOWN, never $0.00.
|
|
59
|
+
*/
|
|
60
|
+
export declare function rollbackFundedClause(amount: number | undefined): string;
|
|
61
|
+
/**
|
|
62
|
+
* A live name-match in a status that is neither ACTIVE nor on its way there — PAUSED, mid-teardown,
|
|
63
|
+
* or something this verb does not recognise.
|
|
64
|
+
*
|
|
65
|
+
* Polling these is the bug this builder exists to prevent: a PAUSED strategy never becomes ACTIVE on
|
|
66
|
+
* its own, so waiting on it burns the whole `--max-wait` and then reports the bounded-wait outcome
|
|
67
|
+
* — "re-run to resume, reconciliation waits for it to reach ACTIVE" — which is unactionable on a
|
|
68
|
+
* status that will never get there. The next step is computed from the status actually read,
|
|
69
|
+
* and the non-destructive option always leads.
|
|
70
|
+
*/
|
|
71
|
+
export declare function buildNotDeployableRefusal(matched: StrategySummary, instance: string, pkg: DeployPackage, budget: number | undefined): string;
|
|
72
|
+
export declare function buildBudgetRequiredRefusal(wallets: number, pkg: DeployPackage): string;
|
|
73
|
+
/**
|
|
74
|
+
* `--budget 0` is not "no budget": it parses, and without this gate `planFunding` floors every
|
|
75
|
+
* wallet to MIN_WALLET — funding money the user never asked to spend. `--budget ≤ $0` is also the
|
|
76
|
+
* taxonomy's rule-4 field case: its only known source in the field is a buggy computed hint, so the
|
|
77
|
+
* refusal teaches where the real fix lives instead of letting that loop run. The same gate exists
|
|
78
|
+
* at gateway intake (register.ts), keeping every caller of `runDeploy` covered.
|
|
79
|
+
*/
|
|
80
|
+
export declare function buildBudgetNotPositiveRefusal(budget: number, wallets: number, pkg: DeployPackage): string;
|
|
81
|
+
/**
|
|
82
|
+
* A wallet THIS deploy is funding for less than its own sizing needs.
|
|
83
|
+
*
|
|
84
|
+
* The soft tier's claim is per-wallet, not whole-budget-vs-whole-package, because those two are not
|
|
85
|
+
* the same question on a partially-adopted deploy: `planFunding` splits the budget across the
|
|
86
|
+
* instances still NEEDING a wallet, while the calculated minimum is computed over every instance in
|
|
87
|
+
* the package. Comparing the budget to the package minimum once said "$20.00 is below $30.00" about
|
|
88
|
+
* a re-run that was handing a single $13.50 sleeve the whole $20 — a shortfall that did not exist,
|
|
89
|
+
* attached to an escape that would have closed the adopted, live, funded sleeve beside it.
|
|
90
|
+
*/
|
|
91
|
+
export interface UnderfundedWallet {
|
|
92
|
+
wallet: string;
|
|
93
|
+
/** What `planFunding` allocates this wallet. */
|
|
94
|
+
funded: number;
|
|
95
|
+
/** Its own `perWalletMin` — what its smallest slot needs to open. */
|
|
96
|
+
needs: number;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* The close-then-redeploy escape — the ONLY sequence that actually raises a deployed wallet's size.
|
|
100
|
+
*
|
|
101
|
+
* A bare re-run at a bigger `--budget` is a guaranteed no-op: reconcile matches the strategy by
|
|
102
|
+
* name, ADOPTS it, skips create, and answers with `buildAdoptedWalletDetail`'s "the requested … was
|
|
103
|
+
* NOT added". The agent then has to reverse-engineer the real step from a message it did not
|
|
104
|
+
* expect, and the two likeliest readings are "the deploy failed" and "close it to start clean".
|
|
105
|
+
*
|
|
106
|
+
* SCOPED to the underfunded sleeves. `close.py <id>` tears down the WHOLE package, so on a
|
|
107
|
+
* partially-adopted deploy it would close the adopted, live, funded sleeve that this warn is not
|
|
108
|
+
* even about — the "close-to-replace teardown" class the taxonomy's rule 5 exists to prevent.
|
|
109
|
+
* `--instance` narrows it, and is only omitted when every sleeve in the package really is affected.
|
|
110
|
+
*
|
|
111
|
+
* `existing` is the subset of `under` whose wallets ACTUALLY EXIST on the finished report. An empty
|
|
112
|
+
* one yields no escape at all: on a deploy that failed before create there is no "it" to close, and
|
|
113
|
+
* offering a teardown for a wallet that was never made is a false premise plus a pointless step.
|
|
114
|
+
*/
|
|
115
|
+
export declare function buildBudgetEscape(pkg: DeployPackage, min: MinBudgetResult, state: SoftEscapeState): string;
|
|
116
|
+
/**
|
|
117
|
+
* What the finished report can actually support behind an escape. Every field is read from terminal
|
|
118
|
+
* state, never from the plan — the whole point is that the emitted command's preconditions hold.
|
|
119
|
+
*/
|
|
120
|
+
export interface SoftEscapeState {
|
|
121
|
+
/**
|
|
122
|
+
* Short sleeves with a live runtime — the only ones `close.py --instance` can resolve — MINUS any
|
|
123
|
+
* declaring `funding_share: 0`, which no close-and-redeploy can help (see `zeroShareSentence`).
|
|
124
|
+
*/
|
|
125
|
+
closable: string[];
|
|
126
|
+
/** Short sleeves holding a funded wallet with NO runtime: strandable, not closable by instance. */
|
|
127
|
+
strandedNames: string[];
|
|
128
|
+
/** Instances a re-run would fund (no live wallet), which is what sizes the redeploy hint. */
|
|
129
|
+
walletless: string[];
|
|
130
|
+
/** Short sleeves declaring `funding_share: 0` — money cannot fix them; the manifest can. */
|
|
131
|
+
zeroShare: string[];
|
|
132
|
+
/** `[E_ROLLBACK_INCOMPLETE]` is on this report and owns the cleanup instruction. */
|
|
133
|
+
rollbackIncomplete: boolean;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Which of the short sleeves the terminal report actually shows funded / carrying a runtime.
|
|
137
|
+
* The two claims a note makes ride different facts — "this deploy funds X" is about the WALLET,
|
|
138
|
+
* "X will run" is about the RUNTIME — and each is judged per row, so a mixed report (some sleeves
|
|
139
|
+
* installed, some stranded or never created) can no longer assert one tense about all of them.
|
|
140
|
+
*/
|
|
141
|
+
interface SoftTense {
|
|
142
|
+
funded: Set<string>;
|
|
143
|
+
running: Set<string>;
|
|
144
|
+
}
|
|
145
|
+
/** Forward-looking tense for the preflight narration: everything is about to be funded and run. */
|
|
146
|
+
export declare function forwardTense(under: UnderfundedWallet[]): SoftTense;
|
|
147
|
+
/**
|
|
148
|
+
* The soft-tier note, assembled from the facts plus whatever escape the caller's state supports.
|
|
149
|
+
* ONE producer for both codes' strings — the preflight narration and the final report differ only
|
|
150
|
+
* in `escape`, so they can never drift into two different accounts of the same finding.
|
|
151
|
+
*/
|
|
152
|
+
export declare function buildSoftBudgetNote(pkg: DeployPackage, min: MinBudgetResult, under: UnderfundedWallet[], escape: string, tense: SoftTense): string | null;
|
|
153
|
+
/**
|
|
154
|
+
* What both OUTCOME-tier rows carry: which sleeve, which wallet, what was asked of the backend for
|
|
155
|
+
* it — and who did the asking.
|
|
156
|
+
*
|
|
157
|
+
* Every other budget check on this report judges the PLAN — what `planFunding` decided to ask for,
|
|
158
|
+
* against the package's own sizing, before a wallet exists. The two rows below are the only ones
|
|
159
|
+
* that judge the OUTCOME: the post-create strategy read against the ask that produced it.
|
|
160
|
+
*
|
|
161
|
+
* The shape is shared so the two notes cannot drift on the same fact. They are read together, on
|
|
162
|
+
* one report, about one package: one saying a wallet was created and the other saying the same
|
|
163
|
+
* wallet was adopted is a report contradicting itself.
|
|
164
|
+
*/
|
|
165
|
+
interface OutcomeFundedWallet {
|
|
166
|
+
/** Sleeve name — how the package, the escape commands and the step table all name it. */
|
|
167
|
+
instance: string;
|
|
168
|
+
/** The address, because the non-destructive fix (a top-up) is performed against it. */
|
|
169
|
+
wallet: string;
|
|
170
|
+
/** What the create call asked the backend for — this run's ask, or a prior run's (see below). */
|
|
171
|
+
requested: number;
|
|
172
|
+
/**
|
|
173
|
+
* Whether THIS run created the wallet, so the note can say which of the two it is looking at
|
|
174
|
+
* instead of assuming a create.
|
|
175
|
+
*
|
|
176
|
+
* It is `run.needsWallet`, not the create step's status: an ADOPTED wallet that was still
|
|
177
|
+
* initializing reaches `ok` through the very same ACTIVE poll a freshly created one does, so the
|
|
178
|
+
* status alone cannot tell them apart. Only `needsWallet` marks the run that actually called
|
|
179
|
+
* create — it is the same flag the rollback and the unwired-install detail use for "created by
|
|
180
|
+
* this job".
|
|
181
|
+
*
|
|
182
|
+
* The ask follows from it: a created wallet's is this run's own `fundAmount`, an adopted one's is
|
|
183
|
+
* the amount a PRIOR run journaled ({@link DeployParams.priorRequested}), which is exactly the
|
|
184
|
+
* path that puts an adoption in front of these notes.
|
|
185
|
+
*
|
|
186
|
+
* It is a per-wallet fact and stays one. Neither note may generalise it over the deploy: each row
|
|
187
|
+
* set is FILTERED (one holds the short wallets, the other the unreadable ones), so nothing about
|
|
188
|
+
* the wallets outside it can be read out of it.
|
|
189
|
+
*/
|
|
190
|
+
created: boolean;
|
|
191
|
+
}
|
|
192
|
+
/** A wallet the backend funded for materially less than was asked for it. */
|
|
193
|
+
export interface PartialFundedWallet extends OutcomeFundedWallet {
|
|
194
|
+
/** What the post-create `strategy_list` read reports the wallet actually holds. */
|
|
195
|
+
funded: number;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* A wallet whose funded amount the backend did not report on the post-create read.
|
|
199
|
+
*
|
|
200
|
+
* Split from {@link PartialFundedWallet} rather than folded into it as a `funded: 0`, because the
|
|
201
|
+
* two demand OPPOSITE next steps: a real zero is a shortfall with a computable top-up, an unread
|
|
202
|
+
* figure is a wallet that may already hold the full amount. Only the ask is known here.
|
|
203
|
+
*/
|
|
204
|
+
export type UnreadableFundedWallet = OutcomeFundedWallet;
|
|
205
|
+
/**
|
|
206
|
+
* The OUTCOME tier's warn: the backend funded a wallet for materially less than the create call
|
|
207
|
+
* asked for (a partial bridge, a rejected top-up leg — the deploy sees only the result). The
|
|
208
|
+
* successor to the skills-side verify gate's `_budget_verdict`, which reported the whole strategy
|
|
209
|
+
* "not live" over the same finding.
|
|
210
|
+
*
|
|
211
|
+
* It is a `W_`, and the difference from that predecessor is the point: the strategy IS live, its
|
|
212
|
+
* wallet holds real money and its runtime is ticking. Reporting `not-live` (or letting this change
|
|
213
|
+
* `overall`) would send an agent to close a funded, running strategy over a shortfall a top-up
|
|
214
|
+
* fixes. So it warns, the exit code stays whatever the deploy earned, and the remediation leads
|
|
215
|
+
* with the NON-destructive route.
|
|
216
|
+
*
|
|
217
|
+
* It deliberately emits NO teardown command. `close.py`'s correct scope depends on state this note
|
|
218
|
+
* does not own — adopted siblings, wallets stranded with no runtime, an `[E_ROLLBACK_INCOMPLETE]`
|
|
219
|
+
* line already claiming the cleanup — and the report already has exactly one producer of close
|
|
220
|
+
* commands ({@link buildBudgetEscape}). A second, differently scoped teardown beside it is the
|
|
221
|
+
* self-contradiction the taxonomy's rule 5 exists to prevent, and an agent reconciling two of them
|
|
222
|
+
* runs whichever executes. The destructive option is named as an option and routed through
|
|
223
|
+
* read-only triage, which is the only command here and cannot destroy anything.
|
|
224
|
+
*
|
|
225
|
+
* Two properties of the note are load-bearing and easy to lose:
|
|
226
|
+
* - `reassure` — the "nothing is broken, the strategy is LIVE" sentence is a CLAIM about the rest
|
|
227
|
+
* of the report, so it is only made when the report PROVES it: `overall === "live"` and nothing
|
|
228
|
+
* less (see the gate at the call site). Asserted unconditionally it rode `failed` and `pending`
|
|
229
|
+
* reports saying the opposite two lines above; gated only loosely it rode
|
|
230
|
+
* `installed-unobserved` ones, where no tick was ever seen.
|
|
231
|
+
* - the figures are DATED and the top-up is routed through a fresh read. This note persists on the
|
|
232
|
+
* job snapshot and re-renders on every later `deploy status`, and unlike every other budget note
|
|
233
|
+
* it asserts a MUTABLE backend quantity whose fix is exactly the action that invalidates it — so
|
|
234
|
+
* an undated "short $440.00" invites a second $440 top-up after the first one landed.
|
|
235
|
+
* - PROVENANCE, exactly as its unreadable sibling carries it. This note is reachable on the
|
|
236
|
+
* ADOPTION path too — the ask is looked up from a prior run's journal for the strategy this run
|
|
237
|
+
* adopted — where "SHORT of what this deploy requested … funded $60.00 of requested $500.00"
|
|
238
|
+
* named a request this run never made about a wallet it never funded ($500 was the earlier run's
|
|
239
|
+
* ask; this one asked for nothing and created nothing). The lead attributes the ask to no one and
|
|
240
|
+
* each wallet states its own origin, so a reader can correct the figure from the note itself.
|
|
241
|
+
*/
|
|
242
|
+
export declare function buildPartialFundNote(pkg: DeployPackage, rows: PartialFundedWallet[], reassure: boolean): string;
|
|
243
|
+
/**
|
|
244
|
+
* The unreadable-read sibling of {@link buildPartialFundNote}: the ask is known, the landed amount
|
|
245
|
+
* is not, so this note makes NO percentage claim, NO dollar shortfall, and asks for no money move.
|
|
246
|
+
*
|
|
247
|
+
* The failure it replaces: the client coerced a missing/unparseable `totalFunded` to `0`, which
|
|
248
|
+
* turned one bad read into `funded $0.00 of requested $500.00 (0%)` plus an instruction to add
|
|
249
|
+
* $500 — against a wallet that may already hold the full amount, so following it doubled the
|
|
250
|
+
* deployment. An unread figure is not a small figure; the only honest next step is for the USER to
|
|
251
|
+
* establish what is actually on the wallet.
|
|
252
|
+
*
|
|
253
|
+
* `reassure` is the same earned-claim gate its sibling carries, and for the same reason: "the
|
|
254
|
+
* create succeeded and the strategy is running" is a claim about the REST of the report, and this
|
|
255
|
+
* note is reachable on `failed` and `pending` reports through the adoption path — asserted
|
|
256
|
+
* unconditionally it rode a verdict saying the opposite two lines above. Without it the note keeps
|
|
257
|
+
* every fact it owns (the amount is unreadable, verify before moving money) and makes no claim
|
|
258
|
+
* about what the deploy left running.
|
|
259
|
+
*
|
|
260
|
+
* PROVENANCE is the other claim it may not invent, and it is claimed PER WALLET only. The note is
|
|
261
|
+
* reachable on the ADOPTION path — a journaled ask is looked up for exactly the strategy a prior
|
|
262
|
+
* run created — so "wallet(s) this deploy created" described a create that never happened on a
|
|
263
|
+
* crash-resume that adopted, created nothing and funded nothing, handing the reader a second wallet
|
|
264
|
+
* that does not exist. Each wallet therefore states its own origin from
|
|
265
|
+
* {@link UnreadableFundedWallet.created}.
|
|
266
|
+
*
|
|
267
|
+
* No sentence here generalises that over the deploy. `rows` is a FILTERED set — the wallets whose
|
|
268
|
+
* funded figure came back unreadable — so nothing about the OTHER wallets can be read out of it,
|
|
269
|
+
* and a `rows.every(...)` looks exactly like a deploy-level fact while being one about the subset:
|
|
270
|
+
* a deploy that created `main` (readable $300) and adopted `scalp` (unreadable) has `rows =
|
|
271
|
+
* [scalp]`, and "this deploy created no wallet" is then flatly false about the $300 it just moved.
|
|
272
|
+
* The only deploy-level claim allowed is the one `reassure` proves — the report says `live`, so the
|
|
273
|
+
* strategy is running — and it names no create and no adoption.
|
|
274
|
+
*/
|
|
275
|
+
export declare function buildFundedUnreadableNote(pkg: DeployPackage, rows: UnreadableFundedWallet[], reassure: boolean): string;
|
|
276
|
+
export declare function buildDecisionModelRefusal(instance: string, pkg: DeployPackage, budget?: number): string;
|
|
277
|
+
export declare function buildDecisionModelEnvRefusal(instance: string, pkg: DeployPackage): string;
|
|
278
|
+
/** What the blind-runtime teardown actually achieved — the detail is computed from it, not assumed. */
|
|
279
|
+
export type RuntimeRemoval = {
|
|
280
|
+
ok: true;
|
|
281
|
+
} | {
|
|
282
|
+
ok: false;
|
|
283
|
+
error: string;
|
|
284
|
+
};
|
|
285
|
+
/**
|
|
286
|
+
* An install that came up with NO live entry scanners (`payload.unwired`). The runtime came UP and
|
|
287
|
+
* is BLIND, and every one of the three phases is deterministic on this box — so this is an install
|
|
288
|
+
* failure, not a tick that has not landed yet.
|
|
289
|
+
*
|
|
290
|
+
* Says what is true (it will never tick), what was NOT done (no scanner ever mounted), and — the
|
|
291
|
+
* part that has to track reality — what is LEFT on the box. The two teardown outcomes leave
|
|
292
|
+
* different states, so they never share a sentence: naming `senpi runtime delete` after a
|
|
293
|
+
* successful delete points at a runtime that no longer exists, and omitting it after a failed one
|
|
294
|
+
* hides a runtime still running against a wallet this job is about to close.
|
|
295
|
+
*
|
|
296
|
+
* The NEXT STEP is per-phase for the same reason. One ladder ("delete, fix, re-run") cannot serve
|
|
297
|
+
* all three: only `install_wire` is fixable in the package, and on `no_intake` re-running is a loop
|
|
298
|
+
* that cannot terminate — create → fund → install → unwired → close, moving real money out and
|
|
299
|
+
* back on every iteration — because the cause is box-level and the intake context is built once at
|
|
300
|
+
* plugin register. No emitted command may require a precondition the state lacks.
|
|
301
|
+
*/
|
|
302
|
+
export declare function buildUnwiredInstallDetail(params: {
|
|
303
|
+
phase: string;
|
|
304
|
+
runtimeId: string;
|
|
305
|
+
wallet: string;
|
|
306
|
+
/** false = the wallet predates this deploy, so no rollback follows and it stays live. */
|
|
307
|
+
createdByThisJob: boolean;
|
|
308
|
+
removal: RuntimeRemoval;
|
|
309
|
+
}): string;
|
|
310
|
+
/**
|
|
311
|
+
* The install step's detail when this deploy stopped waiting on an install it could not cancel.
|
|
312
|
+
*
|
|
313
|
+
* Every clause here is load-bearing. The install is IN-PROCESS work that takes no signal, so this
|
|
314
|
+
* deploy giving up says nothing about what the install did — and a detail that guessed either way
|
|
315
|
+
* would send a reader to close a wallet a runtime may have just come up on. So the claim is the
|
|
316
|
+
* only one both reads support: the outcome is unknown. The read that resolves it is free and
|
|
317
|
+
* non-destructive, so it leads; the money-moving step is conditional on its answer, and carries the
|
|
318
|
+
* same live-sleeve caveat the rollback path uses, because the same package may hold other wallets.
|
|
319
|
+
*
|
|
320
|
+
* The detail forks on TWO facts, because one was not enough to make either instruction true.
|
|
321
|
+
*
|
|
322
|
+
* `createdByThisJob` (the same flag {@link buildUnwiredInstallDetail} branches on) decides whether a
|
|
323
|
+
* close is even on the table. A wallet this job created was never closed BECAUSE the install might
|
|
324
|
+
* still bind it — the causal claim, and the reclaim instruction, both hold, and the money is this
|
|
325
|
+
* job's own to reclaim. A wallet this job ADOPTED predates the deploy: D-6 never closes an adopted
|
|
326
|
+
* wallet regardless of how the install lands, so "would have closed it but for the race" is false on
|
|
327
|
+
* that wallet, and `funded` is the caller's pre-existing balance — not a close target this deploy
|
|
328
|
+
* has any standing to name.
|
|
329
|
+
*
|
|
330
|
+
* `stillInFlight` is the wallet's install FENCE, read as this detail is written, and it decides
|
|
331
|
+
* whether ANY instruction may be given yet. `installRuntimeCore` writes its registry row and takes
|
|
332
|
+
* its MCP wallet-ownership check BEFORE `run()` — the modal wedge — so at this instant the install
|
|
333
|
+
* can be sitting anywhere in that sequence with the fence still held. Two things follow, and both
|
|
334
|
+
* used to be wrong here:
|
|
335
|
+
* - a registry ROW is not proof the install landed. The row is written first; `senpi.listRuntimes`
|
|
336
|
+
* renders exactly that state `status: "stopped"`. The landed claim is therefore keyed on the
|
|
337
|
+
* runtime showing RUNNING, never on a row existing.
|
|
338
|
+
* - while the fence is held, no close may be named at all. An install wedged at the ownership
|
|
339
|
+
* check has written NO row, so "if NO row names that wallet, reclaim the funds" pointed straight
|
|
340
|
+
* at a `strategy_close` that races the install into the one state this whole carve-out exists to
|
|
341
|
+
* prevent — a live runtime trading a closed strategy.
|
|
342
|
+
* An UNREADABLE fence (`undefined`) takes the in-flight arm: it cannot be proven clear, and the
|
|
343
|
+
* only unsafe mistake here is naming a close over an install that is still running.
|
|
344
|
+
*/
|
|
345
|
+
export declare function buildInstallIndeterminateDetail(args: {
|
|
346
|
+
wallet: string;
|
|
347
|
+
funded: number | undefined;
|
|
348
|
+
runtimeId: string;
|
|
349
|
+
deadlineMs: number;
|
|
350
|
+
createdByThisJob: boolean;
|
|
351
|
+
/**
|
|
352
|
+
* Is an install still in flight on this wallet right now (`deps.installPendingOnWallet`)?
|
|
353
|
+
* `undefined` = the fence could not be read, which is treated as "assume it is".
|
|
354
|
+
*/
|
|
355
|
+
stillInFlight: boolean | undefined;
|
|
356
|
+
resume: string;
|
|
357
|
+
caveat: string;
|
|
358
|
+
}): string;
|
|
359
|
+
/**
|
|
360
|
+
* The install step's detail when this deploy found an install already running on the wallet.
|
|
361
|
+
*
|
|
362
|
+
* The refusal `installRuntimeCore` renders for the same condition is the enforcement copy; this one
|
|
363
|
+
* exists because deploy reaches the condition one step earlier — before the dead-row branch that
|
|
364
|
+
* would delete the in-flight install's registry row — and so can say what deploy did (nothing) as
|
|
365
|
+
* well as what it found. Both name the same reads and neither names a delete, and this one now
|
|
366
|
+
* carries the same install-bound and wedge-vs-restart facts the enforcement copy does — deploy is
|
|
367
|
+
* the primary path, so it is the one most readers see, and a weaker message here would invert which
|
|
368
|
+
* of the two is the source of truth. The one fact it deliberately does NOT reach parity on is elapsed
|
|
369
|
+
* time: `installPendingOnWallet` reports a boolean, not when the install started, and the job's own
|
|
370
|
+
* timing is already what `openclaw senpi deploy status` (named below) shows.
|
|
371
|
+
*/
|
|
372
|
+
export declare function buildInstallInFlightDetail(args: {
|
|
373
|
+
wallet: string;
|
|
374
|
+
runtimeId: string;
|
|
375
|
+
}): string;
|
|
376
|
+
/**
|
|
377
|
+
* A strategy the ACTIVE poll watched go DEAD. Terminal, so the poll stops on it — and the claim it
|
|
378
|
+
* replaces is the point: `buildCreatePendingDetail` would have said "waits for it to reach ACTIVE,
|
|
379
|
+
* never creating a second wallet", and on this input neither half holds. It never reaches ACTIVE,
|
|
380
|
+
* and reconcile filters dead statuses on BOTH match routes, so a re-run creates and funds a fresh
|
|
381
|
+
* wallet beside it. The status only ever survived in the step evidence; here it leads the claim.
|
|
382
|
+
*/
|
|
383
|
+
export declare function buildCreateDeadDetail(pkg: DeployPackage, budget: number | undefined, live: StrategySummary, createdByThisJob: boolean): string;
|
|
384
|
+
/**
|
|
385
|
+
* A strategy the ACTIVE poll watched settle on a status that is neither ACTIVE nor on the way
|
|
386
|
+
* there — PAUSED, mid-teardown, or one this build does not recognise.
|
|
387
|
+
*
|
|
388
|
+
* Only {@link INITIALIZING_STATUSES} resolve on their own, so only they are worth waiting on;
|
|
389
|
+
* everything else burned the full `--max-wait` and was then reported with the bounded-wait detail's
|
|
390
|
+
* "re-run; reconciliation waits for it to reach ACTIVE" promise, which none of them will honour.
|
|
391
|
+
*
|
|
392
|
+
* The REMEDIATION branches, and must: the create step gets no D-6 rollback (only an install failure
|
|
393
|
+
* rolls a wallet back), so a wallet this job created and funded seconds ago is still live when this
|
|
394
|
+
* is read. One shared "reclaim it FIRST with `strategy_close`" told an agent to tear down a wallet
|
|
395
|
+
* on a status this build cannot interpret — the exact opposite of what
|
|
396
|
+
* {@link buildNotDeployableRefusal} says for the same input at the reconcile seam ("will not guess
|
|
397
|
+
* … NEVER close or recreate to 'start clean'"). The two seams now agree arm for arm: a teardown is
|
|
398
|
+
* offered only where the status PROVES the strategy is not coming back.
|
|
399
|
+
*/
|
|
400
|
+
export declare function buildCreateNotDeployableDetail(pkg: DeployPackage, budget: number | undefined, live: StrategySummary, createdByThisJob: boolean,
|
|
401
|
+
/**
|
|
402
|
+
* The scoped start-over clause — see {@link buildPackageCloseOffer}. Used by the PAUSED arm
|
|
403
|
+
* only. Completes the sentence "If you meant to start over instead, …" and carries its own
|
|
404
|
+
* terminal period; the arm appends nothing to it.
|
|
405
|
+
*/
|
|
406
|
+
closeOffer: string): string;
|
|
407
|
+
/**
|
|
408
|
+
* Is the NAME route even open for this row — i.e. does it carry the name a re-run will look up?
|
|
409
|
+
*
|
|
410
|
+
* Reconcile has two match routes: `strategyName` (case-folded, non-empty on both sides) and a
|
|
411
|
+
* create key journaled by THIS box. This is the name comparison out of `resolveInstanceBinding`,
|
|
412
|
+
* and it is a NECESSARY condition for that route, never a sufficient one. Reconcile applies three
|
|
413
|
+
* further filters this function cannot see, all of them about rows other than the one held here:
|
|
414
|
+
* it drops `DEAD_STATUSES` before comparing, it refuses when the surviving list carries a foreign
|
|
415
|
+
* `skillName` stamp (`E_WALLET_OWNED_BY_OTHER_PACKAGE`), and it refuses when more than one
|
|
416
|
+
* candidate answers to the name (`E_STATE_AMBIGUOUS_WALLETS`). All three are executed and all three
|
|
417
|
+
* create nothing — so a `false` here means "the name route is closed", while a `true` means only
|
|
418
|
+
* "it is not closed by the name", which is why the sentence it feeds states its outcome as
|
|
419
|
+
* conditional rather than as a fact.
|
|
420
|
+
*
|
|
421
|
+
* A `false` is not hypothetical: the unnamed create retry sends no `strategyName` at all (it is
|
|
422
|
+
* `.optional()` in the MCP schema), so the backend names that wallet itself and the row comes back
|
|
423
|
+
* under a name this package will never derive.
|
|
424
|
+
*/
|
|
425
|
+
export declare function reconcileCanMatchByName(wantedName: string, live: StrategySummary): boolean;
|
|
426
|
+
/**
|
|
427
|
+
* The bounded wait ran out. What this renders is what it READ, plus the one thing it can promise.
|
|
428
|
+
*
|
|
429
|
+
* The poll's success test is ACTIVE **and** a readable wallet address; everything else that is not
|
|
430
|
+
* ACTIVE is intercepted before the deadline (dead → `failed`, neither-ACTIVE-nor-initializing →
|
|
431
|
+
* `failed`), and reconcile refuses those statuses one screen earlier. So what lands here is either
|
|
432
|
+
* a row still on its way to ACTIVE, or a row that already READS ACTIVE whose address could not be
|
|
433
|
+
* read — plus the degenerate reads (no row at all, unparseable `createdAt`), which keep the
|
|
434
|
+
* initializing branch's wording because they establish nothing to say instead. The two payloads
|
|
435
|
+
* differ in what is MISSING, and that is the one place they diverge here: ACTIVE for the first, the
|
|
436
|
+
* wallet address for the second.
|
|
437
|
+
*
|
|
438
|
+
* It states no outcome for a re-run beyond the money invariant, and the reason is structural. This
|
|
439
|
+
* builder holds ONE row, read by id. How many live rows answer to the name a re-run looks up, what
|
|
440
|
+
* stamps THOSE rows carry, whether a create key journaled on this box still resolves, and whether
|
|
441
|
+
* the address becomes readable are facts about things it did not read and must not read here — a
|
|
442
|
+
* detail that can throw is a detail that sometimes does not render. Four rounds enumerated those
|
|
443
|
+
* outcomes anyway: the enumeration grew to 16 predicted branches across the four arms and was still
|
|
444
|
+
* false on six executed payloads, twice along axes its stated conditions never named. Predicting
|
|
445
|
+
* from a read that cannot see the deciding facts does not converge, so this renders none of it.
|
|
446
|
+
*
|
|
447
|
+
* What survives is {@link noSecondWalletWhileNamedLive} / {@link secondWalletRiskWhenNameRouteClosed}
|
|
448
|
+
* — one class statement about money per arm, scoped to this strategy and executed at its boundary
|
|
449
|
+
* rather than reasoned — then {@link FACTS_THAT_DECIDE}, which names facts WITHOUT attaching
|
|
450
|
+
* outcomes to them or claiming to have listed them all, and {@link triageThenNeverClose}, which
|
|
451
|
+
* carries the only next step that is correct whatever the next read finds, the shape of the failure
|
|
452
|
+
* this is all about ({@link oneWalletPerStrategy}), and the one act that must never follow. Every
|
|
453
|
+
* arm ends on those two, because the tail is what a reader in a hurry acts on.
|
|
454
|
+
*/
|
|
455
|
+
export declare function buildCreatePendingDetail(pkg: DeployPackage, budget: number | undefined, waitedSec: number, live: StrategySummary | undefined, nowMs: number, wantedName: string): string;
|
|
456
|
+
/**
|
|
457
|
+
* Live wallets carry this package's stamp, and none of them answered for this instance.
|
|
458
|
+
*
|
|
459
|
+
* Rendered from the reconcile read alone — no additional network calls, because a gate that can
|
|
460
|
+
* fail to render is a gate that sometimes does not fire. Every column is quoted from that read and
|
|
461
|
+
* says so when it is unreadable: an unread funded amount is the one number a reader would otherwise
|
|
462
|
+
* take for an empty wallet. The name column is there because a missing/differing name is WHY the
|
|
463
|
+
* match failed, and it is the fact that tells a reader whether this is old-tooling residue or a
|
|
464
|
+
* backend that renamed what deploy created.
|
|
465
|
+
*
|
|
466
|
+
* The destructive route is named LAST and behind the read-only one, with its real blast radius on
|
|
467
|
+
* the same line: a refusal that names only a teardown gets followed.
|
|
468
|
+
*
|
|
469
|
+
* The consequence sentence is hedged for the same reason the columns are: this read is metadata,
|
|
470
|
+
* so "left funded, in position and supervised by nothing" would assert two things nothing here
|
|
471
|
+
* looked at (no position read, no `registryFindById`/`runtimeIsLive` call) — and the second can be
|
|
472
|
+
* plainly false, since install rebinds only the registry row for `<id>-<instance>` and a wallet
|
|
473
|
+
* carrying a different runtime id keeps its runtime. What is unread is named as unread; that is
|
|
474
|
+
* the argument for stopping, not a weaker version of it.
|
|
475
|
+
*/
|
|
476
|
+
export declare function buildBindingUnknownRefusal(pkg: DeployPackage, instance: string, wantedName: string, candidates: StrategySummary[], budget: number | undefined): string;
|
|
477
|
+
/**
|
|
478
|
+
* Every live strategy under the name this instance answers to is stamped for a DIFFERENT package.
|
|
479
|
+
*
|
|
480
|
+
* The counterpart to {@link buildBindingUnknownRefusal} on the other match route, and the harder of
|
|
481
|
+
* the two to word: nothing here is the operator's to close. The wallets named belong to another
|
|
482
|
+
* package — its positions, its balance, possibly its running runtime — so the only routes offered
|
|
483
|
+
* are edits to THIS package and reads. Re-running is explicitly not one of them: the name is
|
|
484
|
+
* derived, so it comes out identical every time, which is exactly why the collision is structural
|
|
485
|
+
* rather than transient.
|
|
486
|
+
*
|
|
487
|
+
* Neither is "set `id:` back to the stamp and re-run", which this refusal used to offer. The name
|
|
488
|
+
* is derived FROM the id ({@link walletName}: `sanitizeStrategyName(id)`, or `<id>-<instance>` for
|
|
489
|
+
* a multi-sleeve package), and a loadable id is sanitize-stable by construction
|
|
490
|
+
* (`assertIdentityRoundTrips`), so changing the id to the stamp changes the derived name by exactly
|
|
491
|
+
* as much — the run after the edit looks for a name the matched wallet does not carry, finds
|
|
492
|
+
* nothing, and refuses again from the gate instead, whose remedy is the whole-package `close.py`
|
|
493
|
+
* this refusal's last line forbids. Only the id AND the sleeve layout restored together re-derive
|
|
494
|
+
* the matched name, which is a restructure of this package, not a field edit — so the route ends at
|
|
495
|
+
* the read and hands the decision to the user.
|
|
496
|
+
*/
|
|
497
|
+
export declare function buildForeignPackageRefusal(pkg: DeployPackage, instance: string, wantedName: string, candidates: StrategySummary[], budget: number | undefined): string;
|
|
498
|
+
/**
|
|
499
|
+
* Refusal for a package whose instances ship no DSL exit block. Rendered BEFORE any wallet exists:
|
|
500
|
+
* funding a strategy that cannot stop itself out is the "funded-but-no-DSL" hole, and the skills-side
|
|
501
|
+
* validator has always refused it.
|
|
502
|
+
*/
|
|
503
|
+
export declare function buildNoDslExitRefusal(instances: DeployInstance[], pkg: DeployPackage): string;
|
|
504
|
+
/**
|
|
505
|
+
* A recipe that does not bind the wallet its manifest promises, refused before a wallet exists.
|
|
506
|
+
*
|
|
507
|
+
* Names the two addresses side by side because the failure is precisely that they are two: the
|
|
508
|
+
* money this run would move, and the account the strategy would trade. It states the edit rather
|
|
509
|
+
* than a command, in the {@link buildInstanceDirCollisionRefusal} spirit — the fix is one line in a
|
|
510
|
+
* file the reader already has open, and no command can make it for them.
|
|
511
|
+
*/
|
|
512
|
+
export declare function buildUnboundWalletRefusal(faults: WalletBindingFault[], pkg: DeployPackage): string;
|
|
513
|
+
/**
|
|
514
|
+
* A package id carrying capitals, refused before any wallet exists to carry the wrong stamp.
|
|
515
|
+
*
|
|
516
|
+
* Deploy's copy of `register.ts`'s gate — same rule, same fix (built from the one producer in
|
|
517
|
+
* `package.ts`, so the edit an author reads is word-for-word identical), different standing
|
|
518
|
+
* sentence: nothing was CREATED here, where the gateway's copy could only say nothing was started.
|
|
519
|
+
*
|
|
520
|
+
* The re-run command names the directory the fix LEAVES BEHIND, not the one that failed — this is
|
|
521
|
+
* the only refusal in the verb whose own instruction can move the package.
|
|
522
|
+
*/
|
|
523
|
+
export declare function buildNonLowercaseIdRefusal(pkg: DeployPackage, budget?: number): string;
|
|
524
|
+
/**
|
|
525
|
+
* The refusal for a manifest whose funding shares allocate more than the whole budget.
|
|
526
|
+
*
|
|
527
|
+
* States the arithmetic and nothing about the outcome: the sum, every sleeve's effective share, and
|
|
528
|
+
* the amount the plan would have moved against the amount authorized. A reader can check each
|
|
529
|
+
* figure against the file named, which is the point — the defect is a typo in one line of
|
|
530
|
+
* `strategy.yaml`, and the fastest fix is seeing which share is wrong.
|
|
531
|
+
*
|
|
532
|
+
* The fix is the author's, and only they can make it: which sleeve should be smaller is a decision
|
|
533
|
+
* about the strategy, not one this gate can compute. So it names the constraint (the shares are a
|
|
534
|
+
* split of ONE budget) and the file, and offers no edit of its own — a hint naming a particular
|
|
535
|
+
* share would be a guess presented as an instruction. Deliberately no teardown route either:
|
|
536
|
+
* nothing was created, so there is nothing to tear down.
|
|
537
|
+
*/
|
|
538
|
+
export declare function buildShareOverrunRefusal(overrun: ShareOverrun, pkg: DeployPackage, budget: number): string;
|
|
539
|
+
/**
|
|
540
|
+
* The install gate's refusal, rendered for deploy rather than for the gateway.
|
|
541
|
+
*
|
|
542
|
+
* Same findings, different standing sentence: the gateway's copy says a recipe cannot be installed,
|
|
543
|
+
* which is all that is true there. Here the run had money to move and did not move it, and that is
|
|
544
|
+
* the fact a reader needs first — so it is stated, and the re-check names `senpi validate` on the
|
|
545
|
+
* instance directory rather than "run validate on the package" in the abstract.
|
|
546
|
+
*
|
|
547
|
+
* Deploy's refusal shape: bracketed code first (taxonomy.ts:16 reads it), then what/why/fix.
|
|
548
|
+
*/
|
|
549
|
+
export declare function buildInstallGateRefusal(gate: InstallGateResult, inst: DeployInstance, pkg: DeployPackage, budget?: number): string;
|
|
550
|
+
/**
|
|
551
|
+
* The gate itself could not run. NOT a verdict on the recipe — so it carries no taxonomy code and
|
|
552
|
+
* names no offending field, exactly like the universe check's `unavailable` branch.
|
|
553
|
+
*/
|
|
554
|
+
export declare function buildInstallGateUnavailableDetail(inst: DeployInstance, reason: string): string;
|
|
555
|
+
/**
|
|
556
|
+
* D-2 (revised 2026-08-05): a scanner-level `enabled` key is refused outright — the engine never
|
|
557
|
+
* reads it (see {@link scannersDeclaringEnabled}), so accepting `enabled: false` would ship a
|
|
558
|
+
* strategy that ticks and trades while its author believes it is switched off. Package-derivable,
|
|
559
|
+
* so it is decided synchronously here rather than discovered later; observe keeps its own
|
|
560
|
+
* all-disabled branch for the live-state case, which the runtime API can genuinely produce.
|
|
561
|
+
*
|
|
562
|
+
* Every offense is enumerated in ONE refusal, each as a delete-this-line instruction naming the
|
|
563
|
+
* key, the scanner, the instance and the file: a reader (agent or human) fixes the whole package in
|
|
564
|
+
* one pass instead of re-running to discover the next one.
|
|
565
|
+
*/
|
|
566
|
+
export declare function buildScannerEnabledUnsupportedRefusal(offenders: ScannerEnabledKey[], pkg: DeployPackage): string;
|
|
567
|
+
/**
|
|
568
|
+
* A create this job stopped waiting on at its per-call deadline. Deliberately NOT phrased as
|
|
569
|
+
* "creation failed": the deadline bounds the WAIT, not the backend's work, so the wallet may come
|
|
570
|
+
* into existence after this line is written. Naming both reconcile routes — and the one case
|
|
571
|
+
* neither can see — is what lets the operator check rather than guess.
|
|
572
|
+
*/
|
|
573
|
+
export declare function buildCreateAbandonedDetail(args: {
|
|
574
|
+
instance: string;
|
|
575
|
+
strategyName: string;
|
|
576
|
+
/** True when the abandoned call was the UNNAMED retry after a name rejection — see below. */
|
|
577
|
+
nameFallbackFired: boolean;
|
|
578
|
+
fundAmount: number;
|
|
579
|
+
message: string | undefined;
|
|
580
|
+
pkg: DeployPackage;
|
|
581
|
+
budget?: number;
|
|
582
|
+
}): string;
|
|
583
|
+
/**
|
|
584
|
+
* The name-rejection retry that was NOT issued because the deadline stop landed between the two
|
|
585
|
+
* creates.
|
|
586
|
+
*
|
|
587
|
+
* Not a variant of {@link buildCreateAbandonedDetail}: nothing was abandoned mid-call here. One
|
|
588
|
+
* create was issued and the backend answered it; the second one — the money-moving call this run
|
|
589
|
+
* would otherwise have made with no step boundary in front of it — never went out. So the line says
|
|
590
|
+
* what was attempted, what was not, and leaves the rejected create's own residue to the same check
|
|
591
|
+
* every rejection carries: reconcile re-reads the live list before it creates anything.
|
|
592
|
+
*/
|
|
593
|
+
export declare function buildCreateNameRetryNotIssuedDetail(args: {
|
|
594
|
+
instance: string;
|
|
595
|
+
strategyName: string;
|
|
596
|
+
fundAmount: number;
|
|
597
|
+
message: string | undefined;
|
|
598
|
+
pkg: DeployPackage;
|
|
599
|
+
budget?: number;
|
|
600
|
+
}): string;
|
|
601
|
+
export declare function buildUnobservedDetail(waitSec: number, runtimeId: string): string;
|
|
602
|
+
export {};
|
|
603
|
+
//# sourceMappingURL=messages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/deploy/messages.ts"],"names":[],"mappings":"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"}
|