@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,267 @@
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_test_1 = require("node:test");
8
+ const detect_1 = require("./detect");
9
+ function detect(files) {
10
+ const texts = Object.fromEntries(Object.entries(files).map(([file, content]) => [file, typeof content === 'string' ? content : JSON.stringify(content)]));
11
+ return (0, detect_1.detectApp)((0, detect_1.fileListReader)(Object.keys(texts), async (file) => texts[file]));
12
+ }
13
+ const pkg = (dependencies, scripts = {}) => ({ dependencies, scripts });
14
+ (0, node_test_1.describe)('detecting an app the way Vercel does', () => {
15
+ (0, node_test_1.it)('knows the frameworks by their dependency, and installs with the lockfile\'s package manager', async () => {
16
+ var _a, _b;
17
+ const next = await detect({ 'package.json': pkg({ next: '15', react: '19' }), 'pnpm-lock.yaml': '' });
18
+ strict_1.default.deepEqual(next, {
19
+ framework: 'nextjs',
20
+ settings: {
21
+ installCommand: 'pnpm install',
22
+ devCommand: 'next dev -H 0.0.0.0 -p $PORT',
23
+ buildCommand: 'next build',
24
+ startCommand: 'next start -H 0.0.0.0 -p $PORT',
25
+ },
26
+ });
27
+ const vite = await detect({ 'package.json': { devDependencies: { vite: '7' } }, 'yarn.lock': '' });
28
+ strict_1.default.equal(vite === null || vite === void 0 ? void 0 : vite.framework, 'vite');
29
+ strict_1.default.equal(vite === null || vite === void 0 ? void 0 : vite.settings.installCommand, 'npx --yes yarn install');
30
+ strict_1.default.equal(vite === null || vite === void 0 ? void 0 : vite.settings.outputDirectory, 'dist');
31
+ strict_1.default.deepEqual(vite === null || vite === void 0 ? void 0 : vite.settings.rewrites, [{ source: '/(.*)', destination: '/index.html' }]);
32
+ // SvelteKit builds with Vite: the more specific framework wins.
33
+ strict_1.default.equal((_a = (await detect({ 'package.json': pkg({ '@sveltejs/kit': '2', vite: '7', '@sveltejs/adapter-node': '5' }) }))) === null || _a === void 0 ? void 0 : _a.settings.startCommand, 'node build');
34
+ strict_1.default.equal((_b = (await detect({ 'package.json': pkg({ astro: '5' }) }))) === null || _b === void 0 ? void 0 : _b.settings.outputDirectory, 'dist');
35
+ });
36
+ (0, node_test_1.it)('runs a node server by its scripts, else its entry file', async () => {
37
+ const scripted = await detect({ 'package.json': pkg({ express: '5' }, { dev: 'node --watch server.js', start: 'node server.js' }), 'bun.lock': '' });
38
+ strict_1.default.deepEqual(scripted === null || scripted === void 0 ? void 0 : scripted.settings, { installCommand: 'npx --yes bun install', devCommand: 'npx --yes bun run dev', buildCommand: undefined, startCommand: 'npx --yes bun run start' });
39
+ const bare = await detect({ 'package.json': pkg({ hono: '4' }), 'src/index.ts': '' });
40
+ strict_1.default.equal(bare === null || bare === void 0 ? void 0 : bare.framework, 'hono');
41
+ strict_1.default.equal(bare === null || bare === void 0 ? void 0 : bare.settings.devCommand, 'node src/index.ts');
42
+ });
43
+ (0, node_test_1.it)('falls back to the package\'s own scripts ("Other")', async () => {
44
+ const scripts = await detect({ 'package.json': pkg({}, { dev: 'parcel', build: 'parcel build' }), 'public/index.html': '' });
45
+ strict_1.default.deepEqual(scripts, { framework: null, settings: { installCommand: 'npm install', devCommand: 'npm run dev', buildCommand: 'npm run build', outputDirectory: 'public' } });
46
+ // A package.json that only holds a script's dependencies is no app.
47
+ strict_1.default.equal(await detect({ 'package.json': pkg({ lodash: '4' }), 'build-data.js': '' }), undefined);
48
+ });
49
+ (0, node_test_1.it)('runs FastAPI, Flask and a plain Python server in a virtualenv', async () => {
50
+ var _a, _b;
51
+ const fastapi = await detect({ 'requirements.txt': 'fastapi==0.115\nuvicorn\n', 'src/main.py': 'from fastapi import FastAPI\napi = FastAPI()\n' });
52
+ strict_1.default.deepEqual(fastapi, {
53
+ framework: 'fastapi',
54
+ settings: {
55
+ installCommand: 'python3 -m venv .venv && .venv/bin/pip install -r requirements.txt',
56
+ devCommand: 'uvicorn --app-dir src main:api --host 0.0.0.0 --port $PORT --reload',
57
+ startCommand: 'uvicorn --app-dir src main:api --host 0.0.0.0 --port $PORT',
58
+ },
59
+ });
60
+ strict_1.default.equal((_a = (await detect({ 'app.py': 'from flask import Flask\n' }))) === null || _a === void 0 ? void 0 : _a.settings.devCommand, 'flask --app app.py run --host 0.0.0.0 --port $PORT --debug');
61
+ strict_1.default.equal((_b = (await detect({ 'server.py': 'port = int(os.environ["PORT"])' }))) === null || _b === void 0 ? void 0 : _b.framework, 'python');
62
+ // An analysis script serves nothing.
63
+ strict_1.default.equal(await detect({ 'main.py': 'import pandas\nprint(1)\n' }), undefined);
64
+ });
65
+ (0, node_test_1.it)('serves static files from public/, else the root', async () => {
66
+ strict_1.default.deepEqual(await detect({ 'public/index.html': '', 'build-data.js': '', 'data/raw/a.json': '' }), { framework: null, settings: { outputDirectory: 'public' } });
67
+ strict_1.default.deepEqual(await detect({ 'index.html': '' }), { framework: null, settings: { outputDirectory: '.' } });
68
+ strict_1.default.equal(await detect({ 'research/findings.md': '', 'data/results.csv': '' }), undefined);
69
+ });
70
+ });
71
+ function project(files) {
72
+ const texts = Object.fromEntries(Object.entries(files).map(([file, content]) => [file, typeof content === 'string' ? content : JSON.stringify(content)]));
73
+ // As the file says it, without the keys left unset.
74
+ return (0, detect_1.detectProject)((0, detect_1.fileListReader)(Object.keys(texts), async (file) => texts[file])).then((manifest) => manifest && JSON.parse(JSON.stringify(manifest)));
75
+ }
76
+ /** `/source -> service`, in order, without the bare `/x` that goes with each `/x/(.*)`. */
77
+ function routes(manifest) {
78
+ const sources = new Set(manifest === null || manifest === void 0 ? void 0 : manifest.rewrites.map((rule) => rule.source));
79
+ return manifest === null || manifest === void 0 ? void 0 : manifest.rewrites.filter((rule) => !sources.has(`${rule.source}/(.*)`)).map((rule) => `${rule.source} -> ${rule.destination.service}`);
80
+ }
81
+ const VITE = { scripts: { dev: 'vite', build: 'vite build' }, devDependencies: { vite: '7' } };
82
+ const EXPRESS = pkg({ express: '5' }, { start: 'node index.js' });
83
+ (0, node_test_1.describe)('detecting a project\'s services', () => {
84
+ (0, node_test_1.it)('writes one service the same way as many, with its route', async () => {
85
+ strict_1.default.deepEqual(await project({ 'package.json': EXPRESS, 'index.js': '', 'data/filings.js': '' }), {
86
+ services: { api: { root: '.', framework: 'express', installCommand: 'npm install', devCommand: 'npm run start', startCommand: 'npm run start' } },
87
+ rewrites: [{ source: '/(.*)', destination: { service: 'api' } }],
88
+ });
89
+ strict_1.default.deepEqual(await project({ 'index.html': '' }), {
90
+ services: { web: { root: '.', framework: null, outputDirectory: '.' } },
91
+ rewrites: [{ source: '/(.*)', destination: { service: 'web' } }],
92
+ });
93
+ strict_1.default.equal(await project({ 'research/findings.md': '' }), undefined);
94
+ });
95
+ (0, node_test_1.it)('finds a site and its server in their folders, and routes between them', async () => {
96
+ const manifest = await project({ 'web/package.json': VITE, 'server/package.json': EXPRESS, 'server/index.js': '' });
97
+ strict_1.default.deepEqual(Object.keys(manifest.services), ['server', 'web']);
98
+ strict_1.default.equal(manifest.services.web.root, 'web');
99
+ strict_1.default.equal(manifest.services.web.framework, 'vite');
100
+ strict_1.default.equal(manifest.services.server.root, 'server');
101
+ strict_1.default.deepEqual(routes(manifest), ['/api/(.*) -> server', '/(.*) -> web']);
102
+ strict_1.default.deepEqual(manifest.rewrites[0], { source: '/api', destination: { service: 'server' } });
103
+ });
104
+ (0, node_test_1.it)('looks in apps/ and services/, past a monorepo root that only runs them', async () => {
105
+ const manifest = await project({
106
+ 'package.json': { scripts: { dev: 'turbo run dev', build: 'turbo run build' }, devDependencies: { turbo: '2' } },
107
+ 'pnpm-workspace.yaml': '',
108
+ 'pnpm-lock.yaml': '',
109
+ 'apps/web/package.json': VITE,
110
+ 'apps/docs/package.json': pkg({ next: '15' }),
111
+ 'services/billing/package.json': EXPRESS,
112
+ 'services/billing/index.js': '',
113
+ 'services/api/requirements.txt': 'fastapi\n',
114
+ 'services/api/main.py': 'app = FastAPI()\n',
115
+ 'packages/ui/package.json': VITE,
116
+ });
117
+ strict_1.default.deepEqual(Object.keys(manifest.services).sort(), ['api', 'billing', 'docs', 'web']);
118
+ strict_1.default.deepEqual(routes(manifest), ['/api/(.*) -> api', '/billing/(.*) -> billing', '/docs/(.*) -> docs', '/(.*) -> web']);
119
+ // The lockfile at the top of a monorepo says how its packages install.
120
+ strict_1.default.equal(manifest.services.web.installCommand, 'pnpm install');
121
+ });
122
+ (0, node_test_1.it)('reads a child\'s own lockfile before the root\'s', async () => {
123
+ const manifest = await project({ 'pnpm-lock.yaml': '', 'web/package.json': VITE, 'web/yarn.lock': '' });
124
+ strict_1.default.equal(manifest.services.web.installCommand, 'npx --yes yarn install');
125
+ });
126
+ (0, node_test_1.it)('takes every service in packages/, by any name, and routes them', async () => {
127
+ const manifest = await project({
128
+ 'README.md': '',
129
+ 'packages/web/index.html': '',
130
+ 'packages/admin/index.html': '',
131
+ 'packages/api/package.json': EXPRESS,
132
+ 'packages/api/index.js': '',
133
+ 'packages/billing/requirements.txt': 'fastapi\n',
134
+ 'packages/billing/main.py': 'app = FastAPI()\n',
135
+ });
136
+ strict_1.default.deepEqual(Object.fromEntries(Object.entries(manifest.services).map(([name, service]) => [name, service.root])), { admin: 'packages/admin', api: 'packages/api', billing: 'packages/billing', web: 'packages/web' });
137
+ strict_1.default.deepEqual(routes(manifest), ['/api/(.*) -> api', '/billing/(.*) -> billing', '/admin/(.*) -> admin', '/(.*) -> web']);
138
+ });
139
+ (0, node_test_1.it)('takes a lone service in packages/, which gets everything', async () => {
140
+ const api = await project({ 'packages/api/package.json': EXPRESS, 'packages/api/index.js': '' });
141
+ strict_1.default.deepEqual(routes(api), ['/(.*) -> api']);
142
+ const page = await project({ 'packages/web/index.html': '' });
143
+ strict_1.default.deepEqual(page.services.web, { root: 'packages/web', framework: null, outputDirectory: '.' });
144
+ });
145
+ (0, node_test_1.it)('leaves what only builds in packages/: nothing to run, or a bundler with no page', async () => {
146
+ const manifest = await project({
147
+ 'package.json': { workspaces: ['packages/*'] },
148
+ 'packages/web/package.json': VITE,
149
+ 'packages/web/index.html': '',
150
+ 'packages/shared/package.json': { scripts: { dev: 'tsc -w' } },
151
+ 'packages/ui/package.json': VITE,
152
+ });
153
+ strict_1.default.deepEqual(Object.keys(manifest.services), ['web']);
154
+ });
155
+ (0, node_test_1.it)('leaves packages/ as shared code beside apps/ or services/, or under a root that is an app', async () => {
156
+ const next = pkg({ next: '15' });
157
+ const apps = await project({ 'apps/web/package.json': VITE, 'packages/docs/package.json': next });
158
+ strict_1.default.deepEqual(Object.keys(apps.services), ['web']);
159
+ const root = await project({ 'package.json': next, 'packages/docs/package.json': next });
160
+ strict_1.default.deepEqual(Object.keys(root.services), ['web']);
161
+ });
162
+ (0, node_test_1.it)('adds a service in packages/ to a project that started elsewhere', async () => {
163
+ const site = await project({ 'index.html': '', 'packages/api/package.json': EXPRESS, 'packages/api/index.js': '' });
164
+ strict_1.default.deepEqual(Object.keys(site.services).sort(), ['api', 'web']);
165
+ const folder = await project({ 'web/index.html': '', 'packages/api/package.json': EXPRESS, 'packages/api/index.js': '' });
166
+ strict_1.default.deepEqual(routes(folder), ['/api/(.*) -> api', '/(.*) -> web']);
167
+ });
168
+ (0, node_test_1.it)('sets a further site up to work below its name, and leaves a framework\'s own base path to it', async () => {
169
+ const manifest = await project({
170
+ 'packages/web/index.html': '',
171
+ 'packages/admin/index.html': '',
172
+ 'packages/shop/package.json': VITE,
173
+ 'packages/shop/index.html': '',
174
+ 'packages/docs/package.json': pkg({ next: '15' }),
175
+ });
176
+ strict_1.default.equal(manifest.services.web.rewrites, undefined);
177
+ strict_1.default.deepEqual(manifest.services.admin.redirects, [{ source: '/(admin(?!/))', destination: '/admin/', permanent: false }]);
178
+ strict_1.default.deepEqual(manifest.services.admin.rewrites, [{ source: '/admin/(.*)', destination: '/$1' }]);
179
+ strict_1.default.match(manifest.services.shop.devCommand, / --base \/shop\/$/);
180
+ strict_1.default.match(manifest.services.shop.buildCommand, / --base \/shop\/$/);
181
+ strict_1.default.deepEqual(manifest.services.shop.rewrites, [
182
+ { source: '/shop/(.*\\.\\w+)', destination: '/$1' },
183
+ { source: '/shop/(.*)', destination: '/index.html' },
184
+ ]);
185
+ strict_1.default.equal(manifest.services.docs.redirects, undefined);
186
+ strict_1.default.ok(!manifest.services.docs.devCommand.includes('--base'));
187
+ });
188
+ (0, node_test_1.it)('keeps a root that is a service of its own beside its folders', async () => {
189
+ const root = await project({ 'package.json': EXPRESS, 'index.js': '', 'client/package.json': VITE });
190
+ strict_1.default.deepEqual(Object.keys(root.services), ['api', 'client']);
191
+ strict_1.default.deepEqual(routes(root), ['/api/(.*) -> api', '/(.*) -> client']);
192
+ // Only scripts, but they run nothing in its folders.
193
+ const scripted = await project({ 'package.json': { scripts: { start: 'node server.js' } }, 'client/package.json': VITE });
194
+ strict_1.default.deepEqual(routes(scripted), ['/api/(.*) -> api', '/(.*) -> client']);
195
+ // Scripts that run its folders: starting them too would run everything twice.
196
+ const runner = await project({ 'package.json': pkg({}, { dev: 'concurrently "npm run dev --prefix web" "npm start --prefix server"' }), 'web/package.json': VITE, 'server/package.json': EXPRESS, 'server/index.js': '' });
197
+ strict_1.default.deepEqual(Object.keys(runner.services), ['server', 'web']);
198
+ });
199
+ (0, node_test_1.it)('serves a server\'s public/ in front of it', async () => {
200
+ const manifest = await project({ 'package.json': EXPRESS, 'index.js': '', 'public/index.html': '' });
201
+ strict_1.default.deepEqual(manifest.services.web, { root: '.', framework: null, outputDirectory: 'public' });
202
+ strict_1.default.deepEqual(routes(manifest), ['/(.*) -> web', '/(.*) -> api']);
203
+ });
204
+ (0, node_test_1.it)('leaves a root index.html beside a server to the server: serving the root would hand out its source', async () => {
205
+ const manifest = await project({ 'package.json': EXPRESS, 'index.js': '', 'index.html': '' });
206
+ strict_1.default.deepEqual(Object.keys(manifest.services), ['api']);
207
+ });
208
+ (0, node_test_1.it)('keeps a static root from handing out the source of the services inside it', async () => {
209
+ const manifest = await project({ 'index.html': '', 'server/package.json': EXPRESS, 'server/index.js': '' });
210
+ strict_1.default.deepEqual(routes(manifest), ['/api/(.*) -> server', '/server/(.*) -> server', '/(.*) -> web']);
211
+ });
212
+ (0, node_test_1.it)('takes no folder for a service that is part of the app', async () => {
213
+ const manifest = await project({
214
+ 'index.html': '',
215
+ 'reports/index.html': '',
216
+ 'public/package.json': VITE,
217
+ 'lib/package.json': EXPRESS,
218
+ 'node_modules/x/package.json': EXPRESS,
219
+ 'shared/package.json': { scripts: { dev: 'tsc -w', build: 'tsc' } },
220
+ });
221
+ strict_1.default.deepEqual(Object.keys(manifest.services), ['web']);
222
+ });
223
+ (0, node_test_1.it)('takes a folder of pages under a site\'s name, and one with its own package', async () => {
224
+ strict_1.default.deepEqual(Object.keys((await project({ 'frontend/index.html': '' })).services), ['frontend']);
225
+ strict_1.default.deepEqual(Object.keys((await project({ 'reports/index.html': '', 'reports/package.json': {} })).services), ['reports']);
226
+ });
227
+ (0, node_test_1.it)('leaves a Python app\'s entry folder to it', async () => {
228
+ const manifest = await project({ 'requirements.txt': 'flask\n', 'app/app.py': '' });
229
+ strict_1.default.deepEqual(Object.keys(manifest.services), ['api']);
230
+ strict_1.default.equal(manifest.services.api.root, '.');
231
+ });
232
+ (0, node_test_1.it)('finds an api/ folder of functions beside a static app, or alone', async () => {
233
+ const functions = { directory: 'api', path: '/api' };
234
+ const beside = await project({ 'public/index.html': '', 'api/hello.js': '' });
235
+ strict_1.default.deepEqual(beside.services, {
236
+ web: { root: '.', framework: null, outputDirectory: 'public' },
237
+ api: { root: '.', framework: null, functions },
238
+ });
239
+ strict_1.default.deepEqual(routes(beside), ['/api/(.*) -> api', '/(.*) -> web']);
240
+ const vite = await project({ 'package.json': VITE, 'pnpm-lock.yaml': '', 'api/users/[id].ts': '' });
241
+ strict_1.default.deepEqual(vite.services.api, { root: '.', framework: null, installCommand: 'pnpm install', functions });
242
+ const alone = await project({ 'api/hello.js': '' });
243
+ strict_1.default.deepEqual(alone.services, { api: { root: '.', framework: null, functions } });
244
+ strict_1.default.deepEqual((await project({ 'package.json': {}, 'api/hello.js': '' })).services.api.installCommand, 'npm install');
245
+ // A site in its own folder has its own.
246
+ strict_1.default.deepEqual((await project({ 'web/index.html': '', 'web/api/hello.js': '' })).services.api, { root: 'web', framework: null, functions });
247
+ // Helpers alone are no functions.
248
+ strict_1.default.equal(await project({ 'api/_db.js': '', 'api/types.d.ts': '' }), undefined);
249
+ });
250
+ (0, node_test_1.it)('leaves api/ to a server or a full-stack framework: there it is their own code', async () => {
251
+ const express = await project({ 'package.json': EXPRESS, 'api/routes.js': '' });
252
+ strict_1.default.deepEqual(Object.keys(express.services), ['api']);
253
+ strict_1.default.equal(express.services.api.functions, undefined);
254
+ const next = await project({ 'package.json': pkg({ next: '15' }), 'api/hello.js': '' });
255
+ strict_1.default.deepEqual(Object.keys(next.services), ['web']);
256
+ strict_1.default.equal(next.services.web.framework, 'nextjs');
257
+ // An api/ that is a service of its own.
258
+ const own = await project({ 'index.html': '', 'api/package.json': EXPRESS, 'api/index.js': '' });
259
+ strict_1.default.equal(own.services.api.framework, 'express');
260
+ strict_1.default.equal(own.services.api.functions, undefined);
261
+ });
262
+ (0, node_test_1.it)('gives every service a usable name, once', async () => {
263
+ const manifest = await project({ 'package.json': EXPRESS, 'index.js': '', 'api/package.json': EXPRESS, 'api/index.js': '', 'services/api/package.json': EXPRESS, 'services/api/index.js': '', 'my.app/package.json': EXPRESS, 'my.app/index.js': '' });
264
+ strict_1.default.deepEqual(Object.keys(manifest.services).sort(), ['api', 'api-2', 'api-3', 'my-app']);
265
+ });
266
+ });
267
+ //# sourceMappingURL=detect.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.test.js","sourceRoot":"","sources":["../../src/app/detect.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /** A session VM's app: none of the agent's own settings (every AGENT_ENV name) or SSH keys. */
2
+ export declare function sessionAppEnv(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
3
+ /** A deployment's app: the deployment's env, without what delivered its release. */
4
+ export declare function deployedAppEnv(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
5
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/app/env.ts"],"names":[],"mappings":"AAUA,+FAA+F;AAC/F,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAEvE;AAED,oFAAoF;AACpF,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAExE"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sessionAppEnv = sessionAppEnv;
4
+ exports.deployedAppEnv = deployedAppEnv;
5
+ // What an app's processes see of the guest's environment: their own settings, never the
6
+ // platform's — no model keys, FilingRamp credentials or VM token in a dev server or a deployment.
7
+ const protocol_1 = require("../transport/protocol");
8
+ function without(env, names) {
9
+ const result = { ...env };
10
+ for (const name of names)
11
+ delete result[name];
12
+ return result;
13
+ }
14
+ /** A session VM's app: none of the agent's own settings (every AGENT_ENV name) or SSH keys. */
15
+ function sessionAppEnv(env) {
16
+ return without(env, [...Object.values(protocol_1.AGENT_ENV), 'AGENT_SSH_PUBLIC_KEYS_B64']);
17
+ }
18
+ /** A deployment's app: the deployment's env, without what delivered its release. */
19
+ function deployedAppEnv(env) {
20
+ return without(env, protocol_1.RELEASE_DELIVERY_ENV);
21
+ }
22
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/app/env.ts"],"names":[],"mappings":";;AAWA,sCAEC;AAGD,wCAEC;AAlBD,wFAAwF;AACxF,kGAAkG;AAClG,oDAAuE;AAEvE,SAAS,OAAO,CAAC,GAAsB,EAAE,KAAwB;IAC/D,MAAM,MAAM,GAAG,EAAE,GAAG,GAAG,EAAE,CAAA;IACzB,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC,CAAA;IAC7C,OAAO,MAAM,CAAA;AACf,CAAC;AAED,+FAA+F;AAC/F,SAAgB,aAAa,CAAC,GAAsB;IAClD,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,oBAAS,CAAC,EAAE,2BAA2B,CAAC,CAAC,CAAA;AACjF,CAAC;AAED,oFAAoF;AACpF,SAAgB,cAAc,CAAC,GAAsB;IACnD,OAAO,OAAO,CAAC,GAAG,EAAE,+BAAoB,CAAC,CAAA;AAC3C,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=functions-cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"functions-cli.d.ts","sourceRoot":"","sources":["../../src/app/functions-cli.ts"],"names":[],"mappings":""}
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ // builder-functions: serves the current directory's functions on $PORT (functions-host.ts), from
5
+ // the folder and URL in --dir and --path (builder.json's `functions`). With --watch (a session VM),
6
+ // node restarts it whenever a loaded file changes.
7
+ const node_child_process_1 = require("node:child_process");
8
+ const functions_host_1 = require("./functions-host");
9
+ const args = process.argv.slice(2);
10
+ const flag = (name) => {
11
+ const index = args.indexOf(name);
12
+ return index >= 0 ? args[index + 1] : undefined;
13
+ };
14
+ if (args.includes('--watch')) {
15
+ // In the runner's process group, so stopping the app stops this child too.
16
+ const forwarded = args.filter((arg) => arg !== '--watch');
17
+ const child = (0, node_child_process_1.spawn)(process.execPath, ['--watch', '--watch-preserve-output', __filename, ...forwarded], { stdio: 'inherit' });
18
+ child.on('exit', (code) => process.exit(code !== null && code !== void 0 ? code : 1));
19
+ }
20
+ else {
21
+ (0, functions_host_1.resolveLikeABundler)();
22
+ // One function's stray error must not take down the others.
23
+ process.on('uncaughtException', (error) => console.error('[functions] uncaught:', error));
24
+ process.on('unhandledRejection', (error) => console.error('[functions] unhandled rejection:', error));
25
+ (0, functions_host_1.createFunctionsServer)(process.cwd(), { directory: flag('--dir'), path: flag('--path') }).listen(Number(process.env.PORT) || 3000, '0.0.0.0');
26
+ }
27
+ //# sourceMappingURL=functions-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"functions-cli.js","sourceRoot":"","sources":["../../src/app/functions-cli.ts"],"names":[],"mappings":";;;AACA,iGAAiG;AACjG,oGAAoG;AACpG,mDAAmD;AACnD,2DAA0C;AAC1C,qDAA6E;AAE7E,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;AAClC,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,EAAE;IAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAChC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;AACjD,CAAC,CAAA;AAED,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;IAC7B,2EAA2E;IAC3E,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,SAAS,CAAC,CAAA;IACzD,MAAM,KAAK,GAAG,IAAA,0BAAK,EAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,yBAAyB,EAAE,UAAU,EAAE,GAAG,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAA;IAC7H,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,aAAJ,IAAI,cAAJ,IAAI,GAAI,CAAC,CAAC,CAAC,CAAA;AACrD,CAAC;KAAM,CAAC;IACN,IAAA,oCAAmB,GAAE,CAAA;IACrB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC,CAAA;IACzF,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,KAAK,CAAC,CAAC,CAAA;IACrG,IAAA,sCAAqB,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,SAAS,CAAC,CAAA;AAC9I,CAAC"}
@@ -0,0 +1,15 @@
1
+ import http from 'node:http';
2
+ /**
3
+ * Vercel bundles a function, so `import db from '../lib/db'` works without an extension, and
4
+ * TypeScript's `./db.js` finds db.ts. Node needs both spelled out; this finds them as a bundler would.
5
+ */
6
+ export declare function resolveLikeABundler(): void;
7
+ export interface FunctionsOptions {
8
+ /** The functions' folder, relative to the app. */
9
+ directory?: string;
10
+ /** The URL they answer below; the folder's own path by default. */
11
+ path?: string;
12
+ }
13
+ /** A server answering requests from the functions in `dir` (a new file is picked up within a second). */
14
+ export declare function createFunctionsServer(dir: string, options?: FunctionsOptions): http.Server;
15
+ //# sourceMappingURL=functions-host.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"functions-host.d.ts","sourceRoot":"","sources":["../../src/app/functions-host.ts"],"names":[],"mappings":"AAKA,OAAO,IAAI,MAAM,WAAW,CAAA;AA2B5B;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAuB1C;AAoLD,MAAM,WAAW,gBAAgB;IAC/B,kDAAkD;IAClD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,mEAAmE;IACnE,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,yGAAyG;AACzG,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,IAAI,CAAC,MAAM,CAgB9F"}