botrun-horse 2.31.0 → 2.35.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 (664) hide show
  1. package/bin/bh.mjs +42 -170
  2. package/bin/commands/help.mjs +30 -30
  3. package/{lib/flows → modules/_core}/draft-writing.mjs +1 -1
  4. package/{lib/flows → modules/_core}/gemini-ask.mjs +1 -1
  5. package/{lib/flows → modules/_core}/legal-ask.mjs +4 -4
  6. package/{lib/flows → modules/_core}/openai-agent.mjs +2 -2
  7. package/{lib/flows → modules/_core}/openrouter-ask.mjs +1 -1
  8. package/{bin/commands/dag-cmd.mjs → modules/dag/command.mjs} +2 -2
  9. package/modules/dag/index.mjs +30 -0
  10. package/{bin/commands/db-cmd.mjs → modules/db/command.mjs} +3 -3
  11. package/modules/db/index.mjs +26 -0
  12. package/modules/discover.mjs +43 -0
  13. package/{bin/commands/doc.mjs → modules/doc/command.mjs} +5 -5
  14. package/modules/doc/index.mjs +55 -0
  15. package/{lib/doc/index.mjs → modules/doc/ingest.mjs} +1 -1
  16. package/{lib → modules}/doc/office2text.mjs +1 -1
  17. package/{lib → modules}/doc/pdf2text.mjs +1 -1
  18. package/{lib → modules}/doc/split.mjs +1 -1
  19. package/{bin/commands/gemini.mjs → modules/gemini/command.mjs} +3 -3
  20. package/modules/gemini/index.mjs +41 -0
  21. package/modules/imagen/command.mjs +117 -0
  22. package/modules/imagen/imagen-client.mjs +239 -0
  23. package/modules/imagen/index.mjs +60 -0
  24. package/modules/imagen/server.mjs +133 -0
  25. package/{bin/commands/legal.mjs → modules/legal/command.mjs} +5 -5
  26. package/modules/legal/index.mjs +56 -0
  27. package/{bin/commands/nchc.mjs → modules/nchc/command.mjs} +4 -4
  28. package/modules/nchc/index.mjs +48 -0
  29. package/modules/ocr/index.mjs +17 -0
  30. package/{bin/commands/openrouter.mjs → modules/openrouter/command.mjs} +5 -5
  31. package/modules/openrouter/index.mjs +49 -0
  32. package/modules/portal/index.mjs +17 -0
  33. package/{bin/commands/search.mjs → modules/search/command.mjs} +3 -3
  34. package/modules/search/index.mjs +23 -0
  35. package/{lib/search/index.mjs → modules/search/search-lib.mjs} +1 -1
  36. package/{bin/commands/skill.mjs → modules/skill/command.mjs} +8 -8
  37. package/modules/skill/index.mjs +35 -0
  38. package/{lib/prompt → modules/skill}/prompt-search.mjs +1 -1
  39. package/{lib/prompt → modules/skill}/prompt-store.mjs +7 -5
  40. package/modules/skill/prompts/zero-framework/address-matching.md +22 -0
  41. package/modules/skill/prompts/zero-framework/data-integrity.md +15 -0
  42. package/modules/skill/prompts/zero-framework/data-reasonability.md +17 -0
  43. package/modules/skill/prompts/zero-framework/gemini-image-gen.md +20 -0
  44. package/modules/skill/prompts/zero-framework/html-report.md +15 -0
  45. package/{bin/commands/writing.mjs → modules/writing/command.mjs} +3 -3
  46. package/{lib → modules}/writing/generate.mjs +2 -2
  47. package/modules/writing/index.mjs +38 -0
  48. package/package.json +3 -1
  49. package/parallel-dag-todo-list/imagen-module.md +51 -0
  50. package/bin/commands/schema.mjs +0 -254
  51. package/botrun-c/.claude/skills/DOCX/351/226/261/350/256/200/346/212/200/350/203/275/SKILL.md +0 -103
  52. package/botrun-c/.claude/skills/DOCX/351/226/261/350/256/200/346/212/200/350/203/275/scripts/docx-to-markdown.mjs +0 -206
  53. package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/SKILL.md +0 -1093
  54. package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-branch.mjs +0 -73
  55. package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-branches.mjs +0 -77
  56. package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-checkout.mjs +0 -72
  57. package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-clone.mjs +0 -72
  58. package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-commit.mjs +0 -75
  59. package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-delete-branch.mjs +0 -75
  60. package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-delete-file.mjs +0 -72
  61. package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-diff.mjs +0 -80
  62. package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-list-tree.mjs +0 -336
  63. package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-list.mjs +0 -199
  64. package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-merge.mjs +0 -86
  65. package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-move.mjs +0 -75
  66. package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-pr-create.mjs +0 -81
  67. package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-pr-list.mjs +0 -74
  68. package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-pr-merge.mjs +0 -83
  69. package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-pr-view.mjs +0 -71
  70. package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-push.mjs +0 -71
  71. package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-read.mjs +0 -277
  72. package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-search.mjs +0 -370
  73. package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-stash.mjs +0 -116
  74. package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-sync.mjs +0 -71
  75. package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-write.mjs +0 -74
  76. package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/lib/path-validator.mjs +0 -167
  77. package/botrun-c/.claude/skills/GoogleDrive/346/212/200/350/203/275/SKILL.md +0 -605
  78. package/botrun-c/.claude/skills/GoogleDrive/346/212/200/350/203/275/scripts/gdrive-create.mjs +0 -127
  79. package/botrun-c/.claude/skills/GoogleDrive/346/212/200/350/203/275/scripts/gdrive-delete.mjs +0 -77
  80. package/botrun-c/.claude/skills/GoogleDrive/346/212/200/350/203/275/scripts/gdrive-diff.mjs +0 -87
  81. package/botrun-c/.claude/skills/GoogleDrive/346/212/200/350/203/275/scripts/gdrive-history.mjs +0 -99
  82. package/botrun-c/.claude/skills/GoogleDrive/346/212/200/350/203/275/scripts/gdrive-list.mjs +0 -174
  83. package/botrun-c/.claude/skills/GoogleDrive/346/212/200/350/203/275/scripts/gdrive-read.mjs +0 -214
  84. package/botrun-c/.claude/skills/GoogleDrive/346/212/200/350/203/275/scripts/gdrive-restore.mjs +0 -75
  85. package/botrun-c/.claude/skills/GoogleDrive/346/212/200/350/203/275/scripts/gdrive-search.mjs +0 -270
  86. package/botrun-c/.claude/skills/GoogleDrive/346/212/200/350/203/275/scripts/gdrive-sync-back.mjs +0 -155
  87. package/botrun-c/.claude/skills/GoogleDrive/346/212/200/350/203/275/scripts/gdrive-update.mjs +0 -100
  88. package/botrun-c/.claude/skills/HTML/347/224/237/346/210/220/346/212/200/350/203/275/SKILL.md +0 -414
  89. package/botrun-c/.claude/skills/HTML/347/224/237/346/210/220/346/212/200/350/203/275/scripts/create-project.mjs +0 -91
  90. package/botrun-c/.claude/skills/HTML/347/224/237/346/210/220/346/212/200/350/203/275/scripts/finalize-project.mjs +0 -162
  91. package/botrun-c/.claude/skills/PDF/346/212/200/350/203/275/SKILL.md +0 -206
  92. package/botrun-c/.claude/skills/PDF/346/212/200/350/203/275/scripts/package.json +0 -19
  93. package/botrun-c/.claude/skills/PDF/346/212/200/350/203/275/scripts/pdf-analyze.mjs +0 -309
  94. package/botrun-c/.claude/skills/PDF/346/212/200/350/203/275/scripts/pdf-compress.mjs +0 -315
  95. package/botrun-c/.claude/skills/PDF/346/212/200/350/203/275/scripts/pdf-split.mjs +0 -275
  96. package/botrun-c/.claude/skills/PDF/346/212/200/350/203/275/scripts/pdf-to-text.mjs +0 -336
  97. package/botrun-c/.claude/skills/PDF/346/212/200/350/203/275/scripts/test-pdf-scripts.mjs +0 -491
  98. package/botrun-c/.claude/skills/docx-to-markdown/SKILL.md +0 -76
  99. package/botrun-c/.claude/skills/docx-to-markdown/scripts/convert_docx.py +0 -183
  100. package/botrun-c/.claude/skills/gcp-coord-ml-ocr/SKILL.md +0 -133
  101. package/botrun-c/.claude/skills/gcp-coord-ml-ocr/scripts/ocr_processor.py +0 -381
  102. package/botrun-c/.claude/skills/gemini-transcribe/SKILL.md +0 -115
  103. package/botrun-c/.claude/skills/gemini-transcribe/scripts/transcribe.py +0 -499
  104. package/botrun-c/.claude/skills/nchc-transcribe/SKILL.md +0 -131
  105. package/botrun-c/.claude/skills/nchc-transcribe/scripts/transcribe.py +0 -522
  106. package/botrun-c/.claude/skills/p320-moj-review/SKILL.md +0 -200
  107. package/botrun-c/.claude/skills/p320-moj-review/references/guideline.md +0 -118
  108. package/botrun-c/.claude/skills/pdf-multimodal-processor/SKILL.md +0 -186
  109. package/botrun-c/.claude/skills/pdf-multimodal-processor/scripts/process_pdf.py +0 -515
  110. package/botrun-c/.claude/skills/ripgrep/346/220/234/345/260/213/346/212/200/350/203/275/SKILL.md +0 -81
  111. package/botrun-c/.claude/skills/ripgrep/346/220/234/345/260/213/346/212/200/350/203/275/scripts/package.json +0 -13
  112. package/botrun-c/.claude/skills/ripgrep/346/220/234/345/260/213/346/212/200/350/203/275/scripts/secure-search.mjs +0 -232
  113. package/botrun-c/.claude/skills/top100/351/240/230/350/242/226/351/240/220/346/270/254/346/212/200/350/203/275/SKILL.md +0 -518
  114. package/botrun-c/.claude/skills//345/216/273/350/255/230/345/210/245/346/212/200/350/203/275/SKILL.md +0 -125
  115. package/botrun-c/.claude/skills//345/233/236/346/206/266/346/212/200/350/203/275/SKILL.md +0 -123
  116. package/botrun-c/.claude/skills//345/233/236/346/206/266/346/212/200/350/203/275/scripts/recall.mjs +0 -339
  117. package/botrun-c/.claude/skills//345/234/226/347/211/207/347/224/237/346/210/220/346/212/200/350/203/275/SKILL.md +0 -156
  118. package/botrun-c/.claude/skills//345/234/226/347/211/207/347/224/237/346/210/220/346/212/200/350/203/275/scripts/__tests__/utils.test.mjs +0 -139
  119. package/botrun-c/.claude/skills//345/234/226/347/211/207/347/224/237/346/210/220/346/212/200/350/203/275/scripts/constants.mjs +0 -40
  120. package/botrun-c/.claude/skills//345/234/226/347/211/207/347/224/237/346/210/220/346/212/200/350/203/275/scripts/gcs-uploader.mjs +0 -195
  121. package/botrun-c/.claude/skills//345/234/226/347/211/207/347/224/237/346/210/220/346/212/200/350/203/275/scripts/gemini-image-client.mjs +0 -307
  122. package/botrun-c/.claude/skills//345/234/226/347/211/207/347/224/237/346/210/220/346/212/200/350/203/275/scripts/generate-image.mjs +0 -103
  123. package/botrun-c/.claude/skills//345/234/226/347/211/207/347/224/237/346/210/220/346/212/200/350/203/275/scripts/image-session-manager.mjs +0 -219
  124. package/botrun-c/.claude/skills//345/234/226/347/211/207/347/224/237/346/210/220/346/212/200/350/203/275/scripts/output-formatter.mjs +0 -209
  125. package/botrun-c/.claude/skills//345/234/226/347/211/207/347/224/237/346/210/220/346/212/200/350/203/275/scripts/package.json +0 -20
  126. package/botrun-c/.claude/skills//345/234/226/347/211/207/347/224/237/346/210/220/346/212/200/350/203/275/scripts/utils.mjs +0 -115
  127. package/botrun-c/.claude/skills//345/244/232/346/250/241/346/205/213/351/226/261/350/256/200/346/212/200/350/203/275/SKILL.md +0 -86
  128. package/botrun-c/.claude/skills//345/244/232/346/250/241/346/205/213/351/226/261/350/256/200/346/212/200/350/203/275/scripts/multimodal-read.mjs +0 -304
  129. package/botrun-c/.claude/skills//345/244/232/346/250/241/346/205/213/351/226/261/350/256/200/346/212/200/350/203/275/scripts/package.json +0 -17
  130. package/botrun-c/.claude/skills//345/255/265/345/214/226/346/212/200/350/203/275/SKILL.md +0 -131
  131. package/botrun-c/.claude/skills//345/255/265/345/214/226/346/212/200/350/203/275/scripts/skill-manager.mjs +0 -542
  132. package/botrun-c/.claude/skills//346/234/203/350/255/260/350/250/230/351/214/204/346/212/200/350/203/275/SKILL.md +0 -127
  133. package/botrun-c/.claude/skills//347/233/256/351/214/204/345/210/227/350/241/250/346/212/200/350/203/275/SKILL.md +0 -53
  134. package/botrun-c/.claude/skills//347/233/256/351/214/204/345/210/227/350/241/250/346/212/200/350/203/275/scripts/package.json +0 -13
  135. package/botrun-c/.claude/skills//347/233/256/351/214/204/345/210/227/350/241/250/346/212/200/350/203/275/scripts/tree-view.mjs +0 -149
  136. package/botrun-c/.claude/skills//347/264/224/346/226/207/345/255/227/345/244/232/346/252/224/346/241/210/350/256/200/345/217/226/346/212/200/350/203/275/SKILL.md +0 -82
  137. package/botrun-c/.claude/skills//347/264/224/346/226/207/345/255/227/345/244/232/346/252/224/346/241/210/350/256/200/345/217/226/346/212/200/350/203/275/scripts/package.json +0 -16
  138. package/botrun-c/.claude/skills//347/264/224/346/226/207/345/255/227/345/244/232/346/252/224/346/241/210/350/256/200/345/217/226/346/212/200/350/203/275/scripts/secure-read.mjs +0 -260
  139. package/botrun-c/.claude/skills//347/266/262/350/267/257/346/220/234/345/260/213/346/212/200/350/203/275/SKILL.md +0 -156
  140. package/botrun-c/.claude/skills//347/266/262/350/267/257/346/220/234/345/260/213/346/212/200/350/203/275/scripts/package.json +0 -16
  141. package/botrun-c/.claude/skills//347/266/262/350/267/257/346/220/234/345/260/213/346/212/200/350/203/275/scripts/search.js +0 -139
  142. package/botrun-c/.claude/skills//347/266/262/350/267/257/346/220/234/345/260/213/346/212/200/350/203/275/scripts/search.mjs +0 -272
  143. package/botrun-c/.claude/skills//347/266/262/350/267/257/346/220/234/345/260/213/346/212/200/350/203/275/scripts/search.ts +0 -166
  144. package/botrun-c/.claude/skills//350/250/230/346/206/266/346/212/200/350/203/275/SKILL.md +0 -114
  145. package/botrun-c/.claude/skills//350/250/230/346/206/266/346/212/200/350/203/275/scripts/remember.mjs +0 -159
  146. package/botrun-c/.claude/skills//350/250/230/346/206/266/346/212/200/350/203/275/scripts/test-advanced.mjs +0 -342
  147. package/botrun-c/.claude/skills//350/250/230/346/206/266/346/212/200/350/203/275/scripts/test.mjs +0 -430
  148. package/botrun-c/.claude/skills//350/252/236/351/237/263/350/275/211/346/226/207/345/255/227/346/212/200/350/203/275/SKILL.md +0 -30
  149. package/botrun-c/.claude/skills//350/252/236/351/237/263/350/275/211/346/226/207/345/255/227/346/212/200/350/203/275/scripts/package.json +0 -13
  150. package/botrun-c/.claude/skills//350/252/236/351/237/263/350/275/211/346/226/207/345/255/227/346/212/200/350/203/275/scripts/transcribe.mjs +0 -294
  151. package/botrun-c/.claude/skills//351/233/266/345/271/273/350/246/272/350/255/211/346/230/216/346/212/200/350/203/275/SKILL.md +0 -338
  152. package/botrun-c/.dockerignore +0 -131
  153. package/botrun-c/.dockeroptimize +0 -13
  154. package/botrun-c/.firebase/hosting.b3V0.cache +0 -30
  155. package/botrun-c/.firebaserc +0 -5
  156. package/botrun-c/.gcloudignore +0 -56
  157. package/botrun-c/.ruby-version +0 -1
  158. package/botrun-c/CHANGELOG.md +0 -224
  159. package/botrun-c/Dockerfile.gcp +0 -365
  160. package/botrun-c/Dockerfile.slim +0 -195
  161. package/botrun-c/Gemfile +0 -8
  162. package/botrun-c/Gemfile.lock +0 -233
  163. package/botrun-c/LOCAL-DEVELOPMENT-GUIDE.md +0 -393
  164. package/botrun-c/PLAN.md +0 -131
  165. package/botrun-c/README.md +0 -129
  166. package/botrun-c/TODO-CAPACITOR-INTEGRATION.md +0 -482
  167. package/botrun-c/VERIFICATION.md +0 -121
  168. package/botrun-c/admin/RATE_LIMIT_MANAGEMENT.md +0 -312
  169. package/botrun-c/admin/README.md +0 -338
  170. package/botrun-c/admin/botrun-billing-report-1765235244038.csv +0 -22
  171. package/botrun-c/admin/botrun-billing-report-1765235323089.csv +0 -22
  172. package/botrun-c/admin/botrun-dashboard-1765235244039.html +0 -278
  173. package/botrun-c/admin/botrun-dashboard-1765235323089.html +0 -278
  174. package/botrun-c/admin/botrun-timeseries-074xGzIKWyfKTBt1NMIj9lxi5mO2-1765235244039.html +0 -161
  175. package/botrun-c/admin/botrun-timeseries-074xGzIKWyfKTBt1NMIj9lxi5mO2-1765235323090.html +0 -161
  176. package/botrun-c/admin/check-billing.ts +0 -48
  177. package/botrun-c/admin/count-all-users.ts +0 -65
  178. package/botrun-c/admin/generate-analytics-report.ts +0 -188
  179. package/botrun-c/admin/jest.config.ts +0 -43
  180. package/botrun-c/admin/lib/__tests__/formatters.test.ts +0 -264
  181. package/botrun-c/admin/lib/__tests__/mocks/firebase.mock.ts +0 -112
  182. package/botrun-c/admin/lib/__tests__/services/UserService.test.ts +0 -83
  183. package/botrun-c/admin/lib/__tests__/user-resolver.test.ts +0 -439
  184. package/botrun-c/admin/lib/analyzers/BillingAnalyticsService.ts +0 -242
  185. package/botrun-c/admin/lib/analyzers/CsvExporter.ts +0 -263
  186. package/botrun-c/admin/lib/analyzers/HtmlChartGenerator.ts +0 -530
  187. package/botrun-c/admin/lib/analyzers/SpikeAnalyzer.ts +0 -608
  188. package/botrun-c/admin/lib/analyzers/TimeSeriesAnalyzer.ts +0 -344
  189. package/botrun-c/admin/lib/cli/CLIBootstrapper.ts +0 -40
  190. package/botrun-c/admin/lib/commands/AbstractCommand.ts +0 -69
  191. package/botrun-c/admin/lib/commands/AnalyticsCommand.ts +0 -215
  192. package/botrun-c/admin/lib/commands/ListCommand.ts +0 -85
  193. package/botrun-c/admin/lib/commands/QueryCommand.ts +0 -81
  194. package/botrun-c/admin/lib/commands/SpikeCommand.ts +0 -83
  195. package/botrun-c/admin/lib/domain/User.ts +0 -38
  196. package/botrun-c/admin/lib/firebase.ts +0 -92
  197. package/botrun-c/admin/lib/firestore-safe.ts +0 -105
  198. package/botrun-c/admin/lib/formatters.ts +0 -154
  199. package/botrun-c/admin/lib/rate-limit-detailed.ts +0 -355
  200. package/botrun-c/admin/lib/rate-limit.ts +0 -286
  201. package/botrun-c/admin/lib/repositories/UserRepository.ts +0 -104
  202. package/botrun-c/admin/lib/services/UserService.ts +0 -108
  203. package/botrun-c/admin/lib/types.ts +0 -56
  204. package/botrun-c/admin/lib/user-resolver.ts +0 -275
  205. package/botrun-c/admin/manage-auth-domains.js +0 -178
  206. package/botrun-c/admin/migrate-plan-free.sh +0 -64
  207. package/botrun-c/admin/package-lock.json +0 -5656
  208. package/botrun-c/admin/package.json +0 -28
  209. package/botrun-c/admin/rate-limit.sh +0 -55
  210. package/botrun-c/admin/remove-custom-limits.ts +0 -75
  211. package/botrun-c/admin/reset-rate.sh +0 -70
  212. package/botrun-c/admin/reset-trial.sh +0 -68
  213. package/botrun-c/admin/seed-trial-data.sh +0 -38
  214. package/botrun-c/admin/trial.sh +0 -55
  215. package/botrun-c/admin/tsconfig.json +0 -20
  216. package/botrun-c/admin/users-cli.py +0 -298
  217. package/botrun-c/admin/users.sh +0 -12
  218. package/botrun-c/admin/users.ts +0 -1321
  219. package/botrun-c/api/admin-tools/check-whitelist.mjs.migration-bak +0 -74
  220. package/botrun-c/api/admin-tools/create-user.mjs +0 -92
  221. package/botrun-c/api/admin-tools/create-user.mjs.migration-bak +0 -92
  222. package/botrun-c/api/admin-tools/firebase-auth-domains-v2.py +0 -287
  223. package/botrun-c/api/admin-tools/firebase-auth-domains-v2.py.migration-bak +0 -287
  224. package/botrun-c/api/admin-tools/init-firestore.mjs +0 -75
  225. package/botrun-c/api/admin-tools/init-firestore.mjs.migration-bak +0 -101
  226. package/botrun-c/api/admin-tools/list-users.mjs +0 -43
  227. package/botrun-c/api/admin-tools/list-users.mjs.migration-bak +0 -43
  228. package/botrun-c/api/admin-tools/manage-authorized-domains.ts +0 -255
  229. package/botrun-c/api/admin-tools/manage-authorized-domains.ts.migration-bak +0 -255
  230. package/botrun-c/api/admin-tools/setup-custom-claims.ts.migration-bak +0 -155
  231. package/botrun-c/api/admin-tools/test-claims.mjs +0 -69
  232. package/botrun-c/api/admin-tools/test-claims.mjs.migration-bak +0 -69
  233. package/botrun-c/api/admin-tools/update-service-urls-gcloud.mjs +0 -72
  234. package/botrun-c/api/admin-tools/update-service-urls-gcloud.mjs.migration-bak +0 -72
  235. package/botrun-c/api/admin-tools/update-service-urls-to-lb.mjs +0 -159
  236. package/botrun-c/api/admin-tools/update-service-urls-to-lb.mjs.migration-bak +0 -159
  237. package/botrun-c/api/admin-tools/update-service-urls.mjs +0 -82
  238. package/botrun-c/api/admin-tools/update-service-urls.mjs.migration-bak +0 -82
  239. package/botrun-c/api/package-lock.json +0 -5031
  240. package/botrun-c/api/package.json +0 -63
  241. package/botrun-c/api/pnpm-lock.yaml +0 -4157
  242. package/botrun-c/api/rate-limit-export-1763620678737.csv +0 -79
  243. package/botrun-c/api/scripts/README-migrate-plan-free.md +0 -197
  244. package/botrun-c/api/scripts/check-users.ts +0 -45
  245. package/botrun-c/api/scripts/delete-firestore-docs.js +0 -43
  246. package/botrun-c/api/scripts/dump-subscriptions.ts +0 -395
  247. package/botrun-c/api/scripts/list-all-users.ts +0 -65
  248. package/botrun-c/api/scripts/migrate-plan-free-rpd-16to32.ts +0 -262
  249. package/botrun-c/api/scripts/migrate-plan-names-to-lite-max.ts +0 -269
  250. package/botrun-c/api/scripts/query-user-info.ts +0 -304
  251. package/botrun-c/api/scripts/reset-rate-limit.ts +0 -206
  252. package/botrun-c/api/scripts/reset-trial-subscription.ts +0 -166
  253. package/botrun-c/api/scripts/rollback-plan-names-from-lite-max.ts +0 -139
  254. package/botrun-c/api/scripts/seed-rate-limit-test-data.ts +0 -114
  255. package/botrun-c/api/scripts/seed-subscription-test-data.ts +0 -173
  256. package/botrun-c/api/scripts/test-rate-limit-message.ts +0 -108
  257. package/botrun-c/api/test-billing-write.ts +0 -103
  258. package/botrun-c/api/test-billing.ts +0 -81
  259. package/botrun-c/api/test-chat-upload.sh +0 -162
  260. package/botrun-c/api/test-nchc-whisper.ts +0 -87
  261. package/botrun-c/api/test-skills-loading.js +0 -77
  262. package/botrun-c/api/test-skills-symlink.js +0 -118
  263. package/botrun-c/api/test-upload-multimodal.sh +0 -167
  264. package/botrun-c/api/tsconfig.json +0 -27
  265. package/botrun-c/api/verify-form-2-1.mjs +0 -229
  266. package/botrun-c/api/vitest.config.ts +0 -9
  267. package/botrun-c/appium-capabilities.json +0 -20
  268. package/botrun-c/cors.json +0 -26
  269. package/botrun-c/delete-old.sh +0 -44
  270. package/botrun-c/design/google-drive/01-architecture.md +0 -186
  271. package/botrun-c/design/google-drive/02-api-design.md +0 -314
  272. package/botrun-c/design/google-drive/03-frontend-design.md +0 -278
  273. package/botrun-c/design/google-drive/04-skill-design.md +0 -384
  274. package/botrun-c/design/google-drive/05-test-plan.md +0 -507
  275. package/botrun-c/design/google-drive/README.md +0 -32
  276. package/botrun-c/dev/mcp-token-calculator/README.md +0 -92
  277. package/botrun-c/dev/mcp-token-calculator/RESULTS.md +0 -188
  278. package/botrun-c/dev/mcp-token-calculator/calculate-current-tokens.ts +0 -369
  279. package/botrun-c/dev/mcp-token-calculator/calculate-mcp-tokens.ts +0 -464
  280. package/botrun-c/dev/mcp-token-calculator/optimization-proposals.ts +0 -316
  281. package/botrun-c/dev/mcp-token-calculator/package-lock.json +0 -599
  282. package/botrun-c/dev/mcp-token-calculator/package.json +0 -22
  283. package/botrun-c/dev/mcp-token-calculator/test-all-schemas.ts +0 -314
  284. package/botrun-c/dev/mcp-token-calculator/test-schema-correctness.ts +0 -221
  285. package/botrun-c/dev/mcp-token-calculator/verify-optimization.ts +0 -159
  286. package/botrun-c/fastlane/ANDROID-DEPLOYMENT-SETUP.md +0 -825
  287. package/botrun-c/fastlane/IOS-DEPLOYMENT-SETUP.md +0 -431
  288. package/botrun-c/fastlane/Pluginfile +0 -5
  289. package/botrun-c/fastlane/QUICK-START.md +0 -133
  290. package/botrun-c/fastlane/README.md +0 -424
  291. package/botrun-c/fastlane/RUBY-SETUP.md +0 -449
  292. package/botrun-c/fastlane/android/Appfile +0 -11
  293. package/botrun-c/fastlane/android/Fastfile +0 -240
  294. package/botrun-c/firebase.json +0 -46
  295. package/botrun-c/firestore-init-data.json +0 -40
  296. package/botrun-c/firestore.indexes.json +0 -55
  297. package/botrun-c/firestore.rules +0 -53
  298. package/botrun-c/fix-codex-permissions.sh +0 -56
  299. package/botrun-c/gcs-lifecycle-30day-retention.json +0 -12
  300. package/botrun-c/html-architecture/architecture/deployment.html +0 -664
  301. package/botrun-c/html-architecture/architecture/index.html +0 -309
  302. package/botrun-c/html-architecture/architecture/styles.css +0 -500
  303. package/botrun-c/html-architecture/architecture/system-components.html +0 -538
  304. package/botrun-c/html-architecture/architecture/user-flow.html +0 -370
  305. package/botrun-c/mobile-android/FIREBASE-AUTH-SETUP.md +0 -302
  306. package/botrun-c/mobile-android/WSL-ANDROID-SETUP.md +0 -252
  307. package/botrun-c/mobile-android/android/app/build.gradle +0 -75
  308. package/botrun-c/mobile-android/android/app/capacitor.build.gradle +0 -31
  309. package/botrun-c/mobile-android/android/app/proguard-rules.pro +0 -21
  310. package/botrun-c/mobile-android/android/build.gradle +0 -29
  311. package/botrun-c/mobile-android/android/capacitor.settings.gradle +0 -42
  312. package/botrun-c/mobile-android/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  313. package/botrun-c/mobile-android/android/gradle/wrapper/gradle-wrapper.properties +0 -7
  314. package/botrun-c/mobile-android/android/gradle.properties +0 -22
  315. package/botrun-c/mobile-android/android/gradlew +0 -252
  316. package/botrun-c/mobile-android/android/gradlew.bat +0 -94
  317. package/botrun-c/mobile-android/android/settings.gradle +0 -5
  318. package/botrun-c/mobile-android/android/variables.gradle +0 -16
  319. package/botrun-c/mobile-android/capacitor.config.ts +0 -44
  320. package/botrun-c/mobile-android/fastlane/Appfile +0 -11
  321. package/botrun-c/mobile-android/fastlane/Fastfile +0 -202
  322. package/botrun-c/mobile-android/fastlane/README.md +0 -96
  323. package/botrun-c/mobile-android/google-services.json.template +0 -39
  324. package/botrun-c/mobile-android/package.json +0 -32
  325. package/botrun-c/mobile-android/resources/icon.png +0 -0
  326. package/botrun-c/mobile-android/tsconfig.json +0 -15
  327. package/botrun-c/mobile-ios/.ruby-version +0 -1
  328. package/botrun-c/mobile-ios/BUILD-LOG.md +0 -82
  329. package/botrun-c/mobile-ios/Gemfile +0 -4
  330. package/botrun-c/mobile-ios/Gemfile.lock +0 -299
  331. package/botrun-c/mobile-ios/GoogleService-Info.plist.template +0 -34
  332. package/botrun-c/mobile-ios/IOS-PERMISSIONS.md +0 -80
  333. package/botrun-c/mobile-ios/QUICK-START.md +0 -189
  334. package/botrun-c/mobile-ios/README.md +0 -231
  335. package/botrun-c/mobile-ios/capacitor.config.ts +0 -46
  336. package/botrun-c/mobile-ios/fastlane/Fastfile +0 -326
  337. package/botrun-c/mobile-ios/fastlane/README.md +0 -88
  338. package/botrun-c/mobile-ios/ios/App/App/App.entitlements +0 -10
  339. package/botrun-c/mobile-ios/ios/App/App/AppDelegate.swift +0 -49
  340. package/botrun-c/mobile-ios/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png +0 -0
  341. package/botrun-c/mobile-ios/ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -14
  342. package/botrun-c/mobile-ios/ios/App/App/Assets.xcassets/Contents.json +0 -6
  343. package/botrun-c/mobile-ios/ios/App/App/Assets.xcassets/Splash.imageset/Contents.json +0 -56
  344. package/botrun-c/mobile-ios/ios/App/App/Assets.xcassets/Splash.imageset/Default@1x~universal~anyany-dark.png +0 -0
  345. package/botrun-c/mobile-ios/ios/App/App/Assets.xcassets/Splash.imageset/Default@1x~universal~anyany.png +0 -0
  346. package/botrun-c/mobile-ios/ios/App/App/Assets.xcassets/Splash.imageset/Default@2x~universal~anyany-dark.png +0 -0
  347. package/botrun-c/mobile-ios/ios/App/App/Assets.xcassets/Splash.imageset/Default@2x~universal~anyany.png +0 -0
  348. package/botrun-c/mobile-ios/ios/App/App/Assets.xcassets/Splash.imageset/Default@3x~universal~anyany-dark.png +0 -0
  349. package/botrun-c/mobile-ios/ios/App/App/Assets.xcassets/Splash.imageset/Default@3x~universal~anyany.png +0 -0
  350. package/botrun-c/mobile-ios/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-1.png +0 -0
  351. package/botrun-c/mobile-ios/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-2.png +0 -0
  352. package/botrun-c/mobile-ios/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732.png +0 -0
  353. package/botrun-c/mobile-ios/ios/App/App/Base.lproj/LaunchScreen.storyboard +0 -32
  354. package/botrun-c/mobile-ios/ios/App/App/Base.lproj/Main.storyboard +0 -19
  355. package/botrun-c/mobile-ios/ios/App/App/Info.plist +0 -72
  356. package/botrun-c/mobile-ios/ios/App/App.xcodeproj/project.pbxproj +0 -446
  357. package/botrun-c/mobile-ios/ios/App/App.xcodeproj/xcshareddata/xcschemes/App.xcscheme +0 -78
  358. package/botrun-c/mobile-ios/ios/App/App.xcworkspace/contents.xcworkspacedata +0 -10
  359. package/botrun-c/mobile-ios/ios/App/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
  360. package/botrun-c/mobile-ios/ios/App/Podfile +0 -52
  361. package/botrun-c/mobile-ios/ios/App/Podfile.lock +0 -205
  362. package/botrun-c/mobile-ios/ios/App/add_plist.rb +0 -30
  363. package/botrun-c/mobile-ios/ios/App/fix_plist_path.rb +0 -22
  364. package/botrun-c/mobile-ios/package.json +0 -29
  365. package/botrun-c/mobile-ios/resources/icon.png +0 -0
  366. package/botrun-c/mobile-ios/run-simulator.sh +0 -34
  367. package/botrun-c/mobile-ios/screenshot-after-clean-rebuild.png +0 -0
  368. package/botrun-c/mobile-ios/screenshot-final-version.png +0 -0
  369. package/botrun-c/mobile-ios/screenshot-simulator.png +0 -0
  370. package/botrun-c/mobile-ios/screenshot-version-1009.png +0 -0
  371. package/botrun-c/mobile-ios/screenshot-with-version.png +0 -0
  372. package/botrun-c/mobile-ios/screenshot-working.png +0 -0
  373. package/botrun-c/mobile-ios/setup-ios.sh +0 -106
  374. package/botrun-c/mobile-ios/tsconfig.json +0 -16
  375. package/botrun-c/org-policy-allow-all-users.yaml +0 -3
  376. package/botrun-c/package.json +0 -68
  377. package/botrun-c/pnpm-lock.yaml +0 -10198
  378. package/botrun-c/pnpm-workspace.yaml +0 -6
  379. package/botrun-c/prompts/BOTRUN-1.md +0 -13
  380. package/botrun-c/prompts/BOTRUN-2.md +0 -70
  381. package/botrun-c/prompts/BOTRUN-3.md +0 -139
  382. package/botrun-c/prototypes/firestore-gax-debug/package-lock.json +0 -1204
  383. package/botrun-c/prototypes/firestore-gax-debug/package.json +0 -12
  384. package/botrun-c/prototypes/firestore-gax-debug/pnpm-workspace.yaml +0 -2
  385. package/botrun-c/prototypes/firestore-gax-debug/test.js +0 -98
  386. package/botrun-c/prototypes/taiwan-haiku/README.md +0 -93
  387. package/botrun-c/prototypes/taiwan-haiku/index.ts +0 -139
  388. package/botrun-c/prototypes/taiwan-haiku/package.json +0 -23
  389. package/botrun-c/prototypes/taiwan-haiku/pnpm-lock.yaml +0 -730
  390. package/botrun-c/prototypes/taiwan-haiku/test-vertex-direct.ts +0 -83
  391. package/botrun-c/prototypes/taiwan-haiku/tsconfig.json +0 -18
  392. package/botrun-c/prototypes/web-search/FINDINGS-STAGE-1.md +0 -48
  393. package/botrun-c/prototypes/web-search/README.md +0 -46
  394. package/botrun-c/prototypes/web-search/VERIFICATION-REPORT.md +0 -310
  395. package/botrun-c/prototypes/web-search/package-lock.json +0 -595
  396. package/botrun-c/prototypes/web-search/package.json +0 -18
  397. package/botrun-c/prototypes/web-search/stage-1.1-basic-connection.js +0 -123
  398. package/botrun-c/prototypes/web-search/stage-1.2-with-websearch.js +0 -154
  399. package/botrun-c/prototypes/web-search/stage-1.3-search-query.js +0 -192
  400. package/botrun-c/prototypes/web-search/stage-2-agent-sdk-websearch.js +0 -265
  401. package/botrun-c/runtime-scripts/env-detect.sh +0 -64
  402. package/botrun-c/scripts/github-collaborator-manager.sh +0 -297
  403. package/botrun-c/scripts/github-collaborator-manager.ts +0 -325
  404. package/botrun-c/scripts/manage-collaborators.sh +0 -91
  405. package/botrun-c/scripts/setup-secrets.sh +0 -202
  406. package/botrun-c/scripts/stress-test-17-users.sh +0 -113
  407. package/botrun-c/scripts/stress-test-api.sh +0 -119
  408. package/botrun-c/scripts/stress-test-full-report.sh +0 -385
  409. package/botrun-c/specs/infra-vm/design.md +0 -0
  410. package/botrun-c/specs/share-skill/design.md +0 -1146
  411. package/botrun-c/specs/share-skill/tasks.md +0 -444
  412. package/botrun-c/stress-test-results/20260121-162630/config.json +0 -7
  413. package/botrun-c/stress-test-results/20260121-162630/user-1-status.txt +0 -1
  414. package/botrun-c/stress-test-results/20260121-162630/user-1-timing.txt +0 -1
  415. package/botrun-c/stress-test-results/20260121-162630/user-1.json +0 -2
  416. package/botrun-c/stress-test-results/20260121-162646/config.json +0 -7
  417. package/botrun-c/stress-test-results/20260121-162646/user-1-status.txt +0 -1
  418. package/botrun-c/stress-test-results/20260121-162646/user-1-timing.txt +0 -1
  419. package/botrun-c/stress-test-results/20260121-162646/user-1.json +0 -2
  420. package/botrun-c/stress-test-results/20260121-162646/user-10-status.txt +0 -1
  421. package/botrun-c/stress-test-results/20260121-162646/user-10-timing.txt +0 -1
  422. package/botrun-c/stress-test-results/20260121-162646/user-10.json +0 -2
  423. package/botrun-c/stress-test-results/20260121-162646/user-11-status.txt +0 -1
  424. package/botrun-c/stress-test-results/20260121-162646/user-11-timing.txt +0 -1
  425. package/botrun-c/stress-test-results/20260121-162646/user-11.json +0 -2
  426. package/botrun-c/stress-test-results/20260121-162646/user-12-status.txt +0 -1
  427. package/botrun-c/stress-test-results/20260121-162646/user-12-timing.txt +0 -1
  428. package/botrun-c/stress-test-results/20260121-162646/user-12.json +0 -2
  429. package/botrun-c/stress-test-results/20260121-162646/user-13-status.txt +0 -1
  430. package/botrun-c/stress-test-results/20260121-162646/user-13-timing.txt +0 -1
  431. package/botrun-c/stress-test-results/20260121-162646/user-13.json +0 -2
  432. package/botrun-c/stress-test-results/20260121-162646/user-14-status.txt +0 -1
  433. package/botrun-c/stress-test-results/20260121-162646/user-14-timing.txt +0 -1
  434. package/botrun-c/stress-test-results/20260121-162646/user-14.json +0 -2
  435. package/botrun-c/stress-test-results/20260121-162646/user-15-status.txt +0 -1
  436. package/botrun-c/stress-test-results/20260121-162646/user-15-timing.txt +0 -1
  437. package/botrun-c/stress-test-results/20260121-162646/user-15.json +0 -2
  438. package/botrun-c/stress-test-results/20260121-162646/user-16-status.txt +0 -1
  439. package/botrun-c/stress-test-results/20260121-162646/user-16-timing.txt +0 -1
  440. package/botrun-c/stress-test-results/20260121-162646/user-16.json +0 -2
  441. package/botrun-c/stress-test-results/20260121-162646/user-17-status.txt +0 -1
  442. package/botrun-c/stress-test-results/20260121-162646/user-17-timing.txt +0 -1
  443. package/botrun-c/stress-test-results/20260121-162646/user-17.json +0 -2
  444. package/botrun-c/stress-test-results/20260121-162646/user-2-status.txt +0 -1
  445. package/botrun-c/stress-test-results/20260121-162646/user-2-timing.txt +0 -1
  446. package/botrun-c/stress-test-results/20260121-162646/user-2.json +0 -2
  447. package/botrun-c/stress-test-results/20260121-162646/user-3-status.txt +0 -1
  448. package/botrun-c/stress-test-results/20260121-162646/user-3-timing.txt +0 -1
  449. package/botrun-c/stress-test-results/20260121-162646/user-3.json +0 -2
  450. package/botrun-c/stress-test-results/20260121-162646/user-4-status.txt +0 -1
  451. package/botrun-c/stress-test-results/20260121-162646/user-4-timing.txt +0 -1
  452. package/botrun-c/stress-test-results/20260121-162646/user-4.json +0 -2
  453. package/botrun-c/stress-test-results/20260121-162646/user-5-status.txt +0 -1
  454. package/botrun-c/stress-test-results/20260121-162646/user-5-timing.txt +0 -1
  455. package/botrun-c/stress-test-results/20260121-162646/user-5.json +0 -2
  456. package/botrun-c/stress-test-results/20260121-162646/user-6-status.txt +0 -1
  457. package/botrun-c/stress-test-results/20260121-162646/user-6-timing.txt +0 -1
  458. package/botrun-c/stress-test-results/20260121-162646/user-6.json +0 -2
  459. package/botrun-c/stress-test-results/20260121-162646/user-7-status.txt +0 -1
  460. package/botrun-c/stress-test-results/20260121-162646/user-7-timing.txt +0 -1
  461. package/botrun-c/stress-test-results/20260121-162646/user-7.json +0 -2
  462. package/botrun-c/stress-test-results/20260121-162646/user-8-status.txt +0 -1
  463. package/botrun-c/stress-test-results/20260121-162646/user-8-timing.txt +0 -1
  464. package/botrun-c/stress-test-results/20260121-162646/user-8.json +0 -2
  465. package/botrun-c/stress-test-results/20260121-162646/user-9-status.txt +0 -1
  466. package/botrun-c/stress-test-results/20260121-162646/user-9-timing.txt +0 -1
  467. package/botrun-c/stress-test-results/20260121-162646/user-9.json +0 -2
  468. package/botrun-c/stress-test-results/20260121-163148/REPORT.html +0 -344
  469. package/botrun-c/stress-test-results/20260121-163148/REPORT.md +0 -93
  470. package/botrun-c/stress-test-results/20260121-163148/REPORT.pdf +0 -0
  471. package/botrun-c/stress-test-results/20260121-163148/config.json +0 -7
  472. package/botrun-c/stress-test-results/20260121-163148/summary.json +0 -26
  473. package/botrun-c/stress-test-results/20260121-163148/user-1-status.txt +0 -1
  474. package/botrun-c/stress-test-results/20260121-163148/user-1-timing.txt +0 -1
  475. package/botrun-c/stress-test-results/20260121-163148/user-1.json +0 -206
  476. package/botrun-c/stress-test-results/20260121-163148/user-10-status.txt +0 -1
  477. package/botrun-c/stress-test-results/20260121-163148/user-10-timing.txt +0 -1
  478. package/botrun-c/stress-test-results/20260121-163148/user-10.json +0 -110
  479. package/botrun-c/stress-test-results/20260121-163148/user-11-status.txt +0 -1
  480. package/botrun-c/stress-test-results/20260121-163148/user-11-timing.txt +0 -1
  481. package/botrun-c/stress-test-results/20260121-163148/user-11.json +0 -104
  482. package/botrun-c/stress-test-results/20260121-163148/user-12-status.txt +0 -1
  483. package/botrun-c/stress-test-results/20260121-163148/user-12-timing.txt +0 -1
  484. package/botrun-c/stress-test-results/20260121-163148/user-12.json +0 -98
  485. package/botrun-c/stress-test-results/20260121-163148/user-13-status.txt +0 -1
  486. package/botrun-c/stress-test-results/20260121-163148/user-13-timing.txt +0 -1
  487. package/botrun-c/stress-test-results/20260121-163148/user-13.json +0 -68
  488. package/botrun-c/stress-test-results/20260121-163148/user-14-status.txt +0 -1
  489. package/botrun-c/stress-test-results/20260121-163148/user-14-timing.txt +0 -1
  490. package/botrun-c/stress-test-results/20260121-163148/user-14.json +0 -116
  491. package/botrun-c/stress-test-results/20260121-163148/user-15-status.txt +0 -1
  492. package/botrun-c/stress-test-results/20260121-163148/user-15-timing.txt +0 -1
  493. package/botrun-c/stress-test-results/20260121-163148/user-15.json +0 -131
  494. package/botrun-c/stress-test-results/20260121-163148/user-16-status.txt +0 -1
  495. package/botrun-c/stress-test-results/20260121-163148/user-16-timing.txt +0 -1
  496. package/botrun-c/stress-test-results/20260121-163148/user-16.json +0 -110
  497. package/botrun-c/stress-test-results/20260121-163148/user-17-status.txt +0 -1
  498. package/botrun-c/stress-test-results/20260121-163148/user-17-timing.txt +0 -1
  499. package/botrun-c/stress-test-results/20260121-163148/user-17.json +0 -116
  500. package/botrun-c/stress-test-results/20260121-163148/user-2-status.txt +0 -1
  501. package/botrun-c/stress-test-results/20260121-163148/user-2-timing.txt +0 -1
  502. package/botrun-c/stress-test-results/20260121-163148/user-2.json +0 -98
  503. package/botrun-c/stress-test-results/20260121-163148/user-3-status.txt +0 -1
  504. package/botrun-c/stress-test-results/20260121-163148/user-3-timing.txt +0 -1
  505. package/botrun-c/stress-test-results/20260121-163148/user-3.json +0 -62
  506. package/botrun-c/stress-test-results/20260121-163148/user-4-status.txt +0 -1
  507. package/botrun-c/stress-test-results/20260121-163148/user-4-timing.txt +0 -1
  508. package/botrun-c/stress-test-results/20260121-163148/user-4.json +0 -113
  509. package/botrun-c/stress-test-results/20260121-163148/user-5-status.txt +0 -1
  510. package/botrun-c/stress-test-results/20260121-163148/user-5-timing.txt +0 -1
  511. package/botrun-c/stress-test-results/20260121-163148/user-5.json +0 -83
  512. package/botrun-c/stress-test-results/20260121-163148/user-6-status.txt +0 -1
  513. package/botrun-c/stress-test-results/20260121-163148/user-6-timing.txt +0 -1
  514. package/botrun-c/stress-test-results/20260121-163148/user-6.json +0 -125
  515. package/botrun-c/stress-test-results/20260121-163148/user-7-status.txt +0 -1
  516. package/botrun-c/stress-test-results/20260121-163148/user-7-timing.txt +0 -1
  517. package/botrun-c/stress-test-results/20260121-163148/user-7.json +0 -62
  518. package/botrun-c/stress-test-results/20260121-163148/user-8-status.txt +0 -1
  519. package/botrun-c/stress-test-results/20260121-163148/user-8-timing.txt +0 -1
  520. package/botrun-c/stress-test-results/20260121-163148/user-8.json +0 -41
  521. package/botrun-c/stress-test-results/20260121-163148/user-9-status.txt +0 -1
  522. package/botrun-c/stress-test-results/20260121-163148/user-9-timing.txt +0 -1
  523. package/botrun-c/stress-test-results/20260121-163148/user-9.json +0 -53
  524. package/botrun-c/test-merge.md +0 -1
  525. package/botrun-c/version.txt +0 -1
  526. package/botrun-c/web/.version +0 -1
  527. package/botrun-c/web/ALLOW-PUBLIC-ACCESS.md +0 -57
  528. package/botrun-c/web/FINAL-SETUP-STEPS.md +0 -71
  529. package/botrun-c/web/FIREBASE-MANUAL-STEPS.md +0 -41
  530. package/botrun-c/web/QUICK-SETUP-HELPER.md +0 -79
  531. package/botrun-c/web/README.md +0 -162
  532. package/botrun-c/web/__tests__/image-extractor.test.ts +0 -147
  533. package/botrun-c/web/__tests__/useGitHub.test.ts +0 -245
  534. package/botrun-c/web/app/favicon.ico +0 -0
  535. package/botrun-c/web/app/globals.css +0 -215
  536. package/botrun-c/web/app/image-preview/page.tsx +0 -213
  537. package/botrun-c/web/app/layout.tsx +0 -46
  538. package/botrun-c/web/app/page.tsx +0 -45
  539. package/botrun-c/web/components/CapacitorProvider.tsx +0 -43
  540. package/botrun-c/web/components/ChatPage.tsx +0 -1736
  541. package/botrun-c/web/components/ConversationList.tsx +0 -237
  542. package/botrun-c/web/components/ConversationListItem.tsx +0 -121
  543. package/botrun-c/web/components/LoginPage.tsx +0 -212
  544. package/botrun-c/web/components/Providers.tsx +0 -12
  545. package/botrun-c/web/components/StatusBarProvider.tsx +0 -16
  546. package/botrun-c/web/components/attachment-preview.tsx +0 -193
  547. package/botrun-c/web/components/botrun-incubator/BotrunIncubator.tsx +0 -266
  548. package/botrun-c/web/components/botrun-incubator/index.ts +0 -1
  549. package/botrun-c/web/components/chat-input.tsx +0 -1251
  550. package/botrun-c/web/components/chat-message.tsx +0 -598
  551. package/botrun-c/web/components/drop-zone.tsx +0 -143
  552. package/botrun-c/web/components/gdrive/gdrive-add-dialog.tsx +0 -254
  553. package/botrun-c/web/components/gdrive/gdrive-drawer.tsx +0 -236
  554. package/botrun-c/web/components/gdrive/gdrive-selector.tsx +0 -226
  555. package/botrun-c/web/components/gdrive/index.ts +0 -7
  556. package/botrun-c/web/components/generated-image-card.tsx +0 -363
  557. package/botrun-c/web/components/github/GitHubConnect.tsx +0 -366
  558. package/botrun-c/web/components/github/index.ts +0 -2
  559. package/botrun-c/web/components/import-skill-dialog.tsx +0 -208
  560. package/botrun-c/web/components/scroll-to-bottom-button.tsx +0 -90
  561. package/botrun-c/web/components/share-skill-dialog.tsx +0 -175
  562. package/botrun-c/web/components/skills-editor.tsx +0 -443
  563. package/botrun-c/web/components/skills-manager-drawer.tsx +0 -586
  564. package/botrun-c/web/components/smart-button-group.tsx +0 -132
  565. package/botrun-c/web/config/smart-buttons.ts +0 -295
  566. package/botrun-c/web/config/welcome-messages.ts +0 -29
  567. package/botrun-c/web/contexts/AuthContext.tsx +0 -220
  568. package/botrun-c/web/hooks/use-toast.ts +0 -187
  569. package/botrun-c/web/hooks/useAppStoreUpdate.ts +0 -356
  570. package/botrun-c/web/hooks/useAppVersion.ts +0 -113
  571. package/botrun-c/web/hooks/useAttachments.ts +0 -269
  572. package/botrun-c/web/hooks/useAuthToken.ts +0 -59
  573. package/botrun-c/web/hooks/useAutoWelcome.ts +0 -89
  574. package/botrun-c/web/hooks/useCapacitorPlatform.ts +0 -113
  575. package/botrun-c/web/hooks/useCapawesomeLiveUpdate.ts +0 -149
  576. package/botrun-c/web/hooks/useClaudeModel.ts +0 -118
  577. package/botrun-c/web/hooks/useConversation.ts +0 -115
  578. package/botrun-c/web/hooks/useConversations.ts +0 -235
  579. package/botrun-c/web/hooks/useGdriveFolders.ts +0 -199
  580. package/botrun-c/web/hooks/useGdriveSync.ts +0 -107
  581. package/botrun-c/web/hooks/useGitHub.ts +0 -409
  582. package/botrun-c/web/hooks/useScrollToBottom.ts +0 -150
  583. package/botrun-c/web/hooks/useStatusBar.ts +0 -42
  584. package/botrun-c/web/hooks/useUserPlan.ts +0 -153
  585. package/botrun-c/web/lib/api-config.ts +0 -162
  586. package/botrun-c/web/lib/api-url.ts +0 -62
  587. package/botrun-c/web/lib/api.ts +0 -105
  588. package/botrun-c/web/lib/attachment-utils.ts +0 -168
  589. package/botrun-c/web/lib/build-version.ts +0 -11
  590. package/botrun-c/web/lib/clipboard-utils.ts +0 -199
  591. package/botrun-c/web/lib/constants.ts +0 -62
  592. package/botrun-c/web/lib/conversation-storage.ts +0 -324
  593. package/botrun-c/web/lib/firebase-capacitor.ts +0 -135
  594. package/botrun-c/web/lib/firebase.ts +0 -137
  595. package/botrun-c/web/lib/firestore-auth.ts +0 -61
  596. package/botrun-c/web/lib/firestore-auth.ts.migration-bak +0 -319
  597. package/botrun-c/web/lib/image-extractor.ts +0 -156
  598. package/botrun-c/web/lib/path-utils.ts +0 -48
  599. package/botrun-c/web/lib/rehype-del-to-mark.ts +0 -19
  600. package/botrun-c/web/lib/upload-service.ts +0 -326
  601. package/botrun-c/web/lib/utils.ts +0 -6
  602. package/botrun-c/web/next.config.js +0 -49
  603. package/botrun-c/web/package-lock.json +0 -6711
  604. package/botrun-c/web/package.json +0 -63
  605. package/botrun-c/web/postcss.config.js +0 -6
  606. package/botrun-c/web/public/apple_icon.png +0 -0
  607. package/botrun-c/web/public/google_icon.png +0 -0
  608. package/botrun-c/web/public/logo-48-small.png +0 -0
  609. package/botrun-c/web/public/logo-48.png +0 -0
  610. package/botrun-c/web/scripts/generate-version.js +0 -36
  611. package/botrun-c/web/scripts/update-build-version.js +0 -41
  612. package/botrun-c/web/tailwind.config.ts +0 -80
  613. package/botrun-c/web/test-welcome-message.mjs +0 -115
  614. package/botrun-c/web/tsconfig.json +0 -42
  615. package/botrun-c/web/types/agent.ts +0 -6
  616. package/botrun-c/web/types/attachment.ts +0 -39
  617. package/botrun-c/web/types/conversation.ts +0 -68
  618. package/botrun-c/web/types/flutter.d.ts +0 -6
  619. package/botrun-c/web/types/project.ts +0 -41
  620. package/botrun-c/web/types/skills.ts +0 -13
  621. package/botrun-c/web//350/250/272/346/226/267-Skills-/345/211/215/347/253/257/351/241/257/347/244/272/345/225/217/351/241/214.md +0 -83
  622. package/lib/writing/index.mjs +0 -5
  623. /package/{lib/core → modules/_core}/adapters/base.mjs +0 -0
  624. /package/{lib/core → modules/_core}/adapters/claude.mjs +0 -0
  625. /package/{lib/core → modules/_core}/adapters/gemini-api.mjs +0 -0
  626. /package/{lib/core → modules/_core}/adapters/gemini-shared.mjs +0 -0
  627. /package/{lib/core → modules/_core}/adapters/gemini-vertex.mjs +0 -0
  628. /package/{lib/core → modules/_core}/adapters/local.mjs +0 -0
  629. /package/{lib/core → modules/_core}/adapters/nchc.mjs +0 -0
  630. /package/{lib/core → modules/_core}/adapters/openai-shared.mjs +0 -0
  631. /package/{lib/core → modules/_core}/adapters/openrouter.mjs +0 -0
  632. /package/{lib/core → modules/_core}/ai-cache.mjs +0 -0
  633. /package/{lib/core → modules/_core}/ai-router.mjs +0 -0
  634. /package/{lib/core → modules/_core}/cli-utils.mjs +0 -0
  635. /package/{lib/core → modules/_core}/dag.mjs +0 -0
  636. /package/{lib/core → modules/_core}/db.mjs +0 -0
  637. /package/{lib/core → modules/_core}/env.mjs +0 -0
  638. /package/{lib/flows → modules/_core}/hatch-portal.mjs +0 -0
  639. /package/{lib/core → modules/_core}/llm.mjs +0 -0
  640. /package/{lib/flows → modules/_core}/opencode-agent.mjs +0 -0
  641. /package/{lib/core → modules/_core}/paths.mjs +0 -0
  642. /package/{lib/core → modules/_core}/proxy.mjs +0 -0
  643. /package/{lib/flows → modules/_core}/review-doc.mjs +0 -0
  644. /package/{lib → modules/_core}/tools/fs-tools.mjs +0 -0
  645. /package/{lib → modules/_core}/tools/index.mjs +0 -0
  646. /package/{lib/core → modules/_core}/watermelon.mjs +0 -0
  647. /package/{lib/ocr/index.mjs → modules/ocr/ocr-lib.mjs} +0 -0
  648. /package/{lib → modules}/portal/hatch.mjs +0 -0
  649. /package/{lib/portal/index.mjs → modules/portal/portal-lib.mjs} +0 -0
  650. /package/{lib → modules}/search/crawler.mjs +0 -0
  651. /package/{lib/prompt → modules/skill}/prompts/zero-framework/coding.md +0 -0
  652. /package/{lib/prompt → modules/skill}/prompts/zero-framework/fullstack.md +0 -0
  653. /package/{lib/prompt → modules/skill}/prompts/zero-framework/gemini-search-cli.md +0 -0
  654. /package/{lib/prompt → modules/skill}/prompts/zero-framework/search.md +0 -0
  655. /package/{lib/prompt → modules/skill}/prompts/zero-framework/segment.md +0 -0
  656. /package/{lib/prompt → modules/skill}/prompts/zero-framework/slice.md +0 -0
  657. /package/{lib/prompt → modules/skill}/prompts/zero-framework/smart-cache.md +0 -0
  658. /package/{lib/prompt → modules/skill}/prompts/zero-framework/trigram-search.md +0 -0
  659. /package/{lib/prompt → modules/skill}/prompts/zero-framework/tts-format.md +0 -0
  660. /package/{lib/prompt → modules/skill}/prompts/zero-framework/watermelon-sqlite.md +0 -0
  661. /package/{lib → modules}/writing/generators/nstc-generators.mjs +0 -0
  662. /package/{lib → modules}/writing/generators/nstc-top5.mjs +0 -0
  663. /package/{lib → modules}/writing/layouts/nstc-layout.mjs +0 -0
  664. /package/{lib → modules}/writing/renderer.mjs +0 -0
package/bin/bh.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  // bin/bh.mjs — botrun-horse CLI 總入口(路由分派)
3
- // 多專案架構:lib 放腦、projects 放料、bin/commands/ 放各指令群組
3
+ // 所有指令模組由 modules/*/index.mjs 自動註冊
4
4
  //
5
5
  // 用法:
6
6
  // node bin/bh.mjs <指令群組> [子指令] [選項]
@@ -8,11 +8,19 @@
8
8
  //
9
9
  // 所有指令皆支援 --project=<名稱>、--format=json、stdin pipe、--quiet、--print0
10
10
 
11
- import { setupHttpProxy } from '../lib/core/proxy.mjs';
11
+ import path from 'path';
12
+ import { loadEnv } from '../modules/_core/env.mjs';
13
+ loadEnv(); // 載入專案根目錄 .env
14
+ loadEnv(path.join(process.cwd(), '.env'), { override: false }); // 載入使用者 cwd/.env(npx 情境)
15
+
16
+ import { setupHttpProxy } from '../modules/_core/proxy.mjs';
12
17
  setupHttpProxy(); // 必須在所有 fetch 呼叫之前執行(含 @google/genai、Anthropic SDK)
13
18
 
14
- import { parseArgs, VERSION } from '../lib/core/cli-utils.mjs';
15
- import { COMMANDS } from './commands/schema.mjs';
19
+ import { parseArgs, VERSION } from '../modules/_core/cli-utils.mjs';
20
+ import { discoverModules, collectSchemas } from '../modules/discover.mjs';
21
+
22
+ const _modules = await discoverModules();
23
+ const COMMANDS = collectSchemas(_modules);
16
24
 
17
25
  const { command, subcommand, flags, positionals } = parseArgs(process.argv);
18
26
 
@@ -21,178 +29,42 @@ if (flags.version || command === '--version' || command === '-V') {
21
29
  process.stdout.write(`${VERSION}\n`); process.exit(0);
22
30
  }
23
31
 
24
- // ===== Help 快速路由 =====
25
- if (flags.help && !command) {
32
+ // ===== Help =====
33
+ if (!command || command === 'help' || command === '--help' || command === '-h') {
26
34
  const { showHelp } = await import('./commands/help.mjs');
27
- showHelp(flags); process.exit(0);
35
+ showHelp(flags, COMMANDS); process.exit(0);
28
36
  }
29
- if (flags.help && command) {
37
+ if (flags.help) {
30
38
  const { showCommandHelp } = await import('./commands/help.mjs');
31
- showCommandHelp(command); process.exit(0);
39
+ showCommandHelp(command, COMMANDS); process.exit(0);
32
40
  }
33
41
 
34
- // ===== 指令路由 =====
35
- switch (command) {
36
- case 'doc': {
37
- const { cmdDocSplit, cmdDocText, cmdDocIngest } = await import('./commands/doc.mjs');
38
- switch (subcommand) {
39
- case 'split': await cmdDocSplit(positionals, flags); break;
40
- case 'text': await cmdDocText(positionals, flags); break;
41
- case 'ingest': await cmdDocIngest(positionals, flags); break;
42
- default: {
43
- const { showCommandHelp } = await import('./commands/help.mjs');
44
- if (!subcommand) showCommandHelp('doc');
45
- else { process.stderr.write(`doc: 未知子指令 ${subcommand}\n`); process.exit(1); }
46
- }
47
- }
48
- break;
49
- }
50
-
51
- case 'writing': {
52
- const { cmdWritingGenerate } = await import('./commands/writing.mjs');
53
- switch (subcommand) {
54
- case 'generate': await cmdWritingGenerate(flags); break;
55
- default: {
56
- const { showCommandHelp } = await import('./commands/help.mjs');
57
- if (!subcommand) showCommandHelp('writing');
58
- else { process.stderr.write(`writing: 未知子指令 ${subcommand}\n`); process.exit(1); }
59
- }
60
- }
61
- break;
62
- }
63
-
64
- case 'gemini': {
65
- const { cmdGeminiAsk } = await import('./commands/gemini.mjs');
66
- switch (subcommand) {
67
- case 'ask': await cmdGeminiAsk(positionals, flags); break;
68
- default: {
69
- const { showCommandHelp } = await import('./commands/help.mjs');
70
- if (!subcommand) showCommandHelp('gemini');
71
- else { process.stderr.write(`gemini: 未知子指令 ${subcommand}\n`); process.exit(1); }
72
- }
73
- }
74
- break;
75
- }
76
-
77
- case 'nchc': {
78
- const { cmdNchcAsk, cmdNchcAgent, cmdNchcCode, cmdNchcModels } = await import('./commands/nchc.mjs');
79
- switch (subcommand) {
80
- case 'ask': await cmdNchcAsk(positionals, flags); break;
81
- case 'agent': await cmdNchcAgent(positionals, flags); break;
82
- case 'code': await cmdNchcCode(positionals, flags); break;
83
- case 'models': cmdNchcModels(flags); break;
84
- default: {
85
- const { showCommandHelp } = await import('./commands/help.mjs');
86
- if (!subcommand) showCommandHelp('nchc');
87
- else { process.stderr.write(`nchc: 未知子指令 ${subcommand}\n`); process.exit(1); }
88
- }
89
- }
90
- break;
91
- }
92
-
93
- case 'openrouter': {
94
- const { cmdOpenrouterAsk, cmdOpenrouterModels } = await import('./commands/openrouter.mjs');
95
- switch (subcommand) {
96
- case 'ask': await cmdOpenrouterAsk(positionals, flags); break;
97
- case 'models': cmdOpenrouterModels(flags); break;
98
- default: {
99
- const { showCommandHelp } = await import('./commands/help.mjs');
100
- if (!subcommand) showCommandHelp('openrouter');
101
- else { process.stderr.write(`openrouter: 未知子指令 ${subcommand}\n`); process.exit(1); }
102
- }
42
+ // ===== commands schema =====
43
+ if (command === 'commands') {
44
+ const format = flags.format || 'json';
45
+ if (format === 'json') {
46
+ process.stdout.write(JSON.stringify({
47
+ _meta: { tool: 'bh', version: VERSION, description: 'botrun-horse 多專案文件處理系統' },
48
+ commands: COMMANDS,
49
+ }, null, 2) + '\n');
50
+ } else {
51
+ process.stdout.write(`botrun-horse v${VERSION} 可用指令:\n\n`);
52
+ for (const [name, cmd] of Object.entries(COMMANDS)) {
53
+ const sqlite = cmd.requires_sqlite ? ' [需 --experimental-sqlite]' : '';
54
+ process.stdout.write(` ${name.padEnd(12)} ${cmd.description}${sqlite}\n`);
103
55
  }
104
- break;
105
- }
106
-
107
- case 'legal': {
108
- const { cmdLegalAsk, cmdLegalCacheList, cmdLegalCacheStats } = await import('./commands/legal.mjs');
109
- switch (subcommand) {
110
- case 'ask': await cmdLegalAsk(positionals, flags); break;
111
- case 'cache': {
112
- // legal cache {list|stats}
113
- const cacheSubcmd = positionals[0];
114
- switch (cacheSubcmd) {
115
- case 'list': await cmdLegalCacheList(flags); break;
116
- case 'stats': await cmdLegalCacheStats(flags); break;
117
- default: {
118
- process.stderr.write(`legal cache: 未知子指令 ${cacheSubcmd}(可用: list, stats)\n`);
119
- process.exit(1);
120
- }
121
- }
122
- break;
123
- }
124
- default: {
125
- const { showCommandHelp } = await import('./commands/help.mjs');
126
- if (!subcommand) showCommandHelp('legal');
127
- else { process.stderr.write(`legal: 未知子指令 ${subcommand}\n`); process.exit(1); }
128
- }
129
- }
130
- break;
131
- }
132
-
133
- case 'dag': {
134
- const { cmdDag } = await import('./commands/dag-cmd.mjs');
135
- await cmdDag(subcommand, flags);
136
- break;
137
- }
138
-
139
- case 'search': {
140
- const { cmdSearch } = await import('./commands/search.mjs');
141
- await cmdSearch(subcommand, positionals, flags);
142
- break;
143
- }
144
-
145
- case 'db': {
146
- const { cmdDb } = await import('./commands/db-cmd.mjs');
147
- await cmdDb(subcommand, flags);
148
- break;
149
- }
150
-
151
- case 'commands': {
152
- const format = flags.format || 'json';
153
- if (format === 'json') {
154
- process.stdout.write(JSON.stringify({
155
- _meta: { tool: 'bh', version: VERSION, description: 'botrun-horse 多專案文件處理系統' },
156
- commands: COMMANDS,
157
- }, null, 2) + '\n');
158
- } else {
159
- process.stdout.write(`botrun-horse v${VERSION} — 可用指令:\n\n`);
160
- for (const [name, cmd] of Object.entries(COMMANDS)) {
161
- const sqlite = cmd.requires_sqlite ? ' [需 --experimental-sqlite]' : '';
162
- process.stdout.write(` ${name.padEnd(12)} ${cmd.description}${sqlite}\n`);
163
- }
164
- process.stdout.write(`\n各指令皆支援 --help、--format=json、--project=<名稱>、--quiet、--print0\n`);
165
- }
166
- break;
167
- }
168
-
169
- case 'skill': {
170
- const { cmdSkill } = await import('./commands/skill.mjs');
171
- await cmdSkill(subcommand, positionals, flags);
172
- break;
173
- }
174
-
175
- case 'portal':
176
- process.stdout.write('portal 模組尚在開發中\n');
177
- break;
178
-
179
- case 'ocr':
180
- process.stdout.write('ocr 模組尚在開發中\n');
181
- break;
182
-
183
- case 'help':
184
- case '--help':
185
- case '-h':
186
- case undefined: {
187
- const { showHelp } = await import('./commands/help.mjs');
188
- showHelp(flags);
189
- break;
56
+ process.stdout.write(`\n各指令皆支援 --help、--format=json、--project=<名稱>、--quiet、--print0\n`);
190
57
  }
58
+ process.exit(0);
59
+ }
191
60
 
192
- default: {
193
- process.stderr.write(`未知指令: ${command}\n`);
194
- const { showHelp } = await import('./commands/help.mjs');
195
- showHelp();
196
- process.exit(1);
197
- }
61
+ // ===== 模組自動路由 =====
62
+ const mod = _modules.get(command);
63
+ if (mod) {
64
+ await mod.handler(subcommand, positionals, flags);
65
+ } else {
66
+ process.stderr.write(`未知指令: ${command}\n`);
67
+ const { showHelp } = await import('./commands/help.mjs');
68
+ showHelp(flags, COMMANDS);
69
+ process.exit(1);
198
70
  }
@@ -1,8 +1,7 @@
1
1
  // bin/commands/help.mjs — 說明輸出(showHelp / showCommandHelp)
2
- import { parseArgs, VERSION } from '../../lib/core/cli-utils.mjs';
3
- import { COMMANDS } from './schema.mjs';
2
+ import { parseArgs, VERSION } from '../../modules/_core/cli-utils.mjs';
4
3
 
5
- export function showCommandHelp(cmdName) {
4
+ export function showCommandHelp(cmdName, COMMANDS = {}) {
6
5
  const cmd = COMMANDS[cmdName];
7
6
  if (!cmd) return;
8
7
 
@@ -20,7 +19,7 @@ export function showCommandHelp(cmdName) {
20
19
  lines.push('');
21
20
  }
22
21
  lines.push('用法:');
23
- const prefix = cmd.requires_sqlite ? 'node --experimental-sqlite bin/bh.mjs' : 'node bin/bh.mjs';
22
+ const prefix = cmd.requires_sqlite ? 'node --experimental-sqlite bin/bh.mjs' : 'bh';
24
23
  if (cmd.subcommands) {
25
24
  lines.push(` ${prefix} ${cmd.name} <子指令> [選項]`);
26
25
  lines.push('');
@@ -46,7 +45,7 @@ export function showCommandHelp(cmdName) {
46
45
  process.stdout.write(lines.join('\n') + '\n');
47
46
  }
48
47
 
49
- export function showHelp(flags = {}) {
48
+ export function showHelp(flags = {}, COMMANDS = {}) {
50
49
  if (flags.format === 'json') {
51
50
  process.stdout.write(JSON.stringify({
52
51
  _meta: { tool: 'bh', version: VERSION, description: 'botrun-horse 多專案文件處理系統' },
@@ -63,26 +62,27 @@ export function showHelp(flags = {}) {
63
62
  return;
64
63
  }
65
64
 
65
+ // 從 COMMANDS 動態產生指令列表
66
+ const cmdLines = [];
67
+ for (const [name, cmd] of Object.entries(COMMANDS)) {
68
+ const sqlite = cmd.requires_sqlite ? ' [需 --experimental-sqlite]' : '';
69
+ const subs = cmd.subcommands
70
+ ? Object.keys(cmd.subcommands).filter(s => !s.startsWith('(') && !s.startsWith('<')).join('|')
71
+ : '';
72
+ const suffix = subs ? ` (${subs})` : '';
73
+ cmdLines.push(` ${name.padEnd(20)} ${cmd.description}${suffix}${sqlite}`);
74
+ }
75
+
66
76
  process.stdout.write(`
67
77
  botrun-horse — 多專案文件處理系統 CLI v${VERSION}
68
78
  ===================================================
69
79
 
70
80
  用法:
71
- node bin/bh.mjs <指令群組> [子指令] [選項]
72
- node --experimental-sqlite bin/bh.mjs <指令> (SQLite 相關功能)
81
+ bh <指令群組> [子指令] [選項]
82
+ npx -y botrun-horse <指令群組> [子指令] [選項]
73
83
 
74
84
  指令群組:
75
- doc <子指令> 文件處理 (split|text|ingest)
76
- writing <子指令> 公文撰寫 (generate)
77
- gemini <子指令> Gemini AI 提問 (ask) — thinking + grounding + url context
78
- nchc <子指令> 國網 GenAI 提問 (ask|agent|code|models) — Mistral 系列
79
- dag <子指令> DAG 依賴追蹤 (init|status|ready|list)
80
- search <子指令> 全文檢索 (query) [需 --experimental-sqlite]
81
- db <子指令> 資料庫管理 (stats|docs|pages) [需 --experimental-sqlite]
82
- skill [關鍵字] 技能管理(無參數=全列出,帶關鍵字=模糊搜尋)
83
- portal <子指令> 智慧入口 (預留)
84
- ocr <子指令> OCR 辨識 (預留)
85
- commands 所有指令的結構化 JSON schema
85
+ ${cmdLines.join('\n')}
86
86
 
87
87
  共通選項:
88
88
  --help 顯示說明
@@ -92,18 +92,18 @@ botrun-horse — 多專案文件處理系統 CLI v${VERSION}
92
92
  --quiet 靜默模式(不輸出進度到 stderr,GNU parallel 友善)
93
93
  --print0 NUL 分隔路徑輸出(與 xargs -0 相容)
94
94
 
95
- 組合範例:
96
- # GNU parallel 批次處理
97
- find . -name "*.pdf" -print0 | xargs -0 -P 8 node bin/bh.mjs doc text --quiet
98
-
99
- # 文件處理(PDF + Office 全系列)
100
- node --experimental-sqlite bin/bh.mjs doc ingest --dir=pdfs/ --project=nstc
101
-
102
- # Gemini AI 提問
103
- node bin/bh.mjs gemini ask "量子糾纏的原理是什麼?"
104
- echo "解釋 AI" | node bin/bh.mjs gemini ask --format=json
95
+ 快速開始 — AI 繪圖:
96
+ 1. 設定環境變數: export GEMINI_API_KEY=你的金鑰
97
+ (到 https://aistudio.google.com/apikey 申請)
98
+ 2. 生圖: bh imagen generate "一隻貓坐在月亮上"
99
+ 3. 進階: bh imagen generate "科幻城市" --size=2K --aspect=16:9
105
100
 
106
- # AI/LLM schema 探索
107
- node bin/bh.mjs commands --format=json | jq 'keys'
101
+ 更多範例:
102
+ bh imagen generate "logo 設計" --output=logo.png
103
+ echo "水彩風格的台北101" | bh imagen generate
104
+ bh imagen edit photo.png "把背景換成日落海灘"
105
+ bh imagen serve --port=3000
106
+ bh gemini ask "量子糾纏的原理是什麼?"
107
+ bh commands --format=json | jq 'keys'
108
108
  `);
109
109
  }
@@ -1,7 +1,7 @@
1
1
  // lib/flows/draft-writing.mjs — 公文撰寫業務流程
2
2
  // 串接:config → DAG → writing/generate → 更新狀態
3
3
 
4
- import { loadDag, initState, saveState, loadState } from '../core/dag.mjs';
4
+ import { loadDag, initState, saveState, loadState } from './dag.mjs';
5
5
  import { generateAll } from '../writing/generate.mjs';
6
6
 
7
7
  /**
@@ -2,7 +2,7 @@
2
2
  // 職責: 組裝 adapter + 格式化輸出 + 效能測量
3
3
  // 原則: KISS — 流程越簡單越好,複雜邏輯在 adapter
4
4
 
5
- import { createLLM } from '../core/llm.mjs';
5
+ import { createLLM } from './llm.mjs';
6
6
 
7
7
  /**
8
8
  * 取得臺灣當前時間字串,自動注入 system prompt
@@ -15,10 +15,10 @@
15
15
  // { question, fromCache, cacheId, tags, step1Laws, step2Answer, sources,
16
16
  // model, routerDecision, perf }
17
17
 
18
- import { createLLM } from '../core/llm.mjs';
19
- import { AiCache } from '../core/ai-cache.mjs';
20
- import { AiRouter } from '../core/ai-router.mjs';
21
- import { dbPath as resolveDbPath } from '../core/paths.mjs';
18
+ import { createLLM } from './llm.mjs';
19
+ import { AiCache } from './ai-cache.mjs';
20
+ import { AiRouter } from './ai-router.mjs';
21
+ import { dbPath as resolveDbPath } from './paths.mjs';
22
22
 
23
23
  // ── 合併提示詞(單次 request 完成搜尋 + 分析) ─────────────────────────────
24
24
 
@@ -43,7 +43,7 @@ export {
43
43
  CODING_SYSTEM_PROMPT,
44
44
  executeTool,
45
45
  executeCodeTool,
46
- } from '../tools/fs-tools.mjs';
46
+ } from './tools/fs-tools.mjs';
47
47
 
48
48
  import {
49
49
  BUILT_IN_TOOLS,
@@ -52,7 +52,7 @@ import {
52
52
  CODING_SYSTEM_PROMPT,
53
53
  executeTool,
54
54
  executeCodeTool,
55
- } from '../tools/fs-tools.mjs';
55
+ } from './tools/fs-tools.mjs';
56
56
 
57
57
  // ══════════════════════════════════════════════════════════════════════════
58
58
  // NchcAgent — 通用代理(唯讀工具)
@@ -2,7 +2,7 @@
2
2
  // 職責: 組裝 adapter + 格式化輸出
3
3
  // 原則: KISS — 流程越簡單越好,複雜邏輯在 adapter
4
4
 
5
- import { createLLM } from '../core/llm.mjs';
5
+ import { createLLM } from './llm.mjs';
6
6
 
7
7
  /**
8
8
  * 執行 OpenRouter 提問流程(非串流)
@@ -1,5 +1,5 @@
1
1
  // bin/commands/dag-cmd.mjs — dag 指令群組(init / status / ready / list)
2
- import { timer, jsonOut, emitError } from '../../lib/core/cli-utils.mjs';
2
+ import { timer, jsonOut, emitError } from '../_core/cli-utils.mjs';
3
3
 
4
4
  export async function cmdDag(subcommand, flags) {
5
5
  if (!subcommand) {
@@ -9,7 +9,7 @@ export async function cmdDag(subcommand, flags) {
9
9
  const {
10
10
  loadDag, loadState, saveState, initState,
11
11
  getReady, formatStatus,
12
- } = await import('../../lib/core/dag.mjs');
12
+ } = await import('../_core/dag.mjs');
13
13
  const format = flags.format || 'text';
14
14
  const project = flags.project || 'nstc';
15
15
 
@@ -0,0 +1,30 @@
1
+ // modules/dag/index.mjs — DAG 依賴追蹤模組自動註冊介面
2
+ // Convention: 每個 modules/<name>/index.mjs 都 export { name, schema, handler }
3
+
4
+ export const name = 'dag';
5
+
6
+ export const schema = {
7
+ name: 'dag',
8
+ description: 'DAG 依賴追蹤管理',
9
+ requires_sqlite: false,
10
+ subcommands: {
11
+ init: '初始化 DAG 狀態',
12
+ status: '顯示整體 DAG 進度摘要',
13
+ ready: '列出目前可執行的任務',
14
+ list: '列出所有任務及其狀態',
15
+ },
16
+ options: {
17
+ '--project=<名稱>': { type: 'string', default: 'nstc', description: '專案名稱' },
18
+ '--format=json|text': { type: 'string', default: 'text', description: '輸出格式' },
19
+ },
20
+ examples: [
21
+ 'bh dag init --project=nstc',
22
+ 'bh dag status --project=nstc',
23
+ 'bh dag ready --format=json --project=nstc',
24
+ ],
25
+ };
26
+
27
+ export async function handler(subcommand, positionals, flags) {
28
+ const { cmdDag } = await import('./command.mjs');
29
+ await cmdDag(subcommand, flags);
30
+ }
@@ -1,13 +1,13 @@
1
1
  // bin/commands/db-cmd.mjs — db 指令群組(stats / docs / pages)
2
- import * as paths from '../../lib/core/paths.mjs';
3
- import { timer, jsonOut, emitError } from '../../lib/core/cli-utils.mjs';
2
+ import * as paths from '../_core/paths.mjs';
3
+ import { timer, jsonOut, emitError } from '../_core/cli-utils.mjs';
4
4
 
5
5
  export async function cmdDb(subcommand, flags) {
6
6
  if (!subcommand) {
7
7
  const { showCommandHelp } = await import('./help.mjs');
8
8
  showCommandHelp('db'); return;
9
9
  }
10
- const { DocStore } = await import('../../lib/core/db.mjs');
10
+ const { DocStore } = await import('../_core/db.mjs');
11
11
  const project = flags.project || 'nstc';
12
12
  const dbPathVal = flags.db || paths.dbPath(project);
13
13
  const format = flags.format || 'text';
@@ -0,0 +1,26 @@
1
+ // modules/db/index.mjs — SQLite 資料庫管理模組自動註冊介面
2
+ // Convention: 每個 modules/<name>/index.mjs 都 export { name, schema, handler }
3
+
4
+ export const name = 'db';
5
+
6
+ export const schema = {
7
+ name: 'db',
8
+ description: 'SQLite 資料庫管理',
9
+ requires_sqlite: true,
10
+ subcommands: {
11
+ stats: '顯示 DB 統計',
12
+ docs: '列出所有文件 metadata',
13
+ 'pages <doc_id>': '列出指定文件的所有頁面',
14
+ },
15
+ options: {
16
+ '--project=<名稱>': { type: 'string', default: 'nstc', description: '專案名稱' },
17
+ '--db=<DB路徑>': { type: 'string', description: 'SQLite 路徑' },
18
+ '--format=json|text': { type: 'string', default: 'text', description: '輸出格式' },
19
+ },
20
+ examples: ['bh db stats --project=nstc', 'bh db docs --format=json --project=nstc'],
21
+ };
22
+
23
+ export async function handler(subcommand, positionals, flags) {
24
+ const { cmdDb } = await import('./command.mjs');
25
+ await cmdDb(subcommand, flags);
26
+ }
@@ -0,0 +1,43 @@
1
+ // modules/discover.mjs — 自動掃描 modules/*/index.mjs,回傳模組註冊表
2
+ // Convention over Configuration:放了 index.mjs 就自動生效
3
+
4
+ import fs from 'fs';
5
+ import path from 'path';
6
+ import { fileURLToPath } from 'url';
7
+
8
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
9
+
10
+ /**
11
+ * 掃描 modules/ 下所有子目錄的 index.mjs,載入模組定義
12
+ * @returns {Promise<Map<string, { name, schema, handler }>>}
13
+ */
14
+ export async function discoverModules() {
15
+ const modules = new Map();
16
+ const entries = fs.readdirSync(__dirname, { withFileTypes: true });
17
+
18
+ for (const entry of entries) {
19
+ if (!entry.isDirectory() || entry.name.startsWith('_')) continue;
20
+ const indexPath = path.join(__dirname, entry.name, 'index.mjs');
21
+ if (!fs.existsSync(indexPath)) continue;
22
+
23
+ const mod = await import(indexPath);
24
+ if (mod.name && mod.handler) {
25
+ modules.set(mod.name, mod);
26
+ }
27
+ }
28
+
29
+ return modules;
30
+ }
31
+
32
+ /**
33
+ * 收集所有模組的 schema,回傳 { [name]: schema } 物件
34
+ * @param {Map} modules - discoverModules() 的結果
35
+ * @returns {object}
36
+ */
37
+ export function collectSchemas(modules) {
38
+ const schemas = {};
39
+ for (const [name, mod] of modules) {
40
+ if (mod.schema) schemas[name] = mod.schema;
41
+ }
42
+ return schemas;
43
+ }
@@ -1,15 +1,15 @@
1
1
  // bin/commands/doc.mjs — doc 指令群組(split / text / ingest)
2
2
  import path from 'path';
3
- import * as paths from '../../lib/core/paths.mjs';
3
+ import * as paths from '../_core/paths.mjs';
4
4
  import {
5
5
  resolveFiles, parallelBatch, timer, jsonOut, emitError,
6
- } from '../../lib/core/cli-utils.mjs';
6
+ } from '../_core/cli-utils.mjs';
7
7
 
8
8
  export async function cmdDocSplit(positionals, flags) {
9
9
  const elapsed = timer();
10
10
  const format = flags.format || 'text';
11
11
  const project = flags.project || 'nstc';
12
- const { splitPdf } = await import('../../lib/doc/split.mjs');
12
+ const { splitPdf } = await import('./split.mjs');
13
13
  const outdir = flags.outdir || path.join(paths.projectOutput(project), 'split');
14
14
  const concurrency = parseInt(flags.concurrency) || 5;
15
15
  const files = await resolveFiles(positionals, flags);
@@ -61,7 +61,7 @@ export async function cmdDocSplit(positionals, flags) {
61
61
  export async function cmdDocText(positionals, flags) {
62
62
  const elapsed = timer();
63
63
  const format = flags.format || 'text';
64
- const { extractAllPages, extractPage } = await import('../../lib/doc/pdf2text.mjs');
64
+ const { extractAllPages, extractPage } = await import('./pdf2text.mjs');
65
65
  const files = await resolveFiles(positionals, flags);
66
66
  const pageNum = flags.page ? parseInt(flags.page) : null;
67
67
  const concurrency = parseInt(flags.concurrency) || 5;
@@ -115,7 +115,7 @@ export async function cmdDocIngest(positionals, flags) {
115
115
  const elapsed = timer();
116
116
  const format = flags.format || 'text';
117
117
  const project = flags.project || 'nstc';
118
- const { ingestOne, ingestDir, ingestBatch } = await import('../../lib/doc/index.mjs');
118
+ const { ingestOne, ingestDir, ingestBatch } = await import('./ingest.mjs');
119
119
  const dbPathVal = flags.db || paths.dbPath(project);
120
120
  const concurrency = parseInt(flags.concurrency) || 5;
121
121
  const recursive = !!flags.recursive;
@@ -0,0 +1,55 @@
1
+ // modules/doc/index.mjs — 文件處理模組自動註冊介面
2
+ // Convention: 每個 modules/<name>/index.mjs 都 export { name, schema, handler }
3
+
4
+ export const name = 'doc';
5
+
6
+ export const schema = {
7
+ name: 'doc',
8
+ description: '文件處理(拆頁、轉文字、入庫)— 支援 PDF 與 Office 全系列',
9
+ requires_sqlite: false,
10
+ subcommands: {
11
+ split: '通用 PDF 拆頁(每頁輸出為獨立 PDF)',
12
+ text: 'PDF 轉純文字(保留頁碼與排版,不需先拆頁)',
13
+ ingest: 'PDF/Office 入庫流水線(轉文字 → SQLite FTS5)[需 --experimental-sqlite]',
14
+ },
15
+ options: {
16
+ '--project=<名稱>': { type: 'string', default: 'nstc', description: '專案名稱' },
17
+ '--dir=<路徑>': { type: 'string', description: '掃描單一目錄內所有文件' },
18
+ '--dirs=<路徑1,路徑2>': { type: 'string', description: '掃描多個目錄(逗號分隔)' },
19
+ '--outdir=<路徑>': { type: 'string', description: '拆頁輸出目錄(split 指令用)' },
20
+ '--split-pdf': { type: 'boolean', default: false, description: '[ingest] 同時拆頁成獨立 PDF' },
21
+ '--recursive': { type: 'boolean', default: false, description: '遞迴掃描子目錄' },
22
+ '--force': { type: 'boolean', default: false, description: '強制重新入庫(忽略斷點續作紀錄)' },
23
+ '--concurrency=N': { type: 'integer', default: 5, description: '平行處理數' },
24
+ '--quiet': { type: 'boolean', default: false, description: '靜默模式(不輸出進度到 stderr,GNU parallel 友善)' },
25
+ '--print0': { type: 'boolean', default: false, description: 'NUL 分隔路徑輸出(與 xargs -0 相容)' },
26
+ '--format=json|text': { type: 'string', default: 'text', description: '輸出格式' },
27
+ },
28
+ examples: [
29
+ 'bh doc split file1.pdf file2.pdf --project=nstc',
30
+ 'bh doc text --dir=projects/nstc/output/pdfs',
31
+ 'node --experimental-sqlite bin/bh.mjs doc ingest --dir=projects/nstc/pdfs --project=nstc',
32
+ 'node --experimental-sqlite bin/bh.mjs doc ingest --dirs=pdfs/,docs/ --project=nstc --recursive',
33
+ 'node --experimental-sqlite bin/bh.mjs doc ingest file.docx report.xlsx --project=nstc',
34
+ 'node --experimental-sqlite bin/bh.mjs doc ingest --dir=pdfs/ --force --split-pdf --project=nstc',
35
+ 'ls pdfs/*.pdf | node --experimental-sqlite bin/bh.mjs doc ingest --project=nstc',
36
+ 'find . -name "*.pdf" -print0 | xargs -0 -P 4 node bin/bh.mjs doc text --quiet',
37
+ ],
38
+ };
39
+
40
+ export async function handler(subcommand, positionals, flags) {
41
+ const { cmdDocSplit, cmdDocText, cmdDocIngest } = await import('./command.mjs');
42
+ switch (subcommand) {
43
+ case 'split': await cmdDocSplit(positionals, flags); break;
44
+ case 'text': await cmdDocText(positionals, flags); break;
45
+ case 'ingest': await cmdDocIngest(positionals, flags); break;
46
+ default:
47
+ if (!subcommand) {
48
+ const { showCommandHelp } = await import('../../bin/commands/help.mjs');
49
+ showCommandHelp('doc', { doc: schema });
50
+ } else {
51
+ process.stderr.write(`doc: 未知子指令 ${subcommand}\n`);
52
+ process.exit(1);
53
+ }
54
+ }
55
+ }
@@ -21,7 +21,7 @@ import path from 'path';
21
21
  import { splitPdf, getPdfPageCount } from './split.mjs';
22
22
  import { extractAllPages } from './pdf2text.mjs';
23
23
  import { extractOfficePages, extractTextFilePages, isOfficeFile, isTextFile } from './office2text.mjs';
24
- import { DocStore } from '../core/db.mjs';
24
+ import { DocStore } from '../_core/db.mjs';
25
25
 
26
26
  // ─────────────────────────────────────────────────────────
27
27
  // 核心入庫函式
@@ -24,7 +24,7 @@ import { promisify } from 'node:util';
24
24
  import { mkdtemp, rm, readdir, readFile } from 'node:fs/promises';
25
25
  import os from 'node:os';
26
26
  import path from 'node:path';
27
- import { toolBin } from '../core/paths.mjs';
27
+ import { toolBin } from '../_core/paths.mjs';
28
28
 
29
29
  const execFileAsync = promisify(execFile);
30
30