@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.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # `@ottimis/jack-provider-sdk`
2
2
 
3
- Plugin contract for AI provider integrations in [Jack](https://github.com/ottimis/JACK). Every package that drives an AI coding agent inside Jack — `jack-claude`, `jack-codex`, `jack-gemini`, future `jack-<name>` — depends on this SDK and exports a single `JackProvider` object that satisfies the contract here.
3
+ Plugin contract for AI provider integrations in Jack. Every package that drives an AI coding agent inside Jack — `jack-claude`, `jack-codex`, `jack-gemini`, future `jack-<name>` — depends on this SDK and exports a single `JackProvider` object that satisfies the contract here.
4
4
 
5
5
  ## What's in the box
6
6
 
@@ -41,7 +41,7 @@ export const myProvider: JackProvider = {
41
41
  }
42
42
  ```
43
43
 
44
- Full contract documented in the consumer repo: [`docs/provider-package-spec.md`](https://github.com/ottimis/JACK/blob/main/docs/provider-package-spec.md).
44
+ Step-by-step walkthrough (Pattern A vs Pattern B, capability matrix, knowledge context, gotchas): [`docs/implementing-a-provider.md`](./docs/implementing-a-provider.md). Full type reference lives in the JSDoc on each exported type.
45
45
 
46
46
  ## Versioning
47
47
 
package/dist/backend.d.ts CHANGED
@@ -33,8 +33,14 @@ import type { NormalizedMessage, NormalizedPermissionRequest, NormalizedPermissi
33
33
  * list, so widening to `string` is required for non-Claude providers.
34
34
  */
35
35
  export type BackendName = string;
36
- /** Permission gate behaviour. Strings the host may toggle live. */
37
- export type AgentPermissionMode = 'default' | 'acceptEdits' | 'plan' | 'bypassPermissions';
36
+ /**
37
+ * Permission gate behaviour. Open string union providers declare which
38
+ * subset they support via {@link CapabilityMatrix.permissionModes}, and
39
+ * the host's permission-mode picker reads that catalog verbatim. Listed
40
+ * literals are the modes any in-tree provider has shipped to date;
41
+ * future providers may invent new strings without breaking the type.
42
+ */
43
+ export type AgentPermissionMode = 'default' | 'acceptEdits' | 'plan' | 'auto' | 'bypassPermissions' | 'dontAsk' | (string & {});
38
44
  /** Settings layers the provider should consult at boot. */
39
45
  export type AgentSettingSource = 'user' | 'project' | 'local';
40
46
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ /**
3
+ * Host primitives exposed to providers — handed in via
4
+ * {@link JackProvider.activate} so provider code never imports `electron`,
5
+ * `better-sqlite3`, or any other host-internal module directly.
6
+ *
7
+ * Why this exists
8
+ * ---------------
9
+ * In Jack v0.4.x the Claude provider reached into Electron (`safeStorage`,
10
+ * `BrowserWindow`, `session`) and Jack's settings table (`getSetting` /
11
+ * `setSetting`) to persist its login cookie. That breaks two goals:
12
+ *
13
+ * 1. **Out-of-tree packages.** A future `@third-party/jack-provider-foo`
14
+ * installed from npm shouldn't need to know about the host's storage
15
+ * layer or its windowing toolkit.
16
+ * 2. **Testability.** Provider unit tests on plain Node want a fake host
17
+ * that returns canned credentials, not a real `safeStorage`.
18
+ *
19
+ * `HostServices` is the contract that satisfies both: a tiny set of
20
+ * primitives the host implements once (with whatever it has — Electron in
21
+ * Jack's case, but a CLI host could use `keytar` + headless puppeteer)
22
+ * and providers consume through dependency injection.
23
+ *
24
+ * Surface stays intentionally small. New capabilities grow this file as
25
+ * specific providers need them — but the rule is "host-side knowledge
26
+ * doesn't leak out the SDK". A provider that needs deep host integration
27
+ * is a sign that the integration belongs in the host, not in the
28
+ * provider.
29
+ *
30
+ * Lifecycle
31
+ * ---------
32
+ * The host calls `provider.activate(host)` once during registration. The
33
+ * provider stores the `host` reference and uses it lazily — no host
34
+ * primitive may be invoked before activation. Methods that need the host
35
+ * must guard accordingly (typically by deferring all work to a closure).
36
+ */
37
+ Object.defineProperty(exports, "__esModule", { value: true });
38
+ //# sourceMappingURL=host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.js","sourceRoot":"","sources":["../../src/host.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG"}
package/dist/cjs/index.js CHANGED
@@ -8,13 +8,19 @@
8
8
  * (not on Jack's main process internals) and Jack stays free to evolve
9
9
  * its host code without breaking provider authors.
10
10
  *
11
- * Re-exports cover three layers:
11
+ * Re-exports cover four layers:
12
12
  * - `./backend` — neutral wire-shape contract (`AgentBackend`,
13
13
  * `AgentQueryOptions`, `AgentSession`, …)
14
14
  * - `./spawner` — process-spawning primitives shared by every backend
15
15
  * (`ProcessSpawner`, `ProcessHandle`, `localSpawner`, …)
16
16
  * - `./provider` — plugin-level contract (`JackProvider`,
17
17
  * `CapabilityMatrix`, `ToolDescriptor`, `ProviderBranding`, …)
18
+ * - `./usage` — provider-owned billing/usage surface (`UsageApi`,
19
+ * `UsageMetric`, …)
20
+ * - `./host` — host primitives injected at activation
21
+ * (`HostServices`, `HostKvScope`, `HostAuthService`, …) — providers
22
+ * consume these via `JackProvider.activate(host)` instead of
23
+ * reaching into Electron / host internals directly.
18
24
  *
19
25
  * Companion runtime types from `@ottimis/jack-chat-core` (`NormalizedMessage`,
20
26
  * `ClientToolHandler`, `ToolShape`, …) are re-exported through `./provider`
@@ -40,4 +46,6 @@ __exportStar(require("./backend"), exports);
40
46
  __exportStar(require("./spawner"), exports);
41
47
  __exportStar(require("./provider"), exports);
42
48
  __exportStar(require("./usage"), exports);
49
+ __exportStar(require("./host"), exports);
50
+ __exportStar(require("./profiles"), exports);
43
51
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;;;;;;;;;;;;;;;;AAEH,4CAAyB;AACzB,4CAAyB;AACzB,6CAA0B;AAC1B,0CAAuB"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;;;;;;;;;;;;;;;;AAEH,4CAAyB;AACzB,4CAAyB;AACzB,6CAA0B;AAC1B,0CAAuB;AACvB,yCAAsB;AACtB,6CAA0B"}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ /**
3
+ * Profiles — multiple isolated identities for a single provider.
4
+ *
5
+ * A "profile" is an isolated config/identity directory the provider's runtime
6
+ * can be pointed at via an env var (Claude `CLAUDE_CONFIG_DIR`, Codex
7
+ * `CODEX_HOME`, Gemini `GEMINI_CONFIG_DIR`, …). Two profiles = two distinct
8
+ * accounts / login states / agent customizations / history sets, all running
9
+ * the same provider binary.
10
+ *
11
+ * The user-facing scenario this exists for: an employee with separate
12
+ * "claude-personal" and "claude-work" shell aliases that point CLAUDE_CONFIG_DIR
13
+ * at different folders. The host turns that into a first-class concept —
14
+ * choosable per session, with a default per workspace-agent slot — instead of
15
+ * making the user re-shell their alias every time they switch context.
16
+ *
17
+ * Provider opts in by:
18
+ * - declaring `capabilities.profiles = true`
19
+ * - implementing `JackProvider.profiles` with a {@link ProfilesApi}
20
+ * - injecting the right env var inside `applyProfile`
21
+ *
22
+ * Storage of the profile *list* lives on the host's per-provider kv (provider
23
+ * stores it via `host.kv` at activation time). Storage of the profile
24
+ * *content* (auth, sessions, agents, history) lives inside `configDir` on
25
+ * disk and is the runtime's concern, not the host's — Jack never reads or
26
+ * writes inside `configDir`.
27
+ */
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ //# sourceMappingURL=profiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../src/profiles.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG"}
package/dist/host.d.ts ADDED
@@ -0,0 +1,161 @@
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
+ * Per-provider key/value store. Keys are namespaced automatically by the
38
+ * calling provider's id, so `kv.set('token', x)` from `claudeProvider`
39
+ * lands in a different bucket than the same call from `codexProvider`.
40
+ *
41
+ * Values are strings — callers serialize JSON / numbers / booleans
42
+ * themselves. `null` from `get` / `getSecret` means "no value stored",
43
+ * not "value is null"; explicit removal goes through `remove`.
44
+ *
45
+ * `setSecret` / `getSecret` route through the host's OS-level keychain
46
+ * encryption when available (Electron's `safeStorage`, `keytar`, etc.).
47
+ * `setSecret` MUST throw when no secure storage is available so providers
48
+ * never silently degrade to plaintext on unsupported systems.
49
+ */
50
+ export type HostKvScope = {
51
+ /** Plain (unencrypted) read. */
52
+ get(key: string): string | null;
53
+ /** Plain (unencrypted) write. */
54
+ set(key: string, value: string): void;
55
+ /** Remove the value at `key`. Idempotent (no-op when the key is absent). */
56
+ remove(key: string): void;
57
+ /** Encrypted read. Returns `null` when the key is absent OR the host's secret store can't decrypt (e.g. user wiped keychain). */
58
+ getSecret(key: string): string | null;
59
+ /** Encrypted write. Throws when secure storage isn't available — providers should surface a clear error to the user, not fall back to plaintext. */
60
+ setSecret(key: string, value: string): void;
61
+ };
62
+ /**
63
+ * Options for {@link HostAuthService.openCookieLoginWindow}.
64
+ *
65
+ * The host opens a child auth window at `url` and polls the cookie jar
66
+ * until `cookieName` appears on `cookieDomain`. When the cookie shows up
67
+ * the host returns its value and closes the window.
68
+ *
69
+ * Each provider's auth flow lives in its own session partition so two
70
+ * providers can be "logged in" simultaneously without their cookies
71
+ * colliding in the host's shared cookie store.
72
+ */
73
+ export type CookieLoginOptions = {
74
+ /** URL to open in the child window. */
75
+ url: string;
76
+ /** Name of the cookie the provider waits for (e.g. `'sessionKey'`). */
77
+ cookieName: string;
78
+ /** Cookie domain to scope the lookup (e.g. `'https://claude.ai'`). */
79
+ cookieDomain: string;
80
+ /**
81
+ * Storage partition string for session isolation. Convention:
82
+ * `persist:<provider-id>-<flow-name>` (e.g. `persist:claude-usage`).
83
+ * Different partition strings keep parallel logins independent.
84
+ */
85
+ partition: string;
86
+ /** Window title shown in the OS chrome. Default: `'Connect'`. */
87
+ title?: string;
88
+ /** Hard timeout in milliseconds. Default: 5 minutes. */
89
+ timeoutMs?: number;
90
+ /** Window width in pixels. Default: 520. */
91
+ width?: number;
92
+ /** Window height in pixels. Default: 720. */
93
+ height?: number;
94
+ /**
95
+ * Optional parent window the host narrows internally to attach
96
+ * modality. Typed as `unknown` so the SDK doesn't depend on Electron.
97
+ */
98
+ parentWindow?: unknown;
99
+ };
100
+ /**
101
+ * Result of a cookie-login flow.
102
+ *
103
+ * - `'success'` — cookie captured; `cookieValue` is the raw value.
104
+ * - `'cancelled'` — user closed the window before the cookie appeared.
105
+ * - `'timeout'` — `timeoutMs` elapsed without the cookie being set.
106
+ * - `'error'` — host couldn't open the window (e.g. running headless,
107
+ * no display server, partition rejected). Providers should surface
108
+ * `error` to the user as an actionable message.
109
+ */
110
+ export type CookieLoginResult = {
111
+ kind: 'success';
112
+ cookieValue: string;
113
+ } | {
114
+ kind: 'cancelled';
115
+ } | {
116
+ kind: 'timeout';
117
+ } | {
118
+ kind: 'error';
119
+ error: string;
120
+ };
121
+ /**
122
+ * Auth primitives the host provides. Today only cookie-based login;
123
+ * OAuth / device-code flows can be added as future providers need them
124
+ * without breaking existing implementations (`HostAuthService` is an
125
+ * open-shape type — additions are purely additive).
126
+ */
127
+ export type HostAuthService = {
128
+ /**
129
+ * Open a child window at the given URL and wait for the named cookie
130
+ * to appear. Used by providers whose login flow is "send the user to
131
+ * a web page, scrape the session cookie when they sign in".
132
+ *
133
+ * The host is responsible for: opening the window, polling cookies,
134
+ * closing the window when the cookie shows up (or the user cancels /
135
+ * times out), and isolating the session partition. The provider
136
+ * doesn't see Electron, BrowserWindow, or any windowing detail.
137
+ */
138
+ openCookieLoginWindow(opts: CookieLoginOptions): Promise<CookieLoginResult>;
139
+ };
140
+ /**
141
+ * The bag of host services injected into a provider via
142
+ * {@link JackProvider.activate}. Providers store the reference and
143
+ * pull primitives lazily.
144
+ *
145
+ * Adding a new capability:
146
+ * 1. Define the new service interface in this file (or a sibling).
147
+ * 2. Add it as an optional field here so older providers that don't
148
+ * use it keep compiling.
149
+ * 3. Document the feature flag — providers that need the capability
150
+ * should guard with `if (!host.newCapability) return undefined`
151
+ * and the host implements it.
152
+ *
153
+ * Concrete services exposed today are documented in their own types.
154
+ */
155
+ export type HostServices = {
156
+ /** Per-provider key/value store. Namespaced by provider id by the host. */
157
+ kv: HostKvScope;
158
+ /** Auth flow primitives (cookie login today; OAuth / device-code in the future). */
159
+ auth: HostAuthService;
160
+ };
161
+ //# sourceMappingURL=host.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../src/host.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,gCAAgC;IAChC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;IAC/B,iCAAiC;IACjC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACrC,4EAA4E;IAC5E,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,iIAAiI;IACjI,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;IACrC,oJAAoJ;IACpJ,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAC5C,CAAA;AAED;;;;;;;;;;GAUG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,uCAAuC;IACvC,GAAG,EAAE,MAAM,CAAA;IACX,uEAAuE;IACvE,UAAU,EAAE,MAAM,CAAA;IAClB,sEAAsE;IACtE,YAAY,EAAE,MAAM,CAAA;IACpB;;;;OAIG;IACH,SAAS,EAAE,MAAM,CAAA;IACjB,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,6CAA6C;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB,CAAA;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,iBAAiB,GACzB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GACrB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAEpC;;;;;GAKG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B;;;;;;;;;OASG;IACH,qBAAqB,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAA;CAC5E,CAAA;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,2EAA2E;IAC3E,EAAE,EAAE,WAAW,CAAA;IACf,oFAAoF;IACpF,IAAI,EAAE,eAAe,CAAA;CACtB,CAAA"}
package/dist/host.js ADDED
@@ -0,0 +1,37 @@
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
+ export {};
37
+ //# sourceMappingURL=host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.js","sourceRoot":"","sources":["../src/host.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG"}
package/dist/index.d.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`
@@ -24,6 +30,8 @@ export * from './backend';
24
30
  export * from './spawner';
25
31
  export * from './provider';
26
32
  export * from './usage';
33
+ export * from './host';
34
+ export * from './profiles';
27
35
  /**
28
36
  * Re-export of `NormalizedMessage` from chat-core so consumers don't need
29
37
  * to depend on it directly when their only entrypoint into the wire shape
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,YAAY,CAAA;AAC1B,cAAc,SAAS,CAAA;AAEvB;;;;;GAKG;AACH,YAAY,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,YAAY,CAAA;AAC1B,cAAc,SAAS,CAAA;AACvB,cAAc,QAAQ,CAAA;AACtB,cAAc,YAAY,CAAA;AAE1B;;;;;GAKG;AACH,YAAY,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA"}
package/dist/index.js 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`
@@ -24,4 +30,6 @@ export * from './backend';
24
30
  export * from './spawner';
25
31
  export * from './provider';
26
32
  export * from './usage';
33
+ export * from './host';
34
+ export * from './profiles';
27
35
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,YAAY,CAAA;AAC1B,cAAc,SAAS,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,YAAY,CAAA;AAC1B,cAAc,SAAS,CAAA;AACvB,cAAc,QAAQ,CAAA;AACtB,cAAc,YAAY,CAAA"}
@@ -0,0 +1,130 @@
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
+ import type { AgentQueryOptions } from './backend';
28
+ /**
29
+ * One profile entry. `id` is host-generated and stable; the human edits
30
+ * `label` + `configDir` freely.
31
+ *
32
+ * `isDefault` is exclusive within a provider — exactly one profile carries
33
+ * the flag at any time. Provider implementations enforce that invariant in
34
+ * `update`/`create` (when `setDefault` is true, demote the previous default).
35
+ */
36
+ export type ProviderProfile = {
37
+ /** Stable identifier — host-generated UUID; never edited by user. */
38
+ id: string;
39
+ /** User-facing display label ("Work", "Personal", …). */
40
+ label: string;
41
+ /** Absolute path to the runtime config dir on the host filesystem. */
42
+ configDir: string;
43
+ /** Exactly one profile per provider carries this flag. */
44
+ isDefault: boolean;
45
+ /** ISO 8601 — when the profile was first created in Jack's registry. */
46
+ createdAt: string;
47
+ };
48
+ /**
49
+ * Result of {@link ProfilesApi.probeProfile} — best-effort introspection of
50
+ * what's already stored under `configDir` so the UI can show the user
51
+ * "Connected as <X>" instead of an opaque path.
52
+ *
53
+ * Provider populates whichever fields it can read cheaply (no network
54
+ * round-trips) — fields it can't infer stay undefined.
55
+ */
56
+ export type ProviderProfileProbe = {
57
+ /** True when the dir exists and looks like a valid runtime config. */
58
+ exists: boolean;
59
+ /** True when the dir contains usable credentials. Tri-state: false = present-but-invalid, undefined = N/A. */
60
+ authenticated?: boolean;
61
+ /** Human-readable identity hint (email, account label) when discoverable. */
62
+ accountLabel?: string;
63
+ };
64
+ /**
65
+ * Input shape for {@link ProfilesApi.create}. The `id` is host-generated by
66
+ * the provider implementation (typically `crypto.randomUUID()`); the caller
67
+ * supplies the human bits.
68
+ */
69
+ export type CreateProfileInput = {
70
+ label: string;
71
+ configDir: string;
72
+ /** When true, the new profile becomes the default (demotes previous default). */
73
+ setDefault?: boolean;
74
+ };
75
+ /**
76
+ * Provider-owned profiles capability. Optional on {@link JackProvider} —
77
+ * absent = the provider's runtime always uses its implicit default config dir
78
+ * and the host hides every profiles-related affordance.
79
+ */
80
+ export type ProfilesApi = {
81
+ /**
82
+ * Enumerate the registered profiles in stable order. Provider MUST seed
83
+ * a "Default" profile pointing at its implicit config dir on first call
84
+ * (lazy migration — preserves the user's existing setup without manual
85
+ * intervention).
86
+ */
87
+ list(): Promise<ProviderProfile[]>;
88
+ /**
89
+ * Register a new profile. Provider generates the `id` and persists the
90
+ * row. Returns the freshly-created profile so the caller doesn't have to
91
+ * round-trip through `list()`.
92
+ */
93
+ create(input: CreateProfileInput): Promise<ProviderProfile>;
94
+ /**
95
+ * Patch an existing profile. Empty patch = no-op. Setting `isDefault: true`
96
+ * demotes whichever profile currently holds the default flag.
97
+ */
98
+ update(id: string, patch: Partial<Pick<ProviderProfile, 'label' | 'configDir' | 'isDefault'>>): Promise<ProviderProfile>;
99
+ /**
100
+ * Remove a profile by id. MUST refuse to remove the last remaining profile
101
+ * (the provider always needs a default to fall back to). MUST refuse to
102
+ * remove the default profile when other profiles exist — caller has to
103
+ * promote a replacement first.
104
+ *
105
+ * Note: this only removes the registry entry. Files inside `configDir`
106
+ * stay on disk untouched — destructive cleanup is the user's responsibility
107
+ * (we never `rm -rf` a directory the user gave us).
108
+ */
109
+ remove(id: string): Promise<void>;
110
+ /**
111
+ * Mutate spawn options in place to point the runtime at the chosen
112
+ * profile's `configDir`. Each provider injects its native env var
113
+ * (Claude: `CLAUDE_CONFIG_DIR`; Codex: `CODEX_HOME`; …) and any other
114
+ * spawn-time wiring the runtime needs.
115
+ *
116
+ * Called once per spawn by the host, after `applyKnowledgeContext` and
117
+ * `prepareSpawnOptions`. Unknown `profileId` MUST be a silent no-op
118
+ * (caller falls back to the implicit default behavior).
119
+ */
120
+ applyProfile(options: AgentQueryOptions, profileId: string): Promise<void>;
121
+ /**
122
+ * Best-effort introspection of what's stored under `configDir` so the
123
+ * UI can show "Connected as X" / "Empty profile" hints. Provider returns
124
+ * what it can read cheaply (file presence, parsed credentials file) —
125
+ * no network calls. Optional: providers that can't introspect their
126
+ * own config dir omit this and the UI falls back to a path-only display.
127
+ */
128
+ probeProfile?(configDir: string): Promise<ProviderProfileProbe>;
129
+ };
130
+ //# sourceMappingURL=profiles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profiles.d.ts","sourceRoot":"","sources":["../src/profiles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAElD;;;;;;;GAOG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,qEAAqE;IACrE,EAAE,EAAE,MAAM,CAAA;IACV,yDAAyD;IACzD,KAAK,EAAE,MAAM,CAAA;IACb,sEAAsE;IACtE,SAAS,EAAE,MAAM,CAAA;IACjB,0DAA0D;IAC1D,SAAS,EAAE,OAAO,CAAA;IAClB,wEAAwE;IACxE,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,sEAAsE;IACtE,MAAM,EAAE,OAAO,CAAA;IACf,8GAA8G;IAC9G,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,6EAA6E;IAC7E,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAED;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,iFAAiF;IACjF,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB,CAAA;AAED;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB;;;;;OAKG;IACH,IAAI,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CAAA;IAElC;;;;OAIG;IACH,MAAM,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,eAAe,CAAC,CAAA;IAE3D;;;OAGG;IACH,MAAM,CACJ,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,eAAe,EAAE,OAAO,GAAG,WAAW,GAAG,WAAW,CAAC,CAAC,GACzE,OAAO,CAAC,eAAe,CAAC,CAAA;IAE3B;;;;;;;;;OASG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAEjC;;;;;;;;;OASG;IACH,YAAY,CAAC,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAE1E;;;;;;OAMG;IACH,YAAY,CAAC,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAA;CAChE,CAAA"}
@@ -0,0 +1,28 @@
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
+ export {};
28
+ //# sourceMappingURL=profiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profiles.js","sourceRoot":"","sources":["../src/profiles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG"}