ds-harness-remote 0.5.4 → 0.5.7
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/dist/cli.d.ts +2 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +16 -14
- package/dist/cli.js.map +1 -1
- package/dist/client-locale.d.ts +268 -0
- package/dist/client-locale.d.ts.map +1 -0
- package/dist/client-locale.js +521 -0
- package/dist/client-locale.js.map +1 -0
- package/dist/client-runtime.d.ts +2 -0
- package/dist/client-runtime.d.ts.map +1 -1
- package/dist/client-runtime.js +26 -2
- package/dist/client-runtime.js.map +1 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.github.js +273 -53
- package/dist/client.js +273 -53
- package/dist/client.js.map +1 -1
- package/dist/codex/app-server.js +2 -0
- package/dist/codex/app-server.js.map +1 -1
- package/dist/codex/domain.d.ts.map +1 -1
- package/dist/codex/domain.js +29 -7
- package/dist/codex/domain.js.map +1 -1
- package/dist/harness-api-bridge.d.ts.map +1 -1
- package/dist/harness-api-bridge.js +6 -2
- package/dist/harness-api-bridge.js.map +1 -1
- package/dist/harness-remote-bridge.d.ts +1 -1
- package/dist/harness-remote-bridge.d.ts.map +1 -1
- package/dist/harness-remote-bridge.js +9 -3
- package/dist/harness-remote-bridge.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +393 -63
- package/dist/index.js.map +4 -4
- package/dist/plugin-route-bridge.d.ts +23 -0
- package/dist/plugin-route-bridge.d.ts.map +1 -0
- package/dist/plugin-route-bridge.js +82 -0
- package/dist/plugin-route-bridge.js.map +1 -0
- package/dist/plugin-route-client.d.ts +20 -0
- package/dist/plugin-route-client.d.ts.map +1 -0
- package/dist/plugin-route-client.js +242 -0
- package/dist/plugin-route-client.js.map +1 -0
- package/dist/plugin-route-dispatcher.d.ts +10 -0
- package/dist/plugin-route-dispatcher.d.ts.map +1 -0
- package/dist/plugin-route-dispatcher.js +61 -0
- package/dist/plugin-route-dispatcher.js.map +1 -0
- package/dist/rpc-router.d.ts +4 -1
- package/dist/rpc-router.d.ts.map +1 -1
- package/dist/rpc-router.js +11 -1
- package/dist/rpc-router.js.map +1 -1
- package/dist/server-api.d.ts +9 -1
- package/dist/server-api.d.ts.map +1 -1
- package/dist/server-api.js +61 -2
- package/dist/server-api.js.map +1 -1
- package/dist/service.d.ts +5 -2
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +18 -2
- package/dist/service.js.map +1 -1
- package/dist/tui-command.d.ts.map +1 -1
- package/dist/tui-command.js +58 -18
- package/dist/tui-command.js.map +1 -1
- package/dist/typert-gateway-contract.d.ts +4 -0
- package/dist/typert-gateway-contract.d.ts.map +1 -1
- package/dist/typert-gateway-switch.d.ts.map +1 -1
- package/dist/typert-gateway-switch.js +16 -1
- package/dist/typert-gateway-switch.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dsh-plugin.json +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { PluginRouteCallResult } from '@dsh-remote/protocol';
|
|
2
|
+
import type { SafeLogger } from './logging.js';
|
|
3
|
+
/** Local plugin web routes forwardable over the authenticated channel (POST only). */
|
|
4
|
+
export declare const PLUGIN_ROUTE_ALLOWLIST: readonly ["api/bot"];
|
|
5
|
+
/** Reviewed DS Bot operations; new upstream operations stay local by default. */
|
|
6
|
+
export declare const BOT_REMOTE_OPERATIONS: readonly ["state", "models", "efforts", "exchange", "earlier", "usage", "room-progress", "schedules", "create-bot", "duplicate-bot", "update-bot", "delete-bot", "set-main", "set-flags", "create-room", "update-room", "delete-room", "add-agent", "agent-session", "agent-adopt", "agent-archive", "agent-rename", "remove-agent", "send", "answer-question", "dismiss-question", "approval-answer", "stop-member-work"];
|
|
7
|
+
export declare function isAllowedPluginRoute(route: string): route is typeof PLUGIN_ROUTE_ALLOWLIST[number];
|
|
8
|
+
export type PluginRouteDispatcher = (route: string, body: unknown, signal: AbortSignal) => Promise<{
|
|
9
|
+
status: number;
|
|
10
|
+
json: unknown;
|
|
11
|
+
}>;
|
|
12
|
+
/**
|
|
13
|
+
* Forwards bounded POST calls to local plugin web routes (first case: ds-bot's
|
|
14
|
+
* `api/bot`) through the shared fetch handler of the Host connection service.
|
|
15
|
+
* The route allowlist and both size bounds keep the tunnel fail-closed.
|
|
16
|
+
*/
|
|
17
|
+
export declare class PluginRouteBridge {
|
|
18
|
+
private readonly dispatch;
|
|
19
|
+
private readonly logger?;
|
|
20
|
+
constructor(dispatch: PluginRouteDispatcher, logger?: SafeLogger | undefined);
|
|
21
|
+
call(input: unknown): Promise<PluginRouteCallResult>;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=plugin-route-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-route-bridge.d.ts","sourceRoot":"","sources":["../src/plugin-route-bridge.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAyB,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAExF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAG9C,sFAAsF;AACtF,eAAO,MAAM,sBAAsB,sBAAuB,CAAA;AAE1D,iFAAiF;AACjF,eAAO,MAAM,qBAAqB,4ZAMxB,CAAA;AAEV,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,OAAO,sBAAsB,CAAC,MAAM,CAAC,CAElG;AAED,MAAM,MAAM,qBAAqB,GAAG,CAClC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,WAAW,KAChB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC,CAAA;AAiB/C;;;;GAIG;AACH,qBAAa,iBAAiB;IAE1B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;gBADP,QAAQ,EAAE,qBAAqB,EAC/B,MAAM,CAAC,EAAE,UAAU,YAAA;IAGhC,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,qBAAqB,CAAC;CAkC3D"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { MAX_SECURE_MESSAGE_BYTES } from '@dsh-remote/protocol';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { RpcError } from './safe-error.js';
|
|
4
|
+
/** Local plugin web routes forwardable over the authenticated channel (POST only). */
|
|
5
|
+
export const PLUGIN_ROUTE_ALLOWLIST = ['api/bot'];
|
|
6
|
+
/** Reviewed DS Bot operations; new upstream operations stay local by default. */
|
|
7
|
+
export const BOT_REMOTE_OPERATIONS = [
|
|
8
|
+
'state', 'models', 'efforts', 'exchange', 'earlier', 'usage', 'room-progress', 'schedules',
|
|
9
|
+
'create-bot', 'duplicate-bot', 'update-bot', 'delete-bot', 'set-main', 'set-flags',
|
|
10
|
+
'create-room', 'update-room', 'delete-room',
|
|
11
|
+
'add-agent', 'agent-session', 'agent-adopt', 'agent-archive', 'agent-rename', 'remove-agent',
|
|
12
|
+
'send', 'answer-question', 'dismiss-question', 'approval-answer', 'stop-member-work',
|
|
13
|
+
];
|
|
14
|
+
export function isAllowedPluginRoute(route) {
|
|
15
|
+
return PLUGIN_ROUTE_ALLOWLIST.some(allowed => allowed === route);
|
|
16
|
+
}
|
|
17
|
+
const callSchema = z.object({
|
|
18
|
+
route: z.enum(PLUGIN_ROUTE_ALLOWLIST),
|
|
19
|
+
body: z.object({
|
|
20
|
+
endpoint: z.enum(BOT_REMOTE_OPERATIONS),
|
|
21
|
+
payload: z.record(z.string(), z.unknown()).nullable().optional(),
|
|
22
|
+
}).strict().superRefine((body, ctx) => {
|
|
23
|
+
if (body.endpoint === 'approval-answer' && body.payload?.choice !== 'allow' && body.payload?.choice !== 'reject') {
|
|
24
|
+
ctx.addIssue({ code: z.ZodIssueCode.custom, message: 'Only one-time approval or rejection is supported.' });
|
|
25
|
+
}
|
|
26
|
+
}),
|
|
27
|
+
}).strict();
|
|
28
|
+
/** Local plugin route call timeout, mirroring the Harness API bridge budget. */
|
|
29
|
+
const PLUGIN_ROUTE_TIMEOUT_MS = 30_000;
|
|
30
|
+
/**
|
|
31
|
+
* Forwards bounded POST calls to local plugin web routes (first case: ds-bot's
|
|
32
|
+
* `api/bot`) through the shared fetch handler of the Host connection service.
|
|
33
|
+
* The route allowlist and both size bounds keep the tunnel fail-closed.
|
|
34
|
+
*/
|
|
35
|
+
export class PluginRouteBridge {
|
|
36
|
+
dispatch;
|
|
37
|
+
logger;
|
|
38
|
+
constructor(dispatch, logger) {
|
|
39
|
+
this.dispatch = dispatch;
|
|
40
|
+
this.logger = logger;
|
|
41
|
+
}
|
|
42
|
+
async call(input) {
|
|
43
|
+
let params;
|
|
44
|
+
try {
|
|
45
|
+
params = callSchema.parse(input);
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
if (error instanceof z.ZodError) {
|
|
49
|
+
throw new RpcError('INVALID_MESSAGE', 'The plugin route call is invalid for the remote channel.');
|
|
50
|
+
}
|
|
51
|
+
throw error;
|
|
52
|
+
}
|
|
53
|
+
if (serializedBytes(params) > MAX_SECURE_MESSAGE_BYTES) {
|
|
54
|
+
throw new RpcError('INVALID_MESSAGE', `The plugin route call exceeds the ${MAX_SECURE_MESSAGE_BYTES}-byte remote limit.`);
|
|
55
|
+
}
|
|
56
|
+
const startedAt = performance.now();
|
|
57
|
+
let result;
|
|
58
|
+
try {
|
|
59
|
+
result = await this.dispatch(params.route, params.body, AbortSignal.timeout(PLUGIN_ROUTE_TIMEOUT_MS));
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
this.logger?.warn('plugin route call failed', {
|
|
63
|
+
route: params.route,
|
|
64
|
+
durationMs: Math.round(performance.now() - startedAt),
|
|
65
|
+
});
|
|
66
|
+
throw error;
|
|
67
|
+
}
|
|
68
|
+
if (serializedBytes(result) > MAX_SECURE_MESSAGE_BYTES) {
|
|
69
|
+
throw new RpcError('RESPONSE_TOO_LARGE', 'The plugin route response exceeds the bounded remote limit.');
|
|
70
|
+
}
|
|
71
|
+
this.logger?.debug('plugin route call ok', {
|
|
72
|
+
route: params.route,
|
|
73
|
+
status: result.status,
|
|
74
|
+
durationMs: Math.round(performance.now() - startedAt),
|
|
75
|
+
});
|
|
76
|
+
return { status: result.status, json: result.json };
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
function serializedBytes(value) {
|
|
80
|
+
return new TextEncoder().encode(JSON.stringify(value)).byteLength;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=plugin-route-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-route-bridge.js","sourceRoot":"","sources":["../src/plugin-route-bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
type Fetch = typeof globalThis.fetch;
|
|
2
|
+
export interface PluginRouteClientOptions {
|
|
3
|
+
/** Publish a remote roster only after the official Session catalog has caught up. */
|
|
4
|
+
beforeResponse?(status: Record<string, unknown>, body: Record<string, unknown>, json: unknown, signal: AbortSignal): Promise<void>;
|
|
5
|
+
}
|
|
6
|
+
/** Route authority is read before each plugin request, including the first page load. */
|
|
7
|
+
export declare function createPluginRouteFetch(original: Fetch, baseUrl: string, options?: PluginRouteClientOptions): Fetch;
|
|
8
|
+
export interface PluginRouteSessions {
|
|
9
|
+
list: {
|
|
10
|
+
getSnapshot(): {
|
|
11
|
+
ids: readonly string[];
|
|
12
|
+
phase: string;
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
refresh?(): Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
/** `ready` is monotone in Harness; prove membership instead of trusting refresh's void result. */
|
|
18
|
+
export declare function createPluginRouteCatalogGuard(readSessions: () => Promise<PluginRouteSessions>): NonNullable<PluginRouteClientOptions['beforeResponse']>;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=plugin-route-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-route-client.d.ts","sourceRoot":"","sources":["../src/plugin-route-client.ts"],"names":[],"mappings":"AAEA,KAAK,KAAK,GAAG,OAAO,UAAU,CAAC,KAAK,CAAA;AAMpC,MAAM,WAAW,wBAAwB;IACvC,qFAAqF;IACrF,cAAc,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACnI;AAED,yFAAyF;AACzF,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,wBAA6B,GAAG,KAAK,CA+FtH;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE;QAAE,WAAW,IAAI;YAAE,GAAG,EAAE,SAAS,MAAM,EAAE,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAA;IAClE,OAAO,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CAC1B;AAED,kGAAkG;AAClG,wBAAgB,6BAA6B,CAC3C,YAAY,EAAE,MAAM,OAAO,CAAC,mBAAmB,CAAC,GAC/C,WAAW,CAAC,wBAAwB,CAAC,gBAAgB,CAAC,CAAC,CAsBzD"}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
import { CONTROL_RPC_PREFIX } from './control-route.js';
|
|
2
|
+
class PluginRouteFailure extends Error {
|
|
3
|
+
code;
|
|
4
|
+
constructor(code, message) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.code = code;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
/** Route authority is read before each plugin request, including the first page load. */
|
|
10
|
+
export function createPluginRouteFetch(original, baseUrl, options = {}) {
|
|
11
|
+
const routeUrl = new URL('api/bot', baseUrl);
|
|
12
|
+
let nextRpcId = 0;
|
|
13
|
+
const control = async (method, payload, signal) => {
|
|
14
|
+
const rpcId = `plugin-route-${++nextRpcId}`;
|
|
15
|
+
const response = await original(new URL(`${CONTROL_RPC_PREFIX.slice(1)}/${method}`, baseUrl), {
|
|
16
|
+
method: 'POST',
|
|
17
|
+
credentials: 'same-origin',
|
|
18
|
+
headers: { 'content-type': 'application/json' },
|
|
19
|
+
body: JSON.stringify({ type: 'client-request', rpcId, method, payload }),
|
|
20
|
+
signal,
|
|
21
|
+
});
|
|
22
|
+
if (!response.ok)
|
|
23
|
+
throw new PluginRouteFailure('remote-plugin/control-unavailable', `The local Remote control request failed (HTTP ${response.status}). Reload the Remote plugin.`);
|
|
24
|
+
const envelope = await response.json();
|
|
25
|
+
if (!isRecord(envelope) || envelope.type !== 'server-response' || envelope.rpcId !== rpcId
|
|
26
|
+
|| !isRecord(envelope.result)) {
|
|
27
|
+
throw new PluginRouteFailure('remote-plugin/control-invalid', 'The local Remote control response is invalid. Reload the Remote plugin.');
|
|
28
|
+
}
|
|
29
|
+
if (envelope.result.ok !== true) {
|
|
30
|
+
const error = isRecord(envelope.result.error) ? envelope.result.error : undefined;
|
|
31
|
+
const details = isRecord(error?.details) ? error.details : undefined;
|
|
32
|
+
const code = details?.remoteCode ?? error?.code;
|
|
33
|
+
if (code === 'FEATURE_NOT_SUPPORTED' || code === 'METHOD_NOT_FOUND') {
|
|
34
|
+
throw new PluginRouteFailure('remote-plugin/host-unsupported', 'The selected Host does not support plugin route forwarding. Update and reload Remote on the Host, then reconnect.');
|
|
35
|
+
}
|
|
36
|
+
if (code === 'REMOTE_NOT_CONNECTED' || code === 'TRANSPORT_CLOSED') {
|
|
37
|
+
throw new PluginRouteFailure('remote-plugin/disconnected', 'The Remote Host is disconnected. Reconnect to load DS Bot.');
|
|
38
|
+
}
|
|
39
|
+
if (code === 'INVALID_MESSAGE') {
|
|
40
|
+
throw new PluginRouteFailure('remote-plugin/operation-not-allowed', 'This DS Bot operation is not allowed over Remote. Use the Host locally.');
|
|
41
|
+
}
|
|
42
|
+
throw new PluginRouteFailure('remote-plugin/control-rejected', 'The Remote plugin route request was rejected by the control channel.');
|
|
43
|
+
}
|
|
44
|
+
return envelope.result.value;
|
|
45
|
+
};
|
|
46
|
+
return async (input, init) => {
|
|
47
|
+
const requestUrl = new URL(input instanceof Request ? input.url : String(input), baseUrl);
|
|
48
|
+
const method = init?.method ?? (input instanceof Request ? input.method : 'GET');
|
|
49
|
+
if (method.toUpperCase() !== 'POST' || requestUrl.href !== routeUrl.href)
|
|
50
|
+
return original(input, init);
|
|
51
|
+
const signal = init?.signal !== undefined ? init.signal ?? undefined : input instanceof Request ? input.signal : undefined;
|
|
52
|
+
const lifetime = signal ?? AbortSignal.timeout(45_000);
|
|
53
|
+
try {
|
|
54
|
+
lifetime.throwIfAborted();
|
|
55
|
+
const status = await control('status', {}, AbortSignal.any([lifetime, AbortSignal.timeout(10_000)]));
|
|
56
|
+
lifetime.throwIfAborted();
|
|
57
|
+
if (!isRecord(status))
|
|
58
|
+
throw new PluginRouteFailure('remote-plugin/authority-unavailable', 'The Remote plugin route authority is unavailable.');
|
|
59
|
+
if (status.mode === 'local')
|
|
60
|
+
return original(input, init);
|
|
61
|
+
// Once Remote owns the page, never read the local plugin's roster on a
|
|
62
|
+
// disconnect, missing capability, or virtual CodeX/ACP Session catalog.
|
|
63
|
+
if (status.mode !== 'remote')
|
|
64
|
+
throw new PluginRouteFailure('remote-plugin/authority-unavailable', 'The Remote plugin route authority is unavailable.');
|
|
65
|
+
if (status.connected !== true)
|
|
66
|
+
throw new PluginRouteFailure('remote-plugin/disconnected', 'The Remote Host is disconnected. Reconnect to load DS Bot.');
|
|
67
|
+
if (!isRecord(status.remoteFeatures) || status.remoteFeatures.pluginRoute !== true)
|
|
68
|
+
throw new PluginRouteFailure('remote-plugin/host-unsupported', 'The selected Host does not support plugin route forwarding. Update and reload Remote on the Host, then reconnect.');
|
|
69
|
+
if (status.backend !== undefined && status.backend !== 'harness')
|
|
70
|
+
throw new PluginRouteFailure('remote-plugin/backend-unsupported', 'DS Bot requires the Remote Harness catalog. Select a Harness workspace on this Host.');
|
|
71
|
+
const request = input instanceof Request
|
|
72
|
+
? new Request(input, init)
|
|
73
|
+
: new Request(requestUrl, init);
|
|
74
|
+
const body = await request.clone().json();
|
|
75
|
+
if (!isRecord(body))
|
|
76
|
+
throw new Error('The plugin route body must be a JSON object.');
|
|
77
|
+
const result = await control('plugin.route', { route: 'api/bot', body }, lifetime);
|
|
78
|
+
if (!isRecord(result) || !Number.isInteger(result.status)
|
|
79
|
+
|| result.status < 200 || result.status > 599) {
|
|
80
|
+
throw new Error('The plugin route response is invalid.');
|
|
81
|
+
}
|
|
82
|
+
const statusCode = result.status;
|
|
83
|
+
if (statusCode === 404)
|
|
84
|
+
throw new PluginRouteFailure('remote-plugin/bot-not-loaded', 'The Host has no DS Bot route. Enable ds-bot in the same DSH instance/profile as the connected Host.');
|
|
85
|
+
if (statusCode === 503)
|
|
86
|
+
throw new PluginRouteFailure('remote-plugin/host-carrier-unavailable', 'The Host plugin route carrier is unavailable. Update and reload Remote on the Host.');
|
|
87
|
+
if (statusCode >= 200 && statusCode < 300 && options.beforeResponse !== undefined) {
|
|
88
|
+
try {
|
|
89
|
+
await waitWithSignal(options.beforeResponse(status, body, result.json, lifetime), lifetime);
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
lifetime.throwIfAborted();
|
|
93
|
+
throw new PluginRouteFailure('remote-plugin/catalog-unavailable', 'The Remote Harness Session catalog is not ready. Reconnect before loading DS Bot.');
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
lifetime.throwIfAborted();
|
|
97
|
+
return new Response([204, 205, 304].includes(statusCode) ? null : JSON.stringify(result.json ?? null), {
|
|
98
|
+
status: statusCode,
|
|
99
|
+
headers: { 'content-type': 'application/json' },
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
lifetime.throwIfAborted();
|
|
104
|
+
// DS Bot reads its error envelope only for HTTP success. A synthetic 502
|
|
105
|
+
// hides every refusal behind "HTTP 502" before it can read the reason.
|
|
106
|
+
return new Response(JSON.stringify({
|
|
107
|
+
ok: false,
|
|
108
|
+
error: {
|
|
109
|
+
code: error instanceof PluginRouteFailure ? error.code : 'remote-plugin/unavailable',
|
|
110
|
+
message: error instanceof PluginRouteFailure ? error.message : 'The Remote plugin route is unavailable.',
|
|
111
|
+
details: {},
|
|
112
|
+
},
|
|
113
|
+
}), { status: 200, headers: { 'content-type': 'application/json' } });
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/** `ready` is monotone in Harness; prove membership instead of trusting refresh's void result. */
|
|
118
|
+
export function createPluginRouteCatalogGuard(readSessions) {
|
|
119
|
+
return async (_status, body, json, signal) => {
|
|
120
|
+
if (!isRecord(json) || json.ok !== true || !isRecord(json.value))
|
|
121
|
+
return;
|
|
122
|
+
const required = botSessionIds(body.endpoint, json.value);
|
|
123
|
+
if (required.size === 0)
|
|
124
|
+
return;
|
|
125
|
+
const sessions = await readSessions();
|
|
126
|
+
const containsSessions = () => {
|
|
127
|
+
const snapshot = sessions.list.getSnapshot();
|
|
128
|
+
const known = new Set(snapshot.ids);
|
|
129
|
+
return snapshot.phase === 'ready' && [...required].every(id => known.has(id));
|
|
130
|
+
};
|
|
131
|
+
// A first refresh may join a pull that started before the Bot mutation.
|
|
132
|
+
// One further pull lets that in-flight baseline finish without an unbounded retry loop.
|
|
133
|
+
for (let attempt = 0; attempt < 2; attempt++) {
|
|
134
|
+
signal.throwIfAborted();
|
|
135
|
+
if (containsSessions())
|
|
136
|
+
return;
|
|
137
|
+
if (sessions.refresh === undefined)
|
|
138
|
+
break;
|
|
139
|
+
await sessions.refresh();
|
|
140
|
+
}
|
|
141
|
+
signal.throwIfAborted();
|
|
142
|
+
if (!containsSessions())
|
|
143
|
+
throw new Error('The Remote Session catalog does not contain the published Sessions.');
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
function botSessionIds(endpoint, value) {
|
|
147
|
+
const ids = new Set();
|
|
148
|
+
const add = (id) => {
|
|
149
|
+
if (id === undefined || id === null)
|
|
150
|
+
return;
|
|
151
|
+
if (typeof id !== 'string' || id.length === 0)
|
|
152
|
+
throw new Error('Invalid Bot Session identity.');
|
|
153
|
+
ids.add(id);
|
|
154
|
+
};
|
|
155
|
+
const addArray = (input) => {
|
|
156
|
+
if (input === undefined)
|
|
157
|
+
return;
|
|
158
|
+
if (!Array.isArray(input))
|
|
159
|
+
throw new Error('Invalid Bot Session identities.');
|
|
160
|
+
input.forEach(add);
|
|
161
|
+
};
|
|
162
|
+
const bot = (input) => {
|
|
163
|
+
if (!isRecord(input))
|
|
164
|
+
throw new Error('Invalid Bot catalog entry.');
|
|
165
|
+
add(input.id);
|
|
166
|
+
add(input.sessionId);
|
|
167
|
+
addArray(input.parts);
|
|
168
|
+
if (Array.isArray(input.segments))
|
|
169
|
+
input.segments.forEach(segment => {
|
|
170
|
+
if (!isRecord(segment))
|
|
171
|
+
throw new Error('Invalid Bot Session segment.');
|
|
172
|
+
add(segment.sessionId);
|
|
173
|
+
});
|
|
174
|
+
};
|
|
175
|
+
const room = (input) => {
|
|
176
|
+
if (!isRecord(input))
|
|
177
|
+
throw new Error('Invalid Bot room entry.');
|
|
178
|
+
add(input.id);
|
|
179
|
+
addArray(input.parts);
|
|
180
|
+
if (isRecord(input.sessions))
|
|
181
|
+
Object.values(input.sessions).forEach(add);
|
|
182
|
+
};
|
|
183
|
+
const agent = (input) => {
|
|
184
|
+
if (!isRecord(input))
|
|
185
|
+
throw new Error('Invalid Bot agent entry.');
|
|
186
|
+
// Agent IDs are roster identities, not Harness Session IDs.
|
|
187
|
+
addArray(input.sessions);
|
|
188
|
+
};
|
|
189
|
+
const roster = () => {
|
|
190
|
+
for (const [key, visit] of [['bots', bot], ['rooms', room], ['agents', agent]]) {
|
|
191
|
+
if (value[key] === undefined)
|
|
192
|
+
continue;
|
|
193
|
+
if (!Array.isArray(value[key]))
|
|
194
|
+
throw new Error('Invalid Bot roster.');
|
|
195
|
+
value[key].forEach(visit);
|
|
196
|
+
}
|
|
197
|
+
};
|
|
198
|
+
switch (endpoint) {
|
|
199
|
+
case 'state':
|
|
200
|
+
case 'delete-bot':
|
|
201
|
+
case 'delete-room':
|
|
202
|
+
case 'set-main':
|
|
203
|
+
case 'remove-agent':
|
|
204
|
+
roster();
|
|
205
|
+
break;
|
|
206
|
+
case 'create-bot':
|
|
207
|
+
case 'duplicate-bot':
|
|
208
|
+
case 'update-bot':
|
|
209
|
+
bot(value);
|
|
210
|
+
break;
|
|
211
|
+
case 'create-room':
|
|
212
|
+
room(value);
|
|
213
|
+
break;
|
|
214
|
+
case 'update-room':
|
|
215
|
+
room(value.room);
|
|
216
|
+
break;
|
|
217
|
+
case 'add-agent':
|
|
218
|
+
agent(value);
|
|
219
|
+
break;
|
|
220
|
+
case 'agent-session':
|
|
221
|
+
case 'agent-adopt':
|
|
222
|
+
add(value.sessionId);
|
|
223
|
+
break;
|
|
224
|
+
case 'set-flags':
|
|
225
|
+
Array.isArray(value.sessions) ? agent(value) : Array.isArray(value.members) ? room(value) : bot(value);
|
|
226
|
+
break;
|
|
227
|
+
}
|
|
228
|
+
return ids;
|
|
229
|
+
}
|
|
230
|
+
function waitWithSignal(pending, signal) {
|
|
231
|
+
return new Promise((resolve, reject) => {
|
|
232
|
+
const onAbort = () => reject(signal.reason);
|
|
233
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
234
|
+
if (signal.aborted)
|
|
235
|
+
onAbort();
|
|
236
|
+
void pending.then(resolve, reject).finally(() => signal.removeEventListener('abort', onAbort));
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
function isRecord(value) {
|
|
240
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
241
|
+
}
|
|
242
|
+
//# sourceMappingURL=plugin-route-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-route-client.js","sourceRoot":"","sources":["../src/plugin-route-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { PluginRouteDispatcher } from './plugin-route-bridge.js';
|
|
2
|
+
export interface PluginRouteConnectionLike {
|
|
3
|
+
createSharedFetchHandler?(channel: '/api'): {
|
|
4
|
+
fetch(request: Request): Promise<Response>;
|
|
5
|
+
};
|
|
6
|
+
authenticatedUrl?(baseUrl: string): string;
|
|
7
|
+
}
|
|
8
|
+
/** Resolve lazily: Connection may activate after the Remote plugin. */
|
|
9
|
+
export declare function createPluginRouteDispatcher(readConnection: () => PluginRouteConnectionLike | undefined, readPort: () => number | undefined): PluginRouteDispatcher;
|
|
10
|
+
//# sourceMappingURL=plugin-route-dispatcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-route-dispatcher.d.ts","sourceRoot":"","sources":["../src/plugin-route-dispatcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AAErE,MAAM,WAAW,yBAAyB;IACxC,wBAAwB,CAAC,CAAC,OAAO,EAAE,MAAM,GAAG;QAAE,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;KAAE,CAAA;IAC1F,gBAAgB,CAAC,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAA;CAC3C;AAED,uEAAuE;AACvE,wBAAgB,2BAA2B,CACzC,cAAc,EAAE,MAAM,yBAAyB,GAAG,SAAS,EAC3D,QAAQ,EAAE,MAAM,MAAM,GAAG,SAAS,GACjC,qBAAqB,CA0CvB"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/** Resolve lazily: Connection may activate after the Remote plugin. */
|
|
2
|
+
export function createPluginRouteDispatcher(readConnection, readPort) {
|
|
3
|
+
let cookie;
|
|
4
|
+
return async (route, body, signal) => {
|
|
5
|
+
signal.throwIfAborted();
|
|
6
|
+
const connection = readConnection();
|
|
7
|
+
const handler = connection?.createSharedFetchHandler?.('/api');
|
|
8
|
+
let response;
|
|
9
|
+
if (handler !== undefined) {
|
|
10
|
+
// The authenticated Remote channel has already admitted this peer. Invoke
|
|
11
|
+
// the official local Fetch carrier, including on Desktop without HTTP.
|
|
12
|
+
response = await withSignal(handler.fetch(new Request(`http://127.0.0.1/${route}`, {
|
|
13
|
+
method: 'POST',
|
|
14
|
+
headers: { 'content-type': 'application/json' },
|
|
15
|
+
body: JSON.stringify(body ?? {}),
|
|
16
|
+
signal,
|
|
17
|
+
})), signal);
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
const port = readPort();
|
|
21
|
+
if (connection?.authenticatedUrl === undefined || typeof port !== 'number') {
|
|
22
|
+
return { status: 503, json: { ok: false, error: { code: 'gateway/unavailable', message: 'The local plugin route carrier is unavailable.' } } };
|
|
23
|
+
}
|
|
24
|
+
const origin = `http://127.0.0.1:${port}`;
|
|
25
|
+
if (cookie === undefined) {
|
|
26
|
+
const launch = await fetch(connection.authenticatedUrl(`${origin}/`), { redirect: 'manual', signal });
|
|
27
|
+
const setCookie = typeof launch.headers.getSetCookie === 'function' ? launch.headers.getSetCookie() : [];
|
|
28
|
+
cookie = setCookie.map(item => item.split(';', 1)[0]).join('; ') || undefined;
|
|
29
|
+
}
|
|
30
|
+
response = await fetch(`${origin}/${route}`, {
|
|
31
|
+
method: 'POST',
|
|
32
|
+
headers: { 'content-type': 'application/json', ...(cookie === undefined ? {} : { cookie }) },
|
|
33
|
+
body: JSON.stringify(body ?? {}),
|
|
34
|
+
signal,
|
|
35
|
+
});
|
|
36
|
+
if (response.status === 401)
|
|
37
|
+
cookie = undefined;
|
|
38
|
+
}
|
|
39
|
+
const text = await response.text();
|
|
40
|
+
let json = null;
|
|
41
|
+
if (text !== '') {
|
|
42
|
+
try {
|
|
43
|
+
json = JSON.parse(text);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
json = text;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return { status: response.status, json };
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
function withSignal(pending, signal) {
|
|
53
|
+
return new Promise((resolve, reject) => {
|
|
54
|
+
const onAbort = () => reject(signal.reason);
|
|
55
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
56
|
+
if (signal.aborted)
|
|
57
|
+
onAbort();
|
|
58
|
+
void pending.then(resolve, reject).finally(() => signal.removeEventListener('abort', onAbort));
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=plugin-route-dispatcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-route-dispatcher.js","sourceRoot":"","sources":["../src/plugin-route-dispatcher.ts"],"names":[],"mappings":"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"}
|
package/dist/rpc-router.d.ts
CHANGED
|
@@ -6,6 +6,7 @@ import type { HarnessRemoteBridge } from './harness-remote-bridge.js';
|
|
|
6
6
|
import type { SafeLogger } from './logging.js';
|
|
7
7
|
import type { CodexPeerBridge } from './codex/peer-bridge.js';
|
|
8
8
|
import type { AcpPeerBridge } from './acp/peer-bridge.js';
|
|
9
|
+
import type { PluginRouteBridge } from './plugin-route-bridge.js';
|
|
9
10
|
export { RpcError } from './safe-error.js';
|
|
10
11
|
export declare const HOST_CAPABILITIES: readonly ["harness.api.v1", "harness.api.transfer.v1", "harness.remote.v1", "harness.remote.transfer.v1", "fileviewer.read.v1", "codex.appserver.v1", "codex.appserver.transfer.v1", "agent.acp.v1", "agent.acp.transfer.v1"];
|
|
11
12
|
export declare class RpcRouter {
|
|
@@ -19,8 +20,9 @@ export declare class RpcRouter {
|
|
|
19
20
|
private readonly acp?;
|
|
20
21
|
private readonly loopback?;
|
|
21
22
|
private readonly workspaceTypes?;
|
|
23
|
+
private readonly pluginRoute?;
|
|
22
24
|
private active;
|
|
23
|
-
constructor(harnessApi: HarnessApiBridge | undefined, maxPending?: number, logger?: SafeLogger | undefined, fileViewer?: RemoteFileViewerBridge | undefined, harnessRemote?: HarnessRemoteBridge | undefined, capabilities?: () => readonly string[], codex?: CodexPeerBridge | undefined, acp?: AcpPeerBridge | undefined, loopback?: LoopbackHost | undefined, workspaceTypes?: (() => readonly RemoteWorkspaceTypeDescription[]) | undefined);
|
|
25
|
+
constructor(harnessApi: HarnessApiBridge | undefined, maxPending?: number, logger?: SafeLogger | undefined, fileViewer?: RemoteFileViewerBridge | undefined, harnessRemote?: HarnessRemoteBridge | undefined, capabilities?: () => readonly string[], codex?: CodexPeerBridge | undefined, acp?: AcpPeerBridge | undefined, loopback?: LoopbackHost | undefined, workspaceTypes?: (() => readonly RemoteWorkspaceTypeDescription[]) | undefined, pluginRoute?: PluginRouteBridge | undefined);
|
|
24
26
|
closePeerStreams(): Promise<void>;
|
|
25
27
|
handle(message: RemoteMessage): Promise<RemoteMessage>;
|
|
26
28
|
private invoke;
|
|
@@ -28,5 +30,6 @@ export declare class RpcRouter {
|
|
|
28
30
|
private requireRemoteGateway;
|
|
29
31
|
private requireCodex;
|
|
30
32
|
private requireAcp;
|
|
33
|
+
private requirePluginRoute;
|
|
31
34
|
}
|
|
32
35
|
//# sourceMappingURL=rpc-router.d.ts.map
|
package/dist/rpc-router.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rpc-router.d.ts","sourceRoot":"","sources":["../src/rpc-router.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,aAAa,EAClB,KAAK,8BAA8B,EAGpC,MAAM,sBAAsB,CAAA;AAE7B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAA;AACrE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC/D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AACrE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"rpc-router.d.ts","sourceRoot":"","sources":["../src/rpc-router.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,aAAa,EAClB,KAAK,8BAA8B,EAGpC,MAAM,sBAAsB,CAAA;AAE7B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAA;AACrE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC/D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AACrE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAEjE,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AA8C1C,eAAO,MAAM,iBAAiB,+NAUpB,CAAA;AAEV,qBAAa,SAAS;IAIlB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;IACxB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;IAC5B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC;IAC/B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;IACvB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;IACrB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAC1B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;IAChC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;IAb/B,OAAO,CAAC,MAAM,CAAI;gBAGC,UAAU,EAAE,gBAAgB,GAAG,SAAS,EACxC,UAAU,SAAM,EAChB,MAAM,CAAC,EAAE,UAAU,YAAA,EACnB,UAAU,CAAC,EAAE,sBAAsB,YAAA,EACnC,aAAa,CAAC,EAAE,mBAAmB,YAAA,EACnC,YAAY,GAAE,MAAM,SAAS,MAAM,EAA4B,EAC/D,KAAK,CAAC,EAAE,eAAe,YAAA,EACvB,GAAG,CAAC,EAAE,aAAa,YAAA,EACnB,QAAQ,CAAC,EAAE,YAAY,YAAA,EACvB,cAAc,CAAC,GAAE,MAAM,SAAS,8BAA8B,EAAE,aAAA,EAChE,WAAW,CAAC,EAAE,iBAAiB,YAAA;IAG5C,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAUjC,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;IA4C5D,OAAO,CAAC,MAAM;IAoEd,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,oBAAoB;IAO5B,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,kBAAkB;CAM3B"}
|
package/dist/rpc-router.js
CHANGED
|
@@ -43,6 +43,7 @@ const apiMethods = new Set([
|
|
|
43
43
|
'agent.acp.transfer.commit',
|
|
44
44
|
'agent.acp.transfer.read',
|
|
45
45
|
'agent.acp.transfer.close',
|
|
46
|
+
'plugin.route.call',
|
|
46
47
|
]);
|
|
47
48
|
export const HOST_CAPABILITIES = [
|
|
48
49
|
'harness.api.v1',
|
|
@@ -66,8 +67,9 @@ export class RpcRouter {
|
|
|
66
67
|
acp;
|
|
67
68
|
loopback;
|
|
68
69
|
workspaceTypes;
|
|
70
|
+
pluginRoute;
|
|
69
71
|
active = 0;
|
|
70
|
-
constructor(harnessApi, maxPending = 128, logger, fileViewer, harnessRemote, capabilities = () => HOST_CAPABILITIES, codex, acp, loopback, workspaceTypes) {
|
|
72
|
+
constructor(harnessApi, maxPending = 128, logger, fileViewer, harnessRemote, capabilities = () => HOST_CAPABILITIES, codex, acp, loopback, workspaceTypes, pluginRoute) {
|
|
71
73
|
this.harnessApi = harnessApi;
|
|
72
74
|
this.maxPending = maxPending;
|
|
73
75
|
this.logger = logger;
|
|
@@ -78,6 +80,7 @@ export class RpcRouter {
|
|
|
78
80
|
this.acp = acp;
|
|
79
81
|
this.loopback = loopback;
|
|
80
82
|
this.workspaceTypes = workspaceTypes;
|
|
83
|
+
this.pluginRoute = pluginRoute;
|
|
81
84
|
}
|
|
82
85
|
async closePeerStreams() {
|
|
83
86
|
this.loopback?.closeAll();
|
|
@@ -199,6 +202,7 @@ export class RpcRouter {
|
|
|
199
202
|
case 'agent.acp.transfer.commit': return this.requireAcp().commitTransfer(params);
|
|
200
203
|
case 'agent.acp.transfer.read': return this.requireAcp().readTransfer(params);
|
|
201
204
|
case 'agent.acp.transfer.close': return this.requireAcp().closeTransfer(params);
|
|
205
|
+
case 'plugin.route.call': return this.requirePluginRoute().call(params);
|
|
202
206
|
default: throw new RpcError('METHOD_NOT_FOUND', 'The requested method does not exist.');
|
|
203
207
|
}
|
|
204
208
|
}
|
|
@@ -226,6 +230,12 @@ export class RpcRouter {
|
|
|
226
230
|
}
|
|
227
231
|
return this.acp;
|
|
228
232
|
}
|
|
233
|
+
requirePluginRoute() {
|
|
234
|
+
if (this.pluginRoute === undefined) {
|
|
235
|
+
throw new RpcError('FEATURE_NOT_SUPPORTED', 'This Host cannot forward local plugin routes.');
|
|
236
|
+
}
|
|
237
|
+
return this.pluginRoute;
|
|
238
|
+
}
|
|
229
239
|
}
|
|
230
240
|
function errorResponse(requestId, error) {
|
|
231
241
|
const code = safeErrorCode(error);
|
package/dist/rpc-router.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rpc-router.js","sourceRoot":"","sources":["../src/rpc-router.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,yBAAyB,GAK1B,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAQvB,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"rpc-router.js","sourceRoot":"","sources":["../src/rpc-router.ts"],"names":[],"mappings":"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"}
|