@multiplayer-app/agent 0.1.20 → 0.1.21

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 (290) hide show
  1. package/README.md +14 -7
  2. package/dist/agent/definition.test.js +8 -3
  3. package/dist/agent/definition.test.js.map +1 -1
  4. package/dist/agent/profiles/coding.d.ts +1 -1
  5. package/dist/agent/profiles/coding.d.ts.map +1 -1
  6. package/dist/agent/profiles/coding.js +21 -4
  7. package/dist/agent/profiles/coding.js.map +1 -1
  8. package/dist/agent/profiles/index.js +1 -1
  9. package/dist/agent/profiles/index.js.map +1 -1
  10. package/dist/agent/profiles/research.d.ts.map +1 -1
  11. package/dist/agent/profiles/research.js +2 -2
  12. package/dist/agent/profiles/research.js.map +1 -1
  13. package/dist/agent/turn-history.d.ts.map +1 -1
  14. package/dist/agent/turn-history.js +7 -1
  15. package/dist/agent/turn-history.js.map +1 -1
  16. package/dist/agent/turn-runner.d.ts +8 -0
  17. package/dist/agent/turn-runner.d.ts.map +1 -1
  18. package/dist/agent/turn-runner.js +35 -10
  19. package/dist/agent/turn-runner.js.map +1 -1
  20. package/dist/app/app-host.d.ts +57 -0
  21. package/dist/app/app-host.d.ts.map +1 -0
  22. package/dist/app/app-host.js +252 -0
  23. package/dist/app/app-host.js.map +1 -0
  24. package/dist/app/app-host.test.d.ts +2 -0
  25. package/dist/app/app-host.test.d.ts.map +1 -0
  26. package/dist/app/app-host.test.js +639 -0
  27. package/dist/app/app-host.test.js.map +1 -0
  28. package/dist/app/config.d.ts +196 -0
  29. package/dist/app/config.d.ts.map +1 -0
  30. package/dist/app/config.js +362 -0
  31. package/dist/app/config.js.map +1 -0
  32. package/dist/app/config.test.d.ts +2 -0
  33. package/dist/app/config.test.d.ts.map +1 -0
  34. package/dist/app/config.test.js +224 -0
  35. package/dist/app/config.test.js.map +1 -0
  36. package/dist/app/detect.d.ts +68 -0
  37. package/dist/app/detect.d.ts.map +1 -0
  38. package/dist/app/detect.js +449 -0
  39. package/dist/app/detect.js.map +1 -0
  40. package/dist/app/detect.test.d.ts +2 -0
  41. package/dist/app/detect.test.d.ts.map +1 -0
  42. package/dist/app/detect.test.js +267 -0
  43. package/dist/app/detect.test.js.map +1 -0
  44. package/dist/app/env.d.ts +5 -0
  45. package/dist/app/env.d.ts.map +1 -0
  46. package/dist/app/env.js +22 -0
  47. package/dist/app/env.js.map +1 -0
  48. package/dist/app/functions-cli.d.ts +3 -0
  49. package/dist/app/functions-cli.d.ts.map +1 -0
  50. package/dist/app/functions-cli.js +27 -0
  51. package/dist/app/functions-cli.js.map +1 -0
  52. package/dist/app/functions-host.d.ts +15 -0
  53. package/dist/app/functions-host.d.ts.map +1 -0
  54. package/dist/app/functions-host.js +276 -0
  55. package/dist/app/functions-host.js.map +1 -0
  56. package/dist/app/functions-host.test.d.ts +2 -0
  57. package/dist/app/functions-host.test.d.ts.map +1 -0
  58. package/dist/app/functions-host.test.js +117 -0
  59. package/dist/app/functions-host.test.js.map +1 -0
  60. package/dist/app/functions-routes.d.ts +23 -0
  61. package/dist/app/functions-routes.d.ts.map +1 -0
  62. package/dist/app/functions-routes.js +85 -0
  63. package/dist/app/functions-routes.js.map +1 -0
  64. package/dist/app/functions-routes.test.d.ts +2 -0
  65. package/dist/app/functions-routes.test.d.ts.map +1 -0
  66. package/dist/app/functions-routes.test.js +40 -0
  67. package/dist/app/functions-routes.test.js.map +1 -0
  68. package/dist/app/manifest.d.ts +17 -0
  69. package/dist/app/manifest.d.ts.map +1 -0
  70. package/dist/app/manifest.js +64 -0
  71. package/dist/app/manifest.js.map +1 -0
  72. package/dist/app/manifest.test.d.ts +2 -0
  73. package/dist/app/manifest.test.d.ts.map +1 -0
  74. package/dist/app/manifest.test.js +173 -0
  75. package/dist/app/manifest.test.js.map +1 -0
  76. package/dist/app/release-artifacts.d.ts +39 -0
  77. package/dist/app/release-artifacts.d.ts.map +1 -0
  78. package/dist/app/release-artifacts.js +229 -0
  79. package/dist/app/release-artifacts.js.map +1 -0
  80. package/dist/app/release-artifacts.test.d.ts +2 -0
  81. package/dist/app/release-artifacts.test.d.ts.map +1 -0
  82. package/dist/app/release-artifacts.test.js +295 -0
  83. package/dist/app/release-artifacts.test.js.map +1 -0
  84. package/dist/app/route-pattern.d.ts +23 -0
  85. package/dist/app/route-pattern.d.ts.map +1 -0
  86. package/dist/app/route-pattern.js +339 -0
  87. package/dist/app/route-pattern.js.map +1 -0
  88. package/dist/app/route-pattern.test.d.ts +2 -0
  89. package/dist/app/route-pattern.test.d.ts.map +1 -0
  90. package/dist/app/route-pattern.test.js +187 -0
  91. package/dist/app/route-pattern.test.js.map +1 -0
  92. package/dist/app/rules.d.ts +61 -0
  93. package/dist/app/rules.d.ts.map +1 -0
  94. package/dist/app/rules.js +90 -0
  95. package/dist/app/rules.js.map +1 -0
  96. package/dist/app/rules.test.d.ts +2 -0
  97. package/dist/app/rules.test.d.ts.map +1 -0
  98. package/dist/app/rules.test.js +69 -0
  99. package/dist/app/rules.test.js.map +1 -0
  100. package/dist/app/runner.d.ts +109 -0
  101. package/dist/app/runner.d.ts.map +1 -0
  102. package/dist/app/runner.js +429 -0
  103. package/dist/app/runner.js.map +1 -0
  104. package/dist/app/site.d.ts +73 -0
  105. package/dist/app/site.d.ts.map +1 -0
  106. package/dist/app/site.js +161 -0
  107. package/dist/app/site.js.map +1 -0
  108. package/dist/app/site.test.d.ts +2 -0
  109. package/dist/app/site.test.d.ts.map +1 -0
  110. package/dist/app/site.test.js +291 -0
  111. package/dist/app/site.test.js.map +1 -0
  112. package/dist/app/static-server.d.ts +20 -0
  113. package/dist/app/static-server.d.ts.map +1 -0
  114. package/dist/app/static-server.js +145 -0
  115. package/dist/app/static-server.js.map +1 -0
  116. package/dist/persistence/conversation-store.d.ts +21 -0
  117. package/dist/persistence/conversation-store.d.ts.map +1 -0
  118. package/dist/persistence/conversation-store.js +59 -0
  119. package/dist/persistence/conversation-store.js.map +1 -0
  120. package/dist/persistence/conversation-store.test.d.ts +2 -0
  121. package/dist/persistence/conversation-store.test.d.ts.map +1 -0
  122. package/dist/persistence/conversation-store.test.js +98 -0
  123. package/dist/persistence/conversation-store.test.js.map +1 -0
  124. package/dist/persistence/git-sync.d.ts +14 -1
  125. package/dist/persistence/git-sync.d.ts.map +1 -1
  126. package/dist/persistence/git-sync.js +73 -17
  127. package/dist/persistence/git-sync.js.map +1 -1
  128. package/dist/persistence/git-sync.test.js +155 -6
  129. package/dist/persistence/git-sync.test.js.map +1 -1
  130. package/dist/persistence/snapshot-sync.d.ts +19 -2
  131. package/dist/persistence/snapshot-sync.d.ts.map +1 -1
  132. package/dist/persistence/snapshot-sync.js +194 -83
  133. package/dist/persistence/snapshot-sync.js.map +1 -1
  134. package/dist/persistence/snapshot-sync.test.js +145 -27
  135. package/dist/persistence/snapshot-sync.test.js.map +1 -1
  136. package/dist/persistence/workspace.d.ts +3 -0
  137. package/dist/persistence/workspace.d.ts.map +1 -1
  138. package/dist/persistence/workspace.js +1 -0
  139. package/dist/persistence/workspace.js.map +1 -1
  140. package/dist/research/extract-texts.d.ts.map +1 -1
  141. package/dist/research/extract-texts.js +6 -13
  142. package/dist/research/extract-texts.js.map +1 -1
  143. package/dist/research/filingramp/attachment-tools.d.ts.map +1 -1
  144. package/dist/research/filingramp/attachment-tools.js +7 -4
  145. package/dist/research/filingramp/attachment-tools.js.map +1 -1
  146. package/dist/research/filingramp/shared.d.ts.map +1 -1
  147. package/dist/research/filingramp/shared.js +5 -5
  148. package/dist/research/filingramp/shared.js.map +1 -1
  149. package/dist/runtime/app-mode.d.ts +10 -0
  150. package/dist/runtime/app-mode.d.ts.map +1 -0
  151. package/dist/runtime/app-mode.js +172 -0
  152. package/dist/runtime/app-mode.js.map +1 -0
  153. package/dist/runtime/app-mode.test.d.ts +2 -0
  154. package/dist/runtime/app-mode.test.d.ts.map +1 -0
  155. package/dist/runtime/app-mode.test.js +130 -0
  156. package/dist/runtime/app-mode.test.js.map +1 -0
  157. package/dist/runtime/app-rehearsal.d.ts +2 -0
  158. package/dist/runtime/app-rehearsal.d.ts.map +1 -0
  159. package/dist/runtime/app-rehearsal.js +56 -0
  160. package/dist/runtime/app-rehearsal.js.map +1 -0
  161. package/dist/runtime/build-mode.d.ts +12 -0
  162. package/dist/runtime/build-mode.d.ts.map +1 -0
  163. package/dist/runtime/build-mode.js +116 -0
  164. package/dist/runtime/build-mode.js.map +1 -0
  165. package/dist/runtime/build-mode.test.d.ts +2 -0
  166. package/dist/runtime/build-mode.test.d.ts.map +1 -0
  167. package/dist/runtime/build-mode.test.js +121 -0
  168. package/dist/runtime/build-mode.test.js.map +1 -0
  169. package/dist/runtime/cli.js +7 -2
  170. package/dist/runtime/cli.js.map +1 -1
  171. package/dist/runtime/config.d.ts +4 -0
  172. package/dist/runtime/config.d.ts.map +1 -1
  173. package/dist/runtime/config.js +13 -2
  174. package/dist/runtime/config.js.map +1 -1
  175. package/dist/runtime/guest-server.d.ts +3 -0
  176. package/dist/runtime/guest-server.d.ts.map +1 -0
  177. package/dist/runtime/{lambda-microvm.js → guest-server.js} +49 -18
  178. package/dist/runtime/guest-server.js.map +1 -0
  179. package/dist/runtime/image-hooks.d.ts +5 -0
  180. package/dist/runtime/image-hooks.d.ts.map +1 -0
  181. package/dist/runtime/image-hooks.js +68 -0
  182. package/dist/runtime/image-hooks.js.map +1 -0
  183. package/dist/runtime/image-hooks.test.d.ts +2 -0
  184. package/dist/runtime/image-hooks.test.d.ts.map +1 -0
  185. package/dist/runtime/image-hooks.test.js +74 -0
  186. package/dist/runtime/image-hooks.test.js.map +1 -0
  187. package/dist/runtime/index.d.ts +8 -3
  188. package/dist/runtime/index.d.ts.map +1 -1
  189. package/dist/runtime/index.js +53 -35
  190. package/dist/runtime/index.js.map +1 -1
  191. package/dist/runtime/listening-ports.d.ts +13 -0
  192. package/dist/runtime/listening-ports.d.ts.map +1 -0
  193. package/dist/runtime/listening-ports.js +78 -0
  194. package/dist/runtime/listening-ports.js.map +1 -0
  195. package/dist/runtime/listening-ports.test.d.ts +2 -0
  196. package/dist/runtime/listening-ports.test.d.ts.map +1 -0
  197. package/dist/runtime/listening-ports.test.js +39 -0
  198. package/dist/runtime/listening-ports.test.js.map +1 -0
  199. package/dist/runtime/preview-proxy.d.ts +56 -0
  200. package/dist/runtime/preview-proxy.d.ts.map +1 -0
  201. package/dist/runtime/preview-proxy.js +302 -0
  202. package/dist/runtime/preview-proxy.js.map +1 -0
  203. package/dist/runtime/preview-proxy.test.d.ts +2 -0
  204. package/dist/runtime/preview-proxy.test.d.ts.map +1 -0
  205. package/dist/runtime/preview-proxy.test.js +122 -0
  206. package/dist/runtime/preview-proxy.test.js.map +1 -0
  207. package/dist/runtime/session-mode.d.ts +3 -0
  208. package/dist/runtime/session-mode.d.ts.map +1 -0
  209. package/dist/runtime/session-mode.js +60 -0
  210. package/dist/runtime/session-mode.js.map +1 -0
  211. package/dist/runtime/workload.d.ts +44 -0
  212. package/dist/runtime/workload.d.ts.map +1 -0
  213. package/dist/runtime/workload.js +222 -0
  214. package/dist/runtime/workload.js.map +1 -0
  215. package/dist/runtime/workload.test.d.ts +2 -0
  216. package/dist/runtime/workload.test.d.ts.map +1 -0
  217. package/dist/runtime/workload.test.js +235 -0
  218. package/dist/runtime/workload.test.js.map +1 -0
  219. package/dist/session/conversation.d.ts +3 -2
  220. package/dist/session/conversation.d.ts.map +1 -1
  221. package/dist/session/conversation.js +11 -7
  222. package/dist/session/conversation.js.map +1 -1
  223. package/dist/session/conversation.test.js +2 -3
  224. package/dist/session/conversation.test.js.map +1 -1
  225. package/dist/session/runtime.d.ts +16 -3
  226. package/dist/session/runtime.d.ts.map +1 -1
  227. package/dist/session/runtime.js +80 -13
  228. package/dist/session/runtime.js.map +1 -1
  229. package/dist/session/runtime.test.js +18 -7
  230. package/dist/session/runtime.test.js.map +1 -1
  231. package/dist/session/tools.d.ts.map +1 -1
  232. package/dist/session/tools.js +3 -3
  233. package/dist/session/tools.js.map +1 -1
  234. package/dist/task/loop.d.ts.map +1 -1
  235. package/dist/task/loop.js +6 -4
  236. package/dist/task/loop.js.map +1 -1
  237. package/dist/tools/exec-tools.d.ts +12 -0
  238. package/dist/tools/exec-tools.d.ts.map +1 -1
  239. package/dist/tools/exec-tools.js +46 -3
  240. package/dist/tools/exec-tools.js.map +1 -1
  241. package/dist/tools/exec-tools.test.d.ts +2 -0
  242. package/dist/tools/exec-tools.test.d.ts.map +1 -0
  243. package/dist/tools/exec-tools.test.js +48 -0
  244. package/dist/tools/exec-tools.test.js.map +1 -0
  245. package/dist/tools/fs-tools.d.ts.map +1 -1
  246. package/dist/tools/fs-tools.js +5 -5
  247. package/dist/tools/fs-tools.js.map +1 -1
  248. package/dist/transport/link.d.ts.map +1 -1
  249. package/dist/transport/link.js +16 -5
  250. package/dist/transport/link.js.map +1 -1
  251. package/dist/transport/link.test.js +24 -0
  252. package/dist/transport/link.test.js.map +1 -1
  253. package/dist/transport/protocol.d.ts +190 -3
  254. package/dist/transport/protocol.d.ts.map +1 -1
  255. package/dist/transport/protocol.js +147 -7
  256. package/dist/transport/protocol.js.map +1 -1
  257. package/dist/transport/protocol.test.js +41 -0
  258. package/dist/transport/protocol.test.js.map +1 -1
  259. package/dist/workspace-sync/eligibility.d.ts +14 -0
  260. package/dist/workspace-sync/eligibility.d.ts.map +1 -0
  261. package/dist/workspace-sync/eligibility.js +53 -0
  262. package/dist/workspace-sync/eligibility.js.map +1 -0
  263. package/dist/workspace-sync/merge.d.ts +15 -0
  264. package/dist/workspace-sync/merge.d.ts.map +1 -0
  265. package/dist/workspace-sync/merge.js +66 -0
  266. package/dist/workspace-sync/merge.js.map +1 -0
  267. package/dist/workspace-sync/merge.test.d.ts +2 -0
  268. package/dist/workspace-sync/merge.test.d.ts.map +1 -0
  269. package/dist/workspace-sync/merge.test.js +28 -0
  270. package/dist/workspace-sync/merge.test.js.map +1 -0
  271. package/dist/workspace-sync/workspace-sync.d.ts +48 -0
  272. package/dist/workspace-sync/workspace-sync.d.ts.map +1 -0
  273. package/dist/workspace-sync/workspace-sync.js +308 -0
  274. package/dist/workspace-sync/workspace-sync.js.map +1 -0
  275. package/dist/workspace-sync/workspace-sync.test.d.ts +2 -0
  276. package/dist/workspace-sync/workspace-sync.test.d.ts.map +1 -0
  277. package/dist/workspace-sync/workspace-sync.test.js +111 -0
  278. package/dist/workspace-sync/workspace-sync.test.js.map +1 -0
  279. package/dist/workspace-sync/write-drafts.d.ts +24 -0
  280. package/dist/workspace-sync/write-drafts.d.ts.map +1 -0
  281. package/dist/workspace-sync/write-drafts.js +87 -0
  282. package/dist/workspace-sync/write-drafts.js.map +1 -0
  283. package/dist/workspace-sync/write-drafts.test.d.ts +2 -0
  284. package/dist/workspace-sync/write-drafts.test.d.ts.map +1 -0
  285. package/dist/workspace-sync/write-drafts.test.js +36 -0
  286. package/dist/workspace-sync/write-drafts.test.js.map +1 -0
  287. package/package.json +12 -2
  288. package/dist/runtime/lambda-microvm.d.ts +0 -3
  289. package/dist/runtime/lambda-microvm.d.ts.map +0 -1
  290. package/dist/runtime/lambda-microvm.js.map +0 -1
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const strict_1 = __importDefault(require("node:assert/strict"));
7
+ const node_http_1 = __importDefault(require("node:http"));
8
+ const node_net_1 = __importDefault(require("node:net"));
9
+ const node_test_1 = require("node:test");
10
+ const protocol_1 = require("../transport/protocol");
11
+ const preview_proxy_1 = require("./preview-proxy");
12
+ const PUBLIC_HOST = '64b7f0c2e4b0a1a2b3c4d5e6-3000.vm.example.com';
13
+ const PUBLIC_ORIGIN = `https://${PUBLIC_HOST}`;
14
+ function listen(server) {
15
+ return new Promise((resolve) => server.listen(0, '127.0.0.1', () => resolve(server.address().port)));
16
+ }
17
+ function get(proxyPort, headers) {
18
+ return new Promise((resolve, reject) => {
19
+ node_http_1.default.get({ host: '127.0.0.1', port: proxyPort, path: '/page?x=1', headers }, (res) => {
20
+ let body = '';
21
+ res.on('data', (chunk) => (body += chunk));
22
+ res.on('end', () => { var _a; return resolve({ status: (_a = res.statusCode) !== null && _a !== void 0 ? _a : 0, headers: res.headers, body }); });
23
+ }).on('error', reject);
24
+ });
25
+ }
26
+ (0, node_test_1.describe)('preview proxy', () => {
27
+ let app;
28
+ let appPort;
29
+ let proxy;
30
+ let proxyPort;
31
+ (0, node_test_1.before)(async () => {
32
+ app = node_http_1.default.createServer((req, res) => {
33
+ if (req.url === '/old') {
34
+ res.writeHead(302, { Location: `http://localhost:${appPort}/new?y=2` });
35
+ res.end();
36
+ return;
37
+ }
38
+ res.writeHead(200, { 'Content-Type': 'application/json' });
39
+ res.end(JSON.stringify({ url: req.url, host: req.headers.host, origin: req.headers.origin, port: req.headers[protocol_1.PREVIEW_PORT_HEADER] }));
40
+ });
41
+ // A dev server's hot-reload socket: answers the handshake, then echoes.
42
+ app.on('upgrade', (req, socket) => {
43
+ socket.write(`HTTP/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nX-Seen-Host: ${req.headers.host}\r\n\r\n`);
44
+ socket.on('data', (data) => socket.write(data));
45
+ socket.on('end', () => socket.end());
46
+ });
47
+ appPort = await listen(app);
48
+ proxy = (0, preview_proxy_1.startPreviewServer)(0);
49
+ await new Promise((resolve) => proxy.once('listening', resolve));
50
+ proxyPort = proxy.address().port;
51
+ });
52
+ (0, node_test_1.after)(() => {
53
+ // The test client's keep-alive connections would hold both servers open.
54
+ for (const server of [app, proxy]) {
55
+ server.closeAllConnections();
56
+ server.close();
57
+ }
58
+ });
59
+ (0, node_test_1.it)('forwards to the app as a local request', async () => {
60
+ const res = await get(proxyPort, {
61
+ [protocol_1.PREVIEW_PORT_HEADER]: String(appPort),
62
+ 'x-forwarded-host': PUBLIC_HOST,
63
+ 'x-forwarded-proto': 'https',
64
+ origin: PUBLIC_ORIGIN,
65
+ });
66
+ strict_1.default.equal(res.status, 200);
67
+ strict_1.default.deepEqual(JSON.parse(res.body), {
68
+ url: '/page?x=1',
69
+ host: `localhost:${appPort}`,
70
+ origin: `http://localhost:${appPort}`,
71
+ });
72
+ });
73
+ (0, node_test_1.it)('points a redirect to localhost back at the public preview', () => {
74
+ strict_1.default.equal((0, preview_proxy_1.publicLocation)('http://localhost:3000/new?y=2', 3000, PUBLIC_ORIGIN), `${PUBLIC_ORIGIN}/new?y=2`);
75
+ strict_1.default.equal((0, preview_proxy_1.publicLocation)('http://127.0.0.1:3000', 3000, PUBLIC_ORIGIN), PUBLIC_ORIGIN);
76
+ strict_1.default.equal((0, preview_proxy_1.publicLocation)('http://localhost:30001/x', 3000, PUBLIC_ORIGIN), 'http://localhost:30001/x');
77
+ strict_1.default.equal((0, preview_proxy_1.publicLocation)('/relative', 3000, PUBLIC_ORIGIN), '/relative');
78
+ });
79
+ (0, node_test_1.it)('rewrites the app\'s own redirects on the way out', async () => {
80
+ const res = await new Promise((resolve, reject) => {
81
+ node_http_1.default.get({ host: '127.0.0.1', port: proxyPort, path: '/old', headers: {
82
+ [protocol_1.PREVIEW_PORT_HEADER]: String(appPort), 'x-forwarded-host': PUBLIC_HOST, 'x-forwarded-proto': 'https',
83
+ } }, resolve).on('error', reject);
84
+ });
85
+ res.resume();
86
+ strict_1.default.equal(res.statusCode, 302);
87
+ strict_1.default.equal(res.headers.location, `${PUBLIC_ORIGIN}/new?y=2`);
88
+ });
89
+ (0, node_test_1.it)('splices a WebSocket upgrade through to the app', async () => {
90
+ const client = node_net_1.default.connect(proxyPort, '127.0.0.1');
91
+ await new Promise((resolve) => client.once('connect', resolve));
92
+ client.write(`GET /hmr HTTP/1.1\r\nHost: ${PUBLIC_HOST}\r\nUpgrade: websocket\r\nConnection: Upgrade\r\n${protocol_1.PREVIEW_PORT_HEADER}: ${appPort}\r\n\r\n`);
93
+ let received = '';
94
+ const handshake = await new Promise((resolve) => {
95
+ client.on('data', (data) => {
96
+ received += data.toString();
97
+ if (received.includes('\r\n\r\n'))
98
+ resolve(received);
99
+ });
100
+ });
101
+ strict_1.default.match(handshake, /^HTTP\/1\.1 101/);
102
+ strict_1.default.match(handshake, new RegExp(`X-Seen-Host: localhost:${appPort}`));
103
+ received = '';
104
+ const echoed = new Promise((resolve) => client.on('data', () => received === 'frame' && resolve(received)));
105
+ client.write('frame');
106
+ strict_1.default.equal(await echoed, 'frame');
107
+ client.destroy();
108
+ });
109
+ (0, node_test_1.it)('says nothing is listening on a closed port, and rejects the guest\'s own ports', async () => {
110
+ const closed = node_net_1.default.createServer();
111
+ const closedPort = await listen(closed);
112
+ await new Promise((resolve) => closed.close(resolve));
113
+ const res = await get(proxyPort, { [protocol_1.PREVIEW_PORT_HEADER]: String(closedPort) });
114
+ strict_1.default.equal(res.status, 502);
115
+ strict_1.default.match(res.body, new RegExp(`port ${closedPort}`));
116
+ strict_1.default.equal((await get(proxyPort, { [protocol_1.PREVIEW_PORT_HEADER]: '8080' })).status, 400);
117
+ });
118
+ (0, node_test_1.it)('leaves requests without the preview header alone', async () => {
119
+ strict_1.default.equal((await get(proxyPort, {})).status, 404);
120
+ });
121
+ });
122
+ //# sourceMappingURL=preview-proxy.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview-proxy.test.js","sourceRoot":"","sources":["../../src/runtime/preview-proxy.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { RunningAgent } from './index';
2
+ export declare function startSessionOrTask(env: NodeJS.ProcessEnv): Promise<RunningAgent>;
3
+ //# sourceMappingURL=session-mode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-mode.d.ts","sourceRoot":"","sources":["../../src/runtime/session-mode.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAE3C,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,CA2CtF"}
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.startSessionOrTask = startSessionOrTask;
4
+ // The agent's own modes: task mode runs once and resolves; session mode stays up and resolves with
5
+ // the running agent so lifecycle hooks can reach it.
6
+ const config_1 = require("./config");
7
+ const link_1 = require("../transport/link");
8
+ const loop_1 = require("../task/loop");
9
+ const reporter_1 = require("../transport/reporter");
10
+ const session_1 = require("../session");
11
+ const app_host_1 = require("../app/app-host");
12
+ const env_1 = require("../app/env");
13
+ const protocol_1 = require("../transport/protocol");
14
+ const listening_ports_1 = require("./listening-ports");
15
+ async function startSessionOrTask(env) {
16
+ const config = (0, config_1.loadConfigFromEnv)(env);
17
+ if (config.mode === 'session') {
18
+ const link = (0, link_1.createSessionLink)(config.sessionId, config.socketUrl, config.socketToken);
19
+ const session = await (0, session_1.runSessionAgent)(config, link).catch(async (error) => {
20
+ link.send({ type: 'error', message: `Workspace restore failed: ${error instanceof Error ? error.message : String(error)}` });
21
+ await link.close();
22
+ throw error;
23
+ });
24
+ // The live preview offers whatever listens in the guest, however it was started.
25
+ const stopWatchingPorts = (0, listening_ports_1.watchListeningPorts)((ports) => link.send({ type: 'ports', ports }));
26
+ // The workspace's app (detected, its builder.json written by the guest) runs from every boot,
27
+ // so the session URL works again after a stop, and starts after the turn that built it or
28
+ // changed how it runs; run_app restarts it (tools/exec-tools.ts). Its status routes the
29
+ // session URL to it.
30
+ const app = (0, app_host_1.appHostFor)(session.workspaceDir, () => ({ dir: session.workspaceDir, mode: 'dev', env: (0, env_1.sessionAppEnv)(env), schemaUrl: env[protocol_1.AGENT_ENV.APP_SCHEMA_URL] }));
31
+ const reportFailure = (error) => console.error('[app] failed to start:', error instanceof Error ? error.message : error);
32
+ app.onStatus((status) => link.send({ type: 'app', app: status }));
33
+ void app.start().catch(reportFailure);
34
+ const stopRefreshing = session.onTurnEnd(() => void app.refresh().catch(reportFailure));
35
+ return {
36
+ config,
37
+ session,
38
+ async close() {
39
+ stopWatchingPorts();
40
+ stopRefreshing();
41
+ try {
42
+ await app.stop();
43
+ await session.stop();
44
+ }
45
+ finally {
46
+ await link.close();
47
+ }
48
+ },
49
+ };
50
+ }
51
+ const reporter = (0, reporter_1.createReporter)(config.socketUrl, config.socketToken, config.sessionId);
52
+ try {
53
+ await (0, loop_1.runAgentLoop)(config, reporter);
54
+ }
55
+ finally {
56
+ await reporter.close();
57
+ }
58
+ return { config, async close() { } };
59
+ }
60
+ //# sourceMappingURL=session-mode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-mode.js","sourceRoot":"","sources":["../../src/runtime/session-mode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import type { FileHandle } from 'node:fs/promises';
2
+ import type { Readable, Writable } from 'node:stream';
3
+ export declare const WORKLOAD_USER = "agent";
4
+ export declare const WORKLOAD_UID = 1001;
5
+ export declare const WORKLOAD_GID = 1001;
6
+ export declare const WORKLOAD_HOME = "/home/agent";
7
+ /** The identity to start a workload process with, for spawn's options. */
8
+ export declare function workloadIdentity(): {
9
+ uid: number;
10
+ gid: number;
11
+ } | undefined;
12
+ /** A workload's env: its own home, since root's isn't readable to it (npm's and pip's caches live there). */
13
+ export declare function workloadEnv(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
14
+ /** Writes a workspace file, and any folder it needs. */
15
+ export declare function writeWorkloadFile(target: string, content: Buffer | string): Promise<void>;
16
+ export declare function appendWorkloadFile(target: string, content: Buffer | string): Promise<void>;
17
+ export declare function removeWorkloadFile(target: string): Promise<void>;
18
+ export declare function makeWorkloadDir(dir: string): Promise<void>;
19
+ /** A file an app's output keeps being appended to, for as long as it runs. */
20
+ export declare function workloadAppendStream(target: string): Writable;
21
+ /**
22
+ * Gives a tree the runtime fetched to the workload. Only before any workload runs: nothing can
23
+ * change it meanwhile, and -h with -R never follows a link left there by an earlier run on this disk.
24
+ */
25
+ export declare function handOverToWorkload(dir: string): Promise<void>;
26
+ /** Writes `folders` of `dir` to `target` as a compressed archive, leaving out what `exclude` names at any depth. */
27
+ export declare function packAsWorkload(dir: string, folders: string[], exclude: string[], target: Writable): Promise<void>;
28
+ /** Unpacks what packAsWorkload wrote into `dir`, which the workload already owns. */
29
+ export declare function unpackAsWorkload(dir: string, source: Readable): Promise<void>;
30
+ /**
31
+ * Whether `target` is `root` or somewhere under it, by path alone: a neighbour that only shares its
32
+ * prefix isn't. Both absolute and normalized, and real paths where a link could lead out.
33
+ */
34
+ export declare function isInsideDir(root: string, target: string): boolean;
35
+ /**
36
+ * Opens a file to read, for the runtime: only if what actually opened is a regular file under
37
+ * `root`. Checking first and opening after would leave a gap to swap a link in, so it asks the
38
+ * kernel what this open reached. Anything else reads as missing, which callers already handle.
39
+ */
40
+ export declare function openInside(root: string, file: string, flags?: number): Promise<FileHandle>;
41
+ export declare function readInside(root: string, file: string, flags?: number): Promise<Buffer>;
42
+ /** A directory's real path, if it's really under `root` (listing one follows links too). */
43
+ export declare function realDirInside(root: string, dir: string): Promise<string>;
44
+ //# sourceMappingURL=workload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workload.d.ts","sourceRoot":"","sources":["../../src/runtime/workload.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAElD,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAIrD,eAAO,MAAM,aAAa,UAAU,CAAA;AACpC,eAAO,MAAM,YAAY,OAAO,CAAA;AAChC,eAAO,MAAM,YAAY,OAAO,CAAA;AAChC,eAAO,MAAM,aAAa,gBAAgB,CAAA;AAE1C,0EAA0E;AAC1E,wBAAgB,gBAAgB,IAAI;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAE3E;AAED,6GAA6G;AAC7G,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAErE;AA6BD,wDAAwD;AACxD,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAI/F;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIhG;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGtE;AAED,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGhE;AAED,8EAA8E;AAC9E,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAU7D;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAanE;AAuBD,oHAAoH;AACpH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAMjH;AAED,qFAAqF;AACrF,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAK7E;AAMD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAEjE;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,OAAO,CAAC,UAAU,CAAC,CAoB3F;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAOvF;AAED,4FAA4F;AAC5F,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAK9E"}
@@ -0,0 +1,222 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.WORKLOAD_HOME = exports.WORKLOAD_GID = exports.WORKLOAD_UID = exports.WORKLOAD_USER = void 0;
7
+ exports.workloadIdentity = workloadIdentity;
8
+ exports.workloadEnv = workloadEnv;
9
+ exports.writeWorkloadFile = writeWorkloadFile;
10
+ exports.appendWorkloadFile = appendWorkloadFile;
11
+ exports.removeWorkloadFile = removeWorkloadFile;
12
+ exports.makeWorkloadDir = makeWorkloadDir;
13
+ exports.workloadAppendStream = workloadAppendStream;
14
+ exports.handOverToWorkload = handOverToWorkload;
15
+ exports.packAsWorkload = packAsWorkload;
16
+ exports.unpackAsWorkload = unpackAsWorkload;
17
+ exports.isInsideDir = isInsideDir;
18
+ exports.openInside = openInside;
19
+ exports.readInside = readInside;
20
+ exports.realDirInside = realDirInside;
21
+ // Who runs what in a VM. The agent runtime is root and holds the VM's secrets; everything the model
22
+ // or an app controls (its commands, its app's processes, a build's steps) runs as an unprivileged
23
+ // user that can't read the runtime's environment or memory. That user owns the workspace, so the
24
+ // runtime must never trust what's in it: a link there can lead anywhere and root would follow it.
25
+ // So the runtime writes workspace files as that user, and reads them only through openInside.
26
+ //
27
+ // Not root (a test, or a dev's machine) there is no one to protect the runtime from: these are
28
+ // plain file calls and commands run as whoever ran the agent.
29
+ const node_child_process_1 = require("node:child_process");
30
+ const node_fs_1 = require("node:fs");
31
+ const node_path_1 = __importDefault(require("node:path"));
32
+ const promises_1 = require("node:stream/promises");
33
+ const node_zlib_1 = require("node:zlib");
34
+ exports.WORKLOAD_USER = 'agent';
35
+ exports.WORKLOAD_UID = 1001;
36
+ exports.WORKLOAD_GID = 1001;
37
+ exports.WORKLOAD_HOME = '/home/agent';
38
+ /** The identity to start a workload process with, for spawn's options. */
39
+ function workloadIdentity() {
40
+ var _a;
41
+ return ((_a = process.getuid) === null || _a === void 0 ? void 0 : _a.call(process)) === 0 ? { uid: exports.WORKLOAD_UID, gid: exports.WORKLOAD_GID } : undefined;
42
+ }
43
+ /** A workload's env: its own home, since root's isn't readable to it (npm's and pip's caches live there). */
44
+ function workloadEnv(env) {
45
+ return workloadIdentity() ? { ...env, HOME: exports.WORKLOAD_HOME, USER: exports.WORKLOAD_USER, LOGNAME: exports.WORKLOAD_USER } : env;
46
+ }
47
+ function runAsWorkload(script, target, input) {
48
+ return new Promise((resolve, reject) => {
49
+ const child = (0, node_child_process_1.spawn)('sh', ['-c', script, 'sh', target], {
50
+ ...workloadIdentity(),
51
+ cwd: '/',
52
+ env: { PATH: process.env.PATH },
53
+ stdio: ['pipe', 'ignore', 'pipe'],
54
+ });
55
+ let stderr = '';
56
+ child.stderr.on('data', (chunk) => {
57
+ stderr += chunk.toString('utf8');
58
+ });
59
+ child.on('error', reject);
60
+ // It failed before reading what it was given: its exit says why, this only repeats it.
61
+ child.stdin.on('error', () => undefined);
62
+ child.on('close', (code) => {
63
+ if (code === 0)
64
+ resolve();
65
+ else
66
+ reject(new Error(`Could not change ${target}: ${stderr.trim() || `exit ${code}`}`));
67
+ });
68
+ child.stdin.end(input);
69
+ });
70
+ }
71
+ const WRITE = 'mkdir -p -- "$(dirname -- "$1")" && cat > "$1"';
72
+ const APPEND = 'mkdir -p -- "$(dirname -- "$1")" && cat >> "$1"';
73
+ const APPEND_STREAM = 'mkdir -p -- "$(dirname -- "$1")" && exec cat >> "$1"';
74
+ /** Writes a workspace file, and any folder it needs. */
75
+ async function writeWorkloadFile(target, content) {
76
+ if (workloadIdentity())
77
+ return runAsWorkload(WRITE, target, content);
78
+ await node_fs_1.promises.mkdir(node_path_1.default.dirname(target), { recursive: true });
79
+ await node_fs_1.promises.writeFile(target, content);
80
+ }
81
+ async function appendWorkloadFile(target, content) {
82
+ if (workloadIdentity())
83
+ return runAsWorkload(APPEND, target, content);
84
+ await node_fs_1.promises.mkdir(node_path_1.default.dirname(target), { recursive: true });
85
+ await node_fs_1.promises.appendFile(target, content);
86
+ }
87
+ async function removeWorkloadFile(target) {
88
+ if (workloadIdentity())
89
+ return runAsWorkload('rm -f -- "$1"', target);
90
+ await node_fs_1.promises.rm(target, { force: true });
91
+ }
92
+ async function makeWorkloadDir(dir) {
93
+ if (workloadIdentity())
94
+ return runAsWorkload('mkdir -p -- "$1"', dir);
95
+ await node_fs_1.promises.mkdir(dir, { recursive: true });
96
+ }
97
+ /** A file an app's output keeps being appended to, for as long as it runs. */
98
+ function workloadAppendStream(target) {
99
+ if (!workloadIdentity())
100
+ return (0, node_fs_1.createWriteStream)(target, { flags: 'a' });
101
+ const child = (0, node_child_process_1.spawn)('sh', ['-c', APPEND_STREAM, 'sh', target], {
102
+ ...workloadIdentity(),
103
+ cwd: '/',
104
+ env: { PATH: process.env.PATH },
105
+ stdio: ['pipe', 'ignore', 'ignore'],
106
+ });
107
+ child.on('error', (error) => child.stdin.destroy(error));
108
+ return child.stdin;
109
+ }
110
+ /**
111
+ * Gives a tree the runtime fetched to the workload. Only before any workload runs: nothing can
112
+ * change it meanwhile, and -h with -R never follows a link left there by an earlier run on this disk.
113
+ */
114
+ async function handOverToWorkload(dir) {
115
+ const identity = workloadIdentity();
116
+ if (!identity) {
117
+ console.warn('[workload] not running as root: commands and apps run as this user, with no separation');
118
+ return;
119
+ }
120
+ await node_fs_1.promises.mkdir(exports.WORKLOAD_HOME, { recursive: true });
121
+ await node_fs_1.promises.chown(exports.WORKLOAD_HOME, identity.uid, identity.gid);
122
+ await new Promise((resolve, reject) => {
123
+ const child = (0, node_child_process_1.spawn)('chown', ['-hR', `${identity.uid}:${identity.gid}`, '--', dir], { stdio: 'ignore' });
124
+ child.on('error', reject);
125
+ child.on('close', (code) => (code === 0 ? resolve() : reject(new Error(`Could not hand over ${dir}: exit ${code}`))));
126
+ });
127
+ }
128
+ /**
129
+ * Runs tar as the workload, feeding it through `flow`. What's in a folder a build wrote, or an
130
+ * archive of one, is what the app's own code left there: root would follow its links and write where
131
+ * its paths lead, the workload can only reach what it could anyway.
132
+ */
133
+ async function tarAsWorkload(args, cwd, flow) {
134
+ const child = (0, node_child_process_1.spawn)('tar', args, { ...workloadIdentity(), cwd, env: { PATH: process.env.PATH }, stdio: ['pipe', 'pipe', 'pipe'] });
135
+ let stderr = '';
136
+ child.stderr.on('data', (chunk) => {
137
+ stderr = (stderr + chunk.toString('utf8')).slice(-2000);
138
+ });
139
+ const exited = new Promise((resolve, reject) => {
140
+ child.on('error', reject);
141
+ child.on('close', (code) => (code === 0 ? resolve() : reject(new Error(`tar failed: ${stderr.trim() || `exit ${code}`}`))));
142
+ });
143
+ const [fed, ended] = await Promise.allSettled([flow(child), exited]);
144
+ // When tar gives up, its pipe breaks too: only its own exit says why.
145
+ if (fed.status === 'rejected' && fed.reason.code !== 'EPIPE')
146
+ throw fed.reason;
147
+ if (ended.status === 'rejected')
148
+ throw ended.reason;
149
+ }
150
+ /** Writes `folders` of `dir` to `target` as a compressed archive, leaving out what `exclude` names at any depth. */
151
+ function packAsWorkload(dir, folders, exclude, target) {
152
+ const args = ['-c', '-f', '-', ...exclude.map((name) => `--exclude=${name}`), ...folders.map((folder) => (folder === '.' ? '.' : `./${folder}`))];
153
+ return tarAsWorkload(args, dir, async ({ stdin, stdout }) => {
154
+ stdin.end();
155
+ await (0, promises_1.pipeline)(stdout, (0, node_zlib_1.createZstdCompress)({ params: { [node_zlib_1.constants.ZSTD_c_checksumFlag]: 1 } }), target);
156
+ });
157
+ }
158
+ /** Unpacks what packAsWorkload wrote into `dir`, which the workload already owns. */
159
+ function unpackAsWorkload(dir, source) {
160
+ return tarAsWorkload(['-x', '-f', '-'], dir, async ({ stdin, stdout }) => {
161
+ stdout.resume();
162
+ await (0, promises_1.pipeline)(source, (0, node_zlib_1.createZstdDecompress)(), stdin);
163
+ });
164
+ }
165
+ function notFound(file) {
166
+ return Object.assign(new Error(`ENOENT: no such file, open '${file}'`), { code: 'ENOENT' });
167
+ }
168
+ /**
169
+ * Whether `target` is `root` or somewhere under it, by path alone: a neighbour that only shares its
170
+ * prefix isn't. Both absolute and normalized, and real paths where a link could lead out.
171
+ */
172
+ function isInsideDir(root, target) {
173
+ return target === root || target.startsWith(`${root}${node_path_1.default.sep}`);
174
+ }
175
+ /**
176
+ * Opens a file to read, for the runtime: only if what actually opened is a regular file under
177
+ * `root`. Checking first and opening after would leave a gap to swap a link in, so it asks the
178
+ * kernel what this open reached. Anything else reads as missing, which callers already handle.
179
+ */
180
+ async function openInside(root, file, flags = 0) {
181
+ if (!workloadIdentity())
182
+ return node_fs_1.promises.open(file, node_fs_1.constants.O_RDONLY | flags);
183
+ // Non-blocking: a FIFO left there must not hang the runtime on an open with no writer.
184
+ const handle = await node_fs_1.promises.open(file, node_fs_1.constants.O_RDONLY | node_fs_1.constants.O_NONBLOCK | flags);
185
+ try {
186
+ const [realRoot, opened, stat] = await Promise.all([
187
+ node_fs_1.promises.realpath(root),
188
+ node_fs_1.promises.readlink(`/proc/self/fd/${handle.fd}`),
189
+ handle.stat(),
190
+ ]);
191
+ const inside = isInsideDir(realRoot, opened);
192
+ if (inside && stat.isDirectory()) {
193
+ throw Object.assign(new Error(`EISDIR: illegal operation on a directory, read '${file}'`), { code: 'EISDIR' });
194
+ }
195
+ if (inside && stat.isFile())
196
+ return handle;
197
+ throw notFound(file);
198
+ }
199
+ catch (error) {
200
+ await handle.close();
201
+ throw error;
202
+ }
203
+ }
204
+ async function readInside(root, file, flags = 0) {
205
+ const handle = await openInside(root, file, flags);
206
+ try {
207
+ return await handle.readFile();
208
+ }
209
+ finally {
210
+ await handle.close();
211
+ }
212
+ }
213
+ /** A directory's real path, if it's really under `root` (listing one follows links too). */
214
+ async function realDirInside(root, dir) {
215
+ if (!workloadIdentity())
216
+ return dir;
217
+ const [realRoot, real] = await Promise.all([node_fs_1.promises.realpath(root), node_fs_1.promises.realpath(dir)]);
218
+ if (!isInsideDir(realRoot, real))
219
+ throw notFound(dir);
220
+ return real;
221
+ }
222
+ //# sourceMappingURL=workload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workload.js","sourceRoot":"","sources":["../../src/runtime/workload.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=workload.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workload.test.d.ts","sourceRoot":"","sources":["../../src/runtime/workload.test.ts"],"names":[],"mappings":""}