@snutils/snu 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/README.md +156 -0
  2. package/bin/snu.js +8 -0
  3. package/dist/cli/format.d.ts +14 -0
  4. package/dist/cli/format.d.ts.map +1 -0
  5. package/dist/cli/format.js +231 -0
  6. package/dist/cli/format.js.map +1 -0
  7. package/dist/cli/index.d.ts +4 -0
  8. package/dist/cli/index.d.ts.map +1 -0
  9. package/dist/cli/index.js +296 -0
  10. package/dist/cli/index.js.map +1 -0
  11. package/dist/cli/stdin.d.ts +14 -0
  12. package/dist/cli/stdin.d.ts.map +1 -0
  13. package/dist/cli/stdin.js +75 -0
  14. package/dist/cli/stdin.js.map +1 -0
  15. package/dist/client.d.ts +43 -0
  16. package/dist/client.d.ts.map +1 -0
  17. package/dist/client.js +350 -0
  18. package/dist/client.js.map +1 -0
  19. package/dist/index.d.ts +7 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +28 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/mcp/index.d.ts +4 -0
  24. package/dist/mcp/index.d.ts.map +1 -0
  25. package/dist/mcp/index.js +185 -0
  26. package/dist/mcp/index.js.map +1 -0
  27. package/dist/registry.d.ts +5 -0
  28. package/dist/registry.d.ts.map +1 -0
  29. package/dist/registry.js +527 -0
  30. package/dist/registry.js.map +1 -0
  31. package/dist/server/canonical.d.ts +10 -0
  32. package/dist/server/canonical.d.ts.map +1 -0
  33. package/dist/server/canonical.js +72 -0
  34. package/dist/server/canonical.js.map +1 -0
  35. package/dist/server/config.d.ts +9 -0
  36. package/dist/server/config.d.ts.map +1 -0
  37. package/dist/server/config.js +117 -0
  38. package/dist/server/config.js.map +1 -0
  39. package/dist/server/dispatcher.d.ts +32 -0
  40. package/dist/server/dispatcher.d.ts.map +1 -0
  41. package/dist/server/dispatcher.js +631 -0
  42. package/dist/server/dispatcher.js.map +1 -0
  43. package/dist/server/httpBridge.d.ts +20 -0
  44. package/dist/server/httpBridge.d.ts.map +1 -0
  45. package/dist/server/httpBridge.js +219 -0
  46. package/dist/server/httpBridge.js.map +1 -0
  47. package/dist/server/pendingRegistry.d.ts +26 -0
  48. package/dist/server/pendingRegistry.d.ts.map +1 -0
  49. package/dist/server/pendingRegistry.js +76 -0
  50. package/dist/server/pendingRegistry.js.map +1 -0
  51. package/dist/server/policy.d.ts +18 -0
  52. package/dist/server/policy.d.ts.map +1 -0
  53. package/dist/server/policy.js +53 -0
  54. package/dist/server/policy.js.map +1 -0
  55. package/dist/server/standalone.d.ts +24 -0
  56. package/dist/server/standalone.d.ts.map +1 -0
  57. package/dist/server/standalone.js +152 -0
  58. package/dist/server/standalone.js.map +1 -0
  59. package/dist/server/wsBridge.d.ts +45 -0
  60. package/dist/server/wsBridge.d.ts.map +1 -0
  61. package/dist/server/wsBridge.js +321 -0
  62. package/dist/server/wsBridge.js.map +1 -0
  63. package/dist/types.d.ts +123 -0
  64. package/dist/types.d.ts.map +1 -0
  65. package/dist/types.js +6 -0
  66. package/dist/types.js.map +1 -0
  67. package/package.json +51 -0
@@ -0,0 +1,152 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.StandaloneBridge = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const os = __importStar(require("os"));
40
+ const crypto = __importStar(require("crypto"));
41
+ const wsBridge_js_1 = require("./wsBridge.js");
42
+ const httpBridge_js_1 = require("./httpBridge.js");
43
+ const dispatcher_js_1 = require("./dispatcher.js");
44
+ class StandaloneBridge {
45
+ options;
46
+ wsBridge;
47
+ httpBridge;
48
+ token;
49
+ cwd;
50
+ writtenPortFiles = [];
51
+ constructor(options = {}) {
52
+ this.options = options;
53
+ this.token = crypto.randomBytes(24).toString('hex');
54
+ this.cwd = options.cwd || process.cwd();
55
+ }
56
+ async start() {
57
+ // 1. Start WebSocket Bridge on 1978
58
+ const wsBridge = new wsBridge_js_1.StandaloneWsBridge(this.options.wsPort ?? 1978);
59
+ const wsPort = await wsBridge.start();
60
+ this.wsBridge = wsBridge;
61
+ // 2. Start Dispatcher
62
+ const dispatcher = new dispatcher_js_1.StandaloneDispatcher({
63
+ cwd: this.cwd,
64
+ wsBridge,
65
+ });
66
+ // 3. Start HTTP Bridge on 1977
67
+ const httpBridge = new httpBridge_js_1.StandaloneHttpBridge({
68
+ port: this.options.httpPort ?? 1977,
69
+ token: this.token,
70
+ dispatcher,
71
+ onYield: async () => {
72
+ await this.stop();
73
+ if (this.options.onYield) {
74
+ this.options.onYield();
75
+ }
76
+ },
77
+ });
78
+ const httpPort = await httpBridge.start();
79
+ this.httpBridge = httpBridge;
80
+ // 4. Write Port Files
81
+ this.writePortFiles(httpPort);
82
+ // 5. Clean up on exit
83
+ const cleanup = () => {
84
+ this.cleanPortFiles();
85
+ };
86
+ process.once('SIGINT', cleanup);
87
+ process.once('SIGTERM', cleanup);
88
+ process.once('exit', cleanup);
89
+ return { httpPort, wsPort, token: this.token };
90
+ }
91
+ writePortFiles(httpPort) {
92
+ const payload = JSON.stringify({
93
+ port: httpPort,
94
+ token: this.token,
95
+ pid: process.pid,
96
+ apiVersion: 8,
97
+ startedAt: Date.now(),
98
+ hostKind: 'standalone',
99
+ }, null, 2);
100
+ // 1. Workspace port file: .vscode/sn-agent-port.json
101
+ try {
102
+ const vscodeDir = path.join(this.cwd, '.vscode');
103
+ if (!fs.existsSync(vscodeDir)) {
104
+ fs.mkdirSync(vscodeDir, { recursive: true });
105
+ }
106
+ const wsPortFile = path.join(vscodeDir, 'sn-agent-port.json');
107
+ fs.writeFileSync(wsPortFile, payload);
108
+ this.writtenPortFiles.push(wsPortFile);
109
+ }
110
+ catch { }
111
+ // 2. Global port file: ~/.sn-scriptsync/agent-port.json
112
+ try {
113
+ const globalDir = path.join(os.homedir(), '.sn-scriptsync');
114
+ if (!fs.existsSync(globalDir)) {
115
+ fs.mkdirSync(globalDir, { recursive: true });
116
+ }
117
+ const globalPortFile = path.join(globalDir, 'agent-port.json');
118
+ fs.writeFileSync(globalPortFile, payload);
119
+ this.writtenPortFiles.push(globalPortFile);
120
+ }
121
+ catch { }
122
+ }
123
+ cleanPortFiles() {
124
+ for (const p of this.writtenPortFiles) {
125
+ try {
126
+ if (fs.existsSync(p)) {
127
+ const raw = fs.readFileSync(p, 'utf8');
128
+ const data = JSON.parse(raw);
129
+ // Only remove if this process owns it
130
+ if (data.pid === process.pid) {
131
+ fs.unlinkSync(p);
132
+ }
133
+ }
134
+ }
135
+ catch { }
136
+ }
137
+ this.writtenPortFiles = [];
138
+ }
139
+ async stop() {
140
+ this.cleanPortFiles();
141
+ if (this.httpBridge) {
142
+ await this.httpBridge.close();
143
+ this.httpBridge = undefined;
144
+ }
145
+ if (this.wsBridge) {
146
+ await this.wsBridge.close();
147
+ this.wsBridge = undefined;
148
+ }
149
+ }
150
+ }
151
+ exports.StandaloneBridge = StandaloneBridge;
152
+ //# sourceMappingURL=standalone.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standalone.js","sourceRoot":"","sources":["../../src/server/standalone.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import { PendingRegistry } from './pendingRegistry.js';
2
+ import { HelperCapabilities, InstanceGateSnapshot, SecurityGates } from '../types.js';
3
+ export interface HelperState {
4
+ tier: 'free' | 'pro' | 'trial' | 'enterprise';
5
+ proFeatures: boolean;
6
+ cdp: {
7
+ available: boolean;
8
+ reason: string | null;
9
+ };
10
+ capabilities: HelperCapabilities;
11
+ sessionEpoch: string;
12
+ instanceGates: Map<string, InstanceGateSnapshot>;
13
+ }
14
+ export interface ActiveReview {
15
+ reviewId: string;
16
+ nonce: string;
17
+ payloadHash: string;
18
+ consumed: boolean;
19
+ correlationId: string;
20
+ command: string;
21
+ params: any;
22
+ instanceOrigin: string;
23
+ createdAt: number;
24
+ }
25
+ export declare class StandaloneWsBridge {
26
+ private port;
27
+ private pending;
28
+ private wss?;
29
+ private activeClient?;
30
+ private state;
31
+ private activeReviews;
32
+ constructor(port?: number, pending?: PendingRegistry);
33
+ start(): Promise<number>;
34
+ private resetHelperState;
35
+ private handleMessage;
36
+ registerReview(active: Omit<ActiveReview, 'consumed' | 'createdAt'>): void;
37
+ cancelReview(reviewId: string, reason?: string): void;
38
+ sendToBrowser(payload: any): void;
39
+ hasBrowserClient(): boolean;
40
+ getHelperState(): HelperState;
41
+ getInstanceGate(instanceUrl?: string, gate?: keyof SecurityGates): import('./policy.js').GateMode;
42
+ isServerRunning(): boolean;
43
+ close(): Promise<void>;
44
+ }
45
+ //# sourceMappingURL=wsBridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wsBridge.d.ts","sourceRoot":"","sources":["../../src/server/wsBridge.ts"],"names":[],"mappings":"AAEA,OAAO,EAA0B,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,aAAa,EAAkB,MAAM,aAAa,CAAC;AAEtG,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,YAAY,CAAC;IAC9C,WAAW,EAAE,OAAO,CAAC;IACrB,GAAG,EAAE;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACnD,YAAY,EAAE,kBAAkB,CAAC;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;CAClD;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,GAAG,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,kBAAkB;IAc3B,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,OAAO;IAdjB,OAAO,CAAC,GAAG,CAAC,CAAkB;IAC9B,OAAO,CAAC,YAAY,CAAC,CAAY;IACjC,OAAO,CAAC,KAAK,CAOX;IACF,OAAO,CAAC,aAAa,CAAmC;gBAG9C,IAAI,SAAO,EACX,OAAO,GAAE,eAAwC;IAGrD,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAgE9B,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,aAAa;IAuIrB,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,UAAU,GAAG,WAAW,CAAC,GAAG,IAAI;IAQ1E,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,SAAc,GAAG,IAAI;IAc1D,aAAa,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI;IAOjC,gBAAgB,IAAI,OAAO;IAI3B,cAAc,IAAI,WAAW;IAI7B,eAAe,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,aAAa,GAAG,OAAO,aAAa,EAAE,QAAQ;IAYjG,eAAe,IAAI,OAAO;IAIpB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAkB7B"}
@@ -0,0 +1,321 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.StandaloneWsBridge = void 0;
37
+ const crypto = __importStar(require("crypto"));
38
+ const ws_1 = require("ws");
39
+ const pendingRegistry_js_1 = require("./pendingRegistry.js");
40
+ class StandaloneWsBridge {
41
+ port;
42
+ pending;
43
+ wss;
44
+ activeClient;
45
+ state = {
46
+ tier: 'free',
47
+ proFeatures: false,
48
+ cdp: { available: false, reason: 'E_PRO_REQUIRED' },
49
+ capabilities: { protocolVersion: 1 },
50
+ sessionEpoch: '',
51
+ instanceGates: new Map(),
52
+ };
53
+ activeReviews = new Map();
54
+ constructor(port = 1978, pending = pendingRegistry_js_1.defaultPendingRegistry) {
55
+ this.port = port;
56
+ this.pending = pending;
57
+ }
58
+ async start() {
59
+ return new Promise((resolve, reject) => {
60
+ try {
61
+ const wss = new ws_1.WebSocketServer({ port: this.port, host: '127.0.0.1' }, () => {
62
+ this.wss = wss;
63
+ const addr = wss.address();
64
+ const actualPort = typeof addr === 'object' && addr ? addr.port : this.port;
65
+ this.port = actualPort;
66
+ resolve(actualPort);
67
+ });
68
+ wss.on('error', (err) => {
69
+ reject(err);
70
+ });
71
+ wss.on('connection', (ws) => {
72
+ if (this.activeClient && this.activeClient !== ws) {
73
+ try {
74
+ this.activeClient.close(1000, 'Replaced by new connection');
75
+ }
76
+ catch { }
77
+ }
78
+ this.activeClient = ws;
79
+ this.state.sessionEpoch = crypto.randomUUID();
80
+ // Send host hello
81
+ try {
82
+ ws.send(JSON.stringify({
83
+ action: 'hostHello',
84
+ protocolVersion: 1,
85
+ hostKind: 'standalone',
86
+ sessionEpoch: this.state.sessionEpoch,
87
+ features: {
88
+ commandReview: 1,
89
+ rejectionFeedback: 1,
90
+ instanceSecurityGates: 1,
91
+ },
92
+ }));
93
+ }
94
+ catch { }
95
+ ws.on('message', (raw) => {
96
+ try {
97
+ const msg = JSON.parse(raw.toString('utf8'));
98
+ this.handleMessage(ws, msg);
99
+ }
100
+ catch {
101
+ // Ignore malformed frames
102
+ }
103
+ });
104
+ ws.on('close', () => {
105
+ if (this.activeClient === ws) {
106
+ this.activeClient = undefined;
107
+ this.resetHelperState();
108
+ this.pending.rejectAll('E_BROWSER_DISCONNECTED', 'Browser helper disconnected');
109
+ }
110
+ });
111
+ });
112
+ }
113
+ catch (err) {
114
+ reject(err);
115
+ }
116
+ });
117
+ }
118
+ resetHelperState() {
119
+ this.state = {
120
+ tier: 'free',
121
+ proFeatures: false,
122
+ cdp: { available: false, reason: 'E_PRO_REQUIRED' },
123
+ capabilities: { protocolVersion: 1 },
124
+ sessionEpoch: '',
125
+ instanceGates: new Map(),
126
+ };
127
+ this.activeReviews.clear();
128
+ }
129
+ handleMessage(ws, msg) {
130
+ if (ws !== this.activeClient)
131
+ return;
132
+ // 1. Immutable merge for license / build info
133
+ if (msg.action === 'helperLicenseInfo' || msg.action === 'helperBuildInfo' || msg.action === 'helperHello') {
134
+ if (msg.tier)
135
+ this.state.tier = msg.tier;
136
+ if (typeof msg.proFeatures === 'boolean')
137
+ this.state.proFeatures = msg.proFeatures;
138
+ if (msg.cdp)
139
+ this.state.cdp = msg.cdp;
140
+ if (msg.capabilities && typeof msg.capabilities === 'object') {
141
+ this.state.capabilities = {
142
+ ...this.state.capabilities,
143
+ ...msg.capabilities,
144
+ protocolVersion: msg.capabilities.protocolVersion || 1,
145
+ };
146
+ }
147
+ return;
148
+ }
149
+ // 2. Per-Instance Gate Snapshot update
150
+ if (msg.action === 'helperGatesUpdated') {
151
+ try {
152
+ if (!msg.instanceOrigin || typeof msg.instanceOrigin !== 'string' || typeof msg.revision !== 'number')
153
+ return;
154
+ const origin = new URL(msg.instanceOrigin).origin.toLowerCase();
155
+ const revision = Math.floor(msg.revision);
156
+ if (!Number.isSafeInteger(revision) || revision < 1)
157
+ return;
158
+ const current = this.state.instanceGates.get(origin);
159
+ if (current && revision <= current.revision) {
160
+ // Discard stale out-of-order revision
161
+ return;
162
+ }
163
+ const rawGates = msg.gates;
164
+ if (!rawGates || typeof rawGates !== 'object')
165
+ return;
166
+ const isValidGateVal = (v) => typeof v === 'boolean' || v === 'off' || v === 'approve' || v === 'auto';
167
+ // Require every field to be a valid gate mode
168
+ if (!isValidGateVal(rawGates.backgroundScripts) ||
169
+ !isValidGateVal(rawGates.deleteRecords) ||
170
+ !isValidGateVal(rawGates.createArtifacts) ||
171
+ !isValidGateVal(rawGates.browserDebugger) ||
172
+ !isValidGateVal(rawGates.restRequest)) {
173
+ // Reject malformed / partial gate snapshot
174
+ return;
175
+ }
176
+ const gates = {
177
+ backgroundScripts: rawGates.backgroundScripts,
178
+ deleteRecords: rawGates.deleteRecords,
179
+ createArtifacts: rawGates.createArtifacts,
180
+ browserDebugger: rawGates.browserDebugger,
181
+ restRequest: rawGates.restRequest,
182
+ };
183
+ this.state.instanceGates.set(origin, {
184
+ instanceOrigin: origin,
185
+ revision,
186
+ receivedAt: Date.now(),
187
+ gates,
188
+ });
189
+ }
190
+ catch { }
191
+ return;
192
+ }
193
+ // 3. Two-phase review response from browser helper tab
194
+ if (msg.action === 'reviewResponse') {
195
+ const { reviewId, nonce, payloadHash, approved, userFeedback } = msg;
196
+ const active = this.activeReviews.get(reviewId);
197
+ if (!active)
198
+ return;
199
+ if (active.consumed || active.nonce !== nonce) {
200
+ // Replay or invalid nonce
201
+ this.pending.reject(active.correlationId, 'E_REPLAY_DETECTED', 'Replay detected or invalid review nonce', {
202
+ reviewId,
203
+ });
204
+ this.activeReviews.delete(reviewId);
205
+ return;
206
+ }
207
+ if (active.payloadHash !== payloadHash) {
208
+ this.pending.reject(active.correlationId, 'E_COMMAND_FAILED', 'Payload hash mismatch during review', {
209
+ reviewId,
210
+ });
211
+ this.activeReviews.delete(reviewId);
212
+ return;
213
+ }
214
+ // Check if command is still pending (e.g. has not timed out or been cancelled)
215
+ if (!this.pending.has(active.correlationId)) {
216
+ this.activeReviews.delete(reviewId);
217
+ return;
218
+ }
219
+ active.consumed = true;
220
+ if (!approved) {
221
+ const feedback = typeof userFeedback === 'string' ? userFeedback.slice(0, 1000).trim() : undefined;
222
+ this.pending.reject(active.correlationId, 'E_USER_REJECTED', feedback ? `Execution rejected by developer: "${feedback}"` : 'Execution rejected by developer in browser helper tab', { userFeedback: feedback, reviewId });
223
+ this.activeReviews.delete(reviewId);
224
+ return;
225
+ }
226
+ // Approved! Authorize execution on helper
227
+ try {
228
+ this.sendToBrowser({
229
+ action: 'executeApproved',
230
+ reviewId,
231
+ nonce,
232
+ payloadHash,
233
+ agentRequestId: active.correlationId,
234
+ });
235
+ }
236
+ catch (err) {
237
+ this.pending.reject(active.correlationId, 'E_BROWSER_DISCONNECTED', err?.message || String(err));
238
+ }
239
+ return;
240
+ }
241
+ // 4. Standard correlated agent responses
242
+ if (msg.agentRequestId) {
243
+ if (msg.success === false && msg.code) {
244
+ this.pending.reject(msg.agentRequestId, msg.code, msg.error || 'Command failed', msg.details);
245
+ }
246
+ else {
247
+ this.pending.resolve(msg.agentRequestId, msg);
248
+ }
249
+ }
250
+ }
251
+ registerReview(active) {
252
+ this.activeReviews.set(active.reviewId, {
253
+ ...active,
254
+ consumed: false,
255
+ createdAt: Date.now(),
256
+ });
257
+ }
258
+ cancelReview(reviewId, reason = 'CANCELLED') {
259
+ const active = this.activeReviews.get(reviewId);
260
+ if (active) {
261
+ this.activeReviews.delete(reviewId);
262
+ try {
263
+ this.sendToBrowser({
264
+ action: 'cancelReview',
265
+ reviewId,
266
+ reason,
267
+ });
268
+ }
269
+ catch { }
270
+ }
271
+ }
272
+ sendToBrowser(payload) {
273
+ if (!this.activeClient || this.activeClient.readyState !== ws_1.WebSocket.OPEN) {
274
+ throw new Error('No browser helper connected. Open the SN Utils helper tab via /token.');
275
+ }
276
+ this.activeClient.send(JSON.stringify(payload));
277
+ }
278
+ hasBrowserClient() {
279
+ return !!this.activeClient && this.activeClient.readyState === ws_1.WebSocket.OPEN;
280
+ }
281
+ getHelperState() {
282
+ return this.state;
283
+ }
284
+ getInstanceGate(instanceUrl, gate) {
285
+ if (!instanceUrl || !gate)
286
+ return 'off';
287
+ try {
288
+ const origin = new URL(instanceUrl).origin.toLowerCase();
289
+ const snap = this.state.instanceGates.get(origin);
290
+ if (snap) {
291
+ return snap.gates[gate] ?? 'approve';
292
+ }
293
+ }
294
+ catch { }
295
+ return 'off';
296
+ }
297
+ isServerRunning() {
298
+ return !!this.wss;
299
+ }
300
+ async close() {
301
+ this.resetHelperState();
302
+ this.pending.rejectAll('E_SERVER_STOPPED', 'ScriptSync server stopped');
303
+ if (this.activeClient) {
304
+ try {
305
+ this.activeClient.close();
306
+ }
307
+ catch { }
308
+ this.activeClient = undefined;
309
+ }
310
+ if (this.wss) {
311
+ return new Promise((resolve) => {
312
+ this.wss.close(() => {
313
+ this.wss = undefined;
314
+ resolve();
315
+ });
316
+ });
317
+ }
318
+ }
319
+ }
320
+ exports.StandaloneWsBridge = StandaloneWsBridge;
321
+ //# sourceMappingURL=wsBridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wsBridge.js","sourceRoot":"","sources":["../../src/server/wsBridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Wire-format and domain interfaces for @snutils/snu
3
+ */
4
+ import { SecurityGates, CommandPolicy } from './server/policy.js';
5
+ export { SecurityGates, CommandPolicy };
6
+ export interface AgentRequest {
7
+ id: string;
8
+ command: string;
9
+ params?: Record<string, any>;
10
+ instance?: string;
11
+ timestamp?: number;
12
+ }
13
+ export interface AgentResponse<T = any> {
14
+ id: string;
15
+ command: string;
16
+ status: 'success' | 'error';
17
+ result?: T;
18
+ error?: string;
19
+ code?: string;
20
+ timestamp: number;
21
+ details?: {
22
+ userFeedback?: string;
23
+ reviewId?: string;
24
+ instanceOrigin?: string;
25
+ expiresIn?: number;
26
+ [key: string]: any;
27
+ };
28
+ }
29
+ export interface HelperCapabilities {
30
+ protocolVersion: number;
31
+ commandReview?: 1;
32
+ rejectionFeedback?: 1;
33
+ instanceSecurityGates?: 1;
34
+ }
35
+ export interface InstanceGateSnapshot {
36
+ instanceOrigin: string;
37
+ revision: number;
38
+ receivedAt: number;
39
+ gates: SecurityGates;
40
+ }
41
+ export interface ReviewEnvelope {
42
+ required: true;
43
+ reviewId: string;
44
+ nonce: string;
45
+ payloadHash: string;
46
+ kind: 'background_script' | 'record_delete' | 'rest_delete' | 'ui_action' | 'bulk_delete';
47
+ summary: string;
48
+ targets?: Array<{
49
+ table: string;
50
+ sys_id: string;
51
+ display?: string;
52
+ }>;
53
+ script?: string;
54
+ instanceOrigin: string;
55
+ client: {
56
+ name: string;
57
+ version?: string;
58
+ hostKind: 'vscode' | 'standalone';
59
+ pid?: number;
60
+ };
61
+ }
62
+ export interface StagedWriteResult {
63
+ staged: true;
64
+ reviewId: string;
65
+ message: string;
66
+ }
67
+ export interface AgentPortFile {
68
+ port: number;
69
+ token: string;
70
+ pid: number;
71
+ apiVersion: number;
72
+ startedAt: number;
73
+ extensionVersion?: string;
74
+ }
75
+ export interface HealthResponse {
76
+ status: 'success';
77
+ apiVersion: number;
78
+ hostKind?: 'vscode' | 'standalone';
79
+ commands: string[];
80
+ pid: number;
81
+ }
82
+ export interface DiscoveryOptions {
83
+ portFile?: string;
84
+ cwd?: string;
85
+ }
86
+ export interface DiscoveryResult {
87
+ port: number;
88
+ token: string;
89
+ pid: number;
90
+ apiVersion: number;
91
+ portFilePath: string;
92
+ isGlobal: boolean;
93
+ }
94
+ export interface MappedCommand {
95
+ command: string;
96
+ instance?: string;
97
+ params: Record<string, any>;
98
+ }
99
+ export interface ToolOptionDefinition {
100
+ type: 'string' | 'boolean';
101
+ short?: string;
102
+ description?: string;
103
+ default?: any;
104
+ }
105
+ export interface ToolDefinition {
106
+ name: string;
107
+ agentCommand: string;
108
+ description: string;
109
+ cliCommand: string;
110
+ cliUsage?: string;
111
+ cliOptions?: Record<string, ToolOptionDefinition>;
112
+ inputSchema: {
113
+ type: 'object';
114
+ properties: Record<string, any>;
115
+ required?: string[];
116
+ anyOf?: Array<{
117
+ required: string[];
118
+ }>;
119
+ additionalProperties?: boolean;
120
+ };
121
+ mapInput: (input: Record<string, any>) => MappedCommand;
122
+ }
123
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}