forgeos 0.1.0-alpha.0 → 0.1.0-alpha.2

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 (283) hide show
  1. package/.npmignore +9 -1
  2. package/AGENTS.md +6 -1
  3. package/CHANGELOG.md +30 -0
  4. package/CONTRIBUTING.md +22 -1
  5. package/README.md +30 -3
  6. package/bin/forge.mjs +4 -3
  7. package/package.json +3 -1
  8. package/packages/eslint-plugin-forge/index.ts +15 -15
  9. package/packages/eslint-plugin-forge/package.json +10 -10
  10. package/packages/eslint-plugin-forge/src/check-source.ts +95 -95
  11. package/packages/eslint-plugin-forge/src/load-artifacts.ts +24 -24
  12. package/packages/eslint-plugin-forge/src/rule-no-forge-guard-violation.ts +93 -93
  13. package/src/forge/_generated/actionSubscriptions.json +2 -2
  14. package/src/forge/_generated/actionSubscriptions.ts +3 -3
  15. package/src/forge/_generated/agentAdapterManifest.json +2 -2
  16. package/src/forge/_generated/agentAdapterManifest.ts +3 -3
  17. package/src/forge/_generated/agentContract.json +2 -2
  18. package/src/forge/_generated/agentContract.ts +6786 -2
  19. package/src/forge/_generated/agentQuickstart.md +1 -1
  20. package/src/forge/_generated/aiContext.ts +1 -1
  21. package/src/forge/_generated/aiModels.json +1 -1
  22. package/src/forge/_generated/aiModels.ts +1 -1
  23. package/src/forge/_generated/aiProviders.json +1 -1
  24. package/src/forge/_generated/aiProviders.ts +1 -1
  25. package/src/forge/_generated/aiRegistry.json +2 -2
  26. package/src/forge/_generated/aiRegistry.ts +3 -3
  27. package/src/forge/_generated/api.json +2 -2
  28. package/src/forge/_generated/api.ts +1 -1
  29. package/src/forge/_generated/appGraph.json +2 -2
  30. package/src/forge/_generated/appGraph.ts +1297 -1141
  31. package/src/forge/_generated/appMap.md +1 -1
  32. package/src/forge/_generated/artifactManifest.json +2 -2
  33. package/src/forge/_generated/artifactManifest.ts +2 -2
  34. package/src/forge/_generated/authClaims.json +1 -1
  35. package/src/forge/_generated/authClaims.ts +1 -1
  36. package/src/forge/_generated/authConfig.json +1 -1
  37. package/src/forge/_generated/authConfig.ts +1 -1
  38. package/src/forge/_generated/authContext.ts +1 -1
  39. package/src/forge/_generated/authRegistry.json +1 -1
  40. package/src/forge/_generated/authRegistry.ts +1 -1
  41. package/src/forge/_generated/buildInfo.json +2 -2
  42. package/src/forge/_generated/buildInfo.ts +4 -4
  43. package/src/forge/_generated/capabilityMap.json +2 -2
  44. package/src/forge/_generated/capabilityMap.md +1 -1
  45. package/src/forge/_generated/capabilityMap.ts +2 -2
  46. package/src/forge/_generated/client.ts +1 -1
  47. package/src/forge/_generated/clientApi.ts +1 -1
  48. package/src/forge/_generated/clientManifest.json +2 -2
  49. package/src/forge/_generated/clientManifest.ts +3 -3
  50. package/src/forge/_generated/clientTypes.ts +1 -1
  51. package/src/forge/_generated/configRegistry.json +1 -1
  52. package/src/forge/_generated/configRegistry.ts +1 -1
  53. package/src/forge/_generated/dataGraph.json +2 -2
  54. package/src/forge/_generated/dataGraph.ts +3 -3
  55. package/src/forge/_generated/db.json +1 -1
  56. package/src/forge/_generated/db.ts +1 -1
  57. package/src/forge/_generated/dbSecurityManifest.json +1 -1
  58. package/src/forge/_generated/dbSecurityManifest.ts +1 -1
  59. package/src/forge/_generated/dbSessionContext.json +1 -1
  60. package/src/forge/_generated/dbSessionContext.ts +1 -1
  61. package/src/forge/_generated/deployManifest.json +2 -2
  62. package/src/forge/_generated/deployManifest.ts +7 -7
  63. package/src/forge/_generated/devManifest.json +2 -2
  64. package/src/forge/_generated/devManifest.ts +3 -3
  65. package/src/forge/_generated/envSchema.json +1 -1
  66. package/src/forge/_generated/envSchema.ts +1 -1
  67. package/src/forge/_generated/frontendGraph.json +1 -1
  68. package/src/forge/_generated/frontendGraph.ts +1 -1
  69. package/src/forge/_generated/importGuards.json +2 -2
  70. package/src/forge/_generated/importGuards.ts +35 -1
  71. package/src/forge/_generated/index.ts +1 -1
  72. package/src/forge/_generated/liveProductionManifest.json +1 -1
  73. package/src/forge/_generated/liveProductionManifest.ts +1 -1
  74. package/src/forge/_generated/liveProtocol.json +1 -1
  75. package/src/forge/_generated/liveProtocol.ts +1 -1
  76. package/src/forge/_generated/liveQueryRegistry.json +2 -2
  77. package/src/forge/_generated/liveQueryRegistry.ts +3 -3
  78. package/src/forge/_generated/liveTransportConfig.json +1 -1
  79. package/src/forge/_generated/liveTransportConfig.ts +1 -1
  80. package/src/forge/_generated/makeRegistry.json +2 -2
  81. package/src/forge/_generated/makeRegistry.ts +2 -2
  82. package/src/forge/_generated/makeTemplates.json +1 -1
  83. package/src/forge/_generated/makeTemplates.ts +1 -1
  84. package/src/forge/_generated/mockMap.json +1 -1
  85. package/src/forge/_generated/mockMap.ts +1 -1
  86. package/src/forge/_generated/operationPlaybooks.md +7 -5
  87. package/src/forge/_generated/packageGraph.json +2 -2
  88. package/src/forge/_generated/packageGraph.ts +90964 -14284
  89. package/src/forge/_generated/packageUpgradeRegistry.json +2 -2
  90. package/src/forge/_generated/packageUpgradeRegistry.ts +2 -2
  91. package/src/forge/_generated/permissionMatrix.json +2 -2
  92. package/src/forge/_generated/permissionMatrix.ts +3 -3
  93. package/src/forge/_generated/policyRegistry.json +2 -2
  94. package/src/forge/_generated/policyRegistry.ts +3 -3
  95. package/src/forge/_generated/queryRegistry.json +2 -2
  96. package/src/forge/_generated/queryRegistry.ts +3 -3
  97. package/src/forge/_generated/react.d.ts +1 -1
  98. package/src/forge/_generated/react.ts +1 -1
  99. package/src/forge/_generated/reactManifest.json +2 -2
  100. package/src/forge/_generated/reactManifest.ts +3 -3
  101. package/src/forge/_generated/releaseManifest.json +2 -2
  102. package/src/forge/_generated/releaseManifest.ts +3 -3
  103. package/src/forge/_generated/rlsPolicies.json +1 -1
  104. package/src/forge/_generated/rlsPolicies.sql +1 -1
  105. package/src/forge/_generated/rlsPolicies.ts +1 -1
  106. package/src/forge/_generated/runtimeGraph.json +2 -2
  107. package/src/forge/_generated/runtimeGraph.ts +3 -3
  108. package/src/forge/_generated/runtimeMatrix.json +2 -2
  109. package/src/forge/_generated/runtimeMatrix.ts +106177 -7917
  110. package/src/forge/_generated/runtimeRegistry.ts +1 -1
  111. package/src/forge/_generated/runtimeRules.md +1 -1
  112. package/src/forge/_generated/secretRegistry.json +1 -1
  113. package/src/forge/_generated/secretRegistry.ts +1 -1
  114. package/src/forge/_generated/secretsContext.ts +1 -1
  115. package/src/forge/_generated/serverApi.ts +1 -1
  116. package/src/forge/_generated/sourceMapManifest.json +2 -2
  117. package/src/forge/_generated/sourceMapManifest.ts +2 -2
  118. package/src/forge/_generated/sqlPlan.json +1 -1
  119. package/src/forge/_generated/sqlPlan.ts +1 -1
  120. package/src/forge/_generated/subscriptionManifest.json +2 -2
  121. package/src/forge/_generated/subscriptionManifest.ts +3 -3
  122. package/src/forge/_generated/symbolicationManifest.json +2 -2
  123. package/src/forge/_generated/symbolicationManifest.ts +2 -2
  124. package/src/forge/_generated/telemetryRegistry.json +2 -2
  125. package/src/forge/_generated/telemetryRegistry.ts +3 -3
  126. package/src/forge/_generated/telemetrySinks.json +2 -2
  127. package/src/forge/_generated/telemetrySinks.ts +2 -2
  128. package/src/forge/_generated/tenantScope.json +2 -2
  129. package/src/forge/_generated/tenantScope.ts +3 -3
  130. package/src/forge/_generated/testGraph.json +2 -2
  131. package/src/forge/_generated/testGraph.ts +129 -75
  132. package/src/forge/_generated/testPlanRegistry.json +2 -2
  133. package/src/forge/_generated/testPlanRegistry.ts +2 -2
  134. package/src/forge/_generated/uiRoutes.json +1 -1
  135. package/src/forge/_generated/uiRoutes.ts +1 -1
  136. package/src/forge/_generated/uiScenarios.json +1 -1
  137. package/src/forge/_generated/uiScenarios.ts +1 -1
  138. package/src/forge/_generated/uiTestManifest.json +2 -2
  139. package/src/forge/_generated/uiTestManifest.ts +2 -2
  140. package/src/forge/_generated/workflowRegistry.json +2 -2
  141. package/src/forge/_generated/workflowRegistry.ts +3 -3
  142. package/src/forge/_generated/workflowSubscriptions.json +2 -2
  143. package/src/forge/_generated/workflowSubscriptions.ts +3 -3
  144. package/src/forge/cli/commands.ts +861 -861
  145. package/src/forge/cli/deps.ts +178 -11
  146. package/src/forge/cli/dev.ts +32 -5
  147. package/src/forge/cli/index.ts +7 -7
  148. package/src/forge/cli/main.ts +54 -54
  149. package/src/forge/cli/new.ts +29 -1
  150. package/src/forge/cli/output.ts +97 -97
  151. package/src/forge/cli/parse.ts +679 -673
  152. package/src/forge/cli/version.ts +1 -1
  153. package/src/forge/compiler/agent-contract/build.ts +28 -0
  154. package/src/forge/compiler/agent-contract/types.ts +16 -0
  155. package/src/forge/compiler/app-graph/build.ts +112 -112
  156. package/src/forge/compiler/app-graph/classify.ts +10 -10
  157. package/src/forge/compiler/app-graph/dup-symbol.ts +29 -29
  158. package/src/forge/compiler/app-graph/extract.ts +123 -123
  159. package/src/forge/compiler/app-graph/forge-apis.ts +29 -29
  160. package/src/forge/compiler/app-graph/index.ts +11 -11
  161. package/src/forge/compiler/app-graph/module-graph.ts +316 -316
  162. package/src/forge/compiler/app-graph/parser.ts +119 -119
  163. package/src/forge/compiler/app-graph/symbols.ts +48 -48
  164. package/src/forge/compiler/app-graph/tsconfig-hash.ts +62 -62
  165. package/src/forge/compiler/app-graph/types.ts +43 -43
  166. package/src/forge/compiler/app-graph/versions.ts +14 -14
  167. package/src/forge/compiler/cache/index.ts +17 -17
  168. package/src/forge/compiler/cache/key.ts +46 -46
  169. package/src/forge/compiler/cache/scheduler.ts +72 -72
  170. package/src/forge/compiler/cache/store.ts +78 -78
  171. package/src/forge/compiler/classifier/capabilities.ts +78 -78
  172. package/src/forge/compiler/classifier/classify.ts +113 -113
  173. package/src/forge/compiler/classifier/contexts.ts +188 -188
  174. package/src/forge/compiler/classifier/index.ts +18 -18
  175. package/src/forge/compiler/classifier/runtime-matrix.ts +45 -45
  176. package/src/forge/compiler/classifier/secrets.ts +41 -41
  177. package/src/forge/compiler/classifier/signals.ts +129 -129
  178. package/src/forge/compiler/diagnostics/codes.ts +125 -120
  179. package/src/forge/compiler/diagnostics/create.ts +87 -87
  180. package/src/forge/compiler/diagnostics/index.ts +41 -41
  181. package/src/forge/compiler/emitter/artifact-kind.ts +14 -14
  182. package/src/forge/compiler/emitter/barrel.ts +38 -38
  183. package/src/forge/compiler/emitter/constants.ts +7 -7
  184. package/src/forge/compiler/emitter/emit.ts +234 -237
  185. package/src/forge/compiler/emitter/index.ts +24 -24
  186. package/src/forge/compiler/emitter/lock.ts +61 -61
  187. package/src/forge/compiler/emitter/render.ts +73 -73
  188. package/src/forge/compiler/guards/artifacts.ts +96 -96
  189. package/src/forge/compiler/guards/check-import-guards.ts +106 -106
  190. package/src/forge/compiler/guards/index.ts +11 -11
  191. package/src/forge/compiler/guards/propagate-contexts.ts +57 -57
  192. package/src/forge/compiler/index.ts +17 -17
  193. package/src/forge/compiler/integration/add.ts +493 -493
  194. package/src/forge/compiler/integration/index.ts +17 -17
  195. package/src/forge/compiler/integration/plan.ts +279 -279
  196. package/src/forge/compiler/integration/render.ts +189 -189
  197. package/src/forge/compiler/integration/snapshot.ts +52 -52
  198. package/src/forge/compiler/orchestrator/discover.ts +214 -214
  199. package/src/forge/compiler/orchestrator/guards.ts +5 -5
  200. package/src/forge/compiler/orchestrator/index.ts +27 -27
  201. package/src/forge/compiler/orchestrator/manifest.ts +69 -69
  202. package/src/forge/compiler/orchestrator/orphans.ts +51 -51
  203. package/src/forge/compiler/orchestrator/plan.ts +804 -804
  204. package/src/forge/compiler/orchestrator/run.ts +178 -178
  205. package/src/forge/compiler/orchestrator/serialize.ts +859 -859
  206. package/src/forge/compiler/orchestrator/types.ts +23 -23
  207. package/src/forge/compiler/orchestrator/verify.ts +35 -35
  208. package/src/forge/compiler/package-graph/capabilities-stub.ts +33 -33
  209. package/src/forge/compiler/package-graph/checksum.ts +107 -97
  210. package/src/forge/compiler/package-graph/compiler.ts +444 -363
  211. package/src/forge/compiler/package-graph/constants.ts +4 -4
  212. package/src/forge/compiler/package-graph/exports-discovery.ts +91 -84
  213. package/src/forge/compiler/package-graph/extract-dts.ts +32 -32
  214. package/src/forge/compiler/package-graph/index.ts +24 -24
  215. package/src/forge/compiler/package-graph/jsdoc.ts +50 -50
  216. package/src/forge/compiler/package-graph/oracle.ts +326 -0
  217. package/src/forge/compiler/package-graph/read-file.ts +21 -21
  218. package/src/forge/compiler/package-graph/resolve.ts +131 -127
  219. package/src/forge/compiler/package-manager/adapter.ts +232 -232
  220. package/src/forge/compiler/package-manager/commands.ts +47 -47
  221. package/src/forge/compiler/package-manager/detect.ts +65 -65
  222. package/src/forge/compiler/package-manager/executor.ts +29 -29
  223. package/src/forge/compiler/package-manager/index.ts +22 -22
  224. package/src/forge/compiler/package-manager/parse-spec.ts +16 -16
  225. package/src/forge/compiler/package-manager/version.ts +20 -20
  226. package/src/forge/compiler/primitives/compare.ts +26 -26
  227. package/src/forge/compiler/primitives/hash.ts +42 -33
  228. package/src/forge/compiler/primitives/header.ts +43 -43
  229. package/src/forge/compiler/primitives/index.ts +45 -45
  230. package/src/forge/compiler/primitives/paths.ts +24 -24
  231. package/src/forge/compiler/primitives/serialize.ts +66 -66
  232. package/src/forge/compiler/primitives/sort.ts +87 -87
  233. package/src/forge/compiler/recipes/definitions.ts +269 -269
  234. package/src/forge/compiler/recipes/helpers.ts +37 -37
  235. package/src/forge/compiler/recipes/index.ts +21 -21
  236. package/src/forge/compiler/recipes/registry.ts +87 -87
  237. package/src/forge/compiler/sandbox/artifact-sanitize.ts +26 -26
  238. package/src/forge/compiler/sandbox/backends/child.ts +123 -123
  239. package/src/forge/compiler/sandbox/backends/docker.ts +173 -173
  240. package/src/forge/compiler/sandbox/index.ts +51 -51
  241. package/src/forge/compiler/sandbox/inspect.ts +143 -143
  242. package/src/forge/compiler/sandbox/inspector-entry.ts +115 -115
  243. package/src/forge/compiler/sandbox/limits.ts +31 -31
  244. package/src/forge/compiler/sandbox/scrub-env.ts +60 -60
  245. package/src/forge/compiler/sandbox/secret-scan.ts +54 -54
  246. package/src/forge/compiler/sandbox/serialize.ts +106 -106
  247. package/src/forge/compiler/sandbox/types.ts +7 -7
  248. package/src/forge/compiler/types/app-graph.ts +71 -71
  249. package/src/forge/compiler/types/capability.ts +29 -29
  250. package/src/forge/compiler/types/classification.ts +9 -9
  251. package/src/forge/compiler/types/cli.ts +85 -85
  252. package/src/forge/compiler/types/diagnostic.ts +2 -2
  253. package/src/forge/compiler/types/emit.ts +25 -25
  254. package/src/forge/compiler/types/import-guards.ts +19 -19
  255. package/src/forge/compiler/types/index.ts +98 -98
  256. package/src/forge/compiler/types/integration.ts +25 -25
  257. package/src/forge/compiler/types/json.ts +3 -3
  258. package/src/forge/compiler/types/lock.ts +37 -37
  259. package/src/forge/compiler/types/package-graph.ts +122 -77
  260. package/src/forge/compiler/types/runtime-matrix.ts +16 -16
  261. package/src/forge/compiler/types/runtime.ts +30 -30
  262. package/src/forge/compiler/types/sandbox.ts +24 -24
  263. package/src/forge/dev/server.ts +16 -2
  264. package/src/forge/refactor/index.ts +10 -2
  265. package/src/forge/refactor/runtime-rename.ts +598 -0
  266. package/src/forge/runtime/executor.ts +3 -2
  267. package/src/forge/runtime/live/live-query-runner.ts +2 -1
  268. package/src/forge/runtime/outbox/process.ts +2 -1
  269. package/src/forge/runtime/query/run-query.ts +2 -1
  270. package/src/forge/runtime/runner/run-entry.ts +2 -1
  271. package/src/forge/runtime/telemetry/sinks/posthog.ts +4 -5
  272. package/src/forge/runtime/telemetry/sinks/sentry.ts +4 -5
  273. package/src/forge/runtime/workflows/resolve-step.ts +2 -1
  274. package/src/forge/version.ts +3 -0
  275. package/templates/b2b-support-web/src/actions/captureTicketCreated.ts +7 -2
  276. package/templates/b2b-support-web/src/commands/closeTicket.ts +6 -1
  277. package/templates/b2b-support-web/src/commands/createTicket.ts +8 -2
  278. package/templates/b2b-support-web/src/queries/getTicket.ts +8 -1
  279. package/templates/b2b-support-web/web/components/CreateTicketForm.tsx +1 -2
  280. package/templates/b2b-support-web/web/components/PolicyDeniedDemo.tsx +1 -2
  281. package/templates/b2b-support-web/web/components/TicketList.tsx +1 -2
  282. package/templates/b2b-support-web/web/components/TraceDetails.tsx +1 -1
  283. package/templates/b2b-support-web/web/lib/forge.ts +1 -0
@@ -1,173 +1,173 @@
1
- import { spawn } from "node:child_process";
2
- import { fileURLToPath } from "node:url";
3
- import type { SandboxLimits } from "../../types/cli.ts";
4
- import type { Dependency } from "../../types/package-graph.ts";
5
- import { DEFAULT_SANDBOX_PIDS_LIMIT, SANDBOX_KILL_GRACE_MS } from "../limits.ts";
6
-
7
- export interface DockerRunResult {
8
- stdout: string;
9
- stderr: string;
10
- exitCode: number | null;
11
- timedOut: boolean;
12
- oomKilled: boolean;
13
- startFailed: boolean;
14
- dockerUnavailable: boolean;
15
- }
16
-
17
- export interface DockerRunner {
18
- run(
19
- dep: Dependency,
20
- limits: SandboxLimits,
21
- env: Record<string, string>,
22
- ): Promise<DockerRunResult>;
23
- }
24
-
25
- const INSPECTOR_ENTRY = fileURLToPath(
26
- new URL("../inspector-entry.ts", import.meta.url),
27
- );
28
-
29
- const DEFAULT_DOCKER_IMAGE = "oven/bun:1";
30
-
31
- function buildDockerArgs(
32
- dep: Dependency,
33
- limits: SandboxLimits,
34
- env: Record<string, string>,
35
- ): string[] {
36
- const args = [
37
- "run",
38
- "--rm",
39
- "--network",
40
- "none",
41
- "--read-only",
42
- "--memory",
43
- `${limits.memoryMb}m`,
44
- "--pids-limit",
45
- String(DEFAULT_SANDBOX_PIDS_LIMIT),
46
- "--cap-drop",
47
- "ALL",
48
- "-v",
49
- `${dep.installPath}:/pkg:ro`,
50
- "-v",
51
- `${INSPECTOR_ENTRY}:/inspector-entry.ts:ro`,
52
- ];
53
-
54
- for (const [key, value] of Object.entries(env)) {
55
- args.push("-e", `${key}=${value}`);
56
- }
57
-
58
- args.push(
59
- process.env.FORGE_SANDBOX_DOCKER_IMAGE ?? DEFAULT_DOCKER_IMAGE,
60
- "bun",
61
- "run",
62
- "/inspector-entry.ts",
63
- "/pkg",
64
- );
65
-
66
- return args;
67
- }
68
-
69
- export const defaultDockerRunner: DockerRunner = {
70
- async run(dep, limits, env) {
71
- const args = buildDockerArgs(dep, limits, env);
72
-
73
- return new Promise<DockerRunResult>((resolve) => {
74
- let stdout = "";
75
- let stderr = "";
76
- let timedOut = false;
77
- let oomKilled = false;
78
- let startFailed = false;
79
- let dockerUnavailable = false;
80
- let settled = false;
81
-
82
- const child = spawn("docker", args, {
83
- stdio: ["ignore", "pipe", "pipe"],
84
- windowsHide: true,
85
- });
86
-
87
- const killTimer = setTimeout(() => {
88
- timedOut = true;
89
- child.kill("SIGTERM");
90
- setTimeout(() => {
91
- if (!child.killed) {
92
- child.kill("SIGKILL");
93
- }
94
- }, SANDBOX_KILL_GRACE_MS);
95
- }, limits.timeoutMs);
96
-
97
- child.stdout.on("data", (chunk: Buffer | string) => {
98
- stdout += String(chunk);
99
- });
100
-
101
- child.stderr.on("data", (chunk: Buffer | string) => {
102
- stderr += String(chunk);
103
- });
104
-
105
- child.on("error", (error: NodeJS.ErrnoException) => {
106
- if (settled) {
107
- return;
108
- }
109
- settled = true;
110
- clearTimeout(killTimer);
111
- startFailed = true;
112
- dockerUnavailable = error.code === "ENOENT";
113
- resolve({
114
- stdout,
115
- stderr,
116
- exitCode: null,
117
- timedOut,
118
- oomKilled,
119
- startFailed,
120
- dockerUnavailable,
121
- });
122
- });
123
-
124
- child.on("close", (code) => {
125
- if (settled) {
126
- return;
127
- }
128
- settled = true;
129
- clearTimeout(killTimer);
130
- if (
131
- stderr.includes("OOM") ||
132
- stderr.includes("out of memory") ||
133
- stderr.includes("Cannot allocate memory")
134
- ) {
135
- oomKilled = true;
136
- }
137
- resolve({
138
- stdout,
139
- stderr,
140
- exitCode: code,
141
- timedOut,
142
- oomKilled,
143
- startFailed,
144
- dockerUnavailable: false,
145
- });
146
- });
147
- });
148
- },
149
- };
150
-
151
- let dockerRunner: DockerRunner = defaultDockerRunner;
152
-
153
- export function setDockerRunner(runner: DockerRunner | undefined): void {
154
- dockerRunner = runner ?? defaultDockerRunner;
155
- }
156
-
157
- export function getDockerRunner(): DockerRunner {
158
- return dockerRunner;
159
- }
160
-
161
- export function dockerRunFlags(limits: SandboxLimits): string[] {
162
- return [
163
- "--network",
164
- "none",
165
- "--read-only",
166
- "--memory",
167
- `${limits.memoryMb}m`,
168
- "--pids-limit",
169
- String(DEFAULT_SANDBOX_PIDS_LIMIT),
170
- "--cap-drop",
171
- "ALL",
172
- ];
173
- }
1
+ import { spawn } from "node:child_process";
2
+ import { fileURLToPath } from "node:url";
3
+ import type { SandboxLimits } from "../../types/cli.ts";
4
+ import type { Dependency } from "../../types/package-graph.ts";
5
+ import { DEFAULT_SANDBOX_PIDS_LIMIT, SANDBOX_KILL_GRACE_MS } from "../limits.ts";
6
+
7
+ export interface DockerRunResult {
8
+ stdout: string;
9
+ stderr: string;
10
+ exitCode: number | null;
11
+ timedOut: boolean;
12
+ oomKilled: boolean;
13
+ startFailed: boolean;
14
+ dockerUnavailable: boolean;
15
+ }
16
+
17
+ export interface DockerRunner {
18
+ run(
19
+ dep: Dependency,
20
+ limits: SandboxLimits,
21
+ env: Record<string, string>,
22
+ ): Promise<DockerRunResult>;
23
+ }
24
+
25
+ const INSPECTOR_ENTRY = fileURLToPath(
26
+ new URL("../inspector-entry.ts", import.meta.url),
27
+ );
28
+
29
+ const DEFAULT_DOCKER_IMAGE = "oven/bun:1";
30
+
31
+ function buildDockerArgs(
32
+ dep: Dependency,
33
+ limits: SandboxLimits,
34
+ env: Record<string, string>,
35
+ ): string[] {
36
+ const args = [
37
+ "run",
38
+ "--rm",
39
+ "--network",
40
+ "none",
41
+ "--read-only",
42
+ "--memory",
43
+ `${limits.memoryMb}m`,
44
+ "--pids-limit",
45
+ String(DEFAULT_SANDBOX_PIDS_LIMIT),
46
+ "--cap-drop",
47
+ "ALL",
48
+ "-v",
49
+ `${dep.installPath}:/pkg:ro`,
50
+ "-v",
51
+ `${INSPECTOR_ENTRY}:/inspector-entry.ts:ro`,
52
+ ];
53
+
54
+ for (const [key, value] of Object.entries(env)) {
55
+ args.push("-e", `${key}=${value}`);
56
+ }
57
+
58
+ args.push(
59
+ process.env.FORGE_SANDBOX_DOCKER_IMAGE ?? DEFAULT_DOCKER_IMAGE,
60
+ "bun",
61
+ "run",
62
+ "/inspector-entry.ts",
63
+ "/pkg",
64
+ );
65
+
66
+ return args;
67
+ }
68
+
69
+ export const defaultDockerRunner: DockerRunner = {
70
+ async run(dep, limits, env) {
71
+ const args = buildDockerArgs(dep, limits, env);
72
+
73
+ return new Promise<DockerRunResult>((resolve) => {
74
+ let stdout = "";
75
+ let stderr = "";
76
+ let timedOut = false;
77
+ let oomKilled = false;
78
+ let startFailed = false;
79
+ let dockerUnavailable = false;
80
+ let settled = false;
81
+
82
+ const child = spawn("docker", args, {
83
+ stdio: ["ignore", "pipe", "pipe"],
84
+ windowsHide: true,
85
+ });
86
+
87
+ const killTimer = setTimeout(() => {
88
+ timedOut = true;
89
+ child.kill("SIGTERM");
90
+ setTimeout(() => {
91
+ if (!child.killed) {
92
+ child.kill("SIGKILL");
93
+ }
94
+ }, SANDBOX_KILL_GRACE_MS);
95
+ }, limits.timeoutMs);
96
+
97
+ child.stdout.on("data", (chunk: Buffer | string) => {
98
+ stdout += String(chunk);
99
+ });
100
+
101
+ child.stderr.on("data", (chunk: Buffer | string) => {
102
+ stderr += String(chunk);
103
+ });
104
+
105
+ child.on("error", (error: NodeJS.ErrnoException) => {
106
+ if (settled) {
107
+ return;
108
+ }
109
+ settled = true;
110
+ clearTimeout(killTimer);
111
+ startFailed = true;
112
+ dockerUnavailable = error.code === "ENOENT";
113
+ resolve({
114
+ stdout,
115
+ stderr,
116
+ exitCode: null,
117
+ timedOut,
118
+ oomKilled,
119
+ startFailed,
120
+ dockerUnavailable,
121
+ });
122
+ });
123
+
124
+ child.on("close", (code) => {
125
+ if (settled) {
126
+ return;
127
+ }
128
+ settled = true;
129
+ clearTimeout(killTimer);
130
+ if (
131
+ stderr.includes("OOM") ||
132
+ stderr.includes("out of memory") ||
133
+ stderr.includes("Cannot allocate memory")
134
+ ) {
135
+ oomKilled = true;
136
+ }
137
+ resolve({
138
+ stdout,
139
+ stderr,
140
+ exitCode: code,
141
+ timedOut,
142
+ oomKilled,
143
+ startFailed,
144
+ dockerUnavailable: false,
145
+ });
146
+ });
147
+ });
148
+ },
149
+ };
150
+
151
+ let dockerRunner: DockerRunner = defaultDockerRunner;
152
+
153
+ export function setDockerRunner(runner: DockerRunner | undefined): void {
154
+ dockerRunner = runner ?? defaultDockerRunner;
155
+ }
156
+
157
+ export function getDockerRunner(): DockerRunner {
158
+ return dockerRunner;
159
+ }
160
+
161
+ export function dockerRunFlags(limits: SandboxLimits): string[] {
162
+ return [
163
+ "--network",
164
+ "none",
165
+ "--read-only",
166
+ "--memory",
167
+ `${limits.memoryMb}m`,
168
+ "--pids-limit",
169
+ String(DEFAULT_SANDBOX_PIDS_LIMIT),
170
+ "--cap-drop",
171
+ "ALL",
172
+ ];
173
+ }
@@ -1,51 +1,51 @@
1
- export {
2
- inspectExports,
3
- type SandboxInspectOptions,
4
- type SandboxInspectResult,
5
- } from "./inspect.ts";
6
- export {
7
- DEFAULT_SANDBOX_MEMORY_MB,
8
- DEFAULT_SANDBOX_PIDS_LIMIT,
9
- DEFAULT_SANDBOX_TIMEOUT_MS,
10
- SANDBOX_KILL_GRACE_MS,
11
- clampSandboxLimits,
12
- defaultSandboxLimits,
13
- } from "./limits.ts";
14
- export { scrubEnv, isSecretEnvKey, type ScrubEnvOptions } from "./scrub-env.ts";
15
- export {
16
- secretLeakScan,
17
- type SecretScanOptions,
18
- type SecretScanResult,
19
- } from "./secret-scan.ts";
20
- export {
21
- assertJsonSerializable,
22
- parseRuntimeExportShape,
23
- sanitizeRuntimeExportShape,
24
- serializeRuntimeExportShape,
25
- } from "./serialize.ts";
26
- export {
27
- assertPackageApiSecretSafe,
28
- packageApiContainsSecretValues,
29
- } from "./artifact-sanitize.ts";
30
- export {
31
- emptyRuntimeExportShape,
32
- type RuntimeEntrypointShape,
33
- type RuntimeExportEntry,
34
- type RuntimeExportKind,
35
- type RuntimeExportShape,
36
- } from "./types.ts";
37
- export {
38
- defaultChildRunner,
39
- getChildRunner,
40
- setChildRunner,
41
- type ChildRunner,
42
- type ChildRunResult,
43
- } from "./backends/child.ts";
44
- export {
45
- defaultDockerRunner,
46
- dockerRunFlags,
47
- getDockerRunner,
48
- setDockerRunner,
49
- type DockerRunner,
50
- type DockerRunResult,
51
- } from "./backends/docker.ts";
1
+ export {
2
+ inspectExports,
3
+ type SandboxInspectOptions,
4
+ type SandboxInspectResult,
5
+ } from "./inspect.ts";
6
+ export {
7
+ DEFAULT_SANDBOX_MEMORY_MB,
8
+ DEFAULT_SANDBOX_PIDS_LIMIT,
9
+ DEFAULT_SANDBOX_TIMEOUT_MS,
10
+ SANDBOX_KILL_GRACE_MS,
11
+ clampSandboxLimits,
12
+ defaultSandboxLimits,
13
+ } from "./limits.ts";
14
+ export { scrubEnv, isSecretEnvKey, type ScrubEnvOptions } from "./scrub-env.ts";
15
+ export {
16
+ secretLeakScan,
17
+ type SecretScanOptions,
18
+ type SecretScanResult,
19
+ } from "./secret-scan.ts";
20
+ export {
21
+ assertJsonSerializable,
22
+ parseRuntimeExportShape,
23
+ sanitizeRuntimeExportShape,
24
+ serializeRuntimeExportShape,
25
+ } from "./serialize.ts";
26
+ export {
27
+ assertPackageApiSecretSafe,
28
+ packageApiContainsSecretValues,
29
+ } from "./artifact-sanitize.ts";
30
+ export {
31
+ emptyRuntimeExportShape,
32
+ type RuntimeEntrypointShape,
33
+ type RuntimeExportEntry,
34
+ type RuntimeExportKind,
35
+ type RuntimeExportShape,
36
+ } from "./types.ts";
37
+ export {
38
+ defaultChildRunner,
39
+ getChildRunner,
40
+ setChildRunner,
41
+ type ChildRunner,
42
+ type ChildRunResult,
43
+ } from "./backends/child.ts";
44
+ export {
45
+ defaultDockerRunner,
46
+ dockerRunFlags,
47
+ getDockerRunner,
48
+ setDockerRunner,
49
+ type DockerRunner,
50
+ type DockerRunResult,
51
+ } from "./backends/docker.ts";