@byokit/openclaw 0.14.0 → 0.14.2
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/CHANGELOG.md +22 -0
- package/README.md +4 -1
- package/dist/accounts.js +5 -5
- package/dist/approvals.js +1 -1
- package/dist/auth-status.js +1 -1
- package/dist/auth-store.js +2 -2
- package/dist/bridge.js +1 -1
- package/dist/browser/host.js +3 -3
- package/dist/browser/verify.js +1 -1
- package/dist/config.js +2 -2
- package/dist/constants.d.ts +1 -1
- package/dist/day-usage.js +1 -1
- package/dist/device.js +7 -7
- package/dist/engine.d.ts +3 -0
- package/dist/engine.js +22 -9
- package/dist/index.js +8 -8
- package/dist/keys.d.ts +4 -0
- package/dist/keys.js +24 -6
- package/dist/kit.d.ts +4 -1
- package/dist/kit.js +29 -26
- package/dist/link.js +5 -5
- package/dist/migrate.js +3 -3
- package/dist/pick.js +1 -1
- package/dist/runs.js +6 -6
- package/dist/signin.js +5 -5
- package/dist/testing/browser.js +2 -2
- package/dist/testing/contract.js +3 -3
- package/dist/testing/fake-gateway.js +6 -4
- package/dist/testing/index.js +4 -4
- package/dist/testing/model-stub.d.ts +4 -0
- package/dist/testing/model-stub.js +8 -1
- package/dist/transport.d.ts +1 -1
- package/dist/transport.js +1 -1
- package/package.json +6 -6
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,28 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
## 0.14.2 (2026-10-16)
|
|
6
|
+
|
|
7
|
+
- Dependency update: pins @byokit/relay 0.7.1.
|
|
8
|
+
- Dependency update: pins @byokit/accounts 0.24.1.
|
|
9
|
+
|
|
10
|
+
- FIX: `addKey` takes `orgId` for the Go live-catalog route and writes it into the engine's provider config (`models.providers['opencode-go'].headers['x-opencode-org-id']`) before the activation, so a multi-workspace login token is accepted — the engine's own probe and every run carry the header, and the first chat runs. The slot is provider-wide (shared by every member's key on one engine): a replacement key with no `orgId` keeps the standing workspace, `removeKey` drops it, and naming an `orgId` on a route with no workspace is refused `not_included`/`model` instead of silently dropped. Keys and workspace ids never reach logs, errors or views.
|
|
11
|
+
|
|
12
|
+
## 0.14.1 (2026-10-16)
|
|
13
|
+
|
|
14
|
+
- Dependency update: pins @byokit/ui 0.8.0.
|
|
15
|
+
- Dependency update: pins @byokit/discover 0.8.2.
|
|
16
|
+
- Dependency update: pins @byokit/relay 0.7.0.
|
|
17
|
+
- Dependency update: pins @byokit/pair 0.10.1.
|
|
18
|
+
- Dependency update: pins @byokit/accounts 0.24.0.
|
|
19
|
+
|
|
20
|
+
- FIX: when the engine answers a sign-in's cancel `cancelled`, `done` now also waits (up to 10 s) for it to free its setup admission, so a sign-in started right after is admitted instead of ending `why: 'busy'`.
|
|
21
|
+
- FIX: The kit now resolves `stateDir` to one absolute path through no symlink before it uses it. A native Claude CLI sign-in (`claude-cli`, browser or phone) with a relative `stateDir`, or one under a symlinked folder such as macOS `/tmp` or `os.tmpdir()`, failed with "The app supplied invalid account options." Engine paths the kit reports (for example the bridge socket and `identityPath`) now use that resolved path.
|
|
22
|
+
- FIX: `removeKey` (and `signOut`, which calls it for that provider) also drops the lane's `<provider>.key` index entry, so `accounts()` no longer lists a removed key; a scoped removal keeps another provider's entry.
|
|
23
|
+
- FIX: `pick` builds its live room/models reads from the filtered pick rows, so an Auto pick for a member whose only other account is the unnamed key lane makes no `models.list`/`models.authStatus` calls for the lane it never consults.
|
|
24
|
+
- FIX: the key-lane docs now scope the "no `<member>--<hex6>` per later key" claim to the `addKey` path; a plan key added with `addAccount` when the member agent already holds that provider still mints one `<member>--<hex6>` agent per key. The Choosing spec names the kit-only lane filter.
|
|
25
|
+
- The README states platform support: Linux and macOS x64/arm64 supported, Windows unsupported. CI runs the offline suite on macOS.
|
|
26
|
+
|
|
5
27
|
## 0.14.0 (2026-10-15)
|
|
6
28
|
|
|
7
29
|
- Dependency update: pins @byokit/accounts 0.23.0.
|
package/README.md
CHANGED
|
@@ -568,7 +568,8 @@ for await (const e of oc.run('Say hello.')) console.log(e);
|
|
|
568
568
|
|
|
569
569
|
## Isolation and billing
|
|
570
570
|
|
|
571
|
-
The kit writes only under the `stateDir` the app passes
|
|
571
|
+
The kit writes only under the `stateDir` the app passes, resolved to one absolute path through no symlink (so a
|
|
572
|
+
relative path or macOS `os.tmpdir()` works, and paths the kit reports use the resolved form). It spawns the engine with an explicit isolated environment
|
|
572
573
|
(never `process.env`), reads no environment variables except `PATH` to find `npm`, and never bills an API behind the
|
|
573
574
|
person's back (memory search is never a paid provider).
|
|
574
575
|
|
|
@@ -685,6 +686,8 @@ retained-login cleanup and sealed approval limits.
|
|
|
685
686
|
|
|
686
687
|
## Status
|
|
687
688
|
|
|
689
|
+
Linux and macOS x64/arm64 are supported; Windows is unsupported.
|
|
690
|
+
|
|
688
691
|
Pinned to OpenClaw `2026.8.35` (protocol 4); `ENGINE_VERSION` and `PROTOCOL_VERSION` carry the pin. Signatures are
|
|
689
692
|
frozen (docs/runtime-kits.md §5).
|
|
690
693
|
|
package/dist/accounts.js
CHANGED
|
@@ -10,11 +10,11 @@ import { chmodSync, existsSync, mkdirSync, readdirSync, readFileSync, renameSync
|
|
|
10
10
|
import { randomBytes, randomUUID } from 'node:crypto';
|
|
11
11
|
import { join } from 'node:path';
|
|
12
12
|
import { DatabaseSync } from 'node:sqlite';
|
|
13
|
-
import { providerOf, resolveSelection } from
|
|
14
|
-
import { agentOf, memberOf as baseMemberOf } from
|
|
15
|
-
import { KEY_PREFIX, MEMBER_ID, NEW_MEMBER_ID, keyAgentId, untilListed } from
|
|
16
|
-
import { routes, routeFor } from
|
|
17
|
-
import { words } from
|
|
13
|
+
import { providerOf, resolveSelection } from './pick.js';
|
|
14
|
+
import { agentOf, memberOf as baseMemberOf } from './attribution.js';
|
|
15
|
+
import { KEY_PREFIX, MEMBER_ID, NEW_MEMBER_ID, keyAgentId, untilListed } from './members.js';
|
|
16
|
+
import { routes, routeFor } from './routes.js';
|
|
17
|
+
import { words } from './words.js';
|
|
18
18
|
const record = (v) => !!v && typeof v === 'object' && !Array.isArray(v);
|
|
19
19
|
// `models.list { agentId, view: 'default' }` rows of the account's provider, mapped to `provider/model`. The pin
|
|
20
20
|
// reports no per-plan availability, so `why: 'plan'` only comes from a run ending `plan`, never from here.
|
package/dist/approvals.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Native approvals: exec.approval.*, plugin.approval.* and question.* surfaced through the same Approval shape (5.9, O5).
|
|
2
2
|
import { randomBytes } from 'node:crypto';
|
|
3
|
-
import { MEMBER_ID } from
|
|
3
|
+
import { MEMBER_ID } from './members.js';
|
|
4
4
|
const strip = (a) => {
|
|
5
5
|
const { native, ...approval } = a;
|
|
6
6
|
void native;
|
package/dist/auth-status.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { statSync } from 'node:fs';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
|
-
import { signedInProviders, USABLE } from
|
|
3
|
+
import { signedInProviders, USABLE } from './runs.js';
|
|
4
4
|
/** Native Claude login stays in Claude Code. The pin's profile status does not include this synthetic auth;
|
|
5
5
|
* setup detection asks the CLI itself, without handing credentials to the kit. */
|
|
6
6
|
export async function authStatus(request, agentId, refresh = false, native = false) {
|
package/dist/auth-store.js
CHANGED
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
import { chmodSync, existsSync, lstatSync, mkdirSync, readFileSync, readdirSync, realpathSync, renameSync, rmSync, rmdirSync, writeFileSync, closeSync, fsyncSync, openSync } from 'node:fs';
|
|
8
8
|
import { createHash } from 'node:crypto';
|
|
9
9
|
import { dirname, isAbsolute, join, relative, resolve, sep } from 'node:path';
|
|
10
|
-
import { EngineAlreadyRunningError, pidAlive as live } from
|
|
11
|
-
import { damagedAccountMembers, heldBackAgent, removedAccountAgents, sweepOrphans } from
|
|
10
|
+
import { EngineAlreadyRunningError, pidAlive as live } from './engine-status.js';
|
|
11
|
+
import { damagedAccountMembers, heldBackAgent, removedAccountAgents, sweepOrphans } from './accounts.js';
|
|
12
12
|
const agentDirOf = (path) => path.startsWith('state/agents/') ? path.split('/')[2] : undefined;
|
|
13
13
|
const encoder = new TextEncoder();
|
|
14
14
|
const archive = (name) => !name.endsWith('.sealed') && (/^(auth-profiles|auth-state|auth|oauth)\.json\.(migrated-.+|sqlite-import\..+\.bak)$/.test(name)
|
package/dist/bridge.js
CHANGED
|
@@ -3,7 +3,7 @@ import { randomBytes } from 'node:crypto';
|
|
|
3
3
|
import { existsSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
|
|
4
4
|
import { createServer } from 'node:net';
|
|
5
5
|
import { rm } from 'node:fs/promises';
|
|
6
|
-
import { words } from
|
|
6
|
+
import { words } from './words.js';
|
|
7
7
|
/** Newline-framed JSON, one request per connection; anything larger is not a gate request. */
|
|
8
8
|
const FRAME_CAP = 1_000_000;
|
|
9
9
|
/**
|
package/dist/browser/host.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// Internal host runtime (5.17). Production handoff is deliberately unprotected until W7/O17 qualification.
|
|
2
2
|
import { randomBytes } from 'node:crypto';
|
|
3
|
-
import { BrowserStoreError, checkUrl, validOrigin } from
|
|
4
|
-
import { validateVerifiers, verifySignIn } from
|
|
5
|
-
import { dispatchResume, newResume, recoverResume } from
|
|
3
|
+
import { BrowserStoreError, checkUrl, validOrigin } from './store.js';
|
|
4
|
+
import { validateVerifiers, verifySignIn } from './verify.js';
|
|
5
|
+
import { dispatchResume, newResume, recoverResume } from './resume.js';
|
|
6
6
|
export class SignInRefused extends Error {
|
|
7
7
|
why;
|
|
8
8
|
constructor(why) { super(`sign-in refused: ${why}`); this.why = why; }
|
package/dist/browser/verify.js
CHANGED
package/dist/config.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { dirname, join } from 'node:path';
|
|
2
|
-
import { routes } from
|
|
3
|
-
import { MEMBER_ID, KEY_PREFIX, BASE_AGENT, keyAgentId } from
|
|
2
|
+
import { routes } from './routes.js';
|
|
3
|
+
import { MEMBER_ID, KEY_PREFIX, BASE_AGENT, keyAgentId } from './members.js';
|
|
4
4
|
const object = (v) => !!v && typeof v === 'object' && !Array.isArray(v);
|
|
5
5
|
const merge = (a, b) => {
|
|
6
6
|
for (const [k, v] of Object.entries(b))
|
package/dist/constants.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export declare const ENGINE_VERSION = "2026.8.35";
|
|
2
2
|
export declare const PROTOCOL_VERSION = 4;
|
|
3
3
|
export declare const LIVE_CATALOGS: string[];
|
|
4
|
-
export declare const OPERATOR_SCOPES: readonly [
|
|
4
|
+
export declare const OPERATOR_SCOPES: readonly ['operator.read', 'operator.write', 'operator.admin', 'operator.approvals', 'operator.questions', 'operator.pairing', 'operator.talk'];
|
package/dist/day-usage.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// Portable additive day reader. No host files, pricing guesses or side totals for persisted turns.
|
|
2
|
-
import { agentUsageOf } from
|
|
2
|
+
import { agentUsageOf } from './usage.js';
|
|
3
3
|
const object = (v) => !!v && typeof v === 'object' && !Array.isArray(v);
|
|
4
4
|
const count = (v) => typeof v === 'number' && Number.isFinite(v) && v >= 0;
|
|
5
5
|
const text = (v) => typeof v === 'string' && v.length > 0 && v.length <= 512;
|
package/dist/device.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { openBoxFromSeed, boxKeyPairFromSeed } from '@byokit/seal';
|
|
2
|
-
import { memberOf } from
|
|
3
|
-
import { toAccountView } from
|
|
4
|
-
import { b64urlDecode, b64urlEncode, openNotice } from
|
|
2
|
+
import { memberOf } from './attribution.js';
|
|
3
|
+
import { toAccountView } from './words.js';
|
|
4
|
+
import { b64urlDecode, b64urlEncode, openNotice } from './notices.js';
|
|
5
5
|
/**
|
|
6
6
|
* The host ended a stream with its own words (e.g. a refusal). Portable twin of link's PublicLinkError:
|
|
7
7
|
* same shape ({ code: 'failed', sealed: true }) so a screen can show .message the same way. A device-side
|
|
@@ -418,8 +418,8 @@ export function openclawDevice(link) {
|
|
|
418
418
|
};
|
|
419
419
|
}
|
|
420
420
|
// Portable, re-exported by ./device (7.3).
|
|
421
|
-
export { openNotice } from
|
|
422
|
-
export { readAgentUsage, agentUsageOf } from
|
|
423
|
-
export { readAgentDayUsage } from
|
|
421
|
+
export { openNotice } from './notices.js';
|
|
422
|
+
export { readAgentUsage, agentUsageOf } from './usage.js';
|
|
423
|
+
export { readAgentDayUsage } from './day-usage.js';
|
|
424
424
|
// The kit's sentences, so a phone or browser shows the same words the computer does (5.14).
|
|
425
|
-
export { stateWords, toAccountView, words } from
|
|
425
|
+
export { stateWords, toAccountView, words } from './words.js';
|
package/dist/engine.d.ts
CHANGED
|
@@ -2,6 +2,9 @@ import { remoteCliHost } from '@byokit/accounts/cli';
|
|
|
2
2
|
import { AuthStore, AuthStoreSealSizeError } from './auth-store.ts';
|
|
3
3
|
import type { KitOptions } from './kit.ts';
|
|
4
4
|
import type { KitState, ToolSpec } from './types.ts';
|
|
5
|
+
/** The app's stateDir as an absolute path with no symlinked ancestor (macOS /tmp and /var are symlinks):
|
|
6
|
+
* the native Claude login's accounts store refuses any other, so a relative or symlinked stateDir failed it. */
|
|
7
|
+
export declare function canonicalStateDir(dir: string): string;
|
|
5
8
|
export type EngineOptions = Pick<KitOptions, 'stateDir' | 'engineDir' | 'npmPath' | 'enginePath' | 'config' | 'offered' | 'appOwnedSessions' | 'installPolicy' | 'log' | 'bridge' | 'authSeal'> & {
|
|
6
9
|
pluginId: string;
|
|
7
10
|
tools: ToolSpec[];
|
package/dist/engine.js
CHANGED
|
@@ -2,18 +2,30 @@ import { spawn, spawnSync } from 'node:child_process';
|
|
|
2
2
|
import { randomBytes, generateKeyPairSync, randomUUID } from 'node:crypto';
|
|
3
3
|
import { accessSync, constants, closeSync, existsSync, mkdirSync, openSync, readFileSync, writeFileSync, copyFileSync, rmSync, realpathSync, statSync } from 'node:fs';
|
|
4
4
|
import { createServer } from 'node:net';
|
|
5
|
-
import { basename, join, dirname } from 'node:path';
|
|
5
|
+
import { basename, join, dirname, resolve } from 'node:path';
|
|
6
6
|
import { fileURLToPath } from 'node:url';
|
|
7
7
|
import { setTimeout as delay } from 'node:timers/promises';
|
|
8
8
|
import { cliAccounts, remoteCliHost } from '@byokit/accounts/cli';
|
|
9
|
-
import { AuthStore, AuthStoreUnreadableError, AuthStoreSealSizeError } from
|
|
10
|
-
import { EngineAlreadyRunningError, pidAlive, StartedProcesses } from
|
|
11
|
-
import { EnginePatchError, atomic, prepareEngineSet, processStartTime, readPatchSet, sha256, verifyEngineSet } from
|
|
12
|
-
import { ENGINE_VERSION } from
|
|
13
|
-
import { appendUsageBoot } from
|
|
14
|
-
import { reconcileConfig, appRecoveryPrefixes } from
|
|
15
|
-
import { writePlugin, resolveBridge } from
|
|
16
|
-
import { sweepOrphans } from
|
|
9
|
+
import { AuthStore, AuthStoreUnreadableError, AuthStoreSealSizeError } from './auth-store.js';
|
|
10
|
+
import { EngineAlreadyRunningError, pidAlive, StartedProcesses } from './engine-status.js';
|
|
11
|
+
import { EnginePatchError, atomic, prepareEngineSet, processStartTime, readPatchSet, sha256, verifyEngineSet } from './engine-patches.js';
|
|
12
|
+
import { ENGINE_VERSION } from './constants.js';
|
|
13
|
+
import { appendUsageBoot } from './usage-boots.js';
|
|
14
|
+
import { reconcileConfig, appRecoveryPrefixes } from './config.js';
|
|
15
|
+
import { writePlugin, resolveBridge } from './bridge.js';
|
|
16
|
+
import { sweepOrphans } from './accounts.js';
|
|
17
|
+
/** The app's stateDir as an absolute path with no symlinked ancestor (macOS /tmp and /var are symlinks):
|
|
18
|
+
* the native Claude login's accounts store refuses any other, so a relative or symlinked stateDir failed it. */
|
|
19
|
+
export function canonicalStateDir(dir) {
|
|
20
|
+
const path = resolve(dir);
|
|
21
|
+
try {
|
|
22
|
+
return realpathSync(path);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
const parent = dirname(path);
|
|
26
|
+
return parent === path ? path : join(canonicalStateDir(parent), basename(path));
|
|
27
|
+
}
|
|
28
|
+
}
|
|
17
29
|
const kitDir = dirname(dirname(fileURLToPath(import.meta.url)));
|
|
18
30
|
const putOnce = (path, data) => { if (!existsSync(path))
|
|
19
31
|
writeFileSync(path, data, { mode: 0o600, flag: 'wx' }); };
|
|
@@ -95,6 +107,7 @@ export class Engine {
|
|
|
95
107
|
appOwnedSessionPrefixes;
|
|
96
108
|
constructor(o) {
|
|
97
109
|
this.appOwnedSessionPrefixes = appRecoveryPrefixes(o.appOwnedSessions);
|
|
110
|
+
o = { ...o, stateDir: canonicalStateDir(o.stateDir) };
|
|
98
111
|
this.o = o;
|
|
99
112
|
const bridge = resolveBridge(o.bridge);
|
|
100
113
|
this.root = join(o.stateDir, 'openclaw');
|
package/dist/index.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
// @byokit/openclaw — the OpenClaw runtime kit, host side (docs/runtime-kits.md 5.3). Entries: `.` (this),
|
|
2
2
|
// `./device` (portable), `./link` (Node host-side adapter), `./testing` (fakes and contract suite).
|
|
3
|
-
export { ENGINE_VERSION, OPERATOR_SCOPES, PROTOCOL_VERSION } from
|
|
4
|
-
export { OpenClawKit } from
|
|
5
|
-
export { stateWords, toAccountView, words } from
|
|
6
|
-
export { chooseAccount, consider, resolveSelection } from
|
|
7
|
-
export { AuthStoreUnreadableError, AuthStoreSealSizeError } from
|
|
8
|
-
export { EngineAlreadyRunningError } from
|
|
9
|
-
export { readAgentDayUsage } from
|
|
10
|
-
export { readAgentUsage, agentUsageOf } from
|
|
3
|
+
export { ENGINE_VERSION, OPERATOR_SCOPES, PROTOCOL_VERSION } from './constants.js';
|
|
4
|
+
export { OpenClawKit } from './kit.js';
|
|
5
|
+
export { stateWords, toAccountView, words } from './words.js';
|
|
6
|
+
export { chooseAccount, consider, resolveSelection } from './pick.js';
|
|
7
|
+
export { AuthStoreUnreadableError, AuthStoreSealSizeError } from './auth-store.js';
|
|
8
|
+
export { EngineAlreadyRunningError } from './engine-status.js';
|
|
9
|
+
export { readAgentDayUsage } from './day-usage.js';
|
|
10
|
+
export { readAgentUsage, agentUsageOf } from './usage.js';
|
package/dist/keys.d.ts
CHANGED
|
@@ -22,6 +22,9 @@ export declare function createKeys(ctx: ActivationCtx & {
|
|
|
22
22
|
indexLane(member: Member, route: RouteView): Promise<void>;
|
|
23
23
|
dropLane(member: Member, provider?: string): Promise<void>;
|
|
24
24
|
backfillLane(member: Member, model: string | undefined): Promise<void>;
|
|
25
|
+
/** The provider config headers a live-catalog key's calls and probes must carry (`null` clears them),
|
|
26
|
+
* written through the kit's own config patch. The Go workspace header is the one user. */
|
|
27
|
+
setProviderHeaders(provider: string, headers: Record<string, string> | null): Promise<void>;
|
|
25
28
|
}): {
|
|
26
29
|
models: (member: Member, o: {
|
|
27
30
|
authChoice: string;
|
|
@@ -31,6 +34,7 @@ export declare function createKeys(ctx: ActivationCtx & {
|
|
|
31
34
|
authChoice: string;
|
|
32
35
|
apiKey: string;
|
|
33
36
|
model?: string;
|
|
37
|
+
orgId?: string;
|
|
34
38
|
}): AddKeyHandle;
|
|
35
39
|
ready(member: Member, o?: {
|
|
36
40
|
once?: boolean;
|
package/dist/keys.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { join } from 'node:path';
|
|
2
|
-
import { activate } from
|
|
3
|
-
import { keyAgentId, MEMBER_ID, KEY_PREFIX, untilListed } from
|
|
4
|
-
import { providerOf } from
|
|
5
|
-
import { routes } from
|
|
6
|
-
import { modelsOf } from
|
|
7
|
-
import { LIVE_CATALOGS } from
|
|
2
|
+
import { activate } from './activation.js';
|
|
3
|
+
import { keyAgentId, MEMBER_ID, KEY_PREFIX, untilListed } from './members.js';
|
|
4
|
+
import { providerOf } from './pick.js';
|
|
5
|
+
import { routes } from './routes.js';
|
|
6
|
+
import { modelsOf } from './accounts.js';
|
|
7
|
+
import { LIVE_CATALOGS } from './constants.js';
|
|
8
8
|
export function createKeys(ctx) {
|
|
9
9
|
// Serialize key replacement and key runs, so an in-flight run never sees a half-installed replacement.
|
|
10
10
|
const tails = new Map();
|
|
@@ -86,6 +86,15 @@ export function createKeys(ctx) {
|
|
|
86
86
|
const route = routes().find((r) => r.choice === o.authChoice && r.keyEntry && r.readiness === 'ready');
|
|
87
87
|
if (!route || (o.model !== undefined && !LIVE_CATALOGS.includes(route.provider)))
|
|
88
88
|
return failure('not_included', 'model');
|
|
89
|
+
// A workspace names a live-catalog login's own workspace only; another route takes no header, and a
|
|
90
|
+
// refusal here leaves the member's lanes untouched (it lands before any prepare or activation).
|
|
91
|
+
const orgId = typeof o.orgId === 'string' ? o.orgId.trim() : '';
|
|
92
|
+
if (orgId) {
|
|
93
|
+
if (orgId.length > 256)
|
|
94
|
+
return failure('invalid', 'auth');
|
|
95
|
+
if (!LIVE_CATALOGS.includes(route.provider))
|
|
96
|
+
return failure('not_included', 'model');
|
|
97
|
+
}
|
|
89
98
|
if (ac.signal.aborted)
|
|
90
99
|
return failure('retry', 'busy');
|
|
91
100
|
return exclusive(member, async () => {
|
|
@@ -112,6 +121,11 @@ export function createKeys(ctx) {
|
|
|
112
121
|
return cancelled();
|
|
113
122
|
if (!(await control(member, 'prepare', route.provider)).ok)
|
|
114
123
|
return failure('retry', 'engine');
|
|
124
|
+
// The workspace rides the provider's probe and every run from its config; it is written before the
|
|
125
|
+
// activation, so the probe itself carries it. The slot is provider-wide (shared by every member's
|
|
126
|
+
// key on this engine), so a replacement with no `orgId` keeps the standing one and `removeKey` drops it.
|
|
127
|
+
if (orgId)
|
|
128
|
+
await ctx.setProviderHeaders(route.provider, { 'x-opencode-org-id': orgId });
|
|
115
129
|
// The public pin's typed API-key path, never a CLI-login import. Discard the engine's lines/errors.
|
|
116
130
|
sent = true;
|
|
117
131
|
if (ac.signal.aborted)
|
|
@@ -187,9 +201,13 @@ export function createKeys(ctx) {
|
|
|
187
201
|
else if (ready.ok !== true || providerOf(ready.model ?? '') !== o.provider)
|
|
188
202
|
return;
|
|
189
203
|
}
|
|
204
|
+
// The lane's own provider, when the removal can name it: the header clear below is scoped like the removal.
|
|
190
205
|
const cleared = await control(member, 'clear').catch(() => undefined);
|
|
191
206
|
if (cleared?.ok !== true && cleared?.absent !== true)
|
|
192
207
|
refused();
|
|
208
|
+
// A workspace header the removed key named must not outlive it; the next add names its own (or none).
|
|
209
|
+
if (o.provider !== undefined && LIVE_CATALOGS.includes(o.provider))
|
|
210
|
+
await ctx.setProviderHeaders(o.provider, null).catch(() => { throw new Error('The key could not be removed.'); });
|
|
193
211
|
await ctx.dropLane(member, o.provider);
|
|
194
212
|
});
|
|
195
213
|
},
|
package/dist/kit.d.ts
CHANGED
|
@@ -153,11 +153,14 @@ export declare class OpenClawKit {
|
|
|
153
153
|
removeAccount(member: Member, id: AccountId): Promise<void>;
|
|
154
154
|
defaults(member: Member): Promise<Defaults>;
|
|
155
155
|
setDefaults(member: Member, d: Defaults): Promise<void>;
|
|
156
|
-
/** Save an explicitly supplied API key (billed per use) in this member's separate key agent.
|
|
156
|
+
/** Save an explicitly supplied API key (billed per use) in this member's separate key agent.
|
|
157
|
+
* `orgId` names the workspace a Go plan login acts for (the pick the app captured at connect);
|
|
158
|
+
* it rides every probe and run as `x-opencode-org-id`, and replacing the key rewrites it. */
|
|
157
159
|
addKey(agentId: Member, o: {
|
|
158
160
|
authChoice: string;
|
|
159
161
|
apiKey: string;
|
|
160
162
|
model?: string;
|
|
163
|
+
orgId?: string;
|
|
161
164
|
}): AddKeyHandle;
|
|
162
165
|
private indexKeyLane;
|
|
163
166
|
/** Remove this member's saved key (the `byokit-key-<member>` lane: its credential store and ready marker), so
|
package/dist/kit.js
CHANGED
|
@@ -3,29 +3,29 @@ import { join } from 'node:path';
|
|
|
3
3
|
import { setTimeout as delay } from 'node:timers/promises';
|
|
4
4
|
import { isDeepStrictEqual } from 'node:util';
|
|
5
5
|
import { fileURLToPath } from 'node:url';
|
|
6
|
-
import { PROTOCOL_VERSION, LIVE_CATALOGS } from
|
|
7
|
-
import { atomic } from
|
|
8
|
-
import { Approvals } from
|
|
9
|
-
import { Bridge } from
|
|
10
|
-
import { Engine, refusedOnly } from
|
|
11
|
-
import { AuthStoreSealSizeError } from
|
|
12
|
-
import { gatewayTransport } from
|
|
13
|
-
import { createMembers } from
|
|
14
|
-
import { createAccounts, memberOfAccount } from
|
|
15
|
-
import { createLocks } from
|
|
16
|
-
import { keyAgentId, KEY_PREFIX, MEMBER_ID } from
|
|
17
|
-
import { confirmRetainedLogin as confirmLogin, migrateRetainedLogin as migrateLogin } from
|
|
18
|
-
import { createRuns, signedInProviders } from
|
|
19
|
-
import { authStatus, createAuthStatus } from
|
|
20
|
-
import { outputSchema } from
|
|
21
|
-
import { createKeys } from
|
|
22
|
-
import { routes as routeTable } from
|
|
23
|
-
import { providerOf } from
|
|
24
|
-
import { signIn as startSignIn, signOut as engineSignOut } from
|
|
25
|
-
import { reconcileConfig, browserToolPolicySafe, browserProfileAcknowledged, browserSessionMayRun, memoryLimited as configMemoryLimited, configKeyPath, readConfigKey, writeConfigKey } from
|
|
26
|
-
import { createBrowserHost } from
|
|
27
|
-
import { fileSignInStore } from
|
|
28
|
-
import { launchBroker } from
|
|
6
|
+
import { PROTOCOL_VERSION, LIVE_CATALOGS } from './constants.js';
|
|
7
|
+
import { atomic } from './engine-patches.js';
|
|
8
|
+
import { Approvals } from './approvals.js';
|
|
9
|
+
import { Bridge } from './bridge.js';
|
|
10
|
+
import { Engine, canonicalStateDir, refusedOnly } from './engine.js';
|
|
11
|
+
import { AuthStoreSealSizeError } from './auth-store.js';
|
|
12
|
+
import { gatewayTransport } from './transport.js';
|
|
13
|
+
import { createMembers } from './members.js';
|
|
14
|
+
import { createAccounts, memberOfAccount } from './accounts.js';
|
|
15
|
+
import { createLocks } from './locks.js';
|
|
16
|
+
import { keyAgentId, KEY_PREFIX, MEMBER_ID } from './members.js';
|
|
17
|
+
import { confirmRetainedLogin as confirmLogin, migrateRetainedLogin as migrateLogin } from './migrate.js';
|
|
18
|
+
import { createRuns, signedInProviders } from './runs.js';
|
|
19
|
+
import { authStatus, createAuthStatus } from './auth-status.js';
|
|
20
|
+
import { outputSchema } from './output.js';
|
|
21
|
+
import { createKeys } from './keys.js';
|
|
22
|
+
import { routes as routeTable } from './routes.js';
|
|
23
|
+
import { providerOf } from './pick.js';
|
|
24
|
+
import { signIn as startSignIn, signOut as engineSignOut } from './signin.js';
|
|
25
|
+
import { reconcileConfig, browserToolPolicySafe, browserProfileAcknowledged, browserSessionMayRun, memoryLimited as configMemoryLimited, configKeyPath, readConfigKey, writeConfigKey } from './config.js';
|
|
26
|
+
import { createBrowserHost } from './browser/host.js';
|
|
27
|
+
import { fileSignInStore } from './browser/store.js';
|
|
28
|
+
import { launchBroker } from './browser/broker.js';
|
|
29
29
|
/** The engine's learning-mode config key (5.6 "Engine learning state"). */
|
|
30
30
|
const LEARNING_KEY = 'skills.workshop.autonomous.mode';
|
|
31
31
|
const RESTART_MS = 60_000;
|
|
@@ -651,7 +651,7 @@ export class OpenClawKit {
|
|
|
651
651
|
|| (o.browser && ['browser', 'request_sign_in', 'exec', 'process', 'code_execution', 'terminal', 'read', 'write', 'edit', 'apply_patch', 'gateway'].includes(t.name)))
|
|
652
652
|
throw new Error(`invalid tool name: ${t.name}`);
|
|
653
653
|
}
|
|
654
|
-
this.o = o;
|
|
654
|
+
this.o = { ...o, stateDir: canonicalStateDir(o.stateDir) };
|
|
655
655
|
this.engine = new Engine({ ...o, pluginId: o.plugin?.id ?? 'byokit', tools: [...o.tools ?? [], ...(o.browser ? [{
|
|
656
656
|
name: 'request_sign_in', description: 'Ask the person to sign in to the current browser site.',
|
|
657
657
|
parameters: { type: 'object', additionalProperties: false, properties: {
|
|
@@ -671,7 +671,8 @@ export class OpenClawKit {
|
|
|
671
671
|
request: (method, params, options) => this.request()(method, params, options),
|
|
672
672
|
ensure: (member) => this.ensureMember(member),
|
|
673
673
|
authConfig: () => this.authSnapshot(),
|
|
674
|
-
restarted: (authBefore, signal) => this.restarted(authBefore, signal)
|
|
674
|
+
restarted: (authBefore, signal) => this.restarted(authBefore, signal),
|
|
675
|
+
setProviderHeaders: (provider, headers) => this.patchConfig({ models: { providers: { [provider]: { headers: headers ?? null } } } }) });
|
|
675
676
|
const slot = {};
|
|
676
677
|
this.approvalsCtl = new Approvals({
|
|
677
678
|
request: (method, params, co) => this.request()(method, params, co),
|
|
@@ -1068,7 +1069,9 @@ export class OpenClawKit {
|
|
|
1068
1069
|
return Promise.reject(new Error('gateway not ready'));
|
|
1069
1070
|
return this.accountsCtl.setDefaults(member, d);
|
|
1070
1071
|
}
|
|
1071
|
-
/** Save an explicitly supplied API key (billed per use) in this member's separate key agent.
|
|
1072
|
+
/** Save an explicitly supplied API key (billed per use) in this member's separate key agent.
|
|
1073
|
+
* `orgId` names the workspace a Go plan login acts for (the pick the app captured at connect);
|
|
1074
|
+
* it rides every probe and run as `x-opencode-org-id`, and replacing the key rewrites it. */
|
|
1072
1075
|
addKey(agentId, o) {
|
|
1073
1076
|
return this.keys.add(agentId, o);
|
|
1074
1077
|
}
|
package/dist/link.js
CHANGED
|
@@ -7,11 +7,11 @@ import { createServer } from 'node:http';
|
|
|
7
7
|
import { WebSocketServer } from 'ws';
|
|
8
8
|
import { PublicLinkError, } from '@byokit/pair';
|
|
9
9
|
import { reach } from '@byokit/discover';
|
|
10
|
-
import { ENGINE_VERSION } from
|
|
11
|
-
import { b64urlDecode, b64urlEncode, sealNotice } from
|
|
12
|
-
import { routeFor } from
|
|
13
|
-
import { outputSchema } from
|
|
14
|
-
import { stateWords, words } from
|
|
10
|
+
import { ENGINE_VERSION } from './constants.js';
|
|
11
|
+
import { b64urlDecode, b64urlEncode, sealNotice } from './notices.js';
|
|
12
|
+
import { routeFor } from './routes.js';
|
|
13
|
+
import { outputSchema } from './output.js';
|
|
14
|
+
import { stateWords, words } from './words.js';
|
|
15
15
|
const VIEW_OPS = new Set(['oc.state', 'oc.routes', 'oc.signin.view', 'oc.sessions', 'oc.approvals', 'oc.events',
|
|
16
16
|
'oc.browser.state', 'oc.browser.signins', 'oc.browser.thumb']);
|
|
17
17
|
// This kit's own version, read once from its package.json (beside src/ and dist/ alike).
|
package/dist/migrate.js
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
// only when the Gateway itself reports every provider signed in.
|
|
3
3
|
import { existsSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from 'node:fs';
|
|
4
4
|
import { join } from 'node:path';
|
|
5
|
-
import { retireArchive } from
|
|
6
|
-
import { MEMBER_ID } from
|
|
7
|
-
import { providers } from
|
|
5
|
+
import { retireArchive } from './auth-store.js';
|
|
6
|
+
import { MEMBER_ID } from './members.js';
|
|
7
|
+
import { providers } from './signin.js';
|
|
8
8
|
const MOVED = '.moved-to-engine';
|
|
9
9
|
const MARKER = '.canonicalized';
|
|
10
10
|
const TRY_MS = 1_500;
|
package/dist/pick.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { words } from
|
|
1
|
+
import { words } from './words.js';
|
|
2
2
|
const DAY_MS = 24 * 60 * 60 * 1000;
|
|
3
3
|
const finite = (n) => typeof n === 'number' && Number.isFinite(n);
|
|
4
4
|
/** The lowercased provider of a well-formed `provider/model` reference; undefined when the reference is malformed. */
|
package/dist/runs.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
// Runs: one Gateway run per spec, streamed through typed events, ending in a classified RunEnd (5.8, O8).
|
|
2
2
|
import { randomUUID } from 'node:crypto';
|
|
3
3
|
import { setTimeout as delay } from 'node:timers/promises';
|
|
4
|
-
import { authStatus } from
|
|
5
|
-
import { outputSchema } from
|
|
6
|
-
import { words } from
|
|
7
|
-
import { classify } from
|
|
8
|
-
import { providerOf } from
|
|
9
|
-
import { catalogModelOf, clampThinking, levelsOf } from
|
|
4
|
+
import { authStatus } from './auth-status.js';
|
|
5
|
+
import { outputSchema } from './output.js';
|
|
6
|
+
import { words } from './words.js';
|
|
7
|
+
import { classify } from './classify.js';
|
|
8
|
+
import { providerOf } from './pick.js';
|
|
9
|
+
import { catalogModelOf, clampThinking, levelsOf } from './thinking.js';
|
|
10
10
|
// The gateway gives up on a silent run after an hour; we wait ten minutes longer for the reply frame itself.
|
|
11
11
|
const WAIT_MS = 3_600_000;
|
|
12
12
|
const WAIT_CLIENT_MS = 3_610_000;
|
package/dist/signin.js
CHANGED
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
// sign-in; OAuth credentials stay in the engine/CLI. Explicit API keys go only to engine activation (D11).
|
|
3
3
|
import { randomUUID } from 'node:crypto';
|
|
4
4
|
import { createServer } from 'node:http';
|
|
5
|
-
import { activate, LATE_RESTART } from
|
|
6
|
-
import { authStatus } from
|
|
7
|
-
import { routes } from
|
|
8
|
-
import { signedInProviders } from
|
|
9
|
-
import { words } from
|
|
5
|
+
import { activate, LATE_RESTART } from './activation.js';
|
|
6
|
+
import { authStatus } from './auth-status.js';
|
|
7
|
+
import { routes } from './routes.js';
|
|
8
|
+
import { signedInProviders } from './runs.js';
|
|
9
|
+
import { words } from './words.js';
|
|
10
10
|
// The pin's wizard contract (2026.8.1): steps arrive only from `wizard.next` (wizard.status answers {status, error}
|
|
11
11
|
// and never carries a step), and one session at a time holds the gateway's single setup admission.
|
|
12
12
|
const BUSY = /setup is already in progress|SETUP_ADMISSION_BUSY/i;
|
package/dist/testing/browser.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { fixtureBrowserHost, secureOrigin } from
|
|
2
|
-
import { emptySignIns, validateSignIns } from
|
|
1
|
+
import { fixtureBrowserHost, secureOrigin } from '../browser/host.js';
|
|
2
|
+
import { emptySignIns, validateSignIns } from '../browser/store.js';
|
|
3
3
|
function channel() {
|
|
4
4
|
let pending;
|
|
5
5
|
let value;
|
package/dist/testing/contract.js
CHANGED
|
@@ -7,9 +7,9 @@
|
|
|
7
7
|
// and whose calls answer `note: <input.text>`. An optional model is a started model stub the kit was pointed at with `useModelStub`.
|
|
8
8
|
import { test } from 'node:test';
|
|
9
9
|
import assert from 'node:assert/strict';
|
|
10
|
-
import { PROTOCOL_VERSION } from
|
|
11
|
-
import { GATEWAY_CAPS } from
|
|
12
|
-
import { releaseStub, stubHolding } from
|
|
10
|
+
import { PROTOCOL_VERSION } from '../constants.js';
|
|
11
|
+
import { GATEWAY_CAPS } from '../transport.js';
|
|
12
|
+
import { releaseStub, stubHolding } from './model-stub.js';
|
|
13
13
|
/** The contract drives pass-through by method name, so results arrive untyped and are narrowed per case. */
|
|
14
14
|
const call = (kit, method, params) => kit.call(method, params);
|
|
15
15
|
const REQUIRED_METHODS = [
|
|
@@ -5,9 +5,9 @@ import { connect } from 'node:net';
|
|
|
5
5
|
import { createHash, randomUUID } from 'node:crypto';
|
|
6
6
|
import { readFileSync } from 'node:fs';
|
|
7
7
|
import { dirname, join } from 'node:path';
|
|
8
|
-
import { ENGINE_VERSION, PROTOCOL_VERSION } from
|
|
9
|
-
import { toolCalls } from
|
|
10
|
-
import { routes } from
|
|
8
|
+
import { ENGINE_VERSION, PROTOCOL_VERSION } from '../constants.js';
|
|
9
|
+
import { toolCalls } from './model-stub.js';
|
|
10
|
+
import { routes } from '../routes.js';
|
|
11
11
|
// The device-code script from Crewhouse's openclaw-wizard.test.ts, ported: the step, then progress, then done.
|
|
12
12
|
const DEVICE_STEP = {
|
|
13
13
|
id: 'step-device', type: 'note', executor: 'client',
|
|
@@ -40,7 +40,9 @@ const isPlainObject = (v) => typeof v === 'object' && v !== null && !Array.isArr
|
|
|
40
40
|
function mergeInto(target, patch) {
|
|
41
41
|
for (const [key, value] of Object.entries(patch)) {
|
|
42
42
|
const current = target[key];
|
|
43
|
-
if (
|
|
43
|
+
if (value === null)
|
|
44
|
+
delete target[key]; // JSON merge-patch: null deletes, as the engine's config.patch does.
|
|
45
|
+
else if (isPlainObject(current) && isPlainObject(value))
|
|
44
46
|
mergeInto(current, value);
|
|
45
47
|
else
|
|
46
48
|
target[key] = value;
|
package/dist/testing/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// The kit's fakes, contract suite and scripted model (5.11). Built in O7.
|
|
2
|
-
export { fakeGateway } from
|
|
3
|
-
export { fakeBrowserHost, createBrowserHostFake, browserHostContract, memorySignInStore } from
|
|
4
|
-
export { openclawContract } from
|
|
5
|
-
export { STUB_USAGE, startModelStub, useModelStub, releaseStub, stubHolding, toolCalls } from
|
|
2
|
+
export { fakeGateway } from './fake-gateway.js';
|
|
3
|
+
export { fakeBrowserHost, createBrowserHostFake, browserHostContract, memorySignInStore } from './browser.js';
|
|
4
|
+
export { openclawContract } from './contract.js';
|
|
5
|
+
export { STUB_USAGE, startModelStub, useModelStub, releaseStub, stubHolding, toolCalls } from './model-stub.js';
|
|
@@ -17,6 +17,7 @@ export type StubCall = {
|
|
|
17
17
|
path: string;
|
|
18
18
|
body: StubRequest;
|
|
19
19
|
session?: string;
|
|
20
|
+
org?: string;
|
|
20
21
|
};
|
|
21
22
|
/** The token usage every stub reply reports when asked (`stream_options.include_usage`), per model call. */
|
|
22
23
|
export declare const STUB_USAGE: {
|
|
@@ -45,6 +46,9 @@ export type ModelStubOptions = {
|
|
|
45
46
|
idPattern?: RegExp;
|
|
46
47
|
routingMarker?: string;
|
|
47
48
|
onCall?: (call: StubCall) => void;
|
|
49
|
+
/** The Go gateway's own rule, for tests that prove the workspace header: a Go-route request without
|
|
50
|
+
* `x-opencode-org-id` (or with another workspace's) is refused exactly as the real one refuses it. */
|
|
51
|
+
goWorkspace?: string;
|
|
48
52
|
};
|
|
49
53
|
export declare function startModelStub(script?: string[], o?: ModelStubOptions): Promise<ModelStub>;
|
|
50
54
|
export declare function useModelStub(kit: OpenClawKit, stub: ModelStub): Promise<void>;
|
|
@@ -78,9 +78,16 @@ export function startModelStub(script = [], o = {}) {
|
|
|
78
78
|
return;
|
|
79
79
|
}
|
|
80
80
|
const call = { authorization: String(req.headers.authorization ?? ''), path: req.url ?? '', body,
|
|
81
|
-
...(req.headers['x-opencode-session'] ? { session: String(req.headers['x-opencode-session']) } : {})
|
|
81
|
+
...(req.headers['x-opencode-session'] ? { session: String(req.headers['x-opencode-session']) } : {}),
|
|
82
|
+
...(req.headers['x-opencode-org-id'] ? { org: String(req.headers['x-opencode-org-id']) } : {}) };
|
|
82
83
|
calls.push(call);
|
|
83
84
|
o.onCall?.(call); // Fixture evidence is persisted before any response/hold awaits.
|
|
85
|
+
if (o.goWorkspace !== undefined && call.path.startsWith('/zen/go/')) {
|
|
86
|
+
if (call.org !== o.goWorkspace) {
|
|
87
|
+
res.writeHead(403, { 'content-type': 'application/json' });
|
|
88
|
+
return res.end(JSON.stringify({ type: 'error', error: { type: 'permission_error', message: 'Workspace selection is required' } }));
|
|
89
|
+
}
|
|
90
|
+
}
|
|
84
91
|
if (req.url === '/api/embed' || req.url === '/api/embeddings') {
|
|
85
92
|
res.writeHead(200, { 'content-type': 'application/json' });
|
|
86
93
|
return res.end(JSON.stringify({
|
package/dist/transport.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ import type { GatewayTransport } from './types.ts';
|
|
|
3
3
|
* Client caps for the operator connection. `approvals` makes this connection an approval client, so the
|
|
4
4
|
* engine delivers exec/plugin.approval.requested to it (B7); without it the broadcast set is empty.
|
|
5
5
|
*/
|
|
6
|
-
export declare const GATEWAY_CAPS: readonly [
|
|
6
|
+
export declare const GATEWAY_CAPS: readonly ['tool-events', 'approvals'];
|
|
7
7
|
/**
|
|
8
8
|
* Read the device key pair from `device.json`. The kit writes `{ privateKey, publicKey }` (PEM strings);
|
|
9
9
|
* existing Crewhouse state carries `{ deviceId, publicKeyPem, privateKeyPem }` instead. Both shapes are
|
package/dist/transport.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createHash, createPrivateKey, createPublicKey, sign } from 'node:crypto';
|
|
2
2
|
import { readFileSync } from 'node:fs';
|
|
3
3
|
import { GatewayClient } from '@openclaw/gateway-client';
|
|
4
|
-
import { OPERATOR_SCOPES, PROTOCOL_VERSION } from
|
|
4
|
+
import { OPERATOR_SCOPES, PROTOCOL_VERSION } from './constants.js';
|
|
5
5
|
/**
|
|
6
6
|
* Client caps for the operator connection. `approvals` makes this connection an approval client, so the
|
|
7
7
|
* engine delivers exec/plugin.approval.requested to it (B7); without it the broadcast set is empty.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@byokit/openclaw",
|
|
3
|
-
"version": "0.14.
|
|
3
|
+
"version": "0.14.2",
|
|
4
4
|
"description": "The OpenClaw runtime kit: the pinned engine's full operator surface with plain-words helpers for members, sign-in, runs and approvals.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
@@ -60,10 +60,10 @@
|
|
|
60
60
|
"prepack": "tsc -b && node ../../scripts/fix-words-dts.cjs"
|
|
61
61
|
},
|
|
62
62
|
"dependencies": {
|
|
63
|
-
"@byokit/accounts": "0.
|
|
64
|
-
"@byokit/pair": "0.10.
|
|
65
|
-
"@byokit/relay": "0.
|
|
66
|
-
"@byokit/discover": "0.8.
|
|
63
|
+
"@byokit/accounts": "0.24.1",
|
|
64
|
+
"@byokit/pair": "0.10.1",
|
|
65
|
+
"@byokit/relay": "0.7.1",
|
|
66
|
+
"@byokit/discover": "0.8.2",
|
|
67
67
|
"@byokit/seal": "0.3.0",
|
|
68
68
|
"@byokit/secrets": "0.5.1",
|
|
69
69
|
"@openclaw/gateway-client": "2026.8.35",
|
|
@@ -71,7 +71,7 @@
|
|
|
71
71
|
"ws": "8.22.0"
|
|
72
72
|
},
|
|
73
73
|
"devDependencies": {
|
|
74
|
-
"@byokit/ui": "0.
|
|
74
|
+
"@byokit/ui": "0.8.0"
|
|
75
75
|
},
|
|
76
76
|
"publishConfig": {
|
|
77
77
|
"access": "public"
|