@snutils/snu 0.2.11 → 0.3.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 (49) hide show
  1. package/README.md +2 -1
  2. package/dist/cli/doctor.d.ts +10 -0
  3. package/dist/cli/doctor.d.ts.map +1 -1
  4. package/dist/cli/doctor.js +25 -0
  5. package/dist/cli/doctor.js.map +1 -1
  6. package/dist/cli/format.d.ts.map +1 -1
  7. package/dist/cli/format.js +7 -1
  8. package/dist/cli/format.js.map +1 -1
  9. package/dist/cli/index.d.ts +11 -0
  10. package/dist/cli/index.d.ts.map +1 -1
  11. package/dist/cli/index.js +49 -1
  12. package/dist/cli/index.js.map +1 -1
  13. package/dist/mcp/index.d.ts.map +1 -1
  14. package/dist/mcp/index.js +12 -0
  15. package/dist/mcp/index.js.map +1 -1
  16. package/dist/registry.d.ts.map +1 -1
  17. package/dist/registry.js +63 -4
  18. package/dist/registry.js.map +1 -1
  19. package/dist/server/authProbe.d.ts +29 -0
  20. package/dist/server/authProbe.d.ts.map +1 -0
  21. package/dist/server/authProbe.js +67 -0
  22. package/dist/server/authProbe.js.map +1 -0
  23. package/dist/server/bridgeIdentity.d.ts +24 -0
  24. package/dist/server/bridgeIdentity.d.ts.map +1 -0
  25. package/dist/server/bridgeIdentity.js +120 -0
  26. package/dist/server/bridgeIdentity.js.map +1 -0
  27. package/dist/server/dispatcher.d.ts +11 -1
  28. package/dist/server/dispatcher.d.ts.map +1 -1
  29. package/dist/server/dispatcher.js +239 -78
  30. package/dist/server/dispatcher.js.map +1 -1
  31. package/dist/server/helperConnection.d.ts +24 -1
  32. package/dist/server/helperConnection.d.ts.map +1 -1
  33. package/dist/server/helperConnection.js +54 -4
  34. package/dist/server/helperConnection.js.map +1 -1
  35. package/dist/server/httpBridge.d.ts.map +1 -1
  36. package/dist/server/httpBridge.js +1 -0
  37. package/dist/server/httpBridge.js.map +1 -1
  38. package/dist/server/policy.d.ts.map +1 -1
  39. package/dist/server/policy.js +10 -1
  40. package/dist/server/policy.js.map +1 -1
  41. package/dist/server/scopeDiscovery.d.ts +37 -0
  42. package/dist/server/scopeDiscovery.d.ts.map +1 -0
  43. package/dist/server/scopeDiscovery.js +147 -0
  44. package/dist/server/scopeDiscovery.js.map +1 -0
  45. package/dist/server/wsBridge.d.ts +4 -1
  46. package/dist/server/wsBridge.d.ts.map +1 -1
  47. package/dist/server/wsBridge.js +59 -6
  48. package/dist/server/wsBridge.js.map +1 -1
  49. package/package.json +1 -1
@@ -0,0 +1,120 @@
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.loadBridgeId = loadBridgeId;
37
+ exports.inspectBridgeId = inspectBridgeId;
38
+ const crypto = __importStar(require("crypto"));
39
+ const fs = __importStar(require("fs"));
40
+ const os = __importStar(require("os"));
41
+ const path = __importStar(require("path"));
42
+ /**
43
+ * A stable identity for "the ScriptSync bridge of this user on this machine".
44
+ *
45
+ * The SN Utils helper tab re-sends ServiceNow session tokens on its own when it
46
+ * reconnects, but only to a bridge the user has handed a token to before. This
47
+ * id is how it recognises that bridge after a restart: it is created once,
48
+ * kept private to the user under ~/.sn-scriptsync, and shared by the VS Code
49
+ * host and the standalone snu bridge so switching hosts does not reset trust.
50
+ *
51
+ * Returns an empty string when the file cannot be read or created. The helper
52
+ * then never refreshes automatically and a manual /token is needed, which is
53
+ * the behaviour from before this existed.
54
+ */
55
+ function loadBridgeId(dir = path.join(os.homedir(), ".sn-scriptsync")) {
56
+ const file = path.join(dir, "bridge-id");
57
+ const read = () => {
58
+ const stat = fs.lstatSync(file);
59
+ if (!stat.isFile() || stat.isSymbolicLink())
60
+ return "";
61
+ // Existing files need the same privacy as newly created ones.
62
+ if (process.platform !== "win32")
63
+ fs.chmodSync(file, 0o600);
64
+ const id = fs.readFileSync(file, "utf8").trim();
65
+ return /^[a-f0-9]{64}$/.test(id) ? id : "";
66
+ };
67
+ try {
68
+ return read();
69
+ }
70
+ catch (err) {
71
+ if (err.code !== "ENOENT")
72
+ return "";
73
+ }
74
+ let temporary = "";
75
+ try {
76
+ fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
77
+ const id = crypto.randomBytes(32).toString("hex");
78
+ temporary = path.join(dir, `.bridge-id-${crypto.randomBytes(16).toString("hex")}`);
79
+ fs.writeFileSync(temporary, id + "\n", { mode: 0o600, flag: "wx" });
80
+ // Publish only a complete file, without replacing another host's identity.
81
+ try {
82
+ fs.linkSync(temporary, file);
83
+ }
84
+ catch (err) {
85
+ if (err.code !== "EEXIST")
86
+ return "";
87
+ }
88
+ return read();
89
+ }
90
+ catch {
91
+ return "";
92
+ }
93
+ finally {
94
+ if (temporary) {
95
+ try {
96
+ fs.unlinkSync(temporary);
97
+ }
98
+ catch { /* best effort */ }
99
+ }
100
+ }
101
+ }
102
+ /**
103
+ * Read-only look at the identity file, for diagnostics. Unlike loadBridgeId it
104
+ * never creates the file or changes its mode, and it never returns the id.
105
+ */
106
+ function inspectBridgeId(dir = path.join(os.homedir(), ".sn-scriptsync")) {
107
+ const file = path.join(dir, "bridge-id");
108
+ try {
109
+ const stat = fs.lstatSync(file);
110
+ if (!stat.isFile() || stat.isSymbolicLink())
111
+ return { status: "not-a-file", private: null };
112
+ const isPrivate = process.platform === "win32" ? null : (stat.mode & 0o077) === 0;
113
+ const id = fs.readFileSync(file, "utf8").trim();
114
+ return { status: /^[a-f0-9]{64}$/.test(id) ? "ok" : "invalid", private: isPrivate };
115
+ }
116
+ catch (err) {
117
+ return { status: err.code === "ENOENT" ? "missing" : "unreadable", private: null };
118
+ }
119
+ }
120
+ //# sourceMappingURL=bridgeIdentity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridgeIdentity.js","sourceRoot":"","sources":["../../src/server/bridgeIdentity.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,14 @@ import { StandaloneWsBridge } from './wsBridge.js';
2
2
  import { PendingRegistry } from './pendingRegistry.js';
3
3
  import { AgentRequest, AgentResponse } from '../types.js';
4
4
  import { SecurityGates } from './policy.js';
5
+ export declare const BROWSER_ACTIONS: {
6
+ readonly get_form_state: "agentGetFormState";
7
+ readonly set_field: "agentSetField";
8
+ readonly run_ui_action: "agentRunUiAction";
9
+ readonly navigate: "agentNavigate";
10
+ readonly take_screenshot: "takeScreenshot";
11
+ readonly switch_context: "switchContext";
12
+ };
5
13
  export declare const HELPER_CONNECT_GUIDANCE: string[];
6
14
  export declare function resolveMappedFileName(mapPath: string, rawName: string, sysId: string): {
7
15
  cleanName: string;
@@ -22,6 +30,8 @@ export declare class StandaloneDispatcher {
22
30
  private pending;
23
31
  private config;
24
32
  private pendingReviewRequests;
33
+ /** Pause before the single retry after E_SCREENSHOT_PERMISSION; tests shorten it. */
34
+ screenshotRetryDelayMs: number;
25
35
  private requestIdToCorrelationId;
26
36
  constructor(opts: StandaloneDispatcherOptions);
27
37
  getWorkspaceRoot(): string;
@@ -40,7 +50,6 @@ export declare class StandaloneDispatcher {
40
50
  private resolveScopeForCreate;
41
51
  listInstanceFolders(): string[];
42
52
  private pullTablePage;
43
- private allCodeTables;
44
53
  private restGet;
45
54
  resolveInstance(requestInstance?: string): {
46
55
  name: string;
@@ -48,6 +57,7 @@ export declare class StandaloneDispatcher {
48
57
  settings: any;
49
58
  };
50
59
  cancel(requestId: string, reason?: string): void;
60
+ private captureScreenshot;
51
61
  dispatch(req: AgentRequest): Promise<AgentResponse>;
52
62
  }
53
63
  //# sourceMappingURL=dispatcher.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../../src/server/dispatcher.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAA0B,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAoB,aAAa,EAAE,MAAM,aAAa,CAAC;AAiD9D,eAAO,MAAM,uBAAuB,UAInC,CAAC;AAwGF,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAoBxE;AAwBD,MAAM,WAAW,2BAA2B;IAC1C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC,aAAa,GAAG;QAAE,cAAc,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CAClE;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,EAAE,CAAqB;IAC/B,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,qBAAqB,CAA6B;IAC1D,OAAO,CAAC,wBAAwB,CAA6B;gBAEjD,IAAI,EAAE,2BAA2B;IAO7C,gBAAgB,IAAI,MAAM;IAI1B,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,GAAG;IAkBxC,sBAAsB,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;YAyDvC,yBAAyB;YAiDzB,sBAAsB;IA4BpC;;;;;;;OAOG;YACW,qBAAqB;IAmCnC,mBAAmB,IAAI,MAAM,EAAE;YAgBjB,aAAa;IAkK3B,OAAO,CAAC,aAAa;YASP,OAAO;IAmBrB,eAAe,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,GAAG,CAAA;KAAE;IA+E1F,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,SAAc,GAAG,IAAI;IAa/C,QAAQ,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;CAg8B1D"}
1
+ {"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../../src/server/dispatcher.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAA0B,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAoB,aAAa,EAAE,MAAM,aAAa,CAAC;AAc9D,eAAO,MAAM,eAAe;;;;;;;CAOlB,CAAC;AAmDX,eAAO,MAAM,uBAAuB,UAInC,CAAC;AAwGF,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAoBxE;AAwBD,MAAM,WAAW,2BAA2B;IAC1C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC,aAAa,GAAG;QAAE,cAAc,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CAClE;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,EAAE,CAAqB;IAC/B,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,qBAAqB,CAA6B;IAC1D,qFAAqF;IACrF,sBAAsB,SAAU;IAChC,OAAO,CAAC,wBAAwB,CAA6B;gBAEjD,IAAI,EAAE,2BAA2B;IAO7C,gBAAgB,IAAI,MAAM;IAI1B,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,GAAG;IAkBxC,sBAAsB,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;YAyDvC,yBAAyB;YAiDzB,sBAAsB;IA4BpC;;;;;;;OAOG;YACW,qBAAqB;IAmCnC,mBAAmB,IAAI,MAAM,EAAE;YAgBjB,aAAa;YAwKb,OAAO;IAoBrB,eAAe,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,GAAG,CAAA;KAAE;IAuF1F,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,SAAc,GAAG,IAAI;YAoBvC,iBAAiB;IA6EzB,QAAQ,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;CAg/B1D"}