@uxnan/shared 0.0.16-alpha.20260919 → 0.0.18-alpha.20260926

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/README.md +6 -3
  2. package/agent-locations.json +82 -0
  3. package/dist/src/agents/agent-adapter.d.ts +16 -1
  4. package/dist/src/agents/agent-capabilities.d.ts +19 -4
  5. package/dist/src/agents/agent-locations.d.ts +61 -0
  6. package/dist/src/agents/agent-locations.js +124 -0
  7. package/dist/src/agents/agent-locations.js.map +1 -0
  8. package/dist/src/index.d.ts +4 -0
  9. package/dist/src/index.js +5 -0
  10. package/dist/src/index.js.map +1 -1
  11. package/dist/src/jsonrpc/method-registry.d.ts +1 -1
  12. package/dist/src/jsonrpc/method-registry.js +13 -0
  13. package/dist/src/jsonrpc/method-registry.js.map +1 -1
  14. package/dist/src/jsonrpc/methods.d.ts +81 -23
  15. package/dist/src/jsonrpc/notifications.d.ts +136 -35
  16. package/dist/src/jsonrpc/notifications.js +30 -7
  17. package/dist/src/jsonrpc/notifications.js.map +1 -1
  18. package/dist/src/local-control/local-control.d.ts +149 -0
  19. package/dist/src/local-control/local-control.js +82 -0
  20. package/dist/src/local-control/local-control.js.map +1 -0
  21. package/dist/src/models/project.d.ts +40 -1
  22. package/dist/src/models/project.js +5 -0
  23. package/dist/src/models/project.js.map +1 -1
  24. package/dist/src/models/session.d.ts +90 -2
  25. package/dist/src/models/session.js +0 -5
  26. package/dist/src/models/session.js.map +1 -1
  27. package/dist/src/models/sync.d.ts +88 -0
  28. package/dist/src/models/sync.js +2 -0
  29. package/dist/src/models/sync.js.map +1 -0
  30. package/dist/src/models/thread.d.ts +31 -13
  31. package/dist/src/models/tool.d.ts +68 -0
  32. package/dist/src/models/tool.js +11 -0
  33. package/dist/src/models/tool.js.map +1 -0
  34. package/package.json +3 -2
package/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  ![TypeScript](https://img.shields.io/badge/TypeScript-ESM-3178C6?style=for-the-badge&logo=typescript&logoColor=white)
4
4
  ![Node.js](https://img.shields.io/badge/Node.js-%E2%89%A518-339933?style=for-the-badge&logo=nodedotjs&logoColor=white)
5
5
  ![JSON Schema](https://img.shields.io/badge/validation-Ajv-000000?style=for-the-badge&logo=json&logoColor=white)
6
- ![Contracts](https://img.shields.io/badge/70_methods_%7C_12_notifications-blue?style=for-the-badge)
6
+ ![Contracts](https://img.shields.io/badge/81_methods_%7C_21_notifications-blue?style=for-the-badge)
7
7
 
8
8
  Shared JSON-RPC and E2EE contracts for the [Uxnan](../README.md) ecosystem — the
9
9
  single source of truth every component agrees on. Consumed as a local workspace
@@ -13,7 +13,7 @@ equivalents (see
13
13
  [`architecture/02b-contracts-and-requirements.md`](../architecture/02b-contracts-and-requirements.md)
14
14
  §1 for the canonical contract list).
15
15
 
16
- > **Status:** implemented and stable — **70 JSON-RPC methods** + **12 streaming
16
+ > **Status:** implemented and stable — **81 JSON-RPC methods** + **21 streaming
17
17
  > notifications**, kept lock-step at build time with the `METHOD_NAMES` array and
18
18
  > the `StreamNotification` enum (a compile-time assertion in
19
19
  > `src/jsonrpc/method-registry.ts` fails the build on any drift). Changes are
@@ -50,7 +50,10 @@ flowchart TB
50
50
  | Area | Exports |
51
51
  |---|---|
52
52
  | JSON-RPC | envelope types + constructors (`makeRequest`, `makeNotification`, `makeResponse`, `makeErrorResponse`), error codes (`JsonRpcErrorCode` + Uxnan-specific `-32000..-32009`), `RpcError`, typed method registry (`JsonRpcMethodRegistry` + `METHOD_NAMES`), `isKnownMethod` |
53
- | Streaming | `StreamNotification` enum + param types (`TurnStartedParams`, `MessageDeltaParams`, `ThinkingDeltaParams`, `ContentBlockParams`, `TurnCompletedParams`, `TurnUsage`, `TurnErrorParams`, `TurnAbortedParams`, `ModelResolvedParams`) |
53
+ | Streaming | `StreamNotification` enum + param types (`TurnStartedParams`, `MessageDeltaParams`, `ThinkingDeltaParams`, `ContentBlockParams`, `TurnCompletedParams`, `TurnUsage`, `TurnErrorParams`, `TurnAbortedParams`, `ModelResolvedParams`, and the multi-client set: `ThreadUpdatedParams`, `ThreadDeletedParams`, `TurnCreatedParams`, `ApprovalResolvedParams`, `QuestionResolvedParams`) |
54
+ | Local control | the loopback channel Uxnan Desktop uses on the bridge's machine: `LOCAL_CONTROL_FILE` / `LOCAL_CONTROL_PATH`, `LocalControlDiscovery`, the `LocalControlFrame` union (`hello` + `message`), `isValidLocalClientId`, `localReceiverId` (architecture/02a §5.8.15) |
55
+ | Replica sync | `sync/changes` (`SyncChanges`: revisioned threads, projects, settings, deletions, presence), `BridgeSettings { home }`, `ClientPresence`, `Project` registry fields, `Turn.seq`, `Thread.origin` (`src/models/sync.ts`, architecture/02a §5.8.17) |
56
+ | Agent locations | `agent-locations.json` (package root) + `locateAgent` / `agentLocation`: where every agent CLI installs — the one table the bridge and Uxnan Desktop resolve from |
54
57
  | E2EE | handshake messages (`clientHello` / `serverHello` / `clientAuth` / `ready`), `buildHandshakeTranscript`, `SecureEnvelope`, `PairingPayload` v2 (`relay` optional + `hosts: string[]`) with `Base64(utf8(JSON))` QR encoding |
55
58
  | Models | thread / turn / message (with `MessageContent` polymorphic blocks), durable `CompactionContentBlock` and `AssistantResponseBoundaryBlock`, git, workspace (incl. `browseDirs` + `exists`), project, auth, session/trust (`BridgeStatus` incl. `latestVersion?`/`updateAvailable?`), bridge-owned profile metrics (complete-ledger export/import), approval, question (interactive multiple-choice) |
56
59
  | Agents | `IAgentAdapter` (with `respondApproval`, `listModels`, `nativeSessionId`, `SendTurnOptions { threadId, turnId, text, service?, effort?, options?, attachments?, cwd?, accessMode? }`), `AgentModel` (incl. `version?`, `isDefault?`, `options?`, `contextWindow?`, `isLatestAlias?`), `AgentCapabilities` (incl. `images`, `approvals`, `reportsContextUsage`, `reportsCompaction`), `AgentDescriptor.deprecated`, `AgentConfig` (cwd, agentId, model, plus optional `binaryPath`/`extraArgs`) |
@@ -0,0 +1,82 @@
1
+ {
2
+ "$comment": "Where each coding-agent CLI Uxnan drives is installed — the ONE table the bridge (shared/src/agents/agent-locations.ts) and Uxnan Desktop (uxnandesktop/src-tauri/src/agentcli.rs, include_str!) both resolve from, so the phone, the desktop's chat and its terminals agree on what is installed. Tokens: '~' = the user's home, '%APPDATA%' / '%LOCALAPPDATA%' / '%PROGRAMFILES%' = those Windows folders, '$NODE_PREFIX' = the install prefix of the node running the resolver (covers nvm, fnm, volta, Homebrew and any custom npm prefix: global packages live under it). Resolution order per agent: native candidates, then the npm entry under each npm root (run as 'node <entry>'), then the command on PATH (POSIX; on Windows only a real executable counts). architecture/02a §5.8.17.",
3
+ "npmRoots": {
4
+ "posix": [
5
+ "$NODE_PREFIX/lib/node_modules",
6
+ "/usr/local/lib/node_modules",
7
+ "/opt/homebrew/lib/node_modules",
8
+ "~/.npm-global/lib/node_modules"
9
+ ],
10
+ "win32": ["$NODE_PREFIX/node_modules", "%APPDATA%/npm/node_modules"]
11
+ },
12
+ "pathDirs": {
13
+ "posix": [
14
+ "/opt/homebrew/bin",
15
+ "/opt/homebrew/sbin",
16
+ "/usr/local/bin",
17
+ "/usr/local/sbin",
18
+ "~/.local/bin",
19
+ "~/.npm-global/bin",
20
+ "~/.cargo/bin",
21
+ "~/.bun/bin",
22
+ "~/.deno/bin",
23
+ "~/.grok/bin"
24
+ ],
25
+ "win32": []
26
+ },
27
+ "agents": [
28
+ {
29
+ "bridgeId": "claude-code",
30
+ "desktopId": "claude",
31
+ "command": "claude",
32
+ "native": { "posix": ["~/.local/bin/claude"], "win32": ["~/.local/bin/claude.exe"] },
33
+ "npmEntry": "@anthropic-ai/claude-code/cli.js"
34
+ },
35
+ {
36
+ "bridgeId": "codex",
37
+ "desktopId": "codex",
38
+ "command": "codex",
39
+ "npmEntry": "@openai/codex/bin/codex.js"
40
+ },
41
+ {
42
+ "bridgeId": "opencode",
43
+ "desktopId": "opencode",
44
+ "command": "opencode",
45
+ "native": {
46
+ "posix": [],
47
+ "win32": [
48
+ "%APPDATA%/npm/node_modules/opencode-ai/bin/opencode.exe",
49
+ "%PROGRAMFILES%/opencode/opencode.exe",
50
+ "%LOCALAPPDATA%/opencode/opencode.exe"
51
+ ]
52
+ }
53
+ },
54
+ {
55
+ "bridgeId": "pi-agent",
56
+ "desktopId": "pi",
57
+ "command": "pi",
58
+ "npmEntry": "@earendil-works/pi-coding-agent/dist/cli.js"
59
+ },
60
+ {
61
+ "bridgeId": "antigravity-cli",
62
+ "desktopId": "agy",
63
+ "command": "agy",
64
+ "native": {
65
+ "posix": ["~/.local/bin/agy", "~/agy/bin/agy", "/usr/local/bin/agy", "/opt/homebrew/bin/agy"],
66
+ "win32": ["%LOCALAPPDATA%/agy/bin/agy.exe"]
67
+ }
68
+ },
69
+ {
70
+ "bridgeId": "grok",
71
+ "desktopId": "grok",
72
+ "command": "grok",
73
+ "native": { "posix": ["~/.grok/bin/grok"], "win32": ["~/.grok/bin/grok.exe"] }
74
+ },
75
+ {
76
+ "bridgeId": "zero",
77
+ "desktopId": "zero",
78
+ "command": "zero",
79
+ "npmEntry": "@gitlawb/zero/bin/zero.js"
80
+ }
81
+ ]
82
+ }
@@ -61,6 +61,20 @@ export interface SendTurnOptions {
61
61
  * per-command handling. Absent for an ordinary text turn.
62
62
  */
63
63
  command?: AgentCommandInvocation;
64
+ /**
65
+ * Uxnan Desktop's tools, when the desktop attached them (`desktop/attach`):
66
+ * its MCP endpoint and the bearer token for bridge-run agents. An adapter that
67
+ * can register an MCP server for one run does so under
68
+ * {@link DESKTOP_MCP_SERVER_NAME}, passing the token only through the
69
+ * environment and the conversation's `cwd` in {@link DESKTOP_CWD_HEADER}.
70
+ * Absent when no desktop is attached.
71
+ */
72
+ desktopTools?: DesktopTools;
73
+ }
74
+ /** What `desktop/attach` gave the bridge (see {@link SendTurnOptions.desktopTools}). */
75
+ export interface DesktopTools {
76
+ mcpUrl: string;
77
+ token: string;
64
78
  }
65
79
  /** Input for {@link IAgentAdapter.generateTitle}. */
66
80
  export interface GenerateTitleOptions {
@@ -110,7 +124,8 @@ export interface IAgentAdapter {
110
124
  * `activeTurnId` is the bridge turn currently in flight on the thread, so the
111
125
  * adapter can address the right run (and refuse if it has already moved on).
112
126
  * `turnId` is the queued turn the text came from — it does NOT start a run of
113
- * its own; it exists so the bridge can mark it `delivered`.
127
+ * its own: the bridge makes it the turn that carries the rest of this run,
128
+ * and keeps naming the run by `activeTurnId` in every call to the adapter.
114
129
  *
115
130
  * Returns **true only when the agent actually took the message**. Return
116
131
  * `false` (don't throw) for an ordinary "too late / not applicable" — the
@@ -56,7 +56,8 @@ export interface AgentCapabilities {
56
56
  * making it wait for the next one — what a CLI does when you type while it
57
57
  * works and it picks the message up at the next tool boundary. The bridge
58
58
  * hands such a turn straight to the adapter (`IAgentAdapter.steerTurn`)
59
- * rather than holding it, and marks it `delivered` (see `TurnStatus`).
59
+ * rather than holding it; the turn that was answering ends there and the new
60
+ * one carries the rest of the agent's run (architecture/02a §5.8.13).
60
61
  *
61
62
  * Optional; absent/false means the agent has no input channel mid-turn (a
62
63
  * one-shot CLI, or a protocol that serializes prompts per session), and its
@@ -83,6 +84,18 @@ export interface AgentDescriptor {
83
84
  /** Default model the bridge will use when the phone does not pick one. */
84
85
  defaultModel?: string;
85
86
  }
87
+ /**
88
+ * How the bridge found — or failed to find — one agent's CLI, so a client can
89
+ * say *why* an installed agent shows as unavailable instead of guessing.
90
+ */
91
+ export interface AgentDiagnosis {
92
+ agentId: AgentId;
93
+ available: boolean;
94
+ /** The command the bridge runs for it (the executable, then any fixed args). */
95
+ command?: string[];
96
+ /** Every location checked, in order (files, and `PATH:<dir>` for PATH entries). */
97
+ checked: string[];
98
+ }
86
99
  /** One selectable value of an {@link AgentModelOption} of kind `enum`. */
87
100
  export interface AgentModelOptionValue {
88
101
  /** Value sent back in `turn/send` `options` when chosen. */
@@ -185,10 +198,12 @@ export interface AgentCommand {
185
198
  argumentHint?: string;
186
199
  /**
187
200
  * Where the command comes from: `acp` (advertised by an ACP agent),
188
- * `builtin` (a CLI control command reachable headless), or `custom` (a
189
- * user-defined prompt-template file the bridge expands).
201
+ * `builtin` (one of the CLI's own commands, reachable headless), `custom` (a
202
+ * user-defined command or prompt template), or `skill` (an agent skill the
203
+ * CLI invokes by name). A client may group by it; an unknown value is to be
204
+ * shown as `custom`.
190
205
  */
191
- source: 'acp' | 'builtin' | 'custom';
206
+ source: 'acp' | 'builtin' | 'custom' | 'skill';
192
207
  /**
193
208
  * Whether the command actually runs in the agent's headless/programmatic mode.
194
209
  * Absent/true means yes; `false` marks a command that only works in the CLI's
@@ -0,0 +1,61 @@
1
+ export interface AgentLocation {
2
+ /** The bridge's `AgentId`. */
3
+ bridgeId: string;
4
+ /** Uxnan Desktop's backend id (`agentcli::SUPPORTED`). */
5
+ desktopId: string;
6
+ /** The launcher name on PATH. */
7
+ command: string;
8
+ /** Native executables, checked first, by platform family. */
9
+ native?: {
10
+ posix: string[];
11
+ win32: string[];
12
+ };
13
+ /** The npm package's JS entry, relative to an npm root (run as `node <entry>`). */
14
+ npmEntry?: string;
15
+ }
16
+ export interface AgentLocationTable {
17
+ npmRoots: {
18
+ posix: string[];
19
+ win32: string[];
20
+ };
21
+ /** Folders a login PATH normally has that a service's PATH lacks. */
22
+ pathDirs: {
23
+ posix: string[];
24
+ win32: string[];
25
+ };
26
+ agents: AgentLocation[];
27
+ }
28
+ /** The shared table (read once from `agent-locations.json`). */
29
+ export declare function agentLocationTable(): AgentLocationTable;
30
+ /** The table entry for a bridge agent id, if Uxnan knows where it installs. */
31
+ export declare function agentLocation(bridgeId: string): AgentLocation | undefined;
32
+ export interface LocateEnvironment {
33
+ platform: NodeJS.Platform;
34
+ env: NodeJS.ProcessEnv;
35
+ home: string;
36
+ /** The node executable that would run an npm entry. */
37
+ nodePath: string;
38
+ /** Replaces the table's npm roots (tests, which must not see this machine's). */
39
+ npmRoots?: string[];
40
+ }
41
+ export declare function currentLocateEnvironment(): LocateEnvironment;
42
+ /**
43
+ * Expand the table's tokens for this machine; `undefined` when a token names
44
+ * a folder this machine does not have (e.g. `%APPDATA%` off Windows).
45
+ */
46
+ export declare function expandLocation(path: string, where: LocateEnvironment): string | undefined;
47
+ export interface LocatedAgent {
48
+ /** What to spawn: the native binary, node (for an npm entry), or the launcher. */
49
+ binaryPath: string;
50
+ /** Args before the agent's own (`[entry.js]` for an npm entry). */
51
+ prependArgs: string[];
52
+ available: boolean;
53
+ /** Every location checked, in order (`PATH:<dir>` for PATH entries). */
54
+ checked: string[];
55
+ }
56
+ /**
57
+ * Find [location]'s CLI on this machine. [configured] (a user's explicit path)
58
+ * always wins. On Windows a PATH hit counts only when it is a real executable
59
+ * (`.exe`/`.com`): an npm `.cmd` shim cannot be spawned without a shell.
60
+ */
61
+ export declare function locateAgent(location: AgentLocation, configured?: string, where?: LocateEnvironment): LocatedAgent;
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Where the coding-agent CLIs are installed, and how to find one — the single
3
+ * rule the bridge and Uxnan Desktop share (architecture/02a §5.8.17).
4
+ *
5
+ * The table itself is `agent-locations.json` at this package's root: the
6
+ * desktop compiles the same file into its Rust resolver (`include_str!`), so
7
+ * the phone, the desktop's chat and the desktop's terminals can never disagree
8
+ * about which agents are installed — the disagreement the maintainer hit when
9
+ * the chat offered agents the desktop knew were missing, and missed ones it
10
+ * knew were there.
11
+ */
12
+ import { existsSync, readFileSync, statSync } from 'node:fs';
13
+ import { homedir } from 'node:os';
14
+ import { delimiter, dirname, join } from 'node:path';
15
+ let table;
16
+ /** The shared table (read once from `agent-locations.json`). */
17
+ export function agentLocationTable() {
18
+ // dist/src/agents/agent-locations.js → the package root holds the JSON.
19
+ table ??= JSON.parse(readFileSync(new URL('../../../agent-locations.json', import.meta.url), 'utf-8'));
20
+ return table;
21
+ }
22
+ /** The table entry for a bridge agent id, if Uxnan knows where it installs. */
23
+ export function agentLocation(bridgeId) {
24
+ return agentLocationTable().agents.find((a) => a.bridgeId === bridgeId);
25
+ }
26
+ export function currentLocateEnvironment() {
27
+ return {
28
+ platform: process.platform,
29
+ env: process.env,
30
+ home: homedir(),
31
+ nodePath: process.execPath,
32
+ };
33
+ }
34
+ /**
35
+ * Expand the table's tokens for this machine; `undefined` when a token names
36
+ * a folder this machine does not have (e.g. `%APPDATA%` off Windows).
37
+ */
38
+ export function expandLocation(path, where) {
39
+ let out = path;
40
+ if (out === '~' || out.startsWith('~/'))
41
+ out = join(where.home, out.slice(1));
42
+ const prefix = nodePrefix(where);
43
+ out = out.replace('$NODE_PREFIX', prefix);
44
+ const winVars = {
45
+ '%APPDATA%': where.env['APPDATA'],
46
+ '%LOCALAPPDATA%': where.env['LOCALAPPDATA'],
47
+ '%PROGRAMFILES%': where.env['ProgramFiles'],
48
+ };
49
+ for (const [token, value] of Object.entries(winVars)) {
50
+ if (!out.includes(token))
51
+ continue;
52
+ if (!value)
53
+ return undefined;
54
+ out = out.replace(token, value);
55
+ }
56
+ return join(out);
57
+ }
58
+ /**
59
+ * The prefix global npm packages of [where.nodePath] live under: `<prefix>/lib/
60
+ * node_modules` on POSIX (`<prefix>/bin/node`), `<prefix>/node_modules` on
61
+ * Windows (`<prefix>\node.exe`).
62
+ */
63
+ function nodePrefix(where) {
64
+ const bin = dirname(where.nodePath);
65
+ return where.platform === 'win32' ? bin : dirname(bin);
66
+ }
67
+ function isFile(path) {
68
+ try {
69
+ return existsSync(path) && statSync(path).isFile();
70
+ }
71
+ catch {
72
+ return false;
73
+ }
74
+ }
75
+ /**
76
+ * Find [location]'s CLI on this machine. [configured] (a user's explicit path)
77
+ * always wins. On Windows a PATH hit counts only when it is a real executable
78
+ * (`.exe`/`.com`): an npm `.cmd` shim cannot be spawned without a shell.
79
+ */
80
+ export function locateAgent(location, configured, where = currentLocateEnvironment()) {
81
+ const checked = [];
82
+ if (configured && configured.length > 0) {
83
+ checked.push(configured);
84
+ return { binaryPath: configured, prependArgs: [], available: isFile(configured), checked };
85
+ }
86
+ const family = where.platform === 'win32' ? 'win32' : 'posix';
87
+ for (const raw of location.native?.[family] ?? []) {
88
+ const path = expandLocation(raw, where);
89
+ if (!path)
90
+ continue;
91
+ checked.push(path);
92
+ if (isFile(path))
93
+ return { binaryPath: path, prependArgs: [], available: true, checked };
94
+ }
95
+ if (location.npmEntry) {
96
+ for (const raw of where.npmRoots ?? agentLocationTable().npmRoots[family]) {
97
+ const root = expandLocation(raw, where);
98
+ if (!root)
99
+ continue;
100
+ const entry = join(root, location.npmEntry);
101
+ checked.push(entry);
102
+ if (isFile(entry)) {
103
+ return { binaryPath: where.nodePath, prependArgs: [entry], available: true, checked };
104
+ }
105
+ }
106
+ }
107
+ const names = where.platform === 'win32'
108
+ ? [`${location.command}.exe`, `${location.command}.com`]
109
+ : [location.command];
110
+ const rawPath = where.env['PATH'] ?? where.env['Path'] ?? '';
111
+ for (const dir of rawPath.split(where.platform === 'win32' ? ';' : delimiter)) {
112
+ if (!dir)
113
+ continue;
114
+ checked.push(`PATH:${dir}`);
115
+ for (const name of names) {
116
+ const candidate = join(dir, name);
117
+ if (isFile(candidate)) {
118
+ return { binaryPath: candidate, prependArgs: [], available: true, checked };
119
+ }
120
+ }
121
+ }
122
+ return { binaryPath: location.command, prependArgs: [], available: false, checked };
123
+ }
124
+ //# sourceMappingURL=agent-locations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-locations.js","sourceRoot":"","sources":["../../../src/agents/agent-locations.ts"],"names":[],"mappings":"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"}
@@ -14,17 +14,21 @@ export * from './e2ee/pairing-payload.js';
14
14
  export * from './agents/agent-capabilities.js';
15
15
  export * from './agents/agent-config.js';
16
16
  export * from './agents/agent-adapter.js';
17
+ export * from './agents/agent-locations.js';
18
+ export * from './local-control/local-control.js';
17
19
  export * from './version/compare.js';
18
20
  export * from './notifications/push-payload.js';
19
21
  export * from './models/thread.js';
20
22
  export * from './models/git.js';
21
23
  export * from './models/workspace.js';
22
24
  export * from './models/project.js';
25
+ export * from './models/sync.js';
23
26
  export * from './models/session.js';
24
27
  export * from './models/approval.js';
25
28
  export * from './models/question.js';
26
29
  export * from './models/compaction.js';
27
30
  export * from './models/assistant-response.js';
31
+ export * from './models/tool.js';
28
32
  export * from './models/usage.js';
29
33
  export * from './models/metrics.js';
30
34
  export * from './validators/validate.js';
package/dist/src/index.js CHANGED
@@ -17,6 +17,9 @@ export * from './e2ee/pairing-payload.js';
17
17
  export * from './agents/agent-capabilities.js';
18
18
  export * from './agents/agent-config.js';
19
19
  export * from './agents/agent-adapter.js';
20
+ export * from './agents/agent-locations.js';
21
+ // Local control channel (desktop ↔ bridge on the same machine)
22
+ export * from './local-control/local-control.js';
20
23
  // Version
21
24
  export * from './version/compare.js';
22
25
  // Notifications
@@ -26,11 +29,13 @@ export * from './models/thread.js';
26
29
  export * from './models/git.js';
27
30
  export * from './models/workspace.js';
28
31
  export * from './models/project.js';
32
+ export * from './models/sync.js';
29
33
  export * from './models/session.js';
30
34
  export * from './models/approval.js';
31
35
  export * from './models/question.js';
32
36
  export * from './models/compaction.js';
33
37
  export * from './models/assistant-response.js';
38
+ export * from './models/tool.js';
34
39
  export * from './models/usage.js';
35
40
  export * from './models/metrics.js';
36
41
  // Validators
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,gBAAgB,CAAC;AAE/B,WAAW;AACX,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,4BAA4B,CAAC;AAE3C,OAAO;AACP,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAE1C,SAAS;AACT,cAAc,gCAAgC,CAAC;AAC/C,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAE1C,UAAU;AACV,cAAc,sBAAsB,CAAC;AAErC,gBAAgB;AAChB,cAAc,iCAAiC,CAAC;AAEhD,SAAS;AACT,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AAEpC,aAAa;AACb,cAAc,0BAA0B,CAAC;AACzC,cAAc,qCAAqC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,gBAAgB,CAAC;AAE/B,WAAW;AACX,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,4BAA4B,CAAC;AAE3C,OAAO;AACP,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAE1C,SAAS;AACT,cAAc,gCAAgC,CAAC;AAC/C,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAE5C,+DAA+D;AAC/D,cAAc,kCAAkC,CAAC;AAEjD,UAAU;AACV,cAAc,sBAAsB,CAAC;AAErC,gBAAgB;AAChB,cAAc,iCAAiC,CAAC;AAEhD,SAAS;AACT,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AAEpC,aAAa;AACb,cAAc,0BAA0B,CAAC;AACzC,cAAc,qCAAqC,CAAC"}
@@ -3,5 +3,5 @@
3
3
  * compile-time {@link JsonRpcMethodRegistry} via the assertion below.
4
4
  */
5
5
  import type { JsonRpcMethodName } from './methods.js';
6
- export declare const METHOD_NAMES: readonly ["thread/list", "thread/read", "thread/start", "thread/resume", "thread/fork", "thread/setModel", "thread/rename", "thread/setAccessMode", "thread/archive", "thread/unarchive", "thread/delete", "turn/list", "turn/read", "turn/send", "turn/cancel", "queue/resume", "queue/clear", "git/status", "git/diff", "git/commit", "git/push", "git/pull", "git/checkout", "git/createBranch", "git/createWorktree", "git/stage", "git/unstage", "git/discard", "git/createPr", "git/undoCommit", "git/branches", "git/switchBranch", "git/revert", "git/deleteBranch", "git/removeWorktree", "git/worktrees", "git/log", "git/commitShow", "workspace/readFile", "workspace/readImage", "workspace/list", "workspace/searchFiles", "workspace/resolveFileLink", "workspace/browseDirs", "workspace/checkpoint", "workspace/diffCheckpoint", "workspace/applyCheckpoint", "workspace/applyPatch", "workspace/exists", "project/list", "project/resolve", "agent/list", "agent/models", "agent/commands", "agent/usageStats", "metrics/get", "metrics/export", "metrics/import", "auth/status", "auth/login", "auth/logout", "notifications/register", "notifications/update", "notifications/unregister", "bridge/status", "bridge/generatePairingQr", "bridge/connectedPhones", "bridge/disconnectPhone", "bridge/trustedDevices", "bridge/removeTrustedDevice"];
6
+ export declare const METHOD_NAMES: readonly ["thread/list", "thread/read", "thread/start", "thread/resume", "thread/fork", "thread/setModel", "thread/rename", "thread/setAccessMode", "thread/archive", "thread/unarchive", "thread/delete", "turn/list", "turn/read", "turn/send", "turn/cancel", "queue/resume", "queue/clear", "git/status", "git/diff", "git/commit", "git/push", "git/pull", "git/checkout", "git/createBranch", "git/createWorktree", "git/stage", "git/unstage", "git/discard", "git/createPr", "git/undoCommit", "git/branches", "git/switchBranch", "git/revert", "git/deleteBranch", "git/removeWorktree", "git/worktrees", "git/log", "git/commitShow", "workspace/readFile", "workspace/readImage", "workspace/list", "workspace/searchFiles", "workspace/resolveFileLink", "workspace/browseDirs", "workspace/checkpoint", "workspace/diffCheckpoint", "workspace/applyCheckpoint", "workspace/applyPatch", "workspace/exists", "project/list", "project/resolve", "project/add", "project/remove", "project/rename", "sync/changes", "settings/get", "settings/set", "device/describe", "device/rename", "agent/list", "agent/models", "agent/commands", "agent/usageStats", "agent/doctor", "metrics/get", "metrics/export", "metrics/import", "auth/status", "auth/login", "auth/logout", "notifications/register", "notifications/update", "notifications/unregister", "bridge/status", "bridge/generatePairingQr", "bridge/connectedPhones", "bridge/disconnectPhone", "bridge/trustedDevices", "bridge/removeTrustedDevice", "desktop/attach", "desktop/detach"];
7
7
  export declare function isKnownMethod(method: string): method is JsonRpcMethodName;
@@ -55,11 +55,21 @@ export const METHOD_NAMES = [
55
55
  // Projects
56
56
  'project/list',
57
57
  'project/resolve',
58
+ 'project/add',
59
+ 'project/remove',
60
+ 'project/rename',
61
+ // Replica sync and shared settings
62
+ 'sync/changes',
63
+ 'settings/get',
64
+ 'settings/set',
65
+ 'device/describe',
66
+ 'device/rename',
58
67
  // Agents
59
68
  'agent/list',
60
69
  'agent/models',
61
70
  'agent/commands',
62
71
  'agent/usageStats',
72
+ 'agent/doctor',
63
73
  // Metrics (bridge-owned, survivable profile stats + tamper-proof backup)
64
74
  'metrics/get',
65
75
  'metrics/export',
@@ -79,6 +89,9 @@ export const METHOD_NAMES = [
79
89
  'bridge/disconnectPhone',
80
90
  'bridge/trustedDevices',
81
91
  'bridge/removeTrustedDevice',
92
+ // Desktop tools for bridge-run agents (local control channel only)
93
+ 'desktop/attach',
94
+ 'desktop/detach',
82
95
  ];
83
96
  const _assertNamesAreMethods = true;
84
97
  const _assertMethodsAreNames = true;
@@ -1 +1 @@
1
- {"version":3,"file":"method-registry.js","sourceRoot":"","sources":["../../../src/jsonrpc/method-registry.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,kBAAkB;IAClB,aAAa;IACb,aAAa;IACb,cAAc;IACd,eAAe;IACf,aAAa;IACb,iBAAiB;IACjB,eAAe;IACf,sBAAsB;IACtB,gBAAgB;IAChB,kBAAkB;IAClB,eAAe;IACf,WAAW;IACX,WAAW;IACX,WAAW;IACX,aAAa;IACb,gBAAgB;IAChB,cAAc;IACd,aAAa;IACb,MAAM;IACN,YAAY;IACZ,UAAU;IACV,YAAY;IACZ,UAAU;IACV,UAAU;IACV,cAAc;IACd,kBAAkB;IAClB,oBAAoB;IACpB,WAAW;IACX,aAAa;IACb,aAAa;IACb,cAAc;IACd,gBAAgB;IAChB,cAAc;IACd,kBAAkB;IAClB,YAAY;IACZ,kBAAkB;IAClB,oBAAoB;IACpB,eAAe;IACf,SAAS;IACT,gBAAgB;IAChB,YAAY;IACZ,oBAAoB;IACpB,qBAAqB;IACrB,gBAAgB;IAChB,uBAAuB;IACvB,2BAA2B;IAC3B,sBAAsB;IACtB,sBAAsB;IACtB,0BAA0B;IAC1B,2BAA2B;IAC3B,sBAAsB;IACtB,kBAAkB;IAClB,WAAW;IACX,cAAc;IACd,iBAAiB;IACjB,SAAS;IACT,YAAY;IACZ,cAAc;IACd,gBAAgB;IAChB,kBAAkB;IAClB,yEAAyE;IACzE,aAAa;IACb,gBAAgB;IAChB,gBAAgB;IAChB,OAAO;IACP,aAAa;IACb,YAAY;IACZ,aAAa;IACb,uBAAuB;IACvB,wBAAwB;IACxB,sBAAsB;IACtB,0BAA0B;IAC1B,iBAAiB;IACjB,eAAe;IACf,0BAA0B;IAC1B,wBAAwB;IACxB,wBAAwB;IACxB,uBAAuB;IACvB,4BAA4B;CACpB,CAAC;AAQX,MAAM,sBAAsB,GAAqB,IAAI,CAAC;AACtD,MAAM,sBAAsB,GAAqB,IAAI,CAAC;AACtD,KAAK,sBAAsB,CAAC;AAC5B,KAAK,sBAAsB,CAAC;AAE5B,MAAM,eAAe,GAAwB,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;AAEnE,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,OAAO,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACrC,CAAC"}
1
+ {"version":3,"file":"method-registry.js","sourceRoot":"","sources":["../../../src/jsonrpc/method-registry.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,kBAAkB;IAClB,aAAa;IACb,aAAa;IACb,cAAc;IACd,eAAe;IACf,aAAa;IACb,iBAAiB;IACjB,eAAe;IACf,sBAAsB;IACtB,gBAAgB;IAChB,kBAAkB;IAClB,eAAe;IACf,WAAW;IACX,WAAW;IACX,WAAW;IACX,aAAa;IACb,gBAAgB;IAChB,cAAc;IACd,aAAa;IACb,MAAM;IACN,YAAY;IACZ,UAAU;IACV,YAAY;IACZ,UAAU;IACV,UAAU;IACV,cAAc;IACd,kBAAkB;IAClB,oBAAoB;IACpB,WAAW;IACX,aAAa;IACb,aAAa;IACb,cAAc;IACd,gBAAgB;IAChB,cAAc;IACd,kBAAkB;IAClB,YAAY;IACZ,kBAAkB;IAClB,oBAAoB;IACpB,eAAe;IACf,SAAS;IACT,gBAAgB;IAChB,YAAY;IACZ,oBAAoB;IACpB,qBAAqB;IACrB,gBAAgB;IAChB,uBAAuB;IACvB,2BAA2B;IAC3B,sBAAsB;IACtB,sBAAsB;IACtB,0BAA0B;IAC1B,2BAA2B;IAC3B,sBAAsB;IACtB,kBAAkB;IAClB,WAAW;IACX,cAAc;IACd,iBAAiB;IACjB,aAAa;IACb,gBAAgB;IAChB,gBAAgB;IAChB,mCAAmC;IACnC,cAAc;IACd,cAAc;IACd,cAAc;IACd,iBAAiB;IACjB,eAAe;IACf,SAAS;IACT,YAAY;IACZ,cAAc;IACd,gBAAgB;IAChB,kBAAkB;IAClB,cAAc;IACd,yEAAyE;IACzE,aAAa;IACb,gBAAgB;IAChB,gBAAgB;IAChB,OAAO;IACP,aAAa;IACb,YAAY;IACZ,aAAa;IACb,uBAAuB;IACvB,wBAAwB;IACxB,sBAAsB;IACtB,0BAA0B;IAC1B,iBAAiB;IACjB,eAAe;IACf,0BAA0B;IAC1B,wBAAwB;IACxB,wBAAwB;IACxB,uBAAuB;IACvB,4BAA4B;IAC5B,mEAAmE;IACnE,gBAAgB;IAChB,gBAAgB;CACR,CAAC;AAQX,MAAM,sBAAsB,GAAqB,IAAI,CAAC;AACtD,MAAM,sBAAsB,GAAqB,IAAI,CAAC;AACtD,KAAK,sBAAsB,CAAC;AAC5B,KAAK,sBAAsB,CAAC;AAE5B,MAAM,eAAe,GAAwB,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;AAEnE,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,OAAO,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACrC,CAAC"}