@nimbus-sh/worker 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (408) hide show
  1. package/README.md +219 -0
  2. package/dist/_shared/bytes.d.ts +18 -0
  3. package/dist/_shared/bytes.d.ts.map +1 -0
  4. package/dist/_shared/bytes.js +17 -0
  5. package/dist/_shared/cache-stats.d.ts +146 -0
  6. package/dist/_shared/cache-stats.d.ts.map +1 -0
  7. package/dist/_shared/cache-stats.js +162 -0
  8. package/dist/_shared/exports-resolver.d.ts +76 -0
  9. package/dist/_shared/exports-resolver.d.ts.map +1 -0
  10. package/dist/_shared/exports-resolver.js +284 -0
  11. package/dist/_shared/install-phase.d.ts +47 -0
  12. package/dist/_shared/install-phase.d.ts.map +1 -0
  13. package/dist/_shared/install-phase.js +1 -0
  14. package/dist/_shared/real-node-imports.d.ts +38 -0
  15. package/dist/_shared/real-node-imports.d.ts.map +1 -0
  16. package/dist/_shared/real-node-imports.js +46 -0
  17. package/dist/_shared/retry.d.ts +93 -0
  18. package/dist/_shared/retry.d.ts.map +1 -0
  19. package/dist/_shared/retry.js +161 -0
  20. package/dist/_shared/session-id.d.ts +39 -0
  21. package/dist/_shared/session-id.d.ts.map +1 -0
  22. package/dist/_shared/session-id.js +127 -0
  23. package/dist/_shared/session-router.d.ts +104 -0
  24. package/dist/_shared/session-router.d.ts.map +1 -0
  25. package/dist/_shared/session-router.js +165 -0
  26. package/dist/_shared/w7-frame.d.ts +93 -0
  27. package/dist/_shared/w7-frame.d.ts.map +1 -0
  28. package/dist/_shared/w7-frame.js +402 -0
  29. package/dist/auth/index.d.ts +16 -0
  30. package/dist/auth/index.d.ts.map +1 -0
  31. package/dist/auth/index.js +15 -0
  32. package/dist/auth/middleware.d.ts +85 -0
  33. package/dist/auth/middleware.d.ts.map +1 -0
  34. package/dist/auth/middleware.js +150 -0
  35. package/dist/auth/token.d.ts +96 -0
  36. package/dist/auth/token.d.ts.map +1 -0
  37. package/dist/auth/token.js +226 -0
  38. package/dist/auth/types.d.ts +141 -0
  39. package/dist/auth/types.d.ts.map +1 -0
  40. package/dist/auth/types.js +114 -0
  41. package/dist/bindings/d1.d.ts +102 -0
  42. package/dist/bindings/d1.d.ts.map +1 -0
  43. package/dist/bindings/d1.js +549 -0
  44. package/dist/bindings/kv.d.ts +82 -0
  45. package/dist/bindings/kv.d.ts.map +1 -0
  46. package/dist/bindings/kv.js +290 -0
  47. package/dist/bindings/r2.d.ts +137 -0
  48. package/dist/bindings/r2.d.ts.map +1 -0
  49. package/dist/bindings/r2.js +379 -0
  50. package/dist/cirrus-npm-cjs.generated.d.ts +17 -0
  51. package/dist/cirrus-npm-cjs.generated.d.ts.map +1 -0
  52. package/dist/cirrus-npm-cjs.generated.js +41 -0
  53. package/dist/cirrus-plugin-react.generated.d.ts +34 -0
  54. package/dist/cirrus-plugin-react.generated.d.ts.map +1 -0
  55. package/dist/cirrus-plugin-react.generated.js +33 -0
  56. package/dist/constants.d.ts +34 -0
  57. package/dist/constants.d.ts.map +1 -0
  58. package/dist/constants.js +116 -0
  59. package/dist/esbuild-wasm-bundle.generated.d.ts +41 -0
  60. package/dist/esbuild-wasm-bundle.generated.d.ts.map +1 -0
  61. package/dist/esbuild-wasm-bundle.generated.js +40 -0
  62. package/dist/facets/cirrus-real.d.ts +147 -0
  63. package/dist/facets/cirrus-real.d.ts.map +1 -0
  64. package/dist/facets/cirrus-real.js +981 -0
  65. package/dist/facets/inner-do-registry.d.ts +41 -0
  66. package/dist/facets/inner-do-registry.d.ts.map +1 -0
  67. package/dist/facets/inner-do-registry.js +51 -0
  68. package/dist/facets/manager.d.ts +314 -0
  69. package/dist/facets/manager.d.ts.map +1 -0
  70. package/dist/facets/manager.js +2681 -0
  71. package/dist/facets/process.d.ts +318 -0
  72. package/dist/facets/process.d.ts.map +1 -0
  73. package/dist/facets/process.js +567 -0
  74. package/dist/facets/real-vite-fs-shim.d.ts +151 -0
  75. package/dist/facets/real-vite-fs-shim.d.ts.map +1 -0
  76. package/dist/facets/real-vite-fs-shim.js +1279 -0
  77. package/dist/facets/real-vite-hmr.d.ts +142 -0
  78. package/dist/facets/real-vite-hmr.d.ts.map +1 -0
  79. package/dist/facets/real-vite-hmr.js +476 -0
  80. package/dist/facets/vite-dev-server.d.ts +293 -0
  81. package/dist/facets/vite-dev-server.d.ts.map +1 -0
  82. package/dist/facets/vite-dev-server.js +2580 -0
  83. package/dist/facets/wasm-swap-registry.d.ts +261 -0
  84. package/dist/facets/wasm-swap-registry.d.ts.map +1 -0
  85. package/dist/facets/wasm-swap-registry.js +551 -0
  86. package/dist/facets/ws-terminal.d.ts +107 -0
  87. package/dist/facets/ws-terminal.d.ts.map +1 -0
  88. package/dist/facets/ws-terminal.js +207 -0
  89. package/dist/git/commands.d.ts +13 -0
  90. package/dist/git/commands.d.ts.map +1 -0
  91. package/dist/git/commands.js +633 -0
  92. package/dist/git/network-facet.d.ts +61 -0
  93. package/dist/git/network-facet.d.ts.map +1 -0
  94. package/dist/git/network-facet.js +700 -0
  95. package/dist/git-bundle.generated.d.ts +16 -0
  96. package/dist/git-bundle.generated.d.ts.map +1 -0
  97. package/dist/git-bundle.generated.js +15 -0
  98. package/dist/index.d.ts +41 -0
  99. package/dist/index.d.ts.map +1 -0
  100. package/dist/index.js +73 -0
  101. package/dist/loaders/child-process/spawn-facet.d.ts +90 -0
  102. package/dist/loaders/child-process/spawn-facet.d.ts.map +1 -0
  103. package/dist/loaders/child-process/spawn-facet.js +103 -0
  104. package/dist/loaders/child-process/spawn-pool.d.ts +110 -0
  105. package/dist/loaders/child-process/spawn-pool.d.ts.map +1 -0
  106. package/dist/loaders/child-process/spawn-pool.js +161 -0
  107. package/dist/loaders/fanout-pool.d.ts +195 -0
  108. package/dist/loaders/fanout-pool.d.ts.map +1 -0
  109. package/dist/loaders/fanout-pool.js +326 -0
  110. package/dist/loaders/generated-workers.d.ts +26 -0
  111. package/dist/loaders/generated-workers.d.ts.map +1 -0
  112. package/dist/loaders/generated-workers.js +25 -0
  113. package/dist/loaders/index.d.ts +15 -0
  114. package/dist/loaders/index.d.ts.map +1 -0
  115. package/dist/loaders/index.js +13 -0
  116. package/dist/loaders/loader-pool.d.ts +273 -0
  117. package/dist/loaders/loader-pool.d.ts.map +1 -0
  118. package/dist/loaders/loader-pool.js +624 -0
  119. package/dist/loaders/npm-resolve-preamble.d.ts +34 -0
  120. package/dist/loaders/npm-resolve-preamble.d.ts.map +1 -0
  121. package/dist/loaders/npm-resolve-preamble.js +237 -0
  122. package/dist/loaders/pre-bundle-preamble.d.ts +41 -0
  123. package/dist/loaders/pre-bundle-preamble.d.ts.map +1 -0
  124. package/dist/loaders/pre-bundle-preamble.js +114 -0
  125. package/dist/loaders/vendor/codegen.d.ts +24 -0
  126. package/dist/loaders/vendor/codegen.d.ts.map +1 -0
  127. package/dist/loaders/vendor/codegen.js +44 -0
  128. package/dist/loaders/vendor/errors.d.ts +24 -0
  129. package/dist/loaders/vendor/errors.d.ts.map +1 -0
  130. package/dist/loaders/vendor/errors.js +46 -0
  131. package/dist/loaders/vendor/index.d.ts +16 -0
  132. package/dist/loaders/vendor/index.d.ts.map +1 -0
  133. package/dist/loaders/vendor/index.js +11 -0
  134. package/dist/loaders/vendor/pool.d.ts +88 -0
  135. package/dist/loaders/vendor/pool.d.ts.map +1 -0
  136. package/dist/loaders/vendor/pool.js +353 -0
  137. package/dist/loaders/vendor/primitives.d.ts +11 -0
  138. package/dist/loaders/vendor/primitives.d.ts.map +1 -0
  139. package/dist/loaders/vendor/primitives.js +33 -0
  140. package/dist/loaders/vendor/serialize.d.ts +3 -0
  141. package/dist/loaders/vendor/serialize.d.ts.map +1 -0
  142. package/dist/loaders/vendor/serialize.js +25 -0
  143. package/dist/loaders/vendor/types.d.ts +60 -0
  144. package/dist/loaders/vendor/types.d.ts.map +1 -0
  145. package/dist/loaders/vendor/types.js +4 -0
  146. package/dist/npm/cache.d.ts +136 -0
  147. package/dist/npm/cache.d.ts.map +1 -0
  148. package/dist/npm/cache.js +429 -0
  149. package/dist/npm/install-batch-facet.d.ts +129 -0
  150. package/dist/npm/install-batch-facet.d.ts.map +1 -0
  151. package/dist/npm/install-batch-facet.js +598 -0
  152. package/dist/npm/install-facet.d.ts +29 -0
  153. package/dist/npm/install-facet.d.ts.map +1 -0
  154. package/dist/npm/install-facet.js +9 -0
  155. package/dist/npm/installer.d.ts +239 -0
  156. package/dist/npm/installer.d.ts.map +1 -0
  157. package/dist/npm/installer.js +2022 -0
  158. package/dist/npm/npx-install.d.ts +74 -0
  159. package/dist/npm/npx-install.d.ts.map +1 -0
  160. package/dist/npm/npx-install.js +302 -0
  161. package/dist/npm/pre-bundle-facet.d.ts +168 -0
  162. package/dist/npm/pre-bundle-facet.d.ts.map +1 -0
  163. package/dist/npm/pre-bundle-facet.js +653 -0
  164. package/dist/npm/r2-cache.d.ts +286 -0
  165. package/dist/npm/r2-cache.d.ts.map +1 -0
  166. package/dist/npm/r2-cache.js +506 -0
  167. package/dist/npm/resolve-facet.d.ts +202 -0
  168. package/dist/npm/resolve-facet.d.ts.map +1 -0
  169. package/dist/npm/resolve-facet.js +833 -0
  170. package/dist/npm/resolve-one-facet.d.ts +204 -0
  171. package/dist/npm/resolve-one-facet.d.ts.map +1 -0
  172. package/dist/npm/resolve-one-facet.js +437 -0
  173. package/dist/npm/resolver.d.ts +109 -0
  174. package/dist/npm/resolver.d.ts.map +1 -0
  175. package/dist/npm/resolver.js +899 -0
  176. package/dist/npm/tarball-stream.d.ts +85 -0
  177. package/dist/npm/tarball-stream.d.ts.map +1 -0
  178. package/dist/npm/tarball-stream.js +205 -0
  179. package/dist/npm/tarball.d.ts +51 -0
  180. package/dist/npm/tarball.d.ts.map +1 -0
  181. package/dist/npm/tarball.js +185 -0
  182. package/dist/observability/diag-counters.d.ts +292 -0
  183. package/dist/observability/diag-counters.d.ts.map +1 -0
  184. package/dist/observability/diag-counters.js +302 -0
  185. package/dist/observability/heap-estimate.d.ts +166 -0
  186. package/dist/observability/heap-estimate.d.ts.map +1 -0
  187. package/dist/observability/heap-estimate.js +192 -0
  188. package/dist/observability/heavy-alloc-coord.d.ts +95 -0
  189. package/dist/observability/heavy-alloc-coord.d.ts.map +1 -0
  190. package/dist/observability/heavy-alloc-coord.js +149 -0
  191. package/dist/observability/oom-classify.d.ts +56 -0
  192. package/dist/observability/oom-classify.d.ts.map +1 -0
  193. package/dist/observability/oom-classify.js +118 -0
  194. package/dist/observability/oom-discriminator.d.ts +192 -0
  195. package/dist/observability/oom-discriminator.d.ts.map +1 -0
  196. package/dist/observability/oom-discriminator.js +233 -0
  197. package/dist/real-vite-bundle.generated.d.ts +46 -0
  198. package/dist/real-vite-bundle.generated.d.ts.map +1 -0
  199. package/dist/real-vite-bundle.generated.js +53 -0
  200. package/dist/replica/routing.d.ts +171 -0
  201. package/dist/replica/routing.d.ts.map +1 -0
  202. package/dist/replica/routing.js +288 -0
  203. package/dist/replica/suspension.d.ts +36 -0
  204. package/dist/replica/suspension.d.ts.map +1 -0
  205. package/dist/replica/suspension.js +49 -0
  206. package/dist/router/index.d.ts +156 -0
  207. package/dist/router/index.d.ts.map +1 -0
  208. package/dist/router/index.js +220 -0
  209. package/dist/runtime/assets-loader.d.ts +71 -0
  210. package/dist/runtime/assets-loader.d.ts.map +1 -0
  211. package/dist/runtime/assets-loader.js +128 -0
  212. package/dist/runtime/barrel-detect.d.ts +46 -0
  213. package/dist/runtime/barrel-detect.d.ts.map +1 -0
  214. package/dist/runtime/barrel-detect.js +73 -0
  215. package/dist/runtime/barrel-synthesizer.d.ts +181 -0
  216. package/dist/runtime/barrel-synthesizer.d.ts.map +1 -0
  217. package/dist/runtime/barrel-synthesizer.js +541 -0
  218. package/dist/runtime/bun-repl.d.ts +46 -0
  219. package/dist/runtime/bun-repl.d.ts.map +1 -0
  220. package/dist/runtime/bun-repl.js +326 -0
  221. package/dist/runtime/bun-runner.d.ts +66 -0
  222. package/dist/runtime/bun-runner.d.ts.map +1 -0
  223. package/dist/runtime/bun-runner.js +219 -0
  224. package/dist/runtime/clang-runner.d.ts +38 -0
  225. package/dist/runtime/clang-runner.d.ts.map +1 -0
  226. package/dist/runtime/clang-runner.js +1033 -0
  227. package/dist/runtime/comment-strip.d.ts +37 -0
  228. package/dist/runtime/comment-strip.d.ts.map +1 -0
  229. package/dist/runtime/comment-strip.js +74 -0
  230. package/dist/runtime/esbuild-service.d.ts +201 -0
  231. package/dist/runtime/esbuild-service.d.ts.map +1 -0
  232. package/dist/runtime/esbuild-service.js +1444 -0
  233. package/dist/runtime/esbuild-wasm-bytes.d.ts +87 -0
  234. package/dist/runtime/esbuild-wasm-bytes.d.ts.map +1 -0
  235. package/dist/runtime/esbuild-wasm-bytes.js +131 -0
  236. package/dist/runtime/framework-detect.d.ts +71 -0
  237. package/dist/runtime/framework-detect.d.ts.map +1 -0
  238. package/dist/runtime/framework-detect.js +178 -0
  239. package/dist/runtime/long-running-handle.d.ts +133 -0
  240. package/dist/runtime/long-running-handle.d.ts.map +1 -0
  241. package/dist/runtime/long-running-handle.js +192 -0
  242. package/dist/runtime/node-repl.d.ts +36 -0
  243. package/dist/runtime/node-repl.d.ts.map +1 -0
  244. package/dist/runtime/node-repl.js +293 -0
  245. package/dist/runtime/node-runner.d.ts +111 -0
  246. package/dist/runtime/node-runner.d.ts.map +1 -0
  247. package/dist/runtime/node-runner.js +194 -0
  248. package/dist/runtime/node-shims.d.ts +24 -0
  249. package/dist/runtime/node-shims.d.ts.map +1 -0
  250. package/dist/runtime/node-shims.js +3019 -0
  251. package/dist/runtime/package-manager.d.ts +118 -0
  252. package/dist/runtime/package-manager.d.ts.map +1 -0
  253. package/dist/runtime/package-manager.js +420 -0
  254. package/dist/runtime/port-registry.d.ts +80 -0
  255. package/dist/runtime/port-registry.d.ts.map +1 -0
  256. package/dist/runtime/port-registry.js +166 -0
  257. package/dist/runtime/process-logs-api.d.ts +102 -0
  258. package/dist/runtime/process-logs-api.d.ts.map +1 -0
  259. package/dist/runtime/process-logs-api.js +253 -0
  260. package/dist/runtime/process-logs.d.ts +311 -0
  261. package/dist/runtime/process-logs.d.ts.map +1 -0
  262. package/dist/runtime/process-logs.js +656 -0
  263. package/dist/runtime/process-table.d.ts +65 -0
  264. package/dist/runtime/process-table.d.ts.map +1 -0
  265. package/dist/runtime/process-table.js +107 -0
  266. package/dist/runtime/project-detect.d.ts +21 -0
  267. package/dist/runtime/project-detect.d.ts.map +1 -0
  268. package/dist/runtime/project-detect.js +46 -0
  269. package/dist/runtime/python-repl.d.ts +66 -0
  270. package/dist/runtime/python-repl.d.ts.map +1 -0
  271. package/dist/runtime/python-repl.js +563 -0
  272. package/dist/runtime/python-runner.d.ts +50 -0
  273. package/dist/runtime/python-runner.d.ts.map +1 -0
  274. package/dist/runtime/python-runner.js +870 -0
  275. package/dist/runtime/repl-session.d.ts +160 -0
  276. package/dist/runtime/repl-session.d.ts.map +1 -0
  277. package/dist/runtime/repl-session.js +393 -0
  278. package/dist/runtime/require-resolver.d.ts +52 -0
  279. package/dist/runtime/require-resolver.d.ts.map +1 -0
  280. package/dist/runtime/require-resolver.js +690 -0
  281. package/dist/runtime/router-basename.d.ts +36 -0
  282. package/dist/runtime/router-basename.d.ts.map +1 -0
  283. package/dist/runtime/router-basename.js +310 -0
  284. package/dist/runtime/ruby-repl.d.ts +43 -0
  285. package/dist/runtime/ruby-repl.d.ts.map +1 -0
  286. package/dist/runtime/ruby-repl.js +229 -0
  287. package/dist/runtime/ruby-runner.d.ts +62 -0
  288. package/dist/runtime/ruby-runner.d.ts.map +1 -0
  289. package/dist/runtime/ruby-runner.js +737 -0
  290. package/dist/runtime/runtime-catalog.d.ts +99 -0
  291. package/dist/runtime/runtime-catalog.d.ts.map +1 -0
  292. package/dist/runtime/runtime-catalog.js +183 -0
  293. package/dist/runtime/runtime-registry.d.ts +136 -0
  294. package/dist/runtime/runtime-registry.d.ts.map +1 -0
  295. package/dist/runtime/runtime-registry.js +318 -0
  296. package/dist/runtime/streams.d.ts +13 -0
  297. package/dist/runtime/streams.d.ts.map +1 -0
  298. package/dist/runtime/streams.js +402 -0
  299. package/dist/runtime/wasi-instance.d.ts +190 -0
  300. package/dist/runtime/wasi-instance.d.ts.map +1 -0
  301. package/dist/runtime/wasi-instance.js +2044 -0
  302. package/dist/runtime/wasm-runner.d.ts +117 -0
  303. package/dist/runtime/wasm-runner.d.ts.map +1 -0
  304. package/dist/runtime/wasm-runner.js +705 -0
  305. package/dist/session/bindings.d.ts +168 -0
  306. package/dist/session/bindings.d.ts.map +1 -0
  307. package/dist/session/bindings.js +524 -0
  308. package/dist/session/ctx-exports.d.ts +16 -0
  309. package/dist/session/ctx-exports.d.ts.map +1 -0
  310. package/dist/session/ctx-exports.js +22 -0
  311. package/dist/session/diag.d.ts +62 -0
  312. package/dist/session/diag.d.ts.map +1 -0
  313. package/dist/session/diag.js +118 -0
  314. package/dist/session/fs-watch.d.ts +132 -0
  315. package/dist/session/fs-watch.d.ts.map +1 -0
  316. package/dist/session/fs-watch.js +255 -0
  317. package/dist/session/helpers.d.ts +150 -0
  318. package/dist/session/helpers.d.ts.map +1 -0
  319. package/dist/session/helpers.js +472 -0
  320. package/dist/session/hibernation.d.ts +145 -0
  321. package/dist/session/hibernation.d.ts.map +1 -0
  322. package/dist/session/hibernation.js +385 -0
  323. package/dist/session/init-phases.d.ts +87 -0
  324. package/dist/session/init-phases.d.ts.map +1 -0
  325. package/dist/session/init-phases.js +137 -0
  326. package/dist/session/init.d.ts +46 -0
  327. package/dist/session/init.d.ts.map +1 -0
  328. package/dist/session/init.js +3579 -0
  329. package/dist/session/keys.d.ts +56 -0
  330. package/dist/session/keys.d.ts.map +1 -0
  331. package/dist/session/keys.js +55 -0
  332. package/dist/session/nimbus-session.d.ts +434 -0
  333. package/dist/session/nimbus-session.d.ts.map +1 -0
  334. package/dist/session/nimbus-session.js +1084 -0
  335. package/dist/session/programmatic.d.ts +105 -0
  336. package/dist/session/programmatic.d.ts.map +1 -0
  337. package/dist/session/programmatic.js +326 -0
  338. package/dist/session/replica-routes.d.ts +68 -0
  339. package/dist/session/replica-routes.d.ts.map +1 -0
  340. package/dist/session/replica-routes.js +77 -0
  341. package/dist/session/routes.d.ts +29 -0
  342. package/dist/session/routes.d.ts.map +1 -0
  343. package/dist/session/routes.js +1331 -0
  344. package/dist/session/rpc.d.ts +323 -0
  345. package/dist/session/rpc.d.ts.map +1 -0
  346. package/dist/session/rpc.js +808 -0
  347. package/dist/session/state-store.d.ts +210 -0
  348. package/dist/session/state-store.d.ts.map +1 -0
  349. package/dist/session/state-store.js +459 -0
  350. package/dist/session/supervisor-rpc.d.ts +269 -0
  351. package/dist/session/supervisor-rpc.d.ts.map +1 -0
  352. package/dist/session/supervisor-rpc.js +437 -0
  353. package/dist/session/ws-hibernation-config.d.ts +64 -0
  354. package/dist/session/ws-hibernation-config.d.ts.map +1 -0
  355. package/dist/session/ws-hibernation-config.js +89 -0
  356. package/dist/session/ws.d.ts +95 -0
  357. package/dist/session/ws.d.ts.map +1 -0
  358. package/dist/session/ws.js +395 -0
  359. package/dist/shell/features.d.ts +410 -0
  360. package/dist/shell/features.d.ts.map +1 -0
  361. package/dist/shell/features.js +1885 -0
  362. package/dist/shell/unix-commands.d.ts +15 -0
  363. package/dist/shell/unix-commands.d.ts.map +1 -0
  364. package/dist/shell/unix-commands.js +3703 -0
  365. package/dist/stubs/lifo-ui.d.ts +10 -0
  366. package/dist/stubs/lifo-ui.d.ts.map +1 -0
  367. package/dist/stubs/lifo-ui.js +1 -0
  368. package/dist/tailwind-play.generated.d.ts +19 -0
  369. package/dist/tailwind-play.generated.d.ts.map +1 -0
  370. package/dist/tailwind-play.generated.js +18 -0
  371. package/dist/vfs/dev-provider.d.ts +64 -0
  372. package/dist/vfs/dev-provider.d.ts.map +1 -0
  373. package/dist/vfs/dev-provider.js +191 -0
  374. package/dist/vfs/events.d.ts +51 -0
  375. package/dist/vfs/events.d.ts.map +1 -0
  376. package/dist/vfs/events.js +127 -0
  377. package/dist/vfs/path.d.ts +30 -0
  378. package/dist/vfs/path.d.ts.map +1 -0
  379. package/dist/vfs/path.js +41 -0
  380. package/dist/vfs/seed-project.d.ts +62 -0
  381. package/dist/vfs/seed-project.d.ts.map +1 -0
  382. package/dist/vfs/seed-project.js +1045 -0
  383. package/dist/vfs/sqlite-vfs.d.ts +435 -0
  384. package/dist/vfs/sqlite-vfs.d.ts.map +1 -0
  385. package/dist/vfs/sqlite-vfs.js +1670 -0
  386. package/dist/vfs/symlink-registry.d.ts +64 -0
  387. package/dist/vfs/symlink-registry.d.ts.map +1 -0
  388. package/dist/vfs/symlink-registry.js +137 -0
  389. package/dist/wrangler/nimbus-wrangler.d.ts +157 -0
  390. package/dist/wrangler/nimbus-wrangler.d.ts.map +1 -0
  391. package/dist/wrangler/nimbus-wrangler.js +931 -0
  392. package/package.json +77 -0
  393. package/public/_assets/cirrus-plugin-react.bundle.js +70740 -0
  394. package/public/_assets/esbuild-0.24.2.wasm +0 -0
  395. package/public/_assets/real-vite-bundle.js +101478 -0
  396. package/public/_assets/rollup.wasm +0 -0
  397. package/public/favicon.svg +8 -0
  398. package/public/index.html +565 -0
  399. package/public/s/index.html +2379 -0
  400. package/scripts/bundle-esbuild-wasm.mjs +244 -0
  401. package/scripts/bundle-facet-workers.mjs +137 -0
  402. package/scripts/bundle-git.mjs +118 -0
  403. package/scripts/bundle-npm-cjs.mjs +363 -0
  404. package/scripts/bundle-plugin-react.mjs +480 -0
  405. package/scripts/bundle-real-vite.mjs +959 -0
  406. package/scripts/bundle-runtime.mjs +600 -0
  407. package/scripts/bundle-tailwind-play.mjs +130 -0
  408. package/scripts/patch-lifo-ui.mjs +131 -0
@@ -0,0 +1,633 @@
1
+ /**
2
+ * git-commands.ts — Nimbus v2.0 Git integration via isomorphic-git.
3
+ *
4
+ * Provides a full `git` command with subcommands:
5
+ * init, clone, status, add, commit, log, branch, checkout,
6
+ * diff, remote, fetch, pull, push, merge, reset, tag, stash
7
+ *
8
+ * Uses a VFS→isomorphic-git FS adapter that maps all operations
9
+ * to the SqliteVFS.
10
+ */
11
+ import { execGitNetwork } from './network-facet.js';
12
+ import { normalizeVfsPath } from '../vfs/path.js';
13
+ import { dec } from '../_shared/bytes.js';
14
+ // ── Lazy-loaded isomorphic-git (avoid ~1MB load on every cold start) ────
15
+ // NOTE: local git ops (init, status, add, commit, log, branch, checkout,
16
+ // diff, remote, merge, reset, tag, config) run here in the supervisor DO.
17
+ // Network ops (clone, fetch, pull) are delegated to the git-network-facet
18
+ // because the supervisor's CPU budget cannot handle packfile processing
19
+ // for real-world repos (>100 files).
20
+ let _git = null;
21
+ async function getGit() {
22
+ if (!_git) {
23
+ // @ts-ignore — CF-compatible fork (github:AshishKumar4/cf-git)
24
+ _git = await import('isomorphic-git');
25
+ }
26
+ return _git;
27
+ }
28
+ // ── VFS→isomorphic-git FS adapter ───────────────────────────────────────
29
+ /**
30
+ * Creates an isomorphic-git compatible `fs` object from SqliteVFS.
31
+ * isomorphic-git requires: readFile, writeFile, unlink, readdir,
32
+ * mkdir, rmdir, stat, lstat (all as promises).
33
+ */
34
+ function createGitFs(vfs) {
35
+ // Path normalization is shared with esbuild-service via ./vfs-path.ts.
36
+ // isomorphic-git constructs paths like `dir + '/' + filepath` which can
37
+ // produce `/home/user/project/.` or paths with `..` segments — those are
38
+ // collapsed before VFS lookup. The bounded `..` pop won't escape root.
39
+ const normalizePath = normalizeVfsPath;
40
+ function ensureParent(p) {
41
+ const parts = normalizePath(p).split('/');
42
+ for (let i = 1; i < parts.length; i++) {
43
+ const dir = parts.slice(0, i).join('/');
44
+ if (dir && !vfs.exists(dir))
45
+ vfs.mkdir(dir, { recursive: true });
46
+ }
47
+ }
48
+ return {
49
+ promises: {
50
+ async readFile(filepath, opts) {
51
+ const p = normalizePath(filepath);
52
+ let data;
53
+ try {
54
+ data = vfs.readFile(p);
55
+ }
56
+ catch {
57
+ const err = new Error(`ENOENT: no such file or directory, open '${filepath}'`);
58
+ err.code = 'ENOENT';
59
+ err.errno = -2;
60
+ throw err;
61
+ }
62
+ if (opts?.encoding === 'utf8')
63
+ return dec.decode(data);
64
+ return data;
65
+ },
66
+ async writeFile(filepath, data, opts) {
67
+ const p = normalizePath(filepath);
68
+ ensureParent(p);
69
+ if (typeof data === 'string') {
70
+ vfs.writeFile(p, data);
71
+ }
72
+ else {
73
+ vfs.writeFile(p, data instanceof Uint8Array ? data : new Uint8Array(data));
74
+ }
75
+ },
76
+ async unlink(filepath) {
77
+ const p = normalizePath(filepath);
78
+ if (vfs.exists(p))
79
+ vfs.unlink(p);
80
+ },
81
+ async readdir(filepath) {
82
+ const p = normalizePath(filepath);
83
+ if (!p)
84
+ return []; // root level — not typically needed by isomorphic-git
85
+ if (!vfs.exists(p))
86
+ return [];
87
+ return vfs.readdir(p).map(e => e.name);
88
+ },
89
+ async mkdir(filepath, opts) {
90
+ const p = normalizePath(filepath);
91
+ if (!vfs.exists(p))
92
+ vfs.mkdir(p, { recursive: true });
93
+ },
94
+ async rmdir(filepath) {
95
+ const p = normalizePath(filepath);
96
+ if (vfs.exists(p))
97
+ vfs.rmdir(p);
98
+ },
99
+ async stat(filepath) {
100
+ const p = normalizePath(filepath);
101
+ // Synthetic directory stat — used for root, '.', and known directories
102
+ function dirStat() {
103
+ const now = Date.now();
104
+ const d = new Date(now);
105
+ return {
106
+ isFile: () => false, isDirectory: () => true, isSymbolicLink: () => false,
107
+ size: 0, mode: 0o755, type: 'dir',
108
+ mtimeMs: now, mtime: d, ctimeMs: now, ctime: d, atimeMs: now, atime: d,
109
+ uid: 1000, gid: 1000, dev: 0, ino: 0, nlink: 1,
110
+ };
111
+ }
112
+ // Empty path (from '.', '/', etc.) = root directory
113
+ if (!p)
114
+ return dirStat();
115
+ // Check if path is a known directory (even without VFS stat entry)
116
+ if (vfs.exists(p) && vfs.isDirectory(p))
117
+ return dirStat();
118
+ let st;
119
+ try {
120
+ st = vfs.stat(p);
121
+ }
122
+ catch {
123
+ const err = new Error(`ENOENT: no such file or directory, stat '${filepath}'`);
124
+ err.code = 'ENOENT';
125
+ err.errno = -2;
126
+ throw err;
127
+ }
128
+ // isomorphic-git calls .valueOf() on mtime/ctime/atime — all must be Date objects
129
+ const mtimeMs = st.mtime || Date.now();
130
+ const mtime = new Date(mtimeMs);
131
+ return {
132
+ isFile: () => st.type === 'file',
133
+ isDirectory: () => st.type === 'directory',
134
+ isSymbolicLink: () => false,
135
+ size: st.size,
136
+ mode: st.mode || 0o644,
137
+ mtimeMs,
138
+ mtime,
139
+ ctimeMs: mtimeMs,
140
+ ctime: mtime,
141
+ atimeMs: mtimeMs,
142
+ atime: mtime,
143
+ uid: 1000,
144
+ gid: 1000,
145
+ dev: 0,
146
+ ino: 0,
147
+ nlink: 1,
148
+ type: st.type === 'directory' ? 'dir' : 'file',
149
+ };
150
+ },
151
+ async lstat(filepath) {
152
+ return this.stat(filepath);
153
+ },
154
+ async chmod() { },
155
+ async symlink() { },
156
+ async readlink(filepath) { return filepath; },
157
+ },
158
+ };
159
+ }
160
+ function getDir(ctx) {
161
+ return '/' + (ctx.cwd || '/home/user').replace(/^\/+/, '');
162
+ }
163
+ function getFlag(args, flag) {
164
+ const idx = args.indexOf(flag);
165
+ return idx >= 0 && args[idx + 1] ? args[idx + 1] : undefined;
166
+ }
167
+ function getAuthor(ctx) {
168
+ return {
169
+ name: ctx.env.GIT_AUTHOR_NAME || ctx.env.USER || 'user',
170
+ email: ctx.env.GIT_AUTHOR_EMAIL || 'user@nimbus.dev',
171
+ };
172
+ }
173
+ // ── Git subcommand implementations ──────────────────────────────────────
174
+ export function registerGitCommands(registry, vfs, doCtx, doEnv) {
175
+ const fs = createGitFs(vfs);
176
+ registry.register('git', async (ctx) => {
177
+ const args = ctx.args;
178
+ const sub = args[0];
179
+ const subArgs = args.slice(1);
180
+ const dir = getDir(ctx);
181
+ if (sub === '--version' || sub === '-v') {
182
+ ctx.stdout.write('git version 2.44.0 (isomorphic-git/cf-git)\n');
183
+ return 0;
184
+ }
185
+ if (!sub || sub === '--help' || sub === '-h') {
186
+ ctx.stdout.write('usage: git <command> [<args>]\n\n');
187
+ ctx.stdout.write('Commands:\n');
188
+ ctx.stdout.write(' init, clone, status, add, commit, log, branch,\n');
189
+ ctx.stdout.write(' checkout, diff, remote, fetch, pull, push, merge,\n');
190
+ ctx.stdout.write(' reset, tag, config, --version\n');
191
+ return 0;
192
+ }
193
+ // Lazy-load isomorphic-git only when actually needed.
194
+ // Note: http transport isn't loaded here — network ops (clone/fetch/pull)
195
+ // run inside the git-network-facet which imports its own http transport.
196
+ let git;
197
+ try {
198
+ git = await getGit();
199
+ }
200
+ catch (e) {
201
+ ctx.stderr.write(`git: failed to load git module: ${e?.message}\n`);
202
+ return 1;
203
+ }
204
+ try {
205
+ switch (sub) {
206
+ case 'init': {
207
+ // git init [path] — if path given, use it; otherwise use cwd
208
+ let initDir = dir;
209
+ const initPath = subArgs.find((a) => !a.startsWith('-'));
210
+ if (initPath) {
211
+ initDir = initPath.startsWith('/') ? initPath : dir + '/' + initPath;
212
+ // Ensure the target directory exists in VFS
213
+ const stripped = initDir.replace(/^\/+/, '');
214
+ if (!vfs.exists(stripped))
215
+ vfs.mkdir(stripped, { recursive: true });
216
+ }
217
+ await git.init({ fs, dir: initDir });
218
+ ctx.stdout.write(`Initialized empty Git repository in ${initDir}/.git/\n`);
219
+ return 0;
220
+ }
221
+ case 'clone': {
222
+ const url = subArgs[0];
223
+ if (!url) {
224
+ ctx.stderr.write('usage: git clone <url> [dir]\n');
225
+ return 1;
226
+ }
227
+ // hardening-r5: respect absolute paths. Pre-fix `git clone <url> /tmp/x`
228
+ // resolved to `<cwd>//tmp/x` because the `subArgs[1]` branch
229
+ // unconditionally prepended getDir(ctx). The clone "succeeded" into
230
+ // <cwd>//tmp/x (note double slash) and the user's later `cd /tmp/x`
231
+ // hit ENOENT. Real-world git treats absolute targets as absolute.
232
+ // See /workspace/.seal-internal/2026-05-12-hardening-r5/repro-git.mjs.
233
+ let dest;
234
+ if (subArgs[1]) {
235
+ dest = subArgs[1].startsWith('/')
236
+ ? subArgs[1]
237
+ : getDir(ctx) + '/' + subArgs[1];
238
+ }
239
+ else {
240
+ dest = dir + '/' + url.split('/').pop()?.replace('.git', '');
241
+ }
242
+ const depthFlag = getFlag(subArgs, '--depth');
243
+ const noShallow = subArgs.includes('--no-shallow');
244
+ const depth = depthFlag ? parseInt(depthFlag) || 1 : (noShallow ? undefined : 1);
245
+ const isBg = subArgs.includes('&') || subArgs.includes('--bg');
246
+ if (!doCtx || !doEnv) {
247
+ ctx.stderr.write('[git] clone requires DO ctx + env (internal configuration error)\n');
248
+ return 1;
249
+ }
250
+ ctx.stdout.write(`Cloning into '${dest}'...${depth ? ' (shallow, depth=' + depth + ')' : ''}\n`);
251
+ // Delegate to git-network-facet: heavy packfile processing runs in
252
+ // a dynamic worker with its own CPU budget, not the supervisor DO.
253
+ const doClone = async () => {
254
+ const result = await execGitNetwork(doCtx, doEnv, {
255
+ op: 'clone',
256
+ dir: dest,
257
+ url,
258
+ depth,
259
+ auth: {
260
+ username: ctx.env.GIT_USERNAME || '',
261
+ password: ctx.env.GIT_PASSWORD || ctx.env.GIT_TOKEN || '',
262
+ },
263
+ });
264
+ try {
265
+ vfs.flushAll();
266
+ }
267
+ catch { }
268
+ if (result.success) {
269
+ ctx.stdout.write(`\n[git] clone complete (${result.filesWritten} files, ` +
270
+ `${(result.bytesWritten / 1024).toFixed(1)}KB in ${(result.elapsed / 1000).toFixed(1)}s)\n`);
271
+ }
272
+ else {
273
+ ctx.stderr.write(`\n[git] clone failed: ${result.error}\n`);
274
+ }
275
+ };
276
+ if (isBg) {
277
+ ctx.stdout.write('[git] clone running in background...\n');
278
+ doClone(); // intentionally not awaited
279
+ return 0;
280
+ }
281
+ else {
282
+ await doClone();
283
+ return 0;
284
+ }
285
+ }
286
+ case 'status': {
287
+ const matrix = await git.statusMatrix({ fs, dir });
288
+ let clean = true;
289
+ for (const [filepath, head, workdir, stage] of matrix) {
290
+ if (head === workdir && workdir === stage)
291
+ continue;
292
+ clean = false;
293
+ if (head === 0 && workdir === 2 && stage === 0)
294
+ ctx.stdout.write(`\x1b[31m?? ${filepath}\x1b[0m\n`);
295
+ else if (head === 0 && stage === 2)
296
+ ctx.stdout.write(`\x1b[32mA ${filepath}\x1b[0m\n`);
297
+ else if (head === 1 && workdir === 2 && stage === 2)
298
+ ctx.stdout.write(`\x1b[32mM ${filepath}\x1b[0m\n`);
299
+ else if (head === 1 && workdir === 2 && stage === 1)
300
+ ctx.stdout.write(`\x1b[31m M ${filepath}\x1b[0m\n`);
301
+ else if (head === 1 && workdir === 0)
302
+ ctx.stdout.write(`\x1b[31m D ${filepath}\x1b[0m\n`);
303
+ else if (head === 1 && stage === 0)
304
+ ctx.stdout.write(`\x1b[32mD ${filepath}\x1b[0m\n`);
305
+ else
306
+ ctx.stdout.write(` ${filepath} [${head},${workdir},${stage}]\n`);
307
+ }
308
+ if (clean)
309
+ ctx.stdout.write('nothing to commit, working tree clean\n');
310
+ return 0;
311
+ }
312
+ case 'add': {
313
+ const paths = subArgs.filter(a => !a.startsWith('-'));
314
+ if (paths.length === 0 || paths.includes('.')) {
315
+ // Add all
316
+ const matrix = await git.statusMatrix({ fs, dir });
317
+ for (const [filepath, head, workdir, stage] of matrix) {
318
+ if (head !== workdir || workdir !== stage) {
319
+ if (workdir === 0)
320
+ await git.remove({ fs, dir, filepath });
321
+ else
322
+ await git.add({ fs, dir, filepath });
323
+ }
324
+ }
325
+ }
326
+ else {
327
+ for (const filepath of paths) {
328
+ await git.add({ fs, dir, filepath });
329
+ }
330
+ }
331
+ return 0;
332
+ }
333
+ case 'commit': {
334
+ const msgIdx = subArgs.indexOf('-m');
335
+ const message = msgIdx >= 0 ? subArgs[msgIdx + 1] : 'commit';
336
+ if (!message) {
337
+ ctx.stderr.write('error: empty commit message\n');
338
+ return 1;
339
+ }
340
+ const sha = await git.commit({
341
+ fs, dir, message,
342
+ author: getAuthor(ctx),
343
+ });
344
+ ctx.stdout.write(`[${sha.slice(0, 7)}] ${message}\n`);
345
+ return 0;
346
+ }
347
+ case 'log': {
348
+ const maxCount = parseInt(getFlag(subArgs, '-n') || getFlag(subArgs, '--max-count') || '10');
349
+ const oneline = subArgs.includes('--oneline');
350
+ const commits = await git.log({ fs, dir, depth: maxCount });
351
+ for (const c of commits) {
352
+ if (oneline) {
353
+ ctx.stdout.write(`\x1b[33m${c.oid.slice(0, 7)}\x1b[0m ${c.commit.message.split('\n')[0]}\n`);
354
+ }
355
+ else {
356
+ ctx.stdout.write(`\x1b[33mcommit ${c.oid}\x1b[0m\n`);
357
+ ctx.stdout.write(`Author: ${c.commit.author.name} <${c.commit.author.email}>\n`);
358
+ ctx.stdout.write(`Date: ${new Date(c.commit.author.timestamp * 1000).toDateString()}\n\n`);
359
+ ctx.stdout.write(` ${c.commit.message}\n\n`);
360
+ }
361
+ }
362
+ return 0;
363
+ }
364
+ case 'branch': {
365
+ if (subArgs.length === 0 || subArgs[0] === '-a' || subArgs[0] === '--list') {
366
+ const branches = await git.listBranches({ fs, dir });
367
+ const current = await git.currentBranch({ fs, dir });
368
+ for (const b of branches) {
369
+ ctx.stdout.write(b === current ? `\x1b[32m* ${b}\x1b[0m\n` : ` ${b}\n`);
370
+ }
371
+ if (subArgs.includes('-a')) {
372
+ try {
373
+ const remotes = await git.listBranches({ fs, dir, remote: 'origin' });
374
+ for (const b of remotes)
375
+ ctx.stdout.write(` \x1b[31mremotes/origin/${b}\x1b[0m\n`);
376
+ }
377
+ catch { }
378
+ }
379
+ }
380
+ else if (subArgs.includes('-d') || subArgs.includes('-D')) {
381
+ const name = subArgs.find(a => !a.startsWith('-'));
382
+ if (name) {
383
+ await git.deleteBranch({ fs, dir, ref: name });
384
+ ctx.stdout.write(`Deleted branch ${name}\n`);
385
+ }
386
+ }
387
+ else {
388
+ const name = subArgs[0];
389
+ await git.branch({ fs, dir, ref: name });
390
+ ctx.stdout.write(`Created branch ${name}\n`);
391
+ }
392
+ return 0;
393
+ }
394
+ case 'checkout': {
395
+ const ref = subArgs.find(a => !a.startsWith('-'));
396
+ if (!ref) {
397
+ ctx.stderr.write('error: specify a branch\n');
398
+ return 1;
399
+ }
400
+ if (subArgs.includes('-b')) {
401
+ await git.branch({ fs, dir, ref });
402
+ await git.checkout({ fs, dir, ref });
403
+ ctx.stdout.write(`Switched to a new branch '${ref}'\n`);
404
+ }
405
+ else {
406
+ await git.checkout({ fs, dir, ref });
407
+ ctx.stdout.write(`Switched to branch '${ref}'\n`);
408
+ }
409
+ return 0;
410
+ }
411
+ case 'diff': {
412
+ // Simple diff: show unstaged changes
413
+ const matrix = await git.statusMatrix({ fs, dir });
414
+ for (const [filepath, head, workdir, stage] of matrix) {
415
+ if (workdir !== head || workdir !== stage) {
416
+ ctx.stdout.write(`\x1b[1mdiff --git a/${filepath} b/${filepath}\x1b[0m\n`);
417
+ try {
418
+ const raw = await fs.promises.readFile(dir + '/' + filepath);
419
+ const content = typeof raw === 'string' ? raw : dec.decode(raw);
420
+ const lines = content.split('\n');
421
+ for (let i = 0; i < Math.min(lines.length, 50); i++) {
422
+ if (head === 0)
423
+ ctx.stdout.write(`\x1b[32m+${lines[i]}\x1b[0m\n`);
424
+ else
425
+ ctx.stdout.write(` ${lines[i]}\n`);
426
+ }
427
+ if (lines.length > 50)
428
+ ctx.stdout.write(`... (${lines.length - 50} more lines)\n`);
429
+ }
430
+ catch { }
431
+ ctx.stdout.write('\n');
432
+ }
433
+ }
434
+ return 0;
435
+ }
436
+ case 'remote': {
437
+ if (subArgs[0] === 'add' && subArgs[1] && subArgs[2]) {
438
+ await git.addRemote({ fs, dir, remote: subArgs[1], url: subArgs[2] });
439
+ ctx.stdout.write(`Remote '${subArgs[1]}' added\n`);
440
+ }
441
+ else if (subArgs[0] === 'remove' || subArgs[0] === 'rm') {
442
+ await git.deleteRemote({ fs, dir, remote: subArgs[1] });
443
+ ctx.stdout.write(`Remote '${subArgs[1]}' removed\n`);
444
+ }
445
+ else {
446
+ const remotes = await git.listRemotes({ fs, dir });
447
+ for (const r of remotes) {
448
+ ctx.stdout.write(subArgs.includes('-v') ? `${r.remote}\t${r.url} (fetch)\n` : `${r.remote}\n`);
449
+ }
450
+ }
451
+ return 0;
452
+ }
453
+ case 'fetch': {
454
+ const remote = subArgs[0] || 'origin';
455
+ if (!doCtx || !doEnv) {
456
+ ctx.stderr.write('[git] fetch requires DO ctx + env (internal configuration error)\n');
457
+ return 1;
458
+ }
459
+ ctx.stdout.write(`Fetching from ${remote}...\n`);
460
+ const result = await execGitNetwork(doCtx, doEnv, {
461
+ op: 'fetch',
462
+ dir,
463
+ remote,
464
+ auth: {
465
+ username: ctx.env.GIT_USERNAME || '',
466
+ password: ctx.env.GIT_PASSWORD || ctx.env.GIT_TOKEN || '',
467
+ },
468
+ });
469
+ try {
470
+ vfs.flushAll();
471
+ }
472
+ catch { }
473
+ if (result.success) {
474
+ ctx.stdout.write(`\n[git] fetch complete (${result.filesWritten} files in ${(result.elapsed / 1000).toFixed(1)}s)\n`);
475
+ return 0;
476
+ }
477
+ else {
478
+ ctx.stderr.write(`\n[git] fetch failed: ${result.error}\n`);
479
+ return 1;
480
+ }
481
+ }
482
+ case 'pull': {
483
+ const remote = subArgs[0] || 'origin';
484
+ const branch = subArgs[1] || await git.currentBranch({ fs, dir }) || 'main';
485
+ if (!doCtx || !doEnv) {
486
+ ctx.stderr.write('[git] pull requires DO ctx + env (internal configuration error)\n');
487
+ return 1;
488
+ }
489
+ ctx.stdout.write(`Pulling from ${remote}/${branch}...\n`);
490
+ const result = await execGitNetwork(doCtx, doEnv, {
491
+ op: 'pull',
492
+ dir,
493
+ remote,
494
+ ref: branch,
495
+ author: getAuthor(ctx),
496
+ auth: {
497
+ username: ctx.env.GIT_USERNAME || '',
498
+ password: ctx.env.GIT_PASSWORD || ctx.env.GIT_TOKEN || '',
499
+ },
500
+ });
501
+ try {
502
+ vfs.flushAll();
503
+ }
504
+ catch { }
505
+ if (result.success) {
506
+ ctx.stdout.write(`\n[git] pull complete (${result.filesWritten} files in ${(result.elapsed / 1000).toFixed(1)}s)\n`);
507
+ return 0;
508
+ }
509
+ else {
510
+ ctx.stderr.write(`\n[git] pull failed: ${result.error}\n`);
511
+ return 1;
512
+ }
513
+ }
514
+ case 'push': {
515
+ const remote = subArgs[0] || 'origin';
516
+ const branch = subArgs[1] || await git.currentBranch({ fs, dir }) || 'main';
517
+ if (!doCtx || !doEnv) {
518
+ ctx.stderr.write('[git] push requires DO ctx + env (internal configuration error)\n');
519
+ return 1;
520
+ }
521
+ ctx.stdout.write(`Pushing to ${remote}/${branch}...\n`);
522
+ const result = await execGitNetwork(doCtx, doEnv, {
523
+ op: 'push',
524
+ dir,
525
+ remote,
526
+ ref: branch,
527
+ auth: {
528
+ username: ctx.env.GIT_USERNAME || '',
529
+ password: ctx.env.GIT_PASSWORD || ctx.env.GIT_TOKEN || '',
530
+ },
531
+ });
532
+ if (result.success) {
533
+ ctx.stdout.write(`\n[git] push complete (${(result.elapsed / 1000).toFixed(1)}s)\n`);
534
+ return 0;
535
+ }
536
+ else {
537
+ ctx.stderr.write(`\n[git] push failed: ${result.error}\n`);
538
+ return 1;
539
+ }
540
+ }
541
+ case 'merge': {
542
+ const theirs = subArgs[0];
543
+ if (!theirs) {
544
+ ctx.stderr.write('usage: git merge <branch>\n');
545
+ return 1;
546
+ }
547
+ await git.merge({
548
+ fs, dir, theirs,
549
+ author: getAuthor(ctx),
550
+ });
551
+ ctx.stdout.write(`Merged ${theirs}\n`);
552
+ return 0;
553
+ }
554
+ case 'reset': {
555
+ const hard = subArgs.includes('--hard');
556
+ const soft = subArgs.includes('--soft');
557
+ const ref = subArgs.find(a => !a.startsWith('-')) || 'HEAD';
558
+ const oid = await git.resolveRef({ fs, dir, ref });
559
+ // Move the current branch to the target OID
560
+ const branch = await git.currentBranch({ fs, dir });
561
+ if (branch) {
562
+ await git.writeRef({ fs, dir, ref: `refs/heads/${branch}`, value: oid, force: true });
563
+ }
564
+ if (!soft) {
565
+ // Reset index (--mixed behavior, also applies to --hard)
566
+ const matrix = await git.statusMatrix({ fs, dir });
567
+ for (const [filepath] of matrix) {
568
+ try {
569
+ await git.resetIndex({ fs, dir, filepath });
570
+ }
571
+ catch { }
572
+ }
573
+ }
574
+ if (hard) {
575
+ // Reset working tree to match the target
576
+ await git.checkout({ fs, dir, ref: oid, force: true });
577
+ }
578
+ ctx.stdout.write(`HEAD is now at ${oid.slice(0, 7)}\n`);
579
+ return 0;
580
+ }
581
+ case 'tag': {
582
+ if (subArgs.length === 0) {
583
+ const tags = await git.listTags({ fs, dir });
584
+ for (const t of tags)
585
+ ctx.stdout.write(t + '\n');
586
+ }
587
+ else if (subArgs.includes('-d')) {
588
+ const name = subArgs.find(a => !a.startsWith('-'));
589
+ if (name)
590
+ await git.deleteTag({ fs, dir, ref: name });
591
+ }
592
+ else {
593
+ const name = subArgs[0];
594
+ await git.tag({ fs, dir, ref: name });
595
+ ctx.stdout.write(`Created tag ${name}\n`);
596
+ }
597
+ return 0;
598
+ }
599
+ case 'config': {
600
+ const key = subArgs.find(a => !a.startsWith('-'));
601
+ const value = subArgs[subArgs.indexOf(key || '') + 1];
602
+ if (key && value) {
603
+ const [section, ...rest] = key.split('.');
604
+ await git.setConfig({ fs, dir, path: key, value });
605
+ ctx.stdout.write(`${key}=${value}\n`);
606
+ }
607
+ else if (key) {
608
+ try {
609
+ const val = await git.getConfig({ fs, dir, path: key });
610
+ ctx.stdout.write(`${val}\n`);
611
+ }
612
+ catch {
613
+ ctx.stderr.write(`config: key '${key}' not set\n`);
614
+ return 1;
615
+ }
616
+ }
617
+ else {
618
+ ctx.stderr.write('usage: git config <key> [value]\n');
619
+ return 1;
620
+ }
621
+ return 0;
622
+ }
623
+ default:
624
+ ctx.stderr.write(`git: '${sub}' is not a git command. See 'git --help'.\n`);
625
+ return 1;
626
+ }
627
+ }
628
+ catch (e) {
629
+ ctx.stderr.write(`fatal: ${e?.message || e}\n`);
630
+ return 128;
631
+ }
632
+ });
633
+ }