@ottimis/jack-provider-sdk 0.3.0 → 0.7.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.
@@ -15,7 +15,9 @@
15
15
  * This file is the boundary between Jack core and a provider package — keep
16
16
  * it free of provider-specific imports.
17
17
  */
18
- import type { AgentBackend, AgentQueryOptions, McpServerSpec } from './backend';
18
+ import type { AgentBackend, AgentPermissionMode, AgentQueryOptions, McpServerSpec } from './backend';
19
+ import type { HostServices } from './host';
20
+ import type { ProfilesApi } from './profiles';
19
21
  import type { UsageApi } from './usage';
20
22
  import type { ZodType } from 'zod';
21
23
  import type { ClientToolHandler, NormalizedMessage, NormalizedToolRef, ProviderUserContentPolicy, ToolShape } from '@ottimis/jack-chat-core';
@@ -257,6 +259,35 @@ export type CapabilityMatrix = {
257
259
  * usage bars and no Connect affordance is offered.
258
260
  */
259
261
  usage: boolean;
262
+ /**
263
+ * Provider supports multiple isolated config/identity directories
264
+ * ("profiles") — distinct accounts, login states, agent customizations,
265
+ * and history sets all selectable per-session at runtime. When `true`,
266
+ * {@link JackProvider.profiles} MUST be defined; the host renders the
267
+ * profile picker UI and routes spawn-time `applyProfile` calls.
268
+ *
269
+ * When `false` the provider's runtime always uses its implicit default
270
+ * config dir; the host hides every profile-related affordance.
271
+ */
272
+ profiles: boolean;
273
+ /**
274
+ * Permission modes the provider actually supports. Drives the
275
+ * Shift-Tab cycle in the renderer (`MessageInputBar`) and any
276
+ * provider-aware UI that picks a mode (settings, slash commands).
277
+ * Order matters — it's the cycle order on Shift-Tab.
278
+ *
279
+ * Each provider declares only the modes that have a meaningful
280
+ * behaviour for its runtime: Claude's `['default', 'acceptEdits',
281
+ * 'plan', 'auto']`, Codex's `['default', 'acceptEdits',
282
+ * 'bypassPermissions']` (no `'plan'` because there's no ExitPlanMode
283
+ * primitive — mapping `'plan'` to read-only sandbox would be
284
+ * misleading), Gemini's set inherited from ACP `available_modes`.
285
+ *
286
+ * Modes outside this list MAY still be accepted by
287
+ * `setPermissionMode()` (e.g. set programmatically via slash command
288
+ * or settings); the catalog only governs UI affordances.
289
+ */
290
+ permissionModes: readonly AgentPermissionMode[];
260
291
  };
261
292
  /**
262
293
  * Re-exports of canonical wire-shape types from chat-core so consumers of
@@ -604,6 +635,37 @@ export type JackProvider = {
604
635
  * decodes.
605
636
  */
606
637
  usage?: UsageApi;
638
+ /**
639
+ * Multi-profile capability — multiple isolated config/identity dirs
640
+ * selectable per session. See {@link ProfilesApi}. Optional; when
641
+ * undefined `capabilities.profiles` MUST be `false` and the host hides
642
+ * every profile-related affordance. When defined, the host calls
643
+ * `applyProfile(options, profileId)` once per spawn so the provider can
644
+ * inject its native config-dir env var (Claude `CLAUDE_CONFIG_DIR`,
645
+ * Codex `CODEX_HOME`, …).
646
+ */
647
+ profiles?: ProfilesApi;
648
+ /**
649
+ * Optional one-shot activation hook. Called once by the host during
650
+ * registration with a {@link HostServices} bag scoped to this
651
+ * provider's id (kv namespace, auth partition prefix). Providers that
652
+ * need host-side primitives (encrypted credential storage, child auth
653
+ * windows, …) store the `host` reference and use it lazily; providers
654
+ * that are pure (Codex, Gemini today) leave this undefined.
655
+ *
656
+ * Activation MUST be idempotent: calling `activate(host)` twice with
657
+ * the same host is allowed and should not duplicate state. Activation
658
+ * happens at registration time — well before any session spawns —
659
+ * but providers MUST NOT block on network or disk here. Defer all I/O
660
+ * to the methods that actually need it.
661
+ *
662
+ * The host calls `activate` synchronously enough that
663
+ * `provider.usage`, `provider.persistedPermissions`, etc. can read
664
+ * `host` from a closure / captured variable in subsequent invocations.
665
+ * Async work inside `activate` is OK but the host won't await it
666
+ * before exposing the provider — it's "fire and let it complete".
667
+ */
668
+ activate?(host: HostServices): void | Promise<void>;
607
669
  };
608
670
  /**
609
671
  * Provider-neutral spec for an in-process MCP server the host wants to
@@ -1 +1 @@
1
- {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"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"}
package/dist/usage.d.ts CHANGED
@@ -176,28 +176,56 @@ export type UsageConnectContext = {
176
176
  * Provider-owned usage capability. Optional on {@link JackProvider};
177
177
  * absent = host hides the chip's "Connect" affordance and the
178
178
  * capability flag is `false`.
179
+ *
180
+ * Multi-profile contract (SDK 0.7.0):
181
+ * Every account-level method accepts an optional `profileId`. Providers
182
+ * that ALSO declare `capabilities.profiles=true` MUST honor the param —
183
+ * different profile = different account = different credentials, polled
184
+ * independently. When omitted, the provider resolves to its DEFAULT
185
+ * profile (back-compat with hosts that don't yet thread profileId).
186
+ *
187
+ * Providers without profiles support (`capabilities.profiles=false`)
188
+ * MAY ignore the param and behave as if every call were singleton —
189
+ * the omission stays the canonical caller behavior, the param is just
190
+ * ignored.
191
+ *
192
+ * `formatSessionMetrics` stays profile-agnostic: per-session metrics
193
+ * derive from the live process's context tokens (already pinned to the
194
+ * session's profile via `applyProfile` at spawn time).
179
195
  */
180
196
  export type UsageApi = {
181
- /** Current connection state — used for chip display + gating. */
182
- status(): Promise<UsageStatus>;
197
+ /**
198
+ * Current connection state — used for chip display + gating.
199
+ * Profile-aware: omit `profileId` to query the default profile.
200
+ */
201
+ status(profileId?: string): Promise<UsageStatus>;
183
202
  /**
184
203
  * Open the provider's connect flow. Whatever modality the provider
185
204
  * needs (login window, API-key picker, OAuth redirect) lives here.
205
+ * Profile-aware: omit `profileId` to bind credentials to the default
206
+ * profile. Different profileIds use isolated storage AND isolated
207
+ * login surfaces (e.g. distinct cookie partitions for Claude) so two
208
+ * accounts can sign in side by side.
186
209
  */
187
- connect(ctx: UsageConnectContext): Promise<UsageConnectResult>;
210
+ connect(ctx: UsageConnectContext, profileId?: string): Promise<UsageConnectResult>;
188
211
  /**
189
212
  * When `connect()` returned `'choose'`, host calls this with the
190
213
  * user's pick. Optional — providers that never choose omit it.
214
+ * Profile-aware: pass the SAME `profileId` you used for `connect()`.
215
+ */
216
+ selectOption?(optionId: string, profileId?: string): Promise<UsageConnectResult>;
217
+ /**
218
+ * Drop credentials and stop any provider-side polling for the
219
+ * specified profile. Omit `profileId` to disconnect the default profile.
191
220
  */
192
- selectOption?(optionId: string): Promise<UsageConnectResult>;
193
- /** Drop credentials and stop any provider-side polling. */
194
- disconnect(): Promise<void>;
221
+ disconnect(profileId?: string): Promise<void>;
195
222
  /**
196
- * Fetch one fresh account-level snapshot. Empty `metrics: []` is
197
- * fine when the provider has no billing surface yet — the capability
198
- * stays `true` for the per-session bridge.
223
+ * Fetch one fresh account-level snapshot for the specified profile.
224
+ * Empty `metrics: []` is fine when the provider has no billing surface
225
+ * yet — the capability stays `true` for the per-session bridge.
226
+ * Omit `profileId` to fetch the default profile.
199
227
  */
200
- fetch(): Promise<UsageSnapshot>;
228
+ fetch(profileId?: string): Promise<UsageSnapshot>;
201
229
  /**
202
230
  * Recommended poll cadence (seconds). Host clamps to its bounds.
203
231
  * Optional — host falls back to its own default if unset.
@@ -1 +1 @@
1
- {"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../src/usage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../src/usage.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ottimis/jack-provider-sdk",
3
- "version": "0.3.0",
3
+ "version": "0.7.0",
4
4
  "description": "Plugin contract for AI provider integrations in Jack — backend interface, capability matrix, spawner primitives, knowledge context. Consumed both by in-tree providers and external packages.",
5
5
  "license": "MIT",
6
6
  "repository": {
package/src/backend.ts CHANGED
@@ -45,12 +45,21 @@ export type BackendName = string
45
45
  // Neutral option types
46
46
  // ─────────────────────────────────────────────────────────────────────────────
47
47
 
48
- /** Permission gate behaviour. Strings the host may toggle live. */
48
+ /**
49
+ * Permission gate behaviour. Open string union — providers declare which
50
+ * subset they support via {@link CapabilityMatrix.permissionModes}, and
51
+ * the host's permission-mode picker reads that catalog verbatim. Listed
52
+ * literals are the modes any in-tree provider has shipped to date;
53
+ * future providers may invent new strings without breaking the type.
54
+ */
49
55
  export type AgentPermissionMode =
50
56
  | 'default'
51
57
  | 'acceptEdits'
52
58
  | 'plan'
59
+ | 'auto'
53
60
  | 'bypassPermissions'
61
+ | 'dontAsk'
62
+ | (string & {})
54
63
 
55
64
  /** Settings layers the provider should consult at boot. */
56
65
  export type AgentSettingSource = 'user' | 'project' | 'local'
package/src/host.ts ADDED
@@ -0,0 +1,159 @@
1
+ /**
2
+ * Host primitives exposed to providers — handed in via
3
+ * {@link JackProvider.activate} so provider code never imports `electron`,
4
+ * `better-sqlite3`, or any other host-internal module directly.
5
+ *
6
+ * Why this exists
7
+ * ---------------
8
+ * In Jack v0.4.x the Claude provider reached into Electron (`safeStorage`,
9
+ * `BrowserWindow`, `session`) and Jack's settings table (`getSetting` /
10
+ * `setSetting`) to persist its login cookie. That breaks two goals:
11
+ *
12
+ * 1. **Out-of-tree packages.** A future `@third-party/jack-provider-foo`
13
+ * installed from npm shouldn't need to know about the host's storage
14
+ * layer or its windowing toolkit.
15
+ * 2. **Testability.** Provider unit tests on plain Node want a fake host
16
+ * that returns canned credentials, not a real `safeStorage`.
17
+ *
18
+ * `HostServices` is the contract that satisfies both: a tiny set of
19
+ * primitives the host implements once (with whatever it has — Electron in
20
+ * Jack's case, but a CLI host could use `keytar` + headless puppeteer)
21
+ * and providers consume through dependency injection.
22
+ *
23
+ * Surface stays intentionally small. New capabilities grow this file as
24
+ * specific providers need them — but the rule is "host-side knowledge
25
+ * doesn't leak out the SDK". A provider that needs deep host integration
26
+ * is a sign that the integration belongs in the host, not in the
27
+ * provider.
28
+ *
29
+ * Lifecycle
30
+ * ---------
31
+ * The host calls `provider.activate(host)` once during registration. The
32
+ * provider stores the `host` reference and uses it lazily — no host
33
+ * primitive may be invoked before activation. Methods that need the host
34
+ * must guard accordingly (typically by deferring all work to a closure).
35
+ */
36
+
37
+ /**
38
+ * Per-provider key/value store. Keys are namespaced automatically by the
39
+ * calling provider's id, so `kv.set('token', x)` from `claudeProvider`
40
+ * lands in a different bucket than the same call from `codexProvider`.
41
+ *
42
+ * Values are strings — callers serialize JSON / numbers / booleans
43
+ * themselves. `null` from `get` / `getSecret` means "no value stored",
44
+ * not "value is null"; explicit removal goes through `remove`.
45
+ *
46
+ * `setSecret` / `getSecret` route through the host's OS-level keychain
47
+ * encryption when available (Electron's `safeStorage`, `keytar`, etc.).
48
+ * `setSecret` MUST throw when no secure storage is available so providers
49
+ * never silently degrade to plaintext on unsupported systems.
50
+ */
51
+ export type HostKvScope = {
52
+ /** Plain (unencrypted) read. */
53
+ get(key: string): string | null
54
+ /** Plain (unencrypted) write. */
55
+ set(key: string, value: string): void
56
+ /** Remove the value at `key`. Idempotent (no-op when the key is absent). */
57
+ remove(key: string): void
58
+ /** Encrypted read. Returns `null` when the key is absent OR the host's secret store can't decrypt (e.g. user wiped keychain). */
59
+ getSecret(key: string): string | null
60
+ /** Encrypted write. Throws when secure storage isn't available — providers should surface a clear error to the user, not fall back to plaintext. */
61
+ setSecret(key: string, value: string): void
62
+ }
63
+
64
+ /**
65
+ * Options for {@link HostAuthService.openCookieLoginWindow}.
66
+ *
67
+ * The host opens a child auth window at `url` and polls the cookie jar
68
+ * until `cookieName` appears on `cookieDomain`. When the cookie shows up
69
+ * the host returns its value and closes the window.
70
+ *
71
+ * Each provider's auth flow lives in its own session partition so two
72
+ * providers can be "logged in" simultaneously without their cookies
73
+ * colliding in the host's shared cookie store.
74
+ */
75
+ export type CookieLoginOptions = {
76
+ /** URL to open in the child window. */
77
+ url: string
78
+ /** Name of the cookie the provider waits for (e.g. `'sessionKey'`). */
79
+ cookieName: string
80
+ /** Cookie domain to scope the lookup (e.g. `'https://claude.ai'`). */
81
+ cookieDomain: string
82
+ /**
83
+ * Storage partition string for session isolation. Convention:
84
+ * `persist:<provider-id>-<flow-name>` (e.g. `persist:claude-usage`).
85
+ * Different partition strings keep parallel logins independent.
86
+ */
87
+ partition: string
88
+ /** Window title shown in the OS chrome. Default: `'Connect'`. */
89
+ title?: string
90
+ /** Hard timeout in milliseconds. Default: 5 minutes. */
91
+ timeoutMs?: number
92
+ /** Window width in pixels. Default: 520. */
93
+ width?: number
94
+ /** Window height in pixels. Default: 720. */
95
+ height?: number
96
+ /**
97
+ * Optional parent window the host narrows internally to attach
98
+ * modality. Typed as `unknown` so the SDK doesn't depend on Electron.
99
+ */
100
+ parentWindow?: unknown
101
+ }
102
+
103
+ /**
104
+ * Result of a cookie-login flow.
105
+ *
106
+ * - `'success'` — cookie captured; `cookieValue` is the raw value.
107
+ * - `'cancelled'` — user closed the window before the cookie appeared.
108
+ * - `'timeout'` — `timeoutMs` elapsed without the cookie being set.
109
+ * - `'error'` — host couldn't open the window (e.g. running headless,
110
+ * no display server, partition rejected). Providers should surface
111
+ * `error` to the user as an actionable message.
112
+ */
113
+ export type CookieLoginResult =
114
+ | { kind: 'success'; cookieValue: string }
115
+ | { kind: 'cancelled' }
116
+ | { kind: 'timeout' }
117
+ | { kind: 'error'; error: string }
118
+
119
+ /**
120
+ * Auth primitives the host provides. Today only cookie-based login;
121
+ * OAuth / device-code flows can be added as future providers need them
122
+ * without breaking existing implementations (`HostAuthService` is an
123
+ * open-shape type — additions are purely additive).
124
+ */
125
+ export type HostAuthService = {
126
+ /**
127
+ * Open a child window at the given URL and wait for the named cookie
128
+ * to appear. Used by providers whose login flow is "send the user to
129
+ * a web page, scrape the session cookie when they sign in".
130
+ *
131
+ * The host is responsible for: opening the window, polling cookies,
132
+ * closing the window when the cookie shows up (or the user cancels /
133
+ * times out), and isolating the session partition. The provider
134
+ * doesn't see Electron, BrowserWindow, or any windowing detail.
135
+ */
136
+ openCookieLoginWindow(opts: CookieLoginOptions): Promise<CookieLoginResult>
137
+ }
138
+
139
+ /**
140
+ * The bag of host services injected into a provider via
141
+ * {@link JackProvider.activate}. Providers store the reference and
142
+ * pull primitives lazily.
143
+ *
144
+ * Adding a new capability:
145
+ * 1. Define the new service interface in this file (or a sibling).
146
+ * 2. Add it as an optional field here so older providers that don't
147
+ * use it keep compiling.
148
+ * 3. Document the feature flag — providers that need the capability
149
+ * should guard with `if (!host.newCapability) return undefined`
150
+ * and the host implements it.
151
+ *
152
+ * Concrete services exposed today are documented in their own types.
153
+ */
154
+ export type HostServices = {
155
+ /** Per-provider key/value store. Namespaced by provider id by the host. */
156
+ kv: HostKvScope
157
+ /** Auth flow primitives (cookie login today; OAuth / device-code in the future). */
158
+ auth: HostAuthService
159
+ }
package/src/index.ts CHANGED
@@ -7,13 +7,19 @@
7
7
  * (not on Jack's main process internals) and Jack stays free to evolve
8
8
  * its host code without breaking provider authors.
9
9
  *
10
- * Re-exports cover three layers:
10
+ * Re-exports cover four layers:
11
11
  * - `./backend` — neutral wire-shape contract (`AgentBackend`,
12
12
  * `AgentQueryOptions`, `AgentSession`, …)
13
13
  * - `./spawner` — process-spawning primitives shared by every backend
14
14
  * (`ProcessSpawner`, `ProcessHandle`, `localSpawner`, …)
15
15
  * - `./provider` — plugin-level contract (`JackProvider`,
16
16
  * `CapabilityMatrix`, `ToolDescriptor`, `ProviderBranding`, …)
17
+ * - `./usage` — provider-owned billing/usage surface (`UsageApi`,
18
+ * `UsageMetric`, …)
19
+ * - `./host` — host primitives injected at activation
20
+ * (`HostServices`, `HostKvScope`, `HostAuthService`, …) — providers
21
+ * consume these via `JackProvider.activate(host)` instead of
22
+ * reaching into Electron / host internals directly.
17
23
  *
18
24
  * Companion runtime types from `@ottimis/jack-chat-core` (`NormalizedMessage`,
19
25
  * `ClientToolHandler`, `ToolShape`, …) are re-exported through `./provider`
@@ -25,6 +31,8 @@ export * from './backend'
25
31
  export * from './spawner'
26
32
  export * from './provider'
27
33
  export * from './usage'
34
+ export * from './host'
35
+ export * from './profiles'
28
36
 
29
37
  /**
30
38
  * Re-export of `NormalizedMessage` from chat-core so consumers don't need
@@ -0,0 +1,142 @@
1
+ /**
2
+ * Profiles — multiple isolated identities for a single provider.
3
+ *
4
+ * A "profile" is an isolated config/identity directory the provider's runtime
5
+ * can be pointed at via an env var (Claude `CLAUDE_CONFIG_DIR`, Codex
6
+ * `CODEX_HOME`, Gemini `GEMINI_CONFIG_DIR`, …). Two profiles = two distinct
7
+ * accounts / login states / agent customizations / history sets, all running
8
+ * the same provider binary.
9
+ *
10
+ * The user-facing scenario this exists for: an employee with separate
11
+ * "claude-personal" and "claude-work" shell aliases that point CLAUDE_CONFIG_DIR
12
+ * at different folders. The host turns that into a first-class concept —
13
+ * choosable per session, with a default per workspace-agent slot — instead of
14
+ * making the user re-shell their alias every time they switch context.
15
+ *
16
+ * Provider opts in by:
17
+ * - declaring `capabilities.profiles = true`
18
+ * - implementing `JackProvider.profiles` with a {@link ProfilesApi}
19
+ * - injecting the right env var inside `applyProfile`
20
+ *
21
+ * Storage of the profile *list* lives on the host's per-provider kv (provider
22
+ * stores it via `host.kv` at activation time). Storage of the profile
23
+ * *content* (auth, sessions, agents, history) lives inside `configDir` on
24
+ * disk and is the runtime's concern, not the host's — Jack never reads or
25
+ * writes inside `configDir`.
26
+ */
27
+
28
+ import type { AgentQueryOptions } from './backend'
29
+
30
+ /**
31
+ * One profile entry. `id` is host-generated and stable; the human edits
32
+ * `label` + `configDir` freely.
33
+ *
34
+ * `isDefault` is exclusive within a provider — exactly one profile carries
35
+ * the flag at any time. Provider implementations enforce that invariant in
36
+ * `update`/`create` (when `setDefault` is true, demote the previous default).
37
+ */
38
+ export type ProviderProfile = {
39
+ /** Stable identifier — host-generated UUID; never edited by user. */
40
+ id: string
41
+ /** User-facing display label ("Work", "Personal", …). */
42
+ label: string
43
+ /** Absolute path to the runtime config dir on the host filesystem. */
44
+ configDir: string
45
+ /** Exactly one profile per provider carries this flag. */
46
+ isDefault: boolean
47
+ /** ISO 8601 — when the profile was first created in Jack's registry. */
48
+ createdAt: string
49
+ }
50
+
51
+ /**
52
+ * Result of {@link ProfilesApi.probeProfile} — best-effort introspection of
53
+ * what's already stored under `configDir` so the UI can show the user
54
+ * "Connected as <X>" instead of an opaque path.
55
+ *
56
+ * Provider populates whichever fields it can read cheaply (no network
57
+ * round-trips) — fields it can't infer stay undefined.
58
+ */
59
+ export type ProviderProfileProbe = {
60
+ /** True when the dir exists and looks like a valid runtime config. */
61
+ exists: boolean
62
+ /** True when the dir contains usable credentials. Tri-state: false = present-but-invalid, undefined = N/A. */
63
+ authenticated?: boolean
64
+ /** Human-readable identity hint (email, account label) when discoverable. */
65
+ accountLabel?: string
66
+ }
67
+
68
+ /**
69
+ * Input shape for {@link ProfilesApi.create}. The `id` is host-generated by
70
+ * the provider implementation (typically `crypto.randomUUID()`); the caller
71
+ * supplies the human bits.
72
+ */
73
+ export type CreateProfileInput = {
74
+ label: string
75
+ configDir: string
76
+ /** When true, the new profile becomes the default (demotes previous default). */
77
+ setDefault?: boolean
78
+ }
79
+
80
+ /**
81
+ * Provider-owned profiles capability. Optional on {@link JackProvider} —
82
+ * absent = the provider's runtime always uses its implicit default config dir
83
+ * and the host hides every profiles-related affordance.
84
+ */
85
+ export type ProfilesApi = {
86
+ /**
87
+ * Enumerate the registered profiles in stable order. Provider MUST seed
88
+ * a "Default" profile pointing at its implicit config dir on first call
89
+ * (lazy migration — preserves the user's existing setup without manual
90
+ * intervention).
91
+ */
92
+ list(): Promise<ProviderProfile[]>
93
+
94
+ /**
95
+ * Register a new profile. Provider generates the `id` and persists the
96
+ * row. Returns the freshly-created profile so the caller doesn't have to
97
+ * round-trip through `list()`.
98
+ */
99
+ create(input: CreateProfileInput): Promise<ProviderProfile>
100
+
101
+ /**
102
+ * Patch an existing profile. Empty patch = no-op. Setting `isDefault: true`
103
+ * demotes whichever profile currently holds the default flag.
104
+ */
105
+ update(
106
+ id: string,
107
+ patch: Partial<Pick<ProviderProfile, 'label' | 'configDir' | 'isDefault'>>
108
+ ): Promise<ProviderProfile>
109
+
110
+ /**
111
+ * Remove a profile by id. MUST refuse to remove the last remaining profile
112
+ * (the provider always needs a default to fall back to). MUST refuse to
113
+ * remove the default profile when other profiles exist — caller has to
114
+ * promote a replacement first.
115
+ *
116
+ * Note: this only removes the registry entry. Files inside `configDir`
117
+ * stay on disk untouched — destructive cleanup is the user's responsibility
118
+ * (we never `rm -rf` a directory the user gave us).
119
+ */
120
+ remove(id: string): Promise<void>
121
+
122
+ /**
123
+ * Mutate spawn options in place to point the runtime at the chosen
124
+ * profile's `configDir`. Each provider injects its native env var
125
+ * (Claude: `CLAUDE_CONFIG_DIR`; Codex: `CODEX_HOME`; …) and any other
126
+ * spawn-time wiring the runtime needs.
127
+ *
128
+ * Called once per spawn by the host, after `applyKnowledgeContext` and
129
+ * `prepareSpawnOptions`. Unknown `profileId` MUST be a silent no-op
130
+ * (caller falls back to the implicit default behavior).
131
+ */
132
+ applyProfile(options: AgentQueryOptions, profileId: string): Promise<void>
133
+
134
+ /**
135
+ * Best-effort introspection of what's stored under `configDir` so the
136
+ * UI can show "Connected as X" / "Empty profile" hints. Provider returns
137
+ * what it can read cheaply (file presence, parsed credentials file) —
138
+ * no network calls. Optional: providers that can't introspect their
139
+ * own config dir omit this and the UI falls back to a path-only display.
140
+ */
141
+ probeProfile?(configDir: string): Promise<ProviderProfileProbe>
142
+ }
package/src/provider.ts CHANGED
@@ -16,7 +16,9 @@
16
16
  * it free of provider-specific imports.
17
17
  */
18
18
 
19
- import type { AgentBackend, AgentQueryOptions, McpServerSpec } from './backend'
19
+ import type { AgentBackend, AgentPermissionMode, AgentQueryOptions, McpServerSpec } from './backend'
20
+ import type { HostServices } from './host'
21
+ import type { ProfilesApi } from './profiles'
20
22
  import type { UsageApi } from './usage'
21
23
  import type { ZodType } from 'zod'
22
24
  import type {
@@ -273,6 +275,35 @@ export type CapabilityMatrix = {
273
275
  * usage bars and no Connect affordance is offered.
274
276
  */
275
277
  usage: boolean
278
+ /**
279
+ * Provider supports multiple isolated config/identity directories
280
+ * ("profiles") — distinct accounts, login states, agent customizations,
281
+ * and history sets all selectable per-session at runtime. When `true`,
282
+ * {@link JackProvider.profiles} MUST be defined; the host renders the
283
+ * profile picker UI and routes spawn-time `applyProfile` calls.
284
+ *
285
+ * When `false` the provider's runtime always uses its implicit default
286
+ * config dir; the host hides every profile-related affordance.
287
+ */
288
+ profiles: boolean
289
+ /**
290
+ * Permission modes the provider actually supports. Drives the
291
+ * Shift-Tab cycle in the renderer (`MessageInputBar`) and any
292
+ * provider-aware UI that picks a mode (settings, slash commands).
293
+ * Order matters — it's the cycle order on Shift-Tab.
294
+ *
295
+ * Each provider declares only the modes that have a meaningful
296
+ * behaviour for its runtime: Claude's `['default', 'acceptEdits',
297
+ * 'plan', 'auto']`, Codex's `['default', 'acceptEdits',
298
+ * 'bypassPermissions']` (no `'plan'` because there's no ExitPlanMode
299
+ * primitive — mapping `'plan'` to read-only sandbox would be
300
+ * misleading), Gemini's set inherited from ACP `available_modes`.
301
+ *
302
+ * Modes outside this list MAY still be accepted by
303
+ * `setPermissionMode()` (e.g. set programmatically via slash command
304
+ * or settings); the catalog only governs UI affordances.
305
+ */
306
+ permissionModes: readonly AgentPermissionMode[]
276
307
  }
277
308
 
278
309
  /**
@@ -658,6 +689,37 @@ export type JackProvider = {
658
689
  * decodes.
659
690
  */
660
691
  usage?: UsageApi
692
+ /**
693
+ * Multi-profile capability — multiple isolated config/identity dirs
694
+ * selectable per session. See {@link ProfilesApi}. Optional; when
695
+ * undefined `capabilities.profiles` MUST be `false` and the host hides
696
+ * every profile-related affordance. When defined, the host calls
697
+ * `applyProfile(options, profileId)` once per spawn so the provider can
698
+ * inject its native config-dir env var (Claude `CLAUDE_CONFIG_DIR`,
699
+ * Codex `CODEX_HOME`, …).
700
+ */
701
+ profiles?: ProfilesApi
702
+ /**
703
+ * Optional one-shot activation hook. Called once by the host during
704
+ * registration with a {@link HostServices} bag scoped to this
705
+ * provider's id (kv namespace, auth partition prefix). Providers that
706
+ * need host-side primitives (encrypted credential storage, child auth
707
+ * windows, …) store the `host` reference and use it lazily; providers
708
+ * that are pure (Codex, Gemini today) leave this undefined.
709
+ *
710
+ * Activation MUST be idempotent: calling `activate(host)` twice with
711
+ * the same host is allowed and should not duplicate state. Activation
712
+ * happens at registration time — well before any session spawns —
713
+ * but providers MUST NOT block on network or disk here. Defer all I/O
714
+ * to the methods that actually need it.
715
+ *
716
+ * The host calls `activate` synchronously enough that
717
+ * `provider.usage`, `provider.persistedPermissions`, etc. can read
718
+ * `host` from a closure / captured variable in subsequent invocations.
719
+ * Async work inside `activate` is OK but the host won't await it
720
+ * before exposing the provider — it's "fire and let it complete".
721
+ */
722
+ activate?(host: HostServices): void | Promise<void>
661
723
  }
662
724
 
663
725
  /**