@aerostack/openclaw-bridge 0.12.0 → 0.12.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,369 +1,8 @@
1
1
  #!/usr/bin/env node
2
- /**
3
- * @aerostack/openclaw-bridge
4
- *
5
- * stdio-to-HTTP bridge connecting OpenClaw (and any stdio MCP client)
6
- * to an Aerostack Workspace via Streamable HTTP transport.
7
- *
8
- * OpenClaw config:
9
- * {
10
- * "mcp": {
11
- * "servers": {
12
- * "my-workspace": {
13
- * "command": "npx",
14
- * "args": ["-y", "@aerostack/openclaw-bridge"],
15
- * "env": {
16
- * "AEROSTACK_WORKSPACE_URL": "https://api.aerostack.dev/api/gateway/ws/my-workspace",
17
- * "AEROSTACK_TOKEN": "mwt_..."
18
- * }
19
- * }
20
- * }
21
- * }
22
- * }
23
- */
24
- import { Server } from '@modelcontextprotocol/sdk/server/index.js';
25
- import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
26
- import { ListToolsRequestSchema, CallToolRequestSchema, ListResourcesRequestSchema, ReadResourceRequestSchema, ListPromptsRequestSchema, GetPromptRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
27
- import { resolveApproval } from './resolution.js';
28
- import { info, warn, error as logError } from './logger.js';
29
- import { DEFAULT_RULES, buildGuardianTool, parseWorkspaceGuardianConfig, isGuardianForceDisabled, } from './guardian.js';
30
- // ── Config ─────────────────────────────────────────────────────────
31
- const WORKSPACE_URL = process.env.AEROSTACK_WORKSPACE_URL;
32
- const TOKEN = process.env.AEROSTACK_TOKEN;
33
- function parsePositiveInt(val, fallback, min) {
34
- const n = parseInt(val ?? String(fallback), 10);
35
- return Number.isFinite(n) && n >= min ? n : fallback;
36
- }
37
- const APPROVAL_POLL_INTERVAL_MS = parsePositiveInt(process.env.AEROSTACK_APPROVAL_POLL_MS, 3000, 500);
38
- const APPROVAL_TIMEOUT_MS = parsePositiveInt(process.env.AEROSTACK_APPROVAL_TIMEOUT_MS, 300000, 5000);
39
- const REQUEST_TIMEOUT_MS = parsePositiveInt(process.env.AEROSTACK_REQUEST_TIMEOUT_MS, 30000, 1000);
40
- // ── Local Guardian (resolved after workspace init) ───────────────
41
- const GUARDIAN_FORCE_DISABLED = isGuardianForceDisabled();
42
- let guardianTool = null;
43
- if (!WORKSPACE_URL) {
44
- process.stderr.write('ERROR: AEROSTACK_WORKSPACE_URL is required\n');
45
- process.exit(1);
46
- }
47
- if (!TOKEN) {
48
- process.stderr.write('ERROR: AEROSTACK_TOKEN is required\n');
49
- process.exit(1);
50
- }
51
- // Validate URL — prevent SSRF via misconfigured env var
52
- let parsedUrl;
53
- try {
54
- parsedUrl = new URL(WORKSPACE_URL);
55
- if (parsedUrl.protocol !== 'https:' && parsedUrl.protocol !== 'http:') {
56
- throw new Error('must be http or https');
57
- }
58
- }
59
- catch {
60
- process.stderr.write('ERROR: AEROSTACK_WORKSPACE_URL must be a valid HTTP(S) URL\n');
61
- process.exit(1);
62
- }
63
- if (parsedUrl.protocol === 'http:' && !parsedUrl.hostname.match(/^(localhost|127\.0\.0\.1)$/)) {
64
- process.stderr.write('WARNING: Using HTTP (not HTTPS) — token will be sent in plaintext\n');
65
- }
66
- const baseUrl = WORKSPACE_URL.replace(/\/+$/, '');
67
- async function rpcCall(method, params) {
68
- const body = {
69
- jsonrpc: '2.0',
70
- id: Date.now(),
71
- method,
72
- params: params ?? {},
73
- };
74
- const controller = new AbortController();
75
- const timer = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);
76
- try {
77
- const res = await fetch(baseUrl, {
78
- method: 'POST',
79
- headers: {
80
- 'Content-Type': 'application/json',
81
- 'Authorization': `Bearer ${TOKEN}`,
82
- 'User-Agent': 'aerostack-openclaw-bridge/0.12.0',
83
- 'X-Agent-Id': 'openclaw',
84
- },
85
- body: JSON.stringify(body),
86
- signal: controller.signal,
87
- });
88
- clearTimeout(timer);
89
- const contentType = res.headers.get('content-type') ?? '';
90
- // Handle SSE streaming — collect all data events and return the last JSON-RPC response
91
- if (contentType.includes('text/event-stream')) {
92
- const text = await res.text();
93
- return parseSSEResponse(text, body.id);
94
- }
95
- const json = await res.json();
96
- return json;
97
- }
98
- catch (err) {
99
- clearTimeout(timer);
100
- const message = err instanceof Error ? err.message : 'Unknown error';
101
- if (err instanceof Error && err.name === 'AbortError') {
102
- return { jsonrpc: '2.0', id: body.id, error: { code: -32603, message: 'Request timed out' } };
103
- }
104
- return { jsonrpc: '2.0', id: body.id, error: { code: -32603, message: `HTTP error: ${message}` } };
105
- }
106
- }
107
- function parseSSEResponse(text, requestId) {
108
- const lines = text.split('\n');
109
- let lastData = null;
110
- for (const line of lines) {
111
- if (line.startsWith('data: ')) {
112
- try {
113
- lastData = JSON.parse(line.slice(6));
114
- }
115
- catch {
116
- // skip malformed lines
117
- }
118
- }
119
- }
120
- return lastData ?? { jsonrpc: '2.0', id: requestId, error: { code: -32603, message: 'Empty SSE response' } };
121
- }
122
- // ── Handle tools/call with approval retry ──────────────────────────
123
- async function callToolWithApproval(name, args) {
124
- const response = await rpcCall('tools/call', { name, arguments: args });
125
- // Case 1: Tool gate — server returns -32050 error with approval_id
126
- if (response.error?.code === -32050) {
127
- const data = response.error.data;
128
- const approvalId = data?.approval_id;
129
- if (!approvalId || !/^[a-zA-Z0-9_-]{4,128}$/.test(approvalId)) {
130
- return { jsonrpc: '2.0', id: response.id, error: { code: -32603, message: 'Approval required but no approval_id returned' } };
131
- }
132
- info('Tool gate: waiting for approval', { approvalId, transport: data?.ws_url ? 'ws' : 'poll' });
133
- const pollUrl = data?.polling_url ?? `${baseUrl}/approval-status/${approvalId}`;
134
- const result = await resolveApproval({
135
- approvalId,
136
- wsUrl: data?.ws_url,
137
- pollUrl,
138
- pollIntervalMs: APPROVAL_POLL_INTERVAL_MS,
139
- timeoutMs: APPROVAL_TIMEOUT_MS,
140
- });
141
- if (result.status === 'rejected') {
142
- return {
143
- jsonrpc: '2.0',
144
- id: response.id,
145
- error: { code: -32603, message: `Tool call rejected: ${result.reviewer_note ?? 'no reason given'}` },
146
- };
147
- }
148
- if (result.status === 'expired') {
149
- return {
150
- jsonrpc: '2.0',
151
- id: response.id,
152
- error: { code: -32603, message: 'Approval request expired' },
153
- };
154
- }
155
- // Approved or executed — retry the tool call (gateway returns cached result)
156
- info('Retrying tool call after approval', { approvalId, status: result.status });
157
- return rpcCall('tools/call', { name, arguments: args });
158
- }
159
- // Case 2: Permission gate — request_approval returns success with _meta.approval_id
160
- const resultObj = response.result;
161
- const meta = resultObj?._meta;
162
- if (meta?.approval_id && meta?.status === 'pending') {
163
- const approvalId = meta.approval_id;
164
- info('Permission gate: waiting for approval', { approvalId, transport: meta.ws_url ? 'ws' : 'poll' });
165
- const pollUrl = meta.polling_url ?? `${baseUrl}/approval-status/${approvalId}`;
166
- const result = await resolveApproval({
167
- approvalId,
168
- wsUrl: meta.ws_url,
169
- pollUrl,
170
- pollIntervalMs: APPROVAL_POLL_INTERVAL_MS,
171
- timeoutMs: APPROVAL_TIMEOUT_MS,
172
- });
173
- // Return the resolution as a tool result to the LLM
174
- let message;
175
- if (result.status === 'approved' || result.status === 'executed') {
176
- message = `APPROVED — Your request has been approved. You may proceed with the action.`;
177
- }
178
- else if (result.status === 'rejected') {
179
- message = `REJECTED — Your request was denied. Reason: ${result.reviewer_note ?? 'No reason given.'}. Do NOT proceed.`;
180
- }
181
- else {
182
- message = `EXPIRED — Your approval request timed out. Submit a new request if needed.`;
183
- }
184
- return {
185
- jsonrpc: '2.0',
186
- id: response.id,
187
- result: { content: [{ type: 'text', text: message }] },
188
- };
189
- }
190
- return response;
191
- }
192
- // ── MCP Server (stdio) ────────────────────────────────────────────
193
- let cachedServerInfo = null;
194
- async function ensureInitialized() {
195
- if (cachedServerInfo)
196
- return;
197
- const res = await rpcCall('initialize', {
198
- protocolVersion: '2024-11-05',
199
- capabilities: {},
200
- clientInfo: { name: 'aerostack-openclaw-bridge', version: '0.12.0' },
201
- });
202
- if (res.result) {
203
- const r = res.result;
204
- cachedServerInfo = {
205
- protocolVersion: r.protocolVersion ?? '2024-11-05',
206
- instructions: r.instructions,
207
- };
208
- // ── Resolve Local Guardian rules from workspace config ────
209
- if (!GUARDIAN_FORCE_DISABLED) {
210
- const wsGuardian = parseWorkspaceGuardianConfig(r);
211
- let rules;
212
- if (wsGuardian) {
213
- // Workspace has custom rules configured in the dashboard
214
- if (!wsGuardian.enabled) {
215
- info('Local Guardian: disabled by workspace config');
216
- guardianTool = null;
217
- return;
218
- }
219
- rules = wsGuardian.rules;
220
- info('Local Guardian: using workspace rules', {
221
- count: rules.length,
222
- categories: rules.map(r => r.category),
223
- });
224
- }
225
- else {
226
- // No workspace rules — use defaults
227
- rules = DEFAULT_RULES;
228
- info('Local Guardian: using default rules (workspace has no custom config)', {
229
- count: rules.length,
230
- });
231
- }
232
- guardianTool = buildGuardianTool(rules);
233
- }
234
- }
235
- }
236
- const server = new Server({ name: 'aerostack-openclaw-bridge', version: '0.12.0' }, { capabilities: { tools: {}, resources: {}, prompts: {} } });
237
- // ── tools/list ─────────────────────────────────────────────────────
238
- server.setRequestHandler(ListToolsRequestSchema, async () => {
239
- await ensureInitialized();
240
- const res = await rpcCall('tools/list');
241
- if (res.error) {
242
- throw new Error(res.error.message);
243
- }
244
- const result = res.result;
245
- const tools = result.tools ?? [];
246
- // Inject Local Guardian tool — appears alongside workspace tools
247
- if (guardianTool) {
248
- tools.push(guardianTool);
249
- }
250
- return { tools };
251
- });
252
- // ── tools/call ─────────────────────────────────────────────────────
253
- server.setRequestHandler(CallToolRequestSchema, async (request) => {
254
- await ensureInitialized();
255
- const { name, arguments: args } = request.params;
256
- // ── Local Guardian interception ───────────────────────────────
257
- if (name === 'aerostack__local_guardian' && guardianTool) {
258
- const guardianArgs = (args ?? {});
259
- if (!guardianArgs.action) {
260
- return {
261
- content: [{ type: 'text', text: 'Error: action is required — describe what you are about to do' }],
262
- isError: true,
263
- };
264
- }
265
- info('Local Guardian: requesting approval', {
266
- action: guardianArgs.action,
267
- category: guardianArgs.category,
268
- });
269
- // Delegate to the workspace's existing request_approval permission gate
270
- const approvalArgs = {
271
- action: `[LOCAL] ${guardianArgs.action}`,
272
- category: guardianArgs.category ?? 'local_ops',
273
- details: {
274
- source: 'local_guardian',
275
- original_category: guardianArgs.category,
276
- context: guardianArgs.details,
277
- },
278
- risk_level: guardianArgs.risk_level ?? 'medium',
279
- };
280
- const res = await callToolWithApproval('aerostack__request_approval', approvalArgs);
281
- if (res.error) {
282
- // If workspace has no approval configs, fail open with a clear message
283
- if (res.error.code === -32601) {
284
- warn('Local Guardian: no approval rules configured on workspace — allowing action');
285
- return {
286
- content: [{
287
- type: 'text',
288
- text: 'ALLOWED — No approval rules are configured on this workspace. ' +
289
- 'The workspace owner has not enabled approval gates. You may proceed.',
290
- }],
291
- };
292
- }
293
- return {
294
- content: [{ type: 'text', text: `Error: ${res.error.message}` }],
295
- isError: true,
296
- };
297
- }
298
- const result = res.result;
299
- return { content: result.content ?? [{ type: 'text', text: JSON.stringify(res.result) }] };
300
- }
301
- // ── Normal tool call ──────────────────────────────────────────
302
- const res = await callToolWithApproval(name, (args ?? {}));
303
- if (res.error) {
304
- return {
305
- content: [{ type: 'text', text: `Error: ${res.error.message}` }],
306
- isError: true,
307
- };
308
- }
309
- const result = res.result;
310
- return { content: result.content ?? [{ type: 'text', text: JSON.stringify(res.result) }] };
311
- });
312
- // ── resources/list ─────────────────────────────────────────────────
313
- server.setRequestHandler(ListResourcesRequestSchema, async () => {
314
- await ensureInitialized();
315
- const res = await rpcCall('resources/list');
316
- if (res.error) {
317
- throw new Error(res.error.message);
318
- }
319
- const result = res.result;
320
- return { resources: result.resources ?? [] };
321
- });
322
- // ── resources/read ─────────────────────────────────────────────────
323
- server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
324
- await ensureInitialized();
325
- const res = await rpcCall('resources/read', { uri: request.params.uri });
326
- if (res.error) {
327
- throw new Error(res.error.message);
328
- }
329
- const result = res.result;
330
- return { contents: result.contents ?? [] };
331
- });
332
- // ── prompts/list ───────────────────────────────────────────────────
333
- server.setRequestHandler(ListPromptsRequestSchema, async () => {
334
- await ensureInitialized();
335
- const res = await rpcCall('prompts/list');
336
- if (res.error) {
337
- throw new Error(res.error.message);
338
- }
339
- const result = res.result;
340
- return { prompts: result.prompts ?? [] };
341
- });
342
- // ── prompts/get ────────────────────────────────────────────────────
343
- server.setRequestHandler(GetPromptRequestSchema, async (request) => {
344
- await ensureInitialized();
345
- const res = await rpcCall('prompts/get', {
346
- name: request.params.name,
347
- arguments: request.params.arguments,
348
- });
349
- if (res.error) {
350
- throw new Error(res.error.message);
351
- }
352
- const result = res.result;
353
- return { messages: result.messages ?? [] };
354
- });
355
- // ── Start ──────────────────────────────────────────────────────────
356
- async function main() {
357
- info('Connecting to workspace', { url: baseUrl });
358
- if (GUARDIAN_FORCE_DISABLED) {
359
- info('Local Guardian: force-disabled via AEROSTACK_LOCAL_GUARDIAN env var');
360
- }
361
- const transport = new StdioServerTransport();
362
- await server.connect(transport);
363
- info('Ready', { url: baseUrl });
364
- }
365
- main().catch((err) => {
366
- logError('Fatal error', { error: err instanceof Error ? err.message : String(err) });
367
- process.exit(1);
368
- });
369
- //# sourceMappingURL=index.js.map
2
+
3
+ import{Server as v}from"@modelcontextprotocol/sdk/server/index.js";import{StdioServerTransport as _}from"@modelcontextprotocol/sdk/server/stdio.js";import{ListToolsRequestSchema as O,CallToolRequestSchema as h,ListResourcesRequestSchema as y,ReadResourceRequestSchema as P,ListPromptsRequestSchema as U,GetPromptRequestSchema as q}from"@modelcontextprotocol/sdk/types.js";import{resolveApproval as E}from"./resolution.js";import{info as d,error as b}from"./logger.js";const R=process.env.AEROSTACK_WORKSPACE_URL,f=process.env.AEROSTACK_TOKEN;function g(e,r,t){const o=parseInt(e??String(r),10);return Number.isFinite(o)&&o>=t?o:r}const T=g(process.env.AEROSTACK_APPROVAL_POLL_MS,3e3,500),S=g(process.env.AEROSTACK_APPROVAL_TIMEOUT_MS,3e5,5e3),C=g(process.env.AEROSTACK_REQUEST_TIMEOUT_MS,3e4,1e3);R||(process.stderr.write(`ERROR: AEROSTACK_WORKSPACE_URL is required
4
+ `),process.exit(1)),f||(process.stderr.write(`ERROR: AEROSTACK_TOKEN is required
5
+ `),process.exit(1));let m;try{if(m=new URL(R),m.protocol!=="https:"&&m.protocol!=="http:")throw new Error("must be http or https")}catch{process.stderr.write(`ERROR: AEROSTACK_WORKSPACE_URL must be a valid HTTP(S) URL
6
+ `),process.exit(1)}m.protocol==="http:"&&!m.hostname.match(/^(localhost|127\.0\.0\.1)$/)&&process.stderr.write(`WARNING: Using HTTP (not HTTPS) \u2014 token will be sent in plaintext
7
+ `);const w=R.replace(/\/+$/,"");async function c(e,r){const t={jsonrpc:"2.0",id:Date.now(),method:e,params:r??{}},o=new AbortController,n=setTimeout(()=>o.abort(),C);try{const s=await fetch(w,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${f}`,"User-Agent":"aerostack-openclaw-bridge/0.12.0","X-Agent-Id":"openclaw"},body:JSON.stringify(t),signal:o.signal});if(clearTimeout(n),(s.headers.get("content-type")??"").includes("text/event-stream")){const i=await s.text();return L(i,t.id)}return await s.json()}catch(s){clearTimeout(n);const a=s instanceof Error?s.message:"Unknown error";return s instanceof Error&&s.name==="AbortError"?{jsonrpc:"2.0",id:t.id,error:{code:-32603,message:"Request timed out"}}:{jsonrpc:"2.0",id:t.id,error:{code:-32603,message:`HTTP error: ${a}`}}}}function L(e,r){const t=e.split(`
8
+ `);let o=null;for(const n of t)if(n.startsWith("data: "))try{o=JSON.parse(n.slice(6))}catch{}return o??{jsonrpc:"2.0",id:r,error:{code:-32603,message:"Empty SSE response"}}}async function j(e,r){const t=await c("tools/call",{name:e,arguments:r});if(t.error?.code===-32050){const s=t.error.data,a=s?.approval_id;if(!a||!/^[a-zA-Z0-9_-]{4,128}$/.test(a))return{jsonrpc:"2.0",id:t.id,error:{code:-32603,message:"Approval required but no approval_id returned"}};d("Tool gate: waiting for approval",{approvalId:a,transport:s?.ws_url?"ws":"poll"});const l=s?.polling_url??`${w}/approval-status/${a}`,i=await E({approvalId:a,wsUrl:s?.ws_url,pollUrl:l,pollIntervalMs:T,timeoutMs:S});return i.status==="rejected"?{jsonrpc:"2.0",id:t.id,error:{code:-32603,message:`Tool call rejected: ${i.reviewer_note??"no reason given"}`}}:i.status==="expired"?{jsonrpc:"2.0",id:t.id,error:{code:-32603,message:"Approval request expired"}}:(d("Retrying tool call after approval",{approvalId:a,status:i.status}),c("tools/call",{name:e,arguments:r}))}const n=t.result?._meta;if(n?.approval_id&&n?.status==="pending"){const s=n.approval_id;d("Permission gate: waiting for approval",{approvalId:s,transport:n.ws_url?"ws":"poll"});const a=n.polling_url??`${w}/approval-status/${s}`,l=await E({approvalId:s,wsUrl:n.ws_url,pollUrl:a,pollIntervalMs:T,timeoutMs:S});let i;return l.status==="approved"||l.status==="executed"?i="APPROVED \u2014 Your request has been approved. You may proceed with the action.":l.status==="rejected"?i=`REJECTED \u2014 Your request was denied. Reason: ${l.reviewer_note??"No reason given."}. Do NOT proceed.`:i="EXPIRED \u2014 Your approval request timed out. Submit a new request if needed.",{jsonrpc:"2.0",id:t.id,result:{content:[{type:"text",text:i}]}}}return t}let A=null;async function u(){if(A)return;const e=await c("initialize",{protocolVersion:"2024-11-05",capabilities:{},clientInfo:{name:"aerostack-openclaw-bridge",version:"0.12.0"}});if(e.result){const r=e.result;A={protocolVersion:r.protocolVersion??"2024-11-05",instructions:r.instructions}}}const p=new v({name:"aerostack-openclaw-bridge",version:"0.12.0"},{capabilities:{tools:{},resources:{},prompts:{}}});p.setRequestHandler(O,async()=>{await u();const e=await c("tools/list");if(e.error)throw new Error(e.error.message);return{tools:e.result.tools??[]}}),p.setRequestHandler(h,async e=>{await u();const{name:r,arguments:t}=e.params,o=await j(r,t??{});return o.error?{content:[{type:"text",text:`Error: ${o.error.message}`}],isError:!0}:{content:o.result.content??[{type:"text",text:JSON.stringify(o.result)}]}}),p.setRequestHandler(y,async()=>{await u();const e=await c("resources/list");if(e.error)throw new Error(e.error.message);return{resources:e.result.resources??[]}}),p.setRequestHandler(P,async e=>{await u();const r=await c("resources/read",{uri:e.params.uri});if(r.error)throw new Error(r.error.message);return{contents:r.result.contents??[]}}),p.setRequestHandler(U,async()=>{await u();const e=await c("prompts/list");if(e.error)throw new Error(e.error.message);return{prompts:e.result.prompts??[]}}),p.setRequestHandler(q,async e=>{await u();const r=await c("prompts/get",{name:e.params.name,arguments:e.params.arguments});if(r.error)throw new Error(r.error.message);return{messages:r.result.messages??[]}});async function x(){d("Connecting to workspace",{url:w});const e=new _;await p.connect(e),d("Ready",{url:w})}x().catch(e=>{b("Fatal error",{error:e instanceof Error?e.message:String(e)}),process.exit(1)});
package/dist/logger.js CHANGED
@@ -1,25 +1,2 @@
1
- /**
2
- * Structured logger for aerostack-openclaw-bridge.
3
- * Writes JSON to stderr so it doesn't interfere with stdio MCP transport.
4
- */
5
- const LEVELS = { debug: 0, info: 1, warn: 2, error: 3 };
6
- const configured = (() => {
7
- const raw = (process.env.AEROSTACK_LOG_LEVEL ?? 'info').toLowerCase();
8
- return raw in LEVELS ? raw : 'info';
9
- })();
10
- export function log(level, msg, extra) {
11
- if (LEVELS[level] < LEVELS[configured])
12
- return;
13
- const entry = {
14
- ts: new Date().toISOString(),
15
- level,
16
- msg,
17
- ...extra,
18
- };
19
- process.stderr.write(JSON.stringify(entry) + '\n');
20
- }
21
- export const debug = (msg, extra) => log('debug', msg, extra);
22
- export const info = (msg, extra) => log('info', msg, extra);
23
- export const warn = (msg, extra) => log('warn', msg, extra);
24
- export const error = (msg, extra) => log('error', msg, extra);
25
- //# sourceMappingURL=logger.js.map
1
+ const t={debug:0,info:1,warn:2,error:3},i=(()=>{const r=(process.env.AEROSTACK_LOG_LEVEL??"info").toLowerCase();return r in t?r:"info"})();function n(r,o,e){if(t[r]<t[i])return;const s={ts:new Date().toISOString(),level:r,msg:o,...e};process.stderr.write(JSON.stringify(s)+`
2
+ `)}const c=(r,o)=>n("debug",r,o),f=(r,o)=>n("info",r,o),g=(r,o)=>n("warn",r,o),p=(r,o)=>n("error",r,o);export{c as debug,p as error,f as info,n as log,g as warn};
@@ -1,205 +1 @@
1
- /**
2
- * ApprovalResolver — WebSocket-first approval resolution with polling fallback.
3
- *
4
- * Strategy:
5
- * 1. Primary: Connect WebSocket to ws_url (zero-poll, instant wake via ApprovalGateDO)
6
- * 2. Safety net: Slow background poll every 30s (catches lost DO signals)
7
- * 3. Fallback: If WS upgrade fails, full polling at 3s intervals (legacy behavior)
8
- *
9
- * The WS carries status-only messages ({ status: 'executed' | 'approved' | 'rejected' | 'expired' }).
10
- * Full results are NOT sent via WS (CF 1MB limit). The caller retries the original
11
- * tools/call to get the cached result through the normal gateway path.
12
- */
13
- import { info, warn, debug } from './logger.js';
14
- export async function resolveApproval(opts) {
15
- const { approvalId, wsUrl, pollUrl, pollIntervalMs, timeoutMs } = opts;
16
- const deadline = Date.now() + timeoutMs;
17
- // Try WebSocket first if ws_url is available
18
- if (wsUrl) {
19
- try {
20
- return await resolveViaWebSocket(approvalId, wsUrl, pollUrl, deadline);
21
- }
22
- catch (err) {
23
- const msg = err instanceof Error ? err.message : 'Unknown WS error';
24
- warn('WebSocket resolution failed, falling back to polling', { approvalId, error: msg });
25
- }
26
- }
27
- // Fallback: full polling
28
- return resolveViaPolling(approvalId, pollUrl, pollIntervalMs, deadline);
29
- }
30
- // ── WebSocket Resolution ────────────────────────────────────────────────────
31
- async function resolveViaWebSocket(approvalId, wsUrl, pollUrl, deadline) {
32
- // Dynamic import — ws is only needed for WS path, not for polling-only
33
- const WebSocketImpl = await getWebSocket();
34
- return new Promise((resolve, reject) => {
35
- let settled = false;
36
- let slowPollTimer = null;
37
- let timeoutTimer = null;
38
- const cleanup = () => {
39
- settled = true;
40
- if (slowPollTimer)
41
- clearInterval(slowPollTimer);
42
- if (timeoutTimer)
43
- clearTimeout(timeoutTimer);
44
- };
45
- const settle = (result) => {
46
- if (settled)
47
- return;
48
- cleanup();
49
- resolve(result);
50
- };
51
- const fail = (err) => {
52
- if (settled)
53
- return;
54
- cleanup();
55
- reject(err);
56
- };
57
- debug('Connecting WebSocket', { approvalId, wsUrl });
58
- const ws = new WebSocketImpl(wsUrl);
59
- ws.onopen = () => {
60
- info('WebSocket connected, waiting for resolution', { approvalId });
61
- };
62
- ws.onmessage = (event) => {
63
- try {
64
- const data = typeof event.data === 'string'
65
- ? JSON.parse(event.data)
66
- : JSON.parse(String(event.data));
67
- const status = data?.status;
68
- debug('WebSocket message received', { approvalId, status });
69
- if (status === 'executed' || status === 'approved' || status === 'rejected' || status === 'expired') {
70
- info('Approval resolved via WebSocket', { approvalId, status });
71
- settle({ status, reviewer_note: data?.reviewer_note });
72
- try {
73
- ws.close(1000);
74
- }
75
- catch { /* already closing */ }
76
- }
77
- }
78
- catch (err) {
79
- warn('Failed to parse WebSocket message', { approvalId });
80
- }
81
- };
82
- ws.onerror = (err) => {
83
- const msg = err instanceof Error ? err.message : 'WebSocket error';
84
- debug('WebSocket error', { approvalId, error: msg });
85
- fail(new Error(`WebSocket error: ${msg}`));
86
- };
87
- ws.onclose = (event) => {
88
- if (!settled) {
89
- debug('WebSocket closed without resolution', { approvalId, code: event.code });
90
- fail(new Error(`WebSocket closed unexpectedly (code ${event.code})`));
91
- }
92
- };
93
- // Handle the already-resolved race: server returns HTTP JSON instead of WS upgrade.
94
- // The `ws` package emits 'unexpected-response' when it gets a non-101 response.
95
- if (typeof ws.on === 'function') {
96
- ws.on('unexpected-response', async (req, res) => {
97
- try {
98
- const chunks = [];
99
- for await (const chunk of res)
100
- chunks.push(chunk);
101
- const body = Buffer.concat(chunks).toString();
102
- const data = JSON.parse(body);
103
- const status = data?.status;
104
- if (status && status !== 'pending') {
105
- info('Approval already resolved (WS endpoint returned JSON)', { approvalId, status });
106
- settle({ status: status, reviewer_note: data?.reviewer_note });
107
- return;
108
- }
109
- }
110
- catch { /* fall through to error */ }
111
- fail(new Error('WebSocket upgrade rejected by server'));
112
- });
113
- }
114
- // Safety net: slow background poll every 30s
115
- const SLOW_POLL_MS = 30_000;
116
- slowPollTimer = setInterval(async () => {
117
- if (settled)
118
- return;
119
- try {
120
- const result = await pollOnce(pollUrl);
121
- if (result) {
122
- info('Approval resolved via safety-net poll', { approvalId, status: result.status });
123
- settle(result);
124
- try {
125
- ws.close(1000);
126
- }
127
- catch { /* ignore */ }
128
- }
129
- }
130
- catch { /* poll failed — WS is still primary */ }
131
- }, SLOW_POLL_MS);
132
- // Timeout
133
- const remaining = deadline - Date.now();
134
- if (remaining <= 0) {
135
- fail(new Error('Approval timeout'));
136
- return;
137
- }
138
- timeoutTimer = setTimeout(() => {
139
- if (!settled) {
140
- warn('Approval timed out', { approvalId });
141
- settle({ status: 'expired' });
142
- try {
143
- ws.close(1000);
144
- }
145
- catch { /* ignore */ }
146
- }
147
- }, remaining);
148
- });
149
- }
150
- // ── Polling Resolution ──────────────────────────────────────────────────────
151
- async function resolveViaPolling(approvalId, pollUrl, intervalMs, deadline) {
152
- info('Polling for approval resolution', { approvalId, intervalMs });
153
- while (Date.now() < deadline) {
154
- await sleep(intervalMs);
155
- try {
156
- const result = await pollOnce(pollUrl);
157
- if (result) {
158
- info('Approval resolved via polling', { approvalId, status: result.status });
159
- return result;
160
- }
161
- }
162
- catch {
163
- // Network error — keep trying
164
- }
165
- }
166
- warn('Approval polling timed out', { approvalId });
167
- return { status: 'expired' };
168
- }
169
- // ── Helpers ─────────────────────────────────────────────────────────────────
170
- async function pollOnce(pollUrl) {
171
- const res = await fetch(pollUrl, {
172
- headers: { 'User-Agent': 'aerostack-openclaw-bridge/0.11.0' },
173
- });
174
- if (!res.ok)
175
- return null;
176
- const data = await res.json();
177
- const status = data.status;
178
- if (status === 'executed' || status === 'approved') {
179
- return { status, reviewer_note: data.reviewer_note };
180
- }
181
- if (status === 'rejected') {
182
- return { status: 'rejected', reviewer_note: data.reviewer_note };
183
- }
184
- if (status === 'expired') {
185
- return { status: 'expired' };
186
- }
187
- return null; // still pending
188
- }
189
- async function getWebSocket() {
190
- // Use native WebSocket if available (Node 22+), otherwise fall back to ws
191
- if (typeof globalThis.WebSocket !== 'undefined') {
192
- return globalThis.WebSocket;
193
- }
194
- try {
195
- const ws = await import('ws');
196
- return ws.default;
197
- }
198
- catch {
199
- throw new Error('WebSocket not available. Install the "ws" package: npm install ws');
200
- }
201
- }
202
- function sleep(ms) {
203
- return new Promise(resolve => setTimeout(resolve, ms));
204
- }
205
- //# sourceMappingURL=resolution.js.map
1
+ import{info as u,warn as g,debug as b}from"./logger.js";async function j(e){const{approvalId:r,wsUrl:n,pollUrl:o,pollIntervalMs:l,timeoutMs:k}=e,d=Date.now()+k;if(n)try{return await A(r,n,o,d)}catch(c){const f=c instanceof Error?c.message:"Unknown WS error";g("WebSocket resolution failed, falling back to polling",{approvalId:r,error:f})}return O(r,o,l,d)}async function A(e,r,n,o){const l=await E();return new Promise((k,d)=>{let c=!1,f=null,m=null;const y=()=>{c=!0,f&&clearInterval(f),m&&clearTimeout(m)},w=t=>{c||(y(),k(t))},p=t=>{c||(y(),d(t))};b("Connecting WebSocket",{approvalId:e,wsUrl:r});const a=new l(r);a.onopen=()=>{u("WebSocket connected, waiting for resolution",{approvalId:e})},a.onmessage=t=>{try{const i=typeof t.data=="string"?JSON.parse(t.data):JSON.parse(String(t.data)),s=i?.status;if(b("WebSocket message received",{approvalId:e,status:s}),s==="executed"||s==="approved"||s==="rejected"||s==="expired"){u("Approval resolved via WebSocket",{approvalId:e,status:s}),w({status:s,reviewer_note:i?.reviewer_note});try{a.close(1e3)}catch{}}}catch{g("Failed to parse WebSocket message",{approvalId:e})}},a.onerror=t=>{const i=t instanceof Error?t.message:"WebSocket error";b("WebSocket error",{approvalId:e,error:i}),p(new Error(`WebSocket error: ${i}`))},a.onclose=t=>{c||(b("WebSocket closed without resolution",{approvalId:e,code:t.code}),p(new Error(`WebSocket closed unexpectedly (code ${t.code})`)))},typeof a.on=="function"&&a.on("unexpected-response",async(t,i)=>{try{const s=[];for await(const x of i)s.push(x);const _=Buffer.concat(s).toString(),v=JSON.parse(_),S=v?.status;if(S&&S!=="pending"){u("Approval already resolved (WS endpoint returned JSON)",{approvalId:e,status:S}),w({status:S,reviewer_note:v?.reviewer_note});return}}catch{}p(new Error("WebSocket upgrade rejected by server"))}),f=setInterval(async()=>{if(!c)try{const t=await h(n);if(t){u("Approval resolved via safety-net poll",{approvalId:e,status:t.status}),w(t);try{a.close(1e3)}catch{}}}catch{}},3e4);const W=o-Date.now();if(W<=0){p(new Error("Approval timeout"));return}m=setTimeout(()=>{if(!c){g("Approval timed out",{approvalId:e}),w({status:"expired"});try{a.close(1e3)}catch{}}},W)})}async function O(e,r,n,o){for(u("Polling for approval resolution",{approvalId:e,intervalMs:n});Date.now()<o;){await P(n);try{const l=await h(r);if(l)return u("Approval resolved via polling",{approvalId:e,status:l.status}),l}catch{}}return g("Approval polling timed out",{approvalId:e}),{status:"expired"}}async function h(e){const r=await fetch(e,{headers:{"User-Agent":"aerostack-openclaw-bridge/0.11.0"}});if(!r.ok)return null;const n=await r.json(),o=n.status;return o==="executed"||o==="approved"?{status:o,reviewer_note:n.reviewer_note}:o==="rejected"?{status:"rejected",reviewer_note:n.reviewer_note}:o==="expired"?{status:"expired"}:null}async function E(){if(typeof globalThis.WebSocket<"u")return globalThis.WebSocket;try{return(await import("ws")).default}catch{throw new Error('WebSocket not available. Install the "ws" package: npm install ws')}}function P(e){return new Promise(r=>setTimeout(r,e))}export{j as resolveApproval};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aerostack/openclaw-bridge",
3
- "version": "0.12.0",
3
+ "version": "0.12.2",
4
4
  "description": "stdio-to-HTTP bridge connecting OpenClaw to Aerostack Workspaces via MCP",
5
5
  "author": "Aerostack",
6
6
  "license": "MIT",
@@ -11,11 +11,11 @@
11
11
  "aerostack-openclaw-bridge": "dist/index.js"
12
12
  },
13
13
  "files": [
14
- "dist",
14
+ "dist/**/*.js",
15
15
  "README.md"
16
16
  ],
17
17
  "scripts": {
18
- "build": "tsc",
18
+ "build": "node scripts/build.mjs",
19
19
  "prepublishOnly": "npm run build"
20
20
  },
21
21
  "dependencies": {
@@ -23,9 +23,10 @@
23
23
  "ws": "^8.18.0"
24
24
  },
25
25
  "devDependencies": {
26
- "typescript": "~5.8.3",
27
26
  "@types/node": "^22.0.0",
28
- "@types/ws": "^8.5.13"
27
+ "@types/ws": "^8.5.13",
28
+ "esbuild": "^0.21.5",
29
+ "typescript": "~5.8.3"
29
30
  },
30
31
  "engines": {
31
32
  "node": ">=18"
@@ -1,64 +0,0 @@
1
- /**
2
- * Local Guardian — synthetic MCP tool for LLM-cooperative approval gates
3
- * on local operations (file system, shell, git, deploy).
4
- *
5
- * Rules are fetched from the workspace during initialization.
6
- * When no workspace rules are configured, sensible defaults apply.
7
- * The bridge injects this tool into tools/list alongside workspace tools.
8
- * When the LLM calls it, the bridge delegates to the workspace's existing
9
- * `aerostack__request_approval` permission gate — same WebSocket, same
10
- * approval queue, same dashboard.
11
- */
12
- export interface GuardianRule {
13
- /** Machine-readable category (lowercase, alphanumeric + underscores) */
14
- category: string;
15
- /** Human-readable description of what this rule covers */
16
- description: string;
17
- /** Example patterns — helps the LLM recognize matching operations */
18
- examples?: string[];
19
- }
20
- export interface GuardianConfig {
21
- enabled: boolean;
22
- rules: GuardianRule[];
23
- }
24
- export declare const DEFAULT_RULES: GuardianRule[];
25
- /**
26
- * Extract Local Guardian config from workspace initialize response.
27
- * The workspace returns `_aerostack.local_guardian` with rules configured
28
- * by the workspace owner in the dashboard.
29
- */
30
- export declare function parseWorkspaceGuardianConfig(initResult: Record<string, unknown>): GuardianConfig | null;
31
- export declare function buildGuardianTool(rules: GuardianRule[]): {
32
- name: string;
33
- description: string;
34
- inputSchema: {
35
- type: "object";
36
- properties: {
37
- action: {
38
- type: string;
39
- description: string;
40
- };
41
- category: {
42
- type: string;
43
- description: string;
44
- };
45
- details: {
46
- type: string;
47
- description: string;
48
- };
49
- risk_level: {
50
- type: string;
51
- enum: string[];
52
- description: string;
53
- };
54
- };
55
- required: readonly ["action", "category"];
56
- };
57
- };
58
- export declare function buildGuardianInstructions(rules: GuardianRule[]): string;
59
- /**
60
- * Check if Local Guardian is force-disabled via env var.
61
- * Default: enabled. Set AEROSTACK_LOCAL_GUARDIAN=false to disable
62
- * regardless of workspace config.
63
- */
64
- export declare function isGuardianForceDisabled(): boolean;
package/dist/guardian.js DELETED
@@ -1,141 +0,0 @@
1
- /**
2
- * Local Guardian — synthetic MCP tool for LLM-cooperative approval gates
3
- * on local operations (file system, shell, git, deploy).
4
- *
5
- * Rules are fetched from the workspace during initialization.
6
- * When no workspace rules are configured, sensible defaults apply.
7
- * The bridge injects this tool into tools/list alongside workspace tools.
8
- * When the LLM calls it, the bridge delegates to the workspace's existing
9
- * `aerostack__request_approval` permission gate — same WebSocket, same
10
- * approval queue, same dashboard.
11
- */
12
- // ── Default Rules ─────────────────────────────────────────────────
13
- // Used when workspace has no custom rules configured.
14
- export const DEFAULT_RULES = [
15
- {
16
- category: 'file_delete',
17
- description: 'Deleting, removing, or permanently overwriting files',
18
- examples: ['rm', 'unlink', 'delete file', 'remove file', 'overwrite existing file'],
19
- },
20
- {
21
- category: 'shell_destructive',
22
- description: 'Destructive or irreversible shell commands',
23
- examples: ['rm -rf', 'DROP TABLE', 'DELETE FROM', 'truncate', 'format disk', 'mkfs'],
24
- },
25
- {
26
- category: 'git_push',
27
- description: 'Pushing code, force operations, or rewriting history',
28
- examples: ['git push', 'git force-push', 'git reset --hard', 'git rebase onto remote'],
29
- },
30
- {
31
- category: 'config_modify',
32
- description: 'Modifying sensitive configuration, environment, or credential files',
33
- examples: ['.env', '.env.production', 'credentials', 'secrets.yaml', 'config.production'],
34
- },
35
- {
36
- category: 'deploy',
37
- description: 'Deploying, publishing, or releasing to any environment',
38
- examples: ['deploy to production', 'npm publish', 'wrangler deploy', 'docker push'],
39
- },
40
- {
41
- category: 'database',
42
- description: 'Direct database mutations outside of migrations',
43
- examples: ['DROP', 'TRUNCATE', 'ALTER TABLE', 'DELETE FROM', 'UPDATE ... SET'],
44
- },
45
- ];
46
- // ── Parse workspace config ────────────────────────────────────────
47
- /**
48
- * Extract Local Guardian config from workspace initialize response.
49
- * The workspace returns `_aerostack.local_guardian` with rules configured
50
- * by the workspace owner in the dashboard.
51
- */
52
- export function parseWorkspaceGuardianConfig(initResult) {
53
- const ext = initResult._aerostack;
54
- if (!ext?.local_guardian)
55
- return null;
56
- const guardian = ext.local_guardian;
57
- const enabled = guardian.enabled !== false;
58
- const rules = guardian.rules;
59
- if (!Array.isArray(rules) || rules.length === 0)
60
- return null;
61
- // Validate each rule minimally
62
- const valid = rules.filter(r => typeof r.category === 'string' &&
63
- typeof r.description === 'string' &&
64
- /^[a-z0-9_]{1,50}$/.test(r.category));
65
- return valid.length > 0 ? { enabled, rules: valid } : null;
66
- }
67
- // ── Tool Schema ───────────────────────────────────────────────────
68
- export function buildGuardianTool(rules) {
69
- const ruleList = rules
70
- .map(r => {
71
- const exampleStr = r.examples?.length
72
- ? ` (e.g. ${r.examples.slice(0, 3).join(', ')})`
73
- : '';
74
- return ` - ${r.category}: ${r.description}${exampleStr}`;
75
- })
76
- .join('\n');
77
- const categories = rules.map(r => r.category);
78
- return {
79
- name: 'aerostack__local_guardian',
80
- description: 'IMPORTANT: You MUST call this tool BEFORE performing any of these operations on the local machine:\n' +
81
- ruleList + '\n\n' +
82
- 'This sends an approval request to the workspace owner via push notification. ' +
83
- 'WAIT for the response before proceeding. If REJECTED, do NOT perform the operation — ' +
84
- 'inform the user that it was blocked and provide the rejection reason. ' +
85
- 'If APPROVED, proceed normally.\n\n' +
86
- 'For operations not listed above but that feel risky or destructive, use category "other".',
87
- inputSchema: {
88
- type: 'object',
89
- properties: {
90
- action: {
91
- type: 'string',
92
- description: 'What you are about to do — be specific (e.g. "delete config.old.json", "git push to main", "send email to client@acme.com")',
93
- },
94
- category: {
95
- type: 'string',
96
- description: `Category of the operation. Known categories: ${categories.join(', ')}. Use "other" for anything else that seems risky.`,
97
- },
98
- details: {
99
- type: 'string',
100
- description: 'Additional context — full command, file paths, target environment, recipients, etc.',
101
- },
102
- risk_level: {
103
- type: 'string',
104
- enum: ['low', 'medium', 'high', 'critical'],
105
- description: 'Your assessment of the risk level',
106
- },
107
- },
108
- required: ['action', 'category'],
109
- },
110
- };
111
- }
112
- // ── Instructions ──────────────────────────────────────────────────
113
- export function buildGuardianInstructions(rules) {
114
- const ruleLines = rules
115
- .map(r => `- **${r.category}**: ${r.description}`)
116
- .join('\n');
117
- return [
118
- '',
119
- '## Local Operation Approval Rules (Enforced by Workspace)',
120
- '',
121
- 'Before performing any of the following operations on the local machine,',
122
- 'you MUST call the `aerostack__local_guardian` tool and wait for approval.',
123
- 'Do NOT skip this step — the workspace owner requires review for:',
124
- '',
125
- ruleLines,
126
- '',
127
- 'If approval is rejected, do NOT proceed. Inform the user of the rejection reason.',
128
- 'If approval times out, ask the user whether to proceed or wait longer.',
129
- ].join('\n');
130
- }
131
- // ── Env-level override ───────────────────────────────────────────
132
- /**
133
- * Check if Local Guardian is force-disabled via env var.
134
- * Default: enabled. Set AEROSTACK_LOCAL_GUARDIAN=false to disable
135
- * regardless of workspace config.
136
- */
137
- export function isGuardianForceDisabled() {
138
- const val = process.env.AEROSTACK_LOCAL_GUARDIAN?.toLowerCase();
139
- return val === 'false' || val === '0' || val === 'off';
140
- }
141
- //# sourceMappingURL=guardian.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"guardian.js","sourceRoot":"","sources":["../src/guardian.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts DELETED
@@ -1,24 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * @aerostack/openclaw-bridge
4
- *
5
- * stdio-to-HTTP bridge connecting OpenClaw (and any stdio MCP client)
6
- * to an Aerostack Workspace via Streamable HTTP transport.
7
- *
8
- * OpenClaw config:
9
- * {
10
- * "mcp": {
11
- * "servers": {
12
- * "my-workspace": {
13
- * "command": "npx",
14
- * "args": ["-y", "@aerostack/openclaw-bridge"],
15
- * "env": {
16
- * "AEROSTACK_WORKSPACE_URL": "https://api.aerostack.dev/api/gateway/ws/my-workspace",
17
- * "AEROSTACK_TOKEN": "mwt_..."
18
- * }
19
- * }
20
- * }
21
- * }
22
- * }
23
- */
24
- export {};
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/logger.d.ts DELETED
@@ -1,17 +0,0 @@
1
- /**
2
- * Structured logger for aerostack-openclaw-bridge.
3
- * Writes JSON to stderr so it doesn't interfere with stdio MCP transport.
4
- */
5
- declare const LEVELS: {
6
- readonly debug: 0;
7
- readonly info: 1;
8
- readonly warn: 2;
9
- readonly error: 3;
10
- };
11
- type Level = keyof typeof LEVELS;
12
- export declare function log(level: Level, msg: string, extra?: Record<string, unknown>): void;
13
- export declare const debug: (msg: string, extra?: Record<string, unknown>) => void;
14
- export declare const info: (msg: string, extra?: Record<string, unknown>) => void;
15
- export declare const warn: (msg: string, extra?: Record<string, unknown>) => void;
16
- export declare const error: (msg: string, extra?: Record<string, unknown>) => void;
17
- export {};
@@ -1 +0,0 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAW,CAAC;AAGjE,MAAM,UAAU,GAAU,CAAC,GAAG,EAAE;IAC5B,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;IACtE,OAAO,GAAG,IAAI,MAAM,CAAC,CAAC,CAAE,GAAa,CAAC,CAAC,CAAC,MAAM,CAAC;AACnD,CAAC,CAAC,EAAE,CAAC;AAEL,MAAM,UAAU,GAAG,CAAC,KAAY,EAAE,GAAW,EAAE,KAA+B;IAC1E,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC;QAAE,OAAO;IAC/C,MAAM,KAAK,GAA4B;QACnC,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAC5B,KAAK;QACL,GAAG;QACH,GAAG,KAAK;KACX,CAAC;IACF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,GAAW,EAAE,KAA+B,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAChG,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,KAA+B,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAC9F,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,KAA+B,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAC9F,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,GAAW,EAAE,KAA+B,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC"}
@@ -1,25 +0,0 @@
1
- /**
2
- * ApprovalResolver — WebSocket-first approval resolution with polling fallback.
3
- *
4
- * Strategy:
5
- * 1. Primary: Connect WebSocket to ws_url (zero-poll, instant wake via ApprovalGateDO)
6
- * 2. Safety net: Slow background poll every 30s (catches lost DO signals)
7
- * 3. Fallback: If WS upgrade fails, full polling at 3s intervals (legacy behavior)
8
- *
9
- * The WS carries status-only messages ({ status: 'executed' | 'approved' | 'rejected' | 'expired' }).
10
- * Full results are NOT sent via WS (CF 1MB limit). The caller retries the original
11
- * tools/call to get the cached result through the normal gateway path.
12
- */
13
- export interface ApprovalResult {
14
- status: 'approved' | 'executed' | 'rejected' | 'expired';
15
- reviewer_note?: string;
16
- }
17
- interface ResolveOptions {
18
- approvalId: string;
19
- wsUrl?: string;
20
- pollUrl: string;
21
- pollIntervalMs: number;
22
- timeoutMs: number;
23
- }
24
- export declare function resolveApproval(opts: ResolveOptions): Promise<ApprovalResult>;
25
- export {};
@@ -1 +0,0 @@
1
- {"version":3,"file":"resolution.js","sourceRoot":"","sources":["../src/resolution.ts"],"names":[],"mappings":"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"}