gitx.do 0.1.1 → 0.1.3

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 (376) hide show
  1. package/README.md +40 -353
  2. package/dist/do/logger.d.ts +50 -0
  3. package/dist/do/logger.d.ts.map +1 -0
  4. package/dist/do/logger.js +122 -0
  5. package/dist/do/logger.js.map +1 -0
  6. package/dist/{durable-object → do}/schema.d.ts +3 -3
  7. package/dist/do/schema.d.ts.map +1 -0
  8. package/dist/{durable-object → do}/schema.js +4 -3
  9. package/dist/do/schema.js.map +1 -0
  10. package/dist/do/types.d.ts +267 -0
  11. package/dist/do/types.d.ts.map +1 -0
  12. package/dist/do/types.js +62 -0
  13. package/dist/do/types.js.map +1 -0
  14. package/dist/index.d.ts +15 -469
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +39 -481
  17. package/dist/index.js.map +1 -1
  18. package/dist/mcp/auth.d.ts +77 -0
  19. package/dist/mcp/auth.d.ts.map +1 -0
  20. package/dist/mcp/auth.js +278 -0
  21. package/dist/mcp/auth.js.map +1 -0
  22. package/dist/mcp/index.d.ts +13 -0
  23. package/dist/mcp/index.d.ts.map +1 -0
  24. package/dist/mcp/index.js +19 -0
  25. package/dist/mcp/index.js.map +1 -0
  26. package/dist/mcp/server.d.ts +200 -0
  27. package/dist/mcp/server.d.ts.map +1 -0
  28. package/dist/mcp/server.js +275 -0
  29. package/dist/mcp/server.js.map +1 -0
  30. package/dist/mcp/tool-registry.d.ts +47 -0
  31. package/dist/mcp/tool-registry.d.ts.map +1 -0
  32. package/dist/mcp/tool-registry.js +284 -0
  33. package/dist/mcp/tool-registry.js.map +1 -0
  34. package/dist/mcp/tools.d.ts +103 -515
  35. package/dist/mcp/tools.d.ts.map +1 -1
  36. package/dist/mcp/tools.js +676 -3087
  37. package/dist/mcp/tools.js.map +1 -1
  38. package/dist/mcp/types.d.ts +124 -0
  39. package/dist/mcp/types.d.ts.map +1 -0
  40. package/dist/mcp/types.js +9 -0
  41. package/dist/mcp/types.js.map +1 -0
  42. package/package.json +19 -21
  43. package/dist/cli/commands/add.d.ts +0 -176
  44. package/dist/cli/commands/add.d.ts.map +0 -1
  45. package/dist/cli/commands/add.js +0 -979
  46. package/dist/cli/commands/add.js.map +0 -1
  47. package/dist/cli/commands/blame.d.ts +0 -259
  48. package/dist/cli/commands/blame.d.ts.map +0 -1
  49. package/dist/cli/commands/blame.js +0 -609
  50. package/dist/cli/commands/blame.js.map +0 -1
  51. package/dist/cli/commands/branch.d.ts +0 -249
  52. package/dist/cli/commands/branch.d.ts.map +0 -1
  53. package/dist/cli/commands/branch.js +0 -693
  54. package/dist/cli/commands/branch.js.map +0 -1
  55. package/dist/cli/commands/checkout.d.ts +0 -73
  56. package/dist/cli/commands/checkout.d.ts.map +0 -1
  57. package/dist/cli/commands/checkout.js +0 -725
  58. package/dist/cli/commands/checkout.js.map +0 -1
  59. package/dist/cli/commands/commit.d.ts +0 -182
  60. package/dist/cli/commands/commit.d.ts.map +0 -1
  61. package/dist/cli/commands/commit.js +0 -457
  62. package/dist/cli/commands/commit.js.map +0 -1
  63. package/dist/cli/commands/diff.d.ts +0 -464
  64. package/dist/cli/commands/diff.d.ts.map +0 -1
  65. package/dist/cli/commands/diff.js +0 -959
  66. package/dist/cli/commands/diff.js.map +0 -1
  67. package/dist/cli/commands/log.d.ts +0 -239
  68. package/dist/cli/commands/log.d.ts.map +0 -1
  69. package/dist/cli/commands/log.js +0 -535
  70. package/dist/cli/commands/log.js.map +0 -1
  71. package/dist/cli/commands/merge.d.ts +0 -106
  72. package/dist/cli/commands/merge.d.ts.map +0 -1
  73. package/dist/cli/commands/merge.js +0 -852
  74. package/dist/cli/commands/merge.js.map +0 -1
  75. package/dist/cli/commands/review.d.ts +0 -457
  76. package/dist/cli/commands/review.d.ts.map +0 -1
  77. package/dist/cli/commands/review.js +0 -558
  78. package/dist/cli/commands/review.js.map +0 -1
  79. package/dist/cli/commands/stash.d.ts +0 -157
  80. package/dist/cli/commands/stash.d.ts.map +0 -1
  81. package/dist/cli/commands/stash.js +0 -655
  82. package/dist/cli/commands/stash.js.map +0 -1
  83. package/dist/cli/commands/status.d.ts +0 -269
  84. package/dist/cli/commands/status.d.ts.map +0 -1
  85. package/dist/cli/commands/status.js +0 -492
  86. package/dist/cli/commands/status.js.map +0 -1
  87. package/dist/cli/commands/web.d.ts +0 -199
  88. package/dist/cli/commands/web.d.ts.map +0 -1
  89. package/dist/cli/commands/web.js +0 -697
  90. package/dist/cli/commands/web.js.map +0 -1
  91. package/dist/cli/fs-adapter.d.ts +0 -656
  92. package/dist/cli/fs-adapter.d.ts.map +0 -1
  93. package/dist/cli/fs-adapter.js +0 -1177
  94. package/dist/cli/fs-adapter.js.map +0 -1
  95. package/dist/cli/fsx-cli-adapter.d.ts +0 -359
  96. package/dist/cli/fsx-cli-adapter.d.ts.map +0 -1
  97. package/dist/cli/fsx-cli-adapter.js +0 -619
  98. package/dist/cli/fsx-cli-adapter.js.map +0 -1
  99. package/dist/cli/index.d.ts +0 -387
  100. package/dist/cli/index.d.ts.map +0 -1
  101. package/dist/cli/index.js +0 -579
  102. package/dist/cli/index.js.map +0 -1
  103. package/dist/cli/ui/components/DiffView.d.ts +0 -12
  104. package/dist/cli/ui/components/DiffView.d.ts.map +0 -1
  105. package/dist/cli/ui/components/DiffView.js +0 -11
  106. package/dist/cli/ui/components/DiffView.js.map +0 -1
  107. package/dist/cli/ui/components/ErrorDisplay.d.ts +0 -10
  108. package/dist/cli/ui/components/ErrorDisplay.d.ts.map +0 -1
  109. package/dist/cli/ui/components/ErrorDisplay.js +0 -11
  110. package/dist/cli/ui/components/ErrorDisplay.js.map +0 -1
  111. package/dist/cli/ui/components/FuzzySearch.d.ts +0 -15
  112. package/dist/cli/ui/components/FuzzySearch.d.ts.map +0 -1
  113. package/dist/cli/ui/components/FuzzySearch.js +0 -12
  114. package/dist/cli/ui/components/FuzzySearch.js.map +0 -1
  115. package/dist/cli/ui/components/LoadingSpinner.d.ts +0 -10
  116. package/dist/cli/ui/components/LoadingSpinner.d.ts.map +0 -1
  117. package/dist/cli/ui/components/LoadingSpinner.js +0 -10
  118. package/dist/cli/ui/components/LoadingSpinner.js.map +0 -1
  119. package/dist/cli/ui/components/NavigationList.d.ts +0 -14
  120. package/dist/cli/ui/components/NavigationList.d.ts.map +0 -1
  121. package/dist/cli/ui/components/NavigationList.js +0 -11
  122. package/dist/cli/ui/components/NavigationList.js.map +0 -1
  123. package/dist/cli/ui/components/ScrollableContent.d.ts +0 -13
  124. package/dist/cli/ui/components/ScrollableContent.d.ts.map +0 -1
  125. package/dist/cli/ui/components/ScrollableContent.js +0 -11
  126. package/dist/cli/ui/components/ScrollableContent.js.map +0 -1
  127. package/dist/cli/ui/components/index.d.ts +0 -7
  128. package/dist/cli/ui/components/index.d.ts.map +0 -1
  129. package/dist/cli/ui/components/index.js +0 -9
  130. package/dist/cli/ui/components/index.js.map +0 -1
  131. package/dist/cli/ui/terminal-ui.d.ts +0 -85
  132. package/dist/cli/ui/terminal-ui.d.ts.map +0 -1
  133. package/dist/cli/ui/terminal-ui.js +0 -121
  134. package/dist/cli/ui/terminal-ui.js.map +0 -1
  135. package/dist/do/BashModule.d.ts +0 -871
  136. package/dist/do/BashModule.d.ts.map +0 -1
  137. package/dist/do/BashModule.js +0 -1143
  138. package/dist/do/BashModule.js.map +0 -1
  139. package/dist/do/FsModule.d.ts +0 -612
  140. package/dist/do/FsModule.d.ts.map +0 -1
  141. package/dist/do/FsModule.js +0 -1120
  142. package/dist/do/FsModule.js.map +0 -1
  143. package/dist/do/GitModule.d.ts +0 -635
  144. package/dist/do/GitModule.d.ts.map +0 -1
  145. package/dist/do/GitModule.js +0 -784
  146. package/dist/do/GitModule.js.map +0 -1
  147. package/dist/do/GitRepoDO.d.ts +0 -281
  148. package/dist/do/GitRepoDO.d.ts.map +0 -1
  149. package/dist/do/GitRepoDO.js +0 -479
  150. package/dist/do/GitRepoDO.js.map +0 -1
  151. package/dist/do/bash-ast.d.ts +0 -246
  152. package/dist/do/bash-ast.d.ts.map +0 -1
  153. package/dist/do/bash-ast.js +0 -888
  154. package/dist/do/bash-ast.js.map +0 -1
  155. package/dist/do/container-executor.d.ts +0 -491
  156. package/dist/do/container-executor.d.ts.map +0 -1
  157. package/dist/do/container-executor.js +0 -731
  158. package/dist/do/container-executor.js.map +0 -1
  159. package/dist/do/index.d.ts +0 -53
  160. package/dist/do/index.d.ts.map +0 -1
  161. package/dist/do/index.js +0 -91
  162. package/dist/do/index.js.map +0 -1
  163. package/dist/do/tiered-storage.d.ts +0 -403
  164. package/dist/do/tiered-storage.d.ts.map +0 -1
  165. package/dist/do/tiered-storage.js +0 -689
  166. package/dist/do/tiered-storage.js.map +0 -1
  167. package/dist/do/withBash.d.ts +0 -231
  168. package/dist/do/withBash.d.ts.map +0 -1
  169. package/dist/do/withBash.js +0 -244
  170. package/dist/do/withBash.js.map +0 -1
  171. package/dist/do/withFs.d.ts +0 -237
  172. package/dist/do/withFs.d.ts.map +0 -1
  173. package/dist/do/withFs.js +0 -387
  174. package/dist/do/withFs.js.map +0 -1
  175. package/dist/do/withGit.d.ts +0 -180
  176. package/dist/do/withGit.d.ts.map +0 -1
  177. package/dist/do/withGit.js +0 -271
  178. package/dist/do/withGit.js.map +0 -1
  179. package/dist/durable-object/object-store.d.ts +0 -633
  180. package/dist/durable-object/object-store.d.ts.map +0 -1
  181. package/dist/durable-object/object-store.js +0 -1164
  182. package/dist/durable-object/object-store.js.map +0 -1
  183. package/dist/durable-object/schema.d.ts.map +0 -1
  184. package/dist/durable-object/schema.js.map +0 -1
  185. package/dist/durable-object/wal.d.ts +0 -416
  186. package/dist/durable-object/wal.d.ts.map +0 -1
  187. package/dist/durable-object/wal.js +0 -445
  188. package/dist/durable-object/wal.js.map +0 -1
  189. package/dist/mcp/adapter.d.ts +0 -772
  190. package/dist/mcp/adapter.d.ts.map +0 -1
  191. package/dist/mcp/adapter.js +0 -895
  192. package/dist/mcp/adapter.js.map +0 -1
  193. package/dist/mcp/sandbox/miniflare-evaluator.d.ts +0 -22
  194. package/dist/mcp/sandbox/miniflare-evaluator.d.ts.map +0 -1
  195. package/dist/mcp/sandbox/miniflare-evaluator.js +0 -140
  196. package/dist/mcp/sandbox/miniflare-evaluator.js.map +0 -1
  197. package/dist/mcp/sandbox/object-store-proxy.d.ts +0 -32
  198. package/dist/mcp/sandbox/object-store-proxy.d.ts.map +0 -1
  199. package/dist/mcp/sandbox/object-store-proxy.js +0 -30
  200. package/dist/mcp/sandbox/object-store-proxy.js.map +0 -1
  201. package/dist/mcp/sandbox/template.d.ts +0 -17
  202. package/dist/mcp/sandbox/template.d.ts.map +0 -1
  203. package/dist/mcp/sandbox/template.js +0 -71
  204. package/dist/mcp/sandbox/template.js.map +0 -1
  205. package/dist/mcp/sandbox.d.ts +0 -764
  206. package/dist/mcp/sandbox.d.ts.map +0 -1
  207. package/dist/mcp/sandbox.js +0 -1362
  208. package/dist/mcp/sandbox.js.map +0 -1
  209. package/dist/mcp/sdk-adapter.d.ts +0 -835
  210. package/dist/mcp/sdk-adapter.d.ts.map +0 -1
  211. package/dist/mcp/sdk-adapter.js +0 -974
  212. package/dist/mcp/sdk-adapter.js.map +0 -1
  213. package/dist/mcp/tools/do.d.ts +0 -32
  214. package/dist/mcp/tools/do.d.ts.map +0 -1
  215. package/dist/mcp/tools/do.js +0 -117
  216. package/dist/mcp/tools/do.js.map +0 -1
  217. package/dist/ops/blame.d.ts +0 -551
  218. package/dist/ops/blame.d.ts.map +0 -1
  219. package/dist/ops/blame.js +0 -1037
  220. package/dist/ops/blame.js.map +0 -1
  221. package/dist/ops/branch.d.ts +0 -766
  222. package/dist/ops/branch.d.ts.map +0 -1
  223. package/dist/ops/branch.js +0 -950
  224. package/dist/ops/branch.js.map +0 -1
  225. package/dist/ops/commit-traversal.d.ts +0 -349
  226. package/dist/ops/commit-traversal.d.ts.map +0 -1
  227. package/dist/ops/commit-traversal.js +0 -821
  228. package/dist/ops/commit-traversal.js.map +0 -1
  229. package/dist/ops/commit.d.ts +0 -555
  230. package/dist/ops/commit.d.ts.map +0 -1
  231. package/dist/ops/commit.js +0 -826
  232. package/dist/ops/commit.js.map +0 -1
  233. package/dist/ops/merge-base.d.ts +0 -397
  234. package/dist/ops/merge-base.d.ts.map +0 -1
  235. package/dist/ops/merge-base.js +0 -691
  236. package/dist/ops/merge-base.js.map +0 -1
  237. package/dist/ops/merge.d.ts +0 -855
  238. package/dist/ops/merge.d.ts.map +0 -1
  239. package/dist/ops/merge.js +0 -1551
  240. package/dist/ops/merge.js.map +0 -1
  241. package/dist/ops/tag.d.ts +0 -247
  242. package/dist/ops/tag.d.ts.map +0 -1
  243. package/dist/ops/tag.js +0 -649
  244. package/dist/ops/tag.js.map +0 -1
  245. package/dist/ops/tree-builder.d.ts +0 -178
  246. package/dist/ops/tree-builder.d.ts.map +0 -1
  247. package/dist/ops/tree-builder.js +0 -271
  248. package/dist/ops/tree-builder.js.map +0 -1
  249. package/dist/ops/tree-diff.d.ts +0 -291
  250. package/dist/ops/tree-diff.d.ts.map +0 -1
  251. package/dist/ops/tree-diff.js +0 -705
  252. package/dist/ops/tree-diff.js.map +0 -1
  253. package/dist/pack/delta.d.ts +0 -248
  254. package/dist/pack/delta.d.ts.map +0 -1
  255. package/dist/pack/delta.js +0 -740
  256. package/dist/pack/delta.js.map +0 -1
  257. package/dist/pack/format.d.ts +0 -446
  258. package/dist/pack/format.d.ts.map +0 -1
  259. package/dist/pack/format.js +0 -572
  260. package/dist/pack/format.js.map +0 -1
  261. package/dist/pack/full-generation.d.ts +0 -612
  262. package/dist/pack/full-generation.d.ts.map +0 -1
  263. package/dist/pack/full-generation.js +0 -1378
  264. package/dist/pack/full-generation.js.map +0 -1
  265. package/dist/pack/generation.d.ts +0 -441
  266. package/dist/pack/generation.d.ts.map +0 -1
  267. package/dist/pack/generation.js +0 -707
  268. package/dist/pack/generation.js.map +0 -1
  269. package/dist/pack/index.d.ts +0 -502
  270. package/dist/pack/index.d.ts.map +0 -1
  271. package/dist/pack/index.js +0 -833
  272. package/dist/pack/index.js.map +0 -1
  273. package/dist/refs/branch.d.ts +0 -683
  274. package/dist/refs/branch.d.ts.map +0 -1
  275. package/dist/refs/branch.js +0 -881
  276. package/dist/refs/branch.js.map +0 -1
  277. package/dist/refs/storage.d.ts +0 -833
  278. package/dist/refs/storage.d.ts.map +0 -1
  279. package/dist/refs/storage.js +0 -1023
  280. package/dist/refs/storage.js.map +0 -1
  281. package/dist/refs/tag.d.ts +0 -860
  282. package/dist/refs/tag.d.ts.map +0 -1
  283. package/dist/refs/tag.js +0 -996
  284. package/dist/refs/tag.js.map +0 -1
  285. package/dist/storage/backend.d.ts +0 -425
  286. package/dist/storage/backend.d.ts.map +0 -1
  287. package/dist/storage/backend.js +0 -41
  288. package/dist/storage/backend.js.map +0 -1
  289. package/dist/storage/fsx-adapter.d.ts +0 -204
  290. package/dist/storage/fsx-adapter.d.ts.map +0 -1
  291. package/dist/storage/fsx-adapter.js +0 -518
  292. package/dist/storage/fsx-adapter.js.map +0 -1
  293. package/dist/storage/lru-cache.d.ts +0 -691
  294. package/dist/storage/lru-cache.d.ts.map +0 -1
  295. package/dist/storage/lru-cache.js +0 -813
  296. package/dist/storage/lru-cache.js.map +0 -1
  297. package/dist/storage/object-index.d.ts +0 -585
  298. package/dist/storage/object-index.d.ts.map +0 -1
  299. package/dist/storage/object-index.js +0 -532
  300. package/dist/storage/object-index.js.map +0 -1
  301. package/dist/storage/r2-pack.d.ts +0 -1257
  302. package/dist/storage/r2-pack.d.ts.map +0 -1
  303. package/dist/storage/r2-pack.js +0 -1773
  304. package/dist/storage/r2-pack.js.map +0 -1
  305. package/dist/tiered/cdc-pipeline.d.ts +0 -1888
  306. package/dist/tiered/cdc-pipeline.d.ts.map +0 -1
  307. package/dist/tiered/cdc-pipeline.js +0 -1880
  308. package/dist/tiered/cdc-pipeline.js.map +0 -1
  309. package/dist/tiered/migration.d.ts +0 -1104
  310. package/dist/tiered/migration.d.ts.map +0 -1
  311. package/dist/tiered/migration.js +0 -1217
  312. package/dist/tiered/migration.js.map +0 -1
  313. package/dist/tiered/parquet-writer.d.ts +0 -1145
  314. package/dist/tiered/parquet-writer.d.ts.map +0 -1
  315. package/dist/tiered/parquet-writer.js +0 -1183
  316. package/dist/tiered/parquet-writer.js.map +0 -1
  317. package/dist/tiered/read-path.d.ts +0 -835
  318. package/dist/tiered/read-path.d.ts.map +0 -1
  319. package/dist/tiered/read-path.js +0 -487
  320. package/dist/tiered/read-path.js.map +0 -1
  321. package/dist/types/capability.d.ts +0 -1385
  322. package/dist/types/capability.d.ts.map +0 -1
  323. package/dist/types/capability.js +0 -36
  324. package/dist/types/capability.js.map +0 -1
  325. package/dist/types/index.d.ts +0 -13
  326. package/dist/types/index.d.ts.map +0 -1
  327. package/dist/types/index.js +0 -18
  328. package/dist/types/index.js.map +0 -1
  329. package/dist/types/interfaces.d.ts +0 -673
  330. package/dist/types/interfaces.d.ts.map +0 -1
  331. package/dist/types/interfaces.js +0 -26
  332. package/dist/types/interfaces.js.map +0 -1
  333. package/dist/types/objects.d.ts +0 -692
  334. package/dist/types/objects.d.ts.map +0 -1
  335. package/dist/types/objects.js +0 -837
  336. package/dist/types/objects.js.map +0 -1
  337. package/dist/types/storage.d.ts +0 -603
  338. package/dist/types/storage.d.ts.map +0 -1
  339. package/dist/types/storage.js +0 -191
  340. package/dist/types/storage.js.map +0 -1
  341. package/dist/types/worker-loader.d.ts +0 -60
  342. package/dist/types/worker-loader.d.ts.map +0 -1
  343. package/dist/types/worker-loader.js +0 -62
  344. package/dist/types/worker-loader.js.map +0 -1
  345. package/dist/utils/hash.d.ts +0 -198
  346. package/dist/utils/hash.d.ts.map +0 -1
  347. package/dist/utils/hash.js +0 -272
  348. package/dist/utils/hash.js.map +0 -1
  349. package/dist/utils/sha1.d.ts +0 -325
  350. package/dist/utils/sha1.d.ts.map +0 -1
  351. package/dist/utils/sha1.js +0 -635
  352. package/dist/utils/sha1.js.map +0 -1
  353. package/dist/wire/capabilities.d.ts +0 -1044
  354. package/dist/wire/capabilities.d.ts.map +0 -1
  355. package/dist/wire/capabilities.js +0 -941
  356. package/dist/wire/capabilities.js.map +0 -1
  357. package/dist/wire/path-security.d.ts +0 -157
  358. package/dist/wire/path-security.d.ts.map +0 -1
  359. package/dist/wire/path-security.js +0 -307
  360. package/dist/wire/path-security.js.map +0 -1
  361. package/dist/wire/pkt-line.d.ts +0 -345
  362. package/dist/wire/pkt-line.d.ts.map +0 -1
  363. package/dist/wire/pkt-line.js +0 -381
  364. package/dist/wire/pkt-line.js.map +0 -1
  365. package/dist/wire/receive-pack.d.ts +0 -1059
  366. package/dist/wire/receive-pack.d.ts.map +0 -1
  367. package/dist/wire/receive-pack.js +0 -1414
  368. package/dist/wire/receive-pack.js.map +0 -1
  369. package/dist/wire/smart-http.d.ts +0 -799
  370. package/dist/wire/smart-http.d.ts.map +0 -1
  371. package/dist/wire/smart-http.js +0 -945
  372. package/dist/wire/smart-http.js.map +0 -1
  373. package/dist/wire/upload-pack.d.ts +0 -727
  374. package/dist/wire/upload-pack.d.ts.map +0 -1
  375. package/dist/wire/upload-pack.js +0 -1141
  376. package/dist/wire/upload-pack.js.map +0 -1
@@ -1,731 +0,0 @@
1
- /**
2
- * @fileoverview Cloudflare Container Executor Integration
3
- *
4
- * This module provides executor implementations for running bash commands
5
- * in Cloudflare Containers. It supports multiple execution modes:
6
- *
7
- * - HTTP-based execution with the Sandbox SDK (exec/execStream)
8
- * - WebSocket streaming for interactive sessions
9
- * - Session isolation for multi-tenant environments
10
- *
11
- * @module do/container-executor
12
- *
13
- * @example
14
- * ```typescript
15
- * import { CloudflareContainerExecutor } from 'gitx.do/do'
16
- *
17
- * const executor = new CloudflareContainerExecutor({
18
- * sandbox: env.Sandbox,
19
- * sessionId: 'user-123',
20
- * })
21
- *
22
- * const result = await executor.execute('ls -la')
23
- * console.log(result.stdout)
24
- * ```
25
- */
26
- // ============================================================================
27
- // CloudflareContainerExecutor Class
28
- // ============================================================================
29
- /**
30
- * CloudflareContainerExecutor - Execute bash commands in Cloudflare Containers.
31
- *
32
- * This executor implements the BashExecutor interface and supports multiple
33
- * execution backends:
34
- *
35
- * 1. **Sandbox SDK**: Uses `exec()` and `execStream()` from @cloudflare/sandbox
36
- * 2. **HTTP Exec**: Sends commands to an HTTP endpoint in the container
37
- * 3. **WebSocket Streaming**: Connects to container via WebSocket for streaming
38
- *
39
- * @example
40
- * ```typescript
41
- * // Using Sandbox SDK
42
- * const executor = new CloudflareContainerExecutor({
43
- * sandbox: env.Sandbox,
44
- * sessionId: 'session-123',
45
- * })
46
- *
47
- * // Execute a command
48
- * const result = await executor.execute('npm install')
49
- *
50
- * // Spawn for streaming
51
- * const handle = await executor.spawn('npm', ['run', 'dev'], {
52
- * onStdout: (chunk) => console.log(chunk),
53
- * onStderr: (chunk) => console.error(chunk),
54
- * })
55
- * ```
56
- *
57
- * @example
58
- * ```typescript
59
- * // Using HTTP exec endpoint
60
- * const executor = new CloudflareContainerExecutor({
61
- * httpExecEndpoint: 'https://container.example.com/exec',
62
- * sessionId: 'session-456',
63
- * })
64
- *
65
- * const result = await executor.execute('ls -la')
66
- * ```
67
- */
68
- export class CloudflareContainerExecutor {
69
- sandbox;
70
- container;
71
- sessionId;
72
- defaultCwd;
73
- defaultTimeout;
74
- defaultEnv;
75
- wsEndpoint;
76
- httpExecEndpoint;
77
- fetchFn;
78
- /**
79
- * Session state for isolation.
80
- */
81
- session;
82
- /**
83
- * Process ID counter for spawn handles.
84
- */
85
- pidCounter = 1000;
86
- /**
87
- * Create a new CloudflareContainerExecutor.
88
- *
89
- * @param options - Configuration options
90
- */
91
- constructor(options = {}) {
92
- this.sandbox = options.sandbox;
93
- this.container = options.container;
94
- this.sessionId = options.sessionId ?? crypto.randomUUID();
95
- this.defaultCwd = options.cwd ?? '/';
96
- this.defaultTimeout = options.timeout ?? 30000;
97
- this.defaultEnv = options.env ?? {};
98
- this.wsEndpoint = options.wsEndpoint;
99
- this.httpExecEndpoint = options.httpExecEndpoint;
100
- this.fetchFn = options.fetch ?? globalThis.fetch.bind(globalThis);
101
- // Initialize session state
102
- this.session = {
103
- id: this.sessionId,
104
- cwd: this.defaultCwd,
105
- env: { ...this.defaultEnv },
106
- processes: new Map(),
107
- lastActivity: Date.now(),
108
- };
109
- }
110
- // ===========================================================================
111
- // BashExecutor Interface
112
- // ===========================================================================
113
- /**
114
- * Execute a command and return the result.
115
- *
116
- * @param command - The command to execute
117
- * @param options - Execution options
118
- * @returns Promise resolving to the execution result
119
- */
120
- async execute(command, options) {
121
- this.session.lastActivity = Date.now();
122
- const cwd = options?.cwd ?? this.session.cwd;
123
- const timeout = options?.timeout ?? this.defaultTimeout;
124
- const env = { ...this.session.env, ...options?.env };
125
- // Try sandbox SDK first
126
- if (this.sandbox) {
127
- return this.executeViaSandbox(command, { cwd, timeout, env, stdin: options?.stdin });
128
- }
129
- // Try HTTP exec endpoint
130
- if (this.httpExecEndpoint) {
131
- return this.executeViaHttp(command, { cwd, timeout, env, stdin: options?.stdin });
132
- }
133
- // Try container fetch with custom exec endpoint
134
- if (this.container) {
135
- return this.executeViaContainer(command, { cwd, timeout, env, stdin: options?.stdin });
136
- }
137
- // No execution backend available
138
- return {
139
- command,
140
- stdout: '',
141
- stderr: 'No execution backend configured (sandbox, httpExecEndpoint, or container required)',
142
- exitCode: 1,
143
- };
144
- }
145
- /**
146
- * Spawn a command for streaming execution.
147
- *
148
- * @param command - The command to spawn
149
- * @param args - Command arguments
150
- * @param options - Spawn options
151
- * @returns Promise resolving to a spawn handle
152
- */
153
- async spawn(command, args, options) {
154
- this.session.lastActivity = Date.now();
155
- const fullCommand = args?.length ? `${command} ${args.join(' ')}` : command;
156
- const cwd = options?.cwd ?? this.session.cwd;
157
- const timeout = options?.timeout ?? this.defaultTimeout;
158
- const env = { ...this.session.env, ...options?.env };
159
- // Try sandbox SDK streaming
160
- if (this.sandbox?.execStream) {
161
- return this.spawnViaSandbox(fullCommand, { cwd, timeout, env }, options);
162
- }
163
- // Try WebSocket streaming
164
- if (this.wsEndpoint) {
165
- return this.spawnViaWebSocket(fullCommand, { cwd, timeout, env }, options);
166
- }
167
- // Try sandbox startProcess
168
- if (this.sandbox?.startProcess) {
169
- return this.spawnViaProcess(fullCommand, { cwd, timeout, env }, options);
170
- }
171
- // Fallback: execute and simulate streaming
172
- return this.spawnViaExec(fullCommand, { cwd, timeout, env }, options);
173
- }
174
- // ===========================================================================
175
- // Sandbox SDK Execution
176
- // ===========================================================================
177
- /**
178
- * Execute a command using the Sandbox SDK.
179
- */
180
- async executeViaSandbox(command, options) {
181
- try {
182
- const result = await this.sandbox.exec(command, options);
183
- return {
184
- command,
185
- stdout: result.stdout,
186
- stderr: result.stderr,
187
- exitCode: result.exitCode,
188
- };
189
- }
190
- catch (error) {
191
- return {
192
- command,
193
- stdout: '',
194
- stderr: error instanceof Error ? error.message : String(error),
195
- exitCode: 1,
196
- };
197
- }
198
- }
199
- /**
200
- * Spawn a command using Sandbox SDK streaming.
201
- */
202
- async spawnViaSandbox(command, execOptions, spawnOptions) {
203
- const pid = this.pidCounter++;
204
- let abortController = null;
205
- const streamResult = await this.sandbox.execStream(command, execOptions);
206
- abortController = { abort: streamResult.abort };
207
- // Process the stream
208
- const reader = streamResult.stream.getReader();
209
- const processStream = async () => {
210
- let stdout = '';
211
- let stderr = '';
212
- let exitCode = 0;
213
- try {
214
- while (true) {
215
- const { done, value } = await reader.read();
216
- if (done)
217
- break;
218
- if (value.type === 'stdout') {
219
- const data = String(value.data);
220
- stdout += data;
221
- spawnOptions?.onStdout?.(data);
222
- }
223
- else if (value.type === 'stderr') {
224
- const data = String(value.data);
225
- stderr += data;
226
- spawnOptions?.onStderr?.(data);
227
- }
228
- else if (value.type === 'exit') {
229
- exitCode = Number(value.data);
230
- }
231
- }
232
- }
233
- catch (error) {
234
- stderr += error instanceof Error ? error.message : String(error);
235
- exitCode = 1;
236
- }
237
- spawnOptions?.onExit?.(exitCode);
238
- return { command, stdout, stderr, exitCode };
239
- };
240
- const donePromise = processStream();
241
- const handle = {
242
- pid,
243
- done: donePromise,
244
- kill: (_signal) => {
245
- abortController?.abort();
246
- },
247
- write: (_data) => {
248
- // Sandbox stream doesn't support stdin writing
249
- },
250
- closeStdin: () => {
251
- // No-op for sandbox stream
252
- },
253
- };
254
- return handle;
255
- }
256
- /**
257
- * Spawn a command using Sandbox SDK startProcess.
258
- */
259
- async spawnViaProcess(command, execOptions, spawnOptions) {
260
- const processHandle = await this.sandbox.startProcess(command, execOptions);
261
- const pid = processHandle.pid;
262
- // Track the process
263
- this.session.processes.set(pid, processHandle);
264
- // Set up exit handling
265
- const donePromise = processHandle.exited.then(result => {
266
- this.session.processes.delete(pid);
267
- spawnOptions?.onExit?.(result.exitCode);
268
- return {
269
- command,
270
- stdout: result.stdout,
271
- stderr: result.stderr,
272
- exitCode: result.exitCode,
273
- };
274
- });
275
- const handle = {
276
- pid,
277
- done: donePromise,
278
- kill: (signal) => {
279
- processHandle.kill(signal);
280
- },
281
- write: (data) => {
282
- processHandle.write(data);
283
- },
284
- closeStdin: () => {
285
- processHandle.closeStdin();
286
- },
287
- };
288
- return handle;
289
- }
290
- // ===========================================================================
291
- // HTTP Exec Execution
292
- // ===========================================================================
293
- /**
294
- * Execute a command via HTTP exec endpoint.
295
- */
296
- async executeViaHttp(command, options) {
297
- try {
298
- const response = await this.fetchFn(this.httpExecEndpoint, {
299
- method: 'POST',
300
- headers: {
301
- 'Content-Type': 'application/json',
302
- 'X-Session-Id': this.sessionId,
303
- },
304
- body: JSON.stringify({
305
- command,
306
- cwd: options.cwd,
307
- env: options.env,
308
- timeout: options.timeout,
309
- stdin: options.stdin,
310
- }),
311
- });
312
- if (!response.ok) {
313
- const errorText = await response.text();
314
- return {
315
- command,
316
- stdout: '',
317
- stderr: `HTTP exec failed: ${response.status} ${errorText}`,
318
- exitCode: 1,
319
- };
320
- }
321
- const result = await response.json();
322
- return {
323
- command,
324
- stdout: result.stdout ?? '',
325
- stderr: result.stderr ?? '',
326
- exitCode: result.exitCode ?? (result.success ? 0 : 1),
327
- };
328
- }
329
- catch (error) {
330
- return {
331
- command,
332
- stdout: '',
333
- stderr: error instanceof Error ? error.message : String(error),
334
- exitCode: 1,
335
- };
336
- }
337
- }
338
- // ===========================================================================
339
- // Container Fetch Execution
340
- // ===========================================================================
341
- /**
342
- * Execute a command via container fetch.
343
- */
344
- async executeViaContainer(command, options) {
345
- try {
346
- // Build the request to the container's exec endpoint
347
- const container = this.container;
348
- const request = new Request('http://container/exec', {
349
- method: 'POST',
350
- headers: {
351
- 'Content-Type': 'application/json',
352
- 'X-Session-Id': this.sessionId,
353
- },
354
- body: JSON.stringify({
355
- command,
356
- cwd: options.cwd,
357
- env: options.env,
358
- timeout: options.timeout,
359
- stdin: options.stdin,
360
- }),
361
- });
362
- const response = await container.fetch(request);
363
- if (!response.ok) {
364
- const errorText = await response.text();
365
- return {
366
- command,
367
- stdout: '',
368
- stderr: `Container exec failed: ${response.status} ${errorText}`,
369
- exitCode: 1,
370
- };
371
- }
372
- const result = await response.json();
373
- return {
374
- command,
375
- stdout: result.stdout ?? '',
376
- stderr: result.stderr ?? '',
377
- exitCode: result.exitCode ?? (result.success ? 0 : 1),
378
- };
379
- }
380
- catch (error) {
381
- return {
382
- command,
383
- stdout: '',
384
- stderr: error instanceof Error ? error.message : String(error),
385
- exitCode: 1,
386
- };
387
- }
388
- }
389
- // ===========================================================================
390
- // WebSocket Streaming
391
- // ===========================================================================
392
- /**
393
- * Spawn a command via WebSocket connection.
394
- */
395
- async spawnViaWebSocket(command, execOptions, spawnOptions) {
396
- const pid = this.pidCounter++;
397
- let ws = null;
398
- const { promise: donePromise, resolve: resolveDone } = withResolvers();
399
- let stdout = '';
400
- let stderr = '';
401
- let exitCode = 0;
402
- try {
403
- // Build WebSocket URL with session and command info
404
- const wsUrl = new URL(this.wsEndpoint);
405
- wsUrl.searchParams.set('session', this.sessionId);
406
- wsUrl.searchParams.set('command', command);
407
- if (execOptions.cwd)
408
- wsUrl.searchParams.set('cwd', execOptions.cwd);
409
- // Create WebSocket connection
410
- ws = new WebSocket(wsUrl.toString());
411
- ws.addEventListener('open', () => {
412
- // Send initial configuration
413
- ws.send(JSON.stringify({
414
- type: 'init',
415
- env: execOptions.env,
416
- timeout: execOptions.timeout,
417
- }));
418
- });
419
- ws.addEventListener('message', (event) => {
420
- try {
421
- const message = JSON.parse(String(event.data));
422
- switch (message.type) {
423
- case 'stdout': {
424
- const outData = String(message.data ?? '');
425
- stdout += outData;
426
- spawnOptions?.onStdout?.(outData);
427
- break;
428
- }
429
- case 'stderr': {
430
- const errData = String(message.data ?? '');
431
- stderr += errData;
432
- spawnOptions?.onStderr?.(errData);
433
- break;
434
- }
435
- case 'exit':
436
- exitCode = Number(message.data ?? 0);
437
- ws?.close();
438
- break;
439
- case 'error':
440
- stderr += String(message.data ?? '');
441
- exitCode = 1;
442
- ws?.close();
443
- break;
444
- }
445
- }
446
- catch {
447
- // Handle non-JSON messages as stdout
448
- const data = String(event.data);
449
- stdout += data;
450
- spawnOptions?.onStdout?.(data);
451
- }
452
- });
453
- ws.addEventListener('close', () => {
454
- spawnOptions?.onExit?.(exitCode);
455
- resolveDone({ command, stdout, stderr, exitCode });
456
- });
457
- ws.addEventListener('error', (event) => {
458
- stderr += `WebSocket error: ${event}`;
459
- exitCode = 1;
460
- });
461
- }
462
- catch (error) {
463
- stderr = error instanceof Error ? error.message : String(error);
464
- exitCode = 1;
465
- resolveDone({ command, stdout, stderr, exitCode });
466
- }
467
- const handle = {
468
- pid,
469
- done: donePromise,
470
- kill: (signal) => {
471
- if (ws && ws.readyState === WebSocket.OPEN) {
472
- ws.send(JSON.stringify({ type: 'signal', signal: signal ?? 'SIGTERM' }));
473
- ws.close();
474
- }
475
- },
476
- write: (data) => {
477
- if (ws && ws.readyState === WebSocket.OPEN) {
478
- ws.send(JSON.stringify({ type: 'stdin', data }));
479
- }
480
- },
481
- closeStdin: () => {
482
- if (ws && ws.readyState === WebSocket.OPEN) {
483
- ws.send(JSON.stringify({ type: 'stdin_close' }));
484
- }
485
- },
486
- };
487
- return handle;
488
- }
489
- /**
490
- * Spawn a command by executing and simulating streaming output.
491
- */
492
- async spawnViaExec(command, execOptions, spawnOptions) {
493
- const pid = this.pidCounter++;
494
- const executeAndStream = async () => {
495
- const result = await this.execute(command, {
496
- cwd: execOptions.cwd,
497
- timeout: execOptions.timeout,
498
- env: execOptions.env,
499
- stdin: execOptions.stdin,
500
- });
501
- // Simulate streaming by emitting all output at once
502
- if (result.stdout) {
503
- spawnOptions?.onStdout?.(result.stdout);
504
- }
505
- if (result.stderr) {
506
- spawnOptions?.onStderr?.(result.stderr);
507
- }
508
- spawnOptions?.onExit?.(result.exitCode);
509
- return result;
510
- };
511
- const handle = {
512
- pid,
513
- done: executeAndStream(),
514
- kill: () => {
515
- // Cannot kill a non-streaming execution
516
- },
517
- write: () => {
518
- // Cannot write to a non-streaming execution
519
- },
520
- closeStdin: () => {
521
- // No-op
522
- },
523
- };
524
- return handle;
525
- }
526
- // ===========================================================================
527
- // Session Management
528
- // ===========================================================================
529
- /**
530
- * Get the current session ID.
531
- *
532
- * @returns The session ID
533
- */
534
- getSessionId() {
535
- return this.sessionId;
536
- }
537
- /**
538
- * Get the current session state.
539
- *
540
- * @returns Copy of the session state
541
- */
542
- getSessionState() {
543
- return {
544
- id: this.session.id,
545
- cwd: this.session.cwd,
546
- env: { ...this.session.env },
547
- lastActivity: this.session.lastActivity,
548
- processCount: this.session.processes.size,
549
- };
550
- }
551
- /**
552
- * Update the session working directory.
553
- *
554
- * @param cwd - New working directory
555
- */
556
- setCwd(cwd) {
557
- this.session.cwd = cwd;
558
- }
559
- /**
560
- * Update session environment variables.
561
- *
562
- * @param env - Environment variables to set
563
- */
564
- setEnv(env) {
565
- Object.assign(this.session.env, env);
566
- }
567
- /**
568
- * Unset session environment variables.
569
- *
570
- * @param keys - Environment variable keys to unset
571
- */
572
- unsetEnv(keys) {
573
- for (const key of keys) {
574
- delete this.session.env[key];
575
- }
576
- }
577
- /**
578
- * Get the number of active processes.
579
- *
580
- * @returns Number of active processes
581
- */
582
- getActiveProcessCount() {
583
- return this.session.processes.size;
584
- }
585
- /**
586
- * Kill all active processes.
587
- *
588
- * @param signal - Signal to send (default: SIGTERM)
589
- */
590
- async killAll(signal = 'SIGTERM') {
591
- const kills = Array.from(this.session.processes.values()).map(handle => handle.kill(signal));
592
- await Promise.all(kills);
593
- this.session.processes.clear();
594
- }
595
- // ===========================================================================
596
- // File Operations (when sandbox supports it)
597
- // ===========================================================================
598
- /**
599
- * Write a file to the container filesystem.
600
- *
601
- * @param path - File path
602
- * @param content - File content
603
- */
604
- async writeFile(path, content) {
605
- if (this.sandbox?.writeFile) {
606
- await this.sandbox.writeFile(path, content);
607
- }
608
- else if (this.httpExecEndpoint) {
609
- // Use HTTP endpoint for file writing
610
- const bodyContent = typeof content === 'string' ? content : new Uint8Array(content).buffer;
611
- await this.fetchFn(this.httpExecEndpoint.replace('/exec', '/file'), {
612
- method: 'PUT',
613
- headers: {
614
- 'Content-Type': 'application/octet-stream',
615
- 'X-Session-Id': this.sessionId,
616
- 'X-File-Path': path,
617
- },
618
- body: bodyContent,
619
- });
620
- }
621
- else {
622
- throw new Error('File operations not supported by this executor');
623
- }
624
- }
625
- /**
626
- * Read a file from the container filesystem.
627
- *
628
- * @param path - File path
629
- * @returns File content
630
- */
631
- async readFile(path) {
632
- if (this.sandbox?.readFile) {
633
- return await this.sandbox.readFile(path);
634
- }
635
- else if (this.httpExecEndpoint) {
636
- // Use HTTP endpoint for file reading
637
- const response = await this.fetchFn(this.httpExecEndpoint.replace('/exec', '/file'), {
638
- method: 'GET',
639
- headers: {
640
- 'X-Session-Id': this.sessionId,
641
- 'X-File-Path': path,
642
- },
643
- });
644
- if (!response.ok) {
645
- throw new Error(`File read failed: ${response.status}`);
646
- }
647
- return await response.text();
648
- }
649
- else {
650
- throw new Error('File operations not supported by this executor');
651
- }
652
- }
653
- }
654
- // ============================================================================
655
- // Factory Functions
656
- // ============================================================================
657
- /**
658
- * Create a CloudflareContainerExecutor instance.
659
- *
660
- * @param options - Configuration options
661
- * @returns A new CloudflareContainerExecutor instance
662
- *
663
- * @example
664
- * ```typescript
665
- * const executor = createContainerExecutor({
666
- * sandbox: env.Sandbox,
667
- * sessionId: 'user-123',
668
- * })
669
- * ```
670
- */
671
- export function createContainerExecutor(options = {}) {
672
- return new CloudflareContainerExecutor(options);
673
- }
674
- /**
675
- * Create an executor from a Sandbox binding.
676
- *
677
- * @param sandbox - Cloudflare Sandbox binding
678
- * @param sessionId - Optional session ID for isolation
679
- * @returns A new CloudflareContainerExecutor instance
680
- */
681
- export function createSandboxExecutor(sandbox, sessionId) {
682
- return new CloudflareContainerExecutor({ sandbox, sessionId });
683
- }
684
- /**
685
- * Create an executor from an HTTP exec endpoint.
686
- *
687
- * @param endpoint - HTTP exec endpoint URL
688
- * @param sessionId - Optional session ID for isolation
689
- * @returns A new CloudflareContainerExecutor instance
690
- */
691
- export function createHttpExecutor(endpoint, sessionId) {
692
- return new CloudflareContainerExecutor({ httpExecEndpoint: endpoint, sessionId });
693
- }
694
- /**
695
- * Create an executor from a WebSocket endpoint.
696
- *
697
- * @param endpoint - WebSocket endpoint URL
698
- * @param sessionId - Optional session ID for isolation
699
- * @returns A new CloudflareContainerExecutor instance
700
- */
701
- export function createWebSocketExecutor(endpoint, sessionId) {
702
- return new CloudflareContainerExecutor({ wsEndpoint: endpoint, sessionId });
703
- }
704
- // ============================================================================
705
- // Type Guards
706
- // ============================================================================
707
- /**
708
- * Check if a value is a CloudflareContainerExecutor instance.
709
- *
710
- * @param value - Value to check
711
- * @returns True if value is a CloudflareContainerExecutor
712
- */
713
- export function isContainerExecutor(value) {
714
- return value instanceof CloudflareContainerExecutor;
715
- }
716
- // ============================================================================
717
- // Helper Functions
718
- // ============================================================================
719
- /**
720
- * Promise.withResolvers polyfill for older environments.
721
- */
722
- function withResolvers() {
723
- let resolve;
724
- let reject;
725
- const promise = new Promise((res, rej) => {
726
- resolve = res;
727
- reject = rej;
728
- });
729
- return { promise, resolve: resolve, reject: reject };
730
- }
731
- //# sourceMappingURL=container-executor.js.map