dsh-connect-workbuddy 3.6.0 → 4.2.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/lib/index.d.ts CHANGED
@@ -116,6 +116,12 @@ interface WorkBuddyStoreOptions {
116
116
  * pre-dual-provider location. Injectable for tests.
117
117
  */
118
118
  legacyOwnPath?: string;
119
+ /**
120
+ * The unified credential vault directory for this store. Defaults to the
121
+ * per-region directory under the Harness home; injectable so the vault's
122
+ * merge/scan behaviour is testable without touching a real machine.
123
+ */
124
+ vaultDir?: string;
119
125
  /**
120
126
  * Auth directories to scan, overriding the platform defaults. Injectable so
121
127
  * the multi-account scan is testable without touching a real machine.
@@ -233,6 +239,9 @@ declare class WorkBuddyCredentialStore {
233
239
  private readonly ownPathExplicit;
234
240
  private readonly legacyOwnPath;
235
241
  private readonly legacyOwnPathExplicit;
242
+ private readonly vaultDirExplicit;
243
+ /** The vault directory, resolved ONCE at construction. */
244
+ private readonly vaultDirResolved;
236
245
  private readonly authDirs;
237
246
  private readonly resolveAtRestKey;
238
247
  private desktopPathOverride;
@@ -268,6 +277,8 @@ declare class WorkBuddyCredentialStore {
268
277
  * the real machine's legacy copy.
269
278
  */
270
279
  private ownCandidates;
280
+ /** The vault directory this store reads and writes (fixed at construction). */
281
+ private vaultDir;
271
282
  /** Repoint the desktop file or directory; applies on the next read. */
272
283
  setDesktopPath(path: string | undefined): void;
273
284
  /**
@@ -321,6 +332,16 @@ declare class WorkBuddyCredentialStore {
321
332
  * which is what keeps the two regions' providers from cross-billing.
322
333
  */
323
334
  private readAll;
335
+ /**
336
+ * Merge the scan's credentials into the vault and read the vault back.
337
+ *
338
+ * Incremental by contract: a scan that finds nothing new writes nothing.
339
+ * Per account, the vault entry is written only when the scan's read is
340
+ * fresher by {@link isFresherVaultEntry} — so a steady-state scan is
341
+ * mtime-stable and every sync is O(accounts) reads with at most one write
342
+ * per CHANGED account.
343
+ */
344
+ private syncVault;
324
345
  /**
325
346
  * Default when no account is explicitly selected: the live sign-in, else the
326
347
  * freshest credential. Following the app's current sign-in is the documented
@@ -396,6 +417,31 @@ declare class WorkBuddyCredentialStore {
396
417
  private describeMissingCredential;
397
418
  /** Read-only sign-in summary; never refreshes and never throws. */
398
419
  status(): Promise<WorkBuddyAuthStatus>;
420
+ /**
421
+ * Persist one OAuth sign-in into the unified vault.
422
+ *
423
+ * The credential is written with `source: 'dsh'` (it never came from a
424
+ * desktop file) and joins the readable set on the next scan — the vault is
425
+ * read by `readAll()` like any other source, so no separate discovery path
426
+ * exists. The write is idempotent per account id: re-adding an account
427
+ * replaces its entry, which is exactly what re-issuing a login means.
428
+ *
429
+ * Returns the account id so the card can offer to select it right away.
430
+ */
431
+ addOAuthAccount(credential: Omit<WorkBuddyCredential, 'source' | 'filePath'>): Promise<string>;
432
+ /**
433
+ * Remove ONE account's plugin-stored credential by id.
434
+ *
435
+ * Only the VAULT entry is deleted — the desktop app's auth files are read-only
436
+ * to this plugin and are never touched, so an account that still exists as a
437
+ * desktop sign-in reappears on the next scan. That is the honest behaviour:
438
+ * the button means "forget what the plugin stored", not "sign the app out".
439
+ *
440
+ * Returns whether a stored entry was actually removed, so the caller can
441
+ * distinguish "removed" from "this account only ever existed as a desktop
442
+ * sign-in" without a second scan.
443
+ */
444
+ removeAccount(accountId: string): Promise<boolean>;
399
445
  /**
400
446
  * Remove every plugin-owned copy this store could read (per-region file,
401
447
  * legacy single file, and their lock siblings); the desktop files are
@@ -406,7 +452,6 @@ declare class WorkBuddyCredentialStore {
406
452
  logout(): Promise<void>;
407
453
  private needsRefresh;
408
454
  private refreshNow;
409
- private saveOwn;
410
455
  /**
411
456
  * Every readable plugin-owned copy, in candidate order; absent or corrupt
412
457
  * files are skipped rather than propagated.
@@ -578,6 +623,30 @@ interface UpstreamErrorDetail {
578
623
  * them at the openresty layer with an HTML 401.
579
624
  */
580
625
  declare function regionOf(domain: string): WorkBuddyRegion;
626
+ /**
627
+ * The STRICT counterpart of {@link regionOf}: a region's domain only when it is
628
+ * positively recognised, `undefined` for anything else.
629
+ *
630
+ * `regionOf`'s catch-all is deliberate — the CN product is single-homed, so an
631
+ * unrecognised spelling is treated as CN and a real (if oddly written) CN
632
+ * credential still resolves. That reasoning holds only for a domain the
633
+ * UPSTREAM issued. It does not hold for a value read out of a file someone
634
+ * handed the plugin: there "unrecognised" means "cannot be classified", and
635
+ * calling it CN would file a foreign or spoofed credential in the CN vault.
636
+ * Import gates must use this, not {@link regionOf}.
637
+ *
638
+ * Both sides are matched on their registrable domain, so a bare host and any
639
+ * subdomain qualify while a lookalike such as `codebuddy.cn.evil.com` cannot.
640
+ *
641
+ * `copilot.tencent.com` is NOT a third product — it is this plugin's OWN CN
642
+ * chat gateway (`CN_CHAT_BASE`), and the credential's `domain` field carries it
643
+ * verbatim on real records. Refusing it here made the plugin reject its own
644
+ * export: the card exported 8 accounts, and re-importing that file skipped the
645
+ * three whose `domain` was the gateway. It cannot be spoofed into the wrong
646
+ * region by being recognised here — it names the CN gateway, so admitting it is
647
+ * the same decision as admitting `workbuddy.cn`.
648
+ */
649
+ declare function knownRegionOf(domain: string): WorkBuddyRegion | undefined;
581
650
  /**
582
651
  * Normalize an OpenAI chat-completions body for the WorkBuddy upstream:
583
652
  * force `stream: true` (the upstream rejects non-streaming), flatten
@@ -1778,6 +1847,59 @@ declare const WORKBUDDY_CHECKIN_PATH = "/plugins/dsh-connect-workbuddy/checkin";
1778
1847
  * browser half.
1779
1848
  */
1780
1849
  declare const WORKBUDDY_PROBE_PATH = "/plugins/dsh-connect-workbuddy/probe";
1850
+ /**
1851
+ * One entry of the transfer PREVIEW: display fields only, never token
1852
+ * material. `hasToken` is the import decision input — the import step skips
1853
+ * records without one — and the indexes are the FILE's positions, so the user
1854
+ * picks by the same numbers the import call sends back.
1855
+ */
1856
+ interface WorkBuddyTransferPreviewEntry {
1857
+ index: number;
1858
+ uid: string;
1859
+ nickname: string;
1860
+ email: string;
1861
+ hasToken: boolean;
1862
+ }
1863
+ /** The preview answer: the desensitized listing plus the file's total count. */
1864
+ interface WorkBuddyTransferPreview {
1865
+ accounts: readonly WorkBuddyTransferPreviewEntry[];
1866
+ total: number;
1867
+ }
1868
+ /**
1869
+ * The import answer. `imported` counts records merged into the vault (new OR
1870
+ * overwritten — both change the stored entry); `skipped` counts what was
1871
+ * left out: missing token, a bad index, or a record whose login domain does
1872
+ * not belong to the addressed region.
1873
+ */
1874
+ interface WorkBuddyTransferImportAnswer {
1875
+ imported: number;
1876
+ skipped: number;
1877
+ }
1878
+ /**
1879
+ * The shared file format's record shape, subset the importer consumes.
1880
+ *
1881
+ * Contract with sibling tools exporting the same format: a JSON array of
1882
+ * objects keyed in snake_case — `access_token` (required), `refresh_token`,
1883
+ * `uid`, `nickname`, `email`, `domain`, `expiresAt` (epoch ms),
1884
+ * `refreshExpiresAt`, `auth_raw`. Extra fields ride along untouched.
1885
+ */
1886
+ interface WorkBuddyTransferRecord {
1887
+ access_token: string;
1888
+ refresh_token?: string;
1889
+ uid?: string;
1890
+ nickname?: string;
1891
+ email?: string;
1892
+ domain?: string;
1893
+ /** Access-token expiry in epoch MILLISECONDS, the sibling format's unit. */
1894
+ expiresAt?: number;
1895
+ refreshExpiresAt?: number;
1896
+ /** The sibling tool's original credential document, preserved verbatim. */
1897
+ auth_raw?: unknown;
1898
+ }
1899
+ /** The export answer: the records themselves, tokens included. */
1900
+ interface WorkBuddyTransferExportAnswer {
1901
+ accounts: WorkBuddyTransferRecord[];
1902
+ }
1781
1903
  /** Query parameter naming the region a card request addresses. */
1782
1904
  declare const WORKBUDDY_REGION_PARAM = "region";
1783
1905
  /** Every region, in card tab order. */
@@ -1983,6 +2105,17 @@ type WorkBuddyWebUsage =
1983
2105
  accounts: readonly WorkBuddyWebAccount[];
1984
2106
  /** Whether this region's provider is currently offered to DSH. */
1985
2107
  enabled?: boolean;
2108
+ /**
2109
+ * Whether this region's sidebar credit line is shown.
2110
+ *
2111
+ * Carried on the Host's answer rather than read from the browser settings
2112
+ * mirror, for the same measured reason as `contextBudgets`: on the affected
2113
+ * 0.1.7 deployment the mirror never picks up this plugin's writes (a save
2114
+ * through the Host endpoint leaves it stale), so a control reading it kept
2115
+ * showing the old value and looked like it could not be turned off — the
2116
+ * "关闭不了" report.
2117
+ */
2118
+ showCreditsInMainUi?: boolean;
1986
2119
  message?: string;
1987
2120
  /** The persisted account id matches no local account. */
1988
2121
  selectionLost?: boolean;
@@ -2011,6 +2144,12 @@ type WorkBuddyWebUsage =
2011
2144
  region: WorkBuddyWebRegion;
2012
2145
  /** Whether this region's provider is currently offered to DSH. */
2013
2146
  enabled?: boolean;
2147
+ /**
2148
+ * Whether this region's sidebar credit line is shown. See the signed-out
2149
+ * variant for why this travels on the Host's answer instead of the browser
2150
+ * settings mirror.
2151
+ */
2152
+ showCreditsInMainUi?: boolean;
2014
2153
  source?: 'desktop' | 'dsh';
2015
2154
  tokenExpiresAtMs: number;
2016
2155
  /** A saved per-region choice is in effect (false = following the app). */
@@ -2317,6 +2456,19 @@ interface WorkBuddyStatusRouteOptions {
2317
2456
  * committed settings value rather than a local guess.
2318
2457
  */
2319
2458
  regionEnabled(region: WorkBuddyRegion): boolean;
2459
+ /**
2460
+ * Whether the region's sidebar credit line is shown.
2461
+ *
2462
+ * Read from the COMMITTED settings value here rather than in the browser, for
2463
+ * the same reason as `regionEnabled` — and additionally because the browser's
2464
+ * settings mirror is documented as stale for this namespace on the affected
2465
+ * 0.1.7 deployments, which made the checkbox appear unable to turn the line
2466
+ * off ("关闭不了"). The card reads this field off the Host's answer.
2467
+ *
2468
+ * Optional so a Host that predates the setting still satisfies the interface;
2469
+ * absent reads as ON, matching the schema's `default(true)`.
2470
+ */
2471
+ showCreditsInMainUi?(region: WorkBuddyRegion): boolean;
2320
2472
  /**
2321
2473
  * Send one real-volume request to each named model of a region and report what
2322
2474
  * came back.
@@ -2359,6 +2511,18 @@ interface WorkBuddyStatusRouteOptions {
2359
2511
  * probe.
2360
2512
  */
2361
2513
  accountUsable?(region: WorkBuddyRegion, account: WorkBuddyRecoveryCandidate): Promise<boolean>;
2514
+ /**
2515
+ * Why each of the region's accounts cannot serve right now, keyed by account
2516
+ * id. Absent key (or an absent dep) means "no reason known" — the composer
2517
+ * panel then marks nothing, which is the honest answer for an account that has
2518
+ * never been measured.
2519
+ *
2520
+ * The rule is the SAME one the pool ranks by (`exclusionOf`), including its
2521
+ * cooldown-expiry handling, so an account the pool calls usable and one the
2522
+ * panel calls rate-limited can never be the same account at the same moment.
2523
+ * Reimplementing the expiry check here would let the two drift.
2524
+ */
2525
+ accountExclusions?(region: WorkBuddyRegion): Promise<Readonly<Record<string, WorkBuddyWebPoolExclusion>>>;
2362
2526
  /**
2363
2527
  * The region's account pool, assembled on the Host.
2364
2528
  *
@@ -2368,7 +2532,79 @@ interface WorkBuddyStatusRouteOptions {
2368
2532
  * that needs a working probe dependency.
2369
2533
  */
2370
2534
  pool?: WorkBuddyPoolDeps;
2535
+ /**
2536
+ * OAuth QR sign-in: start a login and poll it to completion.
2537
+ *
2538
+ * Optional as a whole: a Host built without it simply omits the card's
2539
+ * sign-in affordance (an older bundle keeps rendering, minus the button).
2540
+ */
2541
+ oauth?: WorkBuddyOAuthDeps;
2542
+ /**
2543
+ * Batch credential export / import between machines.
2544
+ *
2545
+ * Optional as a whole: a Host built without it simply omits the card's
2546
+ * transfer section (an older bundle keeps rendering, minus the buttons).
2547
+ */
2548
+ transfer?: WorkBuddyTransferDeps;
2549
+ }
2550
+ /**
2551
+ * What the transfer route needs from the Host. Everything is region-scoped:
2552
+ * the two regions' vaults are parallel stacks, and an export of one tab must
2553
+ * never leak the other tab's accounts.
2554
+ */
2555
+ interface WorkBuddyTransferDeps {
2556
+ /**
2557
+ * Export the named accounts' credentials in the shared transfer format.
2558
+ * Unknown ids are simply absent from the answer; an answer with zero
2559
+ * records means nothing named was exportable (the caller decides whether
2560
+ * that is an error).
2561
+ */
2562
+ exportAccounts(region: WorkBuddyRegion, accountIds: readonly string[]): Promise<WorkBuddyTransferExportAnswer>;
2563
+ /** Parse transfer-file text into the desensitized preview. */
2564
+ previewImport(region: WorkBuddyRegion, text: string): Promise<WorkBuddyTransferPreview>;
2565
+ /**
2566
+ * Merge the selected file entries into the region's vault. Returns the
2567
+ * counters the card reports; `skipped` covers missing tokens, bad indexes,
2568
+ * and records belonging to the other region.
2569
+ */
2570
+ importAccounts(region: WorkBuddyRegion, text: string, indexes: readonly number[]): Promise<WorkBuddyTransferImportAnswer>;
2571
+ }
2572
+ /**
2573
+ * What the OAuth route needs from the Host: the two session actions, plus the
2574
+ * persistence step the route cannot do itself (only the Host may touch the
2575
+ * credential vault).
2576
+ */
2577
+ interface WorkBuddyOAuthDeps {
2578
+ /**
2579
+ * Start one login for the region. Resolves the URL the user opens to scan
2580
+ * and confirm, or an actionable error.
2581
+ */
2582
+ start(region: WorkBuddyRegion): Promise<WorkBuddyOAuthStartResult>;
2583
+ /**
2584
+ * Poll once. The card repeats until `done` — then either the account was
2585
+ * persisted (the Host saved it to the vault) or an error is reported.
2586
+ */
2587
+ poll(region: WorkBuddyRegion, loginId: string): Promise<WorkBuddyOAuthPollView>;
2371
2588
  }
2589
+ /** The start answer, token-free (the state never leaves the Host). */
2590
+ type WorkBuddyOAuthStartResult = {
2591
+ loginId: string;
2592
+ verificationUri: string;
2593
+ expiresIn: number;
2594
+ } | {
2595
+ error: string;
2596
+ };
2597
+ /** The poll answer the card sees. `account` carries display fields only. */
2598
+ type WorkBuddyOAuthPollView = {
2599
+ done: false;
2600
+ } | {
2601
+ done: true;
2602
+ accountName: string;
2603
+ accountId: string;
2604
+ } | {
2605
+ done: true;
2606
+ error: string;
2607
+ };
2372
2608
  /**
2373
2609
  * What the pool route needs from the Host.
2374
2610
  *
@@ -2402,6 +2638,22 @@ interface WorkBuddyPoolDeps {
2402
2638
  * checked) instead of passing the guard and running a batch over nothing.
2403
2639
  */
2404
2640
  effectiveMemberAccountIds?(region: WorkBuddyRegion): Promise<readonly string[]>;
2641
+ /**
2642
+ * Test ONE account against the region's target model.
2643
+ *
2644
+ * The per-row button's Host half. Optional: a Host built without it simply
2645
+ * omits the row button (an older bundle keeps rendering, minus the control).
2646
+ * Returns undefined when the region cannot name a target model — the same
2647
+ * refusal the batch route reports as 409.
2648
+ */
2649
+ testOne?(region: WorkBuddyRegion, accountId: string): Promise<WorkBuddyPoolTestRow | undefined>;
2650
+ /**
2651
+ * Forget ONE account's plugin-stored credential. Only the vault entry is
2652
+ * removed; the desktop app's files are never touched. Returns whether an
2653
+ * entry existed — false means the account exists only as a desktop sign-in
2654
+ * (or was already gone), which the card reports instead of a silent no-op.
2655
+ */
2656
+ removeOne?(region: WorkBuddyRegion, accountId: string): Promise<boolean>;
2405
2657
  /**
2406
2658
  * Today's check-in state per account id.
2407
2659
  *
@@ -2508,6 +2760,15 @@ interface WorkBuddyRegionState {
2508
2760
  * row (see `syncRegionRegistration`).
2509
2761
  */
2510
2762
  enabled?: boolean;
2763
+ /**
2764
+ * Whether this region's credit balance shows at the DSH sidebar foot.
2765
+ *
2766
+ * Per-region, independently switched: WB CN and WB AI are separate accounts
2767
+ * on separate gateways, so a user holding only one of them must be able to
2768
+ * show exactly that one. Opt-out — an absent value reads as ON, so a config
2769
+ * written before this switch existed keeps whatever the default was.
2770
+ */
2771
+ showCreditsInMainUi?: boolean;
2511
2772
  /** The last-refreshed directory for this region; what the card displays. */
2512
2773
  lastCatalog?: WorkBuddyModelInfo[];
2513
2774
  /** The user's selection in this region, as model ids. */
@@ -2721,4 +2982,4 @@ declare function legacyAttributionRegion(value: Config, accountsFor: (region: Wo
2721
2982
  */
2722
2983
  declare function apply(ctx: Context, config: Config): void;
2723
2984
  //#endregion
2724
- export { CREDENTIAL_REJECTED_CODE, Config, DEFAULT_PROBE_INPUT_TOKENS, ENCRYPTED_CREDENTIAL_CODE, FALLBACK_WORKBUDDY_MODELS, FALLBACK_WORKBUDDY_MODELS_GLOBAL, NATIVE_MODALITY_BY_MODEL_ID, PROBE_INPUT_TOKEN_CHOICES, PROBE_MAX_TOKENS, PROBE_SYSTEM_PROMPT, REFUSES_OFF_MODEL_IDS, 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, WorkBuddyPoolPreferences, 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, defaultOffModelIds, deriveAtRestKey, deriveAtRestKeyId, deriveCatalog, fallbackModelsFor, fetchAtRestKeyPayload, findWorkbuddyAppExecutable, hasEncryptedCredentialFields, imageDefaultFor, inject, isCredentialRejectedError, isEncryptedCredentialError, isEncryptedFieldWrapper, isHeartbeatProcessAlive, isWorkbuddyBundle, legacyAttributionRegion, legacyWorkbuddyOwnAuthPath, macosBundleExecutable, macosNestedAppBundles, name, nativeModalityOf, nextRegionEnabled, nextRegionSlots, offDefaultFor, 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, withEffectiveOff, withWorkBuddyRegion, workBuddyDisplayName, workBuddyModelInput, workBuddyThinkingLevelMap, workBuddyWebStatus, workbuddyAccountId, workbuddyAppExecutableCandidates, workbuddyHostHeartbeatPath, workbuddyOwnAuthPath, writeHostHeartbeat };
2985
+ export { CREDENTIAL_REJECTED_CODE, Config, DEFAULT_PROBE_INPUT_TOKENS, ENCRYPTED_CREDENTIAL_CODE, FALLBACK_WORKBUDDY_MODELS, FALLBACK_WORKBUDDY_MODELS_GLOBAL, NATIVE_MODALITY_BY_MODEL_ID, PROBE_INPUT_TOKEN_CHOICES, PROBE_MAX_TOKENS, PROBE_SYSTEM_PROMPT, REFUSES_OFF_MODEL_IDS, 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, WorkBuddyPoolPreferences, 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, defaultOffModelIds, deriveAtRestKey, deriveAtRestKeyId, deriveCatalog, fallbackModelsFor, fetchAtRestKeyPayload, findWorkbuddyAppExecutable, hasEncryptedCredentialFields, imageDefaultFor, inject, isCredentialRejectedError, isEncryptedCredentialError, isEncryptedFieldWrapper, isHeartbeatProcessAlive, isWorkbuddyBundle, knownRegionOf, legacyAttributionRegion, legacyWorkbuddyOwnAuthPath, macosBundleExecutable, macosNestedAppBundles, name, nativeModalityOf, nextRegionEnabled, nextRegionSlots, offDefaultFor, 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, withEffectiveOff, withWorkBuddyRegion, workBuddyDisplayName, workBuddyModelInput, workBuddyThinkingLevelMap, workBuddyWebStatus, workbuddyAccountId, workbuddyAppExecutableCandidates, workbuddyHostHeartbeatPath, workbuddyOwnAuthPath, writeHostHeartbeat };