dsh-connect-workbuddy 2.2.1 → 2.3.1

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/lib/index.d.ts CHANGED
@@ -512,6 +512,25 @@ type WorkBuddyChatResult = {
512
512
  kind: UpstreamErrorKind;
513
513
  message: string;
514
514
  };
515
+ /**
516
+ * Chat answer that also carries the response headers.
517
+ *
518
+ * Used by the model probe, whose whole point is to ask "is this usable right
519
+ * now, and if not, when?" — and the only place an upstream ever names a
520
+ * cooldown is the `Retry-After` header, which {@link WorkBuddyChatResult}
521
+ * deliberately does not surface. Returning a separate shape keeps the ordinary
522
+ * chat path (and its callers) untouched.
523
+ */
524
+ interface WorkBuddyProbeAnswer {
525
+ ok: boolean;
526
+ status: number;
527
+ /** Raw `Retry-After`, when the upstream sent one; null otherwise. */
528
+ retryAfter: string | null;
529
+ /** Failure body excerpt, only when `ok` is false. */
530
+ body?: string;
531
+ /** The live stream, only when `ok` is true. The caller drains and discards it. */
532
+ response?: Response;
533
+ }
515
534
  /** Classify an upstream failure from its HTTP status and body excerpt. */
516
535
  declare function classifyUpstreamError(status: number, body: string): UpstreamErrorKind;
517
536
  /**
@@ -578,6 +597,20 @@ declare function parseUpstreamModel(value: unknown): WorkBuddyUpstreamModel | un
578
597
  declare class WorkBuddyUpstreamClient {
579
598
  /** POST the chat endpoint; a successful answer is the raw SSE response. */
580
599
  chatStream(credential: WorkBuddyCredential, bodyJson: string, signal?: AbortSignal): Promise<WorkBuddyChatResult>;
600
+ /**
601
+ * Send one minimal chat request for `bodyJson` and report the RAW answer.
602
+ *
603
+ * Shares {@link chatHeaders} and the chat base with {@link chatStream} on
604
+ * purpose: a probe is only meaningful if it reaches the same endpoint with the
605
+ * same authentication as a real request. The differences are deliberate and
606
+ * narrow — it returns the headers (for `Retry-After`) and the failure body
607
+ * (for classification) instead of a pre-classified error, so the probe module
608
+ * owns the interpretation and the network layer stays a transport.
609
+ *
610
+ * The caller MUST drain {@link WorkBuddyProbeAnswer.response}; an unread body
611
+ * holds the connection open.
612
+ */
613
+ probeChat(credential: WorkBuddyCredential, bodyJson: string, signal?: AbortSignal): Promise<WorkBuddyProbeAnswer>;
581
614
  /** POST the token-refresh endpoint; the caller merges the outcome. */
582
615
  refreshToken(credential: WorkBuddyCredential): Promise<WorkBuddyRefreshOutcome>;
583
616
  /**
@@ -1153,6 +1186,181 @@ declare function clearHostHeartbeat(): Promise<void>;
1153
1186
  /** The npm package version this build was produced from. */
1154
1187
  declare const WORKBUDDY_CONNECT_VERSION: string;
1155
1188
  //#endregion
1189
+ //#region src/probe.d.ts
1190
+ /**
1191
+ * The system message every probe carries.
1192
+ *
1193
+ * Not decoration: the international gateway rejects a conversation that does not
1194
+ * start with a system message (see the module note). A probe that omitted it
1195
+ * would report every global model as broken.
1196
+ */
1197
+ declare const PROBE_SYSTEM_PROMPT = "You are a connectivity check. Reply with a single word.";
1198
+ /**
1199
+ * Output cap for a probe. One token is enough to prove the model answers.
1200
+ *
1201
+ * The probe's cost comes from its INPUT, not its output (see
1202
+ * {@link PROBE_INPUT_TOKENS}), so paying for a long completion would add money
1203
+ * without adding signal.
1204
+ */
1205
+ declare const PROBE_MAX_TOKENS = 1;
1206
+ /**
1207
+ * How much input a probe sends, in tokens.
1208
+ *
1209
+ * This is the whole point of the probe, and it is NOT a free choice. The
1210
+ * upstream's rate limit (business code 6004) fires on request SIZE, measured on
1211
+ * 2026-09-29 by varying only the input against one account and one model:
1212
+ *
1213
+ * | input | prompt_tokens the upstream counted | result |
1214
+ * | --- | --- | --- |
1215
+ * | ~10 | 38 | ok |
1216
+ * | ~1,000 | 1,138 | ok |
1217
+ * | ~10,000 | 11,138 | ok |
1218
+ * | ~18,000 | 20,018 | ok |
1219
+ * | ~25,000 | 25,023 | ok |
1220
+ * | ~30,000 | ~32k | **429 / 6004** |
1221
+ *
1222
+ * So the threshold sits between 20k and 30k, a SINGLE large request is enough to
1223
+ * trip it (it is not a running total), and each account reports its own reset
1224
+ * time (two accounts at the same moment: `22:20:33` and `00:32:51`).
1225
+ *
1226
+ * A probe that sent a handful of tokens answered "usable" while every real
1227
+ * request in a long conversation was refused — the probe was asking too small a
1228
+ * question. 25k is sized to be a realistic long-conversation payload.
1229
+ */
1230
+ declare const PROBE_INPUT_TOKENS = 25000;
1231
+ /**
1232
+ * Build the request body for one probe.
1233
+ *
1234
+ * `stream` is forced because the upstream rejects non-streaming chat requests;
1235
+ * `prepareChatBody` enforces that too, but sending it explicitly keeps this
1236
+ * function's output valid on its own.
1237
+ *
1238
+ * Measured on the built artifact: 112,713 bytes of body, and the upstream
1239
+ * counted `prompt_tokens: 25023` at a cost of `credit: 0.72`.
1240
+ */
1241
+ declare function probeRequestBody(modelId: string): string;
1242
+ /**
1243
+ * How one probe ended.
1244
+ *
1245
+ * `rate-limited` is split out from a generic failure because it is the one
1246
+ * outcome the feature exists for: it means "this model works, but not right
1247
+ * now". Everything else is a real, actionable failure or a success.
1248
+ */
1249
+ type WorkBuddyProbeOutcome = 'ok' | 'rate-limited' | 'out-of-credit' | 'credential-rejected' | 'unavailable' | 'not-found' | 'failed';
1250
+ /**
1251
+ * One probe result, as the card renders it.
1252
+ *
1253
+ * `retryAtMs` is present ONLY when the upstream actually stated a time (a
1254
+ * `Retry-After` header, or the region's quota refresh point when the failure is
1255
+ * an exhausted quota). Its absence is meaningful and must be rendered as "the
1256
+ * upstream did not say", never as a locally invented countdown.
1257
+ */
1258
+ interface WorkBuddyProbeResult {
1259
+ modelId: string;
1260
+ outcome: WorkBuddyProbeOutcome;
1261
+ /** Round-trip time in ms, for a successful probe. */
1262
+ elapsedMs?: number;
1263
+ /** HTTP status the upstream answered with; 0 means the request never landed. */
1264
+ status?: number;
1265
+ /** Upstream's own words, redacted. Present on failures. */
1266
+ message?: string;
1267
+ /** A time the upstream named, in ms. Absent when it named none. */
1268
+ retryAtMs?: number;
1269
+ /** Where a supplied `retryAtMs` came from, so the card can say so. */
1270
+ retrySource?: 'retry-after' | 'upstream-message' | 'quota-refresh';
1271
+ }
1272
+ /**
1273
+ * Parse a `Retry-After` header value into an absolute time.
1274
+ *
1275
+ * Both RFC 9110 forms are accepted: delay-seconds (`120`) and an HTTP-date
1276
+ * (`Wed, 21 Oct 2026 07:28:00 GMT`). Returns undefined for anything else,
1277
+ * including the negative/zero delays some gateways emit — a "retry now" is not
1278
+ * a cooldown and reporting it as one would be worse than saying nothing.
1279
+ *
1280
+ * `nowMs` is injected so the delay-seconds branch is testable without a clock.
1281
+ */
1282
+ declare function parseRetryAfter(value: string | null, nowMs: number): number | undefined;
1283
+ /**
1284
+ * The cooldown the upstream stated, if it stated one.
1285
+ *
1286
+ * Three sources, in order of authority:
1287
+ *
1288
+ * 1. `Retry-After` on the failure response. This is the upstream naming a time
1289
+ * for THIS request, so it wins.
1290
+ * 2. The reset time the upstream writes into its own failure body (see
1291
+ * {@link parseUpstreamResetAt}). This is the case that actually fires on
1292
+ * this service: a 429 from the Chinese gateway carries code 6004 and a
1293
+ * `将在 … 重置` sentence, with no `Retry-After` header at all.
1294
+ * 3. The region's monthly quota refresh point, but ONLY for an out-of-credit
1295
+ * outcome. A quota that resets at a known time is the one case where "when
1296
+ * can I use this again" has a real answer even without a header — and it is
1297
+ * the answer for the most common real limit on this service.
1298
+ *
1299
+ * A limited outcome with none of the three returns `{}`, which the card renders
1300
+ * as "the upstream did not say when". That remains the honest answer for a
1301
+ * genuinely timeless failure; inventing a number here would be pure fiction.
1302
+ */
1303
+ declare function cooldownOf(input: {
1304
+ outcome: WorkBuddyProbeOutcome;
1305
+ retryAfter: string | null;
1306
+ nowMs: number;
1307
+ /** The upstream's own failure text, where a reset sentence may live. */
1308
+ body?: string;
1309
+ /** The region's next monthly quota refresh, when the upstream declares one. */
1310
+ quotaRefreshAtMs?: number;
1311
+ }): Pick<WorkBuddyProbeResult, 'retryAtMs' | 'retrySource'>;
1312
+ /**
1313
+ * Classify one failed probe into the card's outcome vocabulary.
1314
+ *
1315
+ * Built on `classifyUpstreamError` rather than re-testing status codes, so a
1316
+ * probe and a real chat request can never disagree about what the same upstream
1317
+ * answer means. The extra split here is `credential-rejected`, which the
1318
+ * upstream signals with a non-JSON 401/403 edge page and which needs completely
1319
+ * different advice (re-auth, not "wait").
1320
+ */
1321
+ declare function outcomeOfFailure(status: number, body: string): WorkBuddyProbeOutcome;
1322
+ /**
1323
+ * Read the credit this probe consumed out of an SSE stream, when the upstream
1324
+ * reports it.
1325
+ *
1326
+ * Purely informational — the card shows it so a user can see how little a probe
1327
+ * actually costs rather than having to trust a claim. Absent when the stream
1328
+ * carried no `usage` block.
1329
+ */
1330
+ declare function creditOfStream(text: string): number | undefined;
1331
+ /** Whether a probe outcome means the model answered. */
1332
+ declare function probeSucceeded(outcome: WorkBuddyProbeOutcome): boolean;
1333
+ /** What one probe needs from the upstream client. */
1334
+ interface WorkBuddyProbeClient {
1335
+ probeChat(credential: WorkBuddyCredential, bodyJson: string, signal?: AbortSignal): Promise<{
1336
+ ok: boolean;
1337
+ status: number;
1338
+ retryAfter: string | null;
1339
+ body?: string;
1340
+ response?: Response;
1341
+ }>;
1342
+ }
1343
+ /**
1344
+ * Run one probe for one model and reduce it to the card's row.
1345
+ *
1346
+ * The successful path drains the SSE stream purely to read the `credit` figure
1347
+ * the upstream reports, then discards the rest: the question is whether this
1348
+ * model answers a real-sized request, and `max_tokens: 1` means there is nothing
1349
+ * else in the stream worth keeping.
1350
+ *
1351
+ * Never throws. A probe is a diagnostic the user asked for, so every failure is
1352
+ * a RESULT — one dead model must not abort the batch and hide the other rows.
1353
+ */
1354
+ declare function probeModel(input: {
1355
+ client: WorkBuddyProbeClient;
1356
+ credential: WorkBuddyCredential;
1357
+ modelId: string;
1358
+ nowMs: number;
1359
+ /** The region's next monthly quota refresh, when known. */
1360
+ quotaRefreshAtMs?: number;
1361
+ signal?: AbortSignal;
1362
+ }): Promise<WorkBuddyProbeResult>;
1363
+ //#endregion
1156
1364
  //#region src/status-paths.d.ts
1157
1365
  /**
1158
1366
  * Node-free constants and types shared by the Host and browser halves.
@@ -1175,6 +1383,15 @@ declare const WORKBUDDY_MODELS_REFRESH_PATH = "/plugins/dsh-connect-workbuddy/mo
1175
1383
  declare const WORKBUDDY_ACCOUNTS_REFRESH_PATH = "/plugins/dsh-connect-workbuddy/accounts/refresh";
1176
1384
  /** Plugin-owned daily check-in action endpoint. */
1177
1385
  declare const WORKBUDDY_CHECKIN_PATH = "/plugins/dsh-connect-workbuddy/checkin";
1386
+ /**
1387
+ * Plugin-owned model probe endpoint.
1388
+ *
1389
+ * Sends one minimal chat request per named model so the card can answer "is
1390
+ * this model usable right now, and if it is limited, when can it be used
1391
+ * again?". Lives on the Host because the credential must never reach the
1392
+ * browser half.
1393
+ */
1394
+ declare const WORKBUDDY_PROBE_PATH = "/plugins/dsh-connect-workbuddy/probe";
1178
1395
  /** Query parameter naming the region a card request addresses. */
1179
1396
  declare const WORKBUDDY_REGION_PARAM = "region";
1180
1397
  /** Every region, in card tab order. */
@@ -1444,6 +1661,38 @@ type WorkBuddyWebUsage =
1444
1661
  status: 'error';
1445
1662
  message: string;
1446
1663
  };
1664
+ /**
1665
+ * Outcome vocabulary of one model probe, shared by the Host and the card.
1666
+ *
1667
+ * Mirrors `WorkBuddyProbeOutcome` in `./probe.ts`; kept as its own declaration
1668
+ * here because this module is the node-free bridge and must not import the
1669
+ * Host-side probe module (which pulls in the credential type).
1670
+ */
1671
+ type WorkBuddyWebProbeOutcome = 'ok' | 'rate-limited' | 'out-of-credit' | 'credential-rejected' | 'unavailable' | 'not-found' | 'failed';
1672
+ /** One model's probe result, as the card renders it. */
1673
+ interface WorkBuddyWebProbeResult {
1674
+ modelId: string;
1675
+ outcome: WorkBuddyWebProbeOutcome;
1676
+ /** Round-trip time in ms; present once the request landed. */
1677
+ elapsedMs?: number;
1678
+ /** HTTP status the upstream answered with; 0 means it never landed. */
1679
+ status?: number;
1680
+ /** Upstream's own words, already redacted. */
1681
+ message?: string;
1682
+ /**
1683
+ * A time the upstream named for using this model again, in ms.
1684
+ *
1685
+ * ABSENT means the upstream named none, and the card must say exactly that.
1686
+ * A client-invented countdown here would be fiction. Three sources fill it:
1687
+ * a real `Retry-After` header; the reset sentence the upstream writes into
1688
+ * its own failure BODY (`将在 … UTC+8 重置`, which is where this service
1689
+ * actually puts it — its 429s carry no rate-limit header at all); or, for an
1690
+ * exhausted quota, the region's own quota refresh point.
1691
+ */
1692
+ retryAtMs?: number;
1693
+ /** Which of those three sources supplied {@link retryAtMs}. */
1694
+ retrySource?: 'retry-after' | 'upstream-message' | 'quota-refresh';
1695
+ }
1447
1696
  /**
1448
1697
  * Deep copy of a settings value with every `{get(): T}` live reference replaced
1449
1698
  * by the value it resolves to.
@@ -1511,6 +1760,29 @@ interface WorkBuddyStatusRouteOptions {
1511
1760
  * committed settings value rather than a local guess.
1512
1761
  */
1513
1762
  regionEnabled(region: WorkBuddyRegion): boolean;
1763
+ /**
1764
+ * Send one real-volume request to each named model of a region and report what
1765
+ * came back.
1766
+ *
1767
+ * Optional: it is the only dependency the card's test button needs, so a Host
1768
+ * built without it (or a route mounted for a status-only consumer) simply
1769
+ * answers 503 and the button reports that instead of failing the card.
1770
+ *
1771
+ * Every request costs real credits (measured `credit: 0.72` for one probe), so
1772
+ * the card drives this ONE model per click and never as a batch.
1773
+ */
1774
+ probeModels?(region: WorkBuddyRegion, modelIds: readonly string[], options?: {
1775
+ signal?: AbortSignal;
1776
+ }): Promise<readonly WorkBuddyWebProbeResult[]>;
1777
+ /**
1778
+ * The region's next monthly quota refresh, when the upstream declares one.
1779
+ *
1780
+ * Used ONLY to answer "when can I use this again" for an out-of-credit
1781
+ * outcome, which is the one cooldown the service actually states: a monthly
1782
+ * resource that resets at a known time. Every other limited outcome has no
1783
+ * time from any source and must be reported as such.
1784
+ */
1785
+ quotaRefreshAtMs?(region: WorkBuddyRegion): number | undefined;
1514
1786
  /**
1515
1787
  * Report whether a region still has at least one local sign-in.
1516
1788
  *
@@ -1739,4 +2011,4 @@ declare function legacyAttributionRegion(value: Config, accountsFor: (region: Wo
1739
2011
  */
1740
2012
  declare function apply(ctx: Context, config: Config): void;
1741
2013
  //#endregion
1742
- export { CREDENTIAL_REJECTED_CODE, Config, ENCRYPTED_CREDENTIAL_CODE, FALLBACK_WORKBUDDY_MODELS, FALLBACK_WORKBUDDY_MODELS_GLOBAL, NATIVE_MODALITY_BY_MODEL_ID, type UpstreamErrorKind, WORKBUDDY_ACCOUNTS_REFRESH_PATH, WORKBUDDY_APP_EXECUTABLE_ENV, WORKBUDDY_AUTH_FILENAME, WORKBUDDY_AUTH_FILE_ENV, WORKBUDDY_CHECKIN_PATH, WORKBUDDY_CONNECT_VERSION, WORKBUDDY_GLOBAL_PROVIDER, WORKBUDDY_HOST_HEARTBEAT_FILENAME, WORKBUDDY_MODELS_REFRESH_PATH, WORKBUDDY_PROVIDER, WORKBUDDY_PROVIDERS, WORKBUDDY_PROVIDER_DISPLAY_NAMES, WORKBUDDY_REGIONS, WORKBUDDY_REGION_PARAM, WORKBUDDY_SETTINGS_NS, WORKBUDDY_STREAM_IDLE_TIMEOUT_MS, WORKBUDDY_USAGE_PATH, type WorkBuddyAccountChoice, type WorkBuddyAdapter, type WorkBuddyAuthStatus, type WorkBuddyCandidateFailure, WorkBuddyCatalog, type WorkBuddyChatResult, type WorkBuddyCredential, type WorkBuddyCredentialRecovery, WorkBuddyCredentialRejectedError, WorkBuddyCredentialStore, type WorkBuddyCreditPackage, type WorkBuddyCredits, WorkBuddyEncryptedCredentialError, type WorkBuddyEncryptedField, type WorkBuddyHostHeartbeat, type WorkBuddyModelInfo, type WorkBuddyNativeModality, type WorkBuddyProbeStore, type WorkBuddyReasoning, type WorkBuddyRecoveryCandidate, type WorkBuddyRefreshOutcome, WorkBuddyRegionState, type WorkBuddyShim, type WorkBuddyStatusRouteOptions, type WorkBuddyStoreOptions, WorkBuddyUpstreamClient, type WorkBuddyUpstreamModel, type WorkBuddyUsabilityProbeOptions, apply, asVolatile, authFileName, classifyUpstreamError, clearAtRestKeyCache, clearHostHeartbeat, createAccountUsabilityProbe, createWorkBuddyAdapter, createWorkBuddyShim, defaultDesktopAuthCandidates, defaultDesktopAuthDirs, defaultDesktopAuthPath, deriveAtRestKey, deriveAtRestKeyId, deriveCatalog, fallbackModelsFor, fetchAtRestKeyPayload, findWorkbuddyAppExecutable, hasEncryptedCredentialFields, imageDefaultFor, inject, isCredentialRejectedError, isEncryptedCredentialError, isEncryptedFieldWrapper, isHeartbeatProcessAlive, isWorkbuddyBundle, legacyAttributionRegion, legacyWorkbuddyOwnAuthPath, macosBundleExecutable, macosNestedAppBundles, name, nativeModalityOf, nextRegionEnabled, nextRegionSlots, openEncryptedField, parseCreditMultiplier, parseReasoning, parseUpstreamModel, parseWorkBuddyAuth, prepareChatBody, processStartTimeMs, readAtRestKey, readHostHeartbeat, regionCleared, regionEnabled, regionEnabledOf, regionOf, regionOfProvider, regionOfStatusUrl, regionStateOf, registerWorkBuddyStatusRoute, resolveCredentialRecovery, selectAccountFor, settingsNamespaceOf, toPersistedWorkBuddyModel, unwrapVolatileDeep, withWorkBuddyRegion, workBuddyDisplayName, workBuddyModelInput, workBuddyThinkingLevelMap, workBuddyWebStatus, workbuddyAccountId, workbuddyAppExecutableCandidates, workbuddyHostHeartbeatPath, workbuddyOwnAuthPath, writeHostHeartbeat };
2014
+ export { CREDENTIAL_REJECTED_CODE, Config, ENCRYPTED_CREDENTIAL_CODE, FALLBACK_WORKBUDDY_MODELS, FALLBACK_WORKBUDDY_MODELS_GLOBAL, NATIVE_MODALITY_BY_MODEL_ID, PROBE_INPUT_TOKENS, PROBE_MAX_TOKENS, PROBE_SYSTEM_PROMPT, type UpstreamErrorKind, WORKBUDDY_ACCOUNTS_REFRESH_PATH, WORKBUDDY_APP_EXECUTABLE_ENV, WORKBUDDY_AUTH_FILENAME, WORKBUDDY_AUTH_FILE_ENV, WORKBUDDY_CHECKIN_PATH, WORKBUDDY_CONNECT_VERSION, WORKBUDDY_GLOBAL_PROVIDER, WORKBUDDY_HOST_HEARTBEAT_FILENAME, WORKBUDDY_MODELS_REFRESH_PATH, WORKBUDDY_PROBE_PATH, WORKBUDDY_PROVIDER, WORKBUDDY_PROVIDERS, WORKBUDDY_PROVIDER_DISPLAY_NAMES, WORKBUDDY_REGIONS, WORKBUDDY_REGION_PARAM, WORKBUDDY_SETTINGS_NS, WORKBUDDY_STREAM_IDLE_TIMEOUT_MS, WORKBUDDY_USAGE_PATH, type WorkBuddyAccountChoice, type WorkBuddyAdapter, type WorkBuddyAuthStatus, type WorkBuddyCandidateFailure, WorkBuddyCatalog, type WorkBuddyChatResult, type WorkBuddyCredential, type WorkBuddyCredentialRecovery, WorkBuddyCredentialRejectedError, WorkBuddyCredentialStore, type WorkBuddyCreditPackage, type WorkBuddyCredits, WorkBuddyEncryptedCredentialError, type WorkBuddyEncryptedField, type WorkBuddyHostHeartbeat, type WorkBuddyModelInfo, type WorkBuddyNativeModality, type WorkBuddyProbeClient, type WorkBuddyProbeOutcome, type WorkBuddyProbeResult, type WorkBuddyProbeStore, type WorkBuddyReasoning, type WorkBuddyRecoveryCandidate, type WorkBuddyRefreshOutcome, WorkBuddyRegionState, type WorkBuddyShim, type WorkBuddyStatusRouteOptions, type WorkBuddyStoreOptions, WorkBuddyUpstreamClient, type WorkBuddyUpstreamModel, type WorkBuddyUsabilityProbeOptions, apply, asVolatile, authFileName, classifyUpstreamError, clearAtRestKeyCache, clearHostHeartbeat, cooldownOf, createAccountUsabilityProbe, createWorkBuddyAdapter, createWorkBuddyShim, creditOfStream, defaultDesktopAuthCandidates, defaultDesktopAuthDirs, defaultDesktopAuthPath, deriveAtRestKey, deriveAtRestKeyId, deriveCatalog, fallbackModelsFor, fetchAtRestKeyPayload, findWorkbuddyAppExecutable, hasEncryptedCredentialFields, imageDefaultFor, inject, isCredentialRejectedError, isEncryptedCredentialError, isEncryptedFieldWrapper, isHeartbeatProcessAlive, isWorkbuddyBundle, legacyAttributionRegion, legacyWorkbuddyOwnAuthPath, macosBundleExecutable, macosNestedAppBundles, name, nativeModalityOf, nextRegionEnabled, nextRegionSlots, openEncryptedField, outcomeOfFailure, parseCreditMultiplier, parseReasoning, parseRetryAfter, parseUpstreamModel, parseWorkBuddyAuth, prepareChatBody, probeModel, probeRequestBody, probeSucceeded, processStartTimeMs, readAtRestKey, readHostHeartbeat, regionCleared, regionEnabled, regionEnabledOf, regionOf, regionOfProvider, regionOfStatusUrl, regionStateOf, registerWorkBuddyStatusRoute, resolveCredentialRecovery, selectAccountFor, settingsNamespaceOf, toPersistedWorkBuddyModel, unwrapVolatileDeep, withWorkBuddyRegion, workBuddyDisplayName, workBuddyModelInput, workBuddyThinkingLevelMap, workBuddyWebStatus, workbuddyAccountId, workbuddyAppExecutableCandidates, workbuddyHostHeartbeatPath, workbuddyOwnAuthPath, writeHostHeartbeat };