@framers/agentos-ext-browser-automation 0.1.0 → 0.2.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 (129) hide show
  1. package/dist/attach/AttachController.d.ts +183 -0
  2. package/dist/attach/AttachController.d.ts.map +1 -0
  3. package/dist/attach/AttachController.js +283 -0
  4. package/dist/attach/AttachController.js.map +1 -0
  5. package/dist/attach/__tests__/AttachController.test.d.ts +2 -0
  6. package/dist/attach/__tests__/AttachController.test.d.ts.map +1 -0
  7. package/dist/attach/__tests__/AttachController.test.js +278 -0
  8. package/dist/attach/__tests__/AttachController.test.js.map +1 -0
  9. package/dist/attach/__tests__/attach-primitives.test.d.ts +2 -0
  10. package/dist/attach/__tests__/attach-primitives.test.d.ts.map +1 -0
  11. package/dist/attach/__tests__/attach-primitives.test.js +158 -0
  12. package/dist/attach/__tests__/attach-primitives.test.js.map +1 -0
  13. package/dist/attach/__tests__/jxa-args.test.d.ts +2 -0
  14. package/dist/attach/__tests__/jxa-args.test.d.ts.map +1 -0
  15. package/dist/attach/__tests__/jxa-args.test.js +37 -0
  16. package/dist/attach/__tests__/jxa-args.test.js.map +1 -0
  17. package/dist/attach/__tests__/pack-registration.test.d.ts +2 -0
  18. package/dist/attach/__tests__/pack-registration.test.d.ts.map +1 -0
  19. package/dist/attach/__tests__/pack-registration.test.js +34 -0
  20. package/dist/attach/__tests__/pack-registration.test.js.map +1 -0
  21. package/dist/attach/__tests__/tools.test.d.ts +2 -0
  22. package/dist/attach/__tests__/tools.test.d.ts.map +1 -0
  23. package/dist/attach/__tests__/tools.test.js +155 -0
  24. package/dist/attach/__tests__/tools.test.js.map +1 -0
  25. package/dist/attach/backends/__tests__/raw-cdp.test.d.ts +2 -0
  26. package/dist/attach/backends/__tests__/raw-cdp.test.d.ts.map +1 -0
  27. package/dist/attach/backends/__tests__/raw-cdp.test.js +133 -0
  28. package/dist/attach/backends/__tests__/raw-cdp.test.js.map +1 -0
  29. package/dist/attach/backends/jxa.d.ts +39 -0
  30. package/dist/attach/backends/jxa.d.ts.map +1 -0
  31. package/dist/attach/backends/jxa.js +188 -0
  32. package/dist/attach/backends/jxa.js.map +1 -0
  33. package/dist/attach/backends/raw-cdp.d.ts +53 -0
  34. package/dist/attach/backends/raw-cdp.d.ts.map +1 -0
  35. package/dist/attach/backends/raw-cdp.js +216 -0
  36. package/dist/attach/backends/raw-cdp.js.map +1 -0
  37. package/dist/attach/daemon/__tests__/client.test.d.ts +2 -0
  38. package/dist/attach/daemon/__tests__/client.test.d.ts.map +1 -0
  39. package/dist/attach/daemon/__tests__/client.test.js +58 -0
  40. package/dist/attach/daemon/__tests__/client.test.js.map +1 -0
  41. package/dist/attach/daemon/__tests__/daemon-lock.test.d.ts +2 -0
  42. package/dist/attach/daemon/__tests__/daemon-lock.test.d.ts.map +1 -0
  43. package/dist/attach/daemon/__tests__/daemon-lock.test.js +72 -0
  44. package/dist/attach/daemon/__tests__/daemon-lock.test.js.map +1 -0
  45. package/dist/attach/daemon/__tests__/daemon-loop.integration.test.d.ts +2 -0
  46. package/dist/attach/daemon/__tests__/daemon-loop.integration.test.d.ts.map +1 -0
  47. package/dist/attach/daemon/__tests__/daemon-loop.integration.test.js +102 -0
  48. package/dist/attach/daemon/__tests__/daemon-loop.integration.test.js.map +1 -0
  49. package/dist/attach/daemon/__tests__/harness.d.ts +44 -0
  50. package/dist/attach/daemon/__tests__/harness.d.ts.map +1 -0
  51. package/dist/attach/daemon/__tests__/harness.js +96 -0
  52. package/dist/attach/daemon/__tests__/harness.js.map +1 -0
  53. package/dist/attach/daemon/__tests__/protocol.test.d.ts +2 -0
  54. package/dist/attach/daemon/__tests__/protocol.test.d.ts.map +1 -0
  55. package/dist/attach/daemon/__tests__/protocol.test.js +71 -0
  56. package/dist/attach/daemon/__tests__/protocol.test.js.map +1 -0
  57. package/dist/attach/daemon/__tests__/runner.test.d.ts +2 -0
  58. package/dist/attach/daemon/__tests__/runner.test.d.ts.map +1 -0
  59. package/dist/attach/daemon/__tests__/runner.test.js +67 -0
  60. package/dist/attach/daemon/__tests__/runner.test.js.map +1 -0
  61. package/dist/attach/daemon/client.d.ts +64 -0
  62. package/dist/attach/daemon/client.d.ts.map +1 -0
  63. package/dist/attach/daemon/client.js +120 -0
  64. package/dist/attach/daemon/client.js.map +1 -0
  65. package/dist/attach/daemon/daemon-lock.d.ts +19 -0
  66. package/dist/attach/daemon/daemon-lock.d.ts.map +1 -0
  67. package/dist/attach/daemon/daemon-lock.js +87 -0
  68. package/dist/attach/daemon/daemon-lock.js.map +1 -0
  69. package/dist/attach/daemon/daemon-main.d.ts +6 -0
  70. package/dist/attach/daemon/daemon-main.d.ts.map +1 -0
  71. package/dist/attach/daemon/daemon-main.js +80 -0
  72. package/dist/attach/daemon/daemon-main.js.map +1 -0
  73. package/dist/attach/daemon/daemon.d.ts +52 -0
  74. package/dist/attach/daemon/daemon.d.ts.map +1 -0
  75. package/dist/attach/daemon/daemon.js +264 -0
  76. package/dist/attach/daemon/daemon.js.map +1 -0
  77. package/dist/attach/daemon/index.d.ts +12 -0
  78. package/dist/attach/daemon/index.d.ts.map +1 -0
  79. package/dist/attach/daemon/index.js +30 -0
  80. package/dist/attach/daemon/index.js.map +1 -0
  81. package/dist/attach/daemon/protocol.d.ts +69 -0
  82. package/dist/attach/daemon/protocol.d.ts.map +1 -0
  83. package/dist/attach/daemon/protocol.js +108 -0
  84. package/dist/attach/daemon/protocol.js.map +1 -0
  85. package/dist/attach/daemon/runner.d.ts +64 -0
  86. package/dist/attach/daemon/runner.d.ts.map +1 -0
  87. package/dist/attach/daemon/runner.js +60 -0
  88. package/dist/attach/daemon/runner.js.map +1 -0
  89. package/dist/attach/daemon/surface.d.ts +31 -0
  90. package/dist/attach/daemon/surface.d.ts.map +1 -0
  91. package/dist/attach/daemon/surface.js +89 -0
  92. package/dist/attach/daemon/surface.js.map +1 -0
  93. package/dist/attach/devtools-port.d.ts +37 -0
  94. package/dist/attach/devtools-port.d.ts.map +1 -0
  95. package/dist/attach/devtools-port.js +50 -0
  96. package/dist/attach/devtools-port.js.map +1 -0
  97. package/dist/attach/errors.d.ts +38 -0
  98. package/dist/attach/errors.d.ts.map +1 -0
  99. package/dist/attach/errors.js +72 -0
  100. package/dist/attach/errors.js.map +1 -0
  101. package/dist/attach/lease.d.ts +43 -0
  102. package/dist/attach/lease.d.ts.map +1 -0
  103. package/dist/attach/lease.js +92 -0
  104. package/dist/attach/lease.js.map +1 -0
  105. package/dist/attach/singleton-lock.d.ts +21 -0
  106. package/dist/attach/singleton-lock.d.ts.map +1 -0
  107. package/dist/attach/singleton-lock.js +30 -0
  108. package/dist/attach/singleton-lock.js.map +1 -0
  109. package/dist/attach/state.d.ts +31 -0
  110. package/dist/attach/state.d.ts.map +1 -0
  111. package/dist/attach/state.js +78 -0
  112. package/dist/attach/state.js.map +1 -0
  113. package/dist/attach/tools.d.ts +208 -0
  114. package/dist/attach/tools.d.ts.map +1 -0
  115. package/dist/attach/tools.js +195 -0
  116. package/dist/attach/tools.js.map +1 -0
  117. package/dist/attach/url-policy.d.ts +41 -0
  118. package/dist/attach/url-policy.d.ts.map +1 -0
  119. package/dist/attach/url-policy.js +59 -0
  120. package/dist/attach/url-policy.js.map +1 -0
  121. package/dist/attach.d.ts +18 -0
  122. package/dist/attach.d.ts.map +1 -0
  123. package/dist/attach.js +34 -0
  124. package/dist/attach.js.map +1 -0
  125. package/dist/index.d.ts +30 -0
  126. package/dist/index.d.ts.map +1 -1
  127. package/dist/index.js +29 -1
  128. package/dist/index.js.map +1 -1
  129. package/package.json +22 -7
@@ -0,0 +1,278 @@
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
+ const vitest_1 = require("vitest");
37
+ const node_fs_1 = require("node:fs");
38
+ const node_os_1 = require("node:os");
39
+ const node_path_1 = require("node:path");
40
+ const AttachController_js_1 = require("../AttachController.js");
41
+ /**
42
+ * Spy backend that records every method call. Its type deliberately mirrors
43
+ * AttachBackend, which has NO browser/tab close surface — the core F10 claim
44
+ * is proven structurally plus asserted behaviorally here.
45
+ */
46
+ function makeBackend(overrides = {}) {
47
+ const calls = [];
48
+ const backend = {
49
+ kind: 'jxa',
50
+ async connect() {
51
+ calls.push('connect');
52
+ },
53
+ async disconnectTransport() {
54
+ calls.push('disconnectTransport');
55
+ },
56
+ async claimAgentTab() {
57
+ calls.push('claimAgentTab');
58
+ return 'w1 t1';
59
+ },
60
+ async probeIdentity() {
61
+ calls.push('probeIdentity');
62
+ return 'Inbox - johnny@example.com - Gmail';
63
+ },
64
+ async gotoTab(_tab, url) {
65
+ calls.push(`goto:${url}`);
66
+ return url;
67
+ },
68
+ async readTab() {
69
+ calls.push('read');
70
+ return 'text';
71
+ },
72
+ ...overrides,
73
+ };
74
+ return { backend, calls };
75
+ }
76
+ let leaseFile;
77
+ (0, vitest_1.beforeEach)(() => {
78
+ leaseFile = (0, node_path_1.join)((0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), 'attach-ctl-')), 'attach.lease');
79
+ });
80
+ function controller(backend, extra = {}) {
81
+ return new AttachController_js_1.AttachController({
82
+ backend,
83
+ leaseFile,
84
+ expectedIdentity: 'johnny@example.com',
85
+ ...extra,
86
+ });
87
+ }
88
+ (0, vitest_1.describe)('AttachController', () => {
89
+ (0, vitest_1.it)('claims: lease → connect → identity probe → agent tab', async () => {
90
+ const { backend, calls } = makeBackend();
91
+ const c = controller(backend);
92
+ const st = await c.claim();
93
+ (0, vitest_1.expect)(st.state).toBe('ready');
94
+ (0, vitest_1.expect)(st.leaseHeld).toBe(true);
95
+ (0, vitest_1.expect)(st.agentTab).toBe('w1 t1');
96
+ (0, vitest_1.expect)(calls).toEqual(['connect', 'probeIdentity', 'claimAgentTab']);
97
+ await c.detach();
98
+ });
99
+ (0, vitest_1.it)('ABORTS with PROFILE_MISMATCH instead of proceeding on wrong identity (never launches)', async () => {
100
+ const { backend, calls } = makeBackend({
101
+ async probeIdentity() {
102
+ calls.push('probeIdentity');
103
+ return 'someone-else@example.com session';
104
+ },
105
+ });
106
+ const { backend: b2, calls: c2 } = { backend, calls };
107
+ const c = controller(b2);
108
+ await (0, vitest_1.expect)(c.claim()).rejects.toMatchObject({ code: 'PROFILE_MISMATCH' });
109
+ (0, vitest_1.expect)(c2).not.toContain('claimAgentTab'); // no tab was touched
110
+ (0, vitest_1.expect)(c.status().leaseHeld).toBe(false); // lease released on failure
111
+ });
112
+ (0, vitest_1.it)('policy-blocks bad navigation before touching the backend', async () => {
113
+ const { backend, calls } = makeBackend();
114
+ const c = controller(backend);
115
+ await c.claim();
116
+ await (0, vitest_1.expect)(c.goto('file:///etc/passwd')).rejects.toMatchObject({ code: 'POLICY_BLOCKED' });
117
+ (0, vitest_1.expect)(calls.filter((x) => x.startsWith('goto:'))).toHaveLength(0);
118
+ await c.detach();
119
+ });
120
+ (0, vitest_1.it)('revalidates redirects: an https→http downgrade fails the op', async () => {
121
+ const { backend } = makeBackend({
122
+ async gotoTab() {
123
+ return 'http://downgraded.example.com/';
124
+ },
125
+ });
126
+ const c = controller(backend);
127
+ await c.claim();
128
+ await (0, vitest_1.expect)(c.goto('https://ok.example.com/')).rejects.toMatchObject({ code: 'POLICY_BLOCKED' });
129
+ await c.detach();
130
+ });
131
+ (0, vitest_1.it)('detach closes ONLY the transport and releases the lease — no close surface exists', async () => {
132
+ const { backend, calls } = makeBackend();
133
+ const c = controller(backend);
134
+ await c.claim();
135
+ await c.detach();
136
+ (0, vitest_1.expect)(calls).toContain('disconnectTransport');
137
+ // Structural F10 guarantee: the backend contract exposes no browser/tab
138
+ // close method for the controller to call.
139
+ const forbidden = ['close', 'closeBrowser', 'closeTab', 'quit'];
140
+ for (const name of forbidden) {
141
+ (0, vitest_1.expect)(backend[name]).toBeUndefined();
142
+ }
143
+ // Lease is released → a second controller can claim.
144
+ const c2 = controller(makeBackend().backend);
145
+ await (0, vitest_1.expect)(c2.claim()).resolves.toMatchObject({ state: 'ready' });
146
+ await c2.detach();
147
+ });
148
+ (0, vitest_1.it)('second concurrent claim is LEASE_DENIED while the first holds', async () => {
149
+ const { backend } = makeBackend();
150
+ const c1 = controller(backend);
151
+ await c1.claim();
152
+ const c2 = controller(makeBackend().backend);
153
+ await (0, vitest_1.expect)(c2.claim()).rejects.toMatchObject({ code: 'LEASE_DENIED' });
154
+ await c1.detach();
155
+ });
156
+ (0, vitest_1.it)('a failed navigation lands in failed state and refuses further ops (no silent replay)', async () => {
157
+ const { backend } = makeBackend({
158
+ async gotoTab() {
159
+ throw new Error('tab 999 not found in window 1');
160
+ },
161
+ });
162
+ const c = controller(backend);
163
+ await c.claim();
164
+ await (0, vitest_1.expect)(c.goto('https://ok.example.com/')).rejects.toBeTruthy();
165
+ (0, vitest_1.expect)(c.status().state).toBe('failed');
166
+ (0, vitest_1.expect)(c.status().lastError?.code).toBe('TAB_CLOSED');
167
+ await (0, vitest_1.expect)(c.read()).rejects.toMatchObject({ code: 'UNKNOWN' });
168
+ await c.detach();
169
+ (0, vitest_1.expect)(c.status().state).toBe('disconnected');
170
+ });
171
+ (0, vitest_1.it)('HITL approver can deny a policy-clean navigation', async () => {
172
+ const { backend, calls } = makeBackend();
173
+ const c = controller(backend, { onNavigate: (url) => !url.includes('secret') });
174
+ await c.claim();
175
+ await (0, vitest_1.expect)(c.goto('https://ok.example.com/secret')).rejects.toMatchObject({ code: 'POLICY_BLOCKED' });
176
+ (0, vitest_1.expect)(calls.filter((x) => x.startsWith('goto:'))).toHaveLength(0); // never reached the backend
177
+ await (0, vitest_1.expect)(c.goto('https://ok.example.com/public')).resolves.toContain('public');
178
+ await c.detach();
179
+ });
180
+ (0, vitest_1.it)('dry-run reports the target without touching the backend, and counts navigations', async () => {
181
+ const { backend, calls } = makeBackend();
182
+ const c = controller(backend, { dryRun: true });
183
+ await c.claim();
184
+ (0, vitest_1.expect)(await c.goto('https://ok.example.com/')).toBe('https://ok.example.com/');
185
+ (0, vitest_1.expect)(await c.read()).toContain('dry-run');
186
+ (0, vitest_1.expect)(calls.filter((x) => x.startsWith('goto:'))).toHaveLength(0);
187
+ (0, vitest_1.expect)(c.status().dryRun).toBe(true);
188
+ (0, vitest_1.expect)(c.status().navigations).toBe(1);
189
+ (0, vitest_1.expect)(c.status().lastUrl).toBe('https://ok.example.com/');
190
+ await c.detach();
191
+ });
192
+ (0, vitest_1.it)('pause refuses operations until resume', async () => {
193
+ const { backend } = makeBackend();
194
+ const c = controller(backend);
195
+ await c.claim();
196
+ c.pause();
197
+ (0, vitest_1.expect)(c.status().paused).toBe(true);
198
+ await (0, vitest_1.expect)(c.goto('https://ok.example.com/')).rejects.toThrow(/paused/i);
199
+ c.resume();
200
+ await (0, vitest_1.expect)(c.goto('https://ok.example.com/')).resolves.toContain('ok.example.com');
201
+ await c.detach();
202
+ });
203
+ (0, vitest_1.it)('status tracks navigation count and last url on real ops', async () => {
204
+ const { backend } = makeBackend();
205
+ const c = controller(backend);
206
+ await c.claim();
207
+ await c.goto('https://a.example.com/');
208
+ await c.goto('https://b.example.com/');
209
+ (0, vitest_1.expect)(c.status().navigations).toBe(2);
210
+ (0, vitest_1.expect)(c.status().lastUrl).toBe('https://b.example.com/');
211
+ await c.detach();
212
+ });
213
+ (0, vitest_1.it)('ops enforce the lease nonce at call time (foreign takeover is detected)', async () => {
214
+ let t = 1000000;
215
+ const { backend } = makeBackend();
216
+ const c = controller(backend, { deadlineMs: 500 });
217
+ await c.claim();
218
+ // Simulate a foreign session force-taking the lease file.
219
+ const { acquireLease } = await Promise.resolve().then(() => __importStar(require('../lease.js')));
220
+ acquireLease({ file: leaseFile, isPidAlive: () => false, now: () => (t += 1) });
221
+ await (0, vitest_1.expect)(c.goto('https://ok.example.com/')).rejects.toMatchObject({ code: 'LEASE_DENIED' });
222
+ });
223
+ });
224
+ (0, vitest_1.describe)('extract and evaluate', () => {
225
+ (0, vitest_1.it)('extract maps {name: selector} to text lists via a FIXED expression (selectors are data)', async () => {
226
+ const exprs = [];
227
+ const { backend } = makeBackend({
228
+ async evalInTab(_tab, expression) {
229
+ exprs.push(expression);
230
+ return { perks: ['Late checkout', 'Breakfast for two'] };
231
+ },
232
+ });
233
+ const c = controller(backend);
234
+ await c.claim();
235
+ const out = await c.extract({ perks: "[class*='perk'] li" });
236
+ (0, vitest_1.expect)(out).toEqual({ perks: ['Late checkout', 'Breakfast for two'] });
237
+ (0, vitest_1.expect)(exprs[0]).toContain('querySelectorAll');
238
+ (0, vitest_1.expect)(exprs[0]).toContain('perk');
239
+ });
240
+ (0, vitest_1.it)('extract without fields requests the default page summary expression', async () => {
241
+ const exprs = [];
242
+ const { backend } = makeBackend({
243
+ async evalInTab(_tab, expression) {
244
+ exprs.push(expression);
245
+ return { url: 'https://x/', links: [] };
246
+ },
247
+ });
248
+ const c = controller(backend);
249
+ await c.claim();
250
+ await c.extract();
251
+ (0, vitest_1.expect)(exprs[0]).toContain('location.href');
252
+ (0, vitest_1.expect)(exprs[0]).toContain('document.title');
253
+ });
254
+ (0, vitest_1.it)('extract and evaluate surface UNSUPPORTED_OP when the backend lacks evalInTab', async () => {
255
+ const { backend } = makeBackend();
256
+ const c = controller(backend);
257
+ await c.claim();
258
+ await (0, vitest_1.expect)(c.extract()).rejects.toMatchObject({ code: 'UNSUPPORTED_OP' });
259
+ await (0, vitest_1.expect)(c.evaluate('1+1')).rejects.toMatchObject({ code: 'UNSUPPORTED_OP' });
260
+ });
261
+ (0, vitest_1.it)('evaluate passes the expression through (user lane; no tool exposes it)', async () => {
262
+ const { backend } = makeBackend({
263
+ async evalInTab(_tab, expression) {
264
+ return expression === '1+1' ? 2 : undefined;
265
+ },
266
+ });
267
+ const c = controller(backend);
268
+ await c.claim();
269
+ await (0, vitest_1.expect)(c.evaluate('1+1')).resolves.toBe(2);
270
+ });
271
+ (0, vitest_1.it)('both refuse before claim like every other driving op', async () => {
272
+ const { backend } = makeBackend({ async evalInTab() { return 1; } });
273
+ const c = controller(backend);
274
+ await (0, vitest_1.expect)(c.extract()).rejects.toMatchObject({ code: 'UNKNOWN' });
275
+ await (0, vitest_1.expect)(c.evaluate('1')).rejects.toMatchObject({ code: 'UNKNOWN' });
276
+ });
277
+ });
278
+ //# sourceMappingURL=AttachController.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AttachController.test.js","sourceRoot":"","sources":["../../../src/attach/__tests__/AttachController.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=attach-primitives.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attach-primitives.test.d.ts","sourceRoot":"","sources":["../../../src/attach/__tests__/attach-primitives.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,158 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const node_fs_1 = require("node:fs");
5
+ const node_os_1 = require("node:os");
6
+ const node_path_1 = require("node:path");
7
+ const devtools_port_js_1 = require("../devtools-port.js");
8
+ const singleton_lock_js_1 = require("../singleton-lock.js");
9
+ const url_policy_js_1 = require("../url-policy.js");
10
+ const errors_js_1 = require("../errors.js");
11
+ const state_js_1 = require("../state.js");
12
+ const lease_js_1 = require("../lease.js");
13
+ (0, vitest_1.describe)('parseDevToolsActivePort', () => {
14
+ (0, vitest_1.it)('parses a well-formed file', () => {
15
+ const r = (0, devtools_port_js_1.parseDevToolsActivePort)('9222\n/devtools/browser/07797f92-4fc3-432a-91dd-0e982e1a3bc0\n');
16
+ (0, vitest_1.expect)(r.port).toBe(9222);
17
+ (0, vitest_1.expect)(r.wsUrl).toBe('ws://localhost:9222/devtools/browser/07797f92-4fc3-432a-91dd-0e982e1a3bc0');
18
+ });
19
+ (0, vitest_1.it)('builds ws URLs on localhost, never 127.0.0.1 (Chrome DNS-rebinding guard 403s the IP form)', () => {
20
+ const r = (0, devtools_port_js_1.parseDevToolsActivePort)('9222\n/devtools/browser/abc-def\n');
21
+ (0, vitest_1.expect)(r.wsUrl).toBe('ws://localhost:9222/devtools/browser/abc-def');
22
+ (0, vitest_1.expect)(r.wsUrl).not.toContain('127.0.0.1');
23
+ });
24
+ (0, vitest_1.it)('rejects a single-line file', () => {
25
+ (0, vitest_1.expect)(() => (0, devtools_port_js_1.parseDevToolsActivePort)('9222\n')).toThrow(/malformed/i);
26
+ });
27
+ (0, vitest_1.it)('rejects a non-numeric port', () => {
28
+ (0, vitest_1.expect)(() => (0, devtools_port_js_1.parseDevToolsActivePort)('nope\n/devtools/browser/x\n')).toThrow(/invalid port/i);
29
+ });
30
+ (0, vitest_1.it)('rejects a non-browser-target ws path', () => {
31
+ (0, vitest_1.expect)(() => (0, devtools_port_js_1.parseDevToolsActivePort)('9222\n/devtools/page/abc\n')).toThrow(/unexpected ws path/i);
32
+ });
33
+ });
34
+ (0, vitest_1.describe)('pidFromSingletonLock', () => {
35
+ (0, vitest_1.it)('extracts the pid', () => {
36
+ (0, vitest_1.expect)((0, singleton_lock_js_1.pidFromSingletonLock)('MacBook-Air.local-666')).toBe(666);
37
+ });
38
+ (0, vitest_1.it)('handles hostnames containing dashes', () => {
39
+ (0, vitest_1.expect)((0, singleton_lock_js_1.pidFromSingletonLock)('my-host-name.local-12345')).toBe(12345);
40
+ });
41
+ (0, vitest_1.it)('rejects a target without a pid suffix', () => {
42
+ (0, vitest_1.expect)(() => (0, singleton_lock_js_1.pidFromSingletonLock)('just-a-hostname.local')).toThrow(/malformed/i);
43
+ });
44
+ });
45
+ (0, vitest_1.describe)('url-policy', () => {
46
+ (0, vitest_1.it)('allows https and about:blank', () => {
47
+ (0, vitest_1.expect)((0, url_policy_js_1.isNavigationAllowed)('https://founderscard.com/home').allowed).toBe(true);
48
+ (0, vitest_1.expect)((0, url_policy_js_1.isNavigationAllowed)('about:blank').allowed).toBe(true);
49
+ });
50
+ vitest_1.it.each([
51
+ ['file:///etc/passwd', 'SCHEME_BLOCKED'],
52
+ ['javascript:alert(1)', 'SCHEME_BLOCKED'],
53
+ ['data:text/html,<b>x</b>', 'SCHEME_BLOCKED'],
54
+ ['devtools://devtools/bundled/inspector.html', 'SCHEME_BLOCKED'],
55
+ ['chrome://settings', 'SCHEME_BLOCKED'],
56
+ ['http://example.com', 'SCHEME_BLOCKED'],
57
+ ['https://user:pass@example.com/x', 'CREDENTIALS_IN_URL'],
58
+ ['https://localhost/admin', 'PRIVATE_HOST'],
59
+ ['https://127.0.0.1:8080/', 'PRIVATE_HOST'],
60
+ ['https://192.168.1.10/router', 'PRIVATE_HOST'],
61
+ ['https://10.1.2.3/internal', 'PRIVATE_HOST'],
62
+ ['https://172.16.0.1/', 'PRIVATE_HOST'],
63
+ ['https://printer.local/', 'PRIVATE_HOST'],
64
+ ['not a url', 'MALFORMED_URL'],
65
+ ])('rejects %s with %s', (url, reason) => {
66
+ const r = (0, url_policy_js_1.isNavigationAllowed)(url);
67
+ (0, vitest_1.expect)(r.allowed).toBe(false);
68
+ (0, vitest_1.expect)(r.reason).toBe(reason);
69
+ });
70
+ (0, vitest_1.it)('enforces the host allowlist including subdomains', () => {
71
+ const opts = { allowHosts: ['founderscard.com', 'hotels.com'] };
72
+ (0, vitest_1.expect)((0, url_policy_js_1.isNavigationAllowed)('https://founderscard.com/x', opts).allowed).toBe(true);
73
+ (0, vitest_1.expect)((0, url_policy_js_1.isNavigationAllowed)('https://www.hotels.com/', opts).allowed).toBe(true);
74
+ (0, vitest_1.expect)((0, url_policy_js_1.isNavigationAllowed)('https://evil.com/', opts).reason).toBe('HOST_NOT_ALLOWLISTED');
75
+ });
76
+ (0, vitest_1.it)('revalidates redirects with the same policy', () => {
77
+ (0, vitest_1.expect)((0, url_policy_js_1.revalidateRedirect)('https://ok.com/landing').allowed).toBe(true);
78
+ (0, vitest_1.expect)((0, url_policy_js_1.revalidateRedirect)('http://downgraded.com/').reason).toBe('SCHEME_BLOCKED');
79
+ });
80
+ });
81
+ (0, vitest_1.describe)('errors', () => {
82
+ (0, vitest_1.it)('redacts credential-class substrings', () => {
83
+ const out = (0, errors_js_1.redactDiagnostic)('failed with token=abc123 and api_key: xyz987 at https://x.com?access_token=zz9secret');
84
+ (0, vitest_1.expect)(out).not.toContain('abc123');
85
+ (0, vitest_1.expect)(out).not.toContain('xyz987');
86
+ (0, vitest_1.expect)(out).not.toContain('zz9secret');
87
+ });
88
+ (0, vitest_1.it)('keeps explicit AttachError codes', () => {
89
+ (0, vitest_1.expect)((0, errors_js_1.toStructuredError)(new errors_js_1.AttachError('LEASE_DENIED', 'nope')).code).toBe('LEASE_DENIED');
90
+ });
91
+ (0, vitest_1.it)('classifies known failure shapes', () => {
92
+ (0, vitest_1.expect)((0, errors_js_1.toStructuredError)(new Error('Executing JavaScript through AppleScript is turned off')).code).toBe('JS_DISABLED');
93
+ (0, vitest_1.expect)((0, errors_js_1.toStructuredError)(new Error('browserType.connectOverCDP: Timeout 12000ms exceeded')).code).toBe('CDP_TIMEOUT');
94
+ (0, vitest_1.expect)((0, errors_js_1.toStructuredError)(new Error('tab 999 not found in window 1')).code).toBe('TAB_CLOSED');
95
+ });
96
+ (0, vitest_1.it)('defaults to UNKNOWN', () => {
97
+ (0, vitest_1.expect)((0, errors_js_1.toStructuredError)(new Error('weird')).code).toBe('UNKNOWN');
98
+ });
99
+ });
100
+ (0, vitest_1.describe)('AttachStateMachine', () => {
101
+ (0, vitest_1.it)('walks the happy path', () => {
102
+ const m = new state_js_1.AttachStateMachine();
103
+ m.to('connecting');
104
+ m.to('ready');
105
+ m.to('navigating');
106
+ m.to('ready');
107
+ (0, vitest_1.expect)(m.state).toBe('ready');
108
+ });
109
+ (0, vitest_1.it)('rejects illegal transitions', () => {
110
+ const m = new state_js_1.AttachStateMachine();
111
+ (0, vitest_1.expect)(() => m.to('navigating')).toThrow(/illegal/i);
112
+ });
113
+ (0, vitest_1.it)('failed only resets through disconnected (no silent replay)', () => {
114
+ const m = new state_js_1.AttachStateMachine();
115
+ m.to('connecting');
116
+ m.to('ready');
117
+ m.to('navigating');
118
+ m.to('failed');
119
+ (0, vitest_1.expect)(() => m.to('navigating')).toThrow(/illegal/i);
120
+ m.to('disconnected');
121
+ (0, vitest_1.expect)(m.state).toBe('disconnected');
122
+ });
123
+ (0, vitest_1.it)('withDeadline rejects with NAV_TIMEOUT after expiry', async () => {
124
+ await (0, vitest_1.expect)((0, state_js_1.withDeadline)(new Promise(() => { }), 20, 'goto')).rejects.toMatchObject({ code: 'NAV_TIMEOUT' });
125
+ });
126
+ });
127
+ (0, vitest_1.describe)('lease', () => {
128
+ const dir = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), 'attach-lease-'));
129
+ const file = (0, node_path_1.join)(dir, 'attach.lease');
130
+ (0, vitest_1.it)('acquires, requires, and releases', () => {
131
+ const lease = (0, lease_js_1.acquireLease)({ file, isPidAlive: () => true });
132
+ (0, vitest_1.expect)((0, lease_js_1.requireLease)(file, lease.nonce).pid).toBe(process.pid);
133
+ (0, lease_js_1.releaseLease)(file, lease.nonce);
134
+ (0, vitest_1.expect)(() => (0, lease_js_1.requireLease)(file, lease.nonce)).toThrow(/nonce/i);
135
+ });
136
+ (0, vitest_1.it)('denies while a live lease exists, allows after the holder dies', () => {
137
+ const lease = (0, lease_js_1.acquireLease)({ file, isPidAlive: () => true });
138
+ (0, vitest_1.expect)(() => (0, lease_js_1.acquireLease)({ file, isPidAlive: () => true })).toThrow(/lease held/i);
139
+ const takenOver = (0, lease_js_1.acquireLease)({ file, isPidAlive: () => false });
140
+ (0, vitest_1.expect)(takenOver.nonce).not.toBe(lease.nonce);
141
+ (0, lease_js_1.releaseLease)(file, takenOver.nonce);
142
+ });
143
+ (0, vitest_1.it)('allows reclaim after TTL expiry even if the holder is alive', () => {
144
+ let t = 1000000;
145
+ const now = () => t;
146
+ (0, lease_js_1.acquireLease)({ file, ttlMs: 100, now, isPidAlive: () => true });
147
+ t += 101;
148
+ const second = (0, lease_js_1.acquireLease)({ file, ttlMs: 100, now, isPidAlive: () => true });
149
+ (0, vitest_1.expect)(second.acquiredAt).toBe(t);
150
+ (0, lease_js_1.releaseLease)(file, second.nonce);
151
+ });
152
+ (0, vitest_1.it)('refuses to release with a foreign nonce', () => {
153
+ const lease = (0, lease_js_1.acquireLease)({ file, isPidAlive: () => true });
154
+ (0, vitest_1.expect)(() => (0, lease_js_1.releaseLease)(file, 'not-the-nonce')).toThrow(/another session/i);
155
+ (0, lease_js_1.releaseLease)(file, lease.nonce);
156
+ });
157
+ });
158
+ //# sourceMappingURL=attach-primitives.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attach-primitives.test.js","sourceRoot":"","sources":["../../../src/attach/__tests__/attach-primitives.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=jxa-args.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jxa-args.test.d.ts","sourceRoot":"","sources":["../../../src/attach/__tests__/jxa-args.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const jxa_js_1 = require("../backends/jxa.js");
5
+ (0, vitest_1.describe)('buildJxaArgs', () => {
6
+ (0, vitest_1.it)('builds exact argv with profileRoot first, then cmd and args (no shell interpolation)', () => {
7
+ (0, vitest_1.expect)((0, jxa_js_1.buildJxaArgs)('/tmp/driver.js', '/Users/x/Chrome', 'goto', ['1', '2', 'https://a.com/?q=1&r=2'])).toEqual([
8
+ '-l',
9
+ 'JavaScript',
10
+ '/tmp/driver.js',
11
+ '/Users/x/Chrome',
12
+ 'goto',
13
+ '1',
14
+ '2',
15
+ 'https://a.com/?q=1&r=2',
16
+ ]);
17
+ });
18
+ });
19
+ (0, vitest_1.describe)('JXA driver source', () => {
20
+ (0, vitest_1.it)('addresses Chrome by PID from SingletonLock, never by bundle name', () => {
21
+ (0, vitest_1.expect)(jxa_js_1.JXA_DRIVER_SOURCE).toContain('SingletonLock');
22
+ (0, vitest_1.expect)(jxa_js_1.JXA_DRIVER_SOURCE).toContain('Application(chromePid(root))');
23
+ (0, vitest_1.expect)(jxa_js_1.JXA_DRIVER_SOURCE).not.toMatch(/Application\((['"])Google Chrome\1\)/);
24
+ });
25
+ (0, vitest_1.it)('marker-binds the claimed tab and exposes no close/quit commands', () => {
26
+ (0, vitest_1.expect)(jxa_js_1.JXA_DRIVER_SOURCE).toContain('__agentos_attach_tab_v1__');
27
+ (0, vitest_1.expect)(jxa_js_1.JXA_DRIVER_SOURCE).not.toMatch(/\.close\(\)|\bquit\b/);
28
+ });
29
+ (0, vitest_1.it)('supports only claim/goto/url/read (no arbitrary JS command)', () => {
30
+ for (const cmd of ['claim', 'goto', 'url', 'read']) {
31
+ (0, vitest_1.expect)(jxa_js_1.JXA_DRIVER_SOURCE).toContain(`'${cmd}'`);
32
+ }
33
+ (0, vitest_1.expect)(jxa_js_1.JXA_DRIVER_SOURCE).not.toContain("'eval'");
34
+ (0, vitest_1.expect)(jxa_js_1.JXA_DRIVER_SOURCE).not.toContain("'js'");
35
+ });
36
+ });
37
+ //# sourceMappingURL=jxa-args.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jxa-args.test.js","sourceRoot":"","sources":["../../../src/attach/__tests__/jxa-args.test.ts"],"names":[],"mappings":";;AAAA,mCAA8C;AAC9C,+CAAqE;AAErE,IAAA,iBAAQ,EAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,IAAA,WAAE,EAAC,sFAAsF,EAAE,GAAG,EAAE;QAC9F,IAAA,eAAM,EAAC,IAAA,qBAAY,EAAC,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,wBAAwB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YAC9G,IAAI;YACJ,YAAY;YACZ,gBAAgB;YAChB,iBAAiB;YACjB,MAAM;YACN,GAAG;YACH,GAAG;YACH,wBAAwB;SACzB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,IAAA,WAAE,EAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,IAAA,eAAM,EAAC,0BAAiB,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QACrD,IAAA,eAAM,EAAC,0BAAiB,CAAC,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAC;QACpE,IAAA,eAAM,EAAC,0BAAiB,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;IACH,IAAA,WAAE,EAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,IAAA,eAAM,EAAC,0BAAiB,CAAC,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC;QACjE,IAAA,eAAM,EAAC,0BAAiB,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IACH,IAAA,WAAE,EAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,KAAK,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC;YACnD,IAAA,eAAM,EAAC,0BAAiB,CAAC,CAAC,SAAS,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC;QAClD,CAAC;QACD,IAAA,eAAM,EAAC,0BAAiB,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAClD,IAAA,eAAM,EAAC,0BAAiB,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=pack-registration.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pack-registration.test.d.ts","sourceRoot":"","sources":["../../../src/attach/__tests__/pack-registration.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const index_js_1 = require("../../index.js");
5
+ (0, vitest_1.describe)('browser-automation attach registration', () => {
6
+ (0, vitest_1.it)('does NOT register attach tools by default', () => {
7
+ const pack = (0, index_js_1.createExtensionPack)({ options: {} });
8
+ const ids = pack.descriptors.map((d) => d.id);
9
+ (0, vitest_1.expect)(ids).not.toContain('browser_attach_claim');
10
+ (0, vitest_1.expect)(ids).not.toContain('browser_attach_goto');
11
+ });
12
+ (0, vitest_1.it)('registers the attach tools (default-off descriptors) when opted in', () => {
13
+ const pack = (0, index_js_1.createExtensionPack)({ options: { attach: { expectedIdentity: 'johnny@example.com' } } });
14
+ const attach = pack.descriptors.filter((d) => d.id.startsWith('browser_attach_'));
15
+ (0, vitest_1.expect)(attach.map((d) => d.id).sort()).toEqual([
16
+ 'browser_attach_claim',
17
+ 'browser_attach_control',
18
+ 'browser_attach_goto',
19
+ 'browser_attach_read',
20
+ 'browser_attach_release',
21
+ 'browser_attach_status',
22
+ ]);
23
+ for (const d of attach)
24
+ (0, vitest_1.expect)(d.enableByDefault).toBe(false);
25
+ });
26
+ (0, vitest_1.it)('leaves the launch-mode tools intact in both modes', () => {
27
+ for (const options of [{}, { attach: { expectedIdentity: 'x@y.com' } }]) {
28
+ const ids = (0, index_js_1.createExtensionPack)({ options }).descriptors.map((d) => d.id);
29
+ (0, vitest_1.expect)(ids).toContain('browserNavigate');
30
+ (0, vitest_1.expect)(ids).toContain('browserSession');
31
+ }
32
+ });
33
+ });
34
+ //# sourceMappingURL=pack-registration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pack-registration.test.js","sourceRoot":"","sources":["../../../src/attach/__tests__/pack-registration.test.ts"],"names":[],"mappings":";;AAAA,mCAA8C;AAC9C,6CAAqD;AAErD,IAAA,iBAAQ,EAAC,wCAAwC,EAAE,GAAG,EAAE;IACtD,IAAA,WAAE,EAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,IAAI,GAAG,IAAA,8BAAmB,EAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QAClD,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC9C,IAAA,eAAM,EAAC,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QAClD,IAAA,eAAM,EAAC,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,oEAAoE,EAAE,GAAG,EAAE;QAC5E,MAAM,IAAI,GAAG,IAAA,8BAAmB,EAAC,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,EAAE,EAAE,CAAC,CAAC;QACtG,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAClF,IAAA,eAAM,EAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC;YAC7C,sBAAsB;YACtB,wBAAwB;YACxB,qBAAqB;YACrB,qBAAqB;YACrB,wBAAwB;YACxB,uBAAuB;SACxB,CAAC,CAAC;QACH,KAAK,MAAM,CAAC,IAAI,MAAM;YAAE,IAAA,eAAM,EAAC,CAAC,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,KAAK,MAAM,OAAO,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,gBAAgB,EAAE,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC;YACxE,MAAM,GAAG,GAAG,IAAA,8BAAmB,EAAC,EAAE,OAAO,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC1E,IAAA,eAAM,EAAC,GAAG,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;YACzC,IAAA,eAAM,EAAC,GAAG,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tools.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.test.d.ts","sourceRoot":"","sources":["../../../src/attach/__tests__/tools.test.ts"],"names":[],"mappings":""}