@sema-agent/client-core 0.95.0 → 0.96.0
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/CHANGELOG.md +180 -0
- package/README.md +49 -25
- package/dist/adapt/arms.js +7 -1
- package/dist/adapt/toolCards.d.ts +1 -0
- package/dist/adapt/toolCards.js +16 -3
- package/dist/adapt/wireShapes.js +2 -16
- package/dist/adapter/activeRunSelfHeal.d.ts +4 -0
- package/dist/adapter/activeRunSelfHeal.js +30 -4
- package/dist/adapter/downstream/eventToSdkMessage.js +11 -3
- package/dist/adapter/downstream/terminalToSdkResult.js +8 -9
- package/dist/adapter/runStream.js +30 -47
- package/dist/agentSession/engineAgentRegistryRead.js +5 -4
- package/dist/agentSession/engineSessionBackgroundStop.js +22 -15
- package/dist/agentsWireCaps.js +13 -2
- package/dist/callerCwdCapability.d.ts +0 -4
- package/dist/callerCwdCapability.js +0 -6
- package/dist/centerWiringCapability.d.ts +0 -4
- package/dist/centerWiringCapability.js +0 -6
- package/dist/classifierVerdictWire.js +4 -16
- package/dist/clientSlice.js +1 -1
- package/dist/cloudConfigWireCaps.d.ts +3 -3
- package/dist/cloudConfigWireCaps.js +65 -45
- package/dist/coreValuePorts.d.ts +11 -7
- package/dist/coreValuePorts.js +5 -8
- package/dist/credentialProvenance.d.ts +28 -0
- package/dist/credentialProvenance.js +76 -0
- package/dist/decideFailureNote.js +3 -1
- package/dist/decideReceipt.js +7 -10
- package/dist/declared/supportFloorDeclared.js +3 -3
- package/dist/displayUntrusted.d.ts +7 -3
- package/dist/displayUntrusted.js +356 -60
- package/dist/engineCapsCache.d.ts +6 -0
- package/dist/engineCapsCache.js +226 -32
- package/dist/engineDirectory.d.ts +79 -0
- package/dist/engineDirectory.js +186 -0
- package/dist/engineErrorCodes.d.ts +14 -1
- package/dist/engineErrorCodes.js +37 -15
- package/dist/engineNoticeCodes.d.ts +17 -0
- package/dist/engineNoticeCodes.js +57 -3
- package/dist/engineWordRenames.d.ts +8 -0
- package/dist/engineWordRenames.js +13 -0
- package/dist/fileHistoryCaptureCapability.d.ts +14 -0
- package/dist/fileHistoryCaptureCapability.js +70 -0
- package/dist/fleet/bgSubagentRow.d.ts +15 -0
- package/dist/fleet/bgSubagentRow.js +67 -0
- package/dist/fleet/fleetLedger.d.ts +1 -0
- package/dist/fleet/fleetLedger.js +103 -89
- package/dist/fleet/fleetProjection.d.ts +1 -0
- package/dist/fleet/fleetProjection.js +10 -3
- package/dist/fleetTaskDesc.js +4 -17
- package/dist/gateOutcome.d.ts +12 -1
- package/dist/gateOutcome.js +58 -1
- package/dist/gateVocabulary.d.ts +7 -2
- package/dist/gateVocabulary.js +5 -1
- package/dist/generated/engineAskFaceTables.js +1 -1
- package/dist/generated/engineFactTables.d.ts +5 -3
- package/dist/generated/engineFactTables.js +17 -4
- package/dist/generated/engineNoticeTables.js +12 -3
- package/dist/generated/settingsSchemaFns.d.ts +3 -0
- package/dist/generated/settingsSchemaFns.js +53 -0
- package/dist/generated/toolNameTables.d.ts +1 -0
- package/dist/generated/toolNameTables.js +1 -0
- package/dist/hitl/approvalEndingCause.d.ts +2 -0
- package/dist/hitl/approvalEndingCause.js +31 -21
- package/dist/hitl/askParkRowRouting.js +1 -1
- package/dist/hitl/automaticAnswerVerdict.d.ts +1 -1
- package/dist/hitl/automaticAnswerVerdict.js +13 -8
- package/dist/hitl/decisionConflict.js +0 -2
- package/dist/hitl/decisionRefusal.d.ts +8 -0
- package/dist/hitl/decisionRefusal.js +48 -14
- package/dist/hitl/frameRouter.d.ts +0 -1
- package/dist/hitl/frameRouter.js +6 -14
- package/dist/hitl/hitlBridge.d.ts +6 -2
- package/dist/hitl/hitlBridge.js +28 -7
- package/dist/hitl/localAllowRule.d.ts +1 -0
- package/dist/hitl/localAllowRule.js +2 -2
- package/dist/hitl/noAllowCause.d.ts +2 -1
- package/dist/hitl/noAllowCause.js +3 -2
- package/dist/hitl/parkResolver.d.ts +1 -0
- package/dist/hitl/parkResolver.js +8 -54
- package/dist/hitl/parkRowBirthWait.d.ts +1 -0
- package/dist/hitl/parkRowBirthWait.js +2 -2
- package/dist/hitl/planReviewWire.d.ts +1 -0
- package/dist/hitl/planReviewWire.js +98 -20
- package/dist/hitl/replayedApproval.d.ts +1 -0
- package/dist/hitl/replayedApproval.js +14 -0
- package/dist/hitl/sessionPolicyDeliverable.js +8 -6
- package/dist/hitl/standingRows.d.ts +18 -0
- package/dist/hitl/standingRows.js +127 -0
- package/dist/hitl/toolApprovalWire.d.ts +15 -3
- package/dist/hitl/toolApprovalWire.js +238 -25
- package/dist/hookMatcherVerdict.d.ts +1 -9
- package/dist/hookMatcherVerdict.js +21 -61
- package/dist/hooksWireCaps.js +2 -2
- package/dist/hostCallbackGuard.d.ts +1 -0
- package/dist/hostCallbackGuard.js +6 -0
- package/dist/index.d.ts +21 -9
- package/dist/index.js +17 -8
- package/dist/mcpProbeCapability.d.ts +0 -4
- package/dist/mcpProbeCapability.js +0 -6
- package/dist/memoryComplianceCapability.d.ts +0 -4
- package/dist/memoryComplianceCapability.js +0 -6
- package/dist/memoryOriginCapability.d.ts +0 -4
- package/dist/memoryOriginCapability.js +0 -6
- package/dist/memorySpecWire.js +2 -2
- package/dist/modelIdentityResolvability.d.ts +2 -2
- package/dist/modelIdentityResolvability.js +12 -3
- package/dist/noticePresentation.d.ts +68 -0
- package/dist/noticePresentation.js +247 -0
- package/dist/outputStyleSeatCapability.d.ts +0 -1
- package/dist/outputStyleSeatCapability.js +0 -3
- package/dist/ownKey.d.ts +2 -0
- package/dist/ownKey.js +18 -0
- package/dist/peerFrames.js +13 -9
- package/dist/permissionModesCapability.d.ts +0 -4
- package/dist/permissionModesCapability.js +0 -6
- package/dist/permissionRuleIssue.js +0 -3
- package/dist/permissionsDeclaration.d.ts +2 -0
- package/dist/permissionsDeclaration.js +56 -41
- package/dist/printPermissionOutcome.d.ts +12 -0
- package/dist/printPermissionOutcome.js +50 -0
- package/dist/printToolResultFrame.d.ts +1 -0
- package/dist/printToolResultFrame.js +5 -9
- package/dist/promptBlockedCopy.d.ts +5 -0
- package/dist/promptBlockedCopy.js +35 -0
- package/dist/protocolSegment.d.ts +9 -6
- package/dist/protocolSegment.js +31 -21
- package/dist/providerRejection.d.ts +4 -0
- package/dist/providerRejection.js +75 -14
- package/dist/replayBody.d.ts +12 -0
- package/dist/replayBody.js +25 -0
- package/dist/resumeRefusalCopy.js +5 -21
- package/dist/retryStatus.d.ts +9 -1
- package/dist/retryStatus.js +9 -2
- package/dist/rewindArchiveCapability.d.ts +3 -13
- package/dist/rewindArchiveCapability.js +7 -58
- package/dist/rewindArchiveReading.d.ts +15 -0
- package/dist/rewindArchiveReading.js +56 -0
- package/dist/ruleCompileVerdict.d.ts +9 -1
- package/dist/ruleCompileVerdict.js +29 -4
- package/dist/runTerminal.d.ts +15 -1
- package/dist/runTerminal.js +56 -8
- package/dist/sandboxWire.js +13 -0
- package/dist/sealedKeyCapability.d.ts +0 -4
- package/dist/sealedKeyCapability.js +0 -6
- package/dist/seam.js +4 -2
- package/dist/seatContract.d.ts +73 -11
- package/dist/seatContract.js +195 -14
- package/dist/sessionReadRedactionCapability.d.ts +0 -4
- package/dist/sessionReadRedactionCapability.js +0 -6
- package/dist/sessionSyncFileHistory.d.ts +4 -0
- package/dist/sessionSyncFileHistory.js +66 -0
- package/dist/sessionSyncFileHistoryCapability.d.ts +0 -1
- package/dist/sessionSyncFileHistoryCapability.js +0 -3
- package/dist/skillToolListsCapability.d.ts +0 -1
- package/dist/skillToolListsCapability.js +0 -3
- package/dist/steerPriorityCapability.d.ts +0 -1
- package/dist/steerPriorityCapability.js +0 -3
- package/dist/storePostureCapability.d.ts +0 -4
- package/dist/storePostureCapability.js +0 -6
- package/dist/subagent/engineSubagentSteer.js +7 -5
- package/dist/subagentContentStore.js +4 -15
- package/dist/supportFloor.d.ts +1 -0
- package/dist/supportFloor.js +13 -9
- package/dist/systemReminderTag.d.ts +1 -0
- package/dist/systemReminderTag.js +8 -0
- package/dist/toolHistoryMismatch.d.ts +0 -3
- package/dist/toolHistoryMismatch.js +3 -7
- package/dist/toolResult.d.ts +1 -1
- package/dist/toolResult.js +2 -1
- package/dist/toolResultContent.d.ts +2 -0
- package/dist/toolResultContent.js +63 -0
- package/dist/usageAnalytics.js +40 -16
- package/dist/userInvokedSkillsCapability.d.ts +0 -1
- package/dist/userInvokedSkillsCapability.js +0 -3
- package/dist/wireErrorTriage.d.ts +2 -0
- package/dist/wireErrorTriage.js +34 -5
- package/dist/wireFailureShape.d.ts +19 -2
- package/dist/wireFailureShape.js +55 -50
- package/docs/INTEGRATION-CLIENTS.md +1262 -17
- package/package.json +5 -5
|
@@ -14,10 +14,13 @@ export declare function engineCapStateVia(baseUrl: string | undefined, key: stri
|
|
|
14
14
|
}): Promise<EngineCapState>;
|
|
15
15
|
export declare function engineCapTrue(baseUrl: string | undefined, key: string): boolean;
|
|
16
16
|
export declare function engineCapNestedTrue(baseUrl: string | undefined, parentKey: string, key: string): boolean;
|
|
17
|
+
export declare function engineCapNestedValue(baseUrl: string | undefined, parentKey: string, key: string): EngineCapValueState;
|
|
17
18
|
export type EngineCapValueState = {
|
|
18
19
|
kind: 'unobserved';
|
|
19
20
|
} | {
|
|
20
21
|
kind: 'not_reported';
|
|
22
|
+
} | {
|
|
23
|
+
kind: 'unreadable';
|
|
21
24
|
} | {
|
|
22
25
|
kind: 'null';
|
|
23
26
|
} | {
|
|
@@ -27,4 +30,7 @@ export type EngineCapValueState = {
|
|
|
27
30
|
export declare function engineCapValue(baseUrl: string | undefined, key: string): EngineCapValueState;
|
|
28
31
|
export declare function engineCapString(baseUrl: string | undefined, key: string): string | undefined;
|
|
29
32
|
export declare function invalidateEngineCaps(baseUrl: string | undefined, probe?: () => Promise<unknown>): void;
|
|
33
|
+
export declare function refreshEngineCapsOnce(baseUrl: string | undefined, opts?: {
|
|
34
|
+
withinMs?: number;
|
|
35
|
+
}): Promise<'settled' | 'timed_out' | 'no_probe'>;
|
|
30
36
|
export declare function __resetEngineCapsCacheForTests(): void;
|
package/dist/engineCapsCache.js
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
|
+
import { settleWithinDeadline } from './abortableSleep.js';
|
|
2
|
+
import { ownDataField } from './ownKey.js';
|
|
1
3
|
const capsByBase = new Map();
|
|
2
4
|
const inFlight = new Set();
|
|
3
5
|
const settleByBase = new Map();
|
|
4
6
|
const genByBase = new Map();
|
|
7
|
+
const probeByBase = new Map();
|
|
8
|
+
const refreshByBase = new Map();
|
|
5
9
|
function capsGeneration(baseUrl) {
|
|
6
10
|
return genByBase.get(baseUrl) ?? 0;
|
|
7
11
|
}
|
|
@@ -14,6 +18,7 @@ export function engineCapsLandingOf(baseUrl) {
|
|
|
14
18
|
export function kickEngineCapsProbe(baseUrl, probe) {
|
|
15
19
|
if (!baseUrl || capsByBase.has(baseUrl) || inFlight.has(baseUrl))
|
|
16
20
|
return;
|
|
21
|
+
probeByBase.set(baseUrl, probe);
|
|
17
22
|
const gen = capsGeneration(baseUrl);
|
|
18
23
|
inFlight.add(baseUrl);
|
|
19
24
|
let wake = () => { };
|
|
@@ -30,9 +35,8 @@ export function kickEngineCapsProbe(baseUrl, probe) {
|
|
|
30
35
|
const caps = await probe();
|
|
31
36
|
if (gen !== capsGeneration(baseUrl))
|
|
32
37
|
return;
|
|
33
|
-
if (caps && typeof caps === 'object')
|
|
34
|
-
|
|
35
|
-
}
|
|
38
|
+
if (caps && typeof caps === 'object')
|
|
39
|
+
landCapsSnapshot(baseUrl, gen, caps);
|
|
36
40
|
}
|
|
37
41
|
catch {
|
|
38
42
|
}
|
|
@@ -118,21 +122,132 @@ export function engineCapState(baseUrl, key) {
|
|
|
118
122
|
return 'unprobed';
|
|
119
123
|
return capStateIn(capsByBase.get(baseUrl)?.caps, key);
|
|
120
124
|
}
|
|
121
|
-
|
|
125
|
+
const SNAPSHOT_MAX_DEPTH = 64;
|
|
126
|
+
const SNAPSHOT_MAX_NODES = 100_000;
|
|
127
|
+
const SNAPSHOT_PROBE_KEY = '\u0000capabilities-snapshot-probe\u0000';
|
|
128
|
+
const FOREIGN_PROTOTYPE = Object.freeze(Object.create(null));
|
|
129
|
+
function unreadableError() {
|
|
130
|
+
return new TypeError('capabilities body position is not readable (accessor or throwing proxy)');
|
|
131
|
+
}
|
|
132
|
+
const UNREADABLE_NODE = new Proxy(Object.freeze({}), {
|
|
133
|
+
getOwnPropertyDescriptor: () => {
|
|
134
|
+
throw unreadableError();
|
|
135
|
+
},
|
|
136
|
+
ownKeys: () => {
|
|
137
|
+
throw unreadableError();
|
|
138
|
+
},
|
|
139
|
+
has: () => {
|
|
140
|
+
throw unreadableError();
|
|
141
|
+
},
|
|
142
|
+
get: () => {
|
|
143
|
+
throw unreadableError();
|
|
144
|
+
},
|
|
145
|
+
getPrototypeOf: () => {
|
|
146
|
+
throw unreadableError();
|
|
147
|
+
},
|
|
148
|
+
});
|
|
149
|
+
function throwingAccessor() {
|
|
150
|
+
return {
|
|
151
|
+
get: () => {
|
|
152
|
+
throw unreadableError();
|
|
153
|
+
},
|
|
154
|
+
enumerable: true,
|
|
155
|
+
configurable: false,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
function landCapsSnapshot(baseUrl, gen, caps) {
|
|
159
|
+
const snapshot = snapshotCapsBody(caps);
|
|
160
|
+
if (gen !== capsGeneration(baseUrl))
|
|
161
|
+
return;
|
|
162
|
+
capsByBase.set(baseUrl, Object.freeze({ caps: snapshot }));
|
|
163
|
+
}
|
|
164
|
+
function snapshotCapsBody(body) {
|
|
165
|
+
if (body === null || typeof body !== 'object')
|
|
166
|
+
return body;
|
|
167
|
+
const seen = new WeakMap();
|
|
168
|
+
let nodes = 0;
|
|
169
|
+
const copy = (src, depth) => {
|
|
170
|
+
const known = seen.get(src);
|
|
171
|
+
if (known !== undefined)
|
|
172
|
+
return known;
|
|
173
|
+
if (depth > SNAPSHOT_MAX_DEPTH || ++nodes > SNAPSHOT_MAX_NODES)
|
|
174
|
+
return UNREADABLE_NODE;
|
|
175
|
+
let keys;
|
|
176
|
+
let out;
|
|
177
|
+
let isArray;
|
|
178
|
+
try {
|
|
179
|
+
isArray = Array.isArray(src);
|
|
180
|
+
keys = Object.getOwnPropertyNames(src);
|
|
181
|
+
Object.getOwnPropertyDescriptor(src, SNAPSHOT_PROBE_KEY);
|
|
182
|
+
let length = 0;
|
|
183
|
+
if (isArray) {
|
|
184
|
+
const ld = Object.getOwnPropertyDescriptor(src, 'length');
|
|
185
|
+
if (ld === undefined || !Object.hasOwn(ld, 'value') || typeof ld.value !== 'number')
|
|
186
|
+
return UNREADABLE_NODE;
|
|
187
|
+
length = ld.value;
|
|
188
|
+
}
|
|
189
|
+
const proto = isArray ? null : Object.getPrototypeOf(src);
|
|
190
|
+
out = isArray ? new Array(length) : proto === Object.prototype || proto === null ? {} : Object.create(FOREIGN_PROTOTYPE);
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
return UNREADABLE_NODE;
|
|
194
|
+
}
|
|
195
|
+
seen.set(src, out);
|
|
196
|
+
for (const k of keys) {
|
|
197
|
+
if (isArray && k === 'length')
|
|
198
|
+
continue;
|
|
199
|
+
let d;
|
|
200
|
+
try {
|
|
201
|
+
d = Object.getOwnPropertyDescriptor(src, k);
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
Object.defineProperty(out, k, throwingAccessor());
|
|
205
|
+
continue;
|
|
206
|
+
}
|
|
207
|
+
if (d === undefined)
|
|
208
|
+
continue;
|
|
209
|
+
if (!Object.hasOwn(d, 'value')) {
|
|
210
|
+
Object.defineProperty(out, k, throwingAccessor());
|
|
211
|
+
continue;
|
|
212
|
+
}
|
|
213
|
+
const v = d.value;
|
|
214
|
+
Object.defineProperty(out, k, {
|
|
215
|
+
value: v !== null && typeof v === 'object' ? copy(v, depth + 1) : v,
|
|
216
|
+
enumerable: d.enumerable === true,
|
|
217
|
+
writable: false,
|
|
218
|
+
configurable: false,
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
Object.freeze(out);
|
|
222
|
+
return out;
|
|
223
|
+
};
|
|
224
|
+
return copy(body, 0);
|
|
225
|
+
}
|
|
226
|
+
const SLOT_UNOBSERVED = Object.freeze({ kind: 'unobserved' });
|
|
227
|
+
const SLOT_ABSENT = Object.freeze({ kind: 'absent' });
|
|
228
|
+
const SLOT_UNREADABLE = Object.freeze({ kind: 'unreadable' });
|
|
229
|
+
function capSlotIn(caps, key) {
|
|
122
230
|
if (caps === undefined || caps === null || typeof caps !== 'object')
|
|
123
|
-
return
|
|
231
|
+
return SLOT_UNOBSERVED;
|
|
124
232
|
try {
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
const v = caps[key];
|
|
128
|
-
if (v === true)
|
|
129
|
-
return 'true';
|
|
130
|
-
if (v === false)
|
|
131
|
-
return 'false';
|
|
132
|
-
return 'non_boolean';
|
|
233
|
+
const v = ownDataField(caps, key);
|
|
234
|
+
return v === undefined ? SLOT_ABSENT : { kind: 'present', value: v };
|
|
133
235
|
}
|
|
134
236
|
catch {
|
|
135
|
-
return
|
|
237
|
+
return SLOT_UNREADABLE;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
function capStateIn(caps, key) {
|
|
241
|
+
const slot = capSlotIn(caps, key);
|
|
242
|
+
switch (slot.kind) {
|
|
243
|
+
case 'unobserved':
|
|
244
|
+
return 'unprobed';
|
|
245
|
+
case 'absent':
|
|
246
|
+
return 'absent';
|
|
247
|
+
case 'unreadable':
|
|
248
|
+
return 'non_boolean';
|
|
249
|
+
case 'present':
|
|
250
|
+
return slot.value === true ? 'true' : slot.value === false ? 'false' : 'non_boolean';
|
|
136
251
|
}
|
|
137
252
|
}
|
|
138
253
|
async function untilSettledOrAborted(p, signal) {
|
|
@@ -178,37 +293,48 @@ export function engineCapTrue(baseUrl, key) {
|
|
|
178
293
|
return engineCapState(baseUrl, key) === 'true';
|
|
179
294
|
}
|
|
180
295
|
export function engineCapNestedTrue(baseUrl, parentKey, key) {
|
|
296
|
+
const state = engineCapNestedValue(baseUrl, parentKey, key);
|
|
297
|
+
return state.kind === 'value' && state.value === true;
|
|
298
|
+
}
|
|
299
|
+
export function engineCapNestedValue(baseUrl, parentKey, key) {
|
|
181
300
|
if (!baseUrl)
|
|
182
|
-
return
|
|
183
|
-
const parent = capsByBase.get(baseUrl)?.caps
|
|
184
|
-
if (parent
|
|
185
|
-
return
|
|
186
|
-
|
|
301
|
+
return { kind: 'unobserved' };
|
|
302
|
+
const parent = capSlotIn(capsByBase.get(baseUrl)?.caps, parentKey);
|
|
303
|
+
if (parent.kind !== 'present')
|
|
304
|
+
return valueStateOfSlot(parent);
|
|
305
|
+
const group = parent.value;
|
|
306
|
+
if (group === null || typeof group !== 'object')
|
|
307
|
+
return { kind: 'not_reported' };
|
|
308
|
+
return valueStateOfSlot(capSlotIn(group, key));
|
|
187
309
|
}
|
|
188
310
|
export function engineCapValue(baseUrl, key) {
|
|
189
311
|
if (!baseUrl)
|
|
190
312
|
return { kind: 'unobserved' };
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
313
|
+
return valueStateOfSlot(capSlotIn(capsByBase.get(baseUrl)?.caps, key));
|
|
314
|
+
}
|
|
315
|
+
function valueStateOfSlot(slot) {
|
|
316
|
+
switch (slot.kind) {
|
|
317
|
+
case 'unobserved':
|
|
318
|
+
return { kind: 'unobserved' };
|
|
319
|
+
case 'absent':
|
|
320
|
+
return { kind: 'not_reported' };
|
|
321
|
+
case 'unreadable':
|
|
322
|
+
return { kind: 'unreadable' };
|
|
323
|
+
case 'present':
|
|
324
|
+
return slot.value === null ? { kind: 'null' } : { kind: 'value', value: slot.value };
|
|
325
|
+
}
|
|
202
326
|
}
|
|
203
327
|
export function engineCapString(baseUrl, key) {
|
|
204
328
|
if (!baseUrl)
|
|
205
329
|
return undefined;
|
|
206
|
-
const
|
|
207
|
-
return typeof
|
|
330
|
+
const slot = capSlotIn(capsByBase.get(baseUrl)?.caps, key);
|
|
331
|
+
return slot.kind === 'present' && typeof slot.value === 'string' && slot.value.length > 0 ? slot.value : undefined;
|
|
208
332
|
}
|
|
209
333
|
export function invalidateEngineCaps(baseUrl, probe) {
|
|
210
334
|
if (!baseUrl)
|
|
211
335
|
return;
|
|
336
|
+
if (probe === undefined)
|
|
337
|
+
probeByBase.delete(baseUrl);
|
|
212
338
|
const hadState = capsByBase.has(baseUrl) ||
|
|
213
339
|
inFlight.has(baseUrl) ||
|
|
214
340
|
settleByBase.has(baseUrl) ||
|
|
@@ -222,9 +348,77 @@ export function invalidateEngineCaps(baseUrl, probe) {
|
|
|
222
348
|
if (probe !== undefined)
|
|
223
349
|
kickEngineCapsProbe(baseUrl, probe);
|
|
224
350
|
}
|
|
351
|
+
export async function refreshEngineCapsOnce(baseUrl, opts) {
|
|
352
|
+
try {
|
|
353
|
+
if (typeof baseUrl !== 'string' || baseUrl === '')
|
|
354
|
+
return 'no_probe';
|
|
355
|
+
const budget = waitBudgetOf(opts);
|
|
356
|
+
const probe = probeByBase.get(baseUrl);
|
|
357
|
+
if (probe === undefined)
|
|
358
|
+
return 'no_probe';
|
|
359
|
+
const flying = refreshByBase.get(baseUrl);
|
|
360
|
+
if (flying !== undefined && flying.gen === capsGeneration(baseUrl))
|
|
361
|
+
return await awaitRefreshWithin(flying, budget);
|
|
362
|
+
if (!capsByBase.has(baseUrl)) {
|
|
363
|
+
kickEngineCapsProbe(baseUrl, probe);
|
|
364
|
+
return await engineCapsSettled(baseUrl, budget === undefined ? undefined : { withinMs: budget });
|
|
365
|
+
}
|
|
366
|
+
const gen = capsGeneration(baseUrl);
|
|
367
|
+
let finish = () => { };
|
|
368
|
+
const entry = { gen, promise: new Promise((resolve) => { finish = resolve; }) };
|
|
369
|
+
refreshByBase.set(baseUrl, entry);
|
|
370
|
+
void (async () => {
|
|
371
|
+
try {
|
|
372
|
+
const caps = await probe();
|
|
373
|
+
if (gen !== capsGeneration(baseUrl) || !capsByBase.has(baseUrl) || !isPlainCapsBody(caps))
|
|
374
|
+
return false;
|
|
375
|
+
landCapsSnapshot(baseUrl, gen, caps);
|
|
376
|
+
return gen === capsGeneration(baseUrl);
|
|
377
|
+
}
|
|
378
|
+
catch {
|
|
379
|
+
return false;
|
|
380
|
+
}
|
|
381
|
+
finally {
|
|
382
|
+
if (refreshByBase.get(baseUrl) === entry)
|
|
383
|
+
refreshByBase.delete(baseUrl);
|
|
384
|
+
}
|
|
385
|
+
})().then(finish);
|
|
386
|
+
return await awaitRefreshWithin(entry, budget);
|
|
387
|
+
}
|
|
388
|
+
catch {
|
|
389
|
+
return 'timed_out';
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
function isPlainCapsBody(caps) {
|
|
393
|
+
try {
|
|
394
|
+
if (typeof caps !== 'object' || caps === null)
|
|
395
|
+
return false;
|
|
396
|
+
const proto = Object.getPrototypeOf(caps);
|
|
397
|
+
if (proto !== null && Object.getPrototypeOf(proto) !== null)
|
|
398
|
+
return false;
|
|
399
|
+
for (const key of Reflect.ownKeys(caps))
|
|
400
|
+
Object.getOwnPropertyDescriptor(caps, key);
|
|
401
|
+
return true;
|
|
402
|
+
}
|
|
403
|
+
catch {
|
|
404
|
+
return false;
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
async function awaitRefreshWithin(entry, budget) {
|
|
408
|
+
if (budget === undefined) {
|
|
409
|
+
await entry.promise;
|
|
410
|
+
return 'settled';
|
|
411
|
+
}
|
|
412
|
+
if (budget === 0)
|
|
413
|
+
return 'timed_out';
|
|
414
|
+
const out = await settleWithinDeadline(budget, () => entry.promise);
|
|
415
|
+
return out.kind === 'deadline' ? 'timed_out' : 'settled';
|
|
416
|
+
}
|
|
225
417
|
export function __resetEngineCapsCacheForTests() {
|
|
226
418
|
capsByBase.clear();
|
|
227
419
|
inFlight.clear();
|
|
228
420
|
settleByBase.clear();
|
|
229
421
|
genByBase.clear();
|
|
422
|
+
probeByBase.clear();
|
|
423
|
+
refreshByBase.clear();
|
|
230
424
|
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
declare const KIND_WORDS: readonly ["managed"];
|
|
2
|
+
declare const POSTURE_WORDS: readonly ["single", "multi"];
|
|
3
|
+
declare const RULE_WORDS: readonly ["only-one", "none", "ambiguous"];
|
|
4
|
+
export type EngineKindWord = (typeof KIND_WORDS)[number];
|
|
5
|
+
export type EnginePostureWord = (typeof POSTURE_WORDS)[number];
|
|
6
|
+
export type MeEngineRuleWord = (typeof RULE_WORDS)[number];
|
|
7
|
+
export type OpenWordReading<K extends string> = {
|
|
8
|
+
readonly kind: 'listed';
|
|
9
|
+
readonly word: K;
|
|
10
|
+
} | {
|
|
11
|
+
readonly kind: 'unlisted';
|
|
12
|
+
readonly word: string;
|
|
13
|
+
} | {
|
|
14
|
+
readonly kind: 'unreadable';
|
|
15
|
+
};
|
|
16
|
+
export interface EngineRowReading {
|
|
17
|
+
readonly name: string;
|
|
18
|
+
readonly kind: OpenWordReading<EngineKindWord>;
|
|
19
|
+
readonly scope: string | undefined;
|
|
20
|
+
readonly online: boolean | undefined;
|
|
21
|
+
readonly posture: OpenWordReading<EnginePostureWord>;
|
|
22
|
+
readonly viaCenter: string;
|
|
23
|
+
}
|
|
24
|
+
export interface EngineRowSet {
|
|
25
|
+
readonly rows: readonly EngineRowReading[];
|
|
26
|
+
readonly unreadableRows: number;
|
|
27
|
+
readonly unreadableNames: readonly string[];
|
|
28
|
+
}
|
|
29
|
+
export type MeEngineTargetReading = {
|
|
30
|
+
readonly kind: 'row';
|
|
31
|
+
readonly row: EngineRowReading;
|
|
32
|
+
} | {
|
|
33
|
+
readonly kind: 'null';
|
|
34
|
+
} | {
|
|
35
|
+
readonly kind: 'unreadable';
|
|
36
|
+
};
|
|
37
|
+
export interface MeEngineReading {
|
|
38
|
+
readonly rule: OpenWordReading<MeEngineRuleWord>;
|
|
39
|
+
readonly target: MeEngineTargetReading;
|
|
40
|
+
readonly candidates: EngineRowSet | undefined;
|
|
41
|
+
}
|
|
42
|
+
export type MeEngineUnresolvedReason = 'body' | 'rule' | 'rule-unlisted' | 'target' | 'candidates' | 'conflict';
|
|
43
|
+
export type MeEngineDecision = {
|
|
44
|
+
readonly kind: 'connect';
|
|
45
|
+
readonly engine: EngineRowReading;
|
|
46
|
+
readonly rule: OpenWordReading<MeEngineRuleWord>;
|
|
47
|
+
} | {
|
|
48
|
+
readonly kind: 'no-engine';
|
|
49
|
+
} | {
|
|
50
|
+
readonly kind: 'choose';
|
|
51
|
+
readonly candidates: EngineRowSet;
|
|
52
|
+
} | {
|
|
53
|
+
readonly kind: 'unresolved';
|
|
54
|
+
readonly reason: MeEngineUnresolvedReason;
|
|
55
|
+
readonly rule: OpenWordReading<MeEngineRuleWord>;
|
|
56
|
+
readonly candidates: EngineRowSet | undefined;
|
|
57
|
+
};
|
|
58
|
+
export type EngineOverrideDecision = {
|
|
59
|
+
readonly kind: 'select';
|
|
60
|
+
readonly engine: EngineRowReading;
|
|
61
|
+
} | {
|
|
62
|
+
readonly kind: 'not-listed';
|
|
63
|
+
readonly candidates: EngineRowSet;
|
|
64
|
+
} | {
|
|
65
|
+
readonly kind: 'duplicate';
|
|
66
|
+
readonly name: string;
|
|
67
|
+
} | {
|
|
68
|
+
readonly kind: 'row-unreadable';
|
|
69
|
+
readonly name: string;
|
|
70
|
+
} | {
|
|
71
|
+
readonly kind: 'unreadable';
|
|
72
|
+
} | {
|
|
73
|
+
readonly kind: 'invalid';
|
|
74
|
+
};
|
|
75
|
+
export declare function projectEngineDirectory(body: unknown): EngineRowSet | undefined;
|
|
76
|
+
export declare function projectMeEngine(body: unknown): MeEngineReading | undefined;
|
|
77
|
+
export declare function decideMeEngine(reading: MeEngineReading | undefined): MeEngineDecision;
|
|
78
|
+
export declare function engineOverrideOf(set: EngineRowSet | undefined, requested: unknown): EngineOverrideDecision;
|
|
79
|
+
export {};
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { guardedRead, readOwnDataNonEmptyString, readOwnDataValue } from './ownKey.js';
|
|
2
|
+
const KIND_WORDS = ['managed'];
|
|
3
|
+
const POSTURE_WORDS = ['single', 'multi'];
|
|
4
|
+
const RULE_WORDS = ['only-one', 'none', 'ambiguous'];
|
|
5
|
+
const UNREADABLE = Object.freeze({ kind: 'unreadable' });
|
|
6
|
+
function isCenterRelativePath(path) {
|
|
7
|
+
if (path.length === 0 || path.charCodeAt(0) !== 0x2f)
|
|
8
|
+
return false;
|
|
9
|
+
const second = path.charCodeAt(1);
|
|
10
|
+
if (second === 0x2f || second === 0x5c)
|
|
11
|
+
return false;
|
|
12
|
+
if (/[\s\u0000-\u001f\u007f-\u009f\\?#]/u.test(path))
|
|
13
|
+
return false;
|
|
14
|
+
return path.split('/').every((segment) => {
|
|
15
|
+
const decoded = segment.replace(/%2e/gi, '.');
|
|
16
|
+
return decoded !== '.' && decoded !== '..';
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
function isObj(v) {
|
|
20
|
+
return typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
21
|
+
}
|
|
22
|
+
function stringOf(holder, key) {
|
|
23
|
+
return guardedRead(() => readOwnDataNonEmptyString(holder, key));
|
|
24
|
+
}
|
|
25
|
+
function boolOf(holder, key) {
|
|
26
|
+
return guardedRead(() => {
|
|
27
|
+
const v = readOwnDataValue(holder, key);
|
|
28
|
+
return typeof v === 'boolean' ? v : undefined;
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
function wordOf(holder, key, listed) {
|
|
32
|
+
const word = stringOf(holder, key);
|
|
33
|
+
if (word === undefined)
|
|
34
|
+
return UNREADABLE;
|
|
35
|
+
const hit = listed.find((w) => w === word);
|
|
36
|
+
return hit !== undefined ? { kind: 'listed', word: hit } : { kind: 'unlisted', word };
|
|
37
|
+
}
|
|
38
|
+
function rowOf(raw) {
|
|
39
|
+
try {
|
|
40
|
+
if (!isObj(raw))
|
|
41
|
+
return undefined;
|
|
42
|
+
const name = stringOf(raw, 'name');
|
|
43
|
+
if (name === undefined)
|
|
44
|
+
return undefined;
|
|
45
|
+
const connect = guardedRead(() => readOwnDataValue(raw, 'connect'));
|
|
46
|
+
if (!isObj(connect))
|
|
47
|
+
return undefined;
|
|
48
|
+
const viaCenter = stringOf(connect, 'viaCenter');
|
|
49
|
+
if (viaCenter === undefined || !isCenterRelativePath(viaCenter))
|
|
50
|
+
return undefined;
|
|
51
|
+
return {
|
|
52
|
+
name,
|
|
53
|
+
kind: wordOf(raw, 'kind', KIND_WORDS),
|
|
54
|
+
scope: stringOf(raw, 'scope'),
|
|
55
|
+
online: boolOf(raw, 'online'),
|
|
56
|
+
posture: wordOf(raw, 'posture', POSTURE_WORDS),
|
|
57
|
+
viaCenter,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function rowSetOf(raw) {
|
|
65
|
+
try {
|
|
66
|
+
if (!Array.isArray(raw))
|
|
67
|
+
return undefined;
|
|
68
|
+
const length = readOwnDataValue(raw, 'length');
|
|
69
|
+
if (typeof length !== 'number' || !Number.isSafeInteger(length) || length < 0)
|
|
70
|
+
return undefined;
|
|
71
|
+
const rows = [];
|
|
72
|
+
const unreadableNames = [];
|
|
73
|
+
let unreadableRows = 0;
|
|
74
|
+
for (let i = 0; i < length; i += 1) {
|
|
75
|
+
const element = guardedRead(() => readOwnDataValue(raw, String(i)));
|
|
76
|
+
const row = rowOf(element);
|
|
77
|
+
if (row !== undefined) {
|
|
78
|
+
rows.push(row);
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
unreadableRows += 1;
|
|
82
|
+
const name = guardedRead(() => (isObj(element) ? stringOf(element, 'name') : undefined));
|
|
83
|
+
if (name !== undefined)
|
|
84
|
+
unreadableNames.push(name);
|
|
85
|
+
}
|
|
86
|
+
return { rows, unreadableRows, unreadableNames };
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return undefined;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
export function projectEngineDirectory(body) {
|
|
93
|
+
try {
|
|
94
|
+
if (!isObj(body))
|
|
95
|
+
return undefined;
|
|
96
|
+
return rowSetOf(readOwnDataValue(body, 'engines'));
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return undefined;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
export function projectMeEngine(body) {
|
|
103
|
+
try {
|
|
104
|
+
if (!isObj(body))
|
|
105
|
+
return undefined;
|
|
106
|
+
const rule = wordOf(body, 'rule', RULE_WORDS);
|
|
107
|
+
const rawTarget = guardedRead(() => readOwnDataValue(body, 'target'));
|
|
108
|
+
let target = UNREADABLE;
|
|
109
|
+
if (rawTarget === null) {
|
|
110
|
+
target = { kind: 'null' };
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
const row = rowOf(rawTarget);
|
|
114
|
+
if (row !== undefined)
|
|
115
|
+
target = { kind: 'row', row };
|
|
116
|
+
}
|
|
117
|
+
const candidates = guardedRead(() => rowSetOf(readOwnDataValue(body, 'candidates')));
|
|
118
|
+
if (rule.kind === 'unreadable' && target.kind === 'unreadable' && candidates === undefined)
|
|
119
|
+
return undefined;
|
|
120
|
+
return { rule, target, candidates };
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
return undefined;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
export function decideMeEngine(reading) {
|
|
127
|
+
try {
|
|
128
|
+
if (reading === undefined)
|
|
129
|
+
return { kind: 'unresolved', reason: 'body', rule: UNREADABLE, candidates: undefined };
|
|
130
|
+
const { rule, target, candidates } = reading;
|
|
131
|
+
const unresolved = (reason) => ({ kind: 'unresolved', reason, rule, candidates });
|
|
132
|
+
if (rule.kind === 'unreadable')
|
|
133
|
+
return unresolved('rule');
|
|
134
|
+
if (target.kind === 'unreadable')
|
|
135
|
+
return unresolved('target');
|
|
136
|
+
if (target.kind === 'row') {
|
|
137
|
+
if (rule.kind === 'listed' && (rule.word === 'none' || rule.word === 'ambiguous'))
|
|
138
|
+
return unresolved('conflict');
|
|
139
|
+
if (candidates === undefined)
|
|
140
|
+
return unresolved('candidates');
|
|
141
|
+
const picked = target.row;
|
|
142
|
+
if (!candidates.rows.some((row) => row.name === picked.name && row.viaCenter === picked.viaCenter))
|
|
143
|
+
return unresolved('conflict');
|
|
144
|
+
if (rule.kind === 'listed' && (candidates.rows.length !== 1 || candidates.unreadableRows !== 0))
|
|
145
|
+
return unresolved('conflict');
|
|
146
|
+
return { kind: 'connect', engine: picked, rule };
|
|
147
|
+
}
|
|
148
|
+
if (rule.kind === 'unlisted')
|
|
149
|
+
return unresolved('rule-unlisted');
|
|
150
|
+
if (rule.word === 'only-one')
|
|
151
|
+
return unresolved('conflict');
|
|
152
|
+
if (candidates === undefined)
|
|
153
|
+
return unresolved('candidates');
|
|
154
|
+
if (rule.word === 'none') {
|
|
155
|
+
if (candidates.rows.length === 0 && candidates.unreadableRows === 0)
|
|
156
|
+
return { kind: 'no-engine' };
|
|
157
|
+
return unresolved('conflict');
|
|
158
|
+
}
|
|
159
|
+
if (candidates.rows.length === 0)
|
|
160
|
+
return unresolved('candidates');
|
|
161
|
+
return candidates.rows.length + candidates.unreadableRows >= 2 ? { kind: 'choose', candidates } : unresolved('conflict');
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
return { kind: 'unresolved', reason: 'body', rule: UNREADABLE, candidates: undefined };
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
export function engineOverrideOf(set, requested) {
|
|
168
|
+
try {
|
|
169
|
+
if (typeof requested !== 'string' || requested === '')
|
|
170
|
+
return { kind: 'invalid' };
|
|
171
|
+
if (set === undefined)
|
|
172
|
+
return { kind: 'unreadable' };
|
|
173
|
+
const hits = set.rows.filter((row) => row.name === requested);
|
|
174
|
+
const hidden = set.unreadableNames.filter((name) => name === requested).length;
|
|
175
|
+
if (hits.length + hidden > 1)
|
|
176
|
+
return { kind: 'duplicate', name: requested };
|
|
177
|
+
if (hits.length === 1)
|
|
178
|
+
return { kind: 'select', engine: hits[0] };
|
|
179
|
+
if (hidden === 1)
|
|
180
|
+
return { kind: 'row-unreadable', name: requested };
|
|
181
|
+
return { kind: 'not-listed', candidates: set };
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
return { kind: 'unreadable' };
|
|
185
|
+
}
|
|
186
|
+
}
|
|
@@ -18,7 +18,6 @@ export declare const CONFIG_IMAGE_INVALID = "config.image_invalid";
|
|
|
18
18
|
export declare function imageInvalidFailureNoteOf(code: string | undefined): string | undefined;
|
|
19
19
|
export declare const CONFIG_AGENT_UNKNOWN_TOOL = "config.agent.unknown_tool";
|
|
20
20
|
export declare const CONFIG_OUTPUT_STYLE_INVALID = "config.output_style_invalid";
|
|
21
|
-
export declare const CONFIG_REFUSAL_CODES: ReadonlySet<string>;
|
|
22
21
|
export declare const RULES_LEGACY_TOOL_NAME = "rules.legacy_tool_name";
|
|
23
22
|
export declare function isRulesRefusalCode(code: string | undefined): boolean;
|
|
24
23
|
export declare const DELEGATION_CONCURRENCY_CAP = "delegation.concurrency_cap";
|
|
@@ -33,8 +32,18 @@ export declare const TOOL_END_INTERRUPTED_NEVER_STARTED = "interrupted_never_sta
|
|
|
33
32
|
export declare const TOOL_END_INTERRUPTED_OUTCOME_UNKNOWN = "interrupted_outcome_unknown";
|
|
34
33
|
export declare function isInterruptedToolEndCode(code: string | undefined): boolean;
|
|
35
34
|
export declare const CAPABILITY_SELF_ORCHESTRATION_REQUIRED = "capability.self_orchestration_required";
|
|
35
|
+
export declare const CAPABILITY_IMAGE_INDEX_REQUIRED = "capability.image_index_required";
|
|
36
36
|
export declare const GATE_PARKED_ERROR_CODE = "gate.parked";
|
|
37
37
|
export declare const ACTIVE_RUN_BUSY_ERROR_CODE = "conflict.session_active_run";
|
|
38
|
+
export interface BusyClassification {
|
|
39
|
+
readonly busy: boolean;
|
|
40
|
+
readonly handle: string | null;
|
|
41
|
+
}
|
|
42
|
+
export declare function classifyActiveRunBusy(input: {
|
|
43
|
+
errorCode: string | undefined;
|
|
44
|
+
activeTaskId: unknown;
|
|
45
|
+
}): BusyClassification;
|
|
46
|
+
export declare function activeRunBusyCarrierOf(ev: unknown): Record<string, unknown> | null;
|
|
38
47
|
export declare const CORRUPT_SESSION_ERROR_CODE = "corrupt_session";
|
|
39
48
|
export declare function isCorruptSessionCode(code: string | null | undefined): boolean;
|
|
40
49
|
export declare const STOP_PARK_ARBITER_UNREACHABLE = "stop.park_arbiter_unreachable";
|
|
@@ -58,6 +67,8 @@ export declare const REQUEST_AUTONOMY_LANE_REFUSED = "request.autonomy_lane_refu
|
|
|
58
67
|
export declare const CHECKPOINT_UNSUPPORTED_VERSION = "checkpoint.unsupported_version";
|
|
59
68
|
export declare const CHECKPOINT_WALLTIME_AXIS_RETIRED = "checkpoint.walltime_axis_retired";
|
|
60
69
|
export declare const CHECKPOINT_CONFIG_REFUSED = "checkpoint.config_refused";
|
|
70
|
+
export declare const CHECKPOINT_REFUSED_PARK_CODES: readonly string[];
|
|
71
|
+
export declare function isRefusedParkCode(code: string | null | undefined): code is typeof CHECKPOINT_UNSUPPORTED_VERSION | typeof CHECKPOINT_WALLTIME_AXIS_RETIRED | typeof CHECKPOINT_CONFIG_REFUSED;
|
|
61
72
|
export declare function refusalSaysStillPending(err: object): boolean;
|
|
62
73
|
export declare function refusalRetriableReading(err: object): boolean | undefined;
|
|
63
74
|
export type StatusDerivedCoarseCode = (typeof STATUS_DERIVED_COARSE_CODES)[number];
|
|
@@ -85,9 +96,11 @@ export declare const RESUME_OUTCOME_INVALID = "resume_outcome_invalid";
|
|
|
85
96
|
export declare const CHECKPOINT_ALREADY_RESOLVED = "checkpoint.already_resolved";
|
|
86
97
|
export declare const NOT_FOUND_APPROVAL = "not_found.approval";
|
|
87
98
|
export declare const NOT_FOUND_CHECKPOINT = "not_found.checkpoint";
|
|
99
|
+
export declare const NOT_FOUND_BLOB = "not_found.blob";
|
|
88
100
|
export declare const DECIDE_ALREADY_RESOLVED_CODES: readonly string[];
|
|
89
101
|
export declare function isDecideAlreadyResolvedCode(code: string | null | undefined): boolean;
|
|
90
102
|
export declare const ASK_GONE = "gone.ask";
|
|
103
|
+
export declare const ASK_GONE_PARKED = "gone.ask_parked";
|
|
91
104
|
export declare const ASK_GONE_DENIED_WORD: "routing_failure_fail_closed";
|
|
92
105
|
export declare const RUN_DEATH_VERDICT_CODES: readonly ["run.stalled", "run.orphaned", "approval.expired"];
|
|
93
106
|
export type RunDeathVerdictCode = (typeof RUN_DEATH_VERDICT_CODES)[number];
|