uxnan-bridge 0.0.1-alpha.20260621
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 +150 -0
- package/dist/src/account-status.d.ts +13 -0
- package/dist/src/account-status.js +78 -0
- package/dist/src/account-status.js.map +1 -0
- package/dist/src/adapters/base-adapter.d.ts +18 -0
- package/dist/src/adapters/base-adapter.js +15 -0
- package/dist/src/adapters/base-adapter.js.map +1 -0
- package/dist/src/adapters/claude-adapter.d.ts +102 -0
- package/dist/src/adapters/claude-adapter.js +486 -0
- package/dist/src/adapters/claude-adapter.js.map +1 -0
- package/dist/src/adapters/claude-tools.d.ts +25 -0
- package/dist/src/adapters/claude-tools.js +146 -0
- package/dist/src/adapters/claude-tools.js.map +1 -0
- package/dist/src/adapters/codex-adapter.d.ts +116 -0
- package/dist/src/adapters/codex-adapter.js +912 -0
- package/dist/src/adapters/codex-adapter.js.map +1 -0
- package/dist/src/adapters/codex-app-server.d.ts +74 -0
- package/dist/src/adapters/codex-app-server.js +225 -0
- package/dist/src/adapters/codex-app-server.js.map +1 -0
- package/dist/src/adapters/codex-approval.d.ts +88 -0
- package/dist/src/adapters/codex-approval.js +160 -0
- package/dist/src/adapters/codex-approval.js.map +1 -0
- package/dist/src/adapters/codex-tools.d.ts +18 -0
- package/dist/src/adapters/codex-tools.js +106 -0
- package/dist/src/adapters/codex-tools.js.map +1 -0
- package/dist/src/adapters/content-blocks.d.ts +68 -0
- package/dist/src/adapters/content-blocks.js +205 -0
- package/dist/src/adapters/content-blocks.js.map +1 -0
- package/dist/src/adapters/echo-agent-adapter.d.ts +23 -0
- package/dist/src/adapters/echo-agent-adapter.js +72 -0
- package/dist/src/adapters/echo-agent-adapter.js.map +1 -0
- package/dist/src/adapters/gemini-adapter.d.ts +87 -0
- package/dist/src/adapters/gemini-adapter.js +594 -0
- package/dist/src/adapters/gemini-adapter.js.map +1 -0
- package/dist/src/adapters/gemini-tools.d.ts +4 -0
- package/dist/src/adapters/gemini-tools.js +48 -0
- package/dist/src/adapters/gemini-tools.js.map +1 -0
- package/dist/src/adapters/opencode-adapter.d.ts +74 -0
- package/dist/src/adapters/opencode-adapter.js +418 -0
- package/dist/src/adapters/opencode-adapter.js.map +1 -0
- package/dist/src/adapters/opencode-tools.d.ts +2 -0
- package/dist/src/adapters/opencode-tools.js +41 -0
- package/dist/src/adapters/opencode-tools.js.map +1 -0
- package/dist/src/adapters/pi-adapter.d.ts +92 -0
- package/dist/src/adapters/pi-adapter.js +467 -0
- package/dist/src/adapters/pi-adapter.js.map +1 -0
- package/dist/src/adapters/pi-tools.d.ts +10 -0
- package/dist/src/adapters/pi-tools.js +72 -0
- package/dist/src/adapters/pi-tools.js.map +1 -0
- package/dist/src/adapters/process-agent-adapter.d.ts +24 -0
- package/dist/src/adapters/process-agent-adapter.js +111 -0
- package/dist/src/adapters/process-agent-adapter.js.map +1 -0
- package/dist/src/adapters/resolve-claude.d.ts +13 -0
- package/dist/src/adapters/resolve-claude.js +57 -0
- package/dist/src/adapters/resolve-claude.js.map +1 -0
- package/dist/src/adapters/resolve-codex.d.ts +13 -0
- package/dist/src/adapters/resolve-codex.js +48 -0
- package/dist/src/adapters/resolve-codex.js.map +1 -0
- package/dist/src/adapters/resolve-gemini.d.ts +13 -0
- package/dist/src/adapters/resolve-gemini.js +47 -0
- package/dist/src/adapters/resolve-gemini.js.map +1 -0
- package/dist/src/adapters/resolve-opencode.d.ts +11 -0
- package/dist/src/adapters/resolve-opencode.js +49 -0
- package/dist/src/adapters/resolve-opencode.js.map +1 -0
- package/dist/src/adapters/resolve-pi.d.ts +13 -0
- package/dist/src/adapters/resolve-pi.js +46 -0
- package/dist/src/adapters/resolve-pi.js.map +1 -0
- package/dist/src/adapters/run-options.d.ts +22 -0
- package/dist/src/adapters/run-options.js +48 -0
- package/dist/src/adapters/run-options.js.map +1 -0
- package/dist/src/adapters/spawn.d.ts +20 -0
- package/dist/src/adapters/spawn.js +16 -0
- package/dist/src/adapters/spawn.js.map +1 -0
- package/dist/src/agents/agent-manager.d.ts +98 -0
- package/dist/src/agents/agent-manager.js +433 -0
- package/dist/src/agents/agent-manager.js.map +1 -0
- package/dist/src/agents/attachments.d.ts +28 -0
- package/dist/src/agents/attachments.js +121 -0
- package/dist/src/agents/attachments.js.map +1 -0
- package/dist/src/bridge-context.d.ts +45 -0
- package/dist/src/bridge-context.js +2 -0
- package/dist/src/bridge-context.js.map +1 -0
- package/dist/src/bridge-status.d.ts +12 -0
- package/dist/src/bridge-status.js +17 -0
- package/dist/src/bridge-status.js.map +1 -0
- package/dist/src/bridge.d.ts +37 -0
- package/dist/src/bridge.js +446 -0
- package/dist/src/bridge.js.map +1 -0
- package/dist/src/cli.d.ts +2 -0
- package/dist/src/cli.js +194 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/conversation/session-history.d.ts +27 -0
- package/dist/src/conversation/session-history.js +1082 -0
- package/dist/src/conversation/session-history.js.map +1 -0
- package/dist/src/conversation/thread-store.d.ts +74 -0
- package/dist/src/conversation/thread-store.js +366 -0
- package/dist/src/conversation/thread-store.js.map +1 -0
- package/dist/src/daemon-config.d.ts +123 -0
- package/dist/src/daemon-config.js +64 -0
- package/dist/src/daemon-config.js.map +1 -0
- package/dist/src/daemon-state.d.ts +27 -0
- package/dist/src/daemon-state.js +76 -0
- package/dist/src/daemon-state.js.map +1 -0
- package/dist/src/git/git-runner.d.ts +24 -0
- package/dist/src/git/git-runner.js +63 -0
- package/dist/src/git/git-runner.js.map +1 -0
- package/dist/src/git/git-service.d.ts +76 -0
- package/dist/src/git/git-service.js +435 -0
- package/dist/src/git/git-service.js.map +1 -0
- package/dist/src/handler-router.d.ts +34 -0
- package/dist/src/handler-router.js +67 -0
- package/dist/src/handler-router.js.map +1 -0
- package/dist/src/handlers/account-handler.d.ts +4 -0
- package/dist/src/handlers/account-handler.js +27 -0
- package/dist/src/handlers/account-handler.js.map +1 -0
- package/dist/src/handlers/agent-handler.d.ts +2 -0
- package/dist/src/handlers/agent-handler.js +8 -0
- package/dist/src/handlers/agent-handler.js.map +1 -0
- package/dist/src/handlers/bridge-control-handler.d.ts +2 -0
- package/dist/src/handlers/bridge-control-handler.js +64 -0
- package/dist/src/handlers/bridge-control-handler.js.map +1 -0
- package/dist/src/handlers/desktop-handler.d.ts +12 -0
- package/dist/src/handlers/desktop-handler.js +5 -0
- package/dist/src/handlers/desktop-handler.js.map +1 -0
- package/dist/src/handlers/git-handler.d.ts +2 -0
- package/dist/src/handlers/git-handler.js +82 -0
- package/dist/src/handlers/git-handler.js.map +1 -0
- package/dist/src/handlers/index.d.ts +8 -0
- package/dist/src/handlers/index.js +22 -0
- package/dist/src/handlers/index.js.map +1 -0
- package/dist/src/handlers/not-implemented.d.ts +10 -0
- package/dist/src/handlers/not-implemented.js +21 -0
- package/dist/src/handlers/not-implemented.js.map +1 -0
- package/dist/src/handlers/notifications-handler.d.ts +2 -0
- package/dist/src/handlers/notifications-handler.js +62 -0
- package/dist/src/handlers/notifications-handler.js.map +1 -0
- package/dist/src/handlers/params.d.ts +11 -0
- package/dist/src/handlers/params.js +72 -0
- package/dist/src/handlers/params.js.map +1 -0
- package/dist/src/handlers/project-handler.d.ts +2 -0
- package/dist/src/handlers/project-handler.js +6 -0
- package/dist/src/handlers/project-handler.js.map +1 -0
- package/dist/src/handlers/thread-context-handler.d.ts +2 -0
- package/dist/src/handlers/thread-context-handler.js +211 -0
- package/dist/src/handlers/thread-context-handler.js.map +1 -0
- package/dist/src/handlers/workspace-handler.d.ts +2 -0
- package/dist/src/handlers/workspace-handler.js +101 -0
- package/dist/src/handlers/workspace-handler.js.map +1 -0
- package/dist/src/hooks/claude-approval-hook.d.ts +7 -0
- package/dist/src/hooks/claude-approval-hook.js +95 -0
- package/dist/src/hooks/claude-approval-hook.js.map +1 -0
- package/dist/src/hooks/gemini-approval-hook.d.ts +7 -0
- package/dist/src/hooks/gemini-approval-hook.js +113 -0
- package/dist/src/hooks/gemini-approval-hook.js.map +1 -0
- package/dist/src/index.d.ts +62 -0
- package/dist/src/index.js +65 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/keyring-secret-store.d.ts +36 -0
- package/dist/src/keyring-secret-store.js +70 -0
- package/dist/src/keyring-secret-store.js.map +1 -0
- package/dist/src/lock-file.d.ts +18 -0
- package/dist/src/lock-file.js +60 -0
- package/dist/src/lock-file.js.map +1 -0
- package/dist/src/logger.d.ts +28 -0
- package/dist/src/logger.js +99 -0
- package/dist/src/logger.js.map +1 -0
- package/dist/src/pairing/pairing-code-service.d.ts +45 -0
- package/dist/src/pairing/pairing-code-service.js +183 -0
- package/dist/src/pairing/pairing-code-service.js.map +1 -0
- package/dist/src/projects/project-registry.d.ts +14 -0
- package/dist/src/projects/project-registry.js +60 -0
- package/dist/src/projects/project-registry.js.map +1 -0
- package/dist/src/push/push-sender.d.ts +21 -0
- package/dist/src/push/push-sender.js +96 -0
- package/dist/src/push/push-sender.js.map +1 -0
- package/dist/src/push/push-service.d.ts +122 -0
- package/dist/src/push/push-service.js +260 -0
- package/dist/src/push/push-service.js.map +1 -0
- package/dist/src/qr.d.ts +17 -0
- package/dist/src/qr.js +31 -0
- package/dist/src/qr.js.map +1 -0
- package/dist/src/secret-store.d.ts +23 -0
- package/dist/src/secret-store.js +27 -0
- package/dist/src/secret-store.js.map +1 -0
- package/dist/src/secure-device-state.d.ts +16 -0
- package/dist/src/secure-device-state.js +63 -0
- package/dist/src/secure-device-state.js.map +1 -0
- package/dist/src/service-installer.d.ts +57 -0
- package/dist/src/service-installer.js +254 -0
- package/dist/src/service-installer.js.map +1 -0
- package/dist/src/session-state.d.ts +14 -0
- package/dist/src/session-state.js +19 -0
- package/dist/src/session-state.js.map +1 -0
- package/dist/src/transport/crypto.d.ts +43 -0
- package/dist/src/transport/crypto.js +78 -0
- package/dist/src/transport/crypto.js.map +1 -0
- package/dist/src/transport/lan-server.d.ts +33 -0
- package/dist/src/transport/lan-server.js +105 -0
- package/dist/src/transport/lan-server.js.map +1 -0
- package/dist/src/transport/local-hosts.d.ts +17 -0
- package/dist/src/transport/local-hosts.js +30 -0
- package/dist/src/transport/local-hosts.js.map +1 -0
- package/dist/src/transport/mdns-advertiser.d.ts +83 -0
- package/dist/src/transport/mdns-advertiser.js +282 -0
- package/dist/src/transport/mdns-advertiser.js.map +1 -0
- package/dist/src/transport/message-io.d.ts +33 -0
- package/dist/src/transport/message-io.js +87 -0
- package/dist/src/transport/message-io.js.map +1 -0
- package/dist/src/transport/outbound-log.d.ts +24 -0
- package/dist/src/transport/outbound-log.js +78 -0
- package/dist/src/transport/outbound-log.js.map +1 -0
- package/dist/src/transport/relay-client.d.ts +19 -0
- package/dist/src/transport/relay-client.js +27 -0
- package/dist/src/transport/relay-client.js.map +1 -0
- package/dist/src/transport/secure-channel.d.ts +33 -0
- package/dist/src/transport/secure-channel.js +81 -0
- package/dist/src/transport/secure-channel.js.map +1 -0
- package/dist/src/transport/server-handshake.d.ts +49 -0
- package/dist/src/transport/server-handshake.js +137 -0
- package/dist/src/transport/server-handshake.js.map +1 -0
- package/dist/src/transport/session-handler.d.ts +19 -0
- package/dist/src/transport/session-handler.js +134 -0
- package/dist/src/transport/session-handler.js.map +1 -0
- package/dist/src/transport/session-registry.d.ts +58 -0
- package/dist/src/transport/session-registry.js +91 -0
- package/dist/src/transport/session-registry.js.map +1 -0
- package/dist/src/transport/trust-store.d.ts +23 -0
- package/dist/src/transport/trust-store.js +33 -0
- package/dist/src/transport/trust-store.js.map +1 -0
- package/dist/src/transport/ws-adapter.d.ts +7 -0
- package/dist/src/transport/ws-adapter.js +16 -0
- package/dist/src/transport/ws-adapter.js.map +1 -0
- package/dist/src/version.d.ts +1 -0
- package/dist/src/version.js +13 -0
- package/dist/src/version.js.map +1 -0
- package/dist/src/workspace/browse-service.d.ts +10 -0
- package/dist/src/workspace/browse-service.js +97 -0
- package/dist/src/workspace/browse-service.js.map +1 -0
- package/dist/src/workspace/checkpoint-service.d.ts +21 -0
- package/dist/src/workspace/checkpoint-service.js +219 -0
- package/dist/src/workspace/checkpoint-service.js.map +1 -0
- package/dist/src/workspace/path-guard.d.ts +7 -0
- package/dist/src/workspace/path-guard.js +51 -0
- package/dist/src/workspace/path-guard.js.map +1 -0
- package/dist/src/workspace/workspace-service.d.ts +8 -0
- package/dist/src/workspace/workspace-service.js +111 -0
- package/dist/src/workspace/workspace-service.js.map +1 -0
- package/package.json +46 -0
- package/scripts/extract-gemini-hook.mjs +16 -0
- package/scripts/fake-approval-bridge.mjs +23 -0
- package/scripts/install-service-linux.sh +38 -0
- package/scripts/install-service-macos.sh +38 -0
- package/scripts/install-service-windows.ps1 +26 -0
- package/scripts/test-gemini-hook-e2e.mjs +168 -0
- package/scripts/write-gemini-settings.mjs +31 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bridge-control JSON-RPC handlers (desktop → bridge, and CLI introspection).
|
|
3
|
+
*
|
|
4
|
+
* These are implemented for real in the skeleton; they do not depend on the
|
|
5
|
+
* (still deferred) live transport. Disconnecting an active session's transport
|
|
6
|
+
* and persisting trust changes are wired further as those modules land.
|
|
7
|
+
*
|
|
8
|
+
* See uxnandesktop/architecture/02e-bridge-integration.md §4.4.
|
|
9
|
+
*/
|
|
10
|
+
import { hostname } from 'node:os';
|
|
11
|
+
import { RpcError } from '@uxnan/shared';
|
|
12
|
+
import { buildBridgeStatus } from '../bridge-status.js';
|
|
13
|
+
import { generatePairingPayload } from '../qr.js';
|
|
14
|
+
export function registerBridgeControlHandlers(router) {
|
|
15
|
+
router.register('bridge/status', (_params, ctx) => buildBridgeStatus({
|
|
16
|
+
version: ctx.version,
|
|
17
|
+
relayConnected: ctx.relayConnected(),
|
|
18
|
+
lanEnabled: ctx.config.lanEnabled,
|
|
19
|
+
activeSessions: ctx.sessions.count,
|
|
20
|
+
startedAt: ctx.startedAt,
|
|
21
|
+
now: ctx.now(),
|
|
22
|
+
}));
|
|
23
|
+
router.register('bridge/generatePairingQr', (_params, ctx) => generatePairingPayload({
|
|
24
|
+
relayUrl: ctx.config.relayUrl,
|
|
25
|
+
macDeviceId: ctx.deviceState.identity.macDeviceId,
|
|
26
|
+
macIdentityPublicKey: ctx.deviceState.identity.macIdentityPublicKey,
|
|
27
|
+
displayName: hostname(),
|
|
28
|
+
now: ctx.now(),
|
|
29
|
+
}));
|
|
30
|
+
router.register('bridge/connectedPhones', (_params, ctx) => ctx.sessions.list());
|
|
31
|
+
router.register('bridge/trustedDevices', (_params, ctx) => ctx.trustStore.list());
|
|
32
|
+
router.register('bridge/disconnectPhone', (params, ctx) => {
|
|
33
|
+
const deviceId = requireDeviceId(params);
|
|
34
|
+
ctx.sessions.remove(deviceId);
|
|
35
|
+
// FOR-DEV: also close the live transport for this device once wired.
|
|
36
|
+
return null;
|
|
37
|
+
});
|
|
38
|
+
router.register('bridge/removeTrustedDevice', async (params, ctx) => {
|
|
39
|
+
const deviceId = requireDeviceId(params);
|
|
40
|
+
// Revoke trust so the phone can no longer trusted-reconnect, and drop any
|
|
41
|
+
// live session/sink so a currently-connected device is disconnected now.
|
|
42
|
+
// Idempotent: removing an already-absent device is not an error (the phone
|
|
43
|
+
// deletes locally first and calls this best-effort).
|
|
44
|
+
await ctx.trustStore.remove(deviceId);
|
|
45
|
+
ctx.sessions.remove(deviceId);
|
|
46
|
+
// Forget (not just unregister): drop the outbound catch-up log too — an
|
|
47
|
+
// untrusted device has nothing left to catch up on.
|
|
48
|
+
ctx.sessionRegistry.forget(deviceId);
|
|
49
|
+
// Prune any push registration owned by this device so a revoked phone stops
|
|
50
|
+
// receiving background push (it otherwise lingered until re-register/overwrite).
|
|
51
|
+
ctx.pushService?.unregisterDevice(deviceId);
|
|
52
|
+
return null;
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
function requireDeviceId(params) {
|
|
56
|
+
if (params &&
|
|
57
|
+
typeof params === 'object' &&
|
|
58
|
+
'deviceId' in params &&
|
|
59
|
+
typeof params.deviceId === 'string') {
|
|
60
|
+
return params.deviceId;
|
|
61
|
+
}
|
|
62
|
+
throw RpcError.invalidParams('expected { deviceId: string }');
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=bridge-control-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bridge-control-handler.js","sourceRoot":"","sources":["../../../src/handlers/bridge-control-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Desktop-integration JSON-RPC handlers (used when the bridge is embedded).
|
|
3
|
+
*
|
|
4
|
+
* FOR-DEV: implement desktop refresh/open/focus IPC when the bridge runs as a
|
|
5
|
+
* Tauri sidecar (src/handlers/desktop-handler.ts).
|
|
6
|
+
* See uxnandesktop/architecture/02e-bridge-integration.md §3.4. Unblocks:
|
|
7
|
+
* embedded-mode desktop ↔ bridge events.
|
|
8
|
+
*
|
|
9
|
+
* Note: these method names are not part of the core registry yet.
|
|
10
|
+
*/
|
|
11
|
+
import type { HandlerRouter } from '../handler-router.js';
|
|
12
|
+
export declare function registerDesktopHandlers(_router: HandlerRouter): void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"desktop-handler.js","sourceRoot":"","sources":["../../../src/handlers/desktop-handler.ts"],"names":[],"mappings":"AAYA,MAAM,UAAU,uBAAuB,CAAC,OAAsB;IAC5D,0EAA0E;IAC1E,sDAAsD;AACxD,CAAC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git JSON-RPC handlers — run git locally via `child_process` (no shell).
|
|
3
|
+
*
|
|
4
|
+
* Source: architecture/02a-system-architecture.md §5.8.6.
|
|
5
|
+
*/
|
|
6
|
+
import { JsonRpcErrorCode, RpcError } from '@uxnan/shared';
|
|
7
|
+
import { GitService } from '../git/git-service.js';
|
|
8
|
+
import { GitCommandError } from '../git/git-runner.js';
|
|
9
|
+
import { optionalString, requireSafe, requireString } from './params.js';
|
|
10
|
+
/** Wrap a git operation so failures become a -32003 GitOperationFailed error. */
|
|
11
|
+
function gitOp(fn) {
|
|
12
|
+
return fn().catch((err) => {
|
|
13
|
+
if (err instanceof GitCommandError) {
|
|
14
|
+
throw new RpcError(JsonRpcErrorCode.GitOperationFailed, err.message, { stderr: err.stderr });
|
|
15
|
+
}
|
|
16
|
+
throw err;
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
export function registerGitHandlers(router) {
|
|
20
|
+
const git = new GitService();
|
|
21
|
+
const handlers = {
|
|
22
|
+
'git/status': (p) => gitOp(() => git.status(requireString(p, 'cwd'))),
|
|
23
|
+
'git/diff': (p) => gitOp(() => git.diff(requireString(p, 'cwd'), optionalSafe(p, 'path'))),
|
|
24
|
+
'git/commit': (p) => gitOp(() => git.commit(requireString(p, 'cwd'), requireString(p, 'message'), optionalPaths(p, 'paths'))),
|
|
25
|
+
'git/push': (p) => gitOp(() => git.push(requireString(p, 'cwd'), requireSafe(p, 'remote'), requireSafe(p, 'branch'))),
|
|
26
|
+
'git/pull': (p) => gitOp(() => git.pull(requireString(p, 'cwd'), optionalSafe(p, 'remote'), optionalSafe(p, 'branch'))),
|
|
27
|
+
'git/checkout': (p) => gitOp(() => git.checkout(requireString(p, 'cwd'), requireSafe(p, 'branch'))),
|
|
28
|
+
'git/createBranch': (p) => gitOp(() => git.createBranch(requireString(p, 'cwd'), requireSafe(p, 'name'))),
|
|
29
|
+
'git/createWorktree': (p) => gitOp(() => git.createWorktree(requireString(p, 'cwd'), requireSafe(p, 'branch'), requireSafe(p, 'path'))),
|
|
30
|
+
'git/stage': (p) => gitOp(() => git.stage(requireString(p, 'cwd'), requirePaths(p, 'paths'))),
|
|
31
|
+
'git/unstage': (p) => gitOp(() => git.unstage(requireString(p, 'cwd'), requirePaths(p, 'paths'))),
|
|
32
|
+
'git/discard': (p) => gitOp(() => git.discard(requireString(p, 'cwd'), requirePaths(p, 'paths'))),
|
|
33
|
+
'git/createPr': (p) => gitOp(() => git.createPr(requireString(p, 'cwd'), requireString(p, 'title'), optionalString(p, 'body'), optionalSafe(p, 'base'), optionalSafe(p, 'head'))),
|
|
34
|
+
'git/undoCommit': (p) => gitOp(() => git.undoCommit(requireString(p, 'cwd'))),
|
|
35
|
+
'git/branches': (p) => gitOp(() => git.branches(requireString(p, 'cwd'))),
|
|
36
|
+
'git/switchBranch': (p) => gitOp(() => git.switchBranch(requireString(p, 'cwd'), requireSafe(p, 'target'), requireBool(p, 'carryChanges'))),
|
|
37
|
+
'git/revert': (p) => gitOp(() => git.revert(requireString(p, 'cwd'), requireSafe(p, 'commit'))),
|
|
38
|
+
'git/deleteBranch': (p) => gitOp(() => git.deleteBranch(requireString(p, 'cwd'), requireSafe(p, 'branch'), requireBool(p, 'force'))),
|
|
39
|
+
'git/removeWorktree': (p) => gitOp(() => git.removeWorktree(requireString(p, 'cwd'), requireSafe(p, 'path'), requireBool(p, 'force'))),
|
|
40
|
+
};
|
|
41
|
+
for (const [method, handler] of Object.entries(handlers)) {
|
|
42
|
+
router.register(method, handler);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function optionalSafe(params, key) {
|
|
46
|
+
const value = optionalString(params, key);
|
|
47
|
+
if (value === undefined)
|
|
48
|
+
return undefined;
|
|
49
|
+
if (value.startsWith('-'))
|
|
50
|
+
throw RpcError.invalidParams(`invalid '${key}'`);
|
|
51
|
+
return value;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Reads a `string[]` of repository-relative paths, rejecting non-arrays,
|
|
55
|
+
* non-strings, empty values, and leading-dash entries (option-injection guard).
|
|
56
|
+
*/
|
|
57
|
+
function requirePaths(params, key) {
|
|
58
|
+
const raw = params?.[key];
|
|
59
|
+
if (!Array.isArray(raw) || raw.length === 0) {
|
|
60
|
+
throw RpcError.invalidParams(`'${key}' must be a non-empty array`);
|
|
61
|
+
}
|
|
62
|
+
return raw.map((entry) => {
|
|
63
|
+
if (typeof entry !== 'string' || entry === '' || entry.startsWith('-')) {
|
|
64
|
+
throw RpcError.invalidParams(`invalid path in '${key}'`);
|
|
65
|
+
}
|
|
66
|
+
return entry;
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
function optionalPaths(params, key) {
|
|
70
|
+
const raw = params?.[key];
|
|
71
|
+
if (raw === undefined || raw === null)
|
|
72
|
+
return undefined;
|
|
73
|
+
return requirePaths(params, key);
|
|
74
|
+
}
|
|
75
|
+
function requireBool(params, key) {
|
|
76
|
+
const raw = params?.[key];
|
|
77
|
+
if (typeof raw !== 'boolean') {
|
|
78
|
+
throw RpcError.invalidParams(`'${key}' must be a boolean`);
|
|
79
|
+
}
|
|
80
|
+
return raw;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=git-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-handler.js","sourceRoot":"","sources":["../../../src/handlers/git-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registers all JSON-RPC handlers on a router.
|
|
3
|
+
*
|
|
4
|
+
* Bridge-control methods are implemented; all other domains are registered as
|
|
5
|
+
* clear "not implemented" stubs in this skeleton increment.
|
|
6
|
+
*/
|
|
7
|
+
import type { HandlerRouter } from '../handler-router.js';
|
|
8
|
+
export declare function registerAllHandlers(router: HandlerRouter): void;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { registerGitHandlers } from './git-handler.js';
|
|
2
|
+
import { registerWorkspaceHandlers } from './workspace-handler.js';
|
|
3
|
+
import { registerThreadHandlers } from './thread-context-handler.js';
|
|
4
|
+
import { registerProjectHandlers } from './project-handler.js';
|
|
5
|
+
import { registerAgentHandlers } from './agent-handler.js';
|
|
6
|
+
import { registerAccountHandlers } from './account-handler.js';
|
|
7
|
+
import { registerNotificationHandlers } from './notifications-handler.js';
|
|
8
|
+
import { registerDesktopHandlers } from './desktop-handler.js';
|
|
9
|
+
import { registerBridgeControlHandlers } from './bridge-control-handler.js';
|
|
10
|
+
export function registerAllHandlers(router) {
|
|
11
|
+
registerThreadHandlers(router);
|
|
12
|
+
registerGitHandlers(router);
|
|
13
|
+
registerWorkspaceHandlers(router);
|
|
14
|
+
registerProjectHandlers(router);
|
|
15
|
+
registerAgentHandlers(router);
|
|
16
|
+
registerAccountHandlers(router);
|
|
17
|
+
registerNotificationHandlers(router);
|
|
18
|
+
registerDesktopHandlers(router);
|
|
19
|
+
// Real implementations last so they win over any earlier stub of the same name.
|
|
20
|
+
registerBridgeControlHandlers(router);
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/handlers/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,4BAA4B,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,6BAA6B,EAAE,MAAM,6BAA6B,CAAC;AAE5E,MAAM,UAAU,mBAAmB,CAAC,MAAqB;IACvD,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAC/B,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC5B,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAClC,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAChC,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC9B,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAChC,4BAA4B,CAAC,MAAM,CAAC,CAAC;IACrC,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAChC,gFAAgF;IAChF,6BAA6B,CAAC,MAAM,CAAC,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helpers for registering not-yet-implemented JSON-RPC methods as clear,
|
|
3
|
+
* greppable stubs. Each stub throws a typed {@link RpcError} so the router maps
|
|
4
|
+
* it to a proper JSON-RPC error instead of crashing.
|
|
5
|
+
*/
|
|
6
|
+
import { RpcError } from '@uxnan/shared';
|
|
7
|
+
import type { HandlerRouter } from '../handler-router.js';
|
|
8
|
+
export declare function notImplemented(method: string): RpcError;
|
|
9
|
+
/** Register every given method as a stub that throws "not implemented". */
|
|
10
|
+
export declare function registerStubs(router: HandlerRouter, methods: readonly string[]): void;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helpers for registering not-yet-implemented JSON-RPC methods as clear,
|
|
3
|
+
* greppable stubs. Each stub throws a typed {@link RpcError} so the router maps
|
|
4
|
+
* it to a proper JSON-RPC error instead of crashing.
|
|
5
|
+
*/
|
|
6
|
+
import { JsonRpcErrorCode, RpcError } from '@uxnan/shared';
|
|
7
|
+
export function notImplemented(method) {
|
|
8
|
+
return new RpcError(JsonRpcErrorCode.BridgeError, `Method not implemented yet: ${method}`, {
|
|
9
|
+
reason: 'FOR-DEV: handler stubbed in the bridge skeleton increment',
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
/** Register every given method as a stub that throws "not implemented". */
|
|
13
|
+
export function registerStubs(router, methods) {
|
|
14
|
+
for (const method of methods) {
|
|
15
|
+
const handler = () => {
|
|
16
|
+
throw notImplemented(method);
|
|
17
|
+
};
|
|
18
|
+
router.register(method, handler);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=not-implemented.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"not-implemented.js","sourceRoot":"","sources":["../../../src/handlers/not-implemented.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAG3D,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,OAAO,IAAI,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,+BAA+B,MAAM,EAAE,EAAE;QACzF,MAAM,EAAE,2DAA2D;KACpE,CAAC,CAAC;AACL,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,aAAa,CAAC,MAAqB,EAAE,OAA0B;IAC7E,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAe,GAAG,EAAE;YAC/B,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;QAC/B,CAAC,CAAC;QACF,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { asObject, optionalBoolean, requireString } from './params.js';
|
|
2
|
+
export function registerNotificationHandlers(router) {
|
|
3
|
+
router.register('notifications/register', async (p, ctx, session) => {
|
|
4
|
+
if (!ctx.pushService)
|
|
5
|
+
return { registered: false };
|
|
6
|
+
const sessionId = sessionIdFor(ctx, session);
|
|
7
|
+
if (!sessionId) {
|
|
8
|
+
ctx.logger.warn('push register without a known session — ignored');
|
|
9
|
+
return { registered: false };
|
|
10
|
+
}
|
|
11
|
+
const pushToken = requireString(p, 'pushToken');
|
|
12
|
+
const platform = requirePlatform(p);
|
|
13
|
+
const preferences = readPreferences(p);
|
|
14
|
+
return ctx.pushService.register({
|
|
15
|
+
sessionId,
|
|
16
|
+
...(session?.deviceId !== undefined ? { deviceId: session.deviceId } : {}),
|
|
17
|
+
pushToken,
|
|
18
|
+
platform,
|
|
19
|
+
...(preferences ? { preferences } : {}),
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
router.register('notifications/update', (p, ctx, session) => {
|
|
23
|
+
const preferences = readPreferences(p);
|
|
24
|
+
const sessionId = sessionIdFor(ctx, session);
|
|
25
|
+
if (ctx.pushService && preferences && sessionId) {
|
|
26
|
+
ctx.pushService.updatePreferences(sessionId, preferences);
|
|
27
|
+
}
|
|
28
|
+
return null;
|
|
29
|
+
});
|
|
30
|
+
router.register('notifications/unregister', (_p, ctx, session) => {
|
|
31
|
+
const sessionId = sessionIdFor(ctx, session);
|
|
32
|
+
if (sessionId)
|
|
33
|
+
ctx.pushService?.unregister(sessionId);
|
|
34
|
+
return null;
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Resolve which phone session a `notifications/*` call targets: the request's own
|
|
39
|
+
* session (set by the secure transport when several phones are concurrent), falling
|
|
40
|
+
* back to the most-recently established session for single-phone setups / paths
|
|
41
|
+
* that don't carry per-request identity.
|
|
42
|
+
*/
|
|
43
|
+
function sessionIdFor(ctx, session) {
|
|
44
|
+
return session?.sessionId ?? ctx.pushService?.activeSessionId;
|
|
45
|
+
}
|
|
46
|
+
function requirePlatform(params) {
|
|
47
|
+
const platform = requireString(params, 'platform');
|
|
48
|
+
if (platform !== 'ios' && platform !== 'android') {
|
|
49
|
+
throw new Error("platform must be 'ios' or 'android'");
|
|
50
|
+
}
|
|
51
|
+
return platform;
|
|
52
|
+
}
|
|
53
|
+
function readPreferences(params) {
|
|
54
|
+
const prefs = asObject(params)['preferences'];
|
|
55
|
+
if (prefs === undefined || prefs === null)
|
|
56
|
+
return undefined;
|
|
57
|
+
return {
|
|
58
|
+
turnCompleted: optionalBoolean(prefs, 'turnCompleted') ?? true,
|
|
59
|
+
turnError: optionalBoolean(prefs, 'turnError') ?? true,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=notifications-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notifications-handler.js","sourceRoot":"","sources":["../../../src/handlers/notifications-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare function asObject(params: unknown): Record<string, unknown>;
|
|
2
|
+
export declare function requireString(params: unknown, key: string): string;
|
|
3
|
+
export declare function optionalString(params: unknown, key: string): string | undefined;
|
|
4
|
+
export declare function optionalBoolean(params: unknown, key: string): boolean | undefined;
|
|
5
|
+
export declare function optionalNumber(params: unknown, key: string): number | undefined;
|
|
6
|
+
/**
|
|
7
|
+
* A string safe to pass as a git argument or a path: non-empty, no leading dash
|
|
8
|
+
* (option injection) and no control characters. Spaces are allowed (paths).
|
|
9
|
+
*/
|
|
10
|
+
export declare function requireSafe(params: unknown, key: string): string;
|
|
11
|
+
export declare function requireArray(params: unknown, key: string): unknown[];
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Small validators for untrusted JSON-RPC params. They throw a typed
|
|
3
|
+
* {@link RpcError} (-32602) the router maps to a proper error response.
|
|
4
|
+
*/
|
|
5
|
+
import { RpcError } from '@uxnan/shared';
|
|
6
|
+
export function asObject(params) {
|
|
7
|
+
if (typeof params !== 'object' || params === null || Array.isArray(params)) {
|
|
8
|
+
throw RpcError.invalidParams('params must be an object');
|
|
9
|
+
}
|
|
10
|
+
return params;
|
|
11
|
+
}
|
|
12
|
+
export function requireString(params, key) {
|
|
13
|
+
const value = asObject(params)[key];
|
|
14
|
+
if (typeof value !== 'string' || value.length === 0) {
|
|
15
|
+
throw RpcError.invalidParams(`expected non-empty string '${key}'`);
|
|
16
|
+
}
|
|
17
|
+
return value;
|
|
18
|
+
}
|
|
19
|
+
export function optionalString(params, key) {
|
|
20
|
+
const value = asObject(params)[key];
|
|
21
|
+
if (value === undefined || value === null)
|
|
22
|
+
return undefined;
|
|
23
|
+
if (typeof value !== 'string') {
|
|
24
|
+
throw RpcError.invalidParams(`'${key}' must be a string`);
|
|
25
|
+
}
|
|
26
|
+
return value;
|
|
27
|
+
}
|
|
28
|
+
export function optionalBoolean(params, key) {
|
|
29
|
+
const value = asObject(params)[key];
|
|
30
|
+
if (value === undefined || value === null)
|
|
31
|
+
return undefined;
|
|
32
|
+
if (typeof value !== 'boolean') {
|
|
33
|
+
throw RpcError.invalidParams(`'${key}' must be a boolean`);
|
|
34
|
+
}
|
|
35
|
+
return value;
|
|
36
|
+
}
|
|
37
|
+
export function optionalNumber(params, key) {
|
|
38
|
+
const value = asObject(params)[key];
|
|
39
|
+
if (value === undefined || value === null)
|
|
40
|
+
return undefined;
|
|
41
|
+
if (typeof value !== 'number' || !Number.isFinite(value)) {
|
|
42
|
+
throw RpcError.invalidParams(`'${key}' must be a number`);
|
|
43
|
+
}
|
|
44
|
+
return value;
|
|
45
|
+
}
|
|
46
|
+
function hasControlChars(value) {
|
|
47
|
+
for (let i = 0; i < value.length; i += 1) {
|
|
48
|
+
const code = value.charCodeAt(i);
|
|
49
|
+
if (code < 0x20 || code === 0x7f)
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* A string safe to pass as a git argument or a path: non-empty, no leading dash
|
|
56
|
+
* (option injection) and no control characters. Spaces are allowed (paths).
|
|
57
|
+
*/
|
|
58
|
+
export function requireSafe(params, key) {
|
|
59
|
+
const value = requireString(params, key);
|
|
60
|
+
if (value.startsWith('-') || hasControlChars(value)) {
|
|
61
|
+
throw RpcError.invalidParams(`invalid '${key}'`);
|
|
62
|
+
}
|
|
63
|
+
return value;
|
|
64
|
+
}
|
|
65
|
+
export function requireArray(params, key) {
|
|
66
|
+
const value = asObject(params)[key];
|
|
67
|
+
if (!Array.isArray(value)) {
|
|
68
|
+
throw RpcError.invalidParams(`expected array '${key}'`);
|
|
69
|
+
}
|
|
70
|
+
return value;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=params.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"params.js","sourceRoot":"","sources":["../../../src/handlers/params.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { requireString } from './params.js';
|
|
2
|
+
export function registerProjectHandlers(router) {
|
|
3
|
+
router.register('project/list', (_p, ctx) => ctx.projects.list());
|
|
4
|
+
router.register('project/resolve', (p, ctx) => ctx.projects.resolve(requireString(p, 'cwd')));
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=project-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-handler.js","sourceRoot":"","sources":["../../../src/handlers/project-handler.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,UAAU,uBAAuB,CAAC,MAAqB;IAC3D,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC,EAAE,EAAE,GAAkB,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACjF,MAAM,CAAC,QAAQ,CAAC,iBAAiB,EAAE,CAAC,CAAC,EAAE,GAAkB,EAAE,EAAE,CAC3D,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAC9C,CAAC;AACJ,CAAC"}
|