helixlife-expert-cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (523) hide show
  1. package/README.md +159 -0
  2. package/cli/bin/helixlife-expert.js +3 -0
  3. package/cli/dist/core/api/client.d.ts +31 -0
  4. package/cli/dist/core/api/client.d.ts.map +1 -0
  5. package/cli/dist/core/api/client.js +183 -0
  6. package/cli/dist/core/api/client.js.map +1 -0
  7. package/cli/dist/core/api/http.d.ts +3 -0
  8. package/cli/dist/core/api/http.d.ts.map +1 -0
  9. package/cli/dist/core/api/http.js +22 -0
  10. package/cli/dist/core/api/http.js.map +1 -0
  11. package/cli/dist/core/api/response.d.ts +48 -0
  12. package/cli/dist/core/api/response.d.ts.map +1 -0
  13. package/cli/dist/core/api/response.js +84 -0
  14. package/cli/dist/core/api/response.js.map +1 -0
  15. package/cli/dist/core/api/sse.d.ts +6 -0
  16. package/cli/dist/core/api/sse.d.ts.map +1 -0
  17. package/cli/dist/core/api/sse.js +60 -0
  18. package/cli/dist/core/api/sse.js.map +1 -0
  19. package/cli/dist/core/auth/index.d.ts +35 -0
  20. package/cli/dist/core/auth/index.d.ts.map +1 -0
  21. package/cli/dist/core/auth/index.js +150 -0
  22. package/cli/dist/core/auth/index.js.map +1 -0
  23. package/cli/dist/core/env-config.d.ts +16 -0
  24. package/cli/dist/core/env-config.d.ts.map +1 -0
  25. package/cli/dist/core/env-config.js +80 -0
  26. package/cli/dist/core/env-config.js.map +1 -0
  27. package/cli/dist/core/errors.d.ts +20 -0
  28. package/cli/dist/core/errors.d.ts.map +1 -0
  29. package/cli/dist/core/errors.js +28 -0
  30. package/cli/dist/core/errors.js.map +1 -0
  31. package/cli/dist/core/index.d.ts +16 -0
  32. package/cli/dist/core/index.d.ts.map +1 -0
  33. package/cli/dist/core/index.js +16 -0
  34. package/cli/dist/core/index.js.map +1 -0
  35. package/cli/dist/core/interactive.d.ts +18 -0
  36. package/cli/dist/core/interactive.d.ts.map +1 -0
  37. package/cli/dist/core/interactive.js +74 -0
  38. package/cli/dist/core/interactive.js.map +1 -0
  39. package/cli/dist/core/output/index.d.ts +29 -0
  40. package/cli/dist/core/output/index.d.ts.map +1 -0
  41. package/cli/dist/core/output/index.js +153 -0
  42. package/cli/dist/core/output/index.js.map +1 -0
  43. package/cli/dist/core/parse.d.ts +9 -0
  44. package/cli/dist/core/parse.d.ts.map +1 -0
  45. package/cli/dist/core/parse.js +31 -0
  46. package/cli/dist/core/parse.js.map +1 -0
  47. package/cli/dist/core/paths.d.ts +21 -0
  48. package/cli/dist/core/paths.d.ts.map +1 -0
  49. package/cli/dist/core/paths.js +65 -0
  50. package/cli/dist/core/paths.js.map +1 -0
  51. package/cli/dist/core/sse-utils.d.ts +49 -0
  52. package/cli/dist/core/sse-utils.d.ts.map +1 -0
  53. package/cli/dist/core/sse-utils.js +181 -0
  54. package/cli/dist/core/sse-utils.js.map +1 -0
  55. package/cli/dist/core/terminal.d.ts +2 -0
  56. package/cli/dist/core/terminal.d.ts.map +1 -0
  57. package/cli/dist/core/terminal.js +6 -0
  58. package/cli/dist/core/terminal.js.map +1 -0
  59. package/cli/dist/core/token/index.d.ts +5 -0
  60. package/cli/dist/core/token/index.d.ts.map +1 -0
  61. package/cli/dist/core/token/index.js +26 -0
  62. package/cli/dist/core/token/index.js.map +1 -0
  63. package/cli/dist/core/types/config.d.ts +8 -0
  64. package/cli/dist/core/types/config.d.ts.map +1 -0
  65. package/cli/dist/core/types/config.js +30 -0
  66. package/cli/dist/core/types/config.js.map +1 -0
  67. package/cli/dist/core/version.d.ts +2 -0
  68. package/cli/dist/core/version.d.ts.map +1 -0
  69. package/cli/dist/core/version.js +10 -0
  70. package/cli/dist/core/version.js.map +1 -0
  71. package/cli/dist/index.d.ts +2 -0
  72. package/cli/dist/index.d.ts.map +1 -0
  73. package/cli/dist/index.js +23 -0
  74. package/cli/dist/index.js.map +1 -0
  75. package/cli/dist/modules/analysis/constants.d.ts +3 -0
  76. package/cli/dist/modules/analysis/constants.d.ts.map +1 -0
  77. package/cli/dist/modules/analysis/constants.js +3 -0
  78. package/cli/dist/modules/analysis/constants.js.map +1 -0
  79. package/cli/dist/modules/analysis/index.d.ts +3 -0
  80. package/cli/dist/modules/analysis/index.d.ts.map +1 -0
  81. package/cli/dist/modules/analysis/index.js +23 -0
  82. package/cli/dist/modules/analysis/index.js.map +1 -0
  83. package/cli/dist/modules/auth/index.d.ts +3 -0
  84. package/cli/dist/modules/auth/index.d.ts.map +1 -0
  85. package/cli/dist/modules/auth/index.js +76 -0
  86. package/cli/dist/modules/auth/index.js.map +1 -0
  87. package/cli/dist/modules/expert-scaffold.d.ts +27 -0
  88. package/cli/dist/modules/expert-scaffold.d.ts.map +1 -0
  89. package/cli/dist/modules/expert-scaffold.js +25 -0
  90. package/cli/dist/modules/expert-scaffold.js.map +1 -0
  91. package/cli/dist/modules/fund/clinical/apps.d.ts +19 -0
  92. package/cli/dist/modules/fund/clinical/apps.d.ts.map +1 -0
  93. package/cli/dist/modules/fund/clinical/apps.js +14 -0
  94. package/cli/dist/modules/fund/clinical/apps.js.map +1 -0
  95. package/cli/dist/modules/fund/clinical/command-utils.d.ts +4 -0
  96. package/cli/dist/modules/fund/clinical/command-utils.d.ts.map +1 -0
  97. package/cli/dist/modules/fund/clinical/command-utils.js +40 -0
  98. package/cli/dist/modules/fund/clinical/command-utils.js.map +1 -0
  99. package/cli/dist/modules/fund/clinical/commands/article-create.d.ts +9 -0
  100. package/cli/dist/modules/fund/clinical/commands/article-create.d.ts.map +1 -0
  101. package/cli/dist/modules/fund/clinical/commands/article-create.js +99 -0
  102. package/cli/dist/modules/fund/clinical/commands/article-create.js.map +1 -0
  103. package/cli/dist/modules/fund/clinical/commands/article-download.d.ts +30 -0
  104. package/cli/dist/modules/fund/clinical/commands/article-download.d.ts.map +1 -0
  105. package/cli/dist/modules/fund/clinical/commands/article-download.js +153 -0
  106. package/cli/dist/modules/fund/clinical/commands/article-download.js.map +1 -0
  107. package/cli/dist/modules/fund/clinical/commands/four-elements-create.d.ts +7 -0
  108. package/cli/dist/modules/fund/clinical/commands/four-elements-create.d.ts.map +1 -0
  109. package/cli/dist/modules/fund/clinical/commands/four-elements-create.js +81 -0
  110. package/cli/dist/modules/fund/clinical/commands/four-elements-create.js.map +1 -0
  111. package/cli/dist/modules/fund/clinical/commands/four-elements-precheck.d.ts +7 -0
  112. package/cli/dist/modules/fund/clinical/commands/four-elements-precheck.d.ts.map +1 -0
  113. package/cli/dist/modules/fund/clinical/commands/four-elements-precheck.js +76 -0
  114. package/cli/dist/modules/fund/clinical/commands/four-elements-precheck.js.map +1 -0
  115. package/cli/dist/modules/fund/clinical/commands/four-elements-update.d.ts +16 -0
  116. package/cli/dist/modules/fund/clinical/commands/four-elements-update.d.ts.map +1 -0
  117. package/cli/dist/modules/fund/clinical/commands/four-elements-update.js +108 -0
  118. package/cli/dist/modules/fund/clinical/commands/four-elements-update.js.map +1 -0
  119. package/cli/dist/modules/fund/clinical/commands/sample-size.d.ts +14 -0
  120. package/cli/dist/modules/fund/clinical/commands/sample-size.d.ts.map +1 -0
  121. package/cli/dist/modules/fund/clinical/commands/sample-size.js +164 -0
  122. package/cli/dist/modules/fund/clinical/commands/sample-size.js.map +1 -0
  123. package/cli/dist/modules/fund/clinical/commands/topic-evaluation-create.d.ts +25 -0
  124. package/cli/dist/modules/fund/clinical/commands/topic-evaluation-create.d.ts.map +1 -0
  125. package/cli/dist/modules/fund/clinical/commands/topic-evaluation-create.js +228 -0
  126. package/cli/dist/modules/fund/clinical/commands/topic-evaluation-create.js.map +1 -0
  127. package/cli/dist/modules/fund/clinical/commands/topic-evaluation-parameters.d.ts +45 -0
  128. package/cli/dist/modules/fund/clinical/commands/topic-evaluation-parameters.d.ts.map +1 -0
  129. package/cli/dist/modules/fund/clinical/commands/topic-evaluation-parameters.js +211 -0
  130. package/cli/dist/modules/fund/clinical/commands/topic-evaluation-parameters.js.map +1 -0
  131. package/cli/dist/modules/fund/clinical/constants.d.ts +85 -0
  132. package/cli/dist/modules/fund/clinical/constants.d.ts.map +1 -0
  133. package/cli/dist/modules/fund/clinical/constants.js +161 -0
  134. package/cli/dist/modules/fund/clinical/constants.js.map +1 -0
  135. package/cli/dist/modules/fund/clinical/form-rules.d.ts +56 -0
  136. package/cli/dist/modules/fund/clinical/form-rules.d.ts.map +1 -0
  137. package/cli/dist/modules/fund/clinical/form-rules.js +542 -0
  138. package/cli/dist/modules/fund/clinical/form-rules.js.map +1 -0
  139. package/cli/dist/modules/fund/clinical/four-elements.d.ts +46 -0
  140. package/cli/dist/modules/fund/clinical/four-elements.d.ts.map +1 -0
  141. package/cli/dist/modules/fund/clinical/four-elements.js +190 -0
  142. package/cli/dist/modules/fund/clinical/four-elements.js.map +1 -0
  143. package/cli/dist/modules/fund/clinical/index.d.ts +3 -0
  144. package/cli/dist/modules/fund/clinical/index.d.ts.map +1 -0
  145. package/cli/dist/modules/fund/clinical/index.js +176 -0
  146. package/cli/dist/modules/fund/clinical/index.js.map +1 -0
  147. package/cli/dist/modules/fund/clinical/parameters.d.ts +51 -0
  148. package/cli/dist/modules/fund/clinical/parameters.d.ts.map +1 -0
  149. package/cli/dist/modules/fund/clinical/parameters.js +145 -0
  150. package/cli/dist/modules/fund/clinical/parameters.js.map +1 -0
  151. package/cli/dist/modules/fund/clinical/sample-size.d.ts +130 -0
  152. package/cli/dist/modules/fund/clinical/sample-size.d.ts.map +1 -0
  153. package/cli/dist/modules/fund/clinical/sample-size.js +356 -0
  154. package/cli/dist/modules/fund/clinical/sample-size.js.map +1 -0
  155. package/cli/dist/modules/fund/clinical/session-cache.d.ts +25 -0
  156. package/cli/dist/modules/fund/clinical/session-cache.d.ts.map +1 -0
  157. package/cli/dist/modules/fund/clinical/session-cache.js +100 -0
  158. package/cli/dist/modules/fund/clinical/session-cache.js.map +1 -0
  159. package/cli/dist/modules/fund/clinical/sse-utils.d.ts +22 -0
  160. package/cli/dist/modules/fund/clinical/sse-utils.d.ts.map +1 -0
  161. package/cli/dist/modules/fund/clinical/sse-utils.js +80 -0
  162. package/cli/dist/modules/fund/clinical/sse-utils.js.map +1 -0
  163. package/cli/dist/modules/fund/constants.d.ts +3 -0
  164. package/cli/dist/modules/fund/constants.d.ts.map +1 -0
  165. package/cli/dist/modules/fund/constants.js +3 -0
  166. package/cli/dist/modules/fund/constants.js.map +1 -0
  167. package/cli/dist/modules/fund/index.d.ts +3 -0
  168. package/cli/dist/modules/fund/index.d.ts.map +1 -0
  169. package/cli/dist/modules/fund/index.js +28 -0
  170. package/cli/dist/modules/fund/index.js.map +1 -0
  171. package/cli/dist/modules/fund/nsfc/apps.d.ts +54 -0
  172. package/cli/dist/modules/fund/nsfc/apps.d.ts.map +1 -0
  173. package/cli/dist/modules/fund/nsfc/apps.js +76 -0
  174. package/cli/dist/modules/fund/nsfc/apps.js.map +1 -0
  175. package/cli/dist/modules/fund/nsfc/article-cache.d.ts +14 -0
  176. package/cli/dist/modules/fund/nsfc/article-cache.d.ts.map +1 -0
  177. package/cli/dist/modules/fund/nsfc/article-cache.js +79 -0
  178. package/cli/dist/modules/fund/nsfc/article-cache.js.map +1 -0
  179. package/cli/dist/modules/fund/nsfc/commands/article-create.d.ts +8 -0
  180. package/cli/dist/modules/fund/nsfc/commands/article-create.d.ts.map +1 -0
  181. package/cli/dist/modules/fund/nsfc/commands/article-create.js +108 -0
  182. package/cli/dist/modules/fund/nsfc/commands/article-create.js.map +1 -0
  183. package/cli/dist/modules/fund/nsfc/commands/article-download.d.ts +42 -0
  184. package/cli/dist/modules/fund/nsfc/commands/article-download.d.ts.map +1 -0
  185. package/cli/dist/modules/fund/nsfc/commands/article-download.js +189 -0
  186. package/cli/dist/modules/fund/nsfc/commands/article-download.js.map +1 -0
  187. package/cli/dist/modules/fund/nsfc/commands/format-convert.d.ts +9 -0
  188. package/cli/dist/modules/fund/nsfc/commands/format-convert.d.ts.map +1 -0
  189. package/cli/dist/modules/fund/nsfc/commands/format-convert.js +98 -0
  190. package/cli/dist/modules/fund/nsfc/commands/format-convert.js.map +1 -0
  191. package/cli/dist/modules/fund/nsfc/commands/hypothesis-analyze.d.ts +12 -0
  192. package/cli/dist/modules/fund/nsfc/commands/hypothesis-analyze.d.ts.map +1 -0
  193. package/cli/dist/modules/fund/nsfc/commands/hypothesis-analyze.js +351 -0
  194. package/cli/dist/modules/fund/nsfc/commands/hypothesis-analyze.js.map +1 -0
  195. package/cli/dist/modules/fund/nsfc/commands/hypothesis-create.d.ts +21 -0
  196. package/cli/dist/modules/fund/nsfc/commands/hypothesis-create.d.ts.map +1 -0
  197. package/cli/dist/modules/fund/nsfc/commands/hypothesis-create.js +197 -0
  198. package/cli/dist/modules/fund/nsfc/commands/hypothesis-create.js.map +1 -0
  199. package/cli/dist/modules/fund/nsfc/commands/hypothesis-figure.d.ts +9 -0
  200. package/cli/dist/modules/fund/nsfc/commands/hypothesis-figure.d.ts.map +1 -0
  201. package/cli/dist/modules/fund/nsfc/commands/hypothesis-figure.js +120 -0
  202. package/cli/dist/modules/fund/nsfc/commands/hypothesis-figure.js.map +1 -0
  203. package/cli/dist/modules/fund/nsfc/commands/hypothesis-genes-select.d.ts +11 -0
  204. package/cli/dist/modules/fund/nsfc/commands/hypothesis-genes-select.d.ts.map +1 -0
  205. package/cli/dist/modules/fund/nsfc/commands/hypothesis-genes-select.js +125 -0
  206. package/cli/dist/modules/fund/nsfc/commands/hypothesis-genes-select.js.map +1 -0
  207. package/cli/dist/modules/fund/nsfc/commands/hypothesis-pick.d.ts +11 -0
  208. package/cli/dist/modules/fund/nsfc/commands/hypothesis-pick.d.ts.map +1 -0
  209. package/cli/dist/modules/fund/nsfc/commands/hypothesis-pick.js +109 -0
  210. package/cli/dist/modules/fund/nsfc/commands/hypothesis-pick.js.map +1 -0
  211. package/cli/dist/modules/fund/nsfc/commands/outline-confirm.d.ts +9 -0
  212. package/cli/dist/modules/fund/nsfc/commands/outline-confirm.d.ts.map +1 -0
  213. package/cli/dist/modules/fund/nsfc/commands/outline-confirm.js +64 -0
  214. package/cli/dist/modules/fund/nsfc/commands/outline-confirm.js.map +1 -0
  215. package/cli/dist/modules/fund/nsfc/commands/outline-create.d.ts +8 -0
  216. package/cli/dist/modules/fund/nsfc/commands/outline-create.d.ts.map +1 -0
  217. package/cli/dist/modules/fund/nsfc/commands/outline-create.js +103 -0
  218. package/cli/dist/modules/fund/nsfc/commands/outline-create.js.map +1 -0
  219. package/cli/dist/modules/fund/nsfc/commands/research-path-confirm.d.ts +9 -0
  220. package/cli/dist/modules/fund/nsfc/commands/research-path-confirm.d.ts.map +1 -0
  221. package/cli/dist/modules/fund/nsfc/commands/research-path-confirm.js +176 -0
  222. package/cli/dist/modules/fund/nsfc/commands/research-path-confirm.js.map +1 -0
  223. package/cli/dist/modules/fund/nsfc/commands/tech-roadmap.d.ts +9 -0
  224. package/cli/dist/modules/fund/nsfc/commands/tech-roadmap.d.ts.map +1 -0
  225. package/cli/dist/modules/fund/nsfc/commands/tech-roadmap.js +190 -0
  226. package/cli/dist/modules/fund/nsfc/commands/tech-roadmap.js.map +1 -0
  227. package/cli/dist/modules/fund/nsfc/constants.d.ts +96 -0
  228. package/cli/dist/modules/fund/nsfc/constants.d.ts.map +1 -0
  229. package/cli/dist/modules/fund/nsfc/constants.js +156 -0
  230. package/cli/dist/modules/fund/nsfc/constants.js.map +1 -0
  231. package/cli/dist/modules/fund/nsfc/graph-render.d.ts +25 -0
  232. package/cli/dist/modules/fund/nsfc/graph-render.d.ts.map +1 -0
  233. package/cli/dist/modules/fund/nsfc/graph-render.js +212 -0
  234. package/cli/dist/modules/fund/nsfc/graph-render.js.map +1 -0
  235. package/cli/dist/modules/fund/nsfc/index.d.ts +4 -0
  236. package/cli/dist/modules/fund/nsfc/index.d.ts.map +1 -0
  237. package/cli/dist/modules/fund/nsfc/index.js +238 -0
  238. package/cli/dist/modules/fund/nsfc/index.js.map +1 -0
  239. package/cli/dist/modules/fund/nsfc/mermaid-render.d.ts +18 -0
  240. package/cli/dist/modules/fund/nsfc/mermaid-render.d.ts.map +1 -0
  241. package/cli/dist/modules/fund/nsfc/mermaid-render.js +47 -0
  242. package/cli/dist/modules/fund/nsfc/mermaid-render.js.map +1 -0
  243. package/cli/dist/modules/fund/nsfc/parse-hypothesis.d.ts +76 -0
  244. package/cli/dist/modules/fund/nsfc/parse-hypothesis.d.ts.map +1 -0
  245. package/cli/dist/modules/fund/nsfc/parse-hypothesis.js +278 -0
  246. package/cli/dist/modules/fund/nsfc/parse-hypothesis.js.map +1 -0
  247. package/cli/dist/modules/fund/nsfc/parse-outline.d.ts +23 -0
  248. package/cli/dist/modules/fund/nsfc/parse-outline.d.ts.map +1 -0
  249. package/cli/dist/modules/fund/nsfc/parse-outline.js +91 -0
  250. package/cli/dist/modules/fund/nsfc/parse-outline.js.map +1 -0
  251. package/cli/dist/modules/fund/nsfc/png-watermark.d.ts +24 -0
  252. package/cli/dist/modules/fund/nsfc/png-watermark.d.ts.map +1 -0
  253. package/cli/dist/modules/fund/nsfc/png-watermark.js +78 -0
  254. package/cli/dist/modules/fund/nsfc/png-watermark.js.map +1 -0
  255. package/cli/dist/modules/fund/nsfc/prompt-hypothesis.d.ts +20 -0
  256. package/cli/dist/modules/fund/nsfc/prompt-hypothesis.d.ts.map +1 -0
  257. package/cli/dist/modules/fund/nsfc/prompt-hypothesis.js +107 -0
  258. package/cli/dist/modules/fund/nsfc/prompt-hypothesis.js.map +1 -0
  259. package/cli/dist/modules/fund/nsfc/prompt-step2.d.ts +18 -0
  260. package/cli/dist/modules/fund/nsfc/prompt-step2.d.ts.map +1 -0
  261. package/cli/dist/modules/fund/nsfc/prompt-step2.js +107 -0
  262. package/cli/dist/modules/fund/nsfc/prompt-step2.js.map +1 -0
  263. package/cli/dist/modules/fund/nsfc/request-body.d.ts +47 -0
  264. package/cli/dist/modules/fund/nsfc/request-body.d.ts.map +1 -0
  265. package/cli/dist/modules/fund/nsfc/request-body.js +38 -0
  266. package/cli/dist/modules/fund/nsfc/request-body.js.map +1 -0
  267. package/cli/dist/modules/fund/nsfc/session-cache.d.ts +48 -0
  268. package/cli/dist/modules/fund/nsfc/session-cache.d.ts.map +1 -0
  269. package/cli/dist/modules/fund/nsfc/session-cache.js +90 -0
  270. package/cli/dist/modules/fund/nsfc/session-cache.js.map +1 -0
  271. package/cli/dist/modules/fund/nsfc/sse-utils.d.ts +22 -0
  272. package/cli/dist/modules/fund/nsfc/sse-utils.d.ts.map +1 -0
  273. package/cli/dist/modules/fund/nsfc/sse-utils.js +81 -0
  274. package/cli/dist/modules/fund/nsfc/sse-utils.js.map +1 -0
  275. package/cli/dist/modules/fund/nsfc/upload.d.ts +3 -0
  276. package/cli/dist/modules/fund/nsfc/upload.d.ts.map +1 -0
  277. package/cli/dist/modules/fund/nsfc/upload.js +59 -0
  278. package/cli/dist/modules/fund/nsfc/upload.js.map +1 -0
  279. package/cli/dist/modules/fund/nsfc/validate.d.ts +30 -0
  280. package/cli/dist/modules/fund/nsfc/validate.d.ts.map +1 -0
  281. package/cli/dist/modules/fund/nsfc/validate.js +91 -0
  282. package/cli/dist/modules/fund/nsfc/validate.js.map +1 -0
  283. package/cli/dist/modules/literature/commands/workflow-list.d.ts +5 -0
  284. package/cli/dist/modules/literature/commands/workflow-list.d.ts.map +1 -0
  285. package/cli/dist/modules/literature/commands/workflow-list.js +9 -0
  286. package/cli/dist/modules/literature/commands/workflow-list.js.map +1 -0
  287. package/cli/dist/modules/literature/commands/workflow-params.d.ts +6 -0
  288. package/cli/dist/modules/literature/commands/workflow-params.d.ts.map +1 -0
  289. package/cli/dist/modules/literature/commands/workflow-params.js +9 -0
  290. package/cli/dist/modules/literature/commands/workflow-params.js.map +1 -0
  291. package/cli/dist/modules/literature/commands/workflow-run.d.ts +7 -0
  292. package/cli/dist/modules/literature/commands/workflow-run.d.ts.map +1 -0
  293. package/cli/dist/modules/literature/commands/workflow-run.js +10 -0
  294. package/cli/dist/modules/literature/commands/workflow-run.js.map +1 -0
  295. package/cli/dist/modules/literature/constants.d.ts +20 -0
  296. package/cli/dist/modules/literature/constants.d.ts.map +1 -0
  297. package/cli/dist/modules/literature/constants.js +56 -0
  298. package/cli/dist/modules/literature/constants.js.map +1 -0
  299. package/cli/dist/modules/literature/index.d.ts +3 -0
  300. package/cli/dist/modules/literature/index.d.ts.map +1 -0
  301. package/cli/dist/modules/literature/index.js +63 -0
  302. package/cli/dist/modules/literature/index.js.map +1 -0
  303. package/cli/dist/modules/meta/analysis.d.ts +127 -0
  304. package/cli/dist/modules/meta/analysis.d.ts.map +1 -0
  305. package/cli/dist/modules/meta/analysis.js +1165 -0
  306. package/cli/dist/modules/meta/analysis.js.map +1 -0
  307. package/cli/dist/modules/meta/api.d.ts +11 -0
  308. package/cli/dist/modules/meta/api.d.ts.map +1 -0
  309. package/cli/dist/modules/meta/api.js +40 -0
  310. package/cli/dist/modules/meta/api.js.map +1 -0
  311. package/cli/dist/modules/meta/commands.d.ts +3 -0
  312. package/cli/dist/modules/meta/commands.d.ts.map +1 -0
  313. package/cli/dist/modules/meta/commands.js +1185 -0
  314. package/cli/dist/modules/meta/commands.js.map +1 -0
  315. package/cli/dist/modules/meta/constants.d.ts +8 -0
  316. package/cli/dist/modules/meta/constants.d.ts.map +1 -0
  317. package/cli/dist/modules/meta/constants.js +9 -0
  318. package/cli/dist/modules/meta/constants.js.map +1 -0
  319. package/cli/dist/modules/meta/extraction.d.ts +206 -0
  320. package/cli/dist/modules/meta/extraction.d.ts.map +1 -0
  321. package/cli/dist/modules/meta/extraction.js +1248 -0
  322. package/cli/dist/modules/meta/extraction.js.map +1 -0
  323. package/cli/dist/modules/meta/index.d.ts +3 -0
  324. package/cli/dist/modules/meta/index.d.ts.map +1 -0
  325. package/cli/dist/modules/meta/index.js +19 -0
  326. package/cli/dist/modules/meta/index.js.map +1 -0
  327. package/cli/dist/modules/meta/node.d.ts +70 -0
  328. package/cli/dist/modules/meta/node.d.ts.map +1 -0
  329. package/cli/dist/modules/meta/node.js +167 -0
  330. package/cli/dist/modules/meta/node.js.map +1 -0
  331. package/cli/dist/modules/meta/plot-params.d.ts +82 -0
  332. package/cli/dist/modules/meta/plot-params.d.ts.map +1 -0
  333. package/cli/dist/modules/meta/plot-params.js +1179 -0
  334. package/cli/dist/modules/meta/plot-params.js.map +1 -0
  335. package/cli/dist/modules/meta/prisma-flow-docx.d.ts +23 -0
  336. package/cli/dist/modules/meta/prisma-flow-docx.d.ts.map +1 -0
  337. package/cli/dist/modules/meta/prisma-flow-docx.js +302 -0
  338. package/cli/dist/modules/meta/prisma-flow-docx.js.map +1 -0
  339. package/cli/dist/modules/meta/retrieve.d.ts +113 -0
  340. package/cli/dist/modules/meta/retrieve.d.ts.map +1 -0
  341. package/cli/dist/modules/meta/retrieve.js +913 -0
  342. package/cli/dist/modules/meta/retrieve.js.map +1 -0
  343. package/cli/dist/modules/meta/screening.d.ts +179 -0
  344. package/cli/dist/modules/meta/screening.d.ts.map +1 -0
  345. package/cli/dist/modules/meta/screening.js +1255 -0
  346. package/cli/dist/modules/meta/screening.js.map +1 -0
  347. package/cli/dist/modules/meta/topic.d.ts +110 -0
  348. package/cli/dist/modules/meta/topic.d.ts.map +1 -0
  349. package/cli/dist/modules/meta/topic.js +865 -0
  350. package/cli/dist/modules/meta/topic.js.map +1 -0
  351. package/cli/dist/modules/meta/types.d.ts +49 -0
  352. package/cli/dist/modules/meta/types.d.ts.map +1 -0
  353. package/cli/dist/modules/meta/types.js +2 -0
  354. package/cli/dist/modules/meta/types.js.map +1 -0
  355. package/cli/dist/modules/meta/workflow.d.ts +154 -0
  356. package/cli/dist/modules/meta/workflow.d.ts.map +1 -0
  357. package/cli/dist/modules/meta/workflow.js +956 -0
  358. package/cli/dist/modules/meta/workflow.js.map +1 -0
  359. package/cli/dist/modules/meta/writing.d.ts +83 -0
  360. package/cli/dist/modules/meta/writing.d.ts.map +1 -0
  361. package/cli/dist/modules/meta/writing.js +1077 -0
  362. package/cli/dist/modules/meta/writing.js.map +1 -0
  363. package/cli/dist/modules/proposal/artifacts.d.ts +18 -0
  364. package/cli/dist/modules/proposal/artifacts.d.ts.map +1 -0
  365. package/cli/dist/modules/proposal/artifacts.js +43 -0
  366. package/cli/dist/modules/proposal/artifacts.js.map +1 -0
  367. package/cli/dist/modules/proposal/commands/basic-create.d.ts +22 -0
  368. package/cli/dist/modules/proposal/commands/basic-create.d.ts.map +1 -0
  369. package/cli/dist/modules/proposal/commands/basic-create.js +81 -0
  370. package/cli/dist/modules/proposal/commands/basic-create.js.map +1 -0
  371. package/cli/dist/modules/proposal/commands/basic-result.d.ts +24 -0
  372. package/cli/dist/modules/proposal/commands/basic-result.d.ts.map +1 -0
  373. package/cli/dist/modules/proposal/commands/basic-result.js +96 -0
  374. package/cli/dist/modules/proposal/commands/basic-result.js.map +1 -0
  375. package/cli/dist/modules/proposal/commands/bioinfo-params.d.ts +5 -0
  376. package/cli/dist/modules/proposal/commands/bioinfo-params.d.ts.map +1 -0
  377. package/cli/dist/modules/proposal/commands/bioinfo-params.js +9 -0
  378. package/cli/dist/modules/proposal/commands/bioinfo-params.js.map +1 -0
  379. package/cli/dist/modules/proposal/commands/bioinfo-run.d.ts +6 -0
  380. package/cli/dist/modules/proposal/commands/bioinfo-run.d.ts.map +1 -0
  381. package/cli/dist/modules/proposal/commands/bioinfo-run.js +10 -0
  382. package/cli/dist/modules/proposal/commands/bioinfo-run.js.map +1 -0
  383. package/cli/dist/modules/proposal/commands/clinical-list.d.ts +5 -0
  384. package/cli/dist/modules/proposal/commands/clinical-list.d.ts.map +1 -0
  385. package/cli/dist/modules/proposal/commands/clinical-list.js +9 -0
  386. package/cli/dist/modules/proposal/commands/clinical-list.js.map +1 -0
  387. package/cli/dist/modules/proposal/commands/clinical-params.d.ts +6 -0
  388. package/cli/dist/modules/proposal/commands/clinical-params.d.ts.map +1 -0
  389. package/cli/dist/modules/proposal/commands/clinical-params.js +9 -0
  390. package/cli/dist/modules/proposal/commands/clinical-params.js.map +1 -0
  391. package/cli/dist/modules/proposal/commands/clinical-run.d.ts +7 -0
  392. package/cli/dist/modules/proposal/commands/clinical-run.d.ts.map +1 -0
  393. package/cli/dist/modules/proposal/commands/clinical-run.js +10 -0
  394. package/cli/dist/modules/proposal/commands/clinical-run.js.map +1 -0
  395. package/cli/dist/modules/proposal/constants.d.ts +34 -0
  396. package/cli/dist/modules/proposal/constants.d.ts.map +1 -0
  397. package/cli/dist/modules/proposal/constants.js +75 -0
  398. package/cli/dist/modules/proposal/constants.js.map +1 -0
  399. package/cli/dist/modules/proposal/index.d.ts +3 -0
  400. package/cli/dist/modules/proposal/index.d.ts.map +1 -0
  401. package/cli/dist/modules/proposal/index.js +95 -0
  402. package/cli/dist/modules/proposal/index.js.map +1 -0
  403. package/cli/dist/modules/proposal/newidea-env.d.ts +28 -0
  404. package/cli/dist/modules/proposal/newidea-env.d.ts.map +1 -0
  405. package/cli/dist/modules/proposal/newidea-env.js +69 -0
  406. package/cli/dist/modules/proposal/newidea-env.js.map +1 -0
  407. package/cli/dist/modules/proposal/newidea-runner.d.ts +25 -0
  408. package/cli/dist/modules/proposal/newidea-runner.d.ts.map +1 -0
  409. package/cli/dist/modules/proposal/newidea-runner.js +158 -0
  410. package/cli/dist/modules/proposal/newidea-runner.js.map +1 -0
  411. package/cli/dist/modules/proposal/parse.d.ts +25 -0
  412. package/cli/dist/modules/proposal/parse.d.ts.map +1 -0
  413. package/cli/dist/modules/proposal/parse.js +173 -0
  414. package/cli/dist/modules/proposal/parse.js.map +1 -0
  415. package/cli/dist/modules/sci/apps.d.ts +48 -0
  416. package/cli/dist/modules/sci/apps.d.ts.map +1 -0
  417. package/cli/dist/modules/sci/apps.js +43 -0
  418. package/cli/dist/modules/sci/apps.js.map +1 -0
  419. package/cli/dist/modules/sci/article-cache.d.ts +32 -0
  420. package/cli/dist/modules/sci/article-cache.d.ts.map +1 -0
  421. package/cli/dist/modules/sci/article-cache.js +163 -0
  422. package/cli/dist/modules/sci/article-cache.js.map +1 -0
  423. package/cli/dist/modules/sci/article-validate.d.ts +11 -0
  424. package/cli/dist/modules/sci/article-validate.d.ts.map +1 -0
  425. package/cli/dist/modules/sci/article-validate.js +43 -0
  426. package/cli/dist/modules/sci/article-validate.js.map +1 -0
  427. package/cli/dist/modules/sci/commands/article-create.d.ts +46 -0
  428. package/cli/dist/modules/sci/commands/article-create.d.ts.map +1 -0
  429. package/cli/dist/modules/sci/commands/article-create.js +315 -0
  430. package/cli/dist/modules/sci/commands/article-create.js.map +1 -0
  431. package/cli/dist/modules/sci/commands/article-download.d.ts +50 -0
  432. package/cli/dist/modules/sci/commands/article-download.d.ts.map +1 -0
  433. package/cli/dist/modules/sci/commands/article-download.js +281 -0
  434. package/cli/dist/modules/sci/commands/article-download.js.map +1 -0
  435. package/cli/dist/modules/sci/commands/outline.d.ts +36 -0
  436. package/cli/dist/modules/sci/commands/outline.d.ts.map +1 -0
  437. package/cli/dist/modules/sci/commands/outline.js +491 -0
  438. package/cli/dist/modules/sci/commands/outline.js.map +1 -0
  439. package/cli/dist/modules/sci/commands/template.d.ts +9 -0
  440. package/cli/dist/modules/sci/commands/template.d.ts.map +1 -0
  441. package/cli/dist/modules/sci/commands/template.js +12 -0
  442. package/cli/dist/modules/sci/commands/template.js.map +1 -0
  443. package/cli/dist/modules/sci/commands.d.ts +3 -0
  444. package/cli/dist/modules/sci/commands.d.ts.map +1 -0
  445. package/cli/dist/modules/sci/commands.js +108 -0
  446. package/cli/dist/modules/sci/commands.js.map +1 -0
  447. package/cli/dist/modules/sci/constants.d.ts +117 -0
  448. package/cli/dist/modules/sci/constants.d.ts.map +1 -0
  449. package/cli/dist/modules/sci/constants.js +152 -0
  450. package/cli/dist/modules/sci/constants.js.map +1 -0
  451. package/cli/dist/modules/sci/content-source.d.ts +18 -0
  452. package/cli/dist/modules/sci/content-source.d.ts.map +1 -0
  453. package/cli/dist/modules/sci/content-source.js +54 -0
  454. package/cli/dist/modules/sci/content-source.js.map +1 -0
  455. package/cli/dist/modules/sci/index.d.ts +3 -0
  456. package/cli/dist/modules/sci/index.d.ts.map +1 -0
  457. package/cli/dist/modules/sci/index.js +19 -0
  458. package/cli/dist/modules/sci/index.js.map +1 -0
  459. package/cli/dist/modules/sci/outline-transform.d.ts +16 -0
  460. package/cli/dist/modules/sci/outline-transform.d.ts.map +1 -0
  461. package/cli/dist/modules/sci/outline-transform.js +67 -0
  462. package/cli/dist/modules/sci/outline-transform.js.map +1 -0
  463. package/cli/dist/modules/sci/precheck-cache.d.ts +23 -0
  464. package/cli/dist/modules/sci/precheck-cache.d.ts.map +1 -0
  465. package/cli/dist/modules/sci/precheck-cache.js +141 -0
  466. package/cli/dist/modules/sci/precheck-cache.js.map +1 -0
  467. package/cli/dist/modules/sci/prompt-article.d.ts +12 -0
  468. package/cli/dist/modules/sci/prompt-article.d.ts.map +1 -0
  469. package/cli/dist/modules/sci/prompt-article.js +37 -0
  470. package/cli/dist/modules/sci/prompt-article.js.map +1 -0
  471. package/cli/dist/modules/sci/prompt-precheck.d.ts +16 -0
  472. package/cli/dist/modules/sci/prompt-precheck.d.ts.map +1 -0
  473. package/cli/dist/modules/sci/prompt-precheck.js +61 -0
  474. package/cli/dist/modules/sci/prompt-precheck.js.map +1 -0
  475. package/cli/dist/modules/sci/sse-utils.d.ts +50 -0
  476. package/cli/dist/modules/sci/sse-utils.d.ts.map +1 -0
  477. package/cli/dist/modules/sci/sse-utils.js +207 -0
  478. package/cli/dist/modules/sci/sse-utils.js.map +1 -0
  479. package/cli/dist/modules/shared/result-wrapper.d.ts +71 -0
  480. package/cli/dist/modules/shared/result-wrapper.d.ts.map +1 -0
  481. package/cli/dist/modules/shared/result-wrapper.js +95 -0
  482. package/cli/dist/modules/shared/result-wrapper.js.map +1 -0
  483. package/cli/dist/modules/shared/workflow-app/api.d.ts +6 -0
  484. package/cli/dist/modules/shared/workflow-app/api.d.ts.map +1 -0
  485. package/cli/dist/modules/shared/workflow-app/api.js +31 -0
  486. package/cli/dist/modules/shared/workflow-app/api.js.map +1 -0
  487. package/cli/dist/modules/shared/workflow-app/command.d.ts +30 -0
  488. package/cli/dist/modules/shared/workflow-app/command.d.ts.map +1 -0
  489. package/cli/dist/modules/shared/workflow-app/command.js +183 -0
  490. package/cli/dist/modules/shared/workflow-app/command.js.map +1 -0
  491. package/cli/dist/modules/shared/workflow-app/constants.d.ts +12 -0
  492. package/cli/dist/modules/shared/workflow-app/constants.d.ts.map +1 -0
  493. package/cli/dist/modules/shared/workflow-app/constants.js +21 -0
  494. package/cli/dist/modules/shared/workflow-app/constants.js.map +1 -0
  495. package/cli/dist/modules/shared/workflow-app/form.d.ts +21 -0
  496. package/cli/dist/modules/shared/workflow-app/form.d.ts.map +1 -0
  497. package/cli/dist/modules/shared/workflow-app/form.js +123 -0
  498. package/cli/dist/modules/shared/workflow-app/form.js.map +1 -0
  499. package/cli/dist/modules/shared/workflow-app/index.d.ts +8 -0
  500. package/cli/dist/modules/shared/workflow-app/index.d.ts.map +1 -0
  501. package/cli/dist/modules/shared/workflow-app/index.js +7 -0
  502. package/cli/dist/modules/shared/workflow-app/index.js.map +1 -0
  503. package/cli/dist/modules/shared/workflow-app/run.d.ts +15 -0
  504. package/cli/dist/modules/shared/workflow-app/run.d.ts.map +1 -0
  505. package/cli/dist/modules/shared/workflow-app/run.js +71 -0
  506. package/cli/dist/modules/shared/workflow-app/run.js.map +1 -0
  507. package/cli/dist/modules/shared/workflow-app/types.d.ts +74 -0
  508. package/cli/dist/modules/shared/workflow-app/types.d.ts.map +1 -0
  509. package/cli/dist/modules/shared/workflow-app/types.js +3 -0
  510. package/cli/dist/modules/shared/workflow-app/types.js.map +1 -0
  511. package/cli/dist/modules/site-configs.d.ts +4 -0
  512. package/cli/dist/modules/site-configs.d.ts.map +1 -0
  513. package/cli/dist/modules/site-configs.js +21 -0
  514. package/cli/dist/modules/site-configs.js.map +1 -0
  515. package/cli/dist/modules/upgrade/index.d.ts +6 -0
  516. package/cli/dist/modules/upgrade/index.d.ts.map +1 -0
  517. package/cli/dist/modules/upgrade/index.js +105 -0
  518. package/cli/dist/modules/upgrade/index.js.map +1 -0
  519. package/cli/dist/program.d.ts +3 -0
  520. package/cli/dist/program.d.ts.map +1 -0
  521. package/cli/dist/program.js +69 -0
  522. package/cli/dist/program.js.map +1 -0
  523. package/package.json +37 -0
package/README.md ADDED
@@ -0,0 +1,159 @@
1
+ # helixlife-expert-cli
2
+
3
+ 解螺旋 5.0 后台体系 · **科研专家合集** CLI。一个 npm 包提供六个专家命名空间,Skill 按专家拆分后单独交付,从而对外只暴露当前专家。
4
+
5
+ 不包含会员兑换。
6
+
7
+ > **Skill 与 CLI 已分离**:`cli/skills/`(含各 `SKILL.md` 与 `references/`)不随本 npm 包发布。发给业务部门的是 Skill 目录,不是改 CLI 安装包。
8
+
9
+ ## 安装
10
+
11
+ ```bash
12
+ npm install -g helixlife-expert-cli
13
+ # 请求凭证由外部环境写入 ~/.config/helixlife/user-access-token.txt,本 CLI 不提供授权/鉴权命令
14
+ helixlife-expert upgrade # 检查并按需升级到 npm 最新版
15
+ ```
16
+
17
+ Token 与接口基址配置位于 `~/.config/helixlife/`:
18
+
19
+ - 配置:`~/.config/helixlife/config.json`
20
+ - Token:`~/.config/helixlife/user-access-token.txt`
21
+
22
+ 与解螺旋其他 CLI 共用同一目录下的凭证文件。本 CLI **不提供** `auth login` / `auth status` / `auth logout`。
23
+
24
+ ## 环境地址
25
+
26
+ 默认使用生产基址。可通过本地配置覆盖 `api` / `agent_api`(完整 URL,原样使用):
27
+
28
+ ```bash
29
+ helixlife-expert config # 查看当前生效地址
30
+ helixlife-expert config set api https://api.example.com
31
+ helixlife-expert config set agent_api https://agent.example.com
32
+ ```
33
+
34
+ ## 本地开发
35
+
36
+ ```bash
37
+ npm install
38
+ npm run build
39
+ npm link
40
+ helixlife-expert --version
41
+ ```
42
+
43
+ 常用脚本:
44
+
45
+ ```bash
46
+ npm run dev # 直接跑 TypeScript 入口
47
+ npm run typecheck # 类型检查
48
+ npm test # 单元测试
49
+ npm run sync:skills # 将共用环境说明同步到各 Skill 的 references/common.md
50
+ ```
51
+
52
+ ## 发布
53
+
54
+ 在仓库根目录执行:
55
+
56
+ ```bash
57
+ npm publish
58
+ ```
59
+
60
+ `prepublishOnly` 会自动执行 `npm run build`。发布内容仅含 `cli/bin` 与 `cli/dist`,不含 `cli/skills/`。
61
+
62
+ ## Skill 交付
63
+
64
+ > **发布约定**:本仓库 npm 包**不含** Skill。Agent 侧以 `cli/skills/` 下的目录为入口;替换 Agent 侧 Skill 目录即可,**不必**为此升 CLI 版本。
65
+
66
+ 授权 / 安装 / 升级 / 错误码的正文只维护在 `cli/skills/_fragments/common.md`。修改后执行 `npm run sync:skills`,拷贝到各 Skill 的 `references/common.md`。`_fragments` **不要**发给业务部门。
67
+
68
+ ### 只提供某一个专家
69
+
70
+ 只拷贝对应的一个文件夹,例如 Meta 分析专家:
71
+
72
+ ```
73
+ cli/skills/helixlife-expert-meta/
74
+ ├── SKILL.md
75
+ └── references/
76
+ ├── common.md # 安装 / 授权 / 错误处理(自包含)
77
+ └── meta.md # 本专家细则
78
+ ```
79
+
80
+ 该 Skill 写死只允许 `helixlife-expert meta …`,即使合集 CLI 里还有其他专家命令,Agent 也不会去调。
81
+
82
+ | 专家 | Skill 目录 |
83
+ | ---- | ---------- |
84
+ | Meta 分析 | `cli/skills/helixlife-expert-meta/` |
85
+ | 基金写作 | `cli/skills/helixlife-expert-fund/` |
86
+ | SCI 写作 | `cli/skills/helixlife-expert-sci/` |
87
+ | 数据分析 | `cli/skills/helixlife-expert-analysis/` |
88
+ | 文献调研 | `cli/skills/helixlife-expert-literature/` |
89
+ | 课题方案 | `cli/skills/helixlife-expert-proposal/` |
90
+
91
+ ### 提供全部专家
92
+
93
+ 拷贝 `cli/skills/` 下所有 `helixlife-expert-*` 目录(主 Skill + 六个专家 Skill),不要包含 `_fragments`。
94
+
95
+ ```
96
+ cli/skills/
97
+ ├── helixlife-expert-cli/ # 全量路由入口
98
+ ├── helixlife-expert-meta/
99
+ ├── helixlife-expert-fund/
100
+ ├── helixlife-expert-sci/
101
+ ├── helixlife-expert-analysis/
102
+ ├── helixlife-expert-literature/
103
+ └── helixlife-expert-proposal/
104
+ ```
105
+
106
+ 主 Skill 做意图路由,命中后只读对应专家 Skill;专家 Skill 的 description 收窄到本领域。
107
+
108
+ ## 目录结构
109
+
110
+ ```
111
+ helixlife-expert-cli/
112
+ ├── package.json
113
+ └── cli/
114
+ ├── bin/helixlife-expert.js
115
+ ├── dist/
116
+ ├── src/
117
+ │ ├── core/ # 共用基础设施(api / config / token)
118
+ │ └── modules/
119
+ │ ├── upgrade/
120
+ │ ├── shared/ # 跨专家共用(结果包装器、workflow-app 调用层)
121
+ │ ├── meta/
122
+ │ ├── fund/ # 含 nsfc(国自然)与 clinical(临床申请书)两个工作台
123
+ │ ├── sci/
124
+ │ ├── analysis/
125
+ │ ├── literature/
126
+ │ └── proposal/
127
+ ├── tests/
128
+ └── skills/ # 本地开发用,不随 npm 发布
129
+ ```
130
+
131
+ ## 命令命名空间
132
+
133
+ | 模块 | 命令示例 | 状态 |
134
+ | ---- | -------- | ---- |
135
+ | 升级 | `helixlife-expert upgrade` | 已实现 |
136
+ | 配置 | `helixlife-expert config` | 已实现 |
137
+ | 工作台探测 | `helixlife-expert site-configs` | 已实现(工作台类专家业务前置硬门禁) |
138
+ | Meta 分析 | `helixlife-expert meta workflow create` | 已实现(选题/检索/筛选/抽提/统计/写作六步全流程) |
139
+ | 基金写作 | `helixlife-expert fund nsfc hypothesis create` | 已实现(国自然四步 + 临床申请书三步) |
140
+ | SCI 写作 | `helixlife-expert sci outline create` | 已实现(拟定主题/确认提纲/生成全文三步流程) |
141
+ | 数据分析 | `helixlife-expert analysis info` | 已实现(经外部仙桃 xt CLI 执行,共用本地凭证) |
142
+ | 文献调研 | `helixlife-expert literature workflow run` | 已实现(信息调研/结构化拆解/文献阅读/研究假设四工作流) |
143
+ | 课题方案 | `helixlife-expert proposal clinical run` | 已实现(基础研究经外部 newidea CLI;临床研究五工作流 + 生信方案) |
144
+
145
+ Meta 分析专家迁移自 `helixlife-service-cli` 的 `workbench meta`,命令树为 `meta workflow|topic|picos|criteria|retrieve|screening|extraction|analysis|writing`。进入任何 Meta 业务命令前必须先通过 `helixlife-expert site-configs --format=json` 探测(细则见 `cli/skills/helixlife-expert-meta/references/meta.md`)。
146
+
147
+ SCI 写作专家迁移自 `helixlife-service-cli` 的 `workbench sci`,命令树为 `sci template list` / `sci outline create` / `sci outline confirm create` / `sci article download`;docx 导出走 Newidea 接口(固定基址 `https://paas-api.newidea.pro`,不读本地配置)。同样须先通过 `site-configs` 探测(细则见 `cli/skills/helixlife-expert-sci/references/sci.md`)。
148
+
149
+ 基金写作专家迁移自 `helixlife-service-cli` 的 `workbench nsfc`(国自然申请书:假说 → 确认 → 提纲 → 全文四步)与 `workbench clinical`(临床申请书:选题评估 → 四要素 → 全文三步),命令树为 `fund nsfc …` 与 `fund clinical …` 两个子命名空间;技术路线图/假说机制图渲染与 docx 导出均走 Newidea 接口。同样须先通过 `site-configs` 探测(细则见 `cli/skills/helixlife-expert-fund/references/nsfc.md` 与 `references/clinical.md`)。
150
+
151
+ 文献调研专家提供四个工作流(`WF01` 信息调研、`WF02` 结构化拆解、`WF03` 文献阅读、`WF04` 研究假设),命令树为 `literature workflow list|params|run`。四者均为「`params` 取动态表单 → `run` 填参执行」两步式,表单字段由后端实时返回,CLI 不做本地映射。主线为 WF01 → WF02 → WF04,工作流间数据由 Agent 串联,CLI 不隐式串。该专家不走 `site-configs` 门禁(细则见 `cli/skills/helixlife-expert-literature/references/literature.md`)。
152
+
153
+ 数据分析专家不在本 CLI 内实现业务命令:分析/绘图经外部仙桃 CLI(`xt`,npm:`@helixlife-ai/xiantao`)执行,与本 CLI 共用 `~/.config/helixlife/` 凭证文件,按需被动安装;Skill 细则见 `cli/skills/helixlife-expert-analysis/references/`(路由索引 + 393 项冻结目录 + 执行手册)。**禁止**执行 `xt login` / `xt status`。
154
+
155
+ 课题方案专家先做基础 / 临床 / 生信三方向识别(证据不唯一时由 Skill 弹选择器兜底)。基础研究业务经外部 newidea CLI(`newidea`,npm:`@helixlife-ai/newidea`)执行,与本 CLI 共用 `~/.config/helixlife/` 凭证文件,按需被动安装(命令不存在再 `npm install -g @helixlife-ai/newidea@latest`);Agent 直接调用 `newidea invocation start` / `invocation process`,成功后交付 ZIP 下载链接,不落盘、不解压。**禁止**执行 `newidea login` / `newidea status` / `newidea logout`。
156
+
157
+ 临床研究与生信方案由本 CLI 直接调用工作流接口,与文献调研共用 `shared/workflow-app` 调用层,同为「`params` 取动态表单 → `run` 填参执行」两步式。临床命令树为 `proposal clinical list|params|run`,五个 source(`diagnostic-study` 诊断、`prognosis-study` 预后、`treatment-trial` 疗效试验、`treatment-cohort` 疗效队列、`etiology-study` 病因)的研究目的字段已被后端锁成单一选项,因而 source 即等价于研究目的,疗效方向需再按研究设计二选一;生信为单一工作流 `bioinfo-planner`,命令树 `proposal bioinfo params|run`,不设 `--source`;该方向在 Skill 侧多一步套路定位,冻结目录 `bioinfo-pattern-catalog-v1.json`(67 条,含一句话概述与数据层面),由 `references/bioinfo-patterns.md` 做召回索引与可行性核对,CLI 本身不解析该目录。临床表单声明 `output_text` 与 `output_reference` 两路输出,实测后端通常只回 `output_text`(参考文献并在正文末章),渲染层对缺失的已声明输出直接跳过。该专家不走 `site-configs` 门禁(细则见 `cli/skills/helixlife-expert-proposal/references/proposal.md`)。
158
+
159
+ Meta / 基金(国自然)模块额外引入运行时依赖:`@resvg/resvg-js`(SVG→PNG)、`docx`(Word 导出)、`pdf-lib`(PDF 导出)。
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ // npm bin 入口 shim,加载编译后的 dist/index.js
3
+ import "../dist/index.js";
@@ -0,0 +1,31 @@
1
+ import { type SseDataPayload } from "./sse.js";
2
+ export interface RequestOptions {
3
+ method?: "GET" | "POST" | "PUT" | "PATCH" | "DELETE";
4
+ params?: Record<string, string | number | boolean | undefined>;
5
+ body?: unknown;
6
+ headers?: Record<string, string>;
7
+ baseUrl?: string;
8
+ signal?: AbortSignal;
9
+ transformResponse?: (data: unknown) => unknown;
10
+ }
11
+ export interface BinaryResponse {
12
+ buffer: Buffer;
13
+ contentType: string | null;
14
+ filename?: string;
15
+ }
16
+ export declare class ApiClient {
17
+ private resolveToken;
18
+ private buildUrl;
19
+ private buildHeaders;
20
+ private assertOkResponse;
21
+ private resolveForbiddenMessage;
22
+ private send;
23
+ request<T>(path: string, options?: RequestOptions): Promise<T>;
24
+ requestBinary(path: string, options?: RequestOptions & {
25
+ baseUrl?: string;
26
+ }): Promise<BinaryResponse>;
27
+ requestSse(path: string, options: RequestOptions, onEvent: (payload: SseDataPayload) => void): Promise<void>;
28
+ private handleBlobResponse;
29
+ private extractFilenameFromContentDisposition;
30
+ }
31
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/core/api/client.ts"],"names":[],"mappings":"AAQA,OAAO,EAAkB,KAAK,cAAc,EAAE,MAAM,UAAU,CAAC;AAM/D,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;IACrD,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAC;IAC/D,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,WAAW,CAAC;IAGrB,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC;CAChD;AAGD,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAeD,qBAAa,SAAS;IAEpB,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,QAAQ;IAkBhB,OAAO,CAAC,YAAY;YAiBN,gBAAgB;IAwB9B,OAAO,CAAC,uBAAuB;YAsBjB,IAAI;IAmCZ,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,CAAC,CAAC;IA0BlE,aAAa,CACjB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,cAAc,GAAG;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAO,GAClD,OAAO,CAAC,cAAc,CAAC;IAQpB,UAAU,CACd,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,GACzC,OAAO,CAAC,IAAI,CAAC;YA6CF,kBAAkB;IAehC,OAAO,CAAC,qCAAqC;CAa9C"}
@@ -0,0 +1,183 @@
1
+ // 后台 API 请求客户端:统一附加 Token、平台头、超时与 401 处理
2
+ import { helixlifeError, helixlifeErrorCode, NOT_AUTHENTICATED_MESSAGE, TOKEN_EXPIRED_MESSAGE, } from "../errors.js";
3
+ import { getDefaultBaseUrl } from "../types/config.js";
4
+ import { parseSseStream } from "./sse.js";
5
+ import { loadTokenFromFile } from "../token/index.js";
6
+ import { getPackageVersion } from "../version.js";
7
+ import { DEFAULT_REQUEST_TIMEOUT_MS, fetchWithTimeout } from "./http.js";
8
+ // 当前安装的 CLI 版本(来自本包 package.json,不是 npm 最新版)
9
+ const CLI_VERSION = getPackageVersion();
10
+ // 前台通用请求头,与 vip.helixlife.cn 浏览器调用保持一致
11
+ const PLATFORM_HEADERS = {
12
+ platform: "pc",
13
+ source: "PC",
14
+ website: "helixlife-ai",
15
+ "User-Agent": `helix-cli/${CLI_VERSION}`,
16
+ "X-Client-Version": CLI_VERSION,
17
+ };
18
+ // 封装后台 API 调用:自动附加 Token 与 baseUrl(环境地址由编译期 config.ts 决定)
19
+ export class ApiClient {
20
+ // 校验并返回本地 token:无凭证直接抛 E1001,避免无凭证请求打到后台
21
+ resolveToken() {
22
+ const token = loadTokenFromFile();
23
+ if (!token) {
24
+ throw new helixlifeError(helixlifeErrorCode.NOT_AUTHENTICATED, NOT_AUTHENTICATED_MESSAGE);
25
+ }
26
+ return token;
27
+ }
28
+ // 构建带 query 参数的完整 URL
29
+ buildUrl(path, baseUrl, params) {
30
+ const url = new URL(path, baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`);
31
+ if (params) {
32
+ for (const [key, value] of Object.entries(params)) {
33
+ // 允许空字符串 query 参数(如 CSL 搜索 key="" 首屏加载)
34
+ if (value !== undefined) {
35
+ url.searchParams.set(key, String(value));
36
+ }
37
+ }
38
+ }
39
+ return url;
40
+ }
41
+ // 合并平台通用头、调用方附加头与 Authorization
42
+ buildHeaders(token, extra, options) {
43
+ const headers = {
44
+ ...PLATFORM_HEADERS,
45
+ ...extra,
46
+ };
47
+ if (!options?.omitJsonContentType && !headers["Content-Type"]) {
48
+ headers["Content-Type"] = "application/json";
49
+ }
50
+ headers.Authorization = `Bearer ${token}`;
51
+ return headers;
52
+ }
53
+ // 校验 HTTP 响应状态:401 视为凭证无效;403 解开后端文案(含购买链接)为 E1005
54
+ async assertOkResponse(response) {
55
+ if (response.status === 401) {
56
+ throw new helixlifeError(helixlifeErrorCode.TOKEN_EXPIRED, TOKEN_EXPIRED_MESSAGE);
57
+ }
58
+ if (response.status === 403) {
59
+ const text = await response.text().catch(() => "");
60
+ throw new helixlifeError(helixlifeErrorCode.PERMISSION_DENIED, this.resolveForbiddenMessage(text, response.statusText));
61
+ }
62
+ if (!response.ok) {
63
+ const text = await response.text().catch(() => "");
64
+ throw new helixlifeError(helixlifeErrorCode.REQUEST_FAILED, `请求失败 (${response.status}): ${text || response.statusText}`);
65
+ }
66
+ }
67
+ // 403 优先使用后端 message(已含购买链接),解析失败再回退原始正文
68
+ resolveForbiddenMessage(text, statusText) {
69
+ const fallback = `请求失败 (403): ${text || statusText}`;
70
+ if (!text) {
71
+ return fallback;
72
+ }
73
+ try {
74
+ const body = JSON.parse(text);
75
+ const message = (typeof body.message === "string" && body.message.trim()) ||
76
+ (typeof body.msg === "string" && body.msg.trim()) ||
77
+ "";
78
+ return message || fallback;
79
+ }
80
+ catch {
81
+ return fallback;
82
+ }
83
+ }
84
+ // REST / 二进制请求的共用骨架:校验 token、拼 URL、组装头与请求体,发起带超时请求并校验状态。
85
+ // 无本地 token 抛 E1001,遇 401 抛 E1004,遇 403 抛 E1005。
86
+ async send(path, options) {
87
+ const token = this.resolveToken();
88
+ const baseUrl = options.baseUrl ?? getDefaultBaseUrl();
89
+ const url = this.buildUrl(path, baseUrl, options.params);
90
+ // FormData 由 fetch 自动设置 boundary,不可手动写 Content-Type
91
+ const isFormData = typeof FormData !== "undefined" && options.body instanceof FormData;
92
+ const headers = this.buildHeaders(token, { Accept: "application/json", ...options.headers }, { omitJsonContentType: isFormData });
93
+ const response = await fetchWithTimeout(url.toString(), {
94
+ method: options.method ?? "GET",
95
+ headers,
96
+ body: options.body === undefined
97
+ ? undefined
98
+ : isFormData
99
+ ? options.body
100
+ : JSON.stringify(options.body),
101
+ }, DEFAULT_REQUEST_TIMEOUT_MS);
102
+ await this.assertOkResponse(response);
103
+ return response;
104
+ }
105
+ // 发起 REST 请求并解析 JSON 响应
106
+ async request(path, options = {}) {
107
+ const response = await this.send(path, options);
108
+ if (response.status === 204) {
109
+ return undefined;
110
+ }
111
+ const text = await response.text();
112
+ let data;
113
+ try {
114
+ data = JSON.parse(text);
115
+ }
116
+ catch {
117
+ throw new helixlifeError(helixlifeErrorCode.INVALID_RESPONSE, `响应不是有效 JSON,请检查后台地址与接口路径是否正确`);
118
+ }
119
+ if (options.transformResponse) {
120
+ return options.transformResponse(data);
121
+ }
122
+ return data;
123
+ }
124
+ // 发起二进制请求(multipart 上传或 blob 下载),可指定独立 baseUrl
125
+ async requestBinary(path, options = {}) {
126
+ const response = await this.send(path, options);
127
+ return this.handleBlobResponse(response);
128
+ }
129
+ // 发起 SSE 流式请求,逐条回调 data: JSON 事件。
130
+ // 注意:SSE 用于工作台流式生成,单次可能持续数分钟且中途长时间无事件,
131
+ // 因此不设超时/空闲看门狗,避免误杀正常的长耗时生成。
132
+ async requestSse(path, options, onEvent) {
133
+ const token = this.resolveToken();
134
+ const url = this.buildUrl(path, options.baseUrl ?? getDefaultBaseUrl(), options.params);
135
+ const headers = this.buildHeaders(token, {
136
+ Accept: "text/event-stream",
137
+ ...options.headers,
138
+ });
139
+ let response;
140
+ try {
141
+ response = await fetch(url.toString(), {
142
+ method: options.method ?? "POST",
143
+ headers,
144
+ signal: options.signal,
145
+ body: options.body !== undefined ? JSON.stringify(options.body) : undefined,
146
+ });
147
+ }
148
+ catch (error) {
149
+ if (error instanceof Error && error.name === "AbortError") {
150
+ throw error;
151
+ }
152
+ throw new helixlifeError(helixlifeErrorCode.NETWORK_ERROR, "网络请求失败,请检查后台服务是否可用");
153
+ }
154
+ await this.assertOkResponse(response);
155
+ if (!response.body) {
156
+ throw new helixlifeError(helixlifeErrorCode.INVALID_RESPONSE, "SSE 响应体为空");
157
+ }
158
+ await parseSseStream(response.body, onEvent);
159
+ }
160
+ // Keep blob filename handling aligned with the frontend service/base.ts helper.
161
+ async handleBlobResponse(response) {
162
+ const contentType = response.headers.get("content-type");
163
+ const disposition = response.headers.get("content-disposition") ?? "";
164
+ const filename = this.extractFilenameFromContentDisposition(disposition);
165
+ const arrayBuffer = await response.arrayBuffer();
166
+ return {
167
+ buffer: Buffer.from(arrayBuffer),
168
+ contentType,
169
+ filename,
170
+ };
171
+ }
172
+ extractFilenameFromContentDisposition(disposition) {
173
+ const filenameStar = disposition.split("filename*=utf-8''")[1];
174
+ if (filenameStar) {
175
+ return decodeURIComponent(filenameStar.split(";")[0].replace(/"/g, ""));
176
+ }
177
+ const filenameMatch = disposition.match(/filename="?([^";]+)"?/i);
178
+ return filenameMatch?.[1]
179
+ ? decodeURIComponent(filenameMatch[1].replace(/"/g, ""))
180
+ : undefined;
181
+ }
182
+ }
183
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/core/api/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare const DEFAULT_REQUEST_TIMEOUT_MS = 60000;
2
+ export declare function fetchWithTimeout(url: string, init: RequestInit, timeoutMs: number): Promise<Response>;
3
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/core/api/http.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,0BAA0B,QAAS,CAAC;AAGjD,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,WAAW,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,QAAQ,CAAC,CAmBnB"}
@@ -0,0 +1,22 @@
1
+ // 带超时的 fetch 封装,供 REST 请求与授权接口统一复用
2
+ import { helixlifeError, helixlifeErrorCode } from "../errors.js";
3
+ // 普通 REST / 授权类请求的默认整体超时(毫秒)
4
+ export const DEFAULT_REQUEST_TIMEOUT_MS = 60_000;
5
+ // 带超时的 fetch:超时或网络失败统一映射为 helixlifeError(NETWORK_ERROR),避免网络挂起时长时间无响应
6
+ export async function fetchWithTimeout(url, init, timeoutMs) {
7
+ const controller = new AbortController();
8
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
9
+ try {
10
+ return await fetch(url, { ...init, signal: controller.signal });
11
+ }
12
+ catch {
13
+ if (controller.signal.aborted) {
14
+ throw new helixlifeError(helixlifeErrorCode.NETWORK_ERROR, "请求超时,请检查网络或稍后重试");
15
+ }
16
+ throw new helixlifeError(helixlifeErrorCode.NETWORK_ERROR, "网络请求失败,请检查后台服务是否可用");
17
+ }
18
+ finally {
19
+ clearTimeout(timer);
20
+ }
21
+ }
22
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/core/api/http.ts"],"names":[],"mappings":"AAAA,mCAAmC;AACnC,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAElE,6BAA6B;AAC7B,MAAM,CAAC,MAAM,0BAA0B,GAAG,MAAM,CAAC;AAEjD,sEAAsE;AACtE,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,GAAW,EACX,IAAiB,EACjB,SAAiB;IAEjB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;IAC9D,IAAI,CAAC;QACH,OAAO,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAC9B,MAAM,IAAI,cAAc,CACtB,kBAAkB,CAAC,aAAa,EAChC,iBAAiB,CAClB,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,cAAc,CACtB,kBAAkB,CAAC,aAAa,EAChC,oBAAoB,CACrB,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;AACH,CAAC"}
@@ -0,0 +1,48 @@
1
+ export interface ApiEnvelope<T> {
2
+ success?: boolean;
3
+ data?: T;
4
+ message?: string;
5
+ [key: string]: unknown;
6
+ }
7
+ export interface ApiErrorEnvelope {
8
+ success: false;
9
+ message?: string;
10
+ data?: {
11
+ msg?: string;
12
+ code?: string | number;
13
+ [key: string]: unknown;
14
+ };
15
+ [key: string]: unknown;
16
+ }
17
+ /**
18
+ * 统一 API 响应解析
19
+ * - 成功时返回 data
20
+ * - 失败时抛出 helixlifeError 并携带业务错误信息
21
+ */
22
+ export declare function unwrapResponse<T>(response: ApiEnvelope<T>): T;
23
+ /**
24
+ * 解析业务响应并返回 data。
25
+ * 与 unwrapResponse 的区别:success 省略(undefined)视为成功,
26
+ * 适配不返回 success 字段的接口(AI 应用 tools/workflow/record 等)。
27
+ * @param action 失败时拼入错误信息的动作名(如「获取应用详情」)
28
+ */
29
+ export declare function unwrapApiData<T>(response: ApiEnvelope<T>, action: string): T;
30
+ /**
31
+ * 解析可能二次嵌套(data.data)的业务响应:内层 data 存在则取内层,否则取外层。
32
+ * 等价于旧代码 `unwrapApiData(res).data ?? (unwrapApiData(res) as T)`。
33
+ * @param action 失败时拼入错误信息的动作名
34
+ */
35
+ export declare function unwrapNestedApiData<T>(response: ApiEnvelope<{
36
+ data?: T;
37
+ } | T>, action: string): T;
38
+ /**
39
+ * 从嵌套 data.data 结构中提取值(用于 JOVA 订单等场景)
40
+ */
41
+ export declare function extractNestedData<T>(response: ApiEnvelope<ApiEnvelope<T>>): T;
42
+ /**
43
+ * 从响应中提取订单 ID(用于 JOVA 订单场景)
44
+ */
45
+ export declare function extractOrderId(response: ApiEnvelope<ApiEnvelope<{
46
+ order_id?: string;
47
+ }>>): string;
48
+ //# sourceMappingURL=response.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../../src/core/api/response.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAGD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,KAAK,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE;QACL,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QACvB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;IACF,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAgB7D;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,CAc5E;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EACnC,QAAQ,EAAE,WAAW,CAAC;IAAE,IAAI,CAAC,EAAE,CAAC,CAAA;CAAE,GAAG,CAAC,CAAC,EACvC,MAAM,EAAE,MAAM,GACb,CAAC,CASH;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,QAAQ,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CA0B7E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,WAAW,CAAC,WAAW,CAAC;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,GACxD,MAAM,CAUR"}
@@ -0,0 +1,84 @@
1
+ import { helixlifeError, helixlifeErrorCode } from "../errors.js";
2
+ /**
3
+ * 统一 API 响应解析
4
+ * - 成功时返回 data
5
+ * - 失败时抛出 helixlifeError 并携带业务错误信息
6
+ */
7
+ export function unwrapResponse(response) {
8
+ if (!response.success) {
9
+ const errorMessage = response.data?.msg ||
10
+ response.message ||
11
+ response.message ||
12
+ "请求失败";
13
+ throw new helixlifeError(helixlifeErrorCode.REQUEST_FAILED, errorMessage);
14
+ }
15
+ if (response.data === undefined) {
16
+ throw new helixlifeError(helixlifeErrorCode.INVALID_RESPONSE, "响应数据为空");
17
+ }
18
+ return response.data;
19
+ }
20
+ /**
21
+ * 解析业务响应并返回 data。
22
+ * 与 unwrapResponse 的区别:success 省略(undefined)视为成功,
23
+ * 适配不返回 success 字段的接口(AI 应用 tools/workflow/record 等)。
24
+ * @param action 失败时拼入错误信息的动作名(如「获取应用详情」)
25
+ */
26
+ export function unwrapApiData(response, action) {
27
+ if (response.success === false) {
28
+ throw new helixlifeError(helixlifeErrorCode.REQUEST_FAILED, response.message || `${action}失败`);
29
+ }
30
+ if (response.data === undefined) {
31
+ throw new helixlifeError(helixlifeErrorCode.INVALID_RESPONSE, `${action}响应缺少 data 字段`);
32
+ }
33
+ return response.data;
34
+ }
35
+ /**
36
+ * 解析可能二次嵌套(data.data)的业务响应:内层 data 存在则取内层,否则取外层。
37
+ * 等价于旧代码 `unwrapApiData(res).data ?? (unwrapApiData(res) as T)`。
38
+ * @param action 失败时拼入错误信息的动作名
39
+ */
40
+ export function unwrapNestedApiData(response, action) {
41
+ const payload = unwrapApiData(response, action);
42
+ if (payload && typeof payload === "object" && "data" in payload) {
43
+ const inner = payload.data;
44
+ if (inner != null) {
45
+ return inner;
46
+ }
47
+ }
48
+ return payload;
49
+ }
50
+ /**
51
+ * 从嵌套 data.data 结构中提取值(用于 JOVA 订单等场景)
52
+ */
53
+ export function extractNestedData(response) {
54
+ if (!response.success) {
55
+ const errorMessage = response.data?.msg ||
56
+ response.message ||
57
+ "请求失败";
58
+ throw new helixlifeError(helixlifeErrorCode.REQUEST_FAILED, errorMessage);
59
+ }
60
+ if (response.data === undefined) {
61
+ throw new helixlifeError(helixlifeErrorCode.INVALID_RESPONSE, "响应数据为空");
62
+ }
63
+ const inner = response.data;
64
+ if (typeof inner === "object" && inner !== null && "data" in inner) {
65
+ const nested = inner.data;
66
+ if (nested === undefined) {
67
+ throw new helixlifeError(helixlifeErrorCode.INVALID_RESPONSE, "嵌套响应数据为空");
68
+ }
69
+ return nested;
70
+ }
71
+ return inner;
72
+ }
73
+ /**
74
+ * 从响应中提取订单 ID(用于 JOVA 订单场景)
75
+ */
76
+ export function extractOrderId(response) {
77
+ const inner = extractNestedData(response);
78
+ const orderId = inner?.order_id;
79
+ if (typeof orderId === "string" && orderId) {
80
+ return orderId;
81
+ }
82
+ throw new helixlifeError(helixlifeErrorCode.INVALID_RESPONSE, "响应缺少 order_id");
83
+ }
84
+ //# sourceMappingURL=response.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response.js","sourceRoot":"","sources":["../../../src/core/api/response.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export interface SseDataPayload {
2
+ event?: string;
3
+ [key: string]: unknown;
4
+ }
5
+ export declare function parseSseStream(body: ReadableStream<Uint8Array>, onEvent: (payload: SseDataPayload) => void): Promise<void>;
6
+ //# sourceMappingURL=sse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../../../src/core/api/sse.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAGD,wBAAsB,cAAc,CAClC,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,EAChC,OAAO,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,GACzC,OAAO,CAAC,IAAI,CAAC,CA2Df"}
@@ -0,0 +1,60 @@
1
+ // 从 SSE 原始字节流逐条解析 data: JSON 事件
2
+ export async function parseSseStream(body, onEvent) {
3
+ const reader = body.getReader();
4
+ const decoder = new TextDecoder();
5
+ let buffer = "";
6
+ const dispatchLine = (line) => {
7
+ if (!line.startsWith("data: ")) {
8
+ return;
9
+ }
10
+ const raw = line.slice(6).trim();
11
+ if (!raw || raw === "[DONE]") {
12
+ return;
13
+ }
14
+ let payload;
15
+ try {
16
+ payload = JSON.parse(raw);
17
+ }
18
+ catch {
19
+ // 仅忽略非 JSON 的 SSE 行,避免中断整段流
20
+ return;
21
+ }
22
+ // onEvent 内部(如后端 error 事件抛错)必须向上传播;
23
+ // 若在此吞掉,后端 error 事件会被静默忽略、最终产出空内容(偶发空正文根因之一)
24
+ onEvent(payload);
25
+ };
26
+ try {
27
+ // 按 SSE 规范以空行分隔事件块
28
+ while (true) {
29
+ const { done, value } = await reader.read();
30
+ if (done) {
31
+ break;
32
+ }
33
+ buffer += decoder.decode(value, { stream: true });
34
+ const chunks = buffer.split("\n\n");
35
+ buffer = chunks.pop() ?? "";
36
+ for (const chunk of chunks) {
37
+ for (const line of chunk.split("\n")) {
38
+ dispatchLine(line);
39
+ }
40
+ }
41
+ }
42
+ // 处理流结束时缓冲区残留的最后一条事件
43
+ if (buffer.trim()) {
44
+ for (const line of buffer.split("\n")) {
45
+ dispatchLine(line);
46
+ }
47
+ }
48
+ }
49
+ finally {
50
+ // 无论正常结束还是 onEvent 抛错(如后端 error 事件),都取消底层流并释放
51
+ // undici socket,避免进程退出时 libuv 句柄断言崩溃(Windows src\win\async.c)。
52
+ try {
53
+ await reader.cancel();
54
+ }
55
+ catch {
56
+ /* 取消失败不影响主流程 */
57
+ }
58
+ }
59
+ }
60
+ //# sourceMappingURL=sse.js.map