devchain-cli 0.24.1 → 0.24.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 (343) hide show
  1. package/dist/build-info.json +2 -2
  2. package/dist/cli.js +40 -10
  3. package/dist/host-install/devchain-host-bootstrap.tgz +0 -0
  4. package/dist/host-install/pins.json +31 -2
  5. package/dist/lib/exclusive-run.js +51 -3
  6. package/dist/lib/git-owner.js +284 -0
  7. package/dist/lib/host-install.js +19 -151
  8. package/dist/lib/local-api.js +175 -0
  9. package/dist/server/common/config/env.config.d.ts +3 -0
  10. package/dist/server/common/config/env.config.js +1 -0
  11. package/dist/server/common/config/env.config.js.map +1 -1
  12. package/dist/server/common/config/host-image.json +3 -3
  13. package/dist/server/common/constants/syncthing-markers.d.ts +1 -0
  14. package/dist/server/common/constants/syncthing-markers.js +6 -1
  15. package/dist/server/common/constants/syncthing-markers.js.map +1 -1
  16. package/dist/server/common/filesystem/vm-home-path.d.ts +11 -0
  17. package/dist/server/common/filesystem/vm-home-path.js +48 -0
  18. package/dist/server/common/filesystem/vm-home-path.js.map +1 -0
  19. package/dist/server/common/process-ids-env.d.ts +1 -0
  20. package/dist/server/common/process-ids-env.js +13 -0
  21. package/dist/server/common/process-ids-env.js.map +1 -0
  22. package/dist/server/common/test/api-test-app.d.ts +12 -0
  23. package/dist/server/common/test/api-test-app.js +76 -0
  24. package/dist/server/common/test/api-test-app.js.map +1 -0
  25. package/dist/server/common/test/app-bootstrap.helper.js +8 -1
  26. package/dist/server/common/test/app-bootstrap.helper.js.map +1 -1
  27. package/dist/server/common/test/fake-bootstrap.server.js +3 -2
  28. package/dist/server/common/test/fake-bootstrap.server.js.map +1 -1
  29. package/dist/server/common/test/fake-docker-engine.server.d.ts +17 -6
  30. package/dist/server/common/test/fake-docker-engine.server.js +77 -33
  31. package/dist/server/common/test/fake-docker-engine.server.js.map +1 -1
  32. package/dist/server/common/test/fake-proxmox.server.js +4 -4
  33. package/dist/server/common/test/fake-ssh.server.js +6 -6
  34. package/dist/server/common/test/fake-ssh.server.js.map +1 -1
  35. package/dist/server/common/test/test-database.helper.d.ts +6 -0
  36. package/dist/server/common/test/test-database.helper.js +29 -0
  37. package/dist/server/common/test/test-database.helper.js.map +1 -0
  38. package/dist/server/modules/core/controllers/docker-archive.js +1 -1
  39. package/dist/server/modules/core/controllers/docker-archive.js.map +1 -1
  40. package/dist/server/modules/core/controllers/docker-engine.client.d.ts +2 -1
  41. package/dist/server/modules/core/controllers/docker-engine.client.js +8 -4
  42. package/dist/server/modules/core/controllers/docker-engine.client.js.map +1 -1
  43. package/dist/server/modules/core/controllers/docker-image-metadata.d.ts +248 -0
  44. package/dist/server/modules/core/controllers/docker-image-metadata.js +161 -0
  45. package/dist/server/modules/core/controllers/docker-image-metadata.js.map +1 -0
  46. package/dist/server/modules/core/controllers/docker-settings.d.ts +13 -2
  47. package/dist/server/modules/core/controllers/docker-settings.js +49 -11
  48. package/dist/server/modules/core/controllers/docker-settings.js.map +1 -1
  49. package/dist/server/modules/core/controllers/host-user-identity.d.ts +34 -0
  50. package/dist/server/modules/core/controllers/host-user-identity.js +23 -0
  51. package/dist/server/modules/core/controllers/host-user-identity.js.map +1 -0
  52. package/dist/server/modules/core/controllers/runtime.controller.d.ts +11 -4
  53. package/dist/server/modules/core/controllers/runtime.controller.js +2 -0
  54. package/dist/server/modules/core/controllers/runtime.controller.js.map +1 -1
  55. package/dist/server/modules/file-sync/build-exclusion-suggestions.d.ts +15 -0
  56. package/dist/server/modules/file-sync/build-exclusion-suggestions.js +402 -0
  57. package/dist/server/modules/file-sync/build-exclusion-suggestions.js.map +1 -0
  58. package/dist/server/modules/file-sync/file-sync-auto-fix.dto.d.ts +102 -0
  59. package/dist/server/modules/file-sync/file-sync-auto-fix.dto.js +22 -0
  60. package/dist/server/modules/file-sync/file-sync-auto-fix.dto.js.map +1 -0
  61. package/dist/server/modules/file-sync/file-sync-auto-fix.store.d.ts +12 -0
  62. package/dist/server/modules/file-sync/file-sync-auto-fix.store.js +73 -0
  63. package/dist/server/modules/file-sync/file-sync-auto-fix.store.js.map +1 -0
  64. package/dist/server/modules/file-sync/file-sync-conflicts.d.ts +3 -0
  65. package/dist/server/modules/file-sync/file-sync-conflicts.js +191 -0
  66. package/dist/server/modules/file-sync/file-sync-conflicts.js.map +1 -0
  67. package/dist/server/modules/file-sync/file-sync-ignores.store.d.ts +5 -1
  68. package/dist/server/modules/file-sync/file-sync-ignores.store.js +39 -8
  69. package/dist/server/modules/file-sync/file-sync-ignores.store.js.map +1 -1
  70. package/dist/server/modules/file-sync/file-sync.controller.d.ts +1 -3
  71. package/dist/server/modules/file-sync/file-sync.controller.js +5 -14
  72. package/dist/server/modules/file-sync/file-sync.controller.js.map +1 -1
  73. package/dist/server/modules/file-sync/file-sync.dto.d.ts +220 -1
  74. package/dist/server/modules/file-sync/file-sync.dto.js +70 -4
  75. package/dist/server/modules/file-sync/file-sync.dto.js.map +1 -1
  76. package/dist/server/modules/file-sync/file-sync.module.js +16 -1
  77. package/dist/server/modules/file-sync/file-sync.module.js.map +1 -1
  78. package/dist/server/modules/file-sync/file-sync.service.d.ts +18 -4
  79. package/dist/server/modules/file-sync/file-sync.service.js +166 -34
  80. package/dist/server/modules/file-sync/file-sync.service.js.map +1 -1
  81. package/dist/server/modules/file-sync/git-guard.dto.d.ts +61 -0
  82. package/dist/server/modules/file-sync/git-guard.dto.js +26 -0
  83. package/dist/server/modules/file-sync/git-guard.dto.js.map +1 -0
  84. package/dist/server/modules/file-sync/home-git-guard.service.d.ts +4 -2
  85. package/dist/server/modules/file-sync/home-git-guard.service.js +50 -25
  86. package/dist/server/modules/file-sync/home-git-guard.service.js.map +1 -1
  87. package/dist/server/modules/file-sync/host-git-guard.controller.d.ts +10 -0
  88. package/dist/server/modules/file-sync/host-git-guard.controller.js +64 -0
  89. package/dist/server/modules/file-sync/host-git-guard.controller.js.map +1 -0
  90. package/dist/server/modules/file-sync/host-git-index.controller.d.ts +9 -0
  91. package/dist/server/modules/file-sync/host-git-index.controller.js +67 -0
  92. package/dist/server/modules/file-sync/host-git-index.controller.js.map +1 -0
  93. package/dist/server/modules/file-sync/host-sync.controller.d.ts +15 -2
  94. package/dist/server/modules/file-sync/host-sync.controller.js +122 -14
  95. package/dist/server/modules/file-sync/host-sync.controller.js.map +1 -1
  96. package/dist/server/modules/file-sync/ignore-pattern-matcher.d.ts +30 -0
  97. package/dist/server/modules/file-sync/ignore-pattern-matcher.js +183 -0
  98. package/dist/server/modules/file-sync/ignore-pattern-matcher.js.map +1 -0
  99. package/dist/server/modules/file-sync/project-repository.d.ts +2 -0
  100. package/dist/server/modules/file-sync/project-repository.js +20 -0
  101. package/dist/server/modules/file-sync/project-repository.js.map +1 -0
  102. package/dist/server/modules/file-sync/sync-chown.dto.d.ts +99 -0
  103. package/dist/server/modules/file-sync/sync-chown.dto.js +46 -0
  104. package/dist/server/modules/file-sync/sync-chown.dto.js.map +1 -0
  105. package/dist/server/modules/file-sync/sync-chown.service.d.ts +12 -0
  106. package/dist/server/modules/file-sync/sync-chown.service.js +230 -0
  107. package/dist/server/modules/file-sync/sync-chown.service.js.map +1 -0
  108. package/dist/server/modules/file-sync/sync-path-inspection.dto.d.ts +626 -0
  109. package/dist/server/modules/file-sync/sync-path-inspection.dto.js +108 -0
  110. package/dist/server/modules/file-sync/sync-path-inspection.dto.js.map +1 -0
  111. package/dist/server/modules/file-sync/sync-path-inspector.d.ts +12 -0
  112. package/dist/server/modules/file-sync/sync-path-inspector.js +413 -0
  113. package/dist/server/modules/file-sync/sync-path-inspector.js.map +1 -0
  114. package/dist/server/modules/file-sync/testing/fake-file-sync.service.d.ts +27 -4
  115. package/dist/server/modules/file-sync/testing/fake-file-sync.service.js +66 -4
  116. package/dist/server/modules/file-sync/testing/fake-file-sync.service.js.map +1 -1
  117. package/dist/server/modules/file-sync/translate-git-ignore-rule.d.ts +3 -0
  118. package/dist/server/modules/file-sync/translate-git-ignore-rule.js +30 -0
  119. package/dist/server/modules/file-sync/translate-git-ignore-rule.js.map +1 -0
  120. package/dist/server/modules/mcp/services/handlers/skill-tools.js +2 -2
  121. package/dist/server/modules/mcp/services/handlers/skill-tools.js.map +1 -1
  122. package/dist/server/modules/remotes/connect-choices.controller.d.ts +9 -0
  123. package/dist/server/modules/remotes/connect-choices.controller.js +54 -0
  124. package/dist/server/modules/remotes/connect-choices.controller.js.map +1 -0
  125. package/dist/server/modules/remotes/connect-choices.dto.d.ts +52 -0
  126. package/dist/server/modules/remotes/connect-choices.dto.js +19 -0
  127. package/dist/server/modules/remotes/connect-choices.dto.js.map +1 -0
  128. package/dist/server/modules/remotes/connect-choices.store.d.ts +12 -0
  129. package/dist/server/modules/remotes/connect-choices.store.js +95 -0
  130. package/dist/server/modules/remotes/connect-choices.store.js.map +1 -0
  131. package/dist/server/modules/remotes/controllers/remotes.controller.d.ts +3 -0
  132. package/dist/server/modules/remotes/controllers/remotes.controller.js +9 -1
  133. package/dist/server/modules/remotes/controllers/remotes.controller.js.map +1 -1
  134. package/dist/server/modules/remotes/docker/docker-copy-back.js +40 -16
  135. package/dist/server/modules/remotes/docker/docker-copy-back.js.map +1 -1
  136. package/dist/server/modules/remotes/docker/docker-handoff.d.ts +5 -3
  137. package/dist/server/modules/remotes/docker/docker-handoff.js +146 -42
  138. package/dist/server/modules/remotes/docker/docker-handoff.js.map +1 -1
  139. package/dist/server/modules/remotes/docker/docker-handoff.store.d.ts +3 -0
  140. package/dist/server/modules/remotes/docker/docker-handoff.store.js.map +1 -1
  141. package/dist/server/modules/remotes/docker/docker-plan-fit.d.ts +4 -1
  142. package/dist/server/modules/remotes/docker/docker-plan-fit.js +19 -6
  143. package/dist/server/modules/remotes/docker/docker-plan-fit.js.map +1 -1
  144. package/dist/server/modules/remotes/docker/docker-plan-policy.d.ts +6 -2
  145. package/dist/server/modules/remotes/docker/docker-plan-policy.js +191 -38
  146. package/dist/server/modules/remotes/docker/docker-plan-policy.js.map +1 -1
  147. package/dist/server/modules/remotes/docker/docker-plan-source.service.d.ts +52 -8
  148. package/dist/server/modules/remotes/docker/docker-plan-source.service.js +273 -50
  149. package/dist/server/modules/remotes/docker/docker-plan-source.service.js.map +1 -1
  150. package/dist/server/modules/remotes/docker/docker-plan.controller.d.ts +2 -1
  151. package/dist/server/modules/remotes/docker/docker-plan.controller.js +14 -0
  152. package/dist/server/modules/remotes/docker/docker-plan.controller.js.map +1 -1
  153. package/dist/server/modules/remotes/docker/docker-plan.dto.d.ts +46 -1
  154. package/dist/server/modules/remotes/docker/docker-plan.dto.js +1 -0
  155. package/dist/server/modules/remotes/docker/docker-plan.dto.js.map +1 -1
  156. package/dist/server/modules/remotes/docker/docker-plan.service.d.ts +13 -7
  157. package/dist/server/modules/remotes/docker/docker-plan.service.js +57 -13
  158. package/dist/server/modules/remotes/docker/docker-plan.service.js.map +1 -1
  159. package/dist/server/modules/remotes/docker/docker-project-compose.d.ts +7 -0
  160. package/dist/server/modules/remotes/docker/docker-project-compose.js +30 -0
  161. package/dist/server/modules/remotes/docker/docker-project-compose.js.map +1 -0
  162. package/dist/server/modules/remotes/dtos/remote.dto.d.ts +2 -0
  163. package/dist/server/modules/remotes/dtos/remote.dto.js.map +1 -1
  164. package/dist/server/modules/remotes/git-owner.store.d.ts +13 -0
  165. package/dist/server/modules/remotes/git-owner.store.js +69 -0
  166. package/dist/server/modules/remotes/git-owner.store.js.map +1 -0
  167. package/dist/server/modules/remotes/host/host-docker.controller.d.ts +8 -0
  168. package/dist/server/modules/remotes/host/host-docker.controller.js +22 -6
  169. package/dist/server/modules/remotes/host/host-docker.controller.js.map +1 -1
  170. package/dist/server/modules/remotes/host/host-docker.dto.d.ts +606 -0
  171. package/dist/server/modules/remotes/host/host-docker.dto.js +47 -7
  172. package/dist/server/modules/remotes/host/host-docker.dto.js.map +1 -1
  173. package/dist/server/modules/remotes/host/host-docker.service.d.ts +16 -4
  174. package/dist/server/modules/remotes/host/host-docker.service.js +157 -82
  175. package/dist/server/modules/remotes/host/host-docker.service.js.map +1 -1
  176. package/dist/server/modules/remotes/host/host-ipv4-routes.d.ts +4 -0
  177. package/dist/server/modules/remotes/host/host-ipv4-routes.js +43 -0
  178. package/dist/server/modules/remotes/host/host-ipv4-routes.js.map +1 -0
  179. package/dist/server/modules/remotes/host-image.d.ts +1 -1
  180. package/dist/server/modules/remotes/host-image.js +1 -1
  181. package/dist/server/modules/remotes/host-install/host-install-block.d.ts +1 -0
  182. package/dist/server/modules/remotes/host-install/host-install-block.js +76 -2
  183. package/dist/server/modules/remotes/host-install/host-install-block.js.map +1 -1
  184. package/dist/server/modules/remotes/host-install/host-install.service.d.ts +0 -1
  185. package/dist/server/modules/remotes/host-install/host-install.service.js +9 -26
  186. package/dist/server/modules/remotes/host-install/host-install.service.js.map +1 -1
  187. package/dist/server/modules/remotes/operations/attach.operation.d.ts +5 -1
  188. package/dist/server/modules/remotes/operations/attach.operation.js +40 -5
  189. package/dist/server/modules/remotes/operations/attach.operation.js.map +1 -1
  190. package/dist/server/modules/remotes/operations/claim.operation.d.ts +1 -0
  191. package/dist/server/modules/remotes/operations/claim.operation.js +6 -1
  192. package/dist/server/modules/remotes/operations/claim.operation.js.map +1 -1
  193. package/dist/server/modules/remotes/operations/detach.operation.d.ts +4 -1
  194. package/dist/server/modules/remotes/operations/detach.operation.js +10 -2
  195. package/dist/server/modules/remotes/operations/detach.operation.js.map +1 -1
  196. package/dist/server/modules/remotes/operations/docker-import-inventory.store.d.ts +4 -0
  197. package/dist/server/modules/remotes/operations/docker-import-inventory.store.js +11 -0
  198. package/dist/server/modules/remotes/operations/docker-import-inventory.store.js.map +1 -1
  199. package/dist/server/modules/remotes/operations/file-sync-handoff.d.ts +29 -3
  200. package/dist/server/modules/remotes/operations/file-sync-handoff.js +477 -50
  201. package/dist/server/modules/remotes/operations/file-sync-handoff.js.map +1 -1
  202. package/dist/server/modules/remotes/operations/force-sync.operation.d.ts +39 -0
  203. package/dist/server/modules/remotes/operations/force-sync.operation.js +177 -0
  204. package/dist/server/modules/remotes/operations/force-sync.operation.js.map +1 -0
  205. package/dist/server/modules/remotes/operations/git-owner.dto.d.ts +83 -0
  206. package/dist/server/modules/remotes/operations/git-owner.dto.js +25 -0
  207. package/dist/server/modules/remotes/operations/git-owner.dto.js.map +1 -0
  208. package/dist/server/modules/remotes/operations/git-owner.operation.d.ts +35 -0
  209. package/dist/server/modules/remotes/operations/git-owner.operation.js +216 -0
  210. package/dist/server/modules/remotes/operations/git-owner.operation.js.map +1 -0
  211. package/dist/server/modules/remotes/operations/remote-host.client.d.ts +71 -7
  212. package/dist/server/modules/remotes/operations/remote-host.client.js +141 -11
  213. package/dist/server/modules/remotes/operations/remote-host.client.js.map +1 -1
  214. package/dist/server/modules/remotes/operations/remote-operation.dto.d.ts +19 -0
  215. package/dist/server/modules/remotes/operations/remote-operation.dto.js +5 -1
  216. package/dist/server/modules/remotes/operations/remote-operation.dto.js.map +1 -1
  217. package/dist/server/modules/remotes/operations/remote-operation.runner.d.ts +3 -1
  218. package/dist/server/modules/remotes/operations/remote-operation.runner.js +52 -21
  219. package/dist/server/modules/remotes/operations/remote-operation.runner.js.map +1 -1
  220. package/dist/server/modules/remotes/operations/remote-operation.types.d.ts +4 -1
  221. package/dist/server/modules/remotes/operations/remote-operation.types.js.map +1 -1
  222. package/dist/server/modules/remotes/operations/remote-operations.controller.d.ts +5 -0
  223. package/dist/server/modules/remotes/operations/remote-operations.controller.js +56 -0
  224. package/dist/server/modules/remotes/operations/remote-operations.controller.js.map +1 -1
  225. package/dist/server/modules/remotes/operations/remote-operations.service.d.ts +16 -1
  226. package/dist/server/modules/remotes/operations/remote-operations.service.js +155 -5
  227. package/dist/server/modules/remotes/operations/remote-operations.service.js.map +1 -1
  228. package/dist/server/modules/remotes/operations/update-logins.operation.d.ts +1 -3
  229. package/dist/server/modules/remotes/operations/update-logins.operation.js +3 -18
  230. package/dist/server/modules/remotes/operations/update-logins.operation.js.map +1 -1
  231. package/dist/server/modules/remotes/ports/remote-health.port.d.ts +2 -0
  232. package/dist/server/modules/remotes/ports/remote-health.port.js.map +1 -1
  233. package/dist/server/modules/remotes/remotes.module.js +18 -0
  234. package/dist/server/modules/remotes/remotes.module.js.map +1 -1
  235. package/dist/server/modules/remotes/replica/__fixtures__/replica-seed.d.ts +2 -2
  236. package/dist/server/modules/remotes/replica/__fixtures__/replica-seed.js +2 -13
  237. package/dist/server/modules/remotes/replica/__fixtures__/replica-seed.js.map +1 -1
  238. package/dist/server/modules/remotes/services/remote-health.service.js +5 -0
  239. package/dist/server/modules/remotes/services/remote-health.service.js.map +1 -1
  240. package/dist/server/modules/remotes/sync/file-sync-failures.service.d.ts +18 -0
  241. package/dist/server/modules/remotes/sync/file-sync-failures.service.js +157 -0
  242. package/dist/server/modules/remotes/sync/file-sync-failures.service.js.map +1 -0
  243. package/dist/server/modules/remotes/sync/file-sync-pattern-preview.service.d.ts +14 -0
  244. package/dist/server/modules/remotes/sync/file-sync-pattern-preview.service.js +99 -0
  245. package/dist/server/modules/remotes/sync/file-sync-pattern-preview.service.js.map +1 -0
  246. package/dist/server/modules/remotes/sync/file-sync-suggestions.service.d.ts +15 -0
  247. package/dist/server/modules/remotes/sync/file-sync-suggestions.service.js +90 -0
  248. package/dist/server/modules/remotes/sync/file-sync-suggestions.service.js.map +1 -0
  249. package/dist/server/modules/remotes/sync/project-file-sync.controller.d.ts +29 -0
  250. package/dist/server/modules/remotes/sync/project-file-sync.controller.js +160 -0
  251. package/dist/server/modules/remotes/sync/project-file-sync.controller.js.map +1 -0
  252. package/dist/server/modules/remotes/sync/remote-file-sync.dto.d.ts +72 -0
  253. package/dist/server/modules/remotes/sync/remote-file-sync.dto.js +16 -0
  254. package/dist/server/modules/remotes/sync/remote-file-sync.dto.js.map +1 -0
  255. package/dist/server/modules/remotes/sync/remote-file-sync.service.d.ts +32 -1
  256. package/dist/server/modules/remotes/sync/remote-file-sync.service.js +499 -38
  257. package/dist/server/modules/remotes/sync/remote-file-sync.service.js.map +1 -1
  258. package/dist/server/modules/remotes/sync/remote-live-sync.service.d.ts +2 -0
  259. package/dist/server/modules/remotes/sync/remote-live-sync.service.js +26 -12
  260. package/dist/server/modules/remotes/sync/remote-live-sync.service.js.map +1 -1
  261. package/dist/server/modules/remotes/vm-user-identity.d.ts +29 -0
  262. package/dist/server/modules/remotes/vm-user-identity.js +45 -0
  263. package/dist/server/modules/remotes/vm-user-identity.js.map +1 -0
  264. package/dist/server/modules/runtime-context-capture/codex-plugin-profile-materializer.service.js +5 -1
  265. package/dist/server/modules/runtime-context-capture/codex-plugin-profile-materializer.service.js.map +1 -1
  266. package/dist/server/modules/session-reader/data/pricing.json +55 -7
  267. package/dist/server/modules/sessions/services/provider-launch-config/provider-launch-config.service.js +5 -0
  268. package/dist/server/modules/sessions/services/provider-launch-config/provider-launch-config.service.js.map +1 -1
  269. package/dist/server/modules/settings/local/delegates/skills-settings.delegate.d.ts +6 -0
  270. package/dist/server/modules/settings/local/delegates/skills-settings.delegate.js +26 -0
  271. package/dist/server/modules/settings/local/delegates/skills-settings.delegate.js.map +1 -1
  272. package/dist/server/modules/settings/services/settings.service.d.ts +3 -1
  273. package/dist/server/modules/settings/services/settings.service.js +6 -0
  274. package/dist/server/modules/settings/services/settings.service.js.map +1 -1
  275. package/dist/server/modules/skills/adapters/anthropic-skill-source.adapter.js +5 -5
  276. package/dist/server/modules/skills/adapters/anthropic-skill-source.adapter.js.map +1 -1
  277. package/dist/server/modules/skills/adapters/github-directory-skill-source.adapter.js +5 -5
  278. package/dist/server/modules/skills/adapters/github-directory-skill-source.adapter.js.map +1 -1
  279. package/dist/server/modules/skills/adapters/github-skill-source.base.js +4 -3
  280. package/dist/server/modules/skills/adapters/github-skill-source.base.js.map +1 -1
  281. package/dist/server/modules/skills/adapters/local-skill-source.adapter.js +5 -5
  282. package/dist/server/modules/skills/adapters/local-skill-source.adapter.js.map +1 -1
  283. package/dist/server/modules/skills/adapters/microsoft-skill-source.adapter.js +5 -5
  284. package/dist/server/modules/skills/adapters/microsoft-skill-source.adapter.js.map +1 -1
  285. package/dist/server/modules/skills/adapters/openai-skill-source.adapter.js +5 -5
  286. package/dist/server/modules/skills/adapters/openai-skill-source.adapter.js.map +1 -1
  287. package/dist/server/modules/skills/adapters/skill-source.adapter.d.ts +5 -0
  288. package/dist/server/modules/skills/adapters/skill-sync-temp-cleanup.d.ts +5 -0
  289. package/dist/server/modules/skills/adapters/skill-sync-temp-cleanup.js +75 -0
  290. package/dist/server/modules/skills/adapters/skill-sync-temp-cleanup.js.map +1 -0
  291. package/dist/server/modules/skills/adapters/trailofbits-skill-source.adapter.js +5 -5
  292. package/dist/server/modules/skills/adapters/trailofbits-skill-source.adapter.js.map +1 -1
  293. package/dist/server/modules/skills/adapters/vercel-skill-source.adapter.js +5 -5
  294. package/dist/server/modules/skills/adapters/vercel-skill-source.adapter.js.map +1 -1
  295. package/dist/server/modules/skills/controllers/skills.controller.js +2 -2
  296. package/dist/server/modules/skills/controllers/skills.controller.js.map +1 -1
  297. package/dist/server/modules/skills/services/skill-source-lifecycle.service.d.ts +3 -3
  298. package/dist/server/modules/skills/services/skill-source-lifecycle.service.js +9 -4
  299. package/dist/server/modules/skills/services/skill-source-lifecycle.service.js.map +1 -1
  300. package/dist/server/modules/skills/services/skill-sync.service.d.ts +3 -3
  301. package/dist/server/modules/skills/services/skill-sync.service.js +32 -6
  302. package/dist/server/modules/skills/services/skill-sync.service.js.map +1 -1
  303. package/dist/server/modules/skills/services/skill-sync.types.d.ts +3 -0
  304. package/dist/server/modules/storage/db/schema.d.ts +2 -2
  305. package/dist/server/modules/storage/db/schema.js +2 -0
  306. package/dist/server/modules/storage/db/schema.js.map +1 -1
  307. package/dist/server/modules/storage/models/domain.models.d.ts +1 -1
  308. package/dist/server/modules/storage/models/domain.models.js +2 -0
  309. package/dist/server/modules/storage/models/domain.models.js.map +1 -1
  310. package/dist/server/modules/terminal/gateways/terminal.gateway.d.ts +3 -1
  311. package/dist/server/modules/terminal/gateways/terminal.gateway.js +9 -4
  312. package/dist/server/modules/terminal/gateways/terminal.gateway.js.map +1 -1
  313. package/dist/server/modules/terminal/services/terminal-activity.service.d.ts +0 -1
  314. package/dist/server/modules/terminal/services/terminal-activity.service.js +0 -3
  315. package/dist/server/modules/terminal/services/terminal-activity.service.js.map +1 -1
  316. package/dist/server/modules/terminal/services/terminal-io/lifecycle.js +15 -3
  317. package/dist/server/modules/terminal/services/terminal-io/lifecycle.js.map +1 -1
  318. package/dist/server/modules/terminal/utils/ansi-sanitizer.d.ts +0 -1
  319. package/dist/server/modules/terminal/utils/ansi-sanitizer.js +0 -4
  320. package/dist/server/modules/terminal/utils/ansi-sanitizer.js.map +1 -1
  321. package/dist/server/templates/teams-dev.json +11 -11
  322. package/dist/server/test-setup-node.js +4 -3
  323. package/dist/server/test-setup-node.js.map +1 -1
  324. package/dist/server/test-setup.js +7 -0
  325. package/dist/server/test-setup.js.map +1 -1
  326. package/dist/server/tsconfig.tsbuildinfo +1 -1
  327. package/dist/server/ui/assets/{ExternalRichEditor-DtNvrV0F.js → ExternalRichEditor-CIZPhssf.js} +24 -24
  328. package/dist/server/ui/assets/ReviewDetailPage-winyLSQ7.js +6 -0
  329. package/dist/server/ui/assets/ReviewsPage-BYKBReMp.js +6 -0
  330. package/dist/server/ui/assets/index-CiDJX6Hn.js +1191 -0
  331. package/dist/server/ui/assets/index-f1WOAqXB.css +32 -0
  332. package/dist/server/ui/assets/useReviewSubscription-v3Cto0y4.js +69 -0
  333. package/dist/server/ui/index.html +2 -2
  334. package/dist/templates/teams-dev.json +11 -11
  335. package/package.json +8 -1
  336. package/dist/server/modules/reviews/utils/notification-formatter.d.ts +0 -12
  337. package/dist/server/modules/reviews/utils/notification-formatter.js +0 -60
  338. package/dist/server/modules/reviews/utils/notification-formatter.js.map +0 -1
  339. package/dist/server/ui/assets/ReviewDetailPage-DJzEoM0x.js +0 -6
  340. package/dist/server/ui/assets/ReviewsPage-z2O8MNEw.js +0 -6
  341. package/dist/server/ui/assets/index-CC4P3V8L.js +0 -994
  342. package/dist/server/ui/assets/index-LsJe1ZTS.css +0 -32
  343. package/dist/server/ui/assets/useReviewSubscription-B7AdJBO2.js +0 -69
@@ -1,5 +1,5 @@
1
1
  {
2
- "commit": "1f8af83038304b62ddd5bff0f4eb5703f9826e65",
2
+ "commit": "35809da25aca6b5f52514089cf15e83c6ffae5d4",
3
3
  "dirty": false,
4
- "builtAt": "2026-10-02T22:58:40.935Z"
4
+ "builtAt": "2026-10-07T00:16:05.341Z"
5
5
  }
package/dist/cli.js CHANGED
@@ -16,6 +16,8 @@ const { spawn, execSync, execFileSync } = require('child_process');
16
16
  const { pathToFileURL } = require('url');
17
17
  const { InteractiveCLI } = require('./lib/interactive-cli');
18
18
  const { runHostInstallCommand } = require('./lib/host-install');
19
+ const { runGitOwnerCommand } = require('./lib/git-owner');
20
+ const { getLocalApiBaseUrl } = require('./lib/local-api');
19
21
  const { runHostApiKeyReset } = require('./lib/host-api-key');
20
22
  const { QUEUE_NAME, runExclusive } = require('./lib/exclusive-run');
21
23
  const readline = require('readline');
@@ -1412,6 +1414,34 @@ async function main(argv) {
1412
1414
  });
1413
1415
  });
1414
1416
 
1417
+ const git = program.command('git').description('Move Git control between this PC and the VM');
1418
+ for (const name of ['status', 'take', 'return']) {
1419
+ const command = git
1420
+ .command(name)
1421
+ .description(
1422
+ {
1423
+ status: 'Show Git control and any unfinished switch',
1424
+ take: 'Move Git control to this PC',
1425
+ return: 'Move Git control back to the VM',
1426
+ }[name],
1427
+ )
1428
+ .option('--project <path>', 'Project folder (defaults to the current folder)');
1429
+ if (name === 'take') {
1430
+ command.option('--force', "Stop this project's agent sessions on the VM before the switch");
1431
+ }
1432
+ command.action(async (options) => {
1433
+ process.exitCode = await runGitOwnerCommand(name, options, {
1434
+ getMachineRole,
1435
+ getLocalApiBaseUrl: () =>
1436
+ getLocalApiBaseUrl({
1437
+ readPidFile,
1438
+ isProcessRunning,
1439
+ resolveSharedModuleSpecifier,
1440
+ }),
1441
+ });
1442
+ });
1443
+ }
1444
+
1415
1445
  const host = program.command('host').description('Manage DevChain hosts');
1416
1446
 
1417
1447
  host
@@ -1424,7 +1454,10 @@ async function main(argv) {
1424
1454
  .option('--passphrase-stdin', 'Read the SSH key passphrase from one line of stdin')
1425
1455
  .option('--sudo-password-stdin', 'Read the optional sudo password from one line of stdin')
1426
1456
  .option('--projects <project-ids...>', 'Project ids to include in the disk estimate')
1427
- .option('--no-docker', 'Do not install Docker Engine and Compose on the VM (installed by default)')
1457
+ .option(
1458
+ '--no-docker',
1459
+ 'Do not install Docker Engine and Compose on the VM (installed by default)',
1460
+ )
1428
1461
  .option(
1429
1462
  '--provider-auth <provider=choice>',
1430
1463
  'Provider login choice: skip, generate, or reuse:<entry-id> (repeatable)',
@@ -1432,15 +1465,12 @@ async function main(argv) {
1432
1465
  )
1433
1466
  .action(async (options) => {
1434
1467
  const exitCode = await runHostInstallCommand(options, {
1435
- getLocalApiBaseUrl: async () => {
1436
- const pidData = readPidFile();
1437
- if (!pidData || !isProcessRunning(pidData.pid)) return null;
1438
- const { HostResolver } = await import(resolveSharedModuleSpecifier());
1439
- return HostResolver.buildInternalBaseUrl({
1440
- host: pidData.host || '127.0.0.1',
1441
- port: pidData.port,
1442
- });
1443
- },
1468
+ getLocalApiBaseUrl: () =>
1469
+ getLocalApiBaseUrl({
1470
+ readPidFile,
1471
+ isProcessRunning,
1472
+ resolveSharedModuleSpecifier,
1473
+ }),
1444
1474
  });
1445
1475
  process.exitCode = exitCode;
1446
1476
  });
@@ -5,7 +5,7 @@
5
5
  "bootstrap": {
6
6
  "package": "devchain-host-bootstrap",
7
7
  "version": "0.1.0",
8
- "sha256": "724d4664ff9bc77d5d6be21de949022cb8e3a01cbb8ad525fef971136db65f96"
8
+ "sha256": "647a36e15832c854515835132b80892fffebe4fb0957938541135b0481a39040"
9
9
  },
10
10
  "aptPackages": [
11
11
  "qemu-guest-agent",
@@ -17,6 +17,10 @@
17
17
  "build-essential",
18
18
  "python3",
19
19
  "jq",
20
+ "openssl",
21
+ "procps"
22
+ ],
23
+ "toolPackages": [
20
24
  "ripgrep",
21
25
  "python-is-python3",
22
26
  "python3-pip",
@@ -26,6 +30,31 @@
26
30
  "bsdextrautils",
27
31
  "rsync",
28
32
  "unzip",
29
- "openssl"
33
+ "screen",
34
+ "psmisc",
35
+ "time",
36
+ "lsof",
37
+ "strace",
38
+ "htop",
39
+ "less",
40
+ "nano",
41
+ "vim-tiny",
42
+ "tree",
43
+ "zip",
44
+ "net-tools",
45
+ "iputils-ping",
46
+ "inetutils-telnet",
47
+ "netcat-openbsd",
48
+ "bind9-dnsutils",
49
+ "traceroute",
50
+ "mtr-tiny",
51
+ "tcpdump",
52
+ "socat",
53
+ "fd-find",
54
+ "universal-ctags",
55
+ "gawk",
56
+ "shellcheck",
57
+ "cloc",
58
+ "git-lfs"
30
59
  ]
31
60
  }
@@ -1,11 +1,23 @@
1
1
  const fs = require("node:fs");
2
- const { spawn } = require("node:child_process");
2
+ const { spawn, spawnSync } = require("node:child_process");
3
3
  const { randomBytes } = require("node:crypto");
4
4
  const { homedir, constants } = require("node:os");
5
- const { join, resolve } = require("node:path");
5
+ const { delimiter, join, resolve } = require("node:path");
6
6
 
7
7
  const QUEUE_NAME = /^[a-z0-9][a-z0-9-]{0,63}$/;
8
8
  const SIGNALS = ["SIGINT", "SIGTERM", "SIGHUP"];
9
+ // systemd-run execs the command in place: pid, process group, stdio and exit
10
+ // code stay the same. systemd 258 and later expand $VAR in the arguments
11
+ // unless told not to.
12
+ const SCOPE_ARGS = [
13
+ "--user",
14
+ "--scope",
15
+ "--quiet",
16
+ "--collect",
17
+ "--expand-environment=no",
18
+ "--",
19
+ ];
20
+ let scopeAvailable;
9
21
 
10
22
  function isPid(value) {
11
23
  return Number.isInteger(value) && value > 0;
@@ -150,13 +162,49 @@ function formatWait(ms) {
150
162
  return `${Math.floor(seconds / 60)}m ${seconds % 60}s`;
151
163
  }
152
164
 
165
+ function findExecutable(command, env) {
166
+ const candidates = command.includes("/")
167
+ ? [resolve(command)]
168
+ : (env.PATH || "")
169
+ .split(delimiter)
170
+ .filter(Boolean)
171
+ .map((dir) => join(dir, command));
172
+ return candidates.find((file) => {
173
+ try {
174
+ fs.accessSync(file, fs.constants.X_OK);
175
+ return fs.statSync(file).isFile();
176
+ } catch {
177
+ return false;
178
+ }
179
+ });
180
+ }
181
+
182
+ // In a user scope of its own, a command that systemd-oomd kills does not take
183
+ // the caller's scope down with it, e.g. an agent's tmux pane.
184
+ function scopedSpawnArgs(command, args, env) {
185
+ if (process.platform !== "linux") return [command, args];
186
+ const executable = findExecutable(command, env);
187
+ // An unknown command spawns directly, so its start error still names it.
188
+ if (!executable) return [command, args];
189
+ scopeAvailable ??=
190
+ spawnSync("systemd-run", [...SCOPE_ARGS, "true"], {
191
+ env,
192
+ stdio: "ignore",
193
+ timeout: 5000,
194
+ }).status === 0;
195
+ return scopeAvailable
196
+ ? ["systemd-run", [...SCOPE_ARGS, executable, ...args]]
197
+ : [command, args];
198
+ }
199
+
153
200
  async function spawnAndForward(
154
201
  { command, args, env, pollMs, name },
155
202
  state,
156
203
  onSpawn,
157
204
  ) {
158
205
  if (state.signal) return signalCode(state.signal);
159
- const child = spawn(command, args, { env, stdio: "inherit", detached: true });
206
+ const [file, argv] = scopedSpawnArgs(command, args, env);
207
+ const child = spawn(file, argv, { env, stdio: "inherit", detached: true });
160
208
  state.pgid = child.pid || null;
161
209
  const result = new Promise((done) => {
162
210
  child.once("error", (error) => {
@@ -0,0 +1,284 @@
1
+ const { dirname, resolve } = require("node:path");
2
+ const {
3
+ LocalApiHttpError,
4
+ POLL_INTERVAL_MS,
5
+ getOperation,
6
+ printOperationSteps,
7
+ requestJson,
8
+ writeLine,
9
+ } = require("./local-api");
10
+
11
+ // The server checks the VM before it starts a switch; each check can take 15 seconds.
12
+ const START_TIMEOUT_MS = 120_000;
13
+
14
+ class GitCommandRefusedError extends Error {}
15
+
16
+ async function findProject(fetchImpl, baseUrl, path) {
17
+ let candidate = resolve(path);
18
+ for (;;) {
19
+ try {
20
+ const project = await requestJson(
21
+ fetchImpl,
22
+ baseUrl,
23
+ `/api/projects/by-path?path=${encodeURIComponent(candidate)}`,
24
+ );
25
+ if (!project || typeof project.id !== "string") {
26
+ throw new Error("DevChain returned an invalid project.");
27
+ }
28
+ return project;
29
+ } catch (error) {
30
+ if (!(error instanceof LocalApiHttpError) || error.status !== 404)
31
+ throw error;
32
+ }
33
+ const parent = dirname(candidate);
34
+ if (parent === candidate) {
35
+ throw new GitCommandRefusedError(
36
+ `No registered project contains ${resolve(path)}.`,
37
+ );
38
+ }
39
+ candidate = parent;
40
+ }
41
+ }
42
+
43
+ function recoveryCommand(owner, force, projectPath) {
44
+ const command =
45
+ owner === "home"
46
+ ? `devchain git take${force ? " --force" : ""}`
47
+ : "devchain git return";
48
+ return projectPath
49
+ ? `${command} --project '${projectPath.replace(/'/g, "'\\''")}'`
50
+ : command;
51
+ }
52
+
53
+ function ownerMessage(owner, remoteName, already = false) {
54
+ const side = owner === "home" ? "this PC" : `the VM '${remoteName}'`;
55
+ return `Git for this project is ${already ? "already " : ""}on ${side}.`;
56
+ }
57
+
58
+ function printStatus(status, stdout, projectPath) {
59
+ writeLine(
60
+ stdout,
61
+ status.connected
62
+ ? ownerMessage(status.owner, status.remoteName)
63
+ : "This project is not connected to a VM.",
64
+ );
65
+ if (!status.open) return;
66
+ const open = status.open;
67
+ writeLine(stdout, `Git switch ${open.operationId}: ${open.state}.`);
68
+ writeLine(
69
+ stdout,
70
+ `Target: ${open.owner === "home" ? "this PC" : `the VM '${status.remoteName}'`}.`,
71
+ );
72
+ if (open.step) writeLine(stdout, `Step: ${open.step}.`);
73
+ if (open.error)
74
+ writeLine(
75
+ stdout,
76
+ `Error: ${open.error.message}${open.error.code ? ` (${open.error.code})` : ""}`,
77
+ );
78
+ writeLine(
79
+ stdout,
80
+ `To finish the switch, run \`${recoveryCommand(open.owner, open.force, projectPath)}\`.`,
81
+ );
82
+ }
83
+
84
+ function printDetails(operation, seen, stderr) {
85
+ const details = operation.details ?? {};
86
+ const emit = (line) => {
87
+ if (seen.has(line)) return;
88
+ seen.add(line);
89
+ writeLine(stderr, line);
90
+ };
91
+ const unknownAgents = details.unknownAgents ?? [];
92
+ if (unknownAgents.length > 0)
93
+ emit(
94
+ "These agents on the VM have an unknown state. They do not block the switch:",
95
+ );
96
+ for (const agent of unknownAgents) {
97
+ emit(` - ${agent.agentName} (state unknown)`);
98
+ }
99
+ for (const warning of [details.guardWarning, details.vmGuardWarning]) {
100
+ if (warning) emit(`WARNING: ${warning}`);
101
+ }
102
+ for (const [field, side] of [
103
+ ["pcGuardRemove", "PC"],
104
+ ["vmGuardRemove", "VM"],
105
+ ]) {
106
+ const result = details[field];
107
+ if (!result) continue;
108
+ if (result.warning) emit(`WARNING: ${result.warning}`);
109
+ if (result.indexRefreshed !== true)
110
+ emit(`WARNING: The ${side} Git index was not rebuilt.`);
111
+ }
112
+ }
113
+
114
+ function printBusyAgents(error, remoteName, context, projectPath) {
115
+ const agents = error.details?.agents ?? [];
116
+ writeLine(
117
+ context.stderr,
118
+ `Git stays on the VM '${remoteName}': ${agents.length} ${agents.length === 1 ? "agent is" : "agents are"} working in this project.`,
119
+ );
120
+ for (const agent of agents) {
121
+ const elapsed = context.wallNow() - Date.parse(agent.since);
122
+ const minutes = Number.isFinite(elapsed)
123
+ ? Math.max(0, Math.floor(elapsed / 60_000))
124
+ : null;
125
+ const duration =
126
+ minutes === null
127
+ ? "time unknown"
128
+ : minutes < 1
129
+ ? "less than 1 min"
130
+ : `${minutes} min`;
131
+ const state =
132
+ agent.state === "busy" ? `busy for ${duration}` : `starting, ${duration}`;
133
+ writeLine(context.stderr, ` - ${agent.agentName} (${state})`);
134
+ }
135
+ writeLine(
136
+ context.stderr,
137
+ `Wait until they finish, then run \`${recoveryCommand("home", false, projectPath)}\` again.`,
138
+ );
139
+ writeLine(
140
+ context.stderr,
141
+ `To stop this project's agent sessions on the VM now, run \`${recoveryCommand("home", true, projectPath)}\`.`,
142
+ );
143
+ }
144
+
145
+ async function runGitOwnerCommand(command, options = {}, dependencies = {}) {
146
+ const stdout = dependencies.stdout ?? process.stdout;
147
+ const stderr = dependencies.stderr ?? process.stderr;
148
+ const fetchImpl = dependencies.fetch ?? globalThis.fetch;
149
+ const context = {
150
+ stdout: stderr,
151
+ stderr,
152
+ secrets: [],
153
+ now: dependencies.now ?? (() => performance.now()),
154
+ wallNow: dependencies.wallNow ?? Date.now,
155
+ sleep:
156
+ dependencies.sleep ??
157
+ ((ms) => new Promise((done) => setTimeout(done, ms))),
158
+ };
159
+ let status;
160
+ try {
161
+ if (dependencies.getMachineRole?.() === "remote VM") {
162
+ throw new GitCommandRefusedError(
163
+ "Run this command on the PC that connected this project.",
164
+ );
165
+ }
166
+ if (
167
+ !["status", "take", "return"].includes(command) ||
168
+ (command !== "take" && options.force)
169
+ ) {
170
+ throw new GitCommandRefusedError(
171
+ "Use devchain git status, take [--force], or return.",
172
+ );
173
+ }
174
+ const baseUrl = await dependencies.getLocalApiBaseUrl?.();
175
+ if (!baseUrl) {
176
+ writeLine(stderr, "Start DevChain first (devchain start).");
177
+ return 1;
178
+ }
179
+ const project = await findProject(
180
+ fetchImpl,
181
+ baseUrl,
182
+ options.project ?? dependencies.cwd ?? process.cwd(),
183
+ );
184
+ status = await requestJson(
185
+ fetchImpl,
186
+ baseUrl,
187
+ `/api/remotes/git-owner?projectId=${encodeURIComponent(project.id)}`,
188
+ );
189
+ if (command === "status") {
190
+ printStatus(status, stdout, options.project);
191
+ return 0;
192
+ }
193
+ if (!status.connected || !status.remoteId) {
194
+ throw new GitCommandRefusedError(
195
+ "This project is not connected to a VM.",
196
+ );
197
+ }
198
+ const owner = command === "take" ? "home" : "vm";
199
+ let operation = await requestJson(
200
+ fetchImpl,
201
+ baseUrl,
202
+ `/api/remotes/${encodeURIComponent(status.remoteId)}/git-owner`,
203
+ {
204
+ method: "POST",
205
+ body: { projectId: project.id, owner, force: options.force === true },
206
+ timeoutMs: START_TIMEOUT_MS,
207
+ },
208
+ );
209
+ if (operation?.changed === false) {
210
+ if (operation.cancelledOperationId) {
211
+ writeLine(
212
+ stdout,
213
+ `Cancelled the failed switch ${operation.cancelledOperationId}.`,
214
+ );
215
+ }
216
+ writeLine(stdout, ownerMessage(operation.owner, status.remoteName, true));
217
+ return 0;
218
+ }
219
+ const steps = new Map();
220
+ const details = new Set();
221
+ let announced = false;
222
+ for (;;) {
223
+ if (
224
+ !operation ||
225
+ typeof operation.id !== "string" ||
226
+ !Array.isArray(operation.steps) ||
227
+ !["running", "failed", "done", "cancelled"].includes(operation.state)
228
+ ) {
229
+ throw new Error("DevChain returned an invalid Git switch operation.");
230
+ }
231
+ const target = operation.details?.owner ?? owner;
232
+ const repeat = recoveryCommand(
233
+ target,
234
+ operation.details?.force === true,
235
+ options.project,
236
+ );
237
+ context.recoveryHint = `Run \`${repeat}\` again to follow or retry operation ${operation.id}.`;
238
+ if (!announced) {
239
+ writeLine(stderr, `Git switch started (operation ${operation.id}).`);
240
+ announced = true;
241
+ }
242
+ printOperationSteps(operation, steps, context);
243
+ printDetails(operation, details, stderr);
244
+ if (operation.state === "done") {
245
+ writeLine(stdout, ownerMessage(target, status.remoteName));
246
+ return 0;
247
+ }
248
+ if (operation.state === "failed" || operation.state === "cancelled") {
249
+ const failed = operation.steps.find((step) => step.state === "failed");
250
+ writeLine(
251
+ stderr,
252
+ failed?.error?.message ?? `Git switch ${operation.state}.`,
253
+ );
254
+ writeLine(stderr, context.recoveryHint);
255
+ return 1;
256
+ }
257
+ await context.sleep(POLL_INTERVAL_MS);
258
+ operation = await getOperation(fetchImpl, baseUrl, operation.id, context);
259
+ }
260
+ } catch (error) {
261
+ const code = error.details?.code ?? error.code;
262
+ if (code === "GIT_TAKE_AGENTS_BUSY") {
263
+ printBusyAgents(error, status?.remoteName, context, options.project);
264
+ return 2;
265
+ }
266
+ writeLine(stderr, error.message ?? "Git command failed.");
267
+ if (
268
+ code === "REMOTE_OPERATION_CANCEL_FAILED" ||
269
+ (error instanceof LocalApiHttpError && error.status >= 500)
270
+ ) {
271
+ writeLine(stderr, "Run the same command again.");
272
+ return 1;
273
+ }
274
+ if (
275
+ error instanceof GitCommandRefusedError ||
276
+ (error instanceof LocalApiHttpError &&
277
+ [400, 403, 404, 409, 422].includes(error.status))
278
+ )
279
+ return 2;
280
+ return 1;
281
+ }
282
+ }
283
+
284
+ module.exports = { runGitOwnerCommand };