@xgent-ai/skills 0.1.0 → 0.3.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 (618) hide show
  1. package/README.md +38 -2
  2. package/bin/xgent-skills.js +515 -4
  3. package/package.json +7 -3
  4. package/skills/dev-plan/SKILL.md +113 -93
  5. package/skills/dev-plan/references/architecture-quality.md +141 -0
  6. package/skills/dev-plan/references/execution-workflow.md +78 -0
  7. package/skills/dev-plan/references/plan-skeleton.md +238 -78
  8. package/skills/dev-plan/scripts/check_progress.sh +158 -0
  9. package/skills/elintp/SKILL.md +129 -0
  10. package/skills/grafton-view-dev/SKILL.md +195 -0
  11. package/skills/grafton-view-dev/references/bindings.md +120 -0
  12. package/skills/grafton-view-dev/references/components.md +168 -0
  13. package/skills/grafton-view-dev/references/recipes.md +208 -0
  14. package/skills/grafton-view-dev/references/schema.md +86 -0
  15. package/skills/grafton-view-dev/references/stores.md +310 -0
  16. package/skills/pardon/SKILL.md +30 -0
  17. package/skills/portal-app-exchange/SKILL.md +106 -0
  18. package/skills/portal-backend-app/SKILL.md +56 -0
  19. package/skills/portal-backend-app/references/gate-and-tokens.md +93 -0
  20. package/skills/portal-backend-app/references/wiring-and-conventions.md +71 -0
  21. package/skills/portal-dev-setup/SKILL.md +519 -0
  22. package/skills/portal-dev-setup/puller.env.example +74 -0
  23. package/skills/portal-dev-setup/references/troubleshooting.md +167 -0
  24. package/skills/portal-dev-setup/scripts/onebox.sh +966 -0
  25. package/skills/portal-external-app/SKILL.md +273 -0
  26. package/skills/portal-external-app/references/contract-doc-template.md +96 -0
  27. package/skills/portal-external-app/references/health-contract.md +80 -0
  28. package/skills/portal-external-app/references/integration-contract.md +130 -0
  29. package/skills/portal-external-app/references/quota-and-seats.md +213 -0
  30. package/skills/portal-external-app/references/registration-and-onebox.md +259 -0
  31. package/skills/portal-external-app/scripts/health-verdict.ts +22 -0
  32. package/skills/portal-external-app/scripts/verify-health.ts +27 -0
  33. package/skills/portal-logging/SKILL.md +139 -0
  34. package/skills/portal-logging/references/collectors.md +285 -0
  35. package/skills/portal-logging/references/contract.md +95 -0
  36. package/skills/portal-logging/scripts/smoke-ingest.sh +72 -0
  37. package/skills/portal-micro-app/SKILL.md +83 -0
  38. package/skills/portal-micro-app/references/manifest-and-acl.md +79 -0
  39. package/skills/portal-micro-app/references/open-api-and-extensions.md +86 -0
  40. package/skills/portal-micro-app/references/sdk-reference.md +208 -0
  41. package/skills/prd/SKILL.md +212 -0
  42. package/skills/prd/references/prd-skeleton.md +244 -0
  43. package/skills/prd/references/spms-mapping.md +148 -0
  44. package/skills/react/SKILL.md +103 -0
  45. package/skills/react/references/component-patterns.md +275 -0
  46. package/skills/react/references/data-fetching.md +255 -0
  47. package/skills/react/references/effect-patterns.md +407 -0
  48. package/skills/react/references/js-performance.md +432 -0
  49. package/skills/react/references/rendering-performance.md +351 -0
  50. package/skills/react/references/rerender-optimization.md +578 -0
  51. package/skills/rust/SKILL.md +103 -0
  52. package/skills/rust/references/chapter_01.md +564 -0
  53. package/skills/rust/references/chapter_02.md +117 -0
  54. package/skills/rust/references/chapter_03.md +209 -0
  55. package/skills/rust/references/chapter_04.md +183 -0
  56. package/skills/rust/references/chapter_05.md +390 -0
  57. package/skills/rust/references/chapter_06.md +142 -0
  58. package/skills/rust/references/chapter_07.md +226 -0
  59. package/skills/rust/references/chapter_08.md +257 -0
  60. package/skills/rust/references/chapter_09.md +261 -0
  61. package/skills/rust/references/chapter_10.md +554 -0
  62. package/skills/story-points/SKILL.md +219 -0
  63. package/skills/story-points/references/factors.md +367 -0
  64. package/skills/summarize/SKILL.md +79 -0
  65. package/skills/swarm/SKILL.md +263 -0
  66. package/skills/swarm/evals/evals.json +55 -0
  67. package/skills/swarm/references/agent-types.md +260 -0
  68. package/skills/swarm/references/teams/code-audit.md +81 -0
  69. package/skills/swarm/references/teams/debug-race.md +70 -0
  70. package/skills/swarm/references/teams/feature-dev.md +71 -0
  71. package/skills/swarm/references/teams/product.md +114 -0
  72. package/skills/swarm/references/teams/refactor-migration.md +73 -0
  73. package/skills/swarm/references/teams/research-debate.md +73 -0
  74. package/skills/test-plan/SKILL.md +136 -0
  75. package/skills/test-plan/references/case-taxonomy.md +141 -0
  76. package/skills/working-with-mbx/SKILL.md +343 -0
  77. package/skills/working-with-mbx/references/acknowledgements.md +37 -0
  78. package/skills/working-with-mbx/references/benchmarks.md +140 -0
  79. package/skills/working-with-mbx/references/cache-results.md +153 -0
  80. package/skills/working-with-mbx/references/cache-server.md +151 -0
  81. package/skills/working-with-mbx/references/cli/adopt.md +29 -0
  82. package/skills/working-with-mbx/references/cli/cache/dir.md +24 -0
  83. package/skills/working-with-mbx/references/cli/cache/export.md +31 -0
  84. package/skills/working-with-mbx/references/cli/cache/import.md +27 -0
  85. package/skills/working-with-mbx/references/cli/cache/largest.md +26 -0
  86. package/skills/working-with-mbx/references/cli/cache/projects.md +23 -0
  87. package/skills/working-with-mbx/references/cli/cache/remove.md +30 -0
  88. package/skills/working-with-mbx/references/cli/cache/stats.md +24 -0
  89. package/skills/working-with-mbx/references/cli/cache/trace.md +27 -0
  90. package/skills/working-with-mbx/references/cli/cache/verify.md +23 -0
  91. package/skills/working-with-mbx/references/cli/cache.md +35 -0
  92. package/skills/working-with-mbx/references/cli/clean.md +27 -0
  93. package/skills/working-with-mbx/references/cli/completion.md +27 -0
  94. package/skills/working-with-mbx/references/cli/doctor.md +24 -0
  95. package/skills/working-with-mbx/references/cli/exec.md +28 -0
  96. package/skills/working-with-mbx/references/cli/explain.md +29 -0
  97. package/skills/working-with-mbx/references/cli/gc.md +28 -0
  98. package/skills/working-with-mbx/references/cli/prefetch.md +27 -0
  99. package/skills/working-with-mbx/references/cli/setup.md +28 -0
  100. package/skills/working-with-mbx/references/cli/stats.md +24 -0
  101. package/skills/working-with-mbx/references/cli/tui.md +24 -0
  102. package/skills/working-with-mbx/references/cli.md +58 -0
  103. package/skills/working-with-mbx/references/compared.md +67 -0
  104. package/skills/working-with-mbx/references/configuration.md +724 -0
  105. package/skills/working-with-mbx/references/cookbook/fork-prs.md +82 -0
  106. package/skills/working-with-mbx/references/cookbook/local-development.md +127 -0
  107. package/skills/working-with-mbx/references/cookbook/migrate.md +67 -0
  108. package/skills/working-with-mbx/references/dashboard.md +89 -0
  109. package/skills/working-with-mbx/references/faq.md +75 -0
  110. package/skills/working-with-mbx/references/getting-started.md +147 -0
  111. package/skills/working-with-mbx/references/github-action.md +254 -0
  112. package/skills/working-with-mbx/references/guide.md +59 -0
  113. package/skills/working-with-mbx/references/how-it-works.md +86 -0
  114. package/skills/working-with-mbx/references/incremental.md +78 -0
  115. package/skills/working-with-mbx/references/index.md +57 -0
  116. package/skills/working-with-mbx/references/installation.md +101 -0
  117. package/skills/working-with-mbx/references/limits.md +182 -0
  118. package/skills/working-with-mbx/references/linkers.md +75 -0
  119. package/skills/working-with-mbx/references/managed-targets.md +197 -0
  120. package/skills/working-with-mbx/references/protocol-compatibility.md +103 -0
  121. package/skills/working-with-mbx/references/remote-cache.md +190 -0
  122. package/skills/working-with-mbx/references/scheduling.md +65 -0
  123. package/skills/working-with-mbx/references/setup.md +157 -0
  124. package/skills/working-with-mbx/references/stability.md +43 -0
  125. package/skills/working-with-mbx/references/standalone-builds.md +102 -0
  126. package/skills/working-with-mbx/references/stats.md +49 -0
  127. package/skills/working-with-mbx/references/troubleshooting.md +136 -0
  128. package/skills/working-with-mbx/references/tui.md +163 -0
  129. package/skills/working-with-mbx/update-docs.sh +49 -0
  130. package/skills/working-with-mise/SKILL.md +297 -0
  131. package/skills/working-with-mise/references/cli/activate-html.md +90 -0
  132. package/skills/working-with-mise/references/cli/alias-html.md +30 -0
  133. package/skills/working-with-mise/references/cli/backends-html.md +40 -0
  134. package/skills/working-with-mise/references/cli/bin-paths-html.md +37 -0
  135. package/skills/working-with-mise/references/cli/bootstrap-html.md +109 -0
  136. package/skills/working-with-mise/references/cli/cache-html.md +40 -0
  137. package/skills/working-with-mise/references/cli/completion-html.md +76 -0
  138. package/skills/working-with-mise/references/cli/config-html.md +44 -0
  139. package/skills/working-with-mise/references/cli/daemons-html.md +48 -0
  140. package/skills/working-with-mise/references/cli/deactivate-html.md +47 -0
  141. package/skills/working-with-mise/references/cli/deps-html.md +89 -0
  142. package/skills/working-with-mise/references/cli/doctor-html.md +46 -0
  143. package/skills/working-with-mise/references/cli/dotfiles-html.md +57 -0
  144. package/skills/working-with-mise/references/cli/edit-html.md +48 -0
  145. package/skills/working-with-mise/references/cli/en-html.md +62 -0
  146. package/skills/working-with-mise/references/cli/env-html.md +57 -0
  147. package/skills/working-with-mise/references/cli/exec-html.md +79 -0
  148. package/skills/working-with-mise/references/cli/exec.md +79 -0
  149. package/skills/working-with-mise/references/cli/fmt-html.md +44 -0
  150. package/skills/working-with-mise/references/cli/generate-html.md +43 -0
  151. package/skills/working-with-mise/references/cli/implode-html.md +35 -0
  152. package/skills/working-with-mise/references/cli/install-html.md +83 -0
  153. package/skills/working-with-mise/references/cli/install-into-html.md +47 -0
  154. package/skills/working-with-mise/references/cli/latest-html.md +62 -0
  155. package/skills/working-with-mise/references/cli/link-html.md +57 -0
  156. package/skills/working-with-mise/references/cli/lock-html.md +114 -0
  157. package/skills/working-with-mise/references/cli/ls-html.md +95 -0
  158. package/skills/working-with-mise/references/cli/ls-remote-html.md +61 -0
  159. package/skills/working-with-mise/references/cli/mcp-html.md +57 -0
  160. package/skills/working-with-mise/references/cli/oci-html.md +41 -0
  161. package/skills/working-with-mise/references/cli/outdated-html.md +79 -0
  162. package/skills/working-with-mise/references/cli/packslip-html.md +38 -0
  163. package/skills/working-with-mise/references/cli/patrons-html.md +45 -0
  164. package/skills/working-with-mise/references/cli/plugins-html.md +46 -0
  165. package/skills/working-with-mise/references/cli/prune-html.md +56 -0
  166. package/skills/working-with-mise/references/cli/registry-html.md +59 -0
  167. package/skills/working-with-mise/references/cli/reshim-html.md +46 -0
  168. package/skills/working-with-mise/references/cli/run-html.md +152 -0
  169. package/skills/working-with-mise/references/cli/search-html.md +69 -0
  170. package/skills/working-with-mise/references/cli/self-update-html.md +42 -0
  171. package/skills/working-with-mise/references/cli/set-html.md +116 -0
  172. package/skills/working-with-mise/references/cli/settings-html.md +78 -0
  173. package/skills/working-with-mise/references/cli/shell-alias-html.md +39 -0
  174. package/skills/working-with-mise/references/cli/shell-html.md +53 -0
  175. package/skills/working-with-mise/references/cli/skills-html.md +39 -0
  176. package/skills/working-with-mise/references/cli/sponsors-html.md +31 -0
  177. package/skills/working-with-mise/references/cli/ssh-html.md +45 -0
  178. package/skills/working-with-mise/references/cli/sync-html.md +37 -0
  179. package/skills/working-with-mise/references/cli/tasks-html.md +61 -0
  180. package/skills/working-with-mise/references/cli/test-tool-html.md +49 -0
  181. package/skills/working-with-mise/references/cli/token-html.md +37 -0
  182. package/skills/working-with-mise/references/cli/tool-alias-html.md +41 -0
  183. package/skills/working-with-mise/references/cli/tool-html.md +55 -0
  184. package/skills/working-with-mise/references/cli/tool-stub-html.md +60 -0
  185. package/skills/working-with-mise/references/cli/trust-html.md +63 -0
  186. package/skills/working-with-mise/references/cli/uninstall-html.md +62 -0
  187. package/skills/working-with-mise/references/cli/unset-html.md +59 -0
  188. package/skills/working-with-mise/references/cli/untrust-html.md +35 -0
  189. package/skills/working-with-mise/references/cli/unuse-html.md +74 -0
  190. package/skills/working-with-mise/references/cli/upgrade-html.md +133 -0
  191. package/skills/working-with-mise/references/cli/use-html.md +130 -0
  192. package/skills/working-with-mise/references/cli/use.md +130 -0
  193. package/skills/working-with-mise/references/cli/version-html.md +46 -0
  194. package/skills/working-with-mise/references/cli/watch-html.md +465 -0
  195. package/skills/working-with-mise/references/cli/where-html.md +53 -0
  196. package/skills/working-with-mise/references/cli/which-html.md +55 -0
  197. package/skills/working-with-mise/references/configuration/environments-html.md +171 -0
  198. package/skills/working-with-mise/references/configuration/project-diagnostics-html.md +93 -0
  199. package/skills/working-with-mise/references/configuration/settings-html.md +3062 -0
  200. package/skills/working-with-mise/references/configuration/vars-html.md +167 -0
  201. package/skills/working-with-mise/references/dev-tools/aliases-html.md +97 -0
  202. package/skills/working-with-mise/references/dev-tools/backend_architecture-html.md +198 -0
  203. package/skills/working-with-mise/references/dev-tools/backends/aqua-html.md +274 -0
  204. package/skills/working-with-mise/references/dev-tools/backends/aqua.md +274 -0
  205. package/skills/working-with-mise/references/dev-tools/backends/asdf-html.md +98 -0
  206. package/skills/working-with-mise/references/dev-tools/backends/asdf.md +98 -0
  207. package/skills/working-with-mise/references/dev-tools/backends/cargo-html.md +240 -0
  208. package/skills/working-with-mise/references/dev-tools/backends/cargo.md +240 -0
  209. package/skills/working-with-mise/references/dev-tools/backends/conda-html.md +125 -0
  210. package/skills/working-with-mise/references/dev-tools/backends/dotnet-html.md +142 -0
  211. package/skills/working-with-mise/references/dev-tools/backends/forgejo-html.md +533 -0
  212. package/skills/working-with-mise/references/dev-tools/backends/gem-html.md +77 -0
  213. package/skills/working-with-mise/references/dev-tools/backends/gem.md +77 -0
  214. package/skills/working-with-mise/references/dev-tools/backends/github-html.md +622 -0
  215. package/skills/working-with-mise/references/dev-tools/backends/github.md +622 -0
  216. package/skills/working-with-mise/references/dev-tools/backends/gitlab-html.md +546 -0
  217. package/skills/working-with-mise/references/dev-tools/backends/go-html.md +115 -0
  218. package/skills/working-with-mise/references/dev-tools/backends/go.md +115 -0
  219. package/skills/working-with-mise/references/dev-tools/backends/http-html.md +644 -0
  220. package/skills/working-with-mise/references/dev-tools/backends/http.md +644 -0
  221. package/skills/working-with-mise/references/dev-tools/backends/npm-html.md +436 -0
  222. package/skills/working-with-mise/references/dev-tools/backends/npm.md +436 -0
  223. package/skills/working-with-mise/references/dev-tools/backends/packslip-html.md +310 -0
  224. package/skills/working-with-mise/references/dev-tools/backends/pipx-html.md +329 -0
  225. package/skills/working-with-mise/references/dev-tools/backends/pipx.md +329 -0
  226. package/skills/working-with-mise/references/dev-tools/backends/pkgx-html.md +73 -0
  227. package/skills/working-with-mise/references/dev-tools/backends/pypi-html.md +331 -0
  228. package/skills/working-with-mise/references/dev-tools/backends/s3-html.md +346 -0
  229. package/skills/working-with-mise/references/dev-tools/backends/spm-html.md +201 -0
  230. package/skills/working-with-mise/references/dev-tools/backends/ubi-html.md +232 -0
  231. package/skills/working-with-mise/references/dev-tools/backends/vfox-html.md +173 -0
  232. package/skills/working-with-mise/references/dev-tools/backends/vfox.md +173 -0
  233. package/skills/working-with-mise/references/dev-tools/backends.md +32 -0
  234. package/skills/working-with-mise/references/dev-tools/comparison-to-asdf-html.md +112 -0
  235. package/skills/working-with-mise/references/dev-tools/deps-html.md +390 -0
  236. package/skills/working-with-mise/references/dev-tools/github-tokens-html.md +390 -0
  237. package/skills/working-with-mise/references/dev-tools/index-html.md +420 -0
  238. package/skills/working-with-mise/references/dev-tools/mise-lock-html.md +660 -0
  239. package/skills/working-with-mise/references/dev-tools/mise-oci-html.md +418 -0
  240. package/skills/working-with-mise/references/dev-tools/packslip-resources-html.md +203 -0
  241. package/skills/working-with-mise/references/dev-tools/packslip-verification-html.md +178 -0
  242. package/skills/working-with-mise/references/dev-tools/shims-html.md +397 -0
  243. package/skills/working-with-mise/references/dev-tools/tool-stubs-html.md +416 -0
  244. package/skills/working-with-mise/references/guides/getting-started.md +268 -0
  245. package/skills/working-with-mise/references/index.md +37 -0
  246. package/skills/working-with-mise/update-docs.sh +111 -0
  247. package/skills/xgent-app-release/SKILL.md +438 -0
  248. package/skills/xgent-app-release/references/build-and-package.md +65 -0
  249. package/skills/xgent-app-release/references/publish-api.md +315 -0
  250. package/skills/xgent-app-release/references/troubleshooting.md +108 -0
  251. package/skills/xgent-app-release/scripts/npm-token.mjs +94 -0
  252. package/skills/xgent-app-release/scripts/preflight.mjs +340 -0
  253. package/skills/xgent-app-release/scripts/registry-config.mjs +88 -0
  254. package/skills/xgent-image-push/SKILL.md +239 -0
  255. package/skills/xgent-image-push/registry.env.example +51 -0
  256. package/skills/xgent-image-push/scripts/push-image.sh +576 -0
  257. package/skills/xgent-init/SKILL.md +96 -0
  258. package/skills/xgent-init/references/external-app-CLAUDE.template.md +249 -0
  259. package/skills/xgent-init/references/external-app-DESIGN.template.md +317 -0
  260. package/skills/xgent-init/references/external-app-PRODUCT.template.md +87 -0
  261. package/skills/xgent-init/references/fill-guide.md +78 -0
  262. package/skills/xgent-init/scripts/check-docs.mjs +304 -0
  263. package/vendor/impeccable/LICENSE +191 -0
  264. package/vendor/impeccable/NOTICE.md +11 -0
  265. package/vendor/impeccable/VERSION.json +28 -0
  266. package/vendor/impeccable/bundle/blobs/00023f9e7f2e27604fde978b56510a8f837b76eeadd93221d11adcf4c98f1a10 +88 -0
  267. package/vendor/impeccable/bundle/blobs/00f053b877a92a9847d69eec2403e40c757152f30a5ca807c5033c58d7c297f1 +33 -0
  268. package/vendor/impeccable/bundle/blobs/012f548547fae48ebdd22a3c3af8a01032641fddd530e3783bd73b7358ab2c49 +80 -0
  269. package/vendor/impeccable/bundle/blobs/015725eeca94f52bffd2132d4cb49bc3eb1ee76e6ac7378c065e629d59f56613 +84 -0
  270. package/vendor/impeccable/bundle/blobs/03b30331c176a248a3b3bd17abdff1a1fd658f09ffb2a412b36ae9627dd3f33b +105 -0
  271. package/vendor/impeccable/bundle/blobs/041535231366047a0beeb5daa64ea9c23d5a566580f7dafdb8c0623cb4a7e76b +24 -0
  272. package/vendor/impeccable/bundle/blobs/04af9f2d6883fe76f9539d310d9c369052822a24886d2c330ab1e3fe5981c8a1 +24 -0
  273. package/vendor/impeccable/bundle/blobs/058f81f256134841875fd3183e06b37a023de0c877fd2b9eecd97011640791fe +46 -0
  274. package/vendor/impeccable/bundle/blobs/05aa836a190f4ff62e5d4619738bdb891d83d85e35d81c2e6e322d1dc084d802 +80 -0
  275. package/vendor/impeccable/bundle/blobs/05e86f37d7fa381c5e8a04b6212490a27904d3be3e9384862a0764d3daba6d78 +54 -0
  276. package/vendor/impeccable/bundle/blobs/0617b37a905f0486c1ab4e91a287c8ef8292e253095c340f452d591206272f73 +104 -0
  277. package/vendor/impeccable/bundle/blobs/074575671f24cf4298d06f0019f76e94f62e9a6ed205fce05b8e507341e64266 +111 -0
  278. package/vendor/impeccable/bundle/blobs/076a31941acbaa81013c8c511e146ed4138128eb5e9895dae3e9a27a25ac4f04 +13 -0
  279. package/vendor/impeccable/bundle/blobs/08812a8618de7bd2f63a51298e9c2558031237e8efba280062ccb636101e25e1 +80 -0
  280. package/vendor/impeccable/bundle/blobs/08a2980eae0bfea1f00229899defc28ec92c7ecb875bf5fb02e4ba80dad6c394 +806 -0
  281. package/vendor/impeccable/bundle/blobs/08d78eb31c561256f83baa0afa742a660f1467aa2c81be2f60c2b7f9c770d66e +54 -0
  282. package/vendor/impeccable/bundle/blobs/098a891028ce59c212b747d3c70468dd750aff7053a703d1336045ed31e0da7c +70 -0
  283. package/vendor/impeccable/bundle/blobs/0a151a54959a15eb32fa338890d5d64ac48a9d54d2d5442c3c7708a4c27c1858 +104 -0
  284. package/vendor/impeccable/bundle/blobs/0bb4085f6dda702846e0e56bd4f797aa1b046ab48eca02644448e368f3820f88 +104 -0
  285. package/vendor/impeccable/bundle/blobs/0bc7d7971b3edf2acd0580e847458dc6d84129d90715b452799ace3bed815c7c +84 -0
  286. package/vendor/impeccable/bundle/blobs/0bf6f08bf34d24cd88a78d544add9e4d71478bcf939926cde32f4e164882c775 +105 -0
  287. package/vendor/impeccable/bundle/blobs/0dbbef70048cc3ae44e6710ff09992ce14ad049ce8ed519b0ff8a1ddb4633f4e +111 -0
  288. package/vendor/impeccable/bundle/blobs/0e081d496eba4bd77aca81723d59120c10177a71c9551a60ab923c356fb3cf38 +104 -0
  289. package/vendor/impeccable/bundle/blobs/0e1819750e5448311a051d35ab6d0be0830418f78ca872ef10469fafebb27d4f +46 -0
  290. package/vendor/impeccable/bundle/blobs/0e18ac33b7e6a247b658fcaf926d9eac028399597dbaba366f1d2f2b884a383b +325 -0
  291. package/vendor/impeccable/bundle/blobs/0f83648f6b425225290305bced51eacebacf9bf9bc05e21cdbad46863fbc89ce +24 -0
  292. package/vendor/impeccable/bundle/blobs/115e1c3f1b58b5129910ed925dbf65d61d5ac4c2036618847555ce40098aae97 +145 -0
  293. package/vendor/impeccable/bundle/blobs/11f75834c26ecd8a5b0afdf696e838953b235dc4835b7293bbc6b1bc27dd3106 +84 -0
  294. package/vendor/impeccable/bundle/blobs/12c1afcd15e86d840b89a78c6d17ce6d1b5609bac713d59271c6ab5932975dac +111 -0
  295. package/vendor/impeccable/bundle/blobs/12d2a8043ae8668ad29c32bfa92995849fc49cb016e6ebd4f7e59539d96e7b03 +46 -0
  296. package/vendor/impeccable/bundle/blobs/12fefe52d80d25014e5f7e2f9b278275a675653d3d99ae8f0ecf344cdb9abbe6 +111 -0
  297. package/vendor/impeccable/bundle/blobs/13bd27aa8573e6d45d8bbf9f3fc991e4719d28a7e8f709009a4a5a49a227fff3 +37 -0
  298. package/vendor/impeccable/bundle/blobs/1484a7ae206ab4f0e6262b21afe0f6307a629ed27d28fb7de69536a6800a4883 +37 -0
  299. package/vendor/impeccable/bundle/blobs/15b4837dccb27d7382e2f134ef050b244c4488b1906e0308f288112183cc09ac +145 -0
  300. package/vendor/impeccable/bundle/blobs/1640c70b984a43e729d72d046109f87243ae84ecd64d2600a007d140558123cc +80 -0
  301. package/vendor/impeccable/bundle/blobs/1652d639d91889a08bda7f351456c43ee30e5677aa4866a90f375e1e4be15deb +80 -0
  302. package/vendor/impeccable/bundle/blobs/16d99e9fe8e75d69042bc4fda12e93daa7e10f9fa6c00b12b0f0580b119a4cfd +105 -0
  303. package/vendor/impeccable/bundle/blobs/171777f8a8596d2ffdb43f4b935a7c6c12859ace233967f868a566390a59708e +325 -0
  304. package/vendor/impeccable/bundle/blobs/173dd66abe65633910dcb04a51f40d6ff2a793f87088f022a02fc4cad24dd133 +94 -0
  305. package/vendor/impeccable/bundle/blobs/17c583cf8ad41266ea1e787b666b9d91fe13469d3d0f6af57c08e0146f9b17ac +58 -0
  306. package/vendor/impeccable/bundle/blobs/181e814c1b9317098b2300c1b02ad0d137b6d82bd1e7e8cc64de4d00b4c50c25 +111 -0
  307. package/vendor/impeccable/bundle/blobs/190a4e642ca362d7499f3c3ab123e21f18f75457d11f072b545a183f296e6495 +99 -0
  308. package/vendor/impeccable/bundle/blobs/1971edc3784273bd8da7b1980779c6159471e857992faa6637178109cb130503 +806 -0
  309. package/vendor/impeccable/bundle/blobs/199d5d3db1197e053a2eb9c3cb927d44cbaaaeb57745c1ada3fd775ba50d9291 +104 -0
  310. package/vendor/impeccable/bundle/blobs/19c5bfce570a0e2bddd4d9c788936ff9070c90299363c4853ba77bfd37306e20 +416 -0
  311. package/vendor/impeccable/bundle/blobs/1a9180cec754f8afd354e7cb759750247e97c5bd26d3242ad4c45e315069e8c0 +37 -0
  312. package/vendor/impeccable/bundle/blobs/1c804990fd8ac23a4b19c42972b5ae591d17f620d0006f0f32927c8db5d5bf50 +145 -0
  313. package/vendor/impeccable/bundle/blobs/1d72b494f46a60e6c9c06e89bab79789dd85e11f62fb4286a03abf26d352dc1f +80 -0
  314. package/vendor/impeccable/bundle/blobs/21bc91f6e07691e82b7bba99f9e1d956f9d7a6810dcdc18d231fe73b53a13b23 +37 -0
  315. package/vendor/impeccable/bundle/blobs/238e1967d933ca5739db708f7ad9f72ca8b34bc4c9b9e1c07b0a06dcf9d00681 +806 -0
  316. package/vendor/impeccable/bundle/blobs/244e5b7bca6d22a51b4e22104a52a36e477056b03d257b56d1d4e319cd6167a8 +80 -0
  317. package/vendor/impeccable/bundle/blobs/249f0437a52ab3eb4bc4d4a9f38e085334c0fbb7795e88dd419e32b5f58c924d +42 -0
  318. package/vendor/impeccable/bundle/blobs/27c4b6c90ad12a186136f9ece9cb1830d4a6e36b11382ab334efc4543f8082de +145 -0
  319. package/vendor/impeccable/bundle/blobs/29f741b71e75fd39c65ca6df4b01b5f6c4f3c4c7adf23b47a3220ce2c0251f24 +104 -0
  320. package/vendor/impeccable/bundle/blobs/2b21f0142ee88a11dbe2593362f5a910718a61062e3a64e7ff936ef1e74fd394 +46 -0
  321. package/vendor/impeccable/bundle/blobs/2b58041cd82d819d12762b10becb95f8253c661bf6a9de40f61fc01c1204b743 +806 -0
  322. package/vendor/impeccable/bundle/blobs/2b5b2fbf5f658f34ea1997fb1aeebe01604d05187f75c6a4f1f55a5bc78520a4 +104 -0
  323. package/vendor/impeccable/bundle/blobs/2c2ed6286bd74adef4f24ef442e2e1bc0780d44bc060aa2a4c03a03988dbafd5 +325 -0
  324. package/vendor/impeccable/bundle/blobs/2d7086992c07df1fc734cdf9c420c4bd8ad409ab7909e07c8b486c303d420732 +83 -0
  325. package/vendor/impeccable/bundle/blobs/2e4846117a2fcdc1e4bc9570a5333da839649cb8ccdac6a30a87591ca05b4bb0 +54 -0
  326. package/vendor/impeccable/bundle/blobs/2f02f96f889e0c8e0e90806af1ef17e0c162a6cc402068f434d3f7608d9deda3 +54 -0
  327. package/vendor/impeccable/bundle/blobs/2fd096823e4a93f19edd421a69e10f90ebb630a014c673d1802a927c6f47b7d2 +111 -0
  328. package/vendor/impeccable/bundle/blobs/2feb3768125ba6469c92a50d516727e6d42f44579165ddfd33409948e2a3803d +27 -0
  329. package/vendor/impeccable/bundle/blobs/30e006fdee873bac23edaeadce0371161625e021e3cf442dff4b05bb82297ba1 +24 -0
  330. package/vendor/impeccable/bundle/blobs/31b90048c0b540daec46762a10c2b6b6434737a89af005054d8b848d829d003b +69 -0
  331. package/vendor/impeccable/bundle/blobs/33b6b32c0c3c0c4a2b22bd2275176b1c88a006dd94592a854f629911a0b21cdc +111 -0
  332. package/vendor/impeccable/bundle/blobs/3565d038a2eeab88a8b18ff52e6630008ab30f867f9df922a38ce8980440b2e3 +80 -0
  333. package/vendor/impeccable/bundle/blobs/356cfa0ebf61589cf5d52691d101a69d69256062fe1d11d71d95d41a78289cbd +111 -0
  334. package/vendor/impeccable/bundle/blobs/3673248740bcdd1122ccc610093ba2fe52f3943a61ce0b7170b74dc49e5b6098 +416 -0
  335. package/vendor/impeccable/bundle/blobs/37080ea5e5b381adb7eae7a427231b0ad0dee0f0916fc1d6b673b7101a5b425b +42 -0
  336. package/vendor/impeccable/bundle/blobs/3753448bca49da76dd8b12d5a8b4264414673f26e49028d37616faa8beb210b7 +127 -0
  337. package/vendor/impeccable/bundle/blobs/37565671b09d983ea1ad83a9e9190bc37255d93c68445958c6facecc7e0f7c4f +33 -0
  338. package/vendor/impeccable/bundle/blobs/37aeddc0f2031fa89d72519ae2e7542c267872f81786fb8288fca0a49118be11 +27 -0
  339. package/vendor/impeccable/bundle/blobs/37c9a2122efa64dc8789eb47d196150b0bc635e0ba95042fd381ff157002ed50 +111 -0
  340. package/vendor/impeccable/bundle/blobs/381ff89aa76e82a0d98456ec31cb117555ae045539fba47c45056daa50f611ca +46 -0
  341. package/vendor/impeccable/bundle/blobs/3895765e9434400dfc1b30e364be002cf499c1718fb2431e65b907c14ae2cb27 +86 -0
  342. package/vendor/impeccable/bundle/blobs/38c2e839e130008b6da814ab9c16f3fcbbedfdf721a9638eebd31a9e65341a7a +84 -0
  343. package/vendor/impeccable/bundle/blobs/38d4d404030c6ea935d3223db1eeb22c45d04a94f41f98e02a43cdc5af7ff2e3 +24 -0
  344. package/vendor/impeccable/bundle/blobs/3970c8e24615610b0246585e49146f6762d5082b3c8fddc08a00940d6e72d394 +80 -0
  345. package/vendor/impeccable/bundle/blobs/39ac044f2e45a9e7eed8eb68fe91d32938160eb7f8fa93d2afc42fc80a0c3c10 +54 -0
  346. package/vendor/impeccable/bundle/blobs/39d9600489073e227e4f4d55c451ce4252a6632ed7ae37923efbbcbc91f16d07 +206 -0
  347. package/vendor/impeccable/bundle/blobs/3aa908c18db91d5f31d6bba6402eab6afc4e0b75137f841a86bd012386e0d8e2 +145 -0
  348. package/vendor/impeccable/bundle/blobs/3af7c46309f748ff3845f16455a431ec0e9e807e5e3a965e96e9ee75a1198eb8 +95 -0
  349. package/vendor/impeccable/bundle/blobs/3ba92d4aa840ec1b6c2fda224339489d6dd65eedf43bb45836af02584d1faa88 +42 -0
  350. package/vendor/impeccable/bundle/blobs/3bcf81b938a0f0309e9ed6616f4bd18d82f07e2801411ee4cce51220d417eb95 +80 -0
  351. package/vendor/impeccable/bundle/blobs/3bf5d8661351831dbb2195e3b677fea1f128ca319c0589d538b66d9c9d7dddbc +111 -0
  352. package/vendor/impeccable/bundle/blobs/3dd45e1c32db3d3163a96ef198954905807b25cb9a1d206a7d77986f21d27652 +39 -0
  353. package/vendor/impeccable/bundle/blobs/3e3b6fdc6afbc2c2a734d08d6a18b393b7139c56f28f91f82e13e5555b98018a +84 -0
  354. package/vendor/impeccable/bundle/blobs/3f2c351303b74e217907006fb9c55ada2ef596e9710c13d631e20506d17b9ee8 +325 -0
  355. package/vendor/impeccable/bundle/blobs/402373ef95962ecb81dd3d7cf70ecb3bd3e22a2bd2aabb4c0d76f7f4f9447870 +105 -0
  356. package/vendor/impeccable/bundle/blobs/402656ca6df17bad1cd55ede0a966a7bb5b187cf4f89c517851f9efe7f14c0fd +87 -0
  357. package/vendor/impeccable/bundle/blobs/40c87038b5f75147a5952a96237acf312a327bf70c1bcd8e0a5f064625ae9668 +51 -0
  358. package/vendor/impeccable/bundle/blobs/420d82fe41884b7aa8c28750520146d8160c91396ac332a96b2d82a90b017fb2 +80 -0
  359. package/vendor/impeccable/bundle/blobs/420e2fdee2b7f555d9a37ce348cf62610ddd98f96b1a0a511796ba600881588c +111 -0
  360. package/vendor/impeccable/bundle/blobs/424b2e75cb204e2dca7db4a40dfe5a81f78dc0fc58ac4790e8b7bbf2f330bba4 +37 -0
  361. package/vendor/impeccable/bundle/blobs/424ff273e7ab283d6695d127bb502675627193f5b752d7b43b7524bcfc42f43f +84 -0
  362. package/vendor/impeccable/bundle/blobs/426c7f5437dd3c23a4cfaef6964dc7f1e038480f92238499b85f3ce7e4472bf4 +111 -0
  363. package/vendor/impeccable/bundle/blobs/42a71df98075f66e6eb396b69ef3d6b1c3db46d1c1d24b4edc9d15f53d193ecb +111 -0
  364. package/vendor/impeccable/bundle/blobs/433a79eee3ce4c99e79a7aebe3a6d8ec9ff70216772e0c2ff9dce3a01d672963 +46 -0
  365. package/vendor/impeccable/bundle/blobs/43852ca5917de66704f73f9019d15482bb1efd92f2eefaeeeae23610b4c0c6a0 +38 -0
  366. package/vendor/impeccable/bundle/blobs/442749aed338f51c1a3ccfb182c6ade9b74b90590b67984062ac94a5b100e914 +80 -0
  367. package/vendor/impeccable/bundle/blobs/44a91b3f0810f43829d8584e912812444d15614e4b57ca8070aee7ab899f7c1e +46 -0
  368. package/vendor/impeccable/bundle/blobs/46250caaec1bd69619a5b28a73cb3c845b319d029b0af9228aaa7001e7e0104a +37 -0
  369. package/vendor/impeccable/bundle/blobs/464c0c2b33d278375aec66caf95518f5e7ccd0aad1bea3f9dd553ed47815daa1 +325 -0
  370. package/vendor/impeccable/bundle/blobs/47b3461f6f76db80fdc49fc7542552d65fed24edc8d30d903cb76aefbad0ed05 +84 -0
  371. package/vendor/impeccable/bundle/blobs/47edbdfaf27073c47033d1ac7dfee881be49e2dcbda7671d1157300481dde6da +1 -0
  372. package/vendor/impeccable/bundle/blobs/4879f38b23d0a251a63cbb0327e660296194cd2e71eb4da3236c6ebfe5807746 +33 -0
  373. package/vendor/impeccable/bundle/blobs/48bb7c3b738f57fa4f3f714d7e3e919879036f3e751135a9acc1c5ede1850ea6 +54 -0
  374. package/vendor/impeccable/bundle/blobs/494d6fcb4701c437597c2ed16a9595af92f3d9ad53c944c96a2fb563bd766af5 +99 -0
  375. package/vendor/impeccable/bundle/blobs/49a7b37b98fb6e3ef68154174677ff4b9f1715efcffdbf6b30c3535b3e4e302c +54 -0
  376. package/vendor/impeccable/bundle/blobs/4a7d8695741e2cd354baada215b06798c050aa7a8e1ca6814f0e395e054d1ab1 +145 -0
  377. package/vendor/impeccable/bundle/blobs/4a8a45a46b79948a64b484edf389aa0b00fc80de855470cbabe3c7c71268f345 +828 -0
  378. package/vendor/impeccable/bundle/blobs/4acfb9e38f6e09f7484e36fc19704d69eab159436ee9329168be74c493042f22 +111 -0
  379. package/vendor/impeccable/bundle/blobs/4ad7c5d5821f85c2311ff91746d9b9cf272dbe0a9a5b61687f77681f5a13f812 +69 -0
  380. package/vendor/impeccable/bundle/blobs/4b0e2eea17f297daa06b17578131775be099ef43addf91007f4b7e295454f64f +105 -0
  381. package/vendor/impeccable/bundle/blobs/4bceaf3346b6f5100b5a54deaae49a38b975dd134df2836675848f06ff1e7e11 +806 -0
  382. package/vendor/impeccable/bundle/blobs/4ce929b8cafd37247ea4c148bbe39a9afe15908d1abf4a8248c5122275d16499 +85 -0
  383. package/vendor/impeccable/bundle/blobs/4df48b7a86d525ad12e7889a1fd16b06ed4b25a9470c359c7193a6d82649262f +54 -0
  384. package/vendor/impeccable/bundle/blobs/4fb6d2fcc8afaf827a7377ddd604725264fd83be871e2d35062e9d1939144404 +25 -0
  385. package/vendor/impeccable/bundle/blobs/51e2f8963377f142ebdc9864e0ecc5aa1e5b7d344ed72d0e9d748d2d3d8c71b3 +46 -0
  386. package/vendor/impeccable/bundle/blobs/521391d55814fdef6cd648ed62154a14d77b324004a0fc2d06c0a4e97857eab2 +806 -0
  387. package/vendor/impeccable/bundle/blobs/52e861ac390a62c4473ae0cf87ff18dd6d721afa6557910492dd8ed28bd9970d +84 -0
  388. package/vendor/impeccable/bundle/blobs/532d6387db6f5da1a59dc7d29ce4d8ba6ca044626c367dc16e1cb8b981eb2d9a +104 -0
  389. package/vendor/impeccable/bundle/blobs/54cb270e8826380caefc8c40642a5d973f27df46bfdb762d822541a0c72a9877 +145 -0
  390. package/vendor/impeccable/bundle/blobs/54e71283cbd5646021fcd8eaa28d85852ec5288109c306aca9db9e2e4832338e +69 -0
  391. package/vendor/impeccable/bundle/blobs/5515d5210fbe2ef64e611ef2827a7204b7cea2f9df059f3ea499931f45065d93 +104 -0
  392. package/vendor/impeccable/bundle/blobs/55e95137b3f9198c1d4dfc425366b82f1ef5f77d602682b2edf91f2ce9296289 +24 -0
  393. package/vendor/impeccable/bundle/blobs/56500b1f9d2fcec8324d7f448d813048b5831a46d3feeb1055bd3eb17ec3660f +70 -0
  394. package/vendor/impeccable/bundle/blobs/571526fd5c60a586ff65bdb3f8333f26c36ae227f5f5ece826f4a43b4d4aee0f +325 -0
  395. package/vendor/impeccable/bundle/blobs/5738bcf9ac21dbb2113fd0c5cc7e4bbfc8174778916ab5843644332b3dbbc36e +46 -0
  396. package/vendor/impeccable/bundle/blobs/57402ef6fd9d0745f8c60d778f77da83a8b16edf751fa1013598a0f6e5f0f541 +136 -0
  397. package/vendor/impeccable/bundle/blobs/57e28934208e3eac653ab59c5c6a5e4eace44906d8ac86472988242d777ca5a1 +54 -0
  398. package/vendor/impeccable/bundle/blobs/581409ace104a81744b7d08f5398a2c207cf76d9e50751f807b4382eaf66454f +46 -0
  399. package/vendor/impeccable/bundle/blobs/598bfed550954471ba4d257d46b4d608cd82e4cdbf36d07bf93c5f4a563f7727 +89 -0
  400. package/vendor/impeccable/bundle/blobs/599afc25c1d6d083e4d4e60e1617ab05f6c5ecd52be75473f3788063219aa174 +31 -0
  401. package/vendor/impeccable/bundle/blobs/5b30a06646ad5e453d6b5ed1b8d446f69fca3cd13b8aeda28f0d0b2cbe8f62d1 +111 -0
  402. package/vendor/impeccable/bundle/blobs/5b5dcf7029376ee6fbcf13e5975eb828dd1dbf41736c1bd5017dcda8173b1ebc +325 -0
  403. package/vendor/impeccable/bundle/blobs/5be952da521a2d5fb799c834d14ce5388284374bc23c5efcec737a05aa65d878 +84 -0
  404. package/vendor/impeccable/bundle/blobs/5c036648951d555e73be63161e5c9edcba146d8e9f64b1604ffdea765cde5d9d +131 -0
  405. package/vendor/impeccable/bundle/blobs/5c4cd151c97dae824a039211d7ccfba4c572b76d8f079c6186ba1dd5dae7732b +54 -0
  406. package/vendor/impeccable/bundle/blobs/5ce02fc8f353d7f659535fb80e453963dc047a07c4396adf098fe010b479e7c0 +84 -0
  407. package/vendor/impeccable/bundle/blobs/5ce0631eacaae6d9fbb23ade26a774a20142cb40d3a8d5608a3fb9dbc4116b60 +806 -0
  408. package/vendor/impeccable/bundle/blobs/5db17cd013c10dca0012bc18aee7276280941579aa50757682e9ce60c4f7a006 +104 -0
  409. package/vendor/impeccable/bundle/blobs/5e3616ac45568f239fda3a4764f7d3bf3473b8b5eefd91e402dd9208a4b851d1 +24 -0
  410. package/vendor/impeccable/bundle/blobs/5f24c5a97b4ffcabc7c432b064cfdd04c7a2ad52f52e765be648dc0aadab8f38 +38 -0
  411. package/vendor/impeccable/bundle/blobs/5fae7f8a2fc3ddd49ad0a413446dc44daedef5b6b7de5eb935bd2fbfad646d58 +92 -0
  412. package/vendor/impeccable/bundle/blobs/61c72fdde649bf7f2e0668e48f9d222666c81672100b5f2265940e7aa13c8767 +111 -0
  413. package/vendor/impeccable/bundle/blobs/633903ba7cb38ed502448a66691fbf655805786a2f06be67043f12294ad08e86 +37 -0
  414. package/vendor/impeccable/bundle/blobs/64802d14087fc96b38ef3881fef8098b36068d07f3b942031637b18eef3dd2af +84 -0
  415. package/vendor/impeccable/bundle/blobs/64807d8f43267f4ed879e997834bbf793bd4605ba1dc65f4b545324b660a7063 +80 -0
  416. package/vendor/impeccable/bundle/blobs/68bc52a604731ca024610051fc763f4d78a53eb2a45d35b40a8c0383043baa63 +86 -0
  417. package/vendor/impeccable/bundle/blobs/68c5636a7858dd0b5137a9229c15e25fdc2ee40a0f8a4e9d809f78e809256262 +327 -0
  418. package/vendor/impeccable/bundle/blobs/696c15f96d49a03091b71a408151a3297521f7a8231b98ca9b1103667a0b5f89 +80 -0
  419. package/vendor/impeccable/bundle/blobs/6989120346e87907d59cc6d4708dd9dee29227ad583fbefee28935395b68ce34 +24 -0
  420. package/vendor/impeccable/bundle/blobs/69be9bb887f4d8ba4ead24928f9b97d122c796e731652fc0c08f195ab8ec2815 +105 -0
  421. package/vendor/impeccable/bundle/blobs/6abbf5979db5cb1d7965bf5f91d589e984843069c587f4d1e63aab135bbace0f +37 -0
  422. package/vendor/impeccable/bundle/blobs/6acc0bf221a4ddc6e5c6438348920b2ca2393b29c4314dbde2cdc23f2b1a9639 +58 -0
  423. package/vendor/impeccable/bundle/blobs/6bc62a59f6fef0b749927c8d10e9849ab2411199d86d70772a86f8e83ac309f5 +29 -0
  424. package/vendor/impeccable/bundle/blobs/6bdbc3f745ceee15e10b050f109ce42bbeb53ab3c3b5239257de1d596654dee7 +94 -0
  425. package/vendor/impeccable/bundle/blobs/6c382f8283756e8a693d832b750f7e4cbff1ca5bdcc3825b2b4ef4da9f21876a +94 -0
  426. package/vendor/impeccable/bundle/blobs/6c9ce3e27ec4520ead001da3aad2a2ebba481c4e5cd22873db8890259ee579fe +95 -0
  427. package/vendor/impeccable/bundle/blobs/6d368b679a0ed1815812815de65863b5840d419589dfbda06224c01149240287 +258 -0
  428. package/vendor/impeccable/bundle/blobs/6d47503587ad6da17ac529f44a96123bbb96a9c91a7a9350b7690fc467561a5d +46 -0
  429. package/vendor/impeccable/bundle/blobs/6e20041e209e8705d14aa9c4fb8cca3f0d743791de633785e5b46e2dd1ff1a6b +24 -0
  430. package/vendor/impeccable/bundle/blobs/6e7e3b7c4cf331cdb43f4546c164acd6c45a267ce3289dcfa87e13202d98c747 +104 -0
  431. package/vendor/impeccable/bundle/blobs/6f1d52863482fa0f6fff877f0cc8f6dd0b4230d28050b0d267e082776e61a332 +37 -0
  432. package/vendor/impeccable/bundle/blobs/706c68612a7c6b899a0abf0b407eca7cabcd371deae60f830aa38aa86947694e +84 -0
  433. package/vendor/impeccable/bundle/blobs/713cac92a71ef45e8b700180d881f830096cfe2b0615e79b276ccc4a12c051e0 +80 -0
  434. package/vendor/impeccable/bundle/blobs/733504a70ed20bcfca9c26c353f7b88f8491d24f3f2fe124dc1e73b28eefa296 +145 -0
  435. package/vendor/impeccable/bundle/blobs/73549b5536699c915156339976192fb38534bb43158cf9262ff5b89090388c64 +806 -0
  436. package/vendor/impeccable/bundle/blobs/73bd60faec1d8360753595f1ee9e970b44933448202767d7b0e87c275d399396 +6 -0
  437. package/vendor/impeccable/bundle/blobs/745b1f74877f6b3445da48af65dc45c66c3daa7738cb9a928aaa900889c2a204 +104 -0
  438. package/vendor/impeccable/bundle/blobs/74e20b26c29242bbebf79760315f7f0788e001566695618cfc70805484c6f92a +111 -0
  439. package/vendor/impeccable/bundle/blobs/759bab1d8adc071fdde2efcf6e2157aa4026f3c2b4f3c342a8070bf328011616 +214 -0
  440. package/vendor/impeccable/bundle/blobs/7848f40e224cf520bd8554943c9816a1ff8c97b1db57af0844e3b1ebb223d91f +416 -0
  441. package/vendor/impeccable/bundle/blobs/78ac93689928a580c2f90242cbaa96dda3fa4e55ff1f1d00e412b2a62ad85232 +145 -0
  442. package/vendor/impeccable/bundle/blobs/78c236dadb7e70337dc9dfa67e65fc15b7abed137ad320c16410ddfa7aec34f9 +131 -0
  443. package/vendor/impeccable/bundle/blobs/79114c6bf78b5a1838fe19bf033f3be85b232560eebf190ff8586aaec34ea170 +105 -0
  444. package/vendor/impeccable/bundle/blobs/79f85e381d1d6fdc8d39f54e1c8753fccf19b4ba3abb9827b6a7cc61eb376d1f +416 -0
  445. package/vendor/impeccable/bundle/blobs/7ad26830c7399a118cdbd4465a5426bc1919015aba99fd15959dc6deb8edc8d6 +80 -0
  446. package/vendor/impeccable/bundle/blobs/7af0a8665057c83b39bca2c8c7427ef2343734f70d4128c377113a6726a1e3b1 +12990 -0
  447. package/vendor/impeccable/bundle/blobs/7fd1617d5a86b7a1a0bf9d6e291b334ac41a3efce31031eeaef11de7cd7e75b4 +325 -0
  448. package/vendor/impeccable/bundle/blobs/800cf1c0392b24de7c0a1c6ea6778ecb433dec71c49a150bce96a98477527b2f +1 -0
  449. package/vendor/impeccable/bundle/blobs/808291e15746c9a64d9ede3ad3f06664b0a72970aa95052e064a96f1bfbed361 +54 -0
  450. package/vendor/impeccable/bundle/blobs/81666fc7f783b4e3514db6554e713dc0479bd9cdedb06e93d15f8b579aae869a +105 -0
  451. package/vendor/impeccable/bundle/blobs/824b994782a1fe68a244bbdff7218a2e0854655d90cc0fb5ade7ef9259ba6305 +46 -0
  452. package/vendor/impeccable/bundle/blobs/82a5e564563333aabb7ab4d2f8c26c785dfe2c2416ac6e9f30cba31440676194 +46 -0
  453. package/vendor/impeccable/bundle/blobs/835f19a0a3812f3652dd6979a2ce5597f654fd01f26e1b420b92d5f42b997ce4 +121 -0
  454. package/vendor/impeccable/bundle/blobs/84a06415956986cb215139b3efda7b3c7a5bb6f502a3b3d9300f0744a970e620 +99 -0
  455. package/vendor/impeccable/bundle/blobs/84df879a0332a56ece4bff1922ecf4f50635951b3c67e67eb46f31bc5d30fa9a +111 -0
  456. package/vendor/impeccable/bundle/blobs/85b9c2d051de94ee9129c58be111946f73035ca62bbd2a3936f4fa48768fe5cf +145 -0
  457. package/vendor/impeccable/bundle/blobs/869fa5390b84bfd00d072f5280a9002ea3e3936edf5985241be641a87f03ff7b +41 -0
  458. package/vendor/impeccable/bundle/blobs/86d10faab62da852aa1f4304157871545c853da708b6fe61c80aefb552c1f300 +84 -0
  459. package/vendor/impeccable/bundle/blobs/87b3db688c7963898bda8096f7868fed05ec5a0a80d14298e8b906b70cdf9c42 +416 -0
  460. package/vendor/impeccable/bundle/blobs/88749ebbe9bc87250765a07c2b959508262bd0e276ad60baa53e6e48c3579143 +806 -0
  461. package/vendor/impeccable/bundle/blobs/896da399bafcffb0623bdd81bb18709d6eab25c9d5917e739c8798f31ff0d076 +46 -0
  462. package/vendor/impeccable/bundle/blobs/89eb0206a0d9308c6c6a7cc01bc4fd8812d2bd34bb9a831988c5d86fac2c60de +42 -0
  463. package/vendor/impeccable/bundle/blobs/8a1c872773996dfa1c1eb765ac7ed8e8d41f99d4f12f090b4725b694e85eaa62 +336 -0
  464. package/vendor/impeccable/bundle/blobs/8a2d316593a631579bbb2f3fcb90d4488f85e97f69698dd2dd4fb50766f537d3 +325 -0
  465. package/vendor/impeccable/bundle/blobs/8b23562ccc3e41609ce6e67fdad6cc57b6c961964c329eff6975a1b4c5471c0d +111 -0
  466. package/vendor/impeccable/bundle/blobs/8c06daf096984cf71cf4133ea284dd6eaf503208da828816836ea41dfb69a234 +80 -0
  467. package/vendor/impeccable/bundle/blobs/8c34f78d71ac02c99303c7e0ca9ef30341aa9ecdeb75804dcba7e36a127914c1 +84 -0
  468. package/vendor/impeccable/bundle/blobs/8e7bb79db7331b93f99de314dd5599de8587ec0b6c25e26cf1efab25c0777fcb +86 -0
  469. package/vendor/impeccable/bundle/blobs/8eb39a13e3d3650d4261f8fb06e91d6c0b888ca12ddbd3a5610cd8f0b05ad176 +69 -0
  470. package/vendor/impeccable/bundle/blobs/8eb466778023fccea641654d662157b123eeb360f4a0875bf6fbe3d93680851c +24 -0
  471. package/vendor/impeccable/bundle/blobs/8f0867db7c6f6a54348a0d951f198a1bd852cd12505d821e6e1ac6bd42e7fcea +87 -0
  472. package/vendor/impeccable/bundle/blobs/8f651cb1f8cde0acc5cc511b77fddd98558a527f54974698a1650b0fd7e849a7 +43 -0
  473. package/vendor/impeccable/bundle/blobs/8ff60b8b5369d364f732f8de10479a39294e65341b3e0b6497b21de5c8e34b2d +806 -0
  474. package/vendor/impeccable/bundle/blobs/904859c8160b02330b04db23a8eeeb4ef55bcaa10f5208b8d73a1718334633e7 +84 -0
  475. package/vendor/impeccable/bundle/blobs/910461b1c1f8216155165955c860a884a1e2f557cb38f21ef512ea90ef6503c2 +136 -0
  476. package/vendor/impeccable/bundle/blobs/9205e222bc6565b37fb504ceec93233c2d2a456802b69d16e6b1c44723907c4c +5 -0
  477. package/vendor/impeccable/bundle/blobs/93eda27117930692a20f668f1cb0a80b7e14ab865998faba567cd721116081d4 +84 -0
  478. package/vendor/impeccable/bundle/blobs/943b0d7c9ce4f6802d8440a07b2ad3c61cbd1cc00ab63962bab7eea9ca584d20 +46 -0
  479. package/vendor/impeccable/bundle/blobs/948326fab89f0d5c07355a06b9b9c30d08bba2e3a673a0151ebbf5a39dff7b9a +40 -0
  480. package/vendor/impeccable/bundle/blobs/94b4ce6299fea93d9f256b2d25705961a76bc5ea940c56db4145686ebc99df1b +89 -0
  481. package/vendor/impeccable/bundle/blobs/95b07450ad1ea0b7adc369587b06e52404945bbaa5d87f7491fac7ffd0e6e2ae +11 -0
  482. package/vendor/impeccable/bundle/blobs/960cb922bc934adbf9192e9428ff6bec1f382038166f02a785939c93b7391067 +139 -0
  483. package/vendor/impeccable/bundle/blobs/96e2e6bd4fcf9a2c6da65fb029f96d9176308fae2efd9d8653d3b8d838960e07 +44 -0
  484. package/vendor/impeccable/bundle/blobs/96e508039c719c0815701c36b8418b18baee1967f915fa29b23b84861ae8ea94 +127 -0
  485. package/vendor/impeccable/bundle/blobs/98afc4c6da252e90c6b783079b6f157bf94a13dd4351392e881edd2a100edf6a +105 -0
  486. package/vendor/impeccable/bundle/blobs/9a2c08ee2516d2ee87129e7ebe6a0895f9990c9852d1f6fa7e70be9a6a88a659 +234 -0
  487. package/vendor/impeccable/bundle/blobs/9b2fc50c5062073d097140cde85602bba181e325ec6b9eea1bd3da74582acb9d +46 -0
  488. package/vendor/impeccable/bundle/blobs/9b85b85443aec09918befb83208c72f475457db8261a8fc5e83ef7eec474c869 +145 -0
  489. package/vendor/impeccable/bundle/blobs/9deb14303b421b5a9232755b5b9f317716f33e1e211557a98a00a9c409775c4d +145 -0
  490. package/vendor/impeccable/bundle/blobs/9e161532dc6731581d7a5f35bda5a2865e5248df7aff90e6dfc9221409893e35 +54 -0
  491. package/vendor/impeccable/bundle/blobs/9eb03b319ce7a2b281bc85ed1b0a437eb05ab2f765fc267354f9f9e6cbfadc25 +806 -0
  492. package/vendor/impeccable/bundle/blobs/9f1151faffbaadba0ddf5c09a4b2a82c9a12c900a2c1a9dac9863ba9ba0f420e +54 -0
  493. package/vendor/impeccable/bundle/blobs/a1a56df5fd51be403ca85a2f8054bb6f2bfeee443556c7798c2482e412fb6a09 +54 -0
  494. package/vendor/impeccable/bundle/blobs/a1dbde501ffabb50f30f28f2de6755b5e91b3d4028292c5a3abd3358106eb457 +37 -0
  495. package/vendor/impeccable/bundle/blobs/a1e4febca3455787d7c753fe177a150dccde6e742957de400b0307247802d200 +145 -0
  496. package/vendor/impeccable/bundle/blobs/a423108e7e31a54564e2e0794186394f842625fd9f7d7ce6e6615362511503a2 +93 -0
  497. package/vendor/impeccable/bundle/blobs/a4cfd2330c8cca94b62986679b3f9e3bb9ada0cb30c2c63c5d19c6039f5a45ae +104 -0
  498. package/vendor/impeccable/bundle/blobs/a5371492582dbeb69b24a1a2947b256a2da8a4d55917af709bbab6e452d9d23c +145 -0
  499. package/vendor/impeccable/bundle/blobs/a55f016c046cb6a27c55bd7f346375aeb506a755c4fbca19a5f92dbd42309c23 +59 -0
  500. package/vendor/impeccable/bundle/blobs/a7045711a1f0dd2cd5bd98e57ff615f638d7e29738bdd618cf15e83fea5993b9 +325 -0
  501. package/vendor/impeccable/bundle/blobs/a7f036f4217933db8a96cf2f0ba251b15f388839d62bcf95720ce0b7152dd185 +806 -0
  502. package/vendor/impeccable/bundle/blobs/a8547c8565979894f0c07f92a96ac2a38e681a31fbf155ffeefc7566e185d9c2 +39 -0
  503. package/vendor/impeccable/bundle/blobs/a8f4056a85706c0c8f80ec48e9b437e198464100aa42786f9252051f4b931c19 +111 -0
  504. package/vendor/impeccable/bundle/blobs/a9515f6f084d8f51c378eb3cdc6db1f12e06dba2d32fc61b7ee7950fa2586f2e +24 -0
  505. package/vendor/impeccable/bundle/blobs/a9856cb40da6519b1334bcfc75a4fbe83bef39ca86ee6f3effcb2a96794c627c +127 -0
  506. package/vendor/impeccable/bundle/blobs/a98b397cedeeaa1da57f3395b3d9b6c1fc477f4247fb9dc13e4da3da588283ff +54 -0
  507. package/vendor/impeccable/bundle/blobs/a9d2203acd45ca33a13d5c68b02b23ed512425ac15f0e8438318ed124b43729d +61 -0
  508. package/vendor/impeccable/bundle/blobs/ac695dd89d5f1261004cfa966526f5d5e913c92fa0640d4d71cb42493effad08 +131 -0
  509. package/vendor/impeccable/bundle/blobs/ad389ab12800738b0e5c97618278b7a824654b25990166ec9f389caa5c3386ca +37 -0
  510. package/vendor/impeccable/bundle/blobs/add1bee76f897f989166a5b9ad1b38d9173248e29d668d5c885ae9a0eff73861 +105 -0
  511. package/vendor/impeccable/bundle/blobs/af34b8af89edb10e228c0482754423f48238fce816eceb8703b8781c130da54e +24 -0
  512. package/vendor/impeccable/bundle/blobs/b0e1a0721a1e47675a8750cfb608138743dd9fa9c047146e5cc8f82b9041be7a +806 -0
  513. package/vendor/impeccable/bundle/blobs/b14dc725606717be881a058bb691c0af1860cc8ad98d48e5a4789fe1a7de5458 +806 -0
  514. package/vendor/impeccable/bundle/blobs/b161198874e4e77599bc31691e78790be14bacc2eb03be168c8a7543ece9fbe1 +145 -0
  515. package/vendor/impeccable/bundle/blobs/b29e10f4506af2277739ad2373bc91c9fff41dbe76c9907f45152b4178cc6b6c +105 -0
  516. package/vendor/impeccable/bundle/blobs/b2d71ff0df7ed49e06dfc4acfce3d3f7eb48afa68be04763ee8c08354df50a07 +97 -0
  517. package/vendor/impeccable/bundle/blobs/b2f60e0154bf0e687badc46d8c8420e2118a9a6e21162050722be779dc02cb6d +111 -0
  518. package/vendor/impeccable/bundle/blobs/b314a0c5bd844f6471ea3031aeb9299674d972fbdd1615d99d16478de437d26d +84 -0
  519. package/vendor/impeccable/bundle/blobs/b31ff29c7a1ea979c6d039f7e8d17007410697ab49536690dca109f0af3f20f8 +336 -0
  520. package/vendor/impeccable/bundle/blobs/b3782f2d9215eb0f5df4fe3c0e0bec07cef011e1836d4d0e45ef02bc48d3adde +24 -0
  521. package/vendor/impeccable/bundle/blobs/b4def5b57733b6ba233570bd5691a536901f8b15479fc0111a2cde56224d0e1a +325 -0
  522. package/vendor/impeccable/bundle/blobs/b5f4fbb4a044c3f5ec14adc847222488f00fccabbf79ecd0b21084c8d319d616 +105 -0
  523. package/vendor/impeccable/bundle/blobs/b6022a8c7200e96b0b55c2ff599a01d64123a2f5fe01557d4ca5192a6e0f0b0c +145 -0
  524. package/vendor/impeccable/bundle/blobs/b6a2ef031313d3848ab2928875298550836f0f9ff7bdf5772e918c5c610ea448 +806 -0
  525. package/vendor/impeccable/bundle/blobs/b6dfd3df9a371e7d179d365cc1d72c11d4ed91b6507c0e1dbec0843419542f66 +84 -0
  526. package/vendor/impeccable/bundle/blobs/b7fcd2b03539d1029c8774fa806e6f4c677448e9e97e15f69b066022536c5491 +80 -0
  527. package/vendor/impeccable/bundle/blobs/b824bb76a657d3edd65e89807dcb21a3679eab39292423066e11368b35afba79 +325 -0
  528. package/vendor/impeccable/bundle/blobs/b8d49a3cab3428d9f351502e9c2c5802cef187e0d2af626ef3e1cd1837fd06bf +105 -0
  529. package/vendor/impeccable/bundle/blobs/bad9250670c18d89722563fd747bae4c4bec64d1db0ee09d12d4fea04fe271b8 +84 -0
  530. package/vendor/impeccable/bundle/blobs/bb069b43c09109d7031b0374e31955749fec657b252d39782f11e8985aca2b51 +131 -0
  531. package/vendor/impeccable/bundle/blobs/bb36665889124a0b6e15f16045265737449c3bdcf2712cdb08af3cfa01563e2b +14 -0
  532. package/vendor/impeccable/bundle/blobs/bb59a1f78f3d2aa78e4b024fe203117155f50946a9e4bbe65c1b3b3abdcee356 +104 -0
  533. package/vendor/impeccable/bundle/blobs/bb9d4bb369216e892eea25adeaefc5a3e09bb4abd31e3475b79e47b3aee2a6af +806 -0
  534. package/vendor/impeccable/bundle/blobs/bc5f71f1129d0f2c310d913d07c8dc609a1d25644121bd78c308f42d52a0b9e9 +86 -0
  535. package/vendor/impeccable/bundle/blobs/bc7a5128cfed46148396c08798b6b9429406fbe477e84e331a36ee2840b6b776 +111 -0
  536. package/vendor/impeccable/bundle/blobs/bcc05ea92faebb5c74037a9d4263a5ce9a56f5ab07c8ab3c59ee704d8cade745 +24 -0
  537. package/vendor/impeccable/bundle/blobs/bdf9a59beea111ac6f98f5624854feb5a5a1d60b1989edbbfabf3dc6f357a7e6 +105 -0
  538. package/vendor/impeccable/bundle/blobs/bdfd2a879ca65e437481eac5309f2283da225121630935d89ed902cfdf470c8e +105 -0
  539. package/vendor/impeccable/bundle/blobs/bea6ebfda78c51b9cf372097a1d77431d0f6bcd96eadec13a2ac95afbb87fb6d +104 -0
  540. package/vendor/impeccable/bundle/blobs/bead87679caad7c537dd7c04c3bb78be56ac7eec279ad6aad7322f48ff2df2d9 +312 -0
  541. package/vendor/impeccable/bundle/blobs/bf3b8883f8550744e08754af82a78939ab8b1237e5fad6f38d819e2f17e8a389 +104 -0
  542. package/vendor/impeccable/bundle/blobs/bf92a4a51b29de9661c5fa82f3d79244718a67d385ef661990f0c4a5b367e843 +104 -0
  543. package/vendor/impeccable/bundle/blobs/bfc51972fbf387566dc9e29c8b1af479a66ab401fdbce659fae9e6a5a9d85316 +69 -0
  544. package/vendor/impeccable/bundle/blobs/c02feba25a961a72647ad317aba2d65baeeed53c4cdcc072f25bb37f4d867d43 +84 -0
  545. package/vendor/impeccable/bundle/blobs/c1cb6877ca99a0c1b38ba0c7d59f32702d3022f6821d8045f7133f7c40b6362f +242 -0
  546. package/vendor/impeccable/bundle/blobs/c1f3766091019b6f9183bc1d11b1e0fe03d44c168dc05a682c55df32f904dcfd +33 -0
  547. package/vendor/impeccable/bundle/blobs/c327bf17f2af186f87164dee5fb5468746a9b137f0b604365d531ac9387f3712 +325 -0
  548. package/vendor/impeccable/bundle/blobs/c36f6aac0ddf52eabbb21df09fd3310540dca6b09e7a4017d18e94c06c469405 +46 -0
  549. package/vendor/impeccable/bundle/blobs/c3ad2a5fa570876af6645c48d246c664859e19f253d2dc9e0ead34e785d5b40a +84 -0
  550. package/vendor/impeccable/bundle/blobs/c6a0ec6c28ae55fe539f0f41a507b1638495afd285d6eb15c00245fc8cc7e7fe +42 -0
  551. package/vendor/impeccable/bundle/blobs/c6f15d20d8d8748c4c475ff70cdb0ee426f2e6c9e7eab6169311f4dffd279ea1 +54 -0
  552. package/vendor/impeccable/bundle/blobs/c83d6a13fdfb58835c845f61aed3fc6dca17b5569d33387ced840bc13424f354 +84 -0
  553. package/vendor/impeccable/bundle/blobs/c9284892cb1f21aaeaf93fdf2e9e7a679d05e0baa8ddf309a79a9790d262ad38 +806 -0
  554. package/vendor/impeccable/bundle/blobs/cb8caddbb3919e5bf7f252143b519fb16db28a244642d937b186cb89962d9201 +828 -0
  555. package/vendor/impeccable/bundle/blobs/cbd8bd68fa00935dd0f179adb169252629cf7ee443ea9dc7db77e7ef2cf77446 +4 -0
  556. package/vendor/impeccable/bundle/blobs/cf3ae16765e7b5bc333ef76e24ab37f080e3d62e931c4986158e3cbcda6b9f7a +46 -0
  557. package/vendor/impeccable/bundle/blobs/d07e3131cdf3e392e59eaa3e2f59fcb0799d9494df4adfee12a21067fb8365ce +37 -0
  558. package/vendor/impeccable/bundle/blobs/d1366aa4802b364893c2a14b16fe95c3b7fab79f9f69eb272fd1538f7cb1ce2c +105 -0
  559. package/vendor/impeccable/bundle/blobs/d15a2914d93e07a4956acd5c8b8211af17380f527acd10d8acf4f4920badaaaf +89 -0
  560. package/vendor/impeccable/bundle/blobs/d1faa55eb956033d28e9f27fd2bc2a9f62c5da0f0abd6534819cc0a04db54d9d +37 -0
  561. package/vendor/impeccable/bundle/blobs/d1fbd55074abb2251bdaa03749d34acc42c38e46e47549f18f5848df57d43c42 +86 -0
  562. package/vendor/impeccable/bundle/blobs/d2455359baf5f9e75360c7094e28a16937c8674619e07d58f30d2b5abfd31e53 +105 -0
  563. package/vendor/impeccable/bundle/blobs/d658c48ffbe0031e8e3b318996cad6ceafe29e40aa50d5bb25e4bf1d6839dc7c +89 -0
  564. package/vendor/impeccable/bundle/blobs/d6a1fa1689642a6db9027493747d7ed54f9e0cae660472022c0a0a8dfdead3f4 +54 -0
  565. package/vendor/impeccable/bundle/blobs/d7211a816aa8ca1111701930f7cdab82b4c8caa94c9a37522c1d7945209b01c2 +84 -0
  566. package/vendor/impeccable/bundle/blobs/d87879329982d608866e4babd31c61438ec34c68483e529761fbf420203eeebd +104 -0
  567. package/vendor/impeccable/bundle/blobs/daa2a8ecd874f9f940dfd72aaa329318b06bb9be25515be85fea84c871b637a6 +145 -0
  568. package/vendor/impeccable/bundle/blobs/dcf7340da023e64144af5768b8bf44ecf45b1bfdec12d3b1c9e6618f17f8c60a +131 -0
  569. package/vendor/impeccable/bundle/blobs/dde1b74aeab3d90320e134f0ed0422bef99917dcab4c1749aa1720a2c94f725f +37 -0
  570. package/vendor/impeccable/bundle/blobs/de1b7404f4cdfd7b515196afb17b74b1980f0bc88cb8681ae93a76ca48ec7bdb +167 -0
  571. package/vendor/impeccable/bundle/blobs/df0eb9e9a484fc7b8a0f3e50573a7d7f81e0f17598ac30d9f3fe5a6c6aa5fefa +37 -0
  572. package/vendor/impeccable/bundle/blobs/df23e9ee5b689a05ed88f42e9a36aaffa2e6e28b1d56e2832acaa1d3603fd363 +105 -0
  573. package/vendor/impeccable/bundle/blobs/df4f14df1daaad1606b682995f649da19a85debf264092447b3b7ddb8b4bc1ce +147 -0
  574. package/vendor/impeccable/bundle/blobs/dfd6f341b156bc604e7556b27cba437d5870fbc82d4c673d0127cf18151b2226 +99 -0
  575. package/vendor/impeccable/bundle/blobs/e02ba7f4417e84b3bd5ec65287c4a14cf163ca3ac6f8ee37d8f709d0c8b0b6d2 +84 -0
  576. package/vendor/impeccable/bundle/blobs/e21af575fcc0f1df54ae422bea4dfa1e5211422606908919f6a86e19e0d5c20c +89 -0
  577. package/vendor/impeccable/bundle/blobs/e26ddd48211aae08fe6debf2a7a4308aa081ed224668cde528e451888db0e3e3 +325 -0
  578. package/vendor/impeccable/bundle/blobs/e2e275495354eeccb7e59af7d74e2ff1f371839bd6aaec1266428760995fb24c +104 -0
  579. package/vendor/impeccable/bundle/blobs/e2f98c4136d0ab70ec32fcdef58edb20ed8ec4f6cc067e0dae952b22cfd6a471 +24 -0
  580. package/vendor/impeccable/bundle/blobs/e3c331cc21d9a216e25e08628610ea99c97e150893c3d26e5c0cecc532f26d7b +24 -0
  581. package/vendor/impeccable/bundle/blobs/e44ca51f24c4736f9aee6024182b0409aa12ec94812b7ec94745e0999ed06a70 +29 -0
  582. package/vendor/impeccable/bundle/blobs/e49d2b0110c55751da3c965b4ae4d294aa676c961a09f8efbbbf22c1ec7c4fa0 +24 -0
  583. package/vendor/impeccable/bundle/blobs/e68467ba99684d8c975a8a2725145d29db41d70659c7544ea54cc6632660cea3 +127 -0
  584. package/vendor/impeccable/bundle/blobs/e71524578eb2bda3b8d2da3d8b8371239a2179c5fa866f9f7e48bcac45a8cd6f +84 -0
  585. package/vendor/impeccable/bundle/blobs/e71d6b97680084a7ccec01844e658cbd2042aec00da0c91bec62a240ad7dcf6a +145 -0
  586. package/vendor/impeccable/bundle/blobs/e7dd10af2c3c18c60dc20734d55ff870c323a10dadd337600f7bb980fc6b53c8 +327 -0
  587. package/vendor/impeccable/bundle/blobs/e802e4f7bdc89050a9c0f2ca506e1d493a2316e6e810c0336c57aa073717ef3e +50 -0
  588. package/vendor/impeccable/bundle/blobs/e8ee6c08e94b80324173d89d6f4cdc5b4829ea6858b3a11fc186588a490cada4 +46 -0
  589. package/vendor/impeccable/bundle/blobs/e9da72a13eb3411d6bbb316953022f62abc4434f505e5345907b216eda9f793b +39 -0
  590. package/vendor/impeccable/bundle/blobs/ea8432c90c30ecb0426662a681ead5c0941113079704e1a766cda09e85b15b4f +111 -0
  591. package/vendor/impeccable/bundle/blobs/eaa50e8cd95e00a94a257db2bff4eafd820696ba75a08a384a00517c3402924e +325 -0
  592. package/vendor/impeccable/bundle/blobs/eb3213b9c9f4d6b2f153e7b457f13aa131bcf633695229dad4eac39a920bdf38 +46 -0
  593. package/vendor/impeccable/bundle/blobs/ec58806f16fc7ba29bccef08f2e158cd00be077ce05d45e943a59bd26dc6dc55 +312 -0
  594. package/vendor/impeccable/bundle/blobs/ec6338b20047099601e4bac8b2efcd597f800d5e437259f6c15d23090400621b +325 -0
  595. package/vendor/impeccable/bundle/blobs/edddeb3fad88adec9a055b1bf9d5c75418cbe97a13b1a7f6765e73249e482563 +144 -0
  596. package/vendor/impeccable/bundle/blobs/ee0a15fcfc244b76b896a2650a17b35e444d4311166b69a3cfa32d11f8f44851 +30 -0
  597. package/vendor/impeccable/bundle/blobs/ee6d6d127c1c2ab3526d529a8e3698be2185b5e346ac617f37501de2c0698b97 +99 -0
  598. package/vendor/impeccable/bundle/blobs/ef0b8eca20e1321cf7216fd0bda41ce54b0cca197cfd1b075eb51f3436f59059 +24 -0
  599. package/vendor/impeccable/bundle/blobs/ef2dde00030580ed2765cbf7be9b2ea4a6f64cb915b804fd6f6abcf38051c7b9 +234 -0
  600. package/vendor/impeccable/bundle/blobs/f0c4d0615c7d520dfc2536c01cc7f1f3aab9b60ddc399ba01289fe62edb12370 +24 -0
  601. package/vendor/impeccable/bundle/blobs/f1601095679d7d8cf6fef6845598c70d8734190709c1404fa0026e28fef2faaa +325 -0
  602. package/vendor/impeccable/bundle/blobs/f173ff03f989f162cee815feb2d8ca72daf00019c48694d89db16d52171a79c0 +24 -0
  603. package/vendor/impeccable/bundle/blobs/f424dafa190533cd32c0bc3e4131d0c472d58e16bb191eab14f0ae73c2cea917 +37 -0
  604. package/vendor/impeccable/bundle/blobs/f597742c8e5562263d3bce725cb55e920d8c2c60223f41a632d523ca30cdd12b +111 -0
  605. package/vendor/impeccable/bundle/blobs/f672ef8251a3ed4051a053d30819664951b17540b2899acd27d20e500c234abc +258 -0
  606. package/vendor/impeccable/bundle/blobs/f7916d0113da7a19d4e03c113d5563d181457e44f1646ecab9191cfee5ae776d +89 -0
  607. package/vendor/impeccable/bundle/blobs/f7a9e3f30fe07b0d98351730e9895d50bba96dd42fe91c0d9b9a76ef62e53322 +80 -0
  608. package/vendor/impeccable/bundle/blobs/f7b854effc55c8f07e40a415e0d6b5c333f4042fbc849fac73d52619c8d053a1 +54 -0
  609. package/vendor/impeccable/bundle/blobs/f964506c0fae87b3c2c1db7016ddc9be9ef970bbcf5548d684b997b5d5991586 +33 -0
  610. package/vendor/impeccable/bundle/blobs/f97a6891c80bbbc728edefcf4b638d1a823b38f3cb16ecd0fbb717734cc5c0c8 +46 -0
  611. package/vendor/impeccable/bundle/blobs/f9cbbad0cc08fb9bd69d4d3046067c6cf820b89cdaf7af8c81c671fb0a62b6ae +54 -0
  612. package/vendor/impeccable/bundle/blobs/fce6688138d2ceb1e3d2cde5231f54b1d8dc8748b4c95a7919aa83b6f924cf96 +127 -0
  613. package/vendor/impeccable/bundle/blobs/fd5579dbae1fc2495b7dddde48df9673acebd27953bbb56d506d3b470375c9e9 +37 -0
  614. package/vendor/impeccable/bundle/blobs/fe91fcf28638f95577af481a50edaf339d6c9a3ad3b9fa477bc81c116b8bc392 +139 -0
  615. package/vendor/impeccable/bundle/blobs/ff0ab1361f52d70d3ff0d23090d78794a75afdfa2f8c1cee5491dee69215faaa +105 -0
  616. package/vendor/impeccable/bundle/blobs/ff882c59c9aced92338aa194cc99a521ea2f083fd22eef3b1c1225e06bc72f66 +86 -0
  617. package/vendor/impeccable/bundle/manifest.json +1139 -0
  618. package/skills/dev-plan/evals/evals.json +0 -72
@@ -0,0 +1,966 @@
1
+ #!/usr/bin/env bash
2
+ # portal-dev-setup — 在【你自己 App 的 repo 里】起一个真实门户(一盒 / one-box)用于本地联调。
3
+ #
4
+ # onebox.sh init --key <你的listingKey> [--image <门户镜像tag>]
5
+ # 首次用:登录仓库并拉门户镜像 → 从镜像里取出 compose 资产 →
6
+ # 生成 compose.env(挑空闲端口、随机密钥),落在 ./portal-onebox/。
7
+ # 已存在的 compose.env 不覆盖(要整份重来加 --force)。
8
+ # 不给 --image 就用 <REGISTRY>/<PROJECT>/one-box:latest —— 一盒
9
+ # 和它的反代都挂了 latest,开新项目不用先去问 tag。
10
+ # onebox.sh up ★ 按顺序把整套铺起来(迁移→种子→各库→注册→起栈),幂等可重跑。
11
+ # 顺序本身是契约(种子会 truncate、反代启动时才读 /svc map),
12
+ # 这条命令就是为了不让人自己记它。
13
+ # onebox.sh doctor ★ 体检:把排查表里能自动判的都判一遍,每条给一行可直接粘的修法。
14
+ # 跑不通先跑它,别翻文档。
15
+ # onebox.sh add <key> ★ 把一个平台侧 App 拉进来陪调(如 omni-parser 多模态解析):
16
+ # 注册清单 + 建库 + 起容器。非破坏性、幂等。
17
+ # onebox.sh pull 只(重)拉门户镜像 —— 换版本、或 latest 移动过之后用
18
+ # onebox.sh env 生效的关键 env + 配置告警(同键多值、端口、NODE_ENV…)
19
+ # onebox.sh status env 摘要 + 容器状态 + 宿主侧健康探测
20
+ # onebox.sh smoke 只跑宿主侧健康探测
21
+ # onebox.sh chain 打印它将要用的那串 compose 参数
22
+ # onebox.sh dc <args...> docker compose <拼好的参数> <args...>
23
+ #
24
+ # 【拉取凭证】镜像仓库不开放匿名拉取,需要一份只读 puller 凭证。按顺序找第一个存在的:
25
+ # $XGENT_REGISTRY_CONFIG → ./.xgent-registry.env → ${XDG_CONFIG_HOME:-~/.config}/xgent/registry.env
26
+ # → ~/.xgent-registry.env → <skill 目录>/registry.env
27
+ # KEY=value 三项:REGISTRY(域名,不带协议)· PULLER_AUTH(base64 的「用户名:口令」)·
28
+ # ONEBOX_PROJECT(【门户一盒镜像】所在的项目名 —— 省掉 --image 时用它拼
29
+ # <REGISTRY>/<ONEBOX_PROJECT>/one-box:latest)。⚠️ 它多半【不等于】PROJECT:后者是
30
+ # xgent-image-push 用来推【你自己 App 镜像】的项目,两者同仓不同项目。缺 ONEBOX_PROJECT
31
+ # 时才回退到 PROJECT(老配置兼容),拿它拼出来的引用十有八九 not found。
32
+ # 同名环境变量优先,CI 里注入即可不必落盘。模板:<skill 目录>/puller.env.example
33
+ # 两个镜像本地都已有(比如 docker load 的离线 tar)时会跳过登录与拉取。
34
+ #
35
+ # 【一套就够】一台机器只跑一套一盒,compose 项目名固定 xgent-onebox —— 它不属于某个 App,
36
+ # 本机要联调的 App 都接进这同一套(add 拉平台侧 App / XGENT_ONEBOX_HOME 复用栈 /
37
+ # 宿主进程直连它的 pg/redis/minio,见 SKILL.md §5)。init 发现本机已有别的一盒会停下。
38
+ #
39
+ # 【一盒目录】放 docker-compose.yml 与 compose.env 的那个,按序查找:
40
+ # $XGENT_ONEBOX_HOME → ./portal-onebox → ./deploy → <git 根>/portal-onebox → <git 根>/deploy
41
+ # 判据是同时有 docker-compose.yml 与 onebox/docker-compose.onebox.yml —— 你自己 repo 里
42
+ # 那个装别的东西的 deploy/ 不会被误认。
43
+ set -euo pipefail
44
+
45
+ c_red=$'\033[31m'; c_grn=$'\033[32m'; c_ylw=$'\033[33m'; c_dim=$'\033[2m'; c_off=$'\033[0m'
46
+ warn() { printf '%s! %s%s\n' "$c_ylw" "$*" "$c_off"; }
47
+ info() { printf '%s>%s %s\n' "$c_dim" "$c_off" "$*"; }
48
+ die() { printf '%sERROR: %s%s\n' "$c_red" "$*" "$c_off" >&2; exit 1; }
49
+
50
+ SKILL_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
51
+
52
+ # --- 镜像仓库凭证 -------------------------------------------------------------
53
+ # 仓库域名与口令都不写在这个 skill 里(域名属内部信息,口令是密钥)。与仓内推镜像那套
54
+ # 用同一份 .xgent-registry.env,只是这里读的是【只读】的 puller 那两项。
55
+ load_registry_config() {
56
+ local c f key val
57
+ if [ -z "${REGISTRY_CONFIG:-}" ]; then
58
+ for c in "${XGENT_REGISTRY_CONFIG:-}" "$PWD/.xgent-registry.env" \
59
+ "${XDG_CONFIG_HOME:-$HOME/.config}/xgent/registry.env" \
60
+ "$HOME/.xgent-registry.env" "$SKILL_DIR/registry.env"; do
61
+ [ -n "$c" ] && [ -f "$c" ] && { REGISTRY_CONFIG="$c"; break; }
62
+ done
63
+ fi
64
+ f="${REGISTRY_CONFIG:-}"
65
+ [ -n "$f" ] && [ -f "$f" ] || return 0
66
+ while IFS= read -r line || [ -n "$line" ]; do
67
+ case "$line" in ''|'#'*) continue ;; esac
68
+ key="${line%%=*}"; val="${line#*=}"
69
+ case "$key" in *[!A-Za-z0-9_]*|"") continue ;; esac
70
+ val="${val%\"}"; val="${val#\"}"; val="${val%\'}"; val="${val#\'}"
71
+ case "$key" in
72
+ REGISTRY|PROJECT|ONEBOX_PROJECT|PULLER_AUTH|MANIFEST_STORE|MANIFEST_STORE_READ_TOKEN) [ -n "${!key:-}" ] || printf -v "$key" '%s' "$val" ;;
73
+ esac
74
+ done < "$f"
75
+ # base64 不是加密,同组可读就等于把口令摊在那儿
76
+ if [ -n "${PULLER_AUTH:-}" ]; then
77
+ case "$(ls -l "$f" | cut -c1-10)" in ??????---*) ;; *) warn "$f 含 PULLER_AUTH 且同组/其他人可读 —— chmod 600 $f";; esac
78
+ fi
79
+ }
80
+
81
+ require_puller() {
82
+ load_registry_config
83
+ if [ -z "${REGISTRY:-}" ] || [ -z "${PULLER_AUTH:-}" ]; then
84
+ die "$(cat <<MSG
85
+ 没有 puller 凭证,拉不到门户镜像 —— 仓库不开放匿名拉取,一盒起不来。
86
+
87
+ 先找【你们自己的开发团队】要一份 puller key:这是一对只读拉取凭证,按团队发放,
88
+ 不是谁的个人密码(一个团队共用一份,有人离职要找他们轮换)。拿到后:
89
+
90
+ cp "$SKILL_DIR/puller.env.example" ./.xgent-registry.env
91
+ chmod 600 ./.xgent-registry.env
92
+
93
+ 填两项:
94
+ REGISTRY=<仓库域名> # 不带 https://、不带端口、无尾斜杠
95
+ PULLER_AUTH=<base64> # base64 的「用户名:口令」
96
+
97
+ PULLER_AUTH 就是 ~/.docker/config.json 里 auths.<REGISTRY>.auth 那个值;
98
+ 自己算: printf '%s' '<用户名>:<口令>' | base64
99
+
100
+ 查找顺序:\$XGENT_REGISTRY_CONFIG → ./.xgent-registry.env →
101
+ \${XDG_CONFIG_HOME:-~/.config}/xgent/registry.env → ~/.xgent-registry.env →
102
+ $SKILL_DIR/registry.env
103
+ 同名环境变量优先,CI 里注入 REGISTRY / PULLER_AUTH 即可,不必落盘。
104
+
105
+ ⚠️ base64 不是加密,base64 -d 一条命令就还原成明文:别提交进 git,别转发出团队。
106
+ 已经拿到离线镜像 tar 的,先 docker load 两个镜像,本脚本会跳过拉取这一步。
107
+ MSG
108
+ )"
109
+ fi
110
+ case "$REGISTRY" in *://*) die "REGISTRY 不要带协议(去掉 http:// 或 https://):$REGISTRY";; esac
111
+ case "$REGISTRY" in */*) die "REGISTRY 只写域名,别带项目名:$REGISTRY";; esac
112
+ local dec
113
+ dec="$(printf '%s' "$PULLER_AUTH" | base64 -d 2>/dev/null || printf '%s' "$PULLER_AUTH" | base64 -D 2>/dev/null || true)"
114
+ case "$dec" in
115
+ *:*) PULLER_USER="${dec%%:*}"; PULLER_SECRET="${dec#*:}" ;;
116
+ *) die "PULLER_AUTH 不是 base64 的「用户名:口令」。自己算一遍:printf '%s' '<用户名>:<口令>' | base64" ;;
117
+ esac
118
+ }
119
+
120
+ registry_login() {
121
+ info "登录 ${REGISTRY}(用户 ${PULLER_USER},只读)…"
122
+ printf '%s' "$PULLER_SECRET" | docker login "$REGISTRY" -u "$PULLER_USER" --password-stdin >/dev/null 2>&1 \
123
+ || die "docker login $REGISTRY 失败。口令可能已被轮换 —— 先 docker logout $REGISTRY 再让开发团队补一份新的 PULLER_AUTH。(陈旧凭证不会提示你去登录,只会一直 401。)"
124
+ }
125
+
126
+ # do_pull REF HINT —— docker pull 的 "What's Next" 提示走 stderr,>/dev/null 挡不住;
127
+ # 但 2>&1 会把真错误一起吞掉,所以收进临时文件、只在失败时回显。
128
+ do_pull() {
129
+ local ref="$1" hint="$2" errf; errf="$(mktemp)"
130
+ info "拉 ${ref} …"
131
+ if ! docker pull "$ref" >/dev/null 2>"$errf"; then
132
+ local msg; msg="$(tail -3 "$errf")"; rm -f "$errf"
133
+ die "docker pull $ref 失败。${hint:+$hint
134
+ }$msg"
135
+ fi
136
+ rm -f "$errf"
137
+ }
138
+
139
+ # pull_images RUNTIME PROXY —— 两个镜像本地都在就跳过(离线 docker load 的场合)
140
+ pull_images() {
141
+ local rt="$1" px="$2"
142
+ if docker image inspect "$rt" >/dev/null 2>&1 && docker image inspect "$px" >/dev/null 2>&1; then
143
+ info "两个镜像本地已有,跳过拉取(要强制重拉用 $0 pull --image ${rt})"
144
+ return 0
145
+ fi
146
+ local host="${rt%%/*}"
147
+ case "$host" in
148
+ *.*|*:*) ;; # 带域名的私有仓
149
+ *) host="" ;; # 没有域名段 = docker hub
150
+ esac
151
+ require_puller
152
+ if [ -n "$host" ] && [ "$host" != "$REGISTRY" ]; then
153
+ die "镜像域名(${host})与配置里的 REGISTRY(${REGISTRY})对不上 —— 登录 A 却去 B 拉,必然 401。对齐这两个再来。"
154
+ fi
155
+ registry_login
156
+ do_pull "$rt" "两种可能,按顺序查:① 项目名不对 —— 一盒镜像与你自己 App 的镜像【不在同一个项目】下(配 ONEBOX_PROJECT,或直接 --image 给全);② tag 写错 —— 一盒只有 :latest(可变指针)和 :v<版本>-<7位sha>(钉住某一版)两种。"
157
+ do_pull "$px" "代理镜像名是从 runtime 镜像推出来的(同仓同版本、仓库名 proxy),有的部署不叫这个 —— 用 --proxy-image 显式指定。"
158
+ }
159
+
160
+ # 不给 --image 时用的默认镜像。一盒与它的反代都挂了 latest 指针 —— 这类镜像是【给人手工
161
+ # docker pull】的调试件,没有"部署侧按镜像引用触发重建"那条链,可变 tag 的代价不成立,
162
+ # 而"新人不知道该用哪个 tag"这个洞是真的。要钉住某一版就显式 --image <...>:v<版本>-<sha>。
163
+ default_image() {
164
+ load_registry_config
165
+ # ⚠️ 一盒镜像与【你自己 App 的镜像】不在同一个项目下。ONEBOX_PROJECT 是前者;
166
+ # PROJECT 是后者(xgent-image-push 推镜像用的那个)。只有 ONEBOX_PROJECT 缺席时才
167
+ # 回退到 PROJECT —— 那是老配置的兼容路径,拼出来的引用多半 not found,所以回退时
168
+ # 明说一句,别让人对着一个指错方向的 404 猜 tag。
169
+ local proj="${ONEBOX_PROJECT:-}"
170
+ if [ -z "$proj" ] && [ -n "${PROJECT:-}" ]; then
171
+ proj="$PROJECT"
172
+ warn "配置里没有 ONEBOX_PROJECT,回退用 PROJECT=${PROJECT} 拼一盒镜像 —— 那通常是【推你自己 App 镜像】的项目,不是一盒所在的项目。拉不到就去问开发团队要一盒的项目名,填进 ONEBOX_PROJECT。"
173
+ fi
174
+ [ -n "${REGISTRY:-}" ] && [ -n "$proj" ] || return 1
175
+ printf '%s/%s/one-box:latest' "$REGISTRY" "$proj"
176
+ }
177
+
178
+ # --- 定位一盒目录 -------------------------------------------------------------
179
+ find_home() {
180
+ local d git_root
181
+ if [ -n "${XGENT_ONEBOX_HOME:-}" ]; then printf '%s' "$XGENT_ONEBOX_HOME"; return; fi
182
+ git_root="$(git rev-parse --show-toplevel 2>/dev/null || true)"
183
+ for d in ./portal-onebox ./deploy ${git_root:+"$git_root/portal-onebox" "$git_root/deploy"}; do
184
+ [ -f "$d/docker-compose.yml" ] && [ -f "$d/onebox/docker-compose.onebox.yml" ] && { (cd "$d" && pwd); return; }
185
+ done
186
+ printf ''
187
+ }
188
+
189
+ require_home() {
190
+ HOME_DIR="$(find_home)"
191
+ [ -n "$HOME_DIR" ] || die "没找到一盒目录(要有 docker-compose.yml + onebox/docker-compose.onebox.yml)。首次用先跑: $0 init --image <门户镜像tag> --key <你的listingKey>"
192
+ ENV_FILE="$HOME_DIR/compose.env"
193
+ [ -f "$ENV_FILE" ] || die "$HOME_DIR 里没有 compose.env。跑 $0 init 生成,或手工按 compose.env.example 拼。"
194
+ }
195
+
196
+ # --- env-file 解析(docker compose 是「后定义者胜」,这份文件是拼装出来的)--------
197
+ _assignments() {
198
+ awk '/^[A-Za-z_][A-Za-z0-9_]*=/ {
199
+ k = $0; sub(/=.*/, "", k)
200
+ v = $0; sub(/^[^=]*=/, "", v)
201
+ sub(/^"(.*)"$/, "\\1", v); sub(/^'"'"'(.*)'"'"'$/, "\\1", v)
202
+ printf "%d\t%s\t%s\n", NR, k, v
203
+ }' "$ENV_FILE"
204
+ }
205
+ _eff() { # _eff KEY [default]
206
+ local v; v="$(_assignments | awk -F'\t' -v k="$1" '$2==k{v=$3} END{print v}')"
207
+ [ -n "$v" ] && printf '%s' "$v" || printf '%s' "${2-}"
208
+ }
209
+
210
+ load_env() {
211
+ APP_KEY="$(_eff APP_KEY)"; APP_IMAGE="$(_eff APP_IMAGE)"; APP_FRONTEND_DIST="$(_eff APP_FRONTEND_DIST)"
212
+ CATALOG="$(_eff XGENT_APP_CATALOG files,llm-gateway,git,org,observability,user-center)"
213
+ HTTP_PORT="$(_eff HTTP_PORT 80)"; COMPOSE_PROJECT="$(_eff COMPOSE_PROJECT_NAME xgent)"
214
+ BASE_URL="http://localhost"; [ "$HTTP_PORT" = "80" ] || BASE_URL="http://localhost:$HTTP_PORT"
215
+ }
216
+
217
+ # --- compose 参数拼装 ---------------------------------------------------------
218
+ # app-dev.yml 里的 ${APP_IMAGE:?} / ${APP_KEY:?} 是【解析期】求值的(与 profile 无关),
219
+ # 所以还没填自己 App 那两行时必须整层不带,否则连 ps 都跑不了。
220
+ compose_args() {
221
+ printf '%s\0' --env-file "$ENV_FILE" \
222
+ -f "$HOME_DIR/docker-compose.yml" \
223
+ -f "$HOME_DIR/onebox/docker-compose.onebox.yml"
224
+ if [ -n "$APP_KEY" ] && [ -n "$APP_IMAGE" ]; then
225
+ printf '%s\0' -f "$HOME_DIR/app-devkit/docker-compose.app-dev.yml"
226
+ [ -n "$APP_FRONTEND_DIST" ] && printf '%s\0' -f "$HOME_DIR/app-devkit/docker-compose.app-frontend.yml"
227
+ printf '%s\0' --profile app-external
228
+ fi
229
+ printf '%s\0' --profile local-infra
230
+ local k; for k in ${CATALOG//,/ }; do
231
+ _is_portal_hosted "$k" && continue
232
+ printf '%s\0' --profile "app-$k"
233
+ # 清单型 App(onebox.sh add 生成过片段的)也归 dc 管:这样 up/ps/logs/down 都看得见它们,
234
+ # 而不是只有 add 那一次 -f 才带上。
235
+ [ -f "$HOME_DIR/generated/$k.yml" ] && printf '%s\0' -f "$HOME_DIR/generated/$k.yml"
236
+ [ -f "$SKILL_DIR/services/$k.extra.yml" ] && printf '%s\0' -f "$SKILL_DIR/services/$k.extra.yml"
237
+ done
238
+ # 门户日志采集段已并入 docker-compose.onebox.yml。这行只为【老抽取资产】的家目录兜底:
239
+ # 那些 portal-onebox/ 里还有独立的 portal-logs.yml(旧镜像取出的),照老规矩叠加;
240
+ # 新资产里文件不存在,[ -f ] 自动跳过。
241
+ _has_catalog observability && [ -f "$HOME_DIR/onebox/docker-compose.portal-logs.yml" ] \
242
+ && printf '%s\0' -f "$HOME_DIR/onebox/docker-compose.portal-logs.yml"
243
+ return 0
244
+ }
245
+ _has_catalog() { case ",$CATALOG," in *",$1,"*) return 0;; *) return 1;; esac; }
246
+ # 用户中心只有身份 owner 清单,运行时由 portal-api 承载,无独立库、容器与 /svc。
247
+ _is_portal_hosted() { [ "$1" = "user-center" ]; }
248
+ # 目录里「清单型」的 key = 一盒镜像/目录里有 app-devkit/manifests/<key>.manifest.json 且不是门户内置 workspace
249
+ _is_manifest_app() { [ -f "$HOME_DIR/app-devkit/manifests/$1.manifest.json" ]; }
250
+ dc() { local a=(); while IFS= read -r -d '' x; do a+=("$x"); done < <(compose_args); docker compose "${a[@]}" "$@"; }
251
+
252
+ # --- init ---------------------------------------------------------------------
253
+ port_free() { ! (exec 3<>"/dev/tcp/127.0.0.1/$1") >/dev/null 2>&1; }
254
+ pick_port() { local p; for p in "$@"; do port_free "$p" && { printf '%s' "$p"; return; }; done; printf '%s' "$1"; }
255
+ rand_hex() { openssl rand -hex 32 2>/dev/null || head -c32 /dev/urandom | od -An -tx1 | tr -d ' \n'; }
256
+
257
+ cmd_init() {
258
+ local image="${XGENT_IMAGE:-}" proxy="" key="" home="./portal-onebox" force=0
259
+ while [ $# -gt 0 ]; do
260
+ case "$1" in
261
+ --image) image="${2:?}"; shift 2 ;;
262
+ --proxy-image) proxy="${2:?}"; shift 2 ;;
263
+ --key) key="${2:?}"; shift 2 ;;
264
+ --home) home="${2:?}"; shift 2 ;;
265
+ --force) force=1; shift ;;
266
+ *) die "init: 不认识的参数 '$1'" ;;
267
+ esac
268
+ done
269
+ [ -n "$image" ] || image="$(default_image || true)"
270
+ [ -n "$image" ] || die "init 不知道该拉哪个镜像:给 --image <registry>/<一盒项目>/one-box:<版本>,或在 puller 配置里补上 REGISTRY 与 ONEBOX_PROJECT(补了就默认用 <REGISTRY>/<ONEBOX_PROJECT>/one-box:latest,不必再去问 tag)。⚠️ ONEBOX_PROJECT 是【一盒镜像】的项目,不是你推自己 App 镜像的那个 PROJECT。"
271
+ case "$image" in *:latest) info "用 ${image}(可变指针)—— 它跟着最新一版走,开工前 $0 pull 一次就是最新;要钉住某一版改用 --image <...>:v<版本>-<sha>。";; esac
272
+ [ -n "$proxy" ] || proxy="${image%/*}/proxy:${image##*:}" # 代理镜像同仓同版本
273
+ [ -n "$key" ] || warn "没给 --key,先用占位 your-app —— 起 app-backend 之前必须把 compose.env 里的 APP_KEY 改成你的 listingKey(它同时是 /svc/<key>、iframe 路径、scope 命名空间和令牌 aud)。"
274
+ key="${key:-your-app}"
275
+
276
+ # 先把路径算出来但【不建目录】—— 下面任何一步停下时都不该留一个空壳
277
+ home="$(cd "$(dirname "$home")" 2>/dev/null && pwd || printf '%s' "$PWD")/$(basename "$home")"
278
+ local envf="$home/compose.env"
279
+ if [ -f "$envf" ] && [ "$force" = 0 ]; then
280
+ die "$envf 已存在(里面是这台机器的密钥)。要整份重来加 --force;只想补配置就直接往它末尾加。"
281
+ fi
282
+
283
+ # 一台机器一套一盒(SKILL.md 文首「一套就够」):本机已有【别的】一盒在跑/跑过时停下,
284
+ # 而不是再铺第二套 —— 两套之间只有端口退让、没有数据互通,要调的 App 应该接进现有那套。
285
+ # 自己这套(容器 config_files 落在本 home 下)不算;--force 时降级为提醒。
286
+ local other
287
+ other="$(docker ps -a --filter 'label=com.docker.compose.project' \
288
+ --format '{{.Label "com.docker.compose.project"}}\t{{.Label "com.docker.compose.project.config_files"}}' 2>/dev/null \
289
+ | awk -F'\t' -v h="$home/" '($1=="xgent-onebox" || $1 ~ /^onebox-/) && index($2, h)!=1 { print $1; exit }' || true)"
290
+ if [ -n "$other" ]; then
291
+ [ "$force" = 1 ] || die "本机已有一套一盒(compose 项目 $other)—— 一台机器只共用一套,别再铺第二套。
292
+ 要调你的 App:XGENT_ONEBOX_HOME=<那套 portal-onebox/ 的路径> 复用它的栈跑 register-app / dc;
293
+ 宿主上的 dev 后端直连它的 pg/redis/minio(SKILL.md §5)。那套的路径查看:docker compose ls。
294
+ 确需整份重来(--force 会连 compose.env 一起重建):$0 init --force …"
295
+ warn "本机已有另一套一盒($other)—— --force 放行,但请确认那套已 down 掉,别长期并存。"
296
+ fi
297
+
298
+ # 1) 备齐镜像 —— 没有 puller 凭证就在这里停下,而不是让人跑到一半才发现
299
+ pull_images "$image" "$proxy"
300
+ mkdir -p "$home"
301
+
302
+ # 门户的 /health 报的 version 取自 APP_VERSION 环境变量,compose 缺省填 "dev" ——
303
+ # 于是一盒对使用者【完全不自报版本】。而「照文档做但行为不符」十有八九就是镜像比文档旧
304
+ # (CR-4:自动授予租户那段代码比某一版镜像新一天,症状是市场里没有卡片且零报错)。
305
+ # 这里把 tag + 镜像 ID + 构建日期钉进 compose.env,`/health` 与 `status` 立刻能回答
306
+ # 「我跑的是哪一版」。取不到就留空,不编。
307
+ local img_id img_created ver=""
308
+ img_id="$(docker image inspect "$image" --format '{{.Id}}' 2>/dev/null | cut -c8-14 || true)"
309
+ img_created="$(docker image inspect "$image" --format '{{.Created}}' 2>/dev/null | cut -c1-10 || true)"
310
+ # 取不到镜像元信息(离线 load 的、docker 不认的)就留空 —— 宁可不自报,也不编一个版本号。
311
+ if [ -n "$img_id" ]; then ver="onebox ${image##*:} ${img_id}${img_created:+ built ${img_created}}"; fi
312
+
313
+ # 2) 从镜像里取 compose 资产 —— 版本天然与镜像对齐,不需要门户仓
314
+ info "从 $image 取出 compose 资产…"
315
+ local tmp cid; tmp="$(mktemp -d)"
316
+ cid="$(docker create "$image")" || die "docker create 失败。先 docker login 到镜像仓库,并确认 tag 写对了。"
317
+ docker cp "$cid:/app/deploy" "$tmp/deploy" >/dev/null || { docker rm -f "$cid" >/dev/null; die "镜像里没有 /app/deploy —— 这多半不是门户一盒镜像。"; }
318
+ docker rm -f "$cid" >/dev/null
319
+ # 只留联调用得上的:compose + 一盒增量 + devkit + postgres 建库脚本 + 两个 manifest 样例
320
+ ( cd "$tmp/deploy" && rm -rf .DS_Store k8s oauth pm2 caddy knowledge-devkit onebox/Dockerfile \
321
+ app-devkit/manifests/pagebuilder.manifest.json app-devkit/manifests/task-gateway.manifest.json 2>/dev/null || true )
322
+ ( cd "$tmp/deploy" && tar -cf - . ) | ( cd "$home" && tar -xf - )
323
+ rm -rf "$tmp"
324
+
325
+ # 3) 挑空闲端口 —— 首次用最常见的翻车就是 80/5432/6379/9000 已被别的东西占着
326
+ local hp hsp pgp rdp mnp mncp base
327
+ hp="$(pick_port 80 8080 8090 18080)"; hsp="$(pick_port 443 8443 18443)"
328
+ pgp="$(pick_port 5432 15432 25432)"; rdp="$(pick_port 6379 16379 26379)"
329
+ mnp="$(pick_port 9000 19000 29000)"; mncp="$(pick_port 9001 19001 29001)"
330
+ base="http://localhost"; [ "$hp" = "80" ] || base="http://localhost:$hp"
331
+
332
+ # 4) 三段模板 + 本机覆盖块(覆盖块必须在最末尾)
333
+ cat "$home/compose.env.example" "$home/onebox/compose.env.onebox.example" \
334
+ "$home/app-devkit/compose.env.app.example" > "$envf"
335
+ cat >> "$envf" <<EOF
336
+
337
+ # ============================================================================
338
+ # 本机覆盖 —— 由 onebox.sh init 生成。docker compose 是【后定义者胜】,所以这一段
339
+ # 必须留在文件最末尾;以后要改配置,也往这下面加,别回上面改。
340
+ # ============================================================================
341
+ # 全机一套共用这个名字(不带 App 名;init 的撞栈检测也认它),别改名来「并存」两套。
342
+ COMPOSE_PROJECT_NAME=xgent-onebox
343
+ NODE_ENV=development
344
+ DEV_MOCK_OAUTH=true
345
+
346
+ XGENT_IMAGE=$image
347
+ XGENT_PROXY_IMAGE=$proxy
348
+ # 这台一盒的身份(/health 的 version 字段读它)。换镜像后重跑 init,或自己改这一行。
349
+ APP_VERSION=$ver
350
+
351
+ # 宿主发布端口(init 挑的是当时空闲的口)。改了 HTTP_PORT 要同步下面两行。
352
+ HTTP_PORT=$hp
353
+ HTTPS_PORT=$hsp
354
+ POSTGRES_PORT=$pgp
355
+ REDIS_PORT=$rdp
356
+ MINIO_PORT=$mnp
357
+ MINIO_CONSOLE_PORT=$mncp
358
+ PORTAL_BASE_URL=$base
359
+ FILES_APP_URL=$base
360
+
361
+ # 门户自身密钥(本机随机,只在这台机器上有意义)
362
+ SESSION_SECRET=$(rand_hex)
363
+ TDT_SIGNING_KEY=$(rand_hex)
364
+ PLATFORM_ADMIN_KEY=$(rand_hex)
365
+ FILES_ENC_KEY=$(rand_hex)
366
+ LLM_GATEWAY_SECRET_ENC_KEY=$(rand_hex)
367
+
368
+ # files 的服务账号:种子把这里的值种进库,files-server 也读这里 —— 同源即一致。
369
+ # 用已知的 dev 明文,这样重跑种子/换机器都能对上(一盒是调试底座,不是门户)。
370
+ FILES_SA_CLIENT_SECRET=files-dev-resource-key
371
+ FILES_RESOURCE_KEY=files-dev-resource-key
372
+
373
+ # 一盒不装 ffmpeg:这一项必须留空,填 auto 会让每次转换去 exec 一个不存在的二进制。
374
+ PREVIEW_MEDIA_CONVERTER_URL=
375
+
376
+ # ---- 你的 App(填完 APP_IMAGE 才会起 app-backend)----
377
+ APP_KEY=$key
378
+ APP_IMAGE=
379
+ # micro(有前端、iframe 嵌入)才要,且必须是【绝对路径】、目录里有 index.html:
380
+ #APP_FRONTEND_DIST=/abs/path/to/your/frontend/dist
381
+ EOF
382
+
383
+ # 5) 别让它进版本库:里面是密钥,且随时能从镜像重新生成
384
+ local root; root="$(git rev-parse --show-toplevel 2>/dev/null || true)"
385
+ if [ -n "$root" ] && [ -f "$root/.gitignore" ] && ! grep -qx "$(basename "$home")/" "$root/.gitignore" 2>/dev/null; then
386
+ printf '\n# 门户一盒本地联调栈(含密钥,可用 onebox.sh init 重新生成)\n%s/\n' "$(basename "$home")" >> "$root/.gitignore"
387
+ info "已把 $(basename "$home")/ 加进 .gitignore"
388
+ fi
389
+
390
+ echo
391
+ printf '%s一盒资产就位:%s%s\n' "$c_grn" "$home" "$c_off"
392
+ printf ' 门户地址 %s\n' "$base"
393
+ printf ' 端口 http=%s pg=%s redis=%s minio=%s/%s\n' "$hp" "$pgp" "$rdp" "$mnp" "$mncp"
394
+ printf ' 项目名 xgent-onebox(全机一套共用,别改名)\n'
395
+ echo
396
+ echo "下一步(顺序本身是契约,见 SKILL.md §3)。先记一个短名:"
397
+ echo " S=$0"
398
+ echo
399
+ echo " 1. 编辑 $envf 末尾:填 APP_IMAGE(micro 再加 APP_FRONTEND_DIST)"
400
+ echo " 2. \$S dc up -d postgres redis minio"
401
+ echo " 3. \$S dc run --rm portal-api bun run db:migrate"
402
+ echo " 4. \$S dc run --rm portal-api bun run db:seed:onebox"
403
+ echo " 5. \$S dc run --rm -v \"\$PWD/<放 manifest 的目录>:/devkit:ro\" portal-api bun run register-app /devkit/app.manifest.json"
404
+ echo " 6. \$S dc up -d 然后 \$S smoke"
405
+ }
406
+
407
+ cmd_pull() {
408
+ local image="${XGENT_IMAGE:-}" proxy=""
409
+ while [ $# -gt 0 ]; do
410
+ case "$1" in
411
+ --image) image="${2:?}"; shift 2 ;;
412
+ --proxy-image) proxy="${2:?}"; shift 2 ;;
413
+ *) die "pull: 不认识的参数 '$1'" ;;
414
+ esac
415
+ done
416
+ if [ -z "$image" ] && [ -n "$(find_home)" ]; then # 已 init 过就从 compose.env 取
417
+ ENV_FILE="$(find_home)/compose.env"
418
+ [ -f "$ENV_FILE" ] && { image="$(_eff XGENT_IMAGE)"; [ -n "$proxy" ] || proxy="$(_eff XGENT_PROXY_IMAGE)"; }
419
+ fi
420
+ [ -n "$image" ] || image="$(default_image || true)"
421
+ [ -n "$image" ] || die "pull 不知道该拉哪个镜像:给 --image <门户镜像tag>,或先 init(之后它会从 compose.env 里读),或在 puller 配置里补上 REGISTRY 与 ONEBOX_PROJECT(默认 one-box:latest)。"
422
+ [ -n "$proxy" ] || proxy="${image%/*}/proxy:${image##*:}"
423
+ require_puller; registry_login
424
+ do_pull "$image" "tag 写错了?一盒只有两种::latest(可变指针,跟着最新一版走)和 :v<版本>-<7位sha>(钉住某一版)。"
425
+ do_pull "$proxy" "代理镜像名是从 runtime 镜像推出来的,有的部署不叫 proxy —— 用 --proxy-image 指定。"
426
+ printf '%s两个镜像就位%s\n' "$c_grn" "$c_off"
427
+ echo "换版本的话,记得同步 compose.env 末尾的 XGENT_IMAGE / XGENT_PROXY_IMAGE,再 dc up -d"
428
+ }
429
+
430
+ # --- 其余子命令 ---------------------------------------------------------------
431
+ cmd_env() {
432
+ echo "一盒目录: $HOME_DIR"
433
+ echo "compose.env: $ENV_FILE"
434
+ echo
435
+ local k v n
436
+ for k in COMPOSE_PROJECT_NAME XGENT_IMAGE XGENT_PROXY_IMAGE XGENT_APP_CATALOG NODE_ENV DEV_MOCK_OAUTH \
437
+ HTTP_PORT HTTPS_PORT POSTGRES_PORT REDIS_PORT MINIO_PORT MINIO_CONSOLE_PORT PORTAL_BASE_URL \
438
+ APP_KEY APP_IMAGE APP_FRONTEND_DIST PREVIEW_MEDIA_CONVERTER_URL; do
439
+ v="$(_eff "$k")"
440
+ n="$(_assignments | awk -F'\t' -v k="$k" '$2==k{seen[$3]=1} END{print length(seen)}')"
441
+ printf ' %-28s %s' "$k" "${v:-${c_dim}(空)${c_off}}"
442
+ [ "$n" -gt 1 ] && printf ' %s← 同键 %s 个不同值,取最后一个%s' "$c_ylw" "$n" "$c_off"
443
+ printf '\n'
444
+ done
445
+ echo
446
+ [ "$COMPOSE_PROJECT" = "xgent" ] && warn "COMPOSE_PROJECT_NAME 还是模板默认的 xgent —— 同机另一套 compose 会被当成同一项目(容器被接管、命名卷共享)。改成 xgent-onebox(全机一套共用这个名字,init 现在就是这么设的)。"
447
+ [ "$(_eff NODE_ENV)" = "development" ] || warn "NODE_ENV 不是 development —— 镜像烘的是 production,不覆盖则 portal-api 拒绝在 DEV_MOCK_OAUTH=true 下启动,register-app 也拒跑。"
448
+ [ "$(_eff DEV_MOCK_OAUTH)" = "true" ] || warn "DEV_MOCK_OAUTH 不是 true —— 没有 dev 登录门,浏览器进不去。"
449
+ [ -n "$(_eff PREVIEW_MEDIA_CONVERTER_URL)" ] && warn "PREVIEW_MEDIA_CONVERTER_URL 非空 —— 一盒不装 ffmpeg,非空会让每次转换 exec 一个不存在的二进制。留空。"
450
+ case "$(_eff XGENT_IMAGE)" in *:latest) info "XGENT_IMAGE 是 latest(可变指针)—— 本地已经有同名镜像时 compose 不会回仓库看一眼,开工前先 $0 pull;要钉住某一版就写成 :v<版本>-<sha>。";; esac
451
+ [ -z "$APP_IMAGE" ] && warn "APP_IMAGE 还没填 —— 你的 app-backend 不会被拉起。(门户本身照常可用;先把门户跑通本来也是对的第一步。)"
452
+ case "$(_eff PORTAL_BASE_URL)" in
453
+ ""|"http://localhost:$HTTP_PORT") ;;
454
+ "http://localhost") [ "$HTTP_PORT" = "80" ] || warn "PORTAL_BASE_URL 是 http://localhost 但 HTTP_PORT=$HTTP_PORT —— 浏览器侧的绝对链接会指错端口。";;
455
+ *) warn "PORTAL_BASE_URL($(_eff PORTAL_BASE_URL))与 HTTP_PORT(${HTTP_PORT})对不上。";;
456
+ esac
457
+ if [ -n "$APP_FRONTEND_DIST" ]; then
458
+ [ -f "$APP_FRONTEND_DIST/index.html" ] || warn "APP_FRONTEND_DIST 下没有 index.html(${APP_FRONTEND_DIST})—— iframe 会 404。要绝对路径、且指向构建产物目录。"
459
+ fi
460
+ return 0
461
+ }
462
+
463
+ cmd_smoke() {
464
+ echo "宿主侧健康探测(${BASE_URL})"
465
+ local k keys="$CATALOG" tmp; tmp="$(mktemp)"
466
+ case ",$CATALOG," in *",$APP_KEY,"*) ;; *) [ -n "$APP_KEY" ] && keys="$CATALOG,$APP_KEY";; esac
467
+ _probe() { # _probe LABEL PATH
468
+ local code body
469
+ # curl 自己在失败时就打印 000;再 || echo 000 会拼成 000000
470
+ code="$(curl -s -m 8 -o "$tmp" -w '%{http_code}' "$BASE_URL$2" 2>/dev/null || true)"
471
+ code="${code:-000}"
472
+ body="$(head -c 160 "$tmp" 2>/dev/null || true)"
473
+ if [ "$code" = "200" ]; then printf ' %s✓%s %-22s %s\n' "$c_grn" "$c_off" "$1" "$body"
474
+ else printf ' %s✗%s %-22s HTTP %s %s\n' "$c_red" "$c_off" "$1" "$code" "$body"; fi
475
+ }
476
+ _probe "/health" /health
477
+ for k in ${keys//,/ }; do
478
+ _is_portal_hosted "$k" && continue
479
+ _probe "/svc/$k/health" "/svc/$k/health"
480
+ done
481
+
482
+ # dev 登录入口。登录页那枚「本地开发账号」按钮由 /auth/providers 的 dev 字段驱动 ——
483
+ # 字段在而按钮不在,就是这版镜像的前端与 API 对不齐(换镜像,或直接走 /auth/dev/start);
484
+ # 字段不在就是 DEV_MOCK_OAUTH 没生效。此前这一步只能靠读门户源码才知道(CR-4 #4)。
485
+ curl -s -m 8 -o "$tmp" "$BASE_URL/auth/providers" 2>/dev/null || true
486
+ if grep -q '"dev"' "$tmp" 2>/dev/null; then
487
+ printf ' %s✓%s %-22s %s\n' "$c_grn" "$c_off" "dev 登录" "登录页的「本地开发账号」按钮;按钮没出现就直接开 ${BASE_URL}/auth/dev/start"
488
+ else
489
+ printf ' %s✗%s %-22s %s\n' "$c_red" "$c_off" "dev 登录" "/auth/providers 里没有 dev —— DEV_MOCK_OAUTH 没生效(compose.env 末尾要有 NODE_ENV=development + DEV_MOCK_OAUTH=true,改完 dc up -d portal-api)"
490
+ fi
491
+ rm -f "$tmp"
492
+ echo
493
+ echo "${c_dim}404 = /svc 放行 map 没写成,或反代在写 map 之前就起了(跑 register-app,再 dc exec reverse-proxy caddy reload)${c_off}"
494
+ echo "${c_dim}502 = 后端容器没起/崩了/没听 8080/网络别名 <key>-server 没命中(dc logs <key>-server 或 app-backend)${c_off}"
495
+ echo "${c_dim}000 = 反代本身没起,或你探的端口不是 HTTP_PORT(dc ps / dc logs reverse-proxy)${c_off}"
496
+ return 0
497
+ }
498
+
499
+ cmd_status() {
500
+ cmd_env
501
+ echo "容器(project: ${COMPOSE_PROJECT})"
502
+ dc ps || true
503
+ echo
504
+ # 「unhealthy 是假红」这句必须按【容器里实际生效的那条探针】给,不能无条件打印:旧镜像的
505
+ # 基础层 compose 有两条永远失败的探针 —— `curl -fsS …/health`(精简镜像没装 curl)与反代的
506
+ # `wget … http://127.0.0.1:80/`(站点地址是主机名时被 308 到 https://IP/,IP 不能作 SNI,
507
+ # 回 SSL alert 80)。新镜像两条都换掉了,那之后 unhealthy 就是真的;照旧提示「假红不用查」
508
+ # 会让人放过真的配置漂移(典型:只用 -f docker-compose.yml 重建了一个服务,overlay 的
509
+ # logging.driver 一起丢了,日志静默不再进 observability)。
510
+ local cid nm tst stale=""
511
+ for cid in $(dc ps -q 2>/dev/null || true); do
512
+ tst="$(docker inspect "$cid" --format '{{json .Config.Healthcheck.Test}}' 2>/dev/null || true)"
513
+ case "$tst" in
514
+ *"curl -fsS http"*|*"wget -q -O /dev/null http://127.0.0.1:80/"*)
515
+ nm="$(docker inspect "$cid" --format '{{.Name}}' 2>/dev/null | sed 's#^/##')"
516
+ stale="$stale ${nm:-$cid}" ;;
517
+ esac
518
+ done
519
+ if [ -n "$stale" ]; then
520
+ warn "这些容器的 healthcheck 还是旧镜像里那条永远失败的探针,它们的 unhealthy 是假红(判活只看下面的探测):$stale"
521
+ _note "新镜像已换成 bun / 不跟随重定向的 curl。$0 pull 换新镜像 + $0 init --force 重铺 compose 之后,unhealthy 就是真红。"
522
+ else
523
+ _note "healthcheck 都是新探针 —— 这里的 unhealthy 就是真红,别当假红放过去(先看 $0 dc logs <服务>)。"
524
+ fi
525
+ echo
526
+ cmd_smoke
527
+ }
528
+
529
+ # --- 小工具 -------------------------------------------------------------------
530
+ _env_set() { # _env_set KEY VALUE —— 追加到 compose.env 末尾(后定义者胜),已是同值则跳过
531
+ local k="$1" v="$2"
532
+ [ "$(_eff "$k")" = "$v" ] && return 0
533
+ printf '%s=%s\n' "$k" "$v" >> "$ENV_FILE"
534
+ info "compose.env += ${k}=${v}"
535
+ }
536
+ _svc_running() { [ -n "$(dc ps -q "$1" 2>/dev/null || true)" ]; }
537
+ _ok() { printf ' %s✓%s %s\n' "$c_grn" "$c_off" "$*"; }
538
+ _bad() { printf ' %s✗%s %s\n' "$c_red" "$c_off" "$1"; shift; [ $# -gt 0 ] && printf ' %s↳ %s%s\n' "$c_dim" "$*" "$c_off"; DOCTOR_BAD=$((DOCTOR_BAD+1)); return 0; }
539
+ _note() { printf ' %s↳ %s%s\n' "$c_dim" "$*" "$c_off"; }
540
+
541
+ # --- up:按顺序铺一遍(幂等)---------------------------------------------------
542
+ cmd_up() {
543
+ [ -n "$APP_KEY" ] || die "compose.env 里还没有 APP_KEY —— 先跑 $0 init --key <你的listingKey>。"
544
+ info "① 基础设施(postgres / redis / minio)"
545
+ dc up -d postgres redis minio
546
+ info " 等 postgres 就绪…"
547
+ # 首次初始化时 initdb 会先起一个临时实例再重启,单次 pg_isready 会在那个窗口里误判就绪,
548
+ # 紧接着的 db:migrate 就撞 ECONNREFUSED(实测)。要求连续 3 秒都就绪才算。
549
+ local i=0 okc=0; until [ "$okc" -ge 3 ]; do
550
+ if dc exec -T postgres pg_isready -U postgres >/dev/null 2>&1; then okc=$((okc+1)); else okc=0; fi
551
+ i=$((i+1)); [ "$i" -gt 90 ] && die "postgres 90s 还没就绪,看 $0 dc logs postgres"
552
+ sleep 1
553
+ done
554
+ info "② 门户库 + 目录里各服务自己的库(迁移)"
555
+ dc run --rm portal-api bun run db:migrate
556
+ # ⚠️ 必须在种子之前:种子要替 deploy-controller(一盒里它启动即拒)跑各 App 的
557
+ # 逐租户基线(org 的预置档案字段就是这么来的),表还没建就只能眼看着它失败。
558
+ local k
559
+ for k in ${CATALOG//,/ }; do
560
+ # qbank/lms 是 QBANK-WORKFLOW-ACTIONS §5.9 的变体成员;基础集不含它们时这段零执行。
561
+ case "$k" in files|llm-gateway|git|org|qbank|lms) dc run --rm portal-api bun run "db:$k:migrate" || warn "db:$k:migrate 失败,继续";; esac
562
+ done
563
+ info "②b 你自己的库 xgent-${APP_KEY}"
564
+ _ensure_db "xgent-${APP_KEY}"
565
+ info "③ 一盒种子(★ 破坏性:truncate cascade)"
566
+ dc run --rm portal-api bun run db:seed:onebox
567
+ if [ -n "${ONEBOX_MANIFEST:-}" ] || [ -f "app.manifest.json" ]; then
568
+ local mf="${ONEBOX_MANIFEST:-app.manifest.json}"
569
+ info "④ 注册你的 App(${mf})"
570
+ dc run --rm -v "$(cd "$(dirname "$mf")" && pwd):/devkit:ro" portal-api bun run register-app "/devkit/$(basename "$mf")" \
571
+ || warn "register-app 失败 —— 看上面的报错;改完重跑 $0 up 即可(幂等)"
572
+ else
573
+ warn "④ 跳过 register-app:当前目录没有 app.manifest.json。有的话设 ONEBOX_MANIFEST=<路径> 再跑一次 $0 up。"
574
+ fi
575
+ # ④b 目录里的清单型 App(如 observability 日志与监控):按 add 的流程拉镜像 → 注册 → 建库 →
576
+ # migrate → 生成片段。非破坏性、幂等;失败只告警,不挡门户三件套。
577
+ local mk
578
+ for mk in ${CATALOG//,/ }; do
579
+ _is_manifest_app "$mk" || continue
580
+ info "④b 目录里的清单型 App:${mk}"
581
+ ADD_QUIET=1 cmd_add "$mk" || warn "add ${mk} 失败 —— 看上面的报错;修完重跑 $0 up(幂等)"
582
+ done
583
+ info "⑤ 起门户三件套 + 基础服务" ; dc up -d
584
+ _has_catalog observability && _portal_logs_up
585
+ echo; info "跑一次体检:"; cmd_doctor
586
+ }
587
+
588
+ # 门户自身控制台日志 → 日志与监控(采集段在 onebox/docker-compose.onebox.yml 内,
589
+ # portal-logs 服务挂 onebox-logs profile,这里签密钥后【显式】起):
590
+ # 用 portal-self 签一把只带 observability.ingest 的 xsak_ 写进 compose.env,再起 portal-logs。
591
+ # 前提(observability 已注册 + 已登记为平台基础服务应用 + portal-self 在)由 portal-logs-key.ts 判,
592
+ # 不成立 ⇒ 退出码 3 ⇒ 这里只告警。密钥只签一次:已有 OBS_ACCESS_KEY 就不动。
593
+ _portal_logs_up() {
594
+ info "⑥ 门户控制台日志采集(portal-api → portal-logs → observability)"
595
+ if [ -z "$(_eff OBS_ACCESS_KEY)" ]; then
596
+ local sec rc=0 err; err="$(mktemp)"
597
+ # 容器的 workdir 是 /app(monorepo 根),脚本在 apps/api 下;不走 package script 是因为它带 --env-file=../../.env,镜像里没有那份文件。
598
+ sec="$(dc run --rm --no-deps -T -w /app/apps/api portal-api bun run scripts/portal-logs-key.ts 2>"$err")" || rc=$?
599
+ if [ "$rc" -eq 0 ] && [ -n "$sec" ]; then
600
+ _env_set OBS_ACCESS_KEY "$sec"
601
+ else
602
+ warn "采集密钥没签成(rc=${rc}):$(grep -v xsak_ "$err" | tail -3 | tr '\n' ' ')"; rm -f "$err"; return 0
603
+ fi
604
+ rm -f "$err"
605
+ fi
606
+ dc up -d portal-logs portal-api
607
+ _ok "portal-logs 已起;portal-api 的 stdout/stderr 经 fluentd 驱动进 app_portal_console(观测:$0 dc logs portal-logs)"
608
+ }
609
+
610
+ # 在一盒 minio 上建桶(幂等)。minio 镜像自带 mc;凭证就是 compose.env 里的 MINIO_ROOT_USER/PASSWORD。
611
+ _ensure_bucket() { # _ensure_bucket <bucket>
612
+ local u p; u="$(_eff MINIO_ROOT_USER minioadmin)"; p="$(_eff MINIO_ROOT_PASSWORD minioadmin)"
613
+ dc up -d minio >/dev/null 2>&1 || true
614
+ local i=0; until dc exec -T minio mc ready local >/dev/null 2>&1; do i=$((i+1)); [ "$i" -gt 30 ] && { warn "minio 30s 没就绪,桶 $1 没建"; return 0; }; sleep 1; done
615
+ dc exec -T minio sh -c "mc alias set local http://127.0.0.1:9000 '$u' '$p' >/dev/null 2>&1 && mc mb --ignore-existing local/$1" >/dev/null 2>&1 \
616
+ && info "桶 $1 就绪" || warn "桶 $1 没建成($0 dc exec minio mc mb local/$1 手工补)"
617
+ }
618
+ _ensure_db() { # _ensure_db <dbname>
619
+ if dc exec -T postgres psql -U postgres -lqt 2>/dev/null | cut -d'|' -f1 | grep -qw "$1"; then
620
+ info " 库 $1 已存在"
621
+ else
622
+ dc exec -T postgres psql -U postgres -c "CREATE DATABASE \"$1\"" >/dev/null && info " 建库 $1"
623
+ fi
624
+ }
625
+
626
+ # --- add:把一个平台侧 App 拉进来陪调 ------------------------------------------
627
+ # 关键设计:compose 片段【从 manifest 生成】,不是每个 App 在 skill 里写一份 YAML —— 那样
628
+ # 每接一个新 App 就得改一次 skill,等于把问题搬了个地方。manifest 里已经有全部所需:
629
+ # deployDescriptor.image → 镜像(相对名按 <REGISTRY>/<ONEBOX_PROJECT>/ 补全,版本由清单钉住)
630
+ # deployDescriptor.port → 容器内端口 listingKey → 网络别名 <key>-server + 库名 xgent-<key>
631
+ # serviceAccount.clientId→ 自省身份 type → micro 要不要前端
632
+ # 密钥【不从 manifest 来】:一盒现生成一个,同时写进本地门户 DB 与容器 env。所以清单里
633
+ # 有没有明文密钥都无所谓(release 提交的那份本来就被 prod 模式拒收)。
634
+ #
635
+ # 少数 App 有 manifest 描述不了的自带 infra(knowledge 要一个 Chroma 边车)。那种情况下
636
+ # skill 的 services/<key>.extra.yml 补一层——只有例外才需要文件,不是每个 App 都要。
637
+ _manifest_json() { # _manifest_json KEY → 把 manifest JSON 打到 stdout
638
+ local key="$1"
639
+ if [ -n "${ADD_MANIFEST:-}" ]; then cat "$ADD_MANIFEST"; return; fi
640
+ if [ -n "${ADD_FROM:-}" ]; then
641
+ # ⚠️ 门户【所有】200 都是信封 {ok,data} —— manifest 在 data.manifest,不在响应根。
642
+ # 把响应体直接当 manifest 解,症状是「字段全 undefined」而不是「解析失败」,更难查。
643
+ # 头必须走数组:`${X:+-H "a: b"}` 不加引号会按空白拆成四个参数(连引号一起)。
644
+ local http body; local -a hdr=()
645
+ if [ -n "${MANIFEST_STORE_READ_TOKEN:-}" ]; then hdr=(-H "Authorization: Bearer ${MANIFEST_STORE_READ_TOKEN}"); fi
646
+ # 刻意不加 -f:4xx 的响应体正是要读的那一份(业务失败走 200 + 错误体,闸走 4xx)。
647
+ body="$(curl -sS -m 20 -w $'\n%{http_code}' ${hdr[@]+"${hdr[@]}"} \
648
+ "${ADD_FROM%/}/api/market/catalog/${key}" 2>/dev/null)" \
649
+ || die "连不上 ${ADD_FROM} —— 检查地址与网络,或用 --manifest <本地文件> 顶上。"
650
+ http="${body##*$'\n'}"; body="${body%$'\n'*}"
651
+ case "$http" in
652
+ 404) die "${ADD_FROM} 没有目录接口(那个门户没开目录能力,或地址不对)。出路:--manifest <本地文件>,或不带 --from 用镜像自带的样例清单。" ;;
653
+ 401) die "目录读取令牌无效或已失效 —— 在 .xgent-registry.env 里更新 MANIFEST_STORE_READ_TOKEN(找门户团队要新的)。" ;;
654
+ 200) ;;
655
+ *) die "目录返回 HTTP ${http}。出路:--manifest <本地文件>,或不带 --from 用镜像自带的样例清单。" ;;
656
+ esac
657
+ # data:null = 目录里还没有这个 key;ok:false = 业务失败。
658
+ # 出错信息走【stdout】:`dc run` 的 stderr 混着 compose 自己的噪音,捞不干净。
659
+ local mout rc
660
+ mout="$(printf '%s' "$body" | dc run --rm --no-deps -T portal-api bun -e '
661
+ let raw=""; for await (const c of Bun.stdin.stream()) raw += new TextDecoder().decode(c);
662
+ let r; try { r = JSON.parse(raw); } catch { console.log("目录返回的不是 JSON"); process.exit(3); }
663
+ if (r?.ok === false) { console.log(r?.error?.message ?? "目录拒绝了这次请求"); process.exit(4); }
664
+ if (r?.data == null) process.exit(5);
665
+ if (!r?.data?.manifest) { console.log("目录条目里没有 manifest 字段"); process.exit(3); }
666
+ console.log(JSON.stringify(r.data.manifest));
667
+ ' 2>/dev/null)"; rc=$?
668
+ local outs="出路:--manifest <本地文件>,或不带 --from 用镜像自带的样例清单。"
669
+ case "$rc" in
670
+ 0) printf '%s' "$mout"; return ;;
671
+ 5) die "目录里还没有 ${key}(那个 App 还没发过版?)。${outs}" ;;
672
+ 4) die "目录拒绝了这次请求:${mout}。${outs}" ;;
673
+ *) die "读取目录条目失败:${mout:-未知错误}。${outs}" ;;
674
+ esac
675
+ fi
676
+ # 默认:一盒镜像自带的那批样例清单
677
+ dc run --rm --no-deps -T portal-api cat "/app/deploy/app-devkit/manifests/${key}.manifest.json" 2>/dev/null \
678
+ || die "这版一盒镜像里没有 ${key} 的清单。三条出路:① ${0} pull 换新镜像;② --manifest <你手上那份 app.manifest.json>;③ --from <在线门户地址> 从平台目录拉。"
679
+ }
680
+
681
+ cmd_add() {
682
+ local key="" want_image=""
683
+ ADD_MANIFEST=""; ADD_FROM=""
684
+ while [ $# -gt 0 ]; do
685
+ case "$1" in
686
+ --image) want_image="${2:-}"; shift 2 ;;
687
+ --manifest) ADD_MANIFEST="${2:-}"; shift 2 ;;
688
+ --from) ADD_FROM="${2:-}"; shift 2 ;;
689
+ -*) die "未知参数 $1(支持 --image <ref> / --manifest <文件> / --from <门户地址>)" ;;
690
+ *) key="$1"; shift ;;
691
+ esac
692
+ done
693
+ [ -n "$key" ] || die "用法:${0} add <key> [--image <ref>] [--manifest <文件>] [--from <门户地址>]"
694
+ # 清单来源优先级:--manifest <文件> > --from / MANIFEST_STORE > 镜像自带样例。
695
+ # 配了 MANIFEST_STORE 就不必每次敲 --from(地址与只读令牌都在 .xgent-registry.env 里)。
696
+ load_registry_config || true
697
+ [ -n "${ADD_FROM:-}" ] || ADD_FROM="${MANIFEST_STORE:-}"
698
+
699
+ info "① 取清单"
700
+ local mj; mj="$(_manifest_json "$key")"
701
+ [ -n "$mj" ] || die "清单是空的。"
702
+
703
+ # 用 portal-api 里的 bun 解析(不对宿主机的 python/jq 做任何假设)
704
+ local fields
705
+ fields="$(printf '%s' "$mj" | dc run --rm --no-deps -T portal-api bun -e '
706
+ let raw=""; for await (const c of Bun.stdin.stream()) raw += new TextDecoder().decode(c);
707
+ const m = JSON.parse(raw); const d = m.deployDescriptor ?? {};
708
+ const q = (v) => String(v ?? "").replace(/\n/g, " ");
709
+ console.log(`M_KEY=${q(m.listingKey)}`);
710
+ console.log(`M_TYPE=${q(m.type)}`);
711
+ console.log(`M_IMAGE=${q(d.image)}`);
712
+ console.log(`M_PORT=${q(d.port ?? 8080)}`);
713
+ console.log(`M_HEALTH=${q(d.healthPath ?? "/health")}`);
714
+ console.log(`M_SA=${q((m.serviceAccount ?? {}).clientId)}`);
715
+ console.log(`M_ENV=${(m.requiredEnv ?? []).map((e) => (typeof e === "string" ? e : e.key)).join(" ")}`);
716
+ // 非空 ⇒ 它是跨应用交换的【发起方】,需要一把 App Secret(下面与 SA 密钥同源生成注入)。
717
+ console.log(`M_XTARGETS=${(m.exchangeTargets ?? []).join(" ")}`);
718
+ console.log(`M_MIGRATE=${(d.migrateArgs ?? []).join(" ")}`);
719
+ ' 2>/dev/null)" || die "解析清单失败 —— 它可能不是一份合法的 app.manifest.json。"
720
+ local M_KEY="" M_TYPE="" M_IMAGE="" M_PORT="" M_HEALTH="" M_SA="" M_ENV="" M_XTARGETS="" M_MIGRATE=""
721
+ eval "$(printf '%s' "$fields" | sed 's/^\([A-Z_]*\)=\(.*\)$/\1="\2"/')"
722
+ [ "$M_KEY" = "$key" ] || die "清单里的 listingKey 是「${M_KEY}」,与你要加的「${key}」对不上。"
723
+ info " ${M_KEY} type=${M_TYPE} port=${M_PORT} sa=${M_SA}"
724
+
725
+ # ② 镜像:清单里的相对名按 <REGISTRY>/<ONEBOX_PROJECT>/ 补全(版本由清单钉住,可复现)
726
+ local ivar ref; ivar="$(printf '%s' "$key" | tr 'a-z-' 'A-Z_')_IMAGE"
727
+ ref="${want_image:-$(_eff "$ivar")}"
728
+ if [ -z "$ref" ]; then
729
+ [ -n "$M_IMAGE" ] || die "清单里没有 deployDescriptor.image,也没给 --image。"
730
+ case "$M_IMAGE" in
731
+ */*) ref="$M_IMAGE" ;; # 已经带项目/域名,原样用
732
+ *) load_registry_config || true
733
+ [ -n "${REGISTRY:-}" ] || die "还没配拉取凭证 —— 先按 SKILL.md §0 放一份 .xgent-registry.env。"
734
+ ref="${REGISTRY}/${ONEBOX_PROJECT:-${PROJECT:-}}/${M_IMAGE}" ;;
735
+ esac
736
+ fi
737
+ info "② 镜像 ${ref}"
738
+ if docker image inspect "$ref" >/dev/null 2>&1; then info " 本地已有,跳过拉取"
739
+ else
740
+ require_puller; registry_login
741
+ do_pull "$ref" "配合调试用的 App 都发在一盒同一个项目(ONEBOX_PROJECT=${ONEBOX_PROJECT:-未配})下;确实不在就用 --image 给全引用。"
742
+ fi
743
+ _env_set "$ivar" "$ref"
744
+
745
+ # ③ 密钥:一盒现生成,两侧同源(清单里有没有明文都不影响)
746
+ local svar sec; svar="$(printf '%s' "$key" | tr 'a-z-' 'A-Z_')_SA_SECRET"
747
+ sec="$(_eff "$svar")"; [ -n "$sec" ] || { sec="$(rand_hex | cut -c1-32)"; _env_set "$svar" "$sec"; }
748
+ # 声明了 exchangeTargets 的 App 是跨应用交换的【发起方】,它在 /oauth/token 上用
749
+ # `sk_<key>` + App Secret 换对方的令牌。目录里的清单按红线剥掉了 exchangeInitiatorSecret,
750
+ # 而 register-app 的 dev 模式只在【清单里有这个字段】时才 wireInitiatorSecret ——
751
+ # 不补这一把,该 App 的跨应用交换会稳定 401,且症状出现在「发起方」而不是这里。
752
+ local avar asec=""; avar="$(printf '%s' "$key" | tr 'a-z-' 'A-Z_')_APP_SECRET"
753
+ if [ -n "$M_XTARGETS" ]; then
754
+ asec="$(_eff "$avar")"; [ -n "$asec" ] || { asec="$(rand_hex | cut -c1-32)"; _env_set "$avar" "$asec"; }
755
+ fi
756
+
757
+ info "④ 注册清单(非破坏性、幂等)"
758
+ # register-app 不带 --prod 是 dev 模式,而 dev 模式【强制要求】serviceAccount.secret;
759
+ # 目录里的清单按红线只留 clientId。把③那把注进去 —— 于是门户库里那把与容器 env 里那把
760
+ # 才真的是同一把(这一条对镜像自带样例同样生效:它们自带的明文 dev secret 与容器 env
761
+ # 里那把本来就不是同一把,只是没人验过自省)。临时文件用完即删。
762
+ # 两把密钥走 stdin 的前两行,不走 `-e`:命令行参数同机 `ps` 可见。
763
+ printf '%s\n%s\n%s' "$sec" "$asec" "$mj" | dc run --rm --no-deps -T portal-api bun -e '
764
+ let raw=""; for await (const c of Bun.stdin.stream()) raw += new TextDecoder().decode(c);
765
+ const a = raw.indexOf("\n"); const b = raw.indexOf("\n", a + 1);
766
+ const secret = raw.slice(0, a);
767
+ const appSecret = raw.slice(a + 1, b);
768
+ const m = JSON.parse(raw.slice(b + 1));
769
+ m.serviceAccount = { ...(m.serviceAccount ?? {}), secret };
770
+ // 空 = 这个 App 不是交换发起方;写进去反而会让 register-app 白跑一次 wire。
771
+ if (appSecret) m.exchangeInitiatorSecret = appSecret;
772
+ console.log(JSON.stringify(m, null, 2));
773
+ ' > "$HOME_DIR/.add-$key.manifest.json" || die "注入 dev 密钥失败。"
774
+ dc run --rm --no-deps -v "$HOME_DIR:/devkit:ro" portal-api bun run register-app "/devkit/.add-$key.manifest.json" \
775
+ || { rm -f "$HOME_DIR/.add-$key.manifest.json"; die "注册失败 —— 看上面的报错。"; }
776
+ rm -f "$HOME_DIR/.add-$key.manifest.json"
777
+
778
+ info "⑤ 建库 xgent-${key}"
779
+ dc up -d postgres >/dev/null 2>&1 || true
780
+ _ensure_db "xgent-${key}"
781
+
782
+ # ⑥ 从 manifest 生成 compose 片段
783
+ local gen="$HOME_DIR/generated"; mkdir -p "$gen"
784
+ local out="$gen/${key}.yml" PREFIX; PREFIX="$(printf '%s' "$key" | tr 'a-z-' 'A-Z_')"
785
+ {
786
+ echo "# 由 onebox.sh add ${key} 从 manifest 生成 —— 不要手改,重跑 add 会覆盖。"
787
+ echo "services:"
788
+ echo " ${key}-server:"
789
+ echo " image: \${${ivar}:?}"
790
+ echo " platform: \${${PREFIX}_PLATFORM:-\${APP_PLATFORM:-}}"
791
+ echo " restart: unless-stopped"
792
+ # ⚠️ 绝对路径。compose 里的相对路径按【第一个 -f】的目录解析(= 一盒根),不是按本文件
793
+ # 所在目录 —— 写 ../compose.env 会解析到一盒根的上一级,报 env file not found(实测)。
794
+ # 这是生成文件、随机器走、已被 .gitignore 挡住,绝对路径没有副作用。
795
+ echo " env_file: [\"${ENV_FILE}\"]"
796
+ echo " environment:"
797
+ # 一盒反代的通用规则只反代 <key>-server:8080;镜像不听 8080 的(如 observability 8081)
798
+ # 在 compose.env 里用 <PREFIX>_PORT 改成 8080(值归平台,与生产注入 PORT 同语义)。
799
+ echo " PORT: \"\${${PREFIX}_PORT:-${M_PORT}}\""
800
+ echo " PORTAL_INTROSPECT_URL: http://portal-api:3000/api/tokens/introspect"
801
+ echo " ${PREFIX}_SA_CLIENT_ID: ${M_SA}"
802
+ echo " ${PREFIX}_SA_CLIENT_SECRET: \${${svar}}"
803
+ # 发起方才有:门户库里那把(register-app 从清单读)与容器里这把必须同源,否则
804
+ # 跨应用交换在【发起方】上 401,而错看起来像是被调方的问题。
805
+ [ -n "$M_XTARGETS" ] && echo " ${PREFIX}_APP_SECRET: \${${avar}}"
806
+ echo " ${PREFIX}_PG_DSN: postgres://postgres:postgres@postgres:5432/xgent-${key}"
807
+ echo " DATABASE_URL: postgres://postgres:postgres@postgres:5432/xgent-${key}"
808
+ echo " expose: [\"\${${PREFIX}_PORT:-${M_PORT}}\"]"
809
+ echo " networks: { default: { aliases: [${key}-server] } }"
810
+ } > "$out"
811
+ info "⑥ 生成 ${out#$HOME_DIR/}"
812
+ [ -n "$M_ENV" ] && _note "清单声明了 requiredEnv:${M_ENV} —— 值归平台,按需补进 compose.env 末尾。"
813
+
814
+ # 例外:manifest 描述不了的自带 infra(如 knowledge 的 Chroma)
815
+ local extra_args=() extra="$SKILL_DIR/services/${key}.extra.yml"
816
+ [ -f "$extra" ] && { extra_args=(-f "$extra"); info " 叠加自带依赖 services/${key}.extra.yml"; }
817
+
818
+ # 对象存储桶:清单 requiredEnv 里带 *_S3_BUCKET_NAME / ZO_S3_BUCKET_NAME 的,按 compose.env 里的值在一盒 minio 上建桶
819
+ local bvar bname
820
+ for bvar in $(printf '%s\n' $M_ENV | grep -E '_S3_BUCKET(_NAME)?$' || true); do
821
+ bname="$(_eff "$bvar")"; [ -n "$bname" ] && _ensure_bucket "$bname"
822
+ done
823
+
824
+ # 清单声明了 deployDescriptor.migrateArgs(生产由 deploy-controller 在换容器前跑):起容器前先跑一次
825
+ if [ -n "$M_MIGRATE" ]; then
826
+ info "⑥b 迁移:${key}-server ${M_MIGRATE}"
827
+ dc up -d postgres minio >/dev/null 2>&1 || true
828
+ # shellcheck disable=SC2086
829
+ XGENT_ONEBOX_HOME="$HOME_DIR" dc -f "$out" ${extra_args[@]+"${extra_args[@]}"} run --rm --no-deps "${key}-server" $M_MIGRATE \
830
+ || warn "${key}-server ${M_MIGRATE} 失败 —— 看上面的报错(多半是 env 值没到位)"
831
+ fi
832
+
833
+ info "⑦ 起容器"
834
+ XGENT_ONEBOX_HOME="$HOME_DIR" dc -f "$out" ${extra_args[@]+"${extra_args[@]}"} up -d "${key}-server"
835
+
836
+ echo; info "⑧ 冒烟"
837
+ # amd64 镜像在 Apple Silicon 上走仿真,冷启动能到两分钟(observability 实测 ~100s):等 120s。
838
+ local i=0 code=""
839
+ while [ "$i" -lt 60 ]; do
840
+ code="$(curl -s -m 5 -o /dev/null -w '%{http_code}' "${BASE_URL}/svc/${key}${M_HEALTH}" || true)"
841
+ [ "$code" = "200" ] && break; i=$((i+1)); sleep 2
842
+ done
843
+ if [ "$code" = "200" ]; then _ok "/svc/${key}${M_HEALTH} 200"
844
+ else _bad "/svc/${key}${M_HEALTH} HTTP ${code:-000}(等了 120s)" "${0} dc logs ${key}-server —— 多半是镜像认的 env 变量名与上面生成的那几个不同名,补进 compose.env 末尾即可"; fi
845
+
846
+ [ -n "${ADD_QUIET:-}" ] && return 0
847
+ echo
848
+ info "还差最后一步(浏览器里点一下):rockie@xgent.ai 登控制台 → 租户 → 可用应用 → 勾上「${key}」保存。"
849
+ _note "service 型 App 的勾选【就是】安装;不装的话跨应用交换拿不到它的 scope。"
850
+ # wireInitiatorSecret 只能写【已安装】的 apps 行 —— 先勾选安装、再重跑一次 add 才落得下去。
851
+ [ -n "$M_XTARGETS" ] && _note "它声明了 exchangeTargets(${M_XTARGETS})—— 勾选安装【之后】再跑一次 ${0} add ${key},那把 App Secret 才写得进已安装的行(幂等,不会重复建东西)。"
852
+ echo
853
+ info "然后在【你自己】的 manifest 里两处一起加,再 ${0} up:"
854
+ printf ' "scopes": […, "%s.read", …]\n' "$(printf '%s' "$key" | tr '-' '_')"
855
+ printf ' "exchangeTargets": ["%s"]\n' "$key"
856
+ }
857
+
858
+ # --- doctor:把排查表能自动判的都判一遍 ----------------------------------------
859
+ DOCTOR_BAD=0
860
+ cmd_doctor() {
861
+ DOCTOR_BAD=0
862
+ echo "一盒体检(${BASE_URL})"
863
+ echo
864
+
865
+ echo "① 镜像版本"
866
+ local iv; iv="$(_eff XGENT_IMAGE)"
867
+ if docker image inspect "$iv" >/dev/null 2>&1; then
868
+ if docker run --rm --entrypoint sh "$iv" -c '[ -d /srv/www/apps ]' >/dev/null 2>&1; then
869
+ _ok "门户镜像带有共享目录预建(v1.2.0+)"
870
+ else
871
+ _bad "门户镜像是旧版(缺 /srv/www/apps 等预建目录)" "$0 pull && $0 dc down -v && $0 up —— 顺序是【先换镜像、再删卷】,只做一半都不解决"
872
+ fi
873
+ else _note "本地没有 ${iv},跳过($0 pull)"; fi
874
+
875
+ echo "② 命名卷属主(EACCES 一族的根因)"
876
+ if _svc_running reverse-proxy; then
877
+ local bad_dirs=""
878
+ local d
879
+ for d in /srv/www/apps /etc/caddy/svc-allow /etc/caddy/apps-csp; do
880
+ local owner; owner="$(dc exec -T -u root reverse-proxy stat -c '%u' "$d" 2>/dev/null | tr -d '\r' || echo "")"
881
+ [ "$owner" = "1000" ] || bad_dirs="$bad_dirs $d"
882
+ done
883
+ if [ -z "$bad_dirs" ]; then _ok "三个共享卷都归 bun(1000)"
884
+ else _bad "这些卷不归 portal-api:$bad_dirs" "$0 dc exec -u root reverse-proxy chown -R 1000:1000$bad_dirs"; fi
885
+ # 内联 key 却存在 map 文件 ⇒ duplicate input ⇒ 反代整个起不来
886
+ local dup; dup="$(dc exec -T reverse-proxy sh -c 'ls /etc/caddy/svc-allow/ 2>/dev/null' 2>/dev/null | tr -d '\r' | grep -E '^(knowledge|omni-parser|task-gateway|pagebuilder)\.map$' | tr '\n' ' ' || true)"
887
+ if [ -n "$dup" ]; then _bad "内联 key 又写了 map:$dup" "这会让 Caddy 拒绝整份配置(全站 502)。$0 dc exec -u root reverse-proxy sh -c 'cd /etc/caddy/svc-allow && rm -f $dup' && $0 dc restart reverse-proxy"
888
+ else _ok "没有与内联 key 撞车的 map 文件"; fi
889
+ else _note "reverse-proxy 没在跑,跳过($0 up)"; fi
890
+
891
+ echo "③ 架构匹配"
892
+ local host_arch img_arch; host_arch="$(docker version --format '{{.Server.Arch}}' 2>/dev/null || echo '?')"
893
+ if [ -n "$APP_IMAGE" ] && docker image inspect "$APP_IMAGE" >/dev/null 2>&1; then
894
+ img_arch="$(docker image inspect --format '{{.Architecture}}' "$APP_IMAGE" 2>/dev/null || echo '?')"
895
+ if [ "$img_arch" = "$host_arch" ] || [ -n "$(_eff APP_PLATFORM)" ]; then _ok "APP_IMAGE ($img_arch) 与本机 ($host_arch) 兼容"
896
+ else _bad "APP_IMAGE 是 ${img_arch},本机是 $host_arch" "compose.env 末尾加:APP_PLATFORM=linux/${img_arch}(Apple Silicon 走 Rosetta,慢但能跑)"; fi
897
+ else _note "APP_IMAGE 未填或本地没有,跳过"; fi
898
+
899
+ echo "④ 数据库"
900
+ if _svc_running postgres; then
901
+ local want="$CATALOG"; [ -n "$APP_KEY" ] && want="$CATALOG,$APP_KEY"
902
+ local dbs; dbs="$(dc exec -T postgres psql -U postgres -lqt 2>/dev/null | cut -d'|' -f1 | tr -d ' \r' || true)"
903
+ local miss=""
904
+ for k in ${want//,/ }; do
905
+ _is_portal_hosted "$k" && continue
906
+ printf '%s\n' "$dbs" | grep -qx "xgent-$k" || miss="$miss xgent-$k"
907
+ done
908
+ if [ -z "$miss" ]; then _ok "目录里每个 App 的库都在"
909
+ else _bad "缺库:$miss" "$0 dc exec postgres psql -U postgres -c 'CREATE DATABASE \"<库名>\"'($0 add <key> 会顺手建)"; fi
910
+ else _note "postgres 没在跑,跳过"; fi
911
+
912
+ # 栈没起的时候,⑤⑥ 每一格都会红,而真正的下一步只有一个 —— 别拿 8 行红字淹掉它。
913
+ if ! _svc_running portal-api; then
914
+ echo "⑤⑥ 目录/路由"
915
+ _bad "栈还没起来(portal-api 没在跑)" "${0} up —— 它会按顺序铺完再自动跑一次体检"
916
+ echo; printf '%s先把栈起来,其余的判断才有意义。%s\n' "$c_ylw" "$c_off"
917
+ return 0
918
+ fi
919
+
920
+ echo "⑤ 目录 vs 容器"
921
+ for k in ${CATALOG//,/ }; do
922
+ _is_portal_hosted "$k" && continue
923
+ case "$k" in files|llm-gateway|git|org) continue;; esac
924
+ if _svc_running "${k}-server"; then _ok "$k 的容器在跑"
925
+ else _bad "$k 在 XGENT_APP_CATALOG 里但容器没起" "$0 add ${k}(清单已注册的话它只会补建库+起容器)"; fi
926
+ done
927
+
928
+ echo "⑥ 路由与健康"
929
+ cmd_smoke >/dev/null 2>&1 || true
930
+ local keys="$CATALOG"; [ -n "$APP_KEY" ] && keys="$CATALOG,$APP_KEY"
931
+ local code
932
+ code="$(curl -s -m 8 -o /dev/null -w '%{http_code}' "$BASE_URL/health" || true)"
933
+ [ "$code" = "200" ] && _ok "门户 /health 200" || _bad "门户 /health HTTP ${code:-000}" "000=反代没起或端口不对($0 dc ps);其它看 $0 dc logs portal-api"
934
+ for k in ${keys//,/ }; do
935
+ _is_portal_hosted "$k" && continue
936
+ code="$(curl -s -m 8 -o /dev/null -w '%{http_code}' "$BASE_URL/svc/$k/health" || true)"
937
+ case "$code" in
938
+ 200) _ok "/svc/$k 200";;
939
+ 404) _bad "/svc/$k 404" "放行没写成或反代在写之前就起了:$0 dc exec reverse-proxy caddy reload";;
940
+ 502) _bad "/svc/$k 502" "后端不在/没听 8080/别名没命中:$0 dc logs ${k}-server";;
941
+ *) _bad "/svc/$k HTTP ${code:-000}" "$0 dc ps";;
942
+ esac
943
+ done
944
+
945
+ echo
946
+ if [ "$DOCTOR_BAD" -eq 0 ]; then printf '%s一切正常。%s\n' "$c_grn" "$c_off"
947
+ else printf '%s%s 项要处理 —— 每条下面那行可以直接粘。%s\n' "$c_ylw" "$DOCTOR_BAD" "$c_off"
948
+ printf '%s还有判不了的?排查表按「你看到什么」编排:references/troubleshooting.md%s\n' "$c_dim" "$c_off"; fi
949
+ return 0
950
+ }
951
+
952
+ case "${1-status}" in
953
+ init) shift; cmd_init "$@" ;;
954
+ pull) shift; cmd_pull "$@" ;;
955
+ env) require_home; load_env; cmd_env ;;
956
+ smoke) require_home; load_env; cmd_smoke ;;
957
+ status) require_home; load_env; cmd_status ;;
958
+ chain) require_home; load_env; { while IFS= read -r -d '' x; do printf '%s ' "$x"; done < <(compose_args); echo; } ;;
959
+ up) require_home; load_env; cmd_up ;;
960
+ doctor) require_home; load_env; cmd_doctor ;;
961
+ add) require_home; load_env; shift; cmd_add "$@" ;;
962
+ dc) require_home; load_env; shift; dc "$@" ;;
963
+ # 打印开头那段注释直到第一条非注释行 —— 别写死行号,加一条子命令就会截断(踩过)。
964
+ -h|--help|help) awk 'NR>1 && /^#/ {sub(/^# ?/,""); print; next} NR>1 {exit}' "${BASH_SOURCE[0]}" ;;
965
+ *) die "未知子命令 '$1'。用 init | up | doctor | add <key> | pull | env | status | smoke | chain | dc <args...>" ;;
966
+ esac