@cortexkit/opencode-anthropic-auth 1.22.0 → 2.0.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.
Files changed (91) hide show
  1. package/README.md +259 -198
  2. package/dist/billing-lineage.d.ts +51 -0
  3. package/dist/cli-failure.d.ts +69 -0
  4. package/dist/cli.d.ts +16 -10
  5. package/dist/cli.js +111 -6
  6. package/dist/custody-dimensions.d.ts +19 -0
  7. package/dist/custody-mode.d.ts +46 -0
  8. package/dist/effort-history.d.ts +11 -2
  9. package/dist/fable-fallback.d.ts +1 -1
  10. package/dist/index-1jkyhgyr.js +2 -0
  11. package/dist/{index-bx5hsgf8.js → index-2arfb1y3.js} +2 -2
  12. package/dist/{index-926t2bzc.js → index-4ya27n12.js} +1 -1
  13. package/dist/{index-cgez4m0h.js → index-aaajxwzd.js} +1 -1
  14. package/dist/index-ae3fq4n6.js +42 -0
  15. package/dist/index-fds0s2j4.js +2 -0
  16. package/dist/index-nngmvczq.js +450 -0
  17. package/dist/index-pn597b6f.js +2 -0
  18. package/dist/{index-7f57ewkp.js → index-rqync0pc.js} +1 -1
  19. package/dist/index.js +1 -33
  20. package/dist/native-command.d.ts +19 -0
  21. package/dist/prime-manager-registry.d.ts +5 -1
  22. package/dist/rpc/notifications.d.ts +4 -3
  23. package/dist/rpc/port-file.js +1 -1
  24. package/dist/rpc/protocol.d.ts +15 -4
  25. package/dist/rpc/protocol.js +1 -1
  26. package/dist/rpc/rpc-client.d.ts +3 -1
  27. package/dist/rpc/rpc-client.js +1 -1
  28. package/dist/rpc/rpc-dir.js +1 -1
  29. package/dist/rpc/rpc-server.d.ts +5 -1
  30. package/dist/rpc/server-registry.d.ts +10 -0
  31. package/dist/setup/activation.d.ts +7 -0
  32. package/dist/setup/claustrum.d.ts +26 -0
  33. package/dist/setup/command-runner.d.ts +2 -0
  34. package/dist/setup/command.d.ts +20 -0
  35. package/dist/setup/command.test.d.ts +1 -0
  36. package/dist/setup/detect.d.ts +5 -0
  37. package/dist/setup/jsonc.d.ts +9 -0
  38. package/dist/setup/native-activation.d.ts +29 -0
  39. package/dist/setup/native-enrollment.d.ts +26 -0
  40. package/dist/setup/native-enrollment.test.d.ts +1 -0
  41. package/dist/setup/native-local.d.ts +20 -0
  42. package/dist/setup/native-login.d.ts +3 -0
  43. package/dist/setup/native-paths.d.ts +15 -0
  44. package/dist/setup/native-paths.test.d.ts +1 -0
  45. package/dist/setup/opencode-config.d.ts +18 -0
  46. package/dist/setup/paths.d.ts +15 -0
  47. package/dist/setup/pi.d.ts +18 -0
  48. package/dist/setup/process-fence.d.ts +20 -0
  49. package/dist/setup/process-fence.test.d.ts +1 -0
  50. package/dist/setup/types.d.ts +37 -0
  51. package/dist/sidebar-state.d.ts +3 -1
  52. package/dist/sidebar-state.js +1 -1
  53. package/dist/transform.d.ts +5 -1
  54. package/dist/tui/command-dialogs.d.ts +32 -2
  55. package/dist/tui-preferences.js +2 -2
  56. package/dist/v2/activation.d.ts +7 -0
  57. package/dist/v2/adapter.d.ts +276 -0
  58. package/dist/v2/install.d.ts +13 -0
  59. package/dist/v2/lifecycle.d.ts +8 -0
  60. package/dist/v2/menu-contract.d.ts +8 -0
  61. package/dist/v2/menu.d.ts +10 -0
  62. package/dist/v2/models.d.ts +6 -0
  63. package/dist/v2/ownership.d.ts +11 -0
  64. package/dist/v2/prime.d.ts +12 -0
  65. package/dist/v2/rpc.d.ts +50 -0
  66. package/dist/v2/server.d.ts +8 -0
  67. package/dist/v2/server.js +4 -0
  68. package/dist/v2/setup.d.ts +58 -0
  69. package/dist/v2/source.d.ts +41 -0
  70. package/dist/v2/tui.d.ts +13 -0
  71. package/dist/v2/tui.js +2 -0
  72. package/dist/v2/wire.d.ts +36 -0
  73. package/package.json +26 -6
  74. package/src/rpc/notifications.ts +37 -26
  75. package/src/rpc/protocol.ts +24 -7
  76. package/src/rpc/rpc-client.ts +18 -1
  77. package/src/rpc/rpc-server.ts +38 -8
  78. package/src/rpc/server-registry.ts +61 -0
  79. package/src/sidebar-state.ts +26 -2
  80. package/src/tui/command-dialogs.tsx +537 -68
  81. package/src/tui/entry.mjs +44 -18
  82. package/src/tui-compiled/rpc/protocol.ts +24 -7
  83. package/src/tui-compiled/rpc/rpc-client.ts +18 -1
  84. package/src/tui-compiled/sidebar-state.ts +26 -2
  85. package/src/tui-compiled/tui/command-dialogs.tsx +488 -95
  86. package/src/tui-compiled/tui.tsx +25 -7
  87. package/src/tui.tsx +38 -9
  88. package/dist/index-8aga2zwv.js +0 -4
  89. package/dist/index-d3f8g6ve.js +0 -428
  90. package/dist/index-sh51yqxs.js +0 -2
  91. package/dist/logger-jrkranbz.js +0 -1
@@ -0,0 +1,20 @@
1
+ import type { Writable } from 'node:stream';
2
+ import { detectAll } from './detect.ts';
3
+ import { activateNativeVaultForHost } from './native-activation.ts';
4
+ import { migrateNativeLocalForHost } from './native-local.ts';
5
+ import { loginNativeOffline } from './native-login.ts';
6
+ import type { CommandRunner, ProcessFence } from './types.ts';
7
+ export interface SetupCommandOptions {
8
+ runner?: CommandRunner;
9
+ fence?: ProcessFence;
10
+ env?: NodeJS.ProcessEnv;
11
+ isInteractive?: boolean;
12
+ /** Let tests substitute host detection and per-host vault activation. */
13
+ detect?: typeof detectAll;
14
+ activate?: typeof activateNativeVaultForHost;
15
+ migrateLocal?: typeof migrateNativeLocalForHost;
16
+ localLogin?: typeof loginNativeOffline;
17
+ /** Where setup prints its progress and errors; defaults to stdout. */
18
+ output?: Writable;
19
+ }
20
+ export declare function runSetupCommand(argv?: string[], options?: SetupCommandOptions): Promise<number>;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,5 @@
1
+ import type { ClaustrumDetection, CommandRunner, HostDetection, SetupDetection } from './types.ts';
2
+ export declare function detectOpenCode(env?: NodeJS.ProcessEnv, runner?: CommandRunner): Promise<HostDetection>;
3
+ export declare function detectPi(env?: NodeJS.ProcessEnv, runner?: CommandRunner): Promise<HostDetection>;
4
+ export declare function detectClaustrum(env?: NodeJS.ProcessEnv, runner?: CommandRunner): Promise<ClaustrumDetection>;
5
+ export declare function detectAll(env?: NodeJS.ProcessEnv, runner?: CommandRunner): Promise<SetupDetection>;
@@ -0,0 +1,9 @@
1
+ export declare function readJsonc<T = unknown>(path: string): {
2
+ value: T | null;
3
+ text: string;
4
+ exists: boolean;
5
+ };
6
+ export declare function updateJsoncArray(originalText: string, arrayPath: (string | number)[], entryToInsertOrUpdate: string, matcher: (existing: string) => boolean): {
7
+ text: string;
8
+ changed: boolean;
9
+ };
@@ -0,0 +1,29 @@
1
+ import { type NativeCustodyActivationHooks, type NativeCustodyInventory } from '@cortexkit/anthropic-auth-core';
2
+ import { type NativeVaultEnrollmentOptions } from './native-enrollment.ts';
3
+ import { type NativeSetupPaths } from './native-paths.ts';
4
+ import type { CommandRunner, HarnessKind, ProcessFence } from './types.ts';
5
+ export declare class NativeVaultActivationError extends Error {
6
+ readonly code: 'auth-content-refused' | 'host-auth-invalid' | 'primary-conflict' | 'consent-required' | 'primary-unverified';
7
+ constructor(code: 'auth-content-refused' | 'host-auth-invalid' | 'primary-conflict' | 'consent-required' | 'primary-unverified');
8
+ }
9
+ export interface NativeVaultActivationOptions {
10
+ env: NodeJS.ProcessEnv;
11
+ runner: CommandRunner;
12
+ fence: ProcessFence;
13
+ /** Consent to move Pi's stored authentication aside; never consent to delete it. */
14
+ removePiAnthropicAuth: boolean;
15
+ /**
16
+ * Tests override the host paths, enrollment client and vault listing;
17
+ * production resolves them from the host's environment.
18
+ */
19
+ paths?: NativeSetupPaths;
20
+ enrollment?: Pick<NativeVaultEnrollmentOptions, 'paths' | 'client' | 'ckBinary' | 'connectionFile'>;
21
+ discover?: () => Promise<NativeCustodyInventory>;
22
+ hooks?: NativeCustodyActivationHooks;
23
+ }
24
+ /**
25
+ * Enroll this stopped host, discover its verified default vault account and
26
+ * leave the host auth slot untouched. Local credentials, migration journal,
27
+ * account metadata and routing assignments are not inputs to this operation.
28
+ */
29
+ export declare function activateNativeVaultForHost(host: HarnessKind, options: NativeVaultActivationOptions): Promise<'committed' | 'already-vault'>;
@@ -0,0 +1,26 @@
1
+ import { type ClaustrumEnrollmentClient, type ClaustrumEnrollmentPaths } from '@cortexkit/common-auth/claustrum';
2
+ import type { CommandRunner, HarnessKind } from './types.ts';
3
+ export interface NativeVaultEnrollmentOptions {
4
+ env: NodeJS.ProcessEnv;
5
+ runner: CommandRunner;
6
+ /**
7
+ * Check that selected host processes are stopped and their inspection succeeded,
8
+ * and reject an inherited OPENCODE_AUTH_CONTENT snapshot. These checks run
9
+ * before each enrollment request, token write and permission change.
10
+ */
11
+ processFence: () => Promise<void>;
12
+ paths?: ClaustrumEnrollmentPaths;
13
+ client?: ClaustrumEnrollmentClient;
14
+ ckBinary?: string;
15
+ connectionFile?: string;
16
+ }
17
+ export declare class NativeVaultEnrollmentError extends Error {
18
+ readonly code: 'enrollment-refused' | 'enrollment-reset' | 'approval-refused' | 'permission-refused';
19
+ constructor(code: 'enrollment-refused' | 'enrollment-reset' | 'approval-refused' | 'permission-refused');
20
+ }
21
+ /**
22
+ * Enroll this stopped host and grant permission to list native Claude accounts.
23
+ * This function does not fetch OAuth tokens or change which store serves requests;
24
+ * account discovery and the credential-store switch are separate setup steps.
25
+ */
26
+ export declare function enrollNativeVaultForHost(host: HarnessKind, options: NativeVaultEnrollmentOptions): Promise<void>;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,20 @@
1
+ import { type NativeSetupPaths } from './native-paths';
2
+ import type { HarnessKind, ProcessFence } from './types';
3
+ export interface NativeOfflineLogin {
4
+ credential: {
5
+ type: 'oauth';
6
+ access: string;
7
+ refresh: string;
8
+ expires: number;
9
+ };
10
+ accountIdentity: string;
11
+ }
12
+ export interface NativeLocalSetupOptions {
13
+ env: NodeJS.ProcessEnv;
14
+ fence: ProcessFence;
15
+ paths?: NativeSetupPaths;
16
+ removePiAnthropicAuth: boolean;
17
+ login?: (host: HarnessKind) => Promise<NativeOfflineLogin>;
18
+ }
19
+ /** Transfer local credentials while hosts are stopped, before telling the user to restart. */
20
+ export declare function migrateNativeLocalForHost(host: HarnessKind, options: NativeLocalSetupOptions): Promise<void>;
@@ -0,0 +1,3 @@
1
+ import type { NativeOfflineLogin } from './native-local';
2
+ import type { HarnessKind } from './types';
3
+ export declare function loginNativeOffline(host: HarnessKind): Promise<NativeOfflineLogin>;
@@ -0,0 +1,15 @@
1
+ import { type NativePoolPaths } from '@cortexkit/anthropic-auth-core';
2
+ import type { HarnessKind } from './types.ts';
3
+ export interface NativeSetupPaths {
4
+ host: HarnessKind;
5
+ paths: NativePoolPaths;
6
+ legacyConfigPath: string;
7
+ legacyStatePath: string;
8
+ hostAuthPath: string;
9
+ routingSourcePath: string;
10
+ routingDestinationPath: string;
11
+ }
12
+ /** Resolve actor-supplied environment without changing ambient process variables. */
13
+ export declare function resolveNativeSetupPaths(host: HarnessKind, env: NodeJS.ProcessEnv): Promise<NativeSetupPaths>;
14
+ /** Reject plans where OpenCode and Pi share credential, journal or routing files. */
15
+ export declare function requireDisjointNativeSetupPaths(plans: readonly NativeSetupPaths[]): Promise<void>;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,18 @@
1
+ export declare function detectOpenCodeConfigFile(configDir: string): {
2
+ path: string;
3
+ exists: boolean;
4
+ };
5
+ export declare function detectOpenCodeTuiConfigFile(configDir: string): {
6
+ path: string;
7
+ exists: boolean;
8
+ };
9
+ export declare function ensureOpenCodePluginConfig(version: string, env?: NodeJS.ProcessEnv): Promise<{
10
+ configPath: string;
11
+ changed: boolean;
12
+ created: boolean;
13
+ }>;
14
+ export declare function ensureOpenCodeTuiConfig(version: string, env?: NodeJS.ProcessEnv): Promise<{
15
+ configPath: string;
16
+ changed: boolean;
17
+ created: boolean;
18
+ }>;
@@ -0,0 +1,15 @@
1
+ export declare const OPENCODE_PACKAGE_NAME = "@cortexkit/opencode-anthropic-auth";
2
+ export declare const PI_PACKAGE_NAME = "@cortexkit/pi-anthropic-auth";
3
+ export declare function getOpenCodeConfigDir(env?: NodeJS.ProcessEnv): string;
4
+ export declare function getOpenCodeDataDir(env?: NodeJS.ProcessEnv): string;
5
+ export declare function getOpenCodeAuthPath(env?: NodeJS.ProcessEnv): string;
6
+ export declare function getPiAgentDir(env?: NodeJS.ProcessEnv): string;
7
+ export declare function getPiAuthPath(env?: NodeJS.ProcessEnv): string;
8
+ export declare function opencodePluginEntry(version: string): string;
9
+ export declare function opencodeTuiEntry(version: string): string;
10
+ export declare function piPluginEntry(version: string): string;
11
+ /**
12
+ * Robustly resolve the package version from both source (src/setup/paths.ts)
13
+ * and bundled layouts (dist/cli.js, dist/index.js, etc.).
14
+ */
15
+ export declare function getSetupPackageVersion(): Promise<string>;
@@ -0,0 +1,18 @@
1
+ import type { CommandRunner } from './types.ts';
2
+ export declare function isPiPackageInstalled(env?: NodeJS.ProcessEnv): boolean;
3
+ export declare function hasPiLocalAnthropicAuth(env?: NodeJS.ProcessEnv): Promise<boolean>;
4
+ export declare function cleanPiLocalAnthropicAuth(env?: NodeJS.ProcessEnv): Promise<boolean>;
5
+ /**
6
+ * A failed install carries the child's raw exit code and stderr for the
7
+ * diagnostic log only; stderr can echo credentials from the environment, so it
8
+ * is never meant for the screen.
9
+ */
10
+ export type PiInstallResult = {
11
+ ok: true;
12
+ message: string;
13
+ } | {
14
+ ok: false;
15
+ exitCode: number;
16
+ stderr: string;
17
+ };
18
+ export declare function installPiExtension(version: string, runner?: CommandRunner, env?: NodeJS.ProcessEnv): Promise<PiInstallResult>;
@@ -0,0 +1,20 @@
1
+ import type { CommandRunner, ProcessFence } from './types.ts';
2
+ export declare class ProcessInspectionError extends Error {
3
+ readonly code = "process-inspection-failed";
4
+ constructor();
5
+ }
6
+ export declare class ProcessFenceViolationError extends Error {
7
+ readonly activeHosts: Array<{
8
+ pid: number;
9
+ command: string;
10
+ }>;
11
+ constructor(activeHosts: Array<{
12
+ pid: number;
13
+ command: string;
14
+ }>);
15
+ }
16
+ export declare function createProcessFence(runner?: CommandRunner, options?: {
17
+ platform?: NodeJS.Platform;
18
+ }): ProcessFence;
19
+ export declare const defaultProcessFence: ProcessFence;
20
+ export declare function assertHostsStopped(fence?: ProcessFence): Promise<void>;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,37 @@
1
+ export type HarnessKind = 'opencode' | 'pi';
2
+ export interface HostDetection {
3
+ kind: HarnessKind;
4
+ installed: boolean;
5
+ version: string | null;
6
+ configPath: string;
7
+ pluginInstalled: boolean;
8
+ hasLocalAuth?: boolean;
9
+ }
10
+ export interface ClaustrumDetection {
11
+ ckInstalled: boolean;
12
+ ckVersion: string | null;
13
+ daemonRunning: boolean;
14
+ connectionPath: string | null;
15
+ }
16
+ export interface SetupDetection {
17
+ opencode: HostDetection;
18
+ pi: HostDetection;
19
+ claustrum: ClaustrumDetection;
20
+ }
21
+ export interface CommandRunnerResult {
22
+ exitCode: number;
23
+ stdout: string;
24
+ stderr: string;
25
+ }
26
+ export interface CommandRunner {
27
+ run(command: string, args: string[], options?: {
28
+ env?: Record<string, string | undefined>;
29
+ timeoutMs?: number;
30
+ }): Promise<CommandRunnerResult>;
31
+ }
32
+ export interface ProcessFence {
33
+ listRunningHosts(env?: Record<string, string | undefined>): Promise<Array<{
34
+ pid: number;
35
+ command: string;
36
+ }>>;
37
+ }
@@ -38,6 +38,8 @@ export interface SidebarAccountState {
38
38
  enabled: boolean;
39
39
  needsReauth: boolean;
40
40
  vaultReauth?: boolean;
41
+ vaultServed?: boolean;
42
+ custodyState?: 'off' | 'on-vault-served' | 'on-vault-reauth' | 'on-cold' | 'unknown-identity' | 'on-identity-mismatch' | 'on-corrupt-binding';
41
43
  tierLabel?: string;
42
44
  }
43
45
  export interface FableRecoverySidebarState {
@@ -59,7 +61,7 @@ export interface PrimeSidebarAccountState {
59
61
  label: string;
60
62
  nextDueAt?: number | null;
61
63
  lastPrimedAt?: number | null;
62
- lastResult?: 'ok' | 'error';
64
+ lastResult?: 'ok' | 'error' | 'skipped';
63
65
  usage?: PrimeUsageCounters;
64
66
  estimatedCostUsd?: number;
65
67
  }
@@ -1 +1 @@
1
- import{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u}from"./index-sh51yqxs.js";import"./index-d3f8g6ve.js";import"./index-8aga2zwv.js";import"./index-cgez4m0h.js";export{i as setSidebarState,k as resolveActiveAccount,c as normalizeSidebarState,a as getSidebarStateFile,h as getSidebarState,f as getInitialSidebarRoutingTestHooks,q as getFableRecoverySummary,r as getCollapsedQuotaSummary,l as formatScopedQuotaLabel,n as formatPrimeTime,o as formatPrimeCost,p as formatPrimeAccountValue,m as formatFallbackModelLabel,j as drainSidebarWrites,u as computeQuotaPacing,d as __setSidebarStateWriteTestHooks,e as __setInitialSidebarRoutingTestHooks,g as __acquireSidebarStateLockForTest,t as SEVEN_DAY_MS,s as FIVE_HOUR_MS,b as DEFAULT_SIDEBAR_STATE};
1
+ import{E as a,F as b,G as c,H as d,I as e,J as f,K as g,L as h,M as i,N as j,O as k,P as l,Q as m,R as n,S as o,T as p,U as q,V as r,W as s,X as t,Y as u}from"./index-fds0s2j4.js";import"./index-nngmvczq.js";import"./index-aaajxwzd.js";export{i as setSidebarState,k as resolveActiveAccount,c as normalizeSidebarState,a as getSidebarStateFile,h as getSidebarState,f as getInitialSidebarRoutingTestHooks,q as getFableRecoverySummary,r as getCollapsedQuotaSummary,l as formatScopedQuotaLabel,n as formatPrimeTime,o as formatPrimeCost,p as formatPrimeAccountValue,m as formatFallbackModelLabel,j as drainSidebarWrites,u as computeQuotaPacing,d as __setSidebarStateWriteTestHooks,e as __setInitialSidebarRoutingTestHooks,g as __acquireSidebarStateLockForTest,t as SEVEN_DAY_MS,s as FIVE_HOUR_MS,b as DEFAULT_SIDEBAR_STATE};
@@ -1,4 +1,5 @@
1
- import { type Cache1hMode, type ClaudeCodeIdentity, type ThinkingPrefixMismatchBehavior } from '@cortexkit/anthropic-auth-core';
1
+ import { type BillingLineageFields, type Cache1hMode, type ClaudeCodeIdentity, type ThinkingPrefixMismatchBehavior } from '@cortexkit/anthropic-auth-core';
2
+ import { type OpenCodeEffortMarkerPlan } from './effort-history';
2
3
  import { type ServerSideFallbackOutcome } from './server-fallback';
3
4
  export declare const NON_STREAMING_DIAGNOSTICS_MAX_BYTES: number;
4
5
  export type FetchInput = string | URL | Request;
@@ -91,10 +92,13 @@ export declare function rewriteRequestBody(body: string, options?: {
91
92
  thinkingPrefixMismatchBehavior?: ThinkingPrefixMismatchBehavior;
92
93
  midConversationEffortEnabled?: boolean;
93
94
  midConversationEffortPlan?: string;
95
+ midConversationEffortResolvedPlan?: OpenCodeEffortMarkerPlan;
94
96
  perf?: RewritePerfCallback;
95
97
  hybridStandbyAnchor?: HybridMessageCacheAnchor;
96
98
  serverSideFallbackEnabled?: boolean;
99
+ modelRemapEnabled?: boolean;
97
100
  laneStart?: boolean;
101
+ billingLineage?: BillingLineageFields;
98
102
  cacheDiagnosticsPreviousMessageId?: string | null;
99
103
  }): Promise<string>;
100
104
  type RelayUpstreamStatus = {
@@ -1,8 +1,13 @@
1
1
  /** @jsxImportSource @opentui/solid */
2
- import type { PrimeAccountStatus } from '@cortexkit/anthropic-auth-core';
2
+ import type { CommandApplyRequest, CommandApplyResult, CommandDialogPayload } from '@cortexkit/anthropic-auth-core';
3
+ import { type PrimeAccountStatus } from '@cortexkit/anthropic-auth-core';
3
4
  import type { TuiPluginApi } from '@opencode-ai/plugin/tui';
4
5
  import type { AccountDialogAccount } from '../rpc/protocol';
5
6
  import type { OpenDialogPayload } from '../rpc/protocol.js';
7
+ /** Render menu sections, accounts and action inputs; send changes to the host instead of writing credentials here. */
8
+ export declare function openNativeMenuDialog(api: {
9
+ readonly ui: Pick<TuiPluginApi['ui'], 'dialog' | 'DialogSelect' | 'DialogPrompt' | 'DialogConfirm' | 'toast'>;
10
+ }, payload: CommandDialogPayload, apply: (request: CommandApplyRequest) => Promise<CommandApplyResult>, isCurrentSession: () => boolean): void;
6
11
  type ApplyFn = (command: OpenDialogPayload['command'], args: string) => Promise<{
7
12
  text: string;
8
13
  knobs: Record<string, unknown>;
@@ -12,6 +17,19 @@ type KillswitchDialogConfig = {
12
17
  main?: Record<string, number>;
13
18
  accounts?: Record<string, Record<string, number>>;
14
19
  };
20
+ type TuiAccountDialogAccount = Omit<AccountDialogAccount, 'vaultReauth' | 'custodyState'> & Partial<Pick<AccountDialogAccount, 'vaultReauth' | 'custodyState'>>;
21
+ type TuiAccountDialogPayload = {
22
+ accounts: TuiAccountDialogAccount[];
23
+ claustrumDetection: string;
24
+ custodyMode?: TuiCustodyMode;
25
+ enrollmentStatus?: string;
26
+ };
27
+ type TuiCustodyMode = 'local' | 'claustrum' | `mismatch: ${string}`;
28
+ type AccountDialogOption = {
29
+ title: string;
30
+ value: string;
31
+ description?: string;
32
+ };
15
33
  export declare const PRIME_DIALOG_OPTIONS: {
16
34
  title: string;
17
35
  value: string;
@@ -20,11 +38,23 @@ export declare function handlePrimeStatusOption(option: {
20
38
  value: string;
21
39
  }, renderMain: () => void): void;
22
40
  export declare function buildKillswitchThresholdSeed(config: KillswitchDialogConfig, accountIds: string[]): string;
23
- export declare function buildAccountDialogOption(account: AccountDialogAccount): {
41
+ export declare function normalizeAccountDialogPayload(value: unknown): TuiAccountDialogPayload;
42
+ export declare function buildAccountDialogOption(account: TuiAccountDialogAccount): {
24
43
  title: string;
25
44
  value: string;
26
45
  description?: string | undefined;
27
46
  };
47
+ export declare function buildManageAccountOptions(account: TuiAccountDialogAccount): AccountDialogOption[];
48
+ export declare function buildAccountDialogL1(value: unknown): {
49
+ header: string;
50
+ options: AccountDialogOption[];
51
+ enrollmentStatus?: string;
52
+ modeAction?: {
53
+ command: 'claude-account';
54
+ arguments: 'local' | 'claustrum';
55
+ };
56
+ };
57
+ export declare function retainAccountDialogProjection(current: Record<string, unknown>, incoming: Record<string, unknown>): Record<string, unknown>;
28
58
  /**
29
59
  * Format the per-account status lines shown in the Claude prime Status
30
60
  * view. Pure: consumed by the dialog's Status pane; the sidebar uses a
@@ -1,6 +1,6 @@
1
- import{sd as c,td as C,ud as v}from"./index-cgez4m0h.js";var m=C((h,k)=>{(function(Q){if(typeof k==="object"&&typeof k.exports==="object"){var J=Q(v,h);if(J!==void 0)k.exports=J}else if(typeof define==="function"&&define.amd)define(["require","exports","./impl/format","./impl/edit","./impl/scanner","./impl/parser"],Q)})(function(Q,J){Object.defineProperty(J,"__esModule",{value:!0}),J.applyEdits=J.modify=J.format=J.printParseErrorCode=J.ParseErrorCode=J.stripComments=J.visit=J.getNodeValue=J.getNodePath=J.findNodeAtOffset=J.findNodeAtLocation=J.parseTree=J.parse=J.getLocation=J.SyntaxKind=J.ScanError=J.createScanner=void 0;let X=Q("./impl/format"),G=Q("./impl/edit"),Z=Q("./impl/scanner"),$=Q("./impl/parser");J.createScanner=Z.createScanner;var V;(function(z){z[z.None=0]="None",z[z.UnexpectedEndOfComment=1]="UnexpectedEndOfComment",z[z.UnexpectedEndOfString=2]="UnexpectedEndOfString",z[z.UnexpectedEndOfNumber=3]="UnexpectedEndOfNumber",z[z.InvalidUnicode=4]="InvalidUnicode",z[z.InvalidEscapeCharacter=5]="InvalidEscapeCharacter",z[z.InvalidCharacter=6]="InvalidCharacter"})(V||(J.ScanError=V={}));var Y;(function(z){z[z.OpenBraceToken=1]="OpenBraceToken",z[z.CloseBraceToken=2]="CloseBraceToken",z[z.OpenBracketToken=3]="OpenBracketToken",z[z.CloseBracketToken=4]="CloseBracketToken",z[z.CommaToken=5]="CommaToken",z[z.ColonToken=6]="ColonToken",z[z.NullKeyword=7]="NullKeyword",z[z.TrueKeyword=8]="TrueKeyword",z[z.FalseKeyword=9]="FalseKeyword",z[z.StringLiteral=10]="StringLiteral",z[z.NumericLiteral=11]="NumericLiteral",z[z.LineCommentTrivia=12]="LineCommentTrivia",z[z.BlockCommentTrivia=13]="BlockCommentTrivia",z[z.LineBreakTrivia=14]="LineBreakTrivia",z[z.Trivia=15]="Trivia",z[z.Unknown=16]="Unknown",z[z.EOF=17]="EOF"})(Y||(J.SyntaxKind=Y={})),J.getLocation=$.getLocation,J.parse=$.parse,J.parseTree=$.parseTree,J.findNodeAtLocation=$.findNodeAtLocation,J.findNodeAtOffset=$.findNodeAtOffset,J.getNodePath=$.getNodePath,J.getNodeValue=$.getNodeValue,J.visit=$.visit,J.stripComments=$.stripComments;var A;(function(z){z[z.InvalidSymbol=1]="InvalidSymbol",z[z.InvalidNumberFormat=2]="InvalidNumberFormat",z[z.PropertyNameExpected=3]="PropertyNameExpected",z[z.ValueExpected=4]="ValueExpected",z[z.ColonExpected=5]="ColonExpected",z[z.CommaExpected=6]="CommaExpected",z[z.CloseBraceExpected=7]="CloseBraceExpected",z[z.CloseBracketExpected=8]="CloseBracketExpected",z[z.EndOfFileExpected=9]="EndOfFileExpected",z[z.InvalidCommentToken=10]="InvalidCommentToken",z[z.UnexpectedEndOfComment=11]="UnexpectedEndOfComment",z[z.UnexpectedEndOfString=12]="UnexpectedEndOfString",z[z.UnexpectedEndOfNumber=13]="UnexpectedEndOfNumber",z[z.InvalidUnicode=14]="InvalidUnicode",z[z.InvalidEscapeCharacter=15]="InvalidEscapeCharacter",z[z.InvalidCharacter=16]="InvalidCharacter"})(A||(J.ParseErrorCode=A={}));function L(z){switch(z){case 1:return"InvalidSymbol";case 2:return"InvalidNumberFormat";case 3:return"PropertyNameExpected";case 4:return"ValueExpected";case 5:return"ColonExpected";case 6:return"CommaExpected";case 7:return"CloseBraceExpected";case 8:return"CloseBracketExpected";case 9:return"EndOfFileExpected";case 10:return"InvalidCommentToken";case 11:return"UnexpectedEndOfComment";case 12:return"UnexpectedEndOfString";case 13:return"UnexpectedEndOfNumber";case 14:return"InvalidUnicode";case 15:return"InvalidEscapeCharacter";case 16:return"InvalidCharacter"}return"<unknown ParseErrorCode>"}J.printParseErrorCode=L;function W(z,B,j){return X.format(z,B,j)}J.format=W;function q(z,B,j,R){return G.setProperty(z,B,j,R)}J.modify=q;function O(z,B){let j=B.slice(0).sort((M,N)=>{let T=M.offset-N.offset;if(T===0)return M.length-N.length;return T}),R=z.length;for(let M=j.length-1;M>=0;M--){let N=j[M];if(N.offset+N.length<=R)z=G.applyEdit(z,N);else throw Error("Overlapping edit");R=N.offset}return z}J.applyEdits=O})});var I=c(m(),1);import{readFileSync as y,watch as S}from"node:fs";import{mkdir as E,readFile as g,rename as p,writeFile as l}from"node:fs/promises";import{homedir as x}from"node:os";import{basename as i,dirname as P,join as w}from"node:path";import{clearTimeout as _,setTimeout as f}from"node:timers";var s="OPENCODE_TUI_PREFERENCES_FILE",d="tui-preferences.jsonc";function b(){let Q=process.env[s];if(Q)return Q;let J=process.env.OPENCODE_CONFIG_DIR||w(process.env.XDG_CONFIG_HOME||w(x(),".config"),"opencode");return w(J,d)}function U(Q){return typeof Q==="object"&&Q!==null&&!Array.isArray(Q)}async function Yz(){try{let Q=await g(b(),"utf8"),J=[],X=I.parse(Q,J,{allowTrailingComma:!0});if(J.length>0)return{};return U(X)?X:{}}catch{return{}}}var n="anthropic-auth",t=160,u={forceToTop:!1,order:t,startCollapsed:!1,rememberCollapsed:!0,collapsed:null,pollMs:1500,refreshDebounceMs:200,header:{label:"CLAUDE",showVersion:!0},sections:{quota:!0,fallbackAccounts:!0,routing:!0,cache:!0,health:!0,pacing:!0},appearance:{barWidth:10,barFilledChar:"█",barEmptyChar:"░",warnThreshold:50,errorThreshold:80}};function H(Q,J){return typeof Q==="boolean"?Q:J}function D(Q,J,X,G){if(typeof Q!=="number"||!Number.isFinite(Q))return J;return Math.min(Math.max(Math.round(Q),X),G)}function a(Q,J,X){if(typeof Q!=="string"||Q.length===0)return J;return Q.slice(0,X)}function K(Q,J){if(typeof Q!=="string")return J;return[...Q][0]??J}function Bz(Q){let J=Q[n];if(!U(J))return structuredClone(u);let X=u,G=U(J.header)?J.header:{},Z=U(J.sections)?J.sections:{},$=U(J.appearance)?J.appearance:{},V=D($.warnThreshold,X.appearance.warnThreshold,0,99),Y=Math.max(D($.errorThreshold,X.appearance.errorThreshold,0,100),Math.min(V+1,100));return{forceToTop:H(J.forceToTop,X.forceToTop),order:D(J.order,X.order,-1e4,1e4),startCollapsed:H(J.startCollapsed,X.startCollapsed),rememberCollapsed:H(J.rememberCollapsed,X.rememberCollapsed),collapsed:typeof J.collapsed==="boolean"?J.collapsed:null,pollMs:D(J.pollMs,X.pollMs,500,30000),refreshDebounceMs:D(J.refreshDebounceMs,X.refreshDebounceMs,50,5000),header:{label:a(G.label,X.header.label,20),showVersion:H(G.showVersion,X.header.showVersion)},sections:{quota:H(Z.quota,X.sections.quota),fallbackAccounts:H(Z.fallbackAccounts,X.sections.fallbackAccounts),routing:H(Z.routing,X.sections.routing),cache:H(Z.cache,X.sections.cache),health:H(Z.health,X.sections.health),pacing:H(Z.pacing,X.sections.pacing)},appearance:{barWidth:D($.barWidth,X.appearance.barWidth,4,40),barFilledChar:K($.barFilledChar,X.appearance.barFilledChar),barEmptyChar:K($.barEmptyChar,X.appearance.barEmptyChar),warnThreshold:V,errorThreshold:Y}}}var o=-1e5;function Hz(Q,J,X){let G=Q[J];if(!U(G))return X;if(G.forceToTop===!0)return o+Object.keys(Q).indexOf(J);return D(G.order,X,-1e4,1e4)}var e=`// Shared preferences for opencode TUI plugins.
1
+ import"./index-aaajxwzd.js";import{readFileSync as k,watch as C}from"node:fs";import{mkdir as _,readFile as I,rename as E,writeFile as b}from"node:fs/promises";import{homedir as g}from"node:os";import{basename as F,dirname as P,join as N}from"node:path";import{clearTimeout as D,setTimeout as L}from"node:timers";import{applyEdits as T,modify as y,parse as f}from"jsonc-parser";var v="OPENCODE_TUI_PREFERENCES_FILE",h="tui-preferences.jsonc";function A(){let J=process.env[v];if(J)return J;let z=process.env.OPENCODE_CONFIG_DIR||N(process.env.XDG_CONFIG_HOME||N(g(),".config"),"opencode");return N(z,h)}function H(J){return typeof J==="object"&&J!==null&&!Array.isArray(J)}async function qq(){try{let J=await I(A(),"utf8"),z=[],q=f(J,z,{allowTrailingComma:!0});if(z.length>0)return{};return H(q)?q:{}}catch{return{}}}var m="anthropic-auth",p=160,R={forceToTop:!1,order:p,startCollapsed:!1,rememberCollapsed:!0,collapsed:null,pollMs:1500,refreshDebounceMs:200,header:{label:"CLAUDE",showVersion:!0},sections:{quota:!0,fallbackAccounts:!0,routing:!0,cache:!0,health:!0,pacing:!0},appearance:{barWidth:10,barFilledChar:"█",barEmptyChar:"░",warnThreshold:50,errorThreshold:80}};function $(J,z){return typeof J==="boolean"?J:z}function Y(J,z,q,X){if(typeof J!=="number"||!Number.isFinite(J))return z;return Math.min(Math.max(Math.round(J),q),X)}function c(J,z,q){if(typeof J!=="string"||J.length===0)return z;return J.slice(0,q)}function w(J,z){if(typeof J!=="string")return z;return[...J][0]??z}function zq(J){let z=J[m];if(!H(z))return structuredClone(R);let q=R,X=H(z.header)?z.header:{},Q=H(z.sections)?z.sections:{},Z=H(z.appearance)?z.appearance:{},G=Y(Z.warnThreshold,q.appearance.warnThreshold,0,99),V=Math.max(Y(Z.errorThreshold,q.appearance.errorThreshold,0,100),Math.min(G+1,100));return{forceToTop:$(z.forceToTop,q.forceToTop),order:Y(z.order,q.order,-1e4,1e4),startCollapsed:$(z.startCollapsed,q.startCollapsed),rememberCollapsed:$(z.rememberCollapsed,q.rememberCollapsed),collapsed:typeof z.collapsed==="boolean"?z.collapsed:null,pollMs:Y(z.pollMs,q.pollMs,500,30000),refreshDebounceMs:Y(z.refreshDebounceMs,q.refreshDebounceMs,50,5000),header:{label:c(X.label,q.header.label,20),showVersion:$(X.showVersion,q.header.showVersion)},sections:{quota:$(Q.quota,q.sections.quota),fallbackAccounts:$(Q.fallbackAccounts,q.sections.fallbackAccounts),routing:$(Q.routing,q.sections.routing),cache:$(Q.cache,q.sections.cache),health:$(Q.health,q.sections.health),pacing:$(Q.pacing,q.sections.pacing)},appearance:{barWidth:Y(Z.barWidth,q.appearance.barWidth,4,40),barFilledChar:w(Z.barFilledChar,q.appearance.barFilledChar),barEmptyChar:w(Z.barEmptyChar,q.appearance.barEmptyChar),warnThreshold:G,errorThreshold:V}}}var u=-1e5;function Jq(J,z,q){let X=J[z];if(!H(X))return q;if(X.forceToTop===!0)return u+Object.keys(J).indexOf(z);return Y(X.order,q,-1e4,1e4)}var s=`// Shared preferences for opencode TUI plugins.
2
2
  // One top-level key per plugin (short name). See each plugin's README for
3
3
  // its supported settings. This file is safe to hand-edit; plugins update
4
4
  // individual keys in place and preserve comments.
5
5
  {}
6
- `;async function r(Q,J,X){let G=b();await E(P(G),{recursive:!0});let Z;try{Z=await g(G,"utf8")}catch{Z=""}if(Z.trim()==="")Z=e;let $=I.modify(Z,[Q,...J],X,{formattingOptions:{insertSpaces:!0,tabSize:2}}),V=I.applyEdits(Z,$),Y=`${G}.${process.pid}.tmp`;await l(Y,V,"utf8"),await p(Y,G)}var F=Promise.resolve();function Wz(Q,J,X){return F=F.then(()=>r(Q,J,X)).catch(()=>{}),F}var zz=150,Jz=100;function jz(Q,J={}){let X=b(),G=i(X),Z=null,$=null;try{$=y(X,"utf8")}catch{}let V=!1,Y=async()=>{let z=await g(X,"utf8").catch(()=>null);if(V||z===null)return;if(z===$)return;$=z,Q()},A=()=>{if(Z)_(Z);Z=f(()=>{Z=null,Y()},zz)},L=null;try{L=(J.watchDirectory??S)(P(X),(z,B)=>{let j=B===G||B?.startsWith(`${G}.`)&&B.endsWith(".tmp");if(B!=null&&!j)return;A()})}catch{if($===null)return()=>{}}let W=null,q=!1,O=()=>{if(V||W)return;W=f(()=>{if(W=null,V||q)return;q=!0,Y().finally(()=>{q=!1,O()})},Jz),W.unref?.()};return O(),()=>{if(V=!0,Z)_(Z);if(W)_(W);L?.close()}}export{jz as watchTuiPreferences,Bz as resolveAnthropicAuthPrefs,Yz as readTuiPreferencesFile,Wz as queueTuiPreferenceUpdate,b as getTuiPreferencesFile,Hz as computeEffectiveOrder,s as TUI_PREFS_FILE_ENV,n as PLUGIN_KEY,t as DEFAULT_SLOT_ORDER,u as DEFAULT_PREFS};
6
+ `;async function d(J,z,q){let X=A();await _(P(X),{recursive:!0});let Q;try{Q=await I(X,"utf8")}catch{Q=""}if(Q.trim()==="")Q=s;let Z=y(Q,[J,...z],q,{formattingOptions:{insertSpaces:!0,tabSize:2}}),G=T(Q,Z),V=`${X}.${process.pid}.tmp`;await b(V,G,"utf8"),await E(V,X)}var U=Promise.resolve();function Qq(J,z,q){return U=U.then(()=>d(J,z,q)).catch(()=>{}),U}var o=150,n=100;function Xq(J,z={}){let q=A(),X=F(q),Q=null,Z=null;try{Z=k(q,"utf8")}catch{}let G=!1,V=async()=>{let W=await I(q,"utf8").catch(()=>null);if(G||W===null)return;if(W===Z)return;Z=W,J()},x=()=>{if(Q)D(Q);Q=L(()=>{Q=null,V()},o)},K=null;try{K=(z.watchDirectory??C)(P(q),(W,j)=>{let S=j===X||j?.startsWith(`${X}.`)&&j.endsWith(".tmp");if(j!=null&&!S)return;x()})}catch{if(Z===null)return()=>{}}let B=null,M=!1,O=()=>{if(G||B)return;B=L(()=>{if(B=null,G||M)return;M=!0,V().finally(()=>{M=!1,O()})},n),B.unref?.()};return O(),()=>{if(G=!0,Q)D(Q);if(B)D(B);K?.close()}}export{Xq as watchTuiPreferences,zq as resolveAnthropicAuthPrefs,qq as readTuiPreferencesFile,Qq as queueTuiPreferenceUpdate,A as getTuiPreferencesFile,Jq as computeEffectiveOrder,v as TUI_PREFS_FILE_ENV,m as PLUGIN_KEY,p as DEFAULT_SLOT_ORDER,R as DEFAULT_PREFS};
@@ -0,0 +1,7 @@
1
+ /** Explicit sign-in to the native Claude account pool creates this OAuth connection. Startup leaves existing OpenCode connections unchanged. */
2
+ export declare const CLAUDE_POOL_LOGIN_METHOD_ID = "native-claude-oauth";
3
+ /**
4
+ * Connects OpenCode to the Claude accounts held in the vault. It signs in to
5
+ * nothing and stores no local account; only the host's placeholder is written.
6
+ */
7
+ export declare const CLAUDE_VAULT_ACTIVATION_METHOD_ID = "native-claude-vault";